/ Hex Artifact Content
Login

Artifact 4547ba822e88bbbb4749730fb0825e8428485610:


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 20 20 72 63 20 3d 20 6f 73  nt rc;.  rc = os
dfd0: 46 73 74 61 74 28 70 46 69 6c 65 2d 3e 68 2c 20  Fstat(pFile->h, 
dfe0: 26 62 75 66 29 3b 0a 20 20 69 66 28 20 72 63 21  &buf);.  if( rc!
dff0: 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  =0 ){.    sqlite
e000: 33 5f 6c 6f 67 28 53 51 4c 49 54 45 5f 57 41 52  3_log(SQLITE_WAR
e010: 4e 49 4e 47 2c 20 22 63 61 6e 6e 6f 74 20 66 73  NING, "cannot fs
e020: 74 61 74 20 64 62 20 66 69 6c 65 20 25 73 22 2c  tat db file %s",
e030: 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a   pFile->zPath);.
e040: 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a      return;.  }.
e050: 20 20 69 66 28 20 62 75 66 2e 73 74 5f 6e 6c 69    if( buf.st_nli
e060: 6e 6b 3d 3d 30 20 26 26 20 28 70 46 69 6c 65 2d  nk==0 && (pFile-
e070: 3e 63 74 72 6c 46 6c 61 67 73 20 26 20 55 4e 49  >ctrlFlags & UNI
e080: 58 46 49 4c 45 5f 44 45 4c 45 54 45 29 3d 3d 30  XFILE_DELETE)==0
e090: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
e0a0: 6c 6f 67 28 53 51 4c 49 54 45 5f 57 41 52 4e 49  log(SQLITE_WARNI
e0b0: 4e 47 2c 20 22 66 69 6c 65 20 75 6e 6c 69 6e 6b  NG, "file unlink
e0c0: 65 64 20 77 68 69 6c 65 20 6f 70 65 6e 3a 20 25  ed while open: %
e0d0: 73 22 2c 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68  s", pFile->zPath
e0e0: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  );.    return;. 
e0f0: 20 7d 0a 20 20 69 66 28 20 62 75 66 2e 73 74 5f   }.  if( buf.st_
e100: 6e 6c 69 6e 6b 3e 31 20 29 7b 0a 20 20 20 20 73  nlink>1 ){.    s
e110: 71 6c 69 74 65 33 5f 6c 6f 67 28 53 51 4c 49 54  qlite3_log(SQLIT
e120: 45 5f 57 41 52 4e 49 4e 47 2c 20 22 6d 75 6c 74  E_WARNING, "mult
e130: 69 70 6c 65 20 6c 69 6e 6b 73 20 74 6f 20 66 69  iple links to fi
e140: 6c 65 3a 20 25 73 22 2c 20 70 46 69 6c 65 2d 3e  le: %s", pFile->
e150: 7a 50 61 74 68 29 3b 0a 20 20 20 20 72 65 74 75  zPath);.    retu
e160: 72 6e 3b 0a 20 20 7d 0a 20 20 69 66 28 20 66 69  rn;.  }.  if( fi
e170: 6c 65 48 61 73 4d 6f 76 65 64 28 70 46 69 6c 65  leHasMoved(pFile
e180: 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  ) ){.    sqlite3
e190: 5f 6c 6f 67 28 53 51 4c 49 54 45 5f 57 41 52 4e  _log(SQLITE_WARN
e1a0: 49 4e 47 2c 20 22 66 69 6c 65 20 72 65 6e 61 6d  ING, "file renam
e1b0: 65 64 20 77 68 69 6c 65 20 6f 70 65 6e 3a 20 25  ed while open: %
e1c0: 73 22 2c 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68  s", pFile->zPath
e1d0: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  );.    return;. 
e1e0: 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69   }.}.../*.** Thi
e1f0: 73 20 72 6f 75 74 69 6e 65 20 63 68 65 63 6b 73  s routine checks
e200: 20 69 66 20 74 68 65 72 65 20 69 73 20 61 20 52   if there is a R
e210: 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 68 65 6c  ESERVED lock hel
e220: 64 20 6f 6e 20 74 68 65 20 73 70 65 63 69 66 69  d on the specifi
e230: 65 64 0a 2a 2a 20 66 69 6c 65 20 62 79 20 74 68  ed.** file by th
e240: 69 73 20 6f 72 20 61 6e 79 20 6f 74 68 65 72 20  is or any other 
e250: 70 72 6f 63 65 73 73 2e 20 49 66 20 73 75 63 68  process. If such
e260: 20 61 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64 2c   a lock is held,
e270: 20 73 65 74 20 2a 70 52 65 73 4f 75 74 0a 2a 2a   set *pResOut.**
e280: 20 74 6f 20 61 20 6e 6f 6e 2d 7a 65 72 6f 20 76   to a non-zero v
e290: 61 6c 75 65 20 6f 74 68 65 72 77 69 73 65 20 2a  alue otherwise *
e2a0: 70 52 65 73 4f 75 74 20 69 73 20 73 65 74 20 74  pResOut is set t
e2b0: 6f 20 7a 65 72 6f 2e 20 20 54 68 65 20 72 65 74  o zero.  The ret
e2c0: 75 72 6e 20 76 61 6c 75 65 0a 2a 2a 20 69 73 20  urn value.** is 
e2d0: 73 65 74 20 74 6f 20 53 51 4c 49 54 45 5f 4f 4b  set to SQLITE_OK
e2e0: 20 75 6e 6c 65 73 73 20 61 6e 20 49 2f 4f 20 65   unless an I/O e
e2f0: 72 72 6f 72 20 6f 63 63 75 72 73 20 64 75 72 69  rror occurs duri
e300: 6e 67 20 6c 6f 63 6b 20 63 68 65 63 6b 69 6e 67  ng lock checking
e310: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
e320: 75 6e 69 78 43 68 65 63 6b 52 65 73 65 72 76 65  unixCheckReserve
e330: 64 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69  dLock(sqlite3_fi
e340: 6c 65 20 2a 69 64 2c 20 69 6e 74 20 2a 70 52 65  le *id, int *pRe
e350: 73 4f 75 74 29 7b 0a 20 20 69 6e 74 20 72 63 20  sOut){.  int rc 
e360: 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69  = SQLITE_OK;.  i
e370: 6e 74 20 72 65 73 65 72 76 65 64 20 3d 20 30 3b  nt reserved = 0;
e380: 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69  .  unixFile *pFi
e390: 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29  le = (unixFile*)
e3a0: 69 64 3b 0a 0a 20 20 53 69 6d 75 6c 61 74 65 49  id;..  SimulateI
e3b0: 4f 45 72 72 6f 72 28 20 72 65 74 75 72 6e 20 53  OError( return S
e3c0: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43 48 45 43  QLITE_IOERR_CHEC
e3d0: 4b 52 45 53 45 52 56 45 44 4c 4f 43 4b 3b 20 29  KRESERVEDLOCK; )
e3e0: 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 46 69  ;..  assert( pFi
e3f0: 6c 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  le );.  assert( 
e400: 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  pFile->eFileLock
e410: 3c 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b  <=SHARED_LOCK );
e420: 0a 20 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65  .  unixEnterMute
e430: 78 28 29 3b 20 2f 2a 20 42 65 63 61 75 73 65 20  x(); /* Because 
e440: 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 20 69 73  pFile->pInode is
e450: 20 73 68 61 72 65 64 20 61 63 72 6f 73 73 20 74   shared across t
e460: 68 72 65 61 64 73 20 2a 2f 0a 0a 20 20 2f 2a 20  hreads */..  /* 
e470: 43 68 65 63 6b 20 69 66 20 61 20 74 68 72 65 61  Check if a threa
e480: 64 20 69 6e 20 74 68 69 73 20 70 72 6f 63 65 73  d in this proces
e490: 73 20 68 6f 6c 64 73 20 73 75 63 68 20 61 20 6c  s holds such a l
e4a0: 6f 63 6b 20 2a 2f 0a 20 20 69 66 28 20 70 46 69  ock */.  if( pFi
e4b0: 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e 65 46 69 6c  le->pInode->eFil
e4c0: 65 4c 6f 63 6b 3e 53 48 41 52 45 44 5f 4c 4f 43  eLock>SHARED_LOC
e4d0: 4b 20 29 7b 0a 20 20 20 20 72 65 73 65 72 76 65  K ){.    reserve
e4e0: 64 20 3d 20 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  d = 1;.  }..  /*
e4f0: 20 4f 74 68 65 72 77 69 73 65 20 73 65 65 20 69   Otherwise see i
e500: 66 20 73 6f 6d 65 20 6f 74 68 65 72 20 70 72 6f  f some other pro
e510: 63 65 73 73 20 68 6f 6c 64 73 20 69 74 2e 0a 20  cess holds it.. 
e520: 20 2a 2f 0a 23 69 66 6e 64 65 66 20 5f 5f 44 4a   */.#ifndef __DJ
e530: 47 50 50 5f 5f 0a 20 20 69 66 28 20 21 72 65 73  GPP__.  if( !res
e540: 65 72 76 65 64 20 26 26 20 21 70 46 69 6c 65 2d  erved && !pFile-
e550: 3e 70 49 6e 6f 64 65 2d 3e 62 50 72 6f 63 65 73  >pInode->bProces
e560: 73 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 73 74 72  sLock ){.    str
e570: 75 63 74 20 66 6c 6f 63 6b 20 6c 6f 63 6b 3b 0a  uct flock lock;.
e580: 20 20 20 20 6c 6f 63 6b 2e 6c 5f 77 68 65 6e 63      lock.l_whenc
e590: 65 20 3d 20 53 45 45 4b 5f 53 45 54 3b 0a 20 20  e = SEEK_SET;.  
e5a0: 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d    lock.l_start =
e5b0: 20 52 45 53 45 52 56 45 44 5f 42 59 54 45 3b 0a   RESERVED_BYTE;.
e5c0: 20 20 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d      lock.l_len =
e5d0: 20 31 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74   1;.    lock.l_t
e5e0: 79 70 65 20 3d 20 46 5f 57 52 4c 43 4b 3b 0a 20  ype = F_WRLCK;. 
e5f0: 20 20 20 69 66 28 20 6f 73 46 63 6e 74 6c 28 70     if( osFcntl(p
e600: 46 69 6c 65 2d 3e 68 2c 20 46 5f 47 45 54 4c 4b  File->h, F_GETLK
e610: 2c 20 26 6c 6f 63 6b 29 20 29 7b 0a 23 69 66 20  , &lock) ){.#if 
e620: 4f 53 4c 4f 43 4b 49 4e 47 5f 43 48 45 43 4b 5f  OSLOCKING_CHECK_
e630: 42 55 53 59 5f 49 4f 45 52 52 0a 20 20 20 20 20  BUSY_IOERR.     
e640: 20 69 6e 74 20 74 45 72 72 6e 6f 20 3d 20 65 72   int tErrno = er
e650: 72 6e 6f 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  rno;.      rc = 
e660: 73 71 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d 50  sqliteErrorFromP
e670: 6f 73 69 78 45 72 72 6f 72 28 74 45 72 72 6e 6f  osixError(tErrno
e680: 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43  , SQLITE_IOERR_C
e690: 48 45 43 4b 52 45 53 45 52 56 45 44 4c 4f 43 4b  HECKRESERVEDLOCK
e6a0: 29 3b 0a 20 20 20 20 20 20 73 74 6f 72 65 4c 61  );.      storeLa
e6b0: 73 74 45 72 72 6e 6f 28 70 46 69 6c 65 2c 20 74  stErrno(pFile, t
e6c0: 45 72 72 6e 6f 29 3b 0a 23 65 6c 73 65 0a 20 20  Errno);.#else.  
e6d0: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
e6e0: 49 4f 45 52 52 5f 43 48 45 43 4b 52 45 53 45 52  IOERR_CHECKRESER
e6f0: 56 45 44 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 73  VEDLOCK;.      s
e700: 74 6f 72 65 4c 61 73 74 45 72 72 6e 6f 28 70 46  toreLastErrno(pF
e710: 69 6c 65 2c 20 65 72 72 6e 6f 29 3b 0a 23 65 6e  ile, errno);.#en
e720: 64 69 66 0a 20 20 20 20 7d 20 65 6c 73 65 20 69  dif.    } else i
e730: 66 28 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65 21 3d  f( lock.l_type!=
e740: 46 5f 55 4e 4c 43 4b 20 29 7b 0a 20 20 20 20 20  F_UNLCK ){.     
e750: 20 72 65 73 65 72 76 65 64 20 3d 20 31 3b 0a 20   reserved = 1;. 
e760: 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a     }.  }.#endif.
e770: 20 20 0a 20 20 75 6e 69 78 4c 65 61 76 65 4d 75    .  unixLeaveMu
e780: 74 65 78 28 29 3b 0a 20 20 4f 53 54 52 41 43 45  tex();.  OSTRACE
e790: 28 28 22 54 45 53 54 20 57 52 2d 4c 4f 43 4b 20  (("TEST WR-LOCK 
e7a0: 25 64 20 25 64 20 25 64 20 28 75 6e 69 78 29 5c  %d %d %d (unix)\
e7b0: 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 72 63  n", pFile->h, rc
e7c0: 2c 20 72 65 73 65 72 76 65 64 29 29 3b 0a 0a 20  , reserved));.. 
e7d0: 20 2a 70 52 65 73 4f 75 74 20 3d 20 72 65 73 65   *pResOut = rese
e7e0: 72 76 65 64 3b 0a 20 20 72 65 74 75 72 6e 20 72  rved;.  return r
e7f0: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 74 74 65  c;.}../*.** Atte
e800: 6d 70 74 20 74 6f 20 73 65 74 20 61 20 73 79 73  mpt to set a sys
e810: 74 65 6d 2d 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  tem-lock on the 
e820: 66 69 6c 65 20 70 46 69 6c 65 2e 20 20 54 68 65  file pFile.  The
e830: 20 6c 6f 63 6b 20 69 73 20 0a 2a 2a 20 64 65 73   lock is .** des
e840: 63 72 69 62 65 64 20 62 79 20 70 4c 6f 63 6b 2e  cribed by pLock.
e850: 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70 46  .**.** If the pF
e860: 69 6c 65 20 77 61 73 20 6f 70 65 6e 65 64 20 72  ile was opened r
e870: 65 61 64 2f 77 72 69 74 65 20 66 72 6f 6d 20 75  ead/write from u
e880: 6e 69 78 2d 65 78 63 6c 2c 20 74 68 65 6e 20 74  nix-excl, then t
e890: 68 65 20 6f 6e 6c 79 20 6c 6f 63 6b 0a 2a 2a 20  he only lock.** 
e8a0: 65 76 65 72 20 6f 62 74 61 69 6e 65 64 20 69 73  ever obtained is
e8b0: 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f   an exclusive lo
e8c0: 63 6b 2c 20 61 6e 64 20 69 74 20 69 73 20 6f 62  ck, and it is ob
e8d0: 74 61 69 6e 65 64 20 65 78 61 63 74 6c 79 20 6f  tained exactly o
e8e0: 6e 63 65 0a 2a 2a 20 74 68 65 20 66 69 72 73 74  nce.** the first
e8f0: 20 74 69 6d 65 20 61 6e 79 20 6c 6f 63 6b 20 69   time any lock i
e900: 73 20 61 74 74 65 6d 70 74 65 64 2e 20 20 41 6c  s attempted.  Al
e910: 6c 20 73 75 62 73 65 71 75 65 6e 74 20 73 79 73  l subsequent sys
e920: 74 65 6d 20 6c 6f 63 6b 69 6e 67 0a 2a 2a 20 6f  tem locking.** o
e930: 70 65 72 61 74 69 6f 6e 73 20 62 65 63 6f 6d 65  perations become
e940: 20 6e 6f 2d 6f 70 73 2e 20 20 4c 6f 63 6b 69 6e   no-ops.  Lockin
e950: 67 20 6f 70 65 72 61 74 69 6f 6e 73 20 73 74 69  g operations sti
e960: 6c 6c 20 68 61 70 70 65 6e 20 69 6e 74 65 72 6e  ll happen intern
e970: 61 6c 6c 79 2c 0a 2a 2a 20 69 6e 20 6f 72 64 65  ally,.** in orde
e980: 72 20 74 6f 20 63 6f 6f 72 64 69 6e 61 74 65 20  r to coordinate 
e990: 61 63 63 65 73 73 20 62 65 74 77 65 65 6e 20 73  access between s
e9a0: 65 70 61 72 61 74 65 20 64 61 74 61 62 61 73 65  eparate database
e9b0: 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 0a 2a 2a 20   connections.** 
e9c0: 77 69 74 68 69 6e 20 74 68 69 73 20 70 72 6f 63  within this proc
e9d0: 65 73 73 2c 20 62 75 74 20 61 6c 6c 20 6f 66 20  ess, but all of 
e9e0: 74 68 61 74 20 69 73 20 68 61 6e 64 6c 65 64 20  that is handled 
e9f0: 69 6e 20 6d 65 6d 6f 72 79 20 61 6e 64 20 74 68  in memory and th
ea00: 65 0a 2a 2a 20 6f 70 65 72 61 74 69 6e 67 20 73  e.** operating s
ea10: 79 73 74 65 6d 20 64 6f 65 73 20 6e 6f 74 20 70  ystem does not p
ea20: 61 72 74 69 63 69 70 61 74 65 2e 0a 2a 2a 0a 2a  articipate..**.*
ea30: 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
ea40: 69 73 20 61 20 70 61 73 73 2d 74 68 72 6f 75 67  is a pass-throug
ea50: 68 20 74 6f 20 66 63 6e 74 6c 28 46 5f 53 45 54  h to fcntl(F_SET
ea60: 4c 4b 29 20 69 66 20 70 46 69 6c 65 20 69 73 20  LK) if pFile is 
ea70: 75 73 69 6e 67 0a 2a 2a 20 61 6e 79 20 56 46 53  using.** any VFS
ea80: 20 6f 74 68 65 72 20 74 68 61 6e 20 22 75 6e 69   other than "uni
ea90: 78 2d 65 78 63 6c 22 20 6f 72 20 69 66 20 70 46  x-excl" or if pF
eaa0: 69 6c 65 20 69 73 20 6f 70 65 6e 65 64 20 6f 6e  ile is opened on
eab0: 20 22 75 6e 69 78 2d 65 78 63 6c 22 0a 2a 2a 20   "unix-excl".** 
eac0: 61 6e 64 20 69 73 20 72 65 61 64 2d 6f 6e 6c 79  and is read-only
ead0: 2e 0a 2a 2a 0a 2a 2a 20 5a 65 72 6f 20 69 73 20  ..**.** Zero is 
eae0: 72 65 74 75 72 6e 65 64 20 69 66 20 74 68 65 20  returned if the 
eaf0: 63 61 6c 6c 20 63 6f 6d 70 6c 65 74 65 73 20 73  call completes s
eb00: 75 63 63 65 73 73 66 75 6c 6c 79 2c 20 6f 72 20  uccessfully, or 
eb10: 2d 31 20 69 66 20 61 20 63 61 6c 6c 0a 2a 2a 20  -1 if a call.** 
eb20: 74 6f 20 66 63 6e 74 6c 28 29 20 66 61 69 6c 73  to fcntl() fails
eb30: 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 2c 20  . In this case, 
eb40: 65 72 72 6e 6f 20 69 73 20 73 65 74 20 61 70 70  errno is set app
eb50: 72 6f 70 72 69 61 74 65 6c 79 20 28 62 79 20 66  ropriately (by f
eb60: 63 6e 74 6c 28 29 29 2e 0a 2a 2f 0a 73 74 61 74  cntl())..*/.stat
eb70: 69 63 20 69 6e 74 20 75 6e 69 78 46 69 6c 65 4c  ic int unixFileL
eb80: 6f 63 6b 28 75 6e 69 78 46 69 6c 65 20 2a 70 46  ock(unixFile *pF
eb90: 69 6c 65 2c 20 73 74 72 75 63 74 20 66 6c 6f 63  ile, struct floc
eba0: 6b 20 2a 70 4c 6f 63 6b 2c 20 69 6e 74 20 6e 52  k *pLock, int nR
ebb0: 65 74 72 79 29 7b 0a 20 20 69 6e 74 20 72 63 3b  etry){.  int rc;
ebc0: 0a 20 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f  .  unixInodeInfo
ebd0: 20 2a 70 49 6e 6f 64 65 20 3d 20 70 46 69 6c 65   *pInode = pFile
ebe0: 2d 3e 70 49 6e 6f 64 65 3b 0a 20 20 61 73 73 65  ->pInode;.  asse
ebf0: 72 74 28 20 75 6e 69 78 4d 75 74 65 78 48 65 6c  rt( unixMutexHel
ec00: 64 28 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  d() );.  assert(
ec10: 20 70 49 6e 6f 64 65 21 3d 30 20 29 3b 0a 20 20   pInode!=0 );.  
ec20: 69 66 28 20 28 70 46 69 6c 65 2d 3e 63 74 72 6c  if( (pFile->ctrl
ec30: 46 6c 61 67 73 20 26 20 28 55 4e 49 58 46 49 4c  Flags & (UNIXFIL
ec40: 45 5f 45 58 43 4c 7c 55 4e 49 58 46 49 4c 45 5f  E_EXCL|UNIXFILE_
ec50: 52 44 4f 4e 4c 59 29 29 3d 3d 55 4e 49 58 46 49  RDONLY))==UNIXFI
ec60: 4c 45 5f 45 58 43 4c 20 29 7b 0a 20 20 20 20 69  LE_EXCL ){.    i
ec70: 66 28 20 70 49 6e 6f 64 65 2d 3e 62 50 72 6f 63  f( pInode->bProc
ec80: 65 73 73 4c 6f 63 6b 3d 3d 30 20 29 7b 0a 20 20  essLock==0 ){.  
ec90: 20 20 20 20 73 74 72 75 63 74 20 66 6c 6f 63 6b      struct flock
eca0: 20 6c 6f 63 6b 3b 0a 20 20 20 20 20 20 61 73 73   lock;.      ass
ecb0: 65 72 74 28 20 70 49 6e 6f 64 65 2d 3e 6e 4c 6f  ert( pInode->nLo
ecc0: 63 6b 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 6c  ck==0 );.      l
ecd0: 6f 63 6b 2e 6c 5f 77 68 65 6e 63 65 20 3d 20 53  ock.l_whence = S
ece0: 45 45 4b 5f 53 45 54 3b 0a 20 20 20 20 20 20 6c  EEK_SET;.      l
ecf0: 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 53 48  ock.l_start = SH
ed00: 41 52 45 44 5f 46 49 52 53 54 3b 0a 20 20 20 20  ARED_FIRST;.    
ed10: 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 53    lock.l_len = S
ed20: 48 41 52 45 44 5f 53 49 5a 45 3b 0a 20 20 20 20  HARED_SIZE;.    
ed30: 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d 20    lock.l_type = 
ed40: 46 5f 57 52 4c 43 4b 3b 0a 20 20 20 20 20 20 72  F_WRLCK;.      r
ed50: 63 20 3d 20 6f 73 46 63 6e 74 6c 28 70 46 69 6c  c = osFcntl(pFil
ed60: 65 2d 3e 68 2c 20 46 5f 53 45 54 4c 4b 2c 20 26  e->h, F_SETLK, &
ed70: 6c 6f 63 6b 29 3b 0a 20 20 20 20 20 20 69 66 28  lock);.      if(
ed80: 20 72 63 3c 30 20 29 20 72 65 74 75 72 6e 20 72   rc<0 ) return r
ed90: 63 3b 0a 20 20 20 20 20 20 70 49 6e 6f 64 65 2d  c;.      pInode-
eda0: 3e 62 50 72 6f 63 65 73 73 4c 6f 63 6b 20 3d 20  >bProcessLock = 
edb0: 31 3b 0a 20 20 20 20 20 20 70 49 6e 6f 64 65 2d  1;.      pInode-
edc0: 3e 6e 4c 6f 63 6b 2b 2b 3b 0a 20 20 20 20 7d 65  >nLock++;.    }e
edd0: 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  lse{.      rc = 
ede0: 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65  0;.    }.  }else
edf0: 7b 0a 20 20 20 20 69 6e 74 20 69 20 3d 20 30 3b  {.    int i = 0;
ee00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ee10: 20 20 20 20 20 20 0a 20 20 20 20 66 6f 72 28 3b        .    for(;
ee20: 3b 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 6f  ;){.      rc = o
ee30: 73 46 63 6e 74 6c 28 70 46 69 6c 65 2d 3e 68 2c  sFcntl(pFile->h,
ee40: 20 46 5f 53 45 54 4c 4b 2c 20 70 4c 6f 63 6b 29   F_SETLK, pLock)
ee50: 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 26  ;.      if( rc &
ee60: 26 20 6e 52 65 74 72 79 2d 2d 20 29 7b 0a 20 20  & nRetry-- ){.  
ee70: 20 20 20 20 20 20 75 73 6c 65 65 70 28 31 30 30        usleep(100
ee80: 20 2a 20 28 2b 2b 69 29 29 3b 0a 20 20 20 20 20   * (++i));.     
ee90: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
eea0: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
eeb0: 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
eec0: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c  n rc;.}../*.** L
eed0: 6f 63 6b 20 74 68 65 20 66 69 6c 65 20 77 69 74  ock the file wit
eee0: 68 20 74 68 65 20 6c 6f 63 6b 20 73 70 65 63 69  h the lock speci
eef0: 66 69 65 64 20 62 79 20 70 61 72 61 6d 65 74 65  fied by paramete
ef00: 72 20 65 46 69 6c 65 4c 6f 63 6b 20 2d 20 6f 6e  r eFileLock - on
ef10: 65 0a 2a 2a 20 6f 66 20 74 68 65 20 66 6f 6c 6c  e.** of the foll
ef20: 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  owing:.**.**    
ef30: 20 28 31 29 20 53 48 41 52 45 44 5f 4c 4f 43 4b   (1) SHARED_LOCK
ef40: 0a 2a 2a 20 20 20 20 20 28 32 29 20 52 45 53 45  .**     (2) RESE
ef50: 52 56 45 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20  RVED_LOCK.**    
ef60: 20 28 33 29 20 50 45 4e 44 49 4e 47 5f 4c 4f 43   (3) PENDING_LOC
ef70: 4b 0a 2a 2a 20 20 20 20 20 28 34 29 20 45 58 43  K.**     (4) EXC
ef80: 4c 55 53 49 56 45 5f 4c 4f 43 4b 0a 2a 2a 0a 2a  LUSIVE_LOCK.**.*
ef90: 2a 20 53 6f 6d 65 74 69 6d 65 73 20 77 68 65 6e  * Sometimes when
efa0: 20 72 65 71 75 65 73 74 69 6e 67 20 6f 6e 65 20   requesting one 
efb0: 6c 6f 63 6b 20 73 74 61 74 65 2c 20 61 64 64 69  lock state, addi
efc0: 74 69 6f 6e 61 6c 20 6c 6f 63 6b 20 73 74 61 74  tional lock stat
efd0: 65 73 0a 2a 2a 20 61 72 65 20 69 6e 73 65 72 74  es.** are insert
efe0: 65 64 20 69 6e 20 62 65 74 77 65 65 6e 2e 20 20  ed in between.  
eff0: 54 68 65 20 6c 6f 63 6b 69 6e 67 20 6d 69 67 68  The locking migh
f000: 74 20 66 61 69 6c 20 6f 6e 20 6f 6e 65 20 6f 66  t fail on one of
f010: 20 74 68 65 20 6c 61 74 65 72 0a 2a 2a 20 74 72   the later.** tr
f020: 61 6e 73 69 74 69 6f 6e 73 20 6c 65 61 76 69 6e  ansitions leavin
f030: 67 20 74 68 65 20 6c 6f 63 6b 20 73 74 61 74 65  g the lock state
f040: 20 64 69 66 66 65 72 65 6e 74 20 66 72 6f 6d 20   different from 
f050: 77 68 61 74 20 69 74 20 73 74 61 72 74 65 64 20  what it started 
f060: 62 75 74 0a 2a 2a 20 73 74 69 6c 6c 20 73 68 6f  but.** still sho
f070: 72 74 20 6f 66 20 69 74 73 20 67 6f 61 6c 2e 20  rt of its goal. 
f080: 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63   The following c
f090: 68 61 72 74 20 73 68 6f 77 73 20 74 68 65 20 61  hart shows the a
f0a0: 6c 6c 6f 77 65 64 0a 2a 2a 20 74 72 61 6e 73 69  llowed.** transi
f0b0: 74 69 6f 6e 73 20 61 6e 64 20 74 68 65 20 69 6e  tions and the in
f0c0: 73 65 72 74 65 64 20 69 6e 74 65 72 6d 65 64 69  serted intermedi
f0d0: 61 74 65 20 73 74 61 74 65 73 3a 0a 2a 2a 0a 2a  ate states:.**.*
f0e0: 2a 20 20 20 20 55 4e 4c 4f 43 4b 45 44 20 2d 3e  *    UNLOCKED ->
f0f0: 20 53 48 41 52 45 44 0a 2a 2a 20 20 20 20 53 48   SHARED.**    SH
f100: 41 52 45 44 20 2d 3e 20 52 45 53 45 52 56 45 44  ARED -> RESERVED
f110: 0a 2a 2a 20 20 20 20 53 48 41 52 45 44 20 2d 3e  .**    SHARED ->
f120: 20 28 50 45 4e 44 49 4e 47 29 20 2d 3e 20 45 58   (PENDING) -> EX
f130: 43 4c 55 53 49 56 45 0a 2a 2a 20 20 20 20 52 45  CLUSIVE.**    RE
f140: 53 45 52 56 45 44 20 2d 3e 20 28 50 45 4e 44 49  SERVED -> (PENDI
f150: 4e 47 29 20 2d 3e 20 45 58 43 4c 55 53 49 56 45  NG) -> EXCLUSIVE
f160: 0a 2a 2a 20 20 20 20 50 45 4e 44 49 4e 47 20 2d  .**    PENDING -
f170: 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 0a 2a  > EXCLUSIVE.**.*
f180: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77  * This routine w
f190: 69 6c 6c 20 6f 6e 6c 79 20 69 6e 63 72 65 61 73  ill only increas
f1a0: 65 20 61 20 6c 6f 63 6b 2e 20 20 55 73 65 20 74  e a lock.  Use t
f1b0: 68 65 20 73 71 6c 69 74 65 33 4f 73 55 6e 6c 6f  he sqlite3OsUnlo
f1c0: 63 6b 28 29 0a 2a 2a 20 72 6f 75 74 69 6e 65 20  ck().** routine 
f1d0: 74 6f 20 6c 6f 77 65 72 20 61 20 6c 6f 63 6b 69  to lower a locki
f1e0: 6e 67 20 6c 65 76 65 6c 2e 0a 2a 2f 0a 73 74 61  ng level..*/.sta
f1f0: 74 69 63 20 69 6e 74 20 75 6e 69 78 4c 6f 63 6b  tic int unixLock
f200: 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69  (sqlite3_file *i
f210: 64 2c 20 69 6e 74 20 65 46 69 6c 65 4c 6f 63 6b  d, int eFileLock
f220: 29 7b 0a 20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c  ){.  /* The foll
f230: 6f 77 69 6e 67 20 64 65 73 63 72 69 62 65 73 20  owing describes 
f240: 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  the implementati
f250: 6f 6e 20 6f 66 20 74 68 65 20 76 61 72 69 6f 75  on of the variou
f260: 73 20 6c 6f 63 6b 73 20 61 6e 64 0a 20 20 2a 2a  s locks and.  **
f270: 20 6c 6f 63 6b 20 74 72 61 6e 73 69 74 69 6f 6e   lock transition
f280: 73 20 69 6e 20 74 65 72 6d 73 20 6f 66 20 74 68  s in terms of th
f290: 65 20 50 4f 53 49 58 20 61 64 76 69 73 6f 72 79  e POSIX advisory
f2a0: 20 73 68 61 72 65 64 20 61 6e 64 20 65 78 63 6c   shared and excl
f2b0: 75 73 69 76 65 0a 20 20 2a 2a 20 6c 6f 63 6b 20  usive.  ** lock 
f2c0: 70 72 69 6d 69 74 69 76 65 73 20 28 63 61 6c 6c  primitives (call
f2d0: 65 64 20 72 65 61 64 2d 6c 6f 63 6b 73 20 61 6e  ed read-locks an
f2e0: 64 20 77 72 69 74 65 2d 6c 6f 63 6b 73 20 62 65  d write-locks be
f2f0: 6c 6f 77 2c 20 74 6f 20 61 76 6f 69 64 0a 20 20  low, to avoid.  
f300: 2a 2a 20 63 6f 6e 66 75 73 69 6f 6e 20 77 69 74  ** confusion wit
f310: 68 20 53 51 4c 69 74 65 20 6c 6f 63 6b 20 6e 61  h SQLite lock na
f320: 6d 65 73 29 2e 20 54 68 65 20 61 6c 67 6f 72 69  mes). The algori
f330: 74 68 6d 73 20 61 72 65 20 63 6f 6d 70 6c 69 63  thms are complic
f340: 61 74 65 64 0a 20 20 2a 2a 20 73 6c 69 67 68 74  ated.  ** slight
f350: 6c 79 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 62  ly in order to b
f360: 65 20 63 6f 6d 70 61 74 69 62 6c 65 20 77 69 74  e compatible wit
f370: 68 20 77 69 6e 64 6f 77 73 20 73 79 73 74 65 6d  h windows system
f380: 73 20 73 69 6d 75 6c 74 61 6e 65 6f 75 73 6c 79  s simultaneously
f390: 0a 20 20 2a 2a 20 61 63 63 65 73 73 69 6e 67 20  .  ** accessing 
f3a0: 74 68 65 20 73 61 6d 65 20 64 61 74 61 62 61 73  the same databas
f3b0: 65 20 66 69 6c 65 2c 20 69 6e 20 63 61 73 65 20  e file, in case 
f3c0: 74 68 61 74 20 69 73 20 65 76 65 72 20 72 65 71  that is ever req
f3d0: 75 69 72 65 64 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  uired..  **.  **
f3e0: 20 53 79 6d 62 6f 6c 73 20 64 65 66 69 6e 65 64   Symbols defined
f3f0: 20 69 6e 20 6f 73 2e 68 20 69 6e 64 65 6e 74 69   in os.h indenti
f400: 66 79 20 74 68 65 20 27 70 65 6e 64 69 6e 67 20  fy the 'pending 
f410: 62 79 74 65 27 20 61 6e 64 20 74 68 65 20 27 72  byte' and the 'r
f420: 65 73 65 72 76 65 64 0a 20 20 2a 2a 20 62 79 74  eserved.  ** byt
f430: 65 27 2c 20 65 61 63 68 20 73 69 6e 67 6c 65 20  e', each single 
f440: 62 79 74 65 73 20 61 74 20 77 65 6c 6c 20 6b 6e  bytes at well kn
f450: 6f 77 6e 20 6f 66 66 73 65 74 73 2c 20 61 6e 64  own offsets, and
f460: 20 74 68 65 20 27 73 68 61 72 65 64 20 62 79 74   the 'shared byt
f470: 65 0a 20 20 2a 2a 20 72 61 6e 67 65 27 2c 20 61  e.  ** range', a
f480: 20 72 61 6e 67 65 20 6f 66 20 35 31 30 20 62 79   range of 510 by
f490: 74 65 73 20 61 74 20 61 20 77 65 6c 6c 20 6b 6e  tes at a well kn
f4a0: 6f 77 6e 20 6f 66 66 73 65 74 2e 0a 20 20 2a 2a  own offset..  **
f4b0: 0a 20 20 2a 2a 20 54 6f 20 6f 62 74 61 69 6e 20  .  ** To obtain 
f4c0: 61 20 53 48 41 52 45 44 20 6c 6f 63 6b 2c 20 61  a SHARED lock, a
f4d0: 20 72 65 61 64 2d 6c 6f 63 6b 20 69 73 20 6f 62   read-lock is ob
f4e0: 74 61 69 6e 65 64 20 6f 6e 20 74 68 65 20 27 70  tained on the 'p
f4f0: 65 6e 64 69 6e 67 0a 20 20 2a 2a 20 62 79 74 65  ending.  ** byte
f500: 27 2e 20 20 49 66 20 74 68 69 73 20 69 73 20 73  '.  If this is s
f510: 75 63 63 65 73 73 66 75 6c 2c 20 61 20 72 61 6e  uccessful, a ran
f520: 64 6f 6d 20 62 79 74 65 20 66 72 6f 6d 20 74 68  dom byte from th
f530: 65 20 27 73 68 61 72 65 64 20 62 79 74 65 0a 20  e 'shared byte. 
f540: 20 2a 2a 20 72 61 6e 67 65 27 20 69 73 20 72 65   ** range' is re
f550: 61 64 2d 6c 6f 63 6b 65 64 20 61 6e 64 20 74 68  ad-locked and th
f560: 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 27 70  e lock on the 'p
f570: 65 6e 64 69 6e 67 20 62 79 74 65 27 20 72 65 6c  ending byte' rel
f580: 65 61 73 65 64 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  eased..  **.  **
f590: 20 41 20 70 72 6f 63 65 73 73 20 6d 61 79 20 6f   A process may o
f5a0: 6e 6c 79 20 6f 62 74 61 69 6e 20 61 20 52 45 53  nly obtain a RES
f5b0: 45 52 56 45 44 20 6c 6f 63 6b 20 61 66 74 65 72  ERVED lock after
f5c0: 20 69 74 20 68 61 73 20 61 20 53 48 41 52 45 44   it has a SHARED
f5d0: 20 6c 6f 63 6b 2e 0a 20 20 2a 2a 20 41 20 52 45   lock..  ** A RE
f5e0: 53 45 52 56 45 44 20 6c 6f 63 6b 20 69 73 20 69  SERVED lock is i
f5f0: 6d 70 6c 65 6d 65 6e 74 65 64 20 62 79 20 67 72  mplemented by gr
f600: 61 62 62 69 6e 67 20 61 20 77 72 69 74 65 2d 6c  abbing a write-l
f610: 6f 63 6b 20 6f 6e 20 74 68 65 0a 20 20 2a 2a 20  ock on the.  ** 
f620: 27 72 65 73 65 72 76 65 64 20 62 79 74 65 27 2e  'reserved byte'.
f630: 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 20 70 72   .  **.  ** A pr
f640: 6f 63 65 73 73 20 6d 61 79 20 6f 6e 6c 79 20 6f  ocess may only o
f650: 62 74 61 69 6e 20 61 20 50 45 4e 44 49 4e 47 20  btain a PENDING 
f660: 6c 6f 63 6b 20 61 66 74 65 72 20 69 74 20 68 61  lock after it ha
f670: 73 20 6f 62 74 61 69 6e 65 64 20 61 0a 20 20 2a  s obtained a.  *
f680: 2a 20 53 48 41 52 45 44 20 6c 6f 63 6b 2e 20 41  * SHARED lock. A
f690: 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 20 69 73   PENDING lock is
f6a0: 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 62 79 20   implemented by 
f6b0: 6f 62 74 61 69 6e 69 6e 67 20 61 20 77 72 69 74  obtaining a writ
f6c0: 65 2d 6c 6f 63 6b 0a 20 20 2a 2a 20 6f 6e 20 74  e-lock.  ** on t
f6d0: 68 65 20 27 70 65 6e 64 69 6e 67 20 62 79 74 65  he 'pending byte
f6e0: 27 2e 20 54 68 69 73 20 65 6e 73 75 72 65 73 20  '. This ensures 
f6f0: 74 68 61 74 20 6e 6f 20 6e 65 77 20 53 48 41 52  that no new SHAR
f700: 45 44 20 6c 6f 63 6b 73 20 63 61 6e 20 62 65 0a  ED locks can be.
f710: 20 20 2a 2a 20 6f 62 74 61 69 6e 65 64 2c 20 62    ** obtained, b
f720: 75 74 20 65 78 69 73 74 69 6e 67 20 53 48 41 52  ut existing SHAR
f730: 45 44 20 6c 6f 63 6b 73 20 61 72 65 20 61 6c 6c  ED locks are all
f740: 6f 77 65 64 20 74 6f 20 70 65 72 73 69 73 74 2e  owed to persist.
f750: 20 41 20 70 72 6f 63 65 73 73 0a 20 20 2a 2a 20   A process.  ** 
f760: 64 6f 65 73 20 6e 6f 74 20 68 61 76 65 20 74 6f  does not have to
f770: 20 6f 62 74 61 69 6e 20 61 20 52 45 53 45 52 56   obtain a RESERV
f780: 45 44 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 77  ED lock on the w
f790: 61 79 20 74 6f 20 61 20 50 45 4e 44 49 4e 47 20  ay to a PENDING 
f7a0: 6c 6f 63 6b 2e 0a 20 20 2a 2a 20 54 68 69 73 20  lock..  ** This 
f7b0: 70 72 6f 70 65 72 74 79 20 69 73 20 75 73 65 64  property is used
f7c0: 20 62 79 20 74 68 65 20 61 6c 67 6f 72 69 74 68   by the algorith
f7d0: 6d 20 66 6f 72 20 72 6f 6c 6c 69 6e 67 20 62 61  m for rolling ba
f7e0: 63 6b 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ck a journal fil
f7f0: 65 0a 20 20 2a 2a 20 61 66 74 65 72 20 61 20 63  e.  ** after a c
f800: 72 61 73 68 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  rash..  **.  ** 
f810: 41 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63  An EXCLUSIVE loc
f820: 6b 2c 20 6f 62 74 61 69 6e 65 64 20 61 66 74 65  k, obtained afte
f830: 72 20 61 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b  r a PENDING lock
f840: 20 69 73 20 68 65 6c 64 2c 20 69 73 0a 20 20 2a   is held, is.  *
f850: 2a 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 62 79  * implemented by
f860: 20 6f 62 74 61 69 6e 69 6e 67 20 61 20 77 72 69   obtaining a wri
f870: 74 65 2d 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 65  te-lock on the e
f880: 6e 74 69 72 65 20 27 73 68 61 72 65 64 20 62 79  ntire 'shared by
f890: 74 65 0a 20 20 2a 2a 20 72 61 6e 67 65 27 2e 20  te.  ** range'. 
f8a0: 53 69 6e 63 65 20 61 6c 6c 20 6f 74 68 65 72 20  Since all other 
f8b0: 6c 6f 63 6b 73 20 72 65 71 75 69 72 65 20 61 20  locks require a 
f8c0: 72 65 61 64 2d 6c 6f 63 6b 20 6f 6e 20 6f 6e 65  read-lock on one
f8d0: 20 6f 66 20 74 68 65 20 62 79 74 65 73 0a 20 20   of the bytes.  
f8e0: 2a 2a 20 77 69 74 68 69 6e 20 74 68 69 73 20 72  ** within this r
f8f0: 61 6e 67 65 2c 20 74 68 69 73 20 65 6e 73 75 72  ange, this ensur
f900: 65 73 20 74 68 61 74 20 6e 6f 20 6f 74 68 65 72  es that no other
f910: 20 6c 6f 63 6b 73 20 61 72 65 20 68 65 6c 64 20   locks are held 
f920: 6f 6e 20 74 68 65 0a 20 20 2a 2a 20 64 61 74 61  on the.  ** data
f930: 62 61 73 65 2e 20 0a 20 20 2a 2a 0a 20 20 2a 2a  base. .  **.  **
f940: 20 54 68 65 20 72 65 61 73 6f 6e 20 61 20 73 69   The reason a si
f950: 6e 67 6c 65 20 62 79 74 65 20 63 61 6e 6e 6f 74  ngle byte cannot
f960: 20 62 65 20 75 73 65 64 20 69 6e 73 74 65 61 64   be used instead
f970: 20 6f 66 20 74 68 65 20 27 73 68 61 72 65 64 20   of the 'shared 
f980: 62 79 74 65 0a 20 20 2a 2a 20 72 61 6e 67 65 27  byte.  ** range'
f990: 20 69 73 20 74 68 61 74 20 73 6f 6d 65 20 76 65   is that some ve
f9a0: 72 73 69 6f 6e 73 20 6f 66 20 77 69 6e 64 6f 77  rsions of window
f9b0: 73 20 64 6f 20 6e 6f 74 20 73 75 70 70 6f 72 74  s do not support
f9c0: 20 72 65 61 64 2d 6c 6f 63 6b 73 2e 20 42 79 0a   read-locks. By.
f9d0: 20 20 2a 2a 20 6c 6f 63 6b 69 6e 67 20 61 20 72    ** locking a r
f9e0: 61 6e 64 6f 6d 20 62 79 74 65 20 66 72 6f 6d 20  andom byte from 
f9f0: 61 20 72 61 6e 67 65 2c 20 63 6f 6e 63 75 72 72  a range, concurr
fa00: 65 6e 74 20 53 48 41 52 45 44 20 6c 6f 63 6b 73  ent SHARED locks
fa10: 20 6d 61 79 20 65 78 69 73 74 0a 20 20 2a 2a 20   may exist.  ** 
fa20: 65 76 65 6e 20 69 66 20 74 68 65 20 6c 6f 63 6b  even if the lock
fa30: 69 6e 67 20 70 72 69 6d 69 74 69 76 65 20 75 73  ing primitive us
fa40: 65 64 20 69 73 20 61 6c 77 61 79 73 20 61 20 77  ed is always a w
fa50: 72 69 74 65 2d 6c 6f 63 6b 2e 0a 20 20 2a 2f 0a  rite-lock..  */.
fa60: 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
fa70: 45 5f 4f 4b 3b 0a 20 20 75 6e 69 78 46 69 6c 65  E_OK;.  unixFile
fa80: 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46   *pFile = (unixF
fa90: 69 6c 65 2a 29 69 64 3b 0a 20 20 75 6e 69 78 49  ile*)id;.  unixI
faa0: 6e 6f 64 65 49 6e 66 6f 20 2a 70 49 6e 6f 64 65  nodeInfo *pInode
fab0: 3b 0a 20 20 73 74 72 75 63 74 20 66 6c 6f 63 6b  ;.  struct flock
fac0: 20 6c 6f 63 6b 3b 0a 20 20 69 6e 74 20 74 45 72   lock;.  int tEr
fad0: 72 6e 6f 20 3d 20 30 3b 0a 0a 20 20 61 73 73 65  rno = 0;..  asse
fae0: 72 74 28 20 70 46 69 6c 65 20 29 3b 0a 20 20 4f  rt( pFile );.  O
faf0: 53 54 52 41 43 45 28 28 22 4c 4f 43 4b 20 20 20  STRACE(("LOCK   
fb00: 20 25 64 20 25 73 20 77 61 73 20 25 73 28 25 73   %d %s was %s(%s
fb10: 2c 25 64 29 20 70 69 64 3d 25 64 20 28 75 6e 69  ,%d) pid=%d (uni
fb20: 78 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c  x)\n", pFile->h,
fb30: 0a 20 20 20 20 20 20 61 7a 46 69 6c 65 4c 6f 63  .      azFileLoc
fb40: 6b 28 65 46 69 6c 65 4c 6f 63 6b 29 2c 20 61 7a  k(eFileLock), az
fb50: 46 69 6c 65 4c 6f 63 6b 28 70 46 69 6c 65 2d 3e  FileLock(pFile->
fb60: 65 46 69 6c 65 4c 6f 63 6b 29 2c 0a 20 20 20 20  eFileLock),.    
fb70: 20 20 61 7a 46 69 6c 65 4c 6f 63 6b 28 70 46 69    azFileLock(pFi
fb80: 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e 65 46 69 6c  le->pInode->eFil
fb90: 65 4c 6f 63 6b 29 2c 20 70 46 69 6c 65 2d 3e 70  eLock), pFile->p
fba0: 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64 2c 0a  Inode->nShared,.
fbb0: 20 20 20 20 20 20 6f 73 47 65 74 70 69 64 28 30        osGetpid(0
fbc0: 29 29 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68  )));..  /* If th
fbd0: 65 72 65 20 69 73 20 61 6c 72 65 61 64 79 20 61  ere is already a
fbe0: 20 6c 6f 63 6b 20 6f 66 20 74 68 69 73 20 74 79   lock of this ty
fbf0: 70 65 20 6f 72 20 6d 6f 72 65 20 72 65 73 74 72  pe or more restr
fc00: 69 63 74 69 76 65 20 6f 6e 20 74 68 65 0a 20 20  ictive on the.  
fc10: 2a 2a 20 75 6e 69 78 46 69 6c 65 2c 20 64 6f 20  ** unixFile, do 
fc20: 6e 6f 74 68 69 6e 67 2e 20 44 6f 6e 27 74 20 75  nothing. Don't u
fc30: 73 65 20 74 68 65 20 65 6e 64 5f 6c 6f 63 6b 3a  se the end_lock:
fc40: 20 65 78 69 74 20 70 61 74 68 2c 20 61 73 0a 20   exit path, as. 
fc50: 20 2a 2a 20 75 6e 69 78 45 6e 74 65 72 4d 75 74   ** unixEnterMut
fc60: 65 78 28 29 20 68 61 73 6e 27 74 20 62 65 65 6e  ex() hasn't been
fc70: 20 63 61 6c 6c 65 64 20 79 65 74 2e 0a 20 20 2a   called yet..  *
fc80: 2f 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 65  /.  if( pFile->e
fc90: 46 69 6c 65 4c 6f 63 6b 3e 3d 65 46 69 6c 65 4c  FileLock>=eFileL
fca0: 6f 63 6b 20 29 7b 0a 20 20 20 20 4f 53 54 52 41  ock ){.    OSTRA
fcb0: 43 45 28 28 22 4c 4f 43 4b 20 20 20 20 25 64 20  CE(("LOCK    %d 
fcc0: 25 73 20 6f 6b 20 28 61 6c 72 65 61 64 79 20 68  %s ok (already h
fcd0: 65 6c 64 29 20 28 75 6e 69 78 29 5c 6e 22 2c 20  eld) (unix)\n", 
fce0: 70 46 69 6c 65 2d 3e 68 2c 0a 20 20 20 20 20 20  pFile->h,.      
fcf0: 20 20 20 20 20 20 61 7a 46 69 6c 65 4c 6f 63 6b        azFileLock
fd00: 28 65 46 69 6c 65 4c 6f 63 6b 29 29 29 3b 0a 20  (eFileLock)));. 
fd10: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
fd20: 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d  _OK;.  }..  /* M
fd30: 61 6b 65 20 73 75 72 65 20 74 68 65 20 6c 6f 63  ake sure the loc
fd40: 6b 69 6e 67 20 73 65 71 75 65 6e 63 65 20 69 73  king sequence is
fd50: 20 63 6f 72 72 65 63 74 2e 0a 20 20 2a 2a 20 20   correct..  **  
fd60: 28 31 29 20 57 65 20 6e 65 76 65 72 20 6d 6f 76  (1) We never mov
fd70: 65 20 66 72 6f 6d 20 75 6e 6c 6f 63 6b 65 64 20  e from unlocked 
fd80: 74 6f 20 61 6e 79 74 68 69 6e 67 20 68 69 67 68  to anything high
fd90: 65 72 20 74 68 61 6e 20 73 68 61 72 65 64 20 6c  er than shared l
fda0: 6f 63 6b 2e 0a 20 20 2a 2a 20 20 28 32 29 20 53  ock..  **  (2) S
fdb0: 51 4c 69 74 65 20 6e 65 76 65 72 20 65 78 70 6c  QLite never expl
fdc0: 69 63 69 74 6c 79 20 72 65 71 75 65 73 74 73 20  icitly requests 
fdd0: 61 20 70 65 6e 64 69 67 20 6c 6f 63 6b 2e 0a 20  a pendig lock.. 
fde0: 20 2a 2a 20 20 28 33 29 20 41 20 73 68 61 72 65   **  (3) A share
fdf0: 64 20 6c 6f 63 6b 20 69 73 20 61 6c 77 61 79 73  d lock is always
fe00: 20 68 65 6c 64 20 77 68 65 6e 20 61 20 72 65 73   held when a res
fe10: 65 72 76 65 20 6c 6f 63 6b 20 69 73 20 72 65 71  erve lock is req
fe20: 75 65 73 74 65 64 2e 0a 20 20 2a 2f 0a 20 20 61  uested..  */.  a
fe30: 73 73 65 72 74 28 20 70 46 69 6c 65 2d 3e 65 46  ssert( pFile->eF
fe40: 69 6c 65 4c 6f 63 6b 21 3d 4e 4f 5f 4c 4f 43 4b  ileLock!=NO_LOCK
fe50: 20 7c 7c 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53   || eFileLock==S
fe60: 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20  HARED_LOCK );.  
fe70: 61 73 73 65 72 74 28 20 65 46 69 6c 65 4c 6f 63  assert( eFileLoc
fe80: 6b 21 3d 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 20  k!=PENDING_LOCK 
fe90: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 65 46 69  );.  assert( eFi
fea0: 6c 65 4c 6f 63 6b 21 3d 52 45 53 45 52 56 45 44  leLock!=RESERVED
feb0: 5f 4c 4f 43 4b 20 7c 7c 20 70 46 69 6c 65 2d 3e  _LOCK || pFile->
fec0: 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45  eFileLock==SHARE
fed0: 44 5f 4c 4f 43 4b 20 29 3b 0a 0a 20 20 2f 2a 20  D_LOCK );..  /* 
fee0: 54 68 69 73 20 6d 75 74 65 78 20 69 73 20 6e 65  This mutex is ne
fef0: 65 64 65 64 20 62 65 63 61 75 73 65 20 70 46 69  eded because pFi
ff00: 6c 65 2d 3e 70 49 6e 6f 64 65 20 69 73 20 73 68  le->pInode is sh
ff10: 61 72 65 64 20 61 63 72 6f 73 73 20 74 68 72 65  ared across thre
ff20: 61 64 73 0a 20 20 2a 2f 0a 20 20 75 6e 69 78 45  ads.  */.  unixE
ff30: 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 20 20 70  nterMutex();.  p
ff40: 49 6e 6f 64 65 20 3d 20 70 46 69 6c 65 2d 3e 70  Inode = pFile->p
ff50: 49 6e 6f 64 65 3b 0a 0a 20 20 2f 2a 20 49 66 20  Inode;..  /* If 
ff60: 73 6f 6d 65 20 74 68 72 65 61 64 20 75 73 69 6e  some thread usin
ff70: 67 20 74 68 69 73 20 50 49 44 20 68 61 73 20 61  g this PID has a
ff80: 20 6c 6f 63 6b 20 76 69 61 20 61 20 64 69 66 66   lock via a diff
ff90: 65 72 65 6e 74 20 75 6e 69 78 46 69 6c 65 2a 0a  erent unixFile*.
ffa0: 20 20 2a 2a 20 68 61 6e 64 6c 65 20 74 68 61 74    ** handle that
ffb0: 20 70 72 65 63 6c 75 64 65 73 20 74 68 65 20 72   precludes the r
ffc0: 65 71 75 65 73 74 65 64 20 6c 6f 63 6b 2c 20 72  equested lock, r
ffd0: 65 74 75 72 6e 20 42 55 53 59 2e 0a 20 20 2a 2f  eturn BUSY..  */
ffe0: 0a 20 20 69 66 28 20 28 70 46 69 6c 65 2d 3e 65  .  if( (pFile->e
fff0: 46 69 6c 65 4c 6f 63 6b 21 3d 70 49 6e 6f 64 65  FileLock!=pInode
10000 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 26 26 20 0a  ->eFileLock && .
10010 20 20 20 20 20 20 20 20 20 20 28 70 49 6e 6f 64            (pInod
10020 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3e 3d 50 45  e->eFileLock>=PE
10030 4e 44 49 4e 47 5f 4c 4f 43 4b 20 7c 7c 20 65 46  NDING_LOCK || eF
10040 69 6c 65 4c 6f 63 6b 3e 53 48 41 52 45 44 5f 4c  ileLock>SHARED_L
10050 4f 43 4b 29 29 0a 20 20 29 7b 0a 20 20 20 20 72  OCK)).  ){.    r
10060 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 3b  c = SQLITE_BUSY;
10070 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 6c 6f  .    goto end_lo
10080 63 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66  ck;.  }..  /* If
10090 20 61 20 53 48 41 52 45 44 20 6c 6f 63 6b 20 69   a SHARED lock i
100a0 73 20 72 65 71 75 65 73 74 65 64 2c 20 61 6e 64  s requested, and
100b0 20 73 6f 6d 65 20 74 68 72 65 61 64 20 75 73 69   some thread usi
100c0 6e 67 20 74 68 69 73 20 50 49 44 20 61 6c 72 65  ng this PID alre
100d0 61 64 79 0a 20 20 2a 2a 20 68 61 73 20 61 20 53  ady.  ** has a S
100e0 48 41 52 45 44 20 6f 72 20 52 45 53 45 52 56 45  HARED or RESERVE
100f0 44 20 6c 6f 63 6b 2c 20 74 68 65 6e 20 69 6e 63  D lock, then inc
10100 72 65 6d 65 6e 74 20 72 65 66 65 72 65 6e 63 65  rement reference
10110 20 63 6f 75 6e 74 73 20 61 6e 64 0a 20 20 2a 2a   counts and.  **
10120 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
10130 4b 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65 46  K..  */.  if( eF
10140 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f  ileLock==SHARED_
10150 4c 4f 43 4b 20 26 26 20 0a 20 20 20 20 20 20 28  LOCK && .      (
10160 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63  pInode->eFileLoc
10170 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 7c  k==SHARED_LOCK |
10180 7c 20 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c  | pInode->eFileL
10190 6f 63 6b 3d 3d 52 45 53 45 52 56 45 44 5f 4c 4f  ock==RESERVED_LO
101a0 43 4b 29 20 29 7b 0a 20 20 20 20 61 73 73 65 72  CK) ){.    asser
101b0 74 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48  t( eFileLock==SH
101c0 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20  ARED_LOCK );.   
101d0 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 2d 3e   assert( pFile->
101e0 65 46 69 6c 65 4c 6f 63 6b 3d 3d 30 20 29 3b 0a  eFileLock==0 );.
101f0 20 20 20 20 61 73 73 65 72 74 28 20 70 49 6e 6f      assert( pIno
10200 64 65 2d 3e 6e 53 68 61 72 65 64 3e 30 20 29 3b  de->nShared>0 );
10210 0a 20 20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c  .    pFile->eFil
10220 65 4c 6f 63 6b 20 3d 20 53 48 41 52 45 44 5f 4c  eLock = SHARED_L
10230 4f 43 4b 3b 0a 20 20 20 20 70 49 6e 6f 64 65 2d  OCK;.    pInode-
10240 3e 6e 53 68 61 72 65 64 2b 2b 3b 0a 20 20 20 20  >nShared++;.    
10250 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 2b 2b 3b  pInode->nLock++;
10260 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 6c 6f  .    goto end_lo
10270 63 6b 3b 0a 20 20 7d 0a 0a 0a 20 20 2f 2a 20 41  ck;.  }...  /* A
10280 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 20 69 73   PENDING lock is
10290 20 6e 65 65 64 65 64 20 62 65 66 6f 72 65 20 61   needed before a
102a0 63 71 75 69 72 69 6e 67 20 61 20 53 48 41 52 45  cquiring a SHARE
102b0 44 20 6c 6f 63 6b 20 61 6e 64 20 62 65 66 6f 72  D lock and befor
102c0 65 0a 20 20 2a 2a 20 61 63 71 75 69 72 69 6e 67  e.  ** acquiring
102d0 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f   an EXCLUSIVE lo
102e0 63 6b 2e 20 20 46 6f 72 20 74 68 65 20 53 48 41  ck.  For the SHA
102f0 52 45 44 20 6c 6f 63 6b 2c 20 74 68 65 20 50 45  RED lock, the PE
10300 4e 44 49 4e 47 20 77 69 6c 6c 0a 20 20 2a 2a 20  NDING will.  ** 
10310 62 65 20 72 65 6c 65 61 73 65 64 2e 0a 20 20 2a  be released..  *
10320 2f 0a 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d  /.  lock.l_len =
10330 20 31 4c 3b 0a 20 20 6c 6f 63 6b 2e 6c 5f 77 68   1L;.  lock.l_wh
10340 65 6e 63 65 20 3d 20 53 45 45 4b 5f 53 45 54 3b  ence = SEEK_SET;
10350 0a 20 20 69 66 28 20 65 46 69 6c 65 4c 6f 63 6b  .  if( eFileLock
10360 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 0a 20  ==SHARED_LOCK . 
10370 20 20 20 20 20 7c 7c 20 28 65 46 69 6c 65 4c 6f       || (eFileLo
10380 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f  ck==EXCLUSIVE_LO
10390 43 4b 20 26 26 20 70 46 69 6c 65 2d 3e 65 46 69  CK && pFile->eFi
103a0 6c 65 4c 6f 63 6b 3c 50 45 4e 44 49 4e 47 5f 4c  leLock<PENDING_L
103b0 4f 43 4b 29 0a 20 20 29 7b 0a 20 20 20 20 6c 6f  OCK).  ){.    lo
103c0 63 6b 2e 6c 5f 74 79 70 65 20 3d 20 28 65 46 69  ck.l_type = (eFi
103d0 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c  leLock==SHARED_L
103e0 4f 43 4b 3f 46 5f 52 44 4c 43 4b 3a 46 5f 57 52  OCK?F_RDLCK:F_WR
103f0 4c 43 4b 29 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c  LCK);.    lock.l
10400 5f 73 74 61 72 74 20 3d 20 50 45 4e 44 49 4e 47  _start = PENDING
10410 5f 42 59 54 45 3b 0a 20 20 20 20 69 66 28 20 75  _BYTE;.    if( u
10420 6e 69 78 46 69 6c 65 4c 6f 63 6b 28 70 46 69 6c  nixFileLock(pFil
10430 65 2c 20 26 6c 6f 63 6b 2c 20 30 29 20 29 7b 0a  e, &lock, 0) ){.
10440 20 20 20 20 20 20 74 45 72 72 6e 6f 20 3d 20 65        tErrno = e
10450 72 72 6e 6f 3b 0a 20 20 20 20 20 20 72 63 20 3d  rrno;.      rc =
10460 20 73 71 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d   sqliteErrorFrom
10470 50 6f 73 69 78 45 72 72 6f 72 28 74 45 72 72 6e  PosixError(tErrn
10480 6f 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  o, SQLITE_IOERR_
10490 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 69 66 28  LOCK);.      if(
104a0 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 72   IS_LOCK_ERROR(r
104b0 63 29 20 29 7b 0a 20 20 20 20 20 20 20 20 73 74  c) ){.        st
104c0 6f 72 65 4c 61 73 74 45 72 72 6e 6f 28 70 46 69  oreLastErrno(pFi
104d0 6c 65 2c 20 74 45 72 72 6e 6f 29 3b 0a 20 20 20  le, tErrno);.   
104e0 20 20 20 7d 0a 20 20 20 20 20 20 67 6f 74 6f 20     }.      goto 
104f0 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 20 20 7d 0a  end_lock;.    }.
10500 20 20 7d 0a 0a 0a 20 20 2f 2a 20 49 66 20 63 6f    }...  /* If co
10510 6e 74 72 6f 6c 20 67 65 74 73 20 74 6f 20 74 68  ntrol gets to th
10520 69 73 20 70 6f 69 6e 74 2c 20 74 68 65 6e 20 61  is point, then a
10530 63 74 75 61 6c 6c 79 20 67 6f 20 61 68 65 61 64  ctually go ahead
10540 20 61 6e 64 20 6d 61 6b 65 0a 20 20 2a 2a 20 6f   and make.  ** o
10550 70 65 72 61 74 69 6e 67 20 73 79 73 74 65 6d 20  perating system 
10560 63 61 6c 6c 73 20 66 6f 72 20 74 68 65 20 73 70  calls for the sp
10570 65 63 69 66 69 65 64 20 6c 6f 63 6b 2e 0a 20 20  ecified lock..  
10580 2a 2f 0a 20 20 69 66 28 20 65 46 69 6c 65 4c 6f  */.  if( eFileLo
10590 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20  ck==SHARED_LOCK 
105a0 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
105b0 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64 3d 3d  Inode->nShared==
105c0 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  0 );.    assert(
105d0 20 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f   pInode->eFileLo
105e0 63 6b 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73  ck==0 );.    ass
105f0 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f  ert( rc==SQLITE_
10600 4f 4b 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 4e 6f  OK );..    /* No
10610 77 20 67 65 74 20 74 68 65 20 72 65 61 64 2d 6c  w get the read-l
10620 6f 63 6b 20 2a 2f 0a 20 20 20 20 6c 6f 63 6b 2e  ock */.    lock.
10630 6c 5f 73 74 61 72 74 20 3d 20 53 48 41 52 45 44  l_start = SHARED
10640 5f 46 49 52 53 54 3b 0a 20 20 20 20 6c 6f 63 6b  _FIRST;.    lock
10650 2e 6c 5f 6c 65 6e 20 3d 20 53 48 41 52 45 44 5f  .l_len = SHARED_
10660 53 49 5a 45 3b 0a 20 20 20 20 69 66 28 20 75 6e  SIZE;.    if( un
10670 69 78 46 69 6c 65 4c 6f 63 6b 28 70 46 69 6c 65  ixFileLock(pFile
10680 2c 20 26 6c 6f 63 6b 2c 20 30 29 20 29 7b 0a 20  , &lock, 0) ){. 
10690 20 20 20 20 20 74 45 72 72 6e 6f 20 3d 20 65 72       tErrno = er
106a0 72 6e 6f 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  rno;.      rc = 
106b0 73 71 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d 50  sqliteErrorFromP
106c0 6f 73 69 78 45 72 72 6f 72 28 74 45 72 72 6e 6f  osixError(tErrno
106d0 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4c  , SQLITE_IOERR_L
106e0 4f 43 4b 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  OCK);.    }..   
106f0 20 2f 2a 20 44 72 6f 70 20 74 68 65 20 74 65 6d   /* Drop the tem
10700 70 6f 72 61 72 79 20 50 45 4e 44 49 4e 47 20 6c  porary PENDING l
10710 6f 63 6b 20 2a 2f 0a 20 20 20 20 6c 6f 63 6b 2e  ock */.    lock.
10720 6c 5f 73 74 61 72 74 20 3d 20 50 45 4e 44 49 4e  l_start = PENDIN
10730 47 5f 42 59 54 45 3b 0a 20 20 20 20 6c 6f 63 6b  G_BYTE;.    lock
10740 2e 6c 5f 6c 65 6e 20 3d 20 31 4c 3b 0a 20 20 20  .l_len = 1L;.   
10750 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d 20 46   lock.l_type = F
10760 5f 55 4e 4c 43 4b 3b 0a 20 20 20 20 69 66 28 20  _UNLCK;.    if( 
10770 75 6e 69 78 46 69 6c 65 4c 6f 63 6b 28 70 46 69  unixFileLock(pFi
10780 6c 65 2c 20 26 6c 6f 63 6b 2c 20 31 30 29 20 26  le, &lock, 10) &
10790 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  & rc==SQLITE_OK 
107a0 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 69 73  ){.      /* This
107b0 20 63 6f 75 6c 64 20 68 61 70 70 65 6e 20 77 69   could happen wi
107c0 74 68 20 61 20 6e 65 74 77 6f 72 6b 20 6d 6f 75  th a network mou
107d0 6e 74 20 2a 2f 0a 20 20 20 20 20 20 74 45 72 72  nt */.      tErr
107e0 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 23 69 66 20  no = errno;.#if 
107f0 4f 53 4c 4f 43 4b 49 4e 47 5f 43 48 45 43 4b 5f  OSLOCKING_CHECK_
10800 42 55 53 59 5f 49 4f 45 52 52 0a 20 20 20 20 20  BUSY_IOERR.     
10810 20 72 63 20 3d 20 73 71 6c 69 74 65 45 72 72 6f   rc = sqliteErro
10820 72 46 72 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28  rFromPosixError(
10830 74 45 72 72 6e 6f 2c 20 53 51 4c 49 54 45 5f 49  tErrno, SQLITE_I
10840 4f 45 52 52 5f 55 4e 4c 4f 43 4b 29 3b 20 0a 23  OERR_UNLOCK); .#
10850 65 6c 73 65 0a 20 20 20 20 20 20 72 63 20 3d 20  else.      rc = 
10860 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c  SQLITE_IOERR_UNL
10870 4f 43 4b 3b 20 0a 23 65 6e 64 69 66 0a 20 20 20  OCK; .#endif.   
10880 20 7d 0a 0a 20 20 20 20 69 66 28 20 72 63 20 29   }..    if( rc )
10890 7b 0a 20 20 20 20 20 20 69 66 28 20 49 53 5f 4c  {.      if( IS_L
108a0 4f 43 4b 5f 45 52 52 4f 52 28 72 63 29 20 29 7b  OCK_ERROR(rc) ){
108b0 0a 20 20 20 20 20 20 20 20 73 74 6f 72 65 4c 61  .        storeLa
108c0 73 74 45 72 72 6e 6f 28 70 46 69 6c 65 2c 20 74  stErrno(pFile, t
108d0 45 72 72 6e 6f 29 3b 0a 20 20 20 20 20 20 7d 0a  Errno);.      }.
108e0 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 6c        goto end_l
108f0 6f 63 6b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  ock;.    }else{.
10900 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 65 46 69        pFile->eFi
10910 6c 65 4c 6f 63 6b 20 3d 20 53 48 41 52 45 44 5f  leLock = SHARED_
10920 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 70 49 6e 6f  LOCK;.      pIno
10930 64 65 2d 3e 6e 4c 6f 63 6b 2b 2b 3b 0a 20 20 20  de->nLock++;.   
10940 20 20 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72     pInode->nShar
10950 65 64 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20  ed = 1;.    }.  
10960 7d 65 6c 73 65 20 69 66 28 20 65 46 69 6c 65 4c  }else if( eFileL
10970 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c  ock==EXCLUSIVE_L
10980 4f 43 4b 20 26 26 20 70 49 6e 6f 64 65 2d 3e 6e  OCK && pInode->n
10990 53 68 61 72 65 64 3e 31 20 29 7b 0a 20 20 20 20  Shared>1 ){.    
109a0 2f 2a 20 57 65 20 61 72 65 20 74 72 79 69 6e 67  /* We are trying
109b0 20 66 6f 72 20 61 6e 20 65 78 63 6c 75 73 69 76   for an exclusiv
109c0 65 20 6c 6f 63 6b 20 62 75 74 20 61 6e 6f 74 68  e lock but anoth
109d0 65 72 20 74 68 72 65 61 64 20 69 6e 20 74 68 69  er thread in thi
109e0 73 0a 20 20 20 20 2a 2a 20 73 61 6d 65 20 70 72  s.    ** same pr
109f0 6f 63 65 73 73 20 69 73 20 73 74 69 6c 6c 20 68  ocess is still h
10a00 6f 6c 64 69 6e 67 20 61 20 73 68 61 72 65 64 20  olding a shared 
10a10 6c 6f 63 6b 2e 20 2a 2f 0a 20 20 20 20 72 63 20  lock. */.    rc 
10a20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20  = SQLITE_BUSY;. 
10a30 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54   }else{.    /* T
10a40 68 65 20 72 65 71 75 65 73 74 20 77 61 73 20 66  he request was f
10a50 6f 72 20 61 20 52 45 53 45 52 56 45 44 20 6f 72  or a RESERVED or
10a60 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e   EXCLUSIVE lock.
10a70 20 20 49 74 20 69 73 0a 20 20 20 20 2a 2a 20 61    It is.    ** a
10a80 73 73 75 6d 65 64 20 74 68 61 74 20 74 68 65 72  ssumed that ther
10a90 65 20 69 73 20 61 20 53 48 41 52 45 44 20 6f 72  e is a SHARED or
10aa0 20 67 72 65 61 74 65 72 20 6c 6f 63 6b 20 6f 6e   greater lock on
10ab0 20 74 68 65 20 66 69 6c 65 0a 20 20 20 20 2a 2a   the file.    **
10ac0 20 61 6c 72 65 61 64 79 2e 0a 20 20 20 20 2a 2f   already..    */
10ad0 0a 20 20 20 20 61 73 73 65 72 74 28 20 30 21 3d  .    assert( 0!=
10ae0 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  pFile->eFileLock
10af0 20 29 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74   );.    lock.l_t
10b00 79 70 65 20 3d 20 46 5f 57 52 4c 43 4b 3b 0a 0a  ype = F_WRLCK;..
10b10 20 20 20 20 61 73 73 65 72 74 28 20 65 46 69 6c      assert( eFil
10b20 65 4c 6f 63 6b 3d 3d 52 45 53 45 52 56 45 44 5f  eLock==RESERVED_
10b30 4c 4f 43 4b 20 7c 7c 20 65 46 69 6c 65 4c 6f 63  LOCK || eFileLoc
10b40 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43  k==EXCLUSIVE_LOC
10b50 4b 20 29 3b 0a 20 20 20 20 69 66 28 20 65 46 69  K );.    if( eFi
10b60 6c 65 4c 6f 63 6b 3d 3d 52 45 53 45 52 56 45 44  leLock==RESERVED
10b70 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 20 20 6c  _LOCK ){.      l
10b80 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 52 45  ock.l_start = RE
10b90 53 45 52 56 45 44 5f 42 59 54 45 3b 0a 20 20 20  SERVED_BYTE;.   
10ba0 20 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20     lock.l_len = 
10bb0 31 4c 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  1L;.    }else{. 
10bc0 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72       lock.l_star
10bd0 74 20 3d 20 53 48 41 52 45 44 5f 46 49 52 53 54  t = SHARED_FIRST
10be0 3b 0a 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 6c  ;.      lock.l_l
10bf0 65 6e 20 3d 20 53 48 41 52 45 44 5f 53 49 5a 45  en = SHARED_SIZE
10c00 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28  ;.    }..    if(
10c10 20 75 6e 69 78 46 69 6c 65 4c 6f 63 6b 28 70 46   unixFileLock(pF
10c20 69 6c 65 2c 20 26 6c 6f 63 6b 2c 20 30 29 20 29  ile, &lock, 0) )
10c30 7b 0a 20 20 20 20 20 20 74 45 72 72 6e 6f 20 3d  {.      tErrno =
10c40 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20 72 63   errno;.      rc
10c50 20 3d 20 73 71 6c 69 74 65 45 72 72 6f 72 46 72   = sqliteErrorFr
10c60 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28 74 45 72  omPosixError(tEr
10c70 72 6e 6f 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52  rno, SQLITE_IOER
10c80 52 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 69  R_LOCK);.      i
10c90 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 42 55  f( rc!=SQLITE_BU
10ca0 53 59 20 29 7b 0a 20 20 20 20 20 20 20 20 73 74  SY ){.        st
10cb0 6f 72 65 4c 61 73 74 45 72 72 6e 6f 28 70 46 69  oreLastErrno(pFi
10cc0 6c 65 2c 20 74 45 72 72 6e 6f 29 3b 0a 20 20 20  le, tErrno);.   
10cd0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20     }.    }.  }. 
10ce0 20 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45   ..#ifdef SQLITE
10cf0 5f 44 45 42 55 47 0a 20 20 2f 2a 20 53 65 74 20  _DEBUG.  /* Set 
10d00 75 70 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  up the transacti
10d10 6f 6e 2d 63 6f 75 6e 74 65 72 20 63 68 61 6e 67  on-counter chang
10d20 65 20 63 68 65 63 6b 69 6e 67 20 66 6c 61 67 73  e checking flags
10d30 20 77 68 65 6e 0a 20 20 2a 2a 20 74 72 61 6e 73   when.  ** trans
10d40 69 74 69 6f 6e 69 6e 67 20 66 72 6f 6d 20 61 20  itioning from a 
10d50 53 48 41 52 45 44 20 74 6f 20 61 20 52 45 53 45  SHARED to a RESE
10d60 52 56 45 44 20 6c 6f 63 6b 2e 20 20 54 68 65 20  RVED lock.  The 
10d70 63 68 61 6e 67 65 0a 20 20 2a 2a 20 66 72 6f 6d  change.  ** from
10d80 20 53 48 41 52 45 44 20 74 6f 20 52 45 53 45 52   SHARED to RESER
10d90 56 45 44 20 6d 61 72 6b 73 20 74 68 65 20 62 65  VED marks the be
10da0 67 69 6e 6e 69 6e 67 20 6f 66 20 61 20 6e 6f 72  ginning of a nor
10db0 6d 61 6c 0a 20 20 2a 2a 20 77 72 69 74 65 20 6f  mal.  ** write o
10dc0 70 65 72 61 74 69 6f 6e 20 28 6e 6f 74 20 61 20  peration (not a 
10dd0 68 6f 74 20 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c  hot journal roll
10de0 62 61 63 6b 29 2e 0a 20 20 2a 2f 0a 20 20 69 66  back)..  */.  if
10df0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 0a  ( rc==SQLITE_OK.
10e00 20 20 20 26 26 20 70 46 69 6c 65 2d 3e 65 46 69     && pFile->eFi
10e10 6c 65 4c 6f 63 6b 3c 3d 53 48 41 52 45 44 5f 4c  leLock<=SHARED_L
10e20 4f 43 4b 0a 20 20 20 26 26 20 65 46 69 6c 65 4c  OCK.   && eFileL
10e30 6f 63 6b 3d 3d 52 45 53 45 52 56 45 44 5f 4c 4f  ock==RESERVED_LO
10e40 43 4b 0a 20 20 29 7b 0a 20 20 20 20 70 46 69 6c  CK.  ){.    pFil
10e50 65 2d 3e 74 72 61 6e 73 43 6e 74 72 43 68 6e 67  e->transCntrChng
10e60 20 3d 20 30 3b 0a 20 20 20 20 70 46 69 6c 65 2d   = 0;.    pFile-
10e70 3e 64 62 55 70 64 61 74 65 20 3d 20 30 3b 0a 20  >dbUpdate = 0;. 
10e80 20 20 20 70 46 69 6c 65 2d 3e 69 6e 4e 6f 72 6d     pFile->inNorm
10e90 61 6c 57 72 69 74 65 20 3d 20 31 3b 0a 20 20 7d  alWrite = 1;.  }
10ea0 0a 23 65 6e 64 69 66 0a 0a 0a 20 20 69 66 28 20  .#endif...  if( 
10eb0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
10ec0 0a 20 20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c  .    pFile->eFil
10ed0 65 4c 6f 63 6b 20 3d 20 65 46 69 6c 65 4c 6f 63  eLock = eFileLoc
10ee0 6b 3b 0a 20 20 20 20 70 49 6e 6f 64 65 2d 3e 65  k;.    pInode->e
10ef0 46 69 6c 65 4c 6f 63 6b 20 3d 20 65 46 69 6c 65  FileLock = eFile
10f00 4c 6f 63 6b 3b 0a 20 20 7d 65 6c 73 65 20 69 66  Lock;.  }else if
10f10 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 45 58 43  ( eFileLock==EXC
10f20 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 29 7b 0a 20  LUSIVE_LOCK ){. 
10f30 20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c     pFile->eFileL
10f40 6f 63 6b 20 3d 20 50 45 4e 44 49 4e 47 5f 4c 4f  ock = PENDING_LO
10f50 43 4b 3b 0a 20 20 20 20 70 49 6e 6f 64 65 2d 3e  CK;.    pInode->
10f60 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 50 45 4e 44  eFileLock = PEND
10f70 49 4e 47 5f 4c 4f 43 4b 3b 0a 20 20 7d 0a 0a 65  ING_LOCK;.  }..e
10f80 6e 64 5f 6c 6f 63 6b 3a 0a 20 20 75 6e 69 78 4c  nd_lock:.  unixL
10f90 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 20 20 4f  eaveMutex();.  O
10fa0 53 54 52 41 43 45 28 28 22 4c 4f 43 4b 20 20 20  STRACE(("LOCK   
10fb0 20 25 64 20 25 73 20 25 73 20 28 75 6e 69 78 29   %d %s %s (unix)
10fc0 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 61  \n", pFile->h, a
10fd0 7a 46 69 6c 65 4c 6f 63 6b 28 65 46 69 6c 65 4c  zFileLock(eFileL
10fe0 6f 63 6b 29 2c 20 0a 20 20 20 20 20 20 72 63 3d  ock), .      rc=
10ff0 3d 53 51 4c 49 54 45 5f 4f 4b 20 3f 20 22 6f 6b  =SQLITE_OK ? "ok
11000 22 20 3a 20 22 66 61 69 6c 65 64 22 29 29 3b 0a  " : "failed"));.
11010 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
11020 2f 2a 0a 2a 2a 20 41 64 64 20 74 68 65 20 66 69  /*.** Add the fi
11030 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 75 73  le descriptor us
11040 65 64 20 62 79 20 66 69 6c 65 20 68 61 6e 64 6c  ed by file handl
11050 65 20 70 46 69 6c 65 20 74 6f 20 74 68 65 20 63  e pFile to the c
11060 6f 72 72 65 73 70 6f 6e 64 69 6e 67 0a 2a 2a 20  orresponding.** 
11070 70 55 6e 75 73 65 64 20 6c 69 73 74 2e 0a 2a 2f  pUnused list..*/
11080 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 65 74  .static void set
11090 50 65 6e 64 69 6e 67 46 64 28 75 6e 69 78 46 69  PendingFd(unixFi
110a0 6c 65 20 2a 70 46 69 6c 65 29 7b 0a 20 20 75 6e  le *pFile){.  un
110b0 69 78 49 6e 6f 64 65 49 6e 66 6f 20 2a 70 49 6e  ixInodeInfo *pIn
110c0 6f 64 65 20 3d 20 70 46 69 6c 65 2d 3e 70 49 6e  ode = pFile->pIn
110d0 6f 64 65 3b 0a 20 20 55 6e 69 78 55 6e 75 73 65  ode;.  UnixUnuse
110e0 64 46 64 20 2a 70 20 3d 20 70 46 69 6c 65 2d 3e  dFd *p = pFile->
110f0 70 55 6e 75 73 65 64 3b 0a 20 20 70 2d 3e 70 4e  pUnused;.  p->pN
11100 65 78 74 20 3d 20 70 49 6e 6f 64 65 2d 3e 70 55  ext = pInode->pU
11110 6e 75 73 65 64 3b 0a 20 20 70 49 6e 6f 64 65 2d  nused;.  pInode-
11120 3e 70 55 6e 75 73 65 64 20 3d 20 70 3b 0a 20 20  >pUnused = p;.  
11130 70 46 69 6c 65 2d 3e 68 20 3d 20 2d 31 3b 0a 20  pFile->h = -1;. 
11140 20 70 46 69 6c 65 2d 3e 70 55 6e 75 73 65 64 20   pFile->pUnused 
11150 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f  = 0;.}../*.** Lo
11160 77 65 72 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20  wer the locking 
11170 6c 65 76 65 6c 20 6f 6e 20 66 69 6c 65 20 64 65  level on file de
11180 73 63 72 69 70 74 6f 72 20 70 46 69 6c 65 20 74  scriptor pFile t
11190 6f 20 65 46 69 6c 65 4c 6f 63 6b 2e 20 20 65 46  o eFileLock.  eF
111a0 69 6c 65 4c 6f 63 6b 0a 2a 2a 20 6d 75 73 74 20  ileLock.** must 
111b0 62 65 20 65 69 74 68 65 72 20 4e 4f 5f 4c 4f 43  be either NO_LOC
111c0 4b 20 6f 72 20 53 48 41 52 45 44 5f 4c 4f 43 4b  K or SHARED_LOCK
111d0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6c  ..**.** If the l
111e0 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 66 20  ocking level of 
111f0 74 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70  the file descrip
11200 74 6f 72 20 69 73 20 61 6c 72 65 61 64 79 20 61  tor is already a
11210 74 20 6f 72 20 62 65 6c 6f 77 0a 2a 2a 20 74 68  t or below.** th
11220 65 20 72 65 71 75 65 73 74 65 64 20 6c 6f 63 6b  e requested lock
11230 69 6e 67 20 6c 65 76 65 6c 2c 20 74 68 69 73 20  ing level, this 
11240 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d  routine is a no-
11250 6f 70 2e 0a 2a 2a 20 0a 2a 2a 20 49 66 20 68 61  op..** .** If ha
11260 6e 64 6c 65 4e 46 53 55 6e 6c 6f 63 6b 20 69 73  ndleNFSUnlock is
11270 20 74 72 75 65 2c 20 74 68 65 6e 20 6f 6e 20 64   true, then on d
11280 6f 77 6e 67 72 61 64 69 6e 67 20 61 6e 20 45 58  owngrading an EX
11290 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 74 6f 20  CLUSIVE_LOCK to 
112a0 53 48 41 52 45 44 0a 2a 2a 20 74 68 65 20 62 79  SHARED.** the by
112b0 74 65 20 72 61 6e 67 65 20 69 73 20 64 69 76 69  te range is divi
112c0 64 65 64 20 69 6e 74 6f 20 32 20 70 61 72 74 73  ded into 2 parts
112d0 20 61 6e 64 20 74 68 65 20 66 69 72 73 74 20 70   and the first p
112e0 61 72 74 20 69 73 20 75 6e 6c 6f 63 6b 65 64 20  art is unlocked 
112f0 74 68 65 6e 0a 2a 2a 20 73 65 74 20 74 6f 20 61  then.** set to a
11300 20 72 65 61 64 20 6c 6f 63 6b 2c 20 74 68 65 6e   read lock, then
11310 20 74 68 65 20 6f 74 68 65 72 20 70 61 72 74 20   the other part 
11320 69 73 20 73 69 6d 70 6c 79 20 75 6e 6c 6f 63 6b  is simply unlock
11330 65 64 2e 20 20 54 68 69 73 20 77 6f 72 6b 73 20  ed.  This works 
11340 0a 2a 2a 20 61 72 6f 75 6e 64 20 61 20 62 75 67  .** around a bug
11350 20 69 6e 20 42 53 44 20 4e 46 53 20 6c 6f 63 6b   in BSD NFS lock
11360 64 20 28 61 6c 73 6f 20 73 65 65 6e 20 6f 6e 20  d (also seen on 
11370 4d 61 63 4f 53 58 20 31 30 2e 33 2b 29 20 74 68  MacOSX 10.3+) th
11380 61 74 20 66 61 69 6c 73 20 74 6f 20 0a 2a 2a 20  at fails to .** 
11390 72 65 6d 6f 76 65 20 74 68 65 20 77 72 69 74 65  remove the write
113a0 20 6c 6f 63 6b 20 6f 6e 20 61 20 72 65 67 69 6f   lock on a regio
113b0 6e 20 77 68 65 6e 20 61 20 72 65 61 64 20 6c 6f  n when a read lo
113c0 63 6b 20 69 73 20 73 65 74 2e 0a 2a 2f 0a 73 74  ck is set..*/.st
113d0 61 74 69 63 20 69 6e 74 20 70 6f 73 69 78 55 6e  atic int posixUn
113e0 6c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c  lock(sqlite3_fil
113f0 65 20 2a 69 64 2c 20 69 6e 74 20 65 46 69 6c 65  e *id, int eFile
11400 4c 6f 63 6b 2c 20 69 6e 74 20 68 61 6e 64 6c 65  Lock, int handle
11410 4e 46 53 55 6e 6c 6f 63 6b 29 7b 0a 20 20 75 6e  NFSUnlock){.  un
11420 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20  ixFile *pFile = 
11430 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20  (unixFile*)id;. 
11440 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 2a   unixInodeInfo *
11450 70 49 6e 6f 64 65 3b 0a 20 20 73 74 72 75 63 74  pInode;.  struct
11460 20 66 6c 6f 63 6b 20 6c 6f 63 6b 3b 0a 20 20 69   flock lock;.  i
11470 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
11480 4b 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 46  K;..  assert( pF
11490 69 6c 65 20 29 3b 0a 20 20 4f 53 54 52 41 43 45  ile );.  OSTRACE
114a0 28 28 22 55 4e 4c 4f 43 4b 20 20 25 64 20 25 64  (("UNLOCK  %d %d
114b0 20 77 61 73 20 25 64 28 25 64 2c 25 64 29 20 70   was %d(%d,%d) p
114c0 69 64 3d 25 64 20 28 75 6e 69 78 29 5c 6e 22 2c  id=%d (unix)\n",
114d0 20 70 46 69 6c 65 2d 3e 68 2c 20 65 46 69 6c 65   pFile->h, eFile
114e0 4c 6f 63 6b 2c 0a 20 20 20 20 20 20 70 46 69 6c  Lock,.      pFil
114f0 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 2c 20 70 46  e->eFileLock, pF
11500 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e 65 46 69  ile->pInode->eFi
11510 6c 65 4c 6f 63 6b 2c 20 70 46 69 6c 65 2d 3e 70  leLock, pFile->p
11520 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64 2c 0a  Inode->nShared,.
11530 20 20 20 20 20 20 6f 73 47 65 74 70 69 64 28 30        osGetpid(0
11540 29 29 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  )));..  assert( 
11550 65 46 69 6c 65 4c 6f 63 6b 3c 3d 53 48 41 52 45  eFileLock<=SHARE
11560 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 69 66 28 20  D_LOCK );.  if( 
11570 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  pFile->eFileLock
11580 3c 3d 65 46 69 6c 65 4c 6f 63 6b 20 29 7b 0a 20  <=eFileLock ){. 
11590 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
115a0 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 75 6e 69 78 45  _OK;.  }.  unixE
115b0 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 20 20 70  nterMutex();.  p
115c0 49 6e 6f 64 65 20 3d 20 70 46 69 6c 65 2d 3e 70  Inode = pFile->p
115d0 49 6e 6f 64 65 3b 0a 20 20 61 73 73 65 72 74 28  Inode;.  assert(
115e0 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64   pInode->nShared
115f0 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 46 69  !=0 );.  if( pFi
11600 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3e 53 48  le->eFileLock>SH
11610 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20  ARED_LOCK ){.   
11620 20 61 73 73 65 72 74 28 20 70 49 6e 6f 64 65 2d   assert( pInode-
11630 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d 70 46 69 6c  >eFileLock==pFil
11640 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 29 3b 0a  e->eFileLock );.
11650 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
11660 45 42 55 47 0a 20 20 20 20 2f 2a 20 57 68 65 6e  EBUG.    /* When
11670 20 72 65 64 75 63 69 6e 67 20 61 20 6c 6f 63 6b   reducing a lock
11680 20 73 75 63 68 20 74 68 61 74 20 6f 74 68 65 72   such that other
11690 20 70 72 6f 63 65 73 73 65 73 20 63 61 6e 20 73   processes can s
116a0 74 61 72 74 0a 20 20 20 20 2a 2a 20 72 65 61 64  tart.    ** read
116b0 69 6e 67 20 74 68 65 20 64 61 74 61 62 61 73 65  ing the database
116c0 20 66 69 6c 65 20 61 67 61 69 6e 2c 20 6d 61 6b   file again, mak
116d0 65 20 73 75 72 65 20 74 68 61 74 20 74 68 65 0a  e sure that the.
116e0 20 20 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69      ** transacti
116f0 6f 6e 20 63 6f 75 6e 74 65 72 20 77 61 73 20 75  on counter was u
11700 70 64 61 74 65 64 20 69 66 20 61 6e 79 20 70 61  pdated if any pa
11710 72 74 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  rt of the databa
11720 73 65 0a 20 20 20 20 2a 2a 20 66 69 6c 65 20 63  se.    ** file c
11730 68 61 6e 67 65 64 2e 20 20 49 66 20 74 68 65 20  hanged.  If the 
11740 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f 75 6e  transaction coun
11750 74 65 72 20 69 73 20 6e 6f 74 20 75 70 64 61 74  ter is not updat
11760 65 64 2c 0a 20 20 20 20 2a 2a 20 6f 74 68 65 72  ed,.    ** other
11770 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 74 6f 20   connections to 
11780 74 68 65 20 73 61 6d 65 20 66 69 6c 65 20 6d 69  the same file mi
11790 67 68 74 20 6e 6f 74 20 72 65 61 6c 69 7a 65 20  ght not realize 
117a0 74 68 61 74 0a 20 20 20 20 2a 2a 20 74 68 65 20  that.    ** the 
117b0 66 69 6c 65 20 68 61 73 20 63 68 61 6e 67 65 64  file has changed
117c0 20 61 6e 64 20 68 65 6e 63 65 20 6d 69 67 68 74   and hence might
117d0 20 6e 6f 74 20 6b 6e 6f 77 20 74 6f 20 66 6c 75   not know to flu
117e0 73 68 20 74 68 65 69 72 0a 20 20 20 20 2a 2a 20  sh their.    ** 
117f0 63 61 63 68 65 2e 20 20 54 68 65 20 75 73 65 20  cache.  The use 
11800 6f 66 20 61 20 73 74 61 6c 65 20 63 61 63 68 65  of a stale cache
11810 20 63 61 6e 20 6c 65 61 64 20 74 6f 20 64 61 74   can lead to dat
11820 61 62 61 73 65 20 63 6f 72 72 75 70 74 69 6f 6e  abase corruption
11830 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 46 69  ..    */.    pFi
11840 6c 65 2d 3e 69 6e 4e 6f 72 6d 61 6c 57 72 69 74  le->inNormalWrit
11850 65 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 0a 20  e = 0;.#endif.. 
11860 20 20 20 2f 2a 20 64 6f 77 6e 67 72 61 64 69 6e     /* downgradin
11870 67 20 74 6f 20 61 20 73 68 61 72 65 64 20 6c 6f  g to a shared lo
11880 63 6b 20 6f 6e 20 4e 46 53 20 69 6e 76 6f 6c 76  ck on NFS involv
11890 65 73 20 63 6c 65 61 72 69 6e 67 20 74 68 65 20  es clearing the 
118a0 77 72 69 74 65 20 6c 6f 63 6b 0a 20 20 20 20 2a  write lock.    *
118b0 2a 20 62 65 66 6f 72 65 20 65 73 74 61 62 6c 69  * before establi
118c0 73 68 69 6e 67 20 74 68 65 20 72 65 61 64 6c 6f  shing the readlo
118d0 63 6b 20 2d 20 74 6f 20 61 76 6f 69 64 20 61 20  ck - to avoid a 
118e0 72 61 63 65 20 63 6f 6e 64 69 74 69 6f 6e 20 77  race condition w
118f0 65 20 64 6f 77 6e 67 72 61 64 65 0a 20 20 20 20  e downgrade.    
11900 2a 2a 20 74 68 65 20 6c 6f 63 6b 20 69 6e 20 32  ** the lock in 2
11910 20 62 6c 6f 63 6b 73 2c 20 73 6f 20 74 68 61 74   blocks, so that
11920 20 70 61 72 74 20 6f 66 20 74 68 65 20 72 61 6e   part of the ran
11930 67 65 20 77 69 6c 6c 20 62 65 20 63 6f 76 65 72  ge will be cover
11940 65 64 20 62 79 20 61 20 0a 20 20 20 20 2a 2a 20  ed by a .    ** 
11950 77 72 69 74 65 20 6c 6f 63 6b 20 75 6e 74 69 6c  write lock until
11960 20 74 68 65 20 72 65 73 74 20 69 73 20 63 6f 76   the rest is cov
11970 65 72 65 64 20 62 79 20 61 20 72 65 61 64 20 6c  ered by a read l
11980 6f 63 6b 3a 0a 20 20 20 20 2a 2a 20 20 31 3a 20  ock:.    **  1: 
11990 20 20 5b 57 57 57 57 57 5d 0a 20 20 20 20 2a 2a    [WWWWW].    **
119a0 20 20 32 3a 20 20 20 5b 2e 2e 2e 2e 57 5d 0a 20    2:   [....W]. 
119b0 20 20 20 2a 2a 20 20 33 3a 20 20 20 5b 52 52 52     **  3:   [RRR
119c0 52 57 5d 0a 20 20 20 20 2a 2a 20 20 34 3a 20 20  RW].    **  4:  
119d0 20 5b 52 52 52 52 2e 5d 0a 20 20 20 20 2a 2f 0a   [RRRR.].    */.
119e0 20 20 20 20 69 66 28 20 65 46 69 6c 65 4c 6f 63      if( eFileLoc
119f0 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29  k==SHARED_LOCK )
11a00 7b 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 5f  {.#if !defined(_
11a10 5f 41 50 50 4c 45 5f 5f 29 20 7c 7c 20 21 53 51  _APPLE__) || !SQ
11a20 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b  LITE_ENABLE_LOCK
11a30 49 4e 47 5f 53 54 59 4c 45 0a 20 20 20 20 20 20  ING_STYLE.      
11a40 28 76 6f 69 64 29 68 61 6e 64 6c 65 4e 46 53 55  (void)handleNFSU
11a50 6e 6c 6f 63 6b 3b 0a 20 20 20 20 20 20 61 73 73  nlock;.      ass
11a60 65 72 74 28 20 68 61 6e 64 6c 65 4e 46 53 55 6e  ert( handleNFSUn
11a70 6c 6f 63 6b 3d 3d 30 20 29 3b 0a 23 65 6e 64 69  lock==0 );.#endi
11a80 66 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f 5f  f.#if defined(__
11a90 41 50 50 4c 45 5f 5f 29 20 26 26 20 53 51 4c 49  APPLE__) && SQLI
11aa0 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e  TE_ENABLE_LOCKIN
11ab0 47 5f 53 54 59 4c 45 0a 20 20 20 20 20 20 69 66  G_STYLE.      if
11ac0 28 20 68 61 6e 64 6c 65 4e 46 53 55 6e 6c 6f 63  ( handleNFSUnloc
11ad0 6b 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74  k ){.        int
11ae0 20 74 45 72 72 6e 6f 3b 20 20 20 20 20 20 20 20   tErrno;        
11af0 20 20 20 20 20 20 20 2f 2a 20 45 72 72 6f 72 20         /* Error 
11b00 63 6f 64 65 20 66 72 6f 6d 20 73 79 73 74 65 6d  code from system
11b10 20 63 61 6c 6c 20 65 72 72 6f 72 73 20 2a 2f 0a   call errors */.
11b20 20 20 20 20 20 20 20 20 6f 66 66 5f 74 20 64 69          off_t di
11b30 76 53 69 7a 65 20 3d 20 53 48 41 52 45 44 5f 53  vSize = SHARED_S
11b40 49 5a 45 20 2d 20 31 3b 0a 20 20 20 20 20 20 20  IZE - 1;.       
11b50 20 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e 6c   .        lock.l
11b60 5f 74 79 70 65 20 3d 20 46 5f 55 4e 4c 43 4b 3b  _type = F_UNLCK;
11b70 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f  .        lock.l_
11b80 77 68 65 6e 63 65 20 3d 20 53 45 45 4b 5f 53 45  whence = SEEK_SE
11b90 54 3b 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e  T;.        lock.
11ba0 6c 5f 73 74 61 72 74 20 3d 20 53 48 41 52 45 44  l_start = SHARED
11bb0 5f 46 49 52 53 54 3b 0a 20 20 20 20 20 20 20 20  _FIRST;.        
11bc0 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 64 69 76  lock.l_len = div
11bd0 53 69 7a 65 3b 0a 20 20 20 20 20 20 20 20 69 66  Size;.        if
11be0 28 20 75 6e 69 78 46 69 6c 65 4c 6f 63 6b 28 70  ( unixFileLock(p
11bf0 46 69 6c 65 2c 20 26 6c 6f 63 6b 2c 20 31 30 29  File, &lock, 10)
11c00 3d 3d 28 2d 31 29 20 29 7b 0a 20 20 20 20 20 20  ==(-1) ){.      
11c10 20 20 20 20 74 45 72 72 6e 6f 20 3d 20 65 72 72      tErrno = err
11c20 6e 6f 3b 0a 23 69 66 20 4f 53 4c 4f 43 4b 49 4e  no;.#if OSLOCKIN
11c30 47 5f 43 48 45 43 4b 5f 42 55 53 59 5f 49 4f 45  G_CHECK_BUSY_IOE
11c40 52 52 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  RR.          rc 
11c50 3d 20 73 71 6c 69 74 65 45 72 72 6f 72 46 72 6f  = sqliteErrorFro
11c60 6d 50 6f 73 69 78 45 72 72 6f 72 28 74 45 72 72  mPosixError(tErr
11c70 6e 6f 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  no, SQLITE_IOERR
11c80 5f 55 4e 4c 4f 43 4b 29 3b 0a 23 65 6c 73 65 0a  _UNLOCK);.#else.
11c90 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53            rc = S
11ca0 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f  QLITE_IOERR_UNLO
11cb0 43 4b 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20  CK;.#endif.     
11cc0 20 20 20 20 20 73 74 6f 72 65 4c 61 73 74 45 72       storeLastEr
11cd0 72 6e 6f 28 70 46 69 6c 65 2c 20 74 45 72 72 6e  rno(pFile, tErrn
11ce0 6f 29 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f  o);.          go
11cf0 74 6f 20 65 6e 64 5f 75 6e 6c 6f 63 6b 3b 0a 20  to end_unlock;. 
11d00 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
11d10 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d 20 46   lock.l_type = F
11d20 5f 52 44 4c 43 4b 3b 0a 20 20 20 20 20 20 20 20  _RDLCK;.        
11d30 6c 6f 63 6b 2e 6c 5f 77 68 65 6e 63 65 20 3d 20  lock.l_whence = 
11d40 53 45 45 4b 5f 53 45 54 3b 0a 20 20 20 20 20 20  SEEK_SET;.      
11d50 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d    lock.l_start =
11d60 20 53 48 41 52 45 44 5f 46 49 52 53 54 3b 0a 20   SHARED_FIRST;. 
11d70 20 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 6c 65         lock.l_le
11d80 6e 20 3d 20 64 69 76 53 69 7a 65 3b 0a 20 20 20  n = divSize;.   
11d90 20 20 20 20 20 69 66 28 20 75 6e 69 78 46 69 6c       if( unixFil
11da0 65 4c 6f 63 6b 28 70 46 69 6c 65 2c 20 26 6c 6f  eLock(pFile, &lo
11db0 63 6b 2c 20 31 30 29 3d 3d 28 2d 31 29 20 29 7b  ck, 10)==(-1) ){
11dc0 0a 20 20 20 20 20 20 20 20 20 20 74 45 72 72 6e  .          tErrn
11dd0 6f 20 3d 20 65 72 72 6e 6f 3b 0a 23 69 66 20 4f  o = errno;.#if O
11de0 53 4c 4f 43 4b 49 4e 47 5f 43 48 45 43 4b 5f 42  SLOCKING_CHECK_B
11df0 55 53 59 5f 49 4f 45 52 52 0a 20 20 20 20 20 20  USY_IOERR.      
11e00 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 45      rc = sqliteE
11e10 72 72 6f 72 46 72 6f 6d 50 6f 73 69 78 45 72 72  rrorFromPosixErr
11e20 6f 72 28 74 45 72 72 6e 6f 2c 20 53 51 4c 49 54  or(tErrno, SQLIT
11e30 45 5f 49 4f 45 52 52 5f 52 44 4c 4f 43 4b 29 3b  E_IOERR_RDLOCK);
11e40 0a 23 65 6c 73 65 0a 20 20 20 20 20 20 20 20 20  .#else.         
11e50 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45   rc = SQLITE_IOE
11e60 52 52 5f 55 4e 4c 4f 43 4b 3b 0a 23 65 6e 64 69  RR_UNLOCK;.#endi
11e70 66 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  f.          if( 
11e80 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 72 63  IS_LOCK_ERROR(rc
11e90 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ) ){.           
11ea0 20 73 74 6f 72 65 4c 61 73 74 45 72 72 6e 6f 28   storeLastErrno(
11eb0 70 46 69 6c 65 2c 20 74 45 72 72 6e 6f 29 3b 0a  pFile, tErrno);.
11ec0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
11ed0 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 75        goto end_u
11ee0 6e 6c 6f 63 6b 3b 0a 20 20 20 20 20 20 20 20 7d  nlock;.        }
11ef0 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f  .        lock.l_
11f00 74 79 70 65 20 3d 20 46 5f 55 4e 4c 43 4b 3b 0a  type = F_UNLCK;.
11f10 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 77          lock.l_w
11f20 68 65 6e 63 65 20 3d 20 53 45 45 4b 5f 53 45 54  hence = SEEK_SET
11f30 3b 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e 6c  ;.        lock.l
11f40 5f 73 74 61 72 74 20 3d 20 53 48 41 52 45 44 5f  _start = SHARED_
11f50 46 49 52 53 54 2b 64 69 76 53 69 7a 65 3b 0a 20  FIRST+divSize;. 
11f60 20 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 6c 65         lock.l_le
11f70 6e 20 3d 20 53 48 41 52 45 44 5f 53 49 5a 45 2d  n = SHARED_SIZE-
11f80 64 69 76 53 69 7a 65 3b 0a 20 20 20 20 20 20 20  divSize;.       
11f90 20 69 66 28 20 75 6e 69 78 46 69 6c 65 4c 6f 63   if( unixFileLoc
11fa0 6b 28 70 46 69 6c 65 2c 20 26 6c 6f 63 6b 2c 20  k(pFile, &lock, 
11fb0 31 30 29 3d 3d 28 2d 31 29 20 29 7b 0a 20 20 20  10)==(-1) ){.   
11fc0 20 20 20 20 20 20 20 74 45 72 72 6e 6f 20 3d 20         tErrno = 
11fd0 65 72 72 6e 6f 3b 0a 23 69 66 20 4f 53 4c 4f 43  errno;.#if OSLOC
11fe0 4b 49 4e 47 5f 43 48 45 43 4b 5f 42 55 53 59 5f  KING_CHECK_BUSY_
11ff0 49 4f 45 52 52 0a 20 20 20 20 20 20 20 20 20 20  IOERR.          
12000 72 63 20 3d 20 73 71 6c 69 74 65 45 72 72 6f 72  rc = sqliteError
12010 46 72 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28 74  FromPosixError(t
12020 45 72 72 6e 6f 2c 20 53 51 4c 49 54 45 5f 49 4f  Errno, SQLITE_IO
12030 45 52 52 5f 55 4e 4c 4f 43 4b 29 3b 0a 23 65 6c  ERR_UNLOCK);.#el
12040 73 65 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  se.          rc 
12050 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55  = SQLITE_IOERR_U
12060 4e 4c 4f 43 4b 3b 0a 23 65 6e 64 69 66 0a 20 20  NLOCK;.#endif.  
12070 20 20 20 20 20 20 20 20 69 66 28 20 49 53 5f 4c          if( IS_L
12080 4f 43 4b 5f 45 52 52 4f 52 28 72 63 29 20 29 7b  OCK_ERROR(rc) ){
12090 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 74 6f  .            sto
120a0 72 65 4c 61 73 74 45 72 72 6e 6f 28 70 46 69 6c  reLastErrno(pFil
120b0 65 2c 20 74 45 72 72 6e 6f 29 3b 0a 20 20 20 20  e, tErrno);.    
120c0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
120d0 20 20 73 74 6f 72 65 4c 61 73 74 45 72 72 6e 6f    storeLastErrno
120e0 28 70 46 69 6c 65 2c 20 74 45 72 72 6e 6f 29 3b  (pFile, tErrno);
120f0 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20  .          goto 
12100 65 6e 64 5f 75 6e 6c 6f 63 6b 3b 0a 20 20 20 20  end_unlock;.    
12110 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73      }.      }els
12120 65 0a 23 65 6e 64 69 66 20 2f 2a 20 64 65 66 69  e.#endif /* defi
12130 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 26  ned(__APPLE__) &
12140 26 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  & SQLITE_ENABLE_
12150 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 2a 2f  LOCKING_STYLE */
12160 0a 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20 20  .      {.       
12170 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d 20 46   lock.l_type = F
12180 5f 52 44 4c 43 4b 3b 0a 20 20 20 20 20 20 20 20  _RDLCK;.        
12190 6c 6f 63 6b 2e 6c 5f 77 68 65 6e 63 65 20 3d 20  lock.l_whence = 
121a0 53 45 45 4b 5f 53 45 54 3b 0a 20 20 20 20 20 20  SEEK_SET;.      
121b0 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d    lock.l_start =
121c0 20 53 48 41 52 45 44 5f 46 49 52 53 54 3b 0a 20   SHARED_FIRST;. 
121d0 20 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 6c 65         lock.l_le
121e0 6e 20 3d 20 53 48 41 52 45 44 5f 53 49 5a 45 3b  n = SHARED_SIZE;
121f0 0a 20 20 20 20 20 20 20 20 69 66 28 20 75 6e 69  .        if( uni
12200 78 46 69 6c 65 4c 6f 63 6b 28 70 46 69 6c 65 2c  xFileLock(pFile,
12210 20 26 6c 6f 63 6b 2c 20 31 30 29 20 29 7b 0a 20   &lock, 10) ){. 
12220 20 20 20 20 20 20 20 20 20 69 6e 74 20 74 45 72           int tEr
12230 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 23 69 66  rno = errno;.#if
12240 20 4f 53 4c 4f 43 4b 49 4e 47 5f 43 48 45 43 4b   OSLOCKING_CHECK
12250 5f 42 55 53 59 5f 49 4f 45 52 52 0a 20 20 20 20  _BUSY_IOERR.    
12260 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
12270 65 45 72 72 6f 72 46 72 6f 6d 50 6f 73 69 78 45  eErrorFromPosixE
12280 72 72 6f 72 28 74 45 72 72 6e 6f 2c 20 53 51 4c  rror(tErrno, SQL
12290 49 54 45 5f 49 4f 45 52 52 5f 52 44 4c 4f 43 4b  ITE_IOERR_RDLOCK
122a0 29 3b 0a 23 65 6c 73 65 0a 20 20 20 20 20 20 20  );.#else.       
122b0 20 20 20 2f 2a 20 49 6e 20 74 68 65 6f 72 79 2c     /* In theory,
122c0 20 74 68 65 20 63 61 6c 6c 20 74 6f 20 75 6e 69   the call to uni
122d0 78 46 69 6c 65 4c 6f 63 6b 28 29 20 63 61 6e 6e  xFileLock() cann
122e0 6f 74 20 66 61 69 6c 20 62 65 63 61 75 73 65 20  ot fail because 
122f0 61 6e 6f 74 68 65 72 0a 20 20 20 20 20 20 20 20  another.        
12300 20 20 2a 2a 20 70 72 6f 63 65 73 73 20 69 73 20    ** process is 
12310 68 6f 6c 64 69 6e 67 20 61 6e 20 69 6e 63 6f 6d  holding an incom
12320 70 61 74 69 62 6c 65 20 6c 6f 63 6b 2e 20 49 66  patible lock. If
12330 20 69 74 20 64 6f 65 73 2c 20 74 68 69 73 20 0a   it does, this .
12340 20 20 20 20 20 20 20 20 20 20 2a 2a 20 69 6e 64            ** ind
12350 69 63 61 74 65 73 20 74 68 61 74 20 74 68 65 20  icates that the 
12360 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20 69 73  other process is
12370 20 6e 6f 74 20 66 6f 6c 6c 6f 77 69 6e 67 20 74   not following t
12380 68 65 20 6c 6f 63 6b 69 6e 67 0a 20 20 20 20 20  he locking.     
12390 20 20 20 20 20 2a 2a 20 70 72 6f 74 6f 63 6f 6c       ** protocol
123a0 2e 20 49 66 20 74 68 69 73 20 68 61 70 70 65 6e  . If this happen
123b0 73 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  s, return SQLITE
123c0 5f 49 4f 45 52 52 5f 52 44 4c 4f 43 4b 2e 20 52  _IOERR_RDLOCK. R
123d0 65 74 75 72 6e 69 6e 67 0a 20 20 20 20 20 20 20  eturning.       
123e0 20 20 20 2a 2a 20 53 51 4c 49 54 45 5f 42 55 53     ** SQLITE_BUS
123f0 59 20 77 6f 75 6c 64 20 63 6f 6e 66 75 73 65 20  Y would confuse 
12400 74 68 65 20 75 70 70 65 72 20 6c 61 79 65 72 20  the upper layer 
12410 28 69 6e 20 70 72 61 63 74 69 63 65 20 69 74 20  (in practice it 
12420 63 61 75 73 65 73 20 0a 20 20 20 20 20 20 20 20  causes .        
12430 20 20 2a 2a 20 61 6e 20 61 73 73 65 72 74 20 74    ** an assert t
12440 6f 20 66 61 69 6c 29 2e 20 2a 2f 20 0a 20 20 20  o fail). */ .   
12450 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
12460 54 45 5f 49 4f 45 52 52 5f 52 44 4c 4f 43 4b 3b  TE_IOERR_RDLOCK;
12470 0a 20 20 20 20 20 20 20 20 20 20 73 74 6f 72 65  .          store
12480 4c 61 73 74 45 72 72 6e 6f 28 70 46 69 6c 65 2c  LastErrno(pFile,
12490 20 74 45 72 72 6e 6f 29 3b 0a 23 65 6e 64 69 66   tErrno);.#endif
124a0 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 49  .          if( I
124b0 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 72 63 29  S_LOCK_ERROR(rc)
124c0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
124d0 73 74 6f 72 65 4c 61 73 74 45 72 72 6e 6f 28 70  storeLastErrno(p
124e0 46 69 6c 65 2c 20 74 45 72 72 6e 6f 29 3b 0a 20  File, tErrno);. 
124f0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
12500 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 75 6e       goto end_un
12510 6c 6f 63 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a  lock;.        }.
12520 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
12530 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d 20    lock.l_type = 
12540 46 5f 55 4e 4c 43 4b 3b 0a 20 20 20 20 6c 6f 63  F_UNLCK;.    loc
12550 6b 2e 6c 5f 77 68 65 6e 63 65 20 3d 20 53 45 45  k.l_whence = SEE
12560 4b 5f 53 45 54 3b 0a 20 20 20 20 6c 6f 63 6b 2e  K_SET;.    lock.
12570 6c 5f 73 74 61 72 74 20 3d 20 50 45 4e 44 49 4e  l_start = PENDIN
12580 47 5f 42 59 54 45 3b 0a 20 20 20 20 6c 6f 63 6b  G_BYTE;.    lock
12590 2e 6c 5f 6c 65 6e 20 3d 20 32 4c 3b 20 20 61 73  .l_len = 2L;  as
125a0 73 65 72 74 28 20 50 45 4e 44 49 4e 47 5f 42 59  sert( PENDING_BY
125b0 54 45 2b 31 3d 3d 52 45 53 45 52 56 45 44 5f 42  TE+1==RESERVED_B
125c0 59 54 45 20 29 3b 0a 20 20 20 20 69 66 28 20 75  YTE );.    if( u
125d0 6e 69 78 46 69 6c 65 4c 6f 63 6b 28 70 46 69 6c  nixFileLock(pFil
125e0 65 2c 20 26 6c 6f 63 6b 2c 20 31 30 29 3d 3d 30  e, &lock, 10)==0
125f0 20 29 7b 0a 20 20 20 20 20 20 70 49 6e 6f 64 65   ){.      pInode
12600 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 53 48  ->eFileLock = SH
12610 41 52 45 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20 7d  ARED_LOCK;.    }
12620 65 6c 73 65 7b 0a 23 69 66 20 4f 53 4c 4f 43 4b  else{.#if OSLOCK
12630 49 4e 47 5f 43 48 45 43 4b 5f 42 55 53 59 5f 49  ING_CHECK_BUSY_I
12640 4f 45 52 52 0a 20 20 20 20 20 20 74 45 72 72 6e  OERR.      tErrn
12650 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20  o = errno;.     
12660 20 72 63 20 3d 20 73 71 6c 69 74 65 45 72 72 6f   rc = sqliteErro
12670 72 46 72 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28  rFromPosixError(
12680 74 45 72 72 6e 6f 2c 20 53 51 4c 49 54 45 5f 49  tErrno, SQLITE_I
12690 4f 45 52 52 5f 55 4e 4c 4f 43 4b 29 3b 0a 20 20  OERR_UNLOCK);.  
126a0 20 20 20 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f      if( IS_LOCK_
126b0 45 52 52 4f 52 28 72 63 29 20 29 7b 0a 20 20 20  ERROR(rc) ){.   
126c0 20 20 20 20 20 73 74 6f 72 65 4c 61 73 74 45 72       storeLastEr
126d0 72 6e 6f 28 70 46 69 6c 65 2c 20 74 45 72 72 6e  rno(pFile, tErrn
126e0 6f 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6c 73  o);.      }.#els
126f0 65 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  e.      rc = SQL
12700 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b  ITE_IOERR_UNLOCK
12710 3b 0a 20 20 20 20 20 20 73 74 6f 72 65 4c 61 73  ;.      storeLas
12720 74 45 72 72 6e 6f 28 70 46 69 6c 65 2c 20 65 72  tErrno(pFile, er
12730 72 6e 6f 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20  rno);.#endif.   
12740 20 20 20 67 6f 74 6f 20 65 6e 64 5f 75 6e 6c 6f     goto end_unlo
12750 63 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  ck;.    }.  }.  
12760 69 66 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 4e  if( eFileLock==N
12770 4f 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 2f 2a  O_LOCK ){.    /*
12780 20 44 65 63 72 65 6d 65 6e 74 20 74 68 65 20 73   Decrement the s
12790 68 61 72 65 64 20 6c 6f 63 6b 20 63 6f 75 6e 74  hared lock count
127a0 65 72 2e 20 20 52 65 6c 65 61 73 65 20 74 68 65  er.  Release the
127b0 20 6c 6f 63 6b 20 75 73 69 6e 67 20 61 6e 0a 20   lock using an. 
127c0 20 20 20 2a 2a 20 4f 53 20 63 61 6c 6c 20 6f 6e     ** OS call on
127d0 6c 79 20 77 68 65 6e 20 61 6c 6c 20 74 68 72 65  ly when all thre
127e0 61 64 73 20 69 6e 20 74 68 69 73 20 73 61 6d 65  ads in this same
127f0 20 70 72 6f 63 65 73 73 20 68 61 76 65 20 72 65   process have re
12800 6c 65 61 73 65 64 0a 20 20 20 20 2a 2a 20 74 68  leased.    ** th
12810 65 20 6c 6f 63 6b 2e 0a 20 20 20 20 2a 2f 0a 20  e lock..    */. 
12820 20 20 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72     pInode->nShar
12830 65 64 2d 2d 3b 0a 20 20 20 20 69 66 28 20 70 49  ed--;.    if( pI
12840 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64 3d 3d 30  node->nShared==0
12850 20 29 7b 0a 20 20 20 20 20 20 6c 6f 63 6b 2e 6c   ){.      lock.l
12860 5f 74 79 70 65 20 3d 20 46 5f 55 4e 4c 43 4b 3b  _type = F_UNLCK;
12870 0a 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 77 68  .      lock.l_wh
12880 65 6e 63 65 20 3d 20 53 45 45 4b 5f 53 45 54 3b  ence = SEEK_SET;
12890 0a 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74  .      lock.l_st
128a0 61 72 74 20 3d 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e  art = lock.l_len
128b0 20 3d 20 30 4c 3b 0a 20 20 20 20 20 20 69 66 28   = 0L;.      if(
128c0 20 75 6e 69 78 46 69 6c 65 4c 6f 63 6b 28 70 46   unixFileLock(pF
128d0 69 6c 65 2c 20 26 6c 6f 63 6b 2c 20 31 30 29 3d  ile, &lock, 10)=
128e0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 49  =0 ){.        pI
128f0 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20  node->eFileLock 
12900 3d 20 4e 4f 5f 4c 4f 43 4b 3b 0a 20 20 20 20 20  = NO_LOCK;.     
12910 20 7d 65 6c 73 65 7b 0a 23 69 66 20 4f 53 4c 4f   }else{.#if OSLO
12920 43 4b 49 4e 47 5f 43 48 45 43 4b 5f 42 55 53 59  CKING_CHECK_BUSY
12930 5f 49 4f 45 52 52 0a 20 20 20 20 20 20 20 20 74  _IOERR.        t
12940 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20  Errno = errno;. 
12950 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
12960 74 65 45 72 72 6f 72 46 72 6f 6d 50 6f 73 69 78  teErrorFromPosix
12970 45 72 72 6f 72 28 74 45 72 72 6e 6f 2c 20 53 51  Error(tErrno, SQ
12980 4c 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43  LITE_IOERR_UNLOC
12990 4b 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  K);.        if( 
129a0 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 72 63  IS_LOCK_ERROR(rc
129b0 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73  ) ){.          s
129c0 74 6f 72 65 4c 61 73 74 45 72 72 6e 6f 28 70 46  toreLastErrno(pF
129d0 69 6c 65 2c 20 74 45 72 72 6e 6f 29 3b 0a 20 20  ile, tErrno);.  
129e0 20 20 20 20 20 20 7d 0a 23 65 6c 73 65 0a 20 20        }.#else.  
129f0 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
12a00 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 3b 0a  E_IOERR_UNLOCK;.
12a10 20 20 20 20 20 20 20 20 73 74 6f 72 65 4c 61 73          storeLas
12a20 74 45 72 72 6e 6f 28 70 46 69 6c 65 2c 20 65 72  tErrno(pFile, er
12a30 72 6e 6f 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20  rno);.#endif.   
12a40 20 20 20 20 20 70 49 6e 6f 64 65 2d 3e 65 46 69       pInode->eFi
12a50 6c 65 4c 6f 63 6b 20 3d 20 4e 4f 5f 4c 4f 43 4b  leLock = NO_LOCK
12a60 3b 0a 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d  ;.        pFile-
12a70 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 4e 4f 5f  >eFileLock = NO_
12a80 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  LOCK;.      }.  
12a90 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 44 65 63 72    }..    /* Decr
12aa0 65 6d 65 6e 74 20 74 68 65 20 63 6f 75 6e 74 20  ement the count 
12ab0 6f 66 20 6c 6f 63 6b 73 20 61 67 61 69 6e 73 74  of locks against
12ac0 20 74 68 69 73 20 73 61 6d 65 20 66 69 6c 65 2e   this same file.
12ad0 20 20 57 68 65 6e 20 74 68 65 0a 20 20 20 20 2a    When the.    *
12ae0 2a 20 63 6f 75 6e 74 20 72 65 61 63 68 65 73 20  * count reaches 
12af0 7a 65 72 6f 2c 20 63 6c 6f 73 65 20 61 6e 79 20  zero, close any 
12b00 6f 74 68 65 72 20 66 69 6c 65 20 64 65 73 63 72  other file descr
12b10 69 70 74 6f 72 73 20 77 68 6f 73 65 20 63 6c 6f  iptors whose clo
12b20 73 65 0a 20 20 20 20 2a 2a 20 77 61 73 20 64 65  se.    ** was de
12b30 66 65 72 72 65 64 20 62 65 63 61 75 73 65 20 6f  ferred because o
12b40 66 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 6c 6f  f outstanding lo
12b50 63 6b 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  cks..    */.    
12b60 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 2d 2d 3b  pInode->nLock--;
12b70 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 49 6e  .    assert( pIn
12b80 6f 64 65 2d 3e 6e 4c 6f 63 6b 3e 3d 30 20 29 3b  ode->nLock>=0 );
12b90 0a 20 20 20 20 69 66 28 20 70 49 6e 6f 64 65 2d  .    if( pInode-
12ba0 3e 6e 4c 6f 63 6b 3d 3d 30 20 29 7b 0a 20 20 20  >nLock==0 ){.   
12bb0 20 20 20 63 6c 6f 73 65 50 65 6e 64 69 6e 67 46     closePendingF
12bc0 64 73 28 70 46 69 6c 65 29 3b 0a 20 20 20 20 7d  ds(pFile);.    }
12bd0 0a 20 20 7d 0a 0a 65 6e 64 5f 75 6e 6c 6f 63 6b  .  }..end_unlock
12be0 3a 0a 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74  :.  unixLeaveMut
12bf0 65 78 28 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d  ex();.  if( rc==
12c00 53 51 4c 49 54 45 5f 4f 4b 20 29 20 70 46 69 6c  SQLITE_OK ) pFil
12c10 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 65  e->eFileLock = e
12c20 46 69 6c 65 4c 6f 63 6b 3b 0a 20 20 72 65 74 75  FileLock;.  retu
12c30 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
12c40 4c 6f 77 65 72 20 74 68 65 20 6c 6f 63 6b 69 6e  Lower the lockin
12c50 67 20 6c 65 76 65 6c 20 6f 6e 20 66 69 6c 65 20  g level on file 
12c60 64 65 73 63 72 69 70 74 6f 72 20 70 46 69 6c 65  descriptor pFile
12c70 20 74 6f 20 65 46 69 6c 65 4c 6f 63 6b 2e 20 20   to eFileLock.  
12c80 65 46 69 6c 65 4c 6f 63 6b 0a 2a 2a 20 6d 75 73  eFileLock.** mus
12c90 74 20 62 65 20 65 69 74 68 65 72 20 4e 4f 5f 4c  t be either NO_L
12ca0 4f 43 4b 20 6f 72 20 53 48 41 52 45 44 5f 4c 4f  OCK or SHARED_LO
12cb0 43 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  CK..**.** If the
12cc0 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f   locking level o
12cd0 66 20 74 68 65 20 66 69 6c 65 20 64 65 73 63 72  f the file descr
12ce0 69 70 74 6f 72 20 69 73 20 61 6c 72 65 61 64 79  iptor is already
12cf0 20 61 74 20 6f 72 20 62 65 6c 6f 77 0a 2a 2a 20   at or below.** 
12d00 74 68 65 20 72 65 71 75 65 73 74 65 64 20 6c 6f  the requested lo
12d10 63 6b 69 6e 67 20 6c 65 76 65 6c 2c 20 74 68 69  cking level, thi
12d20 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e  s routine is a n
12d30 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  o-op..*/.static 
12d40 69 6e 74 20 75 6e 69 78 55 6e 6c 6f 63 6b 28 73  int unixUnlock(s
12d50 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c  qlite3_file *id,
12d60 20 69 6e 74 20 65 46 69 6c 65 4c 6f 63 6b 29 7b   int eFileLock){
12d70 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f  .#if SQLITE_MAX_
12d80 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 20 20 61 73  MMAP_SIZE>0.  as
12d90 73 65 72 74 28 20 65 46 69 6c 65 4c 6f 63 6b 3d  sert( eFileLock=
12da0 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 7c 7c 20  =SHARED_LOCK || 
12db0 28 28 75 6e 69 78 46 69 6c 65 20 2a 29 69 64 29  ((unixFile *)id)
12dc0 2d 3e 6e 46 65 74 63 68 4f 75 74 3d 3d 30 20 29  ->nFetchOut==0 )
12dd0 3b 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72  ;.#endif.  retur
12de0 6e 20 70 6f 73 69 78 55 6e 6c 6f 63 6b 28 69 64  n posixUnlock(id
12df0 2c 20 65 46 69 6c 65 4c 6f 63 6b 2c 20 30 29 3b  , eFileLock, 0);
12e00 0a 7d 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d  .}..#if SQLITE_M
12e10 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 73  AX_MMAP_SIZE>0.s
12e20 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 4d 61  tatic int unixMa
12e30 70 66 69 6c 65 28 75 6e 69 78 46 69 6c 65 20 2a  pfile(unixFile *
12e40 70 46 64 2c 20 69 36 34 20 6e 42 79 74 65 29 3b  pFd, i64 nByte);
12e50 0a 73 74 61 74 69 63 20 76 6f 69 64 20 75 6e 69  .static void uni
12e60 78 55 6e 6d 61 70 66 69 6c 65 28 75 6e 69 78 46  xUnmapfile(unixF
12e70 69 6c 65 20 2a 70 46 64 29 3b 0a 23 65 6e 64 69  ile *pFd);.#endi
12e80 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  f../*.** This fu
12e90 6e 63 74 69 6f 6e 20 70 65 72 66 6f 72 6d 73 20  nction performs 
12ea0 74 68 65 20 70 61 72 74 73 20 6f 66 20 74 68 65  the parts of the
12eb0 20 22 63 6c 6f 73 65 20 66 69 6c 65 22 20 6f 70   "close file" op
12ec0 65 72 61 74 69 6f 6e 20 0a 2a 2a 20 63 6f 6d 6d  eration .** comm
12ed0 6f 6e 20 74 6f 20 61 6c 6c 20 6c 6f 63 6b 69 6e  on to all lockin
12ee0 67 20 73 63 68 65 6d 65 73 2e 20 49 74 20 63 6c  g schemes. It cl
12ef0 6f 73 65 73 20 74 68 65 20 64 69 72 65 63 74 6f  oses the directo
12f00 72 79 20 61 6e 64 20 66 69 6c 65 0a 2a 2a 20 68  ry and file.** h
12f10 61 6e 64 6c 65 73 2c 20 69 66 20 74 68 65 79 20  andles, if they 
12f20 61 72 65 20 76 61 6c 69 64 2c 20 61 6e 64 20 73  are valid, and s
12f30 65 74 73 20 61 6c 6c 20 66 69 65 6c 64 73 20 6f  ets all fields o
12f40 66 20 74 68 65 20 75 6e 69 78 46 69 6c 65 0a 2a  f the unixFile.*
12f50 2a 20 73 74 72 75 63 74 75 72 65 20 74 6f 20 30  * structure to 0
12f60 2e 0a 2a 2a 0a 2a 2a 20 49 74 20 69 73 20 2a 6e  ..**.** It is *n
12f70 6f 74 2a 20 6e 65 63 65 73 73 61 72 79 20 74 6f  ot* necessary to
12f80 20 68 6f 6c 64 20 74 68 65 20 6d 75 74 65 78 20   hold the mutex 
12f90 77 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e  when this routin
12fa0 65 20 69 73 20 63 61 6c 6c 65 64 2c 0a 2a 2a 20  e is called,.** 
12fb0 65 76 65 6e 20 6f 6e 20 56 78 57 6f 72 6b 73 2e  even on VxWorks.
12fc0 20 20 41 20 6d 75 74 65 78 20 77 69 6c 6c 20 62    A mutex will b
12fd0 65 20 61 63 71 75 69 72 65 64 20 6f 6e 20 56 78  e acquired on Vx
12fe0 57 6f 72 6b 73 20 62 79 20 74 68 65 0a 2a 2a 20  Works by the.** 
12ff0 76 78 77 6f 72 6b 73 52 65 6c 65 61 73 65 46 69  vxworksReleaseFi
13000 6c 65 49 64 28 29 20 72 6f 75 74 69 6e 65 2e 0a  leId() routine..
13010 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63 6c  */.static int cl
13020 6f 73 65 55 6e 69 78 46 69 6c 65 28 73 71 6c 69  oseUnixFile(sqli
13030 74 65 33 5f 66 69 6c 65 20 2a 69 64 29 7b 0a 20  te3_file *id){. 
13040 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65   unixFile *pFile
13050 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64   = (unixFile*)id
13060 3b 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58  ;.#if SQLITE_MAX
13070 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 20 20 75  _MMAP_SIZE>0.  u
13080 6e 69 78 55 6e 6d 61 70 66 69 6c 65 28 70 46 69  nixUnmapfile(pFi
13090 6c 65 29 3b 0a 23 65 6e 64 69 66 0a 20 20 69 66  le);.#endif.  if
130a0 28 20 70 46 69 6c 65 2d 3e 68 3e 3d 30 20 29 7b  ( pFile->h>=0 ){
130b0 0a 20 20 20 20 72 6f 62 75 73 74 5f 63 6c 6f 73  .    robust_clos
130c0 65 28 70 46 69 6c 65 2c 20 70 46 69 6c 65 2d 3e  e(pFile, pFile->
130d0 68 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20  h, __LINE__);.  
130e0 20 20 70 46 69 6c 65 2d 3e 68 20 3d 20 2d 31 3b    pFile->h = -1;
130f0 0a 20 20 7d 0a 23 69 66 20 4f 53 5f 56 58 57 4f  .  }.#if OS_VXWO
13100 52 4b 53 0a 20 20 69 66 28 20 70 46 69 6c 65 2d  RKS.  if( pFile-
13110 3e 70 49 64 20 29 7b 0a 20 20 20 20 69 66 28 20  >pId ){.    if( 
13120 70 46 69 6c 65 2d 3e 63 74 72 6c 46 6c 61 67 73  pFile->ctrlFlags
13130 20 26 20 55 4e 49 58 46 49 4c 45 5f 44 45 4c 45   & UNIXFILE_DELE
13140 54 45 20 29 7b 0a 20 20 20 20 20 20 6f 73 55 6e  TE ){.      osUn
13150 6c 69 6e 6b 28 70 46 69 6c 65 2d 3e 70 49 64 2d  link(pFile->pId-
13160 3e 7a 43 61 6e 6f 6e 69 63 61 6c 4e 61 6d 65 29  >zCanonicalName)
13170 3b 0a 20 20 20 20 7d 0a 20 20 20 20 76 78 77 6f  ;.    }.    vxwo
13180 72 6b 73 52 65 6c 65 61 73 65 46 69 6c 65 49 64  rksReleaseFileId
13190 28 70 46 69 6c 65 2d 3e 70 49 64 29 3b 0a 20 20  (pFile->pId);.  
131a0 20 20 70 46 69 6c 65 2d 3e 70 49 64 20 3d 20 30    pFile->pId = 0
131b0 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 23 69 66  ;.  }.#endif.#if
131c0 64 65 66 20 53 51 4c 49 54 45 5f 55 4e 4c 49 4e  def SQLITE_UNLIN
131d0 4b 5f 41 46 54 45 52 5f 43 4c 4f 53 45 0a 20 20  K_AFTER_CLOSE.  
131e0 69 66 28 20 70 46 69 6c 65 2d 3e 63 74 72 6c 46  if( pFile->ctrlF
131f0 6c 61 67 73 20 26 20 55 4e 49 58 46 49 4c 45 5f  lags & UNIXFILE_
13200 44 45 4c 45 54 45 20 29 7b 0a 20 20 20 20 6f 73  DELETE ){.    os
13210 55 6e 6c 69 6e 6b 28 70 46 69 6c 65 2d 3e 7a 50  Unlink(pFile->zP
13220 61 74 68 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ath);.    sqlite
13230 33 5f 66 72 65 65 28 2a 28 63 68 61 72 2a 2a 29  3_free(*(char**)
13240 26 70 46 69 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a  &pFile->zPath);.
13250 20 20 20 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68      pFile->zPath
13260 20 3d 20 30 3b 0a 20 20 7d 0a 23 65 6e 64 69 66   = 0;.  }.#endif
13270 0a 20 20 4f 53 54 52 41 43 45 28 28 22 43 4c 4f  .  OSTRACE(("CLO
13280 53 45 20 20 20 25 2d 33 64 5c 6e 22 2c 20 70 46  SE   %-3d\n", pF
13290 69 6c 65 2d 3e 68 29 29 3b 0a 20 20 4f 70 65 6e  ile->h));.  Open
132a0 43 6f 75 6e 74 65 72 28 2d 31 29 3b 0a 20 20 73  Counter(-1);.  s
132b0 71 6c 69 74 65 33 5f 66 72 65 65 28 70 46 69 6c  qlite3_free(pFil
132c0 65 2d 3e 70 55 6e 75 73 65 64 29 3b 0a 20 20 6d  e->pUnused);.  m
132d0 65 6d 73 65 74 28 70 46 69 6c 65 2c 20 30 2c 20  emset(pFile, 0, 
132e0 73 69 7a 65 6f 66 28 75 6e 69 78 46 69 6c 65 29  sizeof(unixFile)
132f0 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
13300 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
13310 43 6c 6f 73 65 20 61 20 66 69 6c 65 2e 0a 2a 2f  Close a file..*/
13320 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78  .static int unix
13330 43 6c 6f 73 65 28 73 71 6c 69 74 65 33 5f 66 69  Close(sqlite3_fi
13340 6c 65 20 2a 69 64 29 7b 0a 20 20 69 6e 74 20 72  le *id){.  int r
13350 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
13360 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65   unixFile *pFile
13370 20 3d 20 28 75 6e 69 78 46 69 6c 65 20 2a 29 69   = (unixFile *)i
13380 64 3b 0a 20 20 76 65 72 69 66 79 44 62 46 69 6c  d;.  verifyDbFil
13390 65 28 70 46 69 6c 65 29 3b 0a 20 20 75 6e 69 78  e(pFile);.  unix
133a0 55 6e 6c 6f 63 6b 28 69 64 2c 20 4e 4f 5f 4c 4f  Unlock(id, NO_LO
133b0 43 4b 29 3b 0a 20 20 75 6e 69 78 45 6e 74 65 72  CK);.  unixEnter
133c0 4d 75 74 65 78 28 29 3b 0a 0a 20 20 2f 2a 20 75  Mutex();..  /* u
133d0 6e 69 78 46 69 6c 65 2e 70 49 6e 6f 64 65 20 69  nixFile.pInode i
133e0 73 20 61 6c 77 61 79 73 20 76 61 6c 69 64 20 68  s always valid h
133f0 65 72 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  ere. Otherwise, 
13400 61 20 64 69 66 66 65 72 65 6e 74 20 63 6c 6f 73  a different clos
13410 65 0a 20 20 2a 2a 20 72 6f 75 74 69 6e 65 20 28  e.  ** routine (
13420 65 2e 67 2e 20 6e 6f 6c 6f 63 6b 43 6c 6f 73 65  e.g. nolockClose
13430 28 29 29 20 77 6f 75 6c 64 20 62 65 20 63 61 6c  ()) would be cal
13440 6c 65 64 20 69 6e 73 74 65 61 64 2e 0a 20 20 2a  led instead..  *
13450 2f 0a 20 20 61 73 73 65 72 74 28 20 70 46 69 6c  /.  assert( pFil
13460 65 2d 3e 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b  e->pInode->nLock
13470 3e 30 20 7c 7c 20 70 46 69 6c 65 2d 3e 70 49 6e  >0 || pFile->pIn
13480 6f 64 65 2d 3e 62 50 72 6f 63 65 73 73 4c 6f 63  ode->bProcessLoc
13490 6b 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 41 4c  k==0 );.  if( AL
134a0 57 41 59 53 28 70 46 69 6c 65 2d 3e 70 49 6e 6f  WAYS(pFile->pIno
134b0 64 65 29 20 26 26 20 70 46 69 6c 65 2d 3e 70 49  de) && pFile->pI
134c0 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 20 29 7b 0a 20  node->nLock ){. 
134d0 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 61     /* If there a
134e0 72 65 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 6c  re outstanding l
134f0 6f 63 6b 73 2c 20 64 6f 20 6e 6f 74 20 61 63 74  ocks, do not act
13500 75 61 6c 6c 79 20 63 6c 6f 73 65 20 74 68 65 20  ually close the 
13510 66 69 6c 65 20 6a 75 73 74 0a 20 20 20 20 2a 2a  file just.    **
13520 20 79 65 74 20 62 65 63 61 75 73 65 20 74 68 61   yet because tha
13530 74 20 77 6f 75 6c 64 20 63 6c 65 61 72 20 74 68  t would clear th
13540 6f 73 65 20 6c 6f 63 6b 73 2e 20 20 49 6e 73 74  ose locks.  Inst
13550 65 61 64 2c 20 61 64 64 20 74 68 65 20 66 69 6c  ead, add the fil
13560 65 0a 20 20 20 20 2a 2a 20 64 65 73 63 72 69 70  e.    ** descrip
13570 74 6f 72 20 74 6f 20 70 49 6e 6f 64 65 2d 3e 70  tor to pInode->p
13580 55 6e 75 73 65 64 20 6c 69 73 74 2e 20 20 49 74  Unused list.  It
13590 20 77 69 6c 6c 20 62 65 20 61 75 74 6f 6d 61 74   will be automat
135a0 69 63 61 6c 6c 79 20 63 6c 6f 73 65 64 20 0a 20  ically closed . 
135b0 20 20 20 2a 2a 20 77 68 65 6e 20 74 68 65 20 6c     ** when the l
135c0 61 73 74 20 6c 6f 63 6b 20 69 73 20 63 6c 65 61  ast lock is clea
135d0 72 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  red..    */.    
135e0 73 65 74 50 65 6e 64 69 6e 67 46 64 28 70 46 69  setPendingFd(pFi
135f0 6c 65 29 3b 0a 20 20 7d 0a 20 20 72 65 6c 65 61  le);.  }.  relea
13600 73 65 49 6e 6f 64 65 49 6e 66 6f 28 70 46 69 6c  seInodeInfo(pFil
13610 65 29 3b 0a 20 20 72 63 20 3d 20 63 6c 6f 73 65  e);.  rc = close
13620 55 6e 69 78 46 69 6c 65 28 69 64 29 3b 0a 20 20  UnixFile(id);.  
13630 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29  unixLeaveMutex()
13640 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
13650 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ../*************
13660 2a 20 45 6e 64 20 6f 66 20 74 68 65 20 70 6f 73  * End of the pos
13670 69 78 20 61 64 76 69 73 6f 72 79 20 6c 6f 63 6b  ix advisory lock
13680 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   implementation 
13690 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
136a0 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  *.**************
136b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
136c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
136d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
136e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
136f0 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  /../************
13700 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13710 2a 2a 2a 2a 2a 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 0a 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 20 4e 6f 2d 6f 70 20 4c 6f 63 6b 69 6e 67 20  * No-op Locking 
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 0a 2a 2a 0a 2a 2a 20 4f 66 20 74 68 65 20  **.**.** Of the 
137a0 76 61 72 69 6f 75 73 20 6c 6f 63 6b 69 6e 67 20  various locking 
137b0 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 73 20  implementations 
137c0 61 76 61 69 6c 61 62 6c 65 2c 20 74 68 69 73 20  available, this 
137d0 69 73 20 62 79 20 66 61 72 20 74 68 65 0a 2a 2a  is by far the.**
137e0 20 73 69 6d 70 6c 65 73 74 3a 20 20 6c 6f 63 6b   simplest:  lock
137f0 69 6e 67 20 69 73 20 69 67 6e 6f 72 65 64 2e 20  ing is ignored. 
13800 20 4e 6f 20 61 74 74 65 6d 70 74 20 69 73 20 6d   No attempt is m
13810 61 64 65 20 74 6f 20 6c 6f 63 6b 20 74 68 65 20  ade to lock the 
13820 64 61 74 61 62 61 73 65 0a 2a 2a 20 66 69 6c 65  database.** file
13830 20 66 6f 72 20 72 65 61 64 69 6e 67 20 6f 72 20   for reading or 
13840 77 72 69 74 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54  writing..**.** T
13850 68 69 73 20 6c 6f 63 6b 69 6e 67 20 6d 6f 64 65  his locking mode
13860 20 69 73 20 61 70 70 72 6f 70 72 69 61 74 65 20   is appropriate 
13870 66 6f 72 20 75 73 65 20 6f 6e 20 72 65 61 64 2d  for use on read-
13880 6f 6e 6c 79 20 64 61 74 61 62 61 73 65 73 0a 2a  only databases.*
13890 2a 20 28 65 78 3a 20 64 61 74 61 62 61 73 65 73  * (ex: databases
138a0 20 74 68 61 74 20 61 72 65 20 62 75 72 6e 65 64   that are burned
138b0 20 69 6e 74 6f 20 43 44 2d 52 4f 4d 2c 20 66 6f   into CD-ROM, fo
138c0 72 20 65 78 61 6d 70 6c 65 2e 29 20 20 49 74 20  r example.)  It 
138d0 63 61 6e 0a 2a 2a 20 61 6c 73 6f 20 62 65 20 75  can.** also be u
138e0 73 65 64 20 69 66 20 74 68 65 20 61 70 70 6c 69  sed if the appli
138f0 63 61 74 69 6f 6e 20 65 6d 70 6c 6f 79 73 20 73  cation employs s
13900 6f 6d 65 20 65 78 74 65 72 6e 61 6c 20 6d 65 63  ome external mec
13910 68 61 6e 69 73 6d 20 74 6f 0a 2a 2a 20 70 72 65  hanism to.** pre
13920 76 65 6e 74 20 73 69 6d 75 6c 74 61 6e 65 6f 75  vent simultaneou
13930 73 20 61 63 63 65 73 73 20 6f 66 20 74 68 65 20  s access of the 
13940 73 61 6d 65 20 64 61 74 61 62 61 73 65 20 62 79  same database by
13950 20 74 77 6f 20 6f 72 20 6d 6f 72 65 0a 2a 2a 20   two or more.** 
13960 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
13970 69 6f 6e 73 2e 20 20 42 75 74 20 74 68 65 72 65  ions.  But there
13980 20 69 73 20 61 20 73 65 72 69 6f 75 73 20 72 69   is a serious ri
13990 73 6b 20 6f 66 20 64 61 74 61 62 61 73 65 0a 2a  sk of database.*
139a0 2a 20 63 6f 72 72 75 70 74 69 6f 6e 20 69 66 20  * corruption if 
139b0 74 68 69 73 20 6c 6f 63 6b 69 6e 67 20 6d 6f 64  this locking mod
139c0 65 20 69 73 20 75 73 65 64 20 69 6e 20 73 69 74  e is used in sit
139d0 75 61 74 69 6f 6e 73 20 77 68 65 72 65 20 6d 75  uations where mu
139e0 6c 74 69 70 6c 65 0a 2a 2a 20 64 61 74 61 62 61  ltiple.** databa
139f0 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 61  se connections a
13a00 72 65 20 61 63 63 65 73 73 69 6e 67 20 74 68 65  re accessing the
13a10 20 73 61 6d 65 20 64 61 74 61 62 61 73 65 20 66   same database f
13a20 69 6c 65 20 61 74 20 74 68 65 20 73 61 6d 65 0a  ile at the same.
13a30 2a 2a 20 74 69 6d 65 20 61 6e 64 20 6f 6e 65 20  ** time and one 
13a40 6f 72 20 6d 6f 72 65 20 6f 66 20 74 68 6f 73 65  or more of those
13a50 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 61 72 65   connections are
13a60 20 77 72 69 74 69 6e 67 2e 0a 2a 2f 0a 0a 73 74   writing..*/..st
13a70 61 74 69 63 20 69 6e 74 20 6e 6f 6c 6f 63 6b 43  atic int nolockC
13a80 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b  heckReservedLock
13a90 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 4e  (sqlite3_file *N
13aa0 6f 74 55 73 65 64 2c 20 69 6e 74 20 2a 70 52 65  otUsed, int *pRe
13ab0 73 4f 75 74 29 7b 0a 20 20 55 4e 55 53 45 44 5f  sOut){.  UNUSED_
13ac0 50 41 52 41 4d 45 54 45 52 28 4e 6f 74 55 73 65  PARAMETER(NotUse
13ad0 64 29 3b 0a 20 20 2a 70 52 65 73 4f 75 74 20 3d  d);.  *pResOut =
13ae0 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c   0;.  return SQL
13af0 49 54 45 5f 4f 4b 3b 0a 7d 0a 73 74 61 74 69 63  ITE_OK;.}.static
13b00 20 69 6e 74 20 6e 6f 6c 6f 63 6b 4c 6f 63 6b 28   int nolockLock(
13b10 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 4e 6f  sqlite3_file *No
13b20 74 55 73 65 64 2c 20 69 6e 74 20 4e 6f 74 55 73  tUsed, int NotUs
13b30 65 64 32 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50  ed2){.  UNUSED_P
13b40 41 52 41 4d 45 54 45 52 32 28 4e 6f 74 55 73 65  ARAMETER2(NotUse
13b50 64 2c 20 4e 6f 74 55 73 65 64 32 29 3b 0a 20 20  d, NotUsed2);.  
13b60 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
13b70 3b 0a 7d 0a 73 74 61 74 69 63 20 69 6e 74 20 6e  ;.}.static int n
13b80 6f 6c 6f 63 6b 55 6e 6c 6f 63 6b 28 73 71 6c 69  olockUnlock(sqli
13b90 74 65 33 5f 66 69 6c 65 20 2a 4e 6f 74 55 73 65  te3_file *NotUse
13ba0 64 2c 20 69 6e 74 20 4e 6f 74 55 73 65 64 32 29  d, int NotUsed2)
13bb0 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  {.  UNUSED_PARAM
13bc0 45 54 45 52 32 28 4e 6f 74 55 73 65 64 2c 20 4e  ETER2(NotUsed, N
13bd0 6f 74 55 73 65 64 32 29 3b 0a 20 20 72 65 74 75  otUsed2);.  retu
13be0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
13bf0 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 74 68 65  ./*.** Close the
13c00 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63   file..*/.static
13c10 20 69 6e 74 20 6e 6f 6c 6f 63 6b 43 6c 6f 73 65   int nolockClose
13c20 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69  (sqlite3_file *i
13c30 64 29 20 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  d) {.  int rc = 
13c40 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 75 6e 69  SQLITE_OK;.  uni
13c50 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28  xFile *pFile = (
13c60 75 6e 69 78 46 69 6c 65 20 2a 29 69 64 3b 0a 20  unixFile *)id;. 
13c70 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28   unixEnterMutex(
13c80 29 3b 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e  );.  if( pFile->
13c90 70 49 6e 6f 64 65 20 29 7b 20 20 0a 20 20 20 20  pInode ){  .    
13ca0 61 73 73 65 72 74 28 20 70 46 69 6c 65 2d 3e 70  assert( pFile->p
13cb0 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 3e 30 20 7c  Inode->nLock>0 |
13cc0 7c 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d  | pFile->pInode-
13cd0 3e 62 50 72 6f 63 65 73 73 4c 6f 63 6b 3d 3d 30  >bProcessLock==0
13ce0 20 29 3b 0a 20 20 20 20 69 66 28 20 70 46 69 6c   );.    if( pFil
13cf0 65 2d 3e 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b  e->pInode->nLock
13d00 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20   ){.      /* If 
13d10 74 68 65 72 65 20 61 72 65 20 6f 75 74 73 74 61  there are outsta
13d20 6e 64 69 6e 67 20 6c 6f 63 6b 73 2c 20 64 6f 20  nding locks, do 
13d30 6e 6f 74 20 61 63 74 75 61 6c 6c 79 20 63 6c 6f  not actually clo
13d40 73 65 20 74 68 65 20 66 69 6c 65 20 6a 75 73 74  se the file just
13d50 0a 20 20 20 20 20 20 2a 2a 20 79 65 74 20 62 65  .      ** yet be
13d60 63 61 75 73 65 20 74 68 61 74 20 77 6f 75 6c 64  cause that would
13d70 20 63 6c 65 61 72 20 74 68 6f 73 65 20 6c 6f 63   clear those loc
13d80 6b 73 2e 20 20 49 6e 73 74 65 61 64 2c 20 61 64  ks.  Instead, ad
13d90 64 20 74 68 65 20 66 69 6c 65 0a 20 20 20 20 20  d the file.     
13da0 20 2a 2a 20 64 65 73 63 72 69 70 74 6f 72 20 74   ** descriptor t
13db0 6f 20 70 49 6e 6f 64 65 2d 3e 70 55 6e 75 73 65  o pInode->pUnuse
13dc0 64 20 6c 69 73 74 2e 20 20 49 74 20 77 69 6c 6c  d list.  It will
13dd0 20 62 65 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c   be automaticall
13de0 79 20 63 6c 6f 73 65 64 20 0a 20 20 20 20 20 20  y closed .      
13df0 2a 2a 20 77 68 65 6e 20 74 68 65 20 6c 61 73 74  ** when the last
13e00 20 6c 6f 63 6b 20 69 73 20 63 6c 65 61 72 65 64   lock is cleared
13e10 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
13e20 20 73 65 74 50 65 6e 64 69 6e 67 46 64 28 70 46   setPendingFd(pF
13e30 69 6c 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ile);.    }.    
13e40 72 65 6c 65 61 73 65 49 6e 6f 64 65 49 6e 66 6f  releaseInodeInfo
13e50 28 70 46 69 6c 65 29 3b 0a 20 20 7d 0a 20 20 72  (pFile);.  }.  r
13e60 63 20 3d 20 63 6c 6f 73 65 55 6e 69 78 46 69 6c  c = closeUnixFil
13e70 65 28 69 64 29 3b 0a 20 20 75 6e 69 78 4c 65 61  e(id);.  unixLea
13e80 76 65 4d 75 74 65 78 28 29 3b 0a 20 20 72 65 74  veMutex();.  ret
13e90 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 2a 2a 2a  urn rc;.}../****
13ea0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20  *************** 
13eb0 45 6e 64 20 6f 66 20 74 68 65 20 6e 6f 2d 6f 70  End of the no-op
13ec0 20 6c 6f 63 6b 20 69 6d 70 6c 65 6d 65 6e 74 61   lock implementa
13ed0 74 69 6f 6e 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  tion ***********
13ee0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a  **********.*****
13ef0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13f00 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13f10 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13f20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13f30 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 2a 2a  *********/../***
13f40 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13f50 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 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 0a 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 20 42 65 67 69 6e 20 64 6f 74 2d  ***** Begin dot-
13fb0 66 69 6c 65 20 4c 6f 63 6b 69 6e 67 20 2a 2a 2a  file Locking ***
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 0a 2a 2a 0a 2a  ***********.**.*
13fe0 2a 20 54 68 65 20 64 6f 74 66 69 6c 65 20 6c 6f  * The dotfile lo
13ff0 63 6b 69 6e 67 20 69 6d 70 6c 65 6d 65 6e 74 61  cking implementa
14000 74 69 6f 6e 20 75 73 65 73 20 74 68 65 20 65 78  tion uses the ex
14010 69 73 74 65 6e 63 65 20 6f 66 20 73 65 70 61 72  istence of separ
14020 61 74 65 20 6c 6f 63 6b 0a 2a 2a 20 66 69 6c 65  ate lock.** file
14030 73 20 28 72 65 61 6c 6c 79 20 61 20 64 69 72 65  s (really a dire
14040 63 74 6f 72 79 29 20 74 6f 20 63 6f 6e 74 72 6f  ctory) to contro
14050 6c 20 61 63 63 65 73 73 20 74 6f 20 74 68 65 20  l access to the 
14060 64 61 74 61 62 61 73 65 2e 20 20 54 68 69 73 20  database.  This 
14070 77 6f 72 6b 73 0a 2a 2a 20 6f 6e 20 6a 75 73 74  works.** on just
14080 20 61 62 6f 75 74 20 65 76 65 72 79 20 66 69 6c   about every fil
14090 65 73 79 73 74 65 6d 20 69 6d 61 67 69 6e 61 62  esystem imaginab
140a0 6c 65 2e 20 20 42 75 74 20 74 68 65 72 65 20 61  le.  But there a
140b0 72 65 20 73 65 72 69 6f 75 73 20 64 6f 77 6e 73  re serious downs
140c0 69 64 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 28  ides:.**.**    (
140d0 31 29 20 20 54 68 65 72 65 20 69 73 20 7a 65 72  1)  There is zer
140e0 6f 20 63 6f 6e 63 75 72 72 65 6e 63 79 2e 20 20  o concurrency.  
140f0 41 20 73 69 6e 67 6c 65 20 72 65 61 64 65 72 20  A single reader 
14100 62 6c 6f 63 6b 73 20 61 6c 6c 20 6f 74 68 65 72  blocks all other
14110 0a 2a 2a 20 20 20 20 20 20 20 20 20 63 6f 6e 6e  .**         conn
14120 65 63 74 69 6f 6e 73 20 66 72 6f 6d 20 72 65 61  ections from rea
14130 64 69 6e 67 20 6f 72 20 77 72 69 74 69 6e 67 20  ding or writing 
14140 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a  the database..**
14150 0a 2a 2a 20 20 20 20 28 32 29 20 20 41 6e 20 61  .**    (2)  An a
14160 70 70 6c 69 63 61 74 69 6f 6e 20 63 72 61 73 68  pplication crash
14170 20 6f 72 20 70 6f 77 65 72 20 6c 6f 73 73 20 63   or power loss c
14180 61 6e 20 6c 65 61 76 65 20 73 74 61 6c 65 20 6c  an leave stale l
14190 6f 63 6b 20 66 69 6c 65 73 0a 2a 2a 20 20 20 20  ock files.**    
141a0 20 20 20 20 20 73 69 74 74 69 6e 67 20 61 72 6f       sitting aro
141b0 75 6e 64 20 74 68 61 74 20 6e 65 65 64 20 74 6f  und that need to
141c0 20 62 65 20 63 6c 65 61 72 65 64 20 6d 61 6e 75   be cleared manu
141d0 61 6c 6c 79 2e 0a 2a 2a 0a 2a 2a 20 4e 65 76 65  ally..**.** Neve
141e0 72 74 68 65 6c 65 73 73 2c 20 61 20 64 6f 74 6c  rtheless, a dotl
141f0 6f 63 6b 20 69 73 20 61 6e 20 61 70 70 72 6f 70  ock is an approp
14200 72 69 61 74 65 20 6c 6f 63 6b 69 6e 67 20 6d 6f  riate locking mo
14210 64 65 20 66 6f 72 20 75 73 65 20 69 66 20 6e 6f  de for use if no
14220 0a 2a 2a 20 6f 74 68 65 72 20 6c 6f 63 6b 69 6e  .** other lockin
14230 67 20 73 74 72 61 74 65 67 79 20 69 73 20 61 76  g strategy is av
14240 61 69 6c 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 44  ailable..**.** D
14250 6f 74 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 20 77  otfile locking w
14260 6f 72 6b 73 20 62 79 20 63 72 65 61 74 69 6e 67  orks by creating
14270 20 61 20 73 75 62 64 69 72 65 63 74 6f 72 79 20   a subdirectory 
14280 69 6e 20 74 68 65 20 73 61 6d 65 20 64 69 72 65  in the same dire
14290 63 74 6f 72 79 20 61 73 0a 2a 2a 20 74 68 65 20  ctory as.** the 
142a0 64 61 74 61 62 61 73 65 20 61 6e 64 20 77 69 74  database and wit
142b0 68 20 74 68 65 20 73 61 6d 65 20 6e 61 6d 65 20  h the same name 
142c0 62 75 74 20 77 69 74 68 20 61 20 22 2e 6c 6f 63  but with a ".loc
142d0 6b 22 20 65 78 74 65 6e 73 69 6f 6e 20 61 64 64  k" extension add
142e0 65 64 2e 0a 2a 2a 20 54 68 65 20 65 78 69 73 74  ed..** The exist
142f0 65 6e 63 65 20 6f 66 20 61 20 6c 6f 63 6b 20 64  ence of a lock d
14300 69 72 65 63 74 6f 72 79 20 69 6d 70 6c 69 65 73  irectory implies
14310 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f   an EXCLUSIVE lo
14320 63 6b 2e 20 20 41 6c 6c 20 6f 74 68 65 72 0a 2a  ck.  All other.*
14330 2a 20 6c 6f 63 6b 20 74 79 70 65 73 20 28 53 48  * lock types (SH
14340 41 52 45 44 2c 20 52 45 53 45 52 56 45 44 2c 20  ARED, RESERVED, 
14350 50 45 4e 44 49 4e 47 29 20 61 72 65 20 6d 61 70  PENDING) are map
14360 70 65 64 20 69 6e 74 6f 20 45 58 43 4c 55 53 49  ped into EXCLUSI
14370 56 45 2e 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68  VE..*/../*.** Th
14380 65 20 66 69 6c 65 20 73 75 66 66 69 78 20 61 64  e file suffix ad
14390 64 65 64 20 74 6f 20 74 68 65 20 64 61 74 61 20  ded to the data 
143a0 62 61 73 65 20 66 69 6c 65 6e 61 6d 65 20 69 6e  base filename in
143b0 20 6f 72 64 65 72 20 74 6f 20 63 72 65 61 74 65   order to create
143c0 20 74 68 65 0a 2a 2a 20 6c 6f 63 6b 20 64 69 72   the.** lock dir
143d0 65 63 74 6f 72 79 2e 0a 2a 2f 0a 23 64 65 66 69  ectory..*/.#defi
143e0 6e 65 20 44 4f 54 4c 4f 43 4b 5f 53 55 46 46 49  ne DOTLOCK_SUFFI
143f0 58 20 22 2e 6c 6f 63 6b 22 0a 0a 2f 2a 0a 2a 2a  X ".lock"../*.**
14400 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63 68   This routine ch
14410 65 63 6b 73 20 69 66 20 74 68 65 72 65 20 69 73  ecks if there is
14420 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b   a RESERVED lock
14430 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 73 70 65   held on the spe
14440 63 69 66 69 65 64 0a 2a 2a 20 66 69 6c 65 20 62  cified.** file b
14450 79 20 74 68 69 73 20 6f 72 20 61 6e 79 20 6f 74  y this or any ot
14460 68 65 72 20 70 72 6f 63 65 73 73 2e 20 49 66 20  her process. If 
14470 73 75 63 68 20 61 20 6c 6f 63 6b 20 69 73 20 68  such a lock is h
14480 65 6c 64 2c 20 73 65 74 20 2a 70 52 65 73 4f 75  eld, set *pResOu
14490 74 0a 2a 2a 20 74 6f 20 61 20 6e 6f 6e 2d 7a 65  t.** to a non-ze
144a0 72 6f 20 76 61 6c 75 65 20 6f 74 68 65 72 77 69  ro value otherwi
144b0 73 65 20 2a 70 52 65 73 4f 75 74 20 69 73 20 73  se *pResOut is s
144c0 65 74 20 74 6f 20 7a 65 72 6f 2e 20 20 54 68 65  et to zero.  The
144d0 20 72 65 74 75 72 6e 20 76 61 6c 75 65 0a 2a 2a   return value.**
144e0 20 69 73 20 73 65 74 20 74 6f 20 53 51 4c 49 54   is set to SQLIT
144f0 45 5f 4f 4b 20 75 6e 6c 65 73 73 20 61 6e 20 49  E_OK unless an I
14500 2f 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20  /O error occurs 
14510 64 75 72 69 6e 67 20 6c 6f 63 6b 20 63 68 65 63  during lock chec
14520 6b 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 64  king..**.** In d
14530 6f 74 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 2c 20  otfile locking, 
14540 65 69 74 68 65 72 20 61 20 6c 6f 63 6b 20 65 78  either a lock ex
14550 69 73 74 73 20 6f 72 20 69 74 20 64 6f 65 73 20  ists or it does 
14560 6e 6f 74 2e 20 20 53 6f 20 69 6e 20 74 68 69 73  not.  So in this
14570 0a 2a 2a 20 76 61 72 69 61 74 69 6f 6e 20 6f 66  .** variation of
14580 20 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f   CheckReservedLo
14590 63 6b 28 29 2c 20 2a 70 52 65 73 4f 75 74 20 69  ck(), *pResOut i
145a0 73 20 73 65 74 20 74 6f 20 74 72 75 65 20 69 66  s set to true if
145b0 20 61 6e 79 20 6c 6f 63 6b 0a 2a 2a 20 69 73 20   any lock.** is 
145c0 68 65 6c 64 20 6f 6e 20 74 68 65 20 66 69 6c 65  held on the file
145d0 20 61 6e 64 20 66 61 6c 73 65 20 69 66 20 74 68   and false if th
145e0 65 20 66 69 6c 65 20 69 73 20 75 6e 6c 6f 63 6b  e file is unlock
145f0 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ed..*/.static in
14600 74 20 64 6f 74 6c 6f 63 6b 43 68 65 63 6b 52 65  t dotlockCheckRe
14610 73 65 72 76 65 64 4c 6f 63 6b 28 73 71 6c 69 74  servedLock(sqlit
14620 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74  e3_file *id, int
14630 20 2a 70 52 65 73 4f 75 74 29 20 7b 0a 20 20 69   *pResOut) {.  i
14640 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
14650 4b 3b 0a 20 20 69 6e 74 20 72 65 73 65 72 76 65  K;.  int reserve
14660 64 20 3d 20 30 3b 0a 20 20 75 6e 69 78 46 69 6c  d = 0;.  unixFil
14670 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78  e *pFile = (unix
14680 46 69 6c 65 2a 29 69 64 3b 0a 0a 20 20 53 69 6d  File*)id;..  Sim
14690 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 72 65  ulateIOError( re
146a0 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52  turn SQLITE_IOER
146b0 52 5f 43 48 45 43 4b 52 45 53 45 52 56 45 44 4c  R_CHECKRESERVEDL
146c0 4f 43 4b 3b 20 29 3b 0a 20 20 0a 20 20 61 73 73  OCK; );.  .  ass
146d0 65 72 74 28 20 70 46 69 6c 65 20 29 3b 0a 20 20  ert( pFile );.  
146e0 72 65 73 65 72 76 65 64 20 3d 20 6f 73 41 63 63  reserved = osAcc
146f0 65 73 73 28 28 63 6f 6e 73 74 20 63 68 61 72 2a  ess((const char*
14700 29 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43  )pFile->lockingC
14710 6f 6e 74 65 78 74 2c 20 30 29 3d 3d 30 3b 0a 20  ontext, 0)==0;. 
14720 20 4f 53 54 52 41 43 45 28 28 22 54 45 53 54 20   OSTRACE(("TEST 
14730 57 52 2d 4c 4f 43 4b 20 25 64 20 25 64 20 25 64  WR-LOCK %d %d %d
14740 20 28 64 6f 74 6c 6f 63 6b 29 5c 6e 22 2c 20 70   (dotlock)\n", p
14750 46 69 6c 65 2d 3e 68 2c 20 72 63 2c 20 72 65 73  File->h, rc, res
14760 65 72 76 65 64 29 29 3b 0a 20 20 2a 70 52 65 73  erved));.  *pRes
14770 4f 75 74 20 3d 20 72 65 73 65 72 76 65 64 3b 0a  Out = reserved;.
14780 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
14790 2f 2a 0a 2a 2a 20 4c 6f 63 6b 20 74 68 65 20 66  /*.** Lock the f
147a0 69 6c 65 20 77 69 74 68 20 74 68 65 20 6c 6f 63  ile with the loc
147b0 6b 20 73 70 65 63 69 66 69 65 64 20 62 79 20 70  k specified by p
147c0 61 72 61 6d 65 74 65 72 20 65 46 69 6c 65 4c 6f  arameter eFileLo
147d0 63 6b 20 2d 20 6f 6e 65 0a 2a 2a 20 6f 66 20 74  ck - one.** of t
147e0 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a  he following:.**
147f0 0a 2a 2a 20 20 20 20 20 28 31 29 20 53 48 41 52  .**     (1) SHAR
14800 45 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28  ED_LOCK.**     (
14810 32 29 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b  2) RESERVED_LOCK
14820 0a 2a 2a 20 20 20 20 20 28 33 29 20 50 45 4e 44  .**     (3) PEND
14830 49 4e 47 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20  ING_LOCK.**     
14840 28 34 29 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f  (4) EXCLUSIVE_LO
14850 43 4b 0a 2a 2a 0a 2a 2a 20 53 6f 6d 65 74 69 6d  CK.**.** Sometim
14860 65 73 20 77 68 65 6e 20 72 65 71 75 65 73 74 69  es when requesti
14870 6e 67 20 6f 6e 65 20 6c 6f 63 6b 20 73 74 61 74  ng one lock stat
14880 65 2c 20 61 64 64 69 74 69 6f 6e 61 6c 20 6c 6f  e, additional lo
14890 63 6b 20 73 74 61 74 65 73 0a 2a 2a 20 61 72 65  ck states.** are
148a0 20 69 6e 73 65 72 74 65 64 20 69 6e 20 62 65 74   inserted in bet
148b0 77 65 65 6e 2e 20 20 54 68 65 20 6c 6f 63 6b 69  ween.  The locki
148c0 6e 67 20 6d 69 67 68 74 20 66 61 69 6c 20 6f 6e  ng might fail on
148d0 20 6f 6e 65 20 6f 66 20 74 68 65 20 6c 61 74 65   one of the late
148e0 72 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e 73  r.** transitions
148f0 20 6c 65 61 76 69 6e 67 20 74 68 65 20 6c 6f 63   leaving the loc
14900 6b 20 73 74 61 74 65 20 64 69 66 66 65 72 65 6e  k state differen
14910 74 20 66 72 6f 6d 20 77 68 61 74 20 69 74 20 73  t from what it s
14920 74 61 72 74 65 64 20 62 75 74 0a 2a 2a 20 73 74  tarted but.** st
14930 69 6c 6c 20 73 68 6f 72 74 20 6f 66 20 69 74 73  ill short of its
14940 20 67 6f 61 6c 2e 20 20 54 68 65 20 66 6f 6c 6c   goal.  The foll
14950 6f 77 69 6e 67 20 63 68 61 72 74 20 73 68 6f 77  owing chart show
14960 73 20 74 68 65 20 61 6c 6c 6f 77 65 64 0a 2a 2a  s the allowed.**
14970 20 74 72 61 6e 73 69 74 69 6f 6e 73 20 61 6e 64   transitions and
14980 20 74 68 65 20 69 6e 73 65 72 74 65 64 20 69 6e   the inserted in
14990 74 65 72 6d 65 64 69 61 74 65 20 73 74 61 74 65  termediate state
149a0 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 55 4e 4c 4f  s:.**.**    UNLO
149b0 43 4b 45 44 20 2d 3e 20 53 48 41 52 45 44 0a 2a  CKED -> SHARED.*
149c0 2a 20 20 20 20 53 48 41 52 45 44 20 2d 3e 20 52  *    SHARED -> R
149d0 45 53 45 52 56 45 44 0a 2a 2a 20 20 20 20 53 48  ESERVED.**    SH
149e0 41 52 45 44 20 2d 3e 20 28 50 45 4e 44 49 4e 47  ARED -> (PENDING
149f0 29 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a  ) -> EXCLUSIVE.*
14a00 2a 20 20 20 20 52 45 53 45 52 56 45 44 20 2d 3e  *    RESERVED ->
14a10 20 28 50 45 4e 44 49 4e 47 29 20 2d 3e 20 45 58   (PENDING) -> EX
14a20 43 4c 55 53 49 56 45 0a 2a 2a 20 20 20 20 50 45  CLUSIVE.**    PE
14a30 4e 44 49 4e 47 20 2d 3e 20 45 58 43 4c 55 53 49  NDING -> EXCLUSI
14a40 56 45 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  VE.**.** This ro
14a50 75 74 69 6e 65 20 77 69 6c 6c 20 6f 6e 6c 79 20  utine will only 
14a60 69 6e 63 72 65 61 73 65 20 61 20 6c 6f 63 6b 2e  increase a lock.
14a70 20 20 55 73 65 20 74 68 65 20 73 71 6c 69 74 65    Use the sqlite
14a80 33 4f 73 55 6e 6c 6f 63 6b 28 29 0a 2a 2a 20 72  3OsUnlock().** r
14a90 6f 75 74 69 6e 65 20 74 6f 20 6c 6f 77 65 72 20  outine to lower 
14aa0 61 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 2e  a locking level.
14ab0 0a 2a 2a 0a 2a 2a 20 57 69 74 68 20 64 6f 74 66  .**.** With dotf
14ac0 69 6c 65 20 6c 6f 63 6b 69 6e 67 2c 20 77 65 20  ile locking, we 
14ad0 72 65 61 6c 6c 79 20 6f 6e 6c 79 20 73 75 70 70  really only supp
14ae0 6f 72 74 20 73 74 61 74 65 20 28 34 29 3a 20 45  ort state (4): E
14af0 58 43 4c 55 53 49 56 45 2e 0a 2a 2a 20 42 75 74  XCLUSIVE..** But
14b00 20 77 65 20 74 72 61 63 6b 20 74 68 65 20 6f 74   we track the ot
14b10 68 65 72 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65  her locking leve
14b20 6c 73 20 69 6e 74 65 72 6e 61 6c 6c 79 2e 0a 2a  ls internally..*
14b30 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 64 6f 74  /.static int dot
14b40 6c 6f 63 6b 4c 6f 63 6b 28 73 71 6c 69 74 65 33  lockLock(sqlite3
14b50 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 65  _file *id, int e
14b60 46 69 6c 65 4c 6f 63 6b 29 20 7b 0a 20 20 75 6e  FileLock) {.  un
14b70 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20  ixFile *pFile = 
14b80 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20  (unixFile*)id;. 
14b90 20 63 68 61 72 20 2a 7a 4c 6f 63 6b 46 69 6c 65   char *zLockFile
14ba0 20 3d 20 28 63 68 61 72 20 2a 29 70 46 69 6c 65   = (char *)pFile
14bb0 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  ->lockingContext
14bc0 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  ;.  int rc = SQL
14bd0 49 54 45 5f 4f 4b 3b 0a 0a 0a 20 20 2f 2a 20 49  ITE_OK;...  /* I
14be0 66 20 77 65 20 68 61 76 65 20 61 6e 79 20 6c 6f  f we have any lo
14bf0 63 6b 2c 20 74 68 65 6e 20 74 68 65 20 6c 6f 63  ck, then the loc
14c00 6b 20 66 69 6c 65 20 61 6c 72 65 61 64 79 20 65  k file already e
14c10 78 69 73 74 73 2e 20 20 41 6c 6c 20 77 65 20 68  xists.  All we h
14c20 61 76 65 0a 20 20 2a 2a 20 74 6f 20 64 6f 20 69  ave.  ** to do i
14c30 73 20 61 64 6a 75 73 74 20 6f 75 72 20 69 6e 74  s adjust our int
14c40 65 72 6e 61 6c 20 72 65 63 6f 72 64 20 6f 66 20  ernal record of 
14c50 74 68 65 20 6c 6f 63 6b 20 6c 65 76 65 6c 2e 0a  the lock level..
14c60 20 20 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c 65    */.  if( pFile
14c70 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3e 20 4e 4f  ->eFileLock > NO
14c80 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 70 46 69  _LOCK ){.    pFi
14c90 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20  le->eFileLock = 
14ca0 65 46 69 6c 65 4c 6f 63 6b 3b 0a 20 20 20 20 2f  eFileLock;.    /
14cb0 2a 20 41 6c 77 61 79 73 20 75 70 64 61 74 65 20  * Always update 
14cc0 74 68 65 20 74 69 6d 65 73 74 61 6d 70 20 6f 6e  the timestamp on
14cd0 20 74 68 65 20 6f 6c 64 20 66 69 6c 65 20 2a 2f   the old file */
14ce0 0a 23 69 66 64 65 66 20 48 41 56 45 5f 55 54 49  .#ifdef HAVE_UTI
14cf0 4d 45 0a 20 20 20 20 75 74 69 6d 65 28 7a 4c 6f  ME.    utime(zLo
14d00 63 6b 46 69 6c 65 2c 20 4e 55 4c 4c 29 3b 0a 23  ckFile, NULL);.#
14d10 65 6c 73 65 0a 20 20 20 20 75 74 69 6d 65 73 28  else.    utimes(
14d20 7a 4c 6f 63 6b 46 69 6c 65 2c 20 4e 55 4c 4c 29  zLockFile, NULL)
14d30 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 72 65 74  ;.#endif.    ret
14d40 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
14d50 20 7d 0a 20 20 0a 20 20 2f 2a 20 67 72 61 62 20   }.  .  /* grab 
14d60 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63  an exclusive loc
14d70 6b 20 2a 2f 0a 20 20 72 63 20 3d 20 6f 73 4d 6b  k */.  rc = osMk
14d80 64 69 72 28 7a 4c 6f 63 6b 46 69 6c 65 2c 20 30  dir(zLockFile, 0
14d90 37 37 37 29 3b 0a 20 20 69 66 28 20 72 63 3c 30  777);.  if( rc<0
14da0 20 29 7b 0a 20 20 20 20 2f 2a 20 66 61 69 6c 65   ){.    /* faile
14db0 64 20 74 6f 20 6f 70 65 6e 2f 63 72 65 61 74 65  d to open/create
14dc0 20 74 68 65 20 6c 6f 63 6b 20 64 69 72 65 63 74   the lock direct
14dd0 6f 72 79 20 2a 2f 0a 20 20 20 20 69 6e 74 20 74  ory */.    int t
14de0 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20  Errno = errno;. 
14df0 20 20 20 69 66 28 20 45 45 58 49 53 54 20 3d 3d     if( EEXIST ==
14e00 20 74 45 72 72 6e 6f 20 29 7b 0a 20 20 20 20 20   tErrno ){.     
14e10 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53   rc = SQLITE_BUS
14e20 59 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a  Y;.    } else {.
14e30 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
14e40 65 45 72 72 6f 72 46 72 6f 6d 50 6f 73 69 78 45  eErrorFromPosixE
14e50 72 72 6f 72 28 74 45 72 72 6e 6f 2c 20 53 51 4c  rror(tErrno, SQL
14e60 49 54 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b 29 3b  ITE_IOERR_LOCK);
14e70 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53  .      if( rc!=S
14e80 51 4c 49 54 45 5f 42 55 53 59 20 29 7b 0a 20 20  QLITE_BUSY ){.  
14e90 20 20 20 20 20 20 73 74 6f 72 65 4c 61 73 74 45        storeLastE
14ea0 72 72 6e 6f 28 70 46 69 6c 65 2c 20 74 45 72 72  rrno(pFile, tErr
14eb0 6e 6f 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  no);.      }.   
14ec0 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63   }.    return rc
14ed0 3b 0a 20 20 7d 20 0a 20 20 0a 20 20 2f 2a 20 67  ;.  } .  .  /* g
14ee0 6f 74 20 69 74 2c 20 73 65 74 20 74 68 65 20 74  ot it, set the t
14ef0 79 70 65 20 61 6e 64 20 72 65 74 75 72 6e 20 6f  ype and return o
14f00 6b 20 2a 2f 0a 20 20 70 46 69 6c 65 2d 3e 65 46  k */.  pFile->eF
14f10 69 6c 65 4c 6f 63 6b 20 3d 20 65 46 69 6c 65 4c  ileLock = eFileL
14f20 6f 63 6b 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  ock;.  return rc
14f30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 77 65 72  ;.}../*.** Lower
14f40 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76   the locking lev
14f50 65 6c 20 6f 6e 20 66 69 6c 65 20 64 65 73 63 72  el on file descr
14f60 69 70 74 6f 72 20 70 46 69 6c 65 20 74 6f 20 65  iptor pFile to e
14f70 46 69 6c 65 4c 6f 63 6b 2e 20 20 65 46 69 6c 65  FileLock.  eFile
14f80 4c 6f 63 6b 0a 2a 2a 20 6d 75 73 74 20 62 65 20  Lock.** must be 
14f90 65 69 74 68 65 72 20 4e 4f 5f 4c 4f 43 4b 20 6f  either NO_LOCK o
14fa0 72 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2e 0a 2a  r SHARED_LOCK..*
14fb0 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6c 6f 63 6b  *.** If the lock
14fc0 69 6e 67 20 6c 65 76 65 6c 20 6f 66 20 74 68 65  ing level of the
14fd0 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
14fe0 20 69 73 20 61 6c 72 65 61 64 79 20 61 74 20 6f   is already at o
14ff0 72 20 62 65 6c 6f 77 0a 2a 2a 20 74 68 65 20 72  r below.** the r
15000 65 71 75 65 73 74 65 64 20 6c 6f 63 6b 69 6e 67  equested locking
15010 20 6c 65 76 65 6c 2c 20 74 68 69 73 20 72 6f 75   level, this rou
15020 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e  tine is a no-op.
15030 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 65 20  .**.** When the 
15040 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 72 65  locking level re
15050 61 63 68 65 73 20 4e 4f 5f 4c 4f 43 4b 2c 20 64  aches NO_LOCK, d
15060 65 6c 65 74 65 20 74 68 65 20 6c 6f 63 6b 20 66  elete the lock f
15070 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ile..*/.static i
15080 6e 74 20 64 6f 74 6c 6f 63 6b 55 6e 6c 6f 63 6b  nt dotlockUnlock
15090 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69  (sqlite3_file *i
150a0 64 2c 20 69 6e 74 20 65 46 69 6c 65 4c 6f 63 6b  d, int eFileLock
150b0 29 20 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a  ) {.  unixFile *
150c0 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c  pFile = (unixFil
150d0 65 2a 29 69 64 3b 0a 20 20 63 68 61 72 20 2a 7a  e*)id;.  char *z
150e0 4c 6f 63 6b 46 69 6c 65 20 3d 20 28 63 68 61 72  LockFile = (char
150f0 20 2a 29 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e   *)pFile->lockin
15100 67 43 6f 6e 74 65 78 74 3b 0a 20 20 69 6e 74 20  gContext;.  int 
15110 72 63 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70  rc;..  assert( p
15120 46 69 6c 65 20 29 3b 0a 20 20 4f 53 54 52 41 43  File );.  OSTRAC
15130 45 28 28 22 55 4e 4c 4f 43 4b 20 20 25 64 20 25  E(("UNLOCK  %d %
15140 64 20 77 61 73 20 25 64 20 70 69 64 3d 25 64 20  d was %d pid=%d 
15150 28 64 6f 74 6c 6f 63 6b 29 5c 6e 22 2c 20 70 46  (dotlock)\n", pF
15160 69 6c 65 2d 3e 68 2c 20 65 46 69 6c 65 4c 6f 63  ile->h, eFileLoc
15170 6b 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70 46  k,.           pF
15180 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 2c 20  ile->eFileLock, 
15190 6f 73 47 65 74 70 69 64 28 30 29 29 29 3b 0a 20  osGetpid(0)));. 
151a0 20 61 73 73 65 72 74 28 20 65 46 69 6c 65 4c 6f   assert( eFileLo
151b0 63 6b 3c 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20  ck<=SHARED_LOCK 
151c0 29 3b 0a 20 20 0a 20 20 2f 2a 20 6e 6f 2d 6f 70  );.  .  /* no-op
151d0 20 69 66 20 70 6f 73 73 69 62 6c 65 20 2a 2f 0a   if possible */.
151e0 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 65 46 69    if( pFile->eFi
151f0 6c 65 4c 6f 63 6b 3d 3d 65 46 69 6c 65 4c 6f 63  leLock==eFileLoc
15200 6b 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  k ){.    return 
15210 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a  SQLITE_OK;.  }..
15220 20 20 2f 2a 20 54 6f 20 64 6f 77 6e 67 72 61 64    /* To downgrad
15230 65 20 74 6f 20 73 68 61 72 65 64 2c 20 73 69 6d  e to shared, sim
15240 70 6c 79 20 75 70 64 61 74 65 20 6f 75 72 20 69  ply update our i
15250 6e 74 65 72 6e 61 6c 20 6e 6f 74 69 6f 6e 20 6f  nternal notion o
15260 66 20 74 68 65 0a 20 20 2a 2a 20 6c 6f 63 6b 20  f the.  ** lock 
15270 73 74 61 74 65 2e 20 20 4e 6f 20 6e 65 65 64 20  state.  No need 
15280 74 6f 20 6d 65 73 73 20 77 69 74 68 20 74 68 65  to mess with the
15290 20 66 69 6c 65 20 6f 6e 20 64 69 73 6b 2e 0a 20   file on disk.. 
152a0 20 2a 2f 0a 20 20 69 66 28 20 65 46 69 6c 65 4c   */.  if( eFileL
152b0 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b  ock==SHARED_LOCK
152c0 20 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 65   ){.    pFile->e
152d0 46 69 6c 65 4c 6f 63 6b 20 3d 20 53 48 41 52 45  FileLock = SHARE
152e0 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20 72 65 74 75  D_LOCK;.    retu
152f0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
15300 7d 0a 20 20 0a 20 20 2f 2a 20 54 6f 20 66 75 6c  }.  .  /* To ful
15310 6c 79 20 75 6e 6c 6f 63 6b 20 74 68 65 20 64 61  ly unlock the da
15320 74 61 62 61 73 65 2c 20 64 65 6c 65 74 65 20 74  tabase, delete t
15330 68 65 20 6c 6f 63 6b 20 66 69 6c 65 20 2a 2f 0a  he lock file */.
15340 20 20 61 73 73 65 72 74 28 20 65 46 69 6c 65 4c    assert( eFileL
15350 6f 63 6b 3d 3d 4e 4f 5f 4c 4f 43 4b 20 29 3b 0a  ock==NO_LOCK );.
15360 20 20 72 63 20 3d 20 6f 73 52 6d 64 69 72 28 7a    rc = osRmdir(z
15370 4c 6f 63 6b 46 69 6c 65 29 3b 0a 20 20 69 66 28  LockFile);.  if(
15380 20 72 63 3c 30 20 29 7b 0a 20 20 20 20 69 6e 74   rc<0 ){.    int
15390 20 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b   tErrno = errno;
153a0 0a 20 20 20 20 69 66 28 20 74 45 72 72 6e 6f 3d  .    if( tErrno=
153b0 3d 45 4e 4f 45 4e 54 20 29 7b 0a 20 20 20 20 20  =ENOENT ){.     
153c0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
153d0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 23 69 66 20  .    }else{.#if 
153e0 4f 53 4c 4f 43 4b 49 4e 47 5f 43 48 45 43 4b 5f  OSLOCKING_CHECK_
153f0 42 55 53 59 5f 49 4f 45 52 52 0a 20 20 20 20 20  BUSY_IOERR.     
15400 20 72 63 20 3d 20 73 71 6c 69 74 65 45 72 72 6f   rc = sqliteErro
15410 72 46 72 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28  rFromPosixError(
15420 74 45 72 72 6e 6f 2c 20 53 51 4c 49 54 45 5f 49  tErrno, SQLITE_I
15430 4f 45 52 52 5f 55 4e 4c 4f 43 4b 29 3b 0a 23 65  OERR_UNLOCK);.#e
15440 6c 73 65 0a 20 20 20 20 20 20 72 63 20 3d 20 53  lse.      rc = S
15450 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f  QLITE_IOERR_UNLO
15460 43 4b 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20  CK;.#endif.     
15470 20 73 74 6f 72 65 4c 61 73 74 45 72 72 6e 6f 28   storeLastErrno(
15480 70 46 69 6c 65 2c 20 74 45 72 72 6e 6f 29 3b 0a  pFile, tErrno);.
15490 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e      }.    return
154a0 20 72 63 3b 20 0a 20 20 7d 0a 20 20 70 46 69 6c   rc; .  }.  pFil
154b0 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 4e  e->eFileLock = N
154c0 4f 5f 4c 4f 43 4b 3b 0a 20 20 72 65 74 75 72 6e  O_LOCK;.  return
154d0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
154e0 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 20 66 69 6c  *.** Close a fil
154f0 65 2e 20 20 4d 61 6b 65 20 73 75 72 65 20 74 68  e.  Make sure th
15500 65 20 6c 6f 63 6b 20 68 61 73 20 62 65 65 6e 20  e lock has been 
15510 72 65 6c 65 61 73 65 64 20 62 65 66 6f 72 65 20  released before 
15520 63 6c 6f 73 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74  closing..*/.stat
15530 69 63 20 69 6e 74 20 64 6f 74 6c 6f 63 6b 43 6c  ic int dotlockCl
15540 6f 73 65 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  ose(sqlite3_file
15550 20 2a 69 64 29 20 7b 0a 20 20 75 6e 69 78 46 69   *id) {.  unixFi
15560 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69  le *pFile = (uni
15570 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 61 73 73  xFile*)id;.  ass
15580 65 72 74 28 20 69 64 21 3d 30 20 29 3b 0a 20 20  ert( id!=0 );.  
15590 64 6f 74 6c 6f 63 6b 55 6e 6c 6f 63 6b 28 69 64  dotlockUnlock(id
155a0 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20 20 73 71  , NO_LOCK);.  sq
155b0 6c 69 74 65 33 5f 66 72 65 65 28 70 46 69 6c 65  lite3_free(pFile
155c0 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  ->lockingContext
155d0 29 3b 0a 20 20 72 65 74 75 72 6e 20 63 6c 6f 73  );.  return clos
155e0 65 55 6e 69 78 46 69 6c 65 28 69 64 29 3b 0a 7d  eUnixFile(id);.}
155f0 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ./**************
15600 2a 2a 2a 2a 20 45 6e 64 20 6f 66 20 74 68 65 20  **** End of the 
15610 64 6f 74 2d 66 69 6c 65 20 6c 6f 63 6b 20 69 6d  dot-file lock im
15620 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 2a 2a 2a  plementation ***
15630 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
15640 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .***************
15650 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
15660 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
15670 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
15680 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f  ***************/
15690 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ../*************
156a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
156b0 2a 2a 2a 2a 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 0a 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 20 42 65 67  ************ Beg
15700 69 6e 20 66 6c 6f 63 6b 20 4c 6f 63 6b 69 6e 67  in flock Locking
15710 20 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 0a 2a 2a 0a 2a 2a 20 55 73 65 20 74 68 65 20  *.**.** Use the 
15740 66 6c 6f 63 6b 28 29 20 73 79 73 74 65 6d 20 63  flock() system c
15750 61 6c 6c 20 74 6f 20 64 6f 20 66 69 6c 65 20 6c  all to do file l
15760 6f 63 6b 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 66 6c  ocking..**.** fl
15770 6f 63 6b 28 29 20 6c 6f 63 6b 69 6e 67 20 69 73  ock() locking is
15780 20 6c 69 6b 65 20 64 6f 74 2d 66 69 6c 65 20 6c   like dot-file l
15790 6f 63 6b 69 6e 67 20 69 6e 20 74 68 61 74 20 74  ocking in that t
157a0 68 65 20 76 61 72 69 6f 75 73 0a 2a 2a 20 66 69  he various.** fi
157b0 6e 65 2d 67 72 61 69 6e 20 6c 6f 63 6b 69 6e 67  ne-grain locking
157c0 20 6c 65 76 65 6c 73 20 73 75 70 70 6f 72 74 65   levels supporte
157d0 64 20 62 79 20 53 51 4c 69 74 65 20 61 72 65 20  d by SQLite are 
157e0 63 6f 6c 6c 61 70 73 65 64 20 69 6e 74 6f 0a 2a  collapsed into.*
157f0 2a 20 61 20 73 69 6e 67 6c 65 20 65 78 63 6c 75  * a single exclu
15800 73 69 76 65 20 6c 6f 63 6b 2e 20 20 49 6e 20 6f  sive lock.  In o
15810 74 68 65 72 20 77 6f 72 64 73 2c 20 53 48 41 52  ther words, SHAR
15820 45 44 2c 20 52 45 53 45 52 56 45 44 2c 20 61 6e  ED, RESERVED, an
15830 64 0a 2a 2a 20 50 45 4e 44 49 4e 47 20 6c 6f 63  d.** PENDING loc
15840 6b 73 20 61 72 65 20 74 68 65 20 73 61 6d 65 20  ks are the same 
15850 74 68 69 6e 67 20 61 73 20 61 6e 20 45 58 43 4c  thing as an EXCL
15860 55 53 49 56 45 20 6c 6f 63 6b 2e 20 20 53 51 4c  USIVE lock.  SQL
15870 69 74 65 0a 2a 2a 20 73 74 69 6c 6c 20 77 6f 72  ite.** still wor
15880 6b 73 20 77 68 65 6e 20 79 6f 75 20 64 6f 20 74  ks when you do t
15890 68 69 73 2c 20 62 75 74 20 63 6f 6e 63 75 72 72  his, but concurr
158a0 65 6e 63 79 20 69 73 20 72 65 64 75 63 65 64 20  ency is reduced 
158b0 73 69 6e 63 65 0a 2a 2a 20 6f 6e 6c 79 20 61 20  since.** only a 
158c0 73 69 6e 67 6c 65 20 70 72 6f 63 65 73 73 20 63  single process c
158d0 61 6e 20 62 65 20 72 65 61 64 69 6e 67 20 74 68  an be reading th
158e0 65 20 64 61 74 61 62 61 73 65 20 61 74 20 61 20  e database at a 
158f0 74 69 6d 65 2e 0a 2a 2a 0a 2a 2a 20 4f 6d 69 74  time..**.** Omit
15900 20 74 68 69 73 20 73 65 63 74 69 6f 6e 20 69 66   this section if
15910 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c   SQLITE_ENABLE_L
15920 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 69 73 20  OCKING_STYLE is 
15930 74 75 72 6e 65 64 20 6f 66 66 0a 2a 2f 0a 23 69  turned off.*/.#i
15940 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
15950 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 0a 2f  LOCKING_STYLE../
15960 2a 0a 2a 2a 20 52 65 74 72 79 20 66 6c 6f 63 6b  *.** Retry flock
15970 28 29 20 63 61 6c 6c 73 20 74 68 61 74 20 66 61  () calls that fa
15980 69 6c 20 77 69 74 68 20 45 49 4e 54 52 0a 2a 2f  il with EINTR.*/
15990 0a 23 69 66 64 65 66 20 45 49 4e 54 52 0a 73 74  .#ifdef EINTR.st
159a0 61 74 69 63 20 69 6e 74 20 72 6f 62 75 73 74 5f  atic int robust_
159b0 66 6c 6f 63 6b 28 69 6e 74 20 66 64 2c 20 69 6e  flock(int fd, in
159c0 74 20 6f 70 29 7b 0a 20 20 69 6e 74 20 72 63 3b  t op){.  int rc;
159d0 0a 20 20 64 6f 7b 20 72 63 20 3d 20 66 6c 6f 63  .  do{ rc = floc
159e0 6b 28 66 64 2c 6f 70 29 3b 20 7d 77 68 69 6c 65  k(fd,op); }while
159f0 28 20 72 63 3c 30 20 26 26 20 65 72 72 6e 6f 3d  ( rc<0 && errno=
15a00 3d 45 49 4e 54 52 20 29 3b 0a 20 20 72 65 74 75  =EINTR );.  retu
15a10 72 6e 20 72 63 3b 0a 7d 0a 23 65 6c 73 65 0a 23  rn rc;.}.#else.#
15a20 20 64 65 66 69 6e 65 20 72 6f 62 75 73 74 5f 66   define robust_f
15a30 6c 6f 63 6b 28 61 2c 62 29 20 66 6c 6f 63 6b 28  lock(a,b) flock(
15a40 61 2c 62 29 0a 23 65 6e 64 69 66 0a 20 20 20 20  a,b).#endif.    
15a50 20 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f   ../*.** This ro
15a60 75 74 69 6e 65 20 63 68 65 63 6b 73 20 69 66 20  utine checks if 
15a70 74 68 65 72 65 20 69 73 20 61 20 52 45 53 45 52  there is a RESER
15a80 56 45 44 20 6c 6f 63 6b 20 68 65 6c 64 20 6f 6e  VED lock held on
15a90 20 74 68 65 20 73 70 65 63 69 66 69 65 64 0a 2a   the specified.*
15aa0 2a 20 66 69 6c 65 20 62 79 20 74 68 69 73 20 6f  * file by this o
15ab0 72 20 61 6e 79 20 6f 74 68 65 72 20 70 72 6f 63  r any other proc
15ac0 65 73 73 2e 20 49 66 20 73 75 63 68 20 61 20 6c  ess. If such a l
15ad0 6f 63 6b 20 69 73 20 68 65 6c 64 2c 20 73 65 74  ock is held, set
15ae0 20 2a 70 52 65 73 4f 75 74 0a 2a 2a 20 74 6f 20   *pResOut.** to 
15af0 61 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75 65  a non-zero value
15b00 20 6f 74 68 65 72 77 69 73 65 20 2a 70 52 65 73   otherwise *pRes
15b10 4f 75 74 20 69 73 20 73 65 74 20 74 6f 20 7a 65  Out is set to ze
15b20 72 6f 2e 20 20 54 68 65 20 72 65 74 75 72 6e 20  ro.  The return 
15b30 76 61 6c 75 65 0a 2a 2a 20 69 73 20 73 65 74 20  value.** is set 
15b40 74 6f 20 53 51 4c 49 54 45 5f 4f 4b 20 75 6e 6c  to SQLITE_OK unl
15b50 65 73 73 20 61 6e 20 49 2f 4f 20 65 72 72 6f 72  ess an I/O error
15b60 20 6f 63 63 75 72 73 20 64 75 72 69 6e 67 20 6c   occurs during l
15b70 6f 63 6b 20 63 68 65 63 6b 69 6e 67 2e 0a 2a 2f  ock checking..*/
15b80 0a 73 74 61 74 69 63 20 69 6e 74 20 66 6c 6f 63  .static int floc
15b90 6b 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f  kCheckReservedLo
15ba0 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  ck(sqlite3_file 
15bb0 2a 69 64 2c 20 69 6e 74 20 2a 70 52 65 73 4f 75  *id, int *pResOu
15bc0 74 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  t){.  int rc = S
15bd0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20  QLITE_OK;.  int 
15be0 72 65 73 65 72 76 65 64 20 3d 20 30 3b 0a 20 20  reserved = 0;.  
15bf0 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20  unixFile *pFile 
15c00 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b  = (unixFile*)id;
15c10 0a 20 20 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f  .  .  SimulateIO
15c20 45 72 72 6f 72 28 20 72 65 74 75 72 6e 20 53 51  Error( return SQ
15c30 4c 49 54 45 5f 49 4f 45 52 52 5f 43 48 45 43 4b  LITE_IOERR_CHECK
15c40 52 45 53 45 52 56 45 44 4c 4f 43 4b 3b 20 29 3b  RESERVEDLOCK; );
15c50 0a 20 20 0a 20 20 61 73 73 65 72 74 28 20 70 46  .  .  assert( pF
15c60 69 6c 65 20 29 3b 0a 20 20 0a 20 20 2f 2a 20 43  ile );.  .  /* C
15c70 68 65 63 6b 20 69 66 20 61 20 74 68 72 65 61 64  heck if a thread
15c80 20 69 6e 20 74 68 69 73 20 70 72 6f 63 65 73 73   in this process
15c90 20 68 6f 6c 64 73 20 73 75 63 68 20 61 20 6c 6f   holds such a lo
15ca0 63 6b 20 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c  ck */.  if( pFil
15cb0 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3e 53 48 41  e->eFileLock>SHA
15cc0 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20  RED_LOCK ){.    
15cd0 72 65 73 65 72 76 65 64 20 3d 20 31 3b 0a 20 20  reserved = 1;.  
15ce0 7d 0a 20 20 0a 20 20 2f 2a 20 4f 74 68 65 72 77  }.  .  /* Otherw
15cf0 69 73 65 20 73 65 65 20 69 66 20 73 6f 6d 65 20  ise see if some 
15d00 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20 68 6f  other process ho
15d10 6c 64 73 20 69 74 2e 20 2a 2f 0a 20 20 69 66 28  lds it. */.  if(
15d20 20 21 72 65 73 65 72 76 65 64 20 29 7b 0a 20 20   !reserved ){.  
15d30 20 20 2f 2a 20 61 74 74 65 6d 70 74 20 74 6f 20    /* attempt to 
15d40 67 65 74 20 74 68 65 20 6c 6f 63 6b 20 2a 2f 0a  get the lock */.
15d50 20 20 20 20 69 6e 74 20 6c 72 63 20 3d 20 72 6f      int lrc = ro
15d60 62 75 73 74 5f 66 6c 6f 63 6b 28 70 46 69 6c 65  bust_flock(pFile
15d70 2d 3e 68 2c 20 4c 4f 43 4b 5f 45 58 20 7c 20 4c  ->h, LOCK_EX | L
15d80 4f 43 4b 5f 4e 42 29 3b 0a 20 20 20 20 69 66 28  OCK_NB);.    if(
15d90 20 21 6c 72 63 20 29 7b 0a 20 20 20 20 20 20 2f   !lrc ){.      /
15da0 2a 20 67 6f 74 20 74 68 65 20 6c 6f 63 6b 2c 20  * got the lock, 
15db0 75 6e 6c 6f 63 6b 20 69 74 20 2a 2f 0a 20 20 20  unlock it */.   
15dc0 20 20 20 6c 72 63 20 3d 20 72 6f 62 75 73 74 5f     lrc = robust_
15dd0 66 6c 6f 63 6b 28 70 46 69 6c 65 2d 3e 68 2c 20  flock(pFile->h, 
15de0 4c 4f 43 4b 5f 55 4e 29 3b 0a 20 20 20 20 20 20  LOCK_UN);.      
15df0 69 66 20 28 20 6c 72 63 20 29 20 7b 0a 20 20 20  if ( lrc ) {.   
15e00 20 20 20 20 20 69 6e 74 20 74 45 72 72 6e 6f 20       int tErrno 
15e10 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20 20  = errno;.       
15e20 20 2f 2a 20 75 6e 6c 6f 63 6b 20 66 61 69 6c 65   /* unlock faile
15e30 64 20 77 69 74 68 20 61 6e 20 65 72 72 6f 72 20  d with an error 
15e40 2a 2f 0a 23 69 66 20 4f 53 4c 4f 43 4b 49 4e 47  */.#if OSLOCKING
15e50 5f 43 48 45 43 4b 5f 42 55 53 59 5f 49 4f 45 52  _CHECK_BUSY_IOER
15e60 52 0a 20 20 20 20 20 20 20 20 6c 72 63 20 3d 20  R.        lrc = 
15e70 73 71 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d 50  sqliteErrorFromP
15e80 6f 73 69 78 45 72 72 6f 72 28 74 45 72 72 6e 6f  osixError(tErrno
15e90 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55  , SQLITE_IOERR_U
15ea0 4e 4c 4f 43 4b 29 3b 0a 23 65 6c 73 65 20 0a 20  NLOCK);.#else . 
15eb0 20 20 20 20 20 20 20 6c 72 63 20 3d 20 53 51 4c         lrc = SQL
15ec0 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b  ITE_IOERR_UNLOCK
15ed0 3b 20 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20  ; .#endif.      
15ee0 20 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45 52    if( IS_LOCK_ER
15ef0 52 4f 52 28 6c 72 63 29 20 29 7b 0a 20 20 20 20  ROR(lrc) ){.    
15f00 20 20 20 20 20 20 73 74 6f 72 65 4c 61 73 74 45        storeLastE
15f10 72 72 6e 6f 28 70 46 69 6c 65 2c 20 74 45 72 72  rrno(pFile, tErr
15f20 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72  no);.          r
15f30 63 20 3d 20 6c 72 63 3b 0a 20 20 20 20 20 20 20  c = lrc;.       
15f40 20 7d 0a 20 20 20 20 20 20 20 20 73 74 6f 72 65   }.        store
15f50 4c 61 73 74 45 72 72 6e 6f 28 70 46 69 6c 65 2c  LastErrno(pFile,
15f60 20 74 45 72 72 6e 6f 29 3b 0a 20 20 20 20 20 20   tErrno);.      
15f70 20 20 72 63 20 3d 20 6c 72 63 3b 0a 20 20 20 20    rc = lrc;.    
15f80 20 20 7d 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b    }.    } else {
15f90 0a 20 20 20 20 20 20 69 6e 74 20 74 45 72 72 6e  .      int tErrn
15fa0 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20  o = errno;.     
15fb0 20 72 65 73 65 72 76 65 64 20 3d 20 31 3b 0a 20   reserved = 1;. 
15fc0 20 20 20 20 20 2f 2a 20 73 6f 6d 65 6f 6e 65 20       /* someone 
15fd0 65 6c 73 65 20 6d 69 67 68 74 20 68 61 76 65 20  else might have 
15fe0 69 74 20 72 65 73 65 72 76 65 64 20 2a 2f 0a 20  it reserved */. 
15ff0 20 20 20 20 20 6c 72 63 20 3d 20 73 71 6c 69 74       lrc = sqlit
16000 65 45 72 72 6f 72 46 72 6f 6d 50 6f 73 69 78 45  eErrorFromPosixE
16010 72 72 6f 72 28 74 45 72 72 6e 6f 2c 20 53 51 4c  rror(tErrno, SQL
16020 49 54 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b 29 3b  ITE_IOERR_LOCK);
16030 20 0a 20 20 20 20 20 20 69 66 28 20 49 53 5f 4c   .      if( IS_L
16040 4f 43 4b 5f 45 52 52 4f 52 28 6c 72 63 29 20 29  OCK_ERROR(lrc) )
16050 7b 0a 20 20 20 20 20 20 20 20 73 74 6f 72 65 4c  {.        storeL
16060 61 73 74 45 72 72 6e 6f 28 70 46 69 6c 65 2c 20  astErrno(pFile, 
16070 74 45 72 72 6e 6f 29 3b 0a 20 20 20 20 20 20 20  tErrno);.       
16080 20 72 63 20 3d 20 6c 72 63 3b 0a 20 20 20 20 20   rc = lrc;.     
16090 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 4f   }.    }.  }.  O
160a0 53 54 52 41 43 45 28 28 22 54 45 53 54 20 57 52  STRACE(("TEST WR
160b0 2d 4c 4f 43 4b 20 25 64 20 25 64 20 25 64 20 28  -LOCK %d %d %d (
160c0 66 6c 6f 63 6b 29 5c 6e 22 2c 20 70 46 69 6c 65  flock)\n", pFile
160d0 2d 3e 68 2c 20 72 63 2c 20 72 65 73 65 72 76 65  ->h, rc, reserve
160e0 64 29 29 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c  d));..#ifdef SQL
160f0 49 54 45 5f 49 47 4e 4f 52 45 5f 46 4c 4f 43 4b  ITE_IGNORE_FLOCK
16100 5f 4c 4f 43 4b 5f 45 52 52 4f 52 53 0a 20 20 69  _LOCK_ERRORS.  i
16110 66 28 20 28 72 63 20 26 20 53 51 4c 49 54 45 5f  f( (rc & SQLITE_
16120 49 4f 45 52 52 29 20 3d 3d 20 53 51 4c 49 54 45  IOERR) == SQLITE
16130 5f 49 4f 45 52 52 20 29 7b 0a 20 20 20 20 72 63  _IOERR ){.    rc
16140 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
16150 20 20 72 65 73 65 72 76 65 64 3d 31 3b 0a 20 20    reserved=1;.  
16160 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
16170 54 45 5f 49 47 4e 4f 52 45 5f 46 4c 4f 43 4b 5f  TE_IGNORE_FLOCK_
16180 4c 4f 43 4b 5f 45 52 52 4f 52 53 20 2a 2f 0a 20  LOCK_ERRORS */. 
16190 20 2a 70 52 65 73 4f 75 74 20 3d 20 72 65 73 65   *pResOut = rese
161a0 72 76 65 64 3b 0a 20 20 72 65 74 75 72 6e 20 72  rved;.  return r
161b0 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 6b  c;.}../*.** Lock
161c0 20 74 68 65 20 66 69 6c 65 20 77 69 74 68 20 74   the file with t
161d0 68 65 20 6c 6f 63 6b 20 73 70 65 63 69 66 69 65  he lock specifie
161e0 64 20 62 79 20 70 61 72 61 6d 65 74 65 72 20 65  d by parameter e
161f0 46 69 6c 65 4c 6f 63 6b 20 2d 20 6f 6e 65 0a 2a  FileLock - one.*
16200 2a 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  * of the followi
16210 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28 31  ng:.**.**     (1
16220 29 20 53 48 41 52 45 44 5f 4c 4f 43 4b 0a 2a 2a  ) SHARED_LOCK.**
16230 20 20 20 20 20 28 32 29 20 52 45 53 45 52 56 45       (2) RESERVE
16240 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 33  D_LOCK.**     (3
16250 29 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 0a 2a  ) PENDING_LOCK.*
16260 2a 20 20 20 20 20 28 34 29 20 45 58 43 4c 55 53  *     (4) EXCLUS
16270 49 56 45 5f 4c 4f 43 4b 0a 2a 2a 0a 2a 2a 20 53  IVE_LOCK.**.** S
16280 6f 6d 65 74 69 6d 65 73 20 77 68 65 6e 20 72 65  ometimes when re
16290 71 75 65 73 74 69 6e 67 20 6f 6e 65 20 6c 6f 63  questing one loc
162a0 6b 20 73 74 61 74 65 2c 20 61 64 64 69 74 69 6f  k state, additio
162b0 6e 61 6c 20 6c 6f 63 6b 20 73 74 61 74 65 73 0a  nal lock states.
162c0 2a 2a 20 61 72 65 20 69 6e 73 65 72 74 65 64 20  ** are inserted 
162d0 69 6e 20 62 65 74 77 65 65 6e 2e 20 20 54 68 65  in between.  The
162e0 20 6c 6f 63 6b 69 6e 67 20 6d 69 67 68 74 20 66   locking might f
162f0 61 69 6c 20 6f 6e 20 6f 6e 65 20 6f 66 20 74 68  ail on one of th
16300 65 20 6c 61 74 65 72 0a 2a 2a 20 74 72 61 6e 73  e later.** trans
16310 69 74 69 6f 6e 73 20 6c 65 61 76 69 6e 67 20 74  itions leaving t
16320 68 65 20 6c 6f 63 6b 20 73 74 61 74 65 20 64 69  he lock state di
16330 66 66 65 72 65 6e 74 20 66 72 6f 6d 20 77 68 61  fferent from wha
16340 74 20 69 74 20 73 74 61 72 74 65 64 20 62 75 74  t it started but
16350 0a 2a 2a 20 73 74 69 6c 6c 20 73 68 6f 72 74 20  .** still short 
16360 6f 66 20 69 74 73 20 67 6f 61 6c 2e 20 20 54 68  of its goal.  Th
16370 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 68 61 72  e following char
16380 74 20 73 68 6f 77 73 20 74 68 65 20 61 6c 6c 6f  t shows the allo
16390 77 65 64 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f  wed.** transitio
163a0 6e 73 20 61 6e 64 20 74 68 65 20 69 6e 73 65 72  ns and the inser
163b0 74 65 64 20 69 6e 74 65 72 6d 65 64 69 61 74 65  ted intermediate
163c0 20 73 74 61 74 65 73 3a 0a 2a 2a 0a 2a 2a 20 20   states:.**.**  
163d0 20 20 55 4e 4c 4f 43 4b 45 44 20 2d 3e 20 53 48    UNLOCKED -> SH
163e0 41 52 45 44 0a 2a 2a 20 20 20 20 53 48 41 52 45  ARED.**    SHARE
163f0 44 20 2d 3e 20 52 45 53 45 52 56 45 44 0a 2a 2a  D -> RESERVED.**
16400 20 20 20 20 53 48 41 52 45 44 20 2d 3e 20 28 50      SHARED -> (P
16410 45 4e 44 49 4e 47 29 20 2d 3e 20 45 58 43 4c 55  ENDING) -> EXCLU
16420 53 49 56 45 0a 2a 2a 20 20 20 20 52 45 53 45 52  SIVE.**    RESER
16430 56 45 44 20 2d 3e 20 28 50 45 4e 44 49 4e 47 29  VED -> (PENDING)
16440 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a   -> EXCLUSIVE.**
16450 20 20 20 20 50 45 4e 44 49 4e 47 20 2d 3e 20 45      PENDING -> E
16460 58 43 4c 55 53 49 56 45 0a 2a 2a 0a 2a 2a 20 66  XCLUSIVE.**.** f
16470 6c 6f 63 6b 28 29 20 6f 6e 6c 79 20 72 65 61 6c  lock() only real
16480 6c 79 20 73 75 70 70 6f 72 74 20 45 58 43 4c 55  ly support EXCLU
16490 53 49 56 45 20 6c 6f 63 6b 73 2e 20 20 57 65 20  SIVE locks.  We 
164a0 74 72 61 63 6b 20 69 6e 74 65 72 6d 65 64 69 61  track intermedia
164b0 74 65 0a 2a 2a 20 6c 6f 63 6b 20 73 74 61 74 65  te.** lock state
164c0 73 20 69 6e 20 74 68 65 20 73 71 6c 69 74 65 33  s in the sqlite3
164d0 5f 66 69 6c 65 20 73 74 72 75 63 74 75 72 65 2c  _file structure,
164e0 20 62 75 74 20 61 6c 6c 20 6c 6f 63 6b 73 20 53   but all locks S
164f0 48 41 52 45 44 20 6f 72 0a 2a 2a 20 61 62 6f 76  HARED or.** abov
16500 65 20 61 72 65 20 72 65 61 6c 6c 79 20 45 58 43  e are really EXC
16510 4c 55 53 49 56 45 20 6c 6f 63 6b 73 20 61 6e 64  LUSIVE locks and
16520 20 65 78 63 6c 75 64 65 20 61 6c 6c 20 6f 74 68   exclude all oth
16530 65 72 20 70 72 6f 63 65 73 73 65 73 20 66 72 6f  er processes fro
16540 6d 0a 2a 2a 20 61 63 63 65 73 73 20 74 68 65 20  m.** access the 
16550 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  file..**.** This
16560 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 6f 6e   routine will on
16570 6c 79 20 69 6e 63 72 65 61 73 65 20 61 20 6c 6f  ly increase a lo
16580 63 6b 2e 20 20 55 73 65 20 74 68 65 20 73 71 6c  ck.  Use the sql
16590 69 74 65 33 4f 73 55 6e 6c 6f 63 6b 28 29 0a 2a  ite3OsUnlock().*
165a0 2a 20 72 6f 75 74 69 6e 65 20 74 6f 20 6c 6f 77  * routine to low
165b0 65 72 20 61 20 6c 6f 63 6b 69 6e 67 20 6c 65 76  er a locking lev
165c0 65 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  el..*/.static in
165d0 74 20 66 6c 6f 63 6b 4c 6f 63 6b 28 73 71 6c 69  t flockLock(sqli
165e0 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e  te3_file *id, in
165f0 74 20 65 46 69 6c 65 4c 6f 63 6b 29 20 7b 0a 20  t eFileLock) {. 
16600 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
16610 5f 4f 4b 3b 0a 20 20 75 6e 69 78 46 69 6c 65 20  _OK;.  unixFile 
16620 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69  *pFile = (unixFi
16630 6c 65 2a 29 69 64 3b 0a 0a 20 20 61 73 73 65 72  le*)id;..  asser
16640 74 28 20 70 46 69 6c 65 20 29 3b 0a 0a 20 20 2f  t( pFile );..  /
16650 2a 20 69 66 20 77 65 20 61 6c 72 65 61 64 79 20  * if we already 
16660 68 61 76 65 20 61 20 6c 6f 63 6b 2c 20 69 74 20  have a lock, it 
16670 69 73 20 65 78 63 6c 75 73 69 76 65 2e 20 20 0a  is exclusive.  .
16680 20 20 2a 2a 20 4a 75 73 74 20 61 64 6a 75 73 74    ** Just adjust
16690 20 6c 65 76 65 6c 20 61 6e 64 20 70 75 6e 74 20   level and punt 
166a0 6f 6e 20 6f 75 74 74 61 20 68 65 72 65 2e 20 2a  on outta here. *
166b0 2f 0a 20 20 69 66 20 28 70 46 69 6c 65 2d 3e 65  /.  if (pFile->e
166c0 46 69 6c 65 4c 6f 63 6b 20 3e 20 4e 4f 5f 4c 4f  FileLock > NO_LO
166d0 43 4b 29 20 7b 0a 20 20 20 20 70 46 69 6c 65 2d  CK) {.    pFile-
166e0 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 65 46 69  >eFileLock = eFi
166f0 6c 65 4c 6f 63 6b 3b 0a 20 20 20 20 72 65 74 75  leLock;.    retu
16700 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
16710 7d 0a 20 20 0a 20 20 2f 2a 20 67 72 61 62 20 61  }.  .  /* grab a
16720 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b  n exclusive lock
16730 20 2a 2f 0a 20 20 0a 20 20 69 66 20 28 72 6f 62   */.  .  if (rob
16740 75 73 74 5f 66 6c 6f 63 6b 28 70 46 69 6c 65 2d  ust_flock(pFile-
16750 3e 68 2c 20 4c 4f 43 4b 5f 45 58 20 7c 20 4c 4f  >h, LOCK_EX | LO
16760 43 4b 5f 4e 42 29 29 20 7b 0a 20 20 20 20 69 6e  CK_NB)) {.    in
16770 74 20 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f  t tErrno = errno
16780 3b 0a 20 20 20 20 2f 2a 20 64 69 64 6e 27 74 20  ;.    /* didn't 
16790 67 65 74 2c 20 6d 75 73 74 20 62 65 20 62 75 73  get, must be bus
167a0 79 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73 71  y */.    rc = sq
167b0 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d 50 6f 73  liteErrorFromPos
167c0 69 78 45 72 72 6f 72 28 74 45 72 72 6e 6f 2c 20  ixError(tErrno, 
167d0 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4c 4f 43  SQLITE_IOERR_LOC
167e0 4b 29 3b 0a 20 20 20 20 69 66 28 20 49 53 5f 4c  K);.    if( IS_L
167f0 4f 43 4b 5f 45 52 52 4f 52 28 72 63 29 20 29 7b  OCK_ERROR(rc) ){
16800 0a 20 20 20 20 20 20 73 74 6f 72 65 4c 61 73 74  .      storeLast
16810 45 72 72 6e 6f 28 70 46 69 6c 65 2c 20 74 45 72  Errno(pFile, tEr
16820 72 6e 6f 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 20  rno);.    }.  } 
16830 65 6c 73 65 20 7b 0a 20 20 20 20 2f 2a 20 67 6f  else {.    /* go
16840 74 20 69 74 2c 20 73 65 74 20 74 68 65 20 74 79  t it, set the ty
16850 70 65 20 61 6e 64 20 72 65 74 75 72 6e 20 6f 6b  pe and return ok
16860 20 2a 2f 0a 20 20 20 20 70 46 69 6c 65 2d 3e 65   */.    pFile->e
16870 46 69 6c 65 4c 6f 63 6b 20 3d 20 65 46 69 6c 65  FileLock = eFile
16880 4c 6f 63 6b 3b 0a 20 20 7d 0a 20 20 4f 53 54 52  Lock;.  }.  OSTR
16890 41 43 45 28 28 22 4c 4f 43 4b 20 20 20 20 25 64  ACE(("LOCK    %d
168a0 20 25 73 20 25 73 20 28 66 6c 6f 63 6b 29 5c 6e   %s %s (flock)\n
168b0 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 61 7a 46  ", pFile->h, azF
168c0 69 6c 65 4c 6f 63 6b 28 65 46 69 6c 65 4c 6f 63  ileLock(eFileLoc
168d0 6b 29 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20  k), .           
168e0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 3f 20  rc==SQLITE_OK ? 
168f0 22 6f 6b 22 20 3a 20 22 66 61 69 6c 65 64 22 29  "ok" : "failed")
16900 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  );.#ifdef SQLITE
16910 5f 49 47 4e 4f 52 45 5f 46 4c 4f 43 4b 5f 4c 4f  _IGNORE_FLOCK_LO
16920 43 4b 5f 45 52 52 4f 52 53 0a 20 20 69 66 28 20  CK_ERRORS.  if( 
16930 28 72 63 20 26 20 53 51 4c 49 54 45 5f 49 4f 45  (rc & SQLITE_IOE
16940 52 52 29 20 3d 3d 20 53 51 4c 49 54 45 5f 49 4f  RR) == SQLITE_IO
16950 45 52 52 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  ERR ){.    rc = 
16960 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 7d  SQLITE_BUSY;.  }
16970 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
16980 45 5f 49 47 4e 4f 52 45 5f 46 4c 4f 43 4b 5f 4c  E_IGNORE_FLOCK_L
16990 4f 43 4b 5f 45 52 52 4f 52 53 20 2a 2f 0a 20 20  OCK_ERRORS */.  
169a0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f  return rc;.}.../
169b0 2a 0a 2a 2a 20 4c 6f 77 65 72 20 74 68 65 20 6c  *.** Lower the l
169c0 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 6e 20  ocking level on 
169d0 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
169e0 70 46 69 6c 65 20 74 6f 20 65 46 69 6c 65 4c 6f  pFile to eFileLo
169f0 63 6b 2e 20 20 65 46 69 6c 65 4c 6f 63 6b 0a 2a  ck.  eFileLock.*
16a00 2a 20 6d 75 73 74 20 62 65 20 65 69 74 68 65 72  * must be either
16a10 20 4e 4f 5f 4c 4f 43 4b 20 6f 72 20 53 48 41 52   NO_LOCK or SHAR
16a20 45 44 5f 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 49  ED_LOCK..**.** I
16a30 66 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65  f the locking le
16a40 76 65 6c 20 6f 66 20 74 68 65 20 66 69 6c 65 20  vel of the file 
16a50 64 65 73 63 72 69 70 74 6f 72 20 69 73 20 61 6c  descriptor is al
16a60 72 65 61 64 79 20 61 74 20 6f 72 20 62 65 6c 6f  ready at or belo
16a70 77 0a 2a 2a 20 74 68 65 20 72 65 71 75 65 73 74  w.** the request
16a80 65 64 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c  ed locking level
16a90 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  , this routine i
16aa0 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74  s a no-op..*/.st
16ab0 61 74 69 63 20 69 6e 74 20 66 6c 6f 63 6b 55 6e  atic int flockUn
16ac0 6c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c  lock(sqlite3_fil
16ad0 65 20 2a 69 64 2c 20 69 6e 74 20 65 46 69 6c 65  e *id, int eFile
16ae0 4c 6f 63 6b 29 20 7b 0a 20 20 75 6e 69 78 46 69  Lock) {.  unixFi
16af0 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69  le *pFile = (uni
16b00 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 0a 20 20  xFile*)id;.  .  
16b10 61 73 73 65 72 74 28 20 70 46 69 6c 65 20 29 3b  assert( pFile );
16b20 0a 20 20 4f 53 54 52 41 43 45 28 28 22 55 4e 4c  .  OSTRACE(("UNL
16b30 4f 43 4b 20 20 25 64 20 25 64 20 77 61 73 20 25  OCK  %d %d was %
16b40 64 20 70 69 64 3d 25 64 20 28 66 6c 6f 63 6b 29  d pid=%d (flock)
16b50 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 65  \n", pFile->h, e
16b60 46 69 6c 65 4c 6f 63 6b 2c 0a 20 20 20 20 20 20  FileLock,.      
16b70 20 20 20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c       pFile->eFil
16b80 65 4c 6f 63 6b 2c 20 6f 73 47 65 74 70 69 64 28  eLock, osGetpid(
16b90 30 29 29 29 3b 0a 20 20 61 73 73 65 72 74 28 20  0)));.  assert( 
16ba0 65 46 69 6c 65 4c 6f 63 6b 3c 3d 53 48 41 52 45  eFileLock<=SHARE
16bb0 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 0a 20 20 2f  D_LOCK );.  .  /
16bc0 2a 20 6e 6f 2d 6f 70 20 69 66 20 70 6f 73 73 69  * no-op if possi
16bd0 62 6c 65 20 2a 2f 0a 20 20 69 66 28 20 70 46 69  ble */.  if( pFi
16be0 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d 65  le->eFileLock==e
16bf0 46 69 6c 65 4c 6f 63 6b 20 29 7b 0a 20 20 20 20  FileLock ){.    
16c00 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
16c10 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 73 68  ;.  }.  .  /* sh
16c20 61 72 65 64 20 63 61 6e 20 6a 75 73 74 20 62 65  ared can just be
16c30 20 73 65 74 20 62 65 63 61 75 73 65 20 77 65 20   set because we 
16c40 61 6c 77 61 79 73 20 68 61 76 65 20 61 6e 20 65  always have an e
16c50 78 63 6c 75 73 69 76 65 20 2a 2f 0a 20 20 69 66  xclusive */.  if
16c60 20 28 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41   (eFileLock==SHA
16c70 52 45 44 5f 4c 4f 43 4b 29 20 7b 0a 20 20 20 20  RED_LOCK) {.    
16c80 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  pFile->eFileLock
16c90 20 3d 20 65 46 69 6c 65 4c 6f 63 6b 3b 0a 20 20   = eFileLock;.  
16ca0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
16cb0 4f 4b 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20  OK;.  }.  .  /* 
16cc0 6e 6f 2c 20 72 65 61 6c 6c 79 2c 20 75 6e 6c 6f  no, really, unlo
16cd0 63 6b 2e 20 2a 2f 0a 20 20 69 66 28 20 72 6f 62  ck. */.  if( rob
16ce0 75 73 74 5f 66 6c 6f 63 6b 28 70 46 69 6c 65 2d  ust_flock(pFile-
16cf0 3e 68 2c 20 4c 4f 43 4b 5f 55 4e 29 20 29 7b 0a  >h, LOCK_UN) ){.
16d00 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 49 47  #ifdef SQLITE_IG
16d10 4e 4f 52 45 5f 46 4c 4f 43 4b 5f 4c 4f 43 4b 5f  NORE_FLOCK_LOCK_
16d20 45 52 52 4f 52 53 0a 20 20 20 20 72 65 74 75 72  ERRORS.    retur
16d30 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 23 65 6e  n SQLITE_OK;.#en
16d40 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 49 47  dif /* SQLITE_IG
16d50 4e 4f 52 45 5f 46 4c 4f 43 4b 5f 4c 4f 43 4b 5f  NORE_FLOCK_LOCK_
16d60 45 52 52 4f 52 53 20 2a 2f 0a 20 20 20 20 72 65  ERRORS */.    re
16d70 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52  turn SQLITE_IOER
16d80 52 5f 55 4e 4c 4f 43 4b 3b 0a 20 20 7d 65 6c 73  R_UNLOCK;.  }els
16d90 65 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 65 46  e{.    pFile->eF
16da0 69 6c 65 4c 6f 63 6b 20 3d 20 4e 4f 5f 4c 4f 43  ileLock = NO_LOC
16db0 4b 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  K;.    return SQ
16dc0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 7d 0a 0a  LITE_OK;.  }.}..
16dd0 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 20 66 69  /*.** Close a fi
16de0 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  le..*/.static in
16df0 74 20 66 6c 6f 63 6b 43 6c 6f 73 65 28 73 71 6c  t flockClose(sql
16e00 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 29 20 7b  ite3_file *id) {
16e10 0a 20 20 61 73 73 65 72 74 28 20 69 64 21 3d 30  .  assert( id!=0
16e20 20 29 3b 0a 20 20 66 6c 6f 63 6b 55 6e 6c 6f 63   );.  flockUnloc
16e30 6b 28 69 64 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a  k(id, NO_LOCK);.
16e40 20 20 72 65 74 75 72 6e 20 63 6c 6f 73 65 55 6e    return closeUn
16e50 69 78 46 69 6c 65 28 69 64 29 3b 0a 7d 0a 0a 23  ixFile(id);.}..#
16e60 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
16e70 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53  ENABLE_LOCKING_S
16e80 54 59 4c 45 20 26 26 20 21 4f 53 5f 56 58 57 4f  TYLE && !OS_VXWO
16e90 52 4b 20 2a 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a  RK */../********
16ea0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64 20  *********** End 
16eb0 6f 66 20 74 68 65 20 66 6c 6f 63 6b 20 6c 6f 63  of the flock loc
16ec0 6b 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  k implementation
16ed0 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a   ***************
16ee0 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ******.*********
16ef0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
16f00 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
16f10 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
16f20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
16f30 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a  *****/../*******
16f40 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
16f50 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 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 0a 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 20 42 65 67 69 6e 20 4e 61 6d 65 64 20 53 65 6d   Begin Named Sem
16fb0 61 70 68 6f 72 65 20 4c 6f 63 6b 69 6e 67 20 2a  aphore Locking *
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 0a 2a 2a 0a 2a 2a 20 4e 61  *******.**.** Na
16fe0 6d 65 64 20 73 65 6d 61 70 68 6f 72 65 20 6c 6f  med semaphore lo
16ff0 63 6b 69 6e 67 20 69 73 20 6f 6e 6c 79 20 73 75  cking is only su
17000 70 70 6f 72 74 65 64 20 6f 6e 20 56 78 57 6f 72  pported on VxWor
17010 6b 73 2e 0a 2a 2a 0a 2a 2a 20 53 65 6d 61 70 68  ks..**.** Semaph
17020 6f 72 65 20 6c 6f 63 6b 69 6e 67 20 69 73 20 6c  ore locking is l
17030 69 6b 65 20 64 6f 74 2d 6c 6f 63 6b 20 61 6e 64  ike dot-lock and
17040 20 66 6c 6f 63 6b 20 69 6e 20 74 68 61 74 20 69   flock in that i
17050 74 20 72 65 61 6c 6c 79 20 6f 6e 6c 79 0a 2a 2a  t really only.**
17060 20 73 75 70 70 6f 72 74 73 20 45 58 43 4c 55 53   supports EXCLUS
17070 49 56 45 20 6c 6f 63 6b 69 6e 67 2e 20 20 4f 6e  IVE locking.  On
17080 6c 79 20 61 20 73 69 6e 67 6c 65 20 70 72 6f 63  ly a single proc
17090 65 73 73 20 63 61 6e 20 72 65 61 64 20 6f 72 20  ess can read or 
170a0 77 72 69 74 65 0a 2a 2a 20 74 68 65 20 64 61 74  write.** the dat
170b0 61 62 61 73 65 20 66 69 6c 65 20 61 74 20 61 20  abase file at a 
170c0 74 69 6d 65 2e 20 20 54 68 69 73 20 72 65 64 75  time.  This redu
170d0 63 65 73 20 70 6f 74 65 6e 74 69 61 6c 20 63 6f  ces potential co
170e0 6e 63 75 72 72 65 6e 63 79 2c 20 62 75 74 0a 2a  ncurrency, but.*
170f0 2a 20 6d 61 6b 65 73 20 74 68 65 20 6c 6f 63 6b  * makes the lock
17100 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   implementation 
17110 6d 75 63 68 20 65 61 73 69 65 72 2e 0a 2a 2f 0a  much easier..*/.
17120 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 0a  #if OS_VXWORKS..
17130 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
17140 6e 65 20 63 68 65 63 6b 73 20 69 66 20 74 68 65  ne checks if the
17150 72 65 20 69 73 20 61 20 52 45 53 45 52 56 45 44  re is a RESERVED
17160 20 6c 6f 63 6b 20 68 65 6c 64 20 6f 6e 20 74 68   lock held on th
17170 65 20 73 70 65 63 69 66 69 65 64 0a 2a 2a 20 66  e specified.** f
17180 69 6c 65 20 62 79 20 74 68 69 73 20 6f 72 20 61  ile by this or a
17190 6e 79 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73  ny other process
171a0 2e 20 49 66 20 73 75 63 68 20 61 20 6c 6f 63 6b  . If such a lock
171b0 20 69 73 20 68 65 6c 64 2c 20 73 65 74 20 2a 70   is held, set *p
171c0 52 65 73 4f 75 74 0a 2a 2a 20 74 6f 20 61 20 6e  ResOut.** to a n
171d0 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75 65 20 6f 74  on-zero value ot
171e0 68 65 72 77 69 73 65 20 2a 70 52 65 73 4f 75 74  herwise *pResOut
171f0 20 69 73 20 73 65 74 20 74 6f 20 7a 65 72 6f 2e   is set to zero.
17200 20 20 54 68 65 20 72 65 74 75 72 6e 20 76 61 6c    The return val
17210 75 65 0a 2a 2a 20 69 73 20 73 65 74 20 74 6f 20  ue.** is set to 
17220 53 51 4c 49 54 45 5f 4f 4b 20 75 6e 6c 65 73 73  SQLITE_OK unless
17230 20 61 6e 20 49 2f 4f 20 65 72 72 6f 72 20 6f 63   an I/O error oc
17240 63 75 72 73 20 64 75 72 69 6e 67 20 6c 6f 63 6b  curs during lock
17250 20 63 68 65 63 6b 69 6e 67 2e 0a 2a 2f 0a 73 74   checking..*/.st
17260 61 74 69 63 20 69 6e 74 20 73 65 6d 58 43 68 65  atic int semXChe
17270 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 28 73  ckReservedLock(s
17280 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c  qlite3_file *id,
17290 20 69 6e 74 20 2a 70 52 65 73 4f 75 74 29 20 7b   int *pResOut) {
172a0 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
172b0 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 72 65 73  TE_OK;.  int res
172c0 65 72 76 65 64 20 3d 20 30 3b 0a 20 20 75 6e 69  erved = 0;.  uni
172d0 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28  xFile *pFile = (
172e0 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 0a 20  unixFile*)id;.. 
172f0 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72   SimulateIOError
17300 28 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ( return SQLITE_
17310 49 4f 45 52 52 5f 43 48 45 43 4b 52 45 53 45 52  IOERR_CHECKRESER
17320 56 45 44 4c 4f 43 4b 3b 20 29 3b 0a 20 20 0a 20  VEDLOCK; );.  . 
17330 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 20 29   assert( pFile )
17340 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 69 66  ;..  /* Check if
17350 20 61 20 74 68 72 65 61 64 20 69 6e 20 74 68 69   a thread in thi
17360 73 20 70 72 6f 63 65 73 73 20 68 6f 6c 64 73 20  s process holds 
17370 73 75 63 68 20 61 20 6c 6f 63 6b 20 2a 2f 0a 20  such a lock */. 
17380 20 69 66 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c   if( pFile->eFil
17390 65 4c 6f 63 6b 3e 53 48 41 52 45 44 5f 4c 4f 43  eLock>SHARED_LOC
173a0 4b 20 29 7b 0a 20 20 20 20 72 65 73 65 72 76 65  K ){.    reserve
173b0 64 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 0a 20 20  d = 1;.  }.  .  
173c0 2f 2a 20 4f 74 68 65 72 77 69 73 65 20 73 65 65  /* Otherwise see
173d0 20 69 66 20 73 6f 6d 65 20 6f 74 68 65 72 20 70   if some other p
173e0 72 6f 63 65 73 73 20 68 6f 6c 64 73 20 69 74 2e  rocess holds it.
173f0 20 2a 2f 0a 20 20 69 66 28 20 21 72 65 73 65 72   */.  if( !reser
17400 76 65 64 20 29 7b 0a 20 20 20 20 73 65 6d 5f 74  ved ){.    sem_t
17410 20 2a 70 53 65 6d 20 3d 20 70 46 69 6c 65 2d 3e   *pSem = pFile->
17420 70 49 6e 6f 64 65 2d 3e 70 53 65 6d 3b 0a 0a 20  pInode->pSem;.. 
17430 20 20 20 69 66 28 20 73 65 6d 5f 74 72 79 77 61     if( sem_trywa
17440 69 74 28 70 53 65 6d 29 3d 3d 2d 31 20 29 7b 0a  it(pSem)==-1 ){.
17450 20 20 20 20 20 20 69 6e 74 20 74 45 72 72 6e 6f        int tErrno
17460 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20   = errno;.      
17470 69 66 28 20 45 41 47 41 49 4e 20 21 3d 20 74 45  if( EAGAIN != tE
17480 72 72 6e 6f 20 29 7b 0a 20 20 20 20 20 20 20 20  rrno ){.        
17490 72 63 20 3d 20 73 71 6c 69 74 65 45 72 72 6f 72  rc = sqliteError
174a0 46 72 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28 74  FromPosixError(t
174b0 45 72 72 6e 6f 2c 20 53 51 4c 49 54 45 5f 49 4f  Errno, SQLITE_IO
174c0 45 52 52 5f 43 48 45 43 4b 52 45 53 45 52 56 45  ERR_CHECKRESERVE
174d0 44 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 20 20  DLOCK);.        
174e0 73 74 6f 72 65 4c 61 73 74 45 72 72 6e 6f 28 70  storeLastErrno(p
174f0 46 69 6c 65 2c 20 74 45 72 72 6e 6f 29 3b 0a 20  File, tErrno);. 
17500 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20       } else {.  
17510 20 20 20 20 20 20 2f 2a 20 73 6f 6d 65 6f 6e 65        /* someone
17520 20 65 6c 73 65 20 68 61 73 20 74 68 65 20 6c 6f   else has the lo
17530 63 6b 20 77 68 65 6e 20 77 65 20 61 72 65 20 69  ck when we are i
17540 6e 20 4e 4f 5f 4c 4f 43 4b 20 2a 2f 0a 20 20 20  n NO_LOCK */.   
17550 20 20 20 20 20 72 65 73 65 72 76 65 64 20 3d 20       reserved = 
17560 28 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63  (pFile->eFileLoc
17570 6b 20 3c 20 53 48 41 52 45 44 5f 4c 4f 43 4b 29  k < SHARED_LOCK)
17580 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65  ;.      }.    }e
17590 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 77 65  lse{.      /* we
175a0 20 63 6f 75 6c 64 20 68 61 76 65 20 69 74 20 69   could have it i
175b0 66 20 77 65 20 77 61 6e 74 20 69 74 20 2a 2f 0a  f we want it */.
175c0 20 20 20 20 20 20 73 65 6d 5f 70 6f 73 74 28 70        sem_post(p
175d0 53 65 6d 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  Sem);.    }.  }.
175e0 20 20 4f 53 54 52 41 43 45 28 28 22 54 45 53 54    OSTRACE(("TEST
175f0 20 57 52 2d 4c 4f 43 4b 20 25 64 20 25 64 20 25   WR-LOCK %d %d %
17600 64 20 28 73 65 6d 29 5c 6e 22 2c 20 70 46 69 6c  d (sem)\n", pFil
17610 65 2d 3e 68 2c 20 72 63 2c 20 72 65 73 65 72 76  e->h, rc, reserv
17620 65 64 29 29 3b 0a 0a 20 20 2a 70 52 65 73 4f 75  ed));..  *pResOu
17630 74 20 3d 20 72 65 73 65 72 76 65 64 3b 0a 20 20  t = reserved;.  
17640 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
17650 0a 2a 2a 20 4c 6f 63 6b 20 74 68 65 20 66 69 6c  .** Lock the fil
17660 65 20 77 69 74 68 20 74 68 65 20 6c 6f 63 6b 20  e with the lock 
17670 73 70 65 63 69 66 69 65 64 20 62 79 20 70 61 72  specified by par
17680 61 6d 65 74 65 72 20 65 46 69 6c 65 4c 6f 63 6b  ameter eFileLock
17690 20 2d 20 6f 6e 65 0a 2a 2a 20 6f 66 20 74 68 65   - one.** of the
176a0 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a   following:.**.*
176b0 2a 20 20 20 20 20 28 31 29 20 53 48 41 52 45 44  *     (1) SHARED
176c0 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 32 29  _LOCK.**     (2)
176d0 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 0a 2a   RESERVED_LOCK.*
176e0 2a 20 20 20 20 20 28 33 29 20 50 45 4e 44 49 4e  *     (3) PENDIN
176f0 47 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 34  G_LOCK.**     (4
17700 29 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b  ) EXCLUSIVE_LOCK
17710 0a 2a 2a 0a 2a 2a 20 53 6f 6d 65 74 69 6d 65 73  .**.** Sometimes
17720 20 77 68 65 6e 20 72 65 71 75 65 73 74 69 6e 67   when requesting
17730 20 6f 6e 65 20 6c 6f 63 6b 20 73 74 61 74 65 2c   one lock state,
17740 20 61 64 64 69 74 69 6f 6e 61 6c 20 6c 6f 63 6b   additional lock
17750 20 73 74 61 74 65 73 0a 2a 2a 20 61 72 65 20 69   states.** are i
17760 6e 73 65 72 74 65 64 20 69 6e 20 62 65 74 77 65  nserted in betwe
17770 65 6e 2e 20 20 54 68 65 20 6c 6f 63 6b 69 6e 67  en.  The locking
17780 20 6d 69 67 68 74 20 66 61 69 6c 20 6f 6e 20 6f   might fail on o
17790 6e 65 20 6f 66 20 74 68 65 20 6c 61 74 65 72 0a  ne of the later.
177a0 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e 73 20 6c  ** transitions l
177b0 65 61 76 69 6e 67 20 74 68 65 20 6c 6f 63 6b 20  eaving the lock 
177c0 73 74 61 74 65 20 64 69 66 66 65 72 65 6e 74 20  state different 
177d0 66 72 6f 6d 20 77 68 61 74 20 69 74 20 73 74 61  from what it sta
177e0 72 74 65 64 20 62 75 74 0a 2a 2a 20 73 74 69 6c  rted but.** stil
177f0 6c 20 73 68 6f 72 74 20 6f 66 20 69 74 73 20 67  l short of its g
17800 6f 61 6c 2e 20 20 54 68 65 20 66 6f 6c 6c 6f 77  oal.  The follow
17810 69 6e 67 20 63 68 61 72 74 20 73 68 6f 77 73 20  ing chart shows 
17820 74 68 65 20 61 6c 6c 6f 77 65 64 0a 2a 2a 20 74  the allowed.** t
17830 72 61 6e 73 69 74 69 6f 6e 73 20 61 6e 64 20 74  ransitions and t
17840 68 65 20 69 6e 73 65 72 74 65 64 20 69 6e 74 65  he inserted inte
17850 72 6d 65 64 69 61 74 65 20 73 74 61 74 65 73 3a  rmediate states:
17860 0a 2a 2a 0a 2a 2a 20 20 20 20 55 4e 4c 4f 43 4b  .**.**    UNLOCK
17870 45 44 20 2d 3e 20 53 48 41 52 45 44 0a 2a 2a 20  ED -> SHARED.** 
17880 20 20 20 53 48 41 52 45 44 20 2d 3e 20 52 45 53     SHARED -> RES
17890 45 52 56 45 44 0a 2a 2a 20 20 20 20 53 48 41 52  ERVED.**    SHAR
178a0 45 44 20 2d 3e 20 28 50 45 4e 44 49 4e 47 29 20  ED -> (PENDING) 
178b0 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20  -> EXCLUSIVE.** 
178c0 20 20 20 52 45 53 45 52 56 45 44 20 2d 3e 20 28     RESERVED -> (
178d0 50 45 4e 44 49 4e 47 29 20 2d 3e 20 45 58 43 4c  PENDING) -> EXCL
178e0 55 53 49 56 45 0a 2a 2a 20 20 20 20 50 45 4e 44  USIVE.**    PEND
178f0 49 4e 47 20 2d 3e 20 45 58 43 4c 55 53 49 56 45  ING -> EXCLUSIVE
17900 0a 2a 2a 0a 2a 2a 20 53 65 6d 61 70 68 6f 72 65  .**.** Semaphore
17910 20 6c 6f 63 6b 73 20 6f 6e 6c 79 20 72 65 61 6c   locks only real
17920 6c 79 20 73 75 70 70 6f 72 74 20 45 58 43 4c 55  ly support EXCLU
17930 53 49 56 45 20 6c 6f 63 6b 73 2e 20 20 57 65 20  SIVE locks.  We 
17940 74 72 61 63 6b 20 69 6e 74 65 72 6d 65 64 69 61  track intermedia
17950 74 65 0a 2a 2a 20 6c 6f 63 6b 20 73 74 61 74 65  te.** lock state
17960 73 20 69 6e 20 74 68 65 20 73 71 6c 69 74 65 33  s in the sqlite3
17970 5f 66 69 6c 65 20 73 74 72 75 63 74 75 72 65 2c  _file structure,
17980 20 62 75 74 20 61 6c 6c 20 6c 6f 63 6b 73 20 53   but all locks S
17990 48 41 52 45 44 20 6f 72 0a 2a 2a 20 61 62 6f 76  HARED or.** abov
179a0 65 20 61 72 65 20 72 65 61 6c 6c 79 20 45 58 43  e are really EXC
179b0 4c 55 53 49 56 45 20 6c 6f 63 6b 73 20 61 6e 64  LUSIVE locks and
179c0 20 65 78 63 6c 75 64 65 20 61 6c 6c 20 6f 74 68   exclude all oth
179d0 65 72 20 70 72 6f 63 65 73 73 65 73 20 66 72 6f  er processes fro
179e0 6d 0a 2a 2a 20 61 63 63 65 73 73 20 74 68 65 20  m.** access the 
179f0 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  file..**.** This
17a00 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 6f 6e   routine will on
17a10 6c 79 20 69 6e 63 72 65 61 73 65 20 61 20 6c 6f  ly increase a lo
17a20 63 6b 2e 20 20 55 73 65 20 74 68 65 20 73 71 6c  ck.  Use the sql
17a30 69 74 65 33 4f 73 55 6e 6c 6f 63 6b 28 29 0a 2a  ite3OsUnlock().*
17a40 2a 20 72 6f 75 74 69 6e 65 20 74 6f 20 6c 6f 77  * routine to low
17a50 65 72 20 61 20 6c 6f 63 6b 69 6e 67 20 6c 65 76  er a locking lev
17a60 65 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  el..*/.static in
17a70 74 20 73 65 6d 58 4c 6f 63 6b 28 73 71 6c 69 74  t semXLock(sqlit
17a80 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74  e3_file *id, int
17a90 20 65 46 69 6c 65 4c 6f 63 6b 29 20 7b 0a 20 20   eFileLock) {.  
17aa0 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20  unixFile *pFile 
17ab0 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b  = (unixFile*)id;
17ac0 0a 20 20 73 65 6d 5f 74 20 2a 70 53 65 6d 20 3d  .  sem_t *pSem =
17ad0 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e   pFile->pInode->
17ae0 70 53 65 6d 3b 0a 20 20 69 6e 74 20 72 63 20 3d  pSem;.  int rc =
17af0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f   SQLITE_OK;..  /
17b00 2a 20 69 66 20 77 65 20 61 6c 72 65 61 64 79 20  * if we already 
17b10 68 61 76 65 20 61 20 6c 6f 63 6b 2c 20 69 74 20  have a lock, it 
17b20 69 73 20 65 78 63 6c 75 73 69 76 65 2e 20 20 0a  is exclusive.  .
17b30 20 20 2a 2a 20 4a 75 73 74 20 61 64 6a 75 73 74    ** Just adjust
17b40 20 6c 65 76 65 6c 20 61 6e 64 20 70 75 6e 74 20   level and punt 
17b50 6f 6e 20 6f 75 74 74 61 20 68 65 72 65 2e 20 2a  on outta here. *
17b60 2f 0a 20 20 69 66 20 28 70 46 69 6c 65 2d 3e 65  /.  if (pFile->e
17b70 46 69 6c 65 4c 6f 63 6b 20 3e 20 4e 4f 5f 4c 4f  FileLock > NO_LO
17b80 43 4b 29 20 7b 0a 20 20 20 20 70 46 69 6c 65 2d  CK) {.    pFile-
17b90 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 65 46 69  >eFileLock = eFi
17ba0 6c 65 4c 6f 63 6b 3b 0a 20 20 20 20 72 63 20 3d  leLock;.    rc =
17bb0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
17bc0 67 6f 74 6f 20 73 65 6d 5f 65 6e 64 5f 6c 6f 63  goto sem_end_loc
17bd0 6b 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 6c  k;.  }.  .  /* l
17be0 6f 63 6b 20 73 65 6d 61 70 68 6f 72 65 20 6e 6f  ock semaphore no
17bf0 77 20 62 75 74 20 62 61 69 6c 20 6f 75 74 20 77  w but bail out w
17c00 68 65 6e 20 61 6c 72 65 61 64 79 20 6c 6f 63 6b  hen already lock
17c10 65 64 2e 20 2a 2f 0a 20 20 69 66 28 20 73 65 6d  ed. */.  if( sem
17c20 5f 74 72 79 77 61 69 74 28 70 53 65 6d 29 3d 3d  _trywait(pSem)==
17c30 2d 31 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53  -1 ){.    rc = S
17c40 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20  QLITE_BUSY;.    
17c50 67 6f 74 6f 20 73 65 6d 5f 65 6e 64 5f 6c 6f 63  goto sem_end_loc
17c60 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 67 6f 74  k;.  }..  /* got
17c70 20 69 74 2c 20 73 65 74 20 74 68 65 20 74 79 70   it, set the typ
17c80 65 20 61 6e 64 20 72 65 74 75 72 6e 20 6f 6b 20  e and return ok 
17c90 2a 2f 0a 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c  */.  pFile->eFil
17ca0 65 4c 6f 63 6b 20 3d 20 65 46 69 6c 65 4c 6f 63  eLock = eFileLoc
17cb0 6b 3b 0a 0a 20 73 65 6d 5f 65 6e 64 5f 6c 6f 63  k;.. sem_end_loc
17cc0 6b 3a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  k:.  return rc;.
17cd0 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 77 65 72 20 74  }../*.** Lower t
17ce0 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c  he locking level
17cf0 20 6f 6e 20 66 69 6c 65 20 64 65 73 63 72 69 70   on file descrip
17d00 74 6f 72 20 70 46 69 6c 65 20 74 6f 20 65 46 69  tor pFile to eFi
17d10 6c 65 4c 6f 63 6b 2e 20 20 65 46 69 6c 65 4c 6f  leLock.  eFileLo
17d20 63 6b 0a 2a 2a 20 6d 75 73 74 20 62 65 20 65 69  ck.** must be ei
17d30 74 68 65 72 20 4e 4f 5f 4c 4f 43 4b 20 6f 72 20  ther NO_LOCK or 
17d40 53 48 41 52 45 44 5f 4c 4f 43 4b 2e 0a 2a 2a 0a  SHARED_LOCK..**.
17d50 2a 2a 20 49 66 20 74 68 65 20 6c 6f 63 6b 69 6e  ** If the lockin
17d60 67 20 6c 65 76 65 6c 20 6f 66 20 74 68 65 20 66  g level of the f
17d70 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 69  ile descriptor i
17d80 73 20 61 6c 72 65 61 64 79 20 61 74 20 6f 72 20  s already at or 
17d90 62 65 6c 6f 77 0a 2a 2a 20 74 68 65 20 72 65 71  below.** the req
17da0 75 65 73 74 65 64 20 6c 6f 63 6b 69 6e 67 20 6c  uested locking l
17db0 65 76 65 6c 2c 20 74 68 69 73 20 72 6f 75 74 69  evel, this routi
17dc0 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a  ne is a no-op..*
17dd0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 65 6d  /.static int sem
17de0 58 55 6e 6c 6f 63 6b 28 73 71 6c 69 74 65 33 5f  XUnlock(sqlite3_
17df0 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 65 46  file *id, int eF
17e00 69 6c 65 4c 6f 63 6b 29 20 7b 0a 20 20 75 6e 69  ileLock) {.  uni
17e10 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28  xFile *pFile = (
17e20 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20  unixFile*)id;.  
17e30 73 65 6d 5f 74 20 2a 70 53 65 6d 20 3d 20 70 46  sem_t *pSem = pF
17e40 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e 70 53 65  ile->pInode->pSe
17e50 6d 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 46  m;..  assert( pF
17e60 69 6c 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ile );.  assert(
17e70 20 70 53 65 6d 20 29 3b 0a 20 20 4f 53 54 52 41   pSem );.  OSTRA
17e80 43 45 28 28 22 55 4e 4c 4f 43 4b 20 20 25 64 20  CE(("UNLOCK  %d 
17e90 25 64 20 77 61 73 20 25 64 20 70 69 64 3d 25 64  %d was %d pid=%d
17ea0 20 28 73 65 6d 29 5c 6e 22 2c 20 70 46 69 6c 65   (sem)\n", pFile
17eb0 2d 3e 68 2c 20 65 46 69 6c 65 4c 6f 63 6b 2c 0a  ->h, eFileLock,.
17ec0 20 20 20 20 20 20 20 20 20 20 20 70 46 69 6c 65             pFile
17ed0 2d 3e 65 46 69 6c 65 4c 6f 63 6b 2c 20 6f 73 47  ->eFileLock, osG
17ee0 65 74 70 69 64 28 30 29 29 29 3b 0a 20 20 61 73  etpid(0)));.  as
17ef0 73 65 72 74 28 20 65 46 69 6c 65 4c 6f 63 6b 3c  sert( eFileLock<
17f00 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a  =SHARED_LOCK );.
17f10 20 20 0a 20 20 2f 2a 20 6e 6f 2d 6f 70 20 69 66    .  /* no-op if
17f20 20 70 6f 73 73 69 62 6c 65 20 2a 2f 0a 20 20 69   possible */.  i
17f30 66 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c  f( pFile->eFileL
17f40 6f 63 6b 3d 3d 65 46 69 6c 65 4c 6f 63 6b 20 29  ock==eFileLock )
17f50 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
17f60 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 0a 20  ITE_OK;.  }.  . 
17f70 20 2f 2a 20 73 68 61 72 65 64 20 63 61 6e 20 6a   /* shared can j
17f80 75 73 74 20 62 65 20 73 65 74 20 62 65 63 61 75  ust be set becau
17f90 73 65 20 77 65 20 61 6c 77 61 79 73 20 68 61 76  se we always hav
17fa0 65 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20 2a  e an exclusive *
17fb0 2f 0a 20 20 69 66 20 28 65 46 69 6c 65 4c 6f 63  /.  if (eFileLoc
17fc0 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 29 20  k==SHARED_LOCK) 
17fd0 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 65 46 69  {.    pFile->eFi
17fe0 6c 65 4c 6f 63 6b 20 3d 20 65 46 69 6c 65 4c 6f  leLock = eFileLo
17ff0 63 6b 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53  ck;.    return S
18000 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20  QLITE_OK;.  }.  
18010 0a 20 20 2f 2a 20 6e 6f 2c 20 72 65 61 6c 6c 79  .  /* no, really
18020 20 75 6e 6c 6f 63 6b 2e 20 2a 2f 0a 20 20 69 66   unlock. */.  if
18030 20 28 20 73 65 6d 5f 70 6f 73 74 28 70 53 65 6d   ( sem_post(pSem
18040 29 3d 3d 2d 31 20 29 20 7b 0a 20 20 20 20 69 6e  )==-1 ) {.    in
18050 74 20 72 63 2c 20 74 45 72 72 6e 6f 20 3d 20 65  t rc, tErrno = e
18060 72 72 6e 6f 3b 0a 20 20 20 20 72 63 20 3d 20 73  rrno;.    rc = s
18070 71 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d 50 6f  qliteErrorFromPo
18080 73 69 78 45 72 72 6f 72 28 74 45 72 72 6e 6f 2c  sixError(tErrno,
18090 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55 4e   SQLITE_IOERR_UN
180a0 4c 4f 43 4b 29 3b 0a 20 20 20 20 69 66 28 20 49  LOCK);.    if( I
180b0 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 72 63 29  S_LOCK_ERROR(rc)
180c0 20 29 7b 0a 20 20 20 20 20 20 73 74 6f 72 65 4c   ){.      storeL
180d0 61 73 74 45 72 72 6e 6f 28 70 46 69 6c 65 2c 20  astErrno(pFile, 
180e0 74 45 72 72 6e 6f 29 3b 0a 20 20 20 20 7d 0a 20  tErrno);.    }. 
180f0 20 20 20 72 65 74 75 72 6e 20 72 63 3b 20 0a 20     return rc; . 
18100 20 7d 0a 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c   }.  pFile->eFil
18110 65 4c 6f 63 6b 20 3d 20 4e 4f 5f 4c 4f 43 4b 3b  eLock = NO_LOCK;
18120 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
18130 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2a 20 43  _OK;.}../*. ** C
18140 6c 6f 73 65 20 61 20 66 69 6c 65 2e 0a 20 2a 2f  lose a file.. */
18150 0a 73 74 61 74 69 63 20 69 6e 74 20 73 65 6d 58  .static int semX
18160 43 6c 6f 73 65 28 73 71 6c 69 74 65 33 5f 66 69  Close(sqlite3_fi
18170 6c 65 20 2a 69 64 29 20 7b 0a 20 20 69 66 28 20  le *id) {.  if( 
18180 69 64 20 29 7b 0a 20 20 20 20 75 6e 69 78 46 69  id ){.    unixFi
18190 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69  le *pFile = (uni
181a0 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 20 20 73  xFile*)id;.    s
181b0 65 6d 58 55 6e 6c 6f 63 6b 28 69 64 2c 20 4e 4f  emXUnlock(id, NO
181c0 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 61 73 73 65  _LOCK);.    asse
181d0 72 74 28 20 70 46 69 6c 65 20 29 3b 0a 20 20 20  rt( pFile );.   
181e0 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28   unixEnterMutex(
181f0 29 3b 0a 20 20 20 20 72 65 6c 65 61 73 65 49 6e  );.    releaseIn
18200 6f 64 65 49 6e 66 6f 28 70 46 69 6c 65 29 3b 0a  odeInfo(pFile);.
18210 20 20 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74      unixLeaveMut
18220 65 78 28 29 3b 0a 20 20 20 20 63 6c 6f 73 65 55  ex();.    closeU
18230 6e 69 78 46 69 6c 65 28 69 64 29 3b 0a 20 20 7d  nixFile(id);.  }
18240 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
18250 5f 4f 4b 3b 0a 7d 0a 0a 23 65 6e 64 69 66 20 2f  _OK;.}..#endif /
18260 2a 20 4f 53 5f 56 58 57 4f 52 4b 53 20 2a 2f 0a  * OS_VXWORKS */.
18270 2f 2a 0a 2a 2a 20 4e 61 6d 65 64 20 73 65 6d 61  /*.** Named sema
18280 70 68 6f 72 65 20 6c 6f 63 6b 69 6e 67 20 69 73  phore locking is
18290 20 6f 6e 6c 79 20 61 76 61 69 6c 61 62 6c 65 20   only available 
182a0 6f 6e 20 56 78 57 6f 72 6b 73 2e 0a 2a 2a 0a 2a  on VxWorks..**.*
182b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45  ************** E
182c0 6e 64 20 6f 66 20 74 68 65 20 6e 61 6d 65 64 20  nd of the named 
182d0 73 65 6d 61 70 68 6f 72 65 20 6c 6f 63 6b 20 69  semaphore lock i
182e0 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 2a 2a  mplementation **
182f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a  **************.*
18300 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18310 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18320 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18330 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18340 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a  *************/..
18350 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ./**************
18360 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18370 2a 2a 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 0a 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 20 42 65 67  ************ Beg
183c0 69 6e 20 41 46 50 20 4c 6f 63 6b 69 6e 67 20 2a  in AFP Locking *
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 0a 2a 2a 0a 2a 2a 20 41 46 50 20 69 73 20 74 68  .**.** AFP is th
18400 65 20 41 70 70 6c 65 20 46 69 6c 69 6e 67 20 50  e Apple Filing P
18410 72 6f 74 6f 63 6f 6c 2e 20 20 41 46 50 20 69 73  rotocol.  AFP is
18420 20 61 20 6e 65 74 77 6f 72 6b 20 66 69 6c 65 73   a network files
18430 79 73 74 65 6d 20 66 6f 75 6e 64 0a 2a 2a 20 6f  ystem found.** o
18440 6e 20 41 70 70 6c 65 20 4d 61 63 69 6e 74 6f 73  n Apple Macintos
18450 68 20 63 6f 6d 70 75 74 65 72 73 20 2d 20 62 6f  h computers - bo
18460 74 68 20 4f 53 39 20 61 6e 64 20 4f 53 58 2e 0a  th OS9 and OSX..
18470 2a 2a 0a 2a 2a 20 54 68 69 72 64 2d 70 61 72 74  **.** Third-part
18480 79 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  y implementation
18490 73 20 6f 66 20 41 46 50 20 61 72 65 20 61 76 61  s of AFP are ava
184a0 69 6c 61 62 6c 65 2e 20 20 42 75 74 20 74 68 69  ilable.  But thi
184b0 73 20 63 6f 64 65 20 68 65 72 65 0a 2a 2a 20 6f  s code here.** o
184c0 6e 6c 79 20 77 6f 72 6b 73 20 6f 6e 20 4f 53 58  nly works on OSX
184d0 2e 0a 2a 2f 0a 0a 23 69 66 20 64 65 66 69 6e 65  ..*/..#if define
184e0 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 26 26 20  d(__APPLE__) && 
184f0 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f  SQLITE_ENABLE_LO
18500 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 2f 2a 0a 2a  CKING_STYLE./*.*
18510 2a 20 54 68 65 20 61 66 70 4c 6f 63 6b 69 6e 67  * The afpLocking
18520 43 6f 6e 74 65 78 74 20 73 74 72 75 63 74 75 72  Context structur
18530 65 20 63 6f 6e 74 61 69 6e 73 20 61 6c 6c 20 61  e contains all a
18540 66 70 20 6c 6f 63 6b 20 73 70 65 63 69 66 69 63  fp lock specific
18550 20 73 74 61 74 65 0a 2a 2f 0a 74 79 70 65 64 65   state.*/.typede
18560 66 20 73 74 72 75 63 74 20 61 66 70 4c 6f 63 6b  f struct afpLock
18570 69 6e 67 43 6f 6e 74 65 78 74 20 61 66 70 4c 6f  ingContext afpLo
18580 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 0a 73 74  ckingContext;.st
18590 72 75 63 74 20 61 66 70 4c 6f 63 6b 69 6e 67 43  ruct afpLockingC
185a0 6f 6e 74 65 78 74 20 7b 0a 20 20 69 6e 74 20 72  ontext {.  int r
185b0 65 73 65 72 76 65 64 3b 0a 20 20 63 6f 6e 73 74  eserved;.  const
185c0 20 63 68 61 72 20 2a 64 62 50 61 74 68 3b 20 20   char *dbPath;  
185d0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61             /* Na
185e0 6d 65 20 6f 66 20 74 68 65 20 6f 70 65 6e 20 66  me of the open f
185f0 69 6c 65 20 2a 2f 0a 7d 3b 0a 0a 73 74 72 75 63  ile */.};..struc
18600 74 20 42 79 74 65 52 61 6e 67 65 4c 6f 63 6b 50  t ByteRangeLockP
18610 42 32 0a 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20  B2.{.  unsigned 
18620 6c 6f 6e 67 20 6c 6f 6e 67 20 6f 66 66 73 65 74  long long offset
18630 3b 20 20 20 20 20 20 20 20 2f 2a 20 6f 66 66 73  ;        /* offs
18640 65 74 20 74 6f 20 66 69 72 73 74 20 62 79 74 65  et to first byte
18650 20 74 6f 20 6c 6f 63 6b 20 2a 2f 0a 20 20 75 6e   to lock */.  un
18660 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6c 6f 6e 67  signed long long
18670 20 6c 65 6e 67 74 68 3b 20 20 20 20 20 20 20 20   length;        
18680 2f 2a 20 6e 62 72 20 6f 66 20 62 79 74 65 73 20  /* nbr of bytes 
18690 74 6f 20 6c 6f 63 6b 20 2a 2f 0a 20 20 75 6e 73  to lock */.  uns
186a0 69 67 6e 65 64 20 6c 6f 6e 67 20 6c 6f 6e 67 20  igned long long 
186b0 72 65 74 52 61 6e 67 65 53 74 61 72 74 3b 20 2f  retRangeStart; /
186c0 2a 20 6e 62 72 20 6f 66 20 31 73 74 20 62 79 74  * nbr of 1st byt
186d0 65 20 6c 6f 63 6b 65 64 20 69 66 20 73 75 63 63  e locked if succ
186e0 65 73 73 66 75 6c 20 2a 2f 0a 20 20 75 6e 73 69  essful */.  unsi
186f0 67 6e 65 64 20 63 68 61 72 20 75 6e 4c 6f 63 6b  gned char unLock
18700 46 6c 61 67 3b 20 20 20 20 20 20 20 20 20 2f 2a  Flag;         /*
18710 20 31 20 3d 20 75 6e 6c 6f 63 6b 2c 20 30 20 3d   1 = unlock, 0 =
18720 20 6c 6f 63 6b 20 2a 2f 0a 20 20 75 6e 73 69 67   lock */.  unsig
18730 6e 65 64 20 63 68 61 72 20 73 74 61 72 74 45 6e  ned char startEn
18740 64 46 6c 61 67 3b 20 20 20 20 20 20 20 2f 2a 20  dFlag;       /* 
18750 31 3d 72 65 6c 20 74 6f 20 65 6e 64 20 6f 66 20  1=rel to end of 
18760 66 6f 72 6b 2c 20 30 3d 72 65 6c 20 74 6f 20 73  fork, 0=rel to s
18770 74 61 72 74 20 2a 2f 0a 20 20 69 6e 74 20 66 64  tart */.  int fd
18780 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
18790 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 66              /* f
187a0 69 6c 65 20 64 65 73 63 20 74 6f 20 61 73 73 6f  ile desc to asso
187b0 63 20 74 68 69 73 20 6c 6f 63 6b 20 77 69 74 68  c this lock with
187c0 20 2a 2f 0a 7d 3b 0a 0a 23 64 65 66 69 6e 65 20   */.};..#define 
187d0 61 66 70 66 73 42 79 74 65 52 61 6e 67 65 4c 6f  afpfsByteRangeLo
187e0 63 6b 32 46 53 43 54 4c 20 20 20 20 20 20 20 20  ck2FSCTL        
187f0 5f 49 4f 57 52 28 27 7a 27 2c 20 32 33 2c 20 73  _IOWR('z', 23, s
18800 74 72 75 63 74 20 42 79 74 65 52 61 6e 67 65 4c  truct ByteRangeL
18810 6f 63 6b 50 42 32 29 0a 0a 2f 2a 0a 2a 2a 20 54  ockPB2)../*.** T
18820 68 69 73 20 69 73 20 61 20 75 74 69 6c 69 74 79  his is a utility
18830 20 66 6f 72 20 73 65 74 74 69 6e 67 20 6f 72 20   for setting or 
18840 63 6c 65 61 72 69 6e 67 20 61 20 62 69 74 2d 72  clearing a bit-r
18850 61 6e 67 65 20 6c 6f 63 6b 20 6f 6e 20 61 6e 0a  ange lock on an.
18860 2a 2a 20 41 46 50 20 66 69 6c 65 73 79 73 74 65  ** AFP filesyste
18870 6d 2e 0a 2a 2a 20 0a 2a 2a 20 52 65 74 75 72 6e  m..** .** Return
18880 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75   SQLITE_OK on su
18890 63 63 65 73 73 2c 20 53 51 4c 49 54 45 5f 42 55  ccess, SQLITE_BU
188a0 53 59 20 6f 6e 20 66 61 69 6c 75 72 65 2e 0a 2a  SY on failure..*
188b0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 66 70  /.static int afp
188c0 53 65 74 4c 6f 63 6b 28 0a 20 20 63 6f 6e 73 74  SetLock(.  const
188d0 20 63 68 61 72 20 2a 70 61 74 68 2c 20 20 20 20   char *path,    
188e0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d            /* Nam
188f0 65 20 6f 66 20 74 68 65 20 66 69 6c 65 20 74 6f  e of the file to
18900 20 62 65 20 6c 6f 63 6b 65 64 20 6f 72 20 75 6e   be locked or un
18910 6c 6f 63 6b 65 64 20 2a 2f 0a 20 20 75 6e 69 78  locked */.  unix
18920 46 69 6c 65 20 2a 70 46 69 6c 65 2c 20 20 20 20  File *pFile,    
18930 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 70             /* Op
18940 65 6e 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  en file descript
18950 6f 72 20 6f 6e 20 70 61 74 68 20 2a 2f 0a 20 20  or on path */.  
18960 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6c 6f  unsigned long lo
18970 6e 67 20 6f 66 66 73 65 74 2c 20 20 20 20 20 2f  ng offset,     /
18980 2a 20 46 69 72 73 74 20 62 79 74 65 20 74 6f 20  * First byte to 
18990 62 65 20 6c 6f 63 6b 65 64 20 2a 2f 0a 20 20 75  be locked */.  u
189a0 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6c 6f 6e  nsigned long lon
189b0 67 20 6c 65 6e 67 74 68 2c 20 20 20 20 20 2f 2a  g length,     /*
189c0 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   Number of bytes
189d0 20 74 6f 20 6c 6f 63 6b 20 2a 2f 0a 20 20 69 6e   to lock */.  in
189e0 74 20 73 65 74 4c 6f 63 6b 46 6c 61 67 20 20 20  t setLockFlag   
189f0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
18a00 54 72 75 65 20 74 6f 20 73 65 74 20 6c 6f 63 6b  True to set lock
18a10 2e 20 20 46 61 6c 73 65 20 74 6f 20 63 6c 65 61  .  False to clea
18a20 72 20 6c 6f 63 6b 20 2a 2f 0a 29 7b 0a 20 20 73  r lock */.){.  s
18a30 74 72 75 63 74 20 42 79 74 65 52 61 6e 67 65 4c  truct ByteRangeL
18a40 6f 63 6b 50 42 32 20 70 62 3b 0a 20 20 69 6e 74  ockPB2 pb;.  int
18a50 20 65 72 72 3b 0a 20 20 0a 20 20 70 62 2e 75 6e   err;.  .  pb.un
18a60 4c 6f 63 6b 46 6c 61 67 20 3d 20 73 65 74 4c 6f  LockFlag = setLo
18a70 63 6b 46 6c 61 67 20 3f 20 30 20 3a 20 31 3b 0a  ckFlag ? 0 : 1;.
18a80 20 20 70 62 2e 73 74 61 72 74 45 6e 64 46 6c 61    pb.startEndFla
18a90 67 20 3d 20 30 3b 0a 20 20 70 62 2e 6f 66 66 73  g = 0;.  pb.offs
18aa0 65 74 20 3d 20 6f 66 66 73 65 74 3b 0a 20 20 70  et = offset;.  p
18ab0 62 2e 6c 65 6e 67 74 68 20 3d 20 6c 65 6e 67 74  b.length = lengt
18ac0 68 3b 20 0a 20 20 70 62 2e 66 64 20 3d 20 70 46  h; .  pb.fd = pF
18ad0 69 6c 65 2d 3e 68 3b 0a 20 20 0a 20 20 4f 53 54  ile->h;.  .  OST
18ae0 52 41 43 45 28 28 22 41 46 50 53 45 54 4c 4f 43  RACE(("AFPSETLOC
18af0 4b 20 5b 25 73 5d 20 66 6f 72 20 25 64 25 73 20  K [%s] for %d%s 
18b00 69 6e 20 72 61 6e 67 65 20 25 6c 6c 78 3a 25 6c  in range %llx:%l
18b10 6c 78 5c 6e 22 2c 20 0a 20 20 20 20 28 73 65 74  lx\n", .    (set
18b20 4c 6f 63 6b 46 6c 61 67 3f 22 4f 4e 22 3a 22 4f  LockFlag?"ON":"O
18b30 46 46 22 29 2c 20 70 46 69 6c 65 2d 3e 68 2c 20  FF"), pFile->h, 
18b40 28 70 62 2e 66 64 3d 3d 2d 31 3f 22 5b 74 65 73  (pb.fd==-1?"[tes
18b50 74 76 61 6c 2d 31 5d 22 3a 22 22 29 2c 0a 20 20  tval-1]":""),.  
18b60 20 20 6f 66 66 73 65 74 2c 20 6c 65 6e 67 74 68    offset, length
18b70 29 29 3b 0a 20 20 65 72 72 20 3d 20 66 73 63 74  ));.  err = fsct
18b80 6c 28 70 61 74 68 2c 20 61 66 70 66 73 42 79 74  l(path, afpfsByt
18b90 65 52 61 6e 67 65 4c 6f 63 6b 32 46 53 43 54 4c  eRangeLock2FSCTL
18ba0 2c 20 26 70 62 2c 20 30 29 3b 0a 20 20 69 66 20  , &pb, 0);.  if 
18bb0 28 20 65 72 72 3d 3d 2d 31 20 29 20 7b 0a 20 20  ( err==-1 ) {.  
18bc0 20 20 69 6e 74 20 72 63 3b 0a 20 20 20 20 69 6e    int rc;.    in
18bd0 74 20 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f  t tErrno = errno
18be0 3b 0a 20 20 20 20 4f 53 54 52 41 43 45 28 28 22  ;.    OSTRACE(("
18bf0 41 46 50 53 45 54 4c 4f 43 4b 20 66 61 69 6c 65  AFPSETLOCK faile
18c00 64 20 74 6f 20 66 73 63 74 6c 28 29 20 27 25 73  d to fsctl() '%s
18c10 27 20 25 64 20 25 73 5c 6e 22 2c 0a 20 20 20 20  ' %d %s\n",.    
18c20 20 20 20 20 20 20 20 20 20 70 61 74 68 2c 20 74           path, t
18c30 45 72 72 6e 6f 2c 20 73 74 72 65 72 72 6f 72 28  Errno, strerror(
18c40 74 45 72 72 6e 6f 29 29 29 3b 0a 23 69 66 64 65  tErrno)));.#ifde
18c50 66 20 53 51 4c 49 54 45 5f 49 47 4e 4f 52 45 5f  f SQLITE_IGNORE_
18c60 41 46 50 5f 4c 4f 43 4b 5f 45 52 52 4f 52 53 0a  AFP_LOCK_ERRORS.
18c70 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
18c80 42 55 53 59 3b 0a 23 65 6c 73 65 0a 20 20 20 20  BUSY;.#else.    
18c90 72 63 20 3d 20 73 71 6c 69 74 65 45 72 72 6f 72  rc = sqliteError
18ca0 46 72 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28 74  FromPosixError(t
18cb0 45 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20  Errno,.         
18cc0 20 20 20 20 20 20 20 20 20 20 20 73 65 74 4c 6f             setLo
18cd0 63 6b 46 6c 61 67 20 3f 20 53 51 4c 49 54 45 5f  ckFlag ? SQLITE_
18ce0 49 4f 45 52 52 5f 4c 4f 43 4b 20 3a 20 53 51 4c  IOERR_LOCK : SQL
18cf0 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b  ITE_IOERR_UNLOCK
18d00 29 3b 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  );.#endif /* SQL
18d10 49 54 45 5f 49 47 4e 4f 52 45 5f 41 46 50 5f 4c  ITE_IGNORE_AFP_L
18d20 4f 43 4b 5f 45 52 52 4f 52 53 20 2a 2f 0a 20 20  OCK_ERRORS */.  
18d30 20 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45 52    if( IS_LOCK_ER
18d40 52 4f 52 28 72 63 29 20 29 7b 0a 20 20 20 20 20  ROR(rc) ){.     
18d50 20 73 74 6f 72 65 4c 61 73 74 45 72 72 6e 6f 28   storeLastErrno(
18d60 70 46 69 6c 65 2c 20 74 45 72 72 6e 6f 29 3b 0a  pFile, tErrno);.
18d70 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e      }.    return
18d80 20 72 63 3b 0a 20 20 7d 20 65 6c 73 65 20 7b 0a   rc;.  } else {.
18d90 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
18da0 45 5f 4f 4b 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  E_OK;.  }.}../*.
18db0 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
18dc0 63 68 65 63 6b 73 20 69 66 20 74 68 65 72 65 20  checks if there 
18dd0 69 73 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f  is a RESERVED lo
18de0 63 6b 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 73  ck held on the s
18df0 70 65 63 69 66 69 65 64 0a 2a 2a 20 66 69 6c 65  pecified.** file
18e00 20 62 79 20 74 68 69 73 20 6f 72 20 61 6e 79 20   by this or any 
18e10 6f 74 68 65 72 20 70 72 6f 63 65 73 73 2e 20 49  other process. I
18e20 66 20 73 75 63 68 20 61 20 6c 6f 63 6b 20 69 73  f such a lock is
18e30 20 68 65 6c 64 2c 20 73 65 74 20 2a 70 52 65 73   held, set *pRes
18e40 4f 75 74 0a 2a 2a 20 74 6f 20 61 20 6e 6f 6e 2d  Out.** to a non-
18e50 7a 65 72 6f 20 76 61 6c 75 65 20 6f 74 68 65 72  zero value other
18e60 77 69 73 65 20 2a 70 52 65 73 4f 75 74 20 69 73  wise *pResOut is
18e70 20 73 65 74 20 74 6f 20 7a 65 72 6f 2e 20 20 54   set to zero.  T
18e80 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 0a  he return value.
18e90 2a 2a 20 69 73 20 73 65 74 20 74 6f 20 53 51 4c  ** is set to SQL
18ea0 49 54 45 5f 4f 4b 20 75 6e 6c 65 73 73 20 61 6e  ITE_OK unless an
18eb0 20 49 2f 4f 20 65 72 72 6f 72 20 6f 63 63 75 72   I/O error occur
18ec0 73 20 64 75 72 69 6e 67 20 6c 6f 63 6b 20 63 68  s during lock ch
18ed0 65 63 6b 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69  ecking..*/.stati
18ee0 63 20 69 6e 74 20 61 66 70 43 68 65 63 6b 52 65  c int afpCheckRe
18ef0 73 65 72 76 65 64 4c 6f 63 6b 28 73 71 6c 69 74  servedLock(sqlit
18f00 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74  e3_file *id, int
18f10 20 2a 70 52 65 73 4f 75 74 29 7b 0a 20 20 69 6e   *pResOut){.  in
18f20 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
18f30 3b 0a 20 20 69 6e 74 20 72 65 73 65 72 76 65 64  ;.  int reserved
18f40 20 3d 20 30 3b 0a 20 20 75 6e 69 78 46 69 6c 65   = 0;.  unixFile
18f50 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46   *pFile = (unixF
18f60 69 6c 65 2a 29 69 64 3b 0a 20 20 61 66 70 4c 6f  ile*)id;.  afpLo
18f70 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 63 6f  ckingContext *co
18f80 6e 74 65 78 74 3b 0a 20 20 0a 20 20 53 69 6d 75  ntext;.  .  Simu
18f90 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 72 65 74  lateIOError( ret
18fa0 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  urn SQLITE_IOERR
18fb0 5f 43 48 45 43 4b 52 45 53 45 52 56 45 44 4c 4f  _CHECKRESERVEDLO
18fc0 43 4b 3b 20 29 3b 0a 20 20 0a 20 20 61 73 73 65  CK; );.  .  asse
18fd0 72 74 28 20 70 46 69 6c 65 20 29 3b 0a 20 20 63  rt( pFile );.  c
18fe0 6f 6e 74 65 78 74 20 3d 20 28 61 66 70 4c 6f 63  ontext = (afpLoc
18ff0 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 29 20 70  kingContext *) p
19000 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e  File->lockingCon
19010 74 65 78 74 3b 0a 20 20 69 66 28 20 63 6f 6e 74  text;.  if( cont
19020 65 78 74 2d 3e 72 65 73 65 72 76 65 64 20 29 7b  ext->reserved ){
19030 0a 20 20 20 20 2a 70 52 65 73 4f 75 74 20 3d 20  .    *pResOut = 
19040 31 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  1;.    return SQ
19050 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 75  LITE_OK;.  }.  u
19060 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29 3b  nixEnterMutex();
19070 20 2f 2a 20 42 65 63 61 75 73 65 20 70 46 69 6c   /* Because pFil
19080 65 2d 3e 70 49 6e 6f 64 65 20 69 73 20 73 68 61  e->pInode is sha
19090 72 65 64 20 61 63 72 6f 73 73 20 74 68 72 65 61  red across threa
190a0 64 73 20 2a 2f 0a 20 20 0a 20 20 2f 2a 20 43 68  ds */.  .  /* Ch
190b0 65 63 6b 20 69 66 20 61 20 74 68 72 65 61 64 20  eck if a thread 
190c0 69 6e 20 74 68 69 73 20 70 72 6f 63 65 73 73 20  in this process 
190d0 68 6f 6c 64 73 20 73 75 63 68 20 61 20 6c 6f 63  holds such a loc
190e0 6b 20 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c 65  k */.  if( pFile
190f0 2d 3e 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c  ->pInode->eFileL
19100 6f 63 6b 3e 53 48 41 52 45 44 5f 4c 4f 43 4b 20  ock>SHARED_LOCK 
19110 29 7b 0a 20 20 20 20 72 65 73 65 72 76 65 64 20  ){.    reserved 
19120 3d 20 31 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a  = 1;.  }.  .  /*
19130 20 4f 74 68 65 72 77 69 73 65 20 73 65 65 20 69   Otherwise see i
19140 66 20 73 6f 6d 65 20 6f 74 68 65 72 20 70 72 6f  f some other pro
19150 63 65 73 73 20 68 6f 6c 64 73 20 69 74 2e 0a 20  cess holds it.. 
19160 20 20 2a 2f 0a 20 20 69 66 28 20 21 72 65 73 65    */.  if( !rese
19170 72 76 65 64 20 29 7b 0a 20 20 20 20 2f 2a 20 6c  rved ){.    /* l
19180 6f 63 6b 20 74 68 65 20 52 45 53 45 52 56 45 44  ock the RESERVED
19190 20 62 79 74 65 20 2a 2f 0a 20 20 20 20 69 6e 74   byte */.    int
191a0 20 6c 72 63 20 3d 20 61 66 70 53 65 74 4c 6f 63   lrc = afpSetLoc
191b0 6b 28 63 6f 6e 74 65 78 74 2d 3e 64 62 50 61 74  k(context->dbPat
191c0 68 2c 20 70 46 69 6c 65 2c 20 52 45 53 45 52 56  h, pFile, RESERV
191d0 45 44 5f 42 59 54 45 2c 20 31 2c 31 29 3b 20 20  ED_BYTE, 1,1);  
191e0 0a 20 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f  .    if( SQLITE_
191f0 4f 4b 3d 3d 6c 72 63 20 29 7b 0a 20 20 20 20 20  OK==lrc ){.     
19200 20 2f 2a 20 69 66 20 77 65 20 73 75 63 63 65 65   /* if we succee
19210 64 65 64 20 69 6e 20 74 61 6b 69 6e 67 20 74 68  ded in taking th
19220 65 20 72 65 73 65 72 76 65 64 20 6c 6f 63 6b 2c  e reserved lock,
19230 20 75 6e 6c 6f 63 6b 20 69 74 20 74 6f 20 72 65   unlock it to re
19240 73 74 6f 72 65 0a 20 20 20 20 20 20 2a 2a 20 74  store.      ** t
19250 68 65 20 6f 72 69 67 69 6e 61 6c 20 73 74 61 74  he original stat
19260 65 20 2a 2f 0a 20 20 20 20 20 20 6c 72 63 20 3d  e */.      lrc =
19270 20 61 66 70 53 65 74 4c 6f 63 6b 28 63 6f 6e 74   afpSetLock(cont
19280 65 78 74 2d 3e 64 62 50 61 74 68 2c 20 70 46 69  ext->dbPath, pFi
19290 6c 65 2c 20 52 45 53 45 52 56 45 44 5f 42 59 54  le, RESERVED_BYT
192a0 45 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 7d 20  E, 1, 0);.    } 
192b0 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 2f 2a 20  else {.      /* 
192c0 69 66 20 77 65 20 66 61 69 6c 65 64 20 74 6f 20  if we failed to 
192d0 67 65 74 20 74 68 65 20 6c 6f 63 6b 20 74 68 65  get the lock the
192e0 6e 20 73 6f 6d 65 6f 6e 65 20 65 6c 73 65 20 6d  n someone else m
192f0 75 73 74 20 68 61 76 65 20 69 74 20 2a 2f 0a 20  ust have it */. 
19300 20 20 20 20 20 72 65 73 65 72 76 65 64 20 3d 20       reserved = 
19310 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  1;.    }.    if(
19320 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 6c   IS_LOCK_ERROR(l
19330 72 63 29 20 29 7b 0a 20 20 20 20 20 20 72 63 3d  rc) ){.      rc=
19340 6c 72 63 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  lrc;.    }.  }. 
19350 20 0a 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74   .  unixLeaveMut
19360 65 78 28 29 3b 0a 20 20 4f 53 54 52 41 43 45 28  ex();.  OSTRACE(
19370 28 22 54 45 53 54 20 57 52 2d 4c 4f 43 4b 20 25  ("TEST WR-LOCK %
19380 64 20 25 64 20 25 64 20 28 61 66 70 29 5c 6e 22  d %d %d (afp)\n"
19390 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 72 63 2c 20  , pFile->h, rc, 
193a0 72 65 73 65 72 76 65 64 29 29 3b 0a 20 20 0a 20  reserved));.  . 
193b0 20 2a 70 52 65 73 4f 75 74 20 3d 20 72 65 73 65   *pResOut = rese
193c0 72 76 65 64 3b 0a 20 20 72 65 74 75 72 6e 20 72  rved;.  return r
193d0 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 6b  c;.}../*.** Lock
193e0 20 74 68 65 20 66 69 6c 65 20 77 69 74 68 20 74   the file with t
193f0 68 65 20 6c 6f 63 6b 20 73 70 65 63 69 66 69 65  he lock specifie
19400 64 20 62 79 20 70 61 72 61 6d 65 74 65 72 20 65  d by parameter e
19410 46 69 6c 65 4c 6f 63 6b 20 2d 20 6f 6e 65 0a 2a  FileLock - one.*
19420 2a 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  * of the followi
19430 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28 31  ng:.**.**     (1
19440 29 20 53 48 41 52 45 44 5f 4c 4f 43 4b 0a 2a 2a  ) SHARED_LOCK.**
19450 20 20 20 20 20 28 32 29 20 52 45 53 45 52 56 45       (2) RESERVE
19460 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 33  D_LOCK.**     (3
19470 29 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 0a 2a  ) PENDING_LOCK.*
19480 2a 20 20 20 20 20 28 34 29 20 45 58 43 4c 55 53  *     (4) EXCLUS
19490 49 56 45 5f 4c 4f 43 4b 0a 2a 2a 0a 2a 2a 20 53  IVE_LOCK.**.** S
194a0 6f 6d 65 74 69 6d 65 73 20 77 68 65 6e 20 72 65  ometimes when re
194b0 71 75 65 73 74 69 6e 67 20 6f 6e 65 20 6c 6f 63  questing one loc
194c0 6b 20 73 74 61 74 65 2c 20 61 64 64 69 74 69 6f  k state, additio
194d0 6e 61 6c 20 6c 6f 63 6b 20 73 74 61 74 65 73 0a  nal lock states.
194e0 2a 2a 20 61 72 65 20 69 6e 73 65 72 74 65 64 20  ** are inserted 
194f0 69 6e 20 62 65 74 77 65 65 6e 2e 20 20 54 68 65  in between.  The
19500 20 6c 6f 63 6b 69 6e 67 20 6d 69 67 68 74 20 66   locking might f
19510 61 69 6c 20 6f 6e 20 6f 6e 65 20 6f 66 20 74 68  ail on one of th
19520 65 20 6c 61 74 65 72 0a 2a 2a 20 74 72 61 6e 73  e later.** trans
19530 69 74 69 6f 6e 73 20 6c 65 61 76 69 6e 67 20 74  itions leaving t
19540 68 65 20 6c 6f 63 6b 20 73 74 61 74 65 20 64 69  he lock state di
19550 66 66 65 72 65 6e 74 20 66 72 6f 6d 20 77 68 61  fferent from wha
19560 74 20 69 74 20 73 74 61 72 74 65 64 20 62 75 74  t it started but
19570 0a 2a 2a 20 73 74 69 6c 6c 20 73 68 6f 72 74 20  .** still short 
19580 6f 66 20 69 74 73 20 67 6f 61 6c 2e 20 20 54 68  of its goal.  Th
19590 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 68 61 72  e following char
195a0 74 20 73 68 6f 77 73 20 74 68 65 20 61 6c 6c 6f  t shows the allo
195b0 77 65 64 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f  wed.** transitio
195c0 6e 73 20 61 6e 64 20 74 68 65 20 69 6e 73 65 72  ns and the inser
195d0 74 65 64 20 69 6e 74 65 72 6d 65 64 69 61 74 65  ted intermediate
195e0 20 73 74 61 74 65 73 3a 0a 2a 2a 0a 2a 2a 20 20   states:.**.**  
195f0 20 20 55 4e 4c 4f 43 4b 45 44 20 2d 3e 20 53 48    UNLOCKED -> SH
19600 41 52 45 44 0a 2a 2a 20 20 20 20 53 48 41 52 45  ARED.**    SHARE
19610 44 20 2d 3e 20 52 45 53 45 52 56 45 44 0a 2a 2a  D -> RESERVED.**
19620 20 20 20 20 53 48 41 52 45 44 20 2d 3e 20 28 50      SHARED -> (P
19630 45 4e 44 49 4e 47 29 20 2d 3e 20 45 58 43 4c 55  ENDING) -> EXCLU
19640 53 49 56 45 0a 2a 2a 20 20 20 20 52 45 53 45 52  SIVE.**    RESER
19650 56 45 44 20 2d 3e 20 28 50 45 4e 44 49 4e 47 29  VED -> (PENDING)
19660 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a   -> EXCLUSIVE.**
19670 20 20 20 20 50 45 4e 44 49 4e 47 20 2d 3e 20 45      PENDING -> E
19680 58 43 4c 55 53 49 56 45 0a 2a 2a 0a 2a 2a 20 54  XCLUSIVE.**.** T
19690 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c  his routine will
196a0 20 6f 6e 6c 79 20 69 6e 63 72 65 61 73 65 20 61   only increase a
196b0 20 6c 6f 63 6b 2e 20 20 55 73 65 20 74 68 65 20   lock.  Use the 
196c0 73 71 6c 69 74 65 33 4f 73 55 6e 6c 6f 63 6b 28  sqlite3OsUnlock(
196d0 29 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 74 6f 20  ).** routine to 
196e0 6c 6f 77 65 72 20 61 20 6c 6f 63 6b 69 6e 67 20  lower a locking 
196f0 6c 65 76 65 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63  level..*/.static
19700 20 69 6e 74 20 61 66 70 4c 6f 63 6b 28 73 71 6c   int afpLock(sql
19710 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69  ite3_file *id, i
19720 6e 74 20 65 46 69 6c 65 4c 6f 63 6b 29 7b 0a 20  nt eFileLock){. 
19730 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
19740 5f 4f 4b 3b 0a 20 20 75 6e 69 78 46 69 6c 65 20  _OK;.  unixFile 
19750 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69  *pFile = (unixFi
19760 6c 65 2a 29 69 64 3b 0a 20 20 75 6e 69 78 49 6e  le*)id;.  unixIn
19770 6f 64 65 49 6e 66 6f 20 2a 70 49 6e 6f 64 65 20  odeInfo *pInode 
19780 3d 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 3b  = pFile->pInode;
19790 0a 20 20 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e  .  afpLockingCon
197a0 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 20 3d 20  text *context = 
197b0 28 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65  (afpLockingConte
197c0 78 74 20 2a 29 20 70 46 69 6c 65 2d 3e 6c 6f 63  xt *) pFile->loc
197d0 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 0a 20 20 0a  kingContext;.  .
197e0 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 20    assert( pFile 
197f0 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22 4c  );.  OSTRACE(("L
19800 4f 43 4b 20 20 20 20 25 64 20 25 73 20 77 61 73  OCK    %d %s was
19810 20 25 73 28 25 73 2c 25 64 29 20 70 69 64 3d 25   %s(%s,%d) pid=%
19820 64 20 28 61 66 70 29 5c 6e 22 2c 20 70 46 69 6c  d (afp)\n", pFil
19830 65 2d 3e 68 2c 0a 20 20 20 20 20 20 20 20 20 20  e->h,.          
19840 20 61 7a 46 69 6c 65 4c 6f 63 6b 28 65 46 69 6c   azFileLock(eFil
19850 65 4c 6f 63 6b 29 2c 20 61 7a 46 69 6c 65 4c 6f  eLock), azFileLo
19860 63 6b 28 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c  ck(pFile->eFileL
19870 6f 63 6b 29 2c 0a 20 20 20 20 20 20 20 20 20 20  ock),.          
19880 20 61 7a 46 69 6c 65 4c 6f 63 6b 28 70 49 6e 6f   azFileLock(pIno
19890 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 29 2c 20  de->eFileLock), 
198a0 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64 20  pInode->nShared 
198b0 2c 20 6f 73 47 65 74 70 69 64 28 30 29 29 29 3b  , osGetpid(0)));
198c0 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20  ..  /* If there 
198d0 69 73 20 61 6c 72 65 61 64 79 20 61 20 6c 6f 63  is already a loc
198e0 6b 20 6f 66 20 74 68 69 73 20 74 79 70 65 20 6f  k of this type o
198f0 72 20 6d 6f 72 65 20 72 65 73 74 72 69 63 74 69  r more restricti
19900 76 65 20 6f 6e 20 74 68 65 0a 20 20 2a 2a 20 75  ve on the.  ** u
19910 6e 69 78 46 69 6c 65 2c 20 64 6f 20 6e 6f 74 68  nixFile, do noth
19920 69 6e 67 2e 20 44 6f 6e 27 74 20 75 73 65 20 74  ing. Don't use t
19930 68 65 20 61 66 70 5f 65 6e 64 5f 6c 6f 63 6b 3a  he afp_end_lock:
19940 20 65 78 69 74 20 70 61 74 68 2c 20 61 73 0a 20   exit path, as. 
19950 20 2a 2a 20 75 6e 69 78 45 6e 74 65 72 4d 75 74   ** unixEnterMut
19960 65 78 28 29 20 68 61 73 6e 27 74 20 62 65 65 6e  ex() hasn't been
19970 20 63 61 6c 6c 65 64 20 79 65 74 2e 0a 20 20 2a   called yet..  *
19980 2f 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 65  /.  if( pFile->e
19990 46 69 6c 65 4c 6f 63 6b 3e 3d 65 46 69 6c 65 4c  FileLock>=eFileL
199a0 6f 63 6b 20 29 7b 0a 20 20 20 20 4f 53 54 52 41  ock ){.    OSTRA
199b0 43 45 28 28 22 4c 4f 43 4b 20 20 20 20 25 64 20  CE(("LOCK    %d 
199c0 25 73 20 6f 6b 20 28 61 6c 72 65 61 64 79 20 68  %s ok (already h
199d0 65 6c 64 29 20 28 61 66 70 29 5c 6e 22 2c 20 70  eld) (afp)\n", p
199e0 46 69 6c 65 2d 3e 68 2c 0a 20 20 20 20 20 20 20  File->h,.       
199f0 20 20 20 20 61 7a 46 69 6c 65 4c 6f 63 6b 28 65      azFileLock(e
19a00 46 69 6c 65 4c 6f 63 6b 29 29 29 3b 0a 20 20 20  FileLock)));.   
19a10 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
19a20 4b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b  K;.  }..  /* Mak
19a30 65 20 73 75 72 65 20 74 68 65 20 6c 6f 63 6b 69  e sure the locki
19a40 6e 67 20 73 65 71 75 65 6e 63 65 20 69 73 20 63  ng sequence is c
19a50 6f 72 72 65 63 74 0a 20 20 2a 2a 20 20 28 31 29  orrect.  **  (1)
19a60 20 57 65 20 6e 65 76 65 72 20 6d 6f 76 65 20 66   We never move f
19a70 72 6f 6d 20 75 6e 6c 6f 63 6b 65 64 20 74 6f 20  rom unlocked to 
19a80 61 6e 79 74 68 69 6e 67 20 68 69 67 68 65 72 20  anything higher 
19a90 74 68 61 6e 20 73 68 61 72 65 64 20 6c 6f 63 6b  than shared lock
19aa0 2e 0a 20 20 2a 2a 20 20 28 32 29 20 53 51 4c 69  ..  **  (2) SQLi
19ab0 74 65 20 6e 65 76 65 72 20 65 78 70 6c 69 63 69  te never explici
19ac0 74 6c 79 20 72 65 71 75 65 73 74 73 20 61 20 70  tly requests a p
19ad0 65 6e 64 69 67 20 6c 6f 63 6b 2e 0a 20 20 2a 2a  endig lock..  **
19ae0 20 20 28 33 29 20 41 20 73 68 61 72 65 64 20 6c    (3) A shared l
19af0 6f 63 6b 20 69 73 20 61 6c 77 61 79 73 20 68 65  ock is always he
19b00 6c 64 20 77 68 65 6e 20 61 20 72 65 73 65 72 76  ld when a reserv
19b10 65 20 6c 6f 63 6b 20 69 73 20 72 65 71 75 65 73  e lock is reques
19b20 74 65 64 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65  ted..  */.  asse
19b30 72 74 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65  rt( pFile->eFile
19b40 4c 6f 63 6b 21 3d 4e 4f 5f 4c 4f 43 4b 20 7c 7c  Lock!=NO_LOCK ||
19b50 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52   eFileLock==SHAR
19b60 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73  ED_LOCK );.  ass
19b70 65 72 74 28 20 65 46 69 6c 65 4c 6f 63 6b 21 3d  ert( eFileLock!=
19b80 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 20 29 3b 0a  PENDING_LOCK );.
19b90 20 20 61 73 73 65 72 74 28 20 65 46 69 6c 65 4c    assert( eFileL
19ba0 6f 63 6b 21 3d 52 45 53 45 52 56 45 44 5f 4c 4f  ock!=RESERVED_LO
19bb0 43 4b 20 7c 7c 20 70 46 69 6c 65 2d 3e 65 46 69  CK || pFile->eFi
19bc0 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c  leLock==SHARED_L
19bd0 4f 43 4b 20 29 3b 0a 20 20 0a 20 20 2f 2a 20 54  OCK );.  .  /* T
19be0 68 69 73 20 6d 75 74 65 78 20 69 73 20 6e 65 65  his mutex is nee
19bf0 64 65 64 20 62 65 63 61 75 73 65 20 70 46 69 6c  ded because pFil
19c00 65 2d 3e 70 49 6e 6f 64 65 20 69 73 20 73 68 61  e->pInode is sha
19c10 72 65 64 20 61 63 72 6f 73 73 20 74 68 72 65 61  red across threa
19c20 64 73 0a 20 20 2a 2f 0a 20 20 75 6e 69 78 45 6e  ds.  */.  unixEn
19c30 74 65 72 4d 75 74 65 78 28 29 3b 0a 20 20 70 49  terMutex();.  pI
19c40 6e 6f 64 65 20 3d 20 70 46 69 6c 65 2d 3e 70 49  node = pFile->pI
19c50 6e 6f 64 65 3b 0a 0a 20 20 2f 2a 20 49 66 20 73  node;..  /* If s
19c60 6f 6d 65 20 74 68 72 65 61 64 20 75 73 69 6e 67  ome thread using
19c70 20 74 68 69 73 20 50 49 44 20 68 61 73 20 61 20   this PID has a 
19c80 6c 6f 63 6b 20 76 69 61 20 61 20 64 69 66 66 65  lock via a diffe
19c90 72 65 6e 74 20 75 6e 69 78 46 69 6c 65 2a 0a 20  rent unixFile*. 
19ca0 20 2a 2a 20 68 61 6e 64 6c 65 20 74 68 61 74 20   ** handle that 
19cb0 70 72 65 63 6c 75 64 65 73 20 74 68 65 20 72 65  precludes the re
19cc0 71 75 65 73 74 65 64 20 6c 6f 63 6b 2c 20 72 65  quested lock, re
19cd0 74 75 72 6e 20 42 55 53 59 2e 0a 20 20 2a 2f 0a  turn BUSY..  */.
19ce0 20 20 69 66 28 20 28 70 46 69 6c 65 2d 3e 65 46    if( (pFile->eF
19cf0 69 6c 65 4c 6f 63 6b 21 3d 70 49 6e 6f 64 65 2d  ileLock!=pInode-
19d00 3e 65 46 69 6c 65 4c 6f 63 6b 20 26 26 20 0a 20  >eFileLock && . 
19d10 20 20 20 20 20 20 28 70 49 6e 6f 64 65 2d 3e 65        (pInode->e
19d20 46 69 6c 65 4c 6f 63 6b 3e 3d 50 45 4e 44 49 4e  FileLock>=PENDIN
19d30 47 5f 4c 4f 43 4b 20 7c 7c 20 65 46 69 6c 65 4c  G_LOCK || eFileL
19d40 6f 63 6b 3e 53 48 41 52 45 44 5f 4c 4f 43 4b 29  ock>SHARED_LOCK)
19d50 29 0a 20 20 20 20 20 29 7b 0a 20 20 20 20 72 63  ).     ){.    rc
19d60 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a   = SQLITE_BUSY;.
19d70 20 20 20 20 67 6f 74 6f 20 61 66 70 5f 65 6e 64      goto afp_end
19d80 5f 6c 6f 63 6b 3b 0a 20 20 7d 0a 20 20 0a 20 20  _lock;.  }.  .  
19d90 2f 2a 20 49 66 20 61 20 53 48 41 52 45 44 20 6c  /* If a SHARED l
19da0 6f 63 6b 20 69 73 20 72 65 71 75 65 73 74 65 64  ock is requested
19db0 2c 20 61 6e 64 20 73 6f 6d 65 20 74 68 72 65 61  , and some threa
19dc0 64 20 75 73 69 6e 67 20 74 68 69 73 20 50 49 44  d using this PID
19dd0 20 61 6c 72 65 61 64 79 0a 20 20 2a 2a 20 68 61   already.  ** ha
19de0 73 20 61 20 53 48 41 52 45 44 20 6f 72 20 52 45  s a SHARED or RE
19df0 53 45 52 56 45 44 20 6c 6f 63 6b 2c 20 74 68 65  SERVED lock, the
19e00 6e 20 69 6e 63 72 65 6d 65 6e 74 20 72 65 66 65  n increment refe
19e10 72 65 6e 63 65 20 63 6f 75 6e 74 73 20 61 6e 64  rence counts and
19e20 0a 20 20 2a 2a 20 72 65 74 75 72 6e 20 53 51 4c  .  ** return SQL
19e30 49 54 45 5f 4f 4b 2e 0a 20 20 2a 2f 0a 20 20 69  ITE_OK..  */.  i
19e40 66 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48  f( eFileLock==SH
19e50 41 52 45 44 5f 4c 4f 43 4b 20 26 26 20 0a 20 20  ARED_LOCK && .  
19e60 20 20 20 28 70 49 6e 6f 64 65 2d 3e 65 46 69 6c     (pInode->eFil
19e70 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f  eLock==SHARED_LO
19e80 43 4b 20 7c 7c 20 70 49 6e 6f 64 65 2d 3e 65 46  CK || pInode->eF
19e90 69 6c 65 4c 6f 63 6b 3d 3d 52 45 53 45 52 56 45  ileLock==RESERVE
19ea0 44 5f 4c 4f 43 4b 29 20 29 7b 0a 20 20 20 20 61  D_LOCK) ){.    a
19eb0 73 73 65 72 74 28 20 65 46 69 6c 65 4c 6f 63 6b  ssert( eFileLock
19ec0 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b  ==SHARED_LOCK );
19ed0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 46 69  .    assert( pFi
19ee0 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d 30  le->eFileLock==0
19ef0 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
19f00 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64 3e  pInode->nShared>
19f10 30 20 29 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e  0 );.    pFile->
19f20 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 53 48 41 52  eFileLock = SHAR
19f30 45 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20 70 49 6e  ED_LOCK;.    pIn
19f40 6f 64 65 2d 3e 6e 53 68 61 72 65 64 2b 2b 3b 0a  ode->nShared++;.
19f50 20 20 20 20 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63      pInode->nLoc
19f60 6b 2b 2b 3b 0a 20 20 20 20 67 6f 74 6f 20 61 66  k++;.    goto af
19f70 70 5f 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 7d 0a  p_end_lock;.  }.
19f80 20 20 20 20 0a 20 20 2f 2a 20 41 20 50 45 4e 44      .  /* A PEND
19f90 49 4e 47 20 6c 6f 63 6b 20 69 73 20 6e 65 65 64  ING lock is need
19fa0 65 64 20 62 65 66 6f 72 65 20 61 63 71 75 69 72  ed before acquir
19fb0 69 6e 67 20 61 20 53 48 41 52 45 44 20 6c 6f 63  ing a SHARED loc
19fc0 6b 20 61 6e 64 20 62 65 66 6f 72 65 0a 20 20 2a  k and before.  *
19fd0 2a 20 61 63 71 75 69 72 69 6e 67 20 61 6e 20 45  * acquiring an E
19fe0 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 20 20  XCLUSIVE lock.  
19ff0 46 6f 72 20 74 68 65 20 53 48 41 52 45 44 20 6c  For the SHARED l
1a000 6f 63 6b 2c 20 74 68 65 20 50 45 4e 44 49 4e 47  ock, the PENDING
1a010 20 77 69 6c 6c 0a 20 20 2a 2a 20 62 65 20 72 65   will.  ** be re
1a020 6c 65 61 73 65 64 2e 0a 20 20 2a 2f 0a 20 20 69  leased..  */.  i
1a030 66 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48  f( eFileLock==SH
1a040 41 52 45 44 5f 4c 4f 43 4b 20 0a 20 20 20 20 20  ARED_LOCK .     
1a050 20 7c 7c 20 28 65 46 69 6c 65 4c 6f 63 6b 3d 3d   || (eFileLock==
1a060 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 26  EXCLUSIVE_LOCK &
1a070 26 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f  & pFile->eFileLo
1a080 63 6b 3c 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 29  ck<PENDING_LOCK)
1a090 0a 20 20 29 7b 0a 20 20 20 20 69 6e 74 20 66 61  .  ){.    int fa
1a0a0 69 6c 65 64 3b 0a 20 20 20 20 66 61 69 6c 65 64  iled;.    failed
1a0b0 20 3d 20 61 66 70 53 65 74 4c 6f 63 6b 28 63 6f   = afpSetLock(co
1a0c0 6e 74 65 78 74 2d 3e 64 62 50 61 74 68 2c 20 70  ntext->dbPath, p
1a0d0 46 69 6c 65 2c 20 50 45 4e 44 49 4e 47 5f 42 59  File, PENDING_BY
1a0e0 54 45 2c 20 31 2c 20 31 29 3b 0a 20 20 20 20 69  TE, 1, 1);.    i
1a0f0 66 20 28 66 61 69 6c 65 64 29 20 7b 0a 20 20 20  f (failed) {.   
1a100 20 20 20 72 63 20 3d 20 66 61 69 6c 65 64 3b 0a     rc = failed;.
1a110 20 20 20 20 20 20 67 6f 74 6f 20 61 66 70 5f 65        goto afp_e
1a120 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 20 20 7d 0a 20  nd_lock;.    }. 
1a130 20 7d 0a 20 20 0a 20 20 2f 2a 20 49 66 20 63 6f   }.  .  /* If co
1a140 6e 74 72 6f 6c 20 67 65 74 73 20 74 6f 20 74 68  ntrol gets to th
1a150 69 73 20 70 6f 69 6e 74 2c 20 74 68 65 6e 20 61  is point, then a
1a160 63 74 75 61 6c 6c 79 20 67 6f 20 61 68 65 61 64  ctually go ahead
1a170 20 61 6e 64 20 6d 61 6b 65 0a 20 20 2a 2a 20 6f   and make.  ** o
1a180 70 65 72 61 74 69 6e 67 20 73 79 73 74 65 6d 20  perating system 
1a190 63 61 6c 6c 73 20 66 6f 72 20 74 68 65 20 73 70  calls for the sp
1a1a0 65 63 69 66 69 65 64 20 6c 6f 63 6b 2e 0a 20 20  ecified lock..  
1a1b0 2a 2f 0a 20 20 69 66 28 20 65 46 69 6c 65 4c 6f  */.  if( eFileLo
1a1c0 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20  ck==SHARED_LOCK 
1a1d0 29 7b 0a 20 20 20 20 69 6e 74 20 6c 72 63 31 2c  ){.    int lrc1,
1a1e0 20 6c 72 63 32 2c 20 6c 72 63 31 45 72 72 6e 6f   lrc2, lrc1Errno
1a1f0 20 3d 20 30 3b 0a 20 20 20 20 6c 6f 6e 67 20 6c   = 0;.    long l
1a200 6b 2c 20 6d 61 73 6b 3b 0a 20 20 20 20 0a 20 20  k, mask;.    .  
1a210 20 20 61 73 73 65 72 74 28 20 70 49 6e 6f 64 65    assert( pInode
1a220 2d 3e 6e 53 68 61 72 65 64 3d 3d 30 20 29 3b 0a  ->nShared==0 );.
1a230 20 20 20 20 61 73 73 65 72 74 28 20 70 49 6e 6f      assert( pIno
1a240 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d 30  de->eFileLock==0
1a250 20 29 3b 0a 20 20 20 20 20 20 20 20 0a 20 20 20   );.        .   
1a260 20 6d 61 73 6b 20 3d 20 28 73 69 7a 65 6f 66 28   mask = (sizeof(
1a270 6c 6f 6e 67 29 3d 3d 38 29 20 3f 20 4c 41 52 47  long)==8) ? LARG
1a280 45 53 54 5f 49 4e 54 36 34 20 3a 20 30 78 37 66  EST_INT64 : 0x7f
1a290 66 66 66 66 66 66 3b 0a 20 20 20 20 2f 2a 20 4e  ffffff;.    /* N
1a2a0 6f 77 20 67 65 74 20 74 68 65 20 72 65 61 64 2d  ow get the read-
1a2b0 6c 6f 63 6b 20 53 48 41 52 45 44 5f 4c 4f 43 4b  lock SHARED_LOCK
1a2c0 20 2a 2f 0a 20 20 20 20 2f 2a 20 6e 6f 74 65 20   */.    /* note 
1a2d0 74 68 61 74 20 74 68 65 20 71 75 61 6c 69 74 79  that the quality
1a2e0 20 6f 66 20 74 68 65 20 72 61 6e 64 6f 6d 6e 65   of the randomne
1a2f0 73 73 20 64 6f 65 73 6e 27 74 20 6d 61 74 74 65  ss doesn't matte
1a300 72 20 74 68 61 74 20 6d 75 63 68 20 2a 2f 0a 20  r that much */. 
1a310 20 20 20 6c 6b 20 3d 20 72 61 6e 64 6f 6d 28 29     lk = random()
1a320 3b 20 0a 20 20 20 20 70 49 6e 6f 64 65 2d 3e 73  ; .    pInode->s
1a330 68 61 72 65 64 42 79 74 65 20 3d 20 28 6c 6b 20  haredByte = (lk 
1a340 26 20 6d 61 73 6b 29 25 28 53 48 41 52 45 44 5f  & mask)%(SHARED_
1a350 53 49 5a 45 20 2d 20 31 29 3b 0a 20 20 20 20 6c  SIZE - 1);.    l
1a360 72 63 31 20 3d 20 61 66 70 53 65 74 4c 6f 63 6b  rc1 = afpSetLock
1a370 28 63 6f 6e 74 65 78 74 2d 3e 64 62 50 61 74 68  (context->dbPath
1a380 2c 20 70 46 69 6c 65 2c 20 0a 20 20 20 20 20 20  , pFile, .      
1a390 20 20 20 20 53 48 41 52 45 44 5f 46 49 52 53 54      SHARED_FIRST
1a3a0 2b 70 49 6e 6f 64 65 2d 3e 73 68 61 72 65 64 42  +pInode->sharedB
1a3b0 79 74 65 2c 20 31 2c 20 31 29 3b 0a 20 20 20 20  yte, 1, 1);.    
1a3c0 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f  if( IS_LOCK_ERRO
1a3d0 52 28 6c 72 63 31 29 20 29 7b 0a 20 20 20 20 20  R(lrc1) ){.     
1a3e0 20 6c 72 63 31 45 72 72 6e 6f 20 3d 20 70 46 69   lrc1Errno = pFi
1a3f0 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 3b 0a 20  le->lastErrno;. 
1a400 20 20 20 7d 0a 20 20 20 20 2f 2a 20 44 72 6f 70     }.    /* Drop
1a410 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20 50   the temporary P
1a420 45 4e 44 49 4e 47 20 6c 6f 63 6b 20 2a 2f 0a 20  ENDING lock */. 
1a430 20 20 20 6c 72 63 32 20 3d 20 61 66 70 53 65 74     lrc2 = afpSet
1a440 4c 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 64 62  Lock(context->db
1a450 50 61 74 68 2c 20 70 46 69 6c 65 2c 20 50 45 4e  Path, pFile, PEN
1a460 44 49 4e 47 5f 42 59 54 45 2c 20 31 2c 20 30 29  DING_BYTE, 1, 0)
1a470 3b 0a 20 20 20 20 0a 20 20 20 20 69 66 28 20 49  ;.    .    if( I
1a480 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 6c 72 63  S_LOCK_ERROR(lrc
1a490 31 29 20 29 20 7b 0a 20 20 20 20 20 20 73 74 6f  1) ) {.      sto
1a4a0 72 65 4c 61 73 74 45 72 72 6e 6f 28 70 46 69 6c  reLastErrno(pFil
1a4b0 65 2c 20 6c 72 63 31 45 72 72 6e 6f 29 3b 0a 20  e, lrc1Errno);. 
1a4c0 20 20 20 20 20 72 63 20 3d 20 6c 72 63 31 3b 0a       rc = lrc1;.
1a4d0 20 20 20 20 20 20 67 6f 74 6f 20 61 66 70 5f 65        goto afp_e
1a4e0 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 20 20 7d 20 65  nd_lock;.    } e
1a4f0 6c 73 65 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f  lse if( IS_LOCK_
1a500 45 52 52 4f 52 28 6c 72 63 32 29 20 29 7b 0a 20  ERROR(lrc2) ){. 
1a510 20 20 20 20 20 72 63 20 3d 20 6c 72 63 32 3b 0a       rc = lrc2;.
1a520 20 20 20 20 20 20 67 6f 74 6f 20 61 66 70 5f 65        goto afp_e
1a530 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 20 20 7d 20 65  nd_lock;.    } e
1a540 6c 73 65 20 69 66 28 20 6c 72 63 31 20 21 3d 20  lse if( lrc1 != 
1a550 53 51 4c 49 54 45 5f 4f 4b 20 29 20 7b 0a 20 20  SQLITE_OK ) {.  
1a560 20 20 20 20 72 63 20 3d 20 6c 72 63 31 3b 0a 20      rc = lrc1;. 
1a570 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20     } else {.    
1a580 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f    pFile->eFileLo
1a590 63 6b 20 3d 20 53 48 41 52 45 44 5f 4c 4f 43 4b  ck = SHARED_LOCK
1a5a0 3b 0a 20 20 20 20 20 20 70 49 6e 6f 64 65 2d 3e  ;.      pInode->
1a5b0 6e 4c 6f 63 6b 2b 2b 3b 0a 20 20 20 20 20 20 70  nLock++;.      p
1a5c0 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64 20 3d  Inode->nShared =
1a5d0 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73   1;.    }.  }els
1a5e0 65 20 69 66 28 20 65 46 69 6c 65 4c 6f 63 6b 3d  e if( eFileLock=
1a5f0 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20  =EXCLUSIVE_LOCK 
1a600 26 26 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72  && pInode->nShar
1a610 65 64 3e 31 20 29 7b 0a 20 20 20 20 2f 2a 20 57  ed>1 ){.    /* W
1a620 65 20 61 72 65 20 74 72 79 69 6e 67 20 66 6f 72  e are trying for
1a630 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f   an exclusive lo
1a640 63 6b 20 62 75 74 20 61 6e 6f 74 68 65 72 20 74  ck but another t
1a650 68 72 65 61 64 20 69 6e 20 74 68 69 73 0a 20 20  hread in this.  
1a660 20 20 20 2a 2a 20 73 61 6d 65 20 70 72 6f 63 65     ** same proce
1a670 73 73 20 69 73 20 73 74 69 6c 6c 20 68 6f 6c 64  ss is still hold
1a680 69 6e 67 20 61 20 73 68 61 72 65 64 20 6c 6f 63  ing a shared loc
1a690 6b 2e 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 53  k. */.    rc = S
1a6a0 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 7d 65  QLITE_BUSY;.  }e
1a6b0 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20  lse{.    /* The 
1a6c0 72 65 71 75 65 73 74 20 77 61 73 20 66 6f 72 20  request was for 
1a6d0 61 20 52 45 53 45 52 56 45 44 20 6f 72 20 45 58  a RESERVED or EX
1a6e0 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 20 20 49  CLUSIVE lock.  I
1a6f0 74 20 69 73 0a 20 20 20 20 2a 2a 20 61 73 73 75  t is.    ** assu
1a700 6d 65 64 20 74 68 61 74 20 74 68 65 72 65 20 69  med that there i
1a710 73 20 61 20 53 48 41 52 45 44 20 6f 72 20 67 72  s a SHARED or gr
1a720 65 61 74 65 72 20 6c 6f 63 6b 20 6f 6e 20 74 68  eater lock on th
1a730 65 20 66 69 6c 65 0a 20 20 20 20 2a 2a 20 61 6c  e file.    ** al
1a740 72 65 61 64 79 2e 0a 20 20 20 20 2a 2f 0a 20 20  ready..    */.  
1a750 20 20 69 6e 74 20 66 61 69 6c 65 64 20 3d 20 30    int failed = 0
1a760 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 30 21  ;.    assert( 0!
1a770 3d 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63  =pFile->eFileLoc
1a780 6b 20 29 3b 0a 20 20 20 20 69 66 20 28 65 46 69  k );.    if (eFi
1a790 6c 65 4c 6f 63 6b 20 3e 3d 20 52 45 53 45 52 56  leLock >= RESERV
1a7a0 45 44 5f 4c 4f 43 4b 20 26 26 20 70 46 69 6c 65  ED_LOCK && pFile
1a7b0 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3c 20 52 45  ->eFileLock < RE
1a7c0 53 45 52 56 45 44 5f 4c 4f 43 4b 29 20 7b 0a 20  SERVED_LOCK) {. 
1a7d0 20 20 20 20 20 20 20 2f 2a 20 41 63 71 75 69 72         /* Acquir
1a7e0 65 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63  e a RESERVED loc
1a7f0 6b 20 2a 2f 0a 20 20 20 20 20 20 20 20 66 61 69  k */.        fai
1a800 6c 65 64 20 3d 20 61 66 70 53 65 74 4c 6f 63 6b  led = afpSetLock
1a810 28 63 6f 6e 74 65 78 74 2d 3e 64 62 50 61 74 68  (context->dbPath
1a820 2c 20 70 46 69 6c 65 2c 20 52 45 53 45 52 56 45  , pFile, RESERVE
1a830 44 5f 42 59 54 45 2c 20 31 2c 31 29 3b 0a 20 20  D_BYTE, 1,1);.  
1a840 20 20 20 20 69 66 28 20 21 66 61 69 6c 65 64 20      if( !failed 
1a850 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 6e 74 65  ){.        conte
1a860 78 74 2d 3e 72 65 73 65 72 76 65 64 20 3d 20 31  xt->reserved = 1
1a870 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
1a880 20 20 20 20 69 66 20 28 21 66 61 69 6c 65 64 20      if (!failed 
1a890 26 26 20 65 46 69 6c 65 4c 6f 63 6b 20 3d 3d 20  && eFileLock == 
1a8a0 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 20  EXCLUSIVE_LOCK) 
1a8b0 7b 0a 20 20 20 20 20 20 2f 2a 20 41 63 71 75 69  {.      /* Acqui
1a8c0 72 65 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20  re an EXCLUSIVE 
1a8d0 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20 20 20 20 20  lock */.        
1a8e0 0a 20 20 20 20 20 20 2f 2a 20 52 65 6d 6f 76 65  .      /* Remove
1a8f0 20 74 68 65 20 73 68 61 72 65 64 20 6c 6f 63 6b   the shared lock
1a900 20 62 65 66 6f 72 65 20 74 72 79 69 6e 67 20 74   before trying t
1a910 68 65 20 72 61 6e 67 65 2e 20 20 77 65 27 6c 6c  he range.  we'll
1a920 20 6e 65 65 64 20 74 6f 20 0a 20 20 20 20 20 20   need to .      
1a930 2a 2a 20 72 65 65 73 74 61 62 6c 69 73 68 20 74  ** reestablish t
1a940 68 65 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 69  he shared lock i
1a950 66 20 77 65 20 63 61 6e 27 74 20 67 65 74 20 74  f we can't get t
1a960 68 65 20 20 61 66 70 55 6e 6c 6f 63 6b 0a 20 20  he  afpUnlock.  
1a970 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28      */.      if(
1a980 20 21 28 66 61 69 6c 65 64 20 3d 20 61 66 70 53   !(failed = afpS
1a990 65 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e  etLock(context->
1a9a0 64 62 50 61 74 68 2c 20 70 46 69 6c 65 2c 20 53  dbPath, pFile, S
1a9b0 48 41 52 45 44 5f 46 49 52 53 54 20 2b 0a 20 20  HARED_FIRST +.  
1a9c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a9d0 20 20 20 20 20 20 20 70 49 6e 6f 64 65 2d 3e 73         pInode->s
1a9e0 68 61 72 65 64 42 79 74 65 2c 20 31 2c 20 30 29  haredByte, 1, 0)
1a9f0 29 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74  ) ){.        int
1aa00 20 66 61 69 6c 65 64 32 20 3d 20 53 51 4c 49 54   failed2 = SQLIT
1aa10 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 2f 2a  E_OK;.        /*
1aa20 20 6e 6f 77 20 61 74 74 65 6d 6d 70 74 20 74 6f   now attemmpt to
1aa30 20 67 65 74 20 74 68 65 20 65 78 63 6c 75 73 69   get the exclusi
1aa40 76 65 20 6c 6f 63 6b 20 72 61 6e 67 65 20 2a 2f  ve lock range */
1aa50 0a 20 20 20 20 20 20 20 20 66 61 69 6c 65 64 20  .        failed 
1aa60 3d 20 61 66 70 53 65 74 4c 6f 63 6b 28 63 6f 6e  = afpSetLock(con
1aa70 74 65 78 74 2d 3e 64 62 50 61 74 68 2c 20 70 46  text->dbPath, pF
1aa80 69 6c 65 2c 20 53 48 41 52 45 44 5f 46 49 52 53  ile, SHARED_FIRS
1aa90 54 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  T, .            
1aaa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1aab0 20 20 20 53 48 41 52 45 44 5f 53 49 5a 45 2c 20     SHARED_SIZE, 
1aac0 31 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  1);.        if( 
1aad0 66 61 69 6c 65 64 20 26 26 20 28 66 61 69 6c 65  failed && (faile
1aae0 64 32 20 3d 20 61 66 70 53 65 74 4c 6f 63 6b 28  d2 = afpSetLock(
1aaf0 63 6f 6e 74 65 78 74 2d 3e 64 62 50 61 74 68 2c  context->dbPath,
1ab00 20 70 46 69 6c 65 2c 20 0a 20 20 20 20 20 20 20   pFile, .       
1ab10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ab20 53 48 41 52 45 44 5f 46 49 52 53 54 20 2b 20 70  SHARED_FIRST + p
1ab30 49 6e 6f 64 65 2d 3e 73 68 61 72 65 64 42 79 74  Inode->sharedByt
1ab40 65 2c 20 31 2c 20 31 29 29 20 29 7b 0a 20 20 20  e, 1, 1)) ){.   
1ab50 20 20 20 20 20 20 20 2f 2a 20 43 61 6e 27 74 20         /* Can't 
1ab60 72 65 65 73 74 61 62 6c 69 73 68 20 74 68 65 20  reestablish the 
1ab70 73 68 61 72 65 64 20 6c 6f 63 6b 2e 20 20 53 71  shared lock.  Sq
1ab80 6c 69 74 65 20 63 61 6e 27 74 20 64 65 61 6c 2c  lite can't deal,
1ab90 20 74 68 69 73 20 69 73 0a 20 20 20 20 20 20 20   this is.       
1aba0 20 20 20 2a 2a 20 61 20 63 72 69 74 69 63 61 6c     ** a critical
1abb0 20 49 2f 4f 20 65 72 72 6f 72 0a 20 20 20 20 20   I/O error.     
1abc0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
1abd0 20 20 72 63 20 3d 20 28 28 66 61 69 6c 65 64 20    rc = ((failed 
1abe0 26 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 29 20  & SQLITE_IOERR) 
1abf0 3d 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 29  == SQLITE_IOERR)
1ac00 20 3f 20 66 61 69 6c 65 64 32 20 3a 20 0a 20 20   ? failed2 : .  
1ac10 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c               SQL
1ac20 49 54 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b 3b 0a  ITE_IOERR_LOCK;.
1ac30 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 61            goto a
1ac40 66 70 5f 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 20  fp_end_lock;.   
1ac50 20 20 20 20 20 7d 20 0a 20 20 20 20 20 20 7d 65       } .      }e
1ac60 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72 63 20  lse{.        rc 
1ac70 3d 20 66 61 69 6c 65 64 3b 20 0a 20 20 20 20 20  = failed; .     
1ac80 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28   }.    }.    if(
1ac90 20 66 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 20   failed ){.     
1aca0 20 72 63 20 3d 20 66 61 69 6c 65 64 3b 0a 20 20   rc = failed;.  
1acb0 20 20 7d 0a 20 20 7d 0a 20 20 0a 20 20 69 66 28    }.  }.  .  if(
1acc0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
1acd0 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 65 46 69  {.    pFile->eFi
1ace0 6c 65 4c 6f 63 6b 20 3d 20 65 46 69 6c 65 4c 6f  leLock = eFileLo
1acf0 63 6b 3b 0a 20 20 20 20 70 49 6e 6f 64 65 2d 3e  ck;.    pInode->
1ad00 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 65 46 69 6c  eFileLock = eFil
1ad10 65 4c 6f 63 6b 3b 0a 20 20 7d 65 6c 73 65 20 69  eLock;.  }else i
1ad20 66 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 45 58  f( eFileLock==EX
1ad30 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 29 7b 0a  CLUSIVE_LOCK ){.
1ad40 20 20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65      pFile->eFile
1ad50 4c 6f 63 6b 20 3d 20 50 45 4e 44 49 4e 47 5f 4c  Lock = PENDING_L
1ad60 4f 43 4b 3b 0a 20 20 20 20 70 49 6e 6f 64 65 2d  OCK;.    pInode-
1ad70 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 50 45 4e  >eFileLock = PEN
1ad80 44 49 4e 47 5f 4c 4f 43 4b 3b 0a 20 20 7d 0a 20  DING_LOCK;.  }. 
1ad90 20 0a 61 66 70 5f 65 6e 64 5f 6c 6f 63 6b 3a 0a   .afp_end_lock:.
1ada0 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78    unixLeaveMutex
1adb0 28 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22  ();.  OSTRACE(("
1adc0 4c 4f 43 4b 20 20 20 20 25 64 20 25 73 20 25 73  LOCK    %d %s %s
1add0 20 28 61 66 70 29 5c 6e 22 2c 20 70 46 69 6c 65   (afp)\n", pFile
1ade0 2d 3e 68 2c 20 61 7a 46 69 6c 65 4c 6f 63 6b 28  ->h, azFileLock(
1adf0 65 46 69 6c 65 4c 6f 63 6b 29 2c 20 0a 20 20 20  eFileLock), .   
1ae00 20 20 20 20 20 20 72 63 3d 3d 53 51 4c 49 54 45        rc==SQLITE
1ae10 5f 4f 4b 20 3f 20 22 6f 6b 22 20 3a 20 22 66 61  _OK ? "ok" : "fa
1ae20 69 6c 65 64 22 29 29 3b 0a 20 20 72 65 74 75 72  iled"));.  retur
1ae30 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c  n rc;.}../*.** L
1ae40 6f 77 65 72 20 74 68 65 20 6c 6f 63 6b 69 6e 67  ower the locking
1ae50 20 6c 65 76 65 6c 20 6f 6e 20 66 69 6c 65 20 64   level on file d
1ae60 65 73 63 72 69 70 74 6f 72 20 70 46 69 6c 65 20  escriptor pFile 
1ae70 74 6f 20 65 46 69 6c 65 4c 6f 63 6b 2e 20 20 65  to eFileLock.  e
1ae80 46 69 6c 65 4c 6f 63 6b 0a 2a 2a 20 6d 75 73 74  FileLock.** must
1ae90 20 62 65 20 65 69 74 68 65 72 20 4e 4f 5f 4c 4f   be either NO_LO
1aea0 43 4b 20 6f 72 20 53 48 41 52 45 44 5f 4c 4f 43  CK or SHARED_LOC
1aeb0 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  K..**.** If the 
1aec0 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 66  locking level of
1aed0 20 74 68 65 20 66 69 6c 65 20 64 65 73 63 72 69   the file descri
1aee0 70 74 6f 72 20 69 73 20 61 6c 72 65 61 64 79 20  ptor is already 
1aef0 61 74 20 6f 72 20 62 65 6c 6f 77 0a 2a 2a 20 74  at or below.** t
1af00 68 65 20 72 65 71 75 65 73 74 65 64 20 6c 6f 63  he requested loc
1af10 6b 69 6e 67 20 6c 65 76 65 6c 2c 20 74 68 69 73  king level, this
1af20 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f   routine is a no
1af30 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  -op..*/.static i
1af40 6e 74 20 61 66 70 55 6e 6c 6f 63 6b 28 73 71 6c  nt afpUnlock(sql
1af50 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69  ite3_file *id, i
1af60 6e 74 20 65 46 69 6c 65 4c 6f 63 6b 29 20 7b 0a  nt eFileLock) {.
1af70 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
1af80 45 5f 4f 4b 3b 0a 20 20 75 6e 69 78 46 69 6c 65  E_OK;.  unixFile
1af90 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46   *pFile = (unixF
1afa0 69 6c 65 2a 29 69 64 3b 0a 20 20 75 6e 69 78 49  ile*)id;.  unixI
1afb0 6e 6f 64 65 49 6e 66 6f 20 2a 70 49 6e 6f 64 65  nodeInfo *pInode
1afc0 3b 0a 20 20 61 66 70 4c 6f 63 6b 69 6e 67 43 6f  ;.  afpLockingCo
1afd0 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 20 3d  ntext *context =
1afe0 20 28 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74   (afpLockingCont
1aff0 65 78 74 20 2a 29 20 70 46 69 6c 65 2d 3e 6c 6f  ext *) pFile->lo
1b000 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 0a 20 20  ckingContext;.  
1b010 69 6e 74 20 73 6b 69 70 53 68 61 72 65 64 20 3d  int skipShared =
1b020 20 30 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54   0;.#ifdef SQLIT
1b030 45 5f 54 45 53 54 0a 20 20 69 6e 74 20 68 20 3d  E_TEST.  int h =
1b040 20 70 46 69 6c 65 2d 3e 68 3b 0a 23 65 6e 64 69   pFile->h;.#endi
1b050 66 0a 0a 20 20 61 73 73 65 72 74 28 20 70 46 69  f..  assert( pFi
1b060 6c 65 20 29 3b 0a 20 20 4f 53 54 52 41 43 45 28  le );.  OSTRACE(
1b070 28 22 55 4e 4c 4f 43 4b 20 20 25 64 20 25 64 20  ("UNLOCK  %d %d 
1b080 77 61 73 20 25 64 28 25 64 2c 25 64 29 20 70 69  was %d(%d,%d) pi
1b090 64 3d 25 64 20 28 61 66 70 29 5c 6e 22 2c 20 70  d=%d (afp)\n", p
1b0a0 46 69 6c 65 2d 3e 68 2c 20 65 46 69 6c 65 4c 6f  File->h, eFileLo
1b0b0 63 6b 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70  ck,.           p
1b0c0 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 2c  File->eFileLock,
1b0d0 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e   pFile->pInode->
1b0e0 65 46 69 6c 65 4c 6f 63 6b 2c 20 70 46 69 6c 65  eFileLock, pFile
1b0f0 2d 3e 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65  ->pInode->nShare
1b100 64 2c 0a 20 20 20 20 20 20 20 20 20 20 20 6f 73  d,.           os
1b110 47 65 74 70 69 64 28 30 29 29 29 3b 0a 0a 20 20  Getpid(0)));..  
1b120 61 73 73 65 72 74 28 20 65 46 69 6c 65 4c 6f 63  assert( eFileLoc
1b130 6b 3c 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29  k<=SHARED_LOCK )
1b140 3b 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 65  ;.  if( pFile->e
1b150 46 69 6c 65 4c 6f 63 6b 3c 3d 65 46 69 6c 65 4c  FileLock<=eFileL
1b160 6f 63 6b 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ock ){.    retur
1b170 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
1b180 0a 20 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65  .  unixEnterMute
1b190 78 28 29 3b 0a 20 20 70 49 6e 6f 64 65 20 3d 20  x();.  pInode = 
1b1a0 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 3b 0a 20  pFile->pInode;. 
1b1b0 20 61 73 73 65 72 74 28 20 70 49 6e 6f 64 65 2d   assert( pInode-
1b1c0 3e 6e 53 68 61 72 65 64 21 3d 30 20 29 3b 0a 20  >nShared!=0 );. 
1b1d0 20 69 66 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c   if( pFile->eFil
1b1e0 65 4c 6f 63 6b 3e 53 48 41 52 45 44 5f 4c 4f 43  eLock>SHARED_LOC
1b1f0 4b 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  K ){.    assert(
1b200 20 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f   pInode->eFileLo
1b210 63 6b 3d 3d 70 46 69 6c 65 2d 3e 65 46 69 6c 65  ck==pFile->eFile
1b220 4c 6f 63 6b 20 29 3b 0a 20 20 20 20 53 69 6d 75  Lock );.    Simu
1b230 6c 61 74 65 49 4f 45 72 72 6f 72 42 65 6e 69 67  lateIOErrorBenig
1b240 6e 28 31 29 3b 0a 20 20 20 20 53 69 6d 75 6c 61  n(1);.    Simula
1b250 74 65 49 4f 45 72 72 6f 72 28 20 68 3d 28 2d 31  teIOError( h=(-1
1b260 29 20 29 0a 20 20 20 20 53 69 6d 75 6c 61 74 65  ) ).    Simulate
1b270 49 4f 45 72 72 6f 72 42 65 6e 69 67 6e 28 30 29  IOErrorBenign(0)
1b280 3b 0a 20 20 20 20 0a 23 69 66 64 65 66 20 53 51  ;.    .#ifdef SQ
1b290 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 20 20 2f  LITE_DEBUG.    /
1b2a0 2a 20 57 68 65 6e 20 72 65 64 75 63 69 6e 67 20  * When reducing 
1b2b0 61 20 6c 6f 63 6b 20 73 75 63 68 20 74 68 61 74  a lock such that
1b2c0 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 65 73   other processes
1b2d0 20 63 61 6e 20 73 74 61 72 74 0a 20 20 20 20 2a   can start.    *
1b2e0 2a 20 72 65 61 64 69 6e 67 20 74 68 65 20 64 61  * reading the da
1b2f0 74 61 62 61 73 65 20 66 69 6c 65 20 61 67 61 69  tabase file agai
1b300 6e 2c 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61  n, make sure tha
1b310 74 20 74 68 65 0a 20 20 20 20 2a 2a 20 74 72 61  t the.    ** tra
1b320 6e 73 61 63 74 69 6f 6e 20 63 6f 75 6e 74 65 72  nsaction counter
1b330 20 77 61 73 20 75 70 64 61 74 65 64 20 69 66 20   was updated if 
1b340 61 6e 79 20 70 61 72 74 20 6f 66 20 74 68 65 20  any part of the 
1b350 64 61 74 61 62 61 73 65 0a 20 20 20 20 2a 2a 20  database.    ** 
1b360 66 69 6c 65 20 63 68 61 6e 67 65 64 2e 20 20 49  file changed.  I
1b370 66 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  f the transactio
1b380 6e 20 63 6f 75 6e 74 65 72 20 69 73 20 6e 6f 74  n counter is not
1b390 20 75 70 64 61 74 65 64 2c 0a 20 20 20 20 2a 2a   updated,.    **
1b3a0 20 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f   other connectio
1b3b0 6e 73 20 74 6f 20 74 68 65 20 73 61 6d 65 20 66  ns to the same f
1b3c0 69 6c 65 20 6d 69 67 68 74 20 6e 6f 74 20 72 65  ile might not re
1b3d0 61 6c 69 7a 65 20 74 68 61 74 0a 20 20 20 20 2a  alize that.    *
1b3e0 2a 20 74 68 65 20 66 69 6c 65 20 68 61 73 20 63  * the file has c
1b3f0 68 61 6e 67 65 64 20 61 6e 64 20 68 65 6e 63 65  hanged and hence
1b400 20 6d 69 67 68 74 20 6e 6f 74 20 6b 6e 6f 77 20   might not know 
1b410 74 6f 20 66 6c 75 73 68 20 74 68 65 69 72 0a 20  to flush their. 
1b420 20 20 20 2a 2a 20 63 61 63 68 65 2e 20 20 54 68     ** cache.  Th
1b430 65 20 75 73 65 20 6f 66 20 61 20 73 74 61 6c 65  e use of a stale
1b440 20 63 61 63 68 65 20 63 61 6e 20 6c 65 61 64 20   cache can lead 
1b450 74 6f 20 64 61 74 61 62 61 73 65 20 63 6f 72 72  to database corr
1b460 75 70 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20  uption..    */. 
1b470 20 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65     assert( pFile
1b480 2d 3e 69 6e 4e 6f 72 6d 61 6c 57 72 69 74 65 3d  ->inNormalWrite=
1b490 3d 30 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c  =0.           ||
1b4a0 20 70 46 69 6c 65 2d 3e 64 62 55 70 64 61 74 65   pFile->dbUpdate
1b4b0 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 20 20 7c  ==0.           |
1b4c0 7c 20 70 46 69 6c 65 2d 3e 74 72 61 6e 73 43 6e  | pFile->transCn
1b4d0 74 72 43 68 6e 67 3d 3d 31 20 29 3b 0a 20 20 20  trChng==1 );.   
1b4e0 20 70 46 69 6c 65 2d 3e 69 6e 4e 6f 72 6d 61 6c   pFile->inNormal
1b4f0 57 72 69 74 65 20 3d 20 30 3b 0a 23 65 6e 64 69  Write = 0;.#endi
1b500 66 0a 20 20 20 20 0a 20 20 20 20 69 66 28 20 70  f.    .    if( p
1b510 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d  File->eFileLock=
1b520 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20  =EXCLUSIVE_LOCK 
1b530 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 61 66  ){.      rc = af
1b540 70 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74  pSetLock(context
1b550 2d 3e 64 62 50 61 74 68 2c 20 70 46 69 6c 65 2c  ->dbPath, pFile,
1b560 20 53 48 41 52 45 44 5f 46 49 52 53 54 2c 20 53   SHARED_FIRST, S
1b570 48 41 52 45 44 5f 53 49 5a 45 2c 20 30 29 3b 0a  HARED_SIZE, 0);.
1b580 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
1b590 4c 49 54 45 5f 4f 4b 20 26 26 20 28 65 46 69 6c  LITE_OK && (eFil
1b5a0 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f  eLock==SHARED_LO
1b5b0 43 4b 20 7c 7c 20 70 49 6e 6f 64 65 2d 3e 6e 53  CK || pInode->nS
1b5c0 68 61 72 65 64 3e 31 29 20 29 7b 0a 20 20 20 20  hared>1) ){.    
1b5d0 20 20 20 20 2f 2a 20 6f 6e 6c 79 20 72 65 2d 65      /* only re-e
1b5e0 73 74 61 62 6c 69 73 68 20 74 68 65 20 73 68 61  stablish the sha
1b5f0 72 65 64 20 6c 6f 63 6b 20 69 66 20 6e 65 63 65  red lock if nece
1b600 73 73 61 72 79 20 2a 2f 0a 20 20 20 20 20 20 20  ssary */.       
1b610 20 69 6e 74 20 73 68 61 72 65 64 4c 6f 63 6b 42   int sharedLockB
1b620 79 74 65 20 3d 20 53 48 41 52 45 44 5f 46 49 52  yte = SHARED_FIR
1b630 53 54 2b 70 49 6e 6f 64 65 2d 3e 73 68 61 72 65  ST+pInode->share
1b640 64 42 79 74 65 3b 0a 20 20 20 20 20 20 20 20 72  dByte;.        r
1b650 63 20 3d 20 61 66 70 53 65 74 4c 6f 63 6b 28 63  c = afpSetLock(c
1b660 6f 6e 74 65 78 74 2d 3e 64 62 50 61 74 68 2c 20  ontext->dbPath, 
1b670 70 46 69 6c 65 2c 20 73 68 61 72 65 64 4c 6f 63  pFile, sharedLoc
1b680 6b 42 79 74 65 2c 20 31 2c 20 31 29 3b 0a 20 20  kByte, 1, 1);.  
1b690 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20      } else {.   
1b6a0 20 20 20 20 20 73 6b 69 70 53 68 61 72 65 64 20       skipShared 
1b6b0 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = 1;.      }.   
1b6c0 20 7d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53   }.    if( rc==S
1b6d0 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 46 69 6c  QLITE_OK && pFil
1b6e0 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3e 3d 50 45  e->eFileLock>=PE
1b6f0 4e 44 49 4e 47 5f 4c 4f 43 4b 20 29 7b 0a 20 20  NDING_LOCK ){.  
1b700 20 20 20 20 72 63 20 3d 20 61 66 70 53 65 74 4c      rc = afpSetL
1b710 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 64 62 50  ock(context->dbP
1b720 61 74 68 2c 20 70 46 69 6c 65 2c 20 50 45 4e 44  ath, pFile, PEND
1b730 49 4e 47 5f 42 59 54 45 2c 20 31 2c 20 30 29 3b  ING_BYTE, 1, 0);
1b740 0a 20 20 20 20 7d 20 0a 20 20 20 20 69 66 28 20  .    } .    if( 
1b750 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
1b760 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63   pFile->eFileLoc
1b770 6b 3e 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b  k>=RESERVED_LOCK
1b780 20 26 26 20 63 6f 6e 74 65 78 74 2d 3e 72 65 73   && context->res
1b790 65 72 76 65 64 20 29 7b 0a 20 20 20 20 20 20 72  erved ){.      r
1b7a0 63 20 3d 20 61 66 70 53 65 74 4c 6f 63 6b 28 63  c = afpSetLock(c
1b7b0 6f 6e 74 65 78 74 2d 3e 64 62 50 61 74 68 2c 20  ontext->dbPath, 
1b7c0 70 46 69 6c 65 2c 20 52 45 53 45 52 56 45 44 5f  pFile, RESERVED_
1b7d0 42 59 54 45 2c 20 31 2c 20 30 29 3b 0a 20 20 20  BYTE, 1, 0);.   
1b7e0 20 20 20 69 66 28 20 21 72 63 20 29 7b 20 0a 20     if( !rc ){ . 
1b7f0 20 20 20 20 20 20 20 63 6f 6e 74 65 78 74 2d 3e         context->
1b800 72 65 73 65 72 76 65 64 20 3d 20 30 3b 20 0a 20  reserved = 0; . 
1b810 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
1b820 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
1b830 4f 4b 20 26 26 20 28 65 46 69 6c 65 4c 6f 63 6b  OK && (eFileLock
1b840 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 7c 7c  ==SHARED_LOCK ||
1b850 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64   pInode->nShared
1b860 3e 31 29 29 7b 0a 20 20 20 20 20 20 70 49 6e 6f  >1)){.      pIno
1b870 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20  de->eFileLock = 
1b880 53 48 41 52 45 44 5f 4c 4f 43 4b 3b 0a 20 20 20  SHARED_LOCK;.   
1b890 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d   }.  }.  if( rc=
1b8a0 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 65 46  =SQLITE_OK && eF
1b8b0 69 6c 65 4c 6f 63 6b 3d 3d 4e 4f 5f 4c 4f 43 4b  ileLock==NO_LOCK
1b8c0 20 29 7b 0a 0a 20 20 20 20 2f 2a 20 44 65 63 72   ){..    /* Decr
1b8d0 65 6d 65 6e 74 20 74 68 65 20 73 68 61 72 65 64  ement the shared
1b8e0 20 6c 6f 63 6b 20 63 6f 75 6e 74 65 72 2e 20 20   lock counter.  
1b8f0 52 65 6c 65 61 73 65 20 74 68 65 20 6c 6f 63 6b  Release the lock
1b900 20 75 73 69 6e 67 20 61 6e 0a 20 20 20 20 2a 2a   using an.    **
1b910 20 4f 53 20 63 61 6c 6c 20 6f 6e 6c 79 20 77 68   OS call only wh
1b920 65 6e 20 61 6c 6c 20 74 68 72 65 61 64 73 20 69  en all threads i
1b930 6e 20 74 68 69 73 20 73 61 6d 65 20 70 72 6f 63  n this same proc
1b940 65 73 73 20 68 61 76 65 20 72 65 6c 65 61 73 65  ess have release
1b950 64 0a 20 20 20 20 2a 2a 20 74 68 65 20 6c 6f 63  d.    ** the loc
1b960 6b 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 75 6e  k..    */.    un
1b970 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6c 6f 6e 67  signed long long
1b980 20 73 68 61 72 65 64 4c 6f 63 6b 42 79 74 65 20   sharedLockByte 
1b990 3d 20 53 48 41 52 45 44 5f 46 49 52 53 54 2b 70  = SHARED_FIRST+p
1b9a0 49 6e 6f 64 65 2d 3e 73 68 61 72 65 64 42 79 74  Inode->sharedByt
1b9b0 65 3b 0a 20 20 20 20 70 49 6e 6f 64 65 2d 3e 6e  e;.    pInode->n
1b9c0 53 68 61 72 65 64 2d 2d 3b 0a 20 20 20 20 69 66  Shared--;.    if
1b9d0 28 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65  ( pInode->nShare
1b9e0 64 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 53 69  d==0 ){.      Si
1b9f0 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 42 65 6e  mulateIOErrorBen
1ba00 69 67 6e 28 31 29 3b 0a 20 20 20 20 20 20 53 69  ign(1);.      Si
1ba10 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 68  mulateIOError( h
1ba20 3d 28 2d 31 29 20 29 0a 20 20 20 20 20 20 53 69  =(-1) ).      Si
1ba30 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 42 65 6e  mulateIOErrorBen
1ba40 69 67 6e 28 30 29 3b 0a 20 20 20 20 20 20 69 66  ign(0);.      if
1ba50 28 20 21 73 6b 69 70 53 68 61 72 65 64 20 29 7b  ( !skipShared ){
1ba60 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 61 66  .        rc = af
1ba70 70 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74  pSetLock(context
1ba80 2d 3e 64 62 50 61 74 68 2c 20 70 46 69 6c 65 2c  ->dbPath, pFile,
1ba90 20 73 68 61 72 65 64 4c 6f 63 6b 42 79 74 65 2c   sharedLockByte,
1baa0 20 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a   1, 0);.      }.
1bab0 20 20 20 20 20 20 69 66 28 20 21 72 63 20 29 7b        if( !rc ){
1bac0 0a 20 20 20 20 20 20 20 20 70 49 6e 6f 64 65 2d  .        pInode-
1bad0 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 4e 4f 5f  >eFileLock = NO_
1bae0 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 20 20 70 46  LOCK;.        pF
1baf0 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d  ile->eFileLock =
1bb00 20 4e 4f 5f 4c 4f 43 4b 3b 0a 20 20 20 20 20 20   NO_LOCK;.      
1bb10 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  }.    }.    if( 
1bb20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
1bb30 0a 20 20 20 20 20 20 70 49 6e 6f 64 65 2d 3e 6e  .      pInode->n
1bb40 4c 6f 63 6b 2d 2d 3b 0a 20 20 20 20 20 20 61 73  Lock--;.      as
1bb50 73 65 72 74 28 20 70 49 6e 6f 64 65 2d 3e 6e 4c  sert( pInode->nL
1bb60 6f 63 6b 3e 3d 30 20 29 3b 0a 20 20 20 20 20 20  ock>=0 );.      
1bb70 69 66 28 20 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63  if( pInode->nLoc
1bb80 6b 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  k==0 ){.        
1bb90 63 6c 6f 73 65 50 65 6e 64 69 6e 67 46 64 73 28  closePendingFds(
1bba0 70 46 69 6c 65 29 3b 0a 20 20 20 20 20 20 7d 0a  pFile);.      }.
1bbb0 20 20 20 20 7d 0a 20 20 7d 0a 20 20 0a 20 20 75      }.  }.  .  u
1bbc0 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b  nixLeaveMutex();
1bbd0 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
1bbe0 45 5f 4f 4b 20 29 20 70 46 69 6c 65 2d 3e 65 46  E_OK ) pFile->eF
1bbf0 69 6c 65 4c 6f 63 6b 20 3d 20 65 46 69 6c 65 4c  ileLock = eFileL
1bc00 6f 63 6b 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  ock;.  return rc
1bc10 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65  ;.}../*.** Close
1bc20 20 61 20 66 69 6c 65 20 26 20 63 6c 65 61 6e 75   a file & cleanu
1bc30 70 20 41 46 50 20 73 70 65 63 69 66 69 63 20 6c  p AFP specific l
1bc40 6f 63 6b 69 6e 67 20 63 6f 6e 74 65 78 74 20 0a  ocking context .
1bc50 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 66  */.static int af
1bc60 70 43 6c 6f 73 65 28 73 71 6c 69 74 65 33 5f 66  pClose(sqlite3_f
1bc70 69 6c 65 20 2a 69 64 29 20 7b 0a 20 20 69 6e 74  ile *id) {.  int
1bc80 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
1bc90 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69  .  unixFile *pFi
1bca0 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29  le = (unixFile*)
1bcb0 69 64 3b 0a 20 20 61 73 73 65 72 74 28 20 69 64  id;.  assert( id
1bcc0 21 3d 30 20 29 3b 0a 20 20 61 66 70 55 6e 6c 6f  !=0 );.  afpUnlo
1bcd0 63 6b 28 69 64 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b  ck(id, NO_LOCK);
1bce0 0a 20 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65  .  unixEnterMute
1bcf0 78 28 29 3b 0a 20 20 69 66 28 20 70 46 69 6c 65  x();.  if( pFile
1bd00 2d 3e 70 49 6e 6f 64 65 20 26 26 20 70 46 69 6c  ->pInode && pFil
1bd10 65 2d 3e 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b  e->pInode->nLock
1bd20 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68   ){.    /* If th
1bd30 65 72 65 20 61 72 65 20 6f 75 74 73 74 61 6e 64  ere are outstand
1bd40 69 6e 67 20 6c 6f 63 6b 73 2c 20 64 6f 20 6e 6f  ing locks, do no
1bd50 74 20 61 63 74 75 61 6c 6c 79 20 63 6c 6f 73 65  t actually close
1bd60 20 74 68 65 20 66 69 6c 65 20 6a 75 73 74 0a 20   the file just. 
1bd70 20 20 20 2a 2a 20 79 65 74 20 62 65 63 61 75 73     ** yet becaus
1bd80 65 20 74 68 61 74 20 77 6f 75 6c 64 20 63 6c 65  e that would cle
1bd90 61 72 20 74 68 6f 73 65 20 6c 6f 63 6b 73 2e 20  ar those locks. 
1bda0 20 49 6e 73 74 65 61 64 2c 20 61 64 64 20 74 68   Instead, add th
1bdb0 65 20 66 69 6c 65 0a 20 20 20 20 2a 2a 20 64 65  e file.    ** de
1bdc0 73 63 72 69 70 74 6f 72 20 74 6f 20 70 49 6e 6f  scriptor to pIno
1bdd0 64 65 2d 3e 61 50 65 6e 64 69 6e 67 2e 20 20 49  de->aPending.  I
1bde0 74 20 77 69 6c 6c 20 62 65 20 61 75 74 6f 6d 61  t will be automa
1bdf0 74 69 63 61 6c 6c 79 20 63 6c 6f 73 65 64 20 77  tically closed w
1be00 68 65 6e 0a 20 20 20 20 2a 2a 20 74 68 65 20 6c  hen.    ** the l
1be10 61 73 74 20 6c 6f 63 6b 20 69 73 20 63 6c 65 61  ast lock is clea
1be20 72 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  red..    */.    
1be30 73 65 74 50 65 6e 64 69 6e 67 46 64 28 70 46 69  setPendingFd(pFi
1be40 6c 65 29 3b 0a 20 20 7d 0a 20 20 72 65 6c 65 61  le);.  }.  relea
1be50 73 65 49 6e 6f 64 65 49 6e 66 6f 28 70 46 69 6c  seInodeInfo(pFil
1be60 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72  e);.  sqlite3_fr
1be70 65 65 28 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e  ee(pFile->lockin
1be80 67 43 6f 6e 74 65 78 74 29 3b 0a 20 20 72 63 20  gContext);.  rc 
1be90 3d 20 63 6c 6f 73 65 55 6e 69 78 46 69 6c 65 28  = closeUnixFile(
1bea0 69 64 29 3b 0a 20 20 75 6e 69 78 4c 65 61 76 65  id);.  unixLeave
1beb0 4d 75 74 65 78 28 29 3b 0a 20 20 72 65 74 75 72  Mutex();.  retur
1bec0 6e 20 72 63 3b 0a 7d 0a 0a 23 65 6e 64 69 66 20  n rc;.}..#endif 
1bed0 2f 2a 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50  /* defined(__APP
1bee0 4c 45 5f 5f 29 20 26 26 20 53 51 4c 49 54 45 5f  LE__) && SQLITE_
1bef0 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53  ENABLE_LOCKING_S
1bf00 54 59 4c 45 20 2a 2f 0a 2f 2a 0a 2a 2a 20 54 68  TYLE */./*.** Th
1bf10 65 20 63 6f 64 65 20 61 62 6f 76 65 20 69 73 20  e code above is 
1bf20 74 68 65 20 41 46 50 20 6c 6f 63 6b 20 69 6d 70  the AFP lock imp
1bf30 6c 65 6d 65 6e 74 61 74 69 6f 6e 2e 20 20 54 68  lementation.  Th
1bf40 65 20 63 6f 64 65 20 69 73 20 73 70 65 63 69 66  e code is specif
1bf50 69 63 0a 2a 2a 20 74 6f 20 4d 61 63 4f 53 58 20  ic.** to MacOSX 
1bf60 61 6e 64 20 64 6f 65 73 20 6e 6f 74 20 77 6f 72  and does not wor
1bf70 6b 20 6f 6e 20 6f 74 68 65 72 20 75 6e 69 78 20  k on other unix 
1bf80 70 6c 61 74 66 6f 72 6d 73 2e 20 20 4e 6f 20 61  platforms.  No a
1bf90 6c 74 65 72 6e 61 74 69 76 65 0a 2a 2a 20 69 73  lternative.** is
1bfa0 20 61 76 61 69 6c 61 62 6c 65 2e 20 20 49 66 20   available.  If 
1bfb0 79 6f 75 20 64 6f 6e 27 74 20 63 6f 6d 70 69 6c  you don't compil
1bfc0 65 20 66 6f 72 20 61 20 6d 61 63 2c 20 74 68 65  e for a mac, the
1bfd0 6e 20 74 68 65 20 22 75 6e 69 78 2d 61 66 70 22  n the "unix-afp"
1bfe0 0a 2a 2a 20 56 46 53 20 69 73 20 6e 6f 74 20 61  .** VFS is not a
1bff0 76 61 69 6c 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 2a  vailable..**.***
1c000 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1c010 2a 2a 20 45 6e 64 20 6f 66 20 74 68 65 20 41 46  ** End of the AF
1c020 50 20 6c 6f 63 6b 20 69 6d 70 6c 65 6d 65 6e 74  P lock implement
1c030 61 74 69 6f 6e 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ation **********
1c040 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a  ************.***
1c050 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1c060 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1c070 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1c080 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1c090 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a  ***********/../*
1c0a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1c0b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
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 0a 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 20 42 65 67 69 6e 20  ********* Begin 
1c110 4e 46 53 20 4c 6f 63 6b 69 6e 67 20 2a 2a 2a 2a  NFS Locking ****
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 2f 0a 0a 23  ************/..#
1c140 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50  if defined(__APP
1c150 4c 45 5f 5f 29 20 26 26 20 53 51 4c 49 54 45 5f  LE__) && SQLITE_
1c160 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53  ENABLE_LOCKING_S
1c170 54 59 4c 45 0a 2f 2a 0a 20 2a 2a 20 4c 6f 77 65  TYLE./*. ** Lowe
1c180 72 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65  r the locking le
1c190 76 65 6c 20 6f 6e 20 66 69 6c 65 20 64 65 73 63  vel on file desc
1c1a0 72 69 70 74 6f 72 20 70 46 69 6c 65 20 74 6f 20  riptor pFile to 
1c1b0 65 46 69 6c 65 4c 6f 63 6b 2e 20 20 65 46 69 6c  eFileLock.  eFil
1c1c0 65 4c 6f 63 6b 0a 20 2a 2a 20 6d 75 73 74 20 62  eLock. ** must b
1c1d0 65 20 65 69 74 68 65 72 20 4e 4f 5f 4c 4f 43 4b  e either NO_LOCK
1c1e0 20 6f 72 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2e   or SHARED_LOCK.
1c1f0 0a 20 2a 2a 0a 20 2a 2a 20 49 66 20 74 68 65 20  . **. ** If the 
1c200 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 66  locking level of
1c210 20 74 68 65 20 66 69 6c 65 20 64 65 73 63 72 69   the file descri
1c220 70 74 6f 72 20 69 73 20 61 6c 72 65 61 64 79 20  ptor is already 
1c230 61 74 20 6f 72 20 62 65 6c 6f 77 0a 20 2a 2a 20  at or below. ** 
1c240 74 68 65 20 72 65 71 75 65 73 74 65 64 20 6c 6f  the requested lo
1c250 63 6b 69 6e 67 20 6c 65 76 65 6c 2c 20 74 68 69  cking level, thi
1c260 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e  s routine is a n
1c270 6f 2d 6f 70 2e 0a 20 2a 2f 0a 73 74 61 74 69 63  o-op.. */.static
1c280 20 69 6e 74 20 6e 66 73 55 6e 6c 6f 63 6b 28 73   int nfsUnlock(s
1c290 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c  qlite3_file *id,
1c2a0 20 69 6e 74 20 65 46 69 6c 65 4c 6f 63 6b 29 7b   int eFileLock){
1c2b0 0a 20 20 72 65 74 75 72 6e 20 70 6f 73 69 78 55  .  return posixU
1c2c0 6e 6c 6f 63 6b 28 69 64 2c 20 65 46 69 6c 65 4c  nlock(id, eFileL
1c2d0 6f 63 6b 2c 20 31 29 3b 0a 7d 0a 0a 23 65 6e 64  ock, 1);.}..#end
1c2e0 69 66 20 2f 2a 20 64 65 66 69 6e 65 64 28 5f 5f  if /* defined(__
1c2f0 41 50 50 4c 45 5f 5f 29 20 26 26 20 53 51 4c 49  APPLE__) && SQLI
1c300 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e  TE_ENABLE_LOCKIN
1c310 47 5f 53 54 59 4c 45 20 2a 2f 0a 2f 2a 0a 2a 2a  G_STYLE */./*.**
1c320 20 54 68 65 20 63 6f 64 65 20 61 62 6f 76 65 20   The code above 
1c330 69 73 20 74 68 65 20 4e 46 53 20 6c 6f 63 6b 20  is the NFS lock 
1c340 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 2e 20  implementation. 
1c350 20 54 68 65 20 63 6f 64 65 20 69 73 20 73 70 65   The code is spe
1c360 63 69 66 69 63 0a 2a 2a 20 74 6f 20 4d 61 63 4f  cific.** to MacO
1c370 53 58 20 61 6e 64 20 64 6f 65 73 20 6e 6f 74 20  SX and does not 
1c380 77 6f 72 6b 20 6f 6e 20 6f 74 68 65 72 20 75 6e  work on other un
1c390 69 78 20 70 6c 61 74 66 6f 72 6d 73 2e 20 20 4e  ix platforms.  N
1c3a0 6f 20 61 6c 74 65 72 6e 61 74 69 76 65 0a 2a 2a  o alternative.**
1c3b0 20 69 73 20 61 76 61 69 6c 61 62 6c 65 2e 20 20   is available.  
1c3c0 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .**.************
1c3d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64 20 6f 66  ********* End of
1c3e0 20 74 68 65 20 4e 46 53 20 6c 6f 63 6b 20 69 6d   the NFS lock im
1c3f0 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 2a 2a 2a  plementation ***
1c400 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1c410 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ***.************
1c420 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1c430 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1c440 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1c450 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1c460 2a 2a 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  **/../**********
1c470 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1c480 2a 2a 2a 2a 2a 2a 2a 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 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****.***********
1c4c0 2a 2a 2a 2a 2a 20 4e 6f 6e 2d 6c 6f 63 6b 69 6e  ***** Non-lockin
1c4d0 67 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 6d  g sqlite3_file m
1c4e0 65 74 68 6f 64 73 20 2a 2a 2a 2a 2a 2a 2a 2a 2a  ethods *********
1c4f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1c500 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6e  ****.**.** The n
1c510 65 78 74 20 64 69 76 69 73 69 6f 6e 20 63 6f 6e  ext division con
1c520 74 61 69 6e 73 20 69 6d 70 6c 65 6d 65 6e 74 61  tains implementa
1c530 74 69 6f 6e 73 20 66 6f 72 20 61 6c 6c 20 6d 65  tions for all me
1c540 74 68 6f 64 73 20 6f 66 20 74 68 65 20 0a 2a 2a  thods of the .**
1c550 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 6f 62   sqlite3_file ob
1c560 6a 65 63 74 20 6f 74 68 65 72 20 74 68 61 6e 20  ject other than 
1c570 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6d 65 74 68  the locking meth
1c580 6f 64 73 2e 20 20 54 68 65 20 6c 6f 63 6b 69 6e  ods.  The lockin
1c590 67 0a 2a 2a 20 6d 65 74 68 6f 64 73 20 77 65 72  g.** methods wer
1c5a0 65 20 64 65 66 69 6e 65 64 20 69 6e 20 64 69 76  e defined in div
1c5b0 69 73 69 6f 6e 73 20 61 62 6f 76 65 20 28 6f 6e  isions above (on
1c5c0 65 20 6c 6f 63 6b 69 6e 67 20 6d 65 74 68 6f 64  e locking method
1c5d0 20 70 65 72 0a 2a 2a 20 64 69 76 69 73 69 6f 6e   per.** division
1c5e0 29 2e 20 20 54 68 6f 73 65 20 6d 65 74 68 6f 64  ).  Those method
1c5f0 73 20 74 68 61 74 20 61 72 65 20 63 6f 6d 6d 6f  s that are commo
1c600 6e 20 74 6f 20 61 6c 6c 20 6c 6f 63 6b 69 6e 67  n to all locking
1c610 20 6d 6f 64 65 73 0a 2a 2a 20 61 72 65 20 67 61   modes.** are ga
1c620 74 68 65 72 20 74 6f 67 65 74 68 65 72 20 69 6e  ther together in
1c630 74 6f 20 74 68 69 73 20 64 69 76 69 73 69 6f 6e  to this division
1c640 2e 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 53 65 65 6b  ..*/../*.** Seek
1c650 20 74 6f 20 74 68 65 20 6f 66 66 73 65 74 20 70   to the offset p
1c660 61 73 73 65 64 20 61 73 20 74 68 65 20 73 65 63  assed as the sec
1c670 6f 6e 64 20 61 72 67 75 6d 65 6e 74 2c 20 74 68  ond argument, th
1c680 65 6e 20 72 65 61 64 20 63 6e 74 20 0a 2a 2a 20  en read cnt .** 
1c690 62 79 74 65 73 20 69 6e 74 6f 20 70 42 75 66 2e  bytes into pBuf.
1c6a0 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62   Return the numb
1c6b0 65 72 20 6f 66 20 62 79 74 65 73 20 61 63 74 75  er of bytes actu
1c6c0 61 6c 6c 79 20 72 65 61 64 2e 0a 2a 2a 0a 2a 2a  ally read..**.**
1c6d0 20 4e 42 3a 20 20 49 66 20 79 6f 75 20 64 65 66   NB:  If you def
1c6e0 69 6e 65 20 55 53 45 5f 50 52 45 41 44 20 6f 72  ine USE_PREAD or
1c6f0 20 55 53 45 5f 50 52 45 41 44 36 34 2c 20 74 68   USE_PREAD64, th
1c700 65 6e 20 69 74 20 6d 69 67 68 74 20 61 6c 73 6f  en it might also
1c710 0a 2a 2a 20 62 65 20 6e 65 63 65 73 73 61 72 79  .** be necessary
1c720 20 74 6f 20 64 65 66 69 6e 65 20 5f 58 4f 50 45   to define _XOPE
1c730 4e 5f 53 4f 55 52 43 45 20 74 6f 20 62 65 20 35  N_SOURCE to be 5
1c740 30 30 2e 20 20 54 68 69 73 20 76 61 72 69 65 73  00.  This varies
1c750 20 66 72 6f 6d 0a 2a 2a 20 6f 6e 65 20 73 79 73   from.** one sys
1c760 74 65 6d 20 74 6f 20 61 6e 6f 74 68 65 72 2e 20  tem to another. 
1c770 20 53 69 6e 63 65 20 53 51 4c 69 74 65 20 64 6f   Since SQLite do
1c780 65 73 20 6e 6f 74 20 64 65 66 69 6e 65 20 55 53  es not define US
1c790 45 5f 50 52 45 41 44 0a 2a 2a 20 69 6e 20 61 6e  E_PREAD.** in an
1c7a0 79 20 66 6f 72 6d 20 62 79 20 64 65 66 61 75 6c  y form by defaul
1c7b0 74 2c 20 77 65 20 77 69 6c 6c 20 6e 6f 74 20 61  t, we will not a
1c7c0 74 74 65 6d 70 74 20 74 6f 20 64 65 66 69 6e 65  ttempt to define
1c7d0 20 5f 58 4f 50 45 4e 5f 53 4f 55 52 43 45 2e 0a   _XOPEN_SOURCE..
1c7e0 2a 2a 20 53 65 65 20 74 69 63 6b 65 74 73 20 23  ** See tickets #
1c7f0 32 37 34 31 20 61 6e 64 20 23 32 36 38 31 2e 0a  2741 and #2681..
1c800 2a 2a 0a 2a 2a 20 54 6f 20 61 76 6f 69 64 20 73  **.** To avoid s
1c810 74 6f 6d 70 69 6e 67 20 74 68 65 20 65 72 72 6e  tomping the errn
1c820 6f 20 76 61 6c 75 65 20 6f 6e 20 61 20 66 61 69  o value on a fai
1c830 6c 65 64 20 72 65 61 64 20 74 68 65 20 6c 61 73  led read the las
1c840 74 45 72 72 6e 6f 20 76 61 6c 75 65 0a 2a 2a 20  tErrno value.** 
1c850 69 73 20 73 65 74 20 62 65 66 6f 72 65 20 72 65  is set before re
1c860 74 75 72 6e 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74  turning..*/.stat
1c870 69 63 20 69 6e 74 20 73 65 65 6b 41 6e 64 52 65  ic int seekAndRe
1c880 61 64 28 75 6e 69 78 46 69 6c 65 20 2a 69 64 2c  ad(unixFile *id,
1c890 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 6f   sqlite3_int64 o
1c8a0 66 66 73 65 74 2c 20 76 6f 69 64 20 2a 70 42 75  ffset, void *pBu
1c8b0 66 2c 20 69 6e 74 20 63 6e 74 29 7b 0a 20 20 69  f, int cnt){.  i
1c8c0 6e 74 20 67 6f 74 3b 0a 20 20 69 6e 74 20 70 72  nt got;.  int pr
1c8d0 69 6f 72 20 3d 20 30 3b 0a 23 69 66 20 28 21 64  ior = 0;.#if (!d
1c8e0 65 66 69 6e 65 64 28 55 53 45 5f 50 52 45 41 44  efined(USE_PREAD
1c8f0 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 55 53  ) && !defined(US
1c900 45 5f 50 52 45 41 44 36 34 29 29 0a 20 20 69 36  E_PREAD64)).  i6
1c910 34 20 6e 65 77 4f 66 66 73 65 74 3b 0a 23 65 6e  4 newOffset;.#en
1c920 64 69 66 0a 20 20 54 49 4d 45 52 5f 53 54 41 52  dif.  TIMER_STAR
1c930 54 3b 0a 20 20 61 73 73 65 72 74 28 20 63 6e 74  T;.  assert( cnt
1c940 3d 3d 28 63 6e 74 26 30 78 31 66 66 66 66 29 20  ==(cnt&0x1ffff) 
1c950 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 64 2d  );.  assert( id-
1c960 3e 68 3e 32 20 29 3b 0a 20 20 64 6f 7b 0a 23 69  >h>2 );.  do{.#i
1c970 66 20 64 65 66 69 6e 65 64 28 55 53 45 5f 50 52  f defined(USE_PR
1c980 45 41 44 29 0a 20 20 20 20 67 6f 74 20 3d 20 6f  EAD).    got = o
1c990 73 50 72 65 61 64 28 69 64 2d 3e 68 2c 20 70 42  sPread(id->h, pB
1c9a0 75 66 2c 20 63 6e 74 2c 20 6f 66 66 73 65 74 29  uf, cnt, offset)
1c9b0 3b 0a 20 20 20 20 53 69 6d 75 6c 61 74 65 49 4f  ;.    SimulateIO
1c9c0 45 72 72 6f 72 28 20 67 6f 74 20 3d 20 2d 31 20  Error( got = -1 
1c9d0 29 3b 0a 23 65 6c 69 66 20 64 65 66 69 6e 65 64  );.#elif defined
1c9e0 28 55 53 45 5f 50 52 45 41 44 36 34 29 0a 20 20  (USE_PREAD64).  
1c9f0 20 20 67 6f 74 20 3d 20 6f 73 50 72 65 61 64 36    got = osPread6
1ca00 34 28 69 64 2d 3e 68 2c 20 70 42 75 66 2c 20 63  4(id->h, pBuf, c
1ca10 6e 74 2c 20 6f 66 66 73 65 74 29 3b 0a 20 20 20  nt, offset);.   
1ca20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72   SimulateIOError
1ca30 28 20 67 6f 74 20 3d 20 2d 31 20 29 3b 0a 23 65  ( got = -1 );.#e
1ca40 6c 73 65 0a 20 20 20 20 6e 65 77 4f 66 66 73 65  lse.    newOffse
1ca50 74 20 3d 20 6c 73 65 65 6b 28 69 64 2d 3e 68 2c  t = lseek(id->h,
1ca60 20 6f 66 66 73 65 74 2c 20 53 45 45 4b 5f 53 45   offset, SEEK_SE
1ca70 54 29 3b 0a 20 20 20 20 53 69 6d 75 6c 61 74 65  T);.    Simulate
1ca80 49 4f 45 72 72 6f 72 28 20 6e 65 77 4f 66 66 73  IOError( newOffs
1ca90 65 74 20 3d 20 2d 31 20 29 3b 0a 20 20 20 20 69  et = -1 );.    i
1caa0 66 28 20 6e 65 77 4f 66 66 73 65 74 3c 30 20 29  f( newOffset<0 )
1cab0 7b 0a 20 20 20 20 20 20 73 74 6f 72 65 4c 61 73  {.      storeLas
1cac0 74 45 72 72 6e 6f 28 28 75 6e 69 78 46 69 6c 65  tErrno((unixFile
1cad0 2a 29 69 64 2c 20 65 72 72 6e 6f 29 3b 0a 20 20  *)id, errno);.  
1cae0 20 20 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20      return -1;. 
1caf0 20 20 20 7d 0a 20 20 20 20 67 6f 74 20 3d 20 6f     }.    got = o
1cb00 73 52 65 61 64 28 69 64 2d 3e 68 2c 20 70 42 75  sRead(id->h, pBu
1cb10 66 2c 20 63 6e 74 29 3b 0a 23 65 6e 64 69 66 0a  f, cnt);.#endif.
1cb20 20 20 20 20 69 66 28 20 67 6f 74 3d 3d 63 6e 74      if( got==cnt
1cb30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 69 66   ) break;.    if
1cb40 28 20 67 6f 74 3c 30 20 29 7b 0a 20 20 20 20 20  ( got<0 ){.     
1cb50 20 69 66 28 20 65 72 72 6e 6f 3d 3d 45 49 4e 54   if( errno==EINT
1cb60 52 20 29 7b 20 67 6f 74 20 3d 20 31 3b 20 63 6f  R ){ got = 1; co
1cb70 6e 74 69 6e 75 65 3b 20 7d 0a 20 20 20 20 20 20  ntinue; }.      
1cb80 70 72 69 6f 72 20 3d 20 30 3b 0a 20 20 20 20 20  prior = 0;.     
1cb90 20 73 74 6f 72 65 4c 61 73 74 45 72 72 6e 6f 28   storeLastErrno(
1cba0 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 2c 20 20  (unixFile*)id,  
1cbb0 65 72 72 6e 6f 29 3b 0a 20 20 20 20 20 20 62 72  errno);.      br
1cbc0 65 61 6b 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  eak;.    }else i
1cbd0 66 28 20 67 6f 74 3e 30 20 29 7b 0a 20 20 20 20  f( got>0 ){.    
1cbe0 20 20 63 6e 74 20 2d 3d 20 67 6f 74 3b 0a 20 20    cnt -= got;.  
1cbf0 20 20 20 20 6f 66 66 73 65 74 20 2b 3d 20 67 6f      offset += go
1cc00 74 3b 0a 20 20 20 20 20 20 70 72 69 6f 72 20 2b  t;.      prior +
1cc10 3d 20 67 6f 74 3b 0a 20 20 20 20 20 20 70 42 75  = got;.      pBu
1cc20 66 20 3d 20 28 76 6f 69 64 2a 29 28 67 6f 74 20  f = (void*)(got 
1cc30 2b 20 28 63 68 61 72 2a 29 70 42 75 66 29 3b 0a  + (char*)pBuf);.
1cc40 20 20 20 20 7d 0a 20 20 7d 77 68 69 6c 65 28 20      }.  }while( 
1cc50 67 6f 74 3e 30 20 29 3b 0a 20 20 54 49 4d 45 52  got>0 );.  TIMER
1cc60 5f 45 4e 44 3b 0a 20 20 4f 53 54 52 41 43 45 28  _END;.  OSTRACE(
1cc70 28 22 52 45 41 44 20 20 20 20 25 2d 33 64 20 25  ("READ    %-3d %
1cc80 35 64 20 25 37 6c 6c 64 20 25 6c 6c 75 5c 6e 22  5d %7lld %llu\n"
1cc90 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 64  ,.            id
1cca0 2d 3e 68 2c 20 67 6f 74 2b 70 72 69 6f 72 2c 20  ->h, got+prior, 
1ccb0 6f 66 66 73 65 74 2d 70 72 69 6f 72 2c 20 54 49  offset-prior, TI
1ccc0 4d 45 52 5f 45 4c 41 50 53 45 44 29 29 3b 0a 20  MER_ELAPSED));. 
1ccd0 20 72 65 74 75 72 6e 20 67 6f 74 2b 70 72 69 6f   return got+prio
1cce0 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64  r;.}../*.** Read
1ccf0 20 64 61 74 61 20 66 72 6f 6d 20 61 20 66 69 6c   data from a fil
1cd00 65 20 69 6e 74 6f 20 61 20 62 75 66 66 65 72 2e  e into a buffer.
1cd10 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    Return SQLITE_
1cd20 4f 4b 20 69 66 20 61 6c 6c 0a 2a 2a 20 62 79 74  OK if all.** byt
1cd30 65 73 20 77 65 72 65 20 72 65 61 64 20 73 75 63  es were read suc
1cd40 63 65 73 73 66 75 6c 6c 79 20 61 6e 64 20 53 51  cessfully and SQ
1cd50 4c 49 54 45 5f 49 4f 45 52 52 20 69 66 20 61 6e  LITE_IOERR if an
1cd60 79 74 68 69 6e 67 20 67 6f 65 73 0a 2a 2a 20 77  ything goes.** w
1cd70 72 6f 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rong..*/.static 
1cd80 69 6e 74 20 75 6e 69 78 52 65 61 64 28 0a 20 20  int unixRead(.  
1cd90 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64  sqlite3_file *id
1cda0 2c 20 0a 20 20 76 6f 69 64 20 2a 70 42 75 66 2c  , .  void *pBuf,
1cdb0 20 0a 20 20 69 6e 74 20 61 6d 74 2c 0a 20 20 73   .  int amt,.  s
1cdc0 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 6f 66 66  qlite3_int64 off
1cdd0 73 65 74 0a 29 7b 0a 20 20 75 6e 69 78 46 69 6c  set.){.  unixFil
1cde0 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78  e *pFile = (unix
1cdf0 46 69 6c 65 20 2a 29 69 64 3b 0a 20 20 69 6e 74  File *)id;.  int
1ce00 20 67 6f 74 3b 0a 20 20 61 73 73 65 72 74 28 20   got;.  assert( 
1ce10 69 64 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  id );.  assert( 
1ce20 6f 66 66 73 65 74 3e 3d 30 20 29 3b 0a 20 20 61  offset>=0 );.  a
1ce30 73 73 65 72 74 28 20 61 6d 74 3e 30 20 29 3b 0a  ssert( amt>0 );.
1ce40 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73  .  /* If this is
1ce50 20 61 20 64 61 74 61 62 61 73 65 20 66 69 6c 65   a database file
1ce60 20 28 6e 6f 74 20 61 20 6a 6f 75 72 6e 61 6c 2c   (not a journal,
1ce70 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20   master-journal 
1ce80 6f 72 20 74 65 6d 70 0a 20 20 2a 2a 20 66 69 6c  or temp.  ** fil
1ce90 65 29 2c 20 74 68 65 20 62 79 74 65 73 20 69 6e  e), the bytes in
1cea0 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 72 61 6e   the locking ran
1ceb0 67 65 20 73 68 6f 75 6c 64 20 6e 65 76 65 72 20  ge should never 
1cec0 62 65 20 72 65 61 64 20 6f 72 20 77 72 69 74 74  be read or writt
1ced0 65 6e 2e 20 2a 2f 0a 23 69 66 20 30 0a 20 20 61  en. */.#if 0.  a
1cee0 73 73 65 72 74 28 20 70 46 69 6c 65 2d 3e 70 55  ssert( pFile->pU
1cef0 6e 75 73 65 64 3d 3d 30 0a 20 20 20 20 20 20 20  nused==0.       
1cf00 7c 7c 20 6f 66 66 73 65 74 3e 3d 50 45 4e 44 49  || offset>=PENDI
1cf10 4e 47 5f 42 59 54 45 2b 35 31 32 0a 20 20 20 20  NG_BYTE+512.    
1cf20 20 20 20 7c 7c 20 6f 66 66 73 65 74 2b 61 6d 74     || offset+amt
1cf30 3c 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 20 0a  <=PENDING_BYTE .
1cf40 20 20 29 3b 0a 23 65 6e 64 69 66 0a 0a 23 69 66    );.#endif..#if
1cf50 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50   SQLITE_MAX_MMAP
1cf60 5f 53 49 5a 45 3e 30 0a 20 20 2f 2a 20 44 65 61  _SIZE>0.  /* Dea
1cf70 6c 20 77 69 74 68 20 61 73 20 6d 75 63 68 20 6f  l with as much o
1cf80 66 20 74 68 69 73 20 72 65 61 64 20 72 65 71 75  f this read requ
1cf90 65 73 74 20 61 73 20 70 6f 73 73 69 62 6c 65 20  est as possible 
1cfa0 62 79 20 74 72 61 6e 73 66 65 72 69 6e 67 0a 20  by transfering. 
1cfb0 20 2a 2a 20 64 61 74 61 20 66 72 6f 6d 20 74 68   ** data from th
1cfc0 65 20 6d 65 6d 6f 72 79 20 6d 61 70 70 69 6e 67  e memory mapping
1cfd0 20 75 73 69 6e 67 20 6d 65 6d 63 70 79 28 29 2e   using memcpy().
1cfe0 20 20 2a 2f 0a 20 20 69 66 28 20 6f 66 66 73 65    */.  if( offse
1cff0 74 3c 70 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a  t<pFile->mmapSiz
1d000 65 20 29 7b 0a 20 20 20 20 69 66 28 20 6f 66 66  e ){.    if( off
1d010 73 65 74 2b 61 6d 74 20 3c 3d 20 70 46 69 6c 65  set+amt <= pFile
1d020 2d 3e 6d 6d 61 70 53 69 7a 65 20 29 7b 0a 20 20  ->mmapSize ){.  
1d030 20 20 20 20 6d 65 6d 63 70 79 28 70 42 75 66 2c      memcpy(pBuf,
1d040 20 26 28 28 75 38 20 2a 29 28 70 46 69 6c 65 2d   &((u8 *)(pFile-
1d050 3e 70 4d 61 70 52 65 67 69 6f 6e 29 29 5b 6f 66  >pMapRegion))[of
1d060 66 73 65 74 5d 2c 20 61 6d 74 29 3b 0a 20 20 20  fset], amt);.   
1d070 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
1d080 5f 4f 4b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  _OK;.    }else{.
1d090 20 20 20 20 20 20 69 6e 74 20 6e 43 6f 70 79 20        int nCopy 
1d0a0 3d 20 70 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a  = pFile->mmapSiz
1d0b0 65 20 2d 20 6f 66 66 73 65 74 3b 0a 20 20 20 20  e - offset;.    
1d0c0 20 20 6d 65 6d 63 70 79 28 70 42 75 66 2c 20 26    memcpy(pBuf, &
1d0d0 28 28 75 38 20 2a 29 28 70 46 69 6c 65 2d 3e 70  ((u8 *)(pFile->p
1d0e0 4d 61 70 52 65 67 69 6f 6e 29 29 5b 6f 66 66 73  MapRegion))[offs
1d0f0 65 74 5d 2c 20 6e 43 6f 70 79 29 3b 0a 20 20 20  et], nCopy);.   
1d100 20 20 20 70 42 75 66 20 3d 20 26 28 28 75 38 20     pBuf = &((u8 
1d110 2a 29 70 42 75 66 29 5b 6e 43 6f 70 79 5d 3b 0a  *)pBuf)[nCopy];.
1d120 20 20 20 20 20 20 61 6d 74 20 2d 3d 20 6e 43 6f        amt -= nCo
1d130 70 79 3b 0a 20 20 20 20 20 20 6f 66 66 73 65 74  py;.      offset
1d140 20 2b 3d 20 6e 43 6f 70 79 3b 0a 20 20 20 20 7d   += nCopy;.    }
1d150 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 67  .  }.#endif..  g
1d160 6f 74 20 3d 20 73 65 65 6b 41 6e 64 52 65 61 64  ot = seekAndRead
1d170 28 70 46 69 6c 65 2c 20 6f 66 66 73 65 74 2c 20  (pFile, offset, 
1d180 70 42 75 66 2c 20 61 6d 74 29 3b 0a 20 20 69 66  pBuf, amt);.  if
1d190 28 20 67 6f 74 3d 3d 61 6d 74 20 29 7b 0a 20 20  ( got==amt ){.  
1d1a0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1d1b0 4f 4b 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  OK;.  }else if( 
1d1c0 67 6f 74 3c 30 20 29 7b 0a 20 20 20 20 2f 2a 20  got<0 ){.    /* 
1d1d0 6c 61 73 74 45 72 72 6e 6f 20 73 65 74 20 62 79  lastErrno set by
1d1e0 20 73 65 65 6b 41 6e 64 52 65 61 64 20 2a 2f 0a   seekAndRead */.
1d1f0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
1d200 45 5f 49 4f 45 52 52 5f 52 45 41 44 3b 0a 20 20  E_IOERR_READ;.  
1d210 7d 65 6c 73 65 7b 0a 20 20 20 20 73 74 6f 72 65  }else{.    store
1d220 4c 61 73 74 45 72 72 6e 6f 28 70 46 69 6c 65 2c  LastErrno(pFile,
1d230 20 30 29 3b 20 20 20 2f 2a 20 6e 6f 74 20 61 20   0);   /* not a 
1d240 73 79 73 74 65 6d 20 65 72 72 6f 72 20 2a 2f 0a  system error */.
1d250 20 20 20 20 2f 2a 20 55 6e 72 65 61 64 20 70 61      /* Unread pa
1d260 72 74 73 20 6f 66 20 74 68 65 20 62 75 66 66 65  rts of the buffe
1d270 72 20 6d 75 73 74 20 62 65 20 7a 65 72 6f 2d 66  r must be zero-f
1d280 69 6c 6c 65 64 20 2a 2f 0a 20 20 20 20 6d 65 6d  illed */.    mem
1d290 73 65 74 28 26 28 28 63 68 61 72 2a 29 70 42 75  set(&((char*)pBu
1d2a0 66 29 5b 67 6f 74 5d 2c 20 30 2c 20 61 6d 74 2d  f)[got], 0, amt-
1d2b0 67 6f 74 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  got);.    return
1d2c0 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48   SQLITE_IOERR_SH
1d2d0 4f 52 54 5f 52 45 41 44 3b 0a 20 20 7d 0a 7d 0a  ORT_READ;.  }.}.
1d2e0 0a 2f 2a 0a 2a 2a 20 41 74 74 65 6d 70 74 20 74  ./*.** Attempt t
1d2f0 6f 20 73 65 65 6b 20 74 68 65 20 66 69 6c 65 2d  o seek the file-
1d300 64 65 73 63 72 69 70 74 6f 72 20 70 61 73 73 65  descriptor passe
1d310 64 20 61 73 20 74 68 65 20 66 69 72 73 74 20 61  d as the first a
1d320 72 67 75 6d 65 6e 74 20 74 6f 0a 2a 2a 20 61 62  rgument to.** ab
1d330 73 6f 6c 75 74 65 20 6f 66 66 73 65 74 20 69 4f  solute offset iO
1d340 66 66 2c 20 74 68 65 6e 20 61 74 74 65 6d 70 74  ff, then attempt
1d350 20 74 6f 20 77 72 69 74 65 20 6e 42 75 66 20 62   to write nBuf b
1d360 79 74 65 73 20 6f 66 20 64 61 74 61 20 66 72 6f  ytes of data fro
1d370 6d 0a 2a 2a 20 70 42 75 66 20 74 6f 20 69 74 2e  m.** pBuf to it.
1d380 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   If an error occ
1d390 75 72 73 2c 20 72 65 74 75 72 6e 20 2d 31 20 61  urs, return -1 a
1d3a0 6e 64 20 73 65 74 20 2a 70 69 45 72 72 6e 6f 2e  nd set *piErrno.
1d3b0 20 4f 74 68 65 72 77 69 73 65 2c 20 0a 2a 2a 20   Otherwise, .** 
1d3c0 72 65 74 75 72 6e 20 74 68 65 20 61 63 74 75 61  return the actua
1d3d0 6c 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  l number of byte
1d3e0 73 20 77 72 69 74 74 65 6e 20 28 77 68 69 63 68  s written (which
1d3f0 20 6d 61 79 20 62 65 20 6c 65 73 73 20 74 68 61   may be less tha
1d400 6e 0a 2a 2a 20 6e 42 75 66 29 2e 0a 2a 2f 0a 73  n.** nBuf)..*/.s
1d410 74 61 74 69 63 20 69 6e 74 20 73 65 65 6b 41 6e  tatic int seekAn
1d420 64 57 72 69 74 65 46 64 28 0a 20 20 69 6e 74 20  dWriteFd(.  int 
1d430 66 64 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  fd,             
1d440 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
1d450 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 74  ile descriptor t
1d460 6f 20 77 72 69 74 65 20 74 6f 20 2a 2f 0a 20 20  o write to */.  
1d470 69 36 34 20 69 4f 66 66 2c 20 20 20 20 20 20 20  i64 iOff,       
1d480 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d490 2f 2a 20 46 69 6c 65 20 6f 66 66 73 65 74 20 74  /* File offset t
1d4a0 6f 20 62 65 67 69 6e 20 77 72 69 74 69 6e 67 20  o begin writing 
1d4b0 61 74 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 76 6f  at */.  const vo
1d4c0 69 64 20 2a 70 42 75 66 2c 20 20 20 20 20 20 20  id *pBuf,       
1d4d0 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 70 79 20          /* Copy 
1d4e0 64 61 74 61 20 66 72 6f 6d 20 74 68 69 73 20 62  data from this b
1d4f0 75 66 66 65 72 20 74 6f 20 74 68 65 20 66 69 6c  uffer to the fil
1d500 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 42 75 66 2c  e */.  int nBuf,
1d510 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d520 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f         /* Size o
1d530 66 20 62 75 66 66 65 72 20 70 42 75 66 20 69 6e  f buffer pBuf in
1d540 20 62 79 74 65 73 20 2a 2f 0a 20 20 69 6e 74 20   bytes */.  int 
1d550 2a 70 69 45 72 72 6e 6f 20 20 20 20 20 20 20 20  *piErrno        
1d560 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
1d570 55 54 3a 20 45 72 72 6f 72 20 6e 75 6d 62 65 72  UT: Error number
1d580 20 69 66 20 65 72 72 6f 72 20 6f 63 63 75 72 73   if error occurs
1d590 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20   */.){.  int rc 
1d5a0 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
1d5b0 20 20 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 75           /* Valu
1d5c0 65 20 72 65 74 75 72 6e 65 64 20 62 79 20 73 79  e returned by sy
1d5d0 73 74 65 6d 20 63 61 6c 6c 20 2a 2f 0a 0a 20 20  stem call */..  
1d5e0 61 73 73 65 72 74 28 20 6e 42 75 66 3d 3d 28 6e  assert( nBuf==(n
1d5f0 42 75 66 26 30 78 31 66 66 66 66 29 20 29 3b 0a  Buf&0x1ffff) );.
1d600 20 20 61 73 73 65 72 74 28 20 66 64 3e 32 20 29    assert( fd>2 )
1d610 3b 0a 20 20 61 73 73 65 72 74 28 20 70 69 45 72  ;.  assert( piEr
1d620 72 6e 6f 21 3d 30 20 29 3b 0a 20 20 6e 42 75 66  rno!=0 );.  nBuf
1d630 20 26 3d 20 30 78 31 66 66 66 66 3b 0a 20 20 54   &= 0x1ffff;.  T
1d640 49 4d 45 52 5f 53 54 41 52 54 3b 0a 0a 23 69 66  IMER_START;..#if
1d650 20 64 65 66 69 6e 65 64 28 55 53 45 5f 50 52 45   defined(USE_PRE
1d660 41 44 29 0a 20 20 64 6f 7b 20 72 63 20 3d 20 28  AD).  do{ rc = (
1d670 69 6e 74 29 6f 73 50 77 72 69 74 65 28 66 64 2c  int)osPwrite(fd,
1d680 20 70 42 75 66 2c 20 6e 42 75 66 2c 20 69 4f 66   pBuf, nBuf, iOf
1d690 66 29 3b 20 7d 77 68 69 6c 65 28 20 72 63 3c 30  f); }while( rc<0
1d6a0 20 26 26 20 65 72 72 6e 6f 3d 3d 45 49 4e 54 52   && errno==EINTR
1d6b0 20 29 3b 0a 23 65 6c 69 66 20 64 65 66 69 6e 65   );.#elif define
1d6c0 64 28 55 53 45 5f 50 52 45 41 44 36 34 29 0a 20  d(USE_PREAD64). 
1d6d0 20 64 6f 7b 20 72 63 20 3d 20 28 69 6e 74 29 6f   do{ rc = (int)o
1d6e0 73 50 77 72 69 74 65 36 34 28 66 64 2c 20 70 42  sPwrite64(fd, pB
1d6f0 75 66 2c 20 6e 42 75 66 2c 20 69 4f 66 66 29 3b  uf, nBuf, iOff);
1d700 7d 77 68 69 6c 65 28 20 72 63 3c 30 20 26 26 20  }while( rc<0 && 
1d710 65 72 72 6e 6f 3d 3d 45 49 4e 54 52 29 3b 0a 23  errno==EINTR);.#
1d720 65 6c 73 65 0a 20 20 64 6f 7b 0a 20 20 20 20 69  else.  do{.    i
1d730 36 34 20 69 53 65 65 6b 20 3d 20 6c 73 65 65 6b  64 iSeek = lseek
1d740 28 66 64 2c 20 69 4f 66 66 2c 20 53 45 45 4b 5f  (fd, iOff, SEEK_
1d750 53 45 54 29 3b 0a 20 20 20 20 53 69 6d 75 6c 61  SET);.    Simula
1d760 74 65 49 4f 45 72 72 6f 72 28 20 69 53 65 65 6b  teIOError( iSeek
1d770 20 3d 20 2d 31 20 29 3b 0a 20 20 20 20 69 66 28   = -1 );.    if(
1d780 20 69 53 65 65 6b 3c 30 20 29 7b 0a 20 20 20 20   iSeek<0 ){.    
1d790 20 20 72 63 20 3d 20 2d 31 3b 0a 20 20 20 20 20    rc = -1;.     
1d7a0 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
1d7b0 20 20 72 63 20 3d 20 6f 73 57 72 69 74 65 28 66    rc = osWrite(f
1d7c0 64 2c 20 70 42 75 66 2c 20 6e 42 75 66 29 3b 0a  d, pBuf, nBuf);.
1d7d0 20 20 7d 77 68 69 6c 65 28 20 72 63 3c 30 20 26    }while( rc<0 &
1d7e0 26 20 65 72 72 6e 6f 3d 3d 45 49 4e 54 52 20 29  & errno==EINTR )
1d7f0 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 54 49 4d 45  ;.#endif..  TIME
1d800 52 5f 45 4e 44 3b 0a 20 20 4f 53 54 52 41 43 45  R_END;.  OSTRACE
1d810 28 28 22 57 52 49 54 45 20 20 20 25 2d 33 64 20  (("WRITE   %-3d 
1d820 25 35 64 20 25 37 6c 6c 64 20 25 6c 6c 75 5c 6e  %5d %7lld %llu\n
1d830 22 2c 20 66 64 2c 20 72 63 2c 20 69 4f 66 66 2c  ", fd, rc, iOff,
1d840 20 54 49 4d 45 52 5f 45 4c 41 50 53 45 44 29 29   TIMER_ELAPSED))
1d850 3b 0a 0a 20 20 69 66 28 20 72 63 3c 30 20 29 20  ;..  if( rc<0 ) 
1d860 2a 70 69 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f  *piErrno = errno
1d870 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
1d880 0a 0a 0a 2f 2a 0a 2a 2a 20 53 65 65 6b 20 74 6f  .../*.** Seek to
1d890 20 74 68 65 20 6f 66 66 73 65 74 20 69 6e 20 69   the offset in i
1d8a0 64 2d 3e 6f 66 66 73 65 74 20 74 68 65 6e 20 72  d->offset then r
1d8b0 65 61 64 20 63 6e 74 20 62 79 74 65 73 20 69 6e  ead cnt bytes in
1d8c0 74 6f 20 70 42 75 66 2e 0a 2a 2a 20 52 65 74 75  to pBuf..** Retu
1d8d0 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  rn the number of
1d8e0 20 62 79 74 65 73 20 61 63 74 75 61 6c 6c 79 20   bytes actually 
1d8f0 72 65 61 64 2e 20 20 55 70 64 61 74 65 20 74 68  read.  Update th
1d900 65 20 6f 66 66 73 65 74 2e 0a 2a 2a 0a 2a 2a 20  e offset..**.** 
1d910 54 6f 20 61 76 6f 69 64 20 73 74 6f 6d 70 69 6e  To avoid stompin
1d920 67 20 74 68 65 20 65 72 72 6e 6f 20 76 61 6c 75  g the errno valu
1d930 65 20 6f 6e 20 61 20 66 61 69 6c 65 64 20 77 72  e on a failed wr
1d940 69 74 65 20 74 68 65 20 6c 61 73 74 45 72 72 6e  ite the lastErrn
1d950 6f 20 76 61 6c 75 65 0a 2a 2a 20 69 73 20 73 65  o value.** is se
1d960 74 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69  t before returni
1d970 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ng..*/.static in
1d980 74 20 73 65 65 6b 41 6e 64 57 72 69 74 65 28 75  t seekAndWrite(u
1d990 6e 69 78 46 69 6c 65 20 2a 69 64 2c 20 69 36 34  nixFile *id, i64
1d9a0 20 6f 66 66 73 65 74 2c 20 63 6f 6e 73 74 20 76   offset, const v
1d9b0 6f 69 64 20 2a 70 42 75 66 2c 20 69 6e 74 20 63  oid *pBuf, int c
1d9c0 6e 74 29 7b 0a 20 20 72 65 74 75 72 6e 20 73 65  nt){.  return se
1d9d0 65 6b 41 6e 64 57 72 69 74 65 46 64 28 69 64 2d  ekAndWriteFd(id-
1d9e0 3e 68 2c 20 6f 66 66 73 65 74 2c 20 70 42 75 66  >h, offset, pBuf
1d9f0 2c 20 63 6e 74 2c 20 26 69 64 2d 3e 6c 61 73 74  , cnt, &id->last
1da00 45 72 72 6e 6f 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  Errno);.}.../*.*
1da10 2a 20 57 72 69 74 65 20 64 61 74 61 20 66 72 6f  * Write data fro
1da20 6d 20 61 20 62 75 66 66 65 72 20 69 6e 74 6f 20  m a buffer into 
1da30 61 20 66 69 6c 65 2e 20 20 52 65 74 75 72 6e 20  a file.  Return 
1da40 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63  SQLITE_OK on suc
1da50 63 65 73 73 0a 2a 2a 20 6f 72 20 73 6f 6d 65 20  cess.** or some 
1da60 6f 74 68 65 72 20 65 72 72 6f 72 20 63 6f 64 65  other error code
1da70 20 6f 6e 20 66 61 69 6c 75 72 65 2e 0a 2a 2f 0a   on failure..*/.
1da80 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 57  static int unixW
1da90 72 69 74 65 28 0a 20 20 73 71 6c 69 74 65 33 5f  rite(.  sqlite3_
1daa0 66 69 6c 65 20 2a 69 64 2c 20 0a 20 20 63 6f 6e  file *id, .  con
1dab0 73 74 20 76 6f 69 64 20 2a 70 42 75 66 2c 20 0a  st void *pBuf, .
1dac0 20 20 69 6e 74 20 61 6d 74 2c 0a 20 20 73 71 6c    int amt,.  sql
1dad0 69 74 65 33 5f 69 6e 74 36 34 20 6f 66 66 73 65  ite3_int64 offse
1dae0 74 20 0a 29 7b 0a 20 20 75 6e 69 78 46 69 6c 65  t .){.  unixFile
1daf0 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46   *pFile = (unixF
1db00 69 6c 65 2a 29 69 64 3b 0a 20 20 69 6e 74 20 77  ile*)id;.  int w
1db10 72 6f 74 65 20 3d 20 30 3b 0a 20 20 61 73 73 65  rote = 0;.  asse
1db20 72 74 28 20 69 64 20 29 3b 0a 20 20 61 73 73 65  rt( id );.  asse
1db30 72 74 28 20 61 6d 74 3e 30 20 29 3b 0a 0a 20 20  rt( amt>0 );..  
1db40 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20 61 20  /* If this is a 
1db50 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 28 6e  database file (n
1db60 6f 74 20 61 20 6a 6f 75 72 6e 61 6c 2c 20 6d 61  ot a journal, ma
1db70 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 6f 72 20  ster-journal or 
1db80 74 65 6d 70 0a 20 20 2a 2a 20 66 69 6c 65 29 2c  temp.  ** file),
1db90 20 74 68 65 20 62 79 74 65 73 20 69 6e 20 74 68   the bytes in th
1dba0 65 20 6c 6f 63 6b 69 6e 67 20 72 61 6e 67 65 20  e locking range 
1dbb0 73 68 6f 75 6c 64 20 6e 65 76 65 72 20 62 65 20  should never be 
1dbc0 72 65 61 64 20 6f 72 20 77 72 69 74 74 65 6e 2e  read or written.
1dbd0 20 2a 2f 0a 23 69 66 20 30 0a 20 20 61 73 73 65   */.#if 0.  asse
1dbe0 72 74 28 20 70 46 69 6c 65 2d 3e 70 55 6e 75 73  rt( pFile->pUnus
1dbf0 65 64 3d 3d 30 0a 20 20 20 20 20 20 20 7c 7c 20  ed==0.       || 
1dc00 6f 66 66 73 65 74 3e 3d 50 45 4e 44 49 4e 47 5f  offset>=PENDING_
1dc10 42 59 54 45 2b 35 31 32 0a 20 20 20 20 20 20 20  BYTE+512.       
1dc20 7c 7c 20 6f 66 66 73 65 74 2b 61 6d 74 3c 3d 50  || offset+amt<=P
1dc30 45 4e 44 49 4e 47 5f 42 59 54 45 20 0a 20 20 29  ENDING_BYTE .  )
1dc40 3b 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64 65 66  ;.#endif..#ifdef
1dc50 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20   SQLITE_DEBUG.  
1dc60 2f 2a 20 49 66 20 77 65 20 61 72 65 20 64 6f 69  /* If we are doi
1dc70 6e 67 20 61 20 6e 6f 72 6d 61 6c 20 77 72 69 74  ng a normal writ
1dc80 65 20 74 6f 20 61 20 64 61 74 61 62 61 73 65 20  e to a database 
1dc90 66 69 6c 65 20 28 61 73 20 6f 70 70 6f 73 65 64  file (as opposed
1dca0 20 74 6f 0a 20 20 2a 2a 20 64 6f 69 6e 67 20 61   to.  ** doing a
1dcb0 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c   hot-journal rol
1dcc0 6c 62 61 63 6b 20 6f 72 20 61 20 77 72 69 74 65  lback or a write
1dcd0 20 74 6f 20 73 6f 6d 65 20 66 69 6c 65 20 6f 74   to some file ot
1dce0 68 65 72 20 74 68 61 6e 20 61 0a 20 20 2a 2a 20  her than a.  ** 
1dcf0 6e 6f 72 6d 61 6c 20 64 61 74 61 62 61 73 65 20  normal database 
1dd00 66 69 6c 65 29 20 74 68 65 6e 20 72 65 63 6f 72  file) then recor
1dd10 64 20 74 68 65 20 66 61 63 74 20 74 68 61 74 20  d the fact that 
1dd20 74 68 65 20 64 61 74 61 62 61 73 65 0a 20 20 2a  the database.  *
1dd30 2a 20 68 61 73 20 63 68 61 6e 67 65 64 2e 20 20  * has changed.  
1dd40 49 66 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  If the transacti
1dd50 6f 6e 20 63 6f 75 6e 74 65 72 20 69 73 20 6d 6f  on counter is mo
1dd60 64 69 66 69 65 64 2c 20 72 65 63 6f 72 64 20 74  dified, record t
1dd70 68 61 74 0a 20 20 2a 2a 20 66 61 63 74 20 74 6f  hat.  ** fact to
1dd80 6f 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 46  o..  */.  if( pF
1dd90 69 6c 65 2d 3e 69 6e 4e 6f 72 6d 61 6c 57 72 69  ile->inNormalWri
1dda0 74 65 20 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d  te ){.    pFile-
1ddb0 3e 64 62 55 70 64 61 74 65 20 3d 20 31 3b 20 20  >dbUpdate = 1;  
1ddc0 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20  /* The database 
1ddd0 68 61 73 20 62 65 65 6e 20 6d 6f 64 69 66 69 65  has been modifie
1dde0 64 20 2a 2f 0a 20 20 20 20 69 66 28 20 6f 66 66  d */.    if( off
1ddf0 73 65 74 3c 3d 32 34 20 26 26 20 6f 66 66 73 65  set<=24 && offse
1de00 74 2b 61 6d 74 3e 3d 32 37 20 29 7b 0a 20 20 20  t+amt>=27 ){.   
1de10 20 20 20 69 6e 74 20 72 63 3b 0a 20 20 20 20 20     int rc;.     
1de20 20 63 68 61 72 20 6f 6c 64 43 6e 74 72 5b 34 5d   char oldCntr[4]
1de30 3b 0a 20 20 20 20 20 20 53 69 6d 75 6c 61 74 65  ;.      Simulate
1de40 49 4f 45 72 72 6f 72 42 65 6e 69 67 6e 28 31 29  IOErrorBenign(1)
1de50 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 65 65  ;.      rc = see
1de60 6b 41 6e 64 52 65 61 64 28 70 46 69 6c 65 2c 20  kAndRead(pFile, 
1de70 32 34 2c 20 6f 6c 64 43 6e 74 72 2c 20 34 29 3b  24, oldCntr, 4);
1de80 0a 20 20 20 20 20 20 53 69 6d 75 6c 61 74 65 49  .      SimulateI
1de90 4f 45 72 72 6f 72 42 65 6e 69 67 6e 28 30 29 3b  OErrorBenign(0);
1dea0 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 34  .      if( rc!=4
1deb0 20 7c 7c 20 6d 65 6d 63 6d 70 28 6f 6c 64 43 6e   || memcmp(oldCn
1dec0 74 72 2c 20 26 28 28 63 68 61 72 2a 29 70 42 75  tr, &((char*)pBu
1ded0 66 29 5b 32 34 2d 6f 66 66 73 65 74 5d 2c 20 34  f)[24-offset], 4
1dee0 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )!=0 ){.        
1def0 70 46 69 6c 65 2d 3e 74 72 61 6e 73 43 6e 74 72  pFile->transCntr
1df00 43 68 6e 67 20 3d 20 31 3b 20 20 2f 2a 20 54 68  Chng = 1;  /* Th
1df10 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f  e transaction co
1df20 75 6e 74 65 72 20 68 61 73 20 63 68 61 6e 67 65  unter has change
1df30 64 20 2a 2f 0a 20 20 20 20 20 20 7d 0a 20 20 20  d */.      }.   
1df40 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 23   }.  }.#endif..#
1df50 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  if defined(SQLIT
1df60 45 5f 4d 4d 41 50 5f 52 45 41 44 57 52 49 54 45  E_MMAP_READWRITE
1df70 29 20 26 26 20 53 51 4c 49 54 45 5f 4d 41 58 5f  ) && SQLITE_MAX_
1df80 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 20 20 2f 2a  MMAP_SIZE>0.  /*
1df90 20 44 65 61 6c 20 77 69 74 68 20 61 73 20 6d 75   Deal with as mu
1dfa0 63 68 20 6f 66 20 74 68 69 73 20 77 72 69 74 65  ch of this write
1dfb0 20 72 65 71 75 65 73 74 20 61 73 20 70 6f 73 73   request as poss
1dfc0 69 62 6c 65 20 62 79 20 74 72 61 6e 73 66 65 72  ible by transfer
1dfd0 69 6e 67 0a 20 20 2a 2a 20 64 61 74 61 20 66 72  ing.  ** data fr
1dfe0 6f 6d 20 74 68 65 20 6d 65 6d 6f 72 79 20 6d 61  om the memory ma
1dff0 70 70 69 6e 67 20 75 73 69 6e 67 20 6d 65 6d 63  pping using memc
1e000 70 79 28 29 2e 20 20 2a 2f 0a 20 20 69 66 28 20  py().  */.  if( 
1e010 6f 66 66 73 65 74 3c 70 46 69 6c 65 2d 3e 6d 6d  offset<pFile->mm
1e020 61 70 53 69 7a 65 20 29 7b 0a 20 20 20 20 69 66  apSize ){.    if
1e030 28 20 6f 66 66 73 65 74 2b 61 6d 74 20 3c 3d 20  ( offset+amt <= 
1e040 70 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 20  pFile->mmapSize 
1e050 29 7b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28  ){.      memcpy(
1e060 26 28 28 75 38 20 2a 29 28 70 46 69 6c 65 2d 3e  &((u8 *)(pFile->
1e070 70 4d 61 70 52 65 67 69 6f 6e 29 29 5b 6f 66 66  pMapRegion))[off
1e080 73 65 74 5d 2c 20 70 42 75 66 2c 20 61 6d 74 29  set], pBuf, amt)
1e090 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  ;.      return S
1e0a0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 65  QLITE_OK;.    }e
1e0b0 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e  lse{.      int n
1e0c0 43 6f 70 79 20 3d 20 70 46 69 6c 65 2d 3e 6d 6d  Copy = pFile->mm
1e0d0 61 70 53 69 7a 65 20 2d 20 6f 66 66 73 65 74 3b  apSize - offset;
1e0e0 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 28  .      memcpy(&(
1e0f0 28 75 38 20 2a 29 28 70 46 69 6c 65 2d 3e 70 4d  (u8 *)(pFile->pM
1e100 61 70 52 65 67 69 6f 6e 29 29 5b 6f 66 66 73 65  apRegion))[offse
1e110 74 5d 2c 20 70 42 75 66 2c 20 6e 43 6f 70 79 29  t], pBuf, nCopy)
1e120 3b 0a 20 20 20 20 20 20 70 42 75 66 20 3d 20 26  ;.      pBuf = &
1e130 28 28 75 38 20 2a 29 70 42 75 66 29 5b 6e 43 6f  ((u8 *)pBuf)[nCo
1e140 70 79 5d 3b 0a 20 20 20 20 20 20 61 6d 74 20 2d  py];.      amt -
1e150 3d 20 6e 43 6f 70 79 3b 0a 20 20 20 20 20 20 6f  = nCopy;.      o
1e160 66 66 73 65 74 20 2b 3d 20 6e 43 6f 70 79 3b 0a  ffset += nCopy;.
1e170 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66      }.  }.#endif
1e180 0a 20 0a 20 20 77 68 69 6c 65 28 20 28 77 72 6f  . .  while( (wro
1e190 74 65 20 3d 20 73 65 65 6b 41 6e 64 57 72 69 74  te = seekAndWrit
1e1a0 65 28 70 46 69 6c 65 2c 20 6f 66 66 73 65 74 2c  e(pFile, offset,
1e1b0 20 70 42 75 66 2c 20 61 6d 74 29 29 3c 61 6d 74   pBuf, amt))<amt
1e1c0 20 26 26 20 77 72 6f 74 65 3e 30 20 29 7b 0a 20   && wrote>0 ){. 
1e1d0 20 20 20 61 6d 74 20 2d 3d 20 77 72 6f 74 65 3b     amt -= wrote;
1e1e0 0a 20 20 20 20 6f 66 66 73 65 74 20 2b 3d 20 77  .    offset += w
1e1f0 72 6f 74 65 3b 0a 20 20 20 20 70 42 75 66 20 3d  rote;.    pBuf =
1e200 20 26 28 28 63 68 61 72 2a 29 70 42 75 66 29 5b   &((char*)pBuf)[
1e210 77 72 6f 74 65 5d 3b 0a 20 20 7d 0a 20 20 53 69  wrote];.  }.  Si
1e220 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 28 20  mulateIOError(( 
1e230 77 72 6f 74 65 3d 28 2d 31 29 2c 20 61 6d 74 3d  wrote=(-1), amt=
1e240 31 20 29 29 3b 0a 20 20 53 69 6d 75 6c 61 74 65  1 ));.  Simulate
1e250 44 69 73 6b 66 75 6c 6c 45 72 72 6f 72 28 28 20  DiskfullError(( 
1e260 77 72 6f 74 65 3d 30 2c 20 61 6d 74 3d 31 20 29  wrote=0, amt=1 )
1e270 29 3b 0a 0a 20 20 69 66 28 20 61 6d 74 3e 77 72  );..  if( amt>wr
1e280 6f 74 65 20 29 7b 0a 20 20 20 20 69 66 28 20 77  ote ){.    if( w
1e290 72 6f 74 65 3c 30 20 26 26 20 70 46 69 6c 65 2d  rote<0 && pFile-
1e2a0 3e 6c 61 73 74 45 72 72 6e 6f 21 3d 45 4e 4f 53  >lastErrno!=ENOS
1e2b0 50 43 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 6c  PC ){.      /* l
1e2c0 61 73 74 45 72 72 6e 6f 20 73 65 74 20 62 79 20  astErrno set by 
1e2d0 73 65 65 6b 41 6e 64 57 72 69 74 65 20 2a 2f 0a  seekAndWrite */.
1e2e0 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
1e2f0 49 54 45 5f 49 4f 45 52 52 5f 57 52 49 54 45 3b  ITE_IOERR_WRITE;
1e300 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
1e310 20 20 73 74 6f 72 65 4c 61 73 74 45 72 72 6e 6f    storeLastErrno
1e320 28 70 46 69 6c 65 2c 20 30 29 3b 20 2f 2a 20 6e  (pFile, 0); /* n
1e330 6f 74 20 61 20 73 79 73 74 65 6d 20 65 72 72 6f  ot a system erro
1e340 72 20 2a 2f 0a 20 20 20 20 20 20 72 65 74 75 72  r */.      retur
1e350 6e 20 53 51 4c 49 54 45 5f 46 55 4c 4c 3b 0a 20  n SQLITE_FULL;. 
1e360 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75     }.  }..  retu
1e370 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
1e380 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54  .#ifdef SQLITE_T
1e390 45 53 54 0a 2f 2a 0a 2a 2a 20 43 6f 75 6e 74 20  EST./*.** Count 
1e3a0 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 66 75  the number of fu
1e3b0 6c 6c 73 79 6e 63 73 20 61 6e 64 20 6e 6f 72 6d  llsyncs and norm
1e3c0 61 6c 20 73 79 6e 63 73 2e 20 20 54 68 69 73 20  al syncs.  This 
1e3d0 69 73 20 75 73 65 64 20 74 6f 20 74 65 73 74 0a  is used to test.
1e3e0 2a 2a 20 74 68 61 74 20 73 79 6e 63 73 20 61 6e  ** that syncs an
1e3f0 64 20 66 75 6c 6c 73 79 6e 63 73 20 61 72 65 20  d fullsyncs are 
1e400 6f 63 63 75 72 72 69 6e 67 20 61 74 20 74 68 65  occurring at the
1e410 20 72 69 67 68 74 20 74 69 6d 65 73 2e 0a 2a 2f   right times..*/
1e420 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 73 79 6e  .int sqlite3_syn
1e430 63 5f 63 6f 75 6e 74 20 3d 20 30 3b 0a 69 6e 74  c_count = 0;.int
1e440 20 73 71 6c 69 74 65 33 5f 66 75 6c 6c 73 79 6e   sqlite3_fullsyn
1e450 63 5f 63 6f 75 6e 74 20 3d 20 30 3b 0a 23 65 6e  c_count = 0;.#en
1e460 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 57 65 20 64 6f  dif../*.** We do
1e470 20 6e 6f 74 20 74 72 75 73 74 20 73 79 73 74 65   not trust syste
1e480 6d 73 20 74 6f 20 70 72 6f 76 69 64 65 20 61 20  ms to provide a 
1e490 77 6f 72 6b 69 6e 67 20 66 64 61 74 61 73 79 6e  working fdatasyn
1e4a0 63 28 29 2e 20 20 53 6f 6d 65 20 64 6f 2e 0a 2a  c().  Some do..*
1e4b0 2a 20 4f 74 68 65 72 73 20 64 6f 20 6e 6f 2e 20  * Others do no. 
1e4c0 20 54 6f 20 62 65 20 73 61 66 65 2c 20 77 65 20   To be safe, we 
1e4d0 77 69 6c 6c 20 73 74 69 63 6b 20 77 69 74 68 20  will stick with 
1e4e0 74 68 65 20 28 73 6c 69 67 68 74 6c 79 20 73 6c  the (slightly sl
1e4f0 6f 77 65 72 29 0a 2a 2a 20 66 73 79 6e 63 28 29  ower).** fsync()
1e500 2e 20 49 66 20 79 6f 75 20 6b 6e 6f 77 20 74 68  . If you know th
1e510 61 74 20 79 6f 75 72 20 73 79 73 74 65 6d 20 64  at your system d
1e520 6f 65 73 20 73 75 70 70 6f 72 74 20 66 64 61 74  oes support fdat
1e530 61 73 79 6e 63 28 29 20 63 6f 72 72 65 63 74 6c  async() correctl
1e540 79 2c 0a 2a 2a 20 74 68 65 6e 20 73 69 6d 70 6c  y,.** then simpl
1e550 79 20 63 6f 6d 70 69 6c 65 20 77 69 74 68 20 2d  y compile with -
1e560 44 66 64 61 74 61 73 79 6e 63 3d 66 64 61 74 61  Dfdatasync=fdata
1e570 73 79 6e 63 20 6f 72 20 2d 44 48 41 56 45 5f 46  sync or -DHAVE_F
1e580 44 41 54 41 53 59 4e 43 0a 2a 2f 0a 23 69 66 20  DATASYNC.*/.#if 
1e590 21 64 65 66 69 6e 65 64 28 66 64 61 74 61 73 79  !defined(fdatasy
1e5a0 6e 63 29 20 26 26 20 21 48 41 56 45 5f 46 44 41  nc) && !HAVE_FDA
1e5b0 54 41 53 59 4e 43 0a 23 20 64 65 66 69 6e 65 20  TASYNC.# define 
1e5c0 66 64 61 74 61 73 79 6e 63 20 66 73 79 6e 63 0a  fdatasync fsync.
1e5d0 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 44 65  #endif../*.** De
1e5e0 66 69 6e 65 20 48 41 56 45 5f 46 55 4c 4c 46 53  fine HAVE_FULLFS
1e5f0 59 4e 43 20 74 6f 20 30 20 6f 72 20 31 20 64 65  YNC to 0 or 1 de
1e600 70 65 6e 64 69 6e 67 20 6f 6e 20 77 68 65 74 68  pending on wheth
1e610 65 72 20 6f 72 20 6e 6f 74 0a 2a 2a 20 74 68 65  er or not.** the
1e620 20 46 5f 46 55 4c 4c 46 53 59 4e 43 20 6d 61 63   F_FULLFSYNC mac
1e630 72 6f 20 69 73 20 64 65 66 69 6e 65 64 2e 20 20  ro is defined.  
1e640 46 5f 46 55 4c 4c 46 53 59 4e 43 20 69 73 20 63  F_FULLFSYNC is c
1e650 75 72 72 65 6e 74 6c 79 0a 2a 2a 20 6f 6e 6c 79  urrently.** only
1e660 20 61 76 61 69 6c 61 62 6c 65 20 6f 6e 20 4d 61   available on Ma
1e670 63 20 4f 53 20 58 2e 20 20 42 75 74 20 74 68 61  c OS X.  But tha
1e680 74 20 63 6f 75 6c 64 20 63 68 61 6e 67 65 2e 0a  t could change..
1e690 2a 2f 0a 23 69 66 64 65 66 20 46 5f 46 55 4c 4c  */.#ifdef F_FULL
1e6a0 46 53 59 4e 43 0a 23 20 64 65 66 69 6e 65 20 48  FSYNC.# define H
1e6b0 41 56 45 5f 46 55 4c 4c 46 53 59 4e 43 20 31 0a  AVE_FULLFSYNC 1.
1e6c0 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 48  #else.# define H
1e6d0 41 56 45 5f 46 55 4c 4c 46 53 59 4e 43 20 30 0a  AVE_FULLFSYNC 0.
1e6e0 23 65 6e 64 69 66 0a 0a 23 69 66 64 65 66 20 53  #endif..#ifdef S
1e6f0 51 4c 49 54 45 5f 55 53 45 5f 52 45 51 55 45 53  QLITE_USE_REQUES
1e700 54 5f 46 55 4c 4c 46 53 59 4e 43 0a 23 69 6d 70  T_FULLFSYNC.#imp
1e710 6f 72 74 20 3c 6e 6f 74 69 66 79 2e 68 3e 0a 23  ort <notify.h>.#
1e720 69 6d 70 6f 72 74 20 3c 6c 69 62 6b 65 72 6e 2f  import <libkern/
1e730 4f 53 41 74 6f 6d 69 63 2e 68 3e 0a 73 74 61 74  OSAtomic.h>.stat
1e740 69 63 20 4f 53 53 70 69 6e 4c 6f 63 6b 20 6e 6f  ic OSSpinLock no
1e750 74 69 66 79 5f 6c 6f 63 6b 20 3d 20 30 3b 0a 23  tify_lock = 0;.#
1e760 64 65 66 69 6e 65 20 52 45 51 55 45 53 54 5f 46  define REQUEST_F
1e770 55 4c 4c 53 59 4e 43 5f 4e 4f 54 49 46 49 43 41  ULLSYNC_NOTIFICA
1e780 54 49 4f 4e 20 20 20 20 22 63 6f 6d 2e 61 70 70  TION    "com.app
1e790 6c 65 2e 72 65 71 73 79 6e 63 22 0a 23 65 6e 64  le.reqsync".#end
1e7a0 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 73  if../*.** The fs
1e7b0 79 6e 63 28 29 20 73 79 73 74 65 6d 20 63 61 6c  ync() system cal
1e7c0 6c 20 64 6f 65 73 20 6e 6f 74 20 77 6f 72 6b 20  l does not work 
1e7d0 61 73 20 61 64 76 65 72 74 69 73 65 64 20 6f 6e  as advertised on
1e7e0 20 6d 61 6e 79 0a 2a 2a 20 75 6e 69 78 20 73 79   many.** unix sy
1e7f0 73 74 65 6d 73 2e 20 20 54 68 65 20 66 6f 6c 6c  stems.  The foll
1e800 6f 77 69 6e 67 20 70 72 6f 63 65 64 75 72 65 20  owing procedure 
1e810 69 73 20 61 6e 20 61 74 74 65 6d 70 74 20 74 6f  is an attempt to
1e820 20 6d 61 6b 65 0a 2a 2a 20 69 74 20 77 6f 72 6b   make.** it work
1e830 20 62 65 74 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 54   better..**.** T
1e840 68 65 20 53 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e  he SQLITE_NO_SYN
1e850 43 20 6d 61 63 72 6f 20 64 69 73 61 62 6c 65 73  C macro disables
1e860 20 61 6c 6c 20 66 73 79 6e 63 28 29 73 2e 20 20   all fsync()s.  
1e870 54 68 69 73 20 69 73 20 75 73 65 66 75 6c 0a 2a  This is useful.*
1e880 2a 20 66 6f 72 20 74 65 73 74 69 6e 67 20 77 68  * for testing wh
1e890 65 6e 20 77 65 20 77 61 6e 74 20 74 6f 20 72 75  en we want to ru
1e8a0 6e 20 74 68 72 6f 75 67 68 20 74 68 65 20 74 65  n through the te
1e8b0 73 74 20 73 75 69 74 65 20 71 75 69 63 6b 6c 79  st suite quickly
1e8c0 2e 0a 2a 2a 20 59 6f 75 20 61 72 65 20 73 74 72  ..** You are str
1e8d0 6f 6e 67 6c 79 20 61 64 76 69 73 65 64 20 2a 6e  ongly advised *n
1e8e0 6f 74 2a 20 74 6f 20 64 65 70 6c 6f 79 20 77 69  ot* to deploy wi
1e8f0 74 68 20 53 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e  th SQLITE_NO_SYN
1e900 43 0a 2a 2a 20 65 6e 61 62 6c 65 64 2c 20 68 6f  C.** enabled, ho
1e910 77 65 76 65 72 2c 20 73 69 6e 63 65 20 77 69 74  wever, since wit
1e920 68 20 53 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e 43  h SQLITE_NO_SYNC
1e930 20 65 6e 61 62 6c 65 64 2c 20 61 6e 20 4f 53 20   enabled, an OS 
1e940 63 72 61 73 68 0a 2a 2a 20 6f 72 20 70 6f 77 65  crash.** or powe
1e950 72 20 66 61 69 6c 75 72 65 20 77 69 6c 6c 20 6c  r failure will l
1e960 69 6b 65 6c 79 20 63 6f 72 72 75 70 74 20 74 68  ikely corrupt th
1e970 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
1e980 0a 2a 2a 0a 2a 2a 20 53 51 4c 69 74 65 20 73 65  .**.** SQLite se
1e990 74 73 20 74 68 65 20 64 61 74 61 4f 6e 6c 79 20  ts the dataOnly 
1e9a0 66 6c 61 67 20 69 66 20 74 68 65 20 73 69 7a 65  flag if the size
1e9b0 20 6f 66 20 74 68 65 20 66 69 6c 65 20 69 73 20   of the file is 
1e9c0 75 6e 63 68 61 6e 67 65 64 2e 0a 2a 2a 20 54 68  unchanged..** Th
1e9d0 65 20 69 64 65 61 20 62 65 68 69 6e 64 20 64 61  e idea behind da
1e9e0 74 61 4f 6e 6c 79 20 69 73 20 74 68 61 74 20 69  taOnly is that i
1e9f0 74 20 73 68 6f 75 6c 64 20 6f 6e 6c 79 20 77 72  t should only wr
1ea00 69 74 65 20 74 68 65 20 66 69 6c 65 20 63 6f 6e  ite the file con
1ea10 74 65 6e 74 0a 2a 2a 20 74 6f 20 64 69 73 6b 2c  tent.** to disk,
1ea20 20 6e 6f 74 20 74 68 65 20 69 6e 6f 64 65 2e 20   not the inode. 
1ea30 20 57 65 20 6f 6e 6c 79 20 73 65 74 20 64 61 74   We only set dat
1ea40 61 4f 6e 6c 79 20 69 66 20 74 68 65 20 66 69 6c  aOnly if the fil
1ea50 65 20 73 69 7a 65 20 69 73 20 0a 2a 2a 20 75 6e  e size is .** un
1ea60 63 68 61 6e 67 65 64 20 73 69 6e 63 65 20 74 68  changed since th
1ea70 65 20 66 69 6c 65 20 73 69 7a 65 20 69 73 20 70  e file size is p
1ea80 61 72 74 20 6f 66 20 74 68 65 20 69 6e 6f 64 65  art of the inode
1ea90 2e 20 20 48 6f 77 65 76 65 72 2c 20 0a 2a 2a 20  .  However, .** 
1eaa0 54 65 64 20 54 73 27 6f 20 74 65 6c 6c 73 20 75  Ted Ts'o tells u
1eab0 73 20 74 68 61 74 20 66 64 61 74 61 73 79 6e 63  s that fdatasync
1eac0 28 29 20 77 69 6c 6c 20 61 6c 73 6f 20 77 72 69  () will also wri
1ead0 74 65 20 74 68 65 20 69 6e 6f 64 65 20 69 66 20  te the inode if 
1eae0 74 68 65 0a 2a 2a 20 66 69 6c 65 20 73 69 7a 65  the.** file size
1eaf0 20 68 61 73 20 63 68 61 6e 67 65 64 2e 20 20 54   has changed.  T
1eb00 68 65 20 6f 6e 6c 79 20 72 65 61 6c 20 64 69 66  he only real dif
1eb10 66 65 72 65 6e 63 65 20 62 65 74 77 65 65 6e 20  ference between 
1eb20 66 64 61 74 61 73 79 6e 63 28 29 0a 2a 2a 20 61  fdatasync().** a
1eb30 6e 64 20 66 73 79 6e 63 28 29 2c 20 54 65 64 20  nd fsync(), Ted 
1eb40 74 65 6c 6c 73 20 75 73 2c 20 69 73 20 74 68 61  tells us, is tha
1eb50 74 20 66 64 61 74 61 73 79 6e 63 28 29 20 77 69  t fdatasync() wi
1eb60 6c 6c 20 6e 6f 74 20 66 6c 75 73 68 20 74 68 65  ll not flush the
1eb70 0a 2a 2a 20 69 6e 6f 64 65 20 69 66 20 74 68 65  .** inode if the
1eb80 20 6d 74 69 6d 65 20 6f 72 20 6f 77 6e 65 72 20   mtime or owner 
1eb90 6f 72 20 6f 74 68 65 72 20 69 6e 6f 64 65 20 61  or other inode a
1eba0 74 74 72 69 62 75 74 65 73 20 68 61 76 65 20 63  ttributes have c
1ebb0 68 61 6e 67 65 64 2e 0a 2a 2a 20 57 65 20 6f 6e  hanged..** We on
1ebc0 6c 79 20 63 61 72 65 20 61 62 6f 75 74 20 74 68  ly care about th
1ebd0 65 20 66 69 6c 65 20 73 69 7a 65 2c 20 6e 6f 74  e file size, not
1ebe0 20 74 68 65 20 6f 74 68 65 72 20 66 69 6c 65 20   the other file 
1ebf0 61 74 74 72 69 62 75 74 65 73 2c 20 73 6f 0a 2a  attributes, so.*
1ec00 2a 20 61 73 20 66 61 72 20 61 73 20 53 51 4c 69  * as far as SQLi
1ec10 74 65 20 69 73 20 63 6f 6e 63 65 72 6e 65 64 2c  te is concerned,
1ec20 20 61 6e 20 66 64 61 74 61 73 79 6e 63 28 29 20   an fdatasync() 
1ec30 69 73 20 61 6c 77 61 79 73 20 61 64 65 71 75 61  is always adequa
1ec40 74 65 2e 0a 2a 2a 20 53 6f 2c 20 77 65 20 61 6c  te..** So, we al
1ec50 77 61 79 73 20 75 73 65 20 66 64 61 74 61 73 79  ways use fdatasy
1ec60 6e 63 28 29 20 69 66 20 69 74 20 69 73 20 61 76  nc() if it is av
1ec70 61 69 6c 61 62 6c 65 2c 20 72 65 67 61 72 64 6c  ailable, regardl
1ec80 65 73 73 20 6f 66 0a 2a 2a 20 74 68 65 20 76 61  ess of.** the va
1ec90 6c 75 65 20 6f 66 20 74 68 65 20 64 61 74 61 4f  lue of the dataO
1eca0 6e 6c 79 20 66 6c 61 67 2e 0a 2a 2f 0a 73 74 61  nly flag..*/.sta
1ecb0 74 69 63 20 69 6e 74 20 66 75 6c 6c 5f 66 73 79  tic int full_fsy
1ecc0 6e 63 28 69 6e 74 20 66 64 2c 20 69 6e 74 20 66  nc(int fd, int f
1ecd0 75 6c 6c 53 79 6e 63 2c 20 69 6e 74 20 64 61 74  ullSync, int dat
1ece0 61 4f 6e 6c 79 29 7b 0a 20 20 69 6e 74 20 72 63  aOnly){.  int rc
1ecf0 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c  ;..  /* The foll
1ed00 6f 77 69 6e 67 20 22 69 66 64 65 66 2f 65 6c 69  owing "ifdef/eli
1ed10 66 2f 65 6c 73 65 2f 22 20 62 6c 6f 63 6b 20 68  f/else/" block h
1ed20 61 73 20 74 68 65 20 73 61 6d 65 20 73 74 72 75  as the same stru
1ed30 63 74 75 72 65 20 61 73 0a 20 20 2a 2a 20 74 68  cture as.  ** th
1ed40 65 20 6f 6e 65 20 62 65 6c 6f 77 2e 20 49 74 20  e one below. It 
1ed50 69 73 20 72 65 70 6c 69 63 61 74 65 64 20 68 65  is replicated he
1ed60 72 65 20 73 6f 6c 65 6c 79 20 74 6f 20 61 76 6f  re solely to avo
1ed70 69 64 20 63 6c 75 74 74 65 72 69 6e 67 20 0a 20  id cluttering . 
1ed80 20 2a 2a 20 75 70 20 74 68 65 20 72 65 61 6c 20   ** up the real 
1ed90 63 6f 64 65 20 77 69 74 68 20 74 68 65 20 55 4e  code with the UN
1eda0 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 29  USED_PARAMETER()
1edb0 20 6d 61 63 72 6f 73 2e 0a 20 20 2a 2f 0a 23 69   macros..  */.#i
1edc0 66 64 65 66 20 53 51 4c 49 54 45 5f 4e 4f 5f 53  fdef SQLITE_NO_S
1edd0 59 4e 43 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  YNC.  UNUSED_PAR
1ede0 41 4d 45 54 45 52 28 66 64 29 3b 0a 20 20 55 4e  AMETER(fd);.  UN
1edf0 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 66  USED_PARAMETER(f
1ee00 75 6c 6c 53 79 6e 63 29 3b 0a 20 20 55 4e 55 53  ullSync);.  UNUS
1ee10 45 44 5f 50 41 52 41 4d 45 54 45 52 28 64 61 74  ED_PARAMETER(dat
1ee20 61 4f 6e 6c 79 29 3b 0a 23 65 6c 69 66 20 48 41  aOnly);.#elif HA
1ee30 56 45 5f 46 55 4c 4c 46 53 59 4e 43 0a 20 20 55  VE_FULLFSYNC.  U
1ee40 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
1ee50 64 61 74 61 4f 6e 6c 79 29 3b 0a 23 65 6c 73 65  dataOnly);.#else
1ee60 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
1ee70 54 45 52 28 66 75 6c 6c 53 79 6e 63 29 3b 0a 20  TER(fullSync);. 
1ee80 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
1ee90 52 28 64 61 74 61 4f 6e 6c 79 29 3b 0a 23 65 6e  R(dataOnly);.#en
1eea0 64 69 66 0a 0a 20 20 2f 2a 20 52 65 63 6f 72 64  dif..  /* Record
1eeb0 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 74   the number of t
1eec0 69 6d 65 73 20 74 68 61 74 20 77 65 20 64 6f 20  imes that we do 
1eed0 61 20 6e 6f 72 6d 61 6c 20 66 73 79 6e 63 28 29  a normal fsync()
1eee0 20 61 6e 64 20 0a 20 20 2a 2a 20 46 55 4c 4c 53   and .  ** FULLS
1eef0 59 4e 43 2e 20 20 54 68 69 73 20 69 73 20 75 73  YNC.  This is us
1ef00 65 64 20 64 75 72 69 6e 67 20 74 65 73 74 69 6e  ed during testin
1ef10 67 20 74 6f 20 76 65 72 69 66 79 20 74 68 61 74  g to verify that
1ef20 20 74 68 69 73 20 70 72 6f 63 65 64 75 72 65 0a   this procedure.
1ef30 20 20 2a 2a 20 67 65 74 73 20 63 61 6c 6c 65 64    ** gets called
1ef40 20 77 69 74 68 20 74 68 65 20 63 6f 72 72 65 63   with the correc
1ef50 74 20 61 72 67 75 6d 65 6e 74 73 2e 0a 20 20 2a  t arguments..  *
1ef60 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /.#ifdef SQLITE_
1ef70 54 45 53 54 0a 20 20 69 66 28 20 66 75 6c 6c 53  TEST.  if( fullS
1ef80 79 6e 63 20 29 20 73 71 6c 69 74 65 33 5f 66 75  ync ) sqlite3_fu
1ef90 6c 6c 73 79 6e 63 5f 63 6f 75 6e 74 2b 2b 3b 0a  llsync_count++;.
1efa0 20 20 73 71 6c 69 74 65 33 5f 73 79 6e 63 5f 63    sqlite3_sync_c
1efb0 6f 75 6e 74 2b 2b 3b 0a 23 65 6e 64 69 66 0a 0a  ount++;.#endif..
1efc0 20 20 2f 2a 20 49 66 20 77 65 20 63 6f 6d 70 69    /* If we compi
1efd0 6c 65 64 20 77 69 74 68 20 74 68 65 20 53 51 4c  led with the SQL
1efe0 49 54 45 5f 4e 4f 5f 53 59 4e 43 20 66 6c 61 67  ITE_NO_SYNC flag
1eff0 2c 20 74 68 65 6e 20 73 79 6e 63 69 6e 67 20 69  , then syncing i
1f000 73 20 61 0a 20 20 2a 2a 20 6e 6f 2d 6f 70 2e 20  s a.  ** no-op. 
1f010 20 42 75 74 20 67 6f 20 61 68 65 61 64 20 61 6e   But go ahead an
1f020 64 20 63 61 6c 6c 20 66 73 74 61 74 28 29 20 74  d call fstat() t
1f030 6f 20 76 61 6c 69 64 61 74 65 20 74 68 65 20 66  o validate the f
1f040 69 6c 65 0a 20 20 2a 2a 20 64 65 73 63 72 69 70  ile.  ** descrip
1f050 74 6f 72 20 61 73 20 77 65 20 6e 65 65 64 20 61  tor as we need a
1f060 20 6d 65 74 68 6f 64 20 74 6f 20 70 72 6f 76 6f   method to provo
1f070 6b 65 20 61 20 66 61 69 6c 75 72 65 20 64 75 72  ke a failure dur
1f080 69 6e 67 0a 20 20 2a 2a 20 63 6f 76 65 72 61 74  ing.  ** coverat
1f090 65 20 74 65 73 74 69 6e 67 2e 0a 20 20 2a 2f 0a  e testing..  */.
1f0a0 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4e 4f  #ifdef SQLITE_NO
1f0b0 5f 53 59 4e 43 0a 20 20 7b 0a 20 20 20 20 73 74  _SYNC.  {.    st
1f0c0 72 75 63 74 20 73 74 61 74 20 62 75 66 3b 0a 20  ruct stat buf;. 
1f0d0 20 20 20 72 63 20 3d 20 6f 73 46 73 74 61 74 28     rc = osFstat(
1f0e0 66 64 2c 20 26 62 75 66 29 3b 0a 20 20 7d 0a 23  fd, &buf);.  }.#
1f0f0 65 6c 69 66 20 48 41 56 45 5f 46 55 4c 4c 46 53  elif HAVE_FULLFS
1f100 59 4e 43 0a 20 20 69 66 28 20 66 75 6c 6c 53 79  YNC.  if( fullSy
1f110 6e 63 20 29 7b 0a 23 69 66 64 65 66 20 53 51 4c  nc ){.#ifdef SQL
1f120 49 54 45 5f 55 53 45 5f 52 45 51 55 45 53 54 5f  ITE_USE_REQUEST_
1f130 46 55 4c 4c 46 53 59 4e 43 0a 20 20 20 20 72 63  FULLFSYNC.    rc
1f140 20 3d 20 6f 73 46 73 79 6e 63 28 66 64 29 3b 0a   = osFsync(fd);.
1f150 20 20 20 20 69 66 20 28 21 72 63 29 20 7b 0a 20      if (!rc) {. 
1f160 20 20 20 20 20 4f 53 53 70 69 6e 4c 6f 63 6b 4c       OSSpinLockL
1f170 6f 63 6b 28 26 6e 6f 74 69 66 79 5f 6c 6f 63 6b  ock(&notify_lock
1f180 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 6e 6f  );.      rc = no
1f190 74 69 66 79 5f 70 6f 73 74 28 52 45 51 55 45 53  tify_post(REQUES
1f1a0 54 5f 46 55 4c 4c 53 59 4e 43 5f 4e 4f 54 49 46  T_FULLSYNC_NOTIF
1f1b0 49 43 41 54 49 4f 4e 29 3b 0a 20 20 20 20 20 20  ICATION);.      
1f1c0 4f 53 53 70 69 6e 4c 6f 63 6b 55 6e 6c 6f 63 6b  OSSpinLockUnlock
1f1d0 28 26 6e 6f 74 69 66 79 5f 6c 6f 63 6b 29 3b 0a  (&notify_lock);.
1f1e0 20 20 20 20 7d 0a 23 65 6c 73 65 0a 20 20 20 20      }.#else.    
1f1f0 72 63 20 3d 20 6f 73 46 63 6e 74 6c 28 66 64 2c  rc = osFcntl(fd,
1f200 20 46 5f 46 55 4c 4c 46 53 59 4e 43 2c 20 30 29   F_FULLFSYNC, 0)
1f210 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 65 6c 73 65  ;.#endif.  }else
1f220 7b 0a 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20  {.    rc = 1;.  
1f230 7d 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 46 55  }.  /* If the FU
1f240 4c 4c 46 53 59 4e 43 20 66 61 69 6c 65 64 2c 20  LLFSYNC failed, 
1f250 66 61 6c 6c 20 62 61 63 6b 20 74 6f 20 61 74 74  fall back to att
1f260 65 6d 70 74 69 6e 67 20 61 6e 20 66 73 79 6e 63  empting an fsync
1f270 28 29 2e 0a 20 20 2a 2a 20 49 74 20 73 68 6f 75  ()..  ** It shou
1f280 6c 64 6e 27 74 20 62 65 20 70 6f 73 73 69 62 6c  ldn't be possibl
1f290 65 20 66 6f 72 20 66 75 6c 6c 66 73 79 6e 63 20  e for fullfsync 
1f2a0 74 6f 20 66 61 69 6c 20 6f 6e 20 74 68 65 20 6c  to fail on the l
1f2b0 6f 63 61 6c 20 0a 20 20 2a 2a 20 66 69 6c 65 20  ocal .  ** file 
1f2c0 73 79 73 74 65 6d 20 28 6f 6e 20 4f 53 58 29 2c  system (on OSX),
1f2d0 20 73 6f 20 66 61 69 6c 75 72 65 20 69 6e 64 69   so failure indi
1f2e0 63 61 74 65 73 20 74 68 61 74 20 46 55 4c 4c 46  cates that FULLF
1f2f0 53 59 4e 43 0a 20 20 2a 2a 20 69 73 6e 27 74 20  SYNC.  ** isn't 
1f300 73 75 70 70 6f 72 74 65 64 20 66 6f 72 20 74 68  supported for th
1f310 69 73 20 66 69 6c 65 20 73 79 73 74 65 6d 2e 20  is file system. 
1f320 53 6f 2c 20 61 74 74 65 6d 70 74 20 61 6e 20 66  So, attempt an f
1f330 73 79 6e 63 20 0a 20 20 2a 2a 20 61 6e 64 20 28  sync .  ** and (
1f340 66 6f 72 20 6e 6f 77 29 20 69 67 6e 6f 72 65 20  for now) ignore 
1f350 74 68 65 20 6f 76 65 72 68 65 61 64 20 6f 66 20  the overhead of 
1f360 61 20 73 75 70 65 72 66 6c 75 6f 75 73 20 66 63  a superfluous fc
1f370 6e 74 6c 20 63 61 6c 6c 2e 20 20 0a 20 20 2a 2a  ntl call.  .  **
1f380 20 49 74 27 64 20 62 65 20 62 65 74 74 65 72 20   It'd be better 
1f390 74 6f 20 64 65 74 65 63 74 20 66 75 6c 6c 66 73  to detect fullfs
1f3a0 79 6e 63 20 73 75 70 70 6f 72 74 20 6f 6e 63 65  ync support once
1f3b0 20 61 6e 64 20 61 76 6f 69 64 20 0a 20 20 2a 2a   and avoid .  **
1f3c0 20 74 68 65 20 66 63 6e 74 6c 20 63 61 6c 6c 20   the fcntl call 
1f3d0 65 76 65 72 79 20 74 69 6d 65 20 73 79 6e 63 20  every time sync 
1f3e0 69 73 20 63 61 6c 6c 65 64 2e 0a 20 20 2a 2f 0a  is called..  */.
1f3f0 20 20 69 66 28 20 72 63 20 29 20 72 63 20 3d 20    if( rc ) rc = 
1f400 66 73 79 6e 63 28 66 64 29 3b 0a 0a 23 65 6c 69  fsync(fd);..#eli
1f410 66 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c  f defined(__APPL
1f420 45 5f 5f 29 0a 20 20 2f 2a 20 66 64 61 74 61 73  E__).  /* fdatas
1f430 79 6e 63 28 29 20 6f 6e 20 48 46 53 2b 20 64 6f  ync() on HFS+ do
1f440 65 73 6e 27 74 20 79 65 74 20 66 6c 75 73 68 20  esn't yet flush 
1f450 74 68 65 20 66 69 6c 65 20 73 69 7a 65 20 69 66  the file size if
1f460 20 69 74 20 63 68 61 6e 67 65 64 20 63 6f 72 72   it changed corr
1f470 65 63 74 6c 79 0a 20 20 2a 2a 20 73 6f 20 63 75  ectly.  ** so cu
1f480 72 72 65 6e 74 6c 79 20 77 65 20 64 65 66 61 75  rrently we defau
1f490 6c 74 20 74 6f 20 74 68 65 20 6d 61 63 72 6f 20  lt to the macro 
1f4a0 74 68 61 74 20 72 65 64 65 66 69 6e 65 73 20 66  that redefines f
1f4b0 64 61 74 61 73 79 6e 63 20 74 6f 20 66 73 79 6e  datasync to fsyn
1f4c0 63 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 66 73  c.  */.  rc = fs
1f4d0 79 6e 63 28 66 64 29 3b 0a 23 65 6c 73 65 20 0a  ync(fd);.#else .
1f4e0 20 20 72 63 20 3d 20 66 64 61 74 61 73 79 6e 63    rc = fdatasync
1f4f0 28 66 64 29 3b 0a 23 69 66 20 4f 53 5f 56 58 57  (fd);.#if OS_VXW
1f500 4f 52 4b 53 0a 20 20 69 66 28 20 72 63 3d 3d 2d  ORKS.  if( rc==-
1f510 31 20 26 26 20 65 72 72 6e 6f 3d 3d 45 4e 4f 54  1 && errno==ENOT
1f520 53 55 50 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  SUP ){.    rc = 
1f530 66 73 79 6e 63 28 66 64 29 3b 0a 20 20 7d 0a 23  fsync(fd);.  }.#
1f540 65 6e 64 69 66 20 2f 2a 20 4f 53 5f 56 58 57 4f  endif /* OS_VXWO
1f550 52 4b 53 20 2a 2f 0a 23 65 6e 64 69 66 20 2f 2a  RKS */.#endif /*
1f560 20 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4e 4f   ifdef SQLITE_NO
1f570 5f 53 59 4e 43 20 65 6c 69 66 20 48 41 56 45 5f  _SYNC elif HAVE_
1f580 46 55 4c 4c 46 53 59 4e 43 20 2a 2f 0a 0a 20 20  FULLFSYNC */..  
1f590 69 66 28 20 4f 53 5f 56 58 57 4f 52 4b 53 20 26  if( OS_VXWORKS &
1f5a0 26 20 72 63 21 3d 20 2d 31 20 29 7b 0a 20 20 20  & rc!= -1 ){.   
1f5b0 20 72 63 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72   rc = 0;.  }.  r
1f5c0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
1f5d0 2a 2a 20 4f 70 65 6e 20 61 20 66 69 6c 65 20 64  ** Open a file d
1f5e0 65 73 63 72 69 70 74 6f 72 20 74 6f 20 74 68 65  escriptor to the
1f5f0 20 64 69 72 65 63 74 6f 72 79 20 63 6f 6e 74 61   directory conta
1f600 69 6e 69 6e 67 20 66 69 6c 65 20 7a 46 69 6c 65  ining file zFile
1f610 6e 61 6d 65 2e 0a 2a 2a 20 49 66 20 73 75 63 63  name..** If succ
1f620 65 73 73 66 75 6c 2c 20 2a 70 46 64 20 69 73 20  essful, *pFd is 
1f630 73 65 74 20 74 6f 20 74 68 65 20 6f 70 65 6e 65  set to the opene
1f640 64 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  d file descripto
1f650 72 20 61 6e 64 0a 2a 2a 20 53 51 4c 49 54 45 5f  r and.** SQLITE_
1f660 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20  OK is returned. 
1f670 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  If an error occu
1f680 72 73 2c 20 65 69 74 68 65 72 20 53 51 4c 49 54  rs, either SQLIT
1f690 45 5f 4e 4f 4d 45 4d 0a 2a 2a 20 6f 72 20 53 51  E_NOMEM.** or SQ
1f6a0 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 20 69 73  LITE_CANTOPEN is
1f6b0 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20 2a 70   returned and *p
1f6c0 46 64 20 69 73 20 73 65 74 20 74 6f 20 61 6e 20  Fd is set to an 
1f6d0 75 6e 64 65 66 69 6e 65 64 0a 2a 2a 20 76 61 6c  undefined.** val
1f6e0 75 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64 69  ue..**.** The di
1f6f0 72 65 63 74 6f 72 79 20 66 69 6c 65 20 64 65 73  rectory file des
1f700 63 72 69 70 74 6f 72 20 69 73 20 75 73 65 64 20  criptor is used 
1f710 66 6f 72 20 6f 6e 6c 79 20 6f 6e 65 20 74 68 69  for only one thi
1f720 6e 67 20 2d 20 74 6f 0a 2a 2a 20 66 73 79 6e 63  ng - to.** fsync
1f730 28 29 20 61 20 64 69 72 65 63 74 6f 72 79 20 74  () a directory t
1f740 6f 20 6d 61 6b 65 20 73 75 72 65 20 66 69 6c 65  o make sure file
1f750 20 63 72 65 61 74 69 6f 6e 20 61 6e 64 20 64 65   creation and de
1f760 6c 65 74 69 6f 6e 20 65 76 65 6e 74 73 0a 2a 2a  letion events.**
1f770 20 61 72 65 20 66 6c 75 73 68 65 64 20 74 6f 20   are flushed to 
1f780 64 69 73 6b 2e 20 20 53 75 63 68 20 66 73 79 6e  disk.  Such fsyn
1f790 63 73 20 61 72 65 20 6e 6f 74 20 6e 65 65 64 65  cs are not neede
1f7a0 64 20 6f 6e 20 6e 65 77 65 72 0a 2a 2a 20 6a 6f  d on newer.** jo
1f7b0 75 72 6e 61 6c 69 6e 67 20 66 69 6c 65 73 79 73  urnaling filesys
1f7c0 74 65 6d 73 2c 20 62 75 74 20 61 72 65 20 72 65  tems, but are re
1f7d0 71 75 69 72 65 64 20 6f 6e 20 6f 6c 64 65 72 20  quired on older 
1f7e0 66 69 6c 65 73 79 73 74 65 6d 73 2e 0a 2a 2a 0a  filesystems..**.
1f7f0 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
1f800 63 61 6e 20 62 65 20 6f 76 65 72 72 69 64 64 65  can be overridde
1f810 6e 20 75 73 69 6e 67 20 74 68 65 20 78 53 65 74  n using the xSet
1f820 53 79 73 43 61 6c 6c 20 69 6e 74 65 72 66 61 63  SysCall interfac
1f830 65 2e 0a 2a 2a 20 54 68 65 20 61 62 69 6c 69 74  e..** The abilit
1f840 79 20 74 6f 20 6f 76 65 72 72 69 64 65 20 74 68  y to override th
1f850 69 73 20 72 6f 75 74 69 6e 65 20 77 61 73 20 61  is routine was a
1f860 64 64 65 64 20 69 6e 20 73 75 70 70 6f 72 74 20  dded in support 
1f870 6f 66 20 74 68 65 0a 2a 2a 20 63 68 72 6f 6d 69  of the.** chromi
1f880 75 6d 20 73 61 6e 64 62 6f 78 2e 20 20 4f 70 65  um sandbox.  Ope
1f890 6e 69 6e 67 20 61 20 64 69 72 65 63 74 6f 72 79  ning a directory
1f8a0 20 69 73 20 61 20 73 65 63 75 72 69 74 79 20 72   is a security r
1f8b0 69 73 6b 20 28 77 65 20 61 72 65 0a 2a 2a 20 74  isk (we are.** t
1f8c0 6f 6c 64 29 20 73 6f 20 6d 61 6b 69 6e 67 20 69  old) so making i
1f8d0 74 20 6f 76 65 72 72 69 64 65 61 62 6c 65 20 61  t overrideable a
1f8e0 6c 6c 6f 77 73 20 74 68 65 20 63 68 72 6f 6d 69  llows the chromi
1f8f0 75 6d 20 73 61 6e 64 62 6f 78 20 74 6f 0a 2a 2a  um sandbox to.**
1f900 20 72 65 70 6c 61 63 65 20 74 68 69 73 20 72 6f   replace this ro
1f910 75 74 69 6e 65 20 77 69 74 68 20 61 20 68 61 72  utine with a har
1f920 6d 6c 65 73 73 20 6e 6f 2d 6f 70 2e 20 20 54 6f  mless no-op.  To
1f930 20 6d 61 6b 65 20 74 68 69 73 20 72 6f 75 74 69   make this routi
1f940 6e 65 0a 2a 2a 20 61 20 6e 6f 2d 6f 70 2c 20 72  ne.** a no-op, r
1f950 65 70 6c 61 63 65 20 69 74 20 77 69 74 68 20 61  eplace it with a
1f960 20 73 74 75 62 20 74 68 61 74 20 72 65 74 75 72   stub that retur
1f970 6e 73 20 53 51 4c 49 54 45 5f 4f 4b 20 62 75 74  ns SQLITE_OK but
1f980 20 6c 65 61 76 65 73 0a 2a 2a 20 2a 70 46 64 20   leaves.** *pFd 
1f990 73 65 74 20 74 6f 20 61 20 6e 65 67 61 74 69 76  set to a negativ
1f9a0 65 20 6e 75 6d 62 65 72 2e 0a 2a 2a 0a 2a 2a 20  e number..**.** 
1f9b0 49 66 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20  If SQLITE_OK is 
1f9c0 72 65 74 75 72 6e 65 64 2c 20 74 68 65 20 63 61  returned, the ca
1f9d0 6c 6c 65 72 20 69 73 20 72 65 73 70 6f 6e 73 69  ller is responsi
1f9e0 62 6c 65 20 66 6f 72 20 63 6c 6f 73 69 6e 67 0a  ble for closing.
1f9f0 2a 2a 20 74 68 65 20 66 69 6c 65 20 64 65 73 63  ** the file desc
1fa00 72 69 70 74 6f 72 20 2a 70 46 64 20 75 73 69 6e  riptor *pFd usin
1fa10 67 20 63 6c 6f 73 65 28 29 2e 0a 2a 2f 0a 73 74  g close()..*/.st
1fa20 61 74 69 63 20 69 6e 74 20 6f 70 65 6e 44 69 72  atic int openDir
1fa30 65 63 74 6f 72 79 28 63 6f 6e 73 74 20 63 68 61  ectory(const cha
1fa40 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20 69 6e  r *zFilename, in
1fa50 74 20 2a 70 46 64 29 7b 0a 20 20 69 6e 74 20 69  t *pFd){.  int i
1fa60 69 3b 0a 20 20 69 6e 74 20 66 64 20 3d 20 2d 31  i;.  int fd = -1
1fa70 3b 0a 20 20 63 68 61 72 20 7a 44 69 72 6e 61 6d  ;.  char zDirnam
1fa80 65 5b 4d 41 58 5f 50 41 54 48 4e 41 4d 45 2b 31  e[MAX_PATHNAME+1
1fa90 5d 3b 0a 0a 20 20 73 71 6c 69 74 65 33 5f 73 6e  ];..  sqlite3_sn
1faa0 70 72 69 6e 74 66 28 4d 41 58 5f 50 41 54 48 4e  printf(MAX_PATHN
1fab0 41 4d 45 2c 20 7a 44 69 72 6e 61 6d 65 2c 20 22  AME, zDirname, "
1fac0 25 73 22 2c 20 7a 46 69 6c 65 6e 61 6d 65 29 3b  %s", zFilename);
1fad0 0a 20 20 66 6f 72 28 69 69 3d 28 69 6e 74 29 73  .  for(ii=(int)s
1fae0 74 72 6c 65 6e 28 7a 44 69 72 6e 61 6d 65 29 3b  trlen(zDirname);
1faf0 20 69 69 3e 30 20 26 26 20 7a 44 69 72 6e 61 6d   ii>0 && zDirnam
1fb00 65 5b 69 69 5d 21 3d 27 2f 27 3b 20 69 69 2d 2d  e[ii]!='/'; ii--
1fb10 29 3b 0a 20 20 69 66 28 20 69 69 3e 30 20 29 7b  );.  if( ii>0 ){
1fb20 0a 20 20 20 20 7a 44 69 72 6e 61 6d 65 5b 69 69  .    zDirname[ii
1fb30 5d 20 3d 20 27 5c 30 27 3b 0a 20 20 7d 65 6c 73  ] = '\0';.  }els
1fb40 65 7b 0a 20 20 20 20 69 66 28 20 7a 44 69 72 6e  e{.    if( zDirn
1fb50 61 6d 65 5b 30 5d 21 3d 27 2f 27 20 29 20 7a 44  ame[0]!='/' ) zD
1fb60 69 72 6e 61 6d 65 5b 30 5d 20 3d 20 27 2e 27 3b  irname[0] = '.';
1fb70 0a 20 20 20 20 7a 44 69 72 6e 61 6d 65 5b 31 5d  .    zDirname[1]
1fb80 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 66 64 20 3d   = 0;.  }.  fd =
1fb90 20 72 6f 62 75 73 74 5f 6f 70 65 6e 28 7a 44 69   robust_open(zDi
1fba0 72 6e 61 6d 65 2c 20 4f 5f 52 44 4f 4e 4c 59 7c  rname, O_RDONLY|
1fbb0 4f 5f 42 49 4e 41 52 59 2c 20 30 29 3b 0a 20 20  O_BINARY, 0);.  
1fbc0 69 66 28 20 66 64 3e 3d 30 20 29 7b 0a 20 20 20  if( fd>=0 ){.   
1fbd0 20 4f 53 54 52 41 43 45 28 28 22 4f 50 45 4e 44   OSTRACE(("OPEND
1fbe0 49 52 20 25 2d 33 64 20 25 73 5c 6e 22 2c 20 66  IR %-3d %s\n", f
1fbf0 64 2c 20 7a 44 69 72 6e 61 6d 65 29 29 3b 0a 20  d, zDirname));. 
1fc00 20 7d 0a 20 20 2a 70 46 64 20 3d 20 66 64 3b 0a   }.  *pFd = fd;.
1fc10 20 20 69 66 28 20 66 64 3e 3d 30 20 29 20 72 65    if( fd>=0 ) re
1fc20 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
1fc30 20 20 72 65 74 75 72 6e 20 75 6e 69 78 4c 6f 67    return unixLog
1fc40 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 43 41 4e  Error(SQLITE_CAN
1fc50 54 4f 50 45 4e 5f 42 4b 50 54 2c 20 22 6f 70 65  TOPEN_BKPT, "ope
1fc60 6e 44 69 72 65 63 74 6f 72 79 22 2c 20 7a 44 69  nDirectory", zDi
1fc70 72 6e 61 6d 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  rname);.}../*.**
1fc80 20 4d 61 6b 65 20 73 75 72 65 20 61 6c 6c 20 77   Make sure all w
1fc90 72 69 74 65 73 20 74 6f 20 61 20 70 61 72 74 69  rites to a parti
1fca0 63 75 6c 61 72 20 66 69 6c 65 20 61 72 65 20 63  cular file are c
1fcb0 6f 6d 6d 69 74 74 65 64 20 74 6f 20 64 69 73 6b  ommitted to disk
1fcc0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 64 61 74 61 4f  ..**.** If dataO
1fcd0 6e 6c 79 3d 3d 30 20 74 68 65 6e 20 62 6f 74 68  nly==0 then both
1fce0 20 74 68 65 20 66 69 6c 65 20 69 74 73 65 6c 66   the file itself
1fcf0 20 61 6e 64 20 69 74 73 20 6d 65 74 61 64 61 74   and its metadat
1fd00 61 20 28 66 69 6c 65 0a 2a 2a 20 73 69 7a 65 2c  a (file.** size,
1fd10 20 61 63 63 65 73 73 20 74 69 6d 65 2c 20 65 74   access time, et
1fd20 63 29 20 61 72 65 20 73 79 6e 63 65 64 2e 20 20  c) are synced.  
1fd30 49 66 20 64 61 74 61 4f 6e 6c 79 21 3d 30 20 74  If dataOnly!=0 t
1fd40 68 65 6e 20 6f 6e 6c 79 20 74 68 65 0a 2a 2a 20  hen only the.** 
1fd50 66 69 6c 65 20 64 61 74 61 20 69 73 20 73 79 6e  file data is syn
1fd60 63 65 64 2e 0a 2a 2a 0a 2a 2a 20 55 6e 64 65 72  ced..**.** Under
1fd70 20 55 6e 69 78 2c 20 61 6c 73 6f 20 6d 61 6b 65   Unix, also make
1fd80 20 73 75 72 65 20 74 68 61 74 20 74 68 65 20 64   sure that the d
1fd90 69 72 65 63 74 6f 72 79 20 65 6e 74 72 79 20 66  irectory entry f
1fda0 6f 72 20 74 68 65 20 66 69 6c 65 0a 2a 2a 20 68  or the file.** h
1fdb0 61 73 20 62 65 65 6e 20 63 72 65 61 74 65 64 20  as been created 
1fdc0 62 79 20 66 73 79 6e 63 2d 69 6e 67 20 74 68 65  by fsync-ing the
1fdd0 20 64 69 72 65 63 74 6f 72 79 20 74 68 61 74 20   directory that 
1fde0 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 66 69 6c  contains the fil
1fdf0 65 2e 0a 2a 2a 20 49 66 20 77 65 20 64 6f 20 6e  e..** If we do n
1fe00 6f 74 20 64 6f 20 74 68 69 73 20 61 6e 64 20 77  ot do this and w
1fe10 65 20 65 6e 63 6f 75 6e 74 65 72 20 61 20 70 6f  e encounter a po
1fe20 77 65 72 20 66 61 69 6c 75 72 65 2c 20 74 68 65  wer failure, the
1fe30 20 64 69 72 65 63 74 6f 72 79 0a 2a 2a 20 65 6e   directory.** en
1fe40 74 72 79 20 66 6f 72 20 74 68 65 20 6a 6f 75 72  try for the jour
1fe50 6e 61 6c 20 6d 69 67 68 74 20 6e 6f 74 20 65 78  nal might not ex
1fe60 69 73 74 20 61 66 74 65 72 20 77 65 20 72 65 62  ist after we reb
1fe70 6f 6f 74 2e 20 20 54 68 65 20 6e 65 78 74 0a 2a  oot.  The next.*
1fe80 2a 20 53 51 4c 69 74 65 20 74 6f 20 61 63 63 65  * SQLite to acce
1fe90 73 73 20 74 68 65 20 66 69 6c 65 20 77 69 6c 6c  ss the file will
1fea0 20 6e 6f 74 20 6b 6e 6f 77 20 74 68 61 74 20 74   not know that t
1feb0 68 65 20 6a 6f 75 72 6e 61 6c 20 65 78 69 73 74  he journal exist
1fec0 73 20 28 62 65 63 61 75 73 65 0a 2a 2a 20 74 68  s (because.** th
1fed0 65 20 64 69 72 65 63 74 6f 72 79 20 65 6e 74 72  e directory entr
1fee0 79 20 66 6f 72 20 74 68 65 20 6a 6f 75 72 6e 61  y for the journa
1fef0 6c 20 77 61 73 20 6e 65 76 65 72 20 63 72 65 61  l was never crea
1ff00 74 65 64 29 20 61 6e 64 20 74 68 65 20 74 72 61  ted) and the tra
1ff10 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 77 69 6c 6c  nsaction.** will
1ff20 20 6e 6f 74 20 72 6f 6c 6c 20 62 61 63 6b 20 2d   not roll back -
1ff30 20 70 6f 73 73 69 62 6c 79 20 6c 65 61 64 69 6e   possibly leadin
1ff40 67 20 74 6f 20 64 61 74 61 62 61 73 65 20 63 6f  g to database co
1ff50 72 72 75 70 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61  rruption..*/.sta
1ff60 74 69 63 20 69 6e 74 20 75 6e 69 78 53 79 6e 63  tic int unixSync
1ff70 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69  (sqlite3_file *i
1ff80 64 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20  d, int flags){. 
1ff90 20 69 6e 74 20 72 63 3b 0a 20 20 75 6e 69 78 46   int rc;.  unixF
1ffa0 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e  ile *pFile = (un
1ffb0 69 78 46 69 6c 65 2a 29 69 64 3b 0a 0a 20 20 69  ixFile*)id;..  i
1ffc0 6e 74 20 69 73 44 61 74 61 4f 6e 6c 79 20 3d 20  nt isDataOnly = 
1ffd0 28 66 6c 61 67 73 26 53 51 4c 49 54 45 5f 53 59  (flags&SQLITE_SY
1ffe0 4e 43 5f 44 41 54 41 4f 4e 4c 59 29 3b 0a 20 20  NC_DATAONLY);.  
1fff0 69 6e 74 20 69 73 46 75 6c 6c 73 79 6e 63 20 3d  int isFullsync =
20000 20 28 66 6c 61 67 73 26 30 78 30 46 29 3d 3d 53   (flags&0x0F)==S
20010 51 4c 49 54 45 5f 53 59 4e 43 5f 46 55 4c 4c 3b  QLITE_SYNC_FULL;
20020 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74 68 61  ..  /* Check tha
20030 74 20 6f 6e 65 20 6f 66 20 53 51 4c 49 54 45 5f  t one of SQLITE_
20040 53 59 4e 43 5f 4e 4f 52 4d 41 4c 20 6f 72 20 46  SYNC_NORMAL or F
20050 55 4c 4c 20 77 61 73 20 70 61 73 73 65 64 20 2a  ULL was passed *
20060 2f 0a 20 20 61 73 73 65 72 74 28 28 66 6c 61 67  /.  assert((flag
20070 73 26 30 78 30 46 29 3d 3d 53 51 4c 49 54 45 5f  s&0x0F)==SQLITE_
20080 53 59 4e 43 5f 4e 4f 52 4d 41 4c 0a 20 20 20 20  SYNC_NORMAL.    
20090 20 20 7c 7c 20 28 66 6c 61 67 73 26 30 78 30 46    || (flags&0x0F
200a0 29 3d 3d 53 51 4c 49 54 45 5f 53 59 4e 43 5f 46  )==SQLITE_SYNC_F
200b0 55 4c 4c 0a 20 20 29 3b 0a 0a 20 20 2f 2a 20 55  ULL.  );..  /* U
200c0 6e 69 78 20 63 61 6e 6e 6f 74 2c 20 62 75 74 20  nix cannot, but 
200d0 73 6f 6d 65 20 73 79 73 74 65 6d 73 20 6d 61 79  some systems may
200e0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 46   return SQLITE_F
200f0 55 4c 4c 20 66 72 6f 6d 20 68 65 72 65 2e 20 54  ULL from here. T
20100 68 69 73 0a 20 20 2a 2a 20 6c 69 6e 65 20 69 73  his.  ** line is
20110 20 74 6f 20 74 65 73 74 20 74 68 61 74 20 64 6f   to test that do
20120 69 6e 67 20 73 6f 20 64 6f 65 73 20 6e 6f 74 20  ing so does not 
20130 63 61 75 73 65 20 61 6e 79 20 70 72 6f 62 6c 65  cause any proble
20140 6d 73 2e 0a 20 20 2a 2f 0a 20 20 53 69 6d 75 6c  ms..  */.  Simul
20150 61 74 65 44 69 73 6b 66 75 6c 6c 45 72 72 6f 72  ateDiskfullError
20160 28 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ( return SQLITE_
20170 46 55 4c 4c 20 29 3b 0a 0a 20 20 61 73 73 65 72  FULL );..  asser
20180 74 28 20 70 46 69 6c 65 20 29 3b 0a 20 20 4f 53  t( pFile );.  OS
20190 54 52 41 43 45 28 28 22 53 59 4e 43 20 20 20 20  TRACE(("SYNC    
201a0 25 2d 33 64 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e  %-3d\n", pFile->
201b0 68 29 29 3b 0a 20 20 72 63 20 3d 20 66 75 6c 6c  h));.  rc = full
201c0 5f 66 73 79 6e 63 28 70 46 69 6c 65 2d 3e 68 2c  _fsync(pFile->h,
201d0 20 69 73 46 75 6c 6c 73 79 6e 63 2c 20 69 73 44   isFullsync, isD
201e0 61 74 61 4f 6e 6c 79 29 3b 0a 20 20 53 69 6d 75  ataOnly);.  Simu
201f0 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 72 63 3d  lateIOError( rc=
20200 31 20 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b  1 );.  if( rc ){
20210 0a 20 20 20 20 73 74 6f 72 65 4c 61 73 74 45 72  .    storeLastEr
20220 72 6e 6f 28 70 46 69 6c 65 2c 20 65 72 72 6e 6f  rno(pFile, errno
20230 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 75 6e  );.    return un
20240 69 78 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54  ixLogError(SQLIT
20250 45 5f 49 4f 45 52 52 5f 46 53 59 4e 43 2c 20 22  E_IOERR_FSYNC, "
20260 66 75 6c 6c 5f 66 73 79 6e 63 22 2c 20 70 46 69  full_fsync", pFi
20270 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 7d 0a  le->zPath);.  }.
20280 0a 20 20 2f 2a 20 41 6c 73 6f 20 66 73 79 6e 63  .  /* Also fsync
20290 20 74 68 65 20 64 69 72 65 63 74 6f 72 79 20 63   the directory c
202a0 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 66 69  ontaining the fi
202b0 6c 65 20 69 66 20 74 68 65 20 44 49 52 53 59 4e  le if the DIRSYN
202c0 43 20 66 6c 61 67 0a 20 20 2a 2a 20 69 73 20 73  C flag.  ** is s
202d0 65 74 2e 20 20 54 68 69 73 20 69 73 20 61 20 6f  et.  This is a o
202e0 6e 65 2d 74 69 6d 65 20 6f 63 63 75 72 72 65 6e  ne-time occurren
202f0 63 65 2e 20 20 4d 61 6e 79 20 73 79 73 74 65 6d  ce.  Many system
20300 73 20 28 65 78 61 6d 70 6c 65 73 3a 20 41 49 58  s (examples: AIX
20310 29 0a 20 20 2a 2a 20 61 72 65 20 75 6e 61 62 6c  ).  ** are unabl
20320 65 20 74 6f 20 66 73 79 6e 63 20 61 20 64 69 72  e to fsync a dir
20330 65 63 74 6f 72 79 2c 20 73 6f 20 69 67 6e 6f 72  ectory, so ignor
20340 65 20 65 72 72 6f 72 73 20 6f 6e 20 74 68 65 20  e errors on the 
20350 66 73 79 6e 63 2e 0a 20 20 2a 2f 0a 20 20 69 66  fsync..  */.  if
20360 28 20 70 46 69 6c 65 2d 3e 63 74 72 6c 46 6c 61  ( pFile->ctrlFla
20370 67 73 20 26 20 55 4e 49 58 46 49 4c 45 5f 44 49  gs & UNIXFILE_DI
20380 52 53 59 4e 43 20 29 7b 0a 20 20 20 20 69 6e 74  RSYNC ){.    int
20390 20 64 69 72 66 64 3b 0a 20 20 20 20 4f 53 54 52   dirfd;.    OSTR
203a0 41 43 45 28 28 22 44 49 52 53 59 4e 43 20 25 73  ACE(("DIRSYNC %s
203b0 20 28 68 61 76 65 5f 66 75 6c 6c 66 73 79 6e 63   (have_fullfsync
203c0 3d 25 64 20 66 75 6c 6c 73 79 6e 63 3d 25 64 29  =%d fullsync=%d)
203d0 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 7a 50 61 74  \n", pFile->zPat
203e0 68 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 48  h,.            H
203f0 41 56 45 5f 46 55 4c 4c 46 53 59 4e 43 2c 20 69  AVE_FULLFSYNC, i
20400 73 46 75 6c 6c 73 79 6e 63 29 29 3b 0a 20 20 20  sFullsync));.   
20410 20 72 63 20 3d 20 6f 73 4f 70 65 6e 44 69 72 65   rc = osOpenDire
20420 63 74 6f 72 79 28 70 46 69 6c 65 2d 3e 7a 50 61  ctory(pFile->zPa
20430 74 68 2c 20 26 64 69 72 66 64 29 3b 0a 20 20 20  th, &dirfd);.   
20440 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
20450 4f 4b 20 29 7b 0a 20 20 20 20 20 20 66 75 6c 6c  OK ){.      full
20460 5f 66 73 79 6e 63 28 64 69 72 66 64 2c 20 30 2c  _fsync(dirfd, 0,
20470 20 30 29 3b 0a 23 69 66 20 4f 53 43 4c 4f 53 45   0);.#if OSCLOSE
20480 5f 43 48 45 43 4b 5f 43 4c 4f 53 45 5f 49 4f 45  _CHECK_CLOSE_IOE
20490 52 52 0a 20 20 20 20 20 20 69 66 28 20 63 6c 6f  RR.      if( clo
204a0 73 65 28 70 46 69 6c 65 2d 3e 64 69 72 66 64 29  se(pFile->dirfd)
204b0 20 29 7b 0a 20 20 20 20 20 20 20 20 73 74 6f 72   ){.        stor
204c0 65 4c 61 73 74 45 72 72 6e 6f 28 70 46 69 6c 65  eLastErrno(pFile
204d0 2c 20 65 72 72 6e 6f 29 3b 0a 20 20 20 20 20 20  , errno);.      
204e0 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f    rc = SQLITE_IO
204f0 45 52 52 5f 44 49 52 5f 43 4c 4f 53 45 3b 0a 20  ERR_DIR_CLOSE;. 
20500 20 20 20 20 20 7d 0a 23 65 6c 73 65 0a 20 20 20       }.#else.   
20510 20 20 20 72 6f 62 75 73 74 5f 63 6c 6f 73 65 28     robust_close(
20520 70 46 69 6c 65 2c 20 64 69 72 66 64 2c 20 5f 5f  pFile, dirfd, __
20530 4c 49 4e 45 5f 5f 29 3b 0a 23 65 6e 64 69 66 0a  LINE__);.#endif.
20540 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
20550 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c   assert( rc==SQL
20560 49 54 45 5f 43 41 4e 54 4f 50 45 4e 20 29 3b 0a  ITE_CANTOPEN );.
20570 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
20580 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  E_OK;.    }.    
20590 70 46 69 6c 65 2d 3e 63 74 72 6c 46 6c 61 67 73  pFile->ctrlFlags
205a0 20 26 3d 20 7e 55 4e 49 58 46 49 4c 45 5f 44 49   &= ~UNIXFILE_DI
205b0 52 53 59 4e 43 3b 0a 0a 20 20 7d 0a 20 20 72 65  RSYNC;..  }.  re
205c0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
205d0 2a 20 54 72 75 6e 63 61 74 65 20 61 6e 20 6f 70  * Truncate an op
205e0 65 6e 20 66 69 6c 65 20 74 6f 20 61 20 73 70 65  en file to a spe
205f0 63 69 66 69 65 64 20 73 69 7a 65 0a 2a 2f 0a 73  cified size.*/.s
20600 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 54 72  tatic int unixTr
20610 75 6e 63 61 74 65 28 73 71 6c 69 74 65 33 5f 66  uncate(sqlite3_f
20620 69 6c 65 20 2a 69 64 2c 20 69 36 34 20 6e 42 79  ile *id, i64 nBy
20630 74 65 29 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20  te){.  unixFile 
20640 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69  *pFile = (unixFi
20650 6c 65 20 2a 29 69 64 3b 0a 20 20 69 6e 74 20 72  le *)id;.  int r
20660 63 3b 0a 20 20 61 73 73 65 72 74 28 20 70 46 69  c;.  assert( pFi
20670 6c 65 20 29 3b 0a 20 20 53 69 6d 75 6c 61 74 65  le );.  Simulate
20680 49 4f 45 72 72 6f 72 28 20 72 65 74 75 72 6e 20  IOError( return 
20690 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 54 52 55  SQLITE_IOERR_TRU
206a0 4e 43 41 54 45 20 29 3b 0a 0a 20 20 2f 2a 20 49  NCATE );..  /* I
206b0 66 20 74 68 65 20 75 73 65 72 20 68 61 73 20 63  f the user has c
206c0 6f 6e 66 69 67 75 72 65 64 20 61 20 63 68 75 6e  onfigured a chun
206d0 6b 2d 73 69 7a 65 20 66 6f 72 20 74 68 69 73 20  k-size for this 
206e0 66 69 6c 65 2c 20 74 72 75 6e 63 61 74 65 20 74  file, truncate t
206f0 68 65 0a 20 20 2a 2a 20 66 69 6c 65 20 73 6f 20  he.  ** file so 
20700 74 68 61 74 20 69 74 20 63 6f 6e 73 69 73 74 73  that it consists
20710 20 6f 66 20 61 6e 20 69 6e 74 65 67 65 72 20 6e   of an integer n
20720 75 6d 62 65 72 20 6f 66 20 63 68 75 6e 6b 73 20  umber of chunks 
20730 28 69 2e 65 2e 20 74 68 65 0a 20 20 2a 2a 20 61  (i.e. the.  ** a
20740 63 74 75 61 6c 20 66 69 6c 65 20 73 69 7a 65 20  ctual file size 
20750 61 66 74 65 72 20 74 68 65 20 6f 70 65 72 61 74  after the operat
20760 69 6f 6e 20 6d 61 79 20 62 65 20 6c 61 72 67 65  ion may be large
20770 72 20 74 68 61 6e 20 74 68 65 20 72 65 71 75 65  r than the reque
20780 73 74 65 64 0a 20 20 2a 2a 20 73 69 7a 65 29 2e  sted.  ** size).
20790 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c  .  */.  if( pFil
207a0 65 2d 3e 73 7a 43 68 75 6e 6b 3e 30 20 29 7b 0a  e->szChunk>0 ){.
207b0 20 20 20 20 6e 42 79 74 65 20 3d 20 28 28 6e 42      nByte = ((nB
207c0 79 74 65 20 2b 20 70 46 69 6c 65 2d 3e 73 7a 43  yte + pFile->szC
207d0 68 75 6e 6b 20 2d 20 31 29 2f 70 46 69 6c 65 2d  hunk - 1)/pFile-
207e0 3e 73 7a 43 68 75 6e 6b 29 20 2a 20 70 46 69 6c  >szChunk) * pFil
207f0 65 2d 3e 73 7a 43 68 75 6e 6b 3b 0a 20 20 7d 0a  e->szChunk;.  }.
20800 0a 20 20 72 63 20 3d 20 72 6f 62 75 73 74 5f 66  .  rc = robust_f
20810 74 72 75 6e 63 61 74 65 28 70 46 69 6c 65 2d 3e  truncate(pFile->
20820 68 2c 20 6e 42 79 74 65 29 3b 0a 20 20 69 66 28  h, nByte);.  if(
20830 20 72 63 20 29 7b 0a 20 20 20 20 73 74 6f 72 65   rc ){.    store
20840 4c 61 73 74 45 72 72 6e 6f 28 70 46 69 6c 65 2c  LastErrno(pFile,
20850 20 65 72 72 6e 6f 29 3b 0a 20 20 20 20 72 65 74   errno);.    ret
20860 75 72 6e 20 75 6e 69 78 4c 6f 67 45 72 72 6f 72  urn unixLogError
20870 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 54 52  (SQLITE_IOERR_TR
20880 55 4e 43 41 54 45 2c 20 22 66 74 72 75 6e 63 61  UNCATE, "ftrunca
20890 74 65 22 2c 20 70 46 69 6c 65 2d 3e 7a 50 61 74  te", pFile->zPat
208a0 68 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 23 69 66  h);.  }else{.#if
208b0 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  def SQLITE_DEBUG
208c0 0a 20 20 20 20 2f 2a 20 49 66 20 77 65 20 61 72  .    /* If we ar
208d0 65 20 64 6f 69 6e 67 20 61 20 6e 6f 72 6d 61 6c  e doing a normal
208e0 20 77 72 69 74 65 20 74 6f 20 61 20 64 61 74 61   write to a data
208f0 62 61 73 65 20 66 69 6c 65 20 28 61 73 20 6f 70  base file (as op
20900 70 6f 73 65 64 20 74 6f 0a 20 20 20 20 2a 2a 20  posed to.    ** 
20910 64 6f 69 6e 67 20 61 20 68 6f 74 2d 6a 6f 75 72  doing a hot-jour
20920 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 20 6f 72 20  nal rollback or 
20930 61 20 77 72 69 74 65 20 74 6f 20 73 6f 6d 65 20  a write to some 
20940 66 69 6c 65 20 6f 74 68 65 72 20 74 68 61 6e 20  file other than 
20950 61 0a 20 20 20 20 2a 2a 20 6e 6f 72 6d 61 6c 20  a.    ** normal 
20960 64 61 74 61 62 61 73 65 20 66 69 6c 65 29 20 61  database file) a
20970 6e 64 20 77 65 20 74 72 75 6e 63 61 74 65 20 74  nd we truncate t
20980 68 65 20 66 69 6c 65 20 74 6f 20 7a 65 72 6f 20  he file to zero 
20990 6c 65 6e 67 74 68 2c 0a 20 20 20 20 2a 2a 20 74  length,.    ** t
209a0 68 61 74 20 65 66 66 65 63 74 69 76 65 6c 79 20  hat effectively 
209b0 75 70 64 61 74 65 73 20 74 68 65 20 63 68 61 6e  updates the chan
209c0 67 65 20 63 6f 75 6e 74 65 72 2e 20 20 54 68 69  ge counter.  Thi
209d0 73 20 6d 69 67 68 74 20 68 61 70 70 65 6e 0a 20  s might happen. 
209e0 20 20 20 2a 2a 20 77 68 65 6e 20 72 65 73 74 6f     ** when resto
209f0 72 69 6e 67 20 61 20 64 61 74 61 62 61 73 65 20  ring a database 
20a00 75 73 69 6e 67 20 74 68 65 20 62 61 63 6b 75 70  using the backup
20a10 20 41 50 49 20 66 72 6f 6d 20 61 20 7a 65 72 6f   API from a zero
20a20 2d 6c 65 6e 67 74 68 0a 20 20 20 20 2a 2a 20 73  -length.    ** s
20a30 6f 75 72 63 65 2e 0a 20 20 20 20 2a 2f 0a 20 20  ource..    */.  
20a40 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 69 6e 4e    if( pFile->inN
20a50 6f 72 6d 61 6c 57 72 69 74 65 20 26 26 20 6e 42  ormalWrite && nB
20a60 79 74 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  yte==0 ){.      
20a70 70 46 69 6c 65 2d 3e 74 72 61 6e 73 43 6e 74 72  pFile->transCntr
20a80 43 68 6e 67 20 3d 20 31 3b 0a 20 20 20 20 7d 0a  Chng = 1;.    }.
20a90 23 65 6e 64 69 66 0a 0a 23 69 66 20 53 51 4c 49  #endif..#if SQLI
20aa0 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45  TE_MAX_MMAP_SIZE
20ab0 3e 30 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65  >0.    /* If the
20ac0 20 66 69 6c 65 20 77 61 73 20 6a 75 73 74 20 74   file was just t
20ad0 72 75 6e 63 61 74 65 64 20 74 6f 20 61 20 73 69  runcated to a si
20ae0 7a 65 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20  ze smaller than 
20af0 74 68 65 20 63 75 72 72 65 6e 74 6c 79 0a 20 20  the currently.  
20b00 20 20 2a 2a 20 6d 61 70 70 65 64 20 72 65 67 69    ** mapped regi
20b10 6f 6e 2c 20 72 65 64 75 63 65 20 74 68 65 20 65  on, reduce the e
20b20 66 66 65 63 74 69 76 65 20 6d 61 70 70 69 6e 67  ffective mapping
20b30 20 73 69 7a 65 20 61 73 20 77 65 6c 6c 2e 20 53   size as well. S
20b40 51 4c 69 74 65 20 77 69 6c 6c 0a 20 20 20 20 2a  QLite will.    *
20b50 2a 20 75 73 65 20 72 65 61 64 28 29 20 61 6e 64  * use read() and
20b60 20 77 72 69 74 65 28 29 20 74 6f 20 61 63 63 65   write() to acce
20b70 73 73 20 64 61 74 61 20 62 65 79 6f 6e 64 20 74  ss data beyond t
20b80 68 69 73 20 70 6f 69 6e 74 20 66 72 6f 6d 20 6e  his point from n
20b90 6f 77 20 6f 6e 2e 20 20 0a 20 20 20 20 2a 2f 0a  ow on.  .    */.
20ba0 20 20 20 20 69 66 28 20 6e 42 79 74 65 3c 70 46      if( nByte<pF
20bb0 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 20 29 7b  ile->mmapSize ){
20bc0 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6d 6d  .      pFile->mm
20bd0 61 70 53 69 7a 65 20 3d 20 6e 42 79 74 65 3b 0a  apSize = nByte;.
20be0 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20      }.#endif..  
20bf0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
20c00 4f 4b 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  OK;.  }.}../*.**
20c10 20 44 65 74 65 72 6d 69 6e 65 20 74 68 65 20 63   Determine the c
20c20 75 72 72 65 6e 74 20 73 69 7a 65 20 6f 66 20 61  urrent size of a
20c30 20 66 69 6c 65 20 69 6e 20 62 79 74 65 73 0a 2a   file in bytes.*
20c40 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69  /.static int uni
20c50 78 46 69 6c 65 53 69 7a 65 28 73 71 6c 69 74 65  xFileSize(sqlite
20c60 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 36 34 20  3_file *id, i64 
20c70 2a 70 53 69 7a 65 29 7b 0a 20 20 69 6e 74 20 72  *pSize){.  int r
20c80 63 3b 0a 20 20 73 74 72 75 63 74 20 73 74 61 74  c;.  struct stat
20c90 20 62 75 66 3b 0a 20 20 61 73 73 65 72 74 28 20   buf;.  assert( 
20ca0 69 64 20 29 3b 0a 20 20 72 63 20 3d 20 6f 73 46  id );.  rc = osF
20cb0 73 74 61 74 28 28 28 75 6e 69 78 46 69 6c 65 2a  stat(((unixFile*
20cc0 29 69 64 29 2d 3e 68 2c 20 26 62 75 66 29 3b 0a  )id)->h, &buf);.
20cd0 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f    SimulateIOErro
20ce0 72 28 20 72 63 3d 31 20 29 3b 0a 20 20 69 66 28  r( rc=1 );.  if(
20cf0 20 72 63 21 3d 30 20 29 7b 0a 20 20 20 20 73 74   rc!=0 ){.    st
20d00 6f 72 65 4c 61 73 74 45 72 72 6e 6f 28 28 75 6e  oreLastErrno((un
20d10 69 78 46 69 6c 65 2a 29 69 64 2c 20 65 72 72 6e  ixFile*)id, errn
20d20 6f 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53  o);.    return S
20d30 51 4c 49 54 45 5f 49 4f 45 52 52 5f 46 53 54 41  QLITE_IOERR_FSTA
20d40 54 3b 0a 20 20 7d 0a 20 20 2a 70 53 69 7a 65 20  T;.  }.  *pSize 
20d50 3d 20 62 75 66 2e 73 74 5f 73 69 7a 65 3b 0a 0a  = buf.st_size;..
20d60 20 20 2f 2a 20 57 68 65 6e 20 6f 70 65 6e 69 6e    /* When openin
20d70 67 20 61 20 7a 65 72 6f 2d 73 69 7a 65 20 64 61  g a zero-size da
20d80 74 61 62 61 73 65 2c 20 74 68 65 20 66 69 6e 64  tabase, the find
20d90 49 6e 6f 64 65 49 6e 66 6f 28 29 20 70 72 6f 63  InodeInfo() proc
20da0 65 64 75 72 65 0a 20 20 2a 2a 20 77 72 69 74 65  edure.  ** write
20db0 73 20 61 20 73 69 6e 67 6c 65 20 62 79 74 65 20  s a single byte 
20dc0 69 6e 74 6f 20 74 68 61 74 20 66 69 6c 65 20 69  into that file i
20dd0 6e 20 6f 72 64 65 72 20 74 6f 20 77 6f 72 6b 20  n order to work 
20de0 61 72 6f 75 6e 64 20 61 20 62 75 67 0a 20 20 2a  around a bug.  *
20df0 2a 20 69 6e 20 74 68 65 20 4f 53 2d 58 20 6d 73  * in the OS-X ms
20e00 64 6f 73 20 66 69 6c 65 73 79 73 74 65 6d 2e 20  dos filesystem. 
20e10 20 49 6e 20 6f 72 64 65 72 20 74 6f 20 61 76 6f   In order to avo
20e20 69 64 20 70 72 6f 62 6c 65 6d 73 20 77 69 74 68  id problems with
20e30 20 75 70 70 65 72 0a 20 20 2a 2a 20 6c 61 79 65   upper.  ** laye
20e40 72 73 2c 20 77 65 20 6e 65 65 64 20 74 6f 20 72  rs, we need to r
20e50 65 70 6f 72 74 20 74 68 69 73 20 66 69 6c 65 20  eport this file 
20e60 73 69 7a 65 20 61 73 20 7a 65 72 6f 20 65 76 65  size as zero eve
20e70 6e 20 74 68 6f 75 67 68 20 69 74 20 69 73 0a 20  n though it is. 
20e80 20 2a 2a 20 72 65 61 6c 6c 79 20 31 2e 20 20 20   ** really 1.   
20e90 54 69 63 6b 65 74 20 23 33 32 36 30 2e 0a 20 20  Ticket #3260..  
20ea0 2a 2f 0a 20 20 69 66 28 20 2a 70 53 69 7a 65 3d  */.  if( *pSize=
20eb0 3d 31 20 29 20 2a 70 53 69 7a 65 20 3d 20 30 3b  =1 ) *pSize = 0;
20ec0 0a 0a 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  ...  return SQLI
20ed0 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 20 53 51  TE_OK;.}..#if SQ
20ee0 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b  LITE_ENABLE_LOCK
20ef0 49 4e 47 5f 53 54 59 4c 45 20 26 26 20 64 65 66  ING_STYLE && def
20f00 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 0a  ined(__APPLE__).
20f10 2f 2a 0a 2a 2a 20 48 61 6e 64 6c 65 72 20 66 6f  /*.** Handler fo
20f20 72 20 70 72 6f 78 79 2d 6c 6f 63 6b 69 6e 67 20  r proxy-locking 
20f30 66 69 6c 65 2d 63 6f 6e 74 72 6f 6c 20 76 65 72  file-control ver
20f40 62 73 2e 20 20 44 65 66 69 6e 65 64 20 62 65 6c  bs.  Defined bel
20f50 6f 77 20 69 6e 20 74 68 65 0a 2a 2a 20 70 72 6f  ow in the.** pro
20f60 78 79 69 6e 67 20 6c 6f 63 6b 69 6e 67 20 64 69  xying locking di
20f70 76 69 73 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69  vision..*/.stati
20f80 63 20 69 6e 74 20 70 72 6f 78 79 46 69 6c 65 43  c int proxyFileC
20f90 6f 6e 74 72 6f 6c 28 73 71 6c 69 74 65 33 5f 66  ontrol(sqlite3_f
20fa0 69 6c 65 2a 2c 69 6e 74 2c 76 6f 69 64 2a 29 3b  ile*,int,void*);
20fb0 0a 23 65 6e 64 69 66 0a 0a 2f 2a 20 0a 2a 2a 20  .#endif../* .** 
20fc0 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
20fd0 20 63 61 6c 6c 65 64 20 74 6f 20 68 61 6e 64 6c   called to handl
20fe0 65 20 74 68 65 20 53 51 4c 49 54 45 5f 46 43 4e  e the SQLITE_FCN
20ff0 54 4c 5f 53 49 5a 45 5f 48 49 4e 54 20 0a 2a 2a  TL_SIZE_HINT .**
21000 20 66 69 6c 65 2d 63 6f 6e 74 72 6f 6c 20 6f 70   file-control op
21010 65 72 61 74 69 6f 6e 2e 20 20 45 6e 6c 61 72 67  eration.  Enlarg
21020 65 20 74 68 65 20 64 61 74 61 62 61 73 65 20 74  e the database t
21030 6f 20 6e 42 79 74 65 73 20 69 6e 20 73 69 7a 65  o nBytes in size
21040 0a 2a 2a 20 28 72 6f 75 6e 64 65 64 20 75 70 20  .** (rounded up 
21050 74 6f 20 74 68 65 20 6e 65 78 74 20 63 68 75 6e  to the next chun
21060 6b 2d 73 69 7a 65 29 2e 20 20 49 66 20 74 68 65  k-size).  If the
21070 20 64 61 74 61 62 61 73 65 20 69 73 20 61 6c 72   database is alr
21080 65 61 64 79 0a 2a 2a 20 6e 42 79 74 65 73 20 6f  eady.** nBytes o
21090 72 20 6c 61 72 67 65 72 2c 20 74 68 69 73 20 72  r larger, this r
210a0 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f  outine is a no-o
210b0 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  p..*/.static int
210c0 20 66 63 6e 74 6c 53 69 7a 65 48 69 6e 74 28 75   fcntlSizeHint(u
210d0 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 2c 20  nixFile *pFile, 
210e0 69 36 34 20 6e 42 79 74 65 29 7b 0a 20 20 69 66  i64 nByte){.  if
210f0 28 20 70 46 69 6c 65 2d 3e 73 7a 43 68 75 6e 6b  ( pFile->szChunk
21100 3e 30 20 29 7b 0a 20 20 20 20 69 36 34 20 6e 53  >0 ){.    i64 nS
21110 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ize;            
21120 20 20 20 20 20 20 20 20 2f 2a 20 52 65 71 75 69          /* Requi
21130 72 65 64 20 66 69 6c 65 20 73 69 7a 65 20 2a 2f  red file size */
21140 0a 20 20 20 20 73 74 72 75 63 74 20 73 74 61 74  .    struct stat
21150 20 62 75 66 3b 20 20 20 20 20 20 20 20 20 20 20   buf;           
21160 20 20 20 2f 2a 20 55 73 65 64 20 74 6f 20 68 6f     /* Used to ho
21170 6c 64 20 72 65 74 75 72 6e 20 76 61 6c 75 65 73  ld return values
21180 20 6f 66 20 66 73 74 61 74 28 29 20 2a 2f 0a 20   of fstat() */. 
21190 20 20 0a 20 20 20 20 69 66 28 20 6f 73 46 73 74    .    if( osFst
211a0 61 74 28 70 46 69 6c 65 2d 3e 68 2c 20 26 62 75  at(pFile->h, &bu
211b0 66 29 20 29 7b 0a 20 20 20 20 20 20 73 74 6f 72  f) ){.      stor
211c0 65 4c 61 73 74 45 72 72 6e 6f 28 70 46 69 6c 65  eLastErrno(pFile
211d0 2c 20 65 72 72 6e 6f 29 3b 0a 20 20 20 20 20 20  , errno);.      
211e0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f  return SQLITE_IO
211f0 45 52 52 5f 46 53 54 41 54 3b 0a 20 20 20 20 7d  ERR_FSTAT;.    }
21200 0a 0a 20 20 20 20 6e 53 69 7a 65 20 3d 20 28 28  ..    nSize = ((
21210 6e 42 79 74 65 2b 70 46 69 6c 65 2d 3e 73 7a 43  nByte+pFile->szC
21220 68 75 6e 6b 2d 31 29 20 2f 20 70 46 69 6c 65 2d  hunk-1) / pFile-
21230 3e 73 7a 43 68 75 6e 6b 29 20 2a 20 70 46 69 6c  >szChunk) * pFil
21240 65 2d 3e 73 7a 43 68 75 6e 6b 3b 0a 20 20 20 20  e->szChunk;.    
21250 69 66 28 20 6e 53 69 7a 65 3e 28 69 36 34 29 62  if( nSize>(i64)b
21260 75 66 2e 73 74 5f 73 69 7a 65 20 29 7b 0a 0a 23  uf.st_size ){..#
21270 69 66 20 64 65 66 69 6e 65 64 28 48 41 56 45 5f  if defined(HAVE_
21280 50 4f 53 49 58 5f 46 41 4c 4c 4f 43 41 54 45 29  POSIX_FALLOCATE)
21290 20 26 26 20 48 41 56 45 5f 50 4f 53 49 58 5f 46   && HAVE_POSIX_F
212a0 41 4c 4c 4f 43 41 54 45 0a 20 20 20 20 20 20 2f  ALLOCATE.      /
212b0 2a 20 54 68 65 20 63 6f 64 65 20 62 65 6c 6f 77  * The code below
212c0 20 69 73 20 68 61 6e 64 6c 69 6e 67 20 74 68 65   is handling the
212d0 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 6f 66   return value of
212e0 20 6f 73 46 61 6c 6c 6f 63 61 74 65 28 29 20 0a   osFallocate() .
212f0 20 20 20 20 20 20 2a 2a 20 63 6f 72 72 65 63 74        ** correct
21300 6c 79 2e 20 70 6f 73 69 78 5f 66 61 6c 6c 6f 63  ly. posix_falloc
21310 61 74 65 28 29 20 69 73 20 64 65 66 69 6e 65 64  ate() is defined
21320 20 74 6f 20 22 72 65 74 75 72 6e 73 20 7a 65 72   to "returns zer
21330 6f 20 6f 6e 20 73 75 63 63 65 73 73 2c 20 0a 20  o on success, . 
21340 20 20 20 20 20 2a 2a 20 6f 72 20 61 6e 20 65 72       ** or an er
21350 72 6f 72 20 6e 75 6d 62 65 72 20 6f 6e 20 20 66  ror number on  f
21360 61 69 6c 75 72 65 22 2e 20 53 65 65 20 74 68 65  ailure". See the
21370 20 6d 61 6e 70 61 67 65 20 66 6f 72 20 64 65 74   manpage for det
21380 61 69 6c 73 2e 20 2a 2f 0a 20 20 20 20 20 20 69  ails. */.      i
21390 6e 74 20 65 72 72 3b 0a 20 20 20 20 20 20 64 6f  nt err;.      do
213a0 7b 0a 20 20 20 20 20 20 20 20 65 72 72 20 3d 20  {.        err = 
213b0 6f 73 46 61 6c 6c 6f 63 61 74 65 28 70 46 69 6c  osFallocate(pFil
213c0 65 2d 3e 68 2c 20 62 75 66 2e 73 74 5f 73 69 7a  e->h, buf.st_siz
213d0 65 2c 20 6e 53 69 7a 65 2d 62 75 66 2e 73 74 5f  e, nSize-buf.st_
213e0 73 69 7a 65 29 3b 0a 20 20 20 20 20 20 7d 77 68  size);.      }wh
213f0 69 6c 65 28 20 65 72 72 3d 3d 45 49 4e 54 52 20  ile( err==EINTR 
21400 29 3b 0a 20 20 20 20 20 20 69 66 28 20 65 72 72  );.      if( err
21410 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
21420 5f 49 4f 45 52 52 5f 57 52 49 54 45 3b 0a 23 65  _IOERR_WRITE;.#e
21430 6c 73 65 0a 20 20 20 20 20 20 2f 2a 20 49 66 20  lse.      /* If 
21440 74 68 65 20 4f 53 20 64 6f 65 73 20 6e 6f 74 20  the OS does not 
21450 68 61 76 65 20 70 6f 73 69 78 5f 66 61 6c 6c 6f  have posix_fallo
21460 63 61 74 65 28 29 2c 20 66 61 6b 65 20 69 74 2e  cate(), fake it.
21470 20 57 72 69 74 65 20 61 20 0a 20 20 20 20 20 20   Write a .      
21480 2a 2a 20 73 69 6e 67 6c 65 20 62 79 74 65 20 74  ** single byte t
21490 6f 20 74 68 65 20 6c 61 73 74 20 62 79 74 65 20  o the last byte 
214a0 69 6e 20 65 61 63 68 20 62 6c 6f 63 6b 20 74 68  in each block th
214b0 61 74 20 66 61 6c 6c 73 20 65 6e 74 69 72 65 6c  at falls entirel
214c0 79 0a 20 20 20 20 20 20 2a 2a 20 77 69 74 68 69  y.      ** withi
214d0 6e 20 74 68 65 20 65 78 74 65 6e 64 65 64 20 72  n the extended r
214e0 65 67 69 6f 6e 2e 20 54 68 65 6e 2c 20 69 66 20  egion. Then, if 
214f0 72 65 71 75 69 72 65 64 2c 20 61 20 73 69 6e 67  required, a sing
21500 6c 65 20 62 79 74 65 0a 20 20 20 20 20 20 2a 2a  le byte.      **
21510 20 61 74 20 6f 66 66 73 65 74 20 28 6e 53 69 7a   at offset (nSiz
21520 65 2d 31 29 2c 20 74 6f 20 73 65 74 20 74 68 65  e-1), to set the
21530 20 73 69 7a 65 20 6f 66 20 74 68 65 20 66 69 6c   size of the fil
21540 65 20 63 6f 72 72 65 63 74 6c 79 2e 0a 20 20 20  e correctly..   
21550 20 20 20 2a 2a 20 54 68 69 73 20 69 73 20 61 20     ** This is a 
21560 73 69 6d 69 6c 61 72 20 74 65 63 68 6e 69 71 75  similar techniqu
21570 65 20 74 6f 20 74 68 61 74 20 75 73 65 64 20 62  e to that used b
21580 79 20 67 6c 69 62 63 20 6f 6e 20 73 79 73 74 65  y glibc on syste
21590 6d 73 0a 20 20 20 20 20 20 2a 2a 20 74 68 61 74  ms.      ** that
215a0 20 64 6f 20 6e 6f 74 20 68 61 76 65 20 61 20 72   do not have a r
215b0 65 61 6c 20 66 61 6c 6c 6f 63 61 74 65 28 29 20  eal fallocate() 
215c0 63 61 6c 6c 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  call..      */. 
215d0 20 20 20 20 20 69 6e 74 20 6e 42 6c 6b 20 3d 20       int nBlk = 
215e0 62 75 66 2e 73 74 5f 62 6c 6b 73 69 7a 65 3b 20  buf.st_blksize; 
215f0 20 2f 2a 20 46 69 6c 65 2d 73 79 73 74 65 6d 20   /* File-system 
21600 62 6c 6f 63 6b 20 73 69 7a 65 20 2a 2f 0a 20 20  block size */.  
21610 20 20 20 20 69 6e 74 20 6e 57 72 69 74 65 20 3d      int nWrite =
21620 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
21630 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74  /* Number of byt
21640 65 73 20 77 72 69 74 74 65 6e 20 62 79 20 73 65  es written by se
21650 65 6b 41 6e 64 57 72 69 74 65 20 2a 2f 0a 20 20  ekAndWrite */.  
21660 20 20 20 20 69 36 34 20 69 57 72 69 74 65 3b 20      i64 iWrite; 
21670 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21680 2f 2a 20 4e 65 78 74 20 6f 66 66 73 65 74 20 74  /* Next offset t
21690 6f 20 77 72 69 74 65 20 74 6f 20 2a 2f 0a 0a 20  o write to */.. 
216a0 20 20 20 20 20 69 57 72 69 74 65 20 3d 20 28 62       iWrite = (b
216b0 75 66 2e 73 74 5f 73 69 7a 65 2f 6e 42 6c 6b 29  uf.st_size/nBlk)
216c0 2a 6e 42 6c 6b 20 2b 20 6e 42 6c 6b 20 2d 20 31  *nBlk + nBlk - 1
216d0 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
216e0 69 57 72 69 74 65 3e 3d 62 75 66 2e 73 74 5f 73  iWrite>=buf.st_s
216f0 69 7a 65 20 29 3b 0a 20 20 20 20 20 20 61 73 73  ize );.      ass
21700 65 72 74 28 20 28 28 69 57 72 69 74 65 2b 31 29  ert( ((iWrite+1)
21710 25 6e 42 6c 6b 29 3d 3d 30 20 29 3b 0a 20 20 20  %nBlk)==0 );.   
21720 20 20 20 66 6f 72 28 2f 2a 6e 6f 2d 6f 70 2a 2f     for(/*no-op*/
21730 3b 20 69 57 72 69 74 65 3c 6e 53 69 7a 65 2b 6e  ; iWrite<nSize+n
21740 42 6c 6b 2d 31 3b 20 69 57 72 69 74 65 2b 3d 6e  Blk-1; iWrite+=n
21750 42 6c 6b 20 29 7b 0a 20 20 20 20 20 20 20 20 69  Blk ){.        i
21760 66 28 20 69 57 72 69 74 65 3e 3d 6e 53 69 7a 65  f( iWrite>=nSize
21770 20 29 20 69 57 72 69 74 65 20 3d 20 6e 53 69 7a   ) iWrite = nSiz
21780 65 20 2d 20 31 3b 0a 20 20 20 20 20 20 20 20 6e  e - 1;.        n
21790 57 72 69 74 65 20 3d 20 73 65 65 6b 41 6e 64 57  Write = seekAndW
217a0 72 69 74 65 28 70 46 69 6c 65 2c 20 69 57 72 69  rite(pFile, iWri
217b0 74 65 2c 20 22 22 2c 20 31 29 3b 0a 20 20 20 20  te, "", 1);.    
217c0 20 20 20 20 69 66 28 20 6e 57 72 69 74 65 21 3d      if( nWrite!=
217d0 31 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  1 ) return SQLIT
217e0 45 5f 49 4f 45 52 52 5f 57 52 49 54 45 3b 0a 20  E_IOERR_WRITE;. 
217f0 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20       }.#endif.  
21800 20 20 7d 0a 20 20 7d 0a 0a 23 69 66 20 53 51 4c    }.  }..#if SQL
21810 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a  ITE_MAX_MMAP_SIZ
21820 45 3e 30 0a 20 20 69 66 28 20 70 46 69 6c 65 2d  E>0.  if( pFile-
21830 3e 6d 6d 61 70 53 69 7a 65 4d 61 78 3e 30 20 26  >mmapSizeMax>0 &
21840 26 20 6e 42 79 74 65 3e 70 46 69 6c 65 2d 3e 6d  & nByte>pFile->m
21850 6d 61 70 53 69 7a 65 20 29 7b 0a 20 20 20 20 69  mapSize ){.    i
21860 6e 74 20 72 63 3b 0a 20 20 20 20 69 66 28 20 70  nt rc;.    if( p
21870 46 69 6c 65 2d 3e 73 7a 43 68 75 6e 6b 3c 3d 30  File->szChunk<=0
21880 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 72 6f   ){.      if( ro
21890 62 75 73 74 5f 66 74 72 75 6e 63 61 74 65 28 70  bust_ftruncate(p
218a0 46 69 6c 65 2d 3e 68 2c 20 6e 42 79 74 65 29 20  File->h, nByte) 
218b0 29 7b 0a 20 20 20 20 20 20 20 20 73 74 6f 72 65  ){.        store
218c0 4c 61 73 74 45 72 72 6e 6f 28 70 46 69 6c 65 2c  LastErrno(pFile,
218d0 20 65 72 72 6e 6f 29 3b 0a 20 20 20 20 20 20 20   errno);.       
218e0 20 72 65 74 75 72 6e 20 75 6e 69 78 4c 6f 67 45   return unixLogE
218f0 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52  rror(SQLITE_IOER
21900 52 5f 54 52 55 4e 43 41 54 45 2c 20 22 66 74 72  R_TRUNCATE, "ftr
21910 75 6e 63 61 74 65 22 2c 20 70 46 69 6c 65 2d 3e  uncate", pFile->
21920 7a 50 61 74 68 29 3b 0a 20 20 20 20 20 20 7d 0a  zPath);.      }.
21930 20 20 20 20 7d 0a 0a 20 20 20 20 72 63 20 3d 20      }..    rc = 
21940 75 6e 69 78 4d 61 70 66 69 6c 65 28 70 46 69 6c  unixMapfile(pFil
21950 65 2c 20 6e 42 79 74 65 29 3b 0a 20 20 20 20 72  e, nByte);.    r
21960 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 23 65  eturn rc;.  }.#e
21970 6e 64 69 66 0a 0a 20 20 72 65 74 75 72 6e 20 53  ndif..  return S
21980 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 23 69  QLITE_OK;.}...#i
21990 66 20 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  f (SQLITE_ENABLE
219a0 5f 41 50 50 4c 45 5f 53 50 49 3e 30 29 20 26 26  _APPLE_SPI>0) &&
219b0 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45   defined(__APPLE
219c0 5f 5f 29 0a 23 69 6e 63 6c 75 64 65 20 22 73 71  __).#include "sq
219d0 6c 69 74 65 33 5f 70 72 69 76 61 74 65 2e 68 22  lite3_private.h"
219e0 0a 23 69 6e 63 6c 75 64 65 20 3c 63 6f 70 79 66  .#include <copyf
219f0 69 6c 65 2e 68 3e 0a 73 74 61 74 69 63 20 69 6e  ile.h>.static in
21a00 74 20 70 72 6f 78 79 47 65 74 44 62 50 61 74 68  t proxyGetDbPath
21a10 46 6f 72 55 6e 69 78 46 69 6c 65 28 75 6e 69 78  ForUnixFile(unix
21a20 46 69 6c 65 20 2a 70 46 69 6c 65 2c 20 63 68 61  File *pFile, cha
21a30 72 20 2a 64 62 50 61 74 68 29 3b 0a 23 65 6e 64  r *dbPath);.#end
21a40 69 66 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 45  if..#if SQLITE_E
21a50 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54  NABLE_LOCKING_ST
21a60 59 4c 45 0a 73 74 61 74 69 63 20 69 6e 74 20 69  YLE.static int i
21a70 73 50 72 6f 78 79 4c 6f 63 6b 69 6e 67 4d 6f 64  sProxyLockingMod
21a80 65 28 75 6e 69 78 46 69 6c 65 20 2a 29 3b 0a 23  e(unixFile *);.#
21a90 65 6e 64 69 66 0a 0a 23 69 66 20 28 53 51 4c 49  endif..#if (SQLI
21aa0 54 45 5f 45 4e 41 42 4c 45 5f 41 50 50 4c 45 5f  TE_ENABLE_APPLE_
21ab0 53 50 49 3e 30 29 20 26 26 20 64 65 66 69 6e 65  SPI>0) && define
21ac0 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 0a 73 74 61  d(__APPLE__).sta
21ad0 74 69 63 20 69 6e 74 20 75 6e 69 78 54 72 75 6e  tic int unixTrun
21ae0 63 61 74 65 44 61 74 61 62 61 73 65 28 75 6e 69  cateDatabase(uni
21af0 78 46 69 6c 65 20 2a 2c 20 69 6e 74 29 3b 0a 0a  xFile *, int);..
21b00 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 49  static int unixI
21b10 6e 76 61 6c 69 64 61 74 65 53 75 70 70 6f 72 74  nvalidateSupport
21b20 46 69 6c 65 73 28 75 6e 69 78 46 69 6c 65 20 2a  Files(unixFile *
21b30 2c 20 69 6e 74 29 3b 0a 0a 73 74 61 74 69 63 20  , int);..static 
21b40 69 6e 74 20 66 69 6e 64 43 72 65 61 74 65 46 69  int findCreateFi
21b50 6c 65 4d 6f 64 65 28 63 6f 6e 73 74 20 63 68 61  leMode(const cha
21b60 72 20 2a 2c 20 69 6e 74 2c 20 6d 6f 64 65 5f 74  r *, int, mode_t
21b70 2a 2c 20 75 69 64 5f 74 20 2a 2c 67 69 64 5f 74  *, uid_t *,gid_t
21b80 20 2a 29 3b 0a 0a 2f 2a 20 6f 70 65 6e 73 20 61   *);../* opens a
21b90 20 72 65 61 64 2f 77 72 69 74 65 20 63 6f 6e 6e   read/write conn
21ba0 65 63 74 69 6f 6e 20 74 6f 20 61 20 66 69 6c 65  ection to a file
21bb0 20 7a 4e 61 6d 65 20 69 6e 68 65 72 69 74 69 6e   zName inheritin
21bc0 67 20 74 68 65 20 61 70 70 72 6f 70 72 69 61 74  g the appropriat
21bd0 65 0a 2a 2a 20 75 73 65 72 2f 70 65 72 6d 73 20  e.** user/perms 
21be0 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73  from the databas
21bf0 65 20 66 69 6c 65 20 69 66 20 72 75 6e 6e 69 6e  e file if runnin
21c00 67 20 61 73 20 72 6f 6f 74 2e 20 20 52 65 74 75  g as root.  Retu
21c10 72 6e 73 20 74 68 65 20 66 69 6c 65 20 0a 2a 2a  rns the file .**
21c20 20 64 65 73 63 72 69 70 74 6f 72 20 62 79 20 72   descriptor by r
21c30 65 66 65 72 65 6e 63 65 0a 2a 2f 0a 73 74 61 74  eference.*/.stat
21c40 69 63 20 69 6e 74 20 75 6e 69 78 4f 70 65 6e 43  ic int unixOpenC
21c50 68 69 6c 64 46 69 6c 65 28 0a 20 20 63 6f 6e 73  hildFile(.  cons
21c60 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 0a 20  t char *zName,. 
21c70 20 69 6e 74 20 6f 70 65 6e 46 6c 61 67 73 2c 0a   int openFlags,.
21c80 20 20 69 6e 74 20 64 62 4f 70 65 6e 46 6c 61 67    int dbOpenFlag
21c90 73 2c 0a 20 20 69 6e 74 20 70 72 6f 74 46 6c 61  s,.  int protFla
21ca0 67 73 2c 0a 20 20 69 6e 74 20 2a 70 46 64 0a 29  gs,.  int *pFd.)
21cb0 7b 0a 20 20 69 6e 74 20 66 64 20 3d 20 2d 31 3b  {.  int fd = -1;
21cc0 0a 20 20 6d 6f 64 65 5f 74 20 6f 70 65 6e 4d 6f  .  mode_t openMo
21cd0 64 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  de;             
21ce0 20 2f 2a 20 50 65 72 6d 69 73 73 69 6f 6e 73 20   /* Permissions 
21cf0 74 6f 20 63 72 65 61 74 65 20 66 69 6c 65 20 77  to create file w
21d00 69 74 68 20 2a 2f 0a 20 20 75 69 64 5f 74 20 75  ith */.  uid_t u
21d10 69 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  id;             
21d20 20 20 20 20 20 20 20 2f 2a 20 55 73 65 72 69 64         /* Userid
21d30 20 66 6f 72 20 74 68 65 20 66 69 6c 65 20 2a 2f   for the file */
21d40 0a 20 20 67 69 64 5f 74 20 67 69 64 3b 20 20 20  .  gid_t gid;   
21d50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21d60 20 2f 2a 20 47 72 6f 75 70 69 64 20 66 6f 72 20   /* Groupid for 
21d70 74 68 65 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e  the file */.  in
21d80 74 20 72 63 3b 0a 20 20 0a 20 20 61 73 73 65 72  t rc;.  .  asser
21d90 74 28 70 46 64 21 3d 4e 55 4c 4c 29 3b 0a 20 20  t(pFd!=NULL);.  
21da0 72 63 20 3d 20 66 69 6e 64 43 72 65 61 74 65 46  rc = findCreateF
21db0 69 6c 65 4d 6f 64 65 28 7a 4e 61 6d 65 2c 20 64  ileMode(zName, d
21dc0 62 4f 70 65 6e 46 6c 61 67 73 2c 20 26 6f 70 65  bOpenFlags, &ope
21dd0 6e 4d 6f 64 65 2c 20 26 75 69 64 2c 20 26 67 69  nMode, &uid, &gi
21de0 64 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  d);.  if( rc!=SQ
21df0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72  LITE_OK ){.    r
21e00 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20  eturn rc;.  }.  
21e10 66 64 20 3d 20 72 6f 62 75 73 74 5f 6f 70 65 6e  fd = robust_open
21e20 28 7a 4e 61 6d 65 2c 20 6f 70 65 6e 46 6c 61 67  (zName, openFlag
21e30 73 2c 20 6f 70 65 6e 4d 6f 64 65 29 3b 0a 20 20  s, openMode);.  
21e40 4f 53 54 52 41 43 45 28 28 22 4f 50 45 4e 58 20  OSTRACE(("OPENX 
21e50 20 20 25 2d 33 64 20 25 73 20 30 25 6f 5c 6e 22    %-3d %s 0%o\n"
21e60 2c 20 66 64 2c 20 7a 4e 61 6d 65 2c 20 6f 70 65  , fd, zName, ope
21e70 6e 46 6c 61 67 73 29 29 3b 0a 20 20 69 66 28 20  nFlags));.  if( 
21e80 66 64 3c 30 20 29 7b 0a 20 20 20 20 72 63 20 3d  fd<0 ){.    rc =
21e90 20 75 6e 69 78 4c 6f 67 45 72 72 6f 72 28 53 51   unixLogError(SQ
21ea0 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 42 4b  LITE_CANTOPEN_BK
21eb0 50 54 2c 20 22 6f 70 65 6e 22 2c 20 7a 4e 61 6d  PT, "open", zNam
21ec0 65 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 72  e);.    return r
21ed0 63 3b 0a 20 20 7d 0a 20 20 2f 2a 20 69 66 20 77  c;.  }.  /* if w
21ee0 65 27 72 65 20 6f 70 65 6e 69 6e 67 20 74 68 65  e're opening the
21ef0 20 77 61 6c 20 6f 72 20 6a 6f 75 72 6e 61 6c 20   wal or journal 
21f00 61 6e 64 20 72 75 6e 6e 69 6e 67 20 61 73 20 72  and running as r
21f10 6f 6f 74 2c 20 73 65 74 0a 20 20 2a 2a 20 74 68  oot, set.  ** th
21f20 65 20 6a 6f 75 72 6e 61 6c 20 75 69 64 2f 67 69  e journal uid/gi
21f30 64 20 2a 2f 0a 20 20 69 66 28 20 64 62 4f 70 65  d */.  if( dbOpe
21f40 6e 46 6c 61 67 73 20 26 20 28 53 51 4c 49 54 45  nFlags & (SQLITE
21f50 5f 4f 50 45 4e 5f 57 41 4c 7c 53 51 4c 49 54 45  _OPEN_WAL|SQLITE
21f60 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e  _OPEN_MAIN_JOURN
21f70 41 4c 29 20 29 7b 0a 20 20 20 20 75 69 64 5f 74  AL) ){.    uid_t
21f80 20 65 75 69 64 20 3d 20 67 65 74 65 75 69 64 28   euid = geteuid(
21f90 29 3b 0a 20 20 20 20 69 66 28 20 65 75 69 64 3d  );.    if( euid=
21fa0 3d 30 20 26 26 20 28 65 75 69 64 21 3d 75 69 64  =0 && (euid!=uid
21fb0 20 7c 7c 20 67 65 74 65 67 69 64 28 29 21 3d 67   || getegid()!=g
21fc0 69 64 29 20 29 7b 0a 20 20 20 20 20 20 69 66 28  id) ){.      if(
21fd0 20 66 63 68 6f 77 6e 28 66 64 2c 20 75 69 64 2c   fchown(fd, uid,
21fe0 20 67 69 64 29 20 29 7b 0a 20 20 20 20 20 20 20   gid) ){.       
21ff0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 41 4e   rc = SQLITE_CAN
22000 54 4f 50 45 4e 5f 42 4b 50 54 3b 0a 20 20 20 20  TOPEN_BKPT;.    
22010 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20    }.    }.  }.  
22020 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
22030 4b 20 29 7b 0a 20 20 20 20 2a 70 46 64 20 3d 20  K ){.    *pFd = 
22040 66 64 3b 0a 20 20 7d 20 65 6c 73 65 20 7b 0a 20  fd;.  } else {. 
22050 20 20 20 2a 70 46 64 20 3d 20 2d 31 3b 0a 20 20     *pFd = -1;.  
22060 20 20 63 6c 6f 73 65 28 66 64 29 3b 0a 20 20 7d    close(fd);.  }
22070 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
22080 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78  .static int unix
22090 52 65 70 6c 61 63 65 44 61 74 61 62 61 73 65 28  ReplaceDatabase(
220a0 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 2c  unixFile *pFile,
220b0 20 73 71 6c 69 74 65 33 20 2a 73 72 63 64 62 29   sqlite3 *srcdb)
220c0 20 7b 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c   {.  sqlite3_fil
220d0 65 20 2a 69 64 20 3d 20 28 73 71 6c 69 74 65 33  e *id = (sqlite3
220e0 5f 66 69 6c 65 20 2a 29 70 46 69 6c 65 3b 0a 20  _file *)pFile;. 
220f0 20 42 74 72 65 65 20 2a 70 53 72 63 42 74 72 65   Btree *pSrcBtre
22100 65 20 3d 20 4e 55 4c 4c 3b 0a 20 20 73 71 6c 69  e = NULL;.  sqli
22110 74 65 33 5f 66 69 6c 65 20 2a 73 72 63 5f 66 69  te3_file *src_fi
22120 6c 65 20 3d 20 4e 55 4c 4c 3b 0a 20 20 75 6e 69  le = NULL;.  uni
22130 78 46 69 6c 65 20 2a 70 53 72 63 46 69 6c 65 20  xFile *pSrcFile 
22140 3d 20 4e 55 4c 4c 3b 0a 20 20 63 68 61 72 20 73  = NULL;.  char s
22150 72 63 57 61 6c 50 61 74 68 5b 4d 41 58 50 41 54  rcWalPath[MAXPAT
22160 48 4c 45 4e 2b 35 5d 3b 0a 20 20 69 6e 74 20 73  HLEN+5];.  int s
22170 72 63 57 61 6c 46 44 20 3d 20 2d 31 3b 0a 20 20  rcWalFD = -1;.  
22180 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
22190 4f 4b 3b 0a 20 20 76 6f 69 64 20 2a 70 4c 6f 63  OK;.  void *pLoc
221a0 6b 20 3d 20 4e 55 4c 4c 3b 0a 20 20 69 6e 74 20  k = NULL;.  int 
221b0 66 6c 61 67 73 20 3d 20 30 3b 0a 20 20 73 71 6c  flags = 0;.  sql
221c0 69 74 65 33 20 2a 73 72 63 64 62 32 20 3d 20 4e  ite3 *srcdb2 = N
221d0 55 4c 4c 3b 0a 20 20 63 6f 70 79 66 69 6c 65 5f  ULL;.  copyfile_
221e0 73 74 61 74 65 5f 74 20 73 3b 0a 20 20 69 6e 74  state_t s;.  int
221f0 20 63 6f 72 72 75 70 74 53 72 63 46 69 6c 65 4c   corruptSrcFileL
22200 6f 63 6b 20 3d 20 30 3b 0a 20 20 69 6e 74 20 63  ock = 0;.  int c
22210 6f 72 72 75 70 74 44 73 74 46 69 6c 65 4c 6f 63  orruptDstFileLoc
22220 6b 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 73 53  k = 0;.  int isS
22230 72 63 43 6f 72 72 75 70 74 20 3d 20 30 3b 0a 20  rcCorrupt = 0;. 
22240 20 69 6e 74 20 69 73 44 73 74 43 6f 72 72 75 70   int isDstCorrup
22250 74 20 3d 20 30 3b 0a 20 20 0a 20 20 69 66 28 20  t = 0;.  .  if( 
22260 21 73 71 6c 69 74 65 33 53 61 66 65 74 79 43 68  !sqlite3SafetyCh
22270 65 63 6b 4f 6b 28 73 72 63 64 62 29 20 29 7b 0a  eckOk(srcdb) ){.
22280 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
22290 45 5f 4d 49 53 55 53 45 3b 0a 20 20 7d 0a 20 20  E_MISUSE;.  }.  
222a0 20 20 0a 23 69 66 20 53 51 4c 49 54 45 5f 45 4e    .#if SQLITE_EN
222b0 41 42 4c 45 5f 44 41 54 41 5f 50 52 4f 54 45 43  ABLE_DATA_PROTEC
222c0 54 49 4f 4e 0a 20 20 66 6c 61 67 73 20 7c 3d 20  TION.  flags |= 
222d0 70 46 69 6c 65 2d 3e 70 72 6f 74 46 6c 61 67 73  pFile->protFlags
222e0 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 53 51 4c  ;.#endif.#if SQL
222f0 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49  ITE_ENABLE_LOCKI
22300 4e 47 5f 53 54 59 4c 45 0a 20 20 69 66 28 20 69  NG_STYLE.  if( i
22310 73 50 72 6f 78 79 4c 6f 63 6b 69 6e 67 4d 6f 64  sProxyLockingMod
22320 65 28 70 46 69 6c 65 29 20 29 7b 0a 20 20 20 20  e(pFile) ){.    
22330 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f  flags |= SQLITE_
22340 4f 50 45 4e 5f 41 55 54 4f 50 52 4f 58 59 3b 0a  OPEN_AUTOPROXY;.
22350 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 0a 20 20    }.#endif.  .  
22360 72 63 20 3d 20 73 71 6c 69 74 65 33 64 65 6d 6f  rc = sqlite3demo
22370 5f 73 75 70 65 72 6c 6f 63 6b 28 70 46 69 6c 65  _superlock(pFile
22380 2d 3e 7a 50 61 74 68 2c 20 30 2c 20 66 6c 61 67  ->zPath, 0, flag
22390 73 2c 20 30 2c 20 30 2c 20 26 70 4c 6f 63 6b 29  s, 0, 0, &pLock)
223a0 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20  ;.  if( rc ){.  
223b0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
223c0 5f 43 4f 52 52 55 50 54 20 7c 7c 20 72 63 3d 3d  _CORRUPT || rc==
223d0 53 51 4c 49 54 45 5f 4e 4f 54 41 44 42 20 29 7b  SQLITE_NOTADB ){
223e0 0a 20 20 20 20 20 20 69 73 44 73 74 43 6f 72 72  .      isDstCorr
223f0 75 70 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 72  upt = 1;.      r
22400 63 20 3d 20 73 71 6c 69 74 65 33 64 65 6d 6f 5f  c = sqlite3demo_
22410 73 75 70 65 72 6c 6f 63 6b 5f 63 6f 72 72 75 70  superlock_corrup
22420 74 28 69 64 2c 20 53 51 4c 49 54 45 5f 4c 4f 43  t(id, SQLITE_LOC
22430 4b 5f 45 58 43 4c 55 53 49 56 45 2c 0a 20 20 20  K_EXCLUSIVE,.   
22440 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22450 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22460 20 20 20 20 20 20 26 63 6f 72 72 75 70 74 44 73        &corruptDs
22470 74 46 69 6c 65 4c 6f 63 6b 29 3b 0a 20 20 20 20  tFileLock);.    
22480 7d 0a 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a  }.    if( rc ){.
22490 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
224a0 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 2f 2a 20  .    }.  }.  /* 
224b0 67 65 74 20 74 68 65 20 73 72 63 20 66 69 6c 65  get the src file
224c0 20 64 65 73 63 72 69 70 74 6f 72 20 61 64 68 65   descriptor adhe
224d0 72 69 6e 67 20 74 6f 20 74 68 65 20 64 62 20 73  ring to the db s
224e0 74 72 75 63 74 20 61 63 63 65 73 73 20 72 75 6c  truct access rul
224f0 65 73 20 0a 20 20 20 2a 2a 20 74 68 69 73 20 63  es .   ** this c
22500 6f 64 65 20 69 73 20 6d 6f 64 65 6c 65 64 20 61  ode is modeled a
22510 66 74 65 72 20 73 71 6c 69 74 65 33 5f 66 69 6c  fter sqlite3_fil
22520 65 5f 63 6f 6e 74 72 6f 6c 28 29 20 69 6e 20 6d  e_control() in m
22530 61 69 6e 2e 63 0a 20 20 20 2a 2f 20 0a 20 20 73  ain.c.   */ .  s
22540 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74  qlite3_mutex_ent
22550 65 72 28 73 72 63 64 62 2d 3e 6d 75 74 65 78 29  er(srcdb->mutex)
22560 3b 0a 20 20 69 66 28 20 73 72 63 64 62 2d 3e 6e  ;.  if( srcdb->n
22570 44 62 3e 30 20 29 7b 0a 20 20 20 20 70 53 72 63  Db>0 ){.    pSrc
22580 42 74 72 65 65 20 3d 20 73 72 63 64 62 2d 3e 61  Btree = srcdb->a
22590 44 62 5b 30 5d 2e 70 42 74 3b 0a 20 20 7d 0a 20  Db[0].pBt;.  }. 
225a0 20 69 66 28 20 70 53 72 63 42 74 72 65 65 20 29   if( pSrcBtree )
225b0 7b 0a 20 20 20 20 50 61 67 65 72 20 2a 70 53 72  {.    Pager *pSr
225c0 63 50 61 67 65 72 3b 0a 20 20 20 20 73 71 6c 69  cPager;.    sqli
225d0 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 53  te3BtreeEnter(pS
225e0 72 63 42 74 72 65 65 29 3b 0a 20 20 20 20 70 53  rcBtree);.    pS
225f0 72 63 50 61 67 65 72 20 3d 20 73 71 6c 69 74 65  rcPager = sqlite
22600 33 42 74 72 65 65 50 61 67 65 72 28 70 53 72 63  3BtreePager(pSrc
22610 42 74 72 65 65 29 3b 0a 20 20 20 20 61 73 73 65  Btree);.    asse
22620 72 74 28 20 70 53 72 63 50 61 67 65 72 21 3d 30  rt( pSrcPager!=0
22630 20 29 3b 0a 20 20 20 20 73 72 63 5f 66 69 6c 65   );.    src_file
22640 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 46   = sqlite3PagerF
22650 69 6c 65 28 70 53 72 63 50 61 67 65 72 29 3b 0a  ile(pSrcPager);.
22660 20 20 20 20 61 73 73 65 72 74 28 20 73 72 63 5f      assert( src_
22670 66 69 6c 65 21 3d 30 20 29 3b 0a 20 20 20 20 69  file!=0 );.    i
22680 66 28 20 73 72 63 5f 66 69 6c 65 2d 3e 70 4d 65  f( src_file->pMe
22690 74 68 6f 64 73 20 29 7b 0a 20 20 20 20 20 20 69  thods ){.      i
226a0 6e 74 20 73 72 63 46 6c 61 67 73 20 3d 20 30 3b  nt srcFlags = 0;
226b0 0a 20 20 20 20 20 20 70 53 72 63 46 69 6c 65 20  .      pSrcFile 
226c0 3d 20 28 75 6e 69 78 46 69 6c 65 20 2a 29 73 72  = (unixFile *)sr
226d0 63 5f 66 69 6c 65 3b 0a 23 69 66 20 53 51 4c 49  c_file;.#if SQLI
226e0 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e  TE_ENABLE_LOCKIN
226f0 47 5f 53 54 59 4c 45 20 7c 7c 20 64 65 66 69 6e  G_STYLE || defin
22700 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 0a 20 20  ed(__APPLE__).  
22710 20 20 20 20 69 66 20 28 28 70 53 72 63 46 69 6c      if ((pSrcFil
22720 65 2d 3e 6f 70 65 6e 46 6c 61 67 73 20 26 20 4f  e->openFlags & O
22730 5f 52 44 57 52 29 20 3d 3d 20 4f 5f 52 44 57 52  _RDWR) == O_RDWR
22740 29 20 7b 0a 20 20 20 20 20 20 20 20 73 72 63 46  ) {.        srcF
22750 6c 61 67 73 20 3d 20 53 51 4c 49 54 45 5f 4f 50  lags = SQLITE_OP
22760 45 4e 5f 52 45 41 44 57 52 49 54 45 3b 0a 20 20  EN_READWRITE;.  
22770 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20      } else {.   
22780 20 20 20 20 20 73 72 63 46 6c 61 67 73 20 3d 20       srcFlags = 
22790 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44  SQLITE_OPEN_READ
227a0 4f 4e 4c 59 3b 0a 20 20 20 20 20 20 7d 0a 23 65  ONLY;.      }.#e
227b0 6c 73 65 0a 20 20 20 20 20 20 73 72 63 46 6c 61  lse.      srcFla
227c0 67 73 20 3d 20 53 51 4c 49 54 45 5f 4f 50 45 4e  gs = SQLITE_OPEN
227d0 5f 52 45 41 44 57 52 49 54 45 3b 0a 23 65 6e 64  _READWRITE;.#end
227e0 69 66 0a 23 69 66 20 53 51 4c 49 54 45 5f 45 4e  if.#if SQLITE_EN
227f0 41 42 4c 45 5f 44 41 54 41 5f 50 52 4f 54 45 43  ABLE_DATA_PROTEC
22800 54 49 4f 4e 0a 20 20 20 20 20 20 73 72 63 46 6c  TION.      srcFl
22810 61 67 73 20 7c 3d 20 70 53 72 63 46 69 6c 65 2d  ags |= pSrcFile-
22820 3e 70 72 6f 74 46 6c 61 67 73 3b 0a 23 65 6e 64  >protFlags;.#end
22830 69 66 0a 23 69 66 20 53 51 4c 49 54 45 5f 45 4e  if.#if SQLITE_EN
22840 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59  ABLE_LOCKING_STY
22850 4c 45 0a 20 20 20 20 20 20 69 66 28 20 69 73 50  LE.      if( isP
22860 72 6f 78 79 4c 6f 63 6b 69 6e 67 4d 6f 64 65 28  roxyLockingMode(
22870 70 53 72 63 46 69 6c 65 29 20 29 7b 0a 20 20 20  pSrcFile) ){.   
22880 20 20 20 20 20 73 72 63 46 6c 61 67 73 20 7c 3d       srcFlags |=
22890 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 41 55 54   SQLITE_OPEN_AUT
228a0 4f 50 52 4f 58 59 3b 0a 20 20 20 20 20 20 7d 0a  OPROXY;.      }.
228b0 23 65 6e 64 69 66 0a 20 20 20 20 20 20 72 63 20  #endif.      rc 
228c0 3d 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 5f 76  = sqlite3_open_v
228d0 32 28 70 53 72 63 46 69 6c 65 2d 3e 7a 50 61 74  2(pSrcFile->zPat
228e0 68 2c 20 26 73 72 63 64 62 32 2c 20 73 72 63 46  h, &srcdb2, srcF
228f0 6c 61 67 73 2c 20 30 29 3b 0a 20 20 20 20 20 20  lags, 0);.      
22900 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
22910 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  K ){.        /* 
22920 73 74 61 72 74 20 61 20 64 65 66 65 72 72 65 64  start a deferred
22930 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 61 6e 64   transaction and
22940 20 72 65 61 64 20 74 6f 20 65 73 74 61 62 6c 69   read to establi
22950 73 68 20 61 20 72 65 61 64 20 6c 6f 63 6b 20 2a  sh a read lock *
22960 2f 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  /.        rc = s
22970 71 6c 69 74 65 33 5f 65 78 65 63 28 73 72 63 64  qlite3_exec(srcd
22980 62 32 2c 20 22 42 45 47 49 4e 20 44 45 46 45 52  b2, "BEGIN DEFER
22990 52 45 44 3b 20 50 52 41 47 4d 41 20 73 63 68 65  RED; PRAGMA sche
229a0 6d 61 5f 76 65 72 73 69 6f 6e 22 2c 0a 20 20 20  ma_version",.   
229b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
229c0 20 20 20 20 20 20 20 30 2c 20 30 2c 20 30 29 3b         0, 0, 0);
229d0 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d  .        if( rc=
229e0 3d 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 20  =SQLITE_CORRUPT 
229f0 7c 7c 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f  || rc==SQLITE_NO
22a00 54 41 44 42 20 29 7b 0a 20 20 20 20 20 20 20 20  TADB ){.        
22a10 20 20 69 73 53 72 63 43 6f 72 72 75 70 74 20 3d    isSrcCorrupt =
22a20 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63   1;.          rc
22a30 20 3d 20 73 71 6c 69 74 65 33 64 65 6d 6f 5f 73   = sqlite3demo_s
22a40 75 70 65 72 6c 6f 63 6b 5f 63 6f 72 72 75 70 74  uperlock_corrupt
22a50 28 73 72 63 5f 66 69 6c 65 2c 20 53 51 4c 49 54  (src_file, SQLIT
22a60 45 5f 4c 4f 43 4b 5f 53 48 41 52 45 44 2c 0a 20  E_LOCK_SHARED,. 
22a70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22a80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22a90 20 20 20 20 20 20 20 20 20 20 20 20 26 63 6f 72              &cor
22aa0 72 75 70 74 53 72 63 46 69 6c 65 4c 6f 63 6b 29  ruptSrcFileLock)
22ab0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
22ac0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20    }.    }.  }.  
22ad0 69 66 28 20 21 73 72 63 64 62 32 20 7c 7c 20 70  if( !srcdb2 || p
22ae0 53 72 63 46 69 6c 65 3d 3d 4e 55 4c 4c 20 7c 7c  SrcFile==NULL ||
22af0 20 70 53 72 63 46 69 6c 65 2d 3e 68 3c 30 29 7b   pSrcFile->h<0){
22b00 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
22b10 5f 49 4e 54 45 52 4e 41 4c 3b 0a 20 20 7d 0a 20  _INTERNAL;.  }. 
22b20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
22b30 4f 4b 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65  OK ){.    goto e
22b40 6e 64 5f 72 65 70 6c 61 63 65 5f 64 61 74 61 62  nd_replace_datab
22b50 61 73 65 3b 0a 20 20 7d 0a 20 20 2f 2a 20 62 6f  ase;.  }.  /* bo
22b60 74 68 20 64 61 74 61 62 61 73 65 73 20 61 72 65  th databases are
22b70 20 6c 6f 63 6b 65 64 20 61 70 70 72 6f 70 72 69   locked appropri
22b80 61 74 65 6c 79 2c 20 63 6f 70 79 20 74 68 65 20  ately, copy the 
22b90 73 72 63 20 77 61 6c 20 6a 6f 75 72 6e 61 6c 20  src wal journal 
22ba0 69 66 20 0a 20 20 20 2a 2a 20 6f 6e 65 20 65 78  if .   ** one ex
22bb0 69 73 74 73 20 61 6e 64 20 74 68 65 6e 20 74 68  ists and then th
22bc0 65 20 61 63 74 75 61 6c 20 64 61 74 61 62 61 73  e actual databas
22bd0 65 20 66 69 6c 65 0a 20 20 20 2a 2f 0a 20 20 73  e file.   */.  s
22be0 74 72 6c 63 70 79 28 73 72 63 57 61 6c 50 61 74  trlcpy(srcWalPat
22bf0 68 2c 20 70 53 72 63 46 69 6c 65 2d 3e 7a 50 61  h, pSrcFile->zPa
22c00 74 68 2c 20 4d 41 58 50 41 54 48 4c 45 4e 2b 35  th, MAXPATHLEN+5
22c10 29 3b 0a 20 20 73 74 72 6c 63 61 74 28 73 72 63  );.  strlcat(src
22c20 57 61 6c 50 61 74 68 2c 20 22 2d 77 61 6c 22 2c  WalPath, "-wal",
22c30 20 4d 41 58 50 41 54 48 4c 45 4e 2b 35 29 3b 0a   MAXPATHLEN+5);.
22c40 20 20 73 72 63 57 61 6c 46 44 20 3d 20 6f 70 65    srcWalFD = ope
22c50 6e 28 73 72 63 57 61 6c 50 61 74 68 2c 20 4f 5f  n(srcWalPath, O_
22c60 52 44 4f 4e 4c 59 29 3b 0a 20 20 69 66 28 20 21  RDONLY);.  if( !
22c70 28 73 72 63 57 61 6c 46 44 3c 30 29 20 29 7b 0a  (srcWalFD<0) ){.
22c80 20 20 20 20 63 68 61 72 20 64 73 74 57 61 6c 50      char dstWalP
22c90 61 74 68 5b 4d 41 58 50 41 54 48 4c 45 4e 2b 35  ath[MAXPATHLEN+5
22ca0 5d 3b 0a 20 20 20 20 69 6e 74 20 64 73 74 57 61  ];.    int dstWa
22cb0 6c 46 44 20 3d 20 2d 31 3b 0a 20 20 20 20 69 6e  lFD = -1;.    in
22cc0 74 20 70 72 6f 74 46 6c 61 67 73 20 3d 20 30 3b  t protFlags = 0;
22cd0 0a 20 20 20 20 73 74 72 6c 63 70 79 28 64 73 74  .    strlcpy(dst
22ce0 57 61 6c 50 61 74 68 2c 20 70 46 69 6c 65 2d 3e  WalPath, pFile->
22cf0 7a 50 61 74 68 2c 20 4d 41 58 50 41 54 48 4c 45  zPath, MAXPATHLE
22d00 4e 2b 35 29 3b 0a 20 20 20 20 73 74 72 6c 63 61  N+5);.    strlca
22d10 74 28 64 73 74 57 61 6c 50 61 74 68 2c 20 22 2d  t(dstWalPath, "-
22d20 77 61 6c 22 2c 20 4d 41 58 50 41 54 48 4c 45 4e  wal", MAXPATHLEN
22d30 2b 35 29 3b 0a 0a 20 20 20 20 72 63 20 3d 20 75  +5);..    rc = u
22d40 6e 69 78 4f 70 65 6e 43 68 69 6c 64 46 69 6c 65  nixOpenChildFile
22d50 28 64 73 74 57 61 6c 50 61 74 68 2c 20 4f 5f 52  (dstWalPath, O_R
22d60 44 57 52 7c 4f 5f 43 52 45 41 54 2c 20 53 51 4c  DWR|O_CREAT, SQL
22d70 49 54 45 5f 4f 50 45 4e 5f 57 41 4c 2c 0a 20 20  ITE_OPEN_WAL,.  
22d80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22d90 20 20 20 20 20 20 20 20 20 70 72 6f 74 46 6c 61           protFla
22da0 67 73 2c 20 26 64 73 74 57 61 6c 46 44 29 3b 0a  gs, &dstWalFD);.
22db0 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
22dc0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73  TE_OK ){.      s
22dd0 20 3d 20 63 6f 70 79 66 69 6c 65 5f 73 74 61 74   = copyfile_stat
22de0 65 5f 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 20  e_alloc();.     
22df0 20 6c 73 65 65 6b 28 73 72 63 57 61 6c 46 44 2c   lseek(srcWalFD,
22e00 20 30 2c 20 53 45 45 4b 5f 53 45 54 29 3b 0a 20   0, SEEK_SET);. 
22e10 20 20 20 20 20 6c 73 65 65 6b 28 64 73 74 57 61       lseek(dstWa
22e20 6c 46 44 2c 20 30 2c 20 53 45 45 4b 5f 53 45 54  lFD, 0, SEEK_SET
22e30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 66 63 6f  );.      if( fco
22e40 70 79 66 69 6c 65 28 73 72 63 57 61 6c 46 44 2c  pyfile(srcWalFD,
22e50 20 64 73 74 57 61 6c 46 44 2c 20 73 2c 20 43 4f   dstWalFD, s, CO
22e60 50 59 46 49 4c 45 5f 44 41 54 41 29 20 29 7b 0a  PYFILE_DATA) ){.
22e70 20 20 20 20 20 20 20 20 69 6e 74 20 65 72 72 3d          int err=
22e80 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20 20 20 73  errno;.        s
22e90 77 69 74 63 68 28 65 72 72 29 20 7b 0a 20 20 20  witch(err) {.   
22ea0 20 20 20 20 20 20 20 63 61 73 65 20 45 4e 4f 4d         case ENOM
22eb0 45 4d 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20  EM:.            
22ec0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  rc = SQLITE_NOME
22ed0 4d 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 62  M;.            b
22ee0 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20  reak;.          
22ef0 64 65 66 61 75 6c 74 3a 0a 20 20 20 20 20 20 20  default:.       
22f00 20 20 20 20 20 73 74 6f 72 65 4c 61 73 74 45 72       storeLastEr
22f10 72 6e 6f 28 70 46 69 6c 65 2c 20 65 72 72 29 3b  rno(pFile, err);
22f20 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20  .            rc 
22f30 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 3b 0a  = SQLITE_IOERR;.
22f40 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
22f50 7d 0a 20 20 20 20 20 20 63 6f 70 79 66 69 6c 65  }.      copyfile
22f60 5f 73 74 61 74 65 5f 66 72 65 65 28 73 29 3b 0a  _state_free(s);.
22f70 20 20 20 20 20 20 63 6c 6f 73 65 28 64 73 74 57        close(dstW
22f80 61 6c 46 44 29 3b 0a 20 20 20 20 7d 0a 20 20 20  alFD);.    }.   
22f90 20 63 6c 6f 73 65 28 73 72 63 57 61 6c 46 44 29   close(srcWalFD)
22fa0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d  ;.  }.  if( rc==
22fb0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
22fc0 20 2f 2a 20 62 65 66 6f 72 65 20 77 65 20 63 6f   /* before we co
22fd0 70 79 2c 20 65 6e 73 75 72 65 20 74 68 61 74 20  py, ensure that 
22fe0 74 68 65 20 66 69 6c 65 20 63 68 61 6e 67 65 20  the file change 
22ff0 63 6f 75 6e 74 65 72 20 77 69 6c 6c 20 62 65 20  counter will be 
23000 6d 6f 64 69 66 69 65 64 20 2a 2f 0a 20 20 20 20  modified */.    
23010 75 69 6e 74 33 32 5f 74 20 73 72 63 43 68 61 6e  uint32_t srcChan
23020 67 65 20 3d 20 30 3b 0a 20 20 20 20 75 69 6e 74  ge = 0;.    uint
23030 33 32 5f 74 20 64 73 74 43 68 61 6e 67 65 20 3d  32_t dstChange =
23040 20 30 3b 0a 20 20 20 20 70 72 65 61 64 28 70 53   0;.    pread(pS
23050 72 63 46 69 6c 65 2d 3e 68 2c 20 26 73 72 63 43  rcFile->h, &srcC
23060 68 61 6e 67 65 2c 20 34 2c 20 32 34 29 3b 0a 20  hange, 4, 24);. 
23070 20 20 20 70 72 65 61 64 28 70 46 69 6c 65 2d 3e     pread(pFile->
23080 68 2c 20 26 64 73 74 43 68 61 6e 67 65 2c 20 34  h, &dstChange, 4
23090 2c 20 32 34 29 3b 0a 20 20 20 20 0a 20 20 20 20  , 24);.    .    
230a0 2f 2a 20 63 6f 70 79 20 74 68 65 20 61 63 74 75  /* copy the actu
230b0 61 6c 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20  al database */. 
230c0 20 20 20 73 20 3d 20 63 6f 70 79 66 69 6c 65 5f     s = copyfile_
230d0 73 74 61 74 65 5f 61 6c 6c 6f 63 28 29 3b 0a 20  state_alloc();. 
230e0 20 20 20 6c 73 65 65 6b 28 70 53 72 63 46 69 6c     lseek(pSrcFil
230f0 65 2d 3e 68 2c 20 30 2c 20 53 45 45 4b 5f 53 45  e->h, 0, SEEK_SE
23100 54 29 3b 0a 20 20 20 20 6c 73 65 65 6b 28 70 46  T);.    lseek(pF
23110 69 6c 65 2d 3e 68 2c 20 30 2c 20 53 45 45 4b 5f  ile->h, 0, SEEK_
23120 53 45 54 29 3b 0a 20 20 20 20 69 66 28 20 66 63  SET);.    if( fc
23130 6f 70 79 66 69 6c 65 28 70 53 72 63 46 69 6c 65  opyfile(pSrcFile
23140 2d 3e 68 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 73  ->h, pFile->h, s
23150 2c 20 43 4f 50 59 46 49 4c 45 5f 44 41 54 41 29  , COPYFILE_DATA)
23160 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 65 72   ){.      int er
23170 72 3d 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20 73  r=errno;.      s
23180 77 69 74 63 68 28 65 72 72 29 20 7b 0a 20 20 20  witch(err) {.   
23190 20 20 20 20 20 63 61 73 65 20 45 4e 4f 4d 45 4d       case ENOMEM
231a0 3a 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  :.          rc =
231b0 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
231c0 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
231d0 20 20 20 20 20 20 20 20 64 65 66 61 75 6c 74 3a          default:
231e0 0a 20 20 20 20 20 20 20 20 20 20 73 74 6f 72 65  .          store
231f0 4c 61 73 74 45 72 72 6e 6f 28 70 46 69 6c 65 2c  LastErrno(pFile,
23200 20 65 72 72 29 3b 0a 20 20 20 20 20 20 20 20 20   err);.         
23210 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45   rc = SQLITE_IOE
23220 52 52 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  RR;.      }.    
23230 7d 0a 20 20 20 20 63 6f 70 79 66 69 6c 65 5f 73  }.    copyfile_s
23240 74 61 74 65 5f 66 72 65 65 28 73 29 3b 0a 20 20  tate_free(s);.  
23250 20 20 0a 20 20 20 20 69 66 20 28 73 72 63 43 68    .    if (srcCh
23260 61 6e 67 65 20 3d 3d 20 64 73 74 43 68 61 6e 67  ange == dstChang
23270 65 29 20 7b 0a 20 20 20 20 20 20 2f 2a 20 6d 6f  e) {.      /* mo
23280 64 69 66 79 20 74 68 65 20 63 68 61 6e 67 65 20  dify the change 
23290 63 6f 75 6e 74 65 72 20 74 6f 20 66 6f 72 63 65  counter to force
232a0 20 70 61 67 65 20 7a 65 72 6f 20 74 6f 20 62 65   page zero to be
232b0 20 72 65 6c 6f 61 64 65 64 20 2a 2f 0a 20 20 20   reloaded */.   
232c0 20 20 20 64 73 74 43 68 61 6e 67 65 20 2b 2b 3b     dstChange ++;
232d0 0a 20 20 20 20 20 20 70 77 72 69 74 65 28 70 46  .      pwrite(pF
232e0 69 6c 65 2d 3e 68 2c 20 26 64 73 74 43 68 61 6e  ile->h, &dstChan
232f0 67 65 2c 20 34 2c 20 32 34 29 3b 0a 20 20 20 20  ge, 4, 24);.    
23300 7d 0a 20 20 7d 0a 20 20 69 66 28 20 69 73 53 72  }.  }.  if( isSr
23310 63 43 6f 72 72 75 70 74 20 29 7b 0a 20 20 20 20  cCorrupt ){.    
23320 73 71 6c 69 74 65 33 64 65 6d 6f 5f 73 75 70 65  sqlite3demo_supe
23330 72 75 6e 6c 6f 63 6b 5f 63 6f 72 72 75 70 74 28  runlock_corrupt(
23340 73 72 63 5f 66 69 6c 65 2c 20 63 6f 72 72 75 70  src_file, corrup
23350 74 53 72 63 46 69 6c 65 4c 6f 63 6b 29 3b 0a 20  tSrcFileLock);. 
23360 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 64   }else{.    /* d
23370 6f 6e 65 20 77 69 74 68 20 74 68 65 20 73 6f 75  one with the sou
23380 72 63 65 20 64 62 20 73 6f 20 65 6e 64 20 74 68  rce db so end th
23390 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 2a 2f  e transaction */
233a0 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 65 78 65  .    sqlite3_exe
233b0 63 28 73 72 63 64 62 32 2c 20 22 43 4f 4d 4d 49  c(srcdb2, "COMMI
233c0 54 22 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20  T", 0, 0, 0);.  
233d0 7d 0a 20 20 2f 2a 20 7a 65 72 6f 20 6f 75 74 20  }.  /* zero out 
233e0 61 6e 79 20 6f 6c 64 20 6a 6f 75 72 6e 61 6c 20  any old journal 
233f0 63 6c 75 74 74 65 72 20 2a 2f 0a 20 20 69 66 28  clutter */.  if(
23400 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
23410 7b 0a 20 20 20 20 69 6e 74 20 73 6b 69 70 57 41  {.    int skipWA
23420 4c 20 3d 20 28 73 72 63 57 61 6c 46 44 3c 30 29  L = (srcWalFD<0)
23430 3f 30 3a 31 3b 0a 20 20 20 20 75 6e 69 78 49 6e  ?0:1;.    unixIn
23440 76 61 6c 69 64 61 74 65 53 75 70 70 6f 72 74 46  validateSupportF
23450 69 6c 65 73 28 70 46 69 6c 65 2c 20 73 6b 69 70  iles(pFile, skip
23460 57 41 4c 29 3b 0a 20 20 7d 0a 20 20 0a 65 6e 64  WAL);.  }.  .end
23470 5f 72 65 70 6c 61 63 65 5f 64 61 74 61 62 61 73  _replace_databas
23480 65 3a 0a 20 20 69 66 28 20 70 53 72 63 42 74 72  e:.  if( pSrcBtr
23490 65 65 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  ee ){.    sqlite
234a0 33 5f 63 6c 6f 73 65 28 73 72 63 64 62 32 29 3b  3_close(srcdb2);
234b0 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65  .    sqlite3Btre
234c0 65 4c 65 61 76 65 28 70 53 72 63 42 74 72 65 65  eLeave(pSrcBtree
234d0 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  );.  }.  sqlite3
234e0 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 73 72 63  _mutex_leave(src
234f0 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 69 66  db->mutex);.  if
23500 28 20 69 73 44 73 74 43 6f 72 72 75 70 74 20 29  ( isDstCorrupt )
23510 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 64 65 6d  {.    sqlite3dem
23520 6f 5f 73 75 70 65 72 75 6e 6c 6f 63 6b 5f 63 6f  o_superunlock_co
23530 72 72 75 70 74 28 69 64 2c 20 63 6f 72 72 75 70  rrupt(id, corrup
23540 74 44 73 74 46 69 6c 65 4c 6f 63 6b 29 3b 0a 20  tDstFileLock);. 
23550 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69   }else{.    sqli
23560 74 65 33 64 65 6d 6f 5f 73 75 70 65 72 75 6e 6c  te3demo_superunl
23570 6f 63 6b 28 70 4c 6f 63 6b 29 3b 0a 20 20 7d 0a  ock(pLock);.  }.
23580 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23    return rc;.}.#
23590 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 46 49  define SQLITE_FI
235a0 4c 45 5f 48 45 41 44 45 52 5f 4c 45 4e 20 31 36  LE_HEADER_LEN 16
235b0 0a 2f 2a 20 43 68 65 63 6b 20 66 6f 72 20 61 20  ./* Check for a 
235c0 63 6f 6e 66 6c 69 63 74 69 6e 67 20 6c 6f 63 6b  conflicting lock
235d0 2e 20 20 49 66 20 6f 6e 65 20 69 73 20 66 6f 75  .  If one is fou
235e0 6e 64 2c 20 70 72 69 6e 74 20 61 6e 20 74 68 69  nd, print an thi
235f0 73 0a 20 2a 2a 20 6f 6e 20 73 74 61 6e 64 61 72  s. ** on standar
23600 64 20 6f 75 74 70 75 74 20 75 73 69 6e 67 20 74  d output using t
23610 68 65 20 66 6f 72 6d 61 74 20 73 74 72 69 6e 67  he format string
23620 20 67 69 76 65 6e 20 61 6e 64 20 72 65 74 75 72   given and retur
23630 6e 20 31 2e 0a 20 2a 2a 20 49 66 20 74 68 65 72  n 1.. ** If ther
23640 65 20 61 72 65 20 6e 6f 20 63 6f 6e 66 6c 69 63  e are no conflic
23650 74 69 6e 67 20 6c 6f 63 6b 73 2c 20 72 65 74 75  ting locks, retu
23660 72 6e 20 30 2e 0a 20 2a 2f 0a 73 74 61 74 69 63  rn 0.. */.static
23670 20 69 6e 74 20 75 6e 69 78 49 73 4c 6f 63 6b 65   int unixIsLocke
23680 64 28 0a 20 20 70 69 64 5f 74 20 70 69 64 2c 20  d(.  pid_t pid, 
23690 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 49             /* PI
236a0 44 20 74 6f 20 74 65 73 74 20 66 6f 72 20 6c 6f  D to test for lo
236b0 63 6b 20 6f 77 6e 65 72 20 2a 2f 0a 20 20 69 6e  ck owner */.  in
236c0 74 20 68 2c 20 20 20 20 20 20 20 20 20 20 20 20  t h,            
236d0 20 20 20 20 2f 2a 20 46 69 6c 65 20 64 65 73 63      /* File desc
236e0 72 69 70 74 6f 72 20 74 6f 20 63 68 65 63 6b 20  riptor to check 
236f0 2a 2f 0a 20 20 69 6e 74 20 74 79 70 65 2c 20 20  */.  int type,  
23700 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 5f             /* F_
23710 52 44 4c 43 4b 20 6f 72 20 46 5f 57 52 4c 43 4b  RDLCK or F_WRLCK
23720 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 69   */.  unsigned i
23730 6e 74 20 69 4f 66 73 74 2c 20 20 20 2f 2a 20 46  nt iOfst,   /* F
23740 69 72 73 74 20 62 79 74 65 20 6f 66 20 74 68 65  irst byte of the
23750 20 6c 6f 63 6b 20 2a 2f 0a 20 20 75 6e 73 69 67   lock */.  unsig
23760 6e 65 64 20 69 6e 74 20 69 43 6e 74 2c 20 20 20  ned int iCnt,   
23770 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79   /* Number of by
23780 74 65 73 20 69 6e 20 74 68 65 20 6c 6f 63 6b 20  tes in the lock 
23790 72 61 6e 67 65 20 2a 2f 0a 20 20 63 6f 6e 73 74  range */.  const
237a0 20 63 68 61 72 20 2a 7a 54 79 70 65 20 20 20 20   char *zType    
237b0 20 2f 2a 20 54 79 70 65 20 6f 66 20 6c 6f 63 6b   /* Type of lock
237c0 20 2a 2f 0a 29 7b 0a 20 20 73 74 72 75 63 74 20   */.){.  struct 
237d0 66 6c 6f 63 6b 20 6c 6b 3b 0a 20 20 69 6e 74 20  flock lk;.  int 
237e0 65 72 72 3b 0a 20 20 0a 20 20 6d 65 6d 73 65 74  err;.  .  memset
237f0 28 26 6c 6b 2c 20 30 2c 20 73 69 7a 65 6f 66 28  (&lk, 0, sizeof(
23800 6c 6b 29 29 3b 0a 20 20 6c 6b 2e 6c 5f 74 79 70  lk));.  lk.l_typ
23810 65 20 3d 20 74 79 70 65 3b 0a 20 20 6c 6b 2e 6c  e = type;.  lk.l
23820 5f 77 68 65 6e 63 65 20 3d 20 53 45 45 4b 5f 53  _whence = SEEK_S
23830 45 54 3b 0a 20 20 6c 6b 2e 6c 5f 73 74 61 72 74  ET;.  lk.l_start
23840 20 3d 20 69 4f 66 73 74 3b 0a 20 20 6c 6b 2e 6c   = iOfst;.  lk.l
23850 5f 6c 65 6e 20 3d 20 69 43 6e 74 3b 0a 20 20 0a  _len = iCnt;.  .
23860 20 20 69 66 28 20 70 69 64 21 3d 53 51 4c 49 54    if( pid!=SQLIT
23870 45 5f 4c 4f 43 4b 53 54 41 54 45 5f 41 4e 59 50  E_LOCKSTATE_ANYP
23880 49 44 20 29 7b 0a 23 69 66 6e 64 65 66 20 46 5f  ID ){.#ifndef F_
23890 47 45 54 4c 4b 50 49 44 0a 23 20 77 61 72 6e 69  GETLKPID.# warni
238a0 6e 67 20 46 5f 47 45 54 4c 4b 50 49 44 20 75 6e  ng F_GETLKPID un
238b0 64 65 66 69 6e 65 64 2c 20 5f 73 71 6c 69 74 65  defined, _sqlite
238c0 33 5f 6c 6f 63 6b 73 74 61 74 65 20 66 61 6c 6c  3_lockstate fall
238d0 69 6e 67 20 62 61 63 6b 20 74 6f 20 46 5f 47 45  ing back to F_GE
238e0 54 4c 4b 0a 20 20 20 20 65 72 72 20 3d 20 66 63  TLK.    err = fc
238f0 6e 74 6c 28 68 2c 20 46 5f 47 45 54 4c 4b 2c 20  ntl(h, F_GETLK, 
23900 26 6c 6b 29 3b 0a 23 65 6c 73 65 0a 20 20 20 20  &lk);.#else.    
23910 6c 6b 2e 6c 5f 70 69 64 20 3d 20 70 69 64 3b 0a  lk.l_pid = pid;.
23920 20 20 20 20 65 72 72 20 3d 20 66 63 6e 74 6c 28      err = fcntl(
23930 68 2c 20 46 5f 47 45 54 4c 4b 50 49 44 2c 20 26  h, F_GETLKPID, &
23940 6c 6b 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 65  lk);.#endif.  }e
23950 6c 73 65 7b 0a 20 20 20 20 65 72 72 20 3d 20 66  lse{.    err = f
23960 63 6e 74 6c 28 68 2c 20 46 5f 47 45 54 4c 4b 2c  cntl(h, F_GETLK,
23970 20 26 6c 6b 29 3b 0a 20 20 7d 0a 20 20 0a 20 20   &lk);.  }.  .  
23980 69 66 28 20 65 72 72 3d 3d 28 2d 31 29 20 29 7b  if( err==(-1) ){
23990 0a 20 20 20 20 66 70 72 69 6e 74 66 28 73 74 64  .    fprintf(std
239a0 65 72 72 2c 20 22 66 63 6e 74 6c 28 25 64 29 20  err, "fcntl(%d) 
239b0 66 61 69 6c 65 64 3a 20 65 72 72 6e 6f 3d 25 64  failed: errno=%d
239c0 5c 6e 22 2c 20 68 2c 20 65 72 72 6e 6f 29 3b 0a  \n", h, errno);.
239d0 20 20 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20      return -1;. 
239e0 20 7d 0a 20 20 0a 20 20 69 66 28 20 6c 6b 2e 6c   }.  .  if( lk.l
239f0 5f 74 79 70 65 21 3d 46 5f 55 4e 4c 43 4b 20 26  _type!=F_UNLCK &
23a00 26 20 28 70 69 64 3d 3d 53 51 4c 49 54 45 5f 4c  & (pid==SQLITE_L
23a10 4f 43 4b 53 54 41 54 45 5f 41 4e 59 50 49 44 20  OCKSTATE_ANYPID 
23a20 7c 7c 20 6c 6b 2e 6c 5f 70 69 64 3d 3d 70 69 64  || lk.l_pid==pid
23a30 29 20 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49  ) ){.#ifdef SQLI
23a40 54 45 5f 44 45 42 55 47 0a 20 20 20 20 66 70 72  TE_DEBUG.    fpr
23a50 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 25 73  intf(stderr, "%s
23a60 20 6c 6f 63 6b 20 68 65 6c 64 20 62 79 20 25 64   lock held by %d
23a70 5c 6e 22 2c 20 7a 54 79 70 65 2c 20 28 69 6e 74  \n", zType, (int
23a80 29 6c 6b 2e 6c 5f 70 69 64 29 3b 0a 23 65 6e 64  )lk.l_pid);.#end
23a90 69 66 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b  if.    return 1;
23aa0 0a 20 20 7d 20 0a 20 20 72 65 74 75 72 6e 20 30  .  } .  return 0
23ab0 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74 20  ;.}..static int 
23ac0 75 6e 69 78 4c 6f 63 6b 73 74 61 74 65 50 69 64  unixLockstatePid
23ad0 28 75 6e 69 78 46 69 6c 65 20 2a 2c 20 70 69 64  (unixFile *, pid
23ae0 5f 74 2c 20 69 6e 74 20 2a 29 3b 0a 0a 23 65 6e  _t, int *);..#en
23af0 64 69 66 20 2f 2a 20 28 53 51 4c 49 54 45 5f 45  dif /* (SQLITE_E
23b00 4e 41 42 4c 45 5f 41 50 50 4c 45 5f 53 50 49 3e  NABLE_APPLE_SPI>
23b10 30 29 20 26 26 20 64 65 66 69 6e 65 64 28 5f 5f  0) && defined(__
23b20 41 50 50 4c 45 5f 5f 29 20 2a 2f 0a 0a 0a 2f 2a  APPLE__) */.../*
23b30 0a 2a 2a 20 49 66 20 2a 70 41 72 67 20 69 73 20  .** If *pArg is 
23b40 69 6e 69 74 69 61 6c 6c 79 20 6e 65 67 61 74 69  initially negati
23b50 76 65 20 74 68 65 6e 20 74 68 69 73 20 69 73 20  ve then this is 
23b60 61 20 71 75 65 72 79 2e 20 20 53 65 74 20 2a 70  a query.  Set *p
23b70 41 72 67 20 74 6f 0a 2a 2a 20 31 20 6f 72 20 30  Arg to.** 1 or 0
23b80 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e 20 77 68   depending on wh
23b90 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 62 69 74  ether or not bit
23ba0 20 6d 61 73 6b 20 6f 66 20 70 46 69 6c 65 2d 3e   mask of pFile->
23bb0 63 74 72 6c 46 6c 61 67 73 20 69 73 20 73 65 74  ctrlFlags is set
23bc0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 2a 70 41 72 67  ..**.** If *pArg
23bd0 20 69 73 20 30 20 6f 72 20 31 2c 20 74 68 65 6e   is 0 or 1, then
23be0 20 63 6c 65 61 72 20 6f 72 20 73 65 74 20 74 68   clear or set th
23bf0 65 20 6d 61 73 6b 20 62 69 74 20 6f 66 20 70 46  e mask bit of pF
23c00 69 6c 65 2d 3e 63 74 72 6c 46 6c 61 67 73 2e 0a  ile->ctrlFlags..
23c10 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 75  */.static void u
23c20 6e 69 78 4d 6f 64 65 42 69 74 28 75 6e 69 78 46  nixModeBit(unixF
23c30 69 6c 65 20 2a 70 46 69 6c 65 2c 20 75 6e 73 69  ile *pFile, unsi
23c40 67 6e 65 64 20 63 68 61 72 20 6d 61 73 6b 2c 20  gned char mask, 
23c50 69 6e 74 20 2a 70 41 72 67 29 7b 0a 20 20 69 66  int *pArg){.  if
23c60 28 20 2a 70 41 72 67 3c 30 20 29 7b 0a 20 20 20  ( *pArg<0 ){.   
23c70 20 2a 70 41 72 67 20 3d 20 28 70 46 69 6c 65 2d   *pArg = (pFile-
23c80 3e 63 74 72 6c 46 6c 61 67 73 20 26 20 6d 61 73  >ctrlFlags & mas
23c90 6b 29 21 3d 30 3b 0a 20 20 7d 65 6c 73 65 20 69  k)!=0;.  }else i
23ca0 66 28 20 28 2a 70 41 72 67 29 3d 3d 30 20 29 7b  f( (*pArg)==0 ){
23cb0 0a 20 20 20 20 70 46 69 6c 65 2d 3e 63 74 72 6c  .    pFile->ctrl
23cc0 46 6c 61 67 73 20 26 3d 20 7e 6d 61 73 6b 3b 0a  Flags &= ~mask;.
23cd0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 46 69    }else{.    pFi
23ce0 6c 65 2d 3e 63 74 72 6c 46 6c 61 67 73 20 7c 3d  le->ctrlFlags |=
23cf0 20 6d 61 73 6b 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a   mask;.  }.}../*
23d00 20 46 6f 72 77 61 72 64 20 64 65 63 6c 61 72 61   Forward declara
23d10 74 69 6f 6e 20 2a 2f 0a 73 74 61 74 69 63 20 69  tion */.static i
23d20 6e 74 20 75 6e 69 78 47 65 74 54 65 6d 70 6e 61  nt unixGetTempna
23d30 6d 65 28 69 6e 74 20 6e 42 75 66 2c 20 63 68 61  me(int nBuf, cha
23d40 72 20 2a 7a 42 75 66 29 3b 0a 0a 2f 2a 0a 2a 2a  r *zBuf);../*.**
23d50 20 49 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 6e 64   Information and
23d60 20 63 6f 6e 74 72 6f 6c 20 6f 66 20 61 6e 20 6f   control of an o
23d70 70 65 6e 20 66 69 6c 65 20 68 61 6e 64 6c 65 2e  pen file handle.
23d80 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75  .*/.static int u
23d90 6e 69 78 46 69 6c 65 43 6f 6e 74 72 6f 6c 28 73  nixFileControl(s
23da0 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c  qlite3_file *id,
23db0 20 69 6e 74 20 6f 70 2c 20 76 6f 69 64 20 2a 70   int op, void *p
23dc0 41 72 67 29 7b 0a 20 20 75 6e 69 78 46 69 6c 65  Arg){.  unixFile
23dd0 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46   *pFile = (unixF
23de0 69 6c 65 2a 29 69 64 3b 0a 20 20 73 77 69 74 63  ile*)id;.  switc
23df0 68 28 20 6f 70 20 29 7b 0a 20 20 20 20 63 61 73  h( op ){.    cas
23e00 65 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 4c  e SQLITE_FCNTL_L
23e10 4f 43 4b 53 54 41 54 45 3a 20 7b 0a 20 20 20 20  OCKSTATE: {.    
23e20 20 20 2a 28 69 6e 74 2a 29 70 41 72 67 20 3d 20    *(int*)pArg = 
23e30 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  pFile->eFileLock
23e40 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  ;.      return S
23e50 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a  QLITE_OK;.    }.
23e60 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
23e70 46 43 4e 54 4c 5f 4c 41 53 54 5f 45 52 52 4e 4f  FCNTL_LAST_ERRNO
23e80 3a 20 7b 0a 20 20 20 20 20 20 2a 28 69 6e 74 2a  : {.      *(int*
23e90 29 70 41 72 67 20 3d 20 70 46 69 6c 65 2d 3e 6c  )pArg = pFile->l
23ea0 61 73 74 45 72 72 6e 6f 3b 0a 20 20 20 20 20 20  astErrno;.      
23eb0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
23ec0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
23ed0 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 43 48   SQLITE_FCNTL_CH
23ee0 55 4e 4b 5f 53 49 5a 45 3a 20 7b 0a 20 20 20 20  UNK_SIZE: {.    
23ef0 20 20 70 46 69 6c 65 2d 3e 73 7a 43 68 75 6e 6b    pFile->szChunk
23f00 20 3d 20 2a 28 69 6e 74 20 2a 29 70 41 72 67 3b   = *(int *)pArg;
23f10 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
23f20 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20  LITE_OK;.    }. 
23f30 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46     case SQLITE_F
23f40 43 4e 54 4c 5f 53 49 5a 45 5f 48 49 4e 54 3a 20  CNTL_SIZE_HINT: 
23f50 7b 0a 20 20 20 20 20 20 69 6e 74 20 72 63 3b 0a  {.      int rc;.
23f60 20 20 20 20 20 20 53 69 6d 75 6c 61 74 65 49 4f        SimulateIO
23f70 45 72 72 6f 72 42 65 6e 69 67 6e 28 31 29 3b 0a  ErrorBenign(1);.
23f80 20 20 20 20 20 20 72 63 20 3d 20 66 63 6e 74 6c        rc = fcntl
23f90 53 69 7a 65 48 69 6e 74 28 70 46 69 6c 65 2c 20  SizeHint(pFile, 
23fa0 2a 28 69 36 34 20 2a 29 70 41 72 67 29 3b 0a 20  *(i64 *)pArg);. 
23fb0 20 20 20 20 20 53 69 6d 75 6c 61 74 65 49 4f 45       SimulateIOE
23fc0 72 72 6f 72 42 65 6e 69 67 6e 28 30 29 3b 0a 20  rrorBenign(0);. 
23fd0 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
23fe0 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53      }.    case S
23ff0 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 50 45 52 53  QLITE_FCNTL_PERS
24000 49 53 54 5f 57 41 4c 3a 20 7b 0a 20 20 20 20 20  IST_WAL: {.     
24010 20 75 6e 69 78 4d 6f 64 65 42 69 74 28 70 46 69   unixModeBit(pFi
24020 6c 65 2c 20 55 4e 49 58 46 49 4c 45 5f 50 45 52  le, UNIXFILE_PER
24030 53 49 53 54 5f 57 41 4c 2c 20 28 69 6e 74 2a 29  SIST_WAL, (int*)
24040 70 41 72 67 29 3b 0a 20 20 20 20 20 20 72 65 74  pArg);.      ret
24050 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
24060 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53 51     }.    case SQ
24070 4c 49 54 45 5f 46 43 4e 54 4c 5f 50 4f 57 45 52  LITE_FCNTL_POWER
24080 53 41 46 45 5f 4f 56 45 52 57 52 49 54 45 3a 20  SAFE_OVERWRITE: 
24090 7b 0a 20 20 20 20 20 20 75 6e 69 78 4d 6f 64 65  {.      unixMode
240a0 42 69 74 28 70 46 69 6c 65 2c 20 55 4e 49 58 46  Bit(pFile, UNIXF
240b0 49 4c 45 5f 50 53 4f 57 2c 20 28 69 6e 74 2a 29  ILE_PSOW, (int*)
240c0 70 41 72 67 29 3b 0a 20 20 20 20 20 20 72 65 74  pArg);.      ret
240d0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
240e0 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53 51     }.    case SQ
240f0 4c 49 54 45 5f 46 43 4e 54 4c 5f 56 46 53 4e 41  LITE_FCNTL_VFSNA
24100 4d 45 3a 20 7b 0a 20 20 20 20 20 20 2a 28 63 68  ME: {.      *(ch
24110 61 72 2a 2a 29 70 41 72 67 20 3d 20 73 71 6c 69  ar**)pArg = sqli
24120 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 25 73 22  te3_mprintf("%s"
24130 2c 20 70 46 69 6c 65 2d 3e 70 56 66 73 2d 3e 7a  , pFile->pVfs->z
24140 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 72 65 74  Name);.      ret
24150 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
24160 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53 51     }.    case SQ
24170 4c 49 54 45 5f 46 43 4e 54 4c 5f 54 45 4d 50 46  LITE_FCNTL_TEMPF
24180 49 4c 45 4e 41 4d 45 3a 20 7b 0a 20 20 20 20 20  ILENAME: {.     
24190 20 63 68 61 72 20 2a 7a 54 46 69 6c 65 20 3d 20   char *zTFile = 
241a0 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 36 34  sqlite3_malloc64
241b0 28 20 70 46 69 6c 65 2d 3e 70 56 66 73 2d 3e 6d  ( pFile->pVfs->m
241c0 78 50 61 74 68 6e 61 6d 65 20 29 3b 0a 20 20 20  xPathname );.   
241d0 20 20 20 69 66 28 20 7a 54 46 69 6c 65 20 29 7b     if( zTFile ){
241e0 0a 20 20 20 20 20 20 20 20 75 6e 69 78 47 65 74  .        unixGet
241f0 54 65 6d 70 6e 61 6d 65 28 70 46 69 6c 65 2d 3e  Tempname(pFile->
24200 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65  pVfs->mxPathname
24210 2c 20 7a 54 46 69 6c 65 29 3b 0a 20 20 20 20 20  , zTFile);.     
24220 20 20 20 2a 28 63 68 61 72 2a 2a 29 70 41 72 67     *(char**)pArg
24230 20 3d 20 7a 54 46 69 6c 65 3b 0a 20 20 20 20 20   = zTFile;.     
24240 20 7d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20   }.      return 
24250 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d  SQLITE_OK;.    }
24260 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
24270 5f 46 43 4e 54 4c 5f 48 41 53 5f 4d 4f 56 45 44  _FCNTL_HAS_MOVED
24280 3a 20 7b 0a 20 20 20 20 20 20 2a 28 69 6e 74 2a  : {.      *(int*
24290 29 70 41 72 67 20 3d 20 66 69 6c 65 48 61 73 4d  )pArg = fileHasM
242a0 6f 76 65 64 28 70 46 69 6c 65 29 3b 0a 20 20 20  oved(pFile);.   
242b0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
242c0 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 23 69 66 20 53  _OK;.    }.#if S
242d0 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53  QLITE_MAX_MMAP_S
242e0 49 5a 45 3e 30 0a 20 20 20 20 63 61 73 65 20 53  IZE>0.    case S
242f0 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 4d 4d 41 50  QLITE_FCNTL_MMAP
24300 5f 53 49 5a 45 3a 20 7b 0a 20 20 20 20 20 20 69  _SIZE: {.      i
24310 36 34 20 6e 65 77 4c 69 6d 69 74 20 3d 20 2a 28  64 newLimit = *(
24320 69 36 34 2a 29 70 41 72 67 3b 0a 20 20 20 20 20  i64*)pArg;.     
24330 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
24340 5f 4f 4b 3b 0a 20 20 20 20 20 20 69 66 28 20 6e  _OK;.      if( n
24350 65 77 4c 69 6d 69 74 3e 73 71 6c 69 74 65 33 47  ewLimit>sqlite3G
24360 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6d 78 4d 6d  lobalConfig.mxMm
24370 61 70 20 29 7b 0a 20 20 20 20 20 20 20 20 6e 65  ap ){.        ne
24380 77 4c 69 6d 69 74 20 3d 20 73 71 6c 69 74 65 33  wLimit = sqlite3
24390 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6d 78 4d  GlobalConfig.mxM
243a0 6d 61 70 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  map;.      }.   
243b0 20 20 20 2a 28 69 36 34 2a 29 70 41 72 67 20 3d     *(i64*)pArg =
243c0 20 70 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65   pFile->mmapSize
243d0 4d 61 78 3b 0a 20 20 20 20 20 20 69 66 28 20 6e  Max;.      if( n
243e0 65 77 4c 69 6d 69 74 3e 3d 30 20 26 26 20 6e 65  ewLimit>=0 && ne
243f0 77 4c 69 6d 69 74 21 3d 70 46 69 6c 65 2d 3e 6d  wLimit!=pFile->m
24400 6d 61 70 53 69 7a 65 4d 61 78 20 26 26 20 70 46  mapSizeMax && pF
24410 69 6c 65 2d 3e 6e 46 65 74 63 68 4f 75 74 3d 3d  ile->nFetchOut==
24420 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 46 69  0 ){.        pFi
24430 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 4d 61 78 20  le->mmapSizeMax 
24440 3d 20 6e 65 77 4c 69 6d 69 74 3b 0a 20 20 20 20  = newLimit;.    
24450 20 20 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 6d      if( pFile->m
24460 6d 61 70 53 69 7a 65 3e 30 20 29 7b 0a 20 20 20  mapSize>0 ){.   
24470 20 20 20 20 20 20 20 75 6e 69 78 55 6e 6d 61 70         unixUnmap
24480 66 69 6c 65 28 70 46 69 6c 65 29 3b 0a 20 20 20  file(pFile);.   
24490 20 20 20 20 20 20 20 72 63 20 3d 20 75 6e 69 78         rc = unix
244a0 4d 61 70 66 69 6c 65 28 70 46 69 6c 65 2c 20 2d  Mapfile(pFile, -
244b0 31 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  1);.        }.  
244c0 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65 74 75      }.      retu
244d0 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 23 65 6e  rn rc;.    }.#en
244e0 64 69 66 0a 23 69 66 64 65 66 20 53 51 4c 49 54  dif.#ifdef SQLIT
244f0 45 5f 44 45 42 55 47 0a 20 20 20 20 2f 2a 20 54  E_DEBUG.    /* T
24500 68 65 20 70 61 67 65 72 20 63 61 6c 6c 73 20 74  he pager calls t
24510 68 69 73 20 6d 65 74 68 6f 64 20 74 6f 20 73 69  his method to si
24520 67 6e 61 6c 20 74 68 61 74 20 69 74 20 68 61 73  gnal that it has
24530 20 64 6f 6e 65 0a 20 20 20 20 2a 2a 20 61 20 72   done.    ** a r
24540 6f 6c 6c 62 61 63 6b 20 61 6e 64 20 74 68 61 74  ollback and that
24550 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73   the database is
24560 20 74 68 65 72 65 66 6f 72 65 20 75 6e 63 68 61   therefore uncha
24570 6e 67 65 64 20 61 6e 64 0a 20 20 20 20 2a 2a 20  nged and.    ** 
24580 69 74 20 68 65 6e 63 65 20 69 74 20 69 73 20 4f  it hence it is O
24590 4b 20 66 6f 72 20 74 68 65 20 74 72 61 6e 73 61  K for the transa
245a0 63 74 69 6f 6e 20 63 68 61 6e 67 65 20 63 6f 75  ction change cou
245b0 6e 74 65 72 20 74 6f 20 62 65 0a 20 20 20 20 2a  nter to be.    *
245c0 2a 20 75 6e 63 68 61 6e 67 65 64 2e 0a 20 20 20  * unchanged..   
245d0 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 51 4c   */.    case SQL
245e0 49 54 45 5f 46 43 4e 54 4c 5f 44 42 5f 55 4e 43  ITE_FCNTL_DB_UNC
245f0 48 41 4e 47 45 44 3a 20 7b 0a 20 20 20 20 20 20  HANGED: {.      
24600 28 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 29 2d  ((unixFile*)id)-
24610 3e 64 62 55 70 64 61 74 65 20 3d 20 30 3b 0a 20  >dbUpdate = 0;. 
24620 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
24630 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 23 65 6e  TE_OK;.    }.#en
24640 64 69 66 0a 23 69 66 20 53 51 4c 49 54 45 5f 45  dif.#if SQLITE_E
24650 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54  NABLE_LOCKING_ST
24660 59 4c 45 20 26 26 20 64 65 66 69 6e 65 64 28 5f  YLE && defined(_
24670 5f 41 50 50 4c 45 5f 5f 29 0a 20 20 20 20 63 61  _APPLE__).    ca
24680 73 65 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f  se SQLITE_FCNTL_
24690 53 45 54 5f 4c 4f 43 4b 50 52 4f 58 59 46 49 4c  SET_LOCKPROXYFIL
246a0 45 3a 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  E:.    case SQLI
246b0 54 45 5f 46 43 4e 54 4c 5f 47 45 54 5f 4c 4f 43  TE_FCNTL_GET_LOC
246c0 4b 50 52 4f 58 59 46 49 4c 45 3a 20 7b 0a 20 20  KPROXYFILE: {.  
246d0 20 20 20 20 72 65 74 75 72 6e 20 70 72 6f 78 79      return proxy
246e0 46 69 6c 65 43 6f 6e 74 72 6f 6c 28 69 64 2c 6f  FileControl(id,o
246f0 70 2c 70 41 72 67 29 3b 0a 20 20 20 20 7d 0a 23  p,pArg);.    }.#
24700 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
24710 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53  ENABLE_LOCKING_S
24720 54 59 4c 45 20 26 26 20 64 65 66 69 6e 65 64 28  TYLE && defined(
24730 5f 5f 41 50 50 4c 45 5f 5f 29 20 2a 2f 0a 23 69  __APPLE__) */.#i
24740 66 20 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  f (SQLITE_ENABLE
24750 5f 41 50 50 4c 45 5f 53 50 49 3e 30 29 20 26 26  _APPLE_SPI>0) &&
24760 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45   defined(__APPLE
24770 5f 5f 29 0a 20 20 20 20 63 61 73 65 20 53 51 4c  __).    case SQL
24780 49 54 45 5f 46 43 4e 54 4c 5f 54 52 55 4e 43 41  ITE_FCNTL_TRUNCA
24790 54 45 5f 44 41 54 41 42 41 53 45 3a 20 7b 0a 20  TE_DATABASE: {. 
247a0 20 20 20 20 20 72 65 74 75 72 6e 20 75 6e 69 78       return unix
247b0 54 72 75 6e 63 61 74 65 44 61 74 61 62 61 73 65  TruncateDatabase
247c0 28 70 46 69 6c 65 2c 20 28 70 41 72 67 20 3f 20  (pFile, (pArg ? 
247d0 28 2a 28 69 6e 74 20 2a 29 70 41 72 67 29 20 3a  (*(int *)pArg) :
247e0 20 30 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20   0));.    }.    
247f0 63 61 73 65 20 53 51 4c 49 54 45 5f 46 43 4e 54  case SQLITE_FCNT
24800 4c 5f 52 45 50 4c 41 43 45 5f 44 41 54 41 42 41  L_REPLACE_DATABA
24810 53 45 3a 20 7b 0a 20 20 20 20 20 20 72 65 74 75  SE: {.      retu
24820 72 6e 20 75 6e 69 78 52 65 70 6c 61 63 65 44 61  rn unixReplaceDa
24830 74 61 62 61 73 65 28 70 46 69 6c 65 2c 20 28 73  tabase(pFile, (s
24840 71 6c 69 74 65 33 20 2a 29 70 41 72 67 29 3b 0a  qlite3 *)pArg);.
24850 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53      }.    case S
24860 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 4c 4f 43 4b  QLITE_FCNTL_LOCK
24870 53 54 41 54 45 5f 50 49 44 3a 20 7b 0a 20 20 20  STATE_PID: {.   
24880 20 20 20 4c 6f 63 6b 73 74 61 74 65 50 49 44 20     LockstatePID 
24890 2a 70 4c 6f 63 6b 73 74 61 74 65 3b 0a 20 20 20  *pLockstate;.   
248a0 20 20 20 69 6e 74 20 72 63 3b 0a 20 20 20 20 20     int rc;.     
248b0 20 0a 20 20 20 20 20 20 69 66 28 20 70 41 72 67   .      if( pArg
248c0 3d 3d 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 20 20  ==NULL ){.      
248d0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
248e0 4d 49 53 55 53 45 3b 0a 20 20 20 20 20 20 7d 0a  MISUSE;.      }.
248f0 20 20 20 20 20 20 70 4c 6f 63 6b 73 74 61 74 65        pLockstate
24900 20 3d 20 28 4c 6f 63 6b 73 74 61 74 65 50 49 44   = (LockstatePID
24910 20 2a 29 70 41 72 67 3b 0a 20 20 20 20 20 20 72   *)pArg;.      r
24920 63 20 3d 20 75 6e 69 78 4c 6f 63 6b 73 74 61 74  c = unixLockstat
24930 65 50 69 64 28 70 46 69 6c 65 2c 20 70 4c 6f 63  ePid(pFile, pLoc
24940 6b 73 74 61 74 65 2d 3e 70 69 64 2c 20 26 28 70  kstate->pid, &(p
24950 4c 6f 63 6b 73 74 61 74 65 2d 3e 73 74 61 74 65  Lockstate->state
24960 29 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  ));.      return
24970 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 20   rc;.    }.     
24980 20 0a 23 65 6e 64 69 66 20 2f 2a 20 28 53 51 4c   .#endif /* (SQL
24990 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50 50 4c 45  ITE_ENABLE_APPLE
249a0 5f 53 50 49 3e 30 29 20 26 26 20 64 65 66 69 6e  _SPI>0) && defin
249b0 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 2a 2f  ed(__APPLE__) */
249c0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51  .  }.  return SQ
249d0 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e 44 3b 0a 7d  LITE_NOTFOUND;.}
249e0 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
249f0 68 65 20 73 65 63 74 6f 72 20 73 69 7a 65 20 69  he sector size i
24a00 6e 20 62 79 74 65 73 20 6f 66 20 74 68 65 20 75  n bytes of the u
24a10 6e 64 65 72 6c 79 69 6e 67 20 62 6c 6f 63 6b 20  nderlying block 
24a20 64 65 76 69 63 65 20 66 6f 72 0a 2a 2a 20 74 68  device for.** th
24a30 65 20 73 70 65 63 69 66 69 65 64 20 66 69 6c 65  e specified file
24a40 2e 20 54 68 69 73 20 69 73 20 61 6c 6d 6f 73 74  . This is almost
24a50 20 61 6c 77 61 79 73 20 35 31 32 20 62 79 74 65   always 512 byte
24a60 73 2c 20 62 75 74 20 6d 61 79 20 62 65 0a 2a 2a  s, but may be.**
24a70 20 6c 61 72 67 65 72 20 66 6f 72 20 73 6f 6d 65   larger for some
24a80 20 64 65 76 69 63 65 73 2e 0a 2a 2a 0a 2a 2a 20   devices..**.** 
24a90 53 51 4c 69 74 65 20 63 6f 64 65 20 61 73 73 75  SQLite code assu
24aa0 6d 65 73 20 74 68 69 73 20 66 75 6e 63 74 69 6f  mes this functio
24ab0 6e 20 63 61 6e 6e 6f 74 20 66 61 69 6c 2e 20 49  n cannot fail. I
24ac0 74 20 61 6c 73 6f 20 61 73 73 75 6d 65 73 20 74  t also assumes t
24ad0 68 61 74 0a 2a 2a 20 69 66 20 74 77 6f 20 66 69  hat.** if two fi
24ae0 6c 65 73 20 61 72 65 20 63 72 65 61 74 65 64 20  les are created 
24af0 69 6e 20 74 68 65 20 73 61 6d 65 20 66 69 6c 65  in the same file
24b00 2d 73 79 73 74 65 6d 20 64 69 72 65 63 74 6f 72  -system director
24b10 79 20 28 69 2e 65 2e 0a 2a 2a 20 61 20 64 61 74  y (i.e..** a dat
24b20 61 62 61 73 65 20 61 6e 64 20 69 74 73 20 6a 6f  abase and its jo
24b30 75 72 6e 61 6c 20 66 69 6c 65 29 20 74 68 61 74  urnal file) that
24b40 20 74 68 65 20 73 65 63 74 6f 72 20 73 69 7a 65   the sector size
24b50 20 77 69 6c 6c 20 62 65 20 74 68 65 0a 2a 2a 20   will be the.** 
24b60 73 61 6d 65 20 66 6f 72 20 62 6f 74 68 2e 0a 2a  same for both..*
24b70 2f 0a 23 69 66 6e 64 65 66 20 5f 5f 51 4e 58 4e  /.#ifndef __QNXN
24b80 54 4f 5f 5f 20 0a 73 74 61 74 69 63 20 69 6e 74  TO__ .static int
24b90 20 75 6e 69 78 53 65 63 74 6f 72 53 69 7a 65 28   unixSectorSize(
24ba0 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 4e 6f  sqlite3_file *No
24bb0 74 55 73 65 64 29 7b 0a 20 20 55 4e 55 53 45 44  tUsed){.  UNUSED
24bc0 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f 74 55 73  _PARAMETER(NotUs
24bd0 65 64 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  ed);.  return SQ
24be0 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 53 45 43  LITE_DEFAULT_SEC
24bf0 54 4f 52 5f 53 49 5a 45 3b 0a 7d 0a 23 65 6e 64  TOR_SIZE;.}.#end
24c00 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f  if../*.** The fo
24c10 6c 6c 6f 77 69 6e 67 20 76 65 72 73 69 6f 6e 20  llowing version 
24c20 6f 66 20 75 6e 69 78 53 65 63 74 6f 72 53 69 7a  of unixSectorSiz
24c30 65 28 29 20 69 73 20 6f 70 74 69 6d 69 7a 65 64  e() is optimized
24c40 20 66 6f 72 20 51 4e 58 2e 0a 2a 2f 0a 23 69 66   for QNX..*/.#if
24c50 64 65 66 20 5f 5f 51 4e 58 4e 54 4f 5f 5f 0a 23  def __QNXNTO__.#
24c60 69 6e 63 6c 75 64 65 20 3c 73 79 73 2f 64 63 6d  include <sys/dcm
24c70 64 5f 62 6c 6b 2e 68 3e 0a 23 69 6e 63 6c 75 64  d_blk.h>.#includ
24c80 65 20 3c 73 79 73 2f 73 74 61 74 76 66 73 2e 68  e <sys/statvfs.h
24c90 3e 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69  >.static int uni
24ca0 78 53 65 63 74 6f 72 53 69 7a 65 28 73 71 6c 69  xSectorSize(sqli
24cb0 74 65 33 5f 66 69 6c 65 20 2a 69 64 29 7b 0a 20  te3_file *id){. 
24cc0 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65   unixFile *pFile
24cd0 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64   = (unixFile*)id
24ce0 3b 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 73  ;.  if( pFile->s
24cf0 65 63 74 6f 72 53 69 7a 65 20 3d 3d 20 30 20 29  ectorSize == 0 )
24d00 7b 0a 20 20 20 20 73 74 72 75 63 74 20 73 74 61  {.    struct sta
24d10 74 76 66 73 20 66 73 49 6e 66 6f 3b 0a 20 20 20  tvfs fsInfo;.   
24d20 20 20 20 20 0a 20 20 20 20 2f 2a 20 53 65 74 20      .    /* Set 
24d30 64 65 66 61 75 6c 74 73 20 66 6f 72 20 6e 6f 6e  defaults for non
24d40 2d 73 75 70 70 6f 72 74 65 64 20 66 69 6c 65 73  -supported files
24d50 79 73 74 65 6d 73 20 2a 2f 0a 20 20 20 20 70 46  ystems */.    pF
24d60 69 6c 65 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20  ile->sectorSize 
24d70 3d 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54  = SQLITE_DEFAULT
24d80 5f 53 45 43 54 4f 52 5f 53 49 5a 45 3b 0a 20 20  _SECTOR_SIZE;.  
24d90 20 20 70 46 69 6c 65 2d 3e 64 65 76 69 63 65 43    pFile->deviceC
24da0 68 61 72 61 63 74 65 72 69 73 74 69 63 73 20 3d  haracteristics =
24db0 20 30 3b 0a 20 20 20 20 69 66 28 20 66 73 74 61   0;.    if( fsta
24dc0 74 76 66 73 28 70 46 69 6c 65 2d 3e 68 2c 20 26  tvfs(pFile->h, &
24dd0 66 73 49 6e 66 6f 29 20 3d 3d 20 2d 31 20 29 20  fsInfo) == -1 ) 
24de0 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 70  {.      return p
24df0 46 69 6c 65 2d 3e 73 65 63 74 6f 72 53 69 7a 65  File->sectorSize
24e00 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28  ;.    }..    if(
24e10 20 21 73 74 72 63 6d 70 28 66 73 49 6e 66 6f 2e   !strcmp(fsInfo.
24e20 66 5f 62 61 73 65 74 79 70 65 2c 20 22 74 6d 70  f_basetype, "tmp
24e30 22 29 20 29 20 7b 0a 20 20 20 20 20 20 70 46 69  ") ) {.      pFi
24e40 6c 65 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20 3d  le->sectorSize =
24e50 20 66 73 49 6e 66 6f 2e 66 5f 62 73 69 7a 65 3b   fsInfo.f_bsize;
24e60 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 64 65  .      pFile->de
24e70 76 69 63 65 43 68 61 72 61 63 74 65 72 69 73 74  viceCharacterist
24e80 69 63 73 20 3d 0a 20 20 20 20 20 20 20 20 53 51  ics =.        SQ
24e90 4c 49 54 45 5f 49 4f 43 41 50 5f 41 54 4f 4d 49  LITE_IOCAP_ATOMI
24ea0 43 34 4b 20 7c 20 20 20 20 20 20 20 2f 2a 20 41  C4K |       /* A
24eb0 6c 6c 20 72 61 6d 20 66 69 6c 65 73 79 73 74 65  ll ram filesyste
24ec0 6d 20 77 72 69 74 65 73 20 61 72 65 20 61 74 6f  m writes are ato
24ed0 6d 69 63 20 2a 2f 0a 20 20 20 20 20 20 20 20 53  mic */.        S
24ee0 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53 41 46 45  QLITE_IOCAP_SAFE
24ef0 5f 41 50 50 45 4e 44 20 7c 20 20 20 20 2f 2a 20  _APPEND |    /* 
24f00 67 72 6f 77 69 6e 67 20 74 68 65 20 66 69 6c 65  growing the file
24f10 20 64 6f 65 73 20 6e 6f 74 20 6f 63 63 75 72 20   does not occur 
24f20 75 6e 74 69 6c 0a 20 20 20 20 20 20 20 20 20 20  until.          
24f30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24f40 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74              ** t
24f50 68 65 20 77 72 69 74 65 20 73 75 63 63 65 65 64  he write succeed
24f60 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 53 51 4c  s */.        SQL
24f70 49 54 45 5f 49 4f 43 41 50 5f 53 45 51 55 45 4e  ITE_IOCAP_SEQUEN
24f80 54 49 41 4c 20 7c 20 20 20 20 20 2f 2a 20 54 68  TIAL |     /* Th
24f90 65 20 72 61 6d 20 66 69 6c 65 73 79 73 74 65 6d  e ram filesystem
24fa0 20 68 61 73 20 6e 6f 20 77 72 69 74 65 20 62 65   has no write be
24fb0 68 69 6e 64 0a 20 20 20 20 20 20 20 20 20 20 20  hind.           
24fc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24fd0 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 73 6f             ** so
24fe0 20 69 74 20 69 73 20 6f 72 64 65 72 65 64 20 2a   it is ordered *
24ff0 2f 0a 20 20 20 20 20 20 20 20 30 3b 0a 20 20 20  /.        0;.   
25000 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72 73 74   }else if( strst
25010 72 28 66 73 49 6e 66 6f 2e 66 5f 62 61 73 65 74  r(fsInfo.f_baset
25020 79 70 65 2c 20 22 65 74 66 73 22 29 20 29 7b 0a  ype, "etfs") ){.
25030 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 73 65 63        pFile->sec
25040 74 6f 72 53 69 7a 65 20 3d 20 66 73 49 6e 66 6f  torSize = fsInfo
25050 2e 66 5f 62 73 69 7a 65 3b 0a 20 20 20 20 20 20  .f_bsize;.      
25060 70 46 69 6c 65 2d 3e 64 65 76 69 63 65 43 68 61  pFile->deviceCha
25070 72 61 63 74 65 72 69 73 74 69 63 73 20 3d 0a 20  racteristics =. 
25080 20 20 20 20 20 20 20 2f 2a 20 65 74 66 73 20 63         /* etfs c
25090 6c 75 73 74 65 72 20 73 69 7a 65 20 77 72 69 74  luster size writ
250a0 65 73 20 61 72 65 20 61 74 6f 6d 69 63 20 2a 2f  es are atomic */
250b0 0a 20 20 20 20 20 20 20 20 28 70 46 69 6c 65 2d  .        (pFile-
250c0 3e 73 65 63 74 6f 72 53 69 7a 65 20 2f 20 35 31  >sectorSize / 51
250d0 32 20 2a 20 53 51 4c 49 54 45 5f 49 4f 43 41 50  2 * SQLITE_IOCAP
250e0 5f 41 54 4f 4d 49 43 35 31 32 29 20 7c 0a 20 20  _ATOMIC512) |.  
250f0 20 20 20 20 20 20 53 51 4c 49 54 45 5f 49 4f 43        SQLITE_IOC
25100 41 50 5f 53 41 46 45 5f 41 50 50 45 4e 44 20 7c  AP_SAFE_APPEND |
25110 20 20 20 20 2f 2a 20 67 72 6f 77 69 6e 67 20 74      /* growing t
25120 68 65 20 66 69 6c 65 20 64 6f 65 73 20 6e 6f 74  he file does not
25130 20 6f 63 63 75 72 20 75 6e 74 69 6c 0a 20 20 20   occur until.   
25140 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25150 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25160 20 20 20 2a 2a 20 74 68 65 20 77 72 69 74 65 20     ** the write 
25170 73 75 63 63 65 65 64 73 20 2a 2f 0a 20 20 20 20  succeeds */.    
25180 20 20 20 20 53 51 4c 49 54 45 5f 49 4f 43 41 50      SQLITE_IOCAP
25190 5f 53 45 51 55 45 4e 54 49 41 4c 20 7c 20 20 20  _SEQUENTIAL |   
251a0 20 20 2f 2a 20 54 68 65 20 72 61 6d 20 66 69 6c    /* The ram fil
251b0 65 73 79 73 74 65 6d 20 68 61 73 20 6e 6f 20 77  esystem has no w
251c0 72 69 74 65 20 62 65 68 69 6e 64 0a 20 20 20 20  rite behind.    
251d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
251e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
251f0 20 20 2a 2a 20 73 6f 20 69 74 20 69 73 20 6f 72    ** so it is or
25200 64 65 72 65 64 20 2a 2f 0a 20 20 20 20 20 20 20  dered */.       
25210 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66   0;.    }else if
25220 28 20 21 73 74 72 63 6d 70 28 66 73 49 6e 66 6f  ( !strcmp(fsInfo
25230 2e 66 5f 62 61 73 65 74 79 70 65 2c 20 22 71 6e  .f_basetype, "qn
25240 78 36 22 29 20 29 7b 0a 20 20 20 20 20 20 70 46  x6") ){.      pF
25250 69 6c 65 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20  ile->sectorSize 
25260 3d 20 66 73 49 6e 66 6f 2e 66 5f 62 73 69 7a 65  = fsInfo.f_bsize
25270 3b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 64  ;.      pFile->d
25280 65 76 69 63 65 43 68 61 72 61 63 74 65 72 69 73  eviceCharacteris
25290 74 69 63 73 20 3d 0a 20 20 20 20 20 20 20 20 53  tics =.        S
252a0 51 4c 49 54 45 5f 49 4f 43 41 50 5f 41 54 4f 4d  QLITE_IOCAP_ATOM
252b0 49 43 20 7c 20 20 20 20 20 20 20 20 20 2f 2a 20  IC |         /* 
252c0 41 6c 6c 20 66 69 6c 65 73 79 73 74 65 6d 20 77  All filesystem w
252d0 72 69 74 65 73 20 61 72 65 20 61 74 6f 6d 69 63  rites are atomic
252e0 20 2a 2f 0a 20 20 20 20 20 20 20 20 53 51 4c 49   */.        SQLI
252f0 54 45 5f 49 4f 43 41 50 5f 53 41 46 45 5f 41 50  TE_IOCAP_SAFE_AP
25300 50 45 4e 44 20 7c 20 20 20 20 2f 2a 20 67 72 6f  PEND |    /* gro
25310 77 69 6e 67 20 74 68 65 20 66 69 6c 65 20 64 6f  wing the file do
25320 65 73 20 6e 6f 74 20 6f 63 63 75 72 20 75 6e 74  es not occur unt
25330 69 6c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  il.             
25340 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25350 20 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20           ** the 
25360 77 72 69 74 65 20 73 75 63 63 65 65 64 73 20 2a  write succeeds *
25370 2f 0a 20 20 20 20 20 20 20 20 53 51 4c 49 54 45  /.        SQLITE
25380 5f 49 4f 43 41 50 5f 53 45 51 55 45 4e 54 49 41  _IOCAP_SEQUENTIA
25390 4c 20 7c 20 20 20 20 20 2f 2a 20 54 68 65 20 72  L |     /* The r
253a0 61 6d 20 66 69 6c 65 73 79 73 74 65 6d 20 68 61  am filesystem ha
253b0 73 20 6e 6f 20 77 72 69 74 65 20 62 65 68 69 6e  s no write behin
253c0 64 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d.              
253d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
253e0 20 20 20 20 20 20 20 20 2a 2a 20 73 6f 20 69 74          ** so it
253f0 20 69 73 20 6f 72 64 65 72 65 64 20 2a 2f 0a 20   is ordered */. 
25400 20 20 20 20 20 20 20 30 3b 0a 20 20 20 20 7d 65         0;.    }e
25410 6c 73 65 20 69 66 28 20 21 73 74 72 63 6d 70 28  lse if( !strcmp(
25420 66 73 49 6e 66 6f 2e 66 5f 62 61 73 65 74 79 70  fsInfo.f_basetyp
25430 65 2c 20 22 71 6e 78 34 22 29 20 29 7b 0a 20 20  e, "qnx4") ){.  
25440 20 20 20 20 70 46 69 6c 65 2d 3e 73 65 63 74 6f      pFile->secto
25450 72 53 69 7a 65 20 3d 20 66 73 49 6e 66 6f 2e 66  rSize = fsInfo.f
25460 5f 62 73 69 7a 65 3b 0a 20 20 20 20 20 20 70 46  _bsize;.      pF
25470 69 6c 65 2d 3e 64 65 76 69 63 65 43 68 61 72 61  ile->deviceChara
25480 63 74 65 72 69 73 74 69 63 73 20 3d 0a 20 20 20  cteristics =.   
25490 20 20 20 20 20 2f 2a 20 66 75 6c 6c 20 62 69 74       /* full bit
254a0 73 65 74 20 6f 66 20 61 74 6f 6d 69 63 73 20 66  set of atomics f
254b0 72 6f 6d 20 6d 61 78 20 73 65 63 74 6f 72 20 73  rom max sector s
254c0 69 7a 65 20 61 6e 64 20 73 6d 61 6c 6c 65 72 20  ize and smaller 
254d0 2a 2f 0a 20 20 20 20 20 20 20 20 28 28 70 46 69  */.        ((pFi
254e0 6c 65 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20 2f  le->sectorSize /
254f0 20 35 31 32 20 2a 20 53 51 4c 49 54 45 5f 49 4f   512 * SQLITE_IO
25500 43 41 50 5f 41 54 4f 4d 49 43 35 31 32 29 20 3c  CAP_ATOMIC512) <
25510 3c 20 31 29 20 2d 20 32 20 7c 0a 20 20 20 20 20  < 1) - 2 |.     
25520 20 20 20 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f     SQLITE_IOCAP_
25530 53 45 51 55 45 4e 54 49 41 4c 20 7c 20 20 20 20  SEQUENTIAL |    
25540 20 2f 2a 20 54 68 65 20 72 61 6d 20 66 69 6c 65   /* The ram file
25550 73 79 73 74 65 6d 20 68 61 73 20 6e 6f 20 77 72  system has no wr
25560 69 74 65 20 62 65 68 69 6e 64 0a 20 20 20 20 20  ite behind.     
25570 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25580 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25590 20 2a 2a 20 73 6f 20 69 74 20 69 73 20 6f 72 64   ** so it is ord
255a0 65 72 65 64 20 2a 2f 0a 20 20 20 20 20 20 20 20  ered */.        
255b0 30 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  0;.    }else if(
255c0 20 73 74 72 73 74 72 28 66 73 49 6e 66 6f 2e 66   strstr(fsInfo.f
255d0 5f 62 61 73 65 74 79 70 65 2c 20 22 64 6f 73 22  _basetype, "dos"
255e0 29 20 29 7b 0a 20 20 20 20 20 20 70 46 69 6c 65  ) ){.      pFile
255f0 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20 3d 20 66  ->sectorSize = f
25600 73 49 6e 66 6f 2e 66 5f 62 73 69 7a 65 3b 0a 20  sInfo.f_bsize;. 
25610 20 20 20 20 20 70 46 69 6c 65 2d 3e 64 65 76 69       pFile->devi
25620 63 65 43 68 61 72 61 63 74 65 72 69 73 74 69 63  ceCharacteristic
25630 73 20 3d 0a 20 20 20 20 20 20 20 20 2f 2a 20 66  s =.        /* f
25640 75 6c 6c 20 62 69 74 73 65 74 20 6f 66 20 61 74  ull bitset of at
25650 6f 6d 69 63 73 20 66 72 6f 6d 20 6d 61 78 20 73  omics from max s
25660 65 63 74 6f 72 20 73 69 7a 65 20 61 6e 64 20 73  ector size and s
25670 6d 61 6c 6c 65 72 20 2a 2f 0a 20 20 20 20 20 20  maller */.      
25680 20 20 28 28 70 46 69 6c 65 2d 3e 73 65 63 74 6f    ((pFile->secto
25690 72 53 69 7a 65 20 2f 20 35 31 32 20 2a 20 53 51  rSize / 512 * SQ
256a0 4c 49 54 45 5f 49 4f 43 41 50 5f 41 54 4f 4d 49  LITE_IOCAP_ATOMI
256b0 43 35 31 32 29 20 3c 3c 20 31 29 20 2d 20 32 20  C512) << 1) - 2 
256c0 7c 0a 20 20 20 20 20 20 20 20 53 51 4c 49 54 45  |.        SQLITE
256d0 5f 49 4f 43 41 50 5f 53 45 51 55 45 4e 54 49 41  _IOCAP_SEQUENTIA
256e0 4c 20 7c 20 20 20 20 20 2f 2a 20 54 68 65 20 72  L |     /* The r
256f0 61 6d 20 66 69 6c 65 73 79 73 74 65 6d 20 68 61  am filesystem ha
25700 73 20 6e 6f 20 77 72 69 74 65 20 62 65 68 69 6e  s no write behin
25710 64 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d.              
25720 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25730 20 20 20 20 20 20 20 20 2a 2a 20 73 6f 20 69 74          ** so it
25740 20 69 73 20 6f 72 64 65 72 65 64 20 2a 2f 0a 20   is ordered */. 
25750 20 20 20 20 20 20 20 30 3b 0a 20 20 20 20 7d 65         0;.    }e
25760 6c 73 65 7b 0a 20 20 20 20 20 20 70 46 69 6c 65  lse{.      pFile
25770 2d 3e 64 65 76 69 63 65 43 68 61 72 61 63 74 65  ->deviceCharacte
25780 72 69 73 74 69 63 73 20 3d 0a 20 20 20 20 20 20  ristics =.      
25790 20 20 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 41    SQLITE_IOCAP_A
257a0 54 4f 4d 49 43 35 31 32 20 7c 20 20 20 20 20 20  TOMIC512 |      
257b0 2f 2a 20 62 6c 6f 63 6b 73 20 61 72 65 20 61 74  /* blocks are at
257c0 6f 6d 69 63 20 2a 2f 0a 20 20 20 20 20 20 20 20  omic */.        
257d0 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53 41 46  SQLITE_IOCAP_SAF
257e0 45 5f 41 50 50 45 4e 44 20 7c 20 20 20 20 2f 2a  E_APPEND |    /*
257f0 20 67 72 6f 77 69 6e 67 20 74 68 65 20 66 69 6c   growing the fil
25800 65 20 64 6f 65 73 20 6e 6f 74 20 6f 63 63 75 72  e does not occur
25810 20 75 6e 74 69 6c 0a 20 20 20 20 20 20 20 20 20   until.         
25820 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25830 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20               ** 
25840 74 68 65 20 77 72 69 74 65 20 73 75 63 63 65 65  the write succee
25850 64 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 30 3b  ds */.        0;
25860 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 2f 2a 20  .    }.  }.  /* 
25870 4c 61 73 74 20 63 68 61 6e 63 65 20 76 65 72 69  Last chance veri
25880 66 69 63 61 74 69 6f 6e 2e 20 20 49 66 20 74 68  fication.  If th
25890 65 20 73 65 63 74 6f 72 20 73 69 7a 65 20 69 73  e sector size is
258a0 6e 27 74 20 61 20 6d 75 6c 74 69 70 6c 65 20 6f  n't a multiple o
258b0 66 20 35 31 32 0a 20 20 2a 2a 20 74 68 65 6e 20  f 512.  ** then 
258c0 69 74 20 69 73 6e 27 74 20 76 61 6c 69 64 2e 2a  it isn't valid.*
258d0 2f 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 73  /.  if( pFile->s
258e0 65 63 74 6f 72 53 69 7a 65 20 25 20 35 31 32 20  ectorSize % 512 
258f0 21 3d 20 30 20 29 7b 0a 20 20 20 20 70 46 69 6c  != 0 ){.    pFil
25900 65 2d 3e 64 65 76 69 63 65 43 68 61 72 61 63 74  e->deviceCharact
25910 65 72 69 73 74 69 63 73 20 3d 20 30 3b 0a 20 20  eristics = 0;.  
25920 20 20 70 46 69 6c 65 2d 3e 73 65 63 74 6f 72 53    pFile->sectorS
25930 69 7a 65 20 3d 20 53 51 4c 49 54 45 5f 44 45 46  ize = SQLITE_DEF
25940 41 55 4c 54 5f 53 45 43 54 4f 52 5f 53 49 5a 45  AULT_SECTOR_SIZE
25950 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70  ;.  }.  return p
25960 46 69 6c 65 2d 3e 73 65 63 74 6f 72 53 69 7a 65  File->sectorSize
25970 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 5f 5f  ;.}.#endif /* __
25980 51 4e 58 4e 54 4f 5f 5f 20 2a 2f 0a 0a 2f 2a 0a  QNXNTO__ */../*.
25990 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 64 65  ** Return the de
259a0 76 69 63 65 20 63 68 61 72 61 63 74 65 72 69 73  vice characteris
259b0 74 69 63 73 20 66 6f 72 20 74 68 65 20 66 69 6c  tics for the fil
259c0 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 56 46  e..**.** This VF
259d0 53 20 69 73 20 73 65 74 20 75 70 20 74 6f 20 72  S is set up to r
259e0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 43  eturn SQLITE_IOC
259f0 41 50 5f 50 4f 57 45 52 53 41 46 45 5f 4f 56 45  AP_POWERSAFE_OVE
25a00 52 57 52 49 54 45 20 62 79 20 64 65 66 61 75 6c  RWRITE by defaul
25a10 74 2e 0a 2a 2a 20 48 6f 77 65 76 65 72 2c 20 74  t..** However, t
25a20 68 61 74 20 63 68 6f 69 63 65 20 69 73 20 63 6f  hat choice is co
25a30 6e 74 72 6f 76 65 72 73 69 61 6c 20 73 69 6e 63  ntroversial sinc
25a40 65 20 74 65 63 68 6e 69 63 61 6c 6c 79 20 74 68  e technically th
25a50 65 20 75 6e 64 65 72 6c 79 69 6e 67 0a 2a 2a 20  e underlying.** 
25a60 66 69 6c 65 20 73 79 73 74 65 6d 20 64 6f 65 73  file system does
25a70 20 6e 6f 74 20 61 6c 77 61 79 73 20 70 72 6f 76   not always prov
25a80 69 64 65 20 70 6f 77 65 72 73 61 66 65 20 6f 76  ide powersafe ov
25a90 65 72 77 72 69 74 65 73 2e 20 20 28 49 6e 20 6f  erwrites.  (In o
25aa0 74 68 65 72 0a 2a 2a 20 77 6f 72 64 73 2c 20 61  ther.** words, a
25ab0 66 74 65 72 20 61 20 70 6f 77 65 72 2d 6c 6f 73  fter a power-los
25ac0 73 20 65 76 65 6e 74 2c 20 70 61 72 74 73 20 6f  s event, parts o
25ad0 66 20 74 68 65 20 66 69 6c 65 20 74 68 61 74 20  f the file that 
25ae0 77 65 72 65 20 6e 65 76 65 72 0a 2a 2a 20 77 72  were never.** wr
25af0 69 74 74 65 6e 20 6d 69 67 68 74 20 65 6e 64 20  itten might end 
25b00 75 70 20 62 65 69 6e 67 20 61 6c 74 65 72 65 64  up being altered
25b10 2e 29 20 20 48 6f 77 65 76 65 72 2c 20 6e 6f 6e  .)  However, non
25b20 2d 50 53 4f 57 20 62 65 68 61 76 69 6f 72 20 69  -PSOW behavior i
25b30 73 20 76 65 72 79 2c 0a 2a 2a 20 76 65 72 79 20  s very,.** very 
25b40 72 61 72 65 2e 20 20 41 6e 64 20 61 73 73 65 72  rare.  And asser
25b50 74 69 6e 67 20 50 53 4f 57 20 6d 61 6b 65 73 20  ting PSOW makes 
25b60 61 20 6c 61 72 67 65 20 72 65 64 75 63 74 69 6f  a large reductio
25b70 6e 20 69 6e 20 74 68 65 20 61 6d 6f 75 6e 74 0a  n in the amount.
25b80 2a 2a 20 6f 66 20 72 65 71 75 69 72 65 64 20 49  ** of required I
25b90 2f 4f 20 66 6f 72 20 6a 6f 75 72 6e 61 6c 69 6e  /O for journalin
25ba0 67 2c 20 73 69 6e 63 65 20 61 20 6c 6f 74 20 6f  g, since a lot o
25bb0 66 20 70 61 64 64 69 6e 67 20 69 73 20 65 6c 69  f padding is eli
25bc0 6d 69 6e 61 74 65 64 2e 0a 2a 2a 20 20 48 65 6e  minated..**  Hen
25bd0 63 65 2c 20 77 68 69 6c 65 20 50 4f 57 45 52 53  ce, while POWERS
25be0 41 46 45 5f 4f 56 45 52 57 52 49 54 45 20 69 73  AFE_OVERWRITE is
25bf0 20 6f 6e 20 62 79 20 64 65 66 61 75 6c 74 2c 20   on by default, 
25c00 74 68 65 72 65 20 69 73 20 61 20 66 69 6c 65 2d  there is a file-
25c10 63 6f 6e 74 72 6f 6c 0a 2a 2a 20 61 76 61 69 6c  control.** avail
25c20 61 62 6c 65 20 74 6f 20 74 75 72 6e 20 69 74 20  able to turn it 
25c30 6f 66 66 20 61 6e 64 20 55 52 49 20 71 75 65 72  off and URI quer
25c40 79 20 70 61 72 61 6d 65 74 65 72 20 61 76 61 69  y parameter avai
25c50 6c 61 62 6c 65 20 74 6f 20 74 75 72 6e 20 69 74  lable to turn it
25c60 20 6f 66 66 2e 0a 2a 2f 0a 73 74 61 74 69 63 20   off..*/.static 
25c70 69 6e 74 20 75 6e 69 78 44 65 76 69 63 65 43 68  int unixDeviceCh
25c80 61 72 61 63 74 65 72 69 73 74 69 63 73 28 73 71  aracteristics(sq
25c90 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 29 7b  lite3_file *id){
25ca0 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 20 3d  .  unixFile *p =
25cb0 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a   (unixFile*)id;.
25cc0 20 20 69 6e 74 20 72 63 20 3d 20 30 3b 0a 23 69    int rc = 0;.#i
25cd0 66 64 65 66 20 5f 5f 51 4e 58 4e 54 4f 5f 5f 0a  fdef __QNXNTO__.
25ce0 20 20 69 66 28 20 70 2d 3e 73 65 63 74 6f 72 53    if( p->sectorS
25cf0 69 7a 65 3d 3d 30 20 29 20 75 6e 69 78 53 65 63  ize==0 ) unixSec
25d00 74 6f 72 53 69 7a 65 28 69 64 29 3b 0a 20 20 72  torSize(id);.  r
25d10 63 20 3d 20 70 2d 3e 64 65 76 69 63 65 43 68 61  c = p->deviceCha
25d20 72 61 63 74 65 72 69 73 74 69 63 73 3b 0a 23 65  racteristics;.#e
25d30 6e 64 69 66 0a 20 20 69 66 28 20 70 2d 3e 63 74  ndif.  if( p->ct
25d40 72 6c 46 6c 61 67 73 20 26 20 55 4e 49 58 46 49  rlFlags & UNIXFI
25d50 4c 45 5f 50 53 4f 57 20 29 7b 0a 20 20 20 20 72  LE_PSOW ){.    r
25d60 63 20 7c 3d 20 53 51 4c 49 54 45 5f 49 4f 43 41  c |= SQLITE_IOCA
25d70 50 5f 50 4f 57 45 52 53 41 46 45 5f 4f 56 45 52  P_POWERSAFE_OVER
25d80 57 52 49 54 45 3b 0a 20 20 7d 0a 20 20 72 65 74  WRITE;.  }.  ret
25d90 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 20 21  urn rc;.}..#if !
25da0 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
25db0 4d 49 54 5f 57 41 4c 29 20 7c 7c 20 53 51 4c 49  MIT_WAL) || SQLI
25dc0 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45  TE_MAX_MMAP_SIZE
25dd0 3e 30 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  >0../*.** Return
25de0 20 74 68 65 20 73 79 73 74 65 6d 20 70 61 67 65   the system page
25df0 20 73 69 7a 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69   size..**.** Thi
25e00 73 20 66 75 6e 63 74 69 6f 6e 20 73 68 6f 75 6c  s function shoul
25e10 64 20 6e 6f 74 20 62 65 20 63 61 6c 6c 65 64 20  d not be called 
25e20 64 69 72 65 63 74 6c 79 20 62 79 20 6f 74 68 65  directly by othe
25e30 72 20 63 6f 64 65 20 69 6e 20 74 68 69 73 20 66  r code in this f
25e40 69 6c 65 2e 20 0a 2a 2a 20 49 6e 73 74 65 61 64  ile. .** Instead
25e50 2c 20 69 74 20 73 68 6f 75 6c 64 20 62 65 20 63  , it should be c
25e60 61 6c 6c 65 64 20 76 69 61 20 6d 61 63 72 6f 20  alled via macro 
25e70 6f 73 47 65 74 70 61 67 65 73 69 7a 65 28 29 2e  osGetpagesize().
25e80 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75  .*/.static int u
25e90 6e 69 78 47 65 74 70 61 67 65 73 69 7a 65 28 76  nixGetpagesize(v
25ea0 6f 69 64 29 7b 0a 23 69 66 20 4f 53 5f 56 58 57  oid){.#if OS_VXW
25eb0 4f 52 4b 53 0a 20 20 72 65 74 75 72 6e 20 31 30  ORKS.  return 10
25ec0 32 34 3b 0a 23 65 6c 69 66 20 64 65 66 69 6e 65  24;.#elif define
25ed0 64 28 5f 42 53 44 5f 53 4f 55 52 43 45 29 0a 20  d(_BSD_SOURCE). 
25ee0 20 72 65 74 75 72 6e 20 67 65 74 70 61 67 65 73   return getpages
25ef0 69 7a 65 28 29 3b 0a 23 65 6c 73 65 0a 20 20 72  ize();.#else.  r
25f00 65 74 75 72 6e 20 28 69 6e 74 29 73 79 73 63 6f  eturn (int)sysco
25f10 6e 66 28 5f 53 43 5f 50 41 47 45 53 49 5a 45 29  nf(_SC_PAGESIZE)
25f20 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 23 65 6e 64  ;.#endif.}..#end
25f30 69 66 20 2f 2a 20 21 64 65 66 69 6e 65 64 28 53  if /* !defined(S
25f40 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 29 20  QLITE_OMIT_WAL) 
25f50 7c 7c 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d  || SQLITE_MAX_MM
25f60 41 50 5f 53 49 5a 45 3e 30 20 2a 2f 0a 0a 23 69  AP_SIZE>0 */..#i
25f70 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
25f80 54 5f 57 41 4c 0a 0a 2f 2a 0a 2a 2a 20 4f 62 6a  T_WAL../*.** Obj
25f90 65 63 74 20 75 73 65 64 20 74 6f 20 72 65 70 72  ect used to repr
25fa0 65 73 65 6e 74 20 61 6e 20 73 68 61 72 65 64 20  esent an shared 
25fb0 6d 65 6d 6f 72 79 20 62 75 66 66 65 72 2e 20 20  memory buffer.  
25fc0 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 6d 75 6c 74  .**.** When mult
25fd0 69 70 6c 65 20 74 68 72 65 61 64 73 20 61 6c 6c  iple threads all
25fe0 20 72 65 66 65 72 65 6e 63 65 20 74 68 65 20 73   reference the s
25ff0 61 6d 65 20 77 61 6c 2d 69 6e 64 65 78 2c 20 65  ame wal-index, e
26000 61 63 68 20 74 68 72 65 61 64 0a 2a 2a 20 68 61  ach thread.** ha
26010 73 20 69 74 73 20 6f 77 6e 20 75 6e 69 78 53 68  s its own unixSh
26020 6d 20 6f 62 6a 65 63 74 2c 20 62 75 74 20 74 68  m object, but th
26030 65 79 20 61 6c 6c 20 70 6f 69 6e 74 20 74 6f 20  ey all point to 
26040 61 20 73 69 6e 67 6c 65 20 69 6e 73 74 61 6e 63  a single instanc
26050 65 0a 2a 2a 20 6f 66 20 74 68 69 73 20 75 6e 69  e.** of this uni
26060 78 53 68 6d 4e 6f 64 65 20 6f 62 6a 65 63 74 2e  xShmNode object.
26070 20 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73    In other words
26080 2c 20 65 61 63 68 20 77 61 6c 2d 69 6e 64 65 78  , each wal-index
26090 20 69 73 20 6f 70 65 6e 65 64 0a 2a 2a 20 6f 6e   is opened.** on
260a0 6c 79 20 6f 6e 63 65 20 70 65 72 20 70 72 6f 63  ly once per proc
260b0 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 45 61 63 68 20  ess..**.** Each 
260c0 75 6e 69 78 53 68 6d 4e 6f 64 65 20 6f 62 6a 65  unixShmNode obje
260d0 63 74 20 69 73 20 63 6f 6e 6e 65 63 74 65 64 20  ct is connected 
260e0 74 6f 20 61 20 73 69 6e 67 6c 65 20 75 6e 69 78  to a single unix
260f0 49 6e 6f 64 65 49 6e 66 6f 20 6f 62 6a 65 63 74  InodeInfo object
26100 2e 0a 2a 2a 20 57 65 20 63 6f 75 6c 64 20 63 6f  ..** We could co
26110 61 6c 65 73 63 65 20 74 68 69 73 20 6f 62 6a 65  alesce this obje
26120 63 74 20 69 6e 74 6f 20 75 6e 69 78 49 6e 6f 64  ct into unixInod
26130 65 49 6e 66 6f 2c 20 62 75 74 20 74 68 61 74 20  eInfo, but that 
26140 77 6f 75 6c 64 20 6d 65 61 6e 0a 2a 2a 20 65 76  would mean.** ev
26150 65 72 79 20 6f 70 65 6e 20 66 69 6c 65 20 74 68  ery open file th
26160 61 74 20 64 6f 65 73 20 6e 6f 74 20 75 73 65 20  at does not use 
26170 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 28 69  shared memory (i
26180 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 6d  n other words, m
26190 6f 73 74 0a 2a 2a 20 6f 70 65 6e 20 66 69 6c 65  ost.** open file
261a0 73 29 20 77 6f 75 6c 64 20 68 61 76 65 20 74 6f  s) would have to
261b0 20 63 61 72 72 79 20 61 72 6f 75 6e 64 20 74 68   carry around th
261c0 69 73 20 65 78 74 72 61 20 69 6e 66 6f 72 6d 61  is extra informa
261d0 74 69 6f 6e 2e 20 20 53 6f 0a 2a 2a 20 74 68 65  tion.  So.** the
261e0 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 6f   unixInodeInfo o
261f0 62 6a 65 63 74 20 63 6f 6e 74 61 69 6e 73 20 61  bject contains a
26200 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 69 73   pointer to this
26210 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20 6f 62 6a   unixShmNode obj
26220 65 63 74 0a 2a 2a 20 61 6e 64 20 74 68 65 20 75  ect.** and the u
26230 6e 69 78 53 68 6d 4e 6f 64 65 20 6f 62 6a 65 63  nixShmNode objec
26240 74 20 69 73 20 63 72 65 61 74 65 64 20 6f 6e 6c  t is created onl
26250 79 20 77 68 65 6e 20 6e 65 65 64 65 64 2e 0a 2a  y when needed..*
26260 2a 0a 2a 2a 20 75 6e 69 78 4d 75 74 65 78 48 65  *.** unixMutexHe
26270 6c 64 28 29 20 6d 75 73 74 20 62 65 20 74 72 75  ld() must be tru
26280 65 20 77 68 65 6e 20 63 72 65 61 74 69 6e 67 20  e when creating 
26290 6f 72 20 64 65 73 74 72 6f 79 69 6e 67 0a 2a 2a  or destroying.**
262a0 20 74 68 69 73 20 6f 62 6a 65 63 74 20 6f 72 20   this object or 
262b0 77 68 69 6c 65 20 72 65 61 64 69 6e 67 20 6f 72  while reading or
262c0 20 77 72 69 74 69 6e 67 20 74 68 65 20 66 6f 6c   writing the fol
262d0 6c 6f 77 69 6e 67 20 66 69 65 6c 64 73 3a 0a 2a  lowing fields:.*
262e0 2a 0a 2a 2a 20 20 20 20 20 20 6e 52 65 66 0a 2a  *.**      nRef.*
262f0 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69  *.** The followi
26300 6e 67 20 66 69 65 6c 64 73 20 61 72 65 20 72 65  ng fields are re
26310 61 64 2d 6f 6e 6c 79 20 61 66 74 65 72 20 74 68  ad-only after th
26320 65 20 6f 62 6a 65 63 74 20 69 73 20 63 72 65 61  e object is crea
26330 74 65 64 3a 0a 2a 2a 20 0a 2a 2a 20 20 20 20 20  ted:.** .**     
26340 20 66 69 64 0a 2a 2a 20 20 20 20 20 20 7a 46 69   fid.**      zFi
26350 6c 65 6e 61 6d 65 0a 2a 2a 0a 2a 2a 20 45 69 74  lename.**.** Eit
26360 68 65 72 20 75 6e 69 78 53 68 6d 4e 6f 64 65 2e  her unixShmNode.
26370 6d 75 74 65 78 20 6d 75 73 74 20 62 65 20 68 65  mutex must be he
26380 6c 64 20 6f 72 20 75 6e 69 78 53 68 6d 4e 6f 64  ld or unixShmNod
26390 65 2e 6e 52 65 66 3d 3d 30 20 61 6e 64 0a 2a 2a  e.nRef==0 and.**
263a0 20 75 6e 69 78 4d 75 74 65 78 48 65 6c 64 28 29   unixMutexHeld()
263b0 20 69 73 20 74 72 75 65 20 77 68 65 6e 20 72 65   is true when re
263c0 61 64 69 6e 67 20 6f 72 20 77 72 69 74 69 6e 67  ading or writing
263d0 20 61 6e 79 20 6f 74 68 65 72 20 66 69 65 6c 64   any other field
263e0 0a 2a 2a 20 69 6e 20 74 68 69 73 20 73 74 72 75  .** in this stru
263f0 63 74 75 72 65 2e 0a 2a 2f 0a 73 74 72 75 63 74  cture..*/.struct
26400 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20 7b 0a 20   unixShmNode {. 
26410 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 2a   unixInodeInfo *
26420 70 49 6e 6f 64 65 3b 20 20 20 20 20 2f 2a 20 75  pInode;     /* u
26430 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 74 68 61  nixInodeInfo tha
26440 74 20 6f 77 6e 73 20 74 68 69 73 20 53 48 4d 20  t owns this SHM 
26450 6e 6f 64 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65  node */.  sqlite
26460 33 5f 6d 75 74 65 78 20 2a 6d 75 74 65 78 3b 20  3_mutex *mutex; 
26470 20 20 20 20 20 2f 2a 20 4d 75 74 65 78 20 74 6f       /* Mutex to
26480 20 61 63 63 65 73 73 20 74 68 69 73 20 6f 62 6a   access this obj
26490 65 63 74 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a  ect */.  char *z
264a0 46 69 6c 65 6e 61 6d 65 3b 20 20 20 20 20 20 20  Filename;       
264b0 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74      /* Name of t
264c0 68 65 20 6d 6d 61 70 70 65 64 20 66 69 6c 65 20  he mmapped file 
264d0 2a 2f 0a 20 20 69 6e 74 20 68 3b 20 20 20 20 20  */.  int h;     
264e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
264f0 2f 2a 20 4f 70 65 6e 20 66 69 6c 65 20 64 65 73  /* Open file des
26500 63 72 69 70 74 6f 72 20 2a 2f 0a 20 20 69 6e 74  criptor */.  int
26510 20 73 7a 52 65 67 69 6f 6e 3b 20 20 20 20 20 20   szRegion;      
26520 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20          /* Size 
26530 6f 66 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79  of shared-memory
26540 20 72 65 67 69 6f 6e 73 20 2a 2f 0a 20 20 75 31   regions */.  u1
26550 36 20 6e 52 65 67 69 6f 6e 3b 20 20 20 20 20 20  6 nRegion;      
26560 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65           /* Size
26570 20 6f 66 20 61 72 72 61 79 20 61 70 52 65 67 69   of array apRegi
26580 6f 6e 20 2a 2f 0a 20 20 75 38 20 69 73 52 65 61  on */.  u8 isRea
26590 64 6f 6e 6c 79 3b 20 20 20 20 20 20 20 20 20 20  donly;          
265a0 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 72 65     /* True if re
265b0 61 64 2d 6f 6e 6c 79 20 2a 2f 0a 20 20 63 68 61  ad-only */.  cha
265c0 72 20 2a 2a 61 70 52 65 67 69 6f 6e 3b 20 20 20  r **apRegion;   
265d0 20 20 20 20 20 20 20 20 2f 2a 20 41 72 72 61 79          /* Array
265e0 20 6f 66 20 6d 61 70 70 65 64 20 73 68 61 72 65   of mapped share
265f0 64 2d 6d 65 6d 6f 72 79 20 72 65 67 69 6f 6e 73  d-memory regions
26600 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 66 3b 20   */.  int nRef; 
26610 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26620 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 75 6e   /* Number of un
26630 69 78 53 68 6d 20 6f 62 6a 65 63 74 73 20 70 6f  ixShm objects po
26640 69 6e 74 69 6e 67 20 74 6f 20 74 68 69 73 20 2a  inting to this *
26650 2f 0a 20 20 75 6e 69 78 53 68 6d 20 2a 70 46 69  /.  unixShm *pFi
26660 72 73 74 3b 20 20 20 20 20 20 20 20 20 20 20 2f  rst;           /
26670 2a 20 41 6c 6c 20 75 6e 69 78 53 68 6d 20 6f 62  * All unixShm ob
26680 6a 65 63 74 73 20 70 6f 69 6e 74 69 6e 67 20 74  jects pointing t
26690 6f 20 74 68 69 73 20 2a 2f 0a 23 69 66 64 65 66  o this */.#ifdef
266a0 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20   SQLITE_DEBUG.  
266b0 75 38 20 65 78 63 6c 4d 61 73 6b 3b 20 20 20 20  u8 exclMask;    
266c0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61             /* Ma
266d0 73 6b 20 6f 66 20 65 78 63 6c 75 73 69 76 65 20  sk of exclusive 
266e0 6c 6f 63 6b 73 20 68 65 6c 64 20 2a 2f 0a 20 20  locks held */.  
266f0 75 38 20 73 68 61 72 65 64 4d 61 73 6b 3b 20 20  u8 sharedMask;  
26700 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61             /* Ma
26710 73 6b 20 6f 66 20 73 68 61 72 65 64 20 6c 6f 63  sk of shared loc
26720 6b 73 20 68 65 6c 64 20 2a 2f 0a 20 20 75 38 20  ks held */.  u8 
26730 6e 65 78 74 53 68 6d 49 64 3b 20 20 20 20 20 20  nextShmId;      
26740 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 78 74 20          /* Next 
26750 61 76 61 69 6c 61 62 6c 65 20 75 6e 69 78 53 68  available unixSh
26760 6d 2e 69 64 20 76 61 6c 75 65 20 2a 2f 0a 23 65  m.id value */.#e
26770 6e 64 69 66 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 53  ndif.};../*.** S
26780 74 72 75 63 74 75 72 65 20 75 73 65 64 20 69 6e  tructure used in
26790 74 65 72 6e 61 6c 6c 79 20 62 79 20 74 68 69 73  ternally by this
267a0 20 56 46 53 20 74 6f 20 72 65 63 6f 72 64 20 74   VFS to record t
267b0 68 65 20 73 74 61 74 65 20 6f 66 20 61 6e 0a 2a  he state of an.*
267c0 2a 20 6f 70 65 6e 20 73 68 61 72 65 64 20 6d 65  * open shared me
267d0 6d 6f 72 79 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e  mory connection.
267e0 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f  .**.** The follo
267f0 77 69 6e 67 20 66 69 65 6c 64 73 20 61 72 65 20  wing fields are 
26800 69 6e 69 74 69 61 6c 69 7a 65 64 20 77 68 65 6e  initialized when
26810 20 74 68 69 73 20 6f 62 6a 65 63 74 20 69 73 20   this object is 
26820 63 72 65 61 74 65 64 20 61 6e 64 0a 2a 2a 20 61  created and.** a
26830 72 65 20 72 65 61 64 2d 6f 6e 6c 79 20 74 68 65  re read-only the
26840 72 65 61 66 74 65 72 3a 0a 2a 2a 0a 2a 2a 20 20  reafter:.**.**  
26850 20 20 75 6e 69 78 53 68 6d 2e 70 46 69 6c 65 0a    unixShm.pFile.
26860 2a 2a 20 20 20 20 75 6e 69 78 53 68 6d 2e 69 64  **    unixShm.id
26870 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 6f 74 68 65 72  .**.** All other
26880 20 66 69 65 6c 64 73 20 61 72 65 20 72 65 61 64   fields are read
26890 2f 77 72 69 74 65 2e 20 20 54 68 65 20 75 6e 69  /write.  The uni
268a0 78 53 68 6d 2e 70 46 69 6c 65 2d 3e 6d 75 74 65  xShm.pFile->mute
268b0 78 20 6d 75 73 74 20 62 65 20 68 65 6c 64 0a 2a  x must be held.*
268c0 2a 20 77 68 69 6c 65 20 61 63 63 65 73 73 69 6e  * while accessin
268d0 67 20 61 6e 79 20 72 65 61 64 2f 77 72 69 74 65  g any read/write
268e0 20 66 69 65 6c 64 73 2e 0a 2a 2f 0a 73 74 72 75   fields..*/.stru
268f0 63 74 20 75 6e 69 78 53 68 6d 20 7b 0a 20 20 75  ct unixShm {.  u
26900 6e 69 78 53 68 6d 4e 6f 64 65 20 2a 70 53 68 6d  nixShmNode *pShm
26910 4e 6f 64 65 3b 20 20 20 20 20 2f 2a 20 54 68 65  Node;     /* The
26920 20 75 6e 64 65 72 6c 79 69 6e 67 20 75 6e 69 78   underlying unix
26930 53 68 6d 4e 6f 64 65 20 6f 62 6a 65 63 74 20 2a  ShmNode object *
26940 2f 0a 20 20 75 6e 69 78 53 68 6d 20 2a 70 4e 65  /.  unixShm *pNe
26950 78 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  xt;            /
26960 2a 20 4e 65 78 74 20 75 6e 69 78 53 68 6d 20 77  * Next unixShm w
26970 69 74 68 20 74 68 65 20 73 61 6d 65 20 75 6e 69  ith the same uni
26980 78 53 68 6d 4e 6f 64 65 20 2a 2f 0a 20 20 75 38  xShmNode */.  u8
26990 20 68 61 73 4d 75 74 65 78 3b 20 20 20 20 20 20   hasMutex;      
269a0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
269b0 20 69 66 20 68 6f 6c 64 69 6e 67 20 74 68 65 20   if holding the 
269c0 75 6e 69 78 53 68 6d 4e 6f 64 65 20 6d 75 74 65  unixShmNode mute
269d0 78 20 2a 2f 0a 20 20 75 38 20 69 64 3b 20 20 20  x */.  u8 id;   
269e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
269f0 20 20 2f 2a 20 49 64 20 6f 66 20 74 68 69 73 20    /* Id of this 
26a00 63 6f 6e 6e 65 63 74 69 6f 6e 20 77 69 74 68 69  connection withi
26a10 6e 20 69 74 73 20 75 6e 69 78 53 68 6d 4e 6f 64  n its unixShmNod
26a20 65 20 2a 2f 0a 20 20 75 31 36 20 73 68 61 72 65  e */.  u16 share
26a30 64 4d 61 73 6b 3b 20 20 20 20 20 20 20 20 20 20  dMask;          
26a40 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 73 68 61    /* Mask of sha
26a50 72 65 64 20 6c 6f 63 6b 73 20 68 65 6c 64 20 2a  red locks held *
26a60 2f 0a 20 20 75 31 36 20 65 78 63 6c 4d 61 73 6b  /.  u16 exclMask
26a70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
26a80 2a 20 4d 61 73 6b 20 6f 66 20 65 78 63 6c 75 73  * Mask of exclus
26a90 69 76 65 20 6c 6f 63 6b 73 20 68 65 6c 64 20 2a  ive locks held *
26aa0 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 73  /.};../*.** Cons
26ab0 74 61 6e 74 73 20 75 73 65 64 20 66 6f 72 20 6c  tants used for l
26ac0 6f 63 6b 69 6e 67 0a 2a 2f 0a 23 64 65 66 69 6e  ocking.*/.#defin
26ad0 65 20 55 4e 49 58 5f 53 48 4d 5f 42 41 53 45 20  e UNIX_SHM_BASE 
26ae0 20 20 28 28 32 32 2b 53 51 4c 49 54 45 5f 53 48    ((22+SQLITE_SH
26af0 4d 5f 4e 4c 4f 43 4b 29 2a 34 29 20 20 20 20 20  M_NLOCK)*4)     
26b00 20 20 20 20 2f 2a 20 66 69 72 73 74 20 6c 6f 63      /* first loc
26b10 6b 20 62 79 74 65 20 2a 2f 0a 23 64 65 66 69 6e  k byte */.#defin
26b20 65 20 55 4e 49 58 5f 53 48 4d 5f 44 4d 53 20 20  e UNIX_SHM_DMS  
26b30 20 20 28 55 4e 49 58 5f 53 48 4d 5f 42 41 53 45    (UNIX_SHM_BASE
26b40 2b 53 51 4c 49 54 45 5f 53 48 4d 5f 4e 4c 4f 43  +SQLITE_SHM_NLOC
26b50 4b 29 20 20 2f 2a 20 64 65 61 64 6d 61 6e 20 73  K)  /* deadman s
26b60 77 69 74 63 68 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  witch */../*.** 
26b70 41 70 70 6c 79 20 70 6f 73 69 78 20 61 64 76 69  Apply posix advi
26b80 73 6f 72 79 20 6c 6f 63 6b 73 20 66 6f 72 20 61  sory locks for a
26b90 6c 6c 20 62 79 74 65 73 20 66 72 6f 6d 20 6f 66  ll bytes from of
26ba0 73 74 20 74 68 72 6f 75 67 68 20 6f 66 73 74 2b  st through ofst+
26bb0 6e 2d 31 2e 0a 2a 2a 0a 2a 2a 20 4c 6f 63 6b 73  n-1..**.** Locks
26bc0 20 62 6c 6f 63 6b 20 69 66 20 74 68 65 20 6d 61   block if the ma
26bd0 73 6b 20 69 73 20 65 78 61 63 74 6c 79 20 55 4e  sk is exactly UN
26be0 49 58 5f 53 48 4d 5f 43 20 61 6e 64 20 61 72 65  IX_SHM_C and are
26bf0 20 6e 6f 6e 2d 62 6c 6f 63 6b 69 6e 67 0a 2a 2a   non-blocking.**
26c00 20 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2f 0a 73   otherwise..*/.s
26c10 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 53 68  tatic int unixSh
26c20 6d 53 79 73 74 65 6d 4c 6f 63 6b 28 0a 20 20 75  mSystemLock(.  u
26c30 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 2c 20  nixFile *pFile, 
26c40 20 20 20 20 20 20 2f 2a 20 4f 70 65 6e 20 63 6f        /* Open co
26c50 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 74 68 65 20  nnection to the 
26c60 57 41 4c 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e  WAL file */.  in
26c70 74 20 6c 6f 63 6b 54 79 70 65 2c 20 20 20 20 20  t lockType,     
26c80 20 20 20 20 20 2f 2a 20 46 5f 55 4e 4c 43 4b 2c       /* F_UNLCK,
26c90 20 46 5f 52 44 4c 43 4b 2c 20 6f 72 20 46 5f 57   F_RDLCK, or F_W
26ca0 52 4c 43 4b 20 2a 2f 0a 20 20 69 6e 74 20 6f 66  RLCK */.  int of
26cb0 73 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  st,             
26cc0 20 2f 2a 20 46 69 72 73 74 20 62 79 74 65 20 6f   /* First byte o
26cd0 66 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 72 61  f the locking ra
26ce0 6e 67 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 20 20  nge */.  int n  
26cf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26d00 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74  /* Number of byt
26d10 65 73 20 74 6f 20 6c 6f 63 6b 20 2a 2f 0a 29 7b  es to lock */.){
26d20 0a 20 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20 2a  .  unixShmNode *
26d30 70 53 68 6d 4e 6f 64 65 3b 20 2f 2a 20 41 70 70  pShmNode; /* App
26d40 6c 79 20 6c 6f 63 6b 73 20 74 6f 20 74 68 69 73  ly locks to this
26d50 20 6f 70 65 6e 20 73 68 61 72 65 64 2d 6d 65 6d   open shared-mem
26d60 6f 72 79 20 73 65 67 6d 65 6e 74 20 2a 2f 0a 20  ory segment */. 
26d70 20 73 74 72 75 63 74 20 66 6c 6f 63 6b 20 66 3b   struct flock f;
26d80 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70          /* The p
26d90 6f 73 69 78 20 61 64 76 69 73 6f 72 79 20 6c 6f  osix advisory lo
26da0 63 6b 69 6e 67 20 73 74 72 75 63 74 75 72 65 20  cking structure 
26db0 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  */.  int rc = SQ
26dc0 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 2f 2a 20 52  LITE_OK;    /* R
26dd0 65 73 75 6c 74 20 63 6f 64 65 20 66 6f 72 6d 20  esult code form 
26de0 66 63 6e 74 6c 28 29 20 2a 2f 0a 0a 20 20 2f 2a  fcntl() */..  /*
26df0 20 41 63 63 65 73 73 20 74 6f 20 74 68 65 20 75   Access to the u
26e00 6e 69 78 53 68 6d 4e 6f 64 65 20 6f 62 6a 65 63  nixShmNode objec
26e10 74 20 69 73 20 73 65 72 69 61 6c 69 7a 65 64 20  t is serialized 
26e20 62 79 20 74 68 65 20 63 61 6c 6c 65 72 20 2a 2f  by the caller */
26e30 0a 20 20 70 53 68 6d 4e 6f 64 65 20 3d 20 70 46  .  pShmNode = pF
26e40 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e 70 53 68  ile->pInode->pSh
26e50 6d 4e 6f 64 65 3b 0a 20 20 61 73 73 65 72 74 28  mNode;.  assert(
26e60 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
26e70 65 6c 64 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75  eld(pShmNode->mu
26e80 74 65 78 29 20 7c 7c 20 70 53 68 6d 4e 6f 64 65  tex) || pShmNode
26e90 2d 3e 6e 52 65 66 3d 3d 30 20 29 3b 0a 0a 20 20  ->nRef==0 );..  
26ea0 2f 2a 20 53 68 61 72 65 64 20 6c 6f 63 6b 73 20  /* Shared locks 
26eb0 6e 65 76 65 72 20 73 70 61 6e 20 6d 6f 72 65 20  never span more 
26ec0 74 68 61 6e 20 6f 6e 65 20 62 79 74 65 20 2a 2f  than one byte */
26ed0 0a 20 20 61 73 73 65 72 74 28 20 6e 3d 3d 31 20  .  assert( n==1 
26ee0 7c 7c 20 6c 6f 63 6b 54 79 70 65 21 3d 46 5f 52  || lockType!=F_R
26ef0 44 4c 43 4b 20 29 3b 0a 0a 20 20 2f 2a 20 4c 6f  DLCK );..  /* Lo
26f00 63 6b 73 20 61 72 65 20 77 69 74 68 69 6e 20 72  cks are within r
26f10 61 6e 67 65 20 2a 2f 0a 20 20 61 73 73 65 72 74  ange */.  assert
26f20 28 20 6e 3e 3d 31 20 26 26 20 6e 3c 3d 53 51 4c  ( n>=1 && n<=SQL
26f30 49 54 45 5f 53 48 4d 5f 4e 4c 4f 43 4b 20 29 3b  ITE_SHM_NLOCK );
26f40 0a 0a 20 20 69 66 28 20 70 53 68 6d 4e 6f 64 65  ..  if( pShmNode
26f50 2d 3e 68 3e 3d 30 20 29 7b 0a 20 20 20 20 2f 2a  ->h>=0 ){.    /*
26f60 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20   Initialize the 
26f70 6c 6f 63 6b 69 6e 67 20 70 61 72 61 6d 65 74 65  locking paramete
26f80 72 73 20 2a 2f 0a 20 20 20 20 6d 65 6d 73 65 74  rs */.    memset
26f90 28 26 66 2c 20 30 2c 20 73 69 7a 65 6f 66 28 66  (&f, 0, sizeof(f
26fa0 29 29 3b 0a 20 20 20 20 66 2e 6c 5f 74 79 70 65  ));.    f.l_type
26fb0 20 3d 20 6c 6f 63 6b 54 79 70 65 3b 0a 20 20 20   = lockType;.   
26fc0 20 66 2e 6c 5f 77 68 65 6e 63 65 20 3d 20 53 45   f.l_whence = SE
26fd0 45 4b 5f 53 45 54 3b 0a 20 20 20 20 66 2e 6c 5f  EK_SET;.    f.l_
26fe0 73 74 61 72 74 20 3d 20 6f 66 73 74 3b 0a 20 20  start = ofst;.  
26ff0 20 20 66 2e 6c 5f 6c 65 6e 20 3d 20 6e 3b 0a 0a    f.l_len = n;..
27000 20 20 20 20 72 63 20 3d 20 6f 73 46 63 6e 74 6c      rc = osFcntl
27010 28 70 53 68 6d 4e 6f 64 65 2d 3e 68 2c 20 46 5f  (pShmNode->h, F_
27020 53 45 54 4c 4b 2c 20 26 66 29 3b 0a 20 20 20 20  SETLK, &f);.    
27030 72 63 20 3d 20 28 72 63 21 3d 28 2d 31 29 29 20  rc = (rc!=(-1)) 
27040 3f 20 53 51 4c 49 54 45 5f 4f 4b 20 3a 20 53 51  ? SQLITE_OK : SQ
27050 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 7d 0a 0a  LITE_BUSY;.  }..
27060 20 20 2f 2a 20 55 70 64 61 74 65 20 74 68 65 20    /* Update the 
27070 67 6c 6f 62 61 6c 20 6c 6f 63 6b 20 73 74 61 74  global lock stat
27080 65 20 61 6e 64 20 64 6f 20 64 65 62 75 67 20 74  e and do debug t
27090 72 61 63 69 6e 67 20 2a 2f 0a 23 69 66 64 65 66  racing */.#ifdef
270a0 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20   SQLITE_DEBUG.  
270b0 7b 20 75 31 36 20 6d 61 73 6b 3b 0a 20 20 4f 53  { u16 mask;.  OS
270c0 54 52 41 43 45 28 28 22 53 48 4d 2d 4c 4f 43 4b  TRACE(("SHM-LOCK
270d0 20 22 29 29 3b 0a 20 20 6d 61 73 6b 20 3d 20 6f   "));.  mask = o
270e0 66 73 74 3e 33 31 20 3f 20 30 78 66 66 66 66 20  fst>31 ? 0xffff 
270f0 3a 20 28 31 3c 3c 28 6f 66 73 74 2b 6e 29 29 20  : (1<<(ofst+n)) 
27100 2d 20 28 31 3c 3c 6f 66 73 74 29 3b 0a 20 20 69  - (1<<ofst);.  i
27110 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
27120 20 29 7b 0a 20 20 20 20 69 66 28 20 6c 6f 63 6b   ){.    if( lock
27130 54 79 70 65 3d 3d 46 5f 55 4e 4c 43 4b 20 29 7b  Type==F_UNLCK ){
27140 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45 28 28  .      OSTRACE((
27150 22 75 6e 6c 6f 63 6b 20 25 64 20 6f 6b 22 2c 20  "unlock %d ok", 
27160 6f 66 73 74 29 29 3b 0a 20 20 20 20 20 20 70 53  ofst));.      pS
27170 68 6d 4e 6f 64 65 2d 3e 65 78 63 6c 4d 61 73 6b  hmNode->exclMask
27180 20 26 3d 20 7e 6d 61 73 6b 3b 0a 20 20 20 20 20   &= ~mask;.     
27190 20 70 53 68 6d 4e 6f 64 65 2d 3e 73 68 61 72 65   pShmNode->share
271a0 64 4d 61 73 6b 20 26 3d 20 7e 6d 61 73 6b 3b 0a  dMask &= ~mask;.
271b0 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6c 6f      }else if( lo
271c0 63 6b 54 79 70 65 3d 3d 46 5f 52 44 4c 43 4b 20  ckType==F_RDLCK 
271d0 29 7b 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45  ){.      OSTRACE
271e0 28 28 22 72 65 61 64 2d 6c 6f 63 6b 20 25 64 20  (("read-lock %d 
271f0 6f 6b 22 2c 20 6f 66 73 74 29 29 3b 0a 20 20 20  ok", ofst));.   
27200 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 65 78 63     pShmNode->exc
27210 6c 4d 61 73 6b 20 26 3d 20 7e 6d 61 73 6b 3b 0a  lMask &= ~mask;.
27220 20 20 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e        pShmNode->
27230 73 68 61 72 65 64 4d 61 73 6b 20 7c 3d 20 6d 61  sharedMask |= ma
27240 73 6b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  sk;.    }else{. 
27250 20 20 20 20 20 61 73 73 65 72 74 28 20 6c 6f 63       assert( loc
27260 6b 54 79 70 65 3d 3d 46 5f 57 52 4c 43 4b 20 29  kType==F_WRLCK )
27270 3b 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45 28  ;.      OSTRACE(
27280 28 22 77 72 69 74 65 2d 6c 6f 63 6b 20 25 64 20  ("write-lock %d 
27290 6f 6b 22 2c 20 6f 66 73 74 29 29 3b 0a 20 20 20  ok", ofst));.   
272a0 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 65 78 63     pShmNode->exc
272b0 6c 4d 61 73 6b 20 7c 3d 20 6d 61 73 6b 3b 0a 20  lMask |= mask;. 
272c0 20 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 73       pShmNode->s
272d0 68 61 72 65 64 4d 61 73 6b 20 26 3d 20 7e 6d 61  haredMask &= ~ma
272e0 73 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73  sk;.    }.  }els
272f0 65 7b 0a 20 20 20 20 69 66 28 20 6c 6f 63 6b 54  e{.    if( lockT
27300 79 70 65 3d 3d 46 5f 55 4e 4c 43 4b 20 29 7b 0a  ype==F_UNLCK ){.
27310 20 20 20 20 20 20 4f 53 54 52 41 43 45 28 28 22        OSTRACE(("
27320 75 6e 6c 6f 63 6b 20 25 64 20 66 61 69 6c 65 64  unlock %d failed
27330 22 2c 20 6f 66 73 74 29 29 3b 0a 20 20 20 20 7d  ", ofst));.    }
27340 65 6c 73 65 20 69 66 28 20 6c 6f 63 6b 54 79 70  else if( lockTyp
27350 65 3d 3d 46 5f 52 44 4c 43 4b 20 29 7b 0a 20 20  e==F_RDLCK ){.  
27360 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 72 65      OSTRACE(("re
27370 61 64 2d 6c 6f 63 6b 20 66 61 69 6c 65 64 22 29  ad-lock failed")
27380 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
27390 20 20 20 20 61 73 73 65 72 74 28 20 6c 6f 63 6b      assert( lock
273a0 54 79 70 65 3d 3d 46 5f 57 52 4c 43 4b 20 29 3b  Type==F_WRLCK );
273b0 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45 28 28  .      OSTRACE((
273c0 22 77 72 69 74 65 2d 6c 6f 63 6b 20 25 64 20 66  "write-lock %d f
273d0 61 69 6c 65 64 22 2c 20 6f 66 73 74 29 29 3b 0a  ailed", ofst));.
273e0 20 20 20 20 7d 0a 20 20 7d 0a 20 20 4f 53 54 52      }.  }.  OSTR
273f0 41 43 45 28 28 22 20 2d 20 61 66 74 65 72 77 61  ACE((" - afterwa
27400 72 64 73 20 25 30 33 78 2c 25 30 33 78 5c 6e 22  rds %03x,%03x\n"
27410 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70 53 68  ,.           pSh
27420 6d 4e 6f 64 65 2d 3e 73 68 61 72 65 64 4d 61 73  mNode->sharedMas
27430 6b 2c 20 70 53 68 6d 4e 6f 64 65 2d 3e 65 78 63  k, pShmNode->exc
27440 6c 4d 61 73 6b 29 29 3b 0a 20 20 7d 0a 23 65 6e  lMask));.  }.#en
27450 64 69 66 0a 0a 20 20 72 65 74 75 72 6e 20 72 63  dif..  return rc
27460 3b 20 20 20 20 20 20 20 20 0a 7d 0a 0a 2f 2a 0a  ;        .}../*.
27470 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6d 69  ** Return the mi
27480 6e 69 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66 20  nimum number of 
27490 33 32 4b 42 20 73 68 6d 20 72 65 67 69 6f 6e 73  32KB shm regions
274a0 20 74 68 61 74 20 73 68 6f 75 6c 64 20 62 65 20   that should be 
274b0 6d 61 70 70 65 64 20 61 74 0a 2a 2a 20 61 20 74  mapped at.** a t
274c0 69 6d 65 2c 20 61 73 73 75 6d 69 6e 67 20 74 68  ime, assuming th
274d0 61 74 20 65 61 63 68 20 6d 61 70 70 69 6e 67 20  at each mapping 
274e0 6d 75 73 74 20 62 65 20 61 6e 20 69 6e 74 65 67  must be an integ
274f0 65 72 20 6d 75 6c 74 69 70 6c 65 20 6f 66 20 74  er multiple of t
27500 68 65 0a 2a 2a 20 63 75 72 72 65 6e 74 20 73 79  he.** current sy
27510 73 74 65 6d 20 70 61 67 65 2d 73 69 7a 65 2e 0a  stem page-size..
27520 2a 2a 0a 2a 2a 20 55 73 75 61 6c 6c 79 2c 20 74  **.** Usually, t
27530 68 69 73 20 69 73 20 31 2e 20 54 68 65 20 65 78  his is 1. The ex
27540 63 65 70 74 69 6f 6e 20 73 65 65 6d 73 20 74 6f  ception seems to
27550 20 62 65 20 73 79 73 74 65 6d 73 20 74 68 61 74   be systems that
27560 20 61 72 65 20 63 6f 6e 66 69 67 75 72 65 64 0a   are configured.
27570 2a 2a 20 74 6f 20 75 73 65 20 36 34 4b 42 20 70  ** to use 64KB p
27580 61 67 65 73 20 2d 20 69 6e 20 74 68 69 73 20 63  ages - in this c
27590 61 73 65 20 65 61 63 68 20 6d 61 70 70 69 6e 67  ase each mapping
275a0 20 6d 75 73 74 20 63 6f 76 65 72 20 61 74 20 6c   must cover at l
275b0 65 61 73 74 20 74 77 6f 0a 2a 2a 20 73 68 6d 20  east two.** shm 
275c0 72 65 67 69 6f 6e 73 2e 0a 2a 2f 0a 73 74 61 74  regions..*/.stat
275d0 69 63 20 69 6e 74 20 75 6e 69 78 53 68 6d 52 65  ic int unixShmRe
275e0 67 69 6f 6e 50 65 72 4d 61 70 28 76 6f 69 64 29  gionPerMap(void)
275f0 7b 0a 20 20 69 6e 74 20 73 68 6d 73 7a 20 3d 20  {.  int shmsz = 
27600 33 32 2a 31 30 32 34 3b 20 20 20 20 20 20 20 20  32*1024;        
27610 20 20 20 20 2f 2a 20 53 48 4d 20 72 65 67 69 6f      /* SHM regio
27620 6e 20 73 69 7a 65 20 2a 2f 0a 20 20 69 6e 74 20  n size */.  int 
27630 70 67 73 7a 20 3d 20 6f 73 47 65 74 70 61 67 65  pgsz = osGetpage
27640 73 69 7a 65 28 29 3b 20 20 20 2f 2a 20 53 79 73  size();   /* Sys
27650 74 65 6d 20 70 61 67 65 20 73 69 7a 65 20 2a 2f  tem page size */
27660 0a 20 20 61 73 73 65 72 74 28 20 28 28 70 67 73  .  assert( ((pgs
27670 7a 2d 31 29 26 70 67 73 7a 29 3d 3d 30 20 29 3b  z-1)&pgsz)==0 );
27680 20 20 20 2f 2a 20 50 61 67 65 20 73 69 7a 65 20     /* Page size 
27690 6d 75 73 74 20 62 65 20 61 20 70 6f 77 65 72 20  must be a power 
276a0 6f 66 20 32 20 2a 2f 0a 20 20 69 66 28 20 70 67  of 2 */.  if( pg
276b0 73 7a 3c 73 68 6d 73 7a 20 29 20 72 65 74 75 72  sz<shmsz ) retur
276c0 6e 20 31 3b 0a 20 20 72 65 74 75 72 6e 20 70 67  n 1;.  return pg
276d0 73 7a 2f 73 68 6d 73 7a 3b 0a 7d 0a 0a 2f 2a 0a  sz/shmsz;.}../*.
276e0 2a 2a 20 50 75 72 67 65 20 74 68 65 20 75 6e 69  ** Purge the uni
276f0 78 53 68 6d 4e 6f 64 65 4c 69 73 74 20 6c 69 73  xShmNodeList lis
27700 74 20 6f 66 20 61 6c 6c 20 65 6e 74 72 69 65 73  t of all entries
27710 20 77 69 74 68 20 75 6e 69 78 53 68 6d 4e 6f 64   with unixShmNod
27720 65 2e 6e 52 65 66 3d 3d 30 2e 0a 2a 2a 0a 2a 2a  e.nRef==0..**.**
27730 20 54 68 69 73 20 69 73 20 6e 6f 74 20 61 20 56   This is not a V
27740 46 53 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79  FS shared-memory
27750 20 6d 65 74 68 6f 64 3b 20 69 74 20 69 73 20 61   method; it is a
27760 20 75 74 69 6c 69 74 79 20 66 75 6e 63 74 69 6f   utility functio
27770 6e 20 63 61 6c 6c 65 64 0a 2a 2a 20 62 79 20 56  n called.** by V
27780 46 53 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79  FS shared-memory
27790 20 6d 65 74 68 6f 64 73 2e 0a 2a 2f 0a 73 74 61   methods..*/.sta
277a0 74 69 63 20 76 6f 69 64 20 75 6e 69 78 53 68 6d  tic void unixShm
277b0 50 75 72 67 65 28 75 6e 69 78 46 69 6c 65 20 2a  Purge(unixFile *
277c0 70 46 64 29 7b 0a 20 20 75 6e 69 78 53 68 6d 4e  pFd){.  unixShmN
277d0 6f 64 65 20 2a 70 20 3d 20 70 46 64 2d 3e 70 49  ode *p = pFd->pI
277e0 6e 6f 64 65 2d 3e 70 53 68 6d 4e 6f 64 65 3b 0a  node->pShmNode;.
277f0 20 20 61 73 73 65 72 74 28 20 75 6e 69 78 4d 75    assert( unixMu
27800 74 65 78 48 65 6c 64 28 29 20 29 3b 0a 20 20 69  texHeld() );.  i
27810 66 28 20 70 20 26 26 20 41 4c 57 41 59 53 28 70  f( p && ALWAYS(p
27820 2d 3e 6e 52 65 66 3d 3d 30 29 20 29 7b 0a 20 20  ->nRef==0) ){.  
27830 20 20 69 6e 74 20 6e 53 68 6d 50 65 72 4d 61 70    int nShmPerMap
27840 20 3d 20 75 6e 69 78 53 68 6d 52 65 67 69 6f 6e   = unixShmRegion
27850 50 65 72 4d 61 70 28 29 3b 0a 20 20 20 20 69 6e  PerMap();.    in
27860 74 20 69 3b 0a 20 20 20 20 61 73 73 65 72 74 28  t i;.    assert(
27870 20 70 2d 3e 70 49 6e 6f 64 65 3d 3d 70 46 64 2d   p->pInode==pFd-
27880 3e 70 49 6e 6f 64 65 20 29 3b 0a 20 20 20 20 73  >pInode );.    s
27890 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 66 72 65  qlite3_mutex_fre
278a0 65 28 70 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 20  e(p->mutex);.   
278b0 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e   for(i=0; i<p->n
278c0 52 65 67 69 6f 6e 3b 20 69 2b 3d 6e 53 68 6d 50  Region; i+=nShmP
278d0 65 72 4d 61 70 29 7b 0a 20 20 20 20 20 20 69 66  erMap){.      if
278e0 28 20 70 2d 3e 68 3e 3d 30 20 29 7b 0a 20 20 20  ( p->h>=0 ){.   
278f0 20 20 20 20 20 6f 73 4d 75 6e 6d 61 70 28 70 2d       osMunmap(p-
27900 3e 61 70 52 65 67 69 6f 6e 5b 69 5d 2c 20 70 2d  >apRegion[i], p-
27910 3e 73 7a 52 65 67 69 6f 6e 29 3b 0a 20 20 20 20  >szRegion);.    
27920 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
27930 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 2d   sqlite3_free(p-
27940 3e 61 70 52 65 67 69 6f 6e 5b 69 5d 29 3b 0a 20  >apRegion[i]);. 
27950 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
27960 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 2d   sqlite3_free(p-
27970 3e 61 70 52 65 67 69 6f 6e 29 3b 0a 20 20 20 20  >apRegion);.    
27980 69 66 28 20 70 2d 3e 68 3e 3d 30 20 29 7b 0a 20  if( p->h>=0 ){. 
27990 20 20 20 20 20 72 6f 62 75 73 74 5f 63 6c 6f 73       robust_clos
279a0 65 28 70 46 64 2c 20 70 2d 3e 68 2c 20 5f 5f 4c  e(pFd, p->h, __L
279b0 49 4e 45 5f 5f 29 3b 0a 20 20 20 20 20 20 70 2d  INE__);.      p-
279c0 3e 68 20 3d 20 2d 31 3b 0a 20 20 20 20 7d 0a 20  >h = -1;.    }. 
279d0 20 20 20 70 2d 3e 70 49 6e 6f 64 65 2d 3e 70 53     p->pInode->pS
279e0 68 6d 4e 6f 64 65 20 3d 20 30 3b 0a 20 20 20 20  hmNode = 0;.    
279f0 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 29 3b  sqlite3_free(p);
27a00 0a 20 20 7d 0a 7d 0a 0a 23 69 66 20 64 65 66 69  .  }.}..#if defi
27a10 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 26  ned(__APPLE__) &
27a20 26 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  & SQLITE_ENABLE_
27a30 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 73 74  LOCKING_STYLE.st
27a40 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20  atic const char 
27a50 2a 70 72 6f 78 79 53 68 61 72 65 64 4d 65 6d 6f  *proxySharedMemo
27a60 72 79 42 61 73 65 50 61 74 68 28 75 6e 69 78 46  ryBasePath(unixF
27a70 69 6c 65 20 2a 29 3b 0a 23 65 6e 64 69 66 0a 0a  ile *);.#endif..
27a80 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20 73 68 61  /*.** Open a sha
27a90 72 65 64 2d 6d 65 6d 6f 72 79 20 61 72 65 61 20  red-memory area 
27aa0 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
27ab0 6f 70 65 6e 20 64 61 74 61 62 61 73 65 20 66 69  open database fi
27ac0 6c 65 20 70 44 62 46 64 2e 20 20 0a 2a 2a 20 54  le pDbFd.  .** T
27ad0 68 69 73 20 70 61 72 74 69 63 75 6c 61 72 20 69  his particular i
27ae0 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 75 73  mplementation us
27af0 65 73 20 6d 6d 61 70 70 65 64 20 66 69 6c 65 73  es mmapped files
27b00 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 69 6c 65  ..**.** The file
27b10 20 75 73 65 64 20 74 6f 20 69 6d 70 6c 65 6d 65   used to impleme
27b20 6e 74 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79  nt shared-memory
27b30 20 69 73 20 69 6e 20 74 68 65 20 73 61 6d 65 20   is in the same 
27b40 64 69 72 65 63 74 6f 72 79 0a 2a 2a 20 61 73 20  directory.** as 
27b50 74 68 65 20 6f 70 65 6e 20 64 61 74 61 62 61 73  the open databas
27b60 65 20 66 69 6c 65 20 61 6e 64 20 68 61 73 20 74  e file and has t
27b70 68 65 20 73 61 6d 65 20 6e 61 6d 65 20 61 73 20  he same name as 
27b80 74 68 65 20 6f 70 65 6e 20 64 61 74 61 62 61 73  the open databas
27b90 65 0a 2a 2a 20 66 69 6c 65 20 77 69 74 68 20 74  e.** file with t
27ba0 68 65 20 22 2d 73 68 6d 22 20 73 75 66 66 69 78  he "-shm" suffix
27bb0 20 61 64 64 65 64 2e 20 20 46 6f 72 20 65 78 61   added.  For exa
27bc0 6d 70 6c 65 2c 20 69 66 20 74 68 65 20 64 61 74  mple, if the dat
27bd0 61 62 61 73 65 20 66 69 6c 65 0a 2a 2a 20 69 73  abase file.** is
27be0 20 22 2f 68 6f 6d 65 2f 75 73 65 72 31 2f 63 6f   "/home/user1/co
27bf0 6e 66 69 67 2e 64 62 22 20 74 68 65 6e 20 74 68  nfig.db" then th
27c00 65 20 66 69 6c 65 20 74 68 61 74 20 69 73 20 63  e file that is c
27c10 72 65 61 74 65 64 20 61 6e 64 20 6d 6d 61 70 70  reated and mmapp
27c20 65 64 0a 2a 2a 20 66 6f 72 20 73 68 61 72 65 64  ed.** for shared
27c30 20 6d 65 6d 6f 72 79 20 77 69 6c 6c 20 62 65 20   memory will be 
27c40 63 61 6c 6c 65 64 20 22 2f 68 6f 6d 65 2f 75 73  called "/home/us
27c50 65 72 31 2f 63 6f 6e 66 69 67 2e 64 62 2d 73 68  er1/config.db-sh
27c60 6d 22 2e 20 20 0a 2a 2a 0a 2a 2a 20 41 6e 6f 74  m".  .**.** Anot
27c70 68 65 72 20 61 70 70 72 6f 61 63 68 20 74 6f 20  her approach to 
27c80 69 73 20 74 6f 20 75 73 65 20 66 69 6c 65 73 20  is to use files 
27c90 69 6e 20 2f 64 65 76 2f 73 68 6d 20 6f 72 20 2f  in /dev/shm or /
27ca0 64 65 76 2f 74 6d 70 20 6f 72 20 61 6e 0a 2a 2a  dev/tmp or an.**
27cb0 20 73 6f 6d 65 20 6f 74 68 65 72 20 74 6d 70 66   some other tmpf
27cc0 73 20 6d 6f 75 6e 74 2e 20 42 75 74 20 69 66 20  s mount. But if 
27cd0 61 20 66 69 6c 65 20 69 6e 20 61 20 64 69 66 66  a file in a diff
27ce0 65 72 65 6e 74 20 64 69 72 65 63 74 6f 72 79 0a  erent directory.
27cf0 2a 2a 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61  ** from the data
27d00 62 61 73 65 20 66 69 6c 65 20 69 73 20 75 73 65  base file is use
27d10 64 2c 20 74 68 65 6e 20 64 69 66 66 65 72 69 6e  d, then differin
27d20 67 20 61 63 63 65 73 73 20 70 65 72 6d 69 73 73  g access permiss
27d30 69 6f 6e 73 0a 2a 2a 20 6f 72 20 61 20 63 68 72  ions.** or a chr
27d40 6f 6f 74 28 29 20 6d 69 67 68 74 20 63 61 75 73  oot() might caus
27d50 65 20 74 77 6f 20 64 69 66 66 65 72 65 6e 74 20  e two different 
27d60 70 72 6f 63 65 73 73 65 73 20 6f 6e 20 74 68 65  processes on the
27d70 20 73 61 6d 65 0a 2a 2a 20 64 61 74 61 62 61 73   same.** databas
27d80 65 20 74 6f 20 65 6e 64 20 75 70 20 75 73 69 6e  e to end up usin
27d90 67 20 64 69 66 66 65 72 65 6e 74 20 66 69 6c 65  g different file
27da0 73 20 66 6f 72 20 73 68 61 72 65 64 20 6d 65 6d  s for shared mem
27db0 6f 72 79 20 2d 20 0a 2a 2a 20 6d 65 61 6e 69 6e  ory - .** meanin
27dc0 67 20 74 68 61 74 20 74 68 65 69 72 20 6d 65 6d  g that their mem
27dd0 6f 72 79 20 77 6f 75 6c 64 20 6e 6f 74 20 72 65  ory would not re
27de0 61 6c 6c 79 20 62 65 20 73 68 61 72 65 64 20 2d  ally be shared -
27df0 20 72 65 73 75 6c 74 69 6e 67 0a 2a 2a 20 69 6e   resulting.** in
27e00 20 64 61 74 61 62 61 73 65 20 63 6f 72 72 75 70   database corrup
27e10 74 69 6f 6e 2e 20 20 4e 65 76 65 72 74 68 65 6c  tion.  Neverthel
27e20 65 73 73 2c 20 74 68 69 73 20 74 6d 70 66 73 20  ess, this tmpfs 
27e30 66 69 6c 65 20 75 73 61 67 65 0a 2a 2a 20 63 61  file usage.** ca
27e40 6e 20 62 65 20 65 6e 61 62 6c 65 64 20 61 74 20  n be enabled at 
27e50 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 75 73 69  compile-time usi
27e60 6e 67 20 2d 44 53 51 4c 49 54 45 5f 53 48 4d 5f  ng -DSQLITE_SHM_
27e70 44 49 52 45 43 54 4f 52 59 3d 22 2f 64 65 76 2f  DIRECTORY="/dev/
27e80 73 68 6d 22 0a 2a 2a 20 6f 72 20 74 68 65 20 65  shm".** or the e
27e90 71 75 69 76 61 6c 65 6e 74 2e 20 20 54 68 65 20  quivalent.  The 
27ea0 75 73 65 20 6f 66 20 74 68 65 20 53 51 4c 49 54  use of the SQLIT
27eb0 45 5f 53 48 4d 5f 44 49 52 45 43 54 4f 52 59 20  E_SHM_DIRECTORY 
27ec0 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 0a 2a 2a 20  compile-time.** 
27ed0 6f 70 74 69 6f 6e 20 72 65 73 75 6c 74 73 20 69  option results i
27ee0 6e 20 61 6e 20 69 6e 63 6f 6d 70 61 74 69 62 6c  n an incompatibl
27ef0 65 20 62 75 69 6c 64 20 6f 66 20 53 51 4c 69 74  e build of SQLit
27f00 65 3b 20 20 62 75 69 6c 64 73 20 6f 66 20 53 51  e;  builds of SQ
27f10 4c 69 74 65 0a 2a 2a 20 74 68 61 74 20 77 69 74  Lite.** that wit
27f20 68 20 64 69 66 66 65 72 69 6e 67 20 53 51 4c 49  h differing SQLI
27f30 54 45 5f 53 48 4d 5f 44 49 52 45 43 54 4f 52 59  TE_SHM_DIRECTORY
27f40 20 73 65 74 74 69 6e 67 73 20 61 74 74 65 6d 70   settings attemp
27f50 74 20 74 6f 20 75 73 65 20 74 68 65 0a 2a 2a 20  t to use the.** 
27f60 73 61 6d 65 20 64 61 74 61 62 61 73 65 20 66 69  same database fi
27f70 6c 65 20 61 74 20 74 68 65 20 73 61 6d 65 20 74  le at the same t
27f80 69 6d 65 2c 20 64 61 74 61 62 61 73 65 20 63 6f  ime, database co
27f90 72 72 75 70 74 69 6f 6e 20 77 69 6c 6c 20 6c 69  rruption will li
27fa0 6b 65 6c 79 0a 2a 2a 20 72 65 73 75 6c 74 2e 20  kely.** result. 
27fb0 54 68 65 20 53 51 4c 49 54 45 5f 53 48 4d 5f 44  The SQLITE_SHM_D
27fc0 49 52 45 43 54 4f 52 59 20 63 6f 6d 70 69 6c 65  IRECTORY compile
27fd0 2d 74 69 6d 65 20 6f 70 74 69 6f 6e 20 69 73 20  -time option is 
27fe0 63 6f 6e 73 69 64 65 72 65 64 0a 2a 2a 20 22 75  considered.** "u
27ff0 6e 73 75 70 70 6f 72 74 65 64 22 20 61 6e 64 20  nsupported" and 
28000 6d 61 79 20 67 6f 20 61 77 61 79 20 69 6e 20 61  may go away in a
28010 20 66 75 74 75 72 65 20 53 51 4c 69 74 65 20 72   future SQLite r
28020 65 6c 65 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 57 68  elease..**.** Wh
28030 65 6e 20 6f 70 65 6e 69 6e 67 20 61 20 6e 65 77  en opening a new
28040 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 66   shared-memory f
28050 69 6c 65 2c 20 69 66 20 6e 6f 20 6f 74 68 65 72  ile, if no other
28060 20 69 6e 73 74 61 6e 63 65 73 20 6f 66 20 74 68   instances of th
28070 61 74 0a 2a 2a 20 66 69 6c 65 20 61 72 65 20 63  at.** file are c
28080 75 72 72 65 6e 74 6c 79 20 6f 70 65 6e 2c 20 69  urrently open, i
28090 6e 20 74 68 69 73 20 70 72 6f 63 65 73 73 20 6f  n this process o
280a0 72 20 69 6e 20 6f 74 68 65 72 20 70 72 6f 63 65  r in other proce
280b0 73 73 65 73 2c 20 74 68 65 6e 0a 2a 2a 20 74 68  sses, then.** th
280c0 65 20 66 69 6c 65 20 6d 75 73 74 20 62 65 20 74  e file must be t
280d0 72 75 6e 63 61 74 65 64 20 74 6f 20 7a 65 72 6f  runcated to zero
280e0 20 6c 65 6e 67 74 68 20 6f 72 20 68 61 76 65 20   length or have 
280f0 69 74 73 20 68 65 61 64 65 72 20 63 6c 65 61 72  its header clear
28100 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ed..**.** If the
28110 20 6f 72 69 67 69 6e 61 6c 20 64 61 74 61 62 61   original databa
28120 73 65 20 66 69 6c 65 20 28 70 44 62 46 64 29 20  se file (pDbFd) 
28130 69 73 20 75 73 69 6e 67 20 74 68 65 20 22 75 6e  is using the "un
28140 69 78 2d 65 78 63 6c 22 20 56 46 53 0a 2a 2a 20  ix-excl" VFS.** 
28150 74 68 61 74 20 6d 65 61 6e 73 20 74 68 61 74 20  that means that 
28160 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63  an exclusive loc
28170 6b 20 69 73 20 68 65 6c 64 20 6f 6e 20 74 68 65  k is held on the
28180 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 61   database file a
28190 6e 64 0a 2a 2a 20 74 68 61 74 20 6e 6f 20 6f 74  nd.** that no ot
281a0 68 65 72 20 70 72 6f 63 65 73 73 65 73 20 61 72  her processes ar
281b0 65 20 61 62 6c 65 20 74 6f 20 72 65 61 64 20 6f  e able to read o
281c0 72 20 77 72 69 74 65 20 74 68 65 20 64 61 74 61  r write the data
281d0 62 61 73 65 2e 20 20 49 6e 0a 2a 2a 20 74 68 61  base.  In.** tha
281e0 74 20 63 61 73 65 2c 20 77 65 20 64 6f 20 6e 6f  t case, we do no
281f0 74 20 72 65 61 6c 6c 79 20 6e 65 65 64 20 73 68  t really need sh
28200 61 72 65 64 20 6d 65 6d 6f 72 79 2e 20 20 4e 6f  ared memory.  No
28210 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 0a 2a   shared memory.*
28220 2a 20 66 69 6c 65 20 69 73 20 63 72 65 61 74 65  * file is create
28230 64 2e 20 20 54 68 65 20 73 68 61 72 65 64 20 6d  d.  The shared m
28240 65 6d 6f 72 79 20 77 69 6c 6c 20 62 65 20 73 69  emory will be si
28250 6d 75 6c 61 74 65 64 20 77 69 74 68 20 68 65 61  mulated with hea
28260 70 20 6d 65 6d 6f 72 79 2e 0a 2a 2f 0a 73 74 61  p memory..*/.sta
28270 74 69 63 20 69 6e 74 20 75 6e 69 78 4f 70 65 6e  tic int unixOpen
28280 53 68 61 72 65 64 4d 65 6d 6f 72 79 28 75 6e 69  SharedMemory(uni
28290 78 46 69 6c 65 20 2a 70 44 62 46 64 29 7b 0a 20  xFile *pDbFd){. 
282a0 20 73 74 72 75 63 74 20 75 6e 69 78 53 68 6d 20   struct unixShm 
282b0 2a 70 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  *p = 0;         
282c0 20 2f 2a 20 54 68 65 20 63 6f 6e 6e 65 63 74 69   /* The connecti
282d0 6f 6e 20 74 6f 20 62 65 20 6f 70 65 6e 65 64 20  on to be opened 
282e0 2a 2f 0a 20 20 73 74 72 75 63 74 20 75 6e 69 78  */.  struct unix
282f0 53 68 6d 4e 6f 64 65 20 2a 70 53 68 6d 4e 6f 64  ShmNode *pShmNod
28300 65 3b 20 20 20 2f 2a 20 54 68 65 20 75 6e 64 65  e;   /* The unde
28310 72 6c 79 69 6e 67 20 6d 6d 61 70 70 65 64 20 66  rlying mmapped f
28320 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b  ile */.  int rc;
28330 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28340 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75           /* Resu
28350 6c 74 20 63 6f 64 65 20 2a 2f 0a 20 20 75 6e 69  lt code */.  uni
28360 78 49 6e 6f 64 65 49 6e 66 6f 20 2a 70 49 6e 6f  xInodeInfo *pIno
28370 64 65 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  de;          /* 
28380 54 68 65 20 69 6e 6f 64 65 20 6f 66 20 66 64 20  The inode of fd 
28390 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 53 68 6d 46  */.  char *zShmF
283a0 69 6c 65 6e 61 6d 65 3b 20 20 20 20 20 20 20 20  ilename;        
283b0 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20       /* Name of 
283c0 74 68 65 20 66 69 6c 65 20 75 73 65 64 20 66 6f  the file used fo
283d0 72 20 53 48 4d 20 2a 2f 0a 20 20 69 6e 74 20 6e  r SHM */.  int n
283e0 53 68 6d 46 69 6c 65 6e 61 6d 65 3b 20 20 20 20  ShmFilename;    
283f0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69             /* Si
28400 7a 65 20 6f 66 20 74 68 65 20 53 48 4d 20 66 69  ze of the SHM fi
28410 6c 65 6e 61 6d 65 20 69 6e 20 62 79 74 65 73 20  lename in bytes 
28420 2a 2f 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74  */..  /* Allocat
28430 65 20 73 70 61 63 65 20 66 6f 72 20 74 68 65 20  e space for the 
28440 6e 65 77 20 75 6e 69 78 53 68 6d 20 6f 62 6a 65  new unixShm obje
28450 63 74 2e 20 2a 2f 0a 20 20 70 20 3d 20 73 71 6c  ct. */.  p = sql
28460 69 74 65 33 5f 6d 61 6c 6c 6f 63 36 34 28 20 73  ite3_malloc64( s
28470 69 7a 65 6f 66 28 2a 70 29 20 29 3b 0a 20 20 69  izeof(*p) );.  i
28480 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e  f( p==0 ) return
28490 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b   SQLITE_NOMEM_BK
284a0 50 54 3b 0a 20 20 6d 65 6d 73 65 74 28 70 2c 20  PT;.  memset(p, 
284b0 30 2c 20 73 69 7a 65 6f 66 28 2a 70 29 29 3b 0a  0, sizeof(*p));.
284c0 20 20 61 73 73 65 72 74 28 20 70 44 62 46 64 2d    assert( pDbFd-
284d0 3e 70 53 68 6d 3d 3d 30 20 29 3b 0a 0a 20 20 2f  >pShm==0 );..  /
284e0 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69  * Check to see i
284f0 66 20 61 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20  f a unixShmNode 
28500 6f 62 6a 65 63 74 20 61 6c 72 65 61 64 79 20 65  object already e
28510 78 69 73 74 73 2e 20 52 65 75 73 65 20 61 6e 20  xists. Reuse an 
28520 65 78 69 73 74 69 6e 67 0a 20 20 2a 2a 20 6f 6e  existing.  ** on
28530 65 20 69 66 20 70 72 65 73 65 6e 74 2e 20 43 72  e if present. Cr
28540 65 61 74 65 20 61 20 6e 65 77 20 6f 6e 65 20 69  eate a new one i
28550 66 20 6e 65 63 65 73 73 61 72 79 2e 0a 20 20 2a  f necessary..  *
28560 2f 0a 20 20 75 6e 69 78 45 6e 74 65 72 4d 75 74  /.  unixEnterMut
28570 65 78 28 29 3b 0a 20 20 70 49 6e 6f 64 65 20 3d  ex();.  pInode =
28580 20 70 44 62 46 64 2d 3e 70 49 6e 6f 64 65 3b 0a   pDbFd->pInode;.
28590 20 20 70 53 68 6d 4e 6f 64 65 20 3d 20 70 49 6e    pShmNode = pIn
285a0 6f 64 65 2d 3e 70 53 68 6d 4e 6f 64 65 3b 0a 20  ode->pShmNode;. 
285b0 20 69 66 28 20 70 53 68 6d 4e 6f 64 65 3d 3d 30   if( pShmNode==0
285c0 20 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 73   ){.    struct s
285d0 74 61 74 20 73 53 74 61 74 3b 20 20 20 20 20 20  tat sStat;      
285e0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 66 73             /* fs
285f0 74 61 74 28 29 20 69 6e 66 6f 20 66 6f 72 20 64  tat() info for d
28600 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a  atabase file */.
28610 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 53  #ifndef SQLITE_S
28620 48 4d 5f 44 49 52 45 43 54 4f 52 59 0a 20 20 20  HM_DIRECTORY.   
28630 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 42 61   const char *zBa
28640 73 65 50 61 74 68 20 3d 20 70 44 62 46 64 2d 3e  sePath = pDbFd->
28650 7a 50 61 74 68 3b 0a 23 65 6e 64 69 66 0a 0a 20  zPath;.#endif.. 
28660 20 20 20 2f 2a 20 43 61 6c 6c 20 66 73 74 61 74     /* Call fstat
28670 28 29 20 74 6f 20 66 69 67 75 72 65 20 6f 75 74  () to figure out
28680 20 74 68 65 20 70 65 72 6d 69 73 73 69 6f 6e 73   the permissions
28690 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
286a0 20 66 69 6c 65 2e 20 49 66 0a 20 20 20 20 2a 2a   file. If.    **
286b0 20 61 20 6e 65 77 20 2a 2d 73 68 6d 20 66 69 6c   a new *-shm fil
286c0 65 20 69 73 20 63 72 65 61 74 65 64 2c 20 61 6e  e is created, an
286d0 20 61 74 74 65 6d 70 74 20 77 69 6c 6c 20 62 65   attempt will be
286e0 20 6d 61 64 65 20 74 6f 20 63 72 65 61 74 65 20   made to create 
286f0 69 74 0a 20 20 20 20 2a 2a 20 77 69 74 68 20 74  it.    ** with t
28700 68 65 20 73 61 6d 65 20 70 65 72 6d 69 73 73 69  he same permissi
28710 6f 6e 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ons..    */.    
28720 69 66 28 20 6f 73 46 73 74 61 74 28 70 44 62 46  if( osFstat(pDbF
28730 64 2d 3e 68 2c 20 26 73 53 74 61 74 29 20 29 7b  d->h, &sStat) ){
28740 0a 20 20 20 20 20 20 73 74 6f 72 65 4c 61 73 74  .      storeLast
28750 45 72 72 6e 6f 28 70 44 62 46 64 2c 20 65 72 72  Errno(pDbFd, err
28760 6e 6f 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  no);.      rc = 
28770 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 46 53 54  SQLITE_IOERR_FST
28780 41 54 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 73  AT;.      goto s
28790 68 6d 5f 6f 70 65 6e 5f 65 72 72 3b 0a 20 20 20  hm_open_err;.   
287a0 20 7d 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28   }..#if defined(
287b0 5f 5f 41 50 50 4c 45 5f 5f 29 20 26 26 20 53 51  __APPLE__) && SQ
287c0 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b  LITE_ENABLE_LOCK
287d0 49 4e 47 5f 53 54 59 4c 45 20 5c 0a 20 20 20 20  ING_STYLE \.    
287e0 20 20 26 26 20 21 64 65 66 69 6e 65 64 28 53 51    && !defined(SQ
287f0 4c 49 54 45 5f 53 48 4d 5f 44 49 52 45 43 54 4f  LITE_SHM_DIRECTO
28800 52 59 29 0a 20 20 20 20 2f 2a 20 49 66 20 70 44  RY).    /* If pD
28810 62 46 64 20 69 73 20 63 6f 6e 66 69 67 75 72 65  bFd is configure
28820 64 20 77 69 74 68 20 70 72 6f 78 79 20 6c 6f 63  d with proxy loc
28830 6b 69 6e 67 20 6d 6f 64 65 2c 20 75 73 65 20 74  king mode, use t
28840 68 65 20 6c 6f 63 61 6c 20 0a 20 20 20 20 2a 2a  he local .    **
28850 20 6c 6f 63 6b 20 66 69 6c 65 20 70 61 74 68 20   lock file path 
28860 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 74 68 65  to determine the
28870 20 2d 73 68 6d 20 66 69 6c 65 20 70 61 74 68 0a   -shm file path.
28880 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 69      */.    if( i
28890 73 50 72 6f 78 79 4c 6f 63 6b 69 6e 67 4d 6f 64  sProxyLockingMod
288a0 65 28 70 44 62 46 64 29 20 29 7b 0a 20 20 20 20  e(pDbFd) ){.    
288b0 20 20 7a 42 61 73 65 50 61 74 68 20 3d 20 70 72    zBasePath = pr
288c0 6f 78 79 53 68 61 72 65 64 4d 65 6d 6f 72 79 42  oxySharedMemoryB
288d0 61 73 65 50 61 74 68 28 70 44 62 46 64 29 3b 0a  asePath(pDbFd);.
288e0 20 20 20 20 20 20 69 66 28 20 21 7a 42 61 73 65        if( !zBase
288f0 50 61 74 68 20 29 7b 0a 20 20 20 20 20 20 20 20  Path ){.        
28900 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 41 4e 54  rc = SQLITE_CANT
28910 4f 50 45 4e 5f 42 4b 50 54 3b 0a 20 20 20 20 20  OPEN_BKPT;.     
28920 20 20 20 67 6f 74 6f 20 73 68 6d 5f 6f 70 65 6e     goto shm_open
28930 5f 65 72 72 3b 0a 20 20 20 20 20 20 7d 0a 20 20  _err;.      }.  
28940 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 0a    }.#endif.    .
28950 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 53 48  #ifdef SQLITE_SH
28960 4d 5f 44 49 52 45 43 54 4f 52 59 0a 20 20 20 20  M_DIRECTORY.    
28970 6e 53 68 6d 46 69 6c 65 6e 61 6d 65 20 3d 20 73  nShmFilename = s
28980 69 7a 65 6f 66 28 53 51 4c 49 54 45 5f 53 48 4d  izeof(SQLITE_SHM
28990 5f 44 49 52 45 43 54 4f 52 59 29 20 2b 20 33 31  _DIRECTORY) + 31
289a0 3b 0a 23 65 6c 73 65 0a 20 20 20 20 6e 53 68 6d  ;.#else.    nShm
289b0 46 69 6c 65 6e 61 6d 65 20 3d 20 36 20 2b 20 28  Filename = 6 + (
289c0 69 6e 74 29 73 74 72 6c 65 6e 28 7a 42 61 73 65  int)strlen(zBase
289d0 50 61 74 68 29 3b 0a 23 65 6e 64 69 66 0a 20 20  Path);.#endif.  
289e0 20 20 70 53 68 6d 4e 6f 64 65 20 3d 20 73 71 6c    pShmNode = sql
289f0 69 74 65 33 5f 6d 61 6c 6c 6f 63 36 34 28 20 73  ite3_malloc64( s
28a00 69 7a 65 6f 66 28 2a 70 53 68 6d 4e 6f 64 65 29  izeof(*pShmNode)
28a10 20 2b 20 6e 53 68 6d 46 69 6c 65 6e 61 6d 65 20   + nShmFilename 
28a20 29 3b 0a 20 20 20 20 69 66 28 20 70 53 68 6d 4e  );.    if( pShmN
28a30 6f 64 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ode==0 ){.      
28a40 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  rc = SQLITE_NOME
28a50 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 67 6f  M_BKPT;.      go
28a60 74 6f 20 73 68 6d 5f 6f 70 65 6e 5f 65 72 72 3b  to shm_open_err;
28a70 0a 20 20 20 20 7d 0a 20 20 20 20 6d 65 6d 73 65  .    }.    memse
28a80 74 28 70 53 68 6d 4e 6f 64 65 2c 20 30 2c 20 73  t(pShmNode, 0, s
28a90 69 7a 65 6f 66 28 2a 70 53 68 6d 4e 6f 64 65 29  izeof(*pShmNode)
28aa0 2b 6e 53 68 6d 46 69 6c 65 6e 61 6d 65 29 3b 0a  +nShmFilename);.
28ab0 20 20 20 20 7a 53 68 6d 46 69 6c 65 6e 61 6d 65      zShmFilename
28ac0 20 3d 20 70 53 68 6d 4e 6f 64 65 2d 3e 7a 46 69   = pShmNode->zFi
28ad0 6c 65 6e 61 6d 65 20 3d 20 28 63 68 61 72 2a 29  lename = (char*)
28ae0 26 70 53 68 6d 4e 6f 64 65 5b 31 5d 3b 0a 23 69  &pShmNode[1];.#i
28af0 66 64 65 66 20 53 51 4c 49 54 45 5f 53 48 4d 5f  fdef SQLITE_SHM_
28b00 44 49 52 45 43 54 4f 52 59 0a 20 20 20 20 73 71  DIRECTORY.    sq
28b10 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e  lite3_snprintf(n
28b20 53 68 6d 46 69 6c 65 6e 61 6d 65 2c 20 7a 53 68  ShmFilename, zSh
28b30 6d 46 69 6c 65 6e 61 6d 65 2c 20 0a 20 20 20 20  mFilename, .    
28b40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28b50 20 53 51 4c 49 54 45 5f 53 48 4d 5f 44 49 52 45   SQLITE_SHM_DIRE
28b60 43 54 4f 52 59 20 22 2f 73 71 6c 69 74 65 2d 73  CTORY "/sqlite-s
28b70 68 6d 2d 25 78 2d 25 78 22 2c 0a 20 20 20 20 20  hm-%x-%x",.     
28b80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28b90 28 75 33 32 29 73 53 74 61 74 2e 73 74 5f 69 6e  (u32)sStat.st_in
28ba0 6f 2c 20 28 75 33 32 29 73 53 74 61 74 2e 73 74  o, (u32)sStat.st
28bb0 5f 64 65 76 29 3b 0a 23 65 6c 73 65 0a 20 20 20  _dev);.#else.   
28bc0 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
28bd0 66 28 6e 53 68 6d 46 69 6c 65 6e 61 6d 65 2c 20  f(nShmFilename, 
28be0 7a 53 68 6d 46 69 6c 65 6e 61 6d 65 2c 20 22 25  zShmFilename, "%
28bf0 73 2d 73 68 6d 22 2c 20 7a 42 61 73 65 50 61 74  s-shm", zBasePat
28c00 68 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 46  h);.    sqlite3F
28c10 69 6c 65 53 75 66 66 69 78 33 28 70 44 62 46 64  ileSuffix3(pDbFd
28c20 2d 3e 7a 50 61 74 68 2c 20 7a 53 68 6d 46 69 6c  ->zPath, zShmFil
28c30 65 6e 61 6d 65 29 3b 0a 23 65 6e 64 69 66 0a 20  ename);.#endif. 
28c40 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 68 20 3d     pShmNode->h =
28c50 20 2d 31 3b 0a 20 20 20 20 70 44 62 46 64 2d 3e   -1;.    pDbFd->
28c60 70 49 6e 6f 64 65 2d 3e 70 53 68 6d 4e 6f 64 65  pInode->pShmNode
28c70 20 3d 20 70 53 68 6d 4e 6f 64 65 3b 0a 20 20 20   = pShmNode;.   
28c80 20 70 53 68 6d 4e 6f 64 65 2d 3e 70 49 6e 6f 64   pShmNode->pInod
28c90 65 20 3d 20 70 44 62 46 64 2d 3e 70 49 6e 6f 64  e = pDbFd->pInod
28ca0 65 3b 0a 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d  e;.    pShmNode-
28cb0 3e 6d 75 74 65 78 20 3d 20 73 71 6c 69 74 65 33  >mutex = sqlite3
28cc0 5f 6d 75 74 65 78 5f 61 6c 6c 6f 63 28 53 51 4c  _mutex_alloc(SQL
28cd0 49 54 45 5f 4d 55 54 45 58 5f 46 41 53 54 29 3b  ITE_MUTEX_FAST);
28ce0 0a 20 20 20 20 69 66 28 20 70 53 68 6d 4e 6f 64  .    if( pShmNod
28cf0 65 2d 3e 6d 75 74 65 78 3d 3d 30 20 29 7b 0a 20  e->mutex==0 ){. 
28d00 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
28d10 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20  _NOMEM_BKPT;.   
28d20 20 20 20 67 6f 74 6f 20 73 68 6d 5f 6f 70 65 6e     goto shm_open
28d30 5f 65 72 72 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  _err;.    }..   
28d40 20 69 66 28 20 70 49 6e 6f 64 65 2d 3e 62 50 72   if( pInode->bPr
28d50 6f 63 65 73 73 4c 6f 63 6b 3d 3d 30 20 29 7b 0a  ocessLock==0 ){.
28d60 20 20 20 20 20 20 69 6e 74 20 6f 70 65 6e 46 6c        int openFl
28d70 61 67 73 20 3d 20 4f 5f 52 44 57 52 20 7c 20 4f  ags = O_RDWR | O
28d80 5f 43 52 45 41 54 3b 0a 20 20 20 20 20 20 69 66  _CREAT;.      if
28d90 28 20 73 71 6c 69 74 65 33 5f 75 72 69 5f 62 6f  ( sqlite3_uri_bo
28da0 6f 6c 65 61 6e 28 70 44 62 46 64 2d 3e 7a 50 61  olean(pDbFd->zPa
28db0 74 68 2c 20 22 72 65 61 64 6f 6e 6c 79 5f 73 68  th, "readonly_sh
28dc0 6d 22 2c 20 30 29 0a 23 69 66 20 64 65 66 69 6e  m", 0).#if defin
28dd0 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ed(SQLITE_ENABLE
28de0 5f 50 45 52 53 49 53 54 5f 57 41 4c 29 26 26 28  _PERSIST_WAL)&&(
28df0 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f  SQLITE_ENABLE_LO
28e00 43 4b 49 4e 47 5f 53 54 59 4c 45 20 5c 0a 20 20  CKING_STYLE \.  
28e10 20 20 7c 7c 20 64 65 66 69 6e 65 64 28 5f 5f 41    || defined(__A
28e20 50 50 4c 45 5f 5f 29 29 0a 20 20 20 20 20 20 20  PPLE__)).       
28e30 20 20 7c 7c 20 28 70 44 62 46 64 2d 3e 6f 70 65    || (pDbFd->ope
28e40 6e 46 6c 61 67 73 20 26 20 4f 5f 52 44 57 52 29  nFlags & O_RDWR)
28e50 20 21 3d 20 4f 5f 52 44 57 52 0a 23 65 6e 64 69   != O_RDWR.#endi
28e60 66 0a 20 20 20 20 20 20 20 20 20 29 7b 0a 20 20  f.         ){.  
28e70 20 20 20 20 20 20 6f 70 65 6e 46 6c 61 67 73 20        openFlags 
28e80 3d 20 4f 5f 52 44 4f 4e 4c 59 3b 0a 20 20 20 20  = O_RDONLY;.    
28e90 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 69 73      pShmNode->is
28ea0 52 65 61 64 6f 6e 6c 79 20 3d 20 31 3b 0a 20 20  Readonly = 1;.  
28eb0 20 20 20 20 7d 0a 20 20 20 20 20 20 70 53 68 6d      }.      pShm
28ec0 4e 6f 64 65 2d 3e 68 20 3d 20 72 6f 62 75 73 74  Node->h = robust
28ed0 5f 6f 70 65 6e 28 7a 53 68 6d 46 69 6c 65 6e 61  _open(zShmFilena
28ee0 6d 65 2c 20 6f 70 65 6e 46 6c 61 67 73 2c 20 28  me, openFlags, (
28ef0 73 53 74 61 74 2e 73 74 5f 6d 6f 64 65 26 30 37  sStat.st_mode&07
28f00 37 37 29 29 3b 0a 20 20 20 20 20 20 69 66 28 20  77));.      if( 
28f10 70 53 68 6d 4e 6f 64 65 2d 3e 68 3c 30 20 29 7b  pShmNode->h<0 ){
28f20 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 75 6e  .        rc = un
28f30 69 78 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54  ixLogError(SQLIT
28f40 45 5f 43 41 4e 54 4f 50 45 4e 5f 42 4b 50 54 2c  E_CANTOPEN_BKPT,
28f50 20 22 6f 70 65 6e 22 2c 20 7a 53 68 6d 46 69 6c   "open", zShmFil
28f60 65 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20  ename);.        
28f70 67 6f 74 6f 20 73 68 6d 5f 6f 70 65 6e 5f 65 72  goto shm_open_er
28f80 72 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  r;.      }..    
28f90 20 20 2f 2a 20 49 66 20 74 68 69 73 20 70 72 6f    /* If this pro
28fa0 63 65 73 73 20 69 73 20 72 75 6e 6e 69 6e 67 20  cess is running 
28fb0 61 73 20 72 6f 6f 74 2c 20 6d 61 6b 65 20 73 75  as root, make su
28fc0 72 65 20 74 68 61 74 20 74 68 65 20 53 48 4d 20  re that the SHM 
28fd0 66 69 6c 65 0a 20 20 20 20 20 20 2a 2a 20 69 73  file.      ** is
28fe0 20 6f 77 6e 65 64 20 62 79 20 74 68 65 20 73 61   owned by the sa
28ff0 6d 65 20 75 73 65 72 20 74 68 61 74 20 6f 77 6e  me user that own
29000 73 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 64  s the original d
29010 61 74 61 62 61 73 65 2e 20 20 4f 74 68 65 72 77  atabase.  Otherw
29020 69 73 65 2c 0a 20 20 20 20 20 20 2a 2a 20 74 68  ise,.      ** th
29030 65 20 6f 72 69 67 69 6e 61 6c 20 6f 77 6e 65 72  e original owner
29040 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 61 62 6c   will not be abl
29050 65 20 74 6f 20 63 6f 6e 6e 65 63 74 2e 0a 20 20  e to connect..  
29060 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 72 6f 62      */.      rob
29070 75 73 74 46 63 68 6f 77 6e 28 70 53 68 6d 4e 6f  ustFchown(pShmNo
29080 64 65 2d 3e 68 2c 20 73 53 74 61 74 2e 73 74 5f  de->h, sStat.st_
29090 75 69 64 2c 20 73 53 74 61 74 2e 73 74 5f 67 69  uid, sStat.st_gi
290a0 64 29 3b 0a 20 20 0a 20 20 20 20 20 20 2f 2a 20  d);.  .      /* 
290b0 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20  Check to see if 
290c0 61 6e 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20  another process 
290d0 69 73 20 68 6f 6c 64 69 6e 67 20 74 68 65 20 64  is holding the d
290e0 65 61 64 2d 6d 61 6e 20 73 77 69 74 63 68 2e 0a  ead-man switch..
290f0 20 20 20 20 20 20 2a 2a 20 49 66 20 6e 6f 74 2c        ** If not,
29100 20 74 72 75 6e 63 61 74 65 20 74 68 65 20 66 69   truncate the fi
29110 6c 65 20 74 6f 20 7a 65 72 6f 20 6c 65 6e 67 74  le to zero lengt
29120 68 2e 20 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  h. .      */.   
29130 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f     rc = SQLITE_O
29140 4b 3b 0a 20 20 20 20 20 20 69 66 28 20 75 6e 69  K;.      if( uni
29150 78 53 68 6d 53 79 73 74 65 6d 4c 6f 63 6b 28 70  xShmSystemLock(p
29160 44 62 46 64 2c 20 46 5f 57 52 4c 43 4b 2c 20 55  DbFd, F_WRLCK, U
29170 4e 49 58 5f 53 48 4d 5f 44 4d 53 2c 20 31 29 3d  NIX_SHM_DMS, 1)=
29180 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
29190 20 20 20 20 20 20 69 66 28 20 72 6f 62 75 73 74        if( robust
291a0 5f 66 74 72 75 6e 63 61 74 65 28 70 53 68 6d 4e  _ftruncate(pShmN
291b0 6f 64 65 2d 3e 68 2c 20 30 29 20 29 7b 0a 20 20  ode->h, 0) ){.  
291c0 20 20 20 20 20 20 20 20 72 63 20 3d 20 75 6e 69          rc = uni
291d0 78 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45  xLogError(SQLITE
291e0 5f 49 4f 45 52 52 5f 53 48 4d 4f 50 45 4e 2c 20  _IOERR_SHMOPEN, 
291f0 22 66 74 72 75 6e 63 61 74 65 22 2c 20 7a 53 68  "ftruncate", zSh
29200 6d 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20  mFilename);.    
29210 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
29220 20 20 20 20 20 2f 2a 20 49 66 20 72 75 6e 6e 69       /* If runni
29230 6e 67 20 61 73 20 72 6f 6f 74 20 73 65 74 20 74  ng as root set t
29240 68 65 20 75 69 64 2f 67 69 64 20 6f 66 20 74 68  he uid/gid of th
29250 65 20 73 68 6d 20 66 69 6c 65 20 74 6f 20 6d 61  e shm file to ma
29260 74 63 68 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  tch.          **
29270 20 74 68 65 20 64 61 74 61 62 61 73 65 20 2a 2f   the database */
29280 0a 20 20 20 20 20 20 20 20 20 20 75 69 64 5f 74  .          uid_t
29290 20 65 75 69 64 20 3d 20 67 65 74 65 75 69 64 28   euid = geteuid(
292a0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
292b0 20 28 21 70 53 68 6d 4e 6f 64 65 2d 3e 69 73 52   (!pShmNode->isR
292c0 65 61 64 6f 6e 6c 79 29 20 26 26 20 65 75 69 64  eadonly) && euid
292d0 3d 3d 30 20 26 26 20 28 65 75 69 64 21 3d 73 53  ==0 && (euid!=sS
292e0 74 61 74 2e 73 74 5f 75 69 64 20 7c 7c 20 67 65  tat.st_uid || ge
292f0 74 65 67 69 64 28 29 21 3d 73 53 74 61 74 2e 73  tegid()!=sStat.s
29300 74 5f 67 69 64 29 20 29 7b 0a 20 20 20 20 20 20  t_gid) ){.      
29310 20 20 20 20 20 20 69 66 28 20 6f 73 46 63 68 6f        if( osFcho
29320 77 6e 28 70 53 68 6d 4e 6f 64 65 2d 3e 68 2c 20  wn(pShmNode->h, 
29330 73 53 74 61 74 2e 73 74 5f 75 69 64 2c 20 73 53  sStat.st_uid, sS
29340 74 61 74 2e 73 74 5f 67 69 64 29 20 29 7b 0a 20  tat.st_gid) ){. 
29350 20 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20               rc 
29360 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53  = SQLITE_IOERR_S
29370 48 4d 4f 50 45 4e 3b 0a 20 20 20 20 20 20 20 20  HMOPEN;.        
29380 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
29390 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
293a0 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72 63    }.      if( rc
293b0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
293c0 20 20 20 20 20 20 20 72 63 20 3d 20 75 6e 69 78         rc = unix
293d0 53 68 6d 53 79 73 74 65 6d 4c 6f 63 6b 28 70 44  ShmSystemLock(pD
293e0 62 46 64 2c 20 46 5f 52 44 4c 43 4b 2c 20 55 4e  bFd, F_RDLCK, UN
293f0 49 58 5f 53 48 4d 5f 44 4d 53 2c 20 31 29 3b 0a  IX_SHM_DMS, 1);.
29400 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
29410 28 20 72 63 20 29 20 67 6f 74 6f 20 73 68 6d 5f  ( rc ) goto shm_
29420 6f 70 65 6e 5f 65 72 72 3b 0a 20 20 20 20 7d 0a  open_err;.    }.
29430 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 74    }..  /* Make t
29440 68 65 20 6e 65 77 20 63 6f 6e 6e 65 63 74 69 6f  he new connectio
29450 6e 20 61 20 63 68 69 6c 64 20 6f 66 20 74 68 65  n a child of the
29460 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20 2a 2f 0a   unixShmNode */.
29470 20 20 70 2d 3e 70 53 68 6d 4e 6f 64 65 20 3d 20    p->pShmNode = 
29480 70 53 68 6d 4e 6f 64 65 3b 0a 23 69 66 64 65 66  pShmNode;.#ifdef
29490 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20   SQLITE_DEBUG.  
294a0 70 2d 3e 69 64 20 3d 20 70 53 68 6d 4e 6f 64 65  p->id = pShmNode
294b0 2d 3e 6e 65 78 74 53 68 6d 49 64 2b 2b 3b 0a 23  ->nextShmId++;.#
294c0 65 6e 64 69 66 0a 20 20 70 53 68 6d 4e 6f 64 65  endif.  pShmNode
294d0 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 70 44 62 46  ->nRef++;.  pDbF
294e0 64 2d 3e 70 53 68 6d 20 3d 20 70 3b 0a 20 20 75  d->pShm = p;.  u
294f0 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b  nixLeaveMutex();
29500 0a 0a 20 20 2f 2a 20 54 68 65 20 72 65 66 65 72  ..  /* The refer
29510 65 6e 63 65 20 63 6f 75 6e 74 20 6f 6e 20 70 53  ence count on pS
29520 68 6d 4e 6f 64 65 20 68 61 73 20 61 6c 72 65 61  hmNode has alrea
29530 64 79 20 62 65 65 6e 20 69 6e 63 72 65 6d 65 6e  dy been incremen
29540 74 65 64 20 75 6e 64 65 72 0a 20 20 2a 2a 20 74  ted under.  ** t
29550 68 65 20 63 6f 76 65 72 20 6f 66 20 74 68 65 20  he cover of the 
29560 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29  unixEnterMutex()
29570 20 6d 75 74 65 78 20 61 6e 64 20 74 68 65 20 70   mutex and the p
29580 6f 69 6e 74 65 72 20 66 72 6f 6d 20 74 68 65 0a  ointer from the.
29590 20 20 2a 2a 20 6e 65 77 20 28 73 74 72 75 63 74    ** new (struct
295a0 20 75 6e 69 78 53 68 6d 29 20 6f 62 6a 65 63 74   unixShm) object
295b0 20 74 6f 20 74 68 65 20 70 53 68 6d 4e 6f 64 65   to the pShmNode
295c0 20 68 61 73 20 62 65 65 6e 20 73 65 74 2e 20 41   has been set. A
295d0 6c 6c 20 74 68 61 74 20 69 73 0a 20 20 2a 2a 20  ll that is.  ** 
295e0 6c 65 66 74 20 74 6f 20 64 6f 20 69 73 20 74 6f  left to do is to
295f0 20 6c 69 6e 6b 20 74 68 65 20 6e 65 77 20 6f 62   link the new ob
29600 6a 65 63 74 20 69 6e 74 6f 20 74 68 65 20 6c 69  ject into the li
29610 6e 6b 65 64 20 6c 69 73 74 20 73 74 61 72 74 69  nked list starti
29620 6e 67 0a 20 20 2a 2a 20 61 74 20 70 53 68 6d 4e  ng.  ** at pShmN
29630 6f 64 65 2d 3e 70 46 69 72 73 74 2e 20 54 68 69  ode->pFirst. Thi
29640 73 20 6d 75 73 74 20 62 65 20 64 6f 6e 65 20 77  s must be done w
29650 68 69 6c 65 20 68 6f 6c 64 69 6e 67 20 74 68 65  hile holding the
29660 20 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78   pShmNode->mutex
29670 20 0a 20 20 2a 2a 20 6d 75 74 65 78 2e 0a 20 20   .  ** mutex..  
29680 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  */.  sqlite3_mut
29690 65 78 5f 65 6e 74 65 72 28 70 53 68 6d 4e 6f 64  ex_enter(pShmNod
296a0 65 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 70 2d 3e  e->mutex);.  p->
296b0 70 4e 65 78 74 20 3d 20 70 53 68 6d 4e 6f 64 65  pNext = pShmNode
296c0 2d 3e 70 46 69 72 73 74 3b 0a 20 20 70 53 68 6d  ->pFirst;.  pShm
296d0 4e 6f 64 65 2d 3e 70 46 69 72 73 74 20 3d 20 70  Node->pFirst = p
296e0 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  ;.  sqlite3_mute
296f0 78 5f 6c 65 61 76 65 28 70 53 68 6d 4e 6f 64 65  x_leave(pShmNode
29700 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75  ->mutex);.  retu
29710 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20  rn SQLITE_OK;.. 
29720 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 6f 6e   /* Jump here on
29730 20 61 6e 79 20 65 72 72 6f 72 20 2a 2f 0a 73 68   any error */.sh
29740 6d 5f 6f 70 65 6e 5f 65 72 72 3a 0a 20 20 75 6e  m_open_err:.  un
29750 69 78 53 68 6d 50 75 72 67 65 28 70 44 62 46 64  ixShmPurge(pDbFd
29760 29 3b 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73  );       /* This
29770 20 63 61 6c 6c 20 66 72 65 65 73 20 70 53 68 6d   call frees pShm
29780 4e 6f 64 65 20 69 66 20 72 65 71 75 69 72 65 64  Node if required
29790 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66 72   */.  sqlite3_fr
297a0 65 65 28 70 29 3b 0a 20 20 75 6e 69 78 4c 65 61  ee(p);.  unixLea
297b0 76 65 4d 75 74 65 78 28 29 3b 0a 20 20 72 65 74  veMutex();.  ret
297c0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
297d0 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
297e0 73 20 63 61 6c 6c 65 64 20 74 6f 20 6f 62 74 61  s called to obta
297f0 69 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  in a pointer to 
29800 72 65 67 69 6f 6e 20 69 52 65 67 69 6f 6e 20 6f  region iRegion o
29810 66 20 74 68 65 20 0a 2a 2a 20 73 68 61 72 65 64  f the .** shared
29820 2d 6d 65 6d 6f 72 79 20 61 73 73 6f 63 69 61 74  -memory associat
29830 65 64 20 77 69 74 68 20 74 68 65 20 64 61 74 61  ed with the data
29840 62 61 73 65 20 66 69 6c 65 20 66 64 2e 20 53 68  base file fd. Sh
29850 61 72 65 64 2d 6d 65 6d 6f 72 79 20 72 65 67 69  ared-memory regi
29860 6f 6e 73 20 0a 2a 2a 20 61 72 65 20 6e 75 6d 62  ons .** are numb
29870 65 72 65 64 20 73 74 61 72 74 69 6e 67 20 66 72  ered starting fr
29880 6f 6d 20 7a 65 72 6f 2e 20 45 61 63 68 20 73 68  om zero. Each sh
29890 61 72 65 64 2d 6d 65 6d 6f 72 79 20 72 65 67 69  ared-memory regi
298a0 6f 6e 20 69 73 20 73 7a 52 65 67 69 6f 6e 20 0a  on is szRegion .
298b0 2a 2a 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65  ** bytes in size
298c0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72  ..**.** If an er
298d0 72 6f 72 20 6f 63 63 75 72 73 2c 20 61 6e 20 65  ror occurs, an e
298e0 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74  rror code is ret
298f0 75 72 6e 65 64 20 61 6e 64 20 2a 70 70 20 69 73  urned and *pp is
29900 20 73 65 74 20 74 6f 20 4e 55 4c 4c 2e 0a 2a 2a   set to NULL..**
29910 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 69  .** Otherwise, i
29920 66 20 74 68 65 20 62 45 78 74 65 6e 64 20 70 61  f the bExtend pa
29930 72 61 6d 65 74 65 72 20 69 73 20 30 20 61 6e 64  rameter is 0 and
29940 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20 73   the requested s
29950 68 61 72 65 64 2d 6d 65 6d 6f 72 79 0a 2a 2a 20  hared-memory.** 
29960 72 65 67 69 6f 6e 20 68 61 73 20 6e 6f 74 20 62  region has not b
29970 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 20 28 62  een allocated (b
29980 79 20 61 6e 79 20 63 6c 69 65 6e 74 2c 20 69 6e  y any client, in
29990 63 6c 75 64 69 6e 67 20 6f 6e 65 20 72 75 6e 6e  cluding one runn
299a0 69 6e 67 20 69 6e 20 61 0a 2a 2a 20 73 65 70 61  ing in a.** sepa
299b0 72 61 74 65 20 70 72 6f 63 65 73 73 29 2c 20 74  rate process), t
299c0 68 65 6e 20 2a 70 70 20 69 73 20 73 65 74 20 74  hen *pp is set t
299d0 6f 20 4e 55 4c 4c 20 61 6e 64 20 53 51 4c 49 54  o NULL and SQLIT
299e0 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e 20 49  E_OK returned. I
299f0 66 20 0a 2a 2a 20 62 45 78 74 65 6e 64 20 69 73  f .** bExtend is
29a00 20 6e 6f 6e 2d 7a 65 72 6f 20 61 6e 64 20 74 68   non-zero and th
29a10 65 20 72 65 71 75 65 73 74 65 64 20 73 68 61 72  e requested shar
29a20 65 64 2d 6d 65 6d 6f 72 79 20 72 65 67 69 6f 6e  ed-memory region
29a30 20 68 61 73 20 6e 6f 74 20 79 65 74 20 0a 2a 2a   has not yet .**
29a40 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 2c   been allocated,
29a50 20 69 74 20 69 73 20 61 6c 6c 6f 63 61 74 65 64   it is allocated
29a60 20 62 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f   by this functio
29a70 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  n..**.** If the 
29a80 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 72 65  shared-memory re
29a90 67 69 6f 6e 20 68 61 73 20 61 6c 72 65 61 64 79  gion has already
29aa0 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 20   been allocated 
29ab0 6f 72 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 20  or is allocated 
29ac0 62 79 0a 2a 2a 20 74 68 69 73 20 63 61 6c 6c 20  by.** this call 
29ad0 61 73 20 64 65 73 63 72 69 62 65 64 20 61 62 6f  as described abo
29ae0 76 65 2c 20 74 68 65 6e 20 69 74 20 69 73 20 6d  ve, then it is m
29af0 61 70 70 65 64 20 69 6e 74 6f 20 74 68 69 73 20  apped into this 
29b00 70 72 6f 63 65 73 73 65 73 20 0a 2a 2a 20 61 64  processes .** ad
29b10 64 72 65 73 73 20 73 70 61 63 65 20 28 69 66 20  dress space (if 
29b20 69 74 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64  it is not alread
29b30 79 29 2c 20 2a 70 70 20 69 73 20 73 65 74 20 74  y), *pp is set t
29b40 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 6d  o point to the m
29b50 61 70 70 65 64 20 0a 2a 2a 20 6d 65 6d 6f 72 79  apped .** memory
29b60 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20 72   and SQLITE_OK r
29b70 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74  eturned..*/.stat
29b80 69 63 20 69 6e 74 20 75 6e 69 78 53 68 6d 4d 61  ic int unixShmMa
29b90 70 28 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c  p(.  sqlite3_fil
29ba0 65 20 2a 66 64 2c 20 20 20 20 20 20 20 20 20 20  e *fd,          
29bb0 20 20 20 20 20 2f 2a 20 48 61 6e 64 6c 65 20 6f       /* Handle o
29bc0 70 65 6e 20 6f 6e 20 64 61 74 61 62 61 73 65 20  pen on database 
29bd0 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69 52  file */.  int iR
29be0 65 67 69 6f 6e 2c 20 20 20 20 20 20 20 20 20 20  egion,          
29bf0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 67            /* Reg
29c00 69 6f 6e 20 74 6f 20 72 65 74 72 69 65 76 65 20  ion to retrieve 
29c10 2a 2f 0a 20 20 69 6e 74 20 73 7a 52 65 67 69 6f  */.  int szRegio
29c20 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  n,              
29c30 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20       /* Size of 
29c40 72 65 67 69 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74  regions */.  int
29c50 20 62 45 78 74 65 6e 64 2c 20 20 20 20 20 20 20   bExtend,       
29c60 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
29c70 54 72 75 65 20 74 6f 20 65 78 74 65 6e 64 20 66  True to extend f
29c80 69 6c 65 20 69 66 20 6e 65 63 65 73 73 61 72 79  ile if necessary
29c90 20 2a 2f 0a 20 20 76 6f 69 64 20 76 6f 6c 61 74   */.  void volat
29ca0 69 6c 65 20 2a 2a 70 70 20 20 20 20 20 20 20 20  ile **pp        
29cb0 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 4d 61        /* OUT: Ma
29cc0 70 70 65 64 20 6d 65 6d 6f 72 79 20 2a 2f 0a 29  pped memory */.)
29cd0 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 44  {.  unixFile *pD
29ce0 62 46 64 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a  bFd = (unixFile*
29cf0 29 66 64 3b 0a 20 20 75 6e 69 78 53 68 6d 20 2a  )fd;.  unixShm *
29d00 70 3b 0a 20 20 75 6e 69 78 53 68 6d 4e 6f 64 65  p;.  unixShmNode
29d10 20 2a 70 53 68 6d 4e 6f 64 65 3b 0a 20 20 69 6e   *pShmNode;.  in
29d20 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
29d30 3b 0a 20 20 69 6e 74 20 6e 53 68 6d 50 65 72 4d  ;.  int nShmPerM
29d40 61 70 20 3d 20 75 6e 69 78 53 68 6d 52 65 67 69  ap = unixShmRegi
29d50 6f 6e 50 65 72 4d 61 70 28 29 3b 0a 20 20 69 6e  onPerMap();.  in
29d60 74 20 6e 52 65 71 52 65 67 69 6f 6e 3b 0a 0a 20  t nReqRegion;.. 
29d70 20 2f 2a 20 49 66 20 74 68 65 20 73 68 61 72 65   /* If the share
29d80 64 2d 6d 65 6d 6f 72 79 20 66 69 6c 65 20 68 61  d-memory file ha
29d90 73 20 6e 6f 74 20 79 65 74 20 62 65 65 6e 20 6f  s not yet been o
29da0 70 65 6e 65 64 2c 20 6f 70 65 6e 20 69 74 20 6e  pened, open it n
29db0 6f 77 2e 20 2a 2f 0a 20 20 69 66 28 20 70 44 62  ow. */.  if( pDb
29dc0 46 64 2d 3e 70 53 68 6d 3d 3d 30 20 29 7b 0a 20  Fd->pShm==0 ){. 
29dd0 20 20 20 72 63 20 3d 20 75 6e 69 78 4f 70 65 6e     rc = unixOpen
29de0 53 68 61 72 65 64 4d 65 6d 6f 72 79 28 70 44 62  SharedMemory(pDb
29df0 46 64 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  Fd);.    if( rc!
29e00 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74  =SQLITE_OK ) ret
29e10 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 70  urn rc;.  }..  p
29e20 20 3d 20 70 44 62 46 64 2d 3e 70 53 68 6d 3b 0a   = pDbFd->pShm;.
29e30 20 20 70 53 68 6d 4e 6f 64 65 20 3d 20 70 2d 3e    pShmNode = p->
29e40 70 53 68 6d 4e 6f 64 65 3b 0a 20 20 73 71 6c 69  pShmNode;.  sqli
29e50 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28  te3_mutex_enter(
29e60 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 29  pShmNode->mutex)
29e70 3b 0a 20 20 61 73 73 65 72 74 28 20 73 7a 52 65  ;.  assert( szRe
29e80 67 69 6f 6e 3d 3d 70 53 68 6d 4e 6f 64 65 2d 3e  gion==pShmNode->
29e90 73 7a 52 65 67 69 6f 6e 20 7c 7c 20 70 53 68 6d  szRegion || pShm
29ea0 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e 3d 3d 30  Node->nRegion==0
29eb0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53   );.  assert( pS
29ec0 68 6d 4e 6f 64 65 2d 3e 70 49 6e 6f 64 65 3d 3d  hmNode->pInode==
29ed0 70 44 62 46 64 2d 3e 70 49 6e 6f 64 65 20 29 3b  pDbFd->pInode );
29ee0 0a 20 20 61 73 73 65 72 74 28 20 70 53 68 6d 4e  .  assert( pShmN
29ef0 6f 64 65 2d 3e 68 3e 3d 30 20 7c 7c 20 70 44 62  ode->h>=0 || pDb
29f00 46 64 2d 3e 70 49 6e 6f 64 65 2d 3e 62 50 72 6f  Fd->pInode->bPro
29f10 63 65 73 73 4c 6f 63 6b 3d 3d 31 20 29 3b 0a 20  cessLock==1 );. 
29f20 20 61 73 73 65 72 74 28 20 70 53 68 6d 4e 6f 64   assert( pShmNod
29f30 65 2d 3e 68 3c 30 20 7c 7c 20 70 44 62 46 64 2d  e->h<0 || pDbFd-
29f40 3e 70 49 6e 6f 64 65 2d 3e 62 50 72 6f 63 65 73  >pInode->bProces
29f50 73 4c 6f 63 6b 3d 3d 30 20 29 3b 0a 0a 20 20 2f  sLock==0 );..  /
29f60 2a 20 4d 69 6e 69 6d 75 6d 20 6e 75 6d 62 65 72  * Minimum number
29f70 20 6f 66 20 72 65 67 69 6f 6e 73 20 72 65 71 75   of regions requ
29f80 69 72 65 64 20 74 6f 20 62 65 20 6d 61 70 70 65  ired to be mappe
29f90 64 2e 20 2a 2f 0a 20 20 6e 52 65 71 52 65 67 69  d. */.  nReqRegi
29fa0 6f 6e 20 3d 20 28 28 69 52 65 67 69 6f 6e 2b 6e  on = ((iRegion+n
29fb0 53 68 6d 50 65 72 4d 61 70 29 20 2f 20 6e 53 68  ShmPerMap) / nSh
29fc0 6d 50 65 72 4d 61 70 29 20 2a 20 6e 53 68 6d 50  mPerMap) * nShmP
29fd0 65 72 4d 61 70 3b 0a 0a 20 20 69 66 28 20 70 53  erMap;..  if( pS
29fe0 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e 3c  hmNode->nRegion<
29ff0 6e 52 65 71 52 65 67 69 6f 6e 20 29 7b 0a 20 20  nReqRegion ){.  
2a000 20 20 63 68 61 72 20 2a 2a 61 70 4e 65 77 3b 20    char **apNew; 
2a010 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a020 20 20 20 20 20 2f 2a 20 4e 65 77 20 61 70 52 65       /* New apRe
2a030 67 69 6f 6e 5b 5d 20 61 72 72 61 79 20 2a 2f 0a  gion[] array */.
2a040 20 20 20 20 69 6e 74 20 6e 42 79 74 65 20 3d 20      int nByte = 
2a050 6e 52 65 71 52 65 67 69 6f 6e 2a 73 7a 52 65 67  nReqRegion*szReg
2a060 69 6f 6e 3b 20 20 20 2f 2a 20 4d 69 6e 69 6d 75  ion;   /* Minimu
2a070 6d 20 72 65 71 75 69 72 65 64 20 66 69 6c 65 20  m required file 
2a080 73 69 7a 65 20 2a 2f 0a 20 20 20 20 73 74 72 75  size */.    stru
2a090 63 74 20 73 74 61 74 20 73 53 74 61 74 3b 20 20  ct stat sStat;  
2a0a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2a0b0 2a 20 55 73 65 64 20 62 79 20 66 73 74 61 74 28  * Used by fstat(
2a0c0 29 20 2a 2f 0a 0a 20 20 20 20 70 53 68 6d 4e 6f  ) */..    pShmNo
2a0d0 64 65 2d 3e 73 7a 52 65 67 69 6f 6e 20 3d 20 73  de->szRegion = s
2a0e0 7a 52 65 67 69 6f 6e 3b 0a 0a 20 20 20 20 69 66  zRegion;..    if
2a0f0 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 68 3e 3d 30  ( pShmNode->h>=0
2a100 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65   ){.      /* The
2a110 20 72 65 71 75 65 73 74 65 64 20 72 65 67 69 6f   requested regio
2a120 6e 20 69 73 20 6e 6f 74 20 6d 61 70 70 65 64 20  n is not mapped 
2a130 69 6e 74 6f 20 74 68 69 73 20 70 72 6f 63 65 73  into this proces
2a140 73 65 73 20 61 64 64 72 65 73 73 20 73 70 61 63  ses address spac
2a150 65 2e 0a 20 20 20 20 20 20 2a 2a 20 43 68 65 63  e..      ** Chec
2a160 6b 20 74 6f 20 73 65 65 20 69 66 20 69 74 20 68  k to see if it h
2a170 61 73 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65  as been allocate
2a180 64 20 28 69 2e 65 2e 20 69 66 20 74 68 65 20 77  d (i.e. if the w
2a190 61 6c 2d 69 6e 64 65 78 20 66 69 6c 65 20 69 73  al-index file is
2a1a0 0a 20 20 20 20 20 20 2a 2a 20 6c 61 72 67 65 20  .      ** large 
2a1b0 65 6e 6f 75 67 68 20 74 6f 20 63 6f 6e 74 61 69  enough to contai
2a1c0 6e 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20  n the requested 
2a1d0 72 65 67 69 6f 6e 29 2e 0a 20 20 20 20 20 20 2a  region)..      *
2a1e0 2f 0a 20 20 20 20 20 20 69 66 28 20 6f 73 46 73  /.      if( osFs
2a1f0 74 61 74 28 70 53 68 6d 4e 6f 64 65 2d 3e 68 2c  tat(pShmNode->h,
2a200 20 26 73 53 74 61 74 29 20 29 7b 0a 20 20 20 20   &sStat) ){.    
2a210 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
2a220 49 4f 45 52 52 5f 53 48 4d 53 49 5a 45 3b 0a 20  IOERR_SHMSIZE;. 
2a230 20 20 20 20 20 20 20 67 6f 74 6f 20 73 68 6d 70         goto shmp
2a240 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20 20 20 7d  age_out;.      }
2a250 0a 20 20 0a 20 20 20 20 20 20 69 66 28 20 73 53  .  .      if( sS
2a260 74 61 74 2e 73 74 5f 73 69 7a 65 3c 6e 42 79 74  tat.st_size<nByt
2a270 65 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  e ){.        /* 
2a280 54 68 65 20 72 65 71 75 65 73 74 65 64 20 6d 65  The requested me
2a290 6d 6f 72 79 20 72 65 67 69 6f 6e 20 64 6f 65 73  mory region does
2a2a0 20 6e 6f 74 20 65 78 69 73 74 2e 20 49 66 20 62   not exist. If b
2a2b0 45 78 74 65 6e 64 20 69 73 20 73 65 74 20 74 6f  Extend is set to
2a2c0 0a 20 20 20 20 20 20 20 20 2a 2a 20 66 61 6c 73  .        ** fals
2a2d0 65 2c 20 65 78 69 74 20 65 61 72 6c 79 2e 20 2a  e, exit early. *
2a2e0 70 70 20 77 69 6c 6c 20 62 65 20 73 65 74 20 74  pp will be set t
2a2f0 6f 20 4e 55 4c 4c 20 61 6e 64 20 53 51 4c 49 54  o NULL and SQLIT
2a300 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e 0a 20  E_OK returned.. 
2a310 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
2a320 20 20 69 66 28 20 21 62 45 78 74 65 6e 64 20 29    if( !bExtend )
2a330 7b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f  {.          goto
2a340 20 73 68 6d 70 61 67 65 5f 6f 75 74 3b 0a 20 20   shmpage_out;.  
2a350 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20        }..       
2a360 20 2f 2a 20 41 6c 74 65 72 6e 61 74 69 76 65 6c   /* Alternativel
2a370 79 2c 20 69 66 20 62 45 78 74 65 6e 64 20 69 73  y, if bExtend is
2a380 20 74 72 75 65 2c 20 65 78 74 65 6e 64 20 74 68   true, extend th
2a390 65 20 66 69 6c 65 2e 20 44 6f 20 74 68 69 73 20  e file. Do this 
2a3a0 62 79 0a 20 20 20 20 20 20 20 20 2a 2a 20 77 72  by.        ** wr
2a3b0 69 74 69 6e 67 20 61 20 73 69 6e 67 6c 65 20 62  iting a single b
2a3c0 79 74 65 20 74 6f 20 74 68 65 20 65 6e 64 20 6f  yte to the end o
2a3d0 66 20 65 61 63 68 20 28 4f 53 29 20 70 61 67 65  f each (OS) page
2a3e0 20 62 65 69 6e 67 0a 20 20 20 20 20 20 20 20 2a   being.        *
2a3f0 2a 20 61 6c 6c 6f 63 61 74 65 64 20 6f 72 20 65  * allocated or e
2a400 78 74 65 6e 64 65 64 2e 20 54 65 63 68 6e 69 63  xtended. Technic
2a410 61 6c 6c 79 2c 20 77 65 20 6e 65 65 64 20 6f 6e  ally, we need on
2a420 6c 79 20 77 72 69 74 65 20 74 6f 20 74 68 65 0a  ly write to the.
2a430 20 20 20 20 20 20 20 20 2a 2a 20 6c 61 73 74 20          ** last 
2a440 70 61 67 65 20 69 6e 20 6f 72 64 65 72 20 74 6f  page in order to
2a450 20 65 78 74 65 6e 64 20 74 68 65 20 66 69 6c 65   extend the file
2a460 2e 20 42 75 74 20 77 72 69 74 69 6e 67 20 74 6f  . But writing to
2a470 20 61 6c 6c 20 6e 65 77 0a 20 20 20 20 20 20 20   all new.       
2a480 20 2a 2a 20 70 61 67 65 73 20 66 6f 72 63 65 73   ** pages forces
2a490 20 74 68 65 20 4f 53 20 74 6f 20 61 6c 6c 6f 63   the OS to alloc
2a4a0 61 74 65 20 74 68 65 6d 20 69 6d 6d 65 64 69 61  ate them immedia
2a4b0 74 65 6c 79 2c 20 77 68 69 63 68 20 72 65 64 75  tely, which redu
2a4c0 63 65 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 74  ces.        ** t
2a4d0 68 65 20 63 68 61 6e 63 65 73 20 6f 66 20 53 49  he chances of SI
2a4e0 47 42 55 53 20 77 68 69 6c 65 20 61 63 63 65 73  GBUS while acces
2a4f0 73 69 6e 67 20 74 68 65 20 6d 61 70 70 65 64 20  sing the mapped 
2a500 72 65 67 69 6f 6e 20 6c 61 74 65 72 20 6f 6e 2e  region later on.
2a510 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
2a520 20 20 20 20 65 6c 73 65 7b 0a 20 20 20 20 20 20      else{.      
2a530 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74      static const
2a540 20 69 6e 74 20 70 67 73 7a 20 3d 20 34 30 39 36   int pgsz = 4096
2a550 3b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20  ;.          int 
2a560 69 50 67 3b 0a 0a 20 20 20 20 20 20 20 20 20 20  iPg;..          
2a570 2f 2a 20 57 72 69 74 65 20 74 6f 20 74 68 65 20  /* Write to the 
2a580 6c 61 73 74 20 62 79 74 65 20 6f 66 20 65 61 63  last byte of eac
2a590 68 20 6e 65 77 6c 79 20 61 6c 6c 6f 63 61 74 65  h newly allocate
2a5a0 64 20 6f 72 20 65 78 74 65 6e 64 65 64 20 70 61  d or extended pa
2a5b0 67 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  ge */.          
2a5c0 61 73 73 65 72 74 28 20 28 6e 42 79 74 65 20 25  assert( (nByte %
2a5d0 20 70 67 73 7a 29 3d 3d 30 20 29 3b 0a 20 20 20   pgsz)==0 );.   
2a5e0 20 20 20 20 20 20 20 66 6f 72 28 69 50 67 3d 28         for(iPg=(
2a5f0 73 53 74 61 74 2e 73 74 5f 73 69 7a 65 2f 70 67  sStat.st_size/pg
2a600 73 7a 29 3b 20 69 50 67 3c 28 6e 42 79 74 65 2f  sz); iPg<(nByte/
2a610 70 67 73 7a 29 3b 20 69 50 67 2b 2b 29 7b 0a 20  pgsz); iPg++){. 
2a620 20 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 78             int x
2a630 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20   = 0;.          
2a640 20 20 69 66 28 20 73 65 65 6b 41 6e 64 57 72 69    if( seekAndWri
2a650 74 65 46 64 28 70 53 68 6d 4e 6f 64 65 2d 3e 68  teFd(pShmNode->h
2a660 2c 20 69 50 67 2a 70 67 73 7a 20 2b 20 70 67 73  , iPg*pgsz + pgs
2a670 7a 2d 31 2c 20 22 22 2c 20 31 2c 20 26 78 29 21  z-1, "", 1, &x)!
2a680 3d 31 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =1 ){.          
2a690 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
2a6a0 7a 46 69 6c 65 20 3d 20 70 53 68 6d 4e 6f 64 65  zFile = pShmNode
2a6b0 2d 3e 7a 46 69 6c 65 6e 61 6d 65 3b 0a 20 20 20  ->zFilename;.   
2a6c0 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20             rc = 
2a6d0 75 6e 69 78 4c 6f 67 45 72 72 6f 72 28 53 51 4c  unixLogError(SQL
2a6e0 49 54 45 5f 49 4f 45 52 52 5f 53 48 4d 53 49 5a  ITE_IOERR_SHMSIZ
2a6f0 45 2c 20 22 77 72 69 74 65 22 2c 20 7a 46 69 6c  E, "write", zFil
2a700 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  e);.            
2a710 20 20 67 6f 74 6f 20 73 68 6d 70 61 67 65 5f 6f    goto shmpage_o
2a720 75 74 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ut;.            
2a730 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  }.          }.  
2a740 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
2a750 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 4d 61      }..    /* Ma
2a760 70 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20  p the requested 
2a770 6d 65 6d 6f 72 79 20 72 65 67 69 6f 6e 20 69 6e  memory region in
2a780 74 6f 20 74 68 69 73 20 70 72 6f 63 65 73 73 65  to this processe
2a790 73 20 61 64 64 72 65 73 73 20 73 70 61 63 65 2e  s address space.
2a7a0 20 2a 2f 0a 20 20 20 20 61 70 4e 65 77 20 3d 20   */.    apNew = 
2a7b0 28 63 68 61 72 20 2a 2a 29 73 71 6c 69 74 65 33  (char **)sqlite3
2a7c0 5f 72 65 61 6c 6c 6f 63 28 0a 20 20 20 20 20 20  _realloc(.      
2a7d0 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 61 70 52 65    pShmNode->apRe
2a7e0 67 69 6f 6e 2c 20 6e 52 65 71 52 65 67 69 6f 6e  gion, nReqRegion
2a7f0 2a 73 69 7a 65 6f 66 28 63 68 61 72 20 2a 29 0a  *sizeof(char *).
2a800 20 20 20 20 29 3b 0a 20 20 20 20 69 66 28 20 21      );.    if( !
2a810 61 70 4e 65 77 20 29 7b 0a 20 20 20 20 20 20 72  apNew ){.      r
2a820 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  c = SQLITE_IOERR
2a830 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20  _NOMEM_BKPT;.   
2a840 20 20 20 67 6f 74 6f 20 73 68 6d 70 61 67 65 5f     goto shmpage_
2a850 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  out;.    }.    p
2a860 53 68 6d 4e 6f 64 65 2d 3e 61 70 52 65 67 69 6f  ShmNode->apRegio
2a870 6e 20 3d 20 61 70 4e 65 77 3b 0a 20 20 20 20 77  n = apNew;.    w
2a880 68 69 6c 65 28 20 70 53 68 6d 4e 6f 64 65 2d 3e  hile( pShmNode->
2a890 6e 52 65 67 69 6f 6e 3c 6e 52 65 71 52 65 67 69  nRegion<nReqRegi
2a8a0 6f 6e 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  on ){.      int 
2a8b0 6e 4d 61 70 20 3d 20 73 7a 52 65 67 69 6f 6e 2a  nMap = szRegion*
2a8c0 6e 53 68 6d 50 65 72 4d 61 70 3b 0a 20 20 20 20  nShmPerMap;.    
2a8d0 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 76    int i;.      v
2a8e0 6f 69 64 20 2a 70 4d 65 6d 3b 0a 20 20 20 20 20  oid *pMem;.     
2a8f0 20 69 66 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 68   if( pShmNode->h
2a900 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70  >=0 ){.        p
2a910 4d 65 6d 20 3d 20 6f 73 4d 6d 61 70 28 30 2c 20  Mem = osMmap(0, 
2a920 6e 4d 61 70 2c 0a 20 20 20 20 20 20 20 20 20 20  nMap,.          
2a930 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 69 73 52 65    pShmNode->isRe
2a940 61 64 6f 6e 6c 79 20 3f 20 50 52 4f 54 5f 52 45  adonly ? PROT_RE
2a950 41 44 20 3a 20 50 52 4f 54 5f 52 45 41 44 7c 50  AD : PROT_READ|P
2a960 52 4f 54 5f 57 52 49 54 45 2c 20 0a 20 20 20 20  ROT_WRITE, .    
2a970 20 20 20 20 20 20 20 20 4d 41 50 5f 53 48 41 52          MAP_SHAR
2a980 45 44 2c 20 70 53 68 6d 4e 6f 64 65 2d 3e 68 2c  ED, pShmNode->h,
2a990 20 73 7a 52 65 67 69 6f 6e 2a 28 69 36 34 29 70   szRegion*(i64)p
2a9a0 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e  ShmNode->nRegion
2a9b0 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20  .        );.    
2a9c0 20 20 20 20 69 66 28 20 70 4d 65 6d 3d 3d 4d 41      if( pMem==MA
2a9d0 50 5f 46 41 49 4c 45 44 20 29 7b 0a 20 20 20 20  P_FAILED ){.    
2a9e0 20 20 20 20 20 20 72 63 20 3d 20 75 6e 69 78 4c        rc = unixL
2a9f0 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49  ogError(SQLITE_I
2aa00 4f 45 52 52 5f 53 48 4d 4d 41 50 2c 20 22 6d 6d  OERR_SHMMAP, "mm
2aa10 61 70 22 2c 20 70 53 68 6d 4e 6f 64 65 2d 3e 7a  ap", pShmNode->z
2aa20 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20 20  Filename);.     
2aa30 20 20 20 20 20 67 6f 74 6f 20 73 68 6d 70 61 67       goto shmpag
2aa40 65 5f 6f 75 74 3b 0a 20 20 20 20 20 20 20 20 7d  e_out;.        }
2aa50 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
2aa60 20 20 20 20 20 20 70 4d 65 6d 20 3d 20 73 71 6c        pMem = sql
2aa70 69 74 65 33 5f 6d 61 6c 6c 6f 63 36 34 28 73 7a  ite3_malloc64(sz
2aa80 52 65 67 69 6f 6e 29 3b 0a 20 20 20 20 20 20 20  Region);.       
2aa90 20 69 66 28 20 70 4d 65 6d 3d 3d 30 20 29 7b 0a   if( pMem==0 ){.
2aaa0 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53            rc = S
2aab0 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54  QLITE_NOMEM_BKPT
2aac0 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f  ;.          goto
2aad0 20 73 68 6d 70 61 67 65 5f 6f 75 74 3b 0a 20 20   shmpage_out;.  
2aae0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
2aaf0 6d 65 6d 73 65 74 28 70 4d 65 6d 2c 20 30 2c 20  memset(pMem, 0, 
2ab00 73 7a 52 65 67 69 6f 6e 29 3b 0a 20 20 20 20 20  szRegion);.     
2ab10 20 7d 0a 0a 20 20 20 20 20 20 66 6f 72 28 69 3d   }..      for(i=
2ab20 30 3b 20 69 3c 6e 53 68 6d 50 65 72 4d 61 70 3b  0; i<nShmPerMap;
2ab30 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 70   i++){.        p
2ab40 53 68 6d 4e 6f 64 65 2d 3e 61 70 52 65 67 69 6f  ShmNode->apRegio
2ab50 6e 5b 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67  n[pShmNode->nReg
2ab60 69 6f 6e 2b 69 5d 20 3d 20 26 28 28 63 68 61 72  ion+i] = &((char
2ab70 2a 29 70 4d 65 6d 29 5b 73 7a 52 65 67 69 6f 6e  *)pMem)[szRegion
2ab80 2a 69 5d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  *i];.      }.   
2ab90 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65     pShmNode->nRe
2aba0 67 69 6f 6e 20 2b 3d 20 6e 53 68 6d 50 65 72 4d  gion += nShmPerM
2abb0 61 70 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 73  ap;.    }.  }..s
2abc0 68 6d 70 61 67 65 5f 6f 75 74 3a 0a 20 20 69 66  hmpage_out:.  if
2abd0 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67  ( pShmNode->nReg
2abe0 69 6f 6e 3e 69 52 65 67 69 6f 6e 20 29 7b 0a 20  ion>iRegion ){. 
2abf0 20 20 20 2a 70 70 20 3d 20 70 53 68 6d 4e 6f 64     *pp = pShmNod
2ac00 65 2d 3e 61 70 52 65 67 69 6f 6e 5b 69 52 65 67  e->apRegion[iReg
2ac10 69 6f 6e 5d 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  ion];.  }else{. 
2ac20 20 20 20 2a 70 70 20 3d 20 30 3b 0a 20 20 7d 0a     *pp = 0;.  }.
2ac30 20 20 69 66 28 20 70 53 68 6d 4e 6f 64 65 2d 3e    if( pShmNode->
2ac40 69 73 52 65 61 64 6f 6e 6c 79 20 26 26 20 72 63  isReadonly && rc
2ac50 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 63  ==SQLITE_OK ) rc
2ac60 20 3d 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e   = SQLITE_READON
2ac70 4c 59 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75  LY;.  sqlite3_mu
2ac80 74 65 78 5f 6c 65 61 76 65 28 70 53 68 6d 4e 6f  tex_leave(pShmNo
2ac90 64 65 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65  de->mutex);.  re
2aca0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
2acb0 2a 20 43 68 61 6e 67 65 20 74 68 65 20 6c 6f 63  * Change the loc
2acc0 6b 20 73 74 61 74 65 20 66 6f 72 20 61 20 73 68  k state for a sh
2acd0 61 72 65 64 2d 6d 65 6d 6f 72 79 20 73 65 67 6d  ared-memory segm
2ace0 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20  ent..**.** Note 
2acf0 74 68 61 74 20 74 68 65 20 72 65 6c 61 74 69 6f  that the relatio
2ad00 6e 73 68 69 70 20 62 65 74 77 65 65 6e 20 53 48  nship between SH
2ad10 41 52 45 64 20 61 6e 64 20 45 58 43 4c 55 53 49  AREd and EXCLUSI
2ad20 56 45 20 6c 6f 63 6b 73 20 69 73 20 61 20 6c 69  VE locks is a li
2ad30 74 74 6c 65 0a 2a 2a 20 64 69 66 66 65 72 65 6e  ttle.** differen
2ad40 74 20 68 65 72 65 20 74 68 61 6e 20 69 6e 20 70  t here than in p
2ad50 6f 73 69 78 2e 20 20 49 6e 20 78 53 68 6d 4c 6f  osix.  In xShmLo
2ad60 63 6b 28 29 2c 20 6f 6e 65 20 63 61 6e 20 67 6f  ck(), one can go
2ad70 20 66 72 6f 6d 20 75 6e 6c 6f 63 6b 65 64 0a 2a   from unlocked.*
2ad80 2a 20 74 6f 20 73 68 61 72 65 64 20 61 6e 64 20  * to shared and 
2ad90 62 61 63 6b 20 6f 72 20 66 72 6f 6d 20 75 6e 6c  back or from unl
2ada0 6f 63 6b 65 64 20 74 6f 20 65 78 63 6c 75 73 69  ocked to exclusi
2adb0 76 65 20 61 6e 64 20 62 61 63 6b 2e 20 20 42 75  ve and back.  Bu
2adc0 74 20 6f 6e 65 20 6d 61 79 0a 2a 2a 20 6e 6f 74  t one may.** not
2add0 20 67 6f 20 66 72 6f 6d 20 73 68 61 72 65 64 20   go from shared 
2ade0 74 6f 20 65 78 63 6c 75 73 69 76 65 20 6f 72 20  to exclusive or 
2adf0 66 72 6f 6d 20 65 78 63 6c 75 73 69 76 65 20 74  from exclusive t
2ae00 6f 20 73 68 61 72 65 64 2e 0a 2a 2f 0a 73 74 61  o shared..*/.sta
2ae10 74 69 63 20 69 6e 74 20 75 6e 69 78 53 68 6d 4c  tic int unixShmL
2ae20 6f 63 6b 28 0a 20 20 73 71 6c 69 74 65 33 5f 66  ock(.  sqlite3_f
2ae30 69 6c 65 20 2a 66 64 2c 20 20 20 20 20 20 20 20  ile *fd,        
2ae40 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 66 69    /* Database fi
2ae50 6c 65 20 68 6f 6c 64 69 6e 67 20 74 68 65 20 73  le holding the s
2ae60 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 2a 2f 0a  hared memory */.
2ae70 20 20 69 6e 74 20 6f 66 73 74 2c 20 20 20 20 20    int ofst,     
2ae80 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2ae90 46 69 72 73 74 20 6c 6f 63 6b 20 74 6f 20 61 63  First lock to ac
2aea0 71 75 69 72 65 20 6f 72 20 72 65 6c 65 61 73 65  quire or release
2aeb0 20 2a 2f 0a 20 20 69 6e 74 20 6e 2c 20 20 20 20   */.  int n,    
2aec0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2aed0 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6c 6f   /* Number of lo
2aee0 63 6b 73 20 74 6f 20 61 63 71 75 69 72 65 20 6f  cks to acquire o
2aef0 72 20 72 65 6c 65 61 73 65 20 2a 2f 0a 20 20 69  r release */.  i
2af00 6e 74 20 66 6c 61 67 73 20 20 20 20 20 20 20 20  nt flags        
2af10 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 68 61            /* Wha
2af20 74 20 74 6f 20 64 6f 20 77 69 74 68 20 74 68 65  t to do with the
2af30 20 6c 6f 63 6b 20 2a 2f 0a 29 7b 0a 20 20 75 6e   lock */.){.  un
2af40 69 78 46 69 6c 65 20 2a 70 44 62 46 64 20 3d 20  ixFile *pDbFd = 
2af50 28 75 6e 69 78 46 69 6c 65 2a 29 66 64 3b 20 20  (unixFile*)fd;  
2af60 20 20 20 20 2f 2a 20 43 6f 6e 6e 65 63 74 69 6f      /* Connectio
2af70 6e 20 68 6f 6c 64 69 6e 67 20 73 68 61 72 65 64  n holding shared
2af80 20 6d 65 6d 6f 72 79 20 2a 2f 0a 20 20 75 6e 69   memory */.  uni
2af90 78 53 68 6d 20 2a 70 20 3d 20 70 44 62 46 64 2d  xShm *p = pDbFd-
2afa0 3e 70 53 68 6d 3b 20 20 20 20 20 20 20 20 20 20  >pShm;          
2afb0 20 20 20 2f 2a 20 54 68 65 20 73 68 61 72 65 64     /* The shared
2afc0 20 6d 65 6d 6f 72 79 20 62 65 69 6e 67 20 6c 6f   memory being lo
2afd0 63 6b 65 64 20 2a 2f 0a 20 20 75 6e 69 78 53 68  cked */.  unixSh
2afe0 6d 20 2a 70 58 3b 20 20 20 20 20 20 20 20 20 20  m *pX;          
2aff0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b000 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f  /* For looping o
2b010 76 65 72 20 61 6c 6c 20 73 69 62 6c 69 6e 67 73  ver all siblings
2b020 20 2a 2f 0a 20 20 75 6e 69 78 53 68 6d 4e 6f 64   */.  unixShmNod
2b030 65 20 2a 70 53 68 6d 4e 6f 64 65 20 3d 20 70 2d  e *pShmNode = p-
2b040 3e 70 53 68 6d 4e 6f 64 65 3b 20 20 2f 2a 20 54  >pShmNode;  /* T
2b050 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 66 69  he underlying fi
2b060 6c 65 20 69 4e 6f 64 65 20 2a 2f 0a 20 20 69 6e  le iNode */.  in
2b070 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
2b080 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2b090 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f      /* Result co
2b0a0 64 65 20 2a 2f 0a 20 20 75 31 36 20 6d 61 73 6b  de */.  u16 mask
2b0b0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2b0c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2b0d0 20 4d 61 73 6b 20 6f 66 20 6c 6f 63 6b 73 20 74   Mask of locks t
2b0e0 6f 20 74 61 6b 65 20 6f 72 20 72 65 6c 65 61 73  o take or releas
2b0f0 65 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20  e */..  assert( 
2b100 70 53 68 6d 4e 6f 64 65 3d 3d 70 44 62 46 64 2d  pShmNode==pDbFd-
2b110 3e 70 49 6e 6f 64 65 2d 3e 70 53 68 6d 4e 6f 64  >pInode->pShmNod
2b120 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  e );.  assert( p
2b130 53 68 6d 4e 6f 64 65 2d 3e 70 49 6e 6f 64 65 3d  ShmNode->pInode=
2b140 3d 70 44 62 46 64 2d 3e 70 49 6e 6f 64 65 20 29  =pDbFd->pInode )
2b150 3b 0a 20 20 61 73 73 65 72 74 28 20 6f 66 73 74  ;.  assert( ofst
2b160 3e 3d 30 20 26 26 20 6f 66 73 74 2b 6e 3c 3d 53  >=0 && ofst+n<=S
2b170 51 4c 49 54 45 5f 53 48 4d 5f 4e 4c 4f 43 4b 20  QLITE_SHM_NLOCK 
2b180 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 3e 3d  );.  assert( n>=
2b190 31 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 66  1 );.  assert( f
2b1a0 6c 61 67 73 3d 3d 28 53 51 4c 49 54 45 5f 53 48  lags==(SQLITE_SH
2b1b0 4d 5f 4c 4f 43 4b 20 7c 20 53 51 4c 49 54 45 5f  M_LOCK | SQLITE_
2b1c0 53 48 4d 5f 53 48 41 52 45 44 29 0a 20 20 20 20  SHM_SHARED).    
2b1d0 20 20 20 7c 7c 20 66 6c 61 67 73 3d 3d 28 53 51     || flags==(SQ
2b1e0 4c 49 54 45 5f 53 48 4d 5f 4c 4f 43 4b 20 7c 20  LITE_SHM_LOCK | 
2b1f0 53 51 4c 49 54 45 5f 53 48 4d 5f 45 58 43 4c 55  SQLITE_SHM_EXCLU
2b200 53 49 56 45 29 0a 20 20 20 20 20 20 20 7c 7c 20  SIVE).       || 
2b210 66 6c 61 67 73 3d 3d 28 53 51 4c 49 54 45 5f 53  flags==(SQLITE_S
2b220 48 4d 5f 55 4e 4c 4f 43 4b 20 7c 20 53 51 4c 49  HM_UNLOCK | 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 55 4e 4c 4f  (SQLITE_SHM_UNLO
2b260 43 4b 20 7c 20 53 51 4c 49 54 45 5f 53 48 4d 5f  CK | SQLITE_SHM_
2b270 45 58 43 4c 55 53 49 56 45 29 20 29 3b 0a 20 20  EXCLUSIVE) );.  
2b280 61 73 73 65 72 74 28 20 6e 3d 3d 31 20 7c 7c 20  assert( n==1 || 
2b290 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  (flags & SQLITE_
2b2a0 53 48 4d 5f 45 58 43 4c 55 53 49 56 45 29 21 3d  SHM_EXCLUSIVE)!=
2b2b0 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
2b2c0 53 68 6d 4e 6f 64 65 2d 3e 68 3e 3d 30 20 7c 7c  ShmNode->h>=0 ||
2b2d0 20 70 44 62 46 64 2d 3e 70 49 6e 6f 64 65 2d 3e   pDbFd->pInode->
2b2e0 62 50 72 6f 63 65 73 73 4c 6f 63 6b 3d 3d 31 20  bProcessLock==1 
2b2f0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53 68  );.  assert( pSh
2b300 6d 4e 6f 64 65 2d 3e 68 3c 30 20 7c 7c 20 70 44  mNode->h<0 || pD
2b310 62 46 64 2d 3e 70 49 6e 6f 64 65 2d 3e 62 50 72  bFd->pInode->bPr
2b320 6f 63 65 73 73 4c 6f 63 6b 3d 3d 30 20 29 3b 0a  ocessLock==0 );.
2b330 0a 20 20 6d 61 73 6b 20 3d 20 28 31 3c 3c 28 6f  .  mask = (1<<(o
2b340 66 73 74 2b 6e 29 29 20 2d 20 28 31 3c 3c 6f 66  fst+n)) - (1<<of
2b350 73 74 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e  st);.  assert( n
2b360 3e 31 20 7c 7c 20 6d 61 73 6b 3d 3d 28 31 3c 3c  >1 || mask==(1<<
2b370 6f 66 73 74 29 20 29 3b 0a 20 20 73 71 6c 69 74  ofst) );.  sqlit
2b380 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 70  e3_mutex_enter(p
2b390 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 29 3b  ShmNode->mutex);
2b3a0 0a 20 20 69 66 28 20 66 6c 61 67 73 20 26 20 53  .  if( flags & S
2b3b0 51 4c 49 54 45 5f 53 48 4d 5f 55 4e 4c 4f 43 4b  QLITE_SHM_UNLOCK
2b3c0 20 29 7b 0a 20 20 20 20 75 31 36 20 61 6c 6c 4d   ){.    u16 allM
2b3d0 61 73 6b 20 3d 20 30 3b 20 2f 2a 20 4d 61 73 6b  ask = 0; /* Mask
2b3e0 20 6f 66 20 6c 6f 63 6b 73 20 68 65 6c 64 20 62   of locks held b
2b3f0 79 20 73 69 62 6c 69 6e 67 73 20 2a 2f 0a 0a 20  y siblings */.. 
2b400 20 20 20 2f 2a 20 53 65 65 20 69 66 20 61 6e 79     /* See if any
2b410 20 73 69 62 6c 69 6e 67 73 20 68 6f 6c 64 20 74   siblings hold t
2b420 68 69 73 20 73 61 6d 65 20 6c 6f 63 6b 20 2a 2f  his same lock */
2b430 0a 20 20 20 20 66 6f 72 28 70 58 3d 70 53 68 6d  .    for(pX=pShm
2b440 4e 6f 64 65 2d 3e 70 46 69 72 73 74 3b 20 70 58  Node->pFirst; pX
2b450 3b 20 70 58 3d 70 58 2d 3e 70 4e 65 78 74 29 7b  ; pX=pX->pNext){
2b460 0a 20 20 20 20 20 20 69 66 28 20 70 58 3d 3d 70  .      if( pX==p
2b470 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
2b480 20 20 20 61 73 73 65 72 74 28 20 28 70 58 2d 3e     assert( (pX->
2b490 65 78 63 6c 4d 61 73 6b 20 26 20 28 70 2d 3e 65  exclMask & (p->e
2b4a0 78 63 6c 4d 61 73 6b 7c 70 2d 3e 73 68 61 72 65  xclMask|p->share
2b4b0 64 4d 61 73 6b 29 29 3d 3d 30 20 29 3b 0a 20 20  dMask))==0 );.  
2b4c0 20 20 20 20 61 6c 6c 4d 61 73 6b 20 7c 3d 20 70      allMask |= p
2b4d0 58 2d 3e 73 68 61 72 65 64 4d 61 73 6b 3b 0a 20  X->sharedMask;. 
2b4e0 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 55 6e 6c     }..    /* Unl
2b4f0 6f 63 6b 20 74 68 65 20 73 79 73 74 65 6d 2d 6c  ock the system-l
2b500 65 76 65 6c 20 6c 6f 63 6b 73 20 2a 2f 0a 20 20  evel locks */.  
2b510 20 20 69 66 28 20 28 6d 61 73 6b 20 26 20 61 6c    if( (mask & al
2b520 6c 4d 61 73 6b 29 3d 3d 30 20 29 7b 0a 20 20 20  lMask)==0 ){.   
2b530 20 20 20 72 63 20 3d 20 75 6e 69 78 53 68 6d 53     rc = unixShmS
2b540 79 73 74 65 6d 4c 6f 63 6b 28 70 44 62 46 64 2c  ystemLock(pDbFd,
2b550 20 46 5f 55 4e 4c 43 4b 2c 20 6f 66 73 74 2b 55   F_UNLCK, ofst+U
2b560 4e 49 58 5f 53 48 4d 5f 42 41 53 45 2c 20 6e 29  NIX_SHM_BASE, n)
2b570 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
2b580 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f     rc = SQLITE_O
2b590 4b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  K;.    }..    /*
2b5a0 20 55 6e 64 6f 20 74 68 65 20 6c 6f 63 61 6c 20   Undo the local 
2b5b0 6c 6f 63 6b 73 20 2a 2f 0a 20 20 20 20 69 66 28  locks */.    if(
2b5c0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
2b5d0 7b 0a 20 20 20 20 20 20 70 2d 3e 65 78 63 6c 4d  {.      p->exclM
2b5e0 61 73 6b 20 26 3d 20 7e 6d 61 73 6b 3b 0a 20 20  ask &= ~mask;.  
2b5f0 20 20 20 20 70 2d 3e 73 68 61 72 65 64 4d 61 73      p->sharedMas
2b600 6b 20 26 3d 20 7e 6d 61 73 6b 3b 0a 20 20 20 20  k &= ~mask;.    
2b610 7d 20 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 66  } .  }else if( f
2b620 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 53 48  lags & SQLITE_SH
2b630 4d 5f 53 48 41 52 45 44 20 29 7b 0a 20 20 20 20  M_SHARED ){.    
2b640 75 31 36 20 61 6c 6c 53 68 61 72 65 64 20 3d 20  u16 allShared = 
2b650 30 3b 20 20 2f 2a 20 55 6e 69 6f 6e 20 6f 66 20  0;  /* Union of 
2b660 6c 6f 63 6b 73 20 68 65 6c 64 20 62 79 20 63 6f  locks held by co
2b670 6e 6e 65 63 74 69 6f 6e 73 20 6f 74 68 65 72 20  nnections other 
2b680 74 68 61 6e 20 22 70 22 20 2a 2f 0a 0a 20 20 20  than "p" */..   
2b690 20 2f 2a 20 46 69 6e 64 20 6f 75 74 20 77 68 69   /* Find out whi
2b6a0 63 68 20 73 68 61 72 65 64 20 6c 6f 63 6b 73 20  ch shared locks 
2b6b0 61 72 65 20 61 6c 72 65 61 64 79 20 68 65 6c 64  are already held
2b6c0 20 62 79 20 73 69 62 6c 69 6e 67 20 63 6f 6e 6e   by sibling conn
2b6d0 65 63 74 69 6f 6e 73 2e 0a 20 20 20 20 2a 2a 20  ections..    ** 
2b6e0 49 66 20 61 6e 79 20 73 69 62 6c 69 6e 67 20 61  If any sibling a
2b6f0 6c 72 65 61 64 79 20 68 6f 6c 64 73 20 61 6e 20  lready holds an 
2b700 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 2c 20  exclusive lock, 
2b710 67 6f 20 61 68 65 61 64 20 61 6e 64 20 72 65 74  go ahead and ret
2b720 75 72 6e 0a 20 20 20 20 2a 2a 20 53 51 4c 49 54  urn.    ** SQLIT
2b730 45 5f 42 55 53 59 2e 0a 20 20 20 20 2a 2f 0a 20  E_BUSY..    */. 
2b740 20 20 20 66 6f 72 28 70 58 3d 70 53 68 6d 4e 6f     for(pX=pShmNo
2b750 64 65 2d 3e 70 46 69 72 73 74 3b 20 70 58 3b 20  de->pFirst; pX; 
2b760 70 58 3d 70 58 2d 3e 70 4e 65 78 74 29 7b 0a 20  pX=pX->pNext){. 
2b770 20 20 20 20 20 69 66 28 20 28 70 58 2d 3e 65 78       if( (pX->ex
2b780 63 6c 4d 61 73 6b 20 26 20 6d 61 73 6b 29 21 3d  clMask & mask)!=
2b790 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  0 ){.        rc 
2b7a0 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20  = SQLITE_BUSY;. 
2b7b0 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
2b7c0 20 20 20 20 7d 0a 20 20 20 20 20 20 61 6c 6c 53      }.      allS
2b7d0 68 61 72 65 64 20 7c 3d 20 70 58 2d 3e 73 68 61  hared |= pX->sha
2b7e0 72 65 64 4d 61 73 6b 3b 0a 20 20 20 20 7d 0a 0a  redMask;.    }..
2b7f0 20 20 20 20 2f 2a 20 47 65 74 20 73 68 61 72 65      /* Get share
2b800 64 20 6c 6f 63 6b 73 20 61 74 20 74 68 65 20 73  d locks at the s
2b810 79 73 74 65 6d 20 6c 65 76 65 6c 2c 20 69 66 20  ystem level, if 
2b820 6e 65 63 65 73 73 61 72 79 20 2a 2f 0a 20 20 20  necessary */.   
2b830 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
2b840 4f 4b 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  OK ){.      if( 
2b850 28 61 6c 6c 53 68 61 72 65 64 20 26 20 6d 61 73  (allShared & mas
2b860 6b 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  k)==0 ){.       
2b870 20 72 63 20 3d 20 75 6e 69 78 53 68 6d 53 79 73   rc = unixShmSys
2b880 74 65 6d 4c 6f 63 6b 28 70 44 62 46 64 2c 20 46  temLock(pDbFd, F
2b890 5f 52 44 4c 43 4b 2c 20 6f 66 73 74 2b 55 4e 49  _RDLCK, ofst+UNI
2b8a0 58 5f 53 48 4d 5f 42 41 53 45 2c 20 6e 29 3b 0a  X_SHM_BASE, n);.
2b8b0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
2b8c0 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
2b8d0 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  _OK;.      }.   
2b8e0 20 7d 0a 0a 20 20 20 20 2f 2a 20 47 65 74 20 74   }..    /* Get t
2b8f0 68 65 20 6c 6f 63 61 6c 20 73 68 61 72 65 64 20  he local shared 
2b900 6c 6f 63 6b 73 20 2a 2f 0a 20 20 20 20 69 66 28  locks */.    if(
2b910 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
2b920 7b 0a 20 20 20 20 20 20 70 2d 3e 73 68 61 72 65  {.      p->share
2b930 64 4d 61 73 6b 20 7c 3d 20 6d 61 73 6b 3b 0a 20  dMask |= mask;. 
2b940 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20     }.  }else{.  
2b950 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 6e    /* Make sure n
2b960 6f 20 73 69 62 6c 69 6e 67 20 63 6f 6e 6e 65 63  o sibling connec
2b970 74 69 6f 6e 73 20 68 6f 6c 64 20 6c 6f 63 6b 73  tions hold locks
2b980 20 74 68 61 74 20 77 69 6c 6c 20 62 6c 6f 63 6b   that will block
2b990 20 74 68 69 73 0a 20 20 20 20 2a 2a 20 6c 6f 63   this.    ** loc
2b9a0 6b 2e 20 20 49 66 20 61 6e 79 20 64 6f 2c 20 72  k.  If any do, r
2b9b0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53  eturn SQLITE_BUS
2b9c0 59 20 72 69 67 68 74 20 61 77 61 79 2e 0a 20 20  Y right away..  
2b9d0 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28 70 58 3d    */.    for(pX=
2b9e0 70 53 68 6d 4e 6f 64 65 2d 3e 70 46 69 72 73 74  pShmNode->pFirst
2b9f0 3b 20 70 58 3b 20 70 58 3d 70 58 2d 3e 70 4e 65  ; pX; pX=pX->pNe
2ba00 78 74 29 7b 0a 20 20 20 20 20 20 69 66 28 20 28  xt){.      if( (
2ba10 70 58 2d 3e 65 78 63 6c 4d 61 73 6b 20 26 20 6d  pX->exclMask & m
2ba20 61 73 6b 29 21 3d 30 20 7c 7c 20 28 70 58 2d 3e  ask)!=0 || (pX->
2ba30 73 68 61 72 65 64 4d 61 73 6b 20 26 20 6d 61 73  sharedMask & mas
2ba40 6b 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  k)!=0 ){.       
2ba50 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53   rc = SQLITE_BUS
2ba60 59 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  Y;.        break
2ba70 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
2ba80 20 20 0a 20 20 20 20 2f 2a 20 47 65 74 20 74 68    .    /* Get th
2ba90 65 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b  e exclusive lock
2baa0 73 20 61 74 20 74 68 65 20 73 79 73 74 65 6d 20  s at the system 
2bab0 6c 65 76 65 6c 2e 20 20 54 68 65 6e 20 69 66 20  level.  Then if 
2bac0 73 75 63 63 65 73 73 66 75 6c 0a 20 20 20 20 2a  successful.    *
2bad0 2a 20 61 6c 73 6f 20 6d 61 72 6b 20 74 68 65 20  * also mark the 
2bae0 6c 6f 63 61 6c 20 63 6f 6e 6e 65 63 74 69 6f 6e  local connection
2baf0 20 61 73 20 62 65 69 6e 67 20 6c 6f 63 6b 65 64   as being locked
2bb00 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
2bb10 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
2bb20 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 75 6e 69  {.      rc = uni
2bb30 78 53 68 6d 53 79 73 74 65 6d 4c 6f 63 6b 28 70  xShmSystemLock(p
2bb40 44 62 46 64 2c 20 46 5f 57 52 4c 43 4b 2c 20 6f  DbFd, F_WRLCK, o
2bb50 66 73 74 2b 55 4e 49 58 5f 53 48 4d 5f 42 41 53  fst+UNIX_SHM_BAS
2bb60 45 2c 20 6e 29 3b 0a 20 20 20 20 20 20 69 66 28  E, n);.      if(
2bb70 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
2bb80 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  {.        assert
2bb90 28 20 28 70 2d 3e 73 68 61 72 65 64 4d 61 73 6b  ( (p->sharedMask
2bba0 20 26 20 6d 61 73 6b 29 3d 3d 30 20 29 3b 0a 20   & mask)==0 );. 
2bbb0 20 20 20 20 20 20 20 70 2d 3e 65 78 63 6c 4d 61         p->exclMa
2bbc0 73 6b 20 7c 3d 20 6d 61 73 6b 3b 0a 20 20 20 20  sk |= mask;.    
2bbd0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20    }.    }.  }.  
2bbe0 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65  sqlite3_mutex_le
2bbf0 61 76 65 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75  ave(pShmNode->mu
2bc00 74 65 78 29 3b 0a 20 20 4f 53 54 52 41 43 45 28  tex);.  OSTRACE(
2bc10 28 22 53 48 4d 2d 4c 4f 43 4b 20 73 68 6d 69 64  ("SHM-LOCK shmid
2bc20 2d 25 64 2c 20 70 69 64 2d 25 64 20 67 6f 74 20  -%d, pid-%d got 
2bc30 25 30 33 78 2c 25 30 33 78 5c 6e 22 2c 0a 20 20  %03x,%03x\n",.  
2bc40 20 20 20 20 20 20 20 20 20 70 2d 3e 69 64 2c 20           p->id, 
2bc50 6f 73 47 65 74 70 69 64 28 30 29 2c 20 70 2d 3e  osGetpid(0), p->
2bc60 73 68 61 72 65 64 4d 61 73 6b 2c 20 70 2d 3e 65  sharedMask, p->e
2bc70 78 63 6c 4d 61 73 6b 29 29 3b 0a 20 20 72 65 74  xclMask));.  ret
2bc80 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
2bc90 20 49 6d 70 6c 65 6d 65 6e 74 20 61 20 6d 65 6d   Implement a mem
2bca0 6f 72 79 20 62 61 72 72 69 65 72 20 6f 72 20 6d  ory barrier or m
2bcb0 65 6d 6f 72 79 20 66 65 6e 63 65 20 6f 6e 20 73  emory fence on s
2bcc0 68 61 72 65 64 20 6d 65 6d 6f 72 79 2e 20 20 0a  hared memory.  .
2bcd0 2a 2a 0a 2a 2a 20 41 6c 6c 20 6c 6f 61 64 73 20  **.** All loads 
2bce0 61 6e 64 20 73 74 6f 72 65 73 20 62 65 67 75 6e  and stores begun
2bcf0 20 62 65 66 6f 72 65 20 74 68 65 20 62 61 72 72   before the barr
2bd00 69 65 72 20 6d 75 73 74 20 63 6f 6d 70 6c 65 74  ier must complet
2bd10 65 20 62 65 66 6f 72 65 0a 2a 2a 20 61 6e 79 20  e before.** any 
2bd20 6c 6f 61 64 20 6f 72 20 73 74 6f 72 65 20 62 65  load or store be
2bd30 67 75 6e 20 61 66 74 65 72 20 74 68 65 20 62 61  gun after the ba
2bd40 72 72 69 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63  rrier..*/.static
2bd50 20 76 6f 69 64 20 75 6e 69 78 53 68 6d 42 61 72   void unixShmBar
2bd60 72 69 65 72 28 0a 20 20 73 71 6c 69 74 65 33 5f  rier(.  sqlite3_
2bd70 66 69 6c 65 20 2a 66 64 20 20 20 20 20 20 20 20  file *fd        
2bd80 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62          /* Datab
2bd90 61 73 65 20 66 69 6c 65 20 68 6f 6c 64 69 6e 67  ase file holding
2bda0 20 74 68 65 20 73 68 61 72 65 64 20 6d 65 6d 6f   the shared memo
2bdb0 72 79 20 2a 2f 0a 29 7b 0a 20 20 55 4e 55 53 45  ry */.){.  UNUSE
2bdc0 44 5f 50 41 52 41 4d 45 54 45 52 28 66 64 29 3b  D_PARAMETER(fd);
2bdd0 0a 20 20 73 71 6c 69 74 65 33 4d 65 6d 6f 72 79  .  sqlite3Memory
2bde0 42 61 72 72 69 65 72 28 29 3b 20 20 20 20 20 20  Barrier();      
2bdf0 20 20 20 2f 2a 20 63 6f 6d 70 69 6c 65 72 2d 64     /* compiler-d
2be00 65 66 69 6e 65 64 20 6d 65 6d 6f 72 79 20 62 61  efined memory ba
2be10 72 72 69 65 72 20 2a 2f 0a 20 20 75 6e 69 78 45  rrier */.  unixE
2be20 6e 74 65 72 4d 75 74 65 78 28 29 3b 20 20 20 20  nterMutex();    
2be30 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6c             /* Al
2be40 73 6f 20 6d 75 74 65 78 2c 20 66 6f 72 20 72 65  so mutex, for re
2be50 64 75 6e 64 61 6e 63 79 20 2a 2f 0a 20 20 75 6e  dundancy */.  un
2be60 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a  ixLeaveMutex();.
2be70 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61  }../*.** Close a
2be80 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 73   connection to s
2be90 68 61 72 65 64 2d 6d 65 6d 6f 72 79 2e 20 20 44  hared-memory.  D
2bea0 65 6c 65 74 65 20 74 68 65 20 75 6e 64 65 72 6c  elete the underl
2beb0 79 69 6e 67 20 0a 2a 2a 20 73 74 6f 72 61 67 65  ying .** storage
2bec0 20 69 66 20 64 65 6c 65 74 65 46 6c 61 67 20 69   if deleteFlag i
2bed0 73 20 74 72 75 65 2e 0a 2a 2a 0a 2a 2a 20 49 66  s true..**.** If
2bee0 20 74 68 65 72 65 20 69 73 20 6e 6f 20 73 68 61   there is no sha
2bef0 72 65 64 20 6d 65 6d 6f 72 79 20 61 73 73 6f 63  red memory assoc
2bf00 69 61 74 65 64 20 77 69 74 68 20 74 68 65 20 63  iated with the c
2bf10 6f 6e 6e 65 63 74 69 6f 6e 20 74 68 65 6e 20 74  onnection then t
2bf20 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 69  his.** routine i
2bf30 73 20 61 20 68 61 72 6d 6c 65 73 73 20 6e 6f 2d  s a harmless no-
2bf40 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  op..*/.static in
2bf50 74 20 75 6e 69 78 53 68 6d 55 6e 6d 61 70 28 0a  t unixShmUnmap(.
2bf60 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a    sqlite3_file *
2bf70 66 64 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  fd,             
2bf80 20 20 2f 2a 20 54 68 65 20 75 6e 64 65 72 6c 79    /* The underly
2bf90 69 6e 67 20 64 61 74 61 62 61 73 65 20 66 69 6c  ing database fil
2bfa0 65 20 2a 2f 0a 20 20 69 6e 74 20 64 65 6c 65 74  e */.  int delet
2bfb0 65 46 6c 61 67 20 20 20 20 20 20 20 20 20 20 20  eFlag           
2bfc0 20 20 20 20 20 20 20 2f 2a 20 44 65 6c 65 74 65         /* Delete
2bfd0 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 69   shared-memory i
2bfe0 66 20 74 72 75 65 20 2a 2f 0a 29 7b 0a 20 20 75  f true */.){.  u
2bff0 6e 69 78 53 68 6d 20 2a 70 3b 20 20 20 20 20 20  nixShm *p;      
2c000 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2c010 2a 20 54 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  * The connection
2c020 20 74 6f 20 62 65 20 63 6c 6f 73 65 64 20 2a 2f   to be closed */
2c030 0a 20 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20 2a  .  unixShmNode *
2c040 70 53 68 6d 4e 6f 64 65 3b 20 20 20 20 20 20 20  pShmNode;       
2c050 20 20 20 2f 2a 20 54 68 65 20 75 6e 64 65 72 6c     /* The underl
2c060 79 69 6e 67 20 73 68 61 72 65 64 2d 6d 65 6d 6f  ying shared-memo
2c070 72 79 20 66 69 6c 65 20 2a 2f 0a 20 20 75 6e 69  ry file */.  uni
2c080 78 53 68 6d 20 2a 2a 70 70 3b 20 20 20 20 20 20  xShm **pp;      
2c090 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2c0a0 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72  For looping over
2c0b0 20 73 69 62 6c 69 6e 67 20 63 6f 6e 6e 65 63 74   sibling connect
2c0c0 69 6f 6e 73 20 2a 2f 0a 20 20 75 6e 69 78 46 69  ions */.  unixFi
2c0d0 6c 65 20 2a 70 44 62 46 64 3b 20 20 20 20 20 20  le *pDbFd;      
2c0e0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
2c0f0 20 75 6e 64 65 72 6c 79 69 6e 67 20 64 61 74 61   underlying data
2c100 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 0a 20 20  base file */..  
2c110 70 44 62 46 64 20 3d 20 28 75 6e 69 78 46 69 6c  pDbFd = (unixFil
2c120 65 2a 29 66 64 3b 0a 20 20 70 20 3d 20 70 44 62  e*)fd;.  p = pDb
2c130 46 64 2d 3e 70 53 68 6d 3b 0a 20 20 69 66 28 20  Fd->pShm;.  if( 
2c140 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51  p==0 ) return SQ
2c150 4c 49 54 45 5f 4f 4b 3b 0a 20 20 70 53 68 6d 4e  LITE_OK;.  pShmN
2c160 6f 64 65 20 3d 20 70 2d 3e 70 53 68 6d 4e 6f 64  ode = p->pShmNod
2c170 65 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 53  e;..  assert( pS
2c180 68 6d 4e 6f 64 65 3d 3d 70 44 62 46 64 2d 3e 70  hmNode==pDbFd->p
2c190 49 6e 6f 64 65 2d 3e 70 53 68 6d 4e 6f 64 65 20  Inode->pShmNode 
2c1a0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53 68  );.  assert( pSh
2c1b0 6d 4e 6f 64 65 2d 3e 70 49 6e 6f 64 65 3d 3d 70  mNode->pInode==p
2c1c0 44 62 46 64 2d 3e 70 49 6e 6f 64 65 20 29 3b 0a  DbFd->pInode );.
2c1d0 0a 20 20 2f 2a 20 52 65 6d 6f 76 65 20 63 6f 6e  .  /* Remove con
2c1e0 6e 65 63 74 69 6f 6e 20 70 20 66 72 6f 6d 20 74  nection p from t
2c1f0 68 65 20 73 65 74 20 6f 66 20 63 6f 6e 6e 65 63  he set of connec
2c200 74 69 6f 6e 73 20 61 73 73 6f 63 69 61 74 65 64  tions associated
2c210 0a 20 20 2a 2a 20 77 69 74 68 20 70 53 68 6d 4e  .  ** with pShmN
2c220 6f 64 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ode */.  sqlite3
2c230 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 70 53 68  _mutex_enter(pSh
2c240 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 29 3b 0a 20  mNode->mutex);. 
2c250 20 66 6f 72 28 70 70 3d 26 70 53 68 6d 4e 6f 64   for(pp=&pShmNod
2c260 65 2d 3e 70 46 69 72 73 74 3b 20 28 2a 70 70 29  e->pFirst; (*pp)
2c270 21 3d 70 3b 20 70 70 20 3d 20 26 28 2a 70 70 29  !=p; pp = &(*pp)
2c280 2d 3e 70 4e 65 78 74 29 7b 7d 0a 20 20 2a 70 70  ->pNext){}.  *pp
2c290 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a 0a 20 20   = p->pNext;..  
2c2a0 2f 2a 20 46 72 65 65 20 74 68 65 20 63 6f 6e 6e  /* Free the conn
2c2b0 65 63 74 69 6f 6e 20 70 20 2a 2f 0a 20 20 73 71  ection p */.  sq
2c2c0 6c 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 20  lite3_free(p);. 
2c2d0 20 70 44 62 46 64 2d 3e 70 53 68 6d 20 3d 20 30   pDbFd->pShm = 0
2c2e0 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  ;.  sqlite3_mute
2c2f0 78 5f 6c 65 61 76 65 28 70 53 68 6d 4e 6f 64 65  x_leave(pShmNode
2c300 2d 3e 6d 75 74 65 78 29 3b 0a 0a 20 20 2f 2a 20  ->mutex);..  /* 
2c310 49 66 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65  If pShmNode->nRe
2c320 66 20 68 61 73 20 72 65 61 63 68 65 64 20 30 2c  f has reached 0,
2c330 20 74 68 65 6e 20 63 6c 6f 73 65 20 74 68 65 20   then close the 
2c340 75 6e 64 65 72 6c 79 69 6e 67 0a 20 20 2a 2a 20  underlying.  ** 
2c350 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 66 69  shared-memory fi
2c360 6c 65 2c 20 74 6f 6f 20 2a 2f 0a 20 20 75 6e 69  le, too */.  uni
2c370 78 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 20  xEnterMutex();. 
2c380 20 61 73 73 65 72 74 28 20 70 53 68 6d 4e 6f 64   assert( pShmNod
2c390 65 2d 3e 6e 52 65 66 3e 30 20 29 3b 0a 20 20 70  e->nRef>0 );.  p
2c3a0 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 66 2d 2d 3b  ShmNode->nRef--;
2c3b0 0a 20 20 69 66 28 20 70 53 68 6d 4e 6f 64 65 2d  .  if( pShmNode-
2c3c0 3e 6e 52 65 66 3d 3d 30 20 29 7b 0a 20 20 20 20  >nRef==0 ){.    
2c3d0 69 66 28 20 64 65 6c 65 74 65 46 6c 61 67 20 26  if( deleteFlag &
2c3e0 26 20 70 53 68 6d 4e 6f 64 65 2d 3e 68 3e 3d 30  & pShmNode->h>=0
2c3f0 20 29 20 7b 0a 20 20 20 20 20 20 69 66 20 28 64   ) {.      if (d
2c400 65 6c 65 74 65 46 6c 61 67 20 3d 3d 20 31 29 20  eleteFlag == 1) 
2c410 7b 20 0a 20 20 20 20 20 20 20 20 6f 73 55 6e 6c  { .        osUnl
2c420 69 6e 6b 28 70 53 68 6d 4e 6f 64 65 2d 3e 7a 46  ink(pShmNode->zF
2c430 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20  ilename);.      
2c440 7d 20 65 6c 73 65 20 69 66 20 28 64 65 6c 65 74  } else if (delet
2c450 65 46 6c 61 67 20 3d 3d 20 32 29 20 7b 0a 20 20  eFlag == 2) {.  
2c460 20 20 20 20 20 20 2f 2a 20 66 74 72 75 6e 63 61        /* ftrunca
2c470 74 65 28 70 53 68 6d 4e 6f 64 65 2d 3e 68 2c 20  te(pShmNode->h, 
2c480 33 32 20 2a 20 31 30 32 34 29 3b 20 2a 2f 0a 20  32 * 1024); */. 
2c490 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
2c4a0 20 75 6e 69 78 53 68 6d 50 75 72 67 65 28 70 44   unixShmPurge(pD
2c4b0 62 46 64 29 3b 0a 20 20 7d 0a 20 20 75 6e 69 78  bFd);.  }.  unix
2c4c0 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 0a 20  LeaveMutex();.. 
2c4d0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
2c4e0 4b 3b 0a 7d 0a 0a 0a 23 65 6c 73 65 0a 23 20 64  K;.}...#else.# d
2c4f0 65 66 69 6e 65 20 75 6e 69 78 53 68 6d 4d 61 70  efine unixShmMap
2c500 20 20 20 20 20 30 0a 23 20 64 65 66 69 6e 65 20       0.# define 
2c510 75 6e 69 78 53 68 6d 4c 6f 63 6b 20 20 20 20 30  unixShmLock    0
2c520 0a 23 20 64 65 66 69 6e 65 20 75 6e 69 78 53 68  .# define unixSh
2c530 6d 42 61 72 72 69 65 72 20 30 0a 23 20 64 65 66  mBarrier 0.# def
2c540 69 6e 65 20 75 6e 69 78 53 68 6d 55 6e 6d 61 70  ine unixShmUnmap
2c550 20 20 20 30 0a 23 65 6e 64 69 66 20 2f 2a 20 23     0.#endif /* #
2c560 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
2c570 49 54 5f 57 41 4c 20 2a 2f 0a 0a 23 69 66 20 28  IT_WAL */..#if (
2c580 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50  SQLITE_ENABLE_AP
2c590 50 4c 45 5f 53 50 49 3e 30 29 20 26 26 20 64 65  PLE_SPI>0) && de
2c5a0 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29  fined(__APPLE__)
2c5b0 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68  .static const ch
2c5c0 61 72 20 2a 75 6e 69 78 54 65 6d 70 46 69 6c 65  ar *unixTempFile
2c5d0 44 69 72 28 76 6f 69 64 29 3b 0a 0a 73 74 61 74  Dir(void);..stat
2c5e0 69 63 20 69 6e 74 20 75 6e 69 78 49 6e 76 61 6c  ic int unixInval
2c5f0 69 64 61 74 65 53 75 70 70 6f 72 74 46 69 6c 65  idateSupportFile
2c600 73 28 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c  s(unixFile *pFil
2c610 65 2c 20 69 6e 74 20 73 6b 69 70 57 41 4c 29 20  e, int skipWAL) 
2c620 7b 0a 20 20 63 68 61 72 20 6a 50 61 74 68 5b 4d  {.  char jPath[M
2c630 41 58 50 41 54 48 4c 45 4e 2b 39 5d 3b 0a 20 20  AXPATHLEN+9];.  
2c640 69 6e 74 20 7a 4c 65 6e 20 3d 20 73 74 72 6c 63  int zLen = strlc
2c650 70 79 28 6a 50 61 74 68 2c 20 70 46 69 6c 65 2d  py(jPath, pFile-
2c660 3e 7a 50 61 74 68 2c 20 4d 41 58 50 41 54 48 4c  >zPath, MAXPATHL
2c670 45 4e 2b 39 29 3b 0a 20 20 69 66 28 20 7a 4c 65  EN+9);.  if( zLe
2c680 6e 3c 4d 41 58 50 41 54 48 4c 45 4e 20 29 7b 0a  n<MAXPATHLEN ){.
2c690 20 20 20 20 73 69 7a 65 5f 74 20 6a 4c 65 6e 3b      size_t jLen;
2c6a0 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
2c6b0 65 78 74 65 6e 73 69 6f 6e 73 5b 33 5d 5b 39 5d  extensions[3][9]
2c6c0 20 3d 20 7b 20 22 2d 77 61 6c 22 2c 20 22 2d 6a   = { "-wal", "-j
2c6d0 6f 75 72 6e 61 6c 22 2c 20 22 2d 73 68 6d 22 20  ournal", "-shm" 
2c6e0 7d 3b 0a 20 20 20 20 69 6e 74 20 6a 20 3d 20 28  };.    int j = (
2c6f0 73 6b 69 70 57 41 4c 20 3f 20 31 20 3a 20 30 29  skipWAL ? 1 : 0)
2c700 3b 0a 20 20 20 20 66 6f 72 28 20 3b 20 6a 3c 33  ;.    for( ; j<3
2c710 3b 20 6a 2b 2b 20 29 7b 0a 20 20 20 20 20 20 0a  ; j++ ){.      .
2c720 20 20 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 74        /* Check t
2c730 6f 20 73 65 65 20 69 66 20 74 68 65 20 73 68 6d  o see if the shm
2c740 20 66 69 6c 65 20 69 73 20 61 6c 72 65 61 64 79   file is already
2c750 20 6f 70 65 6e 65 64 20 66 6f 72 20 74 68 69 73   opened for this
2c760 20 70 46 69 6c 65 20 2a 2f 0a 20 20 20 20 20 20   pFile */.      
2c770 69 66 28 20 6a 3d 3d 32 20 29 7b 0a 20 20 20 20  if( j==2 ){.    
2c780 20 20 20 20 75 6e 69 78 45 6e 74 65 72 4d 75 74      unixEnterMut
2c790 65 78 28 29 3b 20 2f 2a 20 42 65 63 61 75 73 65  ex(); /* Because
2c7a0 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 20 69   pFile->pInode i
2c7b0 73 20 73 68 61 72 65 64 20 61 63 72 6f 73 73 20  s shared across 
2c7c0 74 68 72 65 61 64 73 20 2a 2f 0a 20 20 20 20 20  threads */.     
2c7d0 20 20 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20 2a     unixShmNode *
2c7e0 70 53 68 6d 4e 6f 64 65 20 3d 20 70 46 69 6c 65  pShmNode = pFile
2c7f0 2d 3e 70 49 6e 6f 64 65 2d 3e 70 53 68 6d 4e 6f  ->pInode->pShmNo
2c800 64 65 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  de;.        if( 
2c810 70 53 68 6d 4e 6f 64 65 20 26 26 20 21 70 53 68  pShmNode && !pSh
2c820 6d 4e 6f 64 65 2d 3e 69 73 52 65 61 64 6f 6e 6c  mNode->isReadonl
2c830 79 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73  y ){.          s
2c840 74 72 75 63 74 20 73 74 61 74 20 73 53 74 61 74  truct stat sStat
2c850 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ;.          sqli
2c860 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28  te3_mutex_enter(
2c870 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 29  pShmNode->mutex)
2c880 3b 0a 20 20 20 20 20 20 20 20 20 20 0a 20 20 20  ;.          .   
2c890 20 20 20 20 20 20 20 69 66 28 20 70 53 68 6d 4e         if( pShmN
2c8a0 6f 64 65 2d 3e 68 3e 3d 30 20 26 26 20 21 6f 73  ode->h>=0 && !os
2c8b0 46 73 74 61 74 28 70 53 68 6d 4e 6f 64 65 2d 3e  Fstat(pShmNode->
2c8c0 68 2c 20 26 73 53 74 61 74 29 20 29 7b 0a 20 20  h, &sStat) ){.  
2c8d0 20 20 20 20 20 20 20 20 20 20 75 6e 73 69 67 6e            unsign
2c8e0 65 64 20 6c 6f 6e 67 20 73 69 7a 65 20 3d 20 28  ed long size = (
2c8f0 73 53 74 61 74 2e 73 74 5f 73 69 7a 65 3c 34 29  sStat.st_size<4)
2c900 20 3f 20 73 53 74 61 74 2e 73 74 5f 73 69 7a 65   ? sStat.st_size
2c910 20 3a 20 34 3b 0a 20 20 20 20 20 20 20 20 20 20   : 4;.          
2c920 20 20 69 66 28 20 73 69 7a 65 3e 30 20 29 7b 0a    if( size>0 ){.
2c930 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62 7a                bz
2c940 65 72 6f 28 70 53 68 6d 4e 6f 64 65 2d 3e 61 70  ero(pShmNode->ap
2c950 52 65 67 69 6f 6e 5b 30 5d 2c 20 73 69 7a 65 29  Region[0], size)
2c960 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
2c970 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65  sqlite3_mutex_le
2c980 61 76 65 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75  ave(pShmNode->mu
2c990 74 65 78 29 3b 0a 20 20 20 20 20 20 20 20 20 20  tex);.          
2c9a0 20 20 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74      unixLeaveMut
2c9b0 65 78 28 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ex();.          
2c9c0 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20      continue;.  
2c9d0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
2c9e0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
2c9f0 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
2ca00 6c 65 61 76 65 28 70 53 68 6d 4e 6f 64 65 2d 3e  leave(pShmNode->
2ca10 6d 75 74 65 78 29 3b 0a 20 20 20 20 20 20 20 20  mutex);.        
2ca20 7d 0a 20 20 20 20 20 20 20 20 75 6e 69 78 4c 65  }.        unixLe
2ca30 61 76 65 4d 75 74 65 78 28 29 3b 0a 20 20 20 20  aveMutex();.    
2ca40 20 20 7d 0a 20 20 20 20 20 20 6a 4c 65 6e 20 3d    }.      jLen =
2ca50 20 73 74 72 6c 63 70 79 28 26 6a 50 61 74 68 5b   strlcpy(&jPath[
2ca60 7a 4c 65 6e 5d 2c 20 65 78 74 65 6e 73 69 6f 6e  zLen], extension
2ca70 73 5b 6a 5d 2c 20 39 29 3b 0a 20 20 20 20 20 20  s[j], 9);.      
2ca80 69 66 28 20 6a 4c 65 6e 20 3c 20 39 20 29 7b 0a  if( jLen < 9 ){.
2ca90 20 20 20 20 20 20 20 20 69 6e 74 20 6a 66 6c 61          int jfla
2caa0 67 73 20 3d 20 28 6a 3c 32 29 20 3f 20 4f 5f 54  gs = (j<2) ? O_T
2cab0 52 55 4e 43 20 3a 20 4f 5f 52 44 57 52 3b 0a 20  RUNC : O_RDWR;. 
2cac0 20 20 20 20 20 20 20 69 6e 74 20 6a 66 64 20 3d         int jfd =
2cad0 20 6f 70 65 6e 28 6a 50 61 74 68 2c 20 6a 66 6c   open(jPath, jfl
2cae0 61 67 73 29 3b 0a 20 20 20 20 20 20 20 20 69 66  ags);.        if
2caf0 28 20 6a 66 64 3d 3d 28 2d 31 29 20 29 7b 0a 20  ( jfd==(-1) ){. 
2cb00 20 20 20 20 20 20 20 20 20 69 66 28 20 65 72 72           if( err
2cb10 6e 6f 21 3d 45 4e 4f 45 4e 54 20 29 7b 0a 20 20  no!=ENOENT ){.  
2cb20 20 20 20 20 20 20 20 20 20 20 70 65 72 72 6f 72            perror
2cb30 28 6a 50 61 74 68 29 3b 0a 20 20 20 20 20 20 20  (jPath);.       
2cb40 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 20 65     }.        } e
2cb50 6c 73 65 20 7b 0a 20 20 20 20 20 20 20 20 20 20  lse {.          
2cb60 69 66 28 20 6a 3d 3d 32 20 29 7b 0a 20 20 20 20  if( j==2 ){.    
2cb70 20 20 20 20 20 20 20 20 73 74 72 75 63 74 20 73          struct s
2cb80 74 61 74 20 73 53 74 61 74 3b 0a 20 20 20 20 20  tat sStat;.     
2cb90 20 20 20 20 20 20 20 69 66 28 20 21 6f 73 46 73         if( !osFs
2cba0 74 61 74 28 6a 66 64 2c 20 26 73 53 74 61 74 29  tat(jfd, &sStat)
2cbb0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
2cbc0 20 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20    unsigned long 
2cbd0 73 69 7a 65 20 3d 20 28 73 53 74 61 74 2e 73 74  size = (sStat.st
2cbe0 5f 73 69 7a 65 3c 34 29 20 3f 20 73 53 74 61 74  _size<4) ? sStat
2cbf0 2e 73 74 5f 73 69 7a 65 20 3a 20 34 3b 0a 20 20  .st_size : 4;.  
2cc00 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
2cc10 73 69 7a 65 3e 30 20 29 7b 0a 20 20 20 20 20 20  size>0 ){.      
2cc20 20 20 20 20 20 20 20 20 20 20 75 69 6e 74 33 32            uint32
2cc30 5f 74 20 7a 65 72 6f 20 3d 20 30 3b 0a 20 20 20  _t zero = 0;.   
2cc40 20 20 20 20 20 20 20 20 20 20 20 20 20 70 77 72               pwr
2cc50 69 74 65 28 6a 66 64 2c 20 26 7a 65 72 6f 2c 20  ite(jfd, &zero, 
2cc60 28 73 69 7a 65 5f 74 29 73 69 7a 65 2c 20 30 29  (size_t)size, 0)
2cc70 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
2cc80 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  }.            }.
2cc90 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
2cca0 20 20 20 20 20 20 66 73 79 6e 63 28 6a 66 64 29        fsync(jfd)
2ccb0 3b 0a 20 20 20 20 20 20 20 20 20 20 63 6c 6f 73  ;.          clos
2ccc0 65 28 6a 66 64 29 3b 0a 20 20 20 20 20 20 20 20  e(jfd);.        
2ccd0 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  }.      }.    }.
2cce0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c    }.  return SQL
2ccf0 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 73 74 61 74 69  ITE_OK;.}..stati
2cd00 63 20 69 6e 74 20 75 6e 69 78 55 6e 73 61 66 65  c int unixUnsafe
2cd10 54 72 75 6e 63 61 74 65 44 61 74 61 62 61 73 65  TruncateDatabase
2cd20 28 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65  (unixFile *pFile
2cd30 29 7b 0a 20 20 2f 2a 20 74 68 69 73 20 69 73 20  ){.  /* this is 
2cd40 6e 61 73 74 79 20 26 20 62 61 64 2e 20 20 64 65  nasty & bad.  de
2cd50 73 74 72 75 63 74 69 6f 6e 20 77 69 74 68 20 70  struction with p
2cd60 72 65 6a 75 64 69 63 65 2e 20 20 77 65 27 6c 6c  rejudice.  we'll
2cd70 20 6c 6f 73 65 20 61 6c 6c 20 74 68 65 0a 20 20   lose all the.  
2cd80 2a 2a 20 66 69 6c 65 20 6c 6f 63 6b 73 20 69 6e  ** file locks in
2cd90 20 74 68 69 73 20 70 72 6f 63 65 73 73 2c 20 68   this process, h
2cda0 6f 77 65 76 65 72 2e 20 73 71 6c 69 74 65 33 5f  owever. sqlite3_
2cdb0 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 20 77 6f 72  file_control wor
2cdc0 6b 73 20 70 72 6f 70 65 72 6c 79 2e 0a 20 20 2a  ks properly..  *
2cdd0 2a 20 42 75 74 20 69 66 20 69 74 20 66 61 69 6c  * But if it fail
2cde0 73 2c 20 74 68 69 73 20 77 6f 72 6b 73 20 61 70  s, this works ap
2cdf0 70 72 6f 78 69 6d 61 74 65 6c 79 0a 20 20 2a 2f  proximately.  */
2ce00 0a 20 20 63 68 61 72 20 6a 6f 75 72 6e 61 6c 50  .  char journalP
2ce10 61 74 68 5b 4d 41 58 50 41 54 48 4c 45 4e 5d 3b  ath[MAXPATHLEN];
2ce20 0a 20 20 63 68 61 72 20 77 61 6c 50 61 74 68 5b  .  char walPath[
2ce30 4d 41 58 50 41 54 48 4c 45 4e 5d 3b 0a 20 20 69  MAXPATHLEN];.  i
2ce40 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
2ce50 4b 3b 0a 20 20 0a 23 69 66 64 65 66 20 44 45 42  K;.  .#ifdef DEB
2ce60 55 47 0a 20 20 66 70 72 69 6e 74 66 28 73 74 64  UG.  fprintf(std
2ce70 65 72 72 2c 20 22 46 6f 72 63 65 20 74 72 75 6e  err, "Force trun
2ce80 63 61 74 69 6e 67 20 64 61 74 61 62 61 73 65 20  cating database 
2ce90 25 73 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 7a 50  %s\n", pFile->zP
2cea0 61 74 68 29 3b 0a 23 65 6e 64 69 66 0a 20 20 73  ath);.#endif.  s
2ceb0 74 72 6c 63 70 79 28 6a 6f 75 72 6e 61 6c 50 61  trlcpy(journalPa
2cec0 74 68 2c 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68  th, pFile->zPath
2ced0 2c 20 4d 41 58 50 41 54 48 4c 45 4e 29 3b 0a 20  , MAXPATHLEN);. 
2cee0 20 73 74 72 6c 63 61 74 28 6a 6f 75 72 6e 61 6c   strlcat(journal
2cef0 50 61 74 68 2c 20 22 2d 6a 6f 75 72 6e 61 6c 22  Path, "-journal"
2cf00 2c 20 4d 41 58 50 41 54 48 4c 45 4e 29 3b 0a 20  , MAXPATHLEN);. 
2cf10 20 73 74 72 6c 63 70 79 28 77 61 6c 50 61 74 68   strlcpy(walPath
2cf20 2c 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68 2c 20  , pFile->zPath, 
2cf30 4d 41 58 50 41 54 48 4c 45 4e 29 3b 0a 20 20 73  MAXPATHLEN);.  s
2cf40 74 72 6c 63 61 74 28 77 61 6c 50 61 74 68 2c 20  trlcat(walPath, 
2cf50 22 2d 77 61 6c 22 2c 20 4d 41 58 50 41 54 48 4c  "-wal", MAXPATHL
2cf60 45 4e 29 3b 0a 20 20 69 6e 74 20 66 64 31 20 3d  EN);.  int fd1 =
2cf70 20 70 46 69 6c 65 2d 3e 68 3b 0a 20 20 69 6e 74   pFile->h;.  int
2cf80 20 72 65 73 75 6c 74 20 3d 20 30 3b 0a 20 20 72   result = 0;.  r
2cf90 65 73 75 6c 74 20 3d 20 66 74 72 75 6e 63 61 74  esult = ftruncat
2cfa0 65 28 66 64 31 2c 20 30 6c 6c 29 3b 0a 20 20 69  e(fd1, 0ll);.  i
2cfb0 66 20 28 72 65 73 75 6c 74 29 20 7b 0a 20 20 20  f (result) {.   
2cfc0 20 72 65 73 75 6c 74 20 3d 20 65 72 72 6e 6f 3b   result = errno;
2cfd0 0a 20 20 7d 0a 20 20 69 66 20 28 72 65 73 75 6c  .  }.  if (resul
2cfe0 74 29 20 7b 0a 20 20 20 20 72 63 20 3d 20 53 51  t) {.    rc = SQ
2cff0 4c 49 54 45 5f 49 4f 45 52 52 3b 0a 20 20 20 20  LITE_IOERR;.    
2d000 73 74 6f 72 65 4c 61 73 74 45 72 72 6e 6f 28 70  storeLastErrno(p
2d010 46 69 6c 65 2c 20 72 65 73 75 6c 74 29 3b 0a 20  File, result);. 
2d020 20 7d 0a 20 20 0a 20 20 69 6e 74 20 66 64 32 20   }.  .  int fd2 
2d030 3d 20 6f 70 65 6e 28 6a 6f 75 72 6e 61 6c 50 61  = open(journalPa
2d040 74 68 2c 20 4f 5f 52 44 57 52 29 3b 0a 20 20 69  th, O_RDWR);.  i
2d050 6e 74 20 72 65 73 75 6c 74 32 20 3d 20 30 3b 0a  nt result2 = 0;.
2d060 20 20 69 66 20 28 66 64 32 20 3c 20 30 29 20 7b    if (fd2 < 0) {
2d070 0a 20 20 20 20 69 66 20 28 65 72 72 6e 6f 20 21  .    if (errno !
2d080 3d 20 45 4e 4f 45 4e 54 29 20 7b 0a 20 20 20 20  = ENOENT) {.    
2d090 20 20 72 65 73 75 6c 74 32 20 3d 20 65 72 72 6e    result2 = errn
2d0a0 6f 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a  o;.    } else {.
2d0b0 20 20 20 20 20 20 72 65 73 75 6c 74 32 20 3d 20        result2 = 
2d0c0 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 20 65 6c 73  0;.    }.  } els
2d0d0 65 20 7b 0a 20 20 20 20 72 65 73 75 6c 74 32 20  e {.    result2 
2d0e0 3d 20 66 74 72 75 6e 63 61 74 65 28 66 64 32 2c  = ftruncate(fd2,
2d0f0 20 30 6c 6c 29 3b 0a 20 20 20 20 69 66 20 28 72   0ll);.    if (r
2d100 65 73 75 6c 74 32 29 20 7b 0a 20 20 20 20 20 20  esult2) {.      
2d110 72 65 73 75 6c 74 32 20 3d 20 65 72 72 6e 6f 3b  result2 = errno;
2d120 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 20  .    }.  }.  if 
2d130 28 72 65 73 75 6c 74 32 20 26 26 20 21 72 65 73  (result2 && !res
2d140 75 6c 74 29 20 7b 0a 20 20 20 20 72 63 20 3d 20  ult) {.    rc = 
2d150 53 51 4c 49 54 45 5f 49 4f 45 52 52 3b 0a 20 20  SQLITE_IOERR;.  
2d160 20 20 73 74 6f 72 65 4c 61 73 74 45 72 72 6e 6f    storeLastErrno
2d170 28 70 46 69 6c 65 2c 20 72 65 73 75 6c 74 32 29  (pFile, result2)
2d180 3b 0a 20 20 7d 0a 20 20 0a 20 20 69 6e 74 20 66  ;.  }.  .  int f
2d190 64 33 20 3d 20 6f 70 65 6e 28 77 61 6c 50 61 74  d3 = open(walPat
2d1a0 68 2c 20 4f 5f 52 44 57 52 29 3b 0a 20 20 69 6e  h, O_RDWR);.  in
2d1b0 74 20 72 65 73 75 6c 74 33 20 3d 20 30 3b 0a 20  t result3 = 0;. 
2d1c0 20 69 66 20 28 66 64 33 20 3c 20 30 29 20 7b 0a   if (fd3 < 0) {.
2d1d0 20 20 20 20 69 66 20 28 65 72 72 6e 6f 20 21 3d      if (errno !=
2d1e0 20 45 4e 4f 45 4e 54 29 20 7b 0a 20 20 20 20 20   ENOENT) {.     
2d1f0 20 72 65 73 75 6c 74 33 20 3d 20 65 72 72 6e 6f   result3 = errno
2d200 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20  ;.    } else {. 
2d210 20 20 20 20 20 72 65 73 75 6c 74 33 20 3d 20 30       result3 = 0
2d220 3b 0a 20 20 20 20 7d 0a 20 20 7d 20 65 6c 73 65  ;.    }.  } else
2d230 20 7b 0a 20 20 20 20 72 65 73 75 6c 74 33 20 3d   {.    result3 =
2d240 20 66 74 72 75 6e 63 61 74 65 28 66 64 33 2c 20   ftruncate(fd3, 
2d250 30 6c 6c 29 3b 0a 20 20 20 20 69 66 20 28 72 65  0ll);.    if (re
2d260 73 75 6c 74 33 29 20 7b 0a 20 20 20 20 20 20 72  sult3) {.      r
2d270 65 73 75 6c 74 33 20 3d 20 65 72 72 6e 6f 3b 0a  esult3 = errno;.
2d280 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 20 28      }.  }.  if (
2d290 72 65 73 75 6c 74 33 20 26 26 20 21 28 72 65 73  result3 && !(res
2d2a0 75 6c 74 20 7c 7c 20 72 65 73 75 6c 74 32 29 29  ult || result2))
2d2b0 20 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49   {.    rc = SQLI
2d2c0 54 45 5f 49 4f 45 52 52 3b 0a 20 20 20 20 73 74  TE_IOERR;.    st
2d2d0 6f 72 65 4c 61 73 74 45 72 72 6e 6f 28 70 46 69  oreLastErrno(pFi
2d2e0 6c 65 2c 20 72 65 73 75 6c 74 32 29 3b 0a 20 20  le, result2);.  
2d2f0 7d 0a 20 20 0a 20 20 69 66 20 28 66 64 33 20 3e  }.  .  if (fd3 >
2d300 3d 20 30 29 20 7b 0a 20 20 20 20 66 73 79 6e 63  = 0) {.    fsync
2d310 28 66 64 33 29 3b 0a 20 20 20 20 63 6c 6f 73 65  (fd3);.    close
2d320 28 66 64 33 29 3b 0a 20 20 7d 0a 20 20 69 66 20  (fd3);.  }.  if 
2d330 28 66 64 32 20 3e 3d 20 30 29 20 7b 0a 20 20 20  (fd2 >= 0) {.   
2d340 20 66 73 79 6e 63 28 66 64 32 29 3b 0a 20 20 20   fsync(fd2);.   
2d350 20 63 6c 6f 73 65 28 66 64 32 29 3b 0a 20 20 7d   close(fd2);.  }
2d360 0a 20 20 66 73 79 6e 63 28 66 64 31 29 3b 0a 09  .  fsync(fd1);..
2d370 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
2d380 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78  .static int unix
2d390 54 72 75 6e 63 61 74 65 44 61 74 61 62 61 73 65  TruncateDatabase
2d3a0 28 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65  (unixFile *pFile
2d3b0 2c 20 69 6e 74 20 62 46 6c 61 67 73 29 20 7b 0a  , int bFlags) {.
2d3c0 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a    sqlite3_file *
2d3d0 69 64 20 3d 20 28 73 71 6c 69 74 65 33 5f 66 69  id = (sqlite3_fi
2d3e0 6c 65 20 2a 29 70 46 69 6c 65 3b 0a 20 20 69 6e  le *)pFile;.  in
2d3f0 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
2d400 3b 0a 20 20 76 6f 69 64 20 2a 70 4c 6f 63 6b 20  ;.  void *pLock 
2d410 3d 20 4e 55 4c 4c 3b 0a 20 20 69 6e 74 20 66 6c  = NULL;.  int fl
2d420 61 67 73 20 3d 20 30 3b 0a 20 20 69 6e 74 20 63  ags = 0;.  int c
2d430 6f 72 72 75 70 74 46 69 6c 65 4c 6f 63 6b 20 3d  orruptFileLock =
2d440 20 30 3b 0a 20 20 69 6e 74 20 69 73 43 6f 72 72   0;.  int isCorr
2d450 75 70 74 20 3d 20 30 3b 0a 20 20 69 6e 74 20 66  upt = 0;.  int f
2d460 6f 72 63 65 20 3d 20 28 62 46 6c 61 67 73 20 26  orce = (bFlags &
2d470 20 53 51 4c 49 54 45 5f 54 52 55 4e 43 41 54 45   SQLITE_TRUNCATE
2d480 5f 46 4f 52 43 45 29 3b 0a 20 20 69 6e 74 20 73  _FORCE);.  int s
2d490 61 66 65 46 61 69 6c 65 64 20 3d 20 30 3b 0a 0a  afeFailed = 0;..
2d4a0 23 69 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  #if SQLITE_ENABL
2d4b0 45 5f 44 41 54 41 5f 50 52 4f 54 45 43 54 49 4f  E_DATA_PROTECTIO
2d4c0 4e 0a 20 20 66 6c 61 67 73 20 7c 3d 20 70 46 69  N.  flags |= pFi
2d4d0 6c 65 2d 3e 70 72 6f 74 46 6c 61 67 73 3b 0a 23  le->protFlags;.#
2d4e0 65 6e 64 69 66 0a 23 69 66 20 53 51 4c 49 54 45  endif.#if SQLITE
2d4f0 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f  _ENABLE_LOCKING_
2d500 53 54 59 4c 45 0a 20 20 69 66 28 20 69 73 50 72  STYLE.  if( isPr
2d510 6f 78 79 4c 6f 63 6b 69 6e 67 4d 6f 64 65 28 70  oxyLockingMode(p
2d520 46 69 6c 65 29 20 29 7b 0a 20 20 20 20 66 6c 61  File) ){.    fla
2d530 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f 4f 50 45  gs |= SQLITE_OPE
2d540 4e 5f 41 55 54 4f 50 52 4f 58 59 3b 0a 20 20 7d  N_AUTOPROXY;.  }
2d550 0a 23 65 6e 64 69 66 0a 20 20 0a 20 20 72 63 20  .#endif.  .  rc 
2d560 3d 20 73 71 6c 69 74 65 33 64 65 6d 6f 5f 73 75  = sqlite3demo_su
2d570 70 65 72 6c 6f 63 6b 28 70 46 69 6c 65 2d 3e 7a  perlock(pFile->z
2d580 50 61 74 68 2c 20 30 2c 20 66 6c 61 67 73 2c 20  Path, 0, flags, 
2d590 30 2c 20 30 2c 20 26 70 4c 6f 63 6b 29 3b 0a 20  0, 0, &pLock);. 
2d5a0 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 69   if( rc ){.    i
2d5b0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 43 4f  f( rc==SQLITE_CO
2d5c0 52 52 55 50 54 20 7c 7c 20 72 63 3d 3d 53 51 4c  RRUPT || rc==SQL
2d5d0 49 54 45 5f 4e 4f 54 41 44 42 20 29 7b 0a 20 20  ITE_NOTADB ){.  
2d5e0 20 20 20 20 69 73 43 6f 72 72 75 70 74 20 3d 20      isCorrupt = 
2d5f0 31 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  1;.      rc = sq
2d600 6c 69 74 65 33 64 65 6d 6f 5f 73 75 70 65 72 6c  lite3demo_superl
2d610 6f 63 6b 5f 63 6f 72 72 75 70 74 28 69 64 2c 20  ock_corrupt(id, 
2d620 53 51 4c 49 54 45 5f 4c 4f 43 4b 5f 45 58 43 4c  SQLITE_LOCK_EXCL
2d630 55 53 49 56 45 2c 0a 20 20 20 20 20 20 20 20 20  USIVE,.         
2d640 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d650 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d660 26 63 6f 72 72 75 70 74 46 69 6c 65 4c 6f 63 6b  &corruptFileLock
2d670 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
2d680 20 72 63 20 26 26 20 21 66 6f 72 63 65 20 29 7b   rc && !force ){
2d690 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63  .      return rc
2d6a0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d  ;.    }.    rc =
2d6b0 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 2f 2a 20 49   SQLITE_OK; /* I
2d6c0 67 6e 6f 72 65 20 74 68 65 20 6c 6f 63 6b 69 6e  gnore the lockin
2d6d0 67 20 66 61 69 6c 75 72 65 20 69 66 20 66 6f 72  g failure if for
2d6e0 63 65 20 69 73 20 74 72 75 65 20 2a 2f 0a 20 20  ce is true */.  
2d6f0 7d 0a 20 20 69 66 28 20 28 62 46 6c 61 67 73 26  }.  if( (bFlags&
2d700 53 51 4c 49 54 45 5f 54 52 55 4e 43 41 54 45 5f  SQLITE_TRUNCATE_
2d710 49 4e 49 54 49 41 4c 49 5a 45 5f 48 45 41 44 45  INITIALIZE_HEADE
2d720 52 5f 4d 41 53 4b 29 21 3d 30 20 29 7b 0a 20 20  R_MASK)!=0 ){.  
2d730 20 20 2f 2a 20 69 6e 69 74 69 61 6c 69 7a 65 20    /* initialize 
2d740 61 20 6e 65 77 20 64 61 74 61 62 61 73 65 20 69  a new database i
2d750 6e 20 54 4d 50 44 49 52 20 61 6e 64 20 63 6f 70  n TMPDIR and cop
2d760 79 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f  y the contents o
2d770 76 65 72 20 2a 2f 0a 20 20 20 20 63 6f 6e 73 74  ver */.    const
2d780 20 63 68 61 72 20 2a 74 44 69 72 20 3d 20 75 6e   char *tDir = un
2d790 69 78 54 65 6d 70 46 69 6c 65 44 69 72 28 29 3b  ixTempFileDir();
2d7a0 0a 20 20 20 20 69 6e 74 20 74 44 69 72 4c 65 6e  .    int tDirLen
2d7b0 20 3d 20 73 74 72 6c 65 6e 28 74 44 69 72 29 3b   = strlen(tDir);
2d7c0 0a 20 20 20 20 69 6e 74 20 74 4c 65 6e 20 3d 20  .    int tLen = 
2d7d0 73 69 7a 65 6f 66 28 63 68 61 72 29 20 2a 20 28  sizeof(char) * (
2d7e0 74 44 69 72 4c 65 6e 20 2b 20 31 32 29 3b 0a 20  tDirLen + 12);. 
2d7f0 20 20 20 63 68 61 72 20 2a 74 44 62 50 61 74 68     char *tDbPath
2d800 20 3d 20 28 63 68 61 72 20 2a 29 6d 61 6c 6c 6f   = (char *)mallo
2d810 63 28 74 4c 65 6e 29 3b 0a 20 20 20 20 69 6e 74  c(tLen);.    int
2d820 20 74 46 64 20 3d 20 2d 31 3b 0a 20 20 20 20 0a   tFd = -1;.    .
2d830 20 20 20 20 73 74 72 6c 63 70 79 28 74 44 62 50      strlcpy(tDbP
2d840 61 74 68 2c 20 74 44 69 72 2c 20 74 4c 65 6e 29  ath, tDir, tLen)
2d850 3b 0a 20 20 20 20 69 66 28 20 74 44 62 50 61 74  ;.    if( tDbPat
2d860 68 5b 28 74 44 69 72 4c 65 6e 2d 31 29 5d 20 21  h[(tDirLen-1)] !
2d870 3d 20 27 2f 27 20 29 7b 0a 20 20 20 20 20 20 73  = '/' ){.      s
2d880 74 72 6c 63 61 74 28 74 44 62 50 61 74 68 2c 20  trlcat(tDbPath, 
2d890 22 2f 74 6d 70 64 62 58 58 58 58 58 22 2c 20 74  "/tmpdbXXXXX", t
2d8a0 4c 65 6e 29 3b 0a 20 20 20 20 7d 20 65 6c 73 65  Len);.    } else
2d8b0 20 7b 0a 20 20 20 20 20 20 73 74 72 6c 63 61 74   {.      strlcat
2d8c0 28 74 44 62 50 61 74 68 2c 20 22 74 6d 70 64 62  (tDbPath, "tmpdb
2d8d0 58 58 58 58 58 22 2c 20 74 4c 65 6e 29 3b 0a 20  XXXXX", tLen);. 
2d8e0 20 20 20 7d 0a 20 20 20 20 74 46 64 20 3d 20 6d     }.    tFd = m
2d8f0 6b 73 74 65 6d 70 28 74 44 62 50 61 74 68 29 3b  kstemp(tDbPath);
2d900 0a 20 20 20 20 69 66 28 20 74 46 64 3d 3d 2d 31  .    if( tFd==-1
2d910 20 29 7b 0a 20 20 20 20 20 20 73 74 6f 72 65 4c   ){.      storeL
2d920 61 73 74 45 72 72 6e 6f 28 70 46 69 6c 65 2c 20  astErrno(pFile, 
2d930 65 72 72 6e 6f 29 3b 0a 20 20 20 20 20 20 72 63  errno);.      rc
2d940 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 3b   = SQLITE_IOERR;
2d950 0a 20 20 20 20 20 20 73 61 66 65 46 61 69 6c 65  .      safeFaile
2d960 64 20 3d 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65  d = 1;.    }else
2d970 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 20  {.      sqlite3 
2d980 2a 74 44 62 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20  *tDb = NULL;.   
2d990 20 20 20 63 6f 70 79 66 69 6c 65 5f 73 74 61 74     copyfile_stat
2d9a0 65 5f 74 20 73 3b 0a 20 20 20 20 20 20 69 6e 74  e_t s;.      int
2d9b0 20 74 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 6f   trc = sqlite3_o
2d9c0 70 65 6e 5f 76 32 28 74 44 62 50 61 74 68 2c 20  pen_v2(tDbPath, 
2d9d0 26 74 44 62 2c 0a 20 20 20 20 20 20 20 20 20 20  &tDb,.          
2d9e0 20 20 20 20 20 20 20 20 20 28 53 51 4c 49 54 45           (SQLITE
2d9f0 5f 4f 50 45 4e 5f 43 52 45 41 54 45 20 7c 20 53  _OPEN_CREATE | S
2da00 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57  QLITE_OPEN_READW
2da10 52 49 54 45 0a 20 20 20 20 20 20 20 20 20 20 20  RITE.           
2da20 20 20 20 20 20 20 20 20 20 20 20 7c 20 53 51 4c             | SQL
2da30 49 54 45 5f 4f 50 45 4e 5f 41 55 54 4f 50 52 4f  ITE_OPEN_AUTOPRO
2da40 58 59 29 2c 20 4e 55 4c 4c 29 3b 0a 20 20 20 20  XY), NULL);.    
2da50 20 20 63 68 61 72 20 2a 65 72 72 6d 73 67 20 3d    char *errmsg =
2da60 20 4e 55 4c 4c 3b 0a 20 20 20 20 20 20 63 6f 6e   NULL;.      con
2da70 73 74 20 63 68 61 72 20 2a 73 71 6c 20 3d 20 22  st char *sql = "
2da80 22 3b 0a 20 20 20 20 20 20 69 66 28 20 21 74 72  ";.      if( !tr
2da90 63 20 26 26 20 28 62 46 6c 61 67 73 26 53 51 4c  c && (bFlags&SQL
2daa0 49 54 45 5f 54 52 55 4e 43 41 54 45 5f 50 41 47  ITE_TRUNCATE_PAG
2dab0 45 53 49 5a 45 5f 4d 41 53 4b 29 20 29 7b 0a 20  ESIZE_MASK) ){. 
2dac0 20 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61         const cha
2dad0 72 20 70 61 67 65 73 69 7a 65 5f 73 71 6c 5b 34  r pagesize_sql[4
2dae0 5d 5b 32 32 5d 20 3d 20 7b 0a 20 20 20 20 20 20  ][22] = {.      
2daf0 20 20 20 20 22 70 72 61 67 6d 61 20 70 61 67 65      "pragma page
2db00 5f 73 69 7a 65 3d 31 30 32 34 22 2c 0a 20 20 20  _size=1024",.   
2db10 20 20 20 20 20 20 20 22 70 72 61 67 6d 61 20 70         "pragma p
2db20 61 67 65 5f 73 69 7a 65 3d 32 30 34 38 22 2c 0a  age_size=2048",.
2db30 20 20 20 20 20 20 20 20 20 20 22 70 72 61 67 6d            "pragm
2db40 61 20 70 61 67 65 5f 73 69 7a 65 3d 34 30 39 36  a page_size=4096
2db50 22 2c 0a 20 20 20 20 20 20 20 20 20 20 22 70 72  ",.          "pr
2db60 61 67 6d 61 20 70 61 67 65 5f 73 69 7a 65 3d 38  agma page_size=8
2db70 31 39 32 22 20 0a 20 20 20 20 20 20 20 20 7d 3b  192" .        };
2db80 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 50 61  .        int iPa
2db90 67 65 73 69 7a 65 20 3d 20 28 28 28 62 46 6c 61  gesize = (((bFla
2dba0 67 73 26 53 51 4c 49 54 45 5f 54 52 55 4e 43 41  gs&SQLITE_TRUNCA
2dbb0 54 45 5f 50 41 47 45 53 49 5a 45 5f 4d 41 53 4b  TE_PAGESIZE_MASK
2dbc0 29 20 3e 3e 20 34 29 20 2d 20 31 29 3b 0a 20 20  ) >> 4) - 1);.  
2dbd0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69 50        assert( iP
2dbe0 61 67 65 73 69 7a 65 3e 3d 30 20 26 26 20 69 50  agesize>=0 && iP
2dbf0 61 67 65 73 69 7a 65 3c 3d 34 20 29 3b 0a 20 20  agesize<=4 );.  
2dc00 20 20 20 20 20 20 73 71 6c 20 3d 20 70 61 67 65        sql = page
2dc10 73 69 7a 65 5f 73 71 6c 5b 69 50 61 67 65 73 69  size_sql[iPagesi
2dc20 7a 65 5d 3b 0a 20 20 20 20 20 20 20 20 74 72 63  ze];.        trc
2dc30 20 3d 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28   = sqlite3_exec(
2dc40 74 44 62 2c 20 73 71 6c 2c 20 30 2c 20 30 2c 20  tDb, sql, 0, 0, 
2dc50 26 65 72 72 6d 73 67 29 3b 0a 20 20 20 20 20 20  &errmsg);.      
2dc60 7d 0a 20 20 20 20 20 20 69 66 28 20 21 74 72 63  }.      if( !trc
2dc70 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 6e 73   ){.        cons
2dc80 74 20 63 68 61 72 20 61 75 74 6f 76 61 63 75 75  t char autovacuu
2dc90 6d 5f 73 71 6c 5b 33 5d 5b 32 31 5d 20 3d 20 7b  m_sql[3][21] = {
2dca0 0a 20 20 20 20 20 20 20 20 20 20 22 70 72 61 67  .          "prag
2dcb0 6d 61 20 61 75 74 6f 5f 76 61 63 75 75 6d 3d 30  ma auto_vacuum=0
2dcc0 22 2c 0a 20 20 20 20 20 20 20 20 20 20 22 70 72  ",.          "pr
2dcd0 61 67 6d 61 20 61 75 74 6f 5f 76 61 63 75 75 6d  agma auto_vacuum
2dce0 3d 31 22 2c 0a 20 20 20 20 20 20 20 20 20 20 22  =1",.          "
2dcf0 70 72 61 67 6d 61 20 61 75 74 6f 5f 76 61 63 75  pragma auto_vacu
2dd00 75 6d 3d 32 22 0a 20 20 20 20 20 20 20 20 7d 3b  um=2".        };
2dd10 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 41 75  .        int iAu
2dd20 74 6f 76 61 63 75 75 6d 20 3d 20 32 3b 20 2f 2a  tovacuum = 2; /*
2dd30 20 64 65 66 61 75 6c 74 20 74 6f 20 69 6e 63 72   default to incr
2dd40 65 6d 65 6e 74 61 6c 20 2a 2f 0a 20 20 20 20 20  emental */.     
2dd50 20 20 20 69 66 28 20 28 62 46 6c 61 67 73 26 53     if( (bFlags&S
2dd60 51 4c 49 54 45 5f 54 52 55 4e 43 41 54 45 5f 41  QLITE_TRUNCATE_A
2dd70 55 54 4f 56 41 43 55 55 4d 5f 4d 41 53 4b 29 20  UTOVACUUM_MASK) 
2dd80 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 41 75  ){.          iAu
2dd90 74 6f 76 61 63 75 75 6d 20 3d 20 28 28 28 62 46  tovacuum = (((bF
2dda0 6c 61 67 73 26 53 51 4c 49 54 45 5f 54 52 55 4e  lags&SQLITE_TRUN
2ddb0 43 41 54 45 5f 41 55 54 4f 56 41 43 55 55 4d 5f  CATE_AUTOVACUUM_
2ddc0 4d 41 53 4b 29 20 3e 3e 20 32 29 20 2d 20 31 29  MASK) >> 2) - 1)
2ddd0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
2dde0 20 20 20 20 61 73 73 65 72 74 28 20 69 41 75 74      assert( iAut
2ddf0 6f 76 61 63 75 75 6d 3e 3d 30 20 26 26 20 69 41  ovacuum>=0 && iA
2de00 75 74 6f 76 61 63 75 75 6d 3c 3d 32 20 29 3b 0a  utovacuum<=2 );.
2de10 20 20 20 20 20 20 20 20 73 71 6c 20 3d 20 61 75          sql = au
2de20 74 6f 76 61 63 75 75 6d 5f 73 71 6c 5b 69 41 75  tovacuum_sql[iAu
2de30 74 6f 76 61 63 75 75 6d 5d 3b 0a 20 20 20 20 20  tovacuum];.     
2de40 20 20 20 74 72 63 20 3d 20 73 71 6c 69 74 65 33     trc = sqlite3
2de50 5f 65 78 65 63 28 74 44 62 2c 20 73 71 6c 2c 20  _exec(tDb, sql, 
2de60 30 2c 20 30 2c 20 26 65 72 72 6d 73 67 29 3b 0a  0, 0, &errmsg);.
2de70 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
2de80 28 20 21 74 72 63 20 26 26 20 28 62 46 6c 61 67  ( !trc && (bFlag
2de90 73 26 53 51 4c 49 54 45 5f 54 52 55 4e 43 41 54  s&SQLITE_TRUNCAT
2dea0 45 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57 41  E_JOURNALMODE_WA
2deb0 4c 29 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  L) ){.        sq
2dec0 6c 20 3d 20 22 70 72 61 67 6d 61 20 6a 6f 75 72  l = "pragma jour
2ded0 6e 61 6c 5f 6d 6f 64 65 3d 77 61 6c 22 3b 0a 20  nal_mode=wal";. 
2dee0 20 20 20 20 20 20 20 74 72 63 20 3d 20 73 71 6c         trc = sql
2def0 69 74 65 33 5f 65 78 65 63 28 74 44 62 2c 20 73  ite3_exec(tDb, s
2df00 71 6c 2c 20 30 2c 20 30 2c 20 26 65 72 72 6d 73  ql, 0, 0, &errms
2df10 67 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  g);.      }.    
2df20 20 20 69 66 28 20 74 72 63 20 29 7b 0a 20 20 20    if( trc ){.   
2df30 20 20 20 20 20 69 66 28 20 21 74 44 62 20 29 7b       if( !tDb ){
2df40 0a 20 20 20 20 20 20 20 20 20 20 66 70 72 69 6e  .          fprin
2df50 74 66 28 73 74 64 65 72 72 2c 20 22 66 61 69 6c  tf(stderr, "fail
2df60 65 64 20 74 6f 20 6f 70 65 6e 20 74 65 6d 70 20  ed to open temp 
2df70 64 61 74 61 62 61 73 65 20 27 25 73 27 20 74 6f  database '%s' to
2df80 20 72 65 73 65 74 20 22 0a 20 20 20 20 20 20 20   reset ".       
2df90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2dfa0 20 20 20 22 74 72 75 6e 63 61 74 65 64 20 64 61     "truncated da
2dfb0 74 61 62 61 73 65 20 25 73 20 77 69 74 68 20 66  tabase %s with f
2dfc0 6c 61 67 73 20 25 78 3a 20 25 64 5c 6e 22 2c 0a  lags %x: %d\n",.
2dfd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2dfe0 20 20 20 20 20 20 20 20 20 20 20 74 44 62 50 61             tDbPa
2dff0 74 68 2c 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68  th, pFile->zPath
2e000 2c 20 62 46 6c 61 67 73 2c 20 74 72 63 29 3b 0a  , bFlags, trc);.
2e010 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
2e020 20 20 20 20 20 20 20 20 20 66 70 72 69 6e 74 66           fprintf
2e030 28 73 74 64 65 72 72 2c 20 22 66 61 69 6c 65 64  (stderr, "failed
2e040 20 74 6f 20 73 65 74 20 27 25 73 27 20 6f 6e 20   to set '%s' on 
2e050 74 72 75 6e 63 61 74 65 64 20 64 61 74 61 62 61  truncated databa
2e060 73 65 20 25 73 2c 20 25 64 3a 20 22 0a 20 20 20  se %s, %d: ".   
2e070 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e080 20 20 20 20 20 20 20 22 25 73 5c 6e 22 2c 20 73         "%s\n", s
2e090 71 6c 2c 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68  ql, pFile->zPath
2e0a0 2c 20 74 72 63 2c 20 65 72 72 6d 73 67 29 3b 0a  , trc, errmsg);.
2e0b0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2e0c0 7d 0a 20 20 20 20 20 20 69 66 28 20 74 44 62 20  }.      if( tDb 
2e0d0 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6f  ){.        int o
2e0e0 66 66 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  ff = 0;.        
2e0f0 2f 2a 20 6d 65 72 67 65 20 74 68 65 20 77 61 6c  /* merge the wal
2e100 20 69 6e 74 6f 20 74 68 65 20 64 62 20 2a 2f 0a   into the db */.
2e110 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
2e120 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 28 74 44 62  file_control(tDb
2e130 2c 20 4e 55 4c 4c 2c 20 53 51 4c 49 54 45 5f 46  , NULL, SQLITE_F
2e140 43 4e 54 4c 5f 50 45 52 53 49 53 54 5f 57 41 4c  CNTL_PERSIST_WAL
2e150 2c 20 26 6f 66 66 29 3b 0a 20 20 20 20 20 20 20  , &off);.       
2e160 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65 28 74   sqlite3_close(t
2e170 44 62 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  Db);.      }.   
2e180 20 20 20 73 20 3d 20 63 6f 70 79 66 69 6c 65 5f     s = copyfile_
2e190 73 74 61 74 65 5f 61 6c 6c 6f 63 28 29 3b 0a 20  state_alloc();. 
2e1a0 20 20 20 20 20 6c 73 65 65 6b 28 74 46 64 2c 20       lseek(tFd, 
2e1b0 30 2c 20 53 45 45 4b 5f 53 45 54 29 3b 0a 20 20  0, SEEK_SET);.  
2e1c0 20 20 20 20 6c 73 65 65 6b 28 70 46 69 6c 65 2d      lseek(pFile-
2e1d0 3e 68 2c 20 30 2c 20 53 45 45 4b 5f 53 45 54 29  >h, 0, SEEK_SET)
2e1e0 3b 0a 20 20 20 20 20 20 69 66 28 20 66 63 6f 70  ;.      if( fcop
2e1f0 79 66 69 6c 65 28 74 46 64 2c 20 70 46 69 6c 65  yfile(tFd, pFile
2e200 2d 3e 68 2c 20 73 2c 20 43 4f 50 59 46 49 4c 45  ->h, s, COPYFILE
2e210 5f 44 41 54 41 29 20 29 7b 0a 20 20 20 20 20 20  _DATA) ){.      
2e220 20 20 69 6e 74 20 65 72 72 3d 65 72 72 6e 6f 3b    int err=errno;
2e230 0a 20 20 20 20 20 20 20 20 73 77 69 74 63 68 28  .        switch(
2e240 65 72 72 29 20 7b 0a 20 20 20 20 20 20 20 20 20  err) {.         
2e250 20 63 61 73 65 20 45 4e 4f 4d 45 4d 3a 0a 20 20   case ENOMEM:.  
2e260 20 20 20 20 20 20 20 20 20 20 74 72 63 20 3d 20            trc = 
2e270 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
2e280 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
2e290 0a 20 20 20 20 20 20 20 20 20 20 64 65 66 61 75  .          defau
2e2a0 6c 74 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20  lt:.            
2e2b0 73 74 6f 72 65 4c 61 73 74 45 72 72 6e 6f 28 70  storeLastErrno(p
2e2c0 46 69 6c 65 2c 20 65 72 72 29 3b 0a 20 20 20 20  File, err);.    
2e2d0 20 20 20 20 20 20 20 20 74 72 63 20 3d 20 53 51          trc = SQ
2e2e0 4c 49 54 45 5f 49 4f 45 52 52 3b 0a 20 20 20 20  LITE_IOERR;.    
2e2f0 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
2e300 20 20 20 20 63 6f 70 79 66 69 6c 65 5f 73 74 61      copyfile_sta
2e310 74 65 5f 66 72 65 65 28 73 29 3b 0a 20 20 20 20  te_free(s);.    
2e320 20 20 66 73 79 6e 63 28 70 46 69 6c 65 2d 3e 68    fsync(pFile->h
2e330 29 3b 0a 20 20 20 20 20 20 63 6c 6f 73 65 28 74  );.      close(t
2e340 46 64 29 3b 0a 20 20 20 20 20 20 75 6e 6c 69 6e  Fd);.      unlin
2e350 6b 28 74 44 62 50 61 74 68 29 3b 0a 20 20 20 20  k(tDbPath);.    
2e360 20 20 69 66 28 20 74 72 63 21 3d 53 51 4c 49 54    if( trc!=SQLIT
2e370 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
2e380 73 61 66 65 46 61 69 6c 65 64 20 3d 20 31 3b 0a  safeFailed = 1;.
2e390 20 20 20 20 20 20 20 20 72 63 20 3d 20 74 72 63          rc = trc
2e3a0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
2e3b0 20 20 20 20 66 72 65 65 28 74 44 62 50 61 74 68      free(tDbPath
2e3c0 29 3b 0a 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20  );.  } else {.  
2e3d0 20 20 72 63 20 3d 20 70 46 69 6c 65 2d 3e 70 4d    rc = pFile->pM
2e3e0 65 74 68 6f 64 2d 3e 78 54 72 75 6e 63 61 74 65  ethod->xTruncate
2e3f0 28 69 64 2c 20 0a 20 20 20 20 20 20 20 20 20 20  (id, .          
2e400 20 28 28 70 46 69 6c 65 2d 3e 66 73 46 6c 61 67   ((pFile->fsFlag
2e410 73 20 26 20 53 51 4c 49 54 45 5f 46 53 46 4c 41  s & SQLITE_FSFLA
2e420 47 53 5f 49 53 5f 4d 53 44 4f 53 29 20 21 3d 20  GS_IS_MSDOS) != 
2e430 30 29 20 3f 20 31 4c 20 3a 20 30 4c 29 3b 0a 20  0) ? 1L : 0L);. 
2e440 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20     if( rc ){.   
2e450 20 20 20 73 61 66 65 46 61 69 6c 65 64 20 3d 20     safeFailed = 
2e460 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69  1;.    }.  }.  i
2e470 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
2e480 20 7c 7c 20 66 6f 72 63 65 20 29 7b 0a 20 20 20   || force ){.   
2e490 20 72 63 20 3d 20 75 6e 69 78 49 6e 76 61 6c 69   rc = unixInvali
2e4a0 64 61 74 65 53 75 70 70 6f 72 74 46 69 6c 65 73  dateSupportFiles
2e4b0 28 70 46 69 6c 65 2c 20 30 29 3b 0a 20 20 20 20  (pFile, 0);.    
2e4c0 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20  if( rc ){.      
2e4d0 73 61 66 65 46 61 69 6c 65 64 20 3d 20 31 3b 0a  safeFailed = 1;.
2e4e0 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 46 69 6c      }.  }.  pFil
2e4f0 65 2d 3e 70 4d 65 74 68 6f 64 2d 3e 78 53 79 6e  e->pMethod->xSyn
2e500 63 28 69 64 2c 20 53 51 4c 49 54 45 5f 53 59 4e  c(id, SQLITE_SYN
2e510 43 5f 46 55 4c 4c 29 3b 0a 0a 0a 20 20 69 66 28  C_FULL);...  if(
2e520 20 69 73 43 6f 72 72 75 70 74 20 29 7b 0a 20 20   isCorrupt ){.  
2e530 20 20 73 71 6c 69 74 65 33 64 65 6d 6f 5f 73 75    sqlite3demo_su
2e540 70 65 72 75 6e 6c 6f 63 6b 5f 63 6f 72 72 75 70  perunlock_corrup
2e550 74 28 69 64 2c 20 63 6f 72 72 75 70 74 46 69 6c  t(id, corruptFil
2e560 65 4c 6f 63 6b 29 3b 0a 20 20 7d 65 6c 73 65 20  eLock);.  }else 
2e570 69 66 28 20 70 4c 6f 63 6b 20 29 7b 0a 20 20 20  if( pLock ){.   
2e580 20 73 71 6c 69 74 65 33 64 65 6d 6f 5f 73 75 70   sqlite3demo_sup
2e590 65 72 75 6e 6c 6f 63 6b 28 70 4c 6f 63 6b 29 3b  erunlock(pLock);
2e5a0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73  .  }else{.    as
2e5b0 73 65 72 74 28 66 6f 72 63 65 29 3b 0a 20 20 7d  sert(force);.  }
2e5c0 0a 20 20 0a 20 20 69 66 28 20 66 6f 72 63 65 20  .  .  if( force 
2e5d0 26 26 20 73 61 66 65 46 61 69 6c 65 64 29 7b 0a  && safeFailed){.
2e5e0 20 20 20 20 72 63 20 3d 20 75 6e 69 78 55 6e 73      rc = unixUns
2e5f0 61 66 65 54 72 75 6e 63 61 74 65 44 61 74 61 62  afeTruncateDatab
2e600 61 73 65 28 70 46 69 6c 65 29 3b 0a 20 20 7d 0a  ase(pFile);.  }.
2e610 20 20 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a    .  return rc;.
2e620 7d 0a 0a 2f 2a 0a 20 2a 2a 20 4c 6f 63 6b 20 6c  }../*. ** Lock l
2e630 6f 63 61 74 69 6f 6e 73 20 66 6f 72 20 73 68 61  ocations for sha
2e640 72 65 64 2d 6d 65 6d 6f 72 79 20 6c 6f 63 6b 73  red-memory locks
2e650 20 75 73 65 64 20 62 79 20 57 41 4c 20 6d 6f 64   used by WAL mod
2e660 65 2e 0a 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53  e.. */.#ifndef S
2e670 48 4d 5f 42 41 53 45 0a 23 20 64 65 66 69 6e 65  HM_BASE.# define
2e680 20 53 48 4d 5f 42 41 53 45 20 20 20 20 20 20 20   SHM_BASE       
2e690 20 20 20 31 32 30 0a 23 20 64 65 66 69 6e 65 20     120.# define 
2e6a0 53 48 4d 5f 57 52 49 54 45 20 20 20 20 20 20 20  SHM_WRITE       
2e6b0 20 20 53 48 4d 5f 42 41 53 45 0a 23 20 64 65 66    SHM_BASE.# def
2e6c0 69 6e 65 20 53 48 4d 5f 43 48 45 43 4b 50 4f 49  ine SHM_CHECKPOI
2e6d0 4e 54 20 20 20 20 28 53 48 4d 5f 42 41 53 45 2b  NT    (SHM_BASE+
2e6e0 31 29 0a 23 20 64 65 66 69 6e 65 20 53 48 4d 5f  1).# define SHM_
2e6f0 52 45 43 4f 56 45 52 20 20 20 20 20 20 20 28 53  RECOVER       (S
2e700 48 4d 5f 42 41 53 45 2b 32 29 0a 23 20 64 65 66  HM_BASE+2).# def
2e710 69 6e 65 20 53 48 4d 5f 52 45 41 44 5f 46 49 52  ine SHM_READ_FIR
2e720 53 54 20 20 20 20 28 53 48 4d 5f 42 41 53 45 2b  ST    (SHM_BASE+
2e730 33 29 0a 23 20 64 65 66 69 6e 65 20 53 48 4d 5f  3).# define SHM_
2e740 52 45 41 44 5f 53 49 5a 45 20 20 20 20 20 35 0a  READ_SIZE     5.
2e750 23 65 6e 64 69 66 20 2f 2a 20 53 48 4d 5f 42 41  #endif /* SHM_BA
2e760 53 45 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  SE */../*.** Thi
2e770 73 20 74 65 73 74 20 6f 6e 6c 79 20 77 6f 72 6b  s test only work
2e780 73 20 66 6f 72 20 6c 6f 63 6b 20 74 65 73 74 69  s for lock testi
2e790 6e 67 20 6f 6e 20 75 6e 69 78 2f 70 6f 73 69 78  ng on unix/posix
2e7a0 20 56 46 53 2e 0a 2a 2a 20 41 64 61 70 74 65 64   VFS..** Adapted
2e7b0 20 66 72 6f 6d 20 74 6f 6f 6c 2f 67 65 74 6c 6f   from tool/getlo
2e7c0 63 6b 2e 63 20 66 34 63 33 39 62 36 35 31 33 37  ck.c f4c39b65137
2e7d0 30 31 35 36 63 61 65 39 37 39 35 30 31 61 37 62  0156cae979501a7b
2e7e0 31 35 36 62 64 62 61 35 30 65 37 63 65 0a 2a 2f  156bdba50e7ce.*/
2e7f0 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78  .static int unix
2e800 4c 6f 63 6b 73 74 61 74 65 50 69 64 28 75 6e 69  LockstatePid(uni
2e810 78 46 69 6c 65 20 2a 70 46 69 6c 65 2c 20 70 69  xFile *pFile, pi
2e820 64 5f 74 20 70 69 64 2c 20 69 6e 74 20 2a 70 4c  d_t pid, int *pL
2e830 6f 63 6b 73 74 61 74 65 29 7b 0a 20 20 69 6e 74  ockstate){.  int
2e840 20 68 44 62 3b 20 20 20 20 20 20 20 20 2f 2a 20   hDb;        /* 
2e850 46 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  File descriptor 
2e860 66 6f 72 20 74 68 65 20 6f 70 65 6e 20 64 61 74  for the open dat
2e870 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20  abase file */.  
2e880 69 6e 74 20 68 53 68 6d 20 3d 20 2d 31 3b 20 20  int hShm = -1;  
2e890 2f 2a 20 46 69 6c 65 20 64 65 73 63 72 69 70 74  /* File descript
2e8a0 6f 72 20 66 6f 72 20 57 41 4c 20 73 68 61 72 65  or for WAL share
2e8b0 64 2d 6d 65 6d 6f 72 79 20 66 69 6c 65 20 2a 2f  d-memory file */
2e8c0 0a 20 20 73 73 69 7a 65 5f 74 20 67 6f 74 3b 20  .  ssize_t got; 
2e8d0 20 20 20 2f 2a 20 42 79 74 65 73 20 72 65 61 64     /* Bytes read
2e8e0 20 66 72 6f 6d 20 68 65 61 64 65 72 20 2a 2f 0a   from header */.
2e8f0 20 20 69 6e 74 20 69 73 57 61 6c 20 3d 20 30 3b    int isWal = 0;
2e900 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2e910 54 72 75 65 20 69 66 20 69 6e 20 57 41 4c 20 6d  True if in WAL m
2e920 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 4c 6f  ode */.  int nLo
2e930 63 6b 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  ck = 0;         
2e940 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
2e950 20 6c 6f 63 6b 73 20 68 65 6c 64 20 2a 2f 0a 20   locks held */. 
2e960 20 69 6e 74 20 6e 6f 48 64 72 20 3d 20 30 3b 20   int noHdr = 0; 
2e970 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 5a              /* Z
2e980 65 72 6f 20 62 79 74 65 20 44 42 20 68 61 73 20  ero byte DB has 
2e990 6e 6f 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 75  no header */.  u
2e9a0 6e 73 69 67 6e 65 64 20 63 68 61 72 20 61 48 64  nsigned char aHd
2e9b0 72 5b 31 30 30 5d 3b 20 20 20 2f 2a 20 44 61 74  r[100];   /* Dat
2e9c0 61 62 61 73 65 20 68 65 61 64 65 72 20 2a 2f 0a  abase header */.
2e9d0 20 20 0a 20 20 61 73 73 65 72 74 28 70 4c 6f 63    .  assert(pLoc
2e9e0 6b 73 74 61 74 65 29 3b 0a 20 20 0a 20 20 2f 2a  kstate);.  .  /*
2e9f0 20 6d 61 6b 65 20 73 75 72 65 20 77 65 20 61 72   make sure we ar
2ea00 65 20 64 65 61 6c 69 6e 67 20 77 69 74 68 20 61  e dealing with a
2ea10 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a   database file *
2ea20 2f 0a 20 20 68 44 62 20 3d 20 70 46 69 6c 65 2d  /.  hDb = pFile-
2ea30 3e 68 3b 0a 20 20 69 66 28 20 68 44 62 3c 30 20  >h;.  if( hDb<0 
2ea40 29 7b 0a 20 20 20 20 2a 70 4c 6f 63 6b 73 74 61  ){.    *pLocksta
2ea50 74 65 20 3d 20 53 51 4c 49 54 45 5f 4c 4f 43 4b  te = SQLITE_LOCK
2ea60 53 54 41 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20  STATE_ERROR;.   
2ea70 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45   return SQLITE_E
2ea80 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 61 73 73 65  RROR;.  }.  asse
2ea90 72 74 28 20 28 73 74 72 6c 65 6e 28 53 51 4c 49  rt( (strlen(SQLI
2eaa0 54 45 5f 46 49 4c 45 5f 48 45 41 44 45 52 29 2b  TE_FILE_HEADER)+
2eab0 31 29 3d 3d 53 51 4c 49 54 45 5f 46 49 4c 45 5f  1)==SQLITE_FILE_
2eac0 48 45 41 44 45 52 5f 4c 45 4e 20 29 3b 0a 20 20  HEADER_LEN );.  
2ead0 67 6f 74 20 3d 20 70 72 65 61 64 28 68 44 62 2c  got = pread(hDb,
2eae0 20 61 48 64 72 2c 20 31 30 30 2c 20 30 29 3b 0a   aHdr, 100, 0);.
2eaf0 20 20 69 66 28 20 67 6f 74 3c 30 20 29 7b 0a 20    if( got<0 ){. 
2eb00 20 20 20 2a 70 4c 6f 63 6b 73 74 61 74 65 20 3d     *pLockstate =
2eb10 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 53 54 41 54   SQLITE_LOCKSTAT
2eb20 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 72 65 74  E_ERROR;.    ret
2eb30 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  urn SQLITE_ERROR
2eb40 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 6f 74 3d  ;.  }.  if( got=
2eb50 3d 30 20 29 7b 0a 20 20 20 20 6e 6f 48 64 72 20  =0 ){.    noHdr 
2eb60 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  = 1;.  }else if(
2eb70 20 67 6f 74 21 3d 31 30 30 0a 20 20 20 20 20 20   got!=100.      
2eb80 20 20 20 7c 7c 20 6d 65 6d 63 6d 70 28 61 48 64     || memcmp(aHd
2eb90 72 2c 20 53 51 4c 49 54 45 5f 46 49 4c 45 5f 48  r, SQLITE_FILE_H
2eba0 45 41 44 45 52 2c 20 53 51 4c 49 54 45 5f 46 49  EADER, SQLITE_FI
2ebb0 4c 45 5f 48 45 41 44 45 52 5f 4c 45 4e 29 21 3d  LE_HEADER_LEN)!=
2ebc0 30 0a 20 20 29 7b 0a 20 20 20 20 2a 70 4c 6f 63  0.  ){.    *pLoc
2ebd0 6b 73 74 61 74 65 20 3d 20 53 51 4c 49 54 45 5f  kstate = SQLITE_
2ebe0 4c 4f 43 4b 53 54 41 54 45 5f 4e 4f 54 41 44 42  LOCKSTATE_NOTADB
2ebf0 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
2ec00 49 54 45 5f 4e 4f 54 41 44 42 3b 0a 20 20 7d 0a  ITE_NOTADB;.  }.
2ec10 20 20 0a 20 20 2f 2a 20 46 69 72 73 74 20 63 68    .  /* First ch
2ec20 65 63 6b 20 66 6f 72 20 61 6e 20 65 78 63 6c 75  eck for an exclu
2ec30 73 69 76 65 20 6c 6f 63 6b 20 2a 2f 0a 20 20 6e  sive lock */.  n
2ec40 4c 6f 63 6b 20 2b 3d 20 75 6e 69 78 49 73 4c 6f  Lock += unixIsLo
2ec50 63 6b 65 64 28 70 69 64 2c 20 68 44 62 2c 20 46  cked(pid, hDb, F
2ec60 5f 52 44 4c 43 4b 2c 20 53 48 41 52 45 44 5f 46  _RDLCK, SHARED_F
2ec70 49 52 53 54 2c 20 53 48 41 52 45 44 5f 53 49 5a  IRST, SHARED_SIZ
2ec80 45 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  E,.             
2ec90 20 20 20 20 20 20 20 20 20 20 20 22 45 58 43 4c             "EXCL
2eca0 55 53 49 56 45 22 29 3b 0a 20 20 69 66 20 28 21  USIVE");.  if (!
2ecb0 6e 6f 48 64 72 29 20 7b 0a 20 20 20 20 69 73 57  noHdr) {.    isW
2ecc0 61 6c 20 3d 20 61 48 64 72 5b 31 38 5d 3d 3d 32  al = aHdr[18]==2
2ecd0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e 4c 6f 63  ;.  }.  if( nLoc
2ece0 6b 3d 3d 30 20 26 26 20 69 73 57 61 6c 3d 3d 30  k==0 && isWal==0
2ecf0 20 29 7b 0a 20 20 20 20 2f 2a 20 52 6f 6c 6c 62   ){.    /* Rollb
2ed00 61 63 6b 20 6d 6f 64 65 20 2a 2f 0a 20 20 20 20  ack mode */.    
2ed10 6e 4c 6f 63 6b 20 2b 3d 20 75 6e 69 78 49 73 4c  nLock += unixIsL
2ed20 6f 63 6b 65 64 28 70 69 64 2c 20 68 44 62 2c 20  ocked(pid, hDb, 
2ed30 46 5f 57 52 4c 43 4b 2c 20 50 45 4e 44 49 4e 47  F_WRLCK, PENDING
2ed40 5f 42 59 54 45 2c 20 53 48 41 52 45 44 5f 53 49  _BYTE, SHARED_SI
2ed50 5a 45 2b 32 2c 0a 20 20 20 20 20 20 20 20 20 20  ZE+2,.          
2ed60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ed70 22 50 45 4e 44 49 4e 47 7c 52 45 53 45 52 56 45  "PENDING|RESERVE
2ed80 44 7c 53 48 41 52 45 44 22 29 3b 0a 20 20 7d 0a  D|SHARED");.  }.
2ed90 20 20 69 66 28 20 6e 4c 6f 63 6b 3d 3d 30 20 26    if( nLock==0 &
2eda0 26 20 69 73 57 61 6c 21 3d 30 20 29 7b 0a 20 20  & isWal!=0 ){.  
2edb0 20 20 2f 2a 20 6c 6f 6f 6b 75 70 20 74 68 65 20    /* lookup the 
2edc0 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
2edd0 66 6f 72 20 74 68 65 20 73 68 61 72 65 64 20 6d  for the shared m
2ede0 65 6d 6f 72 79 20 66 69 6c 65 20 69 66 20 77 65  emory file if we
2edf0 20 68 61 76 65 20 69 74 20 6f 70 65 6e 0a 20 20   have it open.  
2ee00 20 20 2a 2a 20 69 6e 20 74 68 69 73 20 70 72 6f    ** in this pro
2ee10 63 65 73 73 20 2a 2f 0a 20 20 20 20 75 6e 69 78  cess */.    unix
2ee20 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 20 2f 2a  EnterMutex(); /*
2ee30 20 42 65 63 61 75 73 65 20 70 46 69 6c 65 2d 3e   Because pFile->
2ee40 70 49 6e 6f 64 65 20 69 73 20 73 68 61 72 65 64  pInode is shared
2ee50 20 61 63 72 6f 73 73 20 74 68 72 65 61 64 73 20   across threads 
2ee60 2a 2f 0a 20 20 20 20 75 6e 69 78 53 68 6d 4e 6f  */.    unixShmNo
2ee70 64 65 20 2a 70 53 68 6d 4e 6f 64 65 20 3d 20 70  de *pShmNode = p
2ee80 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e 70 53  File->pInode->pS
2ee90 68 6d 4e 6f 64 65 3b 0a 20 20 20 20 69 66 28 20  hmNode;.    if( 
2eea0 70 53 68 6d 4e 6f 64 65 20 29 7b 0a 20 20 20 20  pShmNode ){.    
2eeb0 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
2eec0 65 6e 74 65 72 28 70 53 68 6d 4e 6f 64 65 2d 3e  enter(pShmNode->
2eed0 6d 75 74 65 78 29 3b 0a 20 20 20 20 20 20 0a 20  mutex);.      . 
2eee0 20 20 20 20 20 68 53 68 6d 20 3d 20 70 53 68 6d       hShm = pShm
2eef0 4e 6f 64 65 2d 3e 68 3b 0a 20 20 20 20 20 20 69  Node->h;.      i
2ef00 66 28 20 68 53 68 6d 20 3e 3d 20 30 29 7b 0a 20  f( hShm >= 0){. 
2ef10 20 20 20 20 20 20 20 69 66 28 20 75 6e 69 78 49         if( unixI
2ef20 73 4c 6f 63 6b 65 64 28 70 69 64 2c 20 68 53 68  sLocked(pid, hSh
2ef30 6d 2c 20 46 5f 52 44 4c 43 4b 2c 20 53 48 4d 5f  m, F_RDLCK, SHM_
2ef40 52 45 43 4f 56 45 52 2c 20 31 2c 20 22 57 41 4c  RECOVER, 1, "WAL
2ef50 2d 52 45 43 4f 56 45 52 59 22 29 20 7c 7c 0a 20  -RECOVERY") ||. 
2ef60 20 20 20 20 20 20 20 20 20 20 75 6e 69 78 49 73            unixIs
2ef70 4c 6f 63 6b 65 64 28 70 69 64 2c 20 68 53 68 6d  Locked(pid, hShm
2ef80 2c 20 46 5f 52 44 4c 43 4b 2c 20 53 48 4d 5f 57  , F_RDLCK, SHM_W
2ef90 52 49 54 45 2c 20 31 2c 20 22 57 41 4c 2d 57 52  RITE, 1, "WAL-WR
2efa0 49 54 45 22 29 20 29 7b 0a 20 20 20 20 20 20 20  ITE") ){.       
2efb0 20 20 20 6e 4c 6f 63 6b 20 3d 20 31 3b 0a 20 20     nLock = 1;.  
2efc0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
2efd0 20 20 20 20 20 20 0a 20 20 20 20 20 20 73 71 6c        .      sql
2efe0 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65  ite3_mutex_leave
2eff0 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78  (pShmNode->mutex
2f000 29 3b 0a 20 20 20 20 7d 20 0a 20 20 20 20 0a 20  );.    } .    . 
2f010 20 20 20 69 66 28 20 68 53 68 6d 3c 30 20 29 7b     if( hShm<0 ){
2f020 0a 20 20 20 20 20 20 2f 2a 20 74 68 65 20 73 68  .      /* the sh
2f030 61 72 65 64 20 6d 65 6d 6f 72 79 20 66 69 6c 65  ared memory file
2f040 20 69 73 6e 27 74 20 6f 70 65 6e 20 69 6e 20 74   isn't open in t
2f050 68 69 73 20 70 72 6f 63 65 73 73 20 73 70 61 63  his process spac
2f060 65 2c 20 6f 70 65 6e 20 6f 75 72 0a 20 20 20 20  e, open our.    
2f070 20 20 2a 2a 20 6f 77 6e 20 46 44 20 2a 2f 0a 20    ** own FD */. 
2f080 20 20 20 20 20 63 68 61 72 20 7a 53 68 6d 5b 4d       char zShm[M
2f090 41 58 50 41 54 48 4c 45 4e 5d 3b 0a 20 20 20 20  AXPATHLEN];.    
2f0a0 20 20 0a 20 20 20 20 20 20 2f 2a 20 57 41 4c 20    .      /* WAL 
2f0b0 6d 6f 64 65 20 2a 2f 0a 20 20 20 20 20 20 73 74  mode */.      st
2f0c0 72 6c 63 70 79 28 7a 53 68 6d 2c 20 70 46 69 6c  rlcpy(zShm, pFil
2f0d0 65 2d 3e 7a 50 61 74 68 2c 20 4d 41 58 50 41 54  e->zPath, MAXPAT
2f0e0 48 4c 45 4e 29 3b 0a 20 20 20 20 20 20 73 74 72  HLEN);.      str
2f0f0 6c 63 61 74 28 7a 53 68 6d 2c 20 22 2d 73 68 6d  lcat(zShm, "-shm
2f100 22 2c 20 4d 41 58 50 41 54 48 4c 45 4e 29 3b 0a  ", MAXPATHLEN);.
2f110 20 20 20 20 20 20 68 53 68 6d 20 3d 20 6f 70 65        hShm = ope
2f120 6e 28 7a 53 68 6d 2c 20 4f 5f 52 44 4f 4e 4c 59  n(zShm, O_RDONLY
2f130 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20  , 0);.      if( 
2f140 68 53 68 6d 3c 30 20 29 7b 0a 20 20 20 20 20 20  hShm<0 ){.      
2f150 20 20 2a 70 4c 6f 63 6b 73 74 61 74 65 20 3d 20    *pLockstate = 
2f160 53 51 4c 49 54 45 5f 4c 4f 43 4b 53 54 41 54 45  SQLITE_LOCKSTATE
2f170 5f 4f 46 46 3b 0a 20 20 20 20 20 20 20 20 75 6e  _OFF;.        un
2f180 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a  ixLeaveMutex();.
2f190 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53          return S
2f1a0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20  QLITE_OK;.      
2f1b0 7d 0a 20 20 20 20 20 20 69 66 28 20 75 6e 69 78  }.      if( unix
2f1c0 49 73 4c 6f 63 6b 65 64 28 70 69 64 2c 20 68 53  IsLocked(pid, hS
2f1d0 68 6d 2c 20 46 5f 52 44 4c 43 4b 2c 20 53 48 4d  hm, F_RDLCK, SHM
2f1e0 5f 52 45 43 4f 56 45 52 2c 20 31 2c 20 22 57 41  _RECOVER, 1, "WA
2f1f0 4c 2d 52 45 43 4f 56 45 52 59 22 29 20 7c 7c 0a  L-RECOVERY") ||.
2f200 20 20 20 20 20 20 20 20 20 75 6e 69 78 49 73 4c           unixIsL
2f210 6f 63 6b 65 64 28 70 69 64 2c 20 68 53 68 6d 2c  ocked(pid, hShm,
2f220 20 46 5f 52 44 4c 43 4b 2c 20 53 48 4d 5f 57 52   F_RDLCK, SHM_WR
2f230 49 54 45 2c 20 31 2c 20 22 57 41 4c 2d 57 52 49  ITE, 1, "WAL-WRI
2f240 54 45 22 29 20 29 7b 0a 20 20 20 20 20 20 20 20  TE") ){.        
2f250 6e 4c 6f 63 6b 20 3d 20 31 3b 0a 20 20 20 20 20  nLock = 1;.     
2f260 20 7d 0a 20 20 20 20 20 20 63 6c 6f 73 65 28 68   }.      close(h
2f270 53 68 6d 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  Shm);.    }.    
2f280 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29  unixLeaveMutex()
2f290 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e 4c 6f 63  ;.  }.  if( nLoc
2f2a0 6b 3e 30 20 29 7b 0a 20 20 20 20 2a 70 4c 6f 63  k>0 ){.    *pLoc
2f2b0 6b 73 74 61 74 65 20 3d 20 53 51 4c 49 54 45 5f  kstate = SQLITE_
2f2c0 4c 4f 43 4b 53 54 41 54 45 5f 4f 4e 3b 0a 20 20  LOCKSTATE_ON;.  
2f2d0 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 2a 70 4c  } else {.    *pL
2f2e0 6f 63 6b 73 74 61 74 65 20 3d 20 53 51 4c 49 54  ockstate = SQLIT
2f2f0 45 5f 4c 4f 43 4b 53 54 41 54 45 5f 4f 46 46 3b  E_LOCKSTATE_OFF;
2f300 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51  .  }.  return SQ
2f310 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 65 6e 64  LITE_OK;.}..#end
2f320 69 66 20 2f 2a 20 28 53 51 4c 49 54 45 5f 45 4e  if /* (SQLITE_EN
2f330 41 42 4c 45 5f 41 50 50 4c 45 5f 53 50 49 3e 30  ABLE_APPLE_SPI>0
2f340 29 20 26 26 20 64 65 66 69 6e 65 64 28 5f 5f 41  ) && defined(__A
2f350 50 50 4c 45 5f 5f 29 20 2a 2f 0a 0a 23 69 66 20  PPLE__) */..#if 
2f360 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f  SQLITE_MAX_MMAP_
2f370 53 49 5a 45 3e 30 0a 2f 2a 0a 2a 2a 20 49 66 20  SIZE>0./*.** If 
2f380 69 74 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20  it is currently 
2f390 6d 65 6d 6f 72 79 20 6d 61 70 70 65 64 2c 20 75  memory mapped, u
2f3a0 6e 6d 61 70 20 66 69 6c 65 20 70 46 64 2e 0a 2a  nmap file pFd..*
2f3b0 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 75 6e  /.static void un
2f3c0 69 78 55 6e 6d 61 70 66 69 6c 65 28 75 6e 69 78  ixUnmapfile(unix
2f3d0 46 69 6c 65 20 2a 70 46 64 29 7b 0a 20 20 61 73  File *pFd){.  as
2f3e0 73 65 72 74 28 20 70 46 64 2d 3e 6e 46 65 74 63  sert( pFd->nFetc
2f3f0 68 4f 75 74 3d 3d 30 20 29 3b 0a 20 20 69 66 28  hOut==0 );.  if(
2f400 20 70 46 64 2d 3e 70 4d 61 70 52 65 67 69 6f 6e   pFd->pMapRegion
2f410 20 29 7b 0a 20 20 20 20 6f 73 4d 75 6e 6d 61 70   ){.    osMunmap
2f420 28 70 46 64 2d 3e 70 4d 61 70 52 65 67 69 6f 6e  (pFd->pMapRegion
2f430 2c 20 70 46 64 2d 3e 6d 6d 61 70 53 69 7a 65 41  , pFd->mmapSizeA
2f440 63 74 75 61 6c 29 3b 0a 20 20 20 20 70 46 64 2d  ctual);.    pFd-
2f450 3e 70 4d 61 70 52 65 67 69 6f 6e 20 3d 20 30 3b  >pMapRegion = 0;
2f460 0a 20 20 20 20 70 46 64 2d 3e 6d 6d 61 70 53 69  .    pFd->mmapSi
2f470 7a 65 20 3d 20 30 3b 0a 20 20 20 20 70 46 64 2d  ze = 0;.    pFd-
2f480 3e 6d 6d 61 70 53 69 7a 65 41 63 74 75 61 6c 20  >mmapSizeActual 
2f490 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  = 0;.  }.}../*.*
2f4a0 2a 20 41 74 74 65 6d 70 74 20 74 6f 20 73 65 74  * Attempt to set
2f4b0 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65   the size of the
2f4c0 20 6d 65 6d 6f 72 79 20 6d 61 70 70 69 6e 67 20   memory mapping 
2f4d0 6d 61 69 6e 74 61 69 6e 65 64 20 62 79 20 66 69  maintained by fi
2f4e0 6c 65 20 0a 2a 2a 20 64 65 73 63 72 69 70 74 6f  le .** descripto
2f4f0 72 20 70 46 64 20 74 6f 20 6e 4e 65 77 20 62 79  r pFd to nNew by
2f500 74 65 73 2e 20 41 6e 79 20 65 78 69 73 74 69 6e  tes. Any existin
2f510 67 20 6d 61 70 70 69 6e 67 20 69 73 20 64 69 73  g mapping is dis
2f520 63 61 72 64 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66  carded..**.** If
2f530 20 73 75 63 63 65 73 73 66 75 6c 2c 20 74 68 69   successful, thi
2f540 73 20 66 75 6e 63 74 69 6f 6e 20 73 65 74 73 20  s function sets 
2f550 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 76 61  the following va
2f560 72 69 61 62 6c 65 73 3a 0a 2a 2a 0a 2a 2a 20 20  riables:.**.**  
2f570 20 20 20 20 20 75 6e 69 78 46 69 6c 65 2e 70 4d       unixFile.pM
2f580 61 70 52 65 67 69 6f 6e 0a 2a 2a 20 20 20 20 20  apRegion.**     
2f590 20 20 75 6e 69 78 46 69 6c 65 2e 6d 6d 61 70 53    unixFile.mmapS
2f5a0 69 7a 65 0a 2a 2a 20 20 20 20 20 20 20 75 6e 69  ize.**       uni
2f5b0 78 46 69 6c 65 2e 6d 6d 61 70 53 69 7a 65 41 63  xFile.mmapSizeAc
2f5c0 74 75 61 6c 0a 2a 2a 0a 2a 2a 20 49 66 20 75 6e  tual.**.** If un
2f5d0 73 75 63 63 65 73 73 66 75 6c 2c 20 61 6e 20 65  successful, an e
2f5e0 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69 73 20  rror message is 
2f5f0 6c 6f 67 67 65 64 20 76 69 61 20 73 71 6c 69 74  logged via sqlit
2f600 65 33 5f 6c 6f 67 28 29 20 61 6e 64 0a 2a 2a 20  e3_log() and.** 
2f610 74 68 65 20 74 68 72 65 65 20 76 61 72 69 61 62  the three variab
2f620 6c 65 73 20 61 62 6f 76 65 20 61 72 65 20 7a 65  les above are ze
2f630 72 6f 65 64 2e 20 49 6e 20 74 68 69 73 20 63 61  roed. In this ca
2f640 73 65 20 53 51 4c 69 74 65 20 73 68 6f 75 6c 64  se SQLite should
2f650 0a 2a 2a 20 63 6f 6e 74 69 6e 75 65 20 61 63 63  .** continue acc
2f660 65 73 73 69 6e 67 20 74 68 65 20 64 61 74 61 62  essing the datab
2f670 61 73 65 20 75 73 69 6e 67 20 74 68 65 20 78 52  ase using the xR
2f680 65 61 64 28 29 20 61 6e 64 20 78 57 72 69 74 65  ead() and xWrite
2f690 28 29 0a 2a 2a 20 6d 65 74 68 6f 64 73 2e 0a 2a  ().** methods..*
2f6a0 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 75 6e  /.static void un
2f6b0 69 78 52 65 6d 61 70 66 69 6c 65 28 0a 20 20 75  ixRemapfile(.  u
2f6c0 6e 69 78 46 69 6c 65 20 2a 70 46 64 2c 20 20 20  nixFile *pFd,   
2f6d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2f6e0 2a 20 46 69 6c 65 20 64 65 73 63 72 69 70 74 6f  * File descripto
2f6f0 72 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 69 36  r object */.  i6
2f700 34 20 6e 4e 65 77 20 20 20 20 20 20 20 20 20 20  4 nNew          
2f710 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2f720 20 52 65 71 75 69 72 65 64 20 6d 61 70 70 69 6e   Required mappin
2f730 67 20 73 69 7a 65 20 2a 2f 0a 29 7b 0a 20 20 63  g size */.){.  c
2f740 6f 6e 73 74 20 63 68 61 72 20 2a 7a 45 72 72 20  onst char *zErr 
2f750 3d 20 22 6d 6d 61 70 22 3b 0a 20 20 69 6e 74 20  = "mmap";.  int 
2f760 68 20 3d 20 70 46 64 2d 3e 68 3b 20 20 20 20 20  h = pFd->h;     
2f770 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f780 20 2f 2a 20 46 69 6c 65 20 64 65 73 63 72 69 70   /* File descrip
2f790 74 6f 72 20 6f 70 65 6e 20 6f 6e 20 64 62 20 66  tor open on db f
2f7a0 69 6c 65 20 2a 2f 0a 20 20 75 38 20 2a 70 4f 72  ile */.  u8 *pOr
2f7b0 69 67 20 3d 20 28 75 38 20 2a 29 70 46 64 2d 3e  ig = (u8 *)pFd->
2f7c0 70 4d 61 70 52 65 67 69 6f 6e 3b 20 20 20 2f 2a  pMapRegion;   /*
2f7d0 20 50 6f 69 6e 74 65 72 20 74 6f 20 63 75 72 72   Pointer to curr
2f7e0 65 6e 74 20 66 69 6c 65 20 6d 61 70 70 69 6e 67  ent file mapping
2f7f0 20 2a 2f 0a 20 20 69 36 34 20 6e 4f 72 69 67 20   */.  i64 nOrig 
2f800 3d 20 70 46 64 2d 3e 6d 6d 61 70 53 69 7a 65 41  = pFd->mmapSizeA
2f810 63 74 75 61 6c 3b 20 20 20 20 20 2f 2a 20 53 69  ctual;     /* Si
2f820 7a 65 20 6f 66 20 70 4f 72 69 67 20 72 65 67 69  ze of pOrig regi
2f830 6f 6e 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20  on in bytes */. 
2f840 20 75 38 20 2a 70 4e 65 77 20 3d 20 30 3b 20 20   u8 *pNew = 0;  
2f850 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f860 20 20 20 20 20 20 2f 2a 20 4c 6f 63 61 74 69 6f        /* Locatio
2f870 6e 20 6f 66 20 6e 65 77 20 6d 61 70 70 69 6e 67  n of new mapping
2f880 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 20   */.  int flags 
2f890 3d 20 50 52 4f 54 5f 52 45 41 44 3b 20 20 20 20  = PROT_READ;    
2f8a0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6c             /* Fl
2f8b0 61 67 73 20 74 6f 20 70 61 73 73 20 74 6f 20 6d  ags to pass to m
2f8c0 6d 61 70 28 29 20 2a 2f 0a 0a 20 20 61 73 73 65  map() */..  asse
2f8d0 72 74 28 20 70 46 64 2d 3e 6e 46 65 74 63 68 4f  rt( pFd->nFetchO
2f8e0 75 74 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  ut==0 );.  asser
2f8f0 74 28 20 6e 4e 65 77 3e 70 46 64 2d 3e 6d 6d 61  t( nNew>pFd->mma
2f900 70 53 69 7a 65 20 29 3b 0a 20 20 61 73 73 65 72  pSize );.  asser
2f910 74 28 20 6e 4e 65 77 3c 3d 70 46 64 2d 3e 6d 6d  t( nNew<=pFd->mm
2f920 61 70 53 69 7a 65 4d 61 78 20 29 3b 0a 20 20 61  apSizeMax );.  a
2f930 73 73 65 72 74 28 20 6e 4e 65 77 3e 30 20 29 3b  ssert( nNew>0 );
2f940 0a 20 20 61 73 73 65 72 74 28 20 70 46 64 2d 3e  .  assert( pFd->
2f950 6d 6d 61 70 53 69 7a 65 41 63 74 75 61 6c 3e 3d  mmapSizeActual>=
2f960 70 46 64 2d 3e 6d 6d 61 70 53 69 7a 65 20 29 3b  pFd->mmapSize );
2f970 0a 20 20 61 73 73 65 72 74 28 20 4d 41 50 5f 46  .  assert( MAP_F
2f980 41 49 4c 45 44 21 3d 30 20 29 3b 0a 0a 23 69 66  AILED!=0 );..#if
2f990 64 65 66 20 53 51 4c 49 54 45 5f 4d 4d 41 50 5f  def SQLITE_MMAP_
2f9a0 52 45 41 44 57 52 49 54 45 0a 20 20 69 66 28 20  READWRITE.  if( 
2f9b0 28 70 46 64 2d 3e 63 74 72 6c 46 6c 61 67 73 20  (pFd->ctrlFlags 
2f9c0 26 20 55 4e 49 58 46 49 4c 45 5f 52 44 4f 4e 4c  & UNIXFILE_RDONL
2f9d0 59 29 3d 3d 30 20 29 20 66 6c 61 67 73 20 7c 3d  Y)==0 ) flags |=
2f9e0 20 50 52 4f 54 5f 57 52 49 54 45 3b 0a 23 65 6e   PROT_WRITE;.#en
2f9f0 64 69 66 0a 0a 20 20 69 66 28 20 70 4f 72 69 67  dif..  if( pOrig
2fa00 20 29 7b 0a 23 69 66 20 48 41 56 45 5f 4d 52 45   ){.#if HAVE_MRE
2fa10 4d 41 50 0a 20 20 20 20 69 36 34 20 6e 52 65 75  MAP.    i64 nReu
2fa20 73 65 20 3d 20 70 46 64 2d 3e 6d 6d 61 70 53 69  se = pFd->mmapSi
2fa30 7a 65 3b 0a 23 65 6c 73 65 0a 20 20 20 20 63 6f  ze;.#else.    co
2fa40 6e 73 74 20 69 6e 74 20 73 7a 53 79 73 70 61 67  nst int szSyspag
2fa50 65 20 3d 20 6f 73 47 65 74 70 61 67 65 73 69 7a  e = osGetpagesiz
2fa60 65 28 29 3b 0a 20 20 20 20 69 36 34 20 6e 52 65  e();.    i64 nRe
2fa70 75 73 65 20 3d 20 28 70 46 64 2d 3e 6d 6d 61 70  use = (pFd->mmap
2fa80 53 69 7a 65 20 26 20 7e 28 73 7a 53 79 73 70 61  Size & ~(szSyspa
2fa90 67 65 2d 31 29 29 3b 0a 23 65 6e 64 69 66 0a 20  ge-1));.#endif. 
2faa0 20 20 20 75 38 20 2a 70 52 65 71 20 3d 20 26 70     u8 *pReq = &p
2fab0 4f 72 69 67 5b 6e 52 65 75 73 65 5d 3b 0a 0a 20  Orig[nReuse];.. 
2fac0 20 20 20 2f 2a 20 55 6e 6d 61 70 20 61 6e 79 20     /* Unmap any 
2fad0 70 61 67 65 73 20 6f 66 20 74 68 65 20 65 78 69  pages of the exi
2fae0 73 74 69 6e 67 20 6d 61 70 70 69 6e 67 20 74 68  sting mapping th
2faf0 61 74 20 63 61 6e 6e 6f 74 20 62 65 20 72 65 75  at cannot be reu
2fb00 73 65 64 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20  sed. */.    if( 
2fb10 6e 52 65 75 73 65 21 3d 6e 4f 72 69 67 20 29 7b  nReuse!=nOrig ){
2fb20 0a 20 20 20 20 20 20 6f 73 4d 75 6e 6d 61 70 28  .      osMunmap(
2fb30 70 52 65 71 2c 20 6e 4f 72 69 67 2d 6e 52 65 75  pReq, nOrig-nReu
2fb40 73 65 29 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 20  se);.    }..#if 
2fb50 48 41 56 45 5f 4d 52 45 4d 41 50 0a 20 20 20 20  HAVE_MREMAP.    
2fb60 70 4e 65 77 20 3d 20 6f 73 4d 72 65 6d 61 70 28  pNew = osMremap(
2fb70 70 4f 72 69 67 2c 20 6e 52 65 75 73 65 2c 20 6e  pOrig, nReuse, n
2fb80 4e 65 77 2c 20 4d 52 45 4d 41 50 5f 4d 41 59 4d  New, MREMAP_MAYM
2fb90 4f 56 45 29 3b 0a 20 20 20 20 7a 45 72 72 20 3d  OVE);.    zErr =
2fba0 20 22 6d 72 65 6d 61 70 22 3b 0a 23 65 6c 73 65   "mremap";.#else
2fbb0 0a 20 20 20 20 70 4e 65 77 20 3d 20 6f 73 4d 6d  .    pNew = osMm
2fbc0 61 70 28 70 52 65 71 2c 20 6e 4e 65 77 2d 6e 52  ap(pReq, nNew-nR
2fbd0 65 75 73 65 2c 20 66 6c 61 67 73 2c 20 4d 41 50  euse, flags, MAP
2fbe0 5f 53 48 41 52 45 44 2c 20 68 2c 20 6e 52 65 75  _SHARED, h, nReu
2fbf0 73 65 29 3b 0a 20 20 20 20 69 66 28 20 70 4e 65  se);.    if( pNe
2fc00 77 21 3d 4d 41 50 5f 46 41 49 4c 45 44 20 29 7b  w!=MAP_FAILED ){
2fc10 0a 20 20 20 20 20 20 69 66 28 20 70 4e 65 77 21  .      if( pNew!
2fc20 3d 70 52 65 71 20 29 7b 0a 20 20 20 20 20 20 20  =pReq ){.       
2fc30 20 6f 73 4d 75 6e 6d 61 70 28 70 4e 65 77 2c 20   osMunmap(pNew, 
2fc40 6e 4e 65 77 20 2d 20 6e 52 65 75 73 65 29 3b 0a  nNew - nReuse);.
2fc50 20 20 20 20 20 20 20 20 70 4e 65 77 20 3d 20 30          pNew = 0
2fc60 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
2fc70 20 20 20 20 20 20 20 70 4e 65 77 20 3d 20 70 4f         pNew = pO
2fc80 72 69 67 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  rig;.      }.   
2fc90 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f   }.#endif..    /
2fca0 2a 20 54 68 65 20 61 74 74 65 6d 70 74 20 74 6f  * The attempt to
2fcb0 20 65 78 74 65 6e 64 20 74 68 65 20 65 78 69 73   extend the exis
2fcc0 74 69 6e 67 20 6d 61 70 70 69 6e 67 20 66 61 69  ting mapping fai
2fcd0 6c 65 64 2e 20 46 72 65 65 20 69 74 2e 20 2a 2f  led. Free it. */
2fce0 0a 20 20 20 20 69 66 28 20 70 4e 65 77 3d 3d 4d  .    if( pNew==M
2fcf0 41 50 5f 46 41 49 4c 45 44 20 7c 7c 20 70 4e 65  AP_FAILED || pNe
2fd00 77 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 6f 73  w==0 ){.      os
2fd10 4d 75 6e 6d 61 70 28 70 4f 72 69 67 2c 20 6e 52  Munmap(pOrig, nR
2fd20 65 75 73 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  euse);.    }.  }
2fd30 0a 0a 20 20 2f 2a 20 49 66 20 70 4e 65 77 20 69  ..  /* If pNew i
2fd40 73 20 73 74 69 6c 6c 20 4e 55 4c 4c 2c 20 74 72  s still NULL, tr
2fd50 79 20 74 6f 20 63 72 65 61 74 65 20 61 6e 20 65  y to create an e
2fd60 6e 74 69 72 65 6c 79 20 6e 65 77 20 6d 61 70 70  ntirely new mapp
2fd70 69 6e 67 2e 20 2a 2f 0a 20 20 69 66 28 20 70 4e  ing. */.  if( pN
2fd80 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20 70 4e 65  ew==0 ){.    pNe
2fd90 77 20 3d 20 6f 73 4d 6d 61 70 28 30 2c 20 6e 4e  w = osMmap(0, nN
2fda0 65 77 2c 20 66 6c 61 67 73 2c 20 4d 41 50 5f 53  ew, flags, MAP_S
2fdb0 48 41 52 45 44 2c 20 68 2c 20 30 29 3b 0a 20 20  HARED, h, 0);.  
2fdc0 7d 0a 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d 4d  }..  if( pNew==M
2fdd0 41 50 5f 46 41 49 4c 45 44 20 29 7b 0a 20 20 20  AP_FAILED ){.   
2fde0 20 70 4e 65 77 20 3d 20 30 3b 0a 20 20 20 20 6e   pNew = 0;.    n
2fdf0 4e 65 77 20 3d 20 30 3b 0a 20 20 20 20 75 6e 69  New = 0;.    uni
2fe00 78 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45  xLogError(SQLITE
2fe10 5f 4f 4b 2c 20 7a 45 72 72 2c 20 70 46 64 2d 3e  _OK, zErr, pFd->
2fe20 7a 50 61 74 68 29 3b 0a 0a 20 20 20 20 2f 2a 20  zPath);..    /* 
2fe30 49 66 20 74 68 65 20 6d 6d 61 70 28 29 20 61 62  If the mmap() ab
2fe40 6f 76 65 20 66 61 69 6c 65 64 2c 20 61 73 73 75  ove failed, assu
2fe50 6d 65 20 74 68 61 74 20 61 6c 6c 20 73 75 62 73  me that all subs
2fe60 65 71 75 65 6e 74 20 6d 6d 61 70 28 29 20 63 61  equent mmap() ca
2fe70 6c 6c 73 0a 20 20 20 20 2a 2a 20 77 69 6c 6c 20  lls.    ** will 
2fe80 70 72 6f 62 61 62 6c 79 20 66 61 69 6c 20 74 6f  probably fail to
2fe90 6f 2e 20 46 61 6c 6c 20 62 61 63 6b 20 74 6f 20  o. Fall back to 
2fea0 75 73 69 6e 67 20 78 52 65 61 64 2f 78 57 72 69  using xRead/xWri
2feb0 74 65 20 65 78 63 6c 75 73 69 76 65 6c 79 0a 20  te exclusively. 
2fec0 20 20 20 2a 2a 20 69 6e 20 74 68 69 73 20 63 61     ** in this ca
2fed0 73 65 2e 20 20 2a 2f 0a 20 20 20 20 70 46 64 2d  se.  */.    pFd-
2fee0 3e 6d 6d 61 70 53 69 7a 65 4d 61 78 20 3d 20 30  >mmapSizeMax = 0
2fef0 3b 0a 20 20 7d 0a 20 20 70 46 64 2d 3e 70 4d 61  ;.  }.  pFd->pMa
2ff00 70 52 65 67 69 6f 6e 20 3d 20 28 76 6f 69 64 20  pRegion = (void 
2ff10 2a 29 70 4e 65 77 3b 0a 20 20 70 46 64 2d 3e 6d  *)pNew;.  pFd->m
2ff20 6d 61 70 53 69 7a 65 20 3d 20 70 46 64 2d 3e 6d  mapSize = pFd->m
2ff30 6d 61 70 53 69 7a 65 41 63 74 75 61 6c 20 3d 20  mapSizeActual = 
2ff40 6e 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d  nNew;.}../*.** M
2ff50 65 6d 6f 72 79 20 6d 61 70 20 6f 72 20 72 65 6d  emory map or rem
2ff60 61 70 20 74 68 65 20 66 69 6c 65 20 6f 70 65 6e  ap the file open
2ff70 65 64 20 62 79 20 66 69 6c 65 2d 64 65 73 63 72  ed by file-descr
2ff80 69 70 74 6f 72 20 70 46 64 20 28 69 66 20 74 68  iptor pFd (if th
2ff90 65 20 66 69 6c 65 0a 2a 2a 20 69 73 20 61 6c 72  e file.** is alr
2ffa0 65 61 64 79 20 6d 61 70 70 65 64 2c 20 74 68 65  eady mapped, the
2ffb0 20 65 78 69 73 74 69 6e 67 20 6d 61 70 70 69 6e   existing mappin
2ffc0 67 20 69 73 20 72 65 70 6c 61 63 65 64 20 62 79  g is replaced by
2ffd0 20 74 68 65 20 6e 65 77 29 2e 20 4f 72 2c 20 69   the new). Or, i
2ffe0 66 20 0a 2a 2a 20 74 68 65 72 65 20 61 6c 72 65  f .** there alre
2fff0 61 64 79 20 65 78 69 73 74 73 20 61 20 6d 61 70  ady exists a map
30000 70 69 6e 67 20 66 6f 72 20 74 68 69 73 20 66 69  ping for this fi
30010 6c 65 2c 20 61 6e 64 20 74 68 65 72 65 20 61 72  le, and there ar
30020 65 20 73 74 69 6c 6c 20 0a 2a 2a 20 6f 75 74 73  e still .** outs
30030 74 61 6e 64 69 6e 67 20 78 46 65 74 63 68 28 29  tanding xFetch()
30040 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 69   references to i
30050 74 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  t, this function
30060 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a   is a no-op..**.
30070 2a 2a 20 49 66 20 70 61 72 61 6d 65 74 65 72 20  ** If parameter 
30080 6e 42 79 74 65 20 69 73 20 6e 6f 6e 2d 6e 65 67  nByte is non-neg
30090 61 74 69 76 65 2c 20 74 68 65 6e 20 69 74 20 69  ative, then it i
300a0 73 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20  s the requested 
300b0 73 69 7a 65 20 6f 66 20 0a 2a 2a 20 74 68 65 20  size of .** the 
300c0 6d 61 70 70 69 6e 67 20 74 6f 20 63 72 65 61 74  mapping to creat
300d0 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66  e. Otherwise, if
300e0 20 6e 42 79 74 65 20 69 73 20 6c 65 73 73 20 74   nByte is less t
300f0 68 61 6e 20 7a 65 72 6f 2c 20 74 68 65 6e 20 74  han zero, then t
30100 68 65 20 0a 2a 2a 20 72 65 71 75 65 73 74 65 64  he .** requested
30110 20 73 69 7a 65 20 69 73 20 74 68 65 20 73 69 7a   size is the siz
30120 65 20 6f 66 20 74 68 65 20 66 69 6c 65 20 6f 6e  e of the file on
30130 20 64 69 73 6b 2e 20 54 68 65 20 61 63 74 75 61   disk. The actua
30140 6c 20 73 69 7a 65 20 6f 66 20 74 68 65 0a 2a 2a  l size of the.**
30150 20 63 72 65 61 74 65 64 20 6d 61 70 70 69 6e 67   created mapping
30160 20 69 73 20 65 69 74 68 65 72 20 74 68 65 20 72   is either the r
30170 65 71 75 65 73 74 65 64 20 73 69 7a 65 20 6f 72  equested size or
30180 20 74 68 65 20 76 61 6c 75 65 20 63 6f 6e 66 69   the value confi
30190 67 75 72 65 64 20 0a 2a 2a 20 75 73 69 6e 67 20  gured .** using 
301a0 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 4d 4d 41  SQLITE_FCNTL_MMA
301b0 50 5f 4c 49 4d 49 54 2c 20 77 68 69 63 68 65 76  P_LIMIT, whichev
301c0 65 72 20 69 73 20 73 6d 61 6c 6c 65 72 2e 0a 2a  er is smaller..*
301d0 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69  *.** SQLITE_OK i
301e0 73 20 72 65 74 75 72 6e 65 64 20 69 66 20 6e 6f  s returned if no
301f0 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 28 65   error occurs (e
30200 76 65 6e 20 69 66 20 74 68 65 20 6d 61 70 70 69  ven if the mappi
30210 6e 67 20 69 73 20 6e 6f 74 0a 2a 2a 20 72 65 63  ng is not.** rec
30220 72 65 61 74 65 64 20 61 73 20 61 20 72 65 73 75  reated as a resu
30230 6c 74 20 6f 66 20 6f 75 74 73 74 61 6e 64 69 6e  lt of outstandin
30240 67 20 72 65 66 65 72 65 6e 63 65 73 29 20 6f 72  g references) or
30250 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72   an SQLite error
30260 0a 2a 2a 20 63 6f 64 65 20 6f 74 68 65 72 77 69  .** code otherwi
30270 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  se..*/.static in
30280 74 20 75 6e 69 78 4d 61 70 66 69 6c 65 28 75 6e  t unixMapfile(un
30290 69 78 46 69 6c 65 20 2a 70 46 64 2c 20 69 36 34  ixFile *pFd, i64
302a0 20 6e 4d 61 70 29 7b 0a 20 20 61 73 73 65 72 74   nMap){.  assert
302b0 28 20 6e 4d 61 70 3e 3d 30 20 7c 7c 20 70 46 64  ( nMap>=0 || pFd
302c0 2d 3e 6e 46 65 74 63 68 4f 75 74 3d 3d 30 20 29  ->nFetchOut==0 )
302d0 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 4d 61 70  ;.  assert( nMap
302e0 3e 30 20 7c 7c 20 28 70 46 64 2d 3e 6d 6d 61 70  >0 || (pFd->mmap
302f0 53 69 7a 65 3d 3d 30 20 26 26 20 70 46 64 2d 3e  Size==0 && pFd->
30300 70 4d 61 70 52 65 67 69 6f 6e 3d 3d 30 29 20 29  pMapRegion==0) )
30310 3b 0a 20 20 69 66 28 20 70 46 64 2d 3e 6e 46 65  ;.  if( pFd->nFe
30320 74 63 68 4f 75 74 3e 30 20 29 20 72 65 74 75 72  tchOut>0 ) retur
30330 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20  n SQLITE_OK;..  
30340 69 66 28 20 6e 4d 61 70 3c 30 20 29 7b 0a 20 20  if( nMap<0 ){.  
30350 20 20 73 74 72 75 63 74 20 73 74 61 74 20 73 74    struct stat st
30360 61 74 62 75 66 3b 20 20 20 20 20 20 20 20 20 20  atbuf;          
30370 2f 2a 20 4c 6f 77 2d 6c 65 76 65 6c 20 66 69 6c  /* Low-level fil
30380 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 2a 2f  e information */
30390 0a 20 20 20 20 69 66 28 20 6f 73 46 73 74 61 74  .    if( osFstat
303a0 28 70 46 64 2d 3e 68 2c 20 26 73 74 61 74 62 75  (pFd->h, &statbu
303b0 66 29 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  f) ){.      retu
303c0 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  rn SQLITE_IOERR_
303d0 46 53 54 41 54 3b 0a 20 20 20 20 7d 0a 20 20 20  FSTAT;.    }.   
303e0 20 6e 4d 61 70 20 3d 20 73 74 61 74 62 75 66 2e   nMap = statbuf.
303f0 73 74 5f 73 69 7a 65 3b 0a 20 20 7d 0a 20 20 69  st_size;.  }.  i
30400 66 28 20 6e 4d 61 70 3e 70 46 64 2d 3e 6d 6d 61  f( nMap>pFd->mma
30410 70 53 69 7a 65 4d 61 78 20 29 7b 0a 20 20 20 20  pSizeMax ){.    
30420 6e 4d 61 70 20 3d 20 70 46 64 2d 3e 6d 6d 61 70  nMap = pFd->mmap
30430 53 69 7a 65 4d 61 78 3b 0a 20 20 7d 0a 0a 20 20  SizeMax;.  }..  
30440 61 73 73 65 72 74 28 20 6e 4d 61 70 3e 30 20 7c  assert( nMap>0 |
30450 7c 20 28 70 46 64 2d 3e 6d 6d 61 70 53 69 7a 65  | (pFd->mmapSize
30460 3d 3d 30 20 26 26 20 70 46 64 2d 3e 70 4d 61 70  ==0 && pFd->pMap
30470 52 65 67 69 6f 6e 3d 3d 30 29 20 29 3b 0a 20 20  Region==0) );.  
30480 69 66 28 20 6e 4d 61 70 21 3d 70 46 64 2d 3e 6d  if( nMap!=pFd->m
30490 6d 61 70 53 69 7a 65 20 29 7b 0a 20 20 20 20 75  mapSize ){.    u
304a0 6e 69 78 52 65 6d 61 70 66 69 6c 65 28 70 46 64  nixRemapfile(pFd
304b0 2c 20 6e 4d 61 70 29 3b 0a 20 20 7d 0a 0a 20 20  , nMap);.  }..  
304c0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
304d0 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  ;.}.#endif /* SQ
304e0 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49  LITE_MAX_MMAP_SI
304f0 5a 45 3e 30 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 49  ZE>0 */../*.** I
30500 66 20 70 6f 73 73 69 62 6c 65 2c 20 72 65 74 75  f possible, retu
30510 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  rn a pointer to 
30520 61 20 6d 61 70 70 69 6e 67 20 6f 66 20 66 69 6c  a mapping of fil
30530 65 20 66 64 20 73 74 61 72 74 69 6e 67 20 61 74  e fd starting at
30540 20 6f 66 66 73 65 74 0a 2a 2a 20 69 4f 66 66 2e   offset.** iOff.
30550 20 54 68 65 20 6d 61 70 70 69 6e 67 20 6d 75 73   The mapping mus
30560 74 20 62 65 20 76 61 6c 69 64 20 66 6f 72 20 61  t be valid for a
30570 74 20 6c 65 61 73 74 20 6e 41 6d 74 20 62 79 74  t least nAmt byt
30580 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75 63  es..**.** If suc
30590 68 20 61 20 70 6f 69 6e 74 65 72 20 63 61 6e 20  h a pointer can 
305a0 62 65 20 6f 62 74 61 69 6e 65 64 2c 20 73 74 6f  be obtained, sto
305b0 72 65 20 69 74 20 69 6e 20 2a 70 70 20 61 6e 64  re it in *pp and
305c0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
305d0 4b 2e 0a 2a 2a 20 4f 72 2c 20 69 66 20 6f 6e 65  K..** Or, if one
305e0 20 63 61 6e 6e 6f 74 20 62 75 74 20 6e 6f 20 65   cannot but no e
305f0 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 73 65 74  rror occurs, set
30600 20 2a 70 70 20 74 6f 20 30 20 61 6e 64 20 72 65   *pp to 0 and re
30610 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a  turn SQLITE_OK..
30620 2a 2a 20 46 69 6e 61 6c 6c 79 2c 20 69 66 20 61  ** Finally, if a
30630 6e 20 65 72 72 6f 72 20 64 6f 65 73 20 6f 63 63  n error does occ
30640 75 72 2c 20 72 65 74 75 72 6e 20 61 6e 20 53 51  ur, return an SQ
30650 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65 2e  Lite error code.
30660 20 54 68 65 20 66 69 6e 61 6c 0a 2a 2a 20 76 61   The final.** va
30670 6c 75 65 20 6f 66 20 2a 70 70 20 69 73 20 75 6e  lue of *pp is un
30680 64 65 66 69 6e 65 64 20 69 6e 20 74 68 69 73 20  defined in this 
30690 63 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  case..**.** If t
306a0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 64 6f 65  his function doe
306b0 73 20 72 65 74 75 72 6e 20 61 20 70 6f 69 6e 74  s return a point
306c0 65 72 2c 20 74 68 65 20 63 61 6c 6c 65 72 20 6d  er, the caller m
306d0 75 73 74 20 65 76 65 6e 74 75 61 6c 6c 79 20 0a  ust eventually .
306e0 2a 2a 20 72 65 6c 65 61 73 65 20 74 68 65 20 72  ** release the r
306f0 65 66 65 72 65 6e 63 65 20 62 79 20 63 61 6c 6c  eference by call
30700 69 6e 67 20 75 6e 69 78 55 6e 66 65 74 63 68 28  ing unixUnfetch(
30710 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  )..*/.static int
30720 20 75 6e 69 78 46 65 74 63 68 28 73 71 6c 69 74   unixFetch(sqlit
30730 65 33 5f 66 69 6c 65 20 2a 66 64 2c 20 69 36 34  e3_file *fd, i64
30740 20 69 4f 66 66 2c 20 69 6e 74 20 6e 41 6d 74 2c   iOff, int nAmt,
30750 20 76 6f 69 64 20 2a 2a 70 70 29 7b 0a 23 69 66   void **pp){.#if
30760 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50   SQLITE_MAX_MMAP
30770 5f 53 49 5a 45 3e 30 0a 20 20 75 6e 69 78 46 69  _SIZE>0.  unixFi
30780 6c 65 20 2a 70 46 64 20 3d 20 28 75 6e 69 78 46  le *pFd = (unixF
30790 69 6c 65 20 2a 29 66 64 3b 20 20 20 2f 2a 20 54  ile *)fd;   /* T
307a0 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 64 61  he underlying da
307b0 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 23  tabase file */.#
307c0 65 6e 64 69 66 0a 20 20 2a 70 70 20 3d 20 30 3b  endif.  *pp = 0;
307d0 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58  ..#if SQLITE_MAX
307e0 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 20 20 69  _MMAP_SIZE>0.  i
307f0 66 28 20 70 46 64 2d 3e 6d 6d 61 70 53 69 7a 65  f( pFd->mmapSize
30800 4d 61 78 3e 30 20 29 7b 0a 20 20 20 20 69 66 28  Max>0 ){.    if(
30810 20 70 46 64 2d 3e 70 4d 61 70 52 65 67 69 6f 6e   pFd->pMapRegion
30820 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  ==0 ){.      int
30830 20 72 63 20 3d 20 75 6e 69 78 4d 61 70 66 69 6c   rc = unixMapfil
30840 65 28 70 46 64 2c 20 2d 31 29 3b 0a 20 20 20 20  e(pFd, -1);.    
30850 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
30860 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b  _OK ) return rc;
30870 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70  .    }.    if( p
30880 46 64 2d 3e 6d 6d 61 70 53 69 7a 65 20 3e 3d 20  Fd->mmapSize >= 
30890 69 4f 66 66 2b 6e 41 6d 74 20 29 7b 0a 20 20 20  iOff+nAmt ){.   
308a0 20 20 20 2a 70 70 20 3d 20 26 28 28 75 38 20 2a     *pp = &((u8 *
308b0 29 70 46 64 2d 3e 70 4d 61 70 52 65 67 69 6f 6e  )pFd->pMapRegion
308c0 29 5b 69 4f 66 66 5d 3b 0a 20 20 20 20 20 20 70  )[iOff];.      p
308d0 46 64 2d 3e 6e 46 65 74 63 68 4f 75 74 2b 2b 3b  Fd->nFetchOut++;
308e0 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69  .    }.  }.#endi
308f0 66 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  f.  return SQLIT
30900 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  E_OK;.}../*.** I
30910 66 20 74 68 65 20 74 68 69 72 64 20 61 72 67 75  f the third argu
30920 6d 65 6e 74 20 69 73 20 6e 6f 6e 2d 4e 55 4c 4c  ment is non-NULL
30930 2c 20 74 68 65 6e 20 74 68 69 73 20 66 75 6e 63  , then this func
30940 74 69 6f 6e 20 72 65 6c 65 61 73 65 73 20 61 20  tion releases a 
30950 0a 2a 2a 20 72 65 66 65 72 65 6e 63 65 20 6f 62  .** reference ob
30960 74 61 69 6e 65 64 20 62 79 20 61 6e 20 65 61 72  tained by an ear
30970 6c 69 65 72 20 63 61 6c 6c 20 74 6f 20 75 6e 69  lier call to uni
30980 78 46 65 74 63 68 28 29 2e 20 54 68 65 20 73 65  xFetch(). The se
30990 63 6f 6e 64 0a 2a 2a 20 61 72 67 75 6d 65 6e 74  cond.** argument
309a0 20 70 61 73 73 65 64 20 74 6f 20 74 68 69 73 20   passed to this 
309b0 66 75 6e 63 74 69 6f 6e 20 6d 75 73 74 20 62 65  function must be
309c0 20 74 68 65 20 73 61 6d 65 20 61 73 20 74 68 65   the same as the
309d0 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 0a 2a   corresponding.*
309e0 2a 20 61 72 67 75 6d 65 6e 74 20 74 68 61 74 20  * argument that 
309f0 77 61 73 20 70 61 73 73 65 64 20 74 6f 20 74 68  was passed to th
30a00 65 20 75 6e 69 78 46 65 74 63 68 28 29 20 69 6e  e unixFetch() in
30a10 76 6f 63 61 74 69 6f 6e 2e 20 0a 2a 2a 0a 2a 2a  vocation. .**.**
30a20 20 4f 72 2c 20 69 66 20 74 68 65 20 74 68 69 72   Or, if the thir
30a30 64 20 61 72 67 75 6d 65 6e 74 20 69 73 20 4e 55  d argument is NU
30a40 4c 4c 2c 20 74 68 65 6e 20 74 68 69 73 20 66 75  LL, then this fu
30a50 6e 63 74 69 6f 6e 20 69 73 20 62 65 69 6e 67 20  nction is being 
30a60 63 61 6c 6c 65 64 20 0a 2a 2a 20 74 6f 20 69 6e  called .** to in
30a70 66 6f 72 6d 20 74 68 65 20 56 46 53 20 6c 61 79  form the VFS lay
30a80 65 72 20 74 68 61 74 2c 20 61 63 63 6f 72 64 69  er that, accordi
30a90 6e 67 20 74 6f 20 50 4f 53 49 58 2c 20 61 6e 79  ng to POSIX, any
30aa0 20 65 78 69 73 74 69 6e 67 20 6d 61 70 70 69 6e   existing mappin
30ab0 67 20 0a 2a 2a 20 6d 61 79 20 6e 6f 77 20 62 65  g .** may now be
30ac0 20 69 6e 76 61 6c 69 64 20 61 6e 64 20 73 68 6f   invalid and sho
30ad0 75 6c 64 20 62 65 20 75 6e 6d 61 70 70 65 64 2e  uld be unmapped.
30ae0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75  .*/.static int u
30af0 6e 69 78 55 6e 66 65 74 63 68 28 73 71 6c 69 74  nixUnfetch(sqlit
30b00 65 33 5f 66 69 6c 65 20 2a 66 64 2c 20 69 36 34  e3_file *fd, i64
30b10 20 69 4f 66 66 2c 20 76 6f 69 64 20 2a 70 29 7b   iOff, void *p){
30b20 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f  .#if SQLITE_MAX_
30b30 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 20 20 75 6e  MMAP_SIZE>0.  un
30b40 69 78 46 69 6c 65 20 2a 70 46 64 20 3d 20 28 75  ixFile *pFd = (u
30b50 6e 69 78 46 69 6c 65 20 2a 29 66 64 3b 20 20 20  nixFile *)fd;   
30b60 2f 2a 20 54 68 65 20 75 6e 64 65 72 6c 79 69 6e  /* The underlyin
30b70 67 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  g database file 
30b80 2a 2f 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  */.  UNUSED_PARA
30b90 4d 45 54 45 52 28 69 4f 66 66 29 3b 0a 0a 20 20  METER(iOff);..  
30ba0 2f 2a 20 49 66 20 70 3d 3d 30 20 28 75 6e 6d 61  /* If p==0 (unma
30bb0 70 20 74 68 65 20 65 6e 74 69 72 65 20 66 69 6c  p the entire fil
30bc0 65 29 20 74 68 65 6e 20 74 68 65 72 65 20 6d 75  e) then there mu
30bd0 73 74 20 62 65 20 6e 6f 20 6f 75 74 73 74 61 6e  st be no outstan
30be0 64 69 6e 67 20 0a 20 20 2a 2a 20 78 46 65 74 63  ding .  ** xFetc
30bf0 68 20 72 65 66 65 72 65 6e 63 65 73 2e 20 4f 72  h references. Or
30c00 2c 20 69 66 20 70 21 3d 30 20 28 6d 65 61 6e 69  , if p!=0 (meani
30c10 6e 67 20 69 74 20 69 73 20 61 6e 20 78 46 65 74  ng it is an xFet
30c20 63 68 20 72 65 66 65 72 65 6e 63 65 29 2c 0a 20  ch reference),. 
30c30 20 2a 2a 20 74 68 65 6e 20 74 68 65 72 65 20 6d   ** then there m
30c40 75 73 74 20 62 65 20 61 74 20 6c 65 61 73 74 20  ust be at least 
30c50 6f 6e 65 20 6f 75 74 73 74 61 6e 64 69 6e 67 2e  one outstanding.
30c60 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 28    */.  assert( (
30c70 70 3d 3d 30 29 3d 3d 28 70 46 64 2d 3e 6e 46 65  p==0)==(pFd->nFe
30c80 74 63 68 4f 75 74 3d 3d 30 29 20 29 3b 0a 0a 20  tchOut==0) );.. 
30c90 20 2f 2a 20 49 66 20 70 21 3d 30 2c 20 69 74 20   /* If p!=0, it 
30ca0 6d 75 73 74 20 6d 61 74 63 68 20 74 68 65 20 69  must match the i
30cb0 4f 66 66 20 76 61 6c 75 65 2e 20 2a 2f 0a 20 20  Off value. */.  
30cc0 61 73 73 65 72 74 28 20 70 3d 3d 30 20 7c 7c 20  assert( p==0 || 
30cd0 70 3d 3d 26 28 28 75 38 20 2a 29 70 46 64 2d 3e  p==&((u8 *)pFd->
30ce0 70 4d 61 70 52 65 67 69 6f 6e 29 5b 69 4f 66 66  pMapRegion)[iOff
30cf0 5d 20 29 3b 0a 0a 20 20 69 66 28 20 70 20 29 7b  ] );..  if( p ){
30d00 0a 20 20 20 20 70 46 64 2d 3e 6e 46 65 74 63 68  .    pFd->nFetch
30d10 4f 75 74 2d 2d 3b 0a 20 20 7d 65 6c 73 65 7b 0a  Out--;.  }else{.
30d20 20 20 20 20 75 6e 69 78 55 6e 6d 61 70 66 69 6c      unixUnmapfil
30d30 65 28 70 46 64 29 3b 0a 20 20 7d 0a 0a 20 20 61  e(pFd);.  }..  a
30d40 73 73 65 72 74 28 20 70 46 64 2d 3e 6e 46 65 74  ssert( pFd->nFet
30d50 63 68 4f 75 74 3e 3d 30 20 29 3b 0a 23 65 6c 73  chOut>=0 );.#els
30d60 65 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  e.  UNUSED_PARAM
30d70 45 54 45 52 28 66 64 29 3b 0a 20 20 55 4e 55 53  ETER(fd);.  UNUS
30d80 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70 29 3b  ED_PARAMETER(p);
30d90 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
30da0 54 45 52 28 69 4f 66 66 29 3b 0a 23 65 6e 64 69  TER(iOff);.#endi
30db0 66 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  f.  return SQLIT
30dc0 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 48  E_OK;.}../*.** H
30dd0 65 72 65 20 65 6e 64 73 20 74 68 65 20 69 6d 70  ere ends the imp
30de0 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 61  lementation of a
30df0 6c 6c 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  ll sqlite3_file 
30e00 6d 65 74 68 6f 64 73 2e 0a 2a 2a 0a 2a 2a 2a 2a  methods..**.****
30e10 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
30e20 2a 2a 20 45 6e 64 20 73 71 6c 69 74 65 33 5f 66  ** End sqlite3_f
30e30 69 6c 65 20 4d 65 74 68 6f 64 73 20 2a 2a 2a 2a  ile Methods ****
30e40 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
30e50 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a  ***********.****
30e60 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
30e70 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
30e80 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
30e90 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
30ea0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 0a  **********/../*.
30eb0 2a 2a 20 54 68 69 73 20 64 69 76 69 73 69 6f 6e  ** This division
30ec0 20 63 6f 6e 74 61 69 6e 73 20 64 65 66 69 6e 69   contains defini
30ed0 74 69 6f 6e 73 20 6f 66 20 73 71 6c 69 74 65 33  tions of sqlite3
30ee0 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 6f 62 6a 65  _io_methods obje
30ef0 63 74 73 20 74 68 61 74 0a 2a 2a 20 69 6d 70 6c  cts that.** impl
30f00 65 6d 65 6e 74 20 76 61 72 69 6f 75 73 20 66 69  ement various fi
30f10 6c 65 20 6c 6f 63 6b 69 6e 67 20 73 74 72 61 74  le locking strat
30f20 65 67 69 65 73 2e 20 20 49 74 20 61 6c 73 6f 20  egies.  It also 
30f30 63 6f 6e 74 61 69 6e 73 20 64 65 66 69 6e 69 74  contains definit
30f40 69 6f 6e 73 0a 2a 2a 20 6f 66 20 22 66 69 6e 64  ions.** of "find
30f50 65 72 22 20 66 75 6e 63 74 69 6f 6e 73 2e 20 20  er" functions.  
30f60 41 20 66 69 6e 64 65 72 2d 66 75 6e 63 74 69 6f  A finder-functio
30f70 6e 20 69 73 20 75 73 65 64 20 74 6f 20 6c 6f 63  n is used to loc
30f80 61 74 65 20 74 68 65 20 61 70 70 72 6f 70 72 69  ate the appropri
30f90 61 74 65 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 69  ate.** sqlite3_i
30fa0 6f 5f 6d 65 74 68 6f 64 73 20 6f 62 6a 65 63 74  o_methods object
30fb0 20 66 6f 72 20 61 20 70 61 72 74 69 63 75 6c 61   for a particula
30fc0 72 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  r database file.
30fd0 20 20 54 68 65 20 70 41 70 70 44 61 74 61 0a 2a    The pAppData.*
30fe0 2a 20 66 69 65 6c 64 20 6f 66 20 74 68 65 20 73  * field of the s
30ff0 71 6c 69 74 65 33 5f 76 66 73 20 56 46 53 20 6f  qlite3_vfs VFS o
31000 62 6a 65 63 74 73 20 61 72 65 20 69 6e 69 74 69  bjects are initi
31010 61 6c 69 7a 65 64 20 74 6f 20 62 65 20 70 6f 69  alized to be poi
31020 6e 74 65 72 73 20 74 6f 0a 2a 2a 20 74 68 65 20  nters to.** the 
31030 63 6f 72 72 65 63 74 20 66 69 6e 64 65 72 2d 66  correct finder-f
31040 75 6e 63 74 69 6f 6e 20 66 6f 72 20 74 68 61 74  unction for that
31050 20 56 46 53 2e 0a 2a 2a 0a 2a 2a 20 4d 6f 73 74   VFS..**.** Most
31060 20 66 69 6e 64 65 72 20 66 75 6e 63 74 69 6f 6e   finder function
31070 73 20 72 65 74 75 72 6e 20 61 20 70 6f 69 6e 74  s return a point
31080 65 72 20 74 6f 20 61 20 66 69 78 65 64 20 73 71  er to a fixed sq
31090 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73  lite3_io_methods
310a0 0a 2a 2a 20 6f 62 6a 65 63 74 2e 20 20 54 68 65  .** object.  The
310b0 20 6f 6e 6c 79 20 69 6e 74 65 72 65 73 74 69 6e   only interestin
310c0 67 20 66 69 6e 64 65 72 2d 66 75 6e 63 74 69 6f  g finder-functio
310d0 6e 20 69 73 20 61 75 74 6f 6c 6f 63 6b 49 6f 46  n is autolockIoF
310e0 69 6e 64 65 72 2c 20 77 68 69 63 68 0a 2a 2a 20  inder, which.** 
310f0 6c 6f 6f 6b 73 20 61 74 20 74 68 65 20 66 69 6c  looks at the fil
31100 65 73 79 73 74 65 6d 20 74 79 70 65 20 61 6e 64  esystem type and
31110 20 74 72 69 65 73 20 74 6f 20 67 75 65 73 73 20   tries to guess 
31120 74 68 65 20 62 65 73 74 20 6c 6f 63 6b 69 6e 67  the best locking
31130 0a 2a 2a 20 73 74 72 61 74 65 67 79 20 66 72 6f  .** strategy fro
31140 6d 20 74 68 61 74 2e 0a 2a 2a 0a 2a 2a 20 46 6f  m that..**.** Fo
31150 72 20 66 69 6e 64 65 72 2d 66 75 6e 63 74 69 6f  r finder-functio
31160 6e 20 46 2c 20 74 77 6f 20 6f 62 6a 65 63 74 73  n F, two objects
31170 20 61 72 65 20 63 72 65 61 74 65 64 3a 0a 2a 2a   are created:.**
31180 0a 2a 2a 20 20 20 20 28 31 29 20 54 68 65 20 72  .**    (1) The r
31190 65 61 6c 20 66 69 6e 64 65 72 2d 66 75 6e 63 74  eal finder-funct
311a0 69 6f 6e 20 6e 61 6d 65 64 20 22 46 49 6d 70 74  ion named "FImpt
311b0 28 29 22 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 28 32  ()"..**.**    (2
311c0 29 20 41 20 63 6f 6e 73 74 61 6e 74 20 70 6f 69  ) A constant poi
311d0 6e 74 65 72 20 74 6f 20 74 68 69 73 20 66 75 6e  nter to this fun
311e0 63 74 69 6f 6e 20 6e 61 6d 65 64 20 6a 75 73 74  ction named just
311f0 20 22 46 22 2e 0a 2a 2a 0a 2a 2a 0a 2a 2a 20 41   "F"..**.**.** A
31200 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
31210 46 20 70 6f 69 6e 74 65 72 20 69 73 20 75 73 65  F pointer is use
31220 64 20 61 73 20 74 68 65 20 70 41 70 70 44 61 74  d as the pAppDat
31230 61 20 76 61 6c 75 65 20 66 6f 72 20 56 46 53 0a  a value for VFS.
31240 2a 2a 20 6f 62 6a 65 63 74 73 2e 20 20 57 65 20  ** objects.  We 
31250 68 61 76 65 20 74 6f 20 64 6f 20 74 68 69 73 20  have to do this 
31260 69 6e 73 74 65 61 64 20 6f 66 20 6c 65 74 74 69  instead of letti
31270 6e 67 20 70 41 70 70 44 61 74 61 20 70 6f 69 6e  ng pAppData poin
31280 74 0a 2a 2a 20 64 69 72 65 63 74 6c 79 20 61 74  t.** directly at
31290 20 74 68 65 20 66 69 6e 64 65 72 2d 66 75 6e 63   the finder-func
312a0 74 69 6f 6e 20 73 69 6e 63 65 20 43 39 30 20 72  tion since C90 r
312b0 75 6c 65 73 20 70 72 65 76 65 6e 74 20 61 20 76  ules prevent a v
312c0 6f 69 64 2a 0a 2a 2a 20 66 72 6f 6d 20 62 65 20  oid*.** from be 
312d0 63 61 73 74 20 69 6e 74 6f 20 61 20 66 75 6e 63  cast into a func
312e0 74 69 6f 6e 20 70 6f 69 6e 74 65 72 2e 0a 2a 2a  tion pointer..**
312f0 0a 2a 2a 0a 2a 2a 20 45 61 63 68 20 69 6e 73 74  .**.** Each inst
31300 61 6e 63 65 20 6f 66 20 74 68 69 73 20 6d 61 63  ance of this mac
31310 72 6f 20 67 65 6e 65 72 61 74 65 73 20 74 77 6f  ro generates two
31320 20 6f 62 6a 65 63 74 73 3a 0a 2a 2a 0a 2a 2a 20   objects:.**.** 
31330 20 20 2a 20 20 41 20 63 6f 6e 73 74 61 6e 74 20    *  A constant 
31340 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f  sqlite3_io_metho
31350 64 73 20 6f 62 6a 65 63 74 20 63 61 6c 6c 20 4d  ds object call M
31360 45 54 48 4f 44 20 74 68 61 74 20 68 61 73 20 6c  ETHOD that has l
31370 6f 63 6b 69 6e 67 0a 2a 2a 20 20 20 20 20 20 6d  ocking.**      m
31380 65 74 68 6f 64 73 20 43 4c 4f 53 45 2c 20 4c 4f  ethods CLOSE, LO
31390 43 4b 2c 20 55 4e 4c 4f 43 4b 2c 20 43 4b 52 45  CK, UNLOCK, CKRE
313a0 53 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a  SLOCK..**.**   *
313b0 20 20 41 6e 20 49 2f 4f 20 6d 65 74 68 6f 64 20    An I/O method 
313c0 66 69 6e 64 65 72 20 66 75 6e 63 74 69 6f 6e 20  finder function 
313d0 63 61 6c 6c 65 64 20 46 49 4e 44 45 52 20 74 68  called FINDER th
313e0 61 74 20 72 65 74 75 72 6e 73 20 61 20 70 6f 69  at returns a poi
313f0 6e 74 65 72 0a 2a 2a 20 20 20 20 20 20 74 6f 20  nter.**      to 
31400 74 68 65 20 4d 45 54 48 4f 44 20 6f 62 6a 65 63  the METHOD objec
31410 74 20 69 6e 20 74 68 65 20 70 72 65 76 69 6f 75  t in the previou
31420 73 20 62 75 6c 6c 65 74 2e 0a 2a 2f 0a 23 64 65  s bullet..*/.#de
31430 66 69 6e 65 20 49 4f 4d 45 54 48 4f 44 53 28 46  fine IOMETHODS(F
31440 49 4e 44 45 52 2c 4d 45 54 48 4f 44 2c 56 45 52  INDER,METHOD,VER
31450 53 49 4f 4e 2c 43 4c 4f 53 45 2c 4c 4f 43 4b 2c  SION,CLOSE,LOCK,
31460 55 4e 4c 4f 43 4b 2c 43 4b 4c 4f 43 4b 2c 53 48  UNLOCK,CKLOCK,SH
31470 4d 4d 41 50 29 20 20 20 20 20 5c 0a 73 74 61 74  MMAP)     \.stat
31480 69 63 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33  ic const sqlite3
31490 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 4d 45 54 48  _io_methods METH
314a0 4f 44 20 3d 20 7b 20 20 20 20 20 20 20 20 20 20  OD = {          
314b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
314c0 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 56 45           \.   VE
314d0 52 53 49 4f 4e 2c 20 20 20 20 20 20 20 20 20 20  RSION,          
314e0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 69 56 65            /* iVe
314f0 72 73 69 6f 6e 20 2a 2f 20 20 20 20 20 20 20 20  rsion */        
31500 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31510 20 20 20 20 20 20 20 20 5c 0a 20 20 20 43 4c 4f          \.   CLO
31520 53 45 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  SE,             
31530 20 20 20 20 20 20 20 20 20 2f 2a 20 78 43 6c 6f           /* xClo
31540 73 65 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20  se */           
31550 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31560 20 20 20 20 20 20 20 5c 0a 20 20 20 75 6e 69 78         \.   unix
31570 52 65 61 64 2c 20 20 20 20 20 20 20 20 20 20 20  Read,           
31580 20 20 20 20 20 20 20 20 2f 2a 20 78 52 65 61 64          /* xRead
31590 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20 20   */             
315a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
315b0 20 20 20 20 20 20 5c 0a 20 20 20 75 6e 69 78 57        \.   unixW
315c0 72 69 74 65 2c 20 20 20 20 20 20 20 20 20 20 20  rite,           
315d0 20 20 20 20 20 20 20 2f 2a 20 78 57 72 69 74 65         /* xWrite
315e0 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20 20   */             
315f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31600 20 20 20 20 20 5c 0a 20 20 20 75 6e 69 78 54 72       \.   unixTr
31610 75 6e 63 61 74 65 2c 20 20 20 20 20 20 20 20 20  uncate,         
31620 20 20 20 20 20 20 2f 2a 20 78 54 72 75 6e 63 61        /* xTrunca
31630 74 65 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20  te */           
31640 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31650 20 20 20 20 5c 0a 20 20 20 75 6e 69 78 53 79 6e      \.   unixSyn
31660 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c,              
31670 20 20 20 20 20 2f 2a 20 78 53 79 6e 63 20 2a 2f       /* xSync */
31680 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31690 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
316a0 20 20 20 5c 0a 20 20 20 75 6e 69 78 46 69 6c 65     \.   unixFile
316b0 53 69 7a 65 2c 20 20 20 20 20 20 20 20 20 20 20  Size,           
316c0 20 20 20 20 2f 2a 20 78 46 69 6c 65 53 69 7a 65      /* xFileSize
316d0 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20 20   */             
316e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
316f0 20 20 5c 0a 20 20 20 4c 4f 43 4b 2c 20 20 20 20    \.   LOCK,    
31700 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31710 20 20 20 2f 2a 20 78 4c 6f 63 6b 20 2a 2f 20 20     /* xLock */  
31720 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31730 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31740 20 5c 0a 20 20 20 55 4e 4c 4f 43 4b 2c 20 20 20   \.   UNLOCK,   
31750 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31760 20 20 2f 2a 20 78 55 6e 6c 6f 63 6b 20 2a 2f 20    /* xUnlock */ 
31770 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31780 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31790 5c 0a 20 20 20 43 4b 4c 4f 43 4b 2c 20 20 20 20  \.   CKLOCK,    
317a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
317b0 20 2f 2a 20 78 43 68 65 63 6b 52 65 73 65 72 76   /* xCheckReserv
317c0 65 64 4c 6f 63 6b 20 2a 2f 20 20 20 20 20 20 20  edLock */       
317d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c                 \
317e0 0a 20 20 20 75 6e 69 78 46 69 6c 65 43 6f 6e 74  .   unixFileCont
317f0 72 6f 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20  rol,            
31800 2f 2a 20 78 46 69 6c 65 43 6f 6e 74 72 6f 6c 20  /* xFileControl 
31810 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20 20 20  */              
31820 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a                \.
31830 20 20 20 75 6e 69 78 53 65 63 74 6f 72 53 69 7a     unixSectorSiz
31840 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  e,             /
31850 2a 20 78 53 65 63 74 6f 72 53 69 7a 65 20 2a 2f  * xSectorSize */
31860 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31870 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20               \. 
31880 20 20 75 6e 69 78 44 65 76 69 63 65 43 68 61 72    unixDeviceChar
31890 61 63 74 65 72 69 73 74 69 63 73 2c 20 20 2f 2a  acteristics,  /*
318a0 20 78 44 65 76 69 63 65 43 61 70 61 62 69 6c 69   xDeviceCapabili
318b0 74 69 65 73 20 2a 2f 20 20 20 20 20 20 20 20 20  ties */         
318c0 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20              \.  
318d0 20 53 48 4d 4d 41 50 2c 20 20 20 20 20 20 20 20   SHMMAP,        
318e0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
318f0 78 53 68 6d 4d 61 70 20 2a 2f 20 20 20 20 20 20  xShmMap */      
31900 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31910 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20             \.   
31920 75 6e 69 78 53 68 6d 4c 6f 63 6b 2c 20 20 20 20  unixShmLock,    
31930 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
31940 53 68 6d 4c 6f 63 6b 20 2a 2f 20 20 20 20 20 20  ShmLock */      
31950 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31960 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 75            \.   u
31970 6e 69 78 53 68 6d 42 61 72 72 69 65 72 2c 20 20  nixShmBarrier,  
31980 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53             /* xS
31990 68 6d 42 61 72 72 69 65 72 20 2a 2f 20 20 20 20  hmBarrier */    
319a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
319b0 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 75 6e           \.   un
319c0 69 78 53 68 6d 55 6e 6d 61 70 2c 20 20 20 20 20  ixShmUnmap,     
319d0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53 68            /* xSh
319e0 6d 55 6e 6d 61 70 20 2a 2f 20 20 20 20 20 20 20  mUnmap */       
319f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31a00 20 20 20 20 20 20 20 20 5c 0a 20 20 20 75 6e 69          \.   uni
31a10 78 46 65 74 63 68 2c 20 20 20 20 20 20 20 20 20  xFetch,         
31a20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 46 65 74           /* xFet
31a30 63 68 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20  ch */           
31a40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31a50 20 20 20 20 20 20 20 5c 0a 20 20 20 75 6e 69 78         \.   unix
31a60 55 6e 66 65 74 63 68 2c 20 20 20 20 20 20 20 20  Unfetch,        
31a70 20 20 20 20 20 20 20 20 2f 2a 20 78 55 6e 66 65          /* xUnfe
31a80 74 63 68 20 2a 2f 20 20 20 20 20 20 20 20 20 20  tch */          
31a90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31aa0 20 20 20 20 20 20 5c 0a 7d 3b 20 20 20 20 20 20        \.};      
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 20 20 20 20 20 20                  
31ad0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31ae0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31af0 20 20 20 20 20 5c 0a 73 74 61 74 69 63 20 63 6f       \.static co
31b00 6e 73 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d  nst sqlite3_io_m
31b10 65 74 68 6f 64 73 20 2a 46 49 4e 44 45 52 23 23  ethods *FINDER##
31b20 49 6d 70 6c 28 63 6f 6e 73 74 20 63 68 61 72 20  Impl(const char 
31b30 2a 7a 2c 20 75 6e 69 78 46 69 6c 65 20 2a 70 29  *z, unixFile *p)
31b40 7b 20 20 20 5c 0a 20 20 55 4e 55 53 45 44 5f 50  {   \.  UNUSED_P
31b50 41 52 41 4d 45 54 45 52 28 7a 29 3b 20 55 4e 55  ARAMETER(z); UNU
31b60 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70 29  SED_PARAMETER(p)
31b70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
31b80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31b90 20 20 20 5c 0a 20 20 72 65 74 75 72 6e 20 26 4d     \.  return &M
31ba0 45 54 48 4f 44 3b 20 20 20 20 20 20 20 20 20 20  ETHOD;          
31bb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31bc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31bd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31be0 20 20 5c 0a 7d 20 20 20 20 20 20 20 20 20 20 20    \.}           
31bf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31c00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31c10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31c20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31c30 20 5c 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20   \.static const 
31c40 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f  sqlite3_io_metho
31c50 64 73 20 2a 28 2a 63 6f 6e 73 74 20 46 49 4e 44  ds *(*const FIND
31c60 45 52 29 28 63 6f 6e 73 74 20 63 68 61 72 2a 2c  ER)(const char*,
31c70 75 6e 69 78 46 69 6c 65 20 2a 70 29 20 20 20 20  unixFile *p)    
31c80 5c 0a 20 20 20 20 3d 20 46 49 4e 44 45 52 23 23  \.    = FINDER##
31c90 49 6d 70 6c 3b 0a 0a 2f 2a 0a 2a 2a 20 48 65 72  Impl;../*.** Her
31ca0 65 20 61 72 65 20 61 6c 6c 20 6f 66 20 74 68 65  e are all of the
31cb0 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68   sqlite3_io_meth
31cc0 6f 64 73 20 6f 62 6a 65 63 74 73 20 66 6f 72 20  ods objects for 
31cd0 65 61 63 68 20 6f 66 20 74 68 65 0a 2a 2a 20 6c  each of the.** l
31ce0 6f 63 6b 69 6e 67 20 73 74 72 61 74 65 67 69 65  ocking strategie
31cf0 73 2e 20 20 46 75 6e 63 74 69 6f 6e 73 20 74 68  s.  Functions th
31d00 61 74 20 72 65 74 75 72 6e 20 70 6f 69 6e 74 65  at return pointe
31d10 72 73 20 74 6f 20 74 68 65 73 65 20 6d 65 74 68  rs to these meth
31d20 6f 64 73 0a 2a 2a 20 61 72 65 20 61 6c 73 6f 20  ods.** are also 
31d30 63 72 65 61 74 65 64 2e 0a 2a 2f 0a 49 4f 4d 45  created..*/.IOME
31d40 54 48 4f 44 53 28 0a 20 20 70 6f 73 69 78 49 6f  THODS(.  posixIo
31d50 46 69 6e 64 65 72 2c 20 20 20 20 20 20 20 20 20  Finder,         
31d60 20 20 20 2f 2a 20 46 69 6e 64 65 72 20 66 75 6e     /* Finder fun
31d70 63 74 69 6f 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20  ction name */.  
31d80 70 6f 73 69 78 49 6f 4d 65 74 68 6f 64 73 2c 20  posixIoMethods, 
31d90 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73 71 6c            /* sql
31da0 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20  ite3_io_methods 
31db0 6f 62 6a 65 63 74 20 6e 61 6d 65 20 2a 2f 0a 20  object name */. 
31dc0 20 33 2c 20 20 20 20 20 20 20 20 20 20 20 20 20   3,             
31dd0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73 68             /* sh
31de0 61 72 65 64 20 6d 65 6d 6f 72 79 20 61 6e 64 20  ared memory and 
31df0 6d 6d 61 70 20 61 72 65 20 65 6e 61 62 6c 65 64  mmap are enabled
31e00 20 2a 2f 0a 20 20 75 6e 69 78 43 6c 6f 73 65 2c   */.  unixClose,
31e10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31e20 2f 2a 20 78 43 6c 6f 73 65 20 6d 65 74 68 6f 64  /* xClose method
31e30 20 2a 2f 0a 20 20 75 6e 69 78 4c 6f 63 6b 2c 20   */.  unixLock, 
31e40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31e50 2f 2a 20 78 4c 6f 63 6b 20 6d 65 74 68 6f 64 20  /* xLock method 
31e60 2a 2f 0a 20 20 75 6e 69 78 55 6e 6c 6f 63 6b 2c  */.  unixUnlock,
31e70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
31e80 2a 20 78 55 6e 6c 6f 63 6b 20 6d 65 74 68 6f 64  * xUnlock method
31e90 20 2a 2f 0a 20 20 75 6e 69 78 43 68 65 63 6b 52   */.  unixCheckR
31ea0 65 73 65 72 76 65 64 4c 6f 63 6b 2c 20 20 20 20  eservedLock,    
31eb0 2f 2a 20 78 43 68 65 63 6b 52 65 73 65 72 76 65  /* xCheckReserve
31ec0 64 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a  dLock method */.
31ed0 20 20 75 6e 69 78 53 68 6d 4d 61 70 20 20 20 20    unixShmMap    
31ee0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
31ef0 53 68 6d 4d 61 70 20 6d 65 74 68 6f 64 20 2a 2f  ShmMap method */
31f00 0a 29 0a 49 4f 4d 45 54 48 4f 44 53 28 0a 20 20  .).IOMETHODS(.  
31f10 6e 6f 6c 6f 63 6b 49 6f 46 69 6e 64 65 72 2c 20  nolockIoFinder, 
31f20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6e            /* Fin
31f30 64 65 72 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d  der function nam
31f40 65 20 2a 2f 0a 20 20 6e 6f 6c 6f 63 6b 49 6f 4d  e */.  nolockIoM
31f50 65 74 68 6f 64 73 2c 20 20 20 20 20 20 20 20 20  ethods,         
31f60 20 2f 2a 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d   /* sqlite3_io_m
31f70 65 74 68 6f 64 73 20 6f 62 6a 65 63 74 20 6e 61  ethods object na
31f80 6d 65 20 2a 2f 0a 20 20 32 2c 20 20 20 20 20 20  me */.  2,      
31f90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31fa0 20 20 2f 2a 20 73 68 61 72 65 64 20 6d 65 6d 6f    /* shared memo
31fb0 72 79 20 69 73 20 65 6e 61 62 6c 65 64 20 2a 2f  ry is enabled */
31fc0 0a 20 20 6e 6f 6c 6f 63 6b 43 6c 6f 73 65 2c 20  .  nolockClose, 
31fd0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
31fe0 78 43 6c 6f 73 65 20 6d 65 74 68 6f 64 20 2a 2f  xClose method */
31ff0 0a 20 20 6e 6f 6c 6f 63 6b 4c 6f 63 6b 2c 20 20  .  nolockLock,  
32000 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
32010 78 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a  xLock method */.
32020 20 20 6e 6f 6c 6f 63 6b 55 6e 6c 6f 63 6b 2c 20    nolockUnlock, 
32030 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
32040 55 6e 6c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f  Unlock method */
32050 0a 20 20 6e 6f 6c 6f 63 6b 43 68 65 63 6b 52 65  .  nolockCheckRe
32060 73 65 72 76 65 64 4c 6f 63 6b 2c 20 20 2f 2a 20  servedLock,  /* 
32070 78 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f  xCheckReservedLo
32080 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 30  ck method */.  0
32090 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
320a0 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53 68 6d           /* xShm
320b0 4d 61 70 20 6d 65 74 68 6f 64 20 2a 2f 0a 29 0a  Map method */.).
320c0 49 4f 4d 45 54 48 4f 44 53 28 0a 20 20 64 6f 74  IOMETHODS(.  dot
320d0 6c 6f 63 6b 49 6f 46 69 6e 64 65 72 2c 20 20 20  lockIoFinder,   
320e0 20 20 20 20 20 20 20 2f 2a 20 46 69 6e 64 65 72         /* Finder
320f0 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 20 2a   function name *
32100 2f 0a 20 20 64 6f 74 6c 6f 63 6b 49 6f 4d 65 74  /.  dotlockIoMet
32110 68 6f 64 73 2c 20 20 20 20 20 20 20 20 20 2f 2a  hods,         /*
32120 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68   sqlite3_io_meth
32130 6f 64 73 20 6f 62 6a 65 63 74 20 6e 61 6d 65 20  ods object name 
32140 2a 2f 0a 20 20 31 2c 20 20 20 20 20 20 20 20 20  */.  1,         
32150 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
32160 2a 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20  * shared memory 
32170 69 73 20 64 69 73 61 62 6c 65 64 20 2a 2f 0a 20  is disabled */. 
32180 20 64 6f 74 6c 6f 63 6b 43 6c 6f 73 65 2c 20 20   dotlockClose,  
32190 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 43             /* xC
321a0 6c 6f 73 65 20 6d 65 74 68 6f 64 20 2a 2f 0a 20  lose method */. 
321b0 20 64 6f 74 6c 6f 63 6b 4c 6f 63 6b 2c 20 20 20   dotlockLock,   
321c0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 4c             /* xL
321d0 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20  ock method */.  
321e0 64 6f 74 6c 6f 63 6b 55 6e 6c 6f 63 6b 2c 20 20  dotlockUnlock,  
321f0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 55 6e            /* xUn
32200 6c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20  lock method */. 
32210 20 64 6f 74 6c 6f 63 6b 43 68 65 63 6b 52 65 73   dotlockCheckRes
32220 65 72 76 65 64 4c 6f 63 6b 2c 20 2f 2a 20 78 43  ervedLock, /* xC
32230 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b  heckReservedLock
32240 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 30 20 20   method */.  0  
32250 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32260 20 20 20 20 20 20 20 2f 2a 20 78 53 68 6d 4d 61         /* xShmMa
32270 70 20 6d 65 74 68 6f 64 20 2a 2f 0a 29 0a 0a 23  p method */.)..#
32280 69 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  if SQLITE_ENABLE
32290 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 49  _LOCKING_STYLE.I
322a0 4f 4d 45 54 48 4f 44 53 28 0a 20 20 66 6c 6f 63  OMETHODS(.  floc
322b0 6b 49 6f 46 69 6e 64 65 72 2c 20 20 20 20 20 20  kIoFinder,      
322c0 20 20 20 20 20 20 2f 2a 20 46 69 6e 64 65 72 20        /* Finder 
322d0 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 20 2a 2f  function name */
322e0 0a 20 20 66 6c 6f 63 6b 49 6f 4d 65 74 68 6f 64  .  flockIoMethod
322f0 73 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  s,           /* 
32300 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f  sqlite3_io_metho
32310 64 73 20 6f 62 6a 65 63 74 20 6e 61 6d 65 20 2a  ds object name *
32320 2f 0a 20 20 31 2c 20 20 20 20 20 20 20 20 20 20  /.  1,          
32330 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
32340 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 69   shared memory i
32350 73 20 64 69 73 61 62 6c 65 64 20 2a 2f 0a 20 20  s disabled */.  
32360 66 6c 6f 63 6b 43 6c 6f 73 65 2c 20 20 20 20 20  flockClose,     
32370 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 43 6c            /* xCl
32380 6f 73 65 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20  ose method */.  
32390 66 6c 6f 63 6b 4c 6f 63 6b 2c 20 20 20 20 20 20  flockLock,      
323a0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 4c 6f            /* xLo
323b0 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 66  ck method */.  f
323c0 6c 6f 63 6b 55 6e 6c 6f 63 6b 2c 20 20 20 20 20  lockUnlock,     
323d0 20 20 20 20 20 20 20 20 20 2f 2a 20 78 55 6e 6c           /* xUnl
323e0 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20  ock method */.  
323f0 66 6c 6f 63 6b 43 68 65 63 6b 52 65 73 65 72 76  flockCheckReserv
32400 65 64 4c 6f 63 6b 2c 20 20 20 2f 2a 20 78 43 68  edLock,   /* xCh
32410 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 20  eckReservedLock 
32420 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 30 20 20 20  method */.  0   
32430 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32440 20 20 20 20 20 20 2f 2a 20 78 53 68 6d 4d 61 70        /* xShmMap
32450 20 6d 65 74 68 6f 64 20 2a 2f 0a 29 0a 23 65 6e   method */.).#en
32460 64 69 66 0a 0a 23 69 66 20 4f 53 5f 56 58 57 4f  dif..#if OS_VXWO
32470 52 4b 53 0a 49 4f 4d 45 54 48 4f 44 53 28 0a 20  RKS.IOMETHODS(. 
32480 20 73 65 6d 49 6f 46 69 6e 64 65 72 2c 20 20 20   semIoFinder,   
32490 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69             /* Fi
324a0 6e 64 65 72 20 66 75 6e 63 74 69 6f 6e 20 6e 61  nder function na
324b0 6d 65 20 2a 2f 0a 20 20 73 65 6d 49 6f 4d 65 74  me */.  semIoMet
324c0 68 6f 64 73 2c 20 20 20 20 20 20 20 20 20 20 20  hods,           
324d0 20 20 2f 2a 20 73 71 6c 69 74 65 33 5f 69 6f 5f    /* sqlite3_io_
324e0 6d 65 74 68 6f 64 73 20 6f 62 6a 65 63 74 20 6e  methods object n
324f0 61 6d 65 20 2a 2f 0a 20 20 31 2c 20 20 20 20 20  ame */.  1,     
32500 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32510 20 20 20 2f 2a 20 73 68 61 72 65 64 20 6d 65 6d     /* shared mem
32520 6f 72 79 20 69 73 20 64 69 73 61 62 6c 65 64 20  ory is disabled 
32530 2a 2f 0a 20 20 73 65 6d 58 43 6c 6f 73 65 2c 20  */.  semXClose, 
32540 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
32550 2a 20 78 43 6c 6f 73 65 20 6d 65 74 68 6f 64 20  * xClose method 
32560 2a 2f 0a 20 20 73 65 6d 58 4c 6f 63 6b 2c 20 20  */.  semXLock,  
32570 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
32580 2a 20 78 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a  * xLock method *
32590 2f 0a 20 20 73 65 6d 58 55 6e 6c 6f 63 6b 2c 20  /.  semXUnlock, 
325a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
325b0 20 78 55 6e 6c 6f 63 6b 20 6d 65 74 68 6f 64 20   xUnlock method 
325c0 2a 2f 0a 20 20 73 65 6d 58 43 68 65 63 6b 52 65  */.  semXCheckRe
325d0 73 65 72 76 65 64 4c 6f 63 6b 2c 20 20 20 20 2f  servedLock,    /
325e0 2a 20 78 43 68 65 63 6b 52 65 73 65 72 76 65 64  * xCheckReserved
325f0 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20  Lock method */. 
32600 20 30 20 20 20 20 20 20 20 20 20 20 20 20 20 20   0              
32610 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53             /* xS
32620 68 6d 4d 61 70 20 6d 65 74 68 6f 64 20 2a 2f 0a  hmMap method */.
32630 29 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 64 65  ).#endif..#if de
32640 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29  fined(__APPLE__)
32650 20 26 26 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c   && SQLITE_ENABL
32660 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a  E_LOCKING_STYLE.
32670 49 4f 4d 45 54 48 4f 44 53 28 0a 20 20 61 66 70  IOMETHODS(.  afp
32680 49 6f 46 69 6e 64 65 72 2c 20 20 20 20 20 20 20  IoFinder,       
32690 20 20 20 20 20 20 20 2f 2a 20 46 69 6e 64 65 72         /* Finder
326a0 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 20 2a   function name *
326b0 2f 0a 20 20 61 66 70 49 6f 4d 65 74 68 6f 64 73  /.  afpIoMethods
326c0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ,             /*
326d0 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68   sqlite3_io_meth
326e0 6f 64 73 20 6f 62 6a 65 63 74 20 6e 61 6d 65 20  ods object name 
326f0 2a 2f 0a 20 20 31 2c 20 20 20 20 20 20 20 20 20  */.  1,         
32700 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
32710 2a 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20  * shared memory 
32720 69 73 20 64 69 73 61 62 6c 65 64 20 2a 2f 0a 20  is disabled */. 
32730 20 61 66 70 43 6c 6f 73 65 2c 20 20 20 20 20 20   afpClose,      
32740 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 43             /* xC
32750 6c 6f 73 65 20 6d 65 74 68 6f 64 20 2a 2f 0a 20  lose method */. 
32760 20 61 66 70 4c 6f 63 6b 2c 20 20 20 20 20 20 20   afpLock,       
32770 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 4c             /* xL
32780 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20  ock method */.  
32790 61 66 70 55 6e 6c 6f 63 6b 2c 20 20 20 20 20 20  afpUnlock,      
327a0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 55 6e            /* xUn
327b0 6c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20  lock method */. 
327c0 20 61 66 70 43 68 65 63 6b 52 65 73 65 72 76 65   afpCheckReserve
327d0 64 4c 6f 63 6b 2c 20 20 20 20 20 2f 2a 20 78 43  dLock,     /* xC
327e0 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b  heckReservedLock
327f0 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 30 20 20   method */.  0  
32800 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32810 20 20 20 20 20 20 20 2f 2a 20 78 53 68 6d 4d 61         /* xShmMa
32820 70 20 6d 65 74 68 6f 64 20 2a 2f 0a 29 0a 23 65  p method */.).#e
32830 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  ndif../*.** The 
32840 70 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 20 6d 65  proxy locking me
32850 74 68 6f 64 20 69 73 20 61 20 22 73 75 70 65 72  thod is a "super
32860 2d 6d 65 74 68 6f 64 22 20 69 6e 20 74 68 65 20  -method" in the 
32870 73 65 6e 73 65 20 74 68 61 74 20 69 74 0a 2a 2a  sense that it.**
32880 20 6f 70 65 6e 73 20 73 65 63 6f 6e 64 61 72 79   opens secondary
32890 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
328a0 73 20 66 6f 72 20 74 68 65 20 63 6f 6e 63 68 20  s for the conch 
328b0 61 6e 64 20 6c 6f 63 6b 20 66 69 6c 65 73 20 61  and lock files a
328c0 6e 64 0a 2a 2a 20 69 74 20 75 73 65 73 20 70 72  nd.** it uses pr
328d0 6f 78 79 2c 20 64 6f 74 2d 66 69 6c 65 2c 20 41  oxy, dot-file, A
328e0 46 50 2c 20 61 6e 64 20 66 6c 6f 63 6b 28 29 20  FP, and flock() 
328f0 6c 6f 63 6b 69 6e 67 20 6d 65 74 68 6f 64 73 20  locking methods 
32900 6f 6e 20 74 68 6f 73 65 0a 2a 2a 20 73 65 63 6f  on those.** seco
32910 6e 64 61 72 79 20 66 69 6c 65 73 2e 20 20 46 6f  ndary files.  Fo
32920 72 20 74 68 69 73 20 72 65 61 73 6f 6e 2c 20 74  r this reason, t
32930 68 65 20 64 69 76 69 73 69 6f 6e 20 74 68 61 74  he division that
32940 20 69 6d 70 6c 65 6d 65 6e 74 73 0a 2a 2a 20 70   implements.** p
32950 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 20 69 73 20  roxy locking is 
32960 6c 6f 63 61 74 65 64 20 6d 75 63 68 20 66 75 72  located much fur
32970 74 68 65 72 20 64 6f 77 6e 20 69 6e 20 74 68 65  ther down in the
32980 20 66 69 6c 65 2e 20 20 42 75 74 20 77 65 20 6e   file.  But we n
32990 65 65 64 0a 2a 2a 20 74 6f 20 67 6f 20 61 68 65  eed.** to go ahe
329a0 61 64 20 61 6e 64 20 64 65 66 69 6e 65 20 74 68  ad and define th
329b0 65 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74  e sqlite3_io_met
329c0 68 6f 64 73 20 61 6e 64 20 66 69 6e 64 65 72 20  hods and finder 
329d0 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 66 6f 72 20  function.** for 
329e0 70 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 20 68 65  proxy locking he
329f0 72 65 2e 20 20 53 6f 20 77 65 20 66 6f 72 77 61  re.  So we forwa
32a00 72 64 20 64 65 63 6c 61 72 65 20 74 68 65 20 49  rd declare the I
32a10 2f 4f 20 6d 65 74 68 6f 64 73 2e 0a 2a 2f 0a 23  /O methods..*/.#
32a20 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50  if defined(__APP
32a30 4c 45 5f 5f 29 20 26 26 20 53 51 4c 49 54 45 5f  LE__) && SQLITE_
32a40 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53  ENABLE_LOCKING_S
32a50 54 59 4c 45 0a 73 74 61 74 69 63 20 69 6e 74 20  TYLE.static int 
32a60 70 72 6f 78 79 43 6c 6f 73 65 28 73 71 6c 69 74  proxyClose(sqlit
32a70 65 33 5f 66 69 6c 65 2a 29 3b 0a 73 74 61 74 69  e3_file*);.stati
32a80 63 20 69 6e 74 20 70 72 6f 78 79 4c 6f 63 6b 28  c int proxyLock(
32a90 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 2c 20 69  sqlite3_file*, i
32aa0 6e 74 29 3b 0a 73 74 61 74 69 63 20 69 6e 74 20  nt);.static int 
32ab0 70 72 6f 78 79 55 6e 6c 6f 63 6b 28 73 71 6c 69  proxyUnlock(sqli
32ac0 74 65 33 5f 66 69 6c 65 2a 2c 20 69 6e 74 29 3b  te3_file*, int);
32ad0 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72 6f 78  .static int prox
32ae0 79 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f  yCheckReservedLo
32af0 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a  ck(sqlite3_file*
32b00 2c 20 69 6e 74 2a 29 3b 0a 49 4f 4d 45 54 48 4f  , int*);.IOMETHO
32b10 44 53 28 0a 20 20 70 72 6f 78 79 49 6f 46 69 6e  DS(.  proxyIoFin
32b20 64 65 72 2c 20 20 20 20 20 20 20 20 20 20 20 20  der,            
32b30 2f 2a 20 46 69 6e 64 65 72 20 66 75 6e 63 74 69  /* Finder functi
32b40 6f 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20 70 72 6f  on name */.  pro
32b50 78 79 49 6f 4d 65 74 68 6f 64 73 2c 20 20 20 20  xyIoMethods,    
32b60 20 20 20 20 20 20 20 2f 2a 20 73 71 6c 69 74 65         /* sqlite
32b70 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 6f 62 6a  3_io_methods obj
32b80 65 63 74 20 6e 61 6d 65 20 2a 2f 0a 20 20 32 2c  ect name */.  2,
32b90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32ba0 20 20 20 20 20 20 20 20 2f 2a 20 73 68 61 72 65          /* share
32bb0 64 20 6d 65 6d 6f 72 79 20 69 73 20 65 6e 61 62  d memory is enab
32bc0 6c 65 64 20 2a 2f 0a 20 20 70 72 6f 78 79 43 6c  led */.  proxyCl
32bd0 6f 73 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  ose,            
32be0 20 20 20 2f 2a 20 78 43 6c 6f 73 65 20 6d 65 74     /* xClose met
32bf0 68 6f 64 20 2a 2f 0a 20 20 70 72 6f 78 79 4c 6f  hod */.  proxyLo
32c00 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ck,             
32c10 20 20 20 2f 2a 20 78 4c 6f 63 6b 20 6d 65 74 68     /* xLock meth
32c20 6f 64 20 2a 2f 0a 20 20 70 72 6f 78 79 55 6e 6c  od */.  proxyUnl
32c30 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20  ock,            
32c40 20 20 2f 2a 20 78 55 6e 6c 6f 63 6b 20 6d 65 74    /* xUnlock met
32c50 68 6f 64 20 2a 2f 0a 20 20 70 72 6f 78 79 43 68  hod */.  proxyCh
32c60 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 2c  eckReservedLock,
32c70 20 20 20 2f 2a 20 78 43 68 65 63 6b 52 65 73 65     /* xCheckRese
32c80 72 76 65 64 4c 6f 63 6b 20 6d 65 74 68 6f 64 20  rvedLock method 
32c90 2a 2f 0a 20 20 30 20 20 20 20 20 20 20 20 20 20  */.  0          
32ca0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
32cb0 2a 20 78 53 68 6d 4d 61 70 20 6d 65 74 68 6f 64  * xShmMap method
32cc0 20 2a 2f 0a 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a   */.).#endif../*
32cd0 20 6e 66 73 20 6c 6f 63 6b 64 20 6f 6e 20 4f 53   nfs lockd on OS
32ce0 58 20 31 30 2e 33 2b 20 64 6f 65 73 6e 27 74 20  X 10.3+ doesn't 
32cf0 63 6c 65 61 72 20 77 72 69 74 65 20 6c 6f 63 6b  clear write lock
32d00 73 20 77 68 65 6e 20 61 20 72 65 61 64 20 6c 6f  s when a read lo
32d10 63 6b 20 69 73 20 73 65 74 20 2a 2f 0a 23 69 66  ck is set */.#if
32d20 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45   defined(__APPLE
32d30 5f 5f 29 20 26 26 20 53 51 4c 49 54 45 5f 45 4e  __) && SQLITE_EN
32d40 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59  ABLE_LOCKING_STY
32d50 4c 45 0a 49 4f 4d 45 54 48 4f 44 53 28 0a 20 20  LE.IOMETHODS(.  
32d60 6e 66 73 49 6f 46 69 6e 64 65 72 2c 20 20 20 20  nfsIoFinder,    
32d70 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69             /* Fi
32d80 6e 64 65 72 20 66 75 6e 63 74 69 6f 6e 20 6e 61  nder function na
32d90 6d 65 20 2a 2f 0a 20 20 6e 66 73 49 6f 4d 65 74  me */.  nfsIoMet
32da0 68 6f 64 73 2c 20 20 20 20 20 20 20 20 20 20 20  hods,           
32db0 20 20 20 2f 2a 20 73 71 6c 69 74 65 33 5f 69 6f     /* sqlite3_io
32dc0 5f 6d 65 74 68 6f 64 73 20 6f 62 6a 65 63 74 20  _methods object 
32dd0 6e 61 6d 65 20 2a 2f 0a 20 20 31 2c 20 20 20 20  name */.  1,    
32de0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32df0 20 20 20 20 20 2f 2a 20 73 68 61 72 65 64 20 6d       /* shared m
32e00 65 6d 6f 72 79 20 69 73 20 64 69 73 61 62 6c 65  emory is disable
32e10 64 20 2a 2f 0a 20 20 75 6e 69 78 43 6c 6f 73 65  d */.  unixClose
32e20 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
32e30 20 20 2f 2a 20 78 43 6c 6f 73 65 20 6d 65 74 68    /* xClose meth
32e40 6f 64 20 2a 2f 0a 20 20 75 6e 69 78 4c 6f 63 6b  od */.  unixLock
32e50 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
32e60 20 20 20 2f 2a 20 78 4c 6f 63 6b 20 6d 65 74 68     /* xLock meth
32e70 6f 64 20 2a 2f 0a 20 20 6e 66 73 55 6e 6c 6f 63  od */.  nfsUnloc
32e80 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  k,              
32e90 20 20 20 2f 2a 20 78 55 6e 6c 6f 63 6b 20 6d 65     /* xUnlock me
32ea0 74 68 6f 64 20 2a 2f 0a 20 20 75 6e 69 78 43 68  thod */.  unixCh
32eb0 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 2c  eckReservedLock,
32ec0 20 20 20 20 20 2f 2a 20 78 43 68 65 63 6b 52 65       /* xCheckRe
32ed0 73 65 72 76 65 64 4c 6f 63 6b 20 6d 65 74 68 6f  servedLock metho
32ee0 64 20 2a 2f 0a 20 20 30 20 20 20 20 20 20 20 20  d */.  0        
32ef0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32f00 20 20 2f 2a 20 78 53 68 6d 4d 61 70 20 6d 65 74    /* xShmMap met
32f10 68 6f 64 20 2a 2f 0a 29 0a 23 65 6e 64 69 66 0a  hod */.).#endif.
32f20 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 41  .#if defined(__A
32f30 50 50 4c 45 5f 5f 29 20 26 26 20 53 51 4c 49 54  PPLE__) && SQLIT
32f40 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47  E_ENABLE_LOCKING
32f50 5f 53 54 59 4c 45 0a 2f 2a 20 0a 2a 2a 20 54 68  _STYLE./* .** Th
32f60 69 73 20 22 66 69 6e 64 65 72 22 20 66 75 6e 63  is "finder" func
32f70 74 69 6f 6e 20 61 74 74 65 6d 70 74 73 20 74 6f  tion attempts to
32f80 20 64 65 74 65 72 6d 69 6e 65 20 74 68 65 20 62   determine the b
32f90 65 73 74 20 6c 6f 63 6b 69 6e 67 20 73 74 72 61  est locking stra
32fa0 74 65 67 79 20 0a 2a 2a 20 66 6f 72 20 74 68 65  tegy .** for the
32fb0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 22   database file "
32fc0 66 69 6c 65 50 61 74 68 22 2e 20 20 49 74 20 74  filePath".  It t
32fd0 68 65 6e 20 72 65 74 75 72 6e 73 20 74 68 65 20  hen returns the 
32fe0 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f  sqlite3_io_metho
32ff0 64 73 0a 2a 2a 20 6f 62 6a 65 63 74 20 74 68 61  ds.** object tha
33000 74 20 69 6d 70 6c 65 6d 65 6e 74 73 20 74 68 61  t implements tha
33010 74 20 73 74 72 61 74 65 67 79 2e 0a 2a 2a 0a 2a  t strategy..**.*
33020 2a 20 54 68 69 73 20 69 73 20 66 6f 72 20 4d 61  * This is for Ma
33030 63 4f 53 58 20 6f 6e 6c 79 2e 0a 2a 2f 0a 73 74  cOSX only..*/.st
33040 61 74 69 63 20 63 6f 6e 73 74 20 73 71 6c 69 74  atic const sqlit
33050 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 2a 61  e3_io_methods *a
33060 75 74 6f 6c 6f 63 6b 49 6f 46 69 6e 64 65 72 49  utolockIoFinderI
33070 6d 70 6c 28 0a 20 20 63 6f 6e 73 74 20 63 68 61  mpl(.  const cha
33080 72 20 2a 66 69 6c 65 50 61 74 68 2c 20 20 20 20  r *filePath,    
33090 2f 2a 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 64  /* name of the d
330a0 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a  atabase file */.
330b0 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 4e 65 77    unixFile *pNew
330c0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 6f 70             /* op
330d0 65 6e 20 66 69 6c 65 20 6f 62 6a 65 63 74 20 66  en file object f
330e0 6f 72 20 74 68 65 20 64 61 74 61 62 61 73 65 20  or the database 
330f0 66 69 6c 65 20 2a 2f 0a 29 7b 0a 20 20 73 74 61  file */.){.  sta
33100 74 69 63 20 63 6f 6e 73 74 20 73 74 72 75 63 74  tic const struct
33110 20 4d 61 70 70 69 6e 67 20 7b 0a 20 20 20 20 63   Mapping {.    c
33120 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65  onst char *zFile
33130 73 79 73 74 65 6d 3b 20 20 20 20 20 20 20 20 20  system;         
33140 20 20 20 20 20 2f 2a 20 46 69 6c 65 73 79 73 74       /* Filesyst
33150 65 6d 20 74 79 70 65 20 6e 61 6d 65 20 2a 2f 0a  em type name */.
33160 20 20 20 20 63 6f 6e 73 74 20 73 71 6c 69 74 65      const sqlite
33170 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 2a 70 4d  3_io_methods *pM
33180 65 74 68 6f 64 73 3b 20 20 20 2f 2a 20 41 70 70  ethods;   /* App
33190 72 6f 70 72 69 61 74 65 20 6c 6f 63 6b 69 6e 67  ropriate locking
331a0 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 7d 20 61   method */.  } a
331b0 4d 61 70 5b 5d 20 3d 20 7b 0a 20 20 20 20 7b 20  Map[] = {.    { 
331c0 22 68 66 73 22 2c 20 20 20 20 26 70 6f 73 69 78  "hfs",    &posix
331d0 49 6f 4d 65 74 68 6f 64 73 20 7d 2c 0a 20 20 20  IoMethods },.   
331e0 20 7b 20 22 75 66 73 22 2c 20 20 20 20 26 70 6f   { "ufs",    &po
331f0 73 69 78 49 6f 4d 65 74 68 6f 64 73 20 7d 2c 0a  sixIoMethods },.
33200 20 20 20 20 7b 20 22 61 66 70 66 73 22 2c 20 20      { "afpfs",  
33210 26 61 66 70 49 6f 4d 65 74 68 6f 64 73 20 7d 2c  &afpIoMethods },
33220 0a 20 20 20 20 7b 20 22 73 6d 62 66 73 22 2c 20  .    { "smbfs", 
33230 20 26 61 66 70 49 6f 4d 65 74 68 6f 64 73 20 7d   &afpIoMethods }
33240 2c 0a 20 20 20 20 7b 20 22 77 65 62 64 61 76 22  ,.    { "webdav"
33250 2c 20 26 6e 6f 6c 6f 63 6b 49 6f 4d 65 74 68 6f  , &nolockIoMetho
33260 64 73 20 7d 2c 0a 20 20 20 20 7b 20 30 2c 20 30  ds },.    { 0, 0
33270 20 7d 0a 20 20 7d 3b 0a 20 20 69 6e 74 20 69 3b   }.  };.  int i;
33280 0a 20 20 73 74 72 75 63 74 20 73 74 61 74 66 73  .  struct statfs
33290 20 66 73 49 6e 66 6f 3b 0a 20 20 73 74 72 75 63   fsInfo;.  struc
332a0 74 20 66 6c 6f 63 6b 20 6c 6f 63 6b 49 6e 66 6f  t flock lockInfo
332b0 3b 0a 0a 20 20 69 66 28 20 21 66 69 6c 65 50 61  ;..  if( !filePa
332c0 74 68 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20  th ){.    /* If 
332d0 66 69 6c 65 50 61 74 68 3d 3d 4e 55 4c 4c 20 74  filePath==NULL t
332e0 68 61 74 20 6d 65 61 6e 73 20 77 65 20 61 72 65  hat means we are
332f0 20 64 65 61 6c 69 6e 67 20 77 69 74 68 20 61 20   dealing with a 
33300 74 72 61 6e 73 69 65 6e 74 20 66 69 6c 65 0a 20  transient file. 
33310 20 20 20 2a 2a 20 74 68 61 74 20 64 6f 65 73 20     ** that does 
33320 6e 6f 74 20 6e 65 65 64 20 74 6f 20 62 65 20 6c  not need to be l
33330 6f 63 6b 65 64 2e 20 2a 2f 0a 20 20 20 20 72 65  ocked. */.    re
33340 74 75 72 6e 20 26 6e 6f 6c 6f 63 6b 49 6f 4d 65  turn &nolockIoMe
33350 74 68 6f 64 73 3b 0a 20 20 7d 0a 20 20 69 66 28  thods;.  }.  if(
33360 20 73 74 61 74 66 73 28 66 69 6c 65 50 61 74 68   statfs(filePath
33370 2c 20 26 66 73 49 6e 66 6f 29 20 21 3d 20 2d 31  , &fsInfo) != -1
33380 20 29 7b 0a 20 20 20 20 69 66 28 20 66 73 49 6e   ){.    if( fsIn
33390 66 6f 2e 66 5f 66 6c 61 67 73 20 26 20 4d 4e 54  fo.f_flags & MNT
333a0 5f 52 44 4f 4e 4c 59 20 29 7b 0a 20 20 20 20 20  _RDONLY ){.     
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 20 20 7d 0a  oMethods;.    }.
333d0 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 61 4d 61      for(i=0; aMa
333e0 70 5b 69 5d 2e 7a 46 69 6c 65 73 79 73 74 65 6d  p[i].zFilesystem
333f0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66  ; i++){.      if
33400 28 20 73 74 72 63 6d 70 28 66 73 49 6e 66 6f 2e  ( strcmp(fsInfo.
33410 66 5f 66 73 74 79 70 65 6e 61 6d 65 2c 20 61 4d  f_fstypename, aM
33420 61 70 5b 69 5d 2e 7a 46 69 6c 65 73 79 73 74 65  ap[i].zFilesyste
33430 6d 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  m)==0 ){.       
33440 20 72 65 74 75 72 6e 20 61 4d 61 70 5b 69 5d 2e   return aMap[i].
33450 70 4d 65 74 68 6f 64 73 3b 0a 20 20 20 20 20 20  pMethods;.      
33460 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  }.    }.  }..  /
33470 2a 20 44 65 66 61 75 6c 74 20 63 61 73 65 2e 20  * Default case. 
33480 48 61 6e 64 6c 65 73 2c 20 61 6d 6f 6e 67 73 74  Handles, amongst
33490 20 6f 74 68 65 72 73 2c 20 22 6e 66 73 22 2e 0a   others, "nfs"..
334a0 20 20 2a 2a 20 54 65 73 74 20 62 79 74 65 2d 72    ** Test byte-r
334b0 61 6e 67 65 20 6c 6f 63 6b 20 75 73 69 6e 67 20  ange lock using 
334c0 66 63 6e 74 6c 28 29 2e 20 49 66 20 74 68 65 20  fcntl(). If the 
334d0 63 61 6c 6c 20 73 75 63 63 65 65 64 73 2c 20 0a  call succeeds, .
334e0 20 20 2a 2a 20 61 73 73 75 6d 65 20 74 68 61 74    ** assume that
334f0 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d   the file-system
33500 20 73 75 70 70 6f 72 74 73 20 50 4f 53 49 58 20   supports POSIX 
33510 73 74 79 6c 65 20 6c 6f 63 6b 73 2e 20 0a 20 20  style locks. .  
33520 2a 2f 0a 20 20 6c 6f 63 6b 49 6e 66 6f 2e 6c 5f  */.  lockInfo.l_
33530 6c 65 6e 20 3d 20 31 3b 0a 20 20 6c 6f 63 6b 49  len = 1;.  lockI
33540 6e 66 6f 2e 6c 5f 73 74 61 72 74 20 3d 20 30 3b  nfo.l_start = 0;
33550 0a 20 20 6c 6f 63 6b 49 6e 66 6f 2e 6c 5f 77 68  .  lockInfo.l_wh
33560 65 6e 63 65 20 3d 20 53 45 45 4b 5f 53 45 54 3b  ence = SEEK_SET;
33570 0a 20 20 6c 6f 63 6b 49 6e 66 6f 2e 6c 5f 74 79  .  lockInfo.l_ty
33580 70 65 20 3d 20 46 5f 52 44 4c 43 4b 3b 0a 20 20  pe = F_RDLCK;.  
33590 69 66 28 20 6f 73 46 63 6e 74 6c 28 70 4e 65 77  if( osFcntl(pNew
335a0 2d 3e 68 2c 20 46 5f 47 45 54 4c 4b 2c 20 26 6c  ->h, F_GETLK, &l
335b0 6f 63 6b 49 6e 66 6f 29 21 3d 2d 31 20 29 20 7b  ockInfo)!=-1 ) {
335c0 0a 20 20 20 20 69 66 28 20 73 74 72 63 6d 70 28  .    if( strcmp(
335d0 66 73 49 6e 66 6f 2e 66 5f 66 73 74 79 70 65 6e  fsInfo.f_fstypen
335e0 61 6d 65 2c 20 22 6e 66 73 22 29 3d 3d 30 20 29  ame, "nfs")==0 )
335f0 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 26  {.      return &
33600 6e 66 73 49 6f 4d 65 74 68 6f 64 73 3b 0a 20 20  nfsIoMethods;.  
33610 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 20    } else {.     
33620 20 72 65 74 75 72 6e 20 26 70 6f 73 69 78 49 6f   return &posixIo
33630 4d 65 74 68 6f 64 73 3b 0a 20 20 20 20 7d 0a 20  Methods;.    }. 
33640 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 74 75   }else{.    retu
33650 72 6e 20 26 64 6f 74 6c 6f 63 6b 49 6f 4d 65 74  rn &dotlockIoMet
33660 68 6f 64 73 3b 0a 20 20 7d 0a 7d 0a 73 74 61 74  hods;.  }.}.stat
33670 69 63 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33  ic const sqlite3
33680 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 0a 20 20 2a  _io_methods .  *
33690 28 2a 63 6f 6e 73 74 20 61 75 74 6f 6c 6f 63 6b  (*const autolock
336a0 49 6f 46 69 6e 64 65 72 29 28 63 6f 6e 73 74 20  IoFinder)(const 
336b0 63 68 61 72 2a 2c 75 6e 69 78 46 69 6c 65 2a 29  char*,unixFile*)
336c0 20 3d 20 61 75 74 6f 6c 6f 63 6b 49 6f 46 69 6e   = autolockIoFin
336d0 64 65 72 49 6d 70 6c 3b 0a 0a 23 65 6e 64 69 66  derImpl;..#endif
336e0 20 2f 2a 20 64 65 66 69 6e 65 64 28 5f 5f 41 50   /* defined(__AP
336f0 50 4c 45 5f 5f 29 20 26 26 20 53 51 4c 49 54 45  PLE__) && SQLITE
33700 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f  _ENABLE_LOCKING_
33710 53 54 59 4c 45 20 2a 2f 0a 0a 23 69 66 20 4f 53  STYLE */..#if OS
33720 5f 56 58 57 4f 52 4b 53 0a 2f 2a 0a 2a 2a 20 54  _VXWORKS./*.** T
33730 68 69 73 20 22 66 69 6e 64 65 72 22 20 66 75 6e  his "finder" fun
33740 63 74 69 6f 6e 20 66 6f 72 20 56 78 57 6f 72 6b  ction for VxWork
33750 73 20 63 68 65 63 6b 73 20 74 6f 20 73 65 65 20  s checks to see 
33760 69 66 20 70 6f 73 69 78 20 61 64 76 69 73 6f 72  if posix advisor
33770 79 0a 2a 2a 20 6c 6f 63 6b 69 6e 67 20 77 6f 72  y.** locking wor
33780 6b 73 2e 20 20 49 66 20 69 74 20 64 6f 65 73 2c  ks.  If it does,
33790 20 74 68 65 6e 20 74 68 61 74 20 69 73 20 77 68   then that is wh
337a0 61 74 20 69 73 20 75 73 65 64 2e 20 20 49 66 20  at is used.  If 
337b0 69 74 20 64 6f 65 73 20 6e 6f 74 0a 2a 2a 20 77  it does not.** w
337c0 6f 72 6b 2c 20 74 68 65 6e 20 66 61 6c 6c 62 61  ork, then fallba
337d0 63 6b 20 74 6f 20 6e 61 6d 65 64 20 73 65 6d 61  ck to named sema
337e0 70 68 6f 72 65 20 6c 6f 63 6b 69 6e 67 2e 0a 2a  phore locking..*
337f0 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73  /.static const s
33800 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64  qlite3_io_method
33810 73 20 2a 76 78 77 6f 72 6b 73 49 6f 46 69 6e 64  s *vxworksIoFind
33820 65 72 49 6d 70 6c 28 0a 20 20 63 6f 6e 73 74 20  erImpl(.  const 
33830 63 68 61 72 20 2a 66 69 6c 65 50 61 74 68 2c 20  char *filePath, 
33840 20 20 20 2f 2a 20 6e 61 6d 65 20 6f 66 20 74 68     /* name of th
33850 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
33860 2a 2f 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70  */.  unixFile *p
33870 4e 65 77 20 20 20 20 20 20 20 20 20 20 20 2f 2a  New           /*
33880 20 74 68 65 20 6f 70 65 6e 20 66 69 6c 65 20 6f   the open file o
33890 62 6a 65 63 74 20 2a 2f 0a 29 7b 0a 20 20 73 74  bject */.){.  st
338a0 72 75 63 74 20 66 6c 6f 63 6b 20 6c 6f 63 6b 49  ruct flock lockI
338b0 6e 66 6f 3b 0a 0a 20 20 69 66 28 20 21 66 69 6c  nfo;..  if( !fil
338c0 65 50 61 74 68 20 29 7b 0a 20 20 20 20 2f 2a 20  ePath ){.    /* 
338d0 49 66 20 66 69 6c 65 50 61 74 68 3d 3d 4e 55 4c  If filePath==NUL
338e0 4c 20 74 68 61 74 20 6d 65 61 6e 73 20 77 65 20  L that means we 
338f0 61 72 65 20 64 65 61 6c 69 6e 67 20 77 69 74 68  are dealing with
33900 20 61 20 74 72 61 6e 73 69 65 6e 74 20 66 69 6c   a transient fil
33910 65 0a 20 20 20 20 2a 2a 20 74 68 61 74 20 64 6f  e.    ** that do
33920 65 73 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20 62  es not need to b
33930 65 20 6c 6f 63 6b 65 64 2e 20 2a 2f 0a 20 20 20  e locked. */.   
33940 20 72 65 74 75 72 6e 20 26 6e 6f 6c 6f 63 6b 49   return &nolockI
33950 6f 4d 65 74 68 6f 64 73 3b 0a 20 20 7d 0a 0a 20  oMethods;.  }.. 
33960 20 2f 2a 20 54 65 73 74 20 69 66 20 66 63 6e 74   /* Test if fcnt
33970 6c 28 29 20 69 73 20 73 75 70 70 6f 72 74 65 64  l() is supported
33980 20 61 6e 64 20 75 73 65 20 50 4f 53 49 58 20 73   and use POSIX s
33990 74 79 6c 65 20 6c 6f 63 6b 73 2e 0a 20 20 2a 2a  tyle locks..  **
339a0 20 4f 74 68 65 72 77 69 73 65 20 66 61 6c 6c 20   Otherwise fall 
339b0 62 61 63 6b 20 74 6f 20 74 68 65 20 6e 61 6d 65  back to the name
339c0 64 20 73 65 6d 61 70 68 6f 72 65 20 6d 65 74 68  d semaphore meth
339d0 6f 64 2e 0a 20 20 2a 2f 0a 20 20 6c 6f 63 6b 49  od..  */.  lockI
339e0 6e 66 6f 2e 6c 5f 6c 65 6e 20 3d 20 31 3b 0a 20  nfo.l_len = 1;. 
339f0 20 6c 6f 63 6b 49 6e 66 6f 2e 6c 5f 73 74 61 72   lockInfo.l_star
33a00 74 20 3d 20 30 3b 0a 20 20 6c 6f 63 6b 49 6e 66  t = 0;.  lockInf
33a10 6f 2e 6c 5f 77 68 65 6e 63 65 20 3d 20 53 45 45  o.l_whence = SEE
33a20 4b 5f 53 45 54 3b 0a 20 20 6c 6f 63 6b 49 6e 66  K_SET;.  lockInf
33a30 6f 2e 6c 5f 74 79 70 65 20 3d 20 46 5f 52 44 4c  o.l_type = F_RDL
33a40 43 4b 3b 0a 20 20 69 66 28 20 6f 73 46 63 6e 74  CK;.  if( osFcnt
33a50 6c 28 70 4e 65 77 2d 3e 68 2c 20 46 5f 47 45 54  l(pNew->h, F_GET
33a60 4c 4b 2c 20 26 6c 6f 63 6b 49 6e 66 6f 29 21 3d  LK, &lockInfo)!=
33a70 2d 31 20 29 20 7b 0a 20 20 20 20 72 65 74 75 72  -1 ) {.    retur
33a80 6e 20 26 70 6f 73 69 78 49 6f 4d 65 74 68 6f 64  n &posixIoMethod
33a90 73 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  s;.  }else{.    
33aa0 72 65 74 75 72 6e 20 26 73 65 6d 49 6f 4d 65 74  return &semIoMet
33ab0 68 6f 64 73 3b 0a 20 20 7d 0a 7d 0a 73 74 61 74  hods;.  }.}.stat
33ac0 69 63 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33  ic const sqlite3
33ad0 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 0a 20 20 2a  _io_methods .  *
33ae0 28 2a 63 6f 6e 73 74 20 76 78 77 6f 72 6b 73 49  (*const vxworksI
33af0 6f 46 69 6e 64 65 72 29 28 63 6f 6e 73 74 20 63  oFinder)(const c
33b00 68 61 72 2a 2c 75 6e 69 78 46 69 6c 65 2a 29 20  har*,unixFile*) 
33b10 3d 20 76 78 77 6f 72 6b 73 49 6f 46 69 6e 64 65  = vxworksIoFinde
33b20 72 49 6d 70 6c 3b 0a 0a 23 65 6e 64 69 66 20 2f  rImpl;..#endif /
33b30 2a 20 4f 53 5f 56 58 57 4f 52 4b 53 20 2a 2f 0a  * OS_VXWORKS */.
33b40 0a 2f 2a 0a 2a 2a 20 41 6e 20 61 62 73 74 72 61  ./*.** An abstra
33b50 63 74 20 74 79 70 65 20 66 6f 72 20 61 20 70 6f  ct type for a po
33b60 69 6e 74 65 72 20 74 6f 20 61 6e 20 49 4f 20 6d  inter to an IO m
33b70 65 74 68 6f 64 20 66 69 6e 64 65 72 20 66 75 6e  ethod finder fun
33b80 63 74 69 6f 6e 3a 0a 2a 2f 0a 74 79 70 65 64 65  ction:.*/.typede
33b90 66 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f  f const sqlite3_
33ba0 69 6f 5f 6d 65 74 68 6f 64 73 20 2a 28 2a 66 69  io_methods *(*fi
33bb0 6e 64 65 72 5f 74 79 70 65 29 28 63 6f 6e 73 74  nder_type)(const
33bc0 20 63 68 61 72 2a 2c 75 6e 69 78 46 69 6c 65 2a   char*,unixFile*
33bd0 29 3b 0a 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  );.../**********
33be0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
33bf0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
33c00 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
33c10 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
33c20 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  **.*************
33c30 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20  *************** 
33c40 73 71 6c 69 74 65 33 5f 76 66 73 20 6d 65 74 68  sqlite3_vfs meth
33c50 6f 64 73 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ods ************
33c60 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
33c70 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 64 69 76 69  .**.** This divi
33c80 73 69 6f 6e 20 63 6f 6e 74 61 69 6e 73 20 74 68  sion contains th
33c90 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  e implementation
33ca0 20 6f 66 20 6d 65 74 68 6f 64 73 20 6f 6e 20 74   of methods on t
33cb0 68 65 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 76 66  he.** sqlite3_vf
33cc0 73 20 6f 62 6a 65 63 74 2e 0a 2a 2f 0a 0a 2f 2a  s object..*/../*
33cd0 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74  .** Initialize t
33ce0 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74  he contents of t
33cf0 68 65 20 75 6e 69 78 46 69 6c 65 20 73 74 72 75  he unixFile stru
33d00 63 74 75 72 65 20 70 6f 69 6e 74 65 64 20 74 6f  cture pointed to
33d10 20 62 79 20 70 49 64 2e 0a 2a 2f 0a 73 74 61 74   by pId..*/.stat
33d20 69 63 20 69 6e 74 20 66 69 6c 6c 49 6e 55 6e 69  ic int fillInUni
33d30 78 46 69 6c 65 28 0a 20 20 73 71 6c 69 74 65 33  xFile(.  sqlite3
33d40 5f 76 66 73 20 2a 70 56 66 73 2c 20 20 20 20 20  _vfs *pVfs,     
33d50 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 76   /* Pointer to v
33d60 66 73 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 69  fs object */.  i
33d70 6e 74 20 68 2c 20 20 20 20 20 20 20 20 20 20 20  nt h,           
33d80 20 20 20 20 20 20 20 2f 2a 20 4f 70 65 6e 20 66         /* Open f
33d90 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 6f  ile descriptor o
33da0 66 20 66 69 6c 65 20 62 65 69 6e 67 20 6f 70 65  f file being ope
33db0 6e 65 64 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ned */.  sqlite3
33dc0 5f 66 69 6c 65 20 2a 70 49 64 2c 20 20 20 20 20  _file *pId,     
33dd0 20 2f 2a 20 57 72 69 74 65 20 74 6f 20 74 68 65   /* Write to the
33de0 20 75 6e 69 78 46 69 6c 65 20 73 74 72 75 63 74   unixFile struct
33df0 75 72 65 20 68 65 72 65 20 2a 2f 0a 20 20 63 6f  ure here */.  co
33e00 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e  nst char *zFilen
33e10 61 6d 65 2c 20 20 2f 2a 20 4e 61 6d 65 20 6f 66  ame,  /* Name of
33e20 20 74 68 65 20 66 69 6c 65 20 62 65 69 6e 67 20   the file being 
33e30 6f 70 65 6e 65 64 20 2a 2f 0a 20 20 69 6e 74 20  opened */.  int 
33e40 63 74 72 6c 46 6c 61 67 73 20 20 20 20 20 20 20  ctrlFlags       
33e50 20 20 20 20 2f 2a 20 5a 65 72 6f 20 6f 72 20 6d      /* Zero or m
33e60 6f 72 65 20 55 4e 49 58 46 49 4c 45 5f 2a 20 76  ore UNIXFILE_* v
33e70 61 6c 75 65 73 20 2a 2f 0a 29 7b 0a 20 20 63 6f  alues */.){.  co
33e80 6e 73 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d  nst sqlite3_io_m
33e90 65 74 68 6f 64 73 20 2a 70 4c 6f 63 6b 69 6e 67  ethods *pLocking
33ea0 53 74 79 6c 65 3b 0a 20 20 75 6e 69 78 46 69 6c  Style;.  unixFil
33eb0 65 20 2a 70 4e 65 77 20 3d 20 28 75 6e 69 78 46  e *pNew = (unixF
33ec0 69 6c 65 20 2a 29 70 49 64 3b 0a 20 20 69 6e 74  ile *)pId;.  int
33ed0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
33ee0 0a 0a 20 20 61 73 73 65 72 74 28 20 70 4e 65 77  ..  assert( pNew
33ef0 2d 3e 70 49 6e 6f 64 65 3d 3d 4e 55 4c 4c 20 29  ->pInode==NULL )
33f00 3b 0a 0a 20 20 2f 2a 20 55 73 75 61 6c 6c 79 20  ;..  /* Usually 
33f10 74 68 65 20 70 61 74 68 20 7a 46 69 6c 65 6e 61  the path zFilena
33f20 6d 65 20 73 68 6f 75 6c 64 20 6e 6f 74 20 62 65  me should not be
33f30 20 61 20 72 65 6c 61 74 69 76 65 20 70 61 74 68   a relative path
33f40 6e 61 6d 65 2e 20 54 68 65 0a 20 20 2a 2a 20 65  name. The.  ** e
33f50 78 63 65 70 74 69 6f 6e 20 69 73 20 77 68 65 6e  xception is when
33f60 20 6f 70 65 6e 69 6e 67 20 74 68 65 20 70 72 6f   opening the pro
33f70 78 79 20 22 63 6f 6e 63 68 22 20 66 69 6c 65 20  xy "conch" file 
33f80 69 6e 20 62 75 69 6c 64 73 20 74 68 61 74 0a 20  in builds that. 
33f90 20 2a 2a 20 69 6e 63 6c 75 64 65 20 74 68 65 20   ** include the 
33fa0 73 70 65 63 69 61 6c 20 41 70 70 6c 65 20 6c 6f  special Apple lo
33fb0 63 6b 69 6e 67 20 73 74 79 6c 65 73 2e 0a 20 20  cking styles..  
33fc0 2a 2f 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f  */.#if defined(_
33fd0 5f 41 50 50 4c 45 5f 5f 29 20 26 26 20 53 51 4c  _APPLE__) && SQL
33fe0 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49  ITE_ENABLE_LOCKI
33ff0 4e 47 5f 53 54 59 4c 45 0a 20 20 61 73 73 65 72  NG_STYLE.  asser
34000 74 28 20 7a 46 69 6c 65 6e 61 6d 65 3d 3d 30 20  t( zFilename==0 
34010 7c 7c 20 7a 46 69 6c 65 6e 61 6d 65 5b 30 5d 3d  || zFilename[0]=
34020 3d 27 2f 27 20 0a 20 20 20 20 7c 7c 20 70 56 66  ='/' .    || pVf
34030 73 2d 3e 70 41 70 70 44 61 74 61 3d 3d 28 76 6f  s->pAppData==(vo
34040 69 64 2a 29 26 61 75 74 6f 6c 6f 63 6b 49 6f 46  id*)&autolockIoF
34050 69 6e 64 65 72 20 29 3b 0a 23 65 6c 73 65 0a 20  inder );.#else. 
34060 20 61 73 73 65 72 74 28 20 7a 46 69 6c 65 6e 61   assert( zFilena
34070 6d 65 3d 3d 30 20 7c 7c 20 7a 46 69 6c 65 6e 61  me==0 || zFilena
34080 6d 65 5b 30 5d 3d 3d 27 2f 27 20 29 3b 0a 23 65  me[0]=='/' );.#e
34090 6e 64 69 66 0a 0a 20 20 2f 2a 20 4e 6f 20 6c 6f  ndif..  /* No lo
340a0 63 6b 69 6e 67 20 6f 63 63 75 72 73 20 69 6e 20  cking occurs in 
340b0 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 73 20  temporary files 
340c0 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 7a 46 69  */.  assert( zFi
340d0 6c 65 6e 61 6d 65 21 3d 30 20 7c 7c 20 28 63 74  lename!=0 || (ct
340e0 72 6c 46 6c 61 67 73 20 26 20 55 4e 49 58 46 49  rlFlags & UNIXFI
340f0 4c 45 5f 4e 4f 4c 4f 43 4b 29 21 3d 30 20 29 3b  LE_NOLOCK)!=0 );
34100 0a 0a 20 20 4f 53 54 52 41 43 45 28 28 22 4f 50  ..  OSTRACE(("OP
34110 45 4e 20 20 20 20 25 2d 33 64 20 25 73 5c 6e 22  EN    %-3d %s\n"
34120 2c 20 68 2c 20 7a 46 69 6c 65 6e 61 6d 65 29 29  , h, zFilename))
34130 3b 0a 20 20 70 4e 65 77 2d 3e 68 20 3d 20 68 3b  ;.  pNew->h = h;
34140 0a 20 20 70 4e 65 77 2d 3e 70 56 66 73 20 3d 20  .  pNew->pVfs = 
34150 70 56 66 73 3b 0a 20 20 70 4e 65 77 2d 3e 7a 50  pVfs;.  pNew->zP
34160 61 74 68 20 3d 20 7a 46 69 6c 65 6e 61 6d 65 3b  ath = zFilename;
34170 0a 20 20 70 4e 65 77 2d 3e 63 74 72 6c 46 6c 61  .  pNew->ctrlFla
34180 67 73 20 3d 20 28 75 38 29 63 74 72 6c 46 6c 61  gs = (u8)ctrlFla
34190 67 73 3b 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d  gs;.#if SQLITE_M
341a0 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 20  AX_MMAP_SIZE>0. 
341b0 20 70 4e 65 77 2d 3e 6d 6d 61 70 53 69 7a 65 4d   pNew->mmapSizeM
341c0 61 78 20 3d 20 73 71 6c 69 74 65 33 47 6c 6f 62  ax = sqlite3Glob
341d0 61 6c 43 6f 6e 66 69 67 2e 73 7a 4d 6d 61 70 3b  alConfig.szMmap;
341e0 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20 73 71  .#endif.  if( sq
341f0 6c 69 74 65 33 5f 75 72 69 5f 62 6f 6f 6c 65 61  lite3_uri_boolea
34200 6e 28 28 28 63 74 72 6c 46 6c 61 67 73 20 26 20  n(((ctrlFlags & 
34210 55 4e 49 58 46 49 4c 45 5f 55 52 49 29 20 3f 20  UNIXFILE_URI) ? 
34220 7a 46 69 6c 65 6e 61 6d 65 20 3a 20 30 29 2c 0a  zFilename : 0),.
34230 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34240 20 20 20 20 20 20 20 20 20 20 20 22 70 73 6f 77             "psow
34250 22 2c 20 53 51 4c 49 54 45 5f 50 4f 57 45 52 53  ", SQLITE_POWERS
34260 41 46 45 5f 4f 56 45 52 57 52 49 54 45 29 20 29  AFE_OVERWRITE) )
34270 7b 0a 20 20 20 20 70 4e 65 77 2d 3e 63 74 72 6c  {.    pNew->ctrl
34280 46 6c 61 67 73 20 7c 3d 20 55 4e 49 58 46 49 4c  Flags |= UNIXFIL
34290 45 5f 50 53 4f 57 3b 0a 20 20 7d 0a 20 20 69 66  E_PSOW;.  }.  if
342a0 28 20 73 74 72 63 6d 70 28 70 56 66 73 2d 3e 7a  ( strcmp(pVfs->z
342b0 4e 61 6d 65 2c 22 75 6e 69 78 2d 65 78 63 6c 22  Name,"unix-excl"
342c0 29 3d 3d 30 20 29 7b 0a 20 20 20 20 70 4e 65 77  )==0 ){.    pNew
342d0 2d 3e 63 74 72 6c 46 6c 61 67 73 20 7c 3d 20 55  ->ctrlFlags |= U
342e0 4e 49 58 46 49 4c 45 5f 45 58 43 4c 3b 0a 20 20  NIXFILE_EXCL;.  
342f0 7d 0a 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b  }..#if OS_VXWORK
34300 53 0a 20 20 70 4e 65 77 2d 3e 70 49 64 20 3d 20  S.  pNew->pId = 
34310 76 78 77 6f 72 6b 73 46 69 6e 64 46 69 6c 65 49  vxworksFindFileI
34320 64 28 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20  d(zFilename);.  
34330 69 66 28 20 70 4e 65 77 2d 3e 70 49 64 3d 3d 30  if( pNew->pId==0
34340 20 29 7b 0a 20 20 20 20 63 74 72 6c 46 6c 61 67   ){.    ctrlFlag
34350 73 20 7c 3d 20 55 4e 49 58 46 49 4c 45 5f 4e 4f  s |= UNIXFILE_NO
34360 4c 4f 43 4b 3b 0a 20 20 20 20 72 63 20 3d 20 53  LOCK;.    rc = S
34370 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54  QLITE_NOMEM_BKPT
34380 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20  ;.  }.#endif..  
34390 69 66 28 20 63 74 72 6c 46 6c 61 67 73 20 26 20  if( ctrlFlags & 
343a0 55 4e 49 58 46 49 4c 45 5f 4e 4f 4c 4f 43 4b 20  UNIXFILE_NOLOCK 
343b0 29 7b 0a 20 20 20 20 70 4c 6f 63 6b 69 6e 67 53  ){.    pLockingS
343c0 74 79 6c 65 20 3d 20 26 6e 6f 6c 6f 63 6b 49 6f  tyle = &nolockIo
343d0 4d 65 74 68 6f 64 73 3b 0a 20 20 7d 65 6c 73 65  Methods;.  }else
343e0 7b 0a 20 20 20 20 70 4c 6f 63 6b 69 6e 67 53 74  {.    pLockingSt
343f0 79 6c 65 20 3d 20 28 2a 2a 28 66 69 6e 64 65 72  yle = (**(finder
34400 5f 74 79 70 65 2a 29 70 56 66 73 2d 3e 70 41 70  _type*)pVfs->pAp
34410 70 44 61 74 61 29 28 7a 46 69 6c 65 6e 61 6d 65  pData)(zFilename
34420 2c 20 70 4e 65 77 29 3b 0a 23 69 66 20 53 51 4c  , pNew);.#if SQL
34430 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49  ITE_ENABLE_LOCKI
34440 4e 47 5f 53 54 59 4c 45 0a 20 20 20 20 2f 2a 20  NG_STYLE.    /* 
34450 43 61 63 68 65 20 7a 46 69 6c 65 6e 61 6d 65 20  Cache zFilename 
34460 69 6e 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 63  in the locking c
34470 6f 6e 74 65 78 74 20 28 41 46 50 20 61 6e 64 20  ontext (AFP and 
34480 64 6f 74 6c 6f 63 6b 20 6f 76 65 72 72 69 64 65  dotlock override
34490 29 20 66 6f 72 0a 20 20 20 20 2a 2a 20 70 72 6f  ) for.    ** pro
344a0 78 79 4c 6f 63 6b 20 61 63 74 69 76 61 74 69 6f  xyLock activatio
344b0 6e 20 69 73 20 70 6f 73 73 69 62 6c 65 20 28 72  n is possible (r
344c0 65 6d 6f 74 65 20 70 72 6f 78 79 20 69 73 20 62  emote proxy is b
344d0 61 73 65 64 20 6f 6e 20 64 62 20 6e 61 6d 65 29  ased on db name)
344e0 0a 20 20 20 20 2a 2a 20 7a 46 69 6c 65 6e 61 6d  .    ** zFilenam
344f0 65 20 72 65 6d 61 69 6e 73 20 76 61 6c 69 64 20  e remains valid 
34500 75 6e 74 69 6c 20 66 69 6c 65 20 69 73 20 63 6c  until file is cl
34510 6f 73 65 64 2c 20 74 6f 20 73 75 70 70 6f 72 74  osed, to support
34520 20 2a 2f 0a 20 20 20 20 70 4e 65 77 2d 3e 6c 6f   */.    pNew->lo
34530 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 3d 20 28  ckingContext = (
34540 76 6f 69 64 2a 29 7a 46 69 6c 65 6e 61 6d 65 3b  void*)zFilename;
34550 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 0a 20 20 69  .#endif.  }..  i
34560 66 28 20 70 4c 6f 63 6b 69 6e 67 53 74 79 6c 65  f( pLockingStyle
34570 20 3d 3d 20 26 70 6f 73 69 78 49 6f 4d 65 74 68   == &posixIoMeth
34580 6f 64 73 0a 23 69 66 20 64 65 66 69 6e 65 64 28  ods.#if defined(
34590 5f 5f 41 50 50 4c 45 5f 5f 29 20 26 26 20 53 51  __APPLE__) && SQ
345a0 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b  LITE_ENABLE_LOCK
345b0 49 4e 47 5f 53 54 59 4c 45 0a 20 20 20 20 7c 7c  ING_STYLE.    ||
345c0 20 70 4c 6f 63 6b 69 6e 67 53 74 79 6c 65 20 3d   pLockingStyle =
345d0 3d 20 26 6e 66 73 49 6f 4d 65 74 68 6f 64 73 0a  = &nfsIoMethods.
345e0 23 65 6e 64 69 66 0a 20 20 20 20 20 2f 2a 20 73  #endif.     /* s
345f0 75 70 70 6f 72 74 20 57 41 4c 20 6d 6f 64 65 20  upport WAL mode 
34600 6f 6e 20 72 65 61 64 20 6f 6e 6c 79 20 6d 6f 75  on read only mou
34610 6e 74 65 64 20 66 69 6c 65 73 79 73 74 65 6d 20  nted filesystem 
34620 2a 2f 0a 20 20 20 20 7c 7c 20 28 70 4c 6f 63 6b  */.    || (pLock
34630 69 6e 67 53 74 79 6c 65 20 3d 3d 20 26 6e 6f 6c  ingStyle == &nol
34640 6f 63 6b 49 6f 4d 65 74 68 6f 64 73 20 26 26 20  ockIoMethods && 
34650 7a 46 69 6c 65 6e 61 6d 65 21 3d 30 29 0a 20 20  zFilename!=0).  
34660 29 7b 0a 20 20 20 20 75 6e 69 78 45 6e 74 65 72  ){.    unixEnter
34670 4d 75 74 65 78 28 29 3b 0a 20 20 20 20 72 63 20  Mutex();.    rc 
34680 3d 20 66 69 6e 64 49 6e 6f 64 65 49 6e 66 6f 28  = findInodeInfo(
34690 70 4e 65 77 2c 20 26 70 4e 65 77 2d 3e 70 49 6e  pNew, &pNew->pIn
346a0 6f 64 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63  ode);.    if( rc
346b0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
346c0 20 20 20 20 20 2f 2a 20 49 66 20 61 6e 20 65 72       /* If an er
346d0 72 6f 72 20 6f 63 63 75 72 72 65 64 20 69 6e 20  ror occurred in 
346e0 66 69 6e 64 49 6e 6f 64 65 49 6e 66 6f 28 29 2c  findInodeInfo(),
346f0 20 63 6c 6f 73 65 20 74 68 65 20 66 69 6c 65 20   close the file 
34700 64 65 73 63 72 69 70 74 6f 72 0a 20 20 20 20 20  descriptor.     
34710 20 2a 2a 20 69 6d 6d 65 64 69 61 74 65 6c 79 2c   ** immediately,
34720 20 62 65 66 6f 72 65 20 72 65 6c 65 61 73 69 6e   before releasin
34730 67 20 74 68 65 20 6d 75 74 65 78 2e 20 66 69 6e  g the mutex. fin
34740 64 49 6e 6f 64 65 49 6e 66 6f 28 29 20 6d 61 79  dInodeInfo() may
34750 20 66 61 69 6c 0a 20 20 20 20 20 20 2a 2a 20 69   fail.      ** i
34760 6e 20 74 77 6f 20 73 63 65 6e 61 72 69 6f 73 3a  n two scenarios:
34770 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20  .      **.      
34780 2a 2a 20 20 20 28 61 29 20 41 20 63 61 6c 6c 20  **   (a) A call 
34790 74 6f 20 66 73 74 61 74 28 29 20 66 61 69 6c 65  to fstat() faile
347a0 64 2e 0a 20 20 20 20 20 20 2a 2a 20 20 20 28 62  d..      **   (b
347b0 29 20 41 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 65  ) A malloc faile
347c0 64 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  d..      **.    
347d0 20 20 2a 2a 20 53 63 65 6e 61 72 69 6f 20 28 62    ** Scenario (b
347e0 29 20 6d 61 79 20 6f 6e 6c 79 20 6f 63 63 75 72  ) may only occur
347f0 20 69 66 20 74 68 65 20 70 72 6f 63 65 73 73 20   if the process 
34800 69 73 20 68 6f 6c 64 69 6e 67 20 6e 6f 20 6f 74  is holding no ot
34810 68 65 72 0a 20 20 20 20 20 20 2a 2a 20 66 69 6c  her.      ** fil
34820 65 20 64 65 73 63 72 69 70 74 6f 72 73 20 6f 70  e descriptors op
34830 65 6e 20 6f 6e 20 74 68 65 20 73 61 6d 65 20 66  en on the same f
34840 69 6c 65 2e 20 49 66 20 74 68 65 72 65 20 77 65  ile. If there we
34850 72 65 20 6f 74 68 65 72 20 66 69 6c 65 0a 20 20  re other file.  
34860 20 20 20 20 2a 2a 20 64 65 73 63 72 69 70 74 6f      ** descripto
34870 72 73 20 6f 6e 20 74 68 69 73 20 66 69 6c 65 2c  rs on this file,
34880 20 74 68 65 6e 20 6e 6f 20 6d 61 6c 6c 6f 63 20   then no malloc 
34890 77 6f 75 6c 64 20 62 65 20 72 65 71 75 69 72 65  would be require
348a0 64 20 62 79 0a 20 20 20 20 20 20 2a 2a 20 66 69  d by.      ** fi
348b0 6e 64 49 6e 6f 64 65 49 6e 66 6f 28 29 2e 20 49  ndInodeInfo(). I
348c0 66 20 74 68 69 73 20 69 73 20 74 68 65 20 63 61  f this is the ca
348d0 73 65 2c 20 69 74 20 69 73 20 71 75 69 74 65 20  se, it is quite 
348e0 73 61 66 65 20 74 6f 20 63 6c 6f 73 65 0a 20 20  safe to close.  
348f0 20 20 20 20 2a 2a 20 68 61 6e 64 6c 65 20 68 20      ** handle h 
34900 2d 20 61 73 20 69 74 20 69 73 20 67 75 61 72 61  - as it is guara
34910 6e 74 65 65 64 20 74 68 61 74 20 6e 6f 20 70 6f  nteed that no po
34920 73 69 78 20 6c 6f 63 6b 73 20 77 69 6c 6c 20 62  six locks will b
34930 65 20 72 65 6c 65 61 73 65 64 0a 20 20 20 20 20  e released.     
34940 20 2a 2a 20 62 79 20 64 6f 69 6e 67 20 73 6f 2e   ** by doing so.
34950 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20  .      **.      
34960 2a 2a 20 49 66 20 73 63 65 6e 61 72 69 6f 20 28  ** If scenario (
34970 61 29 20 63 61 75 73 65 64 20 74 68 65 20 65 72  a) caused the er
34980 72 6f 72 20 74 68 65 6e 20 74 68 69 6e 67 73 20  ror then things 
34990 61 72 65 20 6e 6f 74 20 73 6f 20 73 61 66 65 2e  are not so safe.
349a0 20 54 68 65 0a 20 20 20 20 20 20 2a 2a 20 69 6d   The.      ** im
349b0 70 6c 69 63 69 74 20 61 73 73 75 6d 70 74 69 6f  plicit assumptio
349c0 6e 20 68 65 72 65 20 69 73 20 74 68 61 74 20 69  n here is that i
349d0 66 20 66 73 74 61 74 28 29 20 66 61 69 6c 73 2c  f fstat() fails,
349e0 20 74 68 69 6e 67 73 20 61 72 65 20 69 6e 0a 20   things are in. 
349f0 20 20 20 20 20 2a 2a 20 73 75 63 68 20 62 61 64       ** such bad
34a00 20 73 68 61 70 65 20 74 68 61 74 20 64 72 6f 70   shape that drop
34a10 70 69 6e 67 20 61 20 6c 6f 63 6b 20 6f 72 20 74  ping a lock or t
34a20 77 6f 20 64 6f 65 73 6e 27 74 20 6d 61 74 74 65  wo doesn't matte
34a30 72 20 6d 75 63 68 2e 0a 20 20 20 20 20 20 2a 2f  r much..      */
34a40 0a 20 20 20 20 20 20 72 6f 62 75 73 74 5f 63 6c  .      robust_cl
34a50 6f 73 65 28 70 4e 65 77 2c 20 68 2c 20 5f 5f 4c  ose(pNew, h, __L
34a60 49 4e 45 5f 5f 29 3b 0a 20 20 20 20 20 20 68 20  INE__);.      h 
34a70 3d 20 2d 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20  = -1;.    }.    
34a80 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29  unixLeaveMutex()
34a90 3b 0a 20 20 7d 0a 0a 23 69 66 20 53 51 4c 49 54  ;.  }..#if SQLIT
34aa0 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47  E_ENABLE_LOCKING
34ab0 5f 53 54 59 4c 45 20 26 26 20 64 65 66 69 6e 65  _STYLE && define
34ac0 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 0a 20 20 65  d(__APPLE__).  e
34ad0 6c 73 65 20 69 66 28 20 70 4c 6f 63 6b 69 6e 67  lse if( pLocking
34ae0 53 74 79 6c 65 20 3d 3d 20 26 61 66 70 49 6f 4d  Style == &afpIoM
34af0 65 74 68 6f 64 73 20 29 7b 0a 20 20 20 20 2f 2a  ethods ){.    /*
34b00 20 41 46 50 20 6c 6f 63 6b 69 6e 67 20 75 73 65   AFP locking use
34b10 73 20 74 68 65 20 66 69 6c 65 20 70 61 74 68 20  s the file path 
34b20 73 6f 20 69 74 20 6e 65 65 64 73 20 74 6f 20 62  so it needs to b
34b30 65 20 69 6e 63 6c 75 64 65 64 20 69 6e 0a 20 20  e included in.  
34b40 20 20 2a 2a 20 74 68 65 20 61 66 70 4c 6f 63 6b    ** the afpLock
34b50 69 6e 67 43 6f 6e 74 65 78 74 2e 0a 20 20 20 20  ingContext..    
34b60 2a 2f 0a 20 20 20 20 61 66 70 4c 6f 63 6b 69 6e  */.    afpLockin
34b70 67 43 6f 6e 74 65 78 74 20 2a 70 43 74 78 3b 0a  gContext *pCtx;.
34b80 20 20 20 20 70 4e 65 77 2d 3e 6c 6f 63 6b 69 6e      pNew->lockin
34b90 67 43 6f 6e 74 65 78 74 20 3d 20 70 43 74 78 20  gContext = pCtx 
34ba0 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63  = sqlite3_malloc
34bb0 36 34 28 20 73 69 7a 65 6f 66 28 2a 70 43 74 78  64( sizeof(*pCtx
34bc0 29 20 29 3b 0a 20 20 20 20 69 66 28 20 70 43 74  ) );.    if( pCt
34bd0 78 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 63  x==0 ){.      rc
34be0 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f   = SQLITE_NOMEM_
34bf0 42 4b 50 54 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  BKPT;.    }else{
34c00 0a 20 20 20 20 20 20 2f 2a 20 4e 42 3a 20 7a 46  .      /* NB: zF
34c10 69 6c 65 6e 61 6d 65 20 65 78 69 73 74 73 20 61  ilename exists a
34c20 6e 64 20 72 65 6d 61 69 6e 73 20 76 61 6c 69 64  nd remains valid
34c30 20 75 6e 74 69 6c 20 74 68 65 20 66 69 6c 65 20   until the file 
34c40 69 73 20 63 6c 6f 73 65 64 0a 20 20 20 20 20 20  is closed.      
34c50 2a 2a 20 61 63 63 6f 72 64 69 6e 67 20 74 6f 20  ** according to 
34c60 72 65 71 75 69 72 65 6d 65 6e 74 20 46 31 31 31  requirement F111
34c70 34 31 2e 20 20 53 6f 20 77 65 20 64 6f 20 6e 6f  41.  So we do no
34c80 74 20 6e 65 65 64 20 74 6f 20 6d 61 6b 65 20 61  t need to make a
34c90 0a 20 20 20 20 20 20 2a 2a 20 63 6f 70 79 20 6f  .      ** copy o
34ca0 66 20 74 68 65 20 66 69 6c 65 6e 61 6d 65 2e 20  f the filename. 
34cb0 2a 2f 0a 20 20 20 20 20 20 70 43 74 78 2d 3e 64  */.      pCtx->d
34cc0 62 50 61 74 68 20 3d 20 7a 46 69 6c 65 6e 61 6d  bPath = zFilenam
34cd0 65 3b 0a 20 20 20 20 20 20 70 43 74 78 2d 3e 72  e;.      pCtx->r
34ce0 65 73 65 72 76 65 64 20 3d 20 30 3b 0a 20 20 20  eserved = 0;.   
34cf0 20 20 20 73 72 61 6e 64 6f 6d 64 65 76 28 29 3b     srandomdev();
34d00 0a 20 20 20 20 20 20 75 6e 69 78 45 6e 74 65 72  .      unixEnter
34d10 4d 75 74 65 78 28 29 3b 0a 20 20 20 20 20 20 72  Mutex();.      r
34d20 63 20 3d 20 66 69 6e 64 49 6e 6f 64 65 49 6e 66  c = findInodeInf
34d30 6f 28 70 4e 65 77 2c 20 26 70 4e 65 77 2d 3e 70  o(pNew, &pNew->p
34d40 49 6e 6f 64 65 29 3b 0a 20 20 20 20 20 20 69 66  Inode);.      if
34d50 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
34d60 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
34d70 65 33 5f 66 72 65 65 28 70 4e 65 77 2d 3e 6c 6f  e3_free(pNew->lo
34d80 63 6b 69 6e 67 43 6f 6e 74 65 78 74 29 3b 0a 20  ckingContext);. 
34d90 20 20 20 20 20 20 20 72 6f 62 75 73 74 5f 63 6c         robust_cl
34da0 6f 73 65 28 70 4e 65 77 2c 20 68 2c 20 5f 5f 4c  ose(pNew, h, __L
34db0 49 4e 45 5f 5f 29 3b 0a 20 20 20 20 20 20 20 20  INE__);.        
34dc0 68 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 7d 0a  h = -1;.      }.
34dd0 20 20 20 20 20 20 75 6e 69 78 4c 65 61 76 65 4d        unixLeaveM
34de0 75 74 65 78 28 29 3b 20 20 20 20 20 20 20 20 0a  utex();        .
34df0 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66      }.  }.#endif
34e00 0a 0a 20 20 65 6c 73 65 20 69 66 28 20 70 4c 6f  ..  else if( pLo
34e10 63 6b 69 6e 67 53 74 79 6c 65 20 3d 3d 20 26 64  ckingStyle == &d
34e20 6f 74 6c 6f 63 6b 49 6f 4d 65 74 68 6f 64 73 20  otlockIoMethods 
34e30 29 7b 0a 20 20 20 20 2f 2a 20 44 6f 74 66 69 6c  ){.    /* Dotfil
34e40 65 20 6c 6f 63 6b 69 6e 67 20 75 73 65 73 20 74  e locking uses t
34e50 68 65 20 66 69 6c 65 20 70 61 74 68 20 73 6f 20  he file path so 
34e60 69 74 20 6e 65 65 64 73 20 74 6f 20 62 65 20 69  it needs to be i
34e70 6e 63 6c 75 64 65 64 20 69 6e 0a 20 20 20 20 2a  ncluded in.    *
34e80 2a 20 74 68 65 20 64 6f 74 6c 6f 63 6b 4c 6f 63  * the dotlockLoc
34e90 6b 69 6e 67 43 6f 6e 74 65 78 74 20 0a 20 20 20  kingContext .   
34ea0 20 2a 2f 0a 20 20 20 20 63 68 61 72 20 2a 7a 4c   */.    char *zL
34eb0 6f 63 6b 46 69 6c 65 3b 0a 20 20 20 20 69 6e 74  ockFile;.    int
34ec0 20 6e 46 69 6c 65 6e 61 6d 65 3b 0a 20 20 20 20   nFilename;.    
34ed0 61 73 73 65 72 74 28 20 7a 46 69 6c 65 6e 61 6d  assert( zFilenam
34ee0 65 21 3d 30 20 29 3b 0a 20 20 20 20 6e 46 69 6c  e!=0 );.    nFil
34ef0 65 6e 61 6d 65 20 3d 20 28 69 6e 74 29 73 74 72  ename = (int)str
34f00 6c 65 6e 28 7a 46 69 6c 65 6e 61 6d 65 29 20 2b  len(zFilename) +
34f10 20 36 3b 0a 20 20 20 20 7a 4c 6f 63 6b 46 69 6c   6;.    zLockFil
34f20 65 20 3d 20 28 63 68 61 72 20 2a 29 73 71 6c 69  e = (char *)sqli
34f30 74 65 33 5f 6d 61 6c 6c 6f 63 36 34 28 6e 46 69  te3_malloc64(nFi
34f40 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20 69 66 28  lename);.    if(
34f50 20 7a 4c 6f 63 6b 46 69 6c 65 3d 3d 30 20 29 7b   zLockFile==0 ){
34f60 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
34f70 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20  TE_NOMEM_BKPT;. 
34f80 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
34f90 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
34fa0 28 6e 46 69 6c 65 6e 61 6d 65 2c 20 7a 4c 6f 63  (nFilename, zLoc
34fb0 6b 46 69 6c 65 2c 20 22 25 73 22 20 44 4f 54 4c  kFile, "%s" DOTL
34fc0 4f 43 4b 5f 53 55 46 46 49 58 2c 20 7a 46 69 6c  OCK_SUFFIX, zFil
34fd0 65 6e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 20 20  ename);.    }.  
34fe0 20 20 70 4e 65 77 2d 3e 6c 6f 63 6b 69 6e 67 43    pNew->lockingC
34ff0 6f 6e 74 65 78 74 20 3d 20 7a 4c 6f 63 6b 46 69  ontext = zLockFi
35000 6c 65 3b 0a 20 20 7d 0a 0a 23 69 66 20 4f 53 5f  le;.  }..#if OS_
35010 56 58 57 4f 52 4b 53 0a 20 20 65 6c 73 65 20 69  VXWORKS.  else i
35020 66 28 20 70 4c 6f 63 6b 69 6e 67 53 74 79 6c 65  f( pLockingStyle
35030 20 3d 3d 20 26 73 65 6d 49 6f 4d 65 74 68 6f 64   == &semIoMethod
35040 73 20 29 7b 0a 20 20 20 20 2f 2a 20 4e 61 6d 65  s ){.    /* Name
35050 64 20 73 65 6d 61 70 68 6f 72 65 20 6c 6f 63 6b  d semaphore lock
35060 69 6e 67 20 75 73 65 73 20 74 68 65 20 66 69 6c  ing uses the fil
35070 65 20 70 61 74 68 20 73 6f 20 69 74 20 6e 65 65  e path so it nee
35080 64 73 20 74 6f 20 62 65 0a 20 20 20 20 2a 2a 20  ds to be.    ** 
35090 69 6e 63 6c 75 64 65 64 20 69 6e 20 74 68 65 20  included in the 
350a0 73 65 6d 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78  semLockingContex
350b0 74 0a 20 20 20 20 2a 2f 0a 20 20 20 20 75 6e 69  t.    */.    uni
350c0 78 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 20  xEnterMutex();. 
350d0 20 20 20 72 63 20 3d 20 66 69 6e 64 49 6e 6f 64     rc = findInod
350e0 65 49 6e 66 6f 28 70 4e 65 77 2c 20 26 70 4e 65  eInfo(pNew, &pNe
350f0 77 2d 3e 70 49 6e 6f 64 65 29 3b 0a 20 20 20 20  w->pInode);.    
35100 69 66 28 20 28 72 63 3d 3d 53 51 4c 49 54 45 5f  if( (rc==SQLITE_
35110 4f 4b 29 20 26 26 20 28 70 4e 65 77 2d 3e 70 49  OK) && (pNew->pI
35120 6e 6f 64 65 2d 3e 70 53 65 6d 3d 3d 4e 55 4c 4c  node->pSem==NULL
35130 29 20 29 7b 0a 20 20 20 20 20 20 63 68 61 72 20  ) ){.      char 
35140 2a 7a 53 65 6d 4e 61 6d 65 20 3d 20 70 4e 65 77  *zSemName = pNew
35150 2d 3e 70 49 6e 6f 64 65 2d 3e 61 53 65 6d 4e 61  ->pInode->aSemNa
35160 6d 65 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 3b  me;.      int n;
35170 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73  .      sqlite3_s
35180 6e 70 72 69 6e 74 66 28 4d 41 58 5f 50 41 54 48  nprintf(MAX_PATH
35190 4e 41 4d 45 2c 20 7a 53 65 6d 4e 61 6d 65 2c 20  NAME, zSemName, 
351a0 22 2f 25 73 2e 73 65 6d 22 2c 0a 20 20 20 20 20  "/%s.sem",.     
351b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
351c0 20 20 70 4e 65 77 2d 3e 70 49 64 2d 3e 7a 43 61    pNew->pId->zCa
351d0 6e 6f 6e 69 63 61 6c 4e 61 6d 65 29 3b 0a 20 20  nonicalName);.  
351e0 20 20 20 20 66 6f 72 28 20 6e 3d 31 3b 20 7a 53      for( n=1; zS
351f0 65 6d 4e 61 6d 65 5b 6e 5d 3b 20 6e 2b 2b 20 29  emName[n]; n++ )
35200 0a 20 20 20 20 20 20 20 20 69 66 28 20 7a 53 65  .        if( zSe
35210 6d 4e 61 6d 65 5b 6e 5d 3d 3d 27 2f 27 20 29 20  mName[n]=='/' ) 
35220 7a 53 65 6d 4e 61 6d 65 5b 6e 5d 20 3d 20 27 5f  zSemName[n] = '_
35230 27 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 70  ';.      pNew->p
35240 49 6e 6f 64 65 2d 3e 70 53 65 6d 20 3d 20 73 65  Inode->pSem = se
35250 6d 5f 6f 70 65 6e 28 7a 53 65 6d 4e 61 6d 65 2c  m_open(zSemName,
35260 20 4f 5f 43 52 45 41 54 2c 20 30 36 36 36 2c 20   O_CREAT, 0666, 
35270 31 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4e  1);.      if( pN
35280 65 77 2d 3e 70 49 6e 6f 64 65 2d 3e 70 53 65 6d  ew->pInode->pSem
35290 20 3d 3d 20 53 45 4d 5f 46 41 49 4c 45 44 20 29   == SEM_FAILED )
352a0 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53  {.        rc = S
352b0 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54  QLITE_NOMEM_BKPT
352c0 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e  ;.        pNew->
352d0 70 49 6e 6f 64 65 2d 3e 61 53 65 6d 4e 61 6d 65  pInode->aSemName
352e0 5b 30 5d 20 3d 20 27 5c 30 27 3b 0a 20 20 20 20  [0] = '\0';.    
352f0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 75 6e    }.    }.    un
35300 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a  ixLeaveMutex();.
35310 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 0a 20 20    }.#endif.  .  
35320 73 74 6f 72 65 4c 61 73 74 45 72 72 6e 6f 28 70  storeLastErrno(p
35330 4e 65 77 2c 20 30 29 3b 0a 23 69 66 20 4f 53 5f  New, 0);.#if OS_
35340 56 58 57 4f 52 4b 53 0a 20 20 69 66 28 20 72 63  VXWORKS.  if( rc
35350 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
35360 20 20 20 69 66 28 20 68 3e 3d 30 20 29 20 72 6f     if( h>=0 ) ro
35370 62 75 73 74 5f 63 6c 6f 73 65 28 70 4e 65 77 2c  bust_close(pNew,
35380 20 68 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20   h, __LINE__);. 
35390 20 20 20 68 20 3d 20 2d 31 3b 0a 20 20 20 20 6f     h = -1;.    o
353a0 73 55 6e 6c 69 6e 6b 28 7a 46 69 6c 65 6e 61 6d  sUnlink(zFilenam
353b0 65 29 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 63 74  e);.    pNew->ct
353c0 72 6c 46 6c 61 67 73 20 7c 3d 20 55 4e 49 58 46  rlFlags |= UNIXF
353d0 49 4c 45 5f 44 45 4c 45 54 45 3b 0a 20 20 7d 0a  ILE_DELETE;.  }.
353e0 23 65 6e 64 69 66 0a 20 20 69 66 28 20 72 63 21  #endif.  if( rc!
353f0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
35400 20 20 69 66 28 20 68 3e 3d 30 20 29 20 72 6f 62    if( h>=0 ) rob
35410 75 73 74 5f 63 6c 6f 73 65 28 70 4e 65 77 2c 20  ust_close(pNew, 
35420 68 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20  h, __LINE__);.  
35430 7d 65 6c 73 65 7b 0a 20 20 20 20 70 4e 65 77 2d  }else{.    pNew-
35440 3e 70 4d 65 74 68 6f 64 20 3d 20 70 4c 6f 63 6b  >pMethod = pLock
35450 69 6e 67 53 74 79 6c 65 3b 0a 20 20 20 20 4f 70  ingStyle;.    Op
35460 65 6e 43 6f 75 6e 74 65 72 28 2b 31 29 3b 0a 20  enCounter(+1);. 
35470 20 20 20 76 65 72 69 66 79 44 62 46 69 6c 65 28     verifyDbFile(
35480 70 4e 65 77 29 3b 0a 20 20 7d 0a 20 20 72 65 74  pNew);.  }.  ret
35490 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
354a0 20 52 65 74 75 72 6e 20 74 68 65 20 6e 61 6d 65   Return the name
354b0 20 6f 66 20 61 20 64 69 72 65 63 74 6f 72 79 20   of a directory 
354c0 69 6e 20 77 68 69 63 68 20 74 6f 20 70 75 74 20  in which to put 
354d0 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 73 2e  temporary files.
354e0 0a 2a 2a 20 49 66 20 6e 6f 20 73 75 69 74 61 62  .** If no suitab
354f0 6c 65 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c  le temporary fil
35500 65 20 64 69 72 65 63 74 6f 72 79 20 63 61 6e 20  e directory can 
35510 62 65 20 66 6f 75 6e 64 2c 20 72 65 74 75 72 6e  be found, return
35520 20 4e 55 4c 4c 2e 0a 2a 2f 0a 73 74 61 74 69 63   NULL..*/.static
35530 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 75 6e 69   const char *uni
35540 78 54 65 6d 70 46 69 6c 65 44 69 72 28 76 6f 69  xTempFileDir(voi
35550 64 29 7b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e  d){.  static con
35560 73 74 20 63 68 61 72 20 2a 61 7a 44 69 72 73 5b  st char *azDirs[
35570 5d 20 3d 20 7b 0a 20 20 20 20 20 30 2c 0a 20 20  ] = {.     0,.  
35580 20 20 20 30 2c 0a 20 20 20 20 20 22 2f 76 61 72     0,.     "/var
35590 2f 74 6d 70 22 2c 0a 20 20 20 20 20 22 2f 75 73  /tmp",.     "/us
355a0 72 2f 74 6d 70 22 2c 0a 20 20 20 20 20 22 2f 74  r/tmp",.     "/t
355b0 6d 70 22 2c 0a 20 20 20 20 20 22 2e 22 0a 20 20  mp",.     ".".  
355c0 7d 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 69 6e  };.  unsigned in
355d0 74 20 69 3b 0a 20 20 73 74 72 75 63 74 20 73 74  t i;.  struct st
355e0 61 74 20 62 75 66 3b 0a 20 20 63 6f 6e 73 74 20  at buf;.  const 
355f0 63 68 61 72 20 2a 7a 44 69 72 20 3d 20 73 71 6c  char *zDir = sql
35600 69 74 65 33 5f 74 65 6d 70 5f 64 69 72 65 63 74  ite3_temp_direct
35610 6f 72 79 3b 0a 0a 20 20 69 66 28 20 21 61 7a 44  ory;..  if( !azD
35620 69 72 73 5b 30 5d 20 29 20 61 7a 44 69 72 73 5b  irs[0] ) azDirs[
35630 30 5d 20 3d 20 67 65 74 65 6e 76 28 22 53 51 4c  0] = getenv("SQL
35640 49 54 45 5f 54 4d 50 44 49 52 22 29 3b 0a 20 20  ITE_TMPDIR");.  
35650 69 66 28 20 21 61 7a 44 69 72 73 5b 31 5d 20 29  if( !azDirs[1] )
35660 20 61 7a 44 69 72 73 5b 31 5d 20 3d 20 67 65 74   azDirs[1] = get
35670 65 6e 76 28 22 54 4d 50 44 49 52 22 29 3b 0a 20  env("TMPDIR");. 
35680 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 69 7a 65   for(i=0; i<size
35690 6f 66 28 61 7a 44 69 72 73 29 2f 73 69 7a 65 6f  of(azDirs)/sizeo
356a0 66 28 61 7a 44 69 72 73 5b 30 5d 29 3b 20 7a 44  f(azDirs[0]); zD
356b0 69 72 3d 61 7a 44 69 72 73 5b 69 2b 2b 5d 29 7b  ir=azDirs[i++]){
356c0 0a 20 20 20 20 69 66 28 20 7a 44 69 72 3d 3d 30  .    if( zDir==0
356d0 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
356e0 20 69 66 28 20 6f 73 53 74 61 74 28 7a 44 69 72   if( osStat(zDir
356f0 2c 20 26 62 75 66 29 20 29 20 63 6f 6e 74 69 6e  , &buf) ) contin
35700 75 65 3b 0a 20 20 20 20 69 66 28 20 21 53 5f 49  ue;.    if( !S_I
35710 53 44 49 52 28 62 75 66 2e 73 74 5f 6d 6f 64 65  SDIR(buf.st_mode
35720 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  ) ) continue;.  
35730 20 20 69 66 28 20 6f 73 41 63 63 65 73 73 28 7a    if( osAccess(z
35740 44 69 72 2c 20 30 37 29 20 29 20 63 6f 6e 74 69  Dir, 07) ) conti
35750 6e 75 65 3b 0a 20 20 20 20 62 72 65 61 6b 3b 0a  nue;.    break;.
35760 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 7a 44 69    }.  return zDi
35770 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61  r;.}../*.** Crea
35780 74 65 20 61 20 74 65 6d 70 6f 72 61 72 79 20 66  te a temporary f
35790 69 6c 65 20 6e 61 6d 65 20 69 6e 20 7a 42 75 66  ile name in zBuf
357a0 2e 20 20 7a 42 75 66 20 6d 75 73 74 20 62 65 20  .  zBuf must be 
357b0 61 6c 6c 6f 63 61 74 65 64 0a 2a 2a 20 62 79 20  allocated.** by 
357c0 74 68 65 20 63 61 6c 6c 69 6e 67 20 70 72 6f 63  the calling proc
357d0 65 73 73 20 61 6e 64 20 6d 75 73 74 20 62 65 20  ess and must be 
357e0 62 69 67 20 65 6e 6f 75 67 68 20 74 6f 20 68 6f  big enough to ho
357f0 6c 64 20 61 74 20 6c 65 61 73 74 0a 2a 2a 20 70  ld at least.** p
35800 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 20  Vfs->mxPathname 
35810 62 79 74 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  bytes..*/.static
35820 20 69 6e 74 20 75 6e 69 78 47 65 74 54 65 6d 70   int unixGetTemp
35830 6e 61 6d 65 28 69 6e 74 20 6e 42 75 66 2c 20 63  name(int nBuf, c
35840 68 61 72 20 2a 7a 42 75 66 29 7b 0a 20 20 63 6f  har *zBuf){.  co
35850 6e 73 74 20 63 68 61 72 20 2a 7a 44 69 72 3b 0a  nst char *zDir;.
35860 20 20 69 6e 74 20 69 4c 69 6d 69 74 20 3d 20 30    int iLimit = 0
35870 3b 0a 0a 20 20 2f 2a 20 49 74 27 73 20 6f 64 64  ;..  /* It's odd
35880 20 74 6f 20 73 69 6d 75 6c 61 74 65 20 61 6e 20   to simulate an 
35890 69 6f 2d 65 72 72 6f 72 20 68 65 72 65 2c 20 62  io-error here, b
358a0 75 74 20 72 65 61 6c 6c 79 20 74 68 69 73 20 69  ut really this i
358b0 73 20 6a 75 73 74 0a 20 20 2a 2a 20 75 73 69 6e  s just.  ** usin
358c0 67 20 74 68 65 20 69 6f 2d 65 72 72 6f 72 20 69  g the io-error i
358d0 6e 66 72 61 73 74 72 75 63 74 75 72 65 20 74 6f  nfrastructure to
358e0 20 74 65 73 74 20 74 68 61 74 20 53 51 4c 69 74   test that SQLit
358f0 65 20 68 61 6e 64 6c 65 73 20 74 68 69 73 0a 20  e handles this. 
35900 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 66 61 69   ** function fai
35910 6c 69 6e 67 2e 20 0a 20 20 2a 2f 0a 20 20 53 69  ling. .  */.  Si
35920 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 72  mulateIOError( r
35930 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45  eturn SQLITE_IOE
35940 52 52 20 29 3b 0a 0a 20 20 7a 44 69 72 20 3d 20  RR );..  zDir = 
35950 75 6e 69 78 54 65 6d 70 46 69 6c 65 44 69 72 28  unixTempFileDir(
35960 29 3b 0a 20 20 64 6f 7b 0a 20 20 20 20 75 36 34  );.  do{.    u64
35970 20 72 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   r;.    sqlite3_
35980 72 61 6e 64 6f 6d 6e 65 73 73 28 73 69 7a 65 6f  randomness(sizeo
35990 66 28 72 29 2c 20 26 72 29 3b 0a 20 20 20 20 61  f(r), &r);.    a
359a0 73 73 65 72 74 28 20 6e 42 75 66 3e 32 20 29 3b  ssert( nBuf>2 );
359b0 0a 20 20 20 20 7a 42 75 66 5b 6e 42 75 66 2d 32  .    zBuf[nBuf-2
359c0 5d 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69 74  ] = 0;.    sqlit
359d0 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 42 75 66  e3_snprintf(nBuf
359e0 2c 20 7a 42 75 66 2c 20 22 25 73 2f 22 53 51 4c  , zBuf, "%s/"SQL
359f0 49 54 45 5f 54 45 4d 50 5f 46 49 4c 45 5f 50 52  ITE_TEMP_FILE_PR
35a00 45 46 49 58 22 25 6c 6c 78 25 63 22 2c 0a 20 20  EFIX"%llx%c",.  
35a10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35a20 20 20 20 7a 44 69 72 2c 20 72 2c 20 30 29 3b 0a     zDir, r, 0);.
35a30 20 20 20 20 69 66 28 20 7a 42 75 66 5b 6e 42 75      if( zBuf[nBu
35a40 66 2d 32 5d 21 3d 30 20 7c 7c 20 28 69 4c 69 6d  f-2]!=0 || (iLim
35a50 69 74 2b 2b 29 3e 31 30 20 29 20 72 65 74 75 72  it++)>10 ) retur
35a60 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  n SQLITE_ERROR;.
35a70 20 20 7d 77 68 69 6c 65 28 20 6f 73 41 63 63 65    }while( osAcce
35a80 73 73 28 7a 42 75 66 2c 30 29 3d 3d 30 20 29 3b  ss(zBuf,0)==0 );
35a90 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
35aa0 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 20 53 51 4c 49  _OK;.}..#if SQLI
35ab0 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e  TE_ENABLE_LOCKIN
35ac0 47 5f 53 54 59 4c 45 20 26 26 20 64 65 66 69 6e  G_STYLE && defin
35ad0 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 0a 2f 2a  ed(__APPLE__)./*
35ae0 0a 2a 2a 20 52 6f 75 74 69 6e 65 20 74 6f 20 74  .** Routine to t
35af0 72 61 6e 73 66 6f 72 6d 20 61 20 75 6e 69 78 46  ransform a unixF
35b00 69 6c 65 20 69 6e 74 6f 20 61 20 70 72 6f 78 79  ile into a proxy
35b10 2d 6c 6f 63 6b 69 6e 67 20 75 6e 69 78 46 69 6c  -locking unixFil
35b20 65 2e 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 61  e..** Implementa
35b30 74 69 6f 6e 20 69 6e 20 74 68 65 20 70 72 6f 78  tion in the prox
35b40 79 2d 6c 6f 63 6b 20 64 69 76 69 73 69 6f 6e 2c  y-lock division,
35b50 20 62 75 74 20 75 73 65 64 20 62 79 20 75 6e 69   but used by uni
35b60 78 4f 70 65 6e 28 29 0a 2a 2a 20 69 66 20 53 51  xOpen().** if SQ
35b70 4c 49 54 45 5f 50 52 45 46 45 52 5f 50 52 4f 58  LITE_PREFER_PROX
35b80 59 5f 4c 4f 43 4b 49 4e 47 20 69 73 20 64 65 66  Y_LOCKING is def
35b90 69 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ined..*/.static 
35ba0 69 6e 74 20 70 72 6f 78 79 54 72 61 6e 73 66 6f  int proxyTransfo
35bb0 72 6d 55 6e 69 78 46 69 6c 65 28 75 6e 69 78 46  rmUnixFile(unixF
35bc0 69 6c 65 2a 2c 20 63 6f 6e 73 74 20 63 68 61 72  ile*, const char
35bd0 2a 29 3b 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  *);.#endif../*.*
35be0 2a 20 53 65 61 72 63 68 20 66 6f 72 20 61 6e 20  * Search for an 
35bf0 75 6e 75 73 65 64 20 66 69 6c 65 20 64 65 73 63  unused file desc
35c00 72 69 70 74 6f 72 20 74 68 61 74 20 77 61 73 20  riptor that was 
35c10 6f 70 65 6e 65 64 20 6f 6e 20 74 68 65 20 64 61  opened on the da
35c20 74 61 62 61 73 65 20 0a 2a 2a 20 66 69 6c 65 20  tabase .** file 
35c30 28 6e 6f 74 20 61 20 6a 6f 75 72 6e 61 6c 20 6f  (not a journal o
35c40 72 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c  r master-journal
35c50 20 66 69 6c 65 29 20 69 64 65 6e 74 69 66 69 65   file) identifie
35c60 64 20 62 79 20 70 61 74 68 6e 61 6d 65 0a 2a 2a  d by pathname.**
35c70 20 7a 50 61 74 68 20 77 69 74 68 20 53 51 4c 49   zPath with SQLI
35c80 54 45 5f 4f 50 45 4e 5f 58 58 58 20 66 6c 61 67  TE_OPEN_XXX flag
35c90 73 20 6d 61 74 63 68 69 6e 67 20 74 68 6f 73 65  s matching those
35ca0 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20 73   passed as the s
35cb0 65 63 6f 6e 64 0a 2a 2a 20 61 72 67 75 6d 65 6e  econd.** argumen
35cc0 74 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69  t to this functi
35cd0 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 53 75 63 68 20 61  on..**.** Such a
35ce0 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
35cf0 20 6d 61 79 20 65 78 69 73 74 20 69 66 20 61 20   may exist if a 
35d00 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
35d10 69 6f 6e 20 77 61 73 20 63 6c 6f 73 65 64 0a 2a  ion was closed.*
35d20 2a 20 62 75 74 20 74 68 65 20 61 73 73 6f 63 69  * but the associ
35d30 61 74 65 64 20 66 69 6c 65 20 64 65 73 63 72 69  ated file descri
35d40 70 74 6f 72 20 63 6f 75 6c 64 20 6e 6f 74 20 62  ptor could not b
35d50 65 20 63 6c 6f 73 65 64 20 62 65 63 61 75 73 65  e closed because
35d60 20 73 6f 6d 65 0a 2a 2a 20 6f 74 68 65 72 20 66   some.** other f
35d70 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 6f  ile descriptor o
35d80 70 65 6e 20 6f 6e 20 74 68 65 20 73 61 6d 65 20  pen on the same 
35d90 66 69 6c 65 20 69 73 20 68 6f 6c 64 69 6e 67 20  file is holding 
35da0 61 20 66 69 6c 65 2d 6c 6f 63 6b 2e 0a 2a 2a 20  a file-lock..** 
35db0 52 65 66 65 72 20 74 6f 20 63 6f 6d 6d 65 6e 74  Refer to comment
35dc0 73 20 69 6e 20 74 68 65 20 75 6e 69 78 43 6c 6f  s in the unixClo
35dd0 73 65 28 29 20 66 75 6e 63 74 69 6f 6e 20 61 6e  se() function an
35de0 64 20 74 68 65 20 6c 65 6e 67 74 68 79 20 63 6f  d the lengthy co
35df0 6d 6d 65 6e 74 0a 2a 2a 20 64 65 73 63 72 69 62  mment.** describ
35e00 69 6e 67 20 22 50 6f 73 69 78 20 41 64 76 69 73  ing "Posix Advis
35e10 6f 72 79 20 4c 6f 63 6b 69 6e 67 22 20 61 74 20  ory Locking" at 
35e20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 69  the start of thi
35e30 73 20 66 69 6c 65 20 66 6f 72 20 0a 2a 2a 20 66  s file for .** f
35e40 75 72 74 68 65 72 20 64 65 74 61 69 6c 73 2e 20  urther details. 
35e50 41 6c 73 6f 2c 20 74 69 63 6b 65 74 20 23 34 30  Also, ticket #40
35e60 31 38 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 73  18..**.** If a s
35e70 75 69 74 61 62 6c 65 20 66 69 6c 65 20 64 65 73  uitable file des
35e80 63 72 69 70 74 6f 72 20 69 73 20 66 6f 75 6e 64  criptor is found
35e90 2c 20 74 68 65 6e 20 69 74 20 69 73 20 72 65 74  , then it is ret
35ea0 75 72 6e 65 64 2e 20 49 66 20 6e 6f 0a 2a 2a 20  urned. If no.** 
35eb0 73 75 63 68 20 66 69 6c 65 20 64 65 73 63 72 69  such file descri
35ec0 70 74 6f 72 20 69 73 20 6c 6f 63 61 74 65 64 2c  ptor is located,
35ed0 20 2d 31 20 69 73 20 72 65 74 75 72 6e 65 64 2e   -1 is returned.
35ee0 0a 2a 2f 0a 73 74 61 74 69 63 20 55 6e 69 78 55  .*/.static UnixU
35ef0 6e 75 73 65 64 46 64 20 2a 66 69 6e 64 52 65 75  nusedFd *findReu
35f00 73 61 62 6c 65 46 64 28 63 6f 6e 73 74 20 63 68  sableFd(const ch
35f10 61 72 20 2a 7a 50 61 74 68 2c 20 69 6e 74 20 66  ar *zPath, int f
35f20 6c 61 67 73 29 7b 0a 20 20 55 6e 69 78 55 6e 75  lags){.  UnixUnu
35f30 73 65 64 46 64 20 2a 70 55 6e 75 73 65 64 20 3d  sedFd *pUnused =
35f40 20 30 3b 0a 0a 20 20 2f 2a 20 44 6f 20 6e 6f 74   0;..  /* Do not
35f50 20 73 65 61 72 63 68 20 66 6f 72 20 61 6e 20 75   search for an u
35f60 6e 75 73 65 64 20 66 69 6c 65 20 64 65 73 63 72  nused file descr
35f70 69 70 74 6f 72 20 6f 6e 20 76 78 77 6f 72 6b 73  iptor on vxworks
35f80 2e 20 4e 6f 74 20 62 65 63 61 75 73 65 0a 20 20  . Not because.  
35f90 2a 2a 20 76 78 77 6f 72 6b 73 20 77 6f 75 6c 64  ** vxworks would
35fa0 20 6e 6f 74 20 62 65 6e 65 66 69 74 20 66 72 6f   not benefit fro
35fb0 6d 20 74 68 65 20 63 68 61 6e 67 65 20 28 69 74  m the change (it
35fc0 20 6d 69 67 68 74 2c 20 77 65 27 72 65 20 6e 6f   might, we're no
35fd0 74 20 73 75 72 65 29 2c 0a 20 20 2a 2a 20 62 75  t sure),.  ** bu
35fe0 74 20 62 65 63 61 75 73 65 20 6e 6f 20 77 61 79  t because no way
35ff0 20 74 6f 20 74 65 73 74 20 69 74 20 69 73 20 63   to test it is c
36000 75 72 72 65 6e 74 6c 79 20 61 76 61 69 6c 61 62  urrently availab
36010 6c 65 2e 20 49 74 20 69 73 20 62 65 74 74 65 72  le. It is better
36020 20 0a 20 20 2a 2a 20 6e 6f 74 20 74 6f 20 72 69   .  ** not to ri
36030 73 6b 20 62 72 65 61 6b 69 6e 67 20 76 78 77 6f  sk breaking vxwo
36040 72 6b 73 20 73 75 70 70 6f 72 74 20 66 6f 72 20  rks support for 
36050 74 68 65 20 73 61 6b 65 20 6f 66 20 73 75 63 68  the sake of such
36060 20 61 6e 20 6f 62 73 63 75 72 65 20 0a 20 20 2a   an obscure .  *
36070 2a 20 66 65 61 74 75 72 65 2e 20 20 2a 2f 0a 23  * feature.  */.#
36080 69 66 20 21 4f 53 5f 56 58 57 4f 52 4b 53 0a 20  if !OS_VXWORKS. 
36090 20 73 74 72 75 63 74 20 73 74 61 74 20 73 53 74   struct stat sSt
360a0 61 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  at;             
360b0 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 73        /* Results
360c0 20 6f 66 20 73 74 61 74 28 29 20 63 61 6c 6c 20   of stat() call 
360d0 2a 2f 0a 0a 20 20 2f 2a 20 41 20 73 74 61 74 28  */..  /* A stat(
360e0 29 20 63 61 6c 6c 20 6d 61 79 20 66 61 69 6c 20  ) call may fail 
360f0 66 6f 72 20 76 61 72 69 6f 75 73 20 72 65 61 73  for various reas
36100 6f 6e 73 2e 20 49 66 20 74 68 69 73 20 68 61 70  ons. If this hap
36110 70 65 6e 73 2c 20 69 74 20 69 73 0a 20 20 2a 2a  pens, it is.  **
36120 20 61 6c 6d 6f 73 74 20 63 65 72 74 61 69 6e 20   almost certain 
36130 74 68 61 74 20 61 6e 20 6f 70 65 6e 28 29 20 63  that an open() c
36140 61 6c 6c 20 6f 6e 20 74 68 65 20 73 61 6d 65 20  all on the same 
36150 70 61 74 68 20 77 69 6c 6c 20 61 6c 73 6f 20 66  path will also f
36160 61 69 6c 2e 0a 20 20 2a 2a 20 46 6f 72 20 74 68  ail..  ** For th
36170 69 73 20 72 65 61 73 6f 6e 2c 20 69 66 20 61 6e  is reason, if an
36180 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 69 6e   error occurs in
36190 20 74 68 65 20 73 74 61 74 28 29 20 63 61 6c 6c   the stat() call
361a0 20 68 65 72 65 2c 20 69 74 20 69 73 0a 20 20 2a   here, it is.  *
361b0 2a 20 69 67 6e 6f 72 65 64 20 61 6e 64 20 2d 31  * ignored and -1
361c0 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 54 68   is returned. Th
361d0 65 20 63 61 6c 6c 65 72 20 77 69 6c 6c 20 74 72  e caller will tr
361e0 79 20 74 6f 20 6f 70 65 6e 20 61 20 6e 65 77 20  y to open a new 
361f0 66 69 6c 65 0a 20 20 2a 2a 20 64 65 73 63 72 69  file.  ** descri
36200 70 74 6f 72 20 6f 6e 20 74 68 65 20 73 61 6d 65  ptor on the same
36210 20 70 61 74 68 2c 20 66 61 69 6c 2c 20 61 6e 64   path, fail, and
36220 20 72 65 74 75 72 6e 20 61 6e 20 65 72 72 6f 72   return an error
36230 20 74 6f 20 53 51 4c 69 74 65 2e 0a 20 20 2a 2a   to SQLite..  **
36240 0a 20 20 2a 2a 20 45 76 65 6e 20 69 66 20 61 20  .  ** Even if a 
36250 73 75 62 73 65 71 75 65 6e 74 20 6f 70 65 6e 28  subsequent open(
36260 29 20 63 61 6c 6c 20 64 6f 65 73 20 73 75 63 63  ) call does succ
36270 65 65 64 2c 20 74 68 65 20 63 6f 6e 73 65 71 75  eed, the consequ
36280 65 6e 63 65 73 20 6f 66 0a 20 20 2a 2a 20 6e 6f  ences of.  ** no
36290 74 20 73 65 61 72 63 68 69 6e 67 20 66 6f 72 20  t searching for 
362a0 61 20 72 65 75 73 61 62 6c 65 20 66 69 6c 65 20  a reusable file 
362b0 64 65 73 63 72 69 70 74 6f 72 20 61 72 65 20 6e  descriptor are n
362c0 6f 74 20 64 69 72 65 2e 20 20 2a 2f 0a 20 20 69  ot dire.  */.  i
362d0 66 28 20 30 3d 3d 6f 73 53 74 61 74 28 7a 50 61  f( 0==osStat(zPa
362e0 74 68 2c 20 26 73 53 74 61 74 29 20 29 7b 0a 20  th, &sStat) ){. 
362f0 20 20 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f     unixInodeInfo
36300 20 2a 70 49 6e 6f 64 65 3b 0a 0a 20 20 20 20 75   *pInode;..    u
36310 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29 3b  nixEnterMutex();
36320 0a 20 20 20 20 70 49 6e 6f 64 65 20 3d 20 69 6e  .    pInode = in
36330 6f 64 65 4c 69 73 74 3b 0a 20 20 20 20 77 68 69  odeList;.    whi
36340 6c 65 28 20 70 49 6e 6f 64 65 20 26 26 20 28 70  le( pInode && (p
36350 49 6e 6f 64 65 2d 3e 66 69 6c 65 49 64 2e 64 65  Inode->fileId.de
36360 76 21 3d 73 53 74 61 74 2e 73 74 5f 64 65 76 0a  v!=sStat.st_dev.
36370 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
36380 20 20 20 20 20 7c 7c 20 70 49 6e 6f 64 65 2d 3e       || pInode->
36390 66 69 6c 65 49 64 2e 69 6e 6f 21 3d 73 53 74 61  fileId.ino!=sSta
363a0 74 2e 73 74 5f 69 6e 6f 29 20 29 7b 0a 20 20 20  t.st_ino) ){.   
363b0 20 20 20 20 70 49 6e 6f 64 65 20 3d 20 70 49 6e      pInode = pIn
363c0 6f 64 65 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20  ode->pNext;.    
363d0 7d 0a 20 20 20 20 69 66 28 20 70 49 6e 6f 64 65  }.    if( pInode
363e0 20 29 7b 0a 20 20 20 20 20 20 55 6e 69 78 55 6e   ){.      UnixUn
363f0 75 73 65 64 46 64 20 2a 2a 70 70 3b 0a 20 20 20  usedFd **pp;.   
36400 20 20 20 66 6f 72 28 70 70 3d 26 70 49 6e 6f 64     for(pp=&pInod
36410 65 2d 3e 70 55 6e 75 73 65 64 3b 20 2a 70 70 20  e->pUnused; *pp 
36420 26 26 20 28 2a 70 70 29 2d 3e 66 6c 61 67 73 21  && (*pp)->flags!
36430 3d 66 6c 61 67 73 3b 20 70 70 3d 26 28 28 2a 70  =flags; pp=&((*p
36440 70 29 2d 3e 70 4e 65 78 74 29 29 3b 0a 20 20 20  p)->pNext));.   
36450 20 20 20 70 55 6e 75 73 65 64 20 3d 20 2a 70 70     pUnused = *pp
36460 3b 0a 20 20 20 20 20 20 69 66 28 20 70 55 6e 75  ;.      if( pUnu
36470 73 65 64 20 29 7b 0a 20 20 20 20 20 20 20 20 2a  sed ){.        *
36480 70 70 20 3d 20 70 55 6e 75 73 65 64 2d 3e 70 4e  pp = pUnused->pN
36490 65 78 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ext;.      }.   
364a0 20 7d 0a 20 20 20 20 75 6e 69 78 4c 65 61 76 65   }.    unixLeave
364b0 4d 75 74 65 78 28 29 3b 0a 20 20 7d 0a 23 65 6e  Mutex();.  }.#en
364c0 64 69 66 20 20 20 20 2f 2a 20 69 66 20 21 4f 53  dif    /* if !OS
364d0 5f 56 58 57 4f 52 4b 53 20 2a 2f 0a 20 20 72 65  _VXWORKS */.  re
364e0 74 75 72 6e 20 70 55 6e 75 73 65 64 3b 0a 7d 0a  turn pUnused;.}.
364f0 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
36500 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 62  tion is called b
36510 79 20 75 6e 69 78 4f 70 65 6e 28 29 20 74 6f 20  y unixOpen() to 
36520 64 65 74 65 72 6d 69 6e 65 20 74 68 65 20 75 6e  determine the un
36530 69 78 20 70 65 72 6d 69 73 73 69 6f 6e 73 0a 2a  ix permissions.*
36540 2a 20 74 6f 20 63 72 65 61 74 65 20 6e 65 77 20  * to create new 
36550 66 69 6c 65 73 20 77 69 74 68 2e 20 49 66 20 6e  files with. If n
36560 6f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20  o error occurs, 
36570 74 68 65 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69  then SQLITE_OK i
36580 73 20 72 65 74 75 72 6e 65 64 0a 2a 2a 20 61 6e  s returned.** an
36590 64 20 61 20 76 61 6c 75 65 20 73 75 69 74 61 62  d a value suitab
365a0 6c 65 20 66 6f 72 20 70 61 73 73 69 6e 67 20 61  le for passing a
365b0 73 20 74 68 65 20 74 68 69 72 64 20 61 72 67 75  s the third argu
365c0 6d 65 6e 74 20 74 6f 20 6f 70 65 6e 28 32 29 20  ment to open(2) 
365d0 69 73 0a 2a 2a 20 77 72 69 74 74 65 6e 20 74 6f  is.** written to
365e0 20 2a 70 4d 6f 64 65 2e 20 49 66 20 61 6e 20 49   *pMode. If an I
365f0 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20  O error occurs, 
36600 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20  an SQLite error 
36610 63 6f 64 65 20 69 73 20 0a 2a 2a 20 72 65 74 75  code is .** retu
36620 72 6e 65 64 20 61 6e 64 20 74 68 65 20 76 61 6c  rned and the val
36630 75 65 20 6f 66 20 2a 70 4d 6f 64 65 20 69 73 20  ue of *pMode is 
36640 6e 6f 74 20 6d 6f 64 69 66 69 65 64 2e 0a 2a 2a  not modified..**
36650 0a 2a 2a 20 49 6e 20 6d 6f 73 74 20 63 61 73 65  .** In most case
36660 73 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  s, this routine 
36670 73 65 74 73 20 2a 70 4d 6f 64 65 20 74 6f 20 30  sets *pMode to 0
36680 2c 20 77 68 69 63 68 20 77 69 6c 6c 20 62 65 63  , which will bec
36690 6f 6d 65 0a 2a 2a 20 61 6e 20 69 6e 64 69 63 61  ome.** an indica
366a0 74 69 6f 6e 20 74 6f 20 72 6f 62 75 73 74 5f 6f  tion to robust_o
366b0 70 65 6e 28 29 20 74 6f 20 63 72 65 61 74 65 20  pen() to create 
366c0 74 68 65 20 66 69 6c 65 20 75 73 69 6e 67 0a 2a  the file using.*
366d0 2a 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54  * SQLITE_DEFAULT
366e0 5f 46 49 4c 45 5f 50 45 52 4d 49 53 53 49 4f 4e  _FILE_PERMISSION
366f0 53 20 61 64 6a 75 73 74 65 64 20 62 79 20 74 68  S adjusted by th
36700 65 20 75 6d 61 73 6b 2e 0a 2a 2a 20 42 75 74 20  e umask..** But 
36710 69 66 20 74 68 65 20 66 69 6c 65 20 62 65 69 6e  if the file bein
36720 67 20 6f 70 65 6e 65 64 20 69 73 20 61 20 57 41  g opened is a WA
36730 4c 20 6f 72 20 72 65 67 75 6c 61 72 20 6a 6f 75  L or regular jou
36740 72 6e 61 6c 20 66 69 6c 65 2c 20 74 68 65 6e 20  rnal file, then 
36750 0a 2a 2a 20 74 68 69 73 20 66 75 6e 63 74 69 6f  .** this functio
36760 6e 20 71 75 65 72 69 65 73 20 74 68 65 20 66 69  n queries the fi
36770 6c 65 2d 73 79 73 74 65 6d 20 66 6f 72 20 74 68  le-system for th
36780 65 20 70 65 72 6d 69 73 73 69 6f 6e 73 20 6f 6e  e permissions on
36790 20 74 68 65 20 0a 2a 2a 20 63 6f 72 72 65 73 70   the .** corresp
367a0 6f 6e 64 69 6e 67 20 64 61 74 61 62 61 73 65 20  onding database 
367b0 66 69 6c 65 20 61 6e 64 20 73 65 74 73 20 2a 70  file and sets *p
367c0 4d 6f 64 65 20 74 6f 20 74 68 69 73 20 76 61 6c  Mode to this val
367d0 75 65 2e 20 57 68 65 6e 65 76 65 72 20 0a 2a 2a  ue. Whenever .**
367e0 20 70 6f 73 73 69 62 6c 65 2c 20 57 41 4c 20 61   possible, WAL a
367f0 6e 64 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 73  nd journal files
36800 20 61 72 65 20 63 72 65 61 74 65 64 20 75 73 69   are created usi
36810 6e 67 20 74 68 65 20 73 61 6d 65 20 70 65 72 6d  ng the same perm
36820 69 73 73 69 6f 6e 73 20 0a 2a 2a 20 61 73 20 74  issions .** as t
36830 68 65 20 61 73 73 6f 63 69 61 74 65 64 20 64 61  he associated da
36840 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 0a  tabase file..**.
36850 2a 2a 20 49 66 20 74 68 65 20 53 51 4c 49 54 45  ** If the SQLITE
36860 5f 45 4e 41 42 4c 45 5f 38 5f 33 5f 4e 41 4d 45  _ENABLE_8_3_NAME
36870 53 20 6f 70 74 69 6f 6e 20 69 73 20 65 6e 61 62  S option is enab
36880 6c 65 64 2c 20 74 68 65 6e 20 74 68 65 0a 2a 2a  led, then the.**
36890 20 6f 72 69 67 69 6e 61 6c 20 66 69 6c 65 6e 61   original filena
368a0 6d 65 20 69 73 20 75 6e 61 76 61 69 6c 61 62 6c  me is unavailabl
368b0 65 2e 20 20 42 75 74 20 38 5f 33 5f 4e 41 4d 45  e.  But 8_3_NAME
368c0 53 20 69 73 20 6f 6e 6c 79 20 75 73 65 64 20 66  S is only used f
368d0 6f 72 0a 2a 2a 20 46 41 54 20 66 69 6c 65 73 79  or.** FAT filesy
368e0 73 74 65 6d 73 20 61 6e 64 20 70 65 72 6d 69 73  stems and permis
368f0 73 69 6f 6e 73 20 64 6f 20 6e 6f 74 20 6d 61 74  sions do not mat
36900 74 65 72 20 74 68 65 72 65 2c 20 73 6f 20 6a 75  ter there, so ju
36910 73 74 20 75 73 65 0a 2a 2a 20 74 68 65 20 64 65  st use.** the de
36920 66 61 75 6c 74 20 70 65 72 6d 69 73 73 69 6f 6e  fault permission
36930 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  s..*/.static int
36940 20 66 69 6e 64 43 72 65 61 74 65 46 69 6c 65 4d   findCreateFileM
36950 6f 64 65 28 0a 20 20 63 6f 6e 73 74 20 63 68 61  ode(.  const cha
36960 72 20 2a 7a 50 61 74 68 2c 20 20 20 20 20 20 20  r *zPath,       
36970 20 20 20 20 20 20 20 2f 2a 20 50 61 74 68 20 6f         /* Path o
36980 66 20 66 69 6c 65 20 28 70 6f 73 73 69 62 6c 79  f file (possibly
36990 29 20 62 65 69 6e 67 20 63 72 65 61 74 65 64 20  ) being created 
369a0 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 2c 20  */.  int flags, 
369b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
369c0 20 20 20 20 20 2f 2a 20 46 6c 61 67 73 20 70 61       /* Flags pa
369d0 73 73 65 64 20 61 73 20 34 74 68 20 61 72 67 75  ssed as 4th argu
369e0 6d 65 6e 74 20 74 6f 20 78 4f 70 65 6e 28 29 20  ment to xOpen() 
369f0 2a 2f 0a 20 20 6d 6f 64 65 5f 74 20 2a 70 4d 6f  */.  mode_t *pMo
36a00 64 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  de,             
36a10 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 50 65 72       /* OUT: Per
36a20 6d 69 73 73 69 6f 6e 73 20 74 6f 20 6f 70 65 6e  missions to open
36a30 20 66 69 6c 65 20 77 69 74 68 20 2a 2f 0a 20 20   file with */.  
36a40 75 69 64 5f 74 20 2a 70 55 69 64 2c 20 20 20 20  uid_t *pUid,    
36a50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
36a60 2f 2a 20 4f 55 54 3a 20 75 69 64 20 74 6f 20 73  /* OUT: uid to s
36a70 65 74 20 6f 6e 20 74 68 65 20 66 69 6c 65 20 2a  et on the file *
36a80 2f 0a 20 20 67 69 64 5f 74 20 2a 70 47 69 64 20  /.  gid_t *pGid 
36a90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
36aa0 20 20 20 20 2f 2a 20 4f 55 54 3a 20 67 69 64 20      /* OUT: gid 
36ab0 74 6f 20 73 65 74 20 6f 6e 20 74 68 65 20 66 69  to set on the fi
36ac0 6c 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72  le */.){.  int r
36ad0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20  c = SQLITE_OK;  
36ae0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
36af0 74 75 72 6e 20 43 6f 64 65 20 2a 2f 0a 20 20 2a  turn Code */.  *
36b00 70 4d 6f 64 65 20 3d 20 30 3b 0a 20 20 2a 70 55  pMode = 0;.  *pU
36b10 69 64 20 3d 20 30 3b 0a 20 20 2a 70 47 69 64 20  id = 0;.  *pGid 
36b20 3d 20 30 3b 0a 20 20 69 66 28 20 66 6c 61 67 73  = 0;.  if( flags
36b30 20 26 20 28 53 51 4c 49 54 45 5f 4f 50 45 4e 5f   & (SQLITE_OPEN_
36b40 57 41 4c 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  WAL|SQLITE_OPEN_
36b50 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 29 20 29 7b  MAIN_JOURNAL) ){
36b60 0a 20 20 20 20 63 68 61 72 20 7a 44 62 5b 4d 41  .    char zDb[MA
36b70 58 5f 50 41 54 48 4e 41 4d 45 2b 31 5d 3b 20 20  X_PATHNAME+1];  
36b80 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 66     /* Database f
36b90 69 6c 65 20 70 61 74 68 20 2a 2f 0a 20 20 20 20  ile path */.    
36ba0 69 6e 74 20 6e 44 62 3b 20 20 20 20 20 20 20 20  int nDb;        
36bb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
36bc0 20 4e 75 6d 62 65 72 20 6f 66 20 76 61 6c 69 64   Number of valid
36bd0 20 62 79 74 65 73 20 69 6e 20 7a 44 62 20 2a 2f   bytes in zDb */
36be0 0a 20 20 20 20 73 74 72 75 63 74 20 73 74 61 74  .    struct stat
36bf0 20 73 53 74 61 74 3b 20 20 20 20 20 20 20 20 20   sStat;         
36c00 20 20 20 2f 2a 20 4f 75 74 70 75 74 20 6f 66 20     /* Output of 
36c10 73 74 61 74 28 29 20 6f 6e 20 64 61 74 61 62 61  stat() on databa
36c20 73 65 20 66 69 6c 65 20 2a 2f 0a 0a 20 20 20 20  se file */..    
36c30 2f 2a 20 7a 50 61 74 68 20 69 73 20 61 20 70 61  /* zPath is a pa
36c40 74 68 20 74 6f 20 61 20 57 41 4c 20 6f 72 20 6a  th to a WAL or j
36c50 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 54 68 65  ournal file. The
36c60 20 66 6f 6c 6c 6f 77 69 6e 67 20 62 6c 6f 63 6b   following block
36c70 20 64 65 72 69 76 65 73 0a 20 20 20 20 2a 2a 20   derives.    ** 
36c80 74 68 65 20 70 61 74 68 20 74 6f 20 74 68 65 20  the path to the 
36c90 61 73 73 6f 63 69 61 74 65 64 20 64 61 74 61 62  associated datab
36ca0 61 73 65 20 66 69 6c 65 20 66 72 6f 6d 20 7a 50  ase file from zP
36cb0 61 74 68 2e 20 54 68 69 73 20 62 6c 6f 63 6b 20  ath. This block 
36cc0 68 61 6e 64 6c 65 73 0a 20 20 20 20 2a 2a 20 74  handles.    ** t
36cd0 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 6e 61 6d  he following nam
36ce0 69 6e 67 20 63 6f 6e 76 65 6e 74 69 6f 6e 73 3a  ing conventions:
36cf0 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20  .    **.    **  
36d00 20 22 3c 70 61 74 68 20 74 6f 20 64 62 3e 2d 6a   "<path to db>-j
36d10 6f 75 72 6e 61 6c 22 0a 20 20 20 20 2a 2a 20 20  ournal".    **  
36d20 20 22 3c 70 61 74 68 20 74 6f 20 64 62 3e 2d 77   "<path to db>-w
36d30 61 6c 22 0a 20 20 20 20 2a 2a 20 20 20 22 3c 70  al".    **   "<p
36d40 61 74 68 20 74 6f 20 64 62 3e 2d 6a 6f 75 72 6e  ath to db>-journ
36d50 61 6c 4e 4e 22 0a 20 20 20 20 2a 2a 20 20 20 22  alNN".    **   "
36d60 3c 70 61 74 68 20 74 6f 20 64 62 3e 2d 77 61 6c  <path to db>-wal
36d70 4e 4e 22 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  NN".    **.    *
36d80 2a 20 77 68 65 72 65 20 4e 4e 20 69 73 20 61 20  * where NN is a 
36d90 64 65 63 69 6d 61 6c 20 6e 75 6d 62 65 72 2e 20  decimal number. 
36da0 54 68 65 20 4e 4e 20 6e 61 6d 69 6e 67 20 73 63  The NN naming sc
36db0 68 65 6d 65 73 20 61 72 65 20 0a 20 20 20 20 2a  hemes are .    *
36dc0 2a 20 75 73 65 64 20 62 79 20 74 68 65 20 74 65  * used by the te
36dd0 73 74 5f 6d 75 6c 74 69 70 6c 65 78 2e 63 20 6d  st_multiplex.c m
36de0 6f 64 75 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20  odule..    */.  
36df0 20 20 6e 44 62 20 3d 20 73 71 6c 69 74 65 33 53    nDb = sqlite3S
36e00 74 72 6c 65 6e 33 30 28 7a 50 61 74 68 29 20 2d  trlen30(zPath) -
36e10 20 31 3b 20 0a 20 20 20 20 77 68 69 6c 65 28 20   1; .    while( 
36e20 7a 50 61 74 68 5b 6e 44 62 5d 21 3d 27 2d 27 20  zPath[nDb]!='-' 
36e30 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ){.#ifndef SQLIT
36e40 45 5f 45 4e 41 42 4c 45 5f 38 5f 33 5f 4e 41 4d  E_ENABLE_8_3_NAM
36e50 45 53 0a 20 20 20 20 20 20 2f 2a 20 49 6e 20 74  ES.      /* In t
36e60 68 65 20 6e 6f 72 6d 61 6c 20 63 61 73 65 20 28  he normal case (
36e70 38 2b 33 20 66 69 6c 65 6e 61 6d 65 73 20 64 69  8+3 filenames di
36e80 73 61 62 6c 65 64 29 20 74 68 65 20 6a 6f 75 72  sabled) the jour
36e90 6e 61 6c 20 66 69 6c 65 6e 61 6d 65 0a 20 20 20  nal filename.   
36ea0 20 20 20 2a 2a 20 69 73 20 67 75 61 72 61 6e 74     ** is guarant
36eb0 65 65 64 20 74 6f 20 63 6f 6e 74 61 69 6e 20 61  eed to contain a
36ec0 20 27 2d 27 20 63 68 61 72 61 63 74 65 72 2e 20   '-' character. 
36ed0 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  */.      assert(
36ee0 20 6e 44 62 3e 30 20 29 3b 0a 20 20 20 20 20 20   nDb>0 );.      
36ef0 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 49  assert( sqlite3I
36f00 73 61 6c 6e 75 6d 28 7a 50 61 74 68 5b 6e 44 62  salnum(zPath[nDb
36f10 5d 29 20 29 3b 0a 23 65 6c 73 65 0a 20 20 20 20  ]) );.#else.    
36f20 20 20 2f 2a 20 49 66 20 38 2b 33 20 6e 61 6d 65    /* If 8+3 name
36f30 73 20 61 72 65 20 70 6f 73 73 69 62 6c 65 2c 20  s are possible, 
36f40 74 68 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  then the journal
36f50 20 66 69 6c 65 20 6d 69 67 68 74 20 6e 6f 74 20   file might not 
36f60 63 6f 6e 74 61 69 6e 0a 20 20 20 20 20 20 2a 2a  contain.      **
36f70 20 61 20 27 2d 27 20 63 68 61 72 61 63 74 65 72   a '-' character
36f80 2e 20 20 53 6f 20 63 68 65 63 6b 20 66 6f 72 20  .  So check for 
36f90 74 68 61 74 20 63 61 73 65 20 61 6e 64 20 72 65  that case and re
36fa0 74 75 72 6e 20 65 61 72 6c 79 2e 20 2a 2f 0a 20  turn early. */. 
36fb0 20 20 20 20 20 69 66 28 20 6e 44 62 3d 3d 30 20       if( nDb==0 
36fc0 7c 7c 20 7a 50 61 74 68 5b 6e 44 62 5d 3d 3d 27  || zPath[nDb]=='
36fd0 2e 27 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  .' ) return SQLI
36fe0 54 45 5f 4f 4b 3b 0a 23 65 6e 64 69 66 0a 20 20  TE_OK;.#endif.  
36ff0 20 20 20 20 6e 44 62 2d 2d 3b 0a 20 20 20 20 7d      nDb--;.    }
37000 0a 20 20 20 20 6d 65 6d 63 70 79 28 7a 44 62 2c  .    memcpy(zDb,
37010 20 7a 50 61 74 68 2c 20 6e 44 62 29 3b 0a 20 20   zPath, nDb);.  
37020 20 20 7a 44 62 5b 6e 44 62 5d 20 3d 20 27 5c 30    zDb[nDb] = '\0
37030 27 3b 0a 0a 20 20 20 20 69 66 28 20 30 3d 3d 6f  ';..    if( 0==o
37040 73 53 74 61 74 28 7a 44 62 2c 20 26 73 53 74 61  sStat(zDb, &sSta
37050 74 29 20 29 7b 0a 20 20 20 20 20 20 2a 70 4d 6f  t) ){.      *pMo
37060 64 65 20 3d 20 73 53 74 61 74 2e 73 74 5f 6d 6f  de = sStat.st_mo
37070 64 65 20 26 20 30 37 37 37 3b 0a 20 20 20 20 20  de & 0777;.     
37080 20 2a 70 55 69 64 20 3d 20 73 53 74 61 74 2e 73   *pUid = sStat.s
37090 74 5f 75 69 64 3b 0a 20 20 20 20 20 20 2a 70 47  t_uid;.      *pG
370a0 69 64 20 3d 20 73 53 74 61 74 2e 73 74 5f 67 69  id = sStat.st_gi
370b0 64 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  d;.    }else{.  
370c0 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
370d0 49 4f 45 52 52 5f 46 53 54 41 54 3b 0a 20 20 20  IOERR_FSTAT;.   
370e0 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 66   }.  }else if( f
370f0 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50  lags & SQLITE_OP
37100 45 4e 5f 44 45 4c 45 54 45 4f 4e 43 4c 4f 53 45  EN_DELETEONCLOSE
37110 20 29 7b 0a 20 20 20 20 2a 70 4d 6f 64 65 20 3d   ){.    *pMode =
37120 20 30 36 30 30 3b 0a 20 20 7d 0a 20 20 72 65 74   0600;.  }.  ret
37130 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
37140 20 4f 70 65 6e 20 74 68 65 20 66 69 6c 65 20 7a   Open the file z
37150 50 61 74 68 2e 0a 2a 2a 20 0a 2a 2a 20 50 72 65  Path..** .** Pre
37160 76 69 6f 75 73 6c 79 2c 20 74 68 65 20 53 51 4c  viously, the SQL
37170 69 74 65 20 4f 53 20 6c 61 79 65 72 20 75 73 65  ite OS layer use
37180 64 20 74 68 72 65 65 20 66 75 6e 63 74 69 6f 6e  d three function
37190 73 20 69 6e 20 70 6c 61 63 65 20 6f 66 20 74 68  s in place of th
371a0 69 73 0a 2a 2a 20 6f 6e 65 3a 0a 2a 2a 0a 2a 2a  is.** one:.**.**
371b0 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 4f 70       sqlite3OsOp
371c0 65 6e 52 65 61 64 57 72 69 74 65 28 29 3b 0a 2a  enReadWrite();.*
371d0 2a 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 4f  *     sqlite3OsO
371e0 70 65 6e 52 65 61 64 4f 6e 6c 79 28 29 3b 0a 2a  penReadOnly();.*
371f0 2a 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 4f  *     sqlite3OsO
37200 70 65 6e 45 78 63 6c 75 73 69 76 65 28 29 3b 0a  penExclusive();.
37210 2a 2a 0a 2a 2a 20 54 68 65 73 65 20 63 61 6c 6c  **.** These call
37220 73 20 63 6f 72 72 65 73 70 6f 6e 64 20 74 6f 20  s correspond to 
37230 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 6f  the following co
37240 6d 62 69 6e 61 74 69 6f 6e 73 20 6f 66 20 66 6c  mbinations of fl
37250 61 67 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 52  ags:.**.**     R
37260 65 61 64 57 72 69 74 65 28 29 20 2d 3e 20 20 20  eadWrite() ->   
37270 20 20 28 52 45 41 44 57 52 49 54 45 20 7c 20 43    (READWRITE | C
37280 52 45 41 54 45 29 0a 2a 2a 20 20 20 20 20 52 65  REATE).**     Re
37290 61 64 4f 6e 6c 79 28 29 20 20 2d 3e 20 20 20 20  adOnly()  ->    
372a0 20 28 52 45 41 44 4f 4e 4c 59 29 20 0a 2a 2a 20   (READONLY) .** 
372b0 20 20 20 20 4f 70 65 6e 45 78 63 6c 75 73 69 76      OpenExclusiv
372c0 65 28 29 20 2d 3e 20 28 52 45 41 44 57 52 49 54  e() -> (READWRIT
372d0 45 20 7c 20 43 52 45 41 54 45 20 7c 20 45 58 43  E | CREATE | EXC
372e0 4c 55 53 49 56 45 29 0a 2a 2a 0a 2a 2a 20 54 68  LUSIVE).**.** Th
372f0 65 20 6f 6c 64 20 4f 70 65 6e 45 78 63 6c 75 73  e old OpenExclus
37300 69 76 65 28 29 20 61 63 63 65 70 74 65 64 20 61  ive() accepted a
37310 20 62 6f 6f 6c 65 61 6e 20 61 72 67 75 6d 65 6e   boolean argumen
37320 74 20 2d 20 22 64 65 6c 46 6c 61 67 22 2e 20 49  t - "delFlag". I
37330 66 0a 2a 2a 20 74 72 75 65 2c 20 74 68 65 20 66  f.** true, the f
37340 69 6c 65 20 77 61 73 20 63 6f 6e 66 69 67 75 72  ile was configur
37350 65 64 20 74 6f 20 62 65 20 61 75 74 6f 6d 61 74  ed to be automat
37360 69 63 61 6c 6c 79 20 64 65 6c 65 74 65 64 20 77  ically deleted w
37370 68 65 6e 20 74 68 65 0a 2a 2a 20 66 69 6c 65 20  hen the.** file 
37380 68 61 6e 64 6c 65 20 63 6c 6f 73 65 64 2e 20 54  handle closed. T
37390 6f 20 61 63 68 69 65 76 65 20 74 68 65 20 73 61  o achieve the sa
373a0 6d 65 20 65 66 66 65 63 74 20 75 73 69 6e 67 20  me effect using 
373b0 74 68 69 73 20 6e 65 77 20 0a 2a 2a 20 69 6e 74  this new .** int
373c0 65 72 66 61 63 65 2c 20 61 64 64 20 74 68 65 20  erface, add the 
373d0 44 45 4c 45 54 45 4f 4e 43 4c 4f 53 45 20 66 6c  DELETEONCLOSE fl
373e0 61 67 20 74 6f 20 74 68 6f 73 65 20 73 70 65 63  ag to those spec
373f0 69 66 69 65 64 20 61 62 6f 76 65 20 66 6f 72 20  ified above for 
37400 0a 2a 2a 20 4f 70 65 6e 45 78 63 6c 75 73 69 76  .** OpenExclusiv
37410 65 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  e()..*/.static i
37420 6e 74 20 75 6e 69 78 4f 70 65 6e 28 0a 20 20 73  nt unixOpen(.  s
37430 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73  qlite3_vfs *pVfs
37440 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  ,           /* T
37450 68 65 20 56 46 53 20 66 6f 72 20 77 68 69 63 68  he VFS for which
37460 20 74 68 69 73 20 69 73 20 74 68 65 20 78 4f 70   this is the xOp
37470 65 6e 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 63  en method */.  c
37480 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 61 74 68  onst char *zPath
37490 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50  ,           /* P
374a0 61 74 68 6e 61 6d 65 20 6f 66 20 66 69 6c 65 20  athname of file 
374b0 74 6f 20 62 65 20 6f 70 65 6e 65 64 20 2a 2f 0a  to be opened */.
374c0 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a    sqlite3_file *
374d0 70 46 69 6c 65 2c 20 20 20 20 20 20 20 20 20 2f  pFile,         /
374e0 2a 20 54 68 65 20 66 69 6c 65 20 64 65 73 63 72  * The file descr
374f0 69 70 74 6f 72 20 74 6f 20 62 65 20 66 69 6c 6c  iptor to be fill
37500 65 64 20 69 6e 20 2a 2f 0a 20 20 69 6e 74 20 66  ed in */.  int f
37510 6c 61 67 73 2c 20 20 20 20 20 20 20 20 20 20 20  lags,           
37520 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 70 75 74          /* Input
37530 20 66 6c 61 67 73 20 74 6f 20 63 6f 6e 74 72 6f   flags to contro
37540 6c 20 74 68 65 20 6f 70 65 6e 69 6e 67 20 2a 2f  l the opening */
37550 0a 20 20 69 6e 74 20 2a 70 4f 75 74 46 6c 61 67  .  int *pOutFlag
37560 73 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  s               
37570 2f 2a 20 4f 75 74 70 75 74 20 66 6c 61 67 73 20  /* Output flags 
37580 72 65 74 75 72 6e 65 64 20 74 6f 20 53 51 4c 69  returned to SQLi
37590 74 65 20 63 6f 72 65 20 2a 2f 0a 29 7b 0a 20 20  te core */.){.  
375a0 75 6e 69 78 46 69 6c 65 20 2a 70 20 3d 20 28 75  unixFile *p = (u
375b0 6e 69 78 46 69 6c 65 20 2a 29 70 46 69 6c 65 3b  nixFile *)pFile;
375c0 0a 20 20 69 6e 74 20 66 64 20 3d 20 2d 31 3b 20  .  int fd = -1; 
375d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
375e0 20 20 2f 2a 20 46 69 6c 65 20 64 65 73 63 72 69    /* File descri
375f0 70 74 6f 72 20 72 65 74 75 72 6e 65 64 20 62 79  ptor returned by
37600 20 6f 70 65 6e 28 29 20 2a 2f 0a 20 20 69 6e 74   open() */.  int
37610 20 6f 70 65 6e 46 6c 61 67 73 20 3d 20 30 3b 20   openFlags = 0; 
37620 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
37630 6c 61 67 73 20 74 6f 20 70 61 73 73 20 74 6f 20  lags to pass to 
37640 6f 70 65 6e 28 29 20 2a 2f 0a 23 69 66 20 53 51  open() */.#if SQ
37650 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 44 41 54 41  LITE_ENABLE_DATA
37660 5f 50 52 4f 54 45 43 54 49 4f 4e 0a 20 20 69 6e  _PROTECTION.  in
37670 74 20 65 54 79 70 65 20 3d 20 66 6c 61 67 73 26  t eType = flags&
37680 30 78 46 46 30 46 46 46 30 30 3b 20 20 2f 2a 20  0xFF0FFF00;  /* 
37690 54 79 70 65 20 6f 66 20 66 69 6c 65 20 74 6f 20  Type of file to 
376a0 6f 70 65 6e 20 2a 2f 0a 23 65 6c 73 65 0a 20 20  open */.#else.  
376b0 69 6e 74 20 65 54 79 70 65 20 3d 20 66 6c 61 67  int eType = flag
376c0 73 26 30 78 46 46 46 46 46 46 30 30 3b 20 20 2f  s&0xFFFFFF00;  /
376d0 2a 20 54 79 70 65 20 6f 66 20 66 69 6c 65 20 74  * Type of file t
376e0 6f 20 6f 70 65 6e 20 2a 2f 0a 23 65 6e 64 69 66  o open */.#endif
376f0 0a 20 20 69 6e 74 20 6e 6f 4c 6f 63 6b 3b 20 20  .  int noLock;  
37700 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
37710 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 6f 6d 69    /* True to omi
37720 74 20 6c 6f 63 6b 69 6e 67 20 70 72 69 6d 69 74  t locking primit
37730 69 76 65 73 20 2a 2f 0a 20 20 69 6e 74 20 72 63  ives */.  int rc
37740 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20   = SQLITE_OK;   
37750 20 20 20 20 20 20 20 20 20 2f 2a 20 46 75 6e 63           /* Func
37760 74 69 6f 6e 20 52 65 74 75 72 6e 20 43 6f 64 65  tion Return Code
37770 20 2a 2f 0a 20 20 69 6e 74 20 63 74 72 6c 46 6c   */.  int ctrlFl
37780 61 67 73 20 3d 20 30 3b 20 20 20 20 20 20 20 20  ags = 0;        
37790 20 20 20 20 20 2f 2a 20 55 4e 49 58 46 49 4c 45       /* UNIXFILE
377a0 5f 2a 20 66 6c 61 67 73 20 2a 2f 0a 0a 20 20 69  _* flags */..  i
377b0 6e 74 20 69 73 45 78 63 6c 75 73 69 76 65 20 20  nt isExclusive  
377c0 3d 20 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54  = (flags & SQLIT
377d0 45 5f 4f 50 45 4e 5f 45 58 43 4c 55 53 49 56 45  E_OPEN_EXCLUSIVE
377e0 29 3b 0a 20 20 69 6e 74 20 69 73 44 65 6c 65 74  );.  int isDelet
377f0 65 20 20 20 20 20 3d 20 28 66 6c 61 67 73 20 26  e     = (flags &
37800 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 44 45 4c   SQLITE_OPEN_DEL
37810 45 54 45 4f 4e 43 4c 4f 53 45 29 3b 0a 20 20 69  ETEONCLOSE);.  i
37820 6e 74 20 69 73 43 72 65 61 74 65 20 20 20 20 20  nt isCreate     
37830 3d 20 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54  = (flags & SQLIT
37840 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 29 3b 0a  E_OPEN_CREATE);.
37850 20 20 69 6e 74 20 69 73 52 65 61 64 6f 6e 6c 79    int isReadonly
37860 20 20 20 3d 20 28 66 6c 61 67 73 20 26 20 53 51     = (flags & SQ
37870 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e  LITE_OPEN_READON
37880 4c 59 29 3b 0a 20 20 69 6e 74 20 69 73 52 65 61  LY);.  int isRea
37890 64 57 72 69 74 65 20 20 3d 20 28 66 6c 61 67 73  dWrite  = (flags
378a0 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52   & SQLITE_OPEN_R
378b0 45 41 44 57 52 49 54 45 29 3b 0a 23 69 66 20 53  EADWRITE);.#if S
378c0 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43  QLITE_ENABLE_LOC
378d0 4b 49 4e 47 5f 53 54 59 4c 45 0a 20 20 69 6e 74  KING_STYLE.  int
378e0 20 69 73 41 75 74 6f 50 72 6f 78 79 20 20 3d 20   isAutoProxy  = 
378f0 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  (flags & SQLITE_
37900 4f 50 45 4e 5f 41 55 54 4f 50 52 4f 58 59 29 3b  OPEN_AUTOPROXY);
37910 0a 23 65 6e 64 69 66 0a 23 69 66 20 64 65 66 69  .#endif.#if defi
37920 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 7c  ned(__APPLE__) |
37930 7c 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  | SQLITE_ENABLE_
37940 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 20 20  LOCKING_STYLE.  
37950 73 74 72 75 63 74 20 73 74 61 74 66 73 20 66 73  struct statfs fs
37960 49 6e 66 6f 3b 0a 23 65 6e 64 69 66 0a 0a 20 20  Info;.#endif..  
37970 2f 2a 20 49 66 20 63 72 65 61 74 69 6e 67 20 61  /* If creating a
37980 20 6d 61 73 74 65 72 20 6f 72 20 6d 61 69 6e 2d   master or main-
37990 66 69 6c 65 20 6a 6f 75 72 6e 61 6c 2c 20 74 68  file journal, th
379a0 69 73 20 66 75 6e 63 74 69 6f 6e 20 77 69 6c 6c  is function will
379b0 20 6f 70 65 6e 0a 20 20 2a 2a 20 61 20 66 69 6c   open.  ** a fil
379c0 65 2d 64 65 73 63 72 69 70 74 6f 72 20 6f 6e 20  e-descriptor on 
379d0 74 68 65 20 64 69 72 65 63 74 6f 72 79 20 74 6f  the directory to
379e0 6f 2e 20 54 68 65 20 66 69 72 73 74 20 74 69 6d  o. The first tim
379f0 65 20 75 6e 69 78 53 79 6e 63 28 29 0a 20 20 2a  e unixSync().  *
37a00 2a 20 69 73 20 63 61 6c 6c 65 64 20 74 68 65 20  * is called the 
37a10 64 69 72 65 63 74 6f 72 79 20 66 69 6c 65 20 64  directory file d
37a20 65 73 63 72 69 70 74 6f 72 20 77 69 6c 6c 20 62  escriptor will b
37a30 65 20 66 73 79 6e 63 28 29 65 64 20 61 6e 64 20  e fsync()ed and 
37a40 63 6c 6f 73 65 28 29 64 2e 0a 20 20 2a 2f 0a 20  close()d..  */. 
37a50 20 69 6e 74 20 73 79 6e 63 44 69 72 20 3d 20 28   int syncDir = (
37a60 69 73 43 72 65 61 74 65 20 26 26 20 28 0a 20 20  isCreate && (.  
37a70 20 20 20 20 20 20 65 54 79 70 65 3d 3d 53 51 4c        eType==SQL
37a80 49 54 45 5f 4f 50 45 4e 5f 4d 41 53 54 45 52 5f  ITE_OPEN_MASTER_
37a90 4a 4f 55 52 4e 41 4c 20 0a 20 20 20 20 20 7c 7c  JOURNAL .     ||
37aa0 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f   eType==SQLITE_O
37ab0 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c  PEN_MAIN_JOURNAL
37ac0 20 0a 20 20 20 20 20 7c 7c 20 65 54 79 70 65 3d   .     || eType=
37ad0 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 57 41 4c  =SQLITE_OPEN_WAL
37ae0 0a 20 20 29 29 3b 0a 0a 20 20 2f 2a 20 49 66 20  .  ));..  /* If 
37af0 61 72 67 75 6d 65 6e 74 20 7a 50 61 74 68 20 69  argument zPath i
37b00 73 20 61 20 4e 55 4c 4c 20 70 6f 69 6e 74 65 72  s a NULL pointer
37b10 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  , this function 
37b20 69 73 20 72 65 71 75 69 72 65 64 20 74 6f 20 6f  is required to o
37b30 70 65 6e 0a 20 20 2a 2a 20 61 20 74 65 6d 70 6f  pen.  ** a tempo
37b40 72 61 72 79 20 66 69 6c 65 2e 20 55 73 65 20 74  rary file. Use t
37b50 68 69 73 20 62 75 66 66 65 72 20 74 6f 20 73 74  his buffer to st
37b60 6f 72 65 20 74 68 65 20 66 69 6c 65 20 6e 61 6d  ore the file nam
37b70 65 20 69 6e 2e 0a 20 20 2a 2f 0a 20 20 63 68 61  e in..  */.  cha
37b80 72 20 7a 54 6d 70 6e 61 6d 65 5b 4d 41 58 5f 50  r zTmpname[MAX_P
37b90 41 54 48 4e 41 4d 45 2b 32 5d 3b 0a 20 20 63 6f  ATHNAME+2];.  co
37ba0 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20  nst char *zName 
37bb0 3d 20 7a 50 61 74 68 3b 0a 0a 20 20 2f 2a 20 43  = zPath;..  /* C
37bc0 68 65 63 6b 20 74 68 65 20 66 6f 6c 6c 6f 77 69  heck the followi
37bd0 6e 67 20 73 74 61 74 65 6d 65 6e 74 73 20 61 72  ng statements ar
37be0 65 20 74 72 75 65 3a 20 0a 20 20 2a 2a 0a 20 20  e true: .  **.  
37bf0 2a 2a 20 20 20 28 61 29 20 45 78 61 63 74 6c 79  **   (a) Exactly
37c00 20 6f 6e 65 20 6f 66 20 74 68 65 20 52 45 41 44   one of the READ
37c10 57 52 49 54 45 20 61 6e 64 20 52 45 41 44 4f 4e  WRITE and READON
37c20 4c 59 20 66 6c 61 67 73 20 6d 75 73 74 20 62 65  LY flags must be
37c30 20 73 65 74 2c 20 61 6e 64 20 0a 20 20 2a 2a 20   set, and .  ** 
37c40 20 20 28 62 29 20 69 66 20 43 52 45 41 54 45 20    (b) if CREATE 
37c50 69 73 20 73 65 74 2c 20 74 68 65 6e 20 52 45 41  is set, then REA
37c60 44 57 52 49 54 45 20 6d 75 73 74 20 61 6c 73 6f  DWRITE must also
37c70 20 62 65 20 73 65 74 2c 20 61 6e 64 0a 20 20 2a   be set, and.  *
37c80 2a 20 20 20 28 63 29 20 69 66 20 45 58 43 4c 55  *   (c) if EXCLU
37c90 53 49 56 45 20 69 73 20 73 65 74 2c 20 74 68 65  SIVE is set, the
37ca0 6e 20 43 52 45 41 54 45 20 6d 75 73 74 20 61 6c  n CREATE must al
37cb0 73 6f 20 62 65 20 73 65 74 2e 0a 20 20 2a 2a 20  so be set..  ** 
37cc0 20 20 28 64 29 20 69 66 20 44 45 4c 45 54 45 4f    (d) if DELETEO
37cd0 4e 43 4c 4f 53 45 20 69 73 20 73 65 74 2c 20 74  NCLOSE is set, t
37ce0 68 65 6e 20 43 52 45 41 54 45 20 6d 75 73 74 20  hen CREATE must 
37cf0 61 6c 73 6f 20 62 65 20 73 65 74 2e 0a 20 20 2a  also be set..  *
37d00 2f 0a 20 20 61 73 73 65 72 74 28 28 69 73 52 65  /.  assert((isRe
37d10 61 64 6f 6e 6c 79 3d 3d 30 20 7c 7c 20 69 73 52  adonly==0 || isR
37d20 65 61 64 57 72 69 74 65 3d 3d 30 29 20 26 26 20  eadWrite==0) && 
37d30 28 69 73 52 65 61 64 57 72 69 74 65 20 7c 7c 20  (isReadWrite || 
37d40 69 73 52 65 61 64 6f 6e 6c 79 29 29 3b 0a 20 20  isReadonly));.  
37d50 61 73 73 65 72 74 28 69 73 43 72 65 61 74 65 3d  assert(isCreate=
37d60 3d 30 20 7c 7c 20 69 73 52 65 61 64 57 72 69 74  =0 || isReadWrit
37d70 65 29 3b 0a 20 20 61 73 73 65 72 74 28 69 73 45  e);.  assert(isE
37d80 78 63 6c 75 73 69 76 65 3d 3d 30 20 7c 7c 20 69  xclusive==0 || i
37d90 73 43 72 65 61 74 65 29 3b 0a 20 20 61 73 73 65  sCreate);.  asse
37da0 72 74 28 69 73 44 65 6c 65 74 65 3d 3d 30 20 7c  rt(isDelete==0 |
37db0 7c 20 69 73 43 72 65 61 74 65 29 3b 0a 0a 20 20  | isCreate);..  
37dc0 2f 2a 20 54 68 65 20 6d 61 69 6e 20 44 42 2c 20  /* The main DB, 
37dd0 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 2c 20 57 41  main journal, WA
37de0 4c 20 66 69 6c 65 20 61 6e 64 20 6d 61 73 74 65  L file and maste
37df0 72 20 6a 6f 75 72 6e 61 6c 20 61 72 65 20 6e 65  r journal are ne
37e00 76 65 72 20 0a 20 20 2a 2a 20 61 75 74 6f 6d 61  ver .  ** automa
37e10 74 69 63 61 6c 6c 79 20 64 65 6c 65 74 65 64 2e  tically deleted.
37e20 20 4e 6f 72 20 61 72 65 20 74 68 65 79 20 65 76   Nor are they ev
37e30 65 72 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c  er temporary fil
37e40 65 73 2e 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  es.  */.  assert
37e50 28 20 28 21 69 73 44 65 6c 65 74 65 20 26 26 20  ( (!isDelete && 
37e60 7a 4e 61 6d 65 29 20 7c 7c 20 65 54 79 70 65 21  zName) || eType!
37e70 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49  =SQLITE_OPEN_MAI
37e80 4e 5f 44 42 20 29 3b 0a 20 20 61 73 73 65 72 74  N_DB );.  assert
37e90 28 20 28 21 69 73 44 65 6c 65 74 65 20 26 26 20  ( (!isDelete && 
37ea0 7a 4e 61 6d 65 29 20 7c 7c 20 65 54 79 70 65 21  zName) || eType!
37eb0 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49  =SQLITE_OPEN_MAI
37ec0 4e 5f 4a 4f 55 52 4e 41 4c 20 29 3b 0a 20 20 61  N_JOURNAL );.  a
37ed0 73 73 65 72 74 28 20 28 21 69 73 44 65 6c 65 74  ssert( (!isDelet
37ee0 65 20 26 26 20 7a 4e 61 6d 65 29 20 7c 7c 20 65  e && zName) || e
37ef0 54 79 70 65 21 3d 53 51 4c 49 54 45 5f 4f 50 45  Type!=SQLITE_OPE
37f00 4e 5f 4d 41 53 54 45 52 5f 4a 4f 55 52 4e 41 4c  N_MASTER_JOURNAL
37f10 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28 21   );.  assert( (!
37f20 69 73 44 65 6c 65 74 65 20 26 26 20 7a 4e 61 6d  isDelete && zNam
37f30 65 29 20 7c 7c 20 65 54 79 70 65 21 3d 53 51 4c  e) || eType!=SQL
37f40 49 54 45 5f 4f 50 45 4e 5f 57 41 4c 20 29 3b 0a  ITE_OPEN_WAL );.
37f50 0a 20 20 2f 2a 20 41 73 73 65 72 74 20 74 68 61  .  /* Assert tha
37f60 74 20 74 68 65 20 75 70 70 65 72 20 6c 61 79 65  t the upper laye
37f70 72 20 68 61 73 20 73 65 74 20 6f 6e 65 20 6f 66  r has set one of
37f80 20 74 68 65 20 22 66 69 6c 65 2d 74 79 70 65 22   the "file-type"
37f90 20 66 6c 61 67 73 2e 20 2a 2f 0a 20 20 61 73 73   flags. */.  ass
37fa0 65 72 74 28 20 65 54 79 70 65 3d 3d 53 51 4c 49  ert( eType==SQLI
37fb0 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42 20  TE_OPEN_MAIN_DB 
37fc0 20 20 20 20 20 7c 7c 20 65 54 79 70 65 3d 3d 53       || eType==S
37fd0 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 45 4d 50 5f  QLITE_OPEN_TEMP_
37fe0 44 42 20 0a 20 20 20 20 20 20 20 7c 7c 20 65 54  DB .       || eT
37ff0 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e  ype==SQLITE_OPEN
38000 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 20 7c 7c  _MAIN_JOURNAL ||
38010 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f   eType==SQLITE_O
38020 50 45 4e 5f 54 45 4d 50 5f 4a 4f 55 52 4e 41 4c  PEN_TEMP_JOURNAL
38030 20 0a 20 20 20 20 20 20 20 7c 7c 20 65 54 79 70   .       || eTyp
38040 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 53  e==SQLITE_OPEN_S
38050 55 42 4a 4f 55 52 4e 41 4c 20 20 20 7c 7c 20 65  UBJOURNAL   || e
38060 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45  Type==SQLITE_OPE
38070 4e 5f 4d 41 53 54 45 52 5f 4a 4f 55 52 4e 41 4c  N_MASTER_JOURNAL
38080 20 0a 20 20 20 20 20 20 20 7c 7c 20 65 54 79 70   .       || eTyp
38090 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 54  e==SQLITE_OPEN_T
380a0 52 41 4e 53 49 45 4e 54 5f 44 42 20 7c 7c 20 65  RANSIENT_DB || e
380b0 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45  Type==SQLITE_OPE
380c0 4e 5f 57 41 4c 0a 20 20 29 3b 0a 0a 20 20 2f 2a  N_WAL.  );..  /*
380d0 20 44 65 74 65 63 74 20 61 20 70 69 64 20 63 68   Detect a pid ch
380e0 61 6e 67 65 20 61 6e 64 20 72 65 73 65 74 20 74  ange and reset t
380f0 68 65 20 50 52 4e 47 2e 20 20 54 68 65 72 65 20  he PRNG.  There 
38100 69 73 20 61 20 72 61 63 65 20 63 6f 6e 64 69 74  is a race condit
38110 69 6f 6e 0a 20 20 2a 2a 20 68 65 72 65 20 73 75  ion.  ** here su
38120 63 68 20 74 68 61 74 20 74 77 6f 20 6f 72 20 6d  ch that two or m
38130 6f 72 65 20 74 68 72 65 61 64 73 20 61 6c 6c 20  ore threads all 
38140 74 72 79 69 6e 67 20 74 6f 20 6f 70 65 6e 20 64  trying to open d
38150 61 74 61 62 61 73 65 73 20 61 74 0a 20 20 2a 2a  atabases at.  **
38160 20 74 68 65 20 73 61 6d 65 20 69 6e 73 74 61 6e   the same instan
38170 74 20 6d 69 67 68 74 20 61 6c 6c 20 72 65 73 65  t might all rese
38180 74 20 74 68 65 20 50 52 4e 47 2e 20 20 42 75 74  t the PRNG.  But
38190 20 6d 75 6c 74 69 70 6c 65 20 72 65 73 65 74 73   multiple resets
381a0 0a 20 20 2a 2a 20 61 72 65 20 68 61 72 6d 6c 65  .  ** are harmle
381b0 73 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 72  ss..  */.  if( r
381c0 61 6e 64 6f 6d 6e 65 73 73 50 69 64 21 3d 6f 73  andomnessPid!=os
381d0 47 65 74 70 69 64 28 30 29 20 29 7b 0a 20 20 20  Getpid(0) ){.   
381e0 20 72 61 6e 64 6f 6d 6e 65 73 73 50 69 64 20 3d   randomnessPid =
381f0 20 6f 73 47 65 74 70 69 64 28 30 29 3b 0a 20 20   osGetpid(0);.  
38200 20 20 73 71 6c 69 74 65 33 5f 72 61 6e 64 6f 6d    sqlite3_random
38210 6e 65 73 73 28 30 2c 30 29 3b 0a 20 20 7d 0a 0a  ness(0,0);.  }..
38220 20 20 6d 65 6d 73 65 74 28 70 2c 20 30 2c 20 73    memset(p, 0, s
38230 69 7a 65 6f 66 28 75 6e 69 78 46 69 6c 65 29 29  izeof(unixFile))
38240 3b 0a 0a 20 20 69 66 28 20 65 54 79 70 65 3d 3d  ;..  if( eType==
38250 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e  SQLITE_OPEN_MAIN
38260 5f 44 42 20 29 7b 0a 20 20 20 20 55 6e 69 78 55  _DB ){.    UnixU
38270 6e 75 73 65 64 46 64 20 2a 70 55 6e 75 73 65 64  nusedFd *pUnused
38280 3b 0a 20 20 20 20 70 55 6e 75 73 65 64 20 3d 20  ;.    pUnused = 
38290 66 69 6e 64 52 65 75 73 61 62 6c 65 46 64 28 7a  findReusableFd(z
382a0 4e 61 6d 65 2c 20 66 6c 61 67 73 29 3b 0a 20 20  Name, flags);.  
382b0 20 20 69 66 28 20 70 55 6e 75 73 65 64 20 29 7b    if( pUnused ){
382c0 0a 20 20 20 20 20 20 66 64 20 3d 20 70 55 6e 75  .      fd = pUnu
382d0 73 65 64 2d 3e 66 64 3b 0a 20 20 20 20 7d 65 6c  sed->fd;.    }el
382e0 73 65 7b 0a 20 20 20 20 20 20 70 55 6e 75 73 65  se{.      pUnuse
382f0 64 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c  d = sqlite3_mall
38300 6f 63 36 34 28 73 69 7a 65 6f 66 28 2a 70 55 6e  oc64(sizeof(*pUn
38310 75 73 65 64 29 29 3b 0a 20 20 20 20 20 20 69 66  used));.      if
38320 28 20 21 70 55 6e 75 73 65 64 20 29 7b 0a 20 20  ( !pUnused ){.  
38330 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
38340 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a  ITE_NOMEM_BKPT;.
38350 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
38360 20 20 70 2d 3e 70 55 6e 75 73 65 64 20 3d 20 70    p->pUnused = p
38370 55 6e 75 73 65 64 3b 0a 0a 20 20 20 20 2f 2a 20  Unused;..    /* 
38380 44 61 74 61 62 61 73 65 20 66 69 6c 65 6e 61 6d  Database filenam
38390 65 73 20 61 72 65 20 64 6f 75 62 6c 65 2d 7a 65  es are double-ze
383a0 72 6f 20 74 65 72 6d 69 6e 61 74 65 64 20 69 66  ro terminated if
383b0 20 74 68 65 79 20 61 72 65 20 6e 6f 74 0a 20 20   they are not.  
383c0 20 20 2a 2a 20 55 52 49 73 20 77 69 74 68 20 70    ** URIs with p
383d0 61 72 61 6d 65 74 65 72 73 2e 20 20 48 65 6e 63  arameters.  Henc
383e0 65 2c 20 74 68 65 79 20 63 61 6e 20 61 6c 77 61  e, they can alwa
383f0 79 73 20 62 65 20 70 61 73 73 65 64 20 69 6e 74  ys be passed int
38400 6f 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33  o.    ** sqlite3
38410 5f 75 72 69 5f 70 61 72 61 6d 65 74 65 72 28 29  _uri_parameter()
38420 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28  . */.    assert(
38430 20 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45   (flags & SQLITE
38440 5f 4f 50 45 4e 5f 55 52 49 29 20 7c 7c 20 7a 4e  _OPEN_URI) || zN
38450 61 6d 65 5b 73 74 72 6c 65 6e 28 7a 4e 61 6d 65  ame[strlen(zName
38460 29 2b 31 5d 3d 3d 30 20 29 3b 0a 0a 20 20 7d 65  )+1]==0 );..  }e
38470 6c 73 65 20 69 66 28 20 21 7a 4e 61 6d 65 20 29  lse if( !zName )
38480 7b 0a 20 20 20 20 2f 2a 20 49 66 20 7a 4e 61 6d  {.    /* If zNam
38490 65 20 69 73 20 4e 55 4c 4c 2c 20 74 68 65 20 75  e is NULL, the u
384a0 70 70 65 72 20 6c 61 79 65 72 20 69 73 20 72 65  pper layer is re
384b0 71 75 65 73 74 69 6e 67 20 61 20 74 65 6d 70 20  questing a temp 
384c0 66 69 6c 65 2e 20 2a 2f 0a 20 20 20 20 61 73 73  file. */.    ass
384d0 65 72 74 28 69 73 44 65 6c 65 74 65 20 26 26 20  ert(isDelete && 
384e0 21 73 79 6e 63 44 69 72 29 3b 0a 20 20 20 20 72  !syncDir);.    r
384f0 63 20 3d 20 75 6e 69 78 47 65 74 54 65 6d 70 6e  c = unixGetTempn
38500 61 6d 65 28 70 56 66 73 2d 3e 6d 78 50 61 74 68  ame(pVfs->mxPath
38510 6e 61 6d 65 2c 20 7a 54 6d 70 6e 61 6d 65 29 3b  name, zTmpname);
38520 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
38530 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
38540 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
38550 0a 20 20 20 20 7a 4e 61 6d 65 20 3d 20 7a 54 6d  .    zName = zTm
38560 70 6e 61 6d 65 3b 0a 0a 20 20 20 20 2f 2a 20 47  pna