/ Hex Artifact Content
Login

Artifact bcdfbf4f5580ee9224155f5140cdf2d03c03048e:


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 0a 2a 2a 20 44 65 66 69 6e 65 20  f../*.** Define 
0b40: 74 68 65 20 4f 53 5f 56 58 57 4f 52 4b 53 20 70  the OS_VXWORKS p
0b50: 72 65 2d 70 72 6f 63 65 73 73 6f 72 20 6d 61 63  re-processor mac
0b60: 72 6f 20 74 6f 20 31 20 69 66 20 62 75 69 6c 64  ro to 1 if build
0b70: 69 6e 67 20 6f 6e 20 0a 2a 2a 20 76 78 77 6f 72  ing on .** vxwor
0b80: 6b 73 2c 20 6f 72 20 30 20 6f 74 68 65 72 77 69  ks, or 0 otherwi
0b90: 73 65 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 4f  se..*/.#ifndef O
0ba0: 53 5f 56 58 57 4f 52 4b 53 0a 23 20 20 69 66 20  S_VXWORKS.#  if 
0bb0: 64 65 66 69 6e 65 64 28 5f 5f 52 54 50 5f 5f 29  defined(__RTP__)
0bc0: 20 7c 7c 20 64 65 66 69 6e 65 64 28 5f 57 52 53   || defined(_WRS
0bd0: 5f 4b 45 52 4e 45 4c 29 0a 23 20 20 20 20 64 65  _KERNEL).#    de
0be0: 66 69 6e 65 20 4f 53 5f 56 58 57 4f 52 4b 53 20  fine OS_VXWORKS 
0bf0: 31 0a 23 20 20 65 6c 73 65 0a 23 20 20 20 20 64  1.#  else.#    d
0c00: 65 66 69 6e 65 20 4f 53 5f 56 58 57 4f 52 4b 53  efine OS_VXWORKS
0c10: 20 30 0a 23 20 20 65 6e 64 69 66 0a 23 65 6e 64   0.#  endif.#end
0c20: 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 73 65 20  if../*.** These 
0c30: 23 64 65 66 69 6e 65 73 20 73 68 6f 75 6c 64 20  #defines should 
0c40: 65 6e 61 62 6c 65 20 3e 32 47 42 20 66 69 6c 65  enable >2GB file
0c50: 20 73 75 70 70 6f 72 74 20 6f 6e 20 50 6f 73 69   support on Posi
0c60: 78 20 69 66 20 74 68 65 0a 2a 2a 20 75 6e 64 65  x if the.** unde
0c70: 72 6c 79 69 6e 67 20 6f 70 65 72 61 74 69 6e 67  rlying operating
0c80: 20 73 79 73 74 65 6d 20 73 75 70 70 6f 72 74 73   system supports
0c90: 20 69 74 2e 20 20 49 66 20 74 68 65 20 4f 53 20   it.  If the OS 
0ca0: 6c 61 63 6b 73 0a 2a 2a 20 6c 61 72 67 65 20 66  lacks.** large f
0cb0: 69 6c 65 20 73 75 70 70 6f 72 74 2c 20 74 68 65  ile support, the
0cc0: 73 65 20 73 68 6f 75 6c 64 20 62 65 20 6e 6f 2d  se should be no-
0cd0: 6f 70 73 2e 0a 2a 2a 0a 2a 2a 20 4c 61 72 67 65  ops..**.** Large
0ce0: 20 66 69 6c 65 20 73 75 70 70 6f 72 74 20 63 61   file support ca
0cf0: 6e 20 62 65 20 64 69 73 61 62 6c 65 64 20 75 73  n be disabled us
0d00: 69 6e 67 20 74 68 65 20 2d 44 53 51 4c 49 54 45  ing the -DSQLITE
0d10: 5f 44 49 53 41 42 4c 45 5f 4c 46 53 20 73 77 69  _DISABLE_LFS swi
0d20: 74 63 68 0a 2a 2a 20 6f 6e 20 74 68 65 20 63 6f  tch.** on the co
0d30: 6d 70 69 6c 65 72 20 63 6f 6d 6d 61 6e 64 20 6c  mpiler command l
0d40: 69 6e 65 2e 20 20 54 68 69 73 20 69 73 20 6e 65  ine.  This is ne
0d50: 63 65 73 73 61 72 79 20 69 66 20 79 6f 75 20 61  cessary if you a
0d60: 72 65 20 63 6f 6d 70 69 6c 69 6e 67 0a 2a 2a 20  re compiling.** 
0d70: 6f 6e 20 61 20 72 65 63 65 6e 74 20 6d 61 63 68  on a recent mach
0d80: 69 6e 65 20 28 65 78 3a 20 52 65 64 48 61 74 20  ine (ex: RedHat 
0d90: 37 2e 32 29 20 62 75 74 20 79 6f 75 20 77 61 6e  7.2) but you wan
0da0: 74 20 79 6f 75 72 20 63 6f 64 65 20 74 6f 20 77  t your code to w
0db0: 6f 72 6b 0a 2a 2a 20 6f 6e 20 61 6e 20 6f 6c 64  ork.** on an old
0dc0: 65 72 20 6d 61 63 68 69 6e 65 20 28 65 78 3a 20  er machine (ex: 
0dd0: 52 65 64 48 61 74 20 36 2e 30 29 2e 20 20 49 66  RedHat 6.0).  If
0de0: 20 79 6f 75 20 63 6f 6d 70 69 6c 65 20 6f 6e 20   you compile on 
0df0: 52 65 64 48 61 74 20 37 2e 32 0a 2a 2a 20 77 69  RedHat 7.2.** wi
0e00: 74 68 6f 75 74 20 74 68 69 73 20 6f 70 74 69 6f  thout this optio
0e10: 6e 2c 20 4c 46 53 20 69 73 20 65 6e 61 62 6c 65  n, LFS is enable
0e20: 2e 20 20 42 75 74 20 4c 46 53 20 64 6f 65 73 20  .  But LFS does 
0e30: 6e 6f 74 20 65 78 69 73 74 20 69 6e 20 74 68 65  not exist in the
0e40: 20 6b 65 72 6e 65 6c 0a 2a 2a 20 69 6e 20 52 65   kernel.** in Re
0e50: 64 48 61 74 20 36 2e 30 2c 20 73 6f 20 74 68 65  dHat 6.0, so the
0e60: 20 63 6f 64 65 20 77 6f 6e 27 74 20 77 6f 72 6b   code won't work
0e70: 2e 20 20 48 65 6e 63 65 2c 20 66 6f 72 20 6d 61  .  Hence, for ma
0e80: 78 69 6d 75 6d 20 62 69 6e 61 72 79 0a 2a 2a 20  ximum binary.** 
0e90: 70 6f 72 74 61 62 69 6c 69 74 79 20 79 6f 75 20  portability you 
0ea0: 73 68 6f 75 6c 64 20 6f 6d 69 74 20 4c 46 53 2e  should omit LFS.
0eb0: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 72 65 76 69  .**.** The previ
0ec0: 6f 75 73 20 70 61 72 61 67 72 61 70 68 20 77 61  ous paragraph wa
0ed0: 73 20 77 72 69 74 74 65 6e 20 69 6e 20 32 30 30  s written in 200
0ee0: 35 2e 20 20 28 54 68 69 73 20 70 61 72 61 67 72  5.  (This paragr
0ef0: 61 70 68 20 69 73 20 77 72 69 74 74 65 6e 0a 2a  aph is written.*
0f00: 2a 20 6f 6e 20 32 30 30 38 2d 31 31 2d 32 38 2e  * on 2008-11-28.
0f10: 29 20 54 68 65 73 65 20 64 61 79 73 2c 20 61 6c  ) These days, al
0f20: 6c 20 4c 69 6e 75 78 20 6b 65 72 6e 65 6c 73 20  l Linux kernels 
0f30: 73 75 70 70 6f 72 74 20 6c 61 72 67 65 20 66 69  support large fi
0f40: 6c 65 73 2c 20 73 6f 0a 2a 2a 20 79 6f 75 20 73  les, so.** you s
0f50: 68 6f 75 6c 64 20 70 72 6f 62 61 62 6c 79 20 6c  hould probably l
0f60: 65 61 76 65 20 4c 46 53 20 65 6e 61 62 6c 65 64  eave LFS enabled
0f70: 2e 20 20 42 75 74 20 73 6f 6d 65 20 65 6d 62 65  .  But some embe
0f80: 64 64 65 64 20 70 6c 61 74 66 6f 72 6d 73 20 6d  dded platforms m
0f90: 69 67 68 74 0a 2a 2a 20 6c 61 63 6b 20 4c 46 53  ight.** lack LFS
0fa0: 20 69 6e 20 77 68 69 63 68 20 63 61 73 65 20 74   in which case t
0fb0: 68 65 20 53 51 4c 49 54 45 5f 44 49 53 41 42 4c  he SQLITE_DISABL
0fc0: 45 5f 4c 46 53 20 6d 61 63 72 6f 20 6d 69 67 68  E_LFS macro migh
0fd0: 74 20 73 74 69 6c 6c 20 62 65 20 75 73 65 66 75  t still be usefu
0fe0: 6c 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51  l..*/.#ifndef SQ
0ff0: 4c 49 54 45 5f 44 49 53 41 42 4c 45 5f 4c 46 53  LITE_DISABLE_LFS
1000: 0a 23 20 64 65 66 69 6e 65 20 5f 4c 41 52 47 45  .# define _LARGE
1010: 5f 46 49 4c 45 20 20 20 20 20 20 20 31 0a 23 20  _FILE       1.# 
1020: 69 66 6e 64 65 66 20 5f 46 49 4c 45 5f 4f 46 46  ifndef _FILE_OFF
1030: 53 45 54 5f 42 49 54 53 0a 23 20 20 20 64 65 66  SET_BITS.#   def
1040: 69 6e 65 20 5f 46 49 4c 45 5f 4f 46 46 53 45 54  ine _FILE_OFFSET
1050: 5f 42 49 54 53 20 36 34 0a 23 20 65 6e 64 69 66  _BITS 64.# endif
1060: 0a 23 20 64 65 66 69 6e 65 20 5f 4c 41 52 47 45  .# define _LARGE
1070: 46 49 4c 45 5f 53 4f 55 52 43 45 20 31 0a 23 65  FILE_SOURCE 1.#e
1080: 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 73 74 61 6e  ndif../*.** stan
1090: 64 61 72 64 20 69 6e 63 6c 75 64 65 20 66 69 6c  dard include fil
10a0: 65 73 2e 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65 20  es..*/.#include 
10b0: 3c 73 79 73 2f 74 79 70 65 73 2e 68 3e 0a 23 69  <sys/types.h>.#i
10c0: 6e 63 6c 75 64 65 20 3c 73 79 73 2f 73 74 61 74  nclude <sys/stat
10d0: 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 66 63  .h>.#include <fc
10e0: 6e 74 6c 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20  ntl.h>.#include 
10f0: 3c 75 6e 69 73 74 64 2e 68 3e 0a 23 69 6e 63 6c  <unistd.h>.#incl
1100: 75 64 65 20 3c 74 69 6d 65 2e 68 3e 0a 23 69 6e  ude <time.h>.#in
1110: 63 6c 75 64 65 20 3c 73 79 73 2f 74 69 6d 65 2e  clude <sys/time.
1120: 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 65 72 72  h>.#include <err
1130: 6e 6f 2e 68 3e 0a 23 69 66 6e 64 65 66 20 53 51  no.h>.#ifndef SQ
1140: 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 23 69  LITE_OMIT_WAL.#i
1150: 6e 63 6c 75 64 65 20 3c 73 79 73 2f 6d 6d 61 6e  nclude <sys/mman
1160: 2e 68 3e 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20  .h>.#endif..#if 
1170: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f  SQLITE_ENABLE_LO
1180: 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 23 20 69 6e  CKING_STYLE.# in
1190: 63 6c 75 64 65 20 3c 73 79 73 2f 69 6f 63 74 6c  clude <sys/ioctl
11a0: 2e 68 3e 0a 23 20 69 6e 63 6c 75 64 65 20 3c 75  .h>.# include <u
11b0: 75 69 64 2f 75 75 69 64 2e 68 3e 0a 23 20 69 66  uid/uuid.h>.# if
11c0: 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45   defined(__APPLE
11d0: 5f 5f 29 20 26 26 20 28 28 5f 5f 4d 41 43 5f 4f  __) && ((__MAC_O
11e0: 53 5f 58 5f 56 45 52 53 49 4f 4e 5f 4d 49 4e 5f  S_X_VERSION_MIN_
11f0: 52 45 51 55 49 52 45 44 20 3e 20 31 30 35 30 29  REQUIRED > 1050)
1200: 20 7c 7c 20 5c 0a 20 20 20 20 20 20 20 20 20 20   || \.          
1210: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1220: 20 20 28 5f 5f 49 50 48 4f 4e 45 5f 4f 53 5f 56    (__IPHONE_OS_V
1230: 45 52 53 49 4f 4e 5f 4d 49 4e 5f 52 45 51 55 49  ERSION_MIN_REQUI
1240: 52 45 44 20 3e 20 32 30 30 30 29 29 0a 23 20 20  RED > 2000)).#  
1250: 64 65 66 69 6e 65 20 48 41 56 45 5f 47 45 54 48  define HAVE_GETH
1260: 4f 53 54 55 55 49 44 20 31 0a 23 20 65 6e 64 69  OSTUUID 1.# endi
1270: 66 0a 23 20 69 66 20 4f 53 5f 56 58 57 4f 52 4b  f.# if OS_VXWORK
1280: 53 0a 23 20 20 69 6e 63 6c 75 64 65 20 3c 73 65  S.#  include <se
1290: 6d 61 70 68 6f 72 65 2e 68 3e 0a 23 20 20 69 6e  maphore.h>.#  in
12a0: 63 6c 75 64 65 20 3c 6c 69 6d 69 74 73 2e 68 3e  clude <limits.h>
12b0: 0a 23 20 65 6c 73 65 0a 23 20 20 69 6e 63 6c 75  .# else.#  inclu
12c0: 64 65 20 3c 73 79 73 2f 66 69 6c 65 2e 68 3e 0a  de <sys/file.h>.
12d0: 23 20 20 69 6e 63 6c 75 64 65 20 3c 73 79 73 2f  #  include <sys/
12e0: 70 61 72 61 6d 2e 68 3e 0a 23 20 65 6e 64 69 66  param.h>.# endif
12f0: 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
1300: 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47  E_ENABLE_LOCKING
1310: 5f 53 54 59 4c 45 20 2a 2f 0a 0a 23 69 66 20 64  _STYLE */..#if d
1320: 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f  efined(__APPLE__
1330: 29 20 7c 7c 20 28 53 51 4c 49 54 45 5f 45 4e 41  ) || (SQLITE_ENA
1340: 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c  BLE_LOCKING_STYL
1350: 45 20 26 26 20 21 4f 53 5f 56 58 57 4f 52 4b 53  E && !OS_VXWORKS
1360: 29 0a 23 20 69 6e 63 6c 75 64 65 20 3c 73 79 73  ).# include <sys
1370: 2f 6d 6f 75 6e 74 2e 68 3e 0a 23 65 6e 64 69 66  /mount.h>.#endif
1380: 0a 0a 23 69 66 64 65 66 20 48 41 56 45 5f 55 54  ..#ifdef HAVE_UT
1390: 49 4d 45 0a 23 20 69 6e 63 6c 75 64 65 20 3c 75  IME.# include <u
13a0: 74 69 6d 65 2e 68 3e 0a 23 65 6e 64 69 66 0a 0a  time.h>.#endif..
13b0: 2f 2a 0a 2a 2a 20 41 6c 6c 6f 77 65 64 20 76 61  /*.** Allowed va
13c0: 6c 75 65 73 20 6f 66 20 75 6e 69 78 46 69 6c 65  lues of unixFile
13d0: 2e 66 73 46 6c 61 67 73 0a 2a 2f 0a 23 64 65 66  .fsFlags.*/.#def
13e0: 69 6e 65 20 53 51 4c 49 54 45 5f 46 53 46 4c 41  ine SQLITE_FSFLA
13f0: 47 53 5f 49 53 5f 4d 53 44 4f 53 20 20 20 20 20  GS_IS_MSDOS     
1400: 30 78 31 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 77 65  0x1../*.** If we
1410: 20 61 72 65 20 74 6f 20 62 65 20 74 68 72 65 61   are to be threa
1420: 64 2d 73 61 66 65 2c 20 69 6e 63 6c 75 64 65 20  d-safe, include 
1430: 74 68 65 20 70 74 68 72 65 61 64 73 20 68 65 61  the pthreads hea
1440: 64 65 72 20 61 6e 64 20 64 65 66 69 6e 65 0a 2a  der and define.*
1450: 2a 20 74 68 65 20 53 51 4c 49 54 45 5f 55 4e 49  * the SQLITE_UNI
1460: 58 5f 54 48 52 45 41 44 53 20 6d 61 63 72 6f 2e  X_THREADS macro.
1470: 0a 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f 54  .*/.#if SQLITE_T
1480: 48 52 45 41 44 53 41 46 45 0a 23 20 69 6e 63 6c  HREADSAFE.# incl
1490: 75 64 65 20 3c 70 74 68 72 65 61 64 2e 68 3e 0a  ude <pthread.h>.
14a0: 23 20 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f  # define SQLITE_
14b0: 55 4e 49 58 5f 54 48 52 45 41 44 53 20 31 0a 23  UNIX_THREADS 1.#
14c0: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 44 65 66  endif../*.** Def
14d0: 61 75 6c 74 20 70 65 72 6d 69 73 73 69 6f 6e 73  ault permissions
14e0: 20 77 68 65 6e 20 63 72 65 61 74 69 6e 67 20 61   when creating a
14f0: 20 6e 65 77 20 66 69 6c 65 0a 2a 2f 0a 23 69 66   new file.*/.#if
1500: 6e 64 65 66 20 53 51 4c 49 54 45 5f 44 45 46 41  ndef SQLITE_DEFA
1510: 55 4c 54 5f 46 49 4c 45 5f 50 45 52 4d 49 53 53  ULT_FILE_PERMISS
1520: 49 4f 4e 53 0a 23 20 64 65 66 69 6e 65 20 53 51  IONS.# define SQ
1530: 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 46 49 4c  LITE_DEFAULT_FIL
1540: 45 5f 50 45 52 4d 49 53 53 49 4f 4e 53 20 30 36  E_PERMISSIONS 06
1550: 34 34 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 20 2a  44.#endif../*. *
1560: 2a 20 44 65 66 61 75 6c 74 20 70 65 72 6d 69 73  * Default permis
1570: 73 69 6f 6e 73 20 77 68 65 6e 20 63 72 65 61 74  sions when creat
1580: 69 6e 67 20 61 75 74 6f 20 70 72 6f 78 79 20 64  ing auto proxy d
1590: 69 72 0a 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53  ir. */.#ifndef S
15a0: 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 50 52  QLITE_DEFAULT_PR
15b0: 4f 58 59 44 49 52 5f 50 45 52 4d 49 53 53 49 4f  OXYDIR_PERMISSIO
15c0: 4e 53 0a 23 20 64 65 66 69 6e 65 20 53 51 4c 49  NS.# define SQLI
15d0: 54 45 5f 44 45 46 41 55 4c 54 5f 50 52 4f 58 59  TE_DEFAULT_PROXY
15e0: 44 49 52 5f 50 45 52 4d 49 53 53 49 4f 4e 53 20  DIR_PERMISSIONS 
15f0: 30 37 35 35 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  0755.#endif../*.
1600: 2a 2a 20 4d 61 78 69 6d 75 6d 20 73 75 70 70 6f  ** Maximum suppo
1610: 72 74 65 64 20 70 61 74 68 2d 6c 65 6e 67 74 68  rted path-length
1620: 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 4d 41 58  ..*/.#define MAX
1630: 5f 50 41 54 48 4e 41 4d 45 20 35 31 32 0a 0a 2f  _PATHNAME 512../
1640: 2a 0a 2a 2a 20 4f 6e 6c 79 20 73 65 74 20 74 68  *.** Only set th
1650: 65 20 6c 61 73 74 45 72 72 6e 6f 20 69 66 20 74  e lastErrno if t
1660: 68 65 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73  he error code is
1670: 20 61 20 72 65 61 6c 20 65 72 72 6f 72 20 61 6e   a real error an
1680: 64 20 6e 6f 74 20 0a 2a 2a 20 61 20 6e 6f 72 6d  d not .** a norm
1690: 61 6c 20 65 78 70 65 63 74 65 64 20 72 65 74 75  al expected retu
16a0: 72 6e 20 63 6f 64 65 20 6f 66 20 53 51 4c 49 54  rn code of SQLIT
16b0: 45 5f 42 55 53 59 20 6f 72 20 53 51 4c 49 54 45  E_BUSY or SQLITE
16c0: 5f 4f 4b 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 49  _OK.*/.#define I
16d0: 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 78 29 20  S_LOCK_ERROR(x) 
16e0: 20 28 28 78 20 21 3d 20 53 51 4c 49 54 45 5f 4f   ((x != SQLITE_O
16f0: 4b 29 20 26 26 20 28 78 20 21 3d 20 53 51 4c 49  K) && (x != SQLI
1700: 54 45 5f 42 55 53 59 29 29 0a 0a 2f 2a 20 46 6f  TE_BUSY))../* Fo
1710: 72 77 61 72 64 20 72 65 66 65 72 65 6e 63 65 73  rward references
1720: 20 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75   */.typedef stru
1730: 63 74 20 75 6e 69 78 53 68 6d 20 75 6e 69 78 53  ct unixShm unixS
1740: 68 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  hm;             
1750: 20 20 2f 2a 20 43 6f 6e 6e 65 63 74 69 6f 6e 20    /* Connection 
1760: 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 2a 2f  shared memory */
1770: 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20  .typedef struct 
1780: 75 6e 69 78 53 68 6d 4e 6f 64 65 20 75 6e 69 78  unixShmNode unix
1790: 53 68 6d 4e 6f 64 65 3b 20 20 20 20 20 20 20 2f  ShmNode;       /
17a0: 2a 20 53 68 61 72 65 64 20 6d 65 6d 6f 72 79 20  * Shared memory 
17b0: 69 6e 73 74 61 6e 63 65 20 2a 2f 0a 74 79 70 65  instance */.type
17c0: 64 65 66 20 73 74 72 75 63 74 20 75 6e 69 78 49  def struct unixI
17d0: 6e 6f 64 65 49 6e 66 6f 20 75 6e 69 78 49 6e 6f  nodeInfo unixIno
17e0: 64 65 49 6e 66 6f 3b 20 20 20 2f 2a 20 41 6e 20  deInfo;   /* An 
17f0: 69 2d 6e 6f 64 65 20 2a 2f 0a 74 79 70 65 64 65  i-node */.typede
1800: 66 20 73 74 72 75 63 74 20 55 6e 69 78 55 6e 75  f struct UnixUnu
1810: 73 65 64 46 64 20 55 6e 69 78 55 6e 75 73 65 64  sedFd UnixUnused
1820: 46 64 3b 20 20 20 20 20 2f 2a 20 41 6e 20 75 6e  Fd;     /* An un
1830: 75 73 65 64 20 66 69 6c 65 20 64 65 73 63 72 69  used file descri
1840: 70 74 6f 72 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 53  ptor */../*.** S
1850: 6f 6d 65 74 69 6d 65 73 2c 20 61 66 74 65 72 20  ometimes, after 
1860: 61 20 66 69 6c 65 20 68 61 6e 64 6c 65 20 69 73  a file handle is
1870: 20 63 6c 6f 73 65 64 20 62 79 20 53 51 4c 69 74   closed by SQLit
1880: 65 2c 20 74 68 65 20 66 69 6c 65 20 64 65 73 63  e, the file desc
1890: 72 69 70 74 6f 72 0a 2a 2a 20 63 61 6e 6e 6f 74  riptor.** cannot
18a0: 20 62 65 20 63 6c 6f 73 65 64 20 69 6d 6d 65 64   be closed immed
18b0: 69 61 74 65 6c 79 2e 20 49 6e 20 74 68 65 73 65  iately. In these
18c0: 20 63 61 73 65 73 2c 20 69 6e 73 74 61 6e 63 65   cases, instance
18d0: 73 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  s of the followi
18e0: 6e 67 0a 2a 2a 20 73 74 72 75 63 74 75 72 65 20  ng.** structure 
18f0: 61 72 65 20 75 73 65 64 20 74 6f 20 73 74 6f 72  are used to stor
1900: 65 20 74 68 65 20 66 69 6c 65 20 64 65 73 63 72  e the file descr
1910: 69 70 74 6f 72 20 77 68 69 6c 65 20 77 61 69 74  iptor while wait
1920: 69 6e 67 20 66 6f 72 20 61 6e 0a 2a 2a 20 6f 70  ing for an.** op
1930: 70 6f 72 74 75 6e 69 74 79 20 74 6f 20 65 69 74  portunity to eit
1940: 68 65 72 20 63 6c 6f 73 65 20 6f 72 20 72 65 75  her close or reu
1950: 73 65 20 69 74 2e 0a 2a 2f 0a 73 74 72 75 63 74  se it..*/.struct
1960: 20 55 6e 69 78 55 6e 75 73 65 64 46 64 20 7b 0a   UnixUnusedFd {.
1970: 20 20 69 6e 74 20 66 64 3b 20 20 20 20 20 20 20    int fd;       
1980: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
1990: 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 74  ile descriptor t
19a0: 6f 20 63 6c 6f 73 65 20 2a 2f 0a 20 20 69 6e 74  o close */.  int
19b0: 20 66 6c 61 67 73 3b 20 20 20 20 20 20 20 20 20   flags;         
19c0: 20 20 20 20 20 20 20 2f 2a 20 46 6c 61 67 73 20         /* Flags 
19d0: 74 68 69 73 20 66 69 6c 65 20 64 65 73 63 72 69  this file descri
19e0: 70 74 6f 72 20 77 61 73 20 6f 70 65 6e 65 64 20  ptor was opened 
19f0: 77 69 74 68 20 2a 2f 0a 20 20 55 6e 69 78 55 6e  with */.  UnixUn
1a00: 75 73 65 64 46 64 20 2a 70 4e 65 78 74 3b 20 20  usedFd *pNext;  
1a10: 20 20 20 20 2f 2a 20 4e 65 78 74 20 75 6e 75 73      /* Next unus
1a20: 65 64 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  ed file descript
1a30: 6f 72 20 6f 6e 20 73 61 6d 65 20 66 69 6c 65 20  or on same file 
1a40: 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  */.};../*.** The
1a50: 20 75 6e 69 78 46 69 6c 65 20 73 74 72 75 63 74   unixFile struct
1a60: 75 72 65 20 69 73 20 73 75 62 63 6c 61 73 73 20  ure is subclass 
1a70: 6f 66 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  of sqlite3_file 
1a80: 73 70 65 63 69 66 69 63 20 74 6f 20 74 68 65 20  specific to the 
1a90: 75 6e 69 78 0a 2a 2a 20 56 46 53 20 69 6d 70 6c  unix.** VFS impl
1aa0: 65 6d 65 6e 74 61 74 69 6f 6e 73 2e 0a 2a 2f 0a  ementations..*/.
1ab0: 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20 75  typedef struct u
1ac0: 6e 69 78 46 69 6c 65 20 75 6e 69 78 46 69 6c 65  nixFile unixFile
1ad0: 3b 0a 73 74 72 75 63 74 20 75 6e 69 78 46 69 6c  ;.struct unixFil
1ae0: 65 20 7b 0a 20 20 73 71 6c 69 74 65 33 5f 69 6f  e {.  sqlite3_io
1af0: 5f 6d 65 74 68 6f 64 73 20 63 6f 6e 73 74 20 2a  _methods const *
1b00: 70 4d 65 74 68 6f 64 3b 20 20 2f 2a 20 41 6c 77  pMethod;  /* Alw
1b10: 61 79 73 20 74 68 65 20 66 69 72 73 74 20 65 6e  ays the first en
1b20: 74 72 79 20 2a 2f 0a 20 20 75 6e 69 78 49 6e 6f  try */.  unixIno
1b30: 64 65 49 6e 66 6f 20 2a 70 49 6e 6f 64 65 3b 20  deInfo *pInode; 
1b40: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1b50: 49 6e 66 6f 20 61 62 6f 75 74 20 6c 6f 63 6b 73  Info about locks
1b60: 20 6f 6e 20 74 68 69 73 20 69 6e 6f 64 65 20 2a   on this inode *
1b70: 2f 0a 20 20 69 6e 74 20 68 3b 20 20 20 20 20 20  /.  int h;      
1b80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b90: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 66          /* The f
1ba0: 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 2a  ile descriptor *
1bb0: 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  /.  unsigned cha
1bc0: 72 20 65 46 69 6c 65 4c 6f 63 6b 3b 20 20 20 20  r eFileLock;    
1bd0: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 74          /* The t
1be0: 79 70 65 20 6f 66 20 6c 6f 63 6b 20 68 65 6c 64  ype of lock held
1bf0: 20 6f 6e 20 74 68 69 73 20 66 64 20 2a 2f 0a 20   on this fd */. 
1c00: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 63   unsigned char c
1c10: 74 72 6c 46 6c 61 67 73 3b 20 20 20 20 20 20 20  trlFlags;       
1c20: 20 20 20 20 20 2f 2a 20 42 65 68 61 76 69 6f 72       /* Behavior
1c30: 61 6c 20 62 69 74 73 2e 20 20 55 4e 49 58 46 49  al bits.  UNIXFI
1c40: 4c 45 5f 2a 20 66 6c 61 67 73 20 2a 2f 0a 20 20  LE_* flags */.  
1c50: 69 6e 74 20 6c 61 73 74 45 72 72 6e 6f 3b 20 20  int lastErrno;  
1c60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c70: 20 20 20 20 2f 2a 20 54 68 65 20 75 6e 69 78 20      /* The unix 
1c80: 65 72 72 6e 6f 20 66 72 6f 6d 20 6c 61 73 74 20  errno from last 
1c90: 49 2f 4f 20 65 72 72 6f 72 20 2a 2f 0a 20 20 76  I/O error */.  v
1ca0: 6f 69 64 20 2a 6c 6f 63 6b 69 6e 67 43 6f 6e 74  oid *lockingCont
1cb0: 65 78 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  ext;            
1cc0: 20 20 20 2f 2a 20 4c 6f 63 6b 69 6e 67 20 73 74     /* Locking st
1cd0: 79 6c 65 20 73 70 65 63 69 66 69 63 20 73 74 61  yle specific sta
1ce0: 74 65 20 2a 2f 0a 20 20 55 6e 69 78 55 6e 75 73  te */.  UnixUnus
1cf0: 65 64 46 64 20 2a 70 55 6e 75 73 65 64 3b 20 20  edFd *pUnused;  
1d00: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
1d10: 72 65 2d 61 6c 6c 6f 63 61 74 65 64 20 55 6e 69  re-allocated Uni
1d20: 78 55 6e 75 73 65 64 46 64 20 2a 2f 0a 20 20 63  xUnusedFd */.  c
1d30: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 61 74 68  onst char *zPath
1d40: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1d50: 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68     /* Name of th
1d60: 65 20 66 69 6c 65 20 2a 2f 0a 20 20 75 6e 69 78  e file */.  unix
1d70: 53 68 6d 20 2a 70 53 68 6d 3b 20 20 20 20 20 20  Shm *pShm;      
1d80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d90: 2f 2a 20 53 68 61 72 65 64 20 6d 65 6d 6f 72 79  /* Shared memory
1da0: 20 73 65 67 6d 65 6e 74 20 69 6e 66 6f 72 6d 61   segment informa
1db0: 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 73 7a  tion */.  int sz
1dc0: 43 68 75 6e 6b 3b 20 20 20 20 20 20 20 20 20 20  Chunk;          
1dd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1de0: 20 43 6f 6e 66 69 67 75 72 65 64 20 62 79 20 46   Configured by F
1df0: 43 4e 54 4c 5f 43 48 55 4e 4b 5f 53 49 5a 45 20  CNTL_CHUNK_SIZE 
1e00: 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f 45 4e  */.#if SQLITE_EN
1e10: 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59  ABLE_LOCKING_STY
1e20: 4c 45 0a 20 20 69 6e 74 20 6f 70 65 6e 46 6c 61  LE.  int openFla
1e30: 67 73 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  gs;             
1e40: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
1e50: 66 6c 61 67 73 20 73 70 65 63 69 66 69 65 64 20  flags specified 
1e60: 61 74 20 6f 70 65 6e 28 29 20 2a 2f 0a 23 65 6e  at open() */.#en
1e70: 64 69 66 0a 23 69 66 20 53 51 4c 49 54 45 5f 45  dif.#if SQLITE_E
1e80: 4e 41 42 4c 45 5f 44 41 54 41 5f 50 52 4f 54 45  NABLE_DATA_PROTE
1e90: 43 54 49 4f 4e 0a 20 20 69 6e 74 20 70 72 6f 74  CTION.  int prot
1ea0: 46 6c 61 67 73 3b 20 20 20 20 20 20 20 20 20 20  Flags;          
1eb0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44              /* D
1ec0: 61 74 61 20 70 72 6f 74 65 63 74 69 6f 6e 20 66  ata protection f
1ed0: 6c 61 67 73 20 66 72 6f 6d 20 75 6e 69 78 4f 70  lags from unixOp
1ee0: 65 6e 20 2a 2f 0a 23 65 6e 64 69 66 0a 23 69 66  en */.#endif.#if
1ef0: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c   SQLITE_ENABLE_L
1f00: 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 7c 7c 20  OCKING_STYLE || 
1f10: 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f  defined(__APPLE_
1f20: 5f 29 0a 20 20 75 6e 73 69 67 6e 65 64 20 66 73  _).  unsigned fs
1f30: 46 6c 61 67 73 3b 20 20 20 20 20 20 20 20 20 20  Flags;          
1f40: 20 20 20 20 20 20 20 20 20 2f 2a 20 63 61 63 68           /* cach
1f50: 65 64 20 64 65 74 61 69 6c 73 20 66 72 6f 6d 20  ed details from 
1f60: 73 74 61 74 66 73 28 29 20 2a 2f 0a 23 65 6e 64  statfs() */.#end
1f70: 69 66 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b  if.#if OS_VXWORK
1f80: 53 0a 20 20 69 6e 74 20 69 73 44 65 6c 65 74 65  S.  int isDelete
1f90: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1fa0: 20 20 20 20 20 20 20 20 2f 2a 20 44 65 6c 65 74          /* Delet
1fb0: 65 20 6f 6e 20 63 6c 6f 73 65 20 69 66 20 74 72  e on close if tr
1fc0: 75 65 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 76  ue */.  struct v
1fd0: 78 77 6f 72 6b 73 46 69 6c 65 49 64 20 2a 70 49  xworksFileId *pI
1fe0: 64 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55  d;          /* U
1ff0: 6e 69 71 75 65 20 66 69 6c 65 20 49 44 20 2a 2f  nique file ID */
2000: 0a 23 65 6e 64 69 66 0a 23 69 66 6e 64 65 66 20  .#endif.#ifndef 
2010: 4e 44 45 42 55 47 0a 20 20 2f 2a 20 54 68 65 20  NDEBUG.  /* The 
2020: 6e 65 78 74 20 67 72 6f 75 70 20 6f 66 20 76 61  next group of va
2030: 72 69 61 62 6c 65 73 20 61 72 65 20 75 73 65 64  riables are used
2040: 20 74 6f 20 74 72 61 63 6b 20 77 68 65 74 68 65   to track whethe
2050: 72 20 6f 72 20 6e 6f 74 20 74 68 65 0a 20 20 2a  r or not the.  *
2060: 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f  * transaction co
2070: 75 6e 74 65 72 20 69 6e 20 62 79 74 65 73 20 32  unter in bytes 2
2080: 34 2d 32 37 20 6f 66 20 64 61 74 61 62 61 73 65  4-27 of database
2090: 20 66 69 6c 65 73 20 61 72 65 20 75 70 64 61 74   files are updat
20a0: 65 64 0a 20 20 2a 2a 20 77 68 65 6e 65 76 65 72  ed.  ** whenever
20b0: 20 61 6e 79 20 70 61 72 74 20 6f 66 20 74 68 65   any part of the
20c0: 20 64 61 74 61 62 61 73 65 20 63 68 61 6e 67 65   database change
20d0: 73 2e 20 20 41 6e 20 61 73 73 65 72 74 69 6f 6e  s.  An assertion
20e0: 20 66 61 75 6c 74 20 77 69 6c 6c 0a 20 20 2a 2a   fault will.  **
20f0: 20 6f 63 63 75 72 20 69 66 20 61 20 66 69 6c 65   occur if a file
2100: 20 69 73 20 75 70 64 61 74 65 64 20 77 69 74 68   is updated with
2110: 6f 75 74 20 61 6c 73 6f 20 75 70 64 61 74 69 6e  out also updatin
2120: 67 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  g the transactio
2130: 6e 0a 20 20 2a 2a 20 63 6f 75 6e 74 65 72 2e 20  n.  ** counter. 
2140: 20 54 68 69 73 20 74 65 73 74 20 69 73 20 6d 61   This test is ma
2150: 64 65 20 74 6f 20 61 76 6f 69 64 20 6e 65 77 20  de to avoid new 
2160: 70 72 6f 62 6c 65 6d 73 20 73 69 6d 69 6c 61 72  problems similar
2170: 20 74 6f 20 74 68 65 0a 20 20 2a 2a 20 6f 6e 65   to the.  ** one
2180: 20 64 65 73 63 72 69 62 65 64 20 62 79 20 74 69   described by ti
2190: 63 6b 65 74 20 23 33 35 38 34 2e 20 0a 20 20 2a  cket #3584. .  *
21a0: 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  /.  unsigned cha
21b0: 72 20 74 72 61 6e 73 43 6e 74 72 43 68 6e 67 3b  r transCntrChng;
21c0: 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68     /* True if th
21d0: 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f  e transaction co
21e0: 75 6e 74 65 72 20 63 68 61 6e 67 65 64 20 2a 2f  unter changed */
21f0: 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
2200: 20 64 62 55 70 64 61 74 65 3b 20 20 20 20 20 20   dbUpdate;      
2210: 20 20 2f 2a 20 54 72 75 65 20 69 66 20 61 6e 79    /* True if any
2220: 20 70 61 72 74 20 6f 66 20 64 61 74 61 62 61 73   part of databas
2230: 65 20 66 69 6c 65 20 63 68 61 6e 67 65 64 20 2a  e file changed *
2240: 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  /.  unsigned cha
2250: 72 20 69 6e 4e 6f 72 6d 61 6c 57 72 69 74 65 3b  r inNormalWrite;
2260: 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 69 6e     /* True if in
2270: 20 61 20 6e 6f 72 6d 61 6c 20 77 72 69 74 65 20   a normal write 
2280: 6f 70 65 72 61 74 69 6f 6e 20 2a 2f 0a 23 65 6e  operation */.#en
2290: 64 69 66 0a 23 69 66 64 65 66 20 53 51 4c 49 54  dif.#ifdef SQLIT
22a0: 45 5f 54 45 53 54 0a 20 20 2f 2a 20 49 6e 20 74  E_TEST.  /* In t
22b0: 65 73 74 20 6d 6f 64 65 2c 20 69 6e 63 72 65 61  est mode, increa
22c0: 73 65 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74  se the size of t
22d0: 68 69 73 20 73 74 72 75 63 74 75 72 65 20 61 20  his structure a 
22e0: 62 69 74 20 73 6f 20 74 68 61 74 20 0a 20 20 2a  bit so that .  *
22f0: 2a 20 69 74 20 69 73 20 6c 61 72 67 65 72 20 74  * it is larger t
2300: 68 61 6e 20 74 68 65 20 73 74 72 75 63 74 20 43  han the struct C
2310: 72 61 73 68 46 69 6c 65 20 64 65 66 69 6e 65 64  rashFile defined
2320: 20 69 6e 20 74 65 73 74 36 2e 63 2e 0a 20 20 2a   in test6.c..  *
2330: 2f 0a 20 20 63 68 61 72 20 61 50 61 64 64 69 6e  /.  char aPaddin
2340: 67 5b 33 32 5d 3b 0a 23 65 6e 64 69 66 0a 7d 3b  g[32];.#endif.};
2350: 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 77 65 64 20  ../*.** Allowed 
2360: 76 61 6c 75 65 73 20 66 6f 72 20 74 68 65 20 75  values for the u
2370: 6e 69 78 46 69 6c 65 2e 63 74 72 6c 46 6c 61 67  nixFile.ctrlFlag
2380: 73 20 62 69 74 6d 61 73 6b 3a 0a 2a 2f 0a 23 64  s bitmask:.*/.#d
2390: 65 66 69 6e 65 20 55 4e 49 58 46 49 4c 45 5f 45  efine UNIXFILE_E
23a0: 58 43 4c 20 20 20 20 20 20 20 20 30 78 30 31 20  XCL        0x01 
23b0: 20 20 20 20 2f 2a 20 43 6f 6e 6e 65 63 74 69 6f      /* Connectio
23c0: 6e 73 20 66 72 6f 6d 20 6f 6e 65 20 70 72 6f 63  ns from one proc
23d0: 65 73 73 20 6f 6e 6c 79 20 2a 2f 0a 23 64 65 66  ess only */.#def
23e0: 69 6e 65 20 55 4e 49 58 46 49 4c 45 5f 52 44 4f  ine UNIXFILE_RDO
23f0: 4e 4c 59 20 20 20 20 20 20 30 78 30 32 20 20 20  NLY      0x02   
2400: 20 20 2f 2a 20 43 6f 6e 6e 65 63 74 69 6f 6e 20    /* Connection 
2410: 69 73 20 72 65 61 64 20 6f 6e 6c 79 20 2a 2f 0a  is read only */.
2420: 23 64 65 66 69 6e 65 20 55 4e 49 58 46 49 4c 45  #define UNIXFILE
2430: 5f 50 45 52 53 49 53 54 5f 57 41 4c 20 30 78 30  _PERSIST_WAL 0x0
2440: 34 20 20 20 20 20 2f 2a 20 50 65 72 73 69 73 74  4     /* Persist
2450: 65 6e 74 20 57 41 4c 20 6d 6f 64 65 20 2a 2f 0a  ent WAL mode */.
2460: 23 64 65 66 69 6e 65 20 55 4e 49 58 46 49 4c 45  #define UNIXFILE
2470: 5f 44 49 52 53 59 4e 43 20 20 20 20 20 30 78 30  _DIRSYNC     0x0
2480: 38 20 20 20 20 20 2f 2a 20 44 69 72 65 63 74 6f  8     /* Directo
2490: 72 79 20 73 79 6e 63 20 6e 65 65 64 65 64 20 2a  ry sync needed *
24a0: 2f 0a 0a 2f 2a 0a 2a 2a 20 49 6e 63 6c 75 64 65  /../*.** Include
24b0: 20 63 6f 64 65 20 74 68 61 74 20 69 73 20 63 6f   code that is co
24c0: 6d 6d 6f 6e 20 74 6f 20 61 6c 6c 20 6f 73 5f 2a  mmon to all os_*
24d0: 2e 63 20 66 69 6c 65 73 0a 2a 2f 0a 23 69 6e 63  .c files.*/.#inc
24e0: 6c 75 64 65 20 22 6f 73 5f 63 6f 6d 6d 6f 6e 2e  lude "os_common.
24f0: 68 22 0a 0a 2f 2a 0a 2a 2a 20 44 65 66 69 6e 65  h"../*.** Define
2500: 20 76 61 72 69 6f 75 73 20 6d 61 63 72 6f 73 20   various macros 
2510: 74 68 61 74 20 61 72 65 20 6d 69 73 73 69 6e 67  that are missing
2520: 20 66 72 6f 6d 20 73 6f 6d 65 20 73 79 73 74 65   from some syste
2530: 6d 73 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 4f  ms..*/.#ifndef O
2540: 5f 4c 41 52 47 45 46 49 4c 45 0a 23 20 64 65 66  _LARGEFILE.# def
2550: 69 6e 65 20 4f 5f 4c 41 52 47 45 46 49 4c 45 20  ine O_LARGEFILE 
2560: 30 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20  0.#endif.#ifdef 
2570: 53 51 4c 49 54 45 5f 44 49 53 41 42 4c 45 5f 4c  SQLITE_DISABLE_L
2580: 46 53 0a 23 20 75 6e 64 65 66 20 4f 5f 4c 41 52  FS.# undef O_LAR
2590: 47 45 46 49 4c 45 0a 23 20 64 65 66 69 6e 65 20  GEFILE.# define 
25a0: 4f 5f 4c 41 52 47 45 46 49 4c 45 20 30 0a 23 65  O_LARGEFILE 0.#e
25b0: 6e 64 69 66 0a 23 69 66 6e 64 65 66 20 4f 5f 4e  ndif.#ifndef O_N
25c0: 4f 46 4f 4c 4c 4f 57 0a 23 20 64 65 66 69 6e 65  OFOLLOW.# define
25d0: 20 4f 5f 4e 4f 46 4f 4c 4c 4f 57 20 30 0a 23 65   O_NOFOLLOW 0.#e
25e0: 6e 64 69 66 0a 23 69 66 6e 64 65 66 20 4f 5f 42  ndif.#ifndef O_B
25f0: 49 4e 41 52 59 0a 23 20 64 65 66 69 6e 65 20 4f  INARY.# define O
2600: 5f 42 49 4e 41 52 59 20 30 0a 23 65 6e 64 69 66  _BINARY 0.#endif
2610: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 74 68 72 65  ../*.** The thre
2620: 61 64 69 64 20 6d 61 63 72 6f 20 72 65 73 6f 6c  adid macro resol
2630: 76 65 73 20 74 6f 20 74 68 65 20 74 68 72 65 61  ves to the threa
2640: 64 2d 69 64 20 6f 72 20 74 6f 20 30 2e 20 20 55  d-id or to 0.  U
2650: 73 65 64 20 66 6f 72 0a 2a 2a 20 74 65 73 74 69  sed for.** testi
2660: 6e 67 20 61 6e 64 20 64 65 62 75 67 67 69 6e 67  ng and debugging
2670: 20 6f 6e 6c 79 2e 0a 2a 2f 0a 23 69 66 20 53 51   only..*/.#if SQ
2680: 4c 49 54 45 5f 54 48 52 45 41 44 53 41 46 45 0a  LITE_THREADSAFE.
2690: 23 64 65 66 69 6e 65 20 74 68 72 65 61 64 69 64  #define threadid
26a0: 20 70 74 68 72 65 61 64 5f 73 65 6c 66 28 29 0a   pthread_self().
26b0: 23 65 6c 73 65 0a 23 64 65 66 69 6e 65 20 74 68  #else.#define th
26c0: 72 65 61 64 69 64 20 30 0a 23 65 6e 64 69 66 0a  readid 0.#endif.
26d0: 0a 23 69 66 64 65 66 20 5f 5f 41 50 50 4c 45 5f  .#ifdef __APPLE_
26e0: 5f 0a 23 64 65 66 69 6e 65 20 53 51 4c 49 54 45  _.#define SQLITE
26f0: 5f 45 4e 41 42 4c 45 5f 53 55 50 45 52 4c 4f 43  _ENABLE_SUPERLOC
2700: 4b 20 31 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20  K 1.#endif..#if 
2710: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 55  SQLITE_ENABLE_SU
2720: 50 45 52 4c 4f 43 4b 0a 23 69 6e 63 6c 75 64 65  PERLOCK.#include
2730: 20 22 73 71 6c 69 74 65 33 2e 68 22 0a 23 69 6e   "sqlite3.h".#in
2740: 63 6c 75 64 65 20 3c 73 74 72 69 6e 67 2e 68 3e  clude <string.h>
2750: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2760: 2a 20 6d 65 6d 73 65 74 28 29 2c 20 73 74 72 6c  * memset(), strl
2770: 65 6e 28 29 20 2a 2f 0a 23 69 6e 63 6c 75 64 65  en() */.#include
2780: 20 3c 61 73 73 65 72 74 2e 68 3e 20 20 20 20 20   <assert.h>     
2790: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 61 73 73            /* ass
27a0: 65 72 74 28 29 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  ert() */../*.** 
27b0: 41 20 73 74 72 75 63 74 75 72 65 20 74 6f 20 63  A structure to c
27c0: 6f 6c 6c 65 63 74 20 61 20 62 75 73 79 2d 68 61  ollect a busy-ha
27d0: 6e 64 6c 65 72 20 63 61 6c 6c 62 61 63 6b 20 61  ndler callback a
27e0: 6e 64 20 61 72 67 75 6d 65 6e 74 20 61 6e 64 20  nd argument and 
27f0: 61 20 63 6f 75 6e 74 0a 2a 2a 20 6f 66 20 74 68  a count.** of th
2800: 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 69 6d 65  e number of time
2810: 73 20 69 74 20 68 61 73 20 62 65 65 6e 20 69 6e  s it has been in
2820: 76 6f 6b 65 64 2e 0a 2a 2f 0a 73 74 72 75 63 74  voked..*/.struct
2830: 20 53 75 70 65 72 6c 6f 63 6b 42 75 73 79 20 7b   SuperlockBusy {
2840: 0a 20 20 69 6e 74 20 28 2a 78 42 75 73 79 29 28  .  int (*xBusy)(
2850: 76 6f 69 64 2a 2c 69 6e 74 29 3b 20 20 20 20 20  void*,int);     
2860: 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f     /* Pointer to
2870: 20 62 75 73 79 2d 68 61 6e 64 6c 65 72 20 66 75   busy-handler fu
2880: 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 76 6f 69 64  nction */.  void
2890: 20 2a 70 42 75 73 79 41 72 67 3b 20 20 20 20 20   *pBusyArg;     
28a0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
28b0: 69 72 73 74 20 61 72 67 20 74 6f 20 70 61 73 73  irst arg to pass
28c0: 20 74 6f 20 78 42 75 73 79 20 2a 2f 0a 20 20 69   to xBusy */.  i
28d0: 6e 74 20 6e 42 75 73 79 3b 20 20 20 20 20 20 20  nt nBusy;       
28e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
28f0: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 74 69 6d 65  * Number of time
2900: 73 20 78 42 75 73 79 20 68 61 73 20 62 65 65 6e  s xBusy has been
2910: 20 69 6e 76 6f 6b 65 64 20 2a 2f 0a 7d 3b 0a 74   invoked */.};.t
2920: 79 70 65 64 65 66 20 73 74 72 75 63 74 20 53 75  ypedef struct Su
2930: 70 65 72 6c 6f 63 6b 42 75 73 79 20 53 75 70 65  perlockBusy Supe
2940: 72 6c 6f 63 6b 42 75 73 79 3b 0a 0a 2f 2a 0a 2a  rlockBusy;../*.*
2950: 2a 20 41 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66  * An instance of
2960: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73   the following s
2970: 74 72 75 63 74 75 72 65 20 69 73 20 61 6c 6c 6f  tructure is allo
2980: 63 61 74 65 64 20 66 6f 72 20 65 61 63 68 20 61  cated for each a
2990: 63 74 69 76 65 0a 2a 2a 20 73 75 70 65 72 6c 6f  ctive.** superlo
29a0: 63 6b 2e 20 54 68 65 20 6f 70 61 71 75 65 20 68  ck. The opaque h
29b0: 61 6e 64 6c 65 20 72 65 74 75 72 6e 65 64 20 62  andle returned b
29c0: 79 20 73 71 6c 69 74 65 33 64 65 6d 6f 5f 73 75  y sqlite3demo_su
29d0: 70 65 72 6c 6f 63 6b 28 29 20 69 73 0a 2a 2a 20  perlock() is.** 
29e0: 61 63 74 75 61 6c 6c 79 20 61 20 70 6f 69 6e 74  actually a point
29f0: 65 72 20 74 6f 20 61 6e 20 69 6e 73 74 61 6e 63  er to an instanc
2a00: 65 20 6f 66 20 74 68 69 73 20 73 74 72 75 63 74  e of this struct
2a10: 75 72 65 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 53  ure..*/.struct S
2a20: 75 70 65 72 6c 6f 63 6b 20 7b 0a 20 20 73 71 6c  uperlock {.  sql
2a30: 69 74 65 33 20 2a 64 62 3b 20 20 20 20 20 20 20  ite3 *db;       
2a40: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2a50: 44 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20  Database handle 
2a60: 75 73 65 64 20 74 6f 20 6c 6f 63 6b 20 64 62 20  used to lock db 
2a70: 2a 2f 0a 20 20 69 6e 74 20 62 57 61 6c 3b 20 20  */.  int bWal;  
2a80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a90: 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
2aa0: 64 62 20 69 73 20 61 20 57 41 4c 20 64 61 74 61  db is a WAL data
2ab0: 62 61 73 65 20 2a 2f 0a 7d 3b 0a 74 79 70 65 64  base */.};.typed
2ac0: 65 66 20 73 74 72 75 63 74 20 53 75 70 65 72 6c  ef struct Superl
2ad0: 6f 63 6b 20 53 75 70 65 72 6c 6f 63 6b 3b 0a 0a  ock Superlock;..
2ae0: 2f 2a 0a 2a 2a 20 54 68 65 20 70 43 74 78 20 70  /*.** The pCtx p
2af0: 6f 69 6e 74 65 72 20 70 61 73 73 65 64 20 74 6f  ointer passed to
2b00: 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   this function i
2b10: 73 20 61 63 74 75 61 6c 6c 79 20 61 20 70 6f 69  s actually a poi
2b20: 6e 74 65 72 20 74 6f 20 61 0a 2a 2a 20 53 75 70  nter to a.** Sup
2b30: 65 72 6c 6f 63 6b 42 75 73 79 20 73 74 72 75 63  erlockBusy struc
2b40: 74 75 72 65 2e 20 49 6e 76 6f 6b 65 20 74 68 65  ture. Invoke the
2b50: 20 62 75 73 79 2d 68 61 6e 64 6c 65 72 20 66 75   busy-handler fu
2b60: 6e 63 74 69 6f 6e 20 65 6e 63 61 70 73 75 6c 61  nction encapsula
2b70: 74 65 64 0a 2a 2a 20 62 79 20 74 68 65 20 73 74  ted.** by the st
2b80: 72 75 63 74 75 72 65 20 61 6e 64 20 72 65 74 75  ructure and retu
2b90: 72 6e 20 74 68 65 20 72 65 73 75 6c 74 2e 0a 2a  rn the result..*
2ba0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 75 70  /.static int sup
2bb0: 65 72 6c 6f 63 6b 42 75 73 79 48 61 6e 64 6c 65  erlockBusyHandle
2bc0: 72 28 76 6f 69 64 20 2a 70 43 74 78 2c 20 69 6e  r(void *pCtx, in
2bd0: 74 20 55 4e 55 53 45 44 29 7b 0a 20 20 53 75 70  t UNUSED){.  Sup
2be0: 65 72 6c 6f 63 6b 42 75 73 79 20 2a 70 42 75 73  erlockBusy *pBus
2bf0: 79 20 3d 20 28 53 75 70 65 72 6c 6f 63 6b 42 75  y = (SuperlockBu
2c00: 73 79 20 2a 29 70 43 74 78 3b 0a 20 20 69 66 28  sy *)pCtx;.  if(
2c10: 20 70 42 75 73 79 2d 3e 78 42 75 73 79 3d 3d 30   pBusy->xBusy==0
2c20: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 72   ) return 0;.  r
2c30: 65 74 75 72 6e 20 70 42 75 73 79 2d 3e 78 42 75  eturn pBusy->xBu
2c40: 73 79 28 70 42 75 73 79 2d 3e 70 42 75 73 79 41  sy(pBusy->pBusyA
2c50: 72 67 2c 20 70 42 75 73 79 2d 3e 6e 42 75 73 79  rg, pBusy->nBusy
2c60: 2b 2b 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  ++);.}../*.** Th
2c70: 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 75  is function is u
2c80: 73 65 64 20 74 6f 20 64 65 74 65 72 6d 69 6e 65  sed to determine
2c90: 20 69 66 20 74 68 65 20 6d 61 69 6e 20 64 61 74   if the main dat
2ca0: 61 62 61 73 65 20 66 69 6c 65 20 66 6f 72 20 0a  abase file for .
2cb0: 2a 2a 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 64 62  ** connection db
2cc0: 20 69 73 20 6f 70 65 6e 20 69 6e 20 57 41 4c 20   is open in WAL 
2cd0: 6d 6f 64 65 20 6f 72 20 6e 6f 74 2e 20 49 66 20  mode or not. If 
2ce0: 6e 6f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20  no error occurs 
2cf0: 61 6e 64 20 74 68 65 0a 2a 2a 20 64 61 74 61 62  and the.** datab
2d00: 61 73 65 20 66 69 6c 65 20 69 73 20 69 6e 20 57  ase file is in W
2d10: 41 4c 20 6d 6f 64 65 2c 20 73 65 74 20 2a 70 62  AL mode, set *pb
2d20: 57 61 6c 20 74 6f 20 74 72 75 65 20 61 6e 64 20  Wal to true and 
2d30: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
2d40: 2e 0a 2a 2a 20 49 66 20 69 74 20 69 73 20 6e 6f  ..** If it is no
2d50: 74 20 69 6e 20 57 41 4c 20 6d 6f 64 65 2c 20 73  t in WAL mode, s
2d60: 65 74 20 2a 70 62 57 61 6c 20 74 6f 20 66 61 6c  et *pbWal to fal
2d70: 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20  se..**.** If an 
2d80: 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 72 65  error occurs, re
2d90: 74 75 72 6e 20 61 6e 20 53 51 4c 69 74 65 20 65  turn an SQLite e
2da0: 72 72 6f 72 20 63 6f 64 65 2e 20 54 68 65 20 76  rror code. The v
2db0: 61 6c 75 65 20 6f 66 20 2a 70 62 57 61 6c 0a 2a  alue of *pbWal.*
2dc0: 2a 20 69 73 20 75 6e 64 65 66 69 6e 65 64 20 69  * is undefined i
2dd0: 6e 20 74 68 69 73 20 63 61 73 65 2e 0a 2a 2f 0a  n this case..*/.
2de0: 73 74 61 74 69 63 20 69 6e 74 20 73 75 70 65 72  static int super
2df0: 6c 6f 63 6b 49 73 57 61 6c 28 53 75 70 65 72 6c  lockIsWal(Superl
2e00: 6f 63 6b 20 2a 70 4c 6f 63 6b 29 7b 0a 20 20 69  ock *pLock){.  i
2e10: 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20  nt rc;          
2e20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2e30: 2a 20 52 65 74 75 72 6e 20 43 6f 64 65 20 2a 2f  * Return Code */
2e40: 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20  .  sqlite3_stmt 
2e50: 2a 70 53 74 6d 74 3b 20 20 20 20 20 20 20 20 20  *pStmt;         
2e60: 20 20 20 2f 2a 20 43 6f 6d 70 69 6c 65 64 20 50     /* Compiled P
2e70: 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f  RAGMA journal_mo
2e80: 64 65 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a  de statement */.
2e90: 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f  .  rc = sqlite3_
2ea0: 70 72 65 70 61 72 65 28 70 4c 6f 63 6b 2d 3e 64  prepare(pLock->d
2eb0: 62 2c 20 22 50 52 41 47 4d 41 20 6d 61 69 6e 2e  b, "PRAGMA main.
2ec0: 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 22 2c 20 2d  journal_mode", -
2ed0: 31 2c 20 26 70 53 74 6d 74 2c 20 30 29 3b 0a 20  1, &pStmt, 0);. 
2ee0: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
2ef0: 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  OK ) return rc;.
2f00: 0a 20 20 70 4c 6f 63 6b 2d 3e 62 57 61 6c 20 3d  .  pLock->bWal =
2f10: 20 30 3b 0a 20 20 69 66 28 20 53 51 4c 49 54 45   0;.  if( SQLITE
2f20: 5f 52 4f 57 3d 3d 73 71 6c 69 74 65 33 5f 73 74  _ROW==sqlite3_st
2f30: 65 70 28 70 53 74 6d 74 29 20 29 7b 0a 20 20 20  ep(pStmt) ){.   
2f40: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4d 6f   const char *zMo
2f50: 64 65 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72  de = (const char
2f60: 20 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d   *)sqlite3_colum
2f70: 6e 5f 74 65 78 74 28 70 53 74 6d 74 2c 20 30 29  n_text(pStmt, 0)
2f80: 3b 0a 20 20 20 20 69 66 28 20 7a 4d 6f 64 65 20  ;.    if( zMode 
2f90: 26 26 20 73 74 72 6c 65 6e 28 7a 4d 6f 64 65 29  && strlen(zMode)
2fa0: 3d 3d 33 20 26 26 20 73 71 6c 69 74 65 33 5f 73  ==3 && sqlite3_s
2fb0: 74 72 6e 69 63 6d 70 28 22 77 61 6c 22 2c 20 7a  trnicmp("wal", z
2fc0: 4d 6f 64 65 2c 20 33 29 3d 3d 30 20 29 7b 0a 20  Mode, 3)==0 ){. 
2fd0: 20 20 20 20 20 70 4c 6f 63 6b 2d 3e 62 57 61 6c       pLock->bWal
2fe0: 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   = 1;.    }.  }.
2ff0: 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65  .  return sqlite
3000: 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74  3_finalize(pStmt
3010: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 62 74 61  );.}../*.** Obta
3020: 69 6e 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20  in an exclusive 
3030: 73 68 6d 2d 6c 6f 63 6b 20 6f 6e 20 6e 42 79 74  shm-lock on nByt
3040: 65 20 62 79 74 65 73 20 73 74 61 72 74 69 6e 67  e bytes starting
3050: 20 61 74 20 6f 66 66 73 65 74 20 69 64 78 0a 2a   at offset idx.*
3060: 2a 20 6f 66 20 74 68 65 20 66 69 6c 65 20 66 64  * of the file fd
3070: 2e 20 49 66 20 74 68 65 20 6c 6f 63 6b 20 63 61  . If the lock ca
3080: 6e 6e 6f 74 20 62 65 20 6f 62 74 61 69 6e 65 64  nnot be obtained
3090: 20 69 6d 6d 65 64 69 61 74 65 6c 79 2c 20 69 6e   immediately, in
30a0: 76 6f 6b 65 0a 2a 2a 20 74 68 65 20 62 75 73 79  voke.** the busy
30b0: 2d 68 61 6e 64 6c 65 72 20 75 6e 74 69 6c 20 65  -handler until e
30c0: 69 74 68 65 72 20 69 74 20 69 73 20 6f 62 74 61  ither it is obta
30d0: 69 6e 65 64 20 6f 72 20 74 68 65 20 62 75 73 79  ined or the busy
30e0: 2d 68 61 6e 64 6c 65 72 0a 2a 2a 20 63 61 6c 6c  -handler.** call
30f0: 62 61 63 6b 20 72 65 74 75 72 6e 73 20 30 2e 0a  back returns 0..
3100: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 75  */.static int su
3110: 70 65 72 6c 6f 63 6b 53 68 6d 4c 6f 63 6b 28 0a  perlockShmLock(.
3120: 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a    sqlite3_file *
3130: 66 64 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  fd,             
3140: 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 66 69    /* Database fi
3150: 6c 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 69  le handle */.  i
3160: 6e 74 20 69 64 78 2c 20 20 20 20 20 20 20 20 20  nt idx,         
3170: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
3180: 2a 20 4f 66 66 73 65 74 20 6f 66 20 73 68 6d 2d  * Offset of shm-
3190: 6c 6f 63 6b 20 74 6f 20 6f 62 74 61 69 6e 20 2a  lock to obtain *
31a0: 2f 0a 20 20 69 6e 74 20 6e 42 79 74 65 2c 20 20  /.  int nByte,  
31b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31c0: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
31d0: 20 63 6f 6e 73 65 63 74 69 76 65 20 62 79 74 65   consective byte
31e0: 73 20 74 6f 20 6c 6f 63 6b 20 2a 2f 0a 20 20 53  s to lock */.  S
31f0: 75 70 65 72 6c 6f 63 6b 42 75 73 79 20 2a 70 42  uperlockBusy *pB
3200: 75 73 79 20 20 20 20 20 20 20 20 20 20 20 20 2f  usy            /
3210: 2a 20 42 75 73 79 2d 68 61 6e 64 6c 65 72 20 77  * Busy-handler w
3220: 72 61 70 70 65 72 20 6f 62 6a 65 63 74 20 2a 2f  rapper object */
3230: 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  .){.  int rc;.  
3240: 69 6e 74 20 28 2a 78 53 68 6d 4c 6f 63 6b 29 28  int (*xShmLock)(
3250: 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 2c 20 69  sqlite3_file*, i
3260: 6e 74 2c 20 69 6e 74 2c 20 69 6e 74 29 20 3d 20  nt, int, int) = 
3270: 66 64 2d 3e 70 4d 65 74 68 6f 64 73 2d 3e 78 53  fd->pMethods->xS
3280: 68 6d 4c 6f 63 6b 3b 0a 20 20 64 6f 20 7b 0a 20  hmLock;.  do {. 
3290: 20 20 20 72 63 20 3d 20 78 53 68 6d 4c 6f 63 6b     rc = xShmLock
32a0: 28 66 64 2c 20 69 64 78 2c 20 6e 42 79 74 65 2c  (fd, idx, nByte,
32b0: 20 53 51 4c 49 54 45 5f 53 48 4d 5f 4c 4f 43 4b   SQLITE_SHM_LOCK
32c0: 7c 53 51 4c 49 54 45 5f 53 48 4d 5f 45 58 43 4c  |SQLITE_SHM_EXCL
32d0: 55 53 49 56 45 29 3b 0a 20 20 7d 77 68 69 6c 65  USIVE);.  }while
32e0: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 42 55 53  ( rc==SQLITE_BUS
32f0: 59 20 26 26 20 73 75 70 65 72 6c 6f 63 6b 42 75  Y && superlockBu
3300: 73 79 48 61 6e 64 6c 65 72 28 28 76 6f 69 64 20  syHandler((void 
3310: 2a 29 70 42 75 73 79 2c 20 30 29 20 29 3b 0a 20  *)pBusy, 0) );. 
3320: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
3330: 2a 0a 2a 2a 20 4f 62 74 61 69 6e 20 74 68 65 20  *.** Obtain the 
3340: 65 78 74 72 61 20 6c 6f 63 6b 73 20 6f 6e 20 74  extra locks on t
3350: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
3360: 20 72 65 71 75 69 72 65 64 20 66 6f 72 20 57 41   required for WA
3370: 4c 20 64 61 74 61 62 61 73 65 73 2e 0a 2a 2a 20  L databases..** 
3380: 49 6e 76 6f 6b 65 20 74 68 65 20 73 75 70 70 6c  Invoke the suppl
3390: 69 65 64 20 62 75 73 79 2d 68 61 6e 64 6c 65 72  ied busy-handler
33a0: 20 61 73 20 72 65 71 75 69 72 65 64 2e 0a 2a 2f   as required..*/
33b0: 0a 73 74 61 74 69 63 20 69 6e 74 20 73 75 70 65  .static int supe
33c0: 72 6c 6f 63 6b 57 61 6c 4c 6f 63 6b 28 0a 20 20  rlockWalLock(.  
33d0: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20  sqlite3 *db,    
33e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33f0: 2f 2a 20 44 61 74 61 62 61 73 65 20 68 61 6e 64  /* Database hand
3400: 6c 65 20 6f 70 65 6e 20 6f 6e 20 57 41 4c 20 64  le open on WAL d
3410: 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 53 75 70  atabase */.  Sup
3420: 65 72 6c 6f 63 6b 42 75 73 79 20 2a 70 42 75 73  erlockBusy *pBus
3430: 79 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  y            /* 
3440: 42 75 73 79 20 68 61 6e 64 6c 65 72 20 77 72 61  Busy handler wra
3450: 70 70 65 72 20 6f 62 6a 65 63 74 20 2a 2f 0a 29  pper object */.)
3460: 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20  {.  int rc;     
3470: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3480: 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f      /* Return co
3490: 64 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  de */.  sqlite3_
34a0: 66 69 6c 65 20 2a 66 64 20 3d 20 30 3b 20 20 20  file *fd = 0;   
34b0: 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 69 6e 20          /* Main 
34c0: 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 68 61  database file ha
34d0: 6e 64 6c 65 20 2a 2f 0a 20 20 76 6f 69 64 20 76  ndle */.  void v
34e0: 6f 6c 61 74 69 6c 65 20 2a 70 20 3d 20 30 3b 20  olatile *p = 0; 
34f0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69            /* Poi
3500: 6e 74 65 72 20 74 6f 20 66 69 72 73 74 20 70 61  nter to first pa
3510: 67 65 20 6f 66 20 73 68 61 72 65 64 20 6d 65 6d  ge of shared mem
3520: 6f 72 79 20 2a 2f 0a 0a 20 20 2f 2a 20 4f 62 74  ory */..  /* Obt
3530: 61 69 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  ain a pointer to
3540: 20 74 68 65 20 73 71 6c 69 74 65 33 5f 66 69 6c   the sqlite3_fil
3550: 65 20 6f 62 6a 65 63 74 20 6f 70 65 6e 20 6f 6e  e object open on
3560: 20 74 68 65 20 6d 61 69 6e 20 64 62 20 66 69 6c   the main db fil
3570: 65 2e 20 2a 2f 0a 20 20 72 63 20 3d 20 73 71 6c  e. */.  rc = sql
3580: 69 74 65 33 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f  ite3_file_contro
3590: 6c 28 64 62 2c 20 22 6d 61 69 6e 22 2c 20 53 51  l(db, "main", SQ
35a0: 4c 49 54 45 5f 46 43 4e 54 4c 5f 46 49 4c 45 5f  LITE_FCNTL_FILE_
35b0: 50 4f 49 4e 54 45 52 2c 20 28 76 6f 69 64 20 2a  POINTER, (void *
35c0: 29 26 66 64 29 3b 0a 20 20 69 66 28 20 72 63 21  )&fd);.  if( rc!
35d0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74  =SQLITE_OK ) ret
35e0: 75 72 6e 20 72 63 3b 0a 0a 20 20 2f 2a 20 4f 62  urn rc;..  /* Ob
35f0: 74 61 69 6e 20 74 68 65 20 22 72 65 63 6f 76 65  tain the "recove
3600: 72 79 22 20 6c 6f 63 6b 2e 20 4e 6f 72 6d 61 6c  ry" lock. Normal
3610: 6c 79 2c 20 74 68 69 73 20 6c 6f 63 6b 20 69 73  ly, this lock is
3620: 20 6f 6e 6c 79 20 6f 62 74 61 69 6e 65 64 20 62   only obtained b
3630: 79 0a 20 20 2a 2a 20 63 6c 69 65 6e 74 73 20 72  y.  ** clients r
3640: 75 6e 6e 69 6e 67 20 64 61 74 61 62 61 73 65 20  unning database 
3650: 72 65 63 6f 76 65 72 79 2e 20 20 0a 20 20 2a 2f  recovery.  .  */
3660: 0a 20 20 72 63 20 3d 20 73 75 70 65 72 6c 6f 63  .  rc = superloc
3670: 6b 53 68 6d 4c 6f 63 6b 28 66 64 2c 20 32 2c 20  kShmLock(fd, 2, 
3680: 31 2c 20 70 42 75 73 79 29 3b 0a 20 20 69 66 28  1, pBusy);.  if(
3690: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
36a0: 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 2f   return rc;..  /
36b0: 2a 20 5a 65 72 6f 20 74 68 65 20 73 74 61 72 74  * Zero the start
36c0: 20 6f 66 20 74 68 65 20 66 69 72 73 74 20 73 68   of the first sh
36d0: 61 72 65 64 2d 6d 65 6d 6f 72 79 20 70 61 67 65  ared-memory page
36e0: 2e 20 54 68 69 73 20 6d 65 61 6e 73 20 74 68 61  . This means tha
36f0: 74 20 61 6e 79 0a 20 20 2a 2a 20 63 6c 69 65 6e  t any.  ** clien
3700: 74 73 20 74 68 61 74 20 6f 70 65 6e 20 72 65 61  ts that open rea
3710: 64 20 6f 72 20 77 72 69 74 65 20 74 72 61 6e 73  d or write trans
3720: 61 63 74 69 6f 6e 73 20 66 72 6f 6d 20 74 68 69  actions from thi
3730: 73 20 70 6f 69 6e 74 20 6f 6e 20 77 69 6c 6c 0a  s point on will.
3740: 20 20 2a 2a 20 68 61 76 65 20 74 6f 20 72 75 6e    ** have to run
3750: 20 72 65 63 6f 76 65 72 79 20 62 65 66 6f 72 65   recovery before
3760: 20 70 72 6f 63 65 65 64 69 6e 67 2e 20 53 69 6e   proceeding. Sin
3770: 63 65 20 74 68 65 79 20 6e 65 65 64 20 74 68 65  ce they need the
3780: 20 22 72 65 63 6f 76 65 72 79 22 0a 20 20 2a 2a   "recovery".  **
3790: 20 6c 6f 63 6b 20 74 68 61 74 20 74 68 69 73 20   lock that this 
37a0: 70 72 6f 63 65 73 73 20 69 73 20 68 6f 6c 64 69  process is holdi
37b0: 6e 67 20 74 6f 20 64 6f 20 74 68 61 74 2c 20 6e  ng to do that, n
37c0: 6f 20 6e 65 77 20 72 65 61 64 20 6f 72 20 77 72  o new read or wr
37d0: 69 74 65 0a 20 20 2a 2a 20 74 72 61 6e 73 61 63  ite.  ** transac
37e0: 74 69 6f 6e 73 20 6d 61 79 20 6e 6f 77 20 62 65  tions may now be
37f0: 20 6f 70 65 6e 65 64 2e 20 4e 6f 72 20 63 61 6e   opened. Nor can
3800: 20 61 20 63 68 65 63 6b 70 6f 69 6e 74 20 62 65   a checkpoint be
3810: 20 72 75 6e 2c 20 66 6f 72 20 74 68 65 0a 20 20   run, for the.  
3820: 2a 2a 20 73 61 6d 65 20 72 65 61 73 6f 6e 2e 0a  ** same reason..
3830: 20 20 2a 2f 0a 20 20 72 63 20 3d 20 66 64 2d 3e    */.  rc = fd->
3840: 70 4d 65 74 68 6f 64 73 2d 3e 78 53 68 6d 4d 61  pMethods->xShmMa
3850: 70 28 66 64 2c 20 30 2c 20 33 32 2a 31 30 32 34  p(fd, 0, 32*1024
3860: 2c 20 31 2c 20 26 70 29 3b 0a 20 20 69 66 28 20  , 1, &p);.  if( 
3870: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
3880: 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 6d 65 6d  return rc;.  mem
3890: 73 65 74 28 28 76 6f 69 64 20 2a 29 70 2c 20 30  set((void *)p, 0
38a0: 2c 20 33 32 29 3b 0a 0a 20 20 2f 2a 20 4f 62 74  , 32);..  /* Obt
38b0: 61 69 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f  ain exclusive lo
38c0: 63 6b 73 20 6f 6e 20 61 6c 6c 20 74 68 65 20 22  cks on all the "
38d0: 72 65 61 64 2d 6c 6f 63 6b 22 20 73 6c 6f 74 73  read-lock" slots
38e0: 2e 20 4f 6e 63 65 20 74 68 65 73 65 20 6c 6f 63  . Once these loc
38f0: 6b 73 0a 20 20 2a 2a 20 61 72 65 20 68 65 6c 64  ks.  ** are held
3900: 2c 20 69 74 20 69 73 20 67 75 61 72 61 6e 74 65  , it is guarante
3910: 65 64 20 74 68 61 74 20 74 68 65 72 65 20 61 72  ed that there ar
3920: 65 20 6e 6f 20 61 63 74 69 76 65 20 72 65 61 64  e no active read
3930: 65 72 2c 20 77 72 69 74 65 72 20 6f 72 20 0a 20  er, writer or . 
3940: 20 2a 2a 20 63 68 65 63 6b 70 6f 69 6e 74 65 72   ** checkpointer
3950: 20 63 6c 69 65 6e 74 73 2e 0a 20 20 2a 2f 0a 20   clients..  */. 
3960: 20 72 63 20 3d 20 73 75 70 65 72 6c 6f 63 6b 53   rc = superlockS
3970: 68 6d 4c 6f 63 6b 28 66 64 2c 20 33 2c 20 53 51  hmLock(fd, 3, SQ
3980: 4c 49 54 45 5f 53 48 4d 5f 4e 4c 4f 43 4b 2d 33  LITE_SHM_NLOCK-3
3990: 2c 20 70 42 75 73 79 29 3b 0a 20 20 72 65 74 75  , pBusy);.  retu
39a0: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
39b0: 52 65 6c 65 61 73 65 20 61 20 73 75 70 65 72 6c  Release a superl
39c0: 6f 63 6b 20 68 65 6c 64 20 6f 6e 20 61 20 64 61  ock held on a da
39d0: 74 61 62 61 73 65 20 66 69 6c 65 2e 20 54 68 65  tabase file. The
39e0: 20 61 72 67 75 6d 65 6e 74 20 70 61 73 73 65 64   argument passed
39f0: 20 74 6f 20 0a 2a 2a 20 74 68 69 73 20 66 75 6e   to .** this fun
3a00: 63 74 69 6f 6e 20 6d 75 73 74 20 68 61 76 65 20  ction must have 
3a10: 62 65 65 6e 20 6f 62 74 61 69 6e 65 64 20 66 72  been obtained fr
3a20: 6f 6d 20 61 20 73 75 63 63 65 73 73 66 75 6c 20  om a successful 
3a30: 63 61 6c 6c 20 74 6f 0a 2a 2a 20 73 71 6c 69 74  call to.** sqlit
3a40: 65 33 64 65 6d 6f 5f 73 75 70 65 72 6c 6f 63 6b  e3demo_superlock
3a50: 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ()..*/.static vo
3a60: 69 64 20 73 71 6c 69 74 65 33 64 65 6d 6f 5f 73  id sqlite3demo_s
3a70: 75 70 65 72 75 6e 6c 6f 63 6b 28 76 6f 69 64 20  uperunlock(void 
3a80: 2a 70 4c 6f 63 6b 29 7b 0a 20 20 53 75 70 65 72  *pLock){.  Super
3a90: 6c 6f 63 6b 20 2a 70 20 3d 20 28 53 75 70 65 72  lock *p = (Super
3aa0: 6c 6f 63 6b 20 2a 29 70 4c 6f 63 6b 3b 0a 20 20  lock *)pLock;.  
3ab0: 69 66 28 20 70 2d 3e 62 57 61 6c 20 29 7b 0a 20  if( p->bWal ){. 
3ac0: 20 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20     int rc;      
3ad0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3ae0: 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64     /* Return cod
3af0: 65 20 2a 2f 0a 20 20 20 20 69 6e 74 20 66 6c 61  e */.    int fla
3b00: 67 73 20 3d 20 53 51 4c 49 54 45 5f 53 48 4d 5f  gs = SQLITE_SHM_
3b10: 55 4e 4c 4f 43 4b 20 7c 20 53 51 4c 49 54 45 5f  UNLOCK | SQLITE_
3b20: 53 48 4d 5f 45 58 43 4c 55 53 49 56 45 3b 0a 20  SHM_EXCLUSIVE;. 
3b30: 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20     sqlite3_file 
3b40: 2a 66 64 20 3d 20 30 3b 0a 20 20 20 20 72 63 20  *fd = 0;.    rc 
3b50: 3d 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 5f 63  = sqlite3_file_c
3b60: 6f 6e 74 72 6f 6c 28 70 2d 3e 64 62 2c 20 22 6d  ontrol(p->db, "m
3b70: 61 69 6e 22 2c 20 53 51 4c 49 54 45 5f 46 43 4e  ain", SQLITE_FCN
3b80: 54 4c 5f 46 49 4c 45 5f 50 4f 49 4e 54 45 52 2c  TL_FILE_POINTER,
3b90: 20 28 76 6f 69 64 20 2a 29 26 66 64 29 3b 0a 20   (void *)&fd);. 
3ba0: 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
3bb0: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 66 64  E_OK ){.      fd
3bc0: 2d 3e 70 4d 65 74 68 6f 64 73 2d 3e 78 53 68 6d  ->pMethods->xShm
3bd0: 4c 6f 63 6b 28 66 64 2c 20 32 2c 20 31 2c 20 66  Lock(fd, 2, 1, f
3be0: 6c 61 67 73 29 3b 0a 20 20 20 20 20 20 66 64 2d  lags);.      fd-
3bf0: 3e 70 4d 65 74 68 6f 64 73 2d 3e 78 53 68 6d 4c  >pMethods->xShmL
3c00: 6f 63 6b 28 66 64 2c 20 33 2c 20 53 51 4c 49 54  ock(fd, 3, SQLIT
3c10: 45 5f 53 48 4d 5f 4e 4c 4f 43 4b 2d 33 2c 20 66  E_SHM_NLOCK-3, f
3c20: 6c 61 67 73 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  lags);.    }.  }
3c30: 0a 20 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65  .  sqlite3_close
3c40: 28 70 2d 3e 64 62 29 3b 0a 20 20 73 71 6c 69 74  (p->db);.  sqlit
3c50: 65 33 5f 66 72 65 65 28 70 29 3b 0a 7d 0a 0a 2f  e3_free(p);.}../
3c60: 2a 0a 2a 2a 20 4f 62 74 61 69 6e 20 61 20 73 75  *.** Obtain a su
3c70: 70 65 72 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64  perlock on the d
3c80: 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 64 65  atabase file ide
3c90: 6e 74 69 66 69 65 64 20 62 79 20 7a 50 61 74 68  ntified by zPath
3ca0: 2c 20 75 73 69 6e 67 20 74 68 65 0a 2a 2a 20 6c  , using the.** l
3cb0: 6f 63 6b 69 6e 67 20 70 72 69 6d 69 74 69 76 65  ocking primitive
3cc0: 73 20 70 72 6f 76 69 64 65 64 20 62 79 20 56 46  s provided by VF
3cd0: 53 20 7a 56 66 73 2e 20 49 66 20 73 75 63 63 65  S zVfs. If succe
3ce0: 73 73 66 75 6c 2c 20 53 51 4c 49 54 45 5f 4f 4b  ssful, SQLITE_OK
3cf0: 20 69 73 0a 2a 2a 20 72 65 74 75 72 6e 65 64 20   is.** returned 
3d00: 61 6e 64 20 6f 75 74 70 75 74 20 76 61 72 69 61  and output varia
3d10: 62 6c 65 20 2a 70 70 4c 6f 63 6b 20 69 73 20 70  ble *ppLock is p
3d20: 6f 70 75 6c 61 74 65 64 20 77 69 74 68 20 61 6e  opulated with an
3d30: 20 6f 70 61 71 75 65 20 68 61 6e 64 6c 65 0a 2a   opaque handle.*
3d40: 2a 20 74 68 61 74 20 6d 61 79 20 62 65 20 75 73  * that may be us
3d50: 65 64 20 77 69 74 68 20 73 71 6c 69 74 65 33 64  ed with sqlite3d
3d60: 65 6d 6f 5f 73 75 70 65 72 75 6e 6c 6f 63 6b 28  emo_superunlock(
3d70: 29 20 74 6f 20 72 65 6c 65 61 73 65 20 74 68 65  ) to release the
3d80: 20 6c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   lock..**.** If 
3d90: 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c  an error occurs,
3da0: 20 2a 70 70 4c 6f 63 6b 20 69 73 20 73 65 74 20   *ppLock is set 
3db0: 74 6f 20 30 20 61 6e 64 20 61 6e 20 53 51 4c 69  to 0 and an SQLi
3dc0: 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20 0a 2a  te error code .*
3dd0: 2a 20 28 65 2e 67 2e 20 53 51 4c 49 54 45 5f 42  * (e.g. SQLITE_B
3de0: 55 53 59 29 20 69 73 20 72 65 74 75 72 6e 65 64  USY) is returned
3df0: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 72 65 71  ..**.** If a req
3e00: 75 69 72 65 64 20 6c 6f 63 6b 20 63 61 6e 6e 6f  uired lock canno
3e10: 74 20 62 65 20 6f 62 74 61 69 6e 65 64 20 69 6d  t be obtained im
3e20: 6d 65 64 69 61 74 65 6c 79 20 61 6e 64 20 74 68  mediately and th
3e30: 65 20 78 42 75 73 79 20 70 61 72 61 6d 65 74 65  e xBusy paramete
3e40: 72 0a 2a 2a 20 74 6f 20 74 68 69 73 20 66 75 6e  r.** to this fun
3e50: 63 74 69 6f 6e 20 69 73 20 6e 6f 74 20 4e 55 4c  ction is not NUL
3e60: 4c 2c 20 74 68 65 6e 20 78 42 75 73 79 20 69 73  L, then xBusy is
3e70: 20 69 6e 76 6f 6b 65 64 20 69 6e 20 74 68 65 20   invoked in the 
3e80: 73 61 6d 65 20 77 61 79 0a 2a 2a 20 61 73 20 61  same way.** as a
3e90: 20 62 75 73 79 2d 68 61 6e 64 6c 65 72 20 72 65   busy-handler re
3ea0: 67 69 73 74 65 72 65 64 20 77 69 74 68 20 53 51  gistered with SQ
3eb0: 4c 69 74 65 20 28 75 73 69 6e 67 20 73 71 6c 69  Lite (using sqli
3ec0: 74 65 33 5f 62 75 73 79 5f 68 61 6e 64 6c 65 72  te3_busy_handler
3ed0: 28 29 29 0a 2a 2a 20 75 6e 74 69 6c 20 65 69 74  ()).** until eit
3ee0: 68 65 72 20 74 68 65 20 6c 6f 63 6b 20 63 61 6e  her the lock can
3ef0: 20 62 65 20 6f 62 74 61 69 6e 65 64 20 6f 72 20   be obtained or 
3f00: 74 68 65 20 62 75 73 79 2d 68 61 6e 64 6c 65 72  the busy-handler
3f10: 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e   function return
3f20: 73 0a 2a 2a 20 30 20 28 69 6e 64 69 63 61 74 69  s.** 0 (indicati
3f30: 6e 67 20 22 67 69 76 65 20 75 70 22 29 2e 0a 2a  ng "give up")..*
3f40: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 71 6c  /.static int sql
3f50: 69 74 65 33 64 65 6d 6f 5f 73 75 70 65 72 6c 6f  ite3demo_superlo
3f60: 63 6b 28 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  ck(.  const char
3f70: 20 2a 7a 50 61 74 68 2c 20 20 20 20 20 20 20 20   *zPath,        
3f80: 20 20 20 20 20 20 2f 2a 20 50 61 74 68 20 74 6f        /* Path to
3f90: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 74   database file t
3fa0: 6f 20 6c 6f 63 6b 20 2a 2f 0a 20 20 63 6f 6e 73  o lock */.  cons
3fb0: 74 20 63 68 61 72 20 2a 7a 56 66 73 2c 20 20 20  t char *zVfs,   
3fc0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56              /* V
3fd0: 46 53 20 74 6f 20 75 73 65 20 74 6f 20 61 63 63  FS to use to acc
3fe0: 65 73 73 20 64 61 74 61 62 61 73 65 20 66 69 6c  ess database fil
3ff0: 65 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73  e */.  int flags
4000: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
4010: 20 20 20 20 20 20 20 2f 2a 20 41 64 64 69 74 69         /* Additi
4020: 6f 6e 61 6c 20 66 6c 61 67 73 20 74 6f 20 70 61  onal flags to pa
4030: 73 73 20 74 6f 20 73 71 6c 69 74 65 33 5f 6f 70  ss to sqlite3_op
4040: 65 6e 5f 76 32 20 2a 2f 0a 20 20 69 6e 74 20 28  en_v2 */.  int (
4050: 2a 78 42 75 73 79 29 28 76 6f 69 64 2a 2c 69 6e  *xBusy)(void*,in
4060: 74 29 2c 20 20 20 20 20 20 20 20 2f 2a 20 42 75  t),        /* Bu
4070: 73 79 20 68 61 6e 64 6c 65 72 20 63 61 6c 6c 62  sy handler callb
4080: 61 63 6b 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70  ack */.  void *p
4090: 42 75 73 79 41 72 67 2c 20 20 20 20 20 20 20 20  BusyArg,        
40a0: 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e 74           /* Cont
40b0: 65 78 74 20 61 72 67 20 66 6f 72 20 62 75 73 79  ext arg for busy
40c0: 20 68 61 6e 64 6c 65 72 20 2a 2f 0a 20 20 76 6f   handler */.  vo
40d0: 69 64 20 2a 2a 70 70 4c 6f 63 6b 20 20 20 20 20  id **ppLock     
40e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
40f0: 20 4f 55 54 3a 20 43 6f 6e 74 65 78 74 20 74 6f   OUT: Context to
4100: 20 70 61 73 73 20 74 6f 20 73 75 70 65 72 75 6e   pass to superun
4110: 6c 6f 63 6b 28 29 20 2a 2f 0a 29 7b 0a 20 20 53  lock() */.){.  S
4120: 75 70 65 72 6c 6f 63 6b 42 75 73 79 20 62 75 73  uperlockBusy bus
4130: 79 20 3d 20 7b 30 2c 20 30 2c 20 30 7d 3b 20 2f  y = {0, 0, 0}; /
4140: 2a 20 42 75 73 79 20 68 61 6e 64 6c 65 72 20 77  * Busy handler w
4150: 72 61 70 70 65 72 20 6f 62 6a 65 63 74 20 2a 2f  rapper object */
4160: 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20  .  int rc;      
4170: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4180: 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64     /* Return cod
4190: 65 20 2a 2f 0a 20 20 53 75 70 65 72 6c 6f 63 6b  e */.  Superlock
41a0: 20 2a 70 4c 6f 63 6b 3b 0a 0a 20 20 70 4c 6f 63   *pLock;..  pLoc
41b0: 6b 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c  k = sqlite3_mall
41c0: 6f 63 28 73 69 7a 65 6f 66 28 53 75 70 65 72 6c  oc(sizeof(Superl
41d0: 6f 63 6b 29 29 3b 0a 20 20 69 66 28 20 21 70 4c  ock));.  if( !pL
41e0: 6f 63 6b 20 29 20 72 65 74 75 72 6e 20 53 51 4c  ock ) return SQL
41f0: 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 6d 65 6d  ITE_NOMEM;.  mem
4200: 73 65 74 28 70 4c 6f 63 6b 2c 20 30 2c 20 73 69  set(pLock, 0, si
4210: 7a 65 6f 66 28 53 75 70 65 72 6c 6f 63 6b 29 29  zeof(Superlock))
4220: 3b 0a 0a 20 20 2f 2a 20 4f 70 65 6e 20 61 20 64  ;..  /* Open a d
4230: 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20 6f  atabase handle o
4240: 6e 20 74 68 65 20 66 69 6c 65 20 74 6f 20 73 75  n the file to su
4250: 70 65 72 6c 6f 63 6b 2e 20 2a 2f 0a 20 20 72 63  perlock. */.  rc
4260: 20 3d 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 5f   = sqlite3_open_
4270: 76 32 28 0a 20 20 20 20 20 20 7a 50 61 74 68 2c  v2(.      zPath,
4280: 20 26 70 4c 6f 63 6b 2d 3e 64 62 2c 20 53 51 4c   &pLock->db, SQL
4290: 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49  ITE_OPEN_READWRI
42a0: 54 45 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43  TE|SQLITE_OPEN_C
42b0: 52 45 41 54 45 7c 66 6c 61 67 73 2c 20 7a 56 66  REATE|flags, zVf
42c0: 73 0a 20 20 29 3b 0a 0a 20 20 2f 2a 20 49 6e 73  s.  );..  /* Ins
42d0: 74 61 6c 6c 20 61 20 62 75 73 79 2d 68 61 6e 64  tall a busy-hand
42e0: 6c 65 72 20 61 6e 64 20 65 78 65 63 75 74 65 20  ler and execute 
42f0: 61 20 42 45 47 49 4e 20 45 58 43 4c 55 53 49 56  a BEGIN EXCLUSIV
4300: 45 2e 20 49 66 20 74 68 69 73 20 69 73 20 6e 6f  E. If this is no
4310: 74 0a 20 20 2a 2a 20 61 20 57 41 4c 20 64 61 74  t.  ** a WAL dat
4320: 61 62 61 73 65 2c 20 74 68 69 73 20 69 73 20 61  abase, this is a
4330: 6c 6c 20 77 65 20 6e 65 65 64 20 74 6f 20 64 6f  ll we need to do
4340: 2e 20 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 20  .  .  **.  ** A 
4350: 77 72 61 70 70 65 72 20 66 75 6e 63 74 69 6f 6e  wrapper function
4360: 20 69 73 20 75 73 65 64 20 74 6f 20 69 6e 76 6f   is used to invo
4370: 6b 65 20 74 68 65 20 62 75 73 79 2d 68 61 6e 64  ke the busy-hand
4380: 6c 65 72 20 69 6e 73 74 65 61 64 20 6f 66 0a 20  ler instead of. 
4390: 20 2a 2a 20 72 65 67 69 73 74 65 72 69 6e 67 20   ** registering 
43a0: 74 68 65 20 62 75 73 79 2d 68 61 6e 64 6c 65 72  the busy-handler
43b0: 20 66 75 6e 63 74 69 6f 6e 20 73 75 70 70 6c 69   function suppli
43c0: 65 64 20 62 79 20 74 68 65 20 75 73 65 72 20 64  ed by the user d
43d0: 69 72 65 63 74 6c 79 0a 20 20 2a 2a 20 77 69 74  irectly.  ** wit
43e0: 68 20 53 51 4c 69 74 65 2e 20 54 68 69 73 20 69  h SQLite. This i
43f0: 73 20 62 65 63 61 75 73 65 20 74 68 65 20 73 61  s because the sa
4400: 6d 65 20 62 75 73 79 2d 68 61 6e 64 6c 65 72 20  me busy-handler 
4410: 66 75 6e 63 74 69 6f 6e 20 6d 61 79 20 62 65 0a  function may be.
4420: 20 20 2a 2a 20 69 6e 76 6f 6b 65 64 20 64 69 72    ** invoked dir
4430: 65 63 74 6c 79 20 6c 61 74 65 72 20 6f 6e 20 77  ectly later on w
4440: 68 65 6e 20 61 74 74 65 6d 70 74 69 6e 67 20 74  hen attempting t
4450: 6f 20 6f 62 74 61 69 6e 20 74 68 65 20 65 78 74  o obtain the ext
4460: 72 61 20 6c 6f 63 6b 73 0a 20 20 2a 2a 20 72 65  ra locks.  ** re
4470: 71 75 69 72 65 64 20 69 6e 20 57 41 4c 20 6d 6f  quired in WAL mo
4480: 64 65 2e 20 42 79 20 75 73 69 6e 67 20 74 68 65  de. By using the
4490: 20 77 72 61 70 70 65 72 2c 20 77 65 20 61 72 65   wrapper, we are
44a0: 20 61 62 6c 65 20 74 6f 20 67 75 61 72 61 6e 74   able to guarant
44b0: 65 65 0a 20 20 2a 2a 20 74 68 61 74 20 74 68 65  ee.  ** that the
44c0: 20 22 6e 42 75 73 79 22 20 69 6e 74 65 67 65 72   "nBusy" integer
44d0: 20 70 61 72 61 6d 65 74 65 72 20 70 61 73 73 65   parameter passe
44e0: 64 20 74 6f 20 74 68 65 20 75 73 65 72 73 20 62  d to the users b
44f0: 75 73 79 2d 68 61 6e 64 6c 65 72 0a 20 20 2a 2a  usy-handler.  **
4500: 20 72 65 70 72 65 73 65 6e 74 73 20 74 68 65 20   represents the 
4510: 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20  total number of 
4520: 62 75 73 79 2d 68 61 6e 64 6c 65 72 20 69 6e 76  busy-handler inv
4530: 6f 63 61 74 69 6f 6e 73 20 6d 61 64 65 20 77 69  ocations made wi
4540: 74 68 69 6e 0a 20 20 2a 2a 20 74 68 69 73 20 63  thin.  ** this c
4550: 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 64 65  all to sqlite3de
4560: 6d 6f 5f 73 75 70 65 72 6c 6f 63 6b 28 29 2c 20  mo_superlock(), 
4570: 69 6e 63 6c 75 64 69 6e 67 20 61 6e 79 20 6d 61  including any ma
4580: 64 65 20 64 75 72 69 6e 67 20 74 68 65 0a 20 20  de during the.  
4590: 2a 2a 20 22 42 45 47 49 4e 20 45 58 43 4c 55 53  ** "BEGIN EXCLUS
45a0: 49 56 45 22 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  IVE"..  */.  if(
45b0: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
45c0: 7b 0a 20 20 20 20 62 75 73 79 2e 78 42 75 73 79  {.    busy.xBusy
45d0: 20 3d 20 78 42 75 73 79 3b 0a 20 20 20 20 62 75   = xBusy;.    bu
45e0: 73 79 2e 70 42 75 73 79 41 72 67 20 3d 20 70 42  sy.pBusyArg = pB
45f0: 75 73 79 41 72 67 3b 0a 20 20 20 20 73 71 6c 69  usyArg;.    sqli
4600: 74 65 33 5f 62 75 73 79 5f 68 61 6e 64 6c 65 72  te3_busy_handler
4610: 28 70 4c 6f 63 6b 2d 3e 64 62 2c 20 73 75 70 65  (pLock->db, supe
4620: 72 6c 6f 63 6b 42 75 73 79 48 61 6e 64 6c 65 72  rlockBusyHandler
4630: 2c 20 28 76 6f 69 64 20 2a 29 26 62 75 73 79 29  , (void *)&busy)
4640: 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ;.    rc = sqlit
4650: 65 33 5f 65 78 65 63 28 70 4c 6f 63 6b 2d 3e 64  e3_exec(pLock->d
4660: 62 2c 20 22 42 45 47 49 4e 20 45 58 43 4c 55 53  b, "BEGIN EXCLUS
4670: 49 56 45 22 2c 20 30 2c 20 30 2c 20 30 29 3b 0a  IVE", 0, 0, 0);.
4680: 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65    }..  /* If the
4690: 20 42 45 47 49 4e 20 45 58 43 4c 55 53 49 56 45   BEGIN EXCLUSIVE
46a0: 20 77 61 73 20 65 78 65 63 75 74 65 64 20 73 75   was executed su
46b0: 63 63 65 73 73 66 75 6c 6c 79 20 61 6e 64 20 74  ccessfully and t
46c0: 68 69 73 20 69 73 20 61 20 57 41 4c 0a 20 20 2a  his is a WAL.  *
46d0: 2a 20 64 61 74 61 62 61 73 65 2c 20 63 61 6c 6c  * database, call
46e0: 20 73 75 70 65 72 6c 6f 63 6b 57 61 6c 4c 6f 63   superlockWalLoc
46f0: 6b 28 29 20 74 6f 20 6f 62 74 61 69 6e 20 74 68  k() to obtain th
4700: 65 20 65 78 74 72 61 20 6c 6f 63 6b 73 20 72 65  e extra locks re
4710: 71 75 69 72 65 64 0a 20 20 2a 2a 20 74 6f 20 70  quired.  ** to p
4720: 72 65 76 65 6e 74 20 72 65 61 64 65 72 73 2c 20  revent readers, 
4730: 77 72 69 74 65 72 73 20 61 6e 64 2f 6f 72 20 63  writers and/or c
4740: 68 65 63 6b 70 6f 69 6e 74 65 72 73 20 66 72 6f  heckpointers fro
4750: 6d 20 61 63 63 65 73 73 69 6e 67 20 74 68 65 0a  m accessing the.
4760: 20 20 2a 2a 20 64 62 20 77 68 69 6c 65 20 74 68    ** db while th
4770: 69 73 20 70 72 6f 63 65 73 73 20 69 73 20 68 6f  is process is ho
4780: 6c 64 69 6e 67 20 74 68 65 20 73 75 70 65 72 6c  lding the superl
4790: 6f 63 6b 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 42  ock..  **.  ** B
47a0: 65 66 6f 72 65 20 61 74 74 65 6d 70 74 69 6e 67  efore attempting
47b0: 20 61 6e 79 20 57 41 4c 20 6c 6f 63 6b 73 2c 20   any WAL locks, 
47c0: 63 6f 6d 6d 69 74 20 74 68 65 20 74 72 61 6e 73  commit the trans
47d0: 61 63 74 69 6f 6e 20 73 74 61 72 74 65 64 20 61  action started a
47e0: 62 6f 76 65 0a 20 20 2a 2a 20 74 6f 20 64 72 6f  bove.  ** to dro
47f0: 70 20 74 68 65 20 57 41 4c 20 72 65 61 64 20 61  p the WAL read a
4800: 6e 64 20 77 72 69 74 65 20 6c 6f 63 6b 73 20 63  nd write locks c
4810: 75 72 72 65 6e 74 6c 79 20 68 65 6c 64 2e 20 4f  urrently held. O
4820: 74 68 65 72 77 69 73 65 2c 20 74 68 65 0a 20 20  therwise, the.  
4830: 2a 2a 20 6e 65 77 20 57 41 4c 20 6c 6f 63 6b 73  ** new WAL locks
4840: 20 6d 61 79 20 63 6f 6e 66 6c 69 63 74 20 77 69   may conflict wi
4850: 74 68 20 74 68 65 20 6f 6c 64 2e 0a 20 20 2a 2f  th the old..  */
4860: 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
4870: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20  E_OK ){.    if( 
4880: 53 51 4c 49 54 45 5f 4f 4b 3d 3d 28 72 63 20 3d  SQLITE_OK==(rc =
4890: 20 73 75 70 65 72 6c 6f 63 6b 49 73 57 61 6c 28   superlockIsWal(
48a0: 70 4c 6f 63 6b 29 29 20 26 26 20 70 4c 6f 63 6b  pLock)) && pLock
48b0: 2d 3e 62 57 61 6c 20 29 7b 0a 20 20 20 20 20 20  ->bWal ){.      
48c0: 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 65 78 65  rc = sqlite3_exe
48d0: 63 28 70 4c 6f 63 6b 2d 3e 64 62 2c 20 22 43 4f  c(pLock->db, "CO
48e0: 4d 4d 49 54 22 2c 20 30 2c 20 30 2c 20 30 29 3b  MMIT", 0, 0, 0);
48f0: 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53  .      if( rc==S
4900: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
4910: 20 20 20 20 72 63 20 3d 20 73 75 70 65 72 6c 6f      rc = superlo
4920: 63 6b 57 61 6c 4c 6f 63 6b 28 70 4c 6f 63 6b 2d  ckWalLock(pLock-
4930: 3e 64 62 2c 20 26 62 75 73 79 29 3b 0a 20 20 20  >db, &busy);.   
4940: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a     }.    }.  }..
4950: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
4960: 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  _OK ){.    sqlit
4970: 65 33 64 65 6d 6f 5f 73 75 70 65 72 75 6e 6c 6f  e3demo_superunlo
4980: 63 6b 28 70 4c 6f 63 6b 29 3b 0a 20 20 20 20 2a  ck(pLock);.    *
4990: 70 70 4c 6f 63 6b 20 3d 20 30 3b 0a 20 20 7d 65  ppLock = 0;.  }e
49a0: 6c 73 65 7b 0a 20 20 20 20 2a 70 70 4c 6f 63 6b  lse{.    *ppLock
49b0: 20 3d 20 70 4c 6f 63 6b 3b 0a 20 20 7d 0a 0a 20   = pLock;.  }.. 
49c0: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
49d0: 2a 20 41 20 63 6f 72 72 75 70 74 20 44 42 20 77  * A corrupt DB w
49e0: 6f 6e 27 74 20 77 6f 72 6b 20 77 69 74 68 20 74  on't work with t
49f0: 68 65 20 73 71 6c 2d 62 61 73 65 64 20 6c 6f 63  he sql-based loc
4a00: 6b 69 6e 67 20 61 74 74 65 6d 70 74 2c 20 67 72  king attempt, gr
4a10: 61 62 20 61 6e 20 0a 2a 2a 20 65 78 63 6c 75 73  ab an .** exclus
4a20: 69 76 65 20 6c 6f 63 6b 20 61 6e 64 20 72 65 74  ive lock and ret
4a30: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 72  urn SQLITE_OK or
4a40: 20 53 51 4c 49 54 45 5f 42 55 53 59 20 69 66 20   SQLITE_BUSY if 
4a50: 74 68 65 20 6c 6f 63 6b 20 66 61 69 6c 73 20 0a  the lock fails .
4a60: 2a 2a 20 72 65 74 75 72 6e 73 20 74 68 65 20 63  ** returns the c
4a70: 75 72 72 65 6e 74 20 6c 6f 63 6b 20 6c 65 76 65  urrent lock leve
4a80: 6c 20 68 65 6c 64 20 6f 6e 20 73 71 6c 69 74 65  l held on sqlite
4a90: 33 5f 66 69 6c 65 0a 2a 2f 0a 73 74 61 74 69 63  3_file.*/.static
4aa0: 20 69 6e 74 20 73 71 6c 69 74 65 33 64 65 6d 6f   int sqlite3demo
4ab0: 5f 73 75 70 65 72 6c 6f 63 6b 5f 63 6f 72 72 75  _superlock_corru
4ac0: 70 74 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  pt(sqlite3_file 
4ad0: 2a 69 64 2c 20 69 6e 74 20 65 54 61 72 67 65 74  *id, int eTarget
4ae0: 46 69 6c 65 4c 6f 63 6b 2c 20 69 6e 74 20 2a 70  FileLock, int *p
4af0: 46 69 6c 65 4c 6f 63 6b 29 20 7b 0a 20 20 75 6e  FileLock) {.  un
4b00: 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20  ixFile *pFile = 
4b10: 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20  (unixFile*)id;. 
4b20: 20 69 6e 74 20 65 46 69 6c 65 4c 6f 63 6b 20 3d   int eFileLock =
4b30: 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63   pFile->eFileLoc
4b40: 6b 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  k;.  int rc = SQ
4b50: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 0a 20 20 69 66  LITE_OK;.  .  if
4b60: 28 20 65 46 69 6c 65 4c 6f 63 6b 3c 65 54 61 72  ( eFileLock<eTar
4b70: 67 65 74 46 69 6c 65 4c 6f 63 6b 20 29 7b 0a 20  getFileLock ){. 
4b80: 20 20 20 72 63 20 3d 20 70 46 69 6c 65 2d 3e 70     rc = pFile->p
4b90: 4d 65 74 68 6f 64 2d 3e 78 4c 6f 63 6b 28 69 64  Method->xLock(id
4ba0: 2c 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 5f 53 48  , SQLITE_LOCK_SH
4bb0: 41 52 45 44 29 3b 0a 20 20 7d 0a 20 20 69 66 28  ARED);.  }.  if(
4bc0: 20 21 72 63 20 26 26 20 65 46 69 6c 65 4c 6f 63   !rc && eFileLoc
4bd0: 6b 3c 65 54 61 72 67 65 74 46 69 6c 65 4c 6f 63  k<eTargetFileLoc
4be0: 6b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 70 46  k ){.    rc = pF
4bf0: 69 6c 65 2d 3e 70 4d 65 74 68 6f 64 2d 3e 78 4c  ile->pMethod->xL
4c00: 6f 63 6b 28 69 64 2c 20 53 51 4c 49 54 45 5f 4c  ock(id, SQLITE_L
4c10: 4f 43 4b 5f 45 58 43 4c 55 53 49 56 45 29 3b 0a  OCK_EXCLUSIVE);.
4c20: 20 20 7d 0a 20 20 69 66 28 20 72 63 20 29 7b 0a    }.  if( rc ){.
4c30: 20 20 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 65      if( pFile->e
4c40: 46 69 6c 65 4c 6f 63 6b 20 3e 20 65 46 69 6c 65  FileLock > eFile
4c50: 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 20 20 70 46  Lock ){.      pF
4c60: 69 6c 65 2d 3e 70 4d 65 74 68 6f 64 2d 3e 78 55  ile->pMethod->xU
4c70: 6e 6c 6f 63 6b 28 69 64 2c 20 65 46 69 6c 65 4c  nlock(id, eFileL
4c80: 6f 63 6b 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ock);.    }.    
4c90: 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20  return rc;.  }. 
4ca0: 20 69 66 20 28 70 46 69 6c 65 4c 6f 63 6b 29 20   if (pFileLock) 
4cb0: 7b 0a 20 20 20 20 2a 70 46 69 6c 65 4c 6f 63 6b  {.    *pFileLock
4cc0: 20 3d 20 65 46 69 6c 65 4c 6f 63 6b 3b 0a 20 20   = eFileLock;.  
4cd0: 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  }.  return SQLIT
4ce0: 45 5f 4f 4b 3b 0a 7d 0a 0a 73 74 61 74 69 63 20  E_OK;.}..static 
4cf0: 69 6e 74 20 73 71 6c 69 74 65 33 64 65 6d 6f 5f  int sqlite3demo_
4d00: 73 75 70 65 72 75 6e 6c 6f 63 6b 5f 63 6f 72 72  superunlock_corr
4d10: 75 70 74 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  upt(sqlite3_file
4d20: 20 2a 69 64 2c 20 69 6e 74 20 65 46 69 6c 65 4c   *id, int eFileL
4d30: 6f 63 6b 29 20 7b 0a 20 20 75 6e 69 78 46 69 6c  ock) {.  unixFil
4d40: 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78  e *pFile = (unix
4d50: 46 69 6c 65 2a 29 69 64 3b 0a 20 20 69 6e 74 20  File*)id;.  int 
4d60: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
4d70: 20 20 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e    .  if( pFile->
4d80: 65 46 69 6c 65 4c 6f 63 6b 20 3e 20 65 46 69 6c  eFileLock > eFil
4d90: 65 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 72 63 20  eLock ){.    rc 
4da0: 3d 20 70 46 69 6c 65 2d 3e 70 4d 65 74 68 6f 64  = pFile->pMethod
4db0: 2d 3e 78 55 6e 6c 6f 63 6b 28 69 64 2c 20 53 51  ->xUnlock(id, SQ
4dc0: 4c 49 54 45 5f 4c 4f 43 4b 5f 53 48 41 52 45 44  LITE_LOCK_SHARED
4dd0: 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 46 69  );.  }.  if( pFi
4de0: 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3e 20  le->eFileLock > 
4df0: 65 46 69 6c 65 4c 6f 63 6b 20 29 7b 0a 20 20 20  eFileLock ){.   
4e00: 20 69 6e 74 20 75 6e 6c 6f 63 6b 52 43 20 3d 20   int unlockRC = 
4e10: 70 46 69 6c 65 2d 3e 70 4d 65 74 68 6f 64 2d 3e  pFile->pMethod->
4e20: 78 55 6e 6c 6f 63 6b 28 69 64 2c 20 53 51 4c 49  xUnlock(id, SQLI
4e30: 54 45 5f 4c 4f 43 4b 5f 4e 4f 4e 45 29 3b 0a 20  TE_LOCK_NONE);. 
4e40: 20 20 20 69 66 20 28 21 72 63 29 20 72 63 20 3d     if (!rc) rc =
4e50: 20 75 6e 6c 6f 63 6b 52 43 3b 0a 20 20 7d 0a 20   unlockRC;.  }. 
4e60: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23   return rc;.}..#
4e70: 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
4e80: 45 4e 41 42 4c 45 5f 53 55 50 45 52 4c 4f 43 4b  ENABLE_SUPERLOCK
4e90: 20 2a 2f 0a 0a 0a 2f 2a 0a 2a 2a 20 44 69 66 66   */.../*.** Diff
4ea0: 65 72 65 6e 74 20 55 6e 69 78 20 73 79 73 74 65  erent Unix syste
4eb0: 6d 73 20 64 65 63 6c 61 72 65 20 6f 70 65 6e 28  ms declare open(
4ec0: 29 20 69 6e 20 64 69 66 66 65 72 65 6e 74 20 77  ) in different w
4ed0: 61 79 73 2e 20 20 53 61 6d 65 20 75 73 65 0a 2a  ays.  Same use.*
4ee0: 2a 20 6f 70 65 6e 28 63 6f 6e 73 74 20 63 68 61  * open(const cha
4ef0: 72 2a 2c 69 6e 74 2c 6d 6f 64 65 5f 74 29 2e 20  r*,int,mode_t). 
4f00: 20 4f 74 68 65 72 73 20 75 73 65 20 6f 70 65 6e   Others use open
4f10: 28 63 6f 6e 73 74 20 63 68 61 72 2a 2c 69 6e 74  (const char*,int
4f20: 2c 2e 2e 2e 29 2e 0a 2a 2a 20 54 68 65 20 64 69  ,...)..** The di
4f30: 66 66 65 72 65 6e 63 65 20 69 73 20 69 6d 70 6f  fference is impo
4f40: 72 74 61 6e 74 20 77 68 65 6e 20 75 73 69 6e 67  rtant when using
4f50: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68   a pointer to th
4f60: 65 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a  e function..**.*
4f70: 2a 20 54 68 65 20 73 61 66 65 73 74 20 77 61 79  * The safest way
4f80: 20 74 6f 20 64 65 61 6c 20 77 69 74 68 20 74 68   to deal with th
4f90: 65 20 70 72 6f 62 6c 65 6d 20 69 73 20 74 6f 20  e problem is to 
4fa0: 61 6c 77 61 79 73 20 75 73 65 20 74 68 69 73 20  always use this 
4fb0: 77 72 61 70 70 65 72 0a 2a 2a 20 77 68 69 63 68  wrapper.** which
4fc0: 20 61 6c 77 61 79 73 20 68 61 73 20 74 68 65 20   always has the 
4fd0: 73 61 6d 65 20 77 65 6c 6c 2d 64 65 66 69 6e 65  same well-define
4fe0: 64 20 69 6e 74 65 72 66 61 63 65 2e 0a 2a 2f 0a  d interface..*/.
4ff0: 73 74 61 74 69 63 20 69 6e 74 20 70 6f 73 69 78  static int posix
5000: 4f 70 65 6e 28 63 6f 6e 73 74 20 63 68 61 72 20  Open(const char 
5010: 2a 7a 46 69 6c 65 2c 20 69 6e 74 20 66 6c 61 67  *zFile, int flag
5020: 73 2c 20 69 6e 74 20 6d 6f 64 65 29 7b 0a 20 20  s, int mode){.  
5030: 72 65 74 75 72 6e 20 6f 70 65 6e 28 7a 46 69 6c  return open(zFil
5040: 65 2c 20 66 6c 61 67 73 2c 20 6d 6f 64 65 29 3b  e, flags, mode);
5050: 0a 7d 0a 0a 2f 2a 20 46 6f 72 77 61 72 64 20 72  .}../* Forward r
5060: 65 66 65 72 65 6e 63 65 20 2a 2f 0a 73 74 61 74  eference */.stat
5070: 69 63 20 69 6e 74 20 6f 70 65 6e 44 69 72 65 63  ic int openDirec
5080: 74 6f 72 79 28 63 6f 6e 73 74 20 63 68 61 72 2a  tory(const char*
5090: 2c 20 69 6e 74 2a 29 3b 0a 0a 2f 2a 0a 2a 2a 20  , int*);../*.** 
50a0: 4d 61 6e 79 20 73 79 73 74 65 6d 20 63 61 6c 6c  Many system call
50b0: 73 20 61 72 65 20 61 63 63 65 73 73 65 64 20 74  s are accessed t
50c0: 68 72 6f 75 67 68 20 70 6f 69 6e 74 65 72 2d 74  hrough pointer-t
50d0: 6f 2d 66 75 6e 63 74 69 6f 6e 73 20 73 6f 20 74  o-functions so t
50e0: 68 61 74 0a 2a 2a 20 74 68 65 79 20 6d 61 79 20  hat.** they may 
50f0: 62 65 20 6f 76 65 72 72 69 64 64 65 6e 20 61 74  be overridden at
5100: 20 72 75 6e 74 69 6d 65 20 74 6f 20 66 61 63 69   runtime to faci
5110: 6c 69 74 61 74 65 20 66 61 75 6c 74 20 69 6e 6a  litate fault inj
5120: 65 63 74 69 6f 6e 20 64 75 72 69 6e 67 0a 2a 2a  ection during.**
5130: 20 74 65 73 74 69 6e 67 20 61 6e 64 20 73 61 6e   testing and san
5140: 64 62 6f 78 69 6e 67 2e 20 20 54 68 65 20 66 6f  dboxing.  The fo
5150: 6c 6c 6f 77 69 6e 67 20 61 72 72 61 79 20 68 6f  llowing array ho
5160: 6c 64 73 20 74 68 65 20 6e 61 6d 65 73 20 61 6e  lds the names an
5170: 64 20 70 6f 69 6e 74 65 72 73 0a 2a 2a 20 74 6f  d pointers.** to
5180: 20 61 6c 6c 20 6f 76 65 72 72 69 64 65 61 62 6c   all overrideabl
5190: 65 20 73 79 73 74 65 6d 20 63 61 6c 6c 73 2e 0a  e system calls..
51a0: 2a 2f 0a 73 74 61 74 69 63 20 73 74 72 75 63 74  */.static struct
51b0: 20 75 6e 69 78 5f 73 79 73 63 61 6c 6c 20 7b 0a   unix_syscall {.
51c0: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e    const char *zN
51d0: 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ame;            
51e0: 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 73  /* Name of the s
51f0: 79 74 65 6d 20 63 61 6c 6c 20 2a 2f 0a 20 20 73  ytem call */.  s
5200: 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70  qlite3_syscall_p
5210: 74 72 20 70 43 75 72 72 65 6e 74 3b 20 2f 2a 20  tr pCurrent; /* 
5220: 43 75 72 72 65 6e 74 20 76 61 6c 75 65 20 6f 66  Current value of
5230: 20 74 68 65 20 73 79 73 74 65 6d 20 63 61 6c 6c   the system call
5240: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 73 79   */.  sqlite3_sy
5250: 73 63 61 6c 6c 5f 70 74 72 20 70 44 65 66 61 75  scall_ptr pDefau
5260: 6c 74 3b 20 2f 2a 20 44 65 66 61 75 6c 74 20 76  lt; /* Default v
5270: 61 6c 75 65 20 2a 2f 0a 7d 20 61 53 79 73 63 61  alue */.} aSysca
5280: 6c 6c 5b 5d 20 3d 20 7b 0a 20 20 7b 20 22 6f 70  ll[] = {.  { "op
5290: 65 6e 22 2c 20 20 20 20 20 20 20 20 20 28 73 71  en",         (sq
52a0: 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74  lite3_syscall_pt
52b0: 72 29 70 6f 73 69 78 4f 70 65 6e 2c 20 20 30 20  r)posixOpen,  0 
52c0: 20 7d 2c 0a 23 64 65 66 69 6e 65 20 6f 73 4f 70   },.#define osOp
52d0: 65 6e 20 20 20 20 20 20 28 28 69 6e 74 28 2a 29  en      ((int(*)
52e0: 28 63 6f 6e 73 74 20 63 68 61 72 2a 2c 69 6e 74  (const char*,int
52f0: 2c 69 6e 74 29 29 61 53 79 73 63 61 6c 6c 5b 30  ,int))aSyscall[0
5300: 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b  ].pCurrent)..  {
5310: 20 22 63 6c 6f 73 65 22 2c 20 20 20 20 20 20 20   "close",       
5320: 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c   (sqlite3_syscal
5330: 6c 5f 70 74 72 29 63 6c 6f 73 65 2c 20 20 20 20  l_ptr)close,    
5340: 20 20 30 20 20 7d 2c 0a 23 64 65 66 69 6e 65 20    0  },.#define 
5350: 6f 73 43 6c 6f 73 65 20 20 20 20 20 28 28 69 6e  osClose     ((in
5360: 74 28 2a 29 28 69 6e 74 29 29 61 53 79 73 63 61  t(*)(int))aSysca
5370: 6c 6c 5b 31 5d 2e 70 43 75 72 72 65 6e 74 29 0a  ll[1].pCurrent).
5380: 0a 20 20 7b 20 22 61 63 63 65 73 73 22 2c 20 20  .  { "access",  
5390: 20 20 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79       (sqlite3_sy
53a0: 73 63 61 6c 6c 5f 70 74 72 29 61 63 63 65 73 73  scall_ptr)access
53b0: 2c 20 20 20 20 20 30 20 20 7d 2c 0a 23 64 65 66  ,     0  },.#def
53c0: 69 6e 65 20 6f 73 41 63 63 65 73 73 20 20 20 20  ine osAccess    
53d0: 28 28 69 6e 74 28 2a 29 28 63 6f 6e 73 74 20 63  ((int(*)(const c
53e0: 68 61 72 2a 2c 69 6e 74 29 29 61 53 79 73 63 61  har*,int))aSysca
53f0: 6c 6c 5b 32 5d 2e 70 43 75 72 72 65 6e 74 29 0a  ll[2].pCurrent).
5400: 0a 20 20 7b 20 22 67 65 74 63 77 64 22 2c 20 20  .  { "getcwd",  
5410: 20 20 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79       (sqlite3_sy
5420: 73 63 61 6c 6c 5f 70 74 72 29 67 65 74 63 77 64  scall_ptr)getcwd
5430: 2c 20 20 20 20 20 30 20 20 7d 2c 0a 23 64 65 66  ,     0  },.#def
5440: 69 6e 65 20 6f 73 47 65 74 63 77 64 20 20 20 20  ine osGetcwd    
5450: 28 28 63 68 61 72 2a 28 2a 29 28 63 68 61 72 2a  ((char*(*)(char*
5460: 2c 73 69 7a 65 5f 74 29 29 61 53 79 73 63 61 6c  ,size_t))aSyscal
5470: 6c 5b 33 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a  l[3].pCurrent)..
5480: 20 20 7b 20 22 73 74 61 74 22 2c 20 20 20 20 20    { "stat",     
5490: 20 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73      (sqlite3_sys
54a0: 63 61 6c 6c 5f 70 74 72 29 73 74 61 74 2c 20 20  call_ptr)stat,  
54b0: 20 20 20 20 20 30 20 20 7d 2c 0a 23 64 65 66 69       0  },.#defi
54c0: 6e 65 20 6f 73 53 74 61 74 20 20 20 20 20 20 28  ne osStat      (
54d0: 28 69 6e 74 28 2a 29 28 63 6f 6e 73 74 20 63 68  (int(*)(const ch
54e0: 61 72 2a 2c 73 74 72 75 63 74 20 73 74 61 74 2a  ar*,struct stat*
54f0: 29 29 61 53 79 73 63 61 6c 6c 5b 34 5d 2e 70 43  ))aSyscall[4].pC
5500: 75 72 72 65 6e 74 29 0a 0a 2f 2a 0a 2a 2a 20 54  urrent)../*.** T
5510: 68 65 20 44 4a 47 50 50 20 63 6f 6d 70 69 6c 65  he DJGPP compile
5520: 72 20 65 6e 76 69 72 6f 6e 6d 65 6e 74 20 6c 6f  r environment lo
5530: 6f 6b 73 20 6d 6f 73 74 6c 79 20 6c 69 6b 65 20  oks mostly like 
5540: 55 6e 69 78 2c 20 62 75 74 20 69 74 0a 2a 2a 20  Unix, but it.** 
5550: 6c 61 63 6b 73 20 74 68 65 20 66 63 6e 74 6c 28  lacks the fcntl(
5560: 29 20 73 79 73 74 65 6d 20 63 61 6c 6c 2e 20 20  ) system call.  
5570: 53 6f 20 72 65 64 65 66 69 6e 65 20 66 63 6e 74  So redefine fcnt
5580: 6c 28 29 20 74 6f 20 62 65 20 73 6f 6d 65 74 68  l() to be someth
5590: 69 6e 67 0a 2a 2a 20 74 68 61 74 20 61 6c 77 61  ing.** that alwa
55a0: 79 73 20 73 75 63 63 65 65 64 73 2e 20 20 54 68  ys succeeds.  Th
55b0: 69 73 20 6d 65 61 6e 73 20 74 68 61 74 20 6c 6f  is means that lo
55c0: 63 6b 69 6e 67 20 64 6f 65 73 20 6e 6f 74 20 6f  cking does not o
55d0: 63 63 75 72 20 75 6e 64 65 72 0a 2a 2a 20 44 4a  ccur under.** DJ
55e0: 47 50 50 2e 20 20 42 75 74 20 69 74 20 69 73 20  GPP.  But it is 
55f0: 44 4f 53 20 2d 20 77 68 61 74 20 64 69 64 20 79  DOS - what did y
5600: 6f 75 20 65 78 70 65 63 74 3f 0a 2a 2f 0a 23 69  ou expect?.*/.#i
5610: 66 64 65 66 20 5f 5f 44 4a 47 50 50 5f 5f 0a 20  fdef __DJGPP__. 
5620: 20 7b 20 22 66 73 74 61 74 22 2c 20 20 20 20 20   { "fstat",     
5630: 20 20 20 30 2c 20 20 20 20 20 20 20 20 20 20 20     0,           
5640: 20 20 20 20 20 20 30 20 20 7d 2c 0a 23 64 65 66        0  },.#def
5650: 69 6e 65 20 6f 73 46 73 74 61 74 28 61 2c 62 2c  ine osFstat(a,b,
5660: 63 29 20 20 20 20 30 0a 23 65 6c 73 65 20 20 20  c)    0.#else   
5670: 20 20 0a 20 20 7b 20 22 66 73 74 61 74 22 2c 20    .  { "fstat", 
5680: 20 20 20 20 20 20 20 28 73 71 6c 69 74 65 33 5f         (sqlite3_
5690: 73 79 73 63 61 6c 6c 5f 70 74 72 29 66 73 74 61  syscall_ptr)fsta
56a0: 74 2c 20 20 20 20 20 20 30 20 20 7d 2c 0a 23 64  t,      0  },.#d
56b0: 65 66 69 6e 65 20 6f 73 46 73 74 61 74 20 20 20  efine osFstat   
56c0: 20 20 28 28 69 6e 74 28 2a 29 28 69 6e 74 2c 73    ((int(*)(int,s
56d0: 74 72 75 63 74 20 73 74 61 74 2a 29 29 61 53 79  truct stat*))aSy
56e0: 73 63 61 6c 6c 5b 35 5d 2e 70 43 75 72 72 65 6e  scall[5].pCurren
56f0: 74 29 0a 23 65 6e 64 69 66 0a 0a 20 20 7b 20 22  t).#endif..  { "
5700: 66 74 72 75 6e 63 61 74 65 22 2c 20 20 20 20 28  ftruncate",    (
5710: 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f  sqlite3_syscall_
5720: 70 74 72 29 66 74 72 75 6e 63 61 74 65 2c 20 20  ptr)ftruncate,  
5730: 30 20 20 7d 2c 0a 23 64 65 66 69 6e 65 20 6f 73  0  },.#define os
5740: 46 74 72 75 6e 63 61 74 65 20 28 28 69 6e 74 28  Ftruncate ((int(
5750: 2a 29 28 69 6e 74 2c 6f 66 66 5f 74 29 29 61 53  *)(int,off_t))aS
5760: 79 73 63 61 6c 6c 5b 36 5d 2e 70 43 75 72 72 65  yscall[6].pCurre
5770: 6e 74 29 0a 0a 20 20 7b 20 22 66 63 6e 74 6c 22  nt)..  { "fcntl"
5780: 2c 20 20 20 20 20 20 20 20 28 73 71 6c 69 74 65  ,        (sqlite
5790: 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29 66 63  3_syscall_ptr)fc
57a0: 6e 74 6c 2c 20 20 20 20 20 20 30 20 20 7d 2c 0a  ntl,      0  },.
57b0: 23 64 65 66 69 6e 65 20 6f 73 46 63 6e 74 6c 20  #define osFcntl 
57c0: 20 20 20 20 28 28 69 6e 74 28 2a 29 28 69 6e 74      ((int(*)(int
57d0: 2c 69 6e 74 2c 2e 2e 2e 29 29 61 53 79 73 63 61  ,int,...))aSysca
57e0: 6c 6c 5b 37 5d 2e 70 43 75 72 72 65 6e 74 29 0a  ll[7].pCurrent).
57f0: 0a 20 20 7b 20 22 72 65 61 64 22 2c 20 20 20 20  .  { "read",    
5800: 20 20 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79       (sqlite3_sy
5810: 73 63 61 6c 6c 5f 70 74 72 29 72 65 61 64 2c 20  scall_ptr)read, 
5820: 20 20 20 20 20 20 30 20 20 7d 2c 0a 23 64 65 66        0  },.#def
5830: 69 6e 65 20 6f 73 52 65 61 64 20 20 20 20 20 20  ine osRead      
5840: 28 28 73 73 69 7a 65 5f 74 28 2a 29 28 69 6e 74  ((ssize_t(*)(int
5850: 2c 76 6f 69 64 2a 2c 73 69 7a 65 5f 74 29 29 61  ,void*,size_t))a
5860: 53 79 73 63 61 6c 6c 5b 38 5d 2e 70 43 75 72 72  Syscall[8].pCurr
5870: 65 6e 74 29 0a 0a 23 69 66 20 64 65 66 69 6e 65  ent)..#if define
5880: 64 28 55 53 45 5f 50 52 45 41 44 29 20 7c 7c 20  d(USE_PREAD) || 
5890: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f  SQLITE_ENABLE_LO
58a0: 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 20 20 7b 20  CKING_STYLE.  { 
58b0: 22 70 72 65 61 64 22 2c 20 20 20 20 20 20 20 20  "pread",        
58c0: 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c  (sqlite3_syscall
58d0: 5f 70 74 72 29 70 72 65 61 64 2c 20 20 20 20 20  _ptr)pread,     
58e0: 20 30 20 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b   0  },.#else.  {
58f0: 20 22 70 72 65 61 64 22 2c 20 20 20 20 20 20 20   "pread",       
5900: 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c   (sqlite3_syscal
5910: 6c 5f 70 74 72 29 30 2c 20 20 20 20 20 20 20 20  l_ptr)0,        
5920: 20 20 30 20 20 7d 2c 0a 23 65 6e 64 69 66 0a 23    0  },.#endif.#
5930: 64 65 66 69 6e 65 20 6f 73 50 72 65 61 64 20 20  define osPread  
5940: 20 20 20 28 28 73 73 69 7a 65 5f 74 28 2a 29 28     ((ssize_t(*)(
5950: 69 6e 74 2c 76 6f 69 64 2a 2c 73 69 7a 65 5f 74  int,void*,size_t
5960: 2c 6f 66 66 5f 74 29 29 61 53 79 73 63 61 6c 6c  ,off_t))aSyscall
5970: 5b 39 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23  [9].pCurrent)..#
5980: 69 66 20 64 65 66 69 6e 65 64 28 55 53 45 5f 50  if defined(USE_P
5990: 52 45 41 44 36 34 29 0a 20 20 7b 20 22 70 72 65  READ64).  { "pre
59a0: 61 64 36 34 22 2c 20 20 20 20 20 20 28 73 71 6c  ad64",      (sql
59b0: 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72  ite3_syscall_ptr
59c0: 29 70 72 65 61 64 36 34 2c 20 20 20 20 30 20 20  )pread64,    0  
59d0: 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 70 72  },.#else.  { "pr
59e0: 65 61 64 36 34 22 2c 20 20 20 20 20 20 28 73 71  ead64",      (sq
59f0: 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74  lite3_syscall_pt
5a00: 72 29 30 2c 20 20 20 20 20 20 20 20 20 20 30 20  r)0,          0 
5a10: 20 7d 2c 0a 23 65 6e 64 69 66 0a 23 64 65 66 69   },.#endif.#defi
5a20: 6e 65 20 6f 73 50 72 65 61 64 36 34 20 20 20 28  ne osPread64   (
5a30: 28 73 73 69 7a 65 5f 74 28 2a 29 28 69 6e 74 2c  (ssize_t(*)(int,
5a40: 76 6f 69 64 2a 2c 73 69 7a 65 5f 74 2c 6f 66 66  void*,size_t,off
5a50: 5f 74 29 29 61 53 79 73 63 61 6c 6c 5b 31 30 5d  _t))aSyscall[10]
5a60: 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20  .pCurrent)..  { 
5a70: 22 77 72 69 74 65 22 2c 20 20 20 20 20 20 20 20  "write",        
5a80: 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c  (sqlite3_syscall
5a90: 5f 70 74 72 29 77 72 69 74 65 2c 20 20 20 20 20  _ptr)write,     
5aa0: 20 30 20 20 7d 2c 0a 23 64 65 66 69 6e 65 20 6f   0  },.#define o
5ab0: 73 57 72 69 74 65 20 20 20 20 20 28 28 73 73 69  sWrite     ((ssi
5ac0: 7a 65 5f 74 28 2a 29 28 69 6e 74 2c 63 6f 6e 73  ze_t(*)(int,cons
5ad0: 74 20 76 6f 69 64 2a 2c 73 69 7a 65 5f 74 29 29  t void*,size_t))
5ae0: 61 53 79 73 63 61 6c 6c 5b 31 31 5d 2e 70 43 75  aSyscall[11].pCu
5af0: 72 72 65 6e 74 29 0a 0a 23 69 66 20 64 65 66 69  rrent)..#if defi
5b00: 6e 65 64 28 55 53 45 5f 50 52 45 41 44 29 20 7c  ned(USE_PREAD) |
5b10: 7c 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  | SQLITE_ENABLE_
5b20: 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 20 20  LOCKING_STYLE.  
5b30: 7b 20 22 70 77 72 69 74 65 22 2c 20 20 20 20 20  { "pwrite",     
5b40: 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61    (sqlite3_sysca
5b50: 6c 6c 5f 70 74 72 29 70 77 72 69 74 65 2c 20 20  ll_ptr)pwrite,  
5b60: 20 20 20 30 20 20 7d 2c 0a 23 65 6c 73 65 0a 20     0  },.#else. 
5b70: 20 7b 20 22 70 77 72 69 74 65 22 2c 20 20 20 20   { "pwrite",    
5b80: 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63     (sqlite3_sysc
5b90: 61 6c 6c 5f 70 74 72 29 30 2c 20 20 20 20 20 20  all_ptr)0,      
5ba0: 20 20 20 20 30 20 20 7d 2c 0a 23 65 6e 64 69 66      0  },.#endif
5bb0: 0a 23 64 65 66 69 6e 65 20 6f 73 50 77 72 69 74  .#define osPwrit
5bc0: 65 20 20 20 20 28 28 73 73 69 7a 65 5f 74 28 2a  e    ((ssize_t(*
5bd0: 29 28 69 6e 74 2c 63 6f 6e 73 74 20 76 6f 69 64  )(int,const void
5be0: 2a 2c 73 69 7a 65 5f 74 2c 6f 66 66 5f 74 29 29  *,size_t,off_t))
5bf0: 5c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  \.              
5c00: 20 20 20 20 20 20 61 53 79 73 63 61 6c 6c 5b 31        aSyscall[1
5c10: 32 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69  2].pCurrent)..#i
5c20: 66 20 64 65 66 69 6e 65 64 28 55 53 45 5f 50 52  f defined(USE_PR
5c30: 45 41 44 36 34 29 0a 20 20 7b 20 22 70 77 72 69  EAD64).  { "pwri
5c40: 74 65 36 34 22 2c 20 20 20 20 20 28 73 71 6c 69  te64",     (sqli
5c50: 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29  te3_syscall_ptr)
5c60: 70 77 72 69 74 65 36 34 2c 20 20 20 30 20 20 7d  pwrite64,   0  }
5c70: 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 70 77 72  ,.#else.  { "pwr
5c80: 69 74 65 36 34 22 2c 20 20 20 20 20 28 73 71 6c  ite64",     (sql
5c90: 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72  ite3_syscall_ptr
5ca0: 29 30 2c 20 20 20 20 20 20 20 20 20 20 30 20 20  )0,          0  
5cb0: 7d 2c 0a 23 65 6e 64 69 66 0a 23 64 65 66 69 6e  },.#endif.#defin
5cc0: 65 20 6f 73 50 77 72 69 74 65 36 34 20 20 28 28  e osPwrite64  ((
5cd0: 73 73 69 7a 65 5f 74 28 2a 29 28 69 6e 74 2c 63  ssize_t(*)(int,c
5ce0: 6f 6e 73 74 20 76 6f 69 64 2a 2c 73 69 7a 65 5f  onst void*,size_
5cf0: 74 2c 6f 66 66 5f 74 29 29 5c 0a 20 20 20 20 20  t,off_t))\.     
5d00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61                 a
5d10: 53 79 73 63 61 6c 6c 5b 31 33 5d 2e 70 43 75 72  Syscall[13].pCur
5d20: 72 65 6e 74 29 0a 0a 23 69 66 20 53 51 4c 49 54  rent)..#if SQLIT
5d30: 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47  E_ENABLE_LOCKING
5d40: 5f 53 54 59 4c 45 0a 20 20 7b 20 22 66 63 68 6d  _STYLE.  { "fchm
5d50: 6f 64 22 2c 20 20 20 20 20 20 20 28 73 71 6c 69  od",       (sqli
5d60: 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29  te3_syscall_ptr)
5d70: 66 63 68 6d 6f 64 2c 20 20 20 20 20 30 20 20 7d  fchmod,     0  }
5d80: 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 66 63 68  ,.#else.  { "fch
5d90: 6d 6f 64 22 2c 20 20 20 20 20 20 20 28 73 71 6c  mod",       (sql
5da0: 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72  ite3_syscall_ptr
5db0: 29 30 2c 20 20 20 20 20 20 20 20 20 20 30 20 20  )0,          0  
5dc0: 7d 2c 0a 23 65 6e 64 69 66 0a 23 64 65 66 69 6e  },.#endif.#defin
5dd0: 65 20 6f 73 46 63 68 6d 6f 64 20 20 20 20 28 28  e osFchmod    ((
5de0: 69 6e 74 28 2a 29 28 69 6e 74 2c 6d 6f 64 65 5f  int(*)(int,mode_
5df0: 74 29 29 61 53 79 73 63 61 6c 6c 5b 31 34 5d 2e  t))aSyscall[14].
5e00: 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 64  pCurrent)..#if d
5e10: 65 66 69 6e 65 64 28 48 41 56 45 5f 50 4f 53 49  efined(HAVE_POSI
5e20: 58 5f 46 41 4c 4c 4f 43 41 54 45 29 20 26 26 20  X_FALLOCATE) && 
5e30: 48 41 56 45 5f 50 4f 53 49 58 5f 46 41 4c 4c 4f  HAVE_POSIX_FALLO
5e40: 43 41 54 45 0a 20 20 7b 20 22 66 61 6c 6c 6f 63  CATE.  { "falloc
5e50: 61 74 65 22 2c 20 20 20 20 28 73 71 6c 69 74 65  ate",    (sqlite
5e60: 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29 70 6f  3_syscall_ptr)po
5e70: 73 69 78 5f 66 61 6c 6c 6f 63 61 74 65 2c 20 20  six_fallocate,  
5e80: 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22  0 },.#else.  { "
5e90: 66 61 6c 6c 6f 63 61 74 65 22 2c 20 20 20 20 28  fallocate",    (
5ea0: 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f  sqlite3_syscall_
5eb0: 70 74 72 29 30 2c 20 20 20 20 20 20 20 20 20 20  ptr)0,          
5ec0: 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69        0 },.#endi
5ed0: 66 0a 23 64 65 66 69 6e 65 20 6f 73 46 61 6c 6c  f.#define osFall
5ee0: 6f 63 61 74 65 20 28 28 69 6e 74 28 2a 29 28 69  ocate ((int(*)(i
5ef0: 6e 74 2c 6f 66 66 5f 74 2c 6f 66 66 5f 74 29 29  nt,off_t,off_t))
5f00: 61 53 79 73 63 61 6c 6c 5b 31 35 5d 2e 70 43 75  aSyscall[15].pCu
5f10: 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22 75 6e 6c  rrent)..  { "unl
5f20: 69 6e 6b 22 2c 20 20 20 20 20 20 20 28 73 71 6c  ink",       (sql
5f30: 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72  ite3_syscall_ptr
5f40: 29 75 6e 6c 69 6e 6b 2c 20 20 20 20 20 20 20 20  )unlink,        
5f50: 20 20 20 30 20 7d 2c 0a 23 64 65 66 69 6e 65 20     0 },.#define 
5f60: 6f 73 55 6e 6c 69 6e 6b 20 20 20 20 28 28 69 6e  osUnlink    ((in
5f70: 74 28 2a 29 28 63 6f 6e 73 74 20 63 68 61 72 2a  t(*)(const char*
5f80: 29 29 61 53 79 73 63 61 6c 6c 5b 31 36 5d 2e 70  ))aSyscall[16].p
5f90: 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22 6f  Current)..  { "o
5fa0: 70 65 6e 44 69 72 65 63 74 6f 72 79 22 2c 20 20  penDirectory",  
5fb0: 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61    (sqlite3_sysca
5fc0: 6c 6c 5f 70 74 72 29 6f 70 65 6e 44 69 72 65 63  ll_ptr)openDirec
5fd0: 74 6f 72 79 2c 20 20 20 20 20 20 30 20 7d 2c 0a  tory,      0 },.
5fe0: 23 64 65 66 69 6e 65 20 6f 73 4f 70 65 6e 44 69  #define osOpenDi
5ff0: 72 65 63 74 6f 72 79 20 28 28 69 6e 74 28 2a 29  rectory ((int(*)
6000: 28 63 6f 6e 73 74 20 63 68 61 72 2a 2c 69 6e 74  (const char*,int
6010: 2a 29 29 61 53 79 73 63 61 6c 6c 5b 31 37 5d 2e  *))aSyscall[17].
6020: 70 43 75 72 72 65 6e 74 29 0a 0a 7d 3b 20 2f 2a  pCurrent)..}; /*
6030: 20 45 6e 64 20 6f 66 20 74 68 65 20 6f 76 65 72   End of the over
6040: 72 69 64 65 61 62 6c 65 20 73 79 73 74 65 6d 20  rideable system 
6050: 63 61 6c 6c 73 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  calls */../*.** 
6060: 54 68 69 73 20 69 73 20 74 68 65 20 78 53 65 74  This is the xSet
6070: 53 79 73 74 65 6d 43 61 6c 6c 28 29 20 6d 65 74  SystemCall() met
6080: 68 6f 64 20 6f 66 20 73 71 6c 69 74 65 33 5f 76  hod of sqlite3_v
6090: 66 73 20 66 6f 72 20 61 6c 6c 20 6f 66 20 74 68  fs for all of th
60a0: 65 0a 2a 2a 20 22 75 6e 69 78 22 20 56 46 53 65  e.** "unix" VFSe
60b0: 73 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54  s.  Return SQLIT
60c0: 45 5f 4f 4b 20 6f 70 6f 6e 20 73 75 63 63 65 73  E_OK opon succes
60d0: 73 66 75 6c 6c 79 20 75 70 64 61 74 69 6e 67 20  sfully updating 
60e0: 74 68 65 0a 2a 2a 20 73 79 73 74 65 6d 20 63 61  the.** system ca
60f0: 6c 6c 20 70 6f 69 6e 74 65 72 2c 20 6f 72 20 53  ll pointer, or S
6100: 51 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e 44 20 69  QLITE_NOTFOUND i
6110: 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20 63 6f  f there is no co
6120: 6e 66 69 67 75 72 61 62 6c 65 0a 2a 2a 20 73 79  nfigurable.** sy
6130: 73 74 65 6d 20 63 61 6c 6c 20 6e 61 6d 65 64 20  stem call named 
6140: 7a 4e 61 6d 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  zName..*/.static
6150: 20 69 6e 74 20 75 6e 69 78 53 65 74 53 79 73 74   int unixSetSyst
6160: 65 6d 43 61 6c 6c 28 0a 20 20 73 71 6c 69 74 65  emCall(.  sqlite
6170: 33 5f 76 66 73 20 2a 70 4e 6f 74 55 73 65 64 2c  3_vfs *pNotUsed,
6180: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 56          /* The V
6190: 46 53 20 70 6f 69 6e 74 65 72 2e 20 20 4e 6f 74  FS pointer.  Not
61a0: 20 75 73 65 64 20 2a 2f 0a 20 20 63 6f 6e 73 74   used */.  const
61b0: 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 20 20   char *zName,   
61c0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65           /* Name
61d0: 20 6f 66 20 73 79 73 74 65 6d 20 63 61 6c 6c 20   of system call 
61e0: 74 6f 20 6f 76 65 72 72 69 64 65 20 2a 2f 0a 20  to override */. 
61f0: 20 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c   sqlite3_syscall
6200: 5f 70 74 72 20 70 4e 65 77 46 75 6e 63 20 20 2f  _ptr pNewFunc  /
6210: 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 6e 65 77  * Pointer to new
6220: 20 73 79 73 74 65 6d 20 63 61 6c 6c 20 76 61 6c   system call val
6230: 75 65 20 2a 2f 0a 29 7b 0a 20 20 75 6e 73 69 67  ue */.){.  unsig
6240: 6e 65 64 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74  ned int i;.  int
6250: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 54   rc = SQLITE_NOT
6260: 46 4f 55 4e 44 3b 0a 0a 20 20 55 4e 55 53 45 44  FOUND;..  UNUSED
6270: 5f 50 41 52 41 4d 45 54 45 52 28 70 4e 6f 74 55  _PARAMETER(pNotU
6280: 73 65 64 29 3b 0a 20 20 69 66 28 20 7a 4e 61 6d  sed);.  if( zNam
6290: 65 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 49  e==0 ){.    /* I
62a0: 66 20 6e 6f 20 7a 4e 61 6d 65 20 69 73 20 67 69  f no zName is gi
62b0: 76 65 6e 2c 20 72 65 73 74 6f 72 65 20 61 6c 6c  ven, restore all
62c0: 20 73 79 73 74 65 6d 20 63 61 6c 6c 73 20 74 6f   system calls to
62d0: 20 74 68 65 69 72 20 64 65 66 61 75 6c 74 0a 20   their default. 
62e0: 20 20 20 2a 2a 20 73 65 74 74 69 6e 67 73 20 61     ** settings a
62f0: 6e 64 20 72 65 74 75 72 6e 20 4e 55 4c 4c 0a 20  nd return NULL. 
6300: 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 53     */.    rc = S
6310: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 66 6f  QLITE_OK;.    fo
6320: 72 28 69 3d 30 3b 20 69 3c 73 69 7a 65 6f 66 28  r(i=0; i<sizeof(
6330: 61 53 79 73 63 61 6c 6c 29 2f 73 69 7a 65 6f 66  aSyscall)/sizeof
6340: 28 61 53 79 73 63 61 6c 6c 5b 30 5d 29 3b 20 69  (aSyscall[0]); i
6350: 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 61  ++){.      if( a
6360: 53 79 73 63 61 6c 6c 5b 69 5d 2e 70 44 65 66 61  Syscall[i].pDefa
6370: 75 6c 74 20 29 7b 0a 20 20 20 20 20 20 20 20 61  ult ){.        a
6380: 53 79 73 63 61 6c 6c 5b 69 5d 2e 70 43 75 72 72  Syscall[i].pCurr
6390: 65 6e 74 20 3d 20 61 53 79 73 63 61 6c 6c 5b 69  ent = aSyscall[i
63a0: 5d 2e 70 44 65 66 61 75 6c 74 3b 0a 20 20 20 20  ].pDefault;.    
63b0: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73    }.    }.  }els
63c0: 65 7b 0a 20 20 20 20 2f 2a 20 49 66 20 7a 4e 61  e{.    /* If zNa
63d0: 6d 65 20 69 73 20 73 70 65 63 69 66 69 65 64 2c  me is specified,
63e0: 20 6f 70 65 72 61 74 65 20 6f 6e 20 6f 6e 6c 79   operate on only
63f0: 20 74 68 65 20 6f 6e 65 20 73 79 73 74 65 6d 20   the one system 
6400: 63 61 6c 6c 0a 20 20 20 20 2a 2a 20 73 70 65 63  call.    ** spec
6410: 69 66 69 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20  ified..    */.  
6420: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 69 7a    for(i=0; i<siz
6430: 65 6f 66 28 61 53 79 73 63 61 6c 6c 29 2f 73 69  eof(aSyscall)/si
6440: 7a 65 6f 66 28 61 53 79 73 63 61 6c 6c 5b 30 5d  zeof(aSyscall[0]
6450: 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69  ); i++){.      i
6460: 66 28 20 73 74 72 63 6d 70 28 7a 4e 61 6d 65 2c  f( strcmp(zName,
6470: 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 7a 4e 61   aSyscall[i].zNa
6480: 6d 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  me)==0 ){.      
6490: 20 20 69 66 28 20 61 53 79 73 63 61 6c 6c 5b 69    if( aSyscall[i
64a0: 5d 2e 70 44 65 66 61 75 6c 74 3d 3d 30 20 29 7b  ].pDefault==0 ){
64b0: 0a 20 20 20 20 20 20 20 20 20 20 61 53 79 73 63  .          aSysc
64c0: 61 6c 6c 5b 69 5d 2e 70 44 65 66 61 75 6c 74 20  all[i].pDefault 
64d0: 3d 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 70 43  = aSyscall[i].pC
64e0: 75 72 72 65 6e 74 3b 0a 20 20 20 20 20 20 20 20  urrent;.        
64f0: 7d 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53  }.        rc = S
6500: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20  QLITE_OK;.      
6510: 20 20 69 66 28 20 70 4e 65 77 46 75 6e 63 3d 3d    if( pNewFunc==
6520: 30 20 29 20 70 4e 65 77 46 75 6e 63 20 3d 20 61  0 ) pNewFunc = a
6530: 53 79 73 63 61 6c 6c 5b 69 5d 2e 70 44 65 66 61  Syscall[i].pDefa
6540: 75 6c 74 3b 0a 20 20 20 20 20 20 20 20 61 53 79  ult;.        aSy
6550: 73 63 61 6c 6c 5b 69 5d 2e 70 43 75 72 72 65 6e  scall[i].pCurren
6560: 74 20 3d 20 70 4e 65 77 46 75 6e 63 3b 0a 20 20  t = pNewFunc;.  
6570: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
6580: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20     }.    }.  }. 
6590: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
65a0: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
65b0: 76 61 6c 75 65 20 6f 66 20 61 20 73 79 73 74 65  value of a syste
65c0: 6d 20 63 61 6c 6c 2e 20 20 52 65 74 75 72 6e 20  m call.  Return 
65d0: 4e 55 4c 4c 20 69 66 20 7a 4e 61 6d 65 20 69 73  NULL if zName is
65e0: 20 6e 6f 74 20 61 0a 2a 2a 20 72 65 63 6f 67 6e   not a.** recogn
65f0: 69 7a 65 64 20 73 79 73 74 65 6d 20 63 61 6c 6c  ized system call
6600: 20 6e 61 6d 65 2e 20 20 4e 55 4c 4c 20 69 73 20   name.  NULL is 
6610: 61 6c 73 6f 20 72 65 74 75 72 6e 65 64 20 69 66  also returned if
6620: 20 74 68 65 20 73 79 73 74 65 6d 20 63 61 6c 6c   the system call
6630: 0a 2a 2a 20 69 73 20 63 75 72 72 65 6e 74 6c 79  .** is currently
6640: 20 75 6e 64 65 66 69 6e 65 64 2e 0a 2a 2f 0a 73   undefined..*/.s
6650: 74 61 74 69 63 20 73 71 6c 69 74 65 33 5f 73 79  tatic sqlite3_sy
6660: 73 63 61 6c 6c 5f 70 74 72 20 75 6e 69 78 47 65  scall_ptr unixGe
6670: 74 53 79 73 74 65 6d 43 61 6c 6c 28 0a 20 20 73  tSystemCall(.  s
6680: 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 4e 6f 74  qlite3_vfs *pNot
6690: 55 73 65 64 2c 0a 20 20 63 6f 6e 73 74 20 63 68  Used,.  const ch
66a0: 61 72 20 2a 7a 4e 61 6d 65 0a 29 7b 0a 20 20 75  ar *zName.){.  u
66b0: 6e 73 69 67 6e 65 64 20 69 6e 74 20 69 3b 0a 0a  nsigned int i;..
66c0: 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
66d0: 45 52 28 70 4e 6f 74 55 73 65 64 29 3b 0a 20 20  ER(pNotUsed);.  
66e0: 66 6f 72 28 69 3d 30 3b 20 69 3c 73 69 7a 65 6f  for(i=0; i<sizeo
66f0: 66 28 61 53 79 73 63 61 6c 6c 29 2f 73 69 7a 65  f(aSyscall)/size
6700: 6f 66 28 61 53 79 73 63 61 6c 6c 5b 30 5d 29 3b  of(aSyscall[0]);
6710: 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 73   i++){.    if( s
6720: 74 72 63 6d 70 28 7a 4e 61 6d 65 2c 20 61 53 79  trcmp(zName, aSy
6730: 73 63 61 6c 6c 5b 69 5d 2e 7a 4e 61 6d 65 29 3d  scall[i].zName)=
6740: 3d 30 20 29 20 72 65 74 75 72 6e 20 61 53 79 73  =0 ) return aSys
6750: 63 61 6c 6c 5b 69 5d 2e 70 43 75 72 72 65 6e 74  call[i].pCurrent
6760: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30  ;.  }.  return 0
6770: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
6780: 6e 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68  n the name of th
6790: 65 20 66 69 72 73 74 20 73 79 73 74 65 6d 20 63  e first system c
67a0: 61 6c 6c 20 61 66 74 65 72 20 7a 4e 61 6d 65 2e  all after zName.
67b0: 20 20 49 66 20 7a 4e 61 6d 65 3d 3d 4e 55 4c 4c    If zName==NULL
67c0: 0a 2a 2a 20 74 68 65 6e 20 72 65 74 75 72 6e 20  .** then return 
67d0: 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20  the name of the 
67e0: 66 69 72 73 74 20 73 79 73 74 65 6d 20 63 61 6c  first system cal
67f0: 6c 2e 20 20 52 65 74 75 72 6e 20 4e 55 4c 4c 20  l.  Return NULL 
6800: 69 66 20 7a 4e 61 6d 65 0a 2a 2a 20 69 73 20 74  if zName.** is t
6810: 68 65 20 6c 61 73 74 20 73 79 73 74 65 6d 20 63  he last system c
6820: 61 6c 6c 20 6f 72 20 69 66 20 7a 4e 61 6d 65 20  all or if zName 
6830: 69 73 20 6e 6f 74 20 74 68 65 20 6e 61 6d 65 20  is not the name 
6840: 6f 66 20 61 20 76 61 6c 69 64 0a 2a 2a 20 73 79  of a valid.** sy
6850: 73 74 65 6d 20 63 61 6c 6c 2e 0a 2a 2f 0a 73 74  stem call..*/.st
6860: 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20  atic const char 
6870: 2a 75 6e 69 78 4e 65 78 74 53 79 73 74 65 6d 43  *unixNextSystemC
6880: 61 6c 6c 28 73 71 6c 69 74 65 33 5f 76 66 73 20  all(sqlite3_vfs 
6890: 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  *p, const char *
68a0: 7a 4e 61 6d 65 29 7b 0a 20 20 69 6e 74 20 69 20  zName){.  int i 
68b0: 3d 20 2d 31 3b 0a 0a 20 20 55 4e 55 53 45 44 5f  = -1;..  UNUSED_
68c0: 50 41 52 41 4d 45 54 45 52 28 70 29 3b 0a 20 20  PARAMETER(p);.  
68d0: 69 66 28 20 7a 4e 61 6d 65 20 29 7b 0a 20 20 20  if( zName ){.   
68e0: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 41 72 72 61   for(i=0; i<Arra
68f0: 79 53 69 7a 65 28 61 53 79 73 63 61 6c 6c 29 2d  ySize(aSyscall)-
6900: 31 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69  1; i++){.      i
6910: 66 28 20 73 74 72 63 6d 70 28 7a 4e 61 6d 65 2c  f( strcmp(zName,
6920: 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 7a 4e 61   aSyscall[i].zNa
6930: 6d 65 29 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a  me)==0 ) break;.
6940: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 66 6f 72 28      }.  }.  for(
6950: 69 2b 2b 3b 20 69 3c 41 72 72 61 79 53 69 7a 65  i++; i<ArraySize
6960: 28 61 53 79 73 63 61 6c 6c 29 3b 20 69 2b 2b 29  (aSyscall); i++)
6970: 7b 0a 20 20 20 20 69 66 28 20 61 53 79 73 63 61  {.    if( aSysca
6980: 6c 6c 5b 69 5d 2e 70 43 75 72 72 65 6e 74 21 3d  ll[i].pCurrent!=
6990: 30 20 29 20 72 65 74 75 72 6e 20 61 53 79 73 63  0 ) return aSysc
69a0: 61 6c 6c 5b 69 5d 2e 7a 4e 61 6d 65 3b 0a 20 20  all[i].zName;.  
69b0: 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  }.  return 0;.}.
69c0: 0a 2f 2a 0a 2a 2a 20 52 65 74 72 79 20 6f 70 65  ./*.** Retry ope
69d0: 6e 28 29 20 63 61 6c 6c 73 20 74 68 61 74 20 66  n() calls that f
69e0: 61 69 6c 20 64 75 65 20 74 6f 20 45 49 4e 54 52  ail due to EINTR
69f0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72  .*/.static int r
6a00: 6f 62 75 73 74 5f 6f 70 65 6e 28 63 6f 6e 73 74  obust_open(const
6a10: 20 63 68 61 72 20 2a 7a 2c 20 69 6e 74 20 66 2c   char *z, int f,
6a20: 20 69 6e 74 20 6d 29 7b 0a 20 20 69 6e 74 20 72   int m){.  int r
6a30: 63 3b 0a 20 20 64 6f 7b 20 72 63 20 3d 20 6f 73  c;.  do{ rc = os
6a40: 4f 70 65 6e 28 7a 2c 66 2c 6d 29 3b 20 7d 77 68  Open(z,f,m); }wh
6a50: 69 6c 65 28 20 72 63 3c 30 20 26 26 20 65 72 72  ile( rc<0 && err
6a60: 6e 6f 3d 3d 45 49 4e 54 52 20 29 3b 0a 20 20 72  no==EINTR );.  r
6a70: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
6a80: 2a 2a 20 48 65 6c 70 65 72 20 66 75 6e 63 74 69  ** Helper functi
6a90: 6f 6e 73 20 74 6f 20 6f 62 74 61 69 6e 20 61 6e  ons to obtain an
6aa0: 64 20 72 65 6c 69 6e 71 75 69 73 68 20 74 68 65  d relinquish the
6ab0: 20 67 6c 6f 62 61 6c 20 6d 75 74 65 78 2e 20 54   global mutex. T
6ac0: 68 65 0a 2a 2a 20 67 6c 6f 62 61 6c 20 6d 75 74  he.** global mut
6ad0: 65 78 20 69 73 20 75 73 65 64 20 74 6f 20 70 72  ex is used to pr
6ae0: 6f 74 65 63 74 20 74 68 65 20 75 6e 69 78 49 6e  otect the unixIn
6af0: 6f 64 65 49 6e 66 6f 20 61 6e 64 0a 2a 2a 20 76  odeInfo and.** v
6b00: 78 77 6f 72 6b 73 46 69 6c 65 49 64 20 6f 62 6a  xworksFileId obj
6b10: 65 63 74 73 20 75 73 65 64 20 62 79 20 74 68 69  ects used by thi
6b20: 73 20 66 69 6c 65 2c 20 61 6c 6c 20 6f 66 20 77  s file, all of w
6b30: 68 69 63 68 20 6d 61 79 20 62 65 20 0a 2a 2a 20  hich may be .** 
6b40: 73 68 61 72 65 64 20 62 79 20 6d 75 6c 74 69 70  shared by multip
6b50: 6c 65 20 74 68 72 65 61 64 73 2e 0a 2a 2a 0a 2a  le threads..**.*
6b60: 2a 20 46 75 6e 63 74 69 6f 6e 20 75 6e 69 78 4d  * Function unixM
6b70: 75 74 65 78 48 65 6c 64 28 29 20 69 73 20 75 73  utexHeld() is us
6b80: 65 64 20 74 6f 20 61 73 73 65 72 74 28 29 20 74  ed to assert() t
6b90: 68 61 74 20 74 68 65 20 67 6c 6f 62 61 6c 20 6d  hat the global m
6ba0: 75 74 65 78 20 0a 2a 2a 20 69 73 20 68 65 6c 64  utex .** is held
6bb0: 20 77 68 65 6e 20 72 65 71 75 69 72 65 64 2e 20   when required. 
6bc0: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
6bd0: 20 6f 6e 6c 79 20 75 73 65 64 20 61 73 20 70 61   only used as pa
6be0: 72 74 20 6f 66 20 61 73 73 65 72 74 28 29 20 0a  rt of assert() .
6bf0: 2a 2a 20 73 74 61 74 65 6d 65 6e 74 73 2e 20 65  ** statements. e
6c00: 2e 67 2e 0a 2a 2a 0a 2a 2a 20 20 20 75 6e 69 78  .g..**.**   unix
6c10: 45 6e 74 65 72 4d 75 74 65 78 28 29 0a 2a 2a 20  EnterMutex().** 
6c20: 20 20 20 20 61 73 73 65 72 74 28 20 75 6e 69 78      assert( unix
6c30: 4d 75 74 65 78 48 65 6c 64 28 29 20 29 3b 0a 2a  MutexHeld() );.*
6c40: 2a 20 20 20 75 6e 69 78 45 6e 74 65 72 4c 65 61  *   unixEnterLea
6c50: 76 65 28 29 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ve().*/.static v
6c60: 6f 69 64 20 75 6e 69 78 45 6e 74 65 72 4d 75 74  oid unixEnterMut
6c70: 65 78 28 76 6f 69 64 29 7b 0a 20 20 73 71 6c 69  ex(void){.  sqli
6c80: 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28  te3_mutex_enter(
6c90: 73 71 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f  sqlite3MutexAllo
6ca0: 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53  c(SQLITE_MUTEX_S
6cb0: 54 41 54 49 43 5f 4d 41 53 54 45 52 29 29 3b 0a  TATIC_MASTER));.
6cc0: 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 75 6e  }.static void un
6cd0: 69 78 4c 65 61 76 65 4d 75 74 65 78 28 76 6f 69  ixLeaveMutex(voi
6ce0: 64 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75  d){.  sqlite3_mu
6cf0: 74 65 78 5f 6c 65 61 76 65 28 73 71 6c 69 74 65  tex_leave(sqlite
6d00: 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49  3MutexAlloc(SQLI
6d10: 54 45 5f 4d 55 54 45 58 5f 53 54 41 54 49 43 5f  TE_MUTEX_STATIC_
6d20: 4d 41 53 54 45 52 29 29 3b 0a 7d 0a 23 69 66 64  MASTER));.}.#ifd
6d30: 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
6d40: 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 4d  static int unixM
6d50: 75 74 65 78 48 65 6c 64 28 76 6f 69 64 29 20 7b  utexHeld(void) {
6d60: 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65  .  return sqlite
6d70: 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 73 71 6c  3_mutex_held(sql
6d80: 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53  ite3MutexAlloc(S
6d90: 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54 41 54  QLITE_MUTEX_STAT
6da0: 49 43 5f 4d 41 53 54 45 52 29 29 3b 0a 7d 0a 23  IC_MASTER));.}.#
6db0: 65 6e 64 69 66 0a 0a 0a 23 69 66 64 65 66 20 53  endif...#ifdef S
6dc0: 51 4c 49 54 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a  QLITE_DEBUG./*.*
6dd0: 2a 20 48 65 6c 70 65 72 20 66 75 6e 63 74 69 6f  * Helper functio
6de0: 6e 20 66 6f 72 20 70 72 69 6e 74 69 6e 67 20 6f  n for printing o
6df0: 75 74 20 74 72 61 63 65 20 69 6e 66 6f 72 6d 61  ut trace informa
6e00: 74 69 6f 6e 20 66 72 6f 6d 20 64 65 62 75 67 67  tion from debugg
6e10: 69 6e 67 0a 2a 2a 20 62 69 6e 61 72 69 65 73 2e  ing.** binaries.
6e20: 20 54 68 69 73 20 72 65 74 75 72 6e 73 20 74 68   This returns th
6e30: 65 20 73 74 72 69 6e 67 20 72 65 70 72 65 73 65  e string represe
6e40: 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 73 75  tation of the su
6e50: 70 70 6c 69 65 64 0a 2a 2a 20 69 6e 74 65 67 65  pplied.** intege
6e60: 72 20 6c 6f 63 6b 2d 74 79 70 65 2e 0a 2a 2f 0a  r lock-type..*/.
6e70: 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61  static const cha
6e80: 72 20 2a 61 7a 46 69 6c 65 4c 6f 63 6b 28 69 6e  r *azFileLock(in
6e90: 74 20 65 46 69 6c 65 4c 6f 63 6b 29 7b 0a 20 20  t eFileLock){.  
6ea0: 73 77 69 74 63 68 28 20 65 46 69 6c 65 4c 6f 63  switch( eFileLoc
6eb0: 6b 20 29 7b 0a 20 20 20 20 63 61 73 65 20 4e 4f  k ){.    case NO
6ec0: 5f 4c 4f 43 4b 3a 20 72 65 74 75 72 6e 20 22 4e  _LOCK: return "N
6ed0: 4f 4e 45 22 3b 0a 20 20 20 20 63 61 73 65 20 53  ONE";.    case S
6ee0: 48 41 52 45 44 5f 4c 4f 43 4b 3a 20 72 65 74 75  HARED_LOCK: retu
6ef0: 72 6e 20 22 53 48 41 52 45 44 22 3b 0a 20 20 20  rn "SHARED";.   
6f00: 20 63 61 73 65 20 52 45 53 45 52 56 45 44 5f 4c   case RESERVED_L
6f10: 4f 43 4b 3a 20 72 65 74 75 72 6e 20 22 52 45 53  OCK: return "RES
6f20: 45 52 56 45 44 22 3b 0a 20 20 20 20 63 61 73 65  ERVED";.    case
6f30: 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 3a 20 72   PENDING_LOCK: r
6f40: 65 74 75 72 6e 20 22 50 45 4e 44 49 4e 47 22 3b  eturn "PENDING";
6f50: 0a 20 20 20 20 63 61 73 65 20 45 58 43 4c 55 53  .    case EXCLUS
6f60: 49 56 45 5f 4c 4f 43 4b 3a 20 72 65 74 75 72 6e  IVE_LOCK: return
6f70: 20 22 45 58 43 4c 55 53 49 56 45 22 3b 0a 20 20   "EXCLUSIVE";.  
6f80: 7d 0a 20 20 72 65 74 75 72 6e 20 22 45 52 52 4f  }.  return "ERRO
6f90: 52 22 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69  R";.}.#endif..#i
6fa0: 66 64 65 66 20 53 51 4c 49 54 45 5f 4c 4f 43 4b  fdef SQLITE_LOCK
6fb0: 5f 54 52 41 43 45 0a 2f 2a 0a 2a 2a 20 50 72 69  _TRACE./*.** Pri
6fc0: 6e 74 20 6f 75 74 20 69 6e 66 6f 72 6d 61 74 69  nt out informati
6fd0: 6f 6e 20 61 62 6f 75 74 20 61 6c 6c 20 6c 6f 63  on about all loc
6fe0: 6b 69 6e 67 20 6f 70 65 72 61 74 69 6f 6e 73 2e  king operations.
6ff0: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
7000: 69 6e 65 20 69 73 20 75 73 65 64 20 66 6f 72 20  ine is used for 
7010: 74 72 6f 75 62 6c 65 73 68 6f 6f 74 69 6e 67 20  troubleshooting 
7020: 6c 6f 63 6b 73 20 6f 6e 20 6d 75 6c 74 69 74 68  locks on multith
7030: 72 65 61 64 65 64 0a 2a 2a 20 70 6c 61 74 66 6f  readed.** platfo
7040: 72 6d 73 2e 20 20 45 6e 61 62 6c 65 20 62 79 20  rms.  Enable by 
7050: 63 6f 6d 70 69 6c 69 6e 67 20 77 69 74 68 20 74  compiling with t
7060: 68 65 20 2d 44 53 51 4c 49 54 45 5f 4c 4f 43 4b  he -DSQLITE_LOCK
7070: 5f 54 52 41 43 45 0a 2a 2a 20 63 6f 6d 6d 61 6e  _TRACE.** comman
7080: 64 2d 6c 69 6e 65 20 6f 70 74 69 6f 6e 20 6f 6e  d-line option on
7090: 20 74 68 65 20 63 6f 6d 70 69 6c 65 72 2e 20 20   the compiler.  
70a0: 54 68 69 73 20 63 6f 64 65 20 69 73 20 6e 6f 72  This code is nor
70b0: 6d 61 6c 6c 79 0a 2a 2a 20 74 75 72 6e 65 64 20  mally.** turned 
70c0: 6f 66 66 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  off..*/.static i
70d0: 6e 74 20 6c 6f 63 6b 54 72 61 63 65 28 69 6e 74  nt lockTrace(int
70e0: 20 66 64 2c 20 69 6e 74 20 6f 70 2c 20 73 74 72   fd, int op, str
70f0: 75 63 74 20 66 6c 6f 63 6b 20 2a 70 29 7b 0a 20  uct flock *p){. 
7100: 20 63 68 61 72 20 2a 7a 4f 70 4e 61 6d 65 2c 20   char *zOpName, 
7110: 2a 7a 54 79 70 65 3b 0a 20 20 69 6e 74 20 73 3b  *zType;.  int s;
7120: 0a 20 20 69 6e 74 20 73 61 76 65 64 45 72 72 6e  .  int savedErrn
7130: 6f 3b 0a 20 20 69 66 28 20 6f 70 3d 3d 46 5f 47  o;.  if( op==F_G
7140: 45 54 4c 4b 20 29 7b 0a 20 20 20 20 7a 4f 70 4e  ETLK ){.    zOpN
7150: 61 6d 65 20 3d 20 22 47 45 54 4c 4b 22 3b 0a 20  ame = "GETLK";. 
7160: 20 7d 65 6c 73 65 20 69 66 28 20 6f 70 3d 3d 46   }else if( op==F
7170: 5f 53 45 54 4c 4b 20 29 7b 0a 20 20 20 20 7a 4f  _SETLK ){.    zO
7180: 70 4e 61 6d 65 20 3d 20 22 53 45 54 4c 4b 22 3b  pName = "SETLK";
7190: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 20  .  }else{.    s 
71a0: 3d 20 6f 73 46 63 6e 74 6c 28 66 64 2c 20 6f 70  = osFcntl(fd, op
71b0: 2c 20 70 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , p);.    sqlite
71c0: 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 66 63  3DebugPrintf("fc
71d0: 6e 74 6c 20 75 6e 6b 6e 6f 77 6e 20 25 64 20 25  ntl unknown %d %
71e0: 64 20 25 64 5c 6e 22 2c 20 66 64 2c 20 6f 70 2c  d %d\n", fd, op,
71f0: 20 73 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20   s);.    return 
7200: 73 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e  s;.  }.  if( p->
7210: 6c 5f 74 79 70 65 3d 3d 46 5f 52 44 4c 43 4b 20  l_type==F_RDLCK 
7220: 29 7b 0a 20 20 20 20 7a 54 79 70 65 20 3d 20 22  ){.    zType = "
7230: 52 44 4c 43 4b 22 3b 0a 20 20 7d 65 6c 73 65 20  RDLCK";.  }else 
7240: 69 66 28 20 70 2d 3e 6c 5f 74 79 70 65 3d 3d 46  if( p->l_type==F
7250: 5f 57 52 4c 43 4b 20 29 7b 0a 20 20 20 20 7a 54  _WRLCK ){.    zT
7260: 79 70 65 20 3d 20 22 57 52 4c 43 4b 22 3b 0a 20  ype = "WRLCK";. 
7270: 20 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e 6c 5f   }else if( p->l_
7280: 74 79 70 65 3d 3d 46 5f 55 4e 4c 43 4b 20 29 7b  type==F_UNLCK ){
7290: 0a 20 20 20 20 7a 54 79 70 65 20 3d 20 22 55 4e  .    zType = "UN
72a0: 4c 43 4b 22 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  LCK";.  }else{. 
72b0: 20 20 20 61 73 73 65 72 74 28 20 30 20 29 3b 0a     assert( 0 );.
72c0: 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 2d    }.  assert( p-
72d0: 3e 6c 5f 77 68 65 6e 63 65 3d 3d 53 45 45 4b 5f  >l_whence==SEEK_
72e0: 53 45 54 20 29 3b 0a 20 20 73 20 3d 20 6f 73 46  SET );.  s = osF
72f0: 63 6e 74 6c 28 66 64 2c 20 6f 70 2c 20 70 29 3b  cntl(fd, op, p);
7300: 0a 20 20 73 61 76 65 64 45 72 72 6e 6f 20 3d 20  .  savedErrno = 
7310: 65 72 72 6e 6f 3b 0a 20 20 73 71 6c 69 74 65 33  errno;.  sqlite3
7320: 44 65 62 75 67 50 72 69 6e 74 66 28 22 66 63 6e  DebugPrintf("fcn
7330: 74 6c 20 25 64 20 25 64 20 25 73 20 25 73 20 25  tl %d %d %s %s %
7340: 64 20 25 64 20 25 64 20 25 64 5c 6e 22 2c 0a 20  d %d %d %d\n",. 
7350: 20 20 20 20 74 68 72 65 61 64 69 64 2c 20 66 64      threadid, fd
7360: 2c 20 7a 4f 70 4e 61 6d 65 2c 20 7a 54 79 70 65  , zOpName, zType
7370: 2c 20 28 69 6e 74 29 70 2d 3e 6c 5f 73 74 61 72  , (int)p->l_star
7380: 74 2c 20 28 69 6e 74 29 70 2d 3e 6c 5f 6c 65 6e  t, (int)p->l_len
7390: 2c 0a 20 20 20 20 20 28 69 6e 74 29 70 2d 3e 6c  ,.     (int)p->l
73a0: 5f 70 69 64 2c 20 73 29 3b 0a 20 20 69 66 28 20  _pid, s);.  if( 
73b0: 73 3d 3d 28 2d 31 29 20 26 26 20 6f 70 3d 3d 46  s==(-1) && op==F
73c0: 5f 53 45 54 4c 4b 20 26 26 20 28 70 2d 3e 6c 5f  _SETLK && (p->l_
73d0: 74 79 70 65 3d 3d 46 5f 52 44 4c 43 4b 20 7c 7c  type==F_RDLCK ||
73e0: 20 70 2d 3e 6c 5f 74 79 70 65 3d 3d 46 5f 57 52   p->l_type==F_WR
73f0: 4c 43 4b 29 20 29 7b 0a 20 20 20 20 73 74 72 75  LCK) ){.    stru
7400: 63 74 20 66 6c 6f 63 6b 20 6c 32 3b 0a 20 20 20  ct flock l2;.   
7410: 20 6c 32 20 3d 20 2a 70 3b 0a 20 20 20 20 6f 73   l2 = *p;.    os
7420: 46 63 6e 74 6c 28 66 64 2c 20 46 5f 47 45 54 4c  Fcntl(fd, F_GETL
7430: 4b 2c 20 26 6c 32 29 3b 0a 20 20 20 20 69 66 28  K, &l2);.    if(
7440: 20 6c 32 2e 6c 5f 74 79 70 65 3d 3d 46 5f 52 44   l2.l_type==F_RD
7450: 4c 43 4b 20 29 7b 0a 20 20 20 20 20 20 7a 54 79  LCK ){.      zTy
7460: 70 65 20 3d 20 22 52 44 4c 43 4b 22 3b 0a 20 20  pe = "RDLCK";.  
7470: 20 20 7d 65 6c 73 65 20 69 66 28 20 6c 32 2e 6c    }else if( l2.l
7480: 5f 74 79 70 65 3d 3d 46 5f 57 52 4c 43 4b 20 29  _type==F_WRLCK )
7490: 7b 0a 20 20 20 20 20 20 7a 54 79 70 65 20 3d 20  {.      zType = 
74a0: 22 57 52 4c 43 4b 22 3b 0a 20 20 20 20 7d 65 6c  "WRLCK";.    }el
74b0: 73 65 20 69 66 28 20 6c 32 2e 6c 5f 74 79 70 65  se if( l2.l_type
74c0: 3d 3d 46 5f 55 4e 4c 43 4b 20 29 7b 0a 20 20 20  ==F_UNLCK ){.   
74d0: 20 20 20 7a 54 79 70 65 20 3d 20 22 55 4e 4c 43     zType = "UNLC
74e0: 4b 22 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  K";.    }else{. 
74f0: 20 20 20 20 20 61 73 73 65 72 74 28 20 30 20 29       assert( 0 )
7500: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
7510: 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22  te3DebugPrintf("
7520: 66 63 6e 74 6c 2d 66 61 69 6c 75 72 65 2d 72 65  fcntl-failure-re
7530: 61 73 6f 6e 3a 20 25 73 20 25 64 20 25 64 20 25  ason: %s %d %d %
7540: 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 7a 54 79  d\n",.       zTy
7550: 70 65 2c 20 28 69 6e 74 29 6c 32 2e 6c 5f 73 74  pe, (int)l2.l_st
7560: 61 72 74 2c 20 28 69 6e 74 29 6c 32 2e 6c 5f 6c  art, (int)l2.l_l
7570: 65 6e 2c 20 28 69 6e 74 29 6c 32 2e 6c 5f 70 69  en, (int)l2.l_pi
7580: 64 29 3b 0a 20 20 7d 0a 20 20 65 72 72 6e 6f 20  d);.  }.  errno 
7590: 3d 20 73 61 76 65 64 45 72 72 6e 6f 3b 0a 20 20  = savedErrno;.  
75a0: 72 65 74 75 72 6e 20 73 3b 0a 7d 0a 23 75 6e 64  return s;.}.#und
75b0: 65 66 20 6f 73 46 63 6e 74 6c 0a 23 64 65 66 69  ef osFcntl.#defi
75c0: 6e 65 20 6f 73 46 63 6e 74 6c 20 6c 6f 63 6b 54  ne osFcntl lockT
75d0: 72 61 63 65 0a 23 65 6e 64 69 66 20 2f 2a 20 53  race.#endif /* S
75e0: 51 4c 49 54 45 5f 4c 4f 43 4b 5f 54 52 41 43 45  QLITE_LOCK_TRACE
75f0: 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 72 79   */../*.** Retry
7600: 20 66 74 72 75 6e 63 61 74 65 28 29 20 63 61 6c   ftruncate() cal
7610: 6c 73 20 74 68 61 74 20 66 61 69 6c 20 64 75 65  ls that fail due
7620: 20 74 6f 20 45 49 4e 54 52 0a 2a 2f 0a 73 74 61   to EINTR.*/.sta
7630: 74 69 63 20 69 6e 74 20 72 6f 62 75 73 74 5f 66  tic int robust_f
7640: 74 72 75 6e 63 61 74 65 28 69 6e 74 20 68 2c 20  truncate(int h, 
7650: 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 73 7a  sqlite3_int64 sz
7660: 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 64  ){.  int rc;.  d
7670: 6f 7b 20 72 63 20 3d 20 6f 73 46 74 72 75 6e 63  o{ rc = osFtrunc
7680: 61 74 65 28 68 2c 73 7a 29 3b 20 7d 77 68 69 6c  ate(h,sz); }whil
7690: 65 28 20 72 63 3c 30 20 26 26 20 65 72 72 6e 6f  e( rc<0 && errno
76a0: 3d 3d 45 49 4e 54 52 20 29 3b 0a 20 20 72 65 74  ==EINTR );.  ret
76b0: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
76c0: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 74 72   This routine tr
76d0: 61 6e 73 6c 61 74 65 73 20 61 20 73 74 61 6e 64  anslates a stand
76e0: 61 72 64 20 50 4f 53 49 58 20 65 72 72 6e 6f 20  ard POSIX errno 
76f0: 63 6f 64 65 20 69 6e 74 6f 20 73 6f 6d 65 74 68  code into someth
7700: 69 6e 67 0a 2a 2a 20 75 73 65 66 75 6c 20 74 6f  ing.** useful to
7710: 20 74 68 65 20 63 6c 69 65 6e 74 73 20 6f 66 20   the clients of 
7720: 74 68 65 20 73 71 6c 69 74 65 33 20 66 75 6e 63  the sqlite3 func
7730: 74 69 6f 6e 73 2e 20 20 53 70 65 63 69 66 69 63  tions.  Specific
7740: 61 6c 6c 79 2c 20 69 74 20 69 73 0a 2a 2a 20 69  ally, it is.** i
7750: 6e 74 65 6e 64 65 64 20 74 6f 20 74 72 61 6e 73  ntended to trans
7760: 6c 61 74 65 20 61 20 76 61 72 69 65 74 79 20 6f  late a variety o
7770: 66 20 22 74 72 79 20 61 67 61 69 6e 22 20 65 72  f "try again" er
7780: 72 6f 72 73 20 69 6e 74 6f 20 53 51 4c 49 54 45  rors into SQLITE
7790: 5f 42 55 53 59 0a 2a 2a 20 61 6e 64 20 61 20 76  _BUSY.** and a v
77a0: 61 72 69 65 74 79 20 6f 66 20 22 70 6c 65 61 73  ariety of "pleas
77b0: 65 20 63 6c 6f 73 65 20 74 68 65 20 66 69 6c 65  e close the file
77c0: 20 64 65 73 63 72 69 70 74 6f 72 20 4e 4f 57 22   descriptor NOW"
77d0: 20 65 72 72 6f 72 73 20 69 6e 74 6f 20 0a 2a 2a   errors into .**
77e0: 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 0a 2a 2a   SQLITE_IOERR.**
77f0: 20 0a 2a 2a 20 45 72 72 6f 72 73 20 64 75 72 69   .** Errors duri
7800: 6e 67 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f  ng initializatio
7810: 6e 20 6f 66 20 6c 6f 63 6b 73 2c 20 6f 72 20 66  n of locks, or f
7820: 69 6c 65 20 73 79 73 74 65 6d 20 73 75 70 70 6f  ile system suppo
7830: 72 74 20 66 6f 72 20 6c 6f 63 6b 73 2c 0a 2a 2a  rt for locks,.**
7840: 20 73 68 6f 75 6c 64 20 68 61 6e 64 6c 65 20 45   should handle E
7850: 4e 4f 4c 43 4b 2c 20 45 4e 4f 54 53 55 50 2c 20  NOLCK, ENOTSUP, 
7860: 45 4f 50 4e 4f 54 53 55 50 50 20 73 65 70 61 72  EOPNOTSUPP separ
7870: 61 74 65 6c 79 2e 0a 2a 2f 0a 73 74 61 74 69 63  ately..*/.static
7880: 20 69 6e 74 20 73 71 6c 69 74 65 45 72 72 6f 72   int sqliteError
7890: 46 72 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28 69  FromPosixError(i
78a0: 6e 74 20 70 6f 73 69 78 45 72 72 6f 72 2c 20 69  nt posixError, i
78b0: 6e 74 20 73 71 6c 69 74 65 49 4f 45 72 72 29 20  nt sqliteIOErr) 
78c0: 7b 0a 20 20 73 77 69 74 63 68 20 28 70 6f 73 69  {.  switch (posi
78d0: 78 45 72 72 6f 72 29 20 7b 0a 23 69 66 20 30 0a  xError) {.#if 0.
78e0: 20 20 2f 2a 20 41 74 20 6f 6e 65 20 70 6f 69 6e    /* At one poin
78f0: 74 20 74 68 69 73 20 63 6f 64 65 20 77 61 73 20  t this code was 
7900: 6e 6f 74 20 63 6f 6d 6d 65 6e 74 65 64 20 6f 75  not commented ou
7910: 74 2e 20 49 6e 20 74 68 65 6f 72 79 2c 20 74 68  t. In theory, th
7920: 69 73 20 62 72 61 6e 63 68 0a 20 20 2a 2a 20 73  is branch.  ** s
7930: 68 6f 75 6c 64 20 6e 65 76 65 72 20 62 65 20 68  hould never be h
7940: 69 74 2c 20 61 73 20 74 68 69 73 20 66 75 6e 63  it, as this func
7950: 74 69 6f 6e 20 73 68 6f 75 6c 64 20 6f 6e 6c 79  tion should only
7960: 20 62 65 20 63 61 6c 6c 65 64 20 61 66 74 65 72   be called after
7970: 0a 20 20 2a 2a 20 61 20 6c 6f 63 6b 69 6e 67 2d  .  ** a locking-
7980: 72 65 6c 61 74 65 64 20 66 75 6e 63 74 69 6f 6e  related function
7990: 20 28 69 2e 65 2e 20 66 63 6e 74 6c 28 29 29 20   (i.e. fcntl()) 
79a0: 68 61 73 20 72 65 74 75 72 6e 65 64 20 6e 6f 6e  has returned non
79b0: 2d 7a 65 72 6f 20 77 69 74 68 0a 20 20 2a 2a 20  -zero with.  ** 
79c0: 74 68 65 20 76 61 6c 75 65 20 6f 66 20 65 72 72  the value of err
79d0: 6e 6f 20 61 73 20 74 68 65 20 66 69 72 73 74 20  no as the first 
79e0: 61 72 67 75 6d 65 6e 74 2e 20 53 69 6e 63 65 20  argument. Since 
79f0: 61 20 73 79 73 74 65 6d 20 63 61 6c 6c 20 68 61  a system call ha
7a00: 73 20 66 61 69 6c 65 64 2c 0a 20 20 2a 2a 20 65  s failed,.  ** e
7a10: 72 72 6e 6f 20 73 68 6f 75 6c 64 20 62 65 20 6e  rrno should be n
7a20: 6f 6e 2d 7a 65 72 6f 2e 0a 20 20 2a 2a 0a 20 20  on-zero..  **.  
7a30: 2a 2a 20 44 65 73 70 69 74 65 20 74 68 69 73 2c  ** Despite this,
7a40: 20 69 66 20 65 72 72 6e 6f 20 72 65 61 6c 6c 79   if errno really
7a50: 20 69 73 20 7a 65 72 6f 2c 20 77 65 20 73 74 69   is zero, we sti
7a60: 6c 6c 20 64 6f 6e 27 74 20 77 61 6e 74 20 74 6f  ll don't want to
7a70: 20 72 65 74 75 72 6e 0a 20 20 2a 2a 20 53 51 4c   return.  ** SQL
7a80: 49 54 45 5f 4f 4b 2e 20 54 68 65 20 73 79 73 74  ITE_OK. The syst
7a90: 65 6d 20 63 61 6c 6c 20 66 61 69 6c 65 64 2c 20  em call failed, 
7aa0: 61 6e 64 20 2a 73 6f 6d 65 2a 20 53 51 4c 69 74  and *some* SQLit
7ab0: 65 20 65 72 72 6f 72 20 73 68 6f 75 6c 64 20 62  e error should b
7ac0: 65 0a 20 20 2a 2a 20 70 72 6f 70 61 67 61 74 65  e.  ** propagate
7ad0: 64 20 62 61 63 6b 20 74 6f 20 74 68 65 20 63 61  d back to the ca
7ae0: 6c 6c 65 72 2e 20 43 6f 6d 6d 65 6e 74 69 6e 67  ller. Commenting
7af0: 20 74 68 69 73 20 62 72 61 6e 63 68 20 6f 75 74   this branch out
7b00: 20 6d 65 61 6e 73 20 65 72 72 6e 6f 3d 3d 30 0a   means errno==0.
7b10: 20 20 2a 2a 20 77 69 6c 6c 20 62 65 20 68 61 6e    ** will be han
7b20: 64 6c 65 64 20 62 79 20 74 68 65 20 22 64 65 66  dled by the "def
7b30: 61 75 6c 74 3a 22 20 63 61 73 65 20 62 65 6c 6f  ault:" case belo
7b40: 77 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 30  w..  */.  case 0
7b50: 3a 20 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  : .    return SQ
7b60: 4c 49 54 45 5f 4f 4b 3b 0a 23 65 6e 64 69 66 0a  LITE_OK;.#endif.
7b70: 0a 20 20 63 61 73 65 20 45 41 47 41 49 4e 3a 0a  .  case EAGAIN:.
7b80: 20 20 63 61 73 65 20 45 54 49 4d 45 44 4f 55 54    case ETIMEDOUT
7b90: 3a 0a 20 20 63 61 73 65 20 45 42 55 53 59 3a 0a  :.  case EBUSY:.
7ba0: 20 20 63 61 73 65 20 45 49 4e 54 52 3a 0a 20 20    case EINTR:.  
7bb0: 63 61 73 65 20 45 4e 4f 4c 43 4b 3a 20 20 0a 20  case ENOLCK:  . 
7bc0: 20 20 20 2f 2a 20 72 61 6e 64 6f 6d 20 4e 46 53     /* random NFS
7bd0: 20 72 65 74 72 79 20 65 72 72 6f 72 2c 20 75 6e   retry error, un
7be0: 6c 65 73 73 20 64 75 72 69 6e 67 20 66 69 6c 65  less during file
7bf0: 20 73 79 73 74 65 6d 20 73 75 70 70 6f 72 74 20   system support 
7c00: 0a 20 20 20 20 20 2a 20 69 6e 74 72 6f 73 70 65  .     * introspe
7c10: 63 74 69 6f 6e 2c 20 69 6e 20 77 68 69 63 68 20  ction, in which 
7c20: 69 74 20 61 63 74 75 61 6c 6c 79 20 6d 65 61 6e  it actually mean
7c30: 73 20 77 68 61 74 20 69 74 20 73 61 79 73 20 2a  s what it says *
7c40: 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  /.    return SQL
7c50: 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 0a 20  ITE_BUSY;.    . 
7c60: 20 63 61 73 65 20 45 41 43 43 45 53 3a 20 0a 20   case EACCES: . 
7c70: 20 20 20 2f 2a 20 45 41 43 43 45 53 20 69 73 20     /* EACCES is 
7c80: 6c 69 6b 65 20 45 41 47 41 49 4e 20 64 75 72 69  like EAGAIN duri
7c90: 6e 67 20 6c 6f 63 6b 69 6e 67 20 6f 70 65 72 61  ng locking opera
7ca0: 74 69 6f 6e 73 2c 20 62 75 74 20 6e 6f 74 20 61  tions, but not a
7cb0: 6e 79 20 6f 74 68 65 72 20 74 69 6d 65 2a 2f 0a  ny other time*/.
7cc0: 20 20 20 20 69 66 28 20 28 73 71 6c 69 74 65 49      if( (sqliteI
7cd0: 4f 45 72 72 20 3d 3d 20 53 51 4c 49 54 45 5f 49  OErr == SQLITE_I
7ce0: 4f 45 52 52 5f 4c 4f 43 4b 29 20 7c 7c 20 0a 09  OERR_LOCK) || ..
7cf0: 28 73 71 6c 69 74 65 49 4f 45 72 72 20 3d 3d 20  (sqliteIOErr == 
7d00: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c  SQLITE_IOERR_UNL
7d10: 4f 43 4b 29 20 7c 7c 20 0a 09 28 73 71 6c 69 74  OCK) || ..(sqlit
7d20: 65 49 4f 45 72 72 20 3d 3d 20 53 51 4c 49 54 45  eIOErr == SQLITE
7d30: 5f 49 4f 45 52 52 5f 52 44 4c 4f 43 4b 29 20 7c  _IOERR_RDLOCK) |
7d40: 7c 0a 09 28 73 71 6c 69 74 65 49 4f 45 72 72 20  |..(sqliteIOErr 
7d50: 3d 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  == SQLITE_IOERR_
7d60: 43 48 45 43 4b 52 45 53 45 52 56 45 44 4c 4f 43  CHECKRESERVEDLOC
7d70: 4b 29 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  K) ){.      retu
7d80: 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a  rn SQLITE_BUSY;.
7d90: 20 20 20 20 7d 0a 20 20 20 20 2f 2a 20 65 6c 73      }.    /* els
7da0: 65 20 66 61 6c 6c 20 74 68 72 6f 75 67 68 20 2a  e fall through *
7db0: 2f 0a 20 20 63 61 73 65 20 45 50 45 52 4d 3a 20  /.  case EPERM: 
7dc0: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
7dd0: 54 45 5f 50 45 52 4d 3b 0a 20 20 20 20 0a 20 20  TE_PERM;.    .  
7de0: 2f 2a 20 45 44 45 41 44 4c 4b 20 69 73 20 6f 6e  /* EDEADLK is on
7df0: 6c 79 20 70 6f 73 73 69 62 6c 65 20 69 66 20 61  ly possible if a
7e00: 20 63 61 6c 6c 20 74 6f 20 66 63 6e 74 6c 28 46   call to fcntl(F
7e10: 5f 53 45 54 4c 4b 57 29 20 69 73 20 6d 61 64 65  _SETLKW) is made
7e20: 2e 20 41 6e 64 0a 20 20 2a 2a 20 74 68 69 73 20  . And.  ** this 
7e30: 6d 6f 64 75 6c 65 20 6e 65 76 65 72 20 6d 61 6b  module never mak
7e40: 65 73 20 73 75 63 68 20 61 20 63 61 6c 6c 2e 20  es such a call. 
7e50: 41 6e 64 20 74 68 65 20 63 6f 64 65 20 69 6e 20  And the code in 
7e60: 53 51 4c 69 74 65 20 69 74 73 65 6c 66 20 0a 20  SQLite itself . 
7e70: 20 2a 2a 20 61 73 73 65 72 74 73 20 74 68 61 74   ** asserts that
7e80: 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 42 4c   SQLITE_IOERR_BL
7e90: 4f 43 4b 45 44 20 69 73 20 6e 65 76 65 72 20 72  OCKED is never r
7ea0: 65 74 75 72 6e 65 64 2e 20 46 6f 72 20 74 68 65  eturned. For the
7eb0: 73 65 20 72 65 61 73 6f 6e 73 0a 20 20 2a 2a 20  se reasons.  ** 
7ec0: 74 68 69 73 20 63 61 73 65 20 69 73 20 61 6c 73  this case is als
7ed0: 6f 20 63 6f 6d 6d 65 6e 74 65 64 20 6f 75 74 2e  o commented out.
7ee0: 20 49 66 20 74 68 65 20 73 79 73 74 65 6d 20 64   If the system d
7ef0: 6f 65 73 20 73 65 74 20 65 72 72 6e 6f 20 74 6f  oes set errno to
7f00: 20 45 44 45 41 44 4c 4b 2c 0a 20 20 2a 2a 20 74   EDEADLK,.  ** t
7f10: 68 65 20 64 65 66 61 75 6c 74 20 53 51 4c 49 54  he default SQLIT
7f20: 45 5f 49 4f 45 52 52 5f 58 58 58 20 63 6f 64 65  E_IOERR_XXX code
7f30: 20 77 69 6c 6c 20 62 65 20 72 65 74 75 72 6e 65   will be returne
7f40: 64 2e 20 2a 2f 0a 23 69 66 20 30 0a 20 20 63 61  d. */.#if 0.  ca
7f50: 73 65 20 45 44 45 41 44 4c 4b 3a 0a 20 20 20 20  se EDEADLK:.    
7f60: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f  return SQLITE_IO
7f70: 45 52 52 5f 42 4c 4f 43 4b 45 44 3b 0a 23 65 6e  ERR_BLOCKED;.#en
7f80: 64 69 66 0a 20 20 20 20 0a 23 69 66 20 45 4f 50  dif.    .#if EOP
7f90: 4e 4f 54 53 55 50 50 21 3d 45 4e 4f 54 53 55 50  NOTSUPP!=ENOTSUP
7fa0: 0a 20 20 63 61 73 65 20 45 4f 50 4e 4f 54 53 55  .  case EOPNOTSU
7fb0: 50 50 3a 20 0a 20 20 20 20 2f 2a 20 73 6f 6d 65  PP: .    /* some
7fc0: 74 68 69 6e 67 20 77 65 6e 74 20 74 65 72 72 69  thing went terri
7fd0: 62 6c 79 20 61 77 72 79 2c 20 75 6e 6c 65 73 73  bly awry, unless
7fe0: 20 64 75 72 69 6e 67 20 66 69 6c 65 20 73 79 73   during file sys
7ff0: 74 65 6d 20 73 75 70 70 6f 72 74 20 0a 20 20 20  tem support .   
8000: 20 20 2a 20 69 6e 74 72 6f 73 70 65 63 74 69 6f    * introspectio
8010: 6e 2c 20 69 6e 20 77 68 69 63 68 20 69 74 20 61  n, in which it a
8020: 63 74 75 61 6c 6c 79 20 6d 65 61 6e 73 20 77 68  ctually means wh
8030: 61 74 20 69 74 20 73 61 79 73 20 2a 2f 0a 23 65  at it says */.#e
8040: 6e 64 69 66 0a 23 69 66 64 65 66 20 45 4e 4f 54  ndif.#ifdef ENOT
8050: 53 55 50 0a 20 20 63 61 73 65 20 45 4e 4f 54 53  SUP.  case ENOTS
8060: 55 50 3a 20 0a 20 20 20 20 2f 2a 20 69 6e 76 61  UP: .    /* inva
8070: 6c 69 64 20 66 64 2c 20 75 6e 6c 65 73 73 20 64  lid fd, unless d
8080: 75 72 69 6e 67 20 66 69 6c 65 20 73 79 73 74 65  uring file syste
8090: 6d 20 73 75 70 70 6f 72 74 20 69 6e 74 72 6f 73  m support intros
80a0: 70 65 63 74 69 6f 6e 2c 20 69 6e 20 77 68 69 63  pection, in whic
80b0: 68 20 0a 20 20 20 20 20 2a 20 69 74 20 61 63 74  h .     * it act
80c0: 75 61 6c 6c 79 20 6d 65 61 6e 73 20 77 68 61 74  ually means what
80d0: 20 69 74 20 73 61 79 73 20 2a 2f 0a 23 65 6e 64   it says */.#end
80e0: 69 66 0a 20 20 63 61 73 65 20 45 49 4f 3a 0a 20  if.  case EIO:. 
80f0: 20 63 61 73 65 20 45 42 41 44 46 3a 0a 20 20 63   case EBADF:.  c
8100: 61 73 65 20 45 49 4e 56 41 4c 3a 0a 20 20 63 61  ase EINVAL:.  ca
8110: 73 65 20 45 4e 4f 54 43 4f 4e 4e 3a 0a 20 20 63  se ENOTCONN:.  c
8120: 61 73 65 20 45 4e 4f 44 45 56 3a 0a 20 20 63 61  ase ENODEV:.  ca
8130: 73 65 20 45 4e 58 49 4f 3a 0a 20 20 63 61 73 65  se ENXIO:.  case
8140: 20 45 4e 4f 45 4e 54 3a 0a 23 69 66 64 65 66 20   ENOENT:.#ifdef 
8150: 45 53 54 41 4c 45 20 20 20 20 20 20 20 20 20 20  ESTALE          
8160: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 53             /* ES
8170: 54 41 4c 45 20 69 73 20 6e 6f 74 20 64 65 66 69  TALE is not defi
8180: 6e 65 64 20 6f 6e 20 49 6e 74 65 72 69 78 20 73  ned on Interix s
8190: 79 73 74 65 6d 73 20 2a 2f 0a 20 20 63 61 73 65  ystems */.  case
81a0: 20 45 53 54 41 4c 45 3a 0a 23 65 6e 64 69 66 0a   ESTALE:.#endif.
81b0: 20 20 63 61 73 65 20 45 4e 4f 53 59 53 3a 0a 20    case ENOSYS:. 
81c0: 20 20 20 2f 2a 20 74 68 65 73 65 20 73 68 6f 75     /* these shou
81d0: 6c 64 20 66 6f 72 63 65 20 74 68 65 20 63 6c 69  ld force the cli
81e0: 65 6e 74 20 74 6f 20 63 6c 6f 73 65 20 74 68 65  ent to close the
81f0: 20 66 69 6c 65 20 61 6e 64 20 72 65 63 6f 6e 6e   file and reconn
8200: 65 63 74 20 2a 2f 0a 20 20 20 20 0a 20 20 64 65  ect */.    .  de
8210: 66 61 75 6c 74 3a 20 0a 20 20 20 20 72 65 74 75  fault: .    retu
8220: 72 6e 20 73 71 6c 69 74 65 49 4f 45 72 72 3b 0a  rn sqliteIOErr;.
8230: 20 20 7d 0a 7d 0a 0a 0a 0a 2f 2a 2a 2a 2a 2a 2a    }.}..../******
8240: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8250: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8260: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8270: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8280: 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a  ********.*******
8290: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 42 65 67 69  *********** Begi
82a0: 6e 20 55 6e 69 71 75 65 20 46 69 6c 65 20 49 44  n Unique File ID
82b0: 20 55 74 69 6c 69 74 79 20 55 73 65 64 20 42 79   Utility Used By
82c0: 20 56 78 57 6f 72 6b 73 20 2a 2a 2a 2a 2a 2a 2a   VxWorks *******
82d0: 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 4f  ********.**.** O
82e0: 6e 20 6d 6f 73 74 20 76 65 72 73 69 6f 6e 73 20  n most versions 
82f0: 6f 66 20 75 6e 69 78 2c 20 77 65 20 63 61 6e 20  of unix, we can 
8300: 67 65 74 20 61 20 75 6e 69 71 75 65 20 49 44 20  get a unique ID 
8310: 66 6f 72 20 61 20 66 69 6c 65 20 62 79 20 63 6f  for a file by co
8320: 6e 63 61 74 65 6e 61 74 69 6e 67 0a 2a 2a 20 74  ncatenating.** t
8330: 68 65 20 64 65 76 69 63 65 20 6e 75 6d 62 65 72  he device number
8340: 20 61 6e 64 20 74 68 65 20 69 6e 6f 64 65 20 6e   and the inode n
8350: 75 6d 62 65 72 2e 20 20 42 75 74 20 74 68 69 73  umber.  But this
8360: 20 64 6f 65 73 20 6e 6f 74 20 77 6f 72 6b 20 6f   does not work o
8370: 6e 20 56 78 57 6f 72 6b 73 2e 0a 2a 2a 20 4f 6e  n VxWorks..** On
8380: 20 56 78 57 6f 72 6b 73 2c 20 61 20 75 6e 69 71   VxWorks, a uniq
8390: 75 65 20 66 69 6c 65 20 69 64 20 6d 75 73 74 20  ue file id must 
83a0: 62 65 20 62 61 73 65 64 20 6f 6e 20 74 68 65 20  be based on the 
83b0: 63 61 6e 6f 6e 69 63 61 6c 20 66 69 6c 65 6e 61  canonical filena
83c0: 6d 65 2e 0a 2a 2a 0a 2a 2a 20 41 20 70 6f 69 6e  me..**.** A poin
83d0: 74 65 72 20 74 6f 20 61 6e 20 69 6e 73 74 61 6e  ter to an instan
83e0: 63 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77  ce of the follow
83f0: 69 6e 67 20 73 74 72 75 63 74 75 72 65 20 63 61  ing structure ca
8400: 6e 20 62 65 20 75 73 65 64 20 61 73 20 61 0a 2a  n be used as a.*
8410: 2a 20 75 6e 69 71 75 65 20 66 69 6c 65 20 49 44  * unique file ID
8420: 20 69 6e 20 56 78 57 6f 72 6b 73 2e 20 20 45 61   in VxWorks.  Ea
8430: 63 68 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74  ch instance of t
8440: 68 69 73 20 73 74 72 75 63 74 75 72 65 20 63 6f  his structure co
8450: 6e 74 61 69 6e 73 0a 2a 2a 20 61 20 63 6f 70 79  ntains.** a copy
8460: 20 6f 66 20 74 68 65 20 63 61 6e 6f 6e 69 63 61   of the canonica
8470: 6c 20 66 69 6c 65 6e 61 6d 65 2e 20 20 54 68 65  l filename.  The
8480: 72 65 20 69 73 20 61 6c 73 6f 20 61 20 72 65 66  re is also a ref
8490: 65 72 65 6e 63 65 20 63 6f 75 6e 74 2e 20 20 0a  erence count.  .
84a0: 2a 2a 20 54 68 65 20 73 74 72 75 63 74 75 72 65  ** The structure
84b0: 20 69 73 20 72 65 63 6c 61 69 6d 65 64 20 77 68   is reclaimed wh
84c0: 65 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  en the number of
84d0: 20 70 6f 69 6e 74 65 72 73 20 74 6f 20 69 74 20   pointers to it 
84e0: 64 72 6f 70 73 20 74 6f 0a 2a 2a 20 7a 65 72 6f  drops to.** zero
84f0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65 20 61 72  ..**.** There ar
8500: 65 20 6e 65 76 65 72 20 76 65 72 79 20 6d 61 6e  e never very man
8510: 79 20 66 69 6c 65 73 20 6f 70 65 6e 20 61 74 20  y files open at 
8520: 6f 6e 65 20 74 69 6d 65 20 61 6e 64 20 6c 6f 6f  one time and loo
8530: 6b 75 70 73 20 61 72 65 20 6e 6f 74 0a 2a 2a 20  kups are not.** 
8540: 61 20 70 65 72 66 6f 72 6d 61 6e 63 65 2d 63 72  a performance-cr
8550: 69 74 69 63 61 6c 20 70 61 74 68 2c 20 73 6f 20  itical path, so 
8560: 69 74 20 69 73 20 73 75 66 66 69 63 69 65 6e 74  it is sufficient
8570: 20 74 6f 20 70 75 74 20 74 68 65 73 65 0a 2a 2a   to put these.**
8580: 20 73 74 72 75 63 74 75 72 65 73 20 6f 6e 20 61   structures on a
8590: 20 6c 69 6e 6b 65 64 20 6c 69 73 74 2e 0a 2a 2f   linked list..*/
85a0: 0a 73 74 72 75 63 74 20 76 78 77 6f 72 6b 73 46  .struct vxworksF
85b0: 69 6c 65 49 64 20 7b 0a 20 20 73 74 72 75 63 74  ileId {.  struct
85c0: 20 76 78 77 6f 72 6b 73 46 69 6c 65 49 64 20 2a   vxworksFileId *
85d0: 70 4e 65 78 74 3b 20 20 2f 2a 20 4e 65 78 74 20  pNext;  /* Next 
85e0: 69 6e 20 61 20 6c 69 73 74 20 6f 66 20 74 68 65  in a list of the
85f0: 6d 20 61 6c 6c 20 2a 2f 0a 20 20 69 6e 74 20 6e  m all */.  int n
8600: 52 65 66 3b 20 20 20 20 20 20 20 20 20 20 20 20  Ref;            
8610: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
8620: 65 72 20 6f 66 20 72 65 66 65 72 65 6e 63 65 73  er of references
8630: 20 74 6f 20 74 68 69 73 20 6f 6e 65 20 2a 2f 0a   to this one */.
8640: 20 20 69 6e 74 20 6e 4e 61 6d 65 3b 20 20 20 20    int nName;    
8650: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8660: 2f 2a 20 4c 65 6e 67 74 68 20 6f 66 20 74 68 65  /* Length of the
8670: 20 7a 43 61 6e 6f 6e 69 63 61 6c 4e 61 6d 65 5b   zCanonicalName[
8680: 5d 20 73 74 72 69 6e 67 20 2a 2f 0a 20 20 63 68  ] string */.  ch
8690: 61 72 20 2a 7a 43 61 6e 6f 6e 69 63 61 6c 4e 61  ar *zCanonicalNa
86a0: 6d 65 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 43  me;         /* C
86b0: 61 6e 6f 6e 69 63 61 6c 20 66 69 6c 65 6e 61 6d  anonical filenam
86c0: 65 20 2a 2f 0a 7d 3b 0a 0a 23 69 66 20 4f 53 5f  e */.};..#if OS_
86d0: 56 58 57 4f 52 4b 53 0a 2f 2a 20 0a 2a 2a 20 41  VXWORKS./* .** A
86e0: 6c 6c 20 75 6e 69 71 75 65 20 66 69 6c 65 6e 61  ll unique filena
86f0: 6d 65 73 20 61 72 65 20 68 65 6c 64 20 6f 6e 20  mes are held on 
8700: 61 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20 68 65  a linked list he
8710: 61 64 65 64 20 62 79 20 74 68 69 73 0a 2a 2a 20  aded by this.** 
8720: 76 61 72 69 61 62 6c 65 3a 0a 2a 2f 0a 73 74 61  variable:.*/.sta
8730: 74 69 63 20 73 74 72 75 63 74 20 76 78 77 6f 72  tic struct vxwor
8740: 6b 73 46 69 6c 65 49 64 20 2a 76 78 77 6f 72 6b  ksFileId *vxwork
8750: 73 46 69 6c 65 4c 69 73 74 20 3d 20 30 3b 0a 0a  sFileList = 0;..
8760: 2f 2a 0a 2a 2a 20 53 69 6d 70 6c 69 66 79 20 61  /*.** Simplify a
8770: 20 66 69 6c 65 6e 61 6d 65 20 69 6e 74 6f 20 69   filename into i
8780: 74 73 20 63 61 6e 6f 6e 69 63 61 6c 20 66 6f 72  ts canonical for
8790: 6d 0a 2a 2a 20 62 79 20 6d 61 6b 69 6e 67 20 74  m.** by making t
87a0: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 68 61  he following cha
87b0: 6e 67 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 2a 20 72  nges:.**.**  * r
87c0: 65 6d 6f 76 69 6e 67 20 61 6e 79 20 74 72 61 69  emoving any trai
87d0: 6c 69 6e 67 20 61 6e 64 20 64 75 70 6c 69 63 61  ling and duplica
87e0: 74 65 20 2f 0a 2a 2a 20 20 2a 20 63 6f 6e 76 65  te /.**  * conve
87f0: 72 74 20 2f 2e 2f 20 69 6e 74 6f 20 6a 75 73 74  rt /./ into just
8800: 20 2f 0a 2a 2a 20 20 2a 20 63 6f 6e 76 65 72 74   /.**  * convert
8810: 20 2f 41 2f 2e 2e 2f 20 77 68 65 72 65 20 41 20   /A/../ where A 
8820: 69 73 20 61 6e 79 20 73 69 6d 70 6c 65 20 6e 61  is any simple na
8830: 6d 65 20 69 6e 74 6f 20 6a 75 73 74 20 2f 0a 2a  me into just /.*
8840: 2a 0a 2a 2a 20 43 68 61 6e 67 65 73 20 61 72 65  *.** Changes are
8850: 20 6d 61 64 65 20 69 6e 2d 70 6c 61 63 65 2e 20   made in-place. 
8860: 20 52 65 74 75 72 6e 20 74 68 65 20 6e 65 77 20   Return the new 
8870: 6e 61 6d 65 20 6c 65 6e 67 74 68 2e 0a 2a 2a 0a  name length..**.
8880: 2a 2a 20 54 68 65 20 6f 72 69 67 69 6e 61 6c 20  ** The original 
8890: 66 69 6c 65 6e 61 6d 65 20 69 73 20 69 6e 20 7a  filename is in z
88a0: 5b 30 2e 2e 6e 2d 31 5d 2e 20 20 52 65 74 75 72  [0..n-1].  Retur
88b0: 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a  n the number of.
88c0: 2a 2a 20 63 68 61 72 61 63 74 65 72 73 20 69 6e  ** characters in
88d0: 20 74 68 65 20 73 69 6d 70 6c 69 66 69 65 64 20   the simplified 
88e0: 6e 61 6d 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  name..*/.static 
88f0: 69 6e 74 20 76 78 77 6f 72 6b 73 53 69 6d 70 6c  int vxworksSimpl
8900: 69 66 79 4e 61 6d 65 28 63 68 61 72 20 2a 7a 2c  ifyName(char *z,
8910: 20 69 6e 74 20 6e 29 7b 0a 20 20 69 6e 74 20 69   int n){.  int i
8920: 2c 20 6a 3b 0a 20 20 77 68 69 6c 65 28 20 6e 3e  , j;.  while( n>
8930: 31 20 26 26 20 7a 5b 6e 2d 31 5d 3d 3d 27 2f 27  1 && z[n-1]=='/'
8940: 20 29 7b 20 6e 2d 2d 3b 20 7d 0a 20 20 66 6f 72   ){ n--; }.  for
8950: 28 69 3d 6a 3d 30 3b 20 69 3c 6e 3b 20 69 2b 2b  (i=j=0; i<n; i++
8960: 29 7b 0a 20 20 20 20 69 66 28 20 7a 5b 69 5d 3d  ){.    if( z[i]=
8970: 3d 27 2f 27 20 29 7b 0a 20 20 20 20 20 20 69 66  ='/' ){.      if
8980: 28 20 7a 5b 69 2b 31 5d 3d 3d 27 2f 27 20 29 20  ( z[i+1]=='/' ) 
8990: 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
89a0: 69 66 28 20 7a 5b 69 2b 31 5d 3d 3d 27 2e 27 20  if( z[i+1]=='.' 
89b0: 26 26 20 69 2b 32 3c 6e 20 26 26 20 7a 5b 69 2b  && i+2<n && z[i+
89c0: 32 5d 3d 3d 27 2f 27 20 29 7b 0a 20 20 20 20 20  2]=='/' ){.     
89d0: 20 20 20 69 20 2b 3d 20 31 3b 0a 20 20 20 20 20     i += 1;.     
89e0: 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20     continue;.   
89f0: 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 7a     }.      if( z
8a00: 5b 69 2b 31 5d 3d 3d 27 2e 27 20 26 26 20 69 2b  [i+1]=='.' && i+
8a10: 33 3c 6e 20 26 26 20 7a 5b 69 2b 32 5d 3d 3d 27  3<n && z[i+2]=='
8a20: 2e 27 20 26 26 20 7a 5b 69 2b 33 5d 3d 3d 27 2f  .' && z[i+3]=='/
8a30: 27 20 29 7b 0a 20 20 20 20 20 20 20 20 77 68 69  ' ){.        whi
8a40: 6c 65 28 20 6a 3e 30 20 26 26 20 7a 5b 6a 2d 31  le( j>0 && z[j-1
8a50: 5d 21 3d 27 2f 27 20 29 7b 20 6a 2d 2d 3b 20 7d  ]!='/' ){ j--; }
8a60: 0a 20 20 20 20 20 20 20 20 69 66 28 20 6a 3e 30  .        if( j>0
8a70: 20 29 7b 20 6a 2d 2d 3b 20 7d 0a 20 20 20 20 20   ){ j--; }.     
8a80: 20 20 20 69 20 2b 3d 20 32 3b 0a 20 20 20 20 20     i += 2;.     
8a90: 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20     continue;.   
8aa0: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 7a     }.    }.    z
8ab0: 5b 6a 2b 2b 5d 20 3d 20 7a 5b 69 5d 3b 0a 20 20  [j++] = z[i];.  
8ac0: 7d 0a 20 20 7a 5b 6a 5d 20 3d 20 30 3b 0a 20 20  }.  z[j] = 0;.  
8ad0: 72 65 74 75 72 6e 20 6a 3b 0a 7d 0a 0a 2f 2a 0a  return j;.}../*.
8ae0: 2a 2a 20 46 69 6e 64 20 61 20 75 6e 69 71 75 65  ** Find a unique
8af0: 20 66 69 6c 65 20 49 44 20 66 6f 72 20 74 68 65   file ID for the
8b00: 20 67 69 76 65 6e 20 61 62 73 6f 6c 75 74 65 20   given absolute 
8b10: 70 61 74 68 6e 61 6d 65 2e 20 20 52 65 74 75 72  pathname.  Retur
8b20: 6e 0a 2a 2a 20 61 20 70 6f 69 6e 74 65 72 20 74  n.** a pointer t
8b30: 6f 20 74 68 65 20 76 78 77 6f 72 6b 73 46 69 6c  o the vxworksFil
8b40: 65 49 64 20 6f 62 6a 65 63 74 2e 20 20 54 68 69  eId object.  Thi
8b50: 73 20 70 6f 69 6e 74 65 72 20 69 73 20 74 68 65  s pointer is the
8b60: 20 75 6e 69 71 75 65 0a 2a 2a 20 66 69 6c 65 20   unique.** file 
8b70: 49 44 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6e 52  ID..**.** The nR
8b80: 65 66 20 66 69 65 6c 64 20 6f 66 20 74 68 65 20  ef field of the 
8b90: 76 78 77 6f 72 6b 73 46 69 6c 65 49 64 20 6f 62  vxworksFileId ob
8ba0: 6a 65 63 74 20 69 73 20 69 6e 63 72 65 6d 65 6e  ject is incremen
8bb0: 74 65 64 20 62 65 66 6f 72 65 0a 2a 2a 20 74 68  ted before.** th
8bc0: 65 20 6f 62 6a 65 63 74 20 69 73 20 72 65 74 75  e object is retu
8bd0: 72 6e 65 64 2e 20 20 41 20 6e 65 77 20 76 78 77  rned.  A new vxw
8be0: 6f 72 6b 73 46 69 6c 65 49 64 20 6f 62 6a 65 63  orksFileId objec
8bf0: 74 20 69 73 20 63 72 65 61 74 65 64 0a 2a 2a 20  t is created.** 
8c00: 61 6e 64 20 61 64 64 65 64 20 74 6f 20 74 68 65  and added to the
8c10: 20 67 6c 6f 62 61 6c 20 6c 69 73 74 20 69 66 20   global list if 
8c20: 6e 65 63 65 73 73 61 72 79 2e 0a 2a 2a 0a 2a 2a  necessary..**.**
8c30: 20 49 66 20 61 20 6d 65 6d 6f 72 79 20 61 6c 6c   If a memory all
8c40: 6f 63 61 74 69 6f 6e 20 65 72 72 6f 72 20 6f 63  ocation error oc
8c50: 63 75 72 73 2c 20 72 65 74 75 72 6e 20 4e 55 4c  curs, return NUL
8c60: 4c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 73 74 72  L..*/.static str
8c70: 75 63 74 20 76 78 77 6f 72 6b 73 46 69 6c 65 49  uct vxworksFileI
8c80: 64 20 2a 76 78 77 6f 72 6b 73 46 69 6e 64 46 69  d *vxworksFindFi
8c90: 6c 65 49 64 28 63 6f 6e 73 74 20 63 68 61 72 20  leId(const char 
8ca0: 2a 7a 41 62 73 6f 6c 75 74 65 4e 61 6d 65 29 7b  *zAbsoluteName){
8cb0: 0a 20 20 73 74 72 75 63 74 20 76 78 77 6f 72 6b  .  struct vxwork
8cc0: 73 46 69 6c 65 49 64 20 2a 70 4e 65 77 3b 20 20  sFileId *pNew;  
8cd0: 20 20 20 20 20 20 20 2f 2a 20 73 65 61 72 63 68         /* search
8ce0: 20 6b 65 79 20 61 6e 64 20 6e 65 77 20 66 69 6c   key and new fil
8cf0: 65 20 49 44 20 2a 2f 0a 20 20 73 74 72 75 63 74  e ID */.  struct
8d00: 20 76 78 77 6f 72 6b 73 46 69 6c 65 49 64 20 2a   vxworksFileId *
8d10: 70 43 61 6e 64 69 64 61 74 65 3b 20 20 20 2f 2a  pCandidate;   /*
8d20: 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65   For looping ove
8d30: 72 20 65 78 69 73 74 69 6e 67 20 66 69 6c 65 20  r existing file 
8d40: 49 44 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 3b 20  IDs */.  int n; 
8d50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8d60: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
8d70: 4c 65 6e 67 74 68 20 6f 66 20 7a 41 62 73 6f 6c  Length of zAbsol
8d80: 75 74 65 4e 61 6d 65 20 73 74 72 69 6e 67 20 2a  uteName string *
8d90: 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 7a 41 62  /..  assert( zAb
8da0: 73 6f 6c 75 74 65 4e 61 6d 65 5b 30 5d 3d 3d 27  soluteName[0]=='
8db0: 2f 27 20 29 3b 0a 20 20 6e 20 3d 20 28 69 6e 74  /' );.  n = (int
8dc0: 29 73 74 72 6c 65 6e 28 7a 41 62 73 6f 6c 75 74  )strlen(zAbsolut
8dd0: 65 4e 61 6d 65 29 3b 0a 20 20 70 4e 65 77 20 3d  eName);.  pNew =
8de0: 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28   sqlite3_malloc(
8df0: 20 73 69 7a 65 6f 66 28 2a 70 4e 65 77 29 20 2b   sizeof(*pNew) +
8e00: 20 28 6e 2b 31 29 20 29 3b 0a 20 20 69 66 28 20   (n+1) );.  if( 
8e10: 70 4e 65 77 3d 3d 30 20 29 20 72 65 74 75 72 6e  pNew==0 ) return
8e20: 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 7a 43 61 6e   0;.  pNew->zCan
8e30: 6f 6e 69 63 61 6c 4e 61 6d 65 20 3d 20 28 63 68  onicalName = (ch
8e40: 61 72 2a 29 26 70 4e 65 77 5b 31 5d 3b 0a 20 20  ar*)&pNew[1];.  
8e50: 6d 65 6d 63 70 79 28 70 4e 65 77 2d 3e 7a 43 61  memcpy(pNew->zCa
8e60: 6e 6f 6e 69 63 61 6c 4e 61 6d 65 2c 20 7a 41 62  nonicalName, zAb
8e70: 73 6f 6c 75 74 65 4e 61 6d 65 2c 20 6e 2b 31 29  soluteName, n+1)
8e80: 3b 0a 20 20 6e 20 3d 20 76 78 77 6f 72 6b 73 53  ;.  n = vxworksS
8e90: 69 6d 70 6c 69 66 79 4e 61 6d 65 28 70 4e 65 77  implifyName(pNew
8ea0: 2d 3e 7a 43 61 6e 6f 6e 69 63 61 6c 4e 61 6d 65  ->zCanonicalName
8eb0: 2c 20 6e 29 3b 0a 0a 20 20 2f 2a 20 53 65 61 72  , n);..  /* Sear
8ec0: 63 68 20 66 6f 72 20 61 6e 20 65 78 69 73 74 69  ch for an existi
8ed0: 6e 67 20 65 6e 74 72 79 20 74 68 61 74 20 6d 61  ng entry that ma
8ee0: 74 63 68 69 6e 67 20 74 68 65 20 63 61 6e 6f 6e  tching the canon
8ef0: 69 63 61 6c 20 6e 61 6d 65 2e 0a 20 20 2a 2a 20  ical name..  ** 
8f00: 49 66 20 66 6f 75 6e 64 2c 20 69 6e 63 72 65 6d  If found, increm
8f10: 65 6e 74 20 74 68 65 20 72 65 66 65 72 65 6e 63  ent the referenc
8f20: 65 20 63 6f 75 6e 74 20 61 6e 64 20 72 65 74 75  e count and retu
8f30: 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 0a  rn a pointer to.
8f40: 20 20 2a 2a 20 74 68 65 20 65 78 69 73 74 69 6e    ** the existin
8f50: 67 20 66 69 6c 65 20 49 44 2e 0a 20 20 2a 2f 0a  g file ID..  */.
8f60: 20 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78    unixEnterMutex
8f70: 28 29 3b 0a 20 20 66 6f 72 28 70 43 61 6e 64 69  ();.  for(pCandi
8f80: 64 61 74 65 3d 76 78 77 6f 72 6b 73 46 69 6c 65  date=vxworksFile
8f90: 4c 69 73 74 3b 20 70 43 61 6e 64 69 64 61 74 65  List; pCandidate
8fa0: 3b 20 70 43 61 6e 64 69 64 61 74 65 3d 70 43 61  ; pCandidate=pCa
8fb0: 6e 64 69 64 61 74 65 2d 3e 70 4e 65 78 74 29 7b  ndidate->pNext){
8fc0: 0a 20 20 20 20 69 66 28 20 70 43 61 6e 64 69 64  .    if( pCandid
8fd0: 61 74 65 2d 3e 6e 4e 61 6d 65 3d 3d 6e 20 0a 20  ate->nName==n . 
8fe0: 20 20 20 20 26 26 20 6d 65 6d 63 6d 70 28 70 43      && memcmp(pC
8ff0: 61 6e 64 69 64 61 74 65 2d 3e 7a 43 61 6e 6f 6e  andidate->zCanon
9000: 69 63 61 6c 4e 61 6d 65 2c 20 70 4e 65 77 2d 3e  icalName, pNew->
9010: 7a 43 61 6e 6f 6e 69 63 61 6c 4e 61 6d 65 2c 20  zCanonicalName, 
9020: 6e 29 3d 3d 30 0a 20 20 20 20 29 7b 0a 20 20 20  n)==0.    ){.   
9030: 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
9040: 28 70 4e 65 77 29 3b 0a 20 20 20 20 20 20 20 70  (pNew);.       p
9050: 43 61 6e 64 69 64 61 74 65 2d 3e 6e 52 65 66 2b  Candidate->nRef+
9060: 2b 3b 0a 20 20 20 20 20 20 20 75 6e 69 78 4c 65  +;.       unixLe
9070: 61 76 65 4d 75 74 65 78 28 29 3b 0a 20 20 20 20  aveMutex();.    
9080: 20 20 20 72 65 74 75 72 6e 20 70 43 61 6e 64 69     return pCandi
9090: 64 61 74 65 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  date;.    }.  }.
90a0: 0a 20 20 2f 2a 20 4e 6f 20 6d 61 74 63 68 20 77  .  /* No match w
90b0: 61 73 20 66 6f 75 6e 64 2e 20 20 57 65 20 77 69  as found.  We wi
90c0: 6c 6c 20 6d 61 6b 65 20 61 20 6e 65 77 20 66 69  ll make a new fi
90d0: 6c 65 20 49 44 20 2a 2f 0a 20 20 70 4e 65 77 2d  le ID */.  pNew-
90e0: 3e 6e 52 65 66 20 3d 20 31 3b 0a 20 20 70 4e 65  >nRef = 1;.  pNe
90f0: 77 2d 3e 6e 4e 61 6d 65 20 3d 20 6e 3b 0a 20 20  w->nName = n;.  
9100: 70 4e 65 77 2d 3e 70 4e 65 78 74 20 3d 20 76 78  pNew->pNext = vx
9110: 77 6f 72 6b 73 46 69 6c 65 4c 69 73 74 3b 0a 20  worksFileList;. 
9120: 20 76 78 77 6f 72 6b 73 46 69 6c 65 4c 69 73 74   vxworksFileList
9130: 20 3d 20 70 4e 65 77 3b 0a 20 20 75 6e 69 78 4c   = pNew;.  unixL
9140: 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 20 20 72  eaveMutex();.  r
9150: 65 74 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a 0a 2f  eturn pNew;.}../
9160: 2a 0a 2a 2a 20 44 65 63 72 65 6d 65 6e 74 20 74  *.** Decrement t
9170: 68 65 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75  he reference cou
9180: 6e 74 20 6f 6e 20 61 20 76 78 77 6f 72 6b 73 46  nt on a vxworksF
9190: 69 6c 65 49 64 20 6f 62 6a 65 63 74 2e 20 20 46  ileId object.  F
91a0: 72 65 65 0a 2a 2a 20 74 68 65 20 6f 62 6a 65 63  ree.** the objec
91b0: 74 20 77 68 65 6e 20 74 68 65 20 72 65 66 65 72  t when the refer
91c0: 65 6e 63 65 20 63 6f 75 6e 74 20 72 65 61 63 68  ence count reach
91d0: 65 73 20 7a 65 72 6f 2e 0a 2a 2f 0a 73 74 61 74  es zero..*/.stat
91e0: 69 63 20 76 6f 69 64 20 76 78 77 6f 72 6b 73 52  ic void vxworksR
91f0: 65 6c 65 61 73 65 46 69 6c 65 49 64 28 73 74 72  eleaseFileId(str
9200: 75 63 74 20 76 78 77 6f 72 6b 73 46 69 6c 65 49  uct vxworksFileI
9210: 64 20 2a 70 49 64 29 7b 0a 20 20 75 6e 69 78 45  d *pId){.  unixE
9220: 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 20 20 61  nterMutex();.  a
9230: 73 73 65 72 74 28 20 70 49 64 2d 3e 6e 52 65 66  ssert( pId->nRef
9240: 3e 30 20 29 3b 0a 20 20 70 49 64 2d 3e 6e 52 65  >0 );.  pId->nRe
9250: 66 2d 2d 3b 0a 20 20 69 66 28 20 70 49 64 2d 3e  f--;.  if( pId->
9260: 6e 52 65 66 3d 3d 30 20 29 7b 0a 20 20 20 20 73  nRef==0 ){.    s
9270: 74 72 75 63 74 20 76 78 77 6f 72 6b 73 46 69 6c  truct vxworksFil
9280: 65 49 64 20 2a 2a 70 70 3b 0a 20 20 20 20 66 6f  eId **pp;.    fo
9290: 72 28 70 70 3d 26 76 78 77 6f 72 6b 73 46 69 6c  r(pp=&vxworksFil
92a0: 65 4c 69 73 74 3b 20 2a 70 70 20 26 26 20 2a 70  eList; *pp && *p
92b0: 70 21 3d 70 49 64 3b 20 70 70 20 3d 20 26 28 28  p!=pId; pp = &((
92c0: 2a 70 70 29 2d 3e 70 4e 65 78 74 29 29 7b 7d 0a  *pp)->pNext)){}.
92d0: 20 20 20 20 61 73 73 65 72 74 28 20 2a 70 70 3d      assert( *pp=
92e0: 3d 70 49 64 20 29 3b 0a 20 20 20 20 2a 70 70 20  =pId );.    *pp 
92f0: 3d 20 70 49 64 2d 3e 70 4e 65 78 74 3b 0a 20 20  = pId->pNext;.  
9300: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
9310: 49 64 29 3b 0a 20 20 7d 0a 20 20 75 6e 69 78 4c  Id);.  }.  unixL
9320: 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 7d 0a 23  eaveMutex();.}.#
9330: 65 6e 64 69 66 20 2f 2a 20 4f 53 5f 56 58 57 4f  endif /* OS_VXWO
9340: 52 4b 53 20 2a 2f 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a  RKS */./********
9350: 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64 20 6f 66 20 55  ******* End of U
9360: 6e 69 71 75 65 20 46 69 6c 65 20 49 44 20 55 74  nique File ID Ut
9370: 69 6c 69 74 79 20 55 73 65 64 20 42 79 20 56 78  ility Used By Vx
9380: 57 6f 72 6b 73 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  Works **********
9390: 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ******.*********
93a0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
93b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
93c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
93d0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
93e0: 2a 2a 2a 2a 2a 2f 0a 0a 0a 2f 2a 2a 2a 2a 2a 2a  *****/.../******
93f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
9400: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
9410: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
9420: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
9430: 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a  ********.*******
9440: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
9450: 2a 2a 2a 2a 20 50 6f 73 69 78 20 41 64 76 69 73  **** Posix Advis
9460: 6f 72 79 20 4c 6f 63 6b 69 6e 67 20 2a 2a 2a 2a  ory Locking ****
9470: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
9480: 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 50  ********.**.** P
9490: 4f 53 49 58 20 61 64 76 69 73 6f 72 79 20 6c 6f  OSIX advisory lo
94a0: 63 6b 73 20 61 72 65 20 62 72 6f 6b 65 6e 20 62  cks are broken b
94b0: 79 20 64 65 73 69 67 6e 2e 20 20 41 4e 53 49 20  y design.  ANSI 
94c0: 53 54 44 20 31 30 30 33 2e 31 20 28 31 39 39 36  STD 1003.1 (1996
94d0: 29 0a 2a 2a 20 73 65 63 74 69 6f 6e 20 36 2e 35  ).** section 6.5
94e0: 2e 32 2e 32 20 6c 69 6e 65 73 20 34 38 33 20 74  .2.2 lines 483 t
94f0: 68 72 6f 75 67 68 20 34 39 30 20 73 70 65 63 69  hrough 490 speci
9500: 66 79 20 74 68 61 74 20 77 68 65 6e 20 61 20 70  fy that when a p
9510: 72 6f 63 65 73 73 0a 2a 2a 20 73 65 74 73 20 6f  rocess.** sets o
9520: 72 20 63 6c 65 61 72 73 20 61 20 6c 6f 63 6b 2c  r clears a lock,
9530: 20 74 68 61 74 20 6f 70 65 72 61 74 69 6f 6e 20   that operation 
9540: 6f 76 65 72 72 69 64 65 73 20 61 6e 79 20 70 72  overrides any pr
9550: 69 6f 72 20 6c 6f 63 6b 73 20 73 65 74 0a 2a 2a  ior locks set.**
9560: 20 62 79 20 74 68 65 20 73 61 6d 65 20 70 72 6f   by the same pro
9570: 63 65 73 73 2e 20 20 49 74 20 64 6f 65 73 20 6e  cess.  It does n
9580: 6f 74 20 65 78 70 6c 69 63 69 74 6c 79 20 73 61  ot explicitly sa
9590: 79 20 73 6f 2c 20 62 75 74 20 74 68 69 73 20 69  y so, but this i
95a0: 6d 70 6c 69 65 73 0a 2a 2a 20 74 68 61 74 20 69  mplies.** that i
95b0: 74 20 6f 76 65 72 72 69 64 65 73 20 6c 6f 63 6b  t overrides lock
95c0: 73 20 73 65 74 20 62 79 20 74 68 65 20 73 61 6d  s set by the sam
95d0: 65 20 70 72 6f 63 65 73 73 20 75 73 69 6e 67 20  e process using 
95e0: 61 20 64 69 66 66 65 72 65 6e 74 0a 2a 2a 20 66  a different.** f
95f0: 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 2e 20  ile descriptor. 
9600: 20 43 6f 6e 73 69 64 65 72 20 74 68 69 73 20 74   Consider this t
9610: 65 73 74 20 63 61 73 65 3a 0a 2a 2a 0a 2a 2a 20  est case:.**.** 
9620: 20 20 20 20 20 20 69 6e 74 20 66 64 31 20 3d 20        int fd1 = 
9630: 6f 70 65 6e 28 22 2e 2f 66 69 6c 65 31 22 2c 20  open("./file1", 
9640: 4f 5f 52 44 57 52 7c 4f 5f 43 52 45 41 54 2c 20  O_RDWR|O_CREAT, 
9650: 30 36 34 34 29 3b 0a 2a 2a 20 20 20 20 20 20 20  0644);.**       
9660: 69 6e 74 20 66 64 32 20 3d 20 6f 70 65 6e 28 22  int fd2 = open("
9670: 2e 2f 66 69 6c 65 32 22 2c 20 4f 5f 52 44 57 52  ./file2", O_RDWR
9680: 7c 4f 5f 43 52 45 41 54 2c 20 30 36 34 34 29 3b  |O_CREAT, 0644);
9690: 0a 2a 2a 0a 2a 2a 20 53 75 70 70 6f 73 65 20 2e  .**.** Suppose .
96a0: 2f 66 69 6c 65 31 20 61 6e 64 20 2e 2f 66 69 6c  /file1 and ./fil
96b0: 65 32 20 61 72 65 20 72 65 61 6c 6c 79 20 74 68  e2 are really th
96c0: 65 20 73 61 6d 65 20 66 69 6c 65 20 28 62 65 63  e same file (bec
96d0: 61 75 73 65 0a 2a 2a 20 6f 6e 65 20 69 73 20 61  ause.** one is a
96e0: 20 68 61 72 64 20 6f 72 20 73 79 6d 62 6f 6c 69   hard or symboli
96f0: 63 20 6c 69 6e 6b 20 74 6f 20 74 68 65 20 6f 74  c link to the ot
9700: 68 65 72 29 20 74 68 65 6e 20 69 66 20 79 6f 75  her) then if you
9710: 20 73 65 74 0a 2a 2a 20 61 6e 20 65 78 63 6c 75   set.** an exclu
9720: 73 69 76 65 20 6c 6f 63 6b 20 6f 6e 20 66 64 31  sive lock on fd1
9730: 2c 20 74 68 65 6e 20 74 72 79 20 74 6f 20 67 65  , then try to ge
9740: 74 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c  t an exclusive l
9750: 6f 63 6b 0a 2a 2a 20 6f 6e 20 66 64 32 2c 20 69  ock.** on fd2, i
9760: 74 20 77 6f 72 6b 73 2e 20 20 49 20 77 6f 75 6c  t works.  I woul
9770: 64 20 68 61 76 65 20 65 78 70 65 63 74 65 64 20  d have expected 
9780: 74 68 65 20 73 65 63 6f 6e 64 20 6c 6f 63 6b 20  the second lock 
9790: 74 6f 0a 2a 2a 20 66 61 69 6c 20 73 69 6e 63 65  to.** fail since
97a0: 20 74 68 65 72 65 20 77 61 73 20 61 6c 72 65 61   there was alrea
97b0: 64 79 20 61 20 6c 6f 63 6b 20 6f 6e 20 74 68 65  dy a lock on the
97c0: 20 66 69 6c 65 20 64 75 65 20 74 6f 20 66 64 31   file due to fd1
97d0: 2e 0a 2a 2a 20 42 75 74 20 6e 6f 74 20 73 6f 2e  ..** But not so.
97e0: 20 20 53 69 6e 63 65 20 62 6f 74 68 20 6c 6f 63    Since both loc
97f0: 6b 73 20 63 61 6d 65 20 66 72 6f 6d 20 74 68 65  ks came from the
9800: 20 73 61 6d 65 20 70 72 6f 63 65 73 73 2c 20 74   same process, t
9810: 68 65 0a 2a 2a 20 73 65 63 6f 6e 64 20 6f 76 65  he.** second ove
9820: 72 72 69 64 65 73 20 74 68 65 20 66 69 72 73 74  rrides the first
9830: 2c 20 65 76 65 6e 20 74 68 6f 75 67 68 20 74 68  , even though th
9840: 65 79 20 77 65 72 65 20 6f 6e 20 64 69 66 66 65  ey were on diffe
9850: 72 65 6e 74 0a 2a 2a 20 66 69 6c 65 20 64 65 73  rent.** file des
9860: 63 72 69 70 74 6f 72 73 20 6f 70 65 6e 65 64 20  criptors opened 
9870: 6f 6e 20 64 69 66 66 65 72 65 6e 74 20 66 69 6c  on different fil
9880: 65 20 6e 61 6d 65 73 2e 0a 2a 2a 0a 2a 2a 20 54  e names..**.** T
9890: 68 69 73 20 6d 65 61 6e 73 20 74 68 61 74 20 77  his means that w
98a0: 65 20 63 61 6e 6e 6f 74 20 75 73 65 20 50 4f 53  e cannot use POS
98b0: 49 58 20 6c 6f 63 6b 73 20 74 6f 20 73 79 6e 63  IX locks to sync
98c0: 68 72 6f 6e 69 7a 65 20 66 69 6c 65 20 61 63 63  hronize file acc
98d0: 65 73 73 0a 2a 2a 20 61 6d 6f 6e 67 20 63 6f 6d  ess.** among com
98e0: 70 65 74 69 6e 67 20 74 68 72 65 61 64 73 20 6f  peting threads o
98f0: 66 20 74 68 65 20 73 61 6d 65 20 70 72 6f 63 65  f the same proce
9900: 73 73 2e 20 20 50 4f 53 49 58 20 6c 6f 63 6b 73  ss.  POSIX locks
9910: 20 77 69 6c 6c 20 77 6f 72 6b 20 66 69 6e 65 0a   will work fine.
9920: 2a 2a 20 74 6f 20 73 79 6e 63 68 72 6f 6e 69 7a  ** to synchroniz
9930: 65 20 61 63 63 65 73 73 20 66 6f 72 20 74 68 72  e access for thr
9940: 65 61 64 73 20 69 6e 20 73 65 70 61 72 61 74 65  eads in separate
9950: 20 70 72 6f 63 65 73 73 65 73 2c 20 62 75 74 20   processes, but 
9960: 6e 6f 74 0a 2a 2a 20 74 68 72 65 61 64 73 20 77  not.** threads w
9970: 69 74 68 69 6e 20 74 68 65 20 73 61 6d 65 20 70  ithin the same p
9980: 72 6f 63 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 54 6f  rocess..**.** To
9990: 20 77 6f 72 6b 20 61 72 6f 75 6e 64 20 74 68 65   work around the
99a0: 20 70 72 6f 62 6c 65 6d 2c 20 53 51 4c 69 74 65   problem, SQLite
99b0: 20 68 61 73 20 74 6f 20 6d 61 6e 61 67 65 20 66   has to manage f
99c0: 69 6c 65 20 6c 6f 63 6b 73 20 69 6e 74 65 72 6e  ile locks intern
99d0: 61 6c 6c 79 0a 2a 2a 20 6f 6e 20 69 74 73 20 6f  ally.** on its o
99e0: 77 6e 2e 20 20 57 68 65 6e 65 76 65 72 20 61 20  wn.  Whenever a 
99f0: 6e 65 77 20 64 61 74 61 62 61 73 65 20 69 73 20  new database is 
9a00: 6f 70 65 6e 65 64 2c 20 77 65 20 68 61 76 65 20  opened, we have 
9a10: 74 6f 20 66 69 6e 64 20 74 68 65 0a 2a 2a 20 73  to find the.** s
9a20: 70 65 63 69 66 69 63 20 69 6e 6f 64 65 20 6f 66  pecific inode of
9a30: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
9a40: 6c 65 20 28 74 68 65 20 69 6e 6f 64 65 20 69 73  le (the inode is
9a50: 20 64 65 74 65 72 6d 69 6e 65 64 20 62 79 20 74   determined by t
9a60: 68 65 0a 2a 2a 20 73 74 5f 64 65 76 20 61 6e 64  he.** st_dev and
9a70: 20 73 74 5f 69 6e 6f 20 66 69 65 6c 64 73 20 6f   st_ino fields o
9a80: 66 20 74 68 65 20 73 74 61 74 20 73 74 72 75 63  f the stat struc
9a90: 74 75 72 65 20 74 68 61 74 20 66 73 74 61 74 28  ture that fstat(
9aa0: 29 20 66 69 6c 6c 73 20 69 6e 29 0a 2a 2a 20 61  ) fills in).** a
9ab0: 6e 64 20 63 68 65 63 6b 20 66 6f 72 20 6c 6f 63  nd check for loc
9ac0: 6b 73 20 61 6c 72 65 61 64 79 20 65 78 69 73 74  ks already exist
9ad0: 69 6e 67 20 6f 6e 20 74 68 61 74 20 69 6e 6f 64  ing on that inod
9ae0: 65 2e 20 20 57 68 65 6e 20 6c 6f 63 6b 73 20 61  e.  When locks a
9af0: 72 65 0a 2a 2a 20 63 72 65 61 74 65 64 20 6f 72  re.** created or
9b00: 20 72 65 6d 6f 76 65 64 2c 20 77 65 20 68 61 76   removed, we hav
9b10: 65 20 74 6f 20 6c 6f 6f 6b 20 61 74 20 6f 75 72  e to look at our
9b20: 20 6f 77 6e 20 69 6e 74 65 72 6e 61 6c 20 72 65   own internal re
9b30: 63 6f 72 64 20 6f 66 20 74 68 65 0a 2a 2a 20 6c  cord of the.** l
9b40: 6f 63 6b 73 20 74 6f 20 73 65 65 20 69 66 20 61  ocks to see if a
9b50: 6e 6f 74 68 65 72 20 74 68 72 65 61 64 20 68 61  nother thread ha
9b60: 73 20 70 72 65 76 69 6f 75 73 6c 79 20 73 65 74  s previously set
9b70: 20 61 20 6c 6f 63 6b 20 6f 6e 20 74 68 61 74 20   a lock on that 
9b80: 73 61 6d 65 0a 2a 2a 20 69 6e 6f 64 65 2e 0a 2a  same.** inode..*
9b90: 2a 0a 2a 2a 20 28 41 73 69 64 65 3a 20 54 68 65  *.** (Aside: The
9ba0: 20 75 73 65 20 6f 66 20 69 6e 6f 64 65 20 6e 75   use of inode nu
9bb0: 6d 62 65 72 73 20 61 73 20 75 6e 69 71 75 65 20  mbers as unique 
9bc0: 49 44 73 20 64 6f 65 73 20 6e 6f 74 20 77 6f 72  IDs does not wor
9bd0: 6b 20 6f 6e 20 56 78 57 6f 72 6b 73 2e 0a 2a 2a  k on VxWorks..**
9be0: 20 46 6f 72 20 56 78 57 6f 72 6b 73 2c 20 77 65   For VxWorks, we
9bf0: 20 68 61 76 65 20 74 6f 20 75 73 65 20 74 68 65   have to use the
9c00: 20 61 6c 74 65 72 6e 61 74 69 76 65 20 75 6e 69   alternative uni
9c10: 71 75 65 20 49 44 20 73 79 73 74 65 6d 20 62 61  que ID system ba
9c20: 73 65 64 20 6f 6e 0a 2a 2a 20 63 61 6e 6f 6e 69  sed on.** canoni
9c30: 63 61 6c 20 66 69 6c 65 6e 61 6d 65 20 61 6e 64  cal filename and
9c40: 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 69 6e 20   implemented in 
9c50: 74 68 65 20 70 72 65 76 69 6f 75 73 20 64 69 76  the previous div
9c60: 69 73 69 6f 6e 2e 29 0a 2a 2a 0a 2a 2a 20 54 68  ision.).**.** Th
9c70: 65 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 73  e sqlite3_file s
9c80: 74 72 75 63 74 75 72 65 20 66 6f 72 20 50 4f 53  tructure for POS
9c90: 49 58 20 69 73 20 6e 6f 20 6c 6f 6e 67 65 72 20  IX is no longer 
9ca0: 6a 75 73 74 20 61 6e 20 69 6e 74 65 67 65 72 20  just an integer 
9cb0: 66 69 6c 65 0a 2a 2a 20 64 65 73 63 72 69 70 74  file.** descript
9cc0: 6f 72 2e 20 20 49 74 20 69 73 20 6e 6f 77 20 61  or.  It is now a
9cd0: 20 73 74 72 75 63 74 75 72 65 20 74 68 61 74 20   structure that 
9ce0: 68 6f 6c 64 73 20 74 68 65 20 69 6e 74 65 67 65  holds the intege
9cf0: 72 20 66 69 6c 65 0a 2a 2a 20 64 65 73 63 72 69  r file.** descri
9d00: 70 74 6f 72 20 61 6e 64 20 61 20 70 6f 69 6e 74  ptor and a point
9d10: 65 72 20 74 6f 20 61 20 73 74 72 75 63 74 75 72  er to a structur
9d20: 65 20 74 68 61 74 20 64 65 73 63 72 69 62 65 73  e that describes
9d30: 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 0a 2a 2a   the internal.**
9d40: 20 6c 6f 63 6b 73 20 6f 6e 20 74 68 65 20 63 6f   locks on the co
9d50: 72 72 65 73 70 6f 6e 64 69 6e 67 20 69 6e 6f 64  rresponding inod
9d60: 65 2e 20 20 54 68 65 72 65 20 69 73 20 6f 6e 65  e.  There is one
9d70: 20 6c 6f 63 6b 69 6e 67 20 73 74 72 75 63 74 75   locking structu
9d80: 72 65 0a 2a 2a 20 70 65 72 20 69 6e 6f 64 65 2c  re.** per inode,
9d90: 20 73 6f 20 69 66 20 74 68 65 20 73 61 6d 65 20   so if the same 
9da0: 69 6e 6f 64 65 20 69 73 20 6f 70 65 6e 65 64 20  inode is opened 
9db0: 74 77 69 63 65 2c 20 62 6f 74 68 20 75 6e 69 78  twice, both unix
9dc0: 46 69 6c 65 20 73 74 72 75 63 74 75 72 65 73 0a  File structures.
9dd0: 2a 2a 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20  ** point to the 
9de0: 73 61 6d 65 20 6c 6f 63 6b 69 6e 67 20 73 74 72  same locking str
9df0: 75 63 74 75 72 65 2e 20 20 54 68 65 20 6c 6f 63  ucture.  The loc
9e00: 6b 69 6e 67 20 73 74 72 75 63 74 75 72 65 20 6b  king structure k
9e10: 65 65 70 73 0a 2a 2a 20 61 20 72 65 66 65 72 65  eeps.** a refere
9e20: 6e 63 65 20 63 6f 75 6e 74 20 28 73 6f 20 77 65  nce count (so we
9e30: 20 77 69 6c 6c 20 6b 6e 6f 77 20 77 68 65 6e 20   will know when 
9e40: 74 6f 20 64 65 6c 65 74 65 20 69 74 29 20 61 6e  to delete it) an
9e50: 64 20 61 20 22 63 6e 74 22 0a 2a 2a 20 66 69 65  d a "cnt".** fie
9e60: 6c 64 20 74 68 61 74 20 74 65 6c 6c 73 20 75 73  ld that tells us
9e70: 20 69 74 73 20 69 6e 74 65 72 6e 61 6c 20 6c 6f   its internal lo
9e80: 63 6b 20 73 74 61 74 75 73 2e 20 20 63 6e 74 3d  ck status.  cnt=
9e90: 3d 30 20 6d 65 61 6e 73 20 74 68 65 0a 2a 2a 20  =0 means the.** 
9ea0: 66 69 6c 65 20 69 73 20 75 6e 6c 6f 63 6b 65 64  file is unlocked
9eb0: 2e 20 20 63 6e 74 3d 3d 2d 31 20 6d 65 61 6e 73  .  cnt==-1 means
9ec0: 20 74 68 65 20 66 69 6c 65 20 68 61 73 20 61 6e   the file has an
9ed0: 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 2e   exclusive lock.
9ee0: 0a 2a 2a 20 63 6e 74 3e 30 20 6d 65 61 6e 73 20  .** cnt>0 means 
9ef0: 74 68 65 72 65 20 61 72 65 20 63 6e 74 20 73 68  there are cnt sh
9f00: 61 72 65 64 20 6c 6f 63 6b 73 20 6f 6e 20 74 68  ared locks on th
9f10: 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 41 6e  e file..**.** An
9f20: 79 20 61 74 74 65 6d 70 74 20 74 6f 20 6c 6f 63  y attempt to loc
9f30: 6b 20 6f 72 20 75 6e 6c 6f 63 6b 20 61 20 66 69  k or unlock a fi
9f40: 6c 65 20 66 69 72 73 74 20 63 68 65 63 6b 73 20  le first checks 
9f50: 74 68 65 20 6c 6f 63 6b 69 6e 67 0a 2a 2a 20 73  the locking.** s
9f60: 74 72 75 63 74 75 72 65 2e 20 20 54 68 65 20 66  tructure.  The f
9f70: 63 6e 74 6c 28 29 20 73 79 73 74 65 6d 20 63 61  cntl() system ca
9f80: 6c 6c 20 69 73 20 6f 6e 6c 79 20 69 6e 76 6f 6b  ll is only invok
9f90: 65 64 20 74 6f 20 73 65 74 20 61 20 0a 2a 2a 20  ed to set a .** 
9fa0: 50 4f 53 49 58 20 6c 6f 63 6b 20 69 66 20 74 68  POSIX lock if th
9fb0: 65 20 69 6e 74 65 72 6e 61 6c 20 6c 6f 63 6b 20  e internal lock 
9fc0: 73 74 72 75 63 74 75 72 65 20 74 72 61 6e 73 69  structure transi
9fd0: 74 69 6f 6e 73 20 62 65 74 77 65 65 6e 0a 2a 2a  tions between.**
9fe0: 20 61 20 6c 6f 63 6b 65 64 20 61 6e 64 20 61 6e   a locked and an
9ff0: 20 75 6e 6c 6f 63 6b 65 64 20 73 74 61 74 65 2e   unlocked state.
a000: 0a 2a 2a 0a 2a 2a 20 42 75 74 20 77 61 69 74 3a  .**.** But wait:
a010: 20 20 74 68 65 72 65 20 61 72 65 20 79 65 74 20    there are yet 
a020: 6d 6f 72 65 20 70 72 6f 62 6c 65 6d 73 20 77 69  more problems wi
a030: 74 68 20 50 4f 53 49 58 20 61 64 76 69 73 6f 72  th POSIX advisor
a040: 79 20 6c 6f 63 6b 73 2e 0a 2a 2a 0a 2a 2a 20 49  y locks..**.** I
a050: 66 20 79 6f 75 20 63 6c 6f 73 65 20 61 20 66 69  f you close a fi
a060: 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 74 68  le descriptor th
a070: 61 74 20 70 6f 69 6e 74 73 20 74 6f 20 61 20 66  at points to a f
a080: 69 6c 65 20 74 68 61 74 20 68 61 73 20 6c 6f 63  ile that has loc
a090: 6b 73 2c 0a 2a 2a 20 61 6c 6c 20 6c 6f 63 6b 73  ks,.** all locks
a0a0: 20 6f 6e 20 74 68 61 74 20 66 69 6c 65 20 74 68   on that file th
a0b0: 61 74 20 61 72 65 20 6f 77 6e 65 64 20 62 79 20  at are owned by 
a0c0: 74 68 65 20 63 75 72 72 65 6e 74 20 70 72 6f 63  the current proc
a0d0: 65 73 73 20 61 72 65 0a 2a 2a 20 72 65 6c 65 61  ess are.** relea
a0e0: 73 65 64 2e 20 20 54 6f 20 77 6f 72 6b 20 61 72  sed.  To work ar
a0f0: 6f 75 6e 64 20 74 68 69 73 20 70 72 6f 62 6c 65  ound this proble
a100: 6d 2c 20 65 61 63 68 20 75 6e 69 78 49 6e 6f 64  m, each unixInod
a110: 65 49 6e 66 6f 20 6f 62 6a 65 63 74 0a 2a 2a 20  eInfo object.** 
a120: 6d 61 69 6e 74 61 69 6e 73 20 61 20 63 6f 75 6e  maintains a coun
a130: 74 20 6f 66 20 74 68 65 20 6e 75 6d 62 65 72 20  t of the number 
a140: 6f 66 20 70 65 6e 64 69 6e 67 20 6c 6f 63 6b 73  of pending locks
a150: 20 6f 6e 20 74 68 61 20 69 6e 6f 64 65 2e 0a 2a   on tha inode..*
a160: 2a 20 57 68 65 6e 20 61 6e 20 61 74 74 65 6d 70  * When an attemp
a170: 74 20 69 73 20 6d 61 64 65 20 74 6f 20 63 6c 6f  t is made to clo
a180: 73 65 20 61 6e 20 75 6e 69 78 46 69 6c 65 2c 20  se an unixFile, 
a190: 69 66 20 74 68 65 72 65 20 61 72 65 0a 2a 2a 20  if there are.** 
a1a0: 6f 74 68 65 72 20 75 6e 69 78 46 69 6c 65 20 6f  other unixFile o
a1b0: 70 65 6e 20 6f 6e 20 74 68 65 20 73 61 6d 65 20  pen on the same 
a1c0: 69 6e 6f 64 65 20 74 68 61 74 20 61 72 65 20 68  inode that are h
a1d0: 6f 6c 64 69 6e 67 20 6c 6f 63 6b 73 2c 20 74 68  olding locks, th
a1e0: 65 20 63 61 6c 6c 0a 2a 2a 20 74 6f 20 63 6c 6f  e call.** to clo
a1f0: 73 65 28 29 20 74 68 65 20 66 69 6c 65 20 64 65  se() the file de
a200: 73 63 72 69 70 74 6f 72 20 69 73 20 64 65 66 65  scriptor is defe
a210: 72 72 65 64 20 75 6e 74 69 6c 20 61 6c 6c 20 6f  rred until all o
a220: 66 20 74 68 65 20 6c 6f 63 6b 73 20 63 6c 65 61  f the locks clea
a230: 72 2e 0a 2a 2a 20 54 68 65 20 75 6e 69 78 49 6e  r..** The unixIn
a240: 6f 64 65 49 6e 66 6f 20 73 74 72 75 63 74 75 72  odeInfo structur
a250: 65 20 6b 65 65 70 73 20 61 20 6c 69 73 74 20 6f  e keeps a list o
a260: 66 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  f file descripto
a270: 72 73 20 74 68 61 74 20 6e 65 65 64 20 74 6f 0a  rs that need to.
a280: 2a 2a 20 62 65 20 63 6c 6f 73 65 64 20 61 6e 64  ** be closed and
a290: 20 74 68 61 74 20 6c 69 73 74 20 69 73 20 77 61   that list is wa
a2a0: 6c 6b 65 64 20 28 61 6e 64 20 63 6c 65 61 72 65  lked (and cleare
a2b0: 64 29 20 77 68 65 6e 20 74 68 65 20 6c 61 73 74  d) when the last
a2c0: 20 6c 6f 63 6b 0a 2a 2a 20 63 6c 65 61 72 73 2e   lock.** clears.
a2d0: 0a 2a 2a 0a 2a 2a 20 59 65 74 20 61 6e 6f 74 68  .**.** Yet anoth
a2e0: 65 72 20 70 72 6f 62 6c 65 6d 3a 20 20 4c 69 6e  er problem:  Lin
a2f0: 75 78 54 68 72 65 61 64 73 20 64 6f 20 6e 6f 74  uxThreads do not
a300: 20 70 6c 61 79 20 77 65 6c 6c 20 77 69 74 68 20   play well with 
a310: 70 6f 73 69 78 20 6c 6f 63 6b 73 2e 0a 2a 2a 0a  posix locks..**.
a320: 2a 2a 20 4d 61 6e 79 20 6f 6c 64 65 72 20 76 65  ** Many older ve
a330: 72 73 69 6f 6e 73 20 6f 66 20 6c 69 6e 75 78 20  rsions of linux 
a340: 75 73 65 20 74 68 65 20 4c 69 6e 75 78 54 68 72  use the LinuxThr
a350: 65 61 64 73 20 6c 69 62 72 61 72 79 20 77 68 69  eads library whi
a360: 63 68 20 69 73 0a 2a 2a 20 6e 6f 74 20 70 6f 73  ch is.** not pos
a370: 69 78 20 63 6f 6d 70 6c 69 61 6e 74 2e 20 20 55  ix compliant.  U
a380: 6e 64 65 72 20 4c 69 6e 75 78 54 68 72 65 61 64  nder LinuxThread
a390: 73 2c 20 61 20 6c 6f 63 6b 20 63 72 65 61 74 65  s, a lock create
a3a0: 64 20 62 79 20 74 68 72 65 61 64 0a 2a 2a 20 41  d by thread.** A
a3b0: 20 63 61 6e 6e 6f 74 20 62 65 20 6d 6f 64 69 66   cannot be modif
a3c0: 69 65 64 20 6f 72 20 6f 76 65 72 72 69 64 64 65  ied or overridde
a3d0: 6e 20 62 79 20 61 20 64 69 66 66 65 72 65 6e 74  n by a different
a3e0: 20 74 68 72 65 61 64 20 42 2e 0a 2a 2a 20 4f 6e   thread B..** On
a3f0: 6c 79 20 74 68 72 65 61 64 20 41 20 63 61 6e 20  ly thread A can 
a400: 6d 6f 64 69 66 79 20 74 68 65 20 6c 6f 63 6b 2e  modify the lock.
a410: 20 20 4c 6f 63 6b 69 6e 67 20 62 65 68 61 76 69    Locking behavi
a420: 6f 72 20 69 73 20 63 6f 72 72 65 63 74 0a 2a 2a  or is correct.**
a430: 20 69 66 20 74 68 65 20 61 70 70 6c 69 61 74 69   if the appliati
a440: 6f 6e 20 75 73 65 73 20 74 68 65 20 6e 65 77 65  on uses the newe
a450: 72 20 4e 61 74 69 76 65 20 50 6f 73 69 78 20 54  r Native Posix T
a460: 68 72 65 61 64 20 4c 69 62 72 61 72 79 20 28 4e  hread Library (N
a470: 50 54 4c 29 0a 2a 2a 20 6f 6e 20 6c 69 6e 75 78  PTL).** on linux
a480: 20 2d 20 77 69 74 68 20 4e 50 54 4c 20 61 20 6c   - with NPTL a l
a490: 6f 63 6b 20 63 72 65 61 74 65 64 20 62 79 20 74  ock created by t
a4a0: 68 72 65 61 64 20 41 20 63 61 6e 20 6f 76 65 72  hread A can over
a4b0: 72 69 64 65 20 6c 6f 63 6b 73 0a 2a 2a 20 69 6e  ride locks.** in
a4c0: 20 74 68 72 65 61 64 20 42 2e 20 20 42 75 74 20   thread B.  But 
a4d0: 74 68 65 72 65 20 69 73 20 6e 6f 20 77 61 79 20  there is no way 
a4e0: 74 6f 20 6b 6e 6f 77 20 61 74 20 63 6f 6d 70 69  to know at compi
a4f0: 6c 65 2d 74 69 6d 65 20 77 68 69 63 68 0a 2a 2a  le-time which.**
a500: 20 74 68 72 65 61 64 69 6e 67 20 6c 69 62 72 61   threading libra
a510: 72 79 20 69 73 20 62 65 69 6e 67 20 75 73 65 64  ry is being used
a520: 2e 20 20 53 6f 20 74 68 65 72 65 20 69 73 20 6e  .  So there is n
a530: 6f 20 77 61 79 20 74 6f 20 6b 6e 6f 77 20 61 74  o way to know at
a540: 0a 2a 2a 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65  .** compile-time
a550: 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20   whether or not 
a560: 74 68 72 65 61 64 20 41 20 63 61 6e 20 6f 76 65  thread A can ove
a570: 72 72 69 64 65 20 6c 6f 63 6b 73 20 6f 6e 20 74  rride locks on t
a580: 68 72 65 61 64 20 42 2e 0a 2a 2a 20 4f 6e 65 20  hread B..** One 
a590: 68 61 73 20 74 6f 20 64 6f 20 61 20 72 75 6e 2d  has to do a run-
a5a0: 74 69 6d 65 20 63 68 65 63 6b 20 74 6f 20 64 69  time check to di
a5b0: 73 63 6f 76 65 72 20 74 68 65 20 62 65 68 61 76  scover the behav
a5c0: 69 6f 72 20 6f 66 20 74 68 65 0a 2a 2a 20 63 75  ior of the.** cu
a5d0: 72 72 65 6e 74 20 70 72 6f 63 65 73 73 2e 0a 2a  rrent process..*
a5e0: 2a 0a 2a 2a 20 53 51 4c 69 74 65 20 75 73 65 64  *.** SQLite used
a5f0: 20 74 6f 20 73 75 70 70 6f 72 74 20 4c 69 6e 75   to support Linu
a600: 78 54 68 72 65 61 64 73 2e 20 20 42 75 74 20 73  xThreads.  But s
a610: 75 70 70 6f 72 74 20 66 6f 72 20 4c 69 6e 75 78  upport for Linux
a620: 54 68 72 65 61 64 73 0a 2a 2a 20 77 61 73 20 64  Threads.** was d
a630: 72 6f 70 70 65 64 20 62 65 67 69 6e 6e 69 6e 67  ropped beginning
a640: 20 77 69 74 68 20 76 65 72 73 69 6f 6e 20 33 2e   with version 3.
a650: 37 2e 30 2e 20 20 53 51 4c 69 74 65 20 77 69 6c  7.0.  SQLite wil
a660: 6c 20 73 74 69 6c 6c 20 77 6f 72 6b 20 77 69 74  l still work wit
a670: 68 0a 2a 2a 20 4c 69 6e 75 78 54 68 72 65 61 64  h.** LinuxThread
a680: 73 20 70 72 6f 76 69 64 65 64 20 74 68 61 74 20  s provided that 
a690: 28 31 29 20 74 68 65 72 65 20 69 73 20 6e 6f 20  (1) there is no 
a6a0: 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20 63 6f  more than one co
a6b0: 6e 6e 65 63 74 69 6f 6e 20 0a 2a 2a 20 70 65 72  nnection .** per
a6c0: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69   database file i
a6d0: 6e 20 74 68 65 20 73 61 6d 65 20 70 72 6f 63 65  n the same proce
a6e0: 73 73 20 61 6e 64 20 28 32 29 20 64 61 74 61 62  ss and (2) datab
a6f0: 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 0a  ase connections.
a700: 2a 2a 20 64 6f 20 6e 6f 74 20 6d 6f 76 65 20 61  ** do not move a
a710: 63 72 6f 73 73 20 74 68 72 65 61 64 73 2e 0a 2a  cross threads..*
a720: 2f 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 69 6e 73 74  /../*.** An inst
a730: 61 6e 63 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c  ance of the foll
a740: 6f 77 69 6e 67 20 73 74 72 75 63 74 75 72 65 20  owing structure 
a750: 73 65 72 76 65 73 20 61 73 20 74 68 65 20 6b 65  serves as the ke
a760: 79 20 75 73 65 64 0a 2a 2a 20 74 6f 20 6c 6f 63  y used.** to loc
a770: 61 74 65 20 61 20 70 61 72 74 69 63 75 6c 61 72  ate a particular
a780: 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 6f   unixInodeInfo o
a790: 62 6a 65 63 74 2e 0a 2a 2f 0a 73 74 72 75 63 74  bject..*/.struct
a7a0: 20 75 6e 69 78 46 69 6c 65 49 64 20 7b 0a 20 20   unixFileId {.  
a7b0: 64 65 76 5f 74 20 64 65 76 3b 20 20 20 20 20 20  dev_t dev;      
a7c0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44              /* D
a7d0: 65 76 69 63 65 20 6e 75 6d 62 65 72 20 2a 2f 0a  evice number */.
a7e0: 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 20  #if OS_VXWORKS. 
a7f0: 20 73 74 72 75 63 74 20 76 78 77 6f 72 6b 73 46   struct vxworksF
a800: 69 6c 65 49 64 20 2a 70 49 64 3b 20 20 2f 2a 20  ileId *pId;  /* 
a810: 55 6e 69 71 75 65 20 66 69 6c 65 20 49 44 20 66  Unique file ID f
a820: 6f 72 20 76 78 77 6f 72 6b 73 2e 20 2a 2f 0a 23  or vxworks. */.#
a830: 65 6c 73 65 0a 20 20 69 6e 6f 5f 74 20 69 6e 6f  else.  ino_t ino
a840: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
a850: 20 20 20 2f 2a 20 49 6e 6f 64 65 20 6e 75 6d 62     /* Inode numb
a860: 65 72 20 2a 2f 0a 23 65 6e 64 69 66 0a 7d 3b 0a  er */.#endif.};.
a870: 0a 2f 2a 0a 2a 2a 20 41 6e 20 69 6e 73 74 61 6e  ./*.** An instan
a880: 63 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77  ce of the follow
a890: 69 6e 67 20 73 74 72 75 63 74 75 72 65 20 69 73  ing structure is
a8a0: 20 61 6c 6c 6f 63 61 74 65 64 20 66 6f 72 20 65   allocated for e
a8b0: 61 63 68 20 6f 70 65 6e 0a 2a 2a 20 69 6e 6f 64  ach open.** inod
a8c0: 65 2e 20 20 4f 72 2c 20 6f 6e 20 4c 69 6e 75 78  e.  Or, on Linux
a8d0: 54 68 72 65 61 64 73 2c 20 74 68 65 72 65 20 69  Threads, there i
a8e0: 73 20 6f 6e 65 20 6f 66 20 74 68 65 73 65 20 73  s one of these s
a8f0: 74 72 75 63 74 75 72 65 73 20 66 6f 72 0a 2a 2a  tructures for.**
a900: 20 65 61 63 68 20 69 6e 6f 64 65 20 6f 70 65 6e   each inode open
a910: 65 64 20 62 79 20 65 61 63 68 20 74 68 72 65 61  ed by each threa
a920: 64 2e 0a 2a 2a 0a 2a 2a 20 41 20 73 69 6e 67 6c  d..**.** A singl
a930: 65 20 69 6e 6f 64 65 20 63 61 6e 20 68 61 76 65  e inode can have
a940: 20 6d 75 6c 74 69 70 6c 65 20 66 69 6c 65 20 64   multiple file d
a950: 65 73 63 72 69 70 74 6f 72 73 2c 20 73 6f 20 65  escriptors, so e
a960: 61 63 68 20 75 6e 69 78 46 69 6c 65 0a 2a 2a 20  ach unixFile.** 
a970: 73 74 72 75 63 74 75 72 65 20 63 6f 6e 74 61 69  structure contai
a980: 6e 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  ns a pointer to 
a990: 61 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74  an instance of t
a9a0: 68 69 73 20 6f 62 6a 65 63 74 20 61 6e 64 20 74  his object and t
a9b0: 68 69 73 0a 2a 2a 20 6f 62 6a 65 63 74 20 6b 65  his.** object ke
a9c0: 65 70 73 20 61 20 63 6f 75 6e 74 20 6f 66 20 74  eps a count of t
a9d0: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 75 6e 69  he number of uni
a9e0: 78 46 69 6c 65 20 70 6f 69 6e 74 69 6e 67 20 74  xFile pointing t
a9f0: 6f 20 69 74 2e 0a 2a 2f 0a 73 74 72 75 63 74 20  o it..*/.struct 
aa00: 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 7b 0a  unixInodeInfo {.
aa10: 20 20 73 74 72 75 63 74 20 75 6e 69 78 46 69 6c    struct unixFil
aa20: 65 49 64 20 66 69 6c 65 49 64 3b 20 20 20 20 20  eId fileId;     
aa30: 20 20 2f 2a 20 54 68 65 20 6c 6f 6f 6b 75 70 20    /* The lookup 
aa40: 6b 65 79 20 2a 2f 0a 20 20 69 6e 74 20 6e 53 68  key */.  int nSh
aa50: 61 72 65 64 3b 20 20 20 20 20 20 20 20 20 20 20  ared;           
aa60: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
aa70: 65 72 20 6f 66 20 53 48 41 52 45 44 20 6c 6f 63  er of SHARED loc
aa80: 6b 73 20 68 65 6c 64 20 2a 2f 0a 20 20 75 6e 73  ks held */.  uns
aa90: 69 67 6e 65 64 20 63 68 61 72 20 65 46 69 6c 65  igned char eFile
aaa0: 4c 6f 63 6b 3b 20 20 20 20 20 20 20 20 2f 2a 20  Lock;        /* 
aab0: 4f 6e 65 20 6f 66 20 53 48 41 52 45 44 5f 4c 4f  One of SHARED_LO
aac0: 43 4b 2c 20 52 45 53 45 52 56 45 44 5f 4c 4f 43  CK, RESERVED_LOC
aad0: 4b 20 65 74 63 2e 20 2a 2f 0a 20 20 75 6e 73 69  K etc. */.  unsi
aae0: 67 6e 65 64 20 63 68 61 72 20 62 50 72 6f 63 65  gned char bProce
aaf0: 73 73 4c 6f 63 6b 3b 20 20 20 20 20 2f 2a 20 41  ssLock;     /* A
ab00: 6e 20 65 78 63 6c 75 73 69 76 65 20 70 72 6f 63  n exclusive proc
ab10: 65 73 73 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64  ess lock is held
ab20: 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 66 3b 20   */.  int nRef; 
ab30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ab40: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
ab50: 6f 66 20 70 6f 69 6e 74 65 72 73 20 74 6f 20 74  of pointers to t
ab60: 68 69 73 20 73 74 72 75 63 74 75 72 65 20 2a 2f  his structure */
ab70: 0a 20 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20 2a  .  unixShmNode *
ab80: 70 53 68 6d 4e 6f 64 65 3b 20 20 20 20 20 20 20  pShmNode;       
ab90: 20 20 20 2f 2a 20 53 68 61 72 65 64 20 6d 65 6d     /* Shared mem
aba0: 6f 72 79 20 61 73 73 6f 63 69 61 74 65 64 20 77  ory associated w
abb0: 69 74 68 20 74 68 69 73 20 69 6e 6f 64 65 20 2a  ith this inode *
abc0: 2f 0a 20 20 69 6e 74 20 6e 4c 6f 63 6b 3b 20 20  /.  int nLock;  
abd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
abe0: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
abf0: 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 66 69 6c   outstanding fil
ac00: 65 20 6c 6f 63 6b 73 20 2a 2f 0a 20 20 55 6e 69  e locks */.  Uni
ac10: 78 55 6e 75 73 65 64 46 64 20 2a 70 55 6e 75 73  xUnusedFd *pUnus
ac20: 65 64 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ed;          /* 
ac30: 55 6e 75 73 65 64 20 66 69 6c 65 20 64 65 73 63  Unused file desc
ac40: 72 69 70 74 6f 72 73 20 74 6f 20 63 6c 6f 73 65  riptors to close
ac50: 20 2a 2f 0a 20 20 75 6e 69 78 49 6e 6f 64 65 49   */.  unixInodeI
ac60: 6e 66 6f 20 2a 70 4e 65 78 74 3b 20 20 20 20 20  nfo *pNext;     
ac70: 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66        /* List of
ac80: 20 61 6c 6c 20 75 6e 69 78 49 6e 6f 64 65 49 6e   all unixInodeIn
ac90: 66 6f 20 6f 62 6a 65 63 74 73 20 2a 2f 0a 20 20  fo objects */.  
aca0: 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 2a 70  unixInodeInfo *p
acb0: 50 72 65 76 3b 20 20 20 20 20 20 20 20 20 20 20  Prev;           
acc0: 2f 2a 20 20 20 20 2e 2e 2e 2e 20 64 6f 75 62 6c  /*    .... doubl
acd0: 79 20 6c 69 6e 6b 65 64 20 2a 2f 0a 23 69 66 20  y linked */.#if 
ace0: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f  SQLITE_ENABLE_LO
acf0: 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 20 20 75 6e  CKING_STYLE.  un
ad00: 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6c 6f 6e 67  signed long long
ad10: 20 73 68 61 72 65 64 42 79 74 65 3b 20 20 2f 2a   sharedByte;  /*
ad20: 20 66 6f 72 20 41 46 50 20 73 69 6d 75 6c 61 74   for AFP simulat
ad30: 65 64 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 2a  ed shared lock *
ad40: 2f 0a 23 65 6e 64 69 66 0a 23 69 66 20 4f 53 5f  /.#endif.#if OS_
ad50: 56 58 57 4f 52 4b 53 0a 20 20 73 65 6d 5f 74 20  VXWORKS.  sem_t 
ad60: 2a 70 53 65 6d 3b 20 20 20 20 20 20 20 20 20 20  *pSem;          
ad70: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d            /* Nam
ad80: 65 64 20 50 4f 53 49 58 20 73 65 6d 61 70 68 6f  ed POSIX semapho
ad90: 72 65 20 2a 2f 0a 20 20 63 68 61 72 20 61 53 65  re */.  char aSe
ada0: 6d 4e 61 6d 65 5b 4d 41 58 5f 50 41 54 48 4e 41  mName[MAX_PATHNA
adb0: 4d 45 2b 32 5d 3b 20 20 2f 2a 20 4e 61 6d 65 20  ME+2];  /* Name 
adc0: 6f 66 20 74 68 61 74 20 73 65 6d 61 70 68 6f 72  of that semaphor
add0: 65 20 2a 2f 0a 23 65 6e 64 69 66 0a 7d 3b 0a 0a  e */.#endif.};..
ade0: 2f 2a 0a 2a 2a 20 41 20 6c 69 73 74 73 20 6f 66  /*.** A lists of
adf0: 20 61 6c 6c 20 75 6e 69 78 49 6e 6f 64 65 49 6e   all unixInodeIn
ae00: 66 6f 20 6f 62 6a 65 63 74 73 2e 0a 2a 2f 0a 73  fo objects..*/.s
ae10: 74 61 74 69 63 20 75 6e 69 78 49 6e 6f 64 65 49  tatic unixInodeI
ae20: 6e 66 6f 20 2a 69 6e 6f 64 65 4c 69 73 74 20 3d  nfo *inodeList =
ae30: 20 30 3b 0a 0a 2f 2a 0a 2a 2a 0a 2a 2a 20 54 68   0;../*.**.** Th
ae40: 69 73 20 66 75 6e 63 74 69 6f 6e 20 2d 20 75 6e  is function - un
ae50: 69 78 4c 6f 67 45 72 72 6f 72 5f 78 28 29 2c 20  ixLogError_x(), 
ae60: 69 73 20 6f 6e 6c 79 20 65 76 65 72 20 63 61 6c  is only ever cal
ae70: 6c 65 64 20 76 69 61 20 74 68 65 20 6d 61 63 72  led via the macr
ae80: 6f 0a 2a 2a 20 75 6e 69 78 4c 6f 67 45 72 72 6f  o.** unixLogErro
ae90: 72 28 29 2e 0a 2a 2a 0a 2a 2a 20 49 74 20 69 73  r()..**.** It is
aea0: 20 69 6e 76 6f 6b 65 64 20 61 66 74 65 72 20 61   invoked after a
aeb0: 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 69  n error occurs i
aec0: 6e 20 61 6e 20 4f 53 20 66 75 6e 63 74 69 6f 6e  n an OS function
aed0: 20 61 6e 64 20 65 72 72 6e 6f 20 68 61 73 20 62   and errno has b
aee0: 65 65 6e 0a 2a 2a 20 73 65 74 2e 20 49 74 20 6c  een.** set. It l
aef0: 6f 67 73 20 61 20 6d 65 73 73 61 67 65 20 75 73  ogs a message us
af00: 69 6e 67 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28  ing sqlite3_log(
af10: 29 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65  ) containing the
af20: 20 63 75 72 72 65 6e 74 20 76 61 6c 75 65 20 6f   current value o
af30: 66 0a 2a 2a 20 65 72 72 6e 6f 20 61 6e 64 2c 20  f.** errno and, 
af40: 69 66 20 70 6f 73 73 69 62 6c 65 2c 20 74 68 65  if possible, the
af50: 20 68 75 6d 61 6e 2d 72 65 61 64 61 62 6c 65 20   human-readable 
af60: 65 71 75 69 76 61 6c 65 6e 74 20 66 72 6f 6d 20  equivalent from 
af70: 73 74 72 65 72 72 6f 72 28 29 20 6f 72 0a 2a 2a  strerror() or.**
af80: 20 73 74 72 65 72 72 6f 72 5f 72 28 29 2e 0a 2a   strerror_r()..*
af90: 2a 0a 2a 2a 20 54 68 65 20 66 69 72 73 74 20 61  *.** The first a
afa0: 72 67 75 6d 65 6e 74 20 70 61 73 73 65 64 20 74  rgument passed t
afb0: 6f 20 74 68 65 20 6d 61 63 72 6f 20 73 68 6f 75  o the macro shou
afc0: 6c 64 20 62 65 20 74 68 65 20 65 72 72 6f 72 20  ld be the error 
afd0: 63 6f 64 65 20 74 68 61 74 0a 2a 2a 20 77 69 6c  code that.** wil
afe0: 6c 20 62 65 20 72 65 74 75 72 6e 65 64 20 74 6f  l be returned to
aff0: 20 53 51 4c 69 74 65 20 28 65 2e 67 2e 20 53 51   SQLite (e.g. SQ
b000: 4c 49 54 45 5f 49 4f 45 52 52 5f 44 45 4c 45 54  LITE_IOERR_DELET
b010: 45 2c 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50  E, SQLITE_CANTOP
b020: 45 4e 29 2e 20 0a 2a 2a 20 54 68 65 20 74 77 6f  EN). .** The two
b030: 20 73 75 62 73 65 71 75 65 6e 74 20 61 72 67 75   subsequent argu
b040: 6d 65 6e 74 73 20 73 68 6f 75 6c 64 20 62 65 20  ments should be 
b050: 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20  the name of the 
b060: 4f 53 20 66 75 6e 63 74 69 6f 6e 20 74 68 61 74  OS function that
b070: 0a 2a 2a 20 66 61 69 6c 65 64 20 28 65 2e 67 2e  .** failed (e.g.
b080: 20 22 75 6e 6c 69 6e 6b 22 2c 20 22 6f 70 65 6e   "unlink", "open
b090: 22 29 20 61 6e 64 20 74 68 65 20 74 68 65 20 61  ") and the the a
b0a0: 73 73 6f 63 69 61 74 65 64 20 66 69 6c 65 2d 73  ssociated file-s
b0b0: 79 73 74 65 6d 20 70 61 74 68 2c 0a 2a 2a 20 69  ystem path,.** i
b0c0: 66 20 61 6e 79 2e 0a 2a 2f 0a 23 64 65 66 69 6e  f any..*/.#defin
b0d0: 65 20 75 6e 69 78 4c 6f 67 45 72 72 6f 72 28 61  e unixLogError(a
b0e0: 2c 62 2c 63 29 20 20 20 20 20 75 6e 69 78 4c 6f  ,b,c)     unixLo
b0f0: 67 45 72 72 6f 72 41 74 4c 69 6e 65 28 61 2c 62  gErrorAtLine(a,b
b100: 2c 63 2c 5f 5f 4c 49 4e 45 5f 5f 29 0a 73 74 61  ,c,__LINE__).sta
b110: 74 69 63 20 69 6e 74 20 75 6e 69 78 4c 6f 67 45  tic int unixLogE
b120: 72 72 6f 72 41 74 4c 69 6e 65 28 0a 20 20 69 6e  rrorAtLine(.  in
b130: 74 20 65 72 72 63 6f 64 65 2c 20 20 20 20 20 20  t errcode,      
b140: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
b150: 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f   SQLite error co
b160: 64 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  de */.  const ch
b170: 61 72 20 2a 7a 46 75 6e 63 2c 20 20 20 20 20 20  ar *zFunc,      
b180: 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20          /* Name 
b190: 6f 66 20 4f 53 20 66 75 6e 63 74 69 6f 6e 20 74  of OS function t
b1a0: 68 61 74 20 66 61 69 6c 65 64 20 2a 2f 0a 20 20  hat failed */.  
b1b0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 61 74  const char *zPat
b1c0: 68 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  h,              
b1d0: 2f 2a 20 46 69 6c 65 20 70 61 74 68 20 61 73 73  /* File path ass
b1e0: 6f 63 69 61 74 65 64 20 77 69 74 68 20 65 72 72  ociated with err
b1f0: 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 69 4c 69 6e  or */.  int iLin
b200: 65 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e               
b210: 20 20 20 20 20 20 20 20 2f 2a 20 53 6f 75 72 63          /* Sourc
b220: 65 20 6c 69 6e 65 20 6e 75 6d 62 65 72 20 77 68  e line number wh
b230: 65 72 65 20 65 72 72 6f 72 20 6f 63 63 75 72 72  ere error occurr
b240: 65 64 20 2a 2f 0a 29 7b 0a 20 20 63 68 61 72 20  ed */.){.  char 
b250: 2a 7a 45 72 72 3b 20 20 20 20 20 20 20 20 20 20  *zErr;          
b260: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 65             /* Me
b270: 73 73 61 67 65 20 66 72 6f 6d 20 73 74 72 65 72  ssage from strer
b280: 72 6f 72 28 29 20 6f 72 20 65 71 75 69 76 61 6c  ror() or equival
b290: 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 69 45 72  ent */.  int iEr
b2a0: 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 20 20 20 20  rno = errno;    
b2b0: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 61 76 65           /* Save
b2c0: 64 20 73 79 73 63 61 6c 6c 20 65 72 72 6f 72 20  d syscall error 
b2d0: 6e 75 6d 62 65 72 20 2a 2f 0a 0a 20 20 2f 2a 20  number */..  /* 
b2e0: 49 66 20 74 68 69 73 20 69 73 20 6e 6f 74 20 61  If this is not a
b2f0: 20 74 68 72 65 61 64 73 61 66 65 20 62 75 69 6c   threadsafe buil
b300: 64 20 28 53 51 4c 49 54 45 5f 54 48 52 45 41 44  d (SQLITE_THREAD
b310: 53 41 46 45 3d 3d 30 29 2c 20 74 68 65 6e 20 75  SAFE==0), then u
b320: 73 65 0a 20 20 2a 2a 20 74 68 65 20 73 74 72 65  se.  ** the stre
b330: 72 72 6f 72 28 29 20 66 75 6e 63 74 69 6f 6e 20  rror() function 
b340: 74 6f 20 6f 62 74 61 69 6e 20 74 68 65 20 68 75  to obtain the hu
b350: 6d 61 6e 2d 72 65 61 64 61 62 6c 65 20 65 72 72  man-readable err
b360: 6f 72 20 6d 65 73 73 61 67 65 0a 20 20 2a 2a 20  or message.  ** 
b370: 65 71 75 69 76 61 6c 65 6e 74 20 74 6f 20 65 72  equivalent to er
b380: 72 6e 6f 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  rno. Otherwise, 
b390: 75 73 65 20 73 74 72 65 72 72 6f 72 5f 72 28 29  use strerror_r()
b3a0: 2e 0a 20 20 2a 2f 20 0a 23 69 66 20 53 51 4c 49  ..  */ .#if SQLI
b3b0: 54 45 5f 54 48 52 45 41 44 53 41 46 45 20 26 26  TE_THREADSAFE &&
b3c0: 20 64 65 66 69 6e 65 64 28 48 41 56 45 5f 53 54   defined(HAVE_ST
b3d0: 52 45 52 52 4f 52 5f 52 29 0a 20 20 63 68 61 72  RERROR_R).  char
b3e0: 20 61 45 72 72 5b 38 30 5d 3b 0a 20 20 6d 65 6d   aErr[80];.  mem
b3f0: 73 65 74 28 61 45 72 72 2c 20 30 2c 20 73 69 7a  set(aErr, 0, siz
b400: 65 6f 66 28 61 45 72 72 29 29 3b 0a 20 20 7a 45  eof(aErr));.  zE
b410: 72 72 20 3d 20 61 45 72 72 3b 0a 0a 20 20 2f 2a  rr = aErr;..  /*
b420: 20 49 66 20 53 54 52 45 52 52 4f 52 5f 52 5f 43   If STRERROR_R_C
b430: 48 41 52 5f 50 20 28 73 65 74 20 62 79 20 61 75  HAR_P (set by au
b440: 74 6f 63 6f 6e 66 20 73 63 72 69 70 74 73 29 20  toconf scripts) 
b450: 6f 72 20 5f 5f 55 53 45 5f 47 4e 55 20 69 73 20  or __USE_GNU is 
b460: 64 65 66 69 6e 65 64 2c 0a 20 20 2a 2a 20 61 73  defined,.  ** as
b470: 73 75 6d 65 20 74 68 61 74 20 74 68 65 20 73 79  sume that the sy
b480: 73 74 65 6d 20 70 72 6f 76 69 64 65 73 20 74 68  stem provides th
b490: 65 20 74 68 65 20 47 4e 55 20 76 65 72 73 69 6f  e the GNU versio
b4a0: 6e 20 6f 66 20 73 74 72 65 72 72 6f 72 5f 72 28  n of strerror_r(
b4b0: 29 20 74 68 61 74 20 0a 20 20 2a 2a 20 72 65 74  ) that .  ** ret
b4c0: 75 72 6e 73 20 61 20 70 6f 69 6e 74 65 72 20 74  urns a pointer t
b4d0: 6f 20 61 20 62 75 66 66 65 72 20 63 6f 6e 74 61  o a buffer conta
b4e0: 69 6e 69 6e 67 20 74 68 65 20 65 72 72 6f 72 20  ining the error 
b4f0: 6d 65 73 73 61 67 65 2e 20 54 68 61 74 20 70 6f  message. That po
b500: 69 6e 74 65 72 20 0a 20 20 2a 2a 20 6d 61 79 20  inter .  ** may 
b510: 70 6f 69 6e 74 20 74 6f 20 61 45 72 72 5b 5d 2c  point to aErr[],
b520: 20 6f 72 20 69 74 20 6d 61 79 20 70 6f 69 6e 74   or it may point
b530: 20 74 6f 20 73 6f 6d 65 20 73 74 61 74 69 63 20   to some static 
b540: 73 74 6f 72 61 67 65 20 73 6f 6d 65 77 68 65 72  storage somewher
b550: 65 2e 20 0a 20 20 2a 2a 20 4f 74 68 65 72 77 69  e. .  ** Otherwi
b560: 73 65 2c 20 61 73 73 75 6d 65 20 74 68 61 74 20  se, assume that 
b570: 74 68 65 20 73 79 73 74 65 6d 20 70 72 6f 76 69  the system provi
b580: 64 65 73 20 74 68 65 20 50 4f 53 49 58 20 76 65  des the POSIX ve
b590: 72 73 69 6f 6e 20 6f 66 20 0a 20 20 2a 2a 20 73  rsion of .  ** s
b5a0: 74 72 65 72 72 6f 72 5f 72 28 29 2c 20 77 68 69  trerror_r(), whi
b5b0: 63 68 20 61 6c 77 61 79 73 20 77 72 69 74 65 73  ch always writes
b5c0: 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67   an error messag
b5d0: 65 20 69 6e 74 6f 20 61 45 72 72 5b 5d 2e 0a 20  e into aErr[].. 
b5e0: 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 74 68 65 20   **.  ** If the 
b5f0: 63 6f 64 65 20 69 6e 63 6f 72 72 65 63 74 6c 79  code incorrectly
b600: 20 61 73 73 75 6d 65 73 20 74 68 61 74 20 69 74   assumes that it
b610: 20 69 73 20 74 68 65 20 50 4f 53 49 58 20 76 65   is the POSIX ve
b620: 72 73 69 6f 6e 20 74 68 61 74 20 69 73 0a 20 20  rsion that is.  
b630: 2a 2a 20 61 76 61 69 6c 61 62 6c 65 2c 20 74 68  ** available, th
b640: 65 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20  e error message 
b650: 77 69 6c 6c 20 6f 66 74 65 6e 20 62 65 20 61 6e  will often be an
b660: 20 65 6d 70 74 79 20 73 74 72 69 6e 67 2e 20 4e   empty string. N
b670: 6f 74 20 61 0a 20 20 2a 2a 20 68 75 67 65 20 70  ot a.  ** huge p
b680: 72 6f 62 6c 65 6d 2e 20 49 6e 63 6f 72 72 65 63  roblem. Incorrec
b690: 74 6c 79 20 63 6f 6e 63 6c 75 64 69 6e 67 20 74  tly concluding t
b6a0: 68 61 74 20 74 68 65 20 47 4e 55 20 76 65 72 73  hat the GNU vers
b6b0: 69 6f 6e 20 69 73 20 61 76 61 69 6c 61 62 6c 65  ion is available
b6c0: 20 0a 20 20 2a 2a 20 63 6f 75 6c 64 20 6c 65 61   .  ** could lea
b6d0: 64 20 74 6f 20 61 20 73 65 67 66 61 75 6c 74 20  d to a segfault 
b6e0: 74 68 6f 75 67 68 2e 0a 20 20 2a 2f 0a 23 69 66  though..  */.#if
b6f0: 20 64 65 66 69 6e 65 64 28 53 54 52 45 52 52 4f   defined(STRERRO
b700: 52 5f 52 5f 43 48 41 52 5f 50 29 20 7c 7c 20 64  R_R_CHAR_P) || d
b710: 65 66 69 6e 65 64 28 5f 5f 55 53 45 5f 47 4e 55  efined(__USE_GNU
b720: 29 0a 20 20 7a 45 72 72 20 3d 20 0a 23 20 65 6e  ).  zErr = .# en
b730: 64 69 66 0a 20 20 73 74 72 65 72 72 6f 72 5f 72  dif.  strerror_r
b740: 28 69 45 72 72 6e 6f 2c 20 61 45 72 72 2c 20 73  (iErrno, aErr, s
b750: 69 7a 65 6f 66 28 61 45 72 72 29 2d 31 29 3b 0a  izeof(aErr)-1);.
b760: 0a 23 65 6c 69 66 20 53 51 4c 49 54 45 5f 54 48  .#elif SQLITE_TH
b770: 52 45 41 44 53 41 46 45 0a 20 20 2f 2a 20 54 68  READSAFE.  /* Th
b780: 69 73 20 69 73 20 61 20 74 68 72 65 61 64 73 61  is is a threadsa
b790: 66 65 20 62 75 69 6c 64 2c 20 62 75 74 20 73 74  fe build, but st
b7a0: 72 65 72 72 6f 72 5f 72 28 29 20 69 73 20 6e 6f  rerror_r() is no
b7b0: 74 20 61 76 61 69 6c 61 62 6c 65 2e 20 2a 2f 0a  t available. */.
b7c0: 20 20 7a 45 72 72 20 3d 20 22 22 3b 0a 23 65 6c    zErr = "";.#el
b7d0: 73 65 0a 20 20 2f 2a 20 4e 6f 6e 2d 74 68 72 65  se.  /* Non-thre
b7e0: 61 64 73 61 66 65 20 62 75 69 6c 64 2c 20 75 73  adsafe build, us
b7f0: 65 20 73 74 72 65 72 72 6f 72 28 29 2e 20 2a 2f  e strerror(). */
b800: 0a 20 20 7a 45 72 72 20 3d 20 73 74 72 65 72 72  .  zErr = strerr
b810: 6f 72 28 69 45 72 72 6e 6f 29 3b 0a 23 65 6e 64  or(iErrno);.#end
b820: 69 66 0a 0a 20 20 61 73 73 65 72 74 28 20 65 72  if..  assert( er
b830: 72 63 6f 64 65 21 3d 53 51 4c 49 54 45 5f 4f 4b  rcode!=SQLITE_OK
b840: 20 29 3b 0a 20 20 69 66 28 20 7a 50 61 74 68 3d   );.  if( zPath=
b850: 3d 30 20 29 20 7a 50 61 74 68 20 3d 20 22 22 3b  =0 ) zPath = "";
b860: 0a 20 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28 65  .  sqlite3_log(e
b870: 72 72 63 6f 64 65 2c 0a 20 20 20 20 20 20 22 6f  rrcode,.      "o
b880: 73 5f 75 6e 69 78 2e 63 3a 25 64 3a 20 28 25 64  s_unix.c:%d: (%d
b890: 29 20 25 73 28 25 73 29 20 2d 20 25 73 22 2c 0a  ) %s(%s) - %s",.
b8a0: 20 20 20 20 20 20 69 4c 69 6e 65 2c 20 69 45 72        iLine, iEr
b8b0: 72 6e 6f 2c 20 7a 46 75 6e 63 2c 20 7a 50 61 74  rno, zFunc, zPat
b8c0: 68 2c 20 7a 45 72 72 0a 20 20 29 3b 0a 0a 20 20  h, zErr.  );..  
b8d0: 72 65 74 75 72 6e 20 65 72 72 63 6f 64 65 3b 0a  return errcode;.
b8e0: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61  }../*.** Close a
b8f0: 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
b900: 2e 0a 2a 2a 0a 2a 2a 20 57 65 20 61 73 73 75 6d  ..**.** We assum
b910: 65 20 74 68 61 74 20 63 6c 6f 73 65 28 29 20 61  e that close() a
b920: 6c 6d 6f 73 74 20 61 6c 77 61 79 73 20 77 6f 72  lmost always wor
b930: 6b 73 2c 20 73 69 6e 63 65 20 69 74 20 69 73 20  ks, since it is 
b940: 6f 6e 6c 79 20 69 6e 20 61 0a 2a 2a 20 76 65 72  only in a.** ver
b950: 79 20 73 69 63 6b 20 61 70 70 6c 69 63 61 74 69  y sick applicati
b960: 6f 6e 20 6f 72 20 6f 6e 20 61 20 76 65 72 79 20  on or on a very 
b970: 73 69 63 6b 20 70 6c 61 74 66 6f 72 6d 20 74 68  sick platform th
b980: 61 74 20 69 74 20 6d 69 67 68 74 20 66 61 69 6c  at it might fail
b990: 2e 0a 2a 2a 20 49 66 20 69 74 20 64 6f 65 73 20  ..** If it does 
b9a0: 66 61 69 6c 2c 20 73 69 6d 70 6c 79 20 6c 65 61  fail, simply lea
b9b0: 6b 20 74 68 65 20 66 69 6c 65 20 64 65 73 63 72  k the file descr
b9c0: 69 70 74 6f 72 2c 20 62 75 74 20 64 6f 20 6c 6f  iptor, but do lo
b9d0: 67 20 74 68 65 0a 2a 2a 20 65 72 72 6f 72 2e 0a  g the.** error..
b9e0: 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20  **.** Note that 
b9f0: 69 74 20 69 73 20 6e 6f 74 20 73 61 66 65 20 74  it is not safe t
ba00: 6f 20 72 65 74 72 79 20 63 6c 6f 73 65 28 29 20  o retry close() 
ba10: 61 66 74 65 72 20 45 49 4e 54 52 20 73 69 6e 63  after EINTR sinc
ba20: 65 20 74 68 65 0a 2a 2a 20 66 69 6c 65 20 64 65  e the.** file de
ba30: 73 63 72 69 70 74 6f 72 20 6d 69 67 68 74 20 68  scriptor might h
ba40: 61 76 65 20 61 6c 72 65 61 64 79 20 62 65 65 6e  ave already been
ba50: 20 72 65 75 73 65 64 20 62 79 20 61 6e 6f 74 68   reused by anoth
ba60: 65 72 20 74 68 72 65 61 64 2e 0a 2a 2a 20 53 6f  er thread..** So
ba70: 20 77 65 20 64 6f 6e 27 74 20 65 76 65 6e 20 74   we don't even t
ba80: 72 79 20 74 6f 20 72 65 63 6f 76 65 72 20 66 72  ry to recover fr
ba90: 6f 6d 20 61 6e 20 45 49 4e 54 52 2e 20 20 4a 75  om an EINTR.  Ju
baa0: 73 74 20 6c 6f 67 20 74 68 65 20 65 72 72 6f 72  st log the error
bab0: 0a 2a 2a 20 61 6e 64 20 6d 6f 76 65 20 6f 6e 2e  .** and move on.
bac0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
bad0: 72 6f 62 75 73 74 5f 63 6c 6f 73 65 28 75 6e 69  robust_close(uni
bae0: 78 46 69 6c 65 20 2a 70 46 69 6c 65 2c 20 69 6e  xFile *pFile, in
baf0: 74 20 68 2c 20 69 6e 74 20 6c 69 6e 65 6e 6f 29  t h, int lineno)
bb00: 7b 0a 20 20 69 66 28 20 6f 73 43 6c 6f 73 65 28  {.  if( osClose(
bb10: 68 29 20 29 7b 0a 20 20 20 20 75 6e 69 78 4c 6f  h) ){.    unixLo
bb20: 67 45 72 72 6f 72 41 74 4c 69 6e 65 28 53 51 4c  gErrorAtLine(SQL
bb30: 49 54 45 5f 49 4f 45 52 52 5f 43 4c 4f 53 45 2c  ITE_IOERR_CLOSE,
bb40: 20 22 63 6c 6f 73 65 22 2c 0a 20 20 20 20 20 20   "close",.      
bb50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bb60: 20 70 46 69 6c 65 20 3f 20 70 46 69 6c 65 2d 3e   pFile ? pFile->
bb70: 7a 50 61 74 68 20 3a 20 30 2c 20 6c 69 6e 65 6e  zPath : 0, linen
bb80: 6f 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  o);.  }.}../*.**
bb90: 20 43 6c 6f 73 65 20 61 6c 6c 20 66 69 6c 65 20   Close all file 
bba0: 64 65 73 63 72 69 70 74 6f 72 73 20 61 63 63 75  descriptors accu
bbb0: 6d 75 61 74 65 64 20 69 6e 20 74 68 65 20 75 6e  muated in the un
bbc0: 69 78 49 6e 6f 64 65 49 6e 66 6f 2d 3e 70 55 6e  ixInodeInfo->pUn
bbd0: 75 73 65 64 20 6c 69 73 74 2e 0a 2a 2f 20 0a 73  used list..*/ .s
bbe0: 74 61 74 69 63 20 76 6f 69 64 20 63 6c 6f 73 65  tatic void close
bbf0: 50 65 6e 64 69 6e 67 46 64 73 28 75 6e 69 78 46  PendingFds(unixF
bc00: 69 6c 65 20 2a 70 46 69 6c 65 29 7b 0a 20 20 75  ile *pFile){.  u
bc10: 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 2a 70 49  nixInodeInfo *pI
bc20: 6e 6f 64 65 20 3d 20 70 46 69 6c 65 2d 3e 70 49  node = pFile->pI
bc30: 6e 6f 64 65 3b 0a 20 20 55 6e 69 78 55 6e 75 73  node;.  UnixUnus
bc40: 65 64 46 64 20 2a 70 3b 0a 20 20 55 6e 69 78 55  edFd *p;.  UnixU
bc50: 6e 75 73 65 64 46 64 20 2a 70 4e 65 78 74 3b 0a  nusedFd *pNext;.
bc60: 20 20 66 6f 72 28 70 3d 70 49 6e 6f 64 65 2d 3e    for(p=pInode->
bc70: 70 55 6e 75 73 65 64 3b 20 70 3b 20 70 3d 70 4e  pUnused; p; p=pN
bc80: 65 78 74 29 7b 0a 20 20 20 20 70 4e 65 78 74 20  ext){.    pNext 
bc90: 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a 23 69 66 20  = p->pNext;.#if 
bca0: 4f 53 43 4c 4f 53 45 5f 43 48 45 43 4b 5f 43 4c  OSCLOSE_CHECK_CL
bcb0: 4f 53 45 5f 49 4f 45 52 52 0a 20 20 20 20 69 66  OSE_IOERR.    if
bcc0: 28 20 63 6c 6f 73 65 28 70 2d 3e 66 64 29 20 29  ( close(p->fd) )
bcd0: 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c  {.      pFile->l
bce0: 61 73 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f  astErrno = errno
bcf0: 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  ;.      rc = SQL
bd00: 49 54 45 5f 49 4f 45 52 52 5f 43 4c 4f 53 45 3b  ITE_IOERR_CLOSE;
bd10: 0a 20 20 20 20 20 20 70 2d 3e 70 4e 65 78 74 20  .      p->pNext 
bd20: 3d 20 70 45 72 72 6f 72 3b 0a 20 20 20 20 20 20  = pError;.      
bd30: 70 45 72 72 6f 72 20 3d 20 70 3b 0a 20 20 20 20  pError = p;.    
bd40: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c  }else{.      sql
bd50: 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 20 20  ite3_free(p);.  
bd60: 20 20 7d 0a 23 65 6c 73 65 0a 20 20 20 20 72 6f    }.#else.    ro
bd70: 62 75 73 74 5f 63 6c 6f 73 65 28 70 46 69 6c 65  bust_close(pFile
bd80: 2c 20 70 2d 3e 66 64 2c 20 5f 5f 4c 49 4e 45 5f  , p->fd, __LINE_
bd90: 5f 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  _);.    sqlite3_
bda0: 66 72 65 65 28 70 29 3b 0a 23 65 6e 64 69 66 0a  free(p);.#endif.
bdb0: 20 20 7d 0a 20 20 70 49 6e 6f 64 65 2d 3e 70 55    }.  pInode->pU
bdc0: 6e 75 73 65 64 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a  nused = 0;.}../*
bdd0: 0a 2a 2a 20 52 65 6c 65 61 73 65 20 61 20 75 6e  .** Release a un
bde0: 69 78 49 6e 6f 64 65 49 6e 66 6f 20 73 74 72 75  ixInodeInfo stru
bdf0: 63 74 75 72 65 20 70 72 65 76 69 6f 75 73 6c 79  cture previously
be00: 20 61 6c 6c 6f 63 61 74 65 64 20 62 79 20 66 69   allocated by fi
be10: 6e 64 49 6e 6f 64 65 49 6e 66 6f 28 29 2e 0a 2a  ndInodeInfo()..*
be20: 2a 0a 2a 2a 20 54 68 65 20 6d 75 74 65 78 20 65  *.** The mutex e
be30: 6e 74 65 72 65 64 20 75 73 69 6e 67 20 74 68 65  ntered using the
be40: 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28   unixEnterMutex(
be50: 29 20 66 75 6e 63 74 69 6f 6e 20 6d 75 73 74 20  ) function must 
be60: 62 65 20 68 65 6c 64 0a 2a 2a 20 77 68 65 6e 20  be held.** when 
be70: 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  this function is
be80: 20 63 61 6c 6c 65 64 2e 0a 2a 2f 0a 73 74 61 74   called..*/.stat
be90: 69 63 20 76 6f 69 64 20 72 65 6c 65 61 73 65 49  ic void releaseI
bea0: 6e 6f 64 65 49 6e 66 6f 28 75 6e 69 78 46 69 6c  nodeInfo(unixFil
beb0: 65 20 2a 70 46 69 6c 65 29 7b 0a 20 20 75 6e 69  e *pFile){.  uni
bec0: 78 49 6e 6f 64 65 49 6e 66 6f 20 2a 70 49 6e 6f  xInodeInfo *pIno
bed0: 64 65 20 3d 20 70 46 69 6c 65 2d 3e 70 49 6e 6f  de = pFile->pIno
bee0: 64 65 3b 0a 20 20 61 73 73 65 72 74 28 20 75 6e  de;.  assert( un
bef0: 69 78 4d 75 74 65 78 48 65 6c 64 28 29 20 29 3b  ixMutexHeld() );
bf00: 0a 20 20 69 66 28 20 41 4c 57 41 59 53 28 70 49  .  if( ALWAYS(pI
bf10: 6e 6f 64 65 29 20 29 7b 0a 20 20 20 20 70 49 6e  node) ){.    pIn
bf20: 6f 64 65 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20 20  ode->nRef--;.   
bf30: 20 69 66 28 20 70 49 6e 6f 64 65 2d 3e 6e 52 65   if( pInode->nRe
bf40: 66 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 61 73  f==0 ){.      as
bf50: 73 65 72 74 28 20 70 49 6e 6f 64 65 2d 3e 70 53  sert( pInode->pS
bf60: 68 6d 4e 6f 64 65 3d 3d 30 20 29 3b 0a 20 20 20  hmNode==0 );.   
bf70: 20 20 20 63 6c 6f 73 65 50 65 6e 64 69 6e 67 46     closePendingF
bf80: 64 73 28 70 46 69 6c 65 29 3b 0a 20 20 20 20 20  ds(pFile);.     
bf90: 20 69 66 28 20 70 49 6e 6f 64 65 2d 3e 70 50 72   if( pInode->pPr
bfa0: 65 76 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73  ev ){.        as
bfb0: 73 65 72 74 28 20 70 49 6e 6f 64 65 2d 3e 70 50  sert( pInode->pP
bfc0: 72 65 76 2d 3e 70 4e 65 78 74 3d 3d 70 49 6e 6f  rev->pNext==pIno
bfd0: 64 65 20 29 3b 0a 20 20 20 20 20 20 20 20 70 49  de );.        pI
bfe0: 6e 6f 64 65 2d 3e 70 50 72 65 76 2d 3e 70 4e 65  node->pPrev->pNe
bff0: 78 74 20 3d 20 70 49 6e 6f 64 65 2d 3e 70 4e 65  xt = pInode->pNe
c000: 78 74 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  xt;.      }else{
c010: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
c020: 20 69 6e 6f 64 65 4c 69 73 74 3d 3d 70 49 6e 6f   inodeList==pIno
c030: 64 65 20 29 3b 0a 20 20 20 20 20 20 20 20 69 6e  de );.        in
c040: 6f 64 65 4c 69 73 74 20 3d 20 70 49 6e 6f 64 65  odeList = pInode
c050: 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d  ->pNext;.      }
c060: 0a 20 20 20 20 20 20 69 66 28 20 70 49 6e 6f 64  .      if( pInod
c070: 65 2d 3e 70 4e 65 78 74 20 29 7b 0a 20 20 20 20  e->pNext ){.    
c080: 20 20 20 20 61 73 73 65 72 74 28 20 70 49 6e 6f      assert( pIno
c090: 64 65 2d 3e 70 4e 65 78 74 2d 3e 70 50 72 65 76  de->pNext->pPrev
c0a0: 3d 3d 70 49 6e 6f 64 65 20 29 3b 0a 20 20 20 20  ==pInode );.    
c0b0: 20 20 20 20 70 49 6e 6f 64 65 2d 3e 70 4e 65 78      pInode->pNex
c0c0: 74 2d 3e 70 50 72 65 76 20 3d 20 70 49 6e 6f 64  t->pPrev = pInod
c0d0: 65 2d 3e 70 50 72 65 76 3b 0a 20 20 20 20 20 20  e->pPrev;.      
c0e0: 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  }.      sqlite3_
c0f0: 66 72 65 65 28 70 49 6e 6f 64 65 29 3b 0a 20 20  free(pInode);.  
c100: 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a    }.  }.}../*.**
c110: 20 47 69 76 65 6e 20 61 20 66 69 6c 65 20 64 65   Given a file de
c120: 73 63 72 69 70 74 6f 72 2c 20 6c 6f 63 61 74 65  scriptor, locate
c130: 20 74 68 65 20 75 6e 69 78 49 6e 6f 64 65 49 6e   the unixInodeIn
c140: 66 6f 20 6f 62 6a 65 63 74 20 74 68 61 74 0a 2a  fo object that.*
c150: 2a 20 64 65 73 63 72 69 62 65 73 20 74 68 61 74  * describes that
c160: 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
c170: 2e 20 20 43 72 65 61 74 65 20 61 20 6e 65 77 20  .  Create a new 
c180: 6f 6e 65 20 69 66 20 6e 65 63 65 73 73 61 72 79  one if necessary
c190: 2e 20 20 54 68 65 0a 2a 2a 20 72 65 74 75 72 6e  .  The.** return
c1a0: 20 76 61 6c 75 65 20 6d 69 67 68 74 20 62 65 20   value might be 
c1b0: 75 6e 69 6e 69 74 69 61 6c 69 7a 65 64 20 69 66  uninitialized if
c1c0: 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   an error occurs
c1d0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d 75 74 65  ..**.** The mute
c1e0: 78 20 65 6e 74 65 72 65 64 20 75 73 69 6e 67 20  x entered using 
c1f0: 74 68 65 20 75 6e 69 78 45 6e 74 65 72 4d 75 74  the unixEnterMut
c200: 65 78 28 29 20 66 75 6e 63 74 69 6f 6e 20 6d 75  ex() function mu
c210: 73 74 20 62 65 20 68 65 6c 64 0a 2a 2a 20 77 68  st be held.** wh
c220: 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  en this function
c230: 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a   is called..**.*
c240: 2a 20 52 65 74 75 72 6e 20 61 6e 20 61 70 70 72  * Return an appr
c250: 6f 70 72 69 61 74 65 20 65 72 72 6f 72 20 63 6f  opriate error co
c260: 64 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  de..*/.static in
c270: 74 20 66 69 6e 64 49 6e 6f 64 65 49 6e 66 6f 28  t findInodeInfo(
c280: 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69  .  unixFile *pFi
c290: 6c 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  le,             
c2a0: 20 20 2f 2a 20 55 6e 69 78 20 66 69 6c 65 20 77    /* Unix file w
c2b0: 69 74 68 20 66 69 6c 65 20 64 65 73 63 20 75 73  ith file desc us
c2c0: 65 64 20 69 6e 20 74 68 65 20 6b 65 79 20 2a 2f  ed in the key */
c2d0: 0a 20 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f  .  unixInodeInfo
c2e0: 20 2a 2a 70 70 49 6e 6f 64 65 20 20 20 20 20 20   **ppInode      
c2f0: 20 20 2f 2a 20 52 65 74 75 72 6e 20 74 68 65 20    /* Return the 
c300: 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 6f 62  unixInodeInfo ob
c310: 6a 65 63 74 20 68 65 72 65 20 2a 2f 0a 29 7b 0a  ject here */.){.
c320: 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20    int rc;       
c330: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c340: 20 2f 2a 20 53 79 73 74 65 6d 20 63 61 6c 6c 20   /* System call 
c350: 72 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20  return code */. 
c360: 20 69 6e 74 20 66 64 3b 20 20 20 20 20 20 20 20   int fd;        
c370: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c380: 2f 2a 20 54 68 65 20 66 69 6c 65 20 64 65 73 63  /* The file desc
c390: 72 69 70 74 6f 72 20 66 6f 72 20 70 46 69 6c 65  riptor for pFile
c3a0: 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 75 6e 69   */.  struct uni
c3b0: 78 46 69 6c 65 49 64 20 66 69 6c 65 49 64 3b 20  xFileId fileId; 
c3c0: 20 20 20 20 20 2f 2a 20 4c 6f 6f 6b 75 70 20 6b       /* Lookup k
c3d0: 65 79 20 66 6f 72 20 74 68 65 20 75 6e 69 78 49  ey for the unixI
c3e0: 6e 6f 64 65 49 6e 66 6f 20 2a 2f 0a 20 20 73 74  nodeInfo */.  st
c3f0: 72 75 63 74 20 73 74 61 74 20 73 74 61 74 62 75  ruct stat statbu
c400: 66 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  f;           /* 
c410: 4c 6f 77 2d 6c 65 76 65 6c 20 66 69 6c 65 20 69  Low-level file i
c420: 6e 66 6f 72 6d 61 74 69 6f 6e 20 2a 2f 0a 20 20  nformation */.  
c430: 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 2a 70  unixInodeInfo *p
c440: 49 6e 6f 64 65 20 3d 20 30 3b 20 20 20 20 20 2f  Inode = 0;     /
c450: 2a 20 43 61 6e 64 69 64 61 74 65 20 75 6e 69 78  * Candidate unix
c460: 49 6e 6f 64 65 49 6e 66 6f 20 6f 62 6a 65 63 74  InodeInfo object
c470: 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 75   */..  assert( u
c480: 6e 69 78 4d 75 74 65 78 48 65 6c 64 28 29 20 29  nixMutexHeld() )
c490: 3b 0a 0a 20 20 2f 2a 20 47 65 74 20 6c 6f 77 2d  ;..  /* Get low-
c4a0: 6c 65 76 65 6c 20 69 6e 66 6f 72 6d 61 74 69 6f  level informatio
c4b0: 6e 20 61 62 6f 75 74 20 74 68 65 20 66 69 6c 65  n about the file
c4c0: 20 74 68 61 74 20 77 65 20 63 61 6e 20 75 73 65   that we can use
c4d0: 64 20 74 6f 0a 20 20 2a 2a 20 63 72 65 61 74 65  d to.  ** create
c4e0: 20 61 20 75 6e 69 71 75 65 20 6e 61 6d 65 20 66   a unique name f
c4f0: 6f 72 20 74 68 65 20 66 69 6c 65 2e 0a 20 20 2a  or the file..  *
c500: 2f 0a 20 20 66 64 20 3d 20 70 46 69 6c 65 2d 3e  /.  fd = pFile->
c510: 68 3b 0a 20 20 72 63 20 3d 20 6f 73 46 73 74 61  h;.  rc = osFsta
c520: 74 28 66 64 2c 20 26 73 74 61 74 62 75 66 29 3b  t(fd, &statbuf);
c530: 0a 20 20 69 66 28 20 72 63 21 3d 30 20 29 7b 0a  .  if( rc!=0 ){.
c540: 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45      pFile->lastE
c550: 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 23 69  rrno = errno;.#i
c560: 66 64 65 66 20 45 4f 56 45 52 46 4c 4f 57 0a 20  fdef EOVERFLOW. 
c570: 20 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 6c 61     if( pFile->la
c580: 73 74 45 72 72 6e 6f 3d 3d 45 4f 56 45 52 46 4c  stErrno==EOVERFL
c590: 4f 57 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  OW ) return SQLI
c5a0: 54 45 5f 4e 4f 4c 46 53 3b 0a 23 65 6e 64 69 66  TE_NOLFS;.#endif
c5b0: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
c5c0: 54 45 5f 49 4f 45 52 52 3b 0a 20 20 7d 0a 0a 23  TE_IOERR;.  }..#
c5d0: 69 66 64 65 66 20 5f 5f 41 50 50 4c 45 5f 5f 0a  ifdef __APPLE__.
c5e0: 20 20 2f 2a 20 4f 6e 20 4f 53 20 58 20 6f 6e 20    /* On OS X on 
c5f0: 61 6e 20 6d 73 64 6f 73 20 66 69 6c 65 73 79 73  an msdos filesys
c600: 74 65 6d 2c 20 74 68 65 20 69 6e 6f 64 65 20 6e  tem, the inode n
c610: 75 6d 62 65 72 20 69 73 20 72 65 70 6f 72 74 65  umber is reporte
c620: 64 0a 20 20 2a 2a 20 69 6e 63 6f 72 72 65 63 74  d.  ** incorrect
c630: 6c 79 20 66 6f 72 20 7a 65 72 6f 2d 73 69 7a 65  ly for zero-size
c640: 20 66 69 6c 65 73 2e 20 20 53 65 65 20 74 69 63   files.  See tic
c650: 6b 65 74 20 23 33 32 36 30 2e 20 20 54 6f 20 77  ket #3260.  To w
c660: 6f 72 6b 0a 20 20 2a 2a 20 61 72 6f 75 6e 64 20  ork.  ** around 
c670: 74 68 69 73 20 70 72 6f 62 6c 65 6d 20 28 77 65  this problem (we
c680: 20 63 6f 6e 73 69 64 65 72 20 69 74 20 61 20 62   consider it a b
c690: 75 67 20 69 6e 20 4f 53 20 58 2c 20 6e 6f 74 20  ug in OS X, not 
c6a0: 53 51 4c 69 74 65 29 0a 20 20 2a 2a 20 77 65 20  SQLite).  ** we 
c6b0: 61 6c 77 61 79 73 20 69 6e 63 72 65 61 73 65 20  always increase 
c6c0: 74 68 65 20 66 69 6c 65 20 73 69 7a 65 20 74 6f  the file size to
c6d0: 20 31 20 62 79 20 77 72 69 74 69 6e 67 20 61 20   1 by writing a 
c6e0: 73 69 6e 67 6c 65 20 62 79 74 65 0a 20 20 2a 2a  single byte.  **
c6f0: 20 70 72 69 6f 72 20 74 6f 20 61 63 63 65 73 73   prior to access
c700: 69 6e 67 20 74 68 65 20 69 6e 6f 64 65 20 6e 75  ing the inode nu
c710: 6d 62 65 72 2e 20 20 54 68 65 20 6f 6e 65 20 62  mber.  The one b
c720: 79 74 65 20 77 72 69 74 74 65 6e 20 69 73 0a 20  yte written is. 
c730: 20 2a 2a 20 61 6e 20 41 53 43 49 49 20 27 53 27   ** an ASCII 'S'
c740: 20 63 68 61 72 61 63 74 65 72 20 77 68 69 63 68   character which
c750: 20 61 6c 73 6f 20 68 61 70 70 65 6e 73 20 74 6f   also happens to
c760: 20 62 65 20 74 68 65 20 66 69 72 73 74 20 62 79   be the first by
c770: 74 65 0a 20 20 2a 2a 20 69 6e 20 74 68 65 20 68  te.  ** in the h
c780: 65 61 64 65 72 20 6f 66 20 65 76 65 72 79 20 53  eader of every S
c790: 51 4c 69 74 65 20 64 61 74 61 62 61 73 65 2e 20  QLite database. 
c7a0: 20 49 6e 20 74 68 69 73 20 77 61 79 2c 20 69 66   In this way, if
c7b0: 20 74 68 65 72 65 0a 20 20 2a 2a 20 69 73 20 61   there.  ** is a
c7c0: 20 72 61 63 65 20 63 6f 6e 64 69 74 69 6f 6e 20   race condition 
c7d0: 73 75 63 68 20 74 68 61 74 20 61 6e 6f 74 68 65  such that anothe
c7e0: 72 20 74 68 72 65 61 64 20 68 61 73 20 61 6c 72  r thread has alr
c7f0: 65 61 64 79 20 70 6f 70 75 6c 61 74 65 64 0a 20  eady populated. 
c800: 20 2a 2a 20 74 68 65 20 66 69 72 73 74 20 70 61   ** the first pa
c810: 67 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  ge of the databa
c820: 73 65 2c 20 6e 6f 20 64 61 6d 61 67 65 20 69 73  se, no damage is
c830: 20 64 6f 6e 65 2e 0a 20 20 2a 2f 0a 20 20 69 66   done..  */.  if
c840: 28 20 73 74 61 74 62 75 66 2e 73 74 5f 73 69 7a  ( statbuf.st_siz
c850: 65 3d 3d 30 20 26 26 20 28 70 46 69 6c 65 2d 3e  e==0 && (pFile->
c860: 66 73 46 6c 61 67 73 20 26 20 53 51 4c 49 54 45  fsFlags & SQLITE
c870: 5f 46 53 46 4c 41 47 53 5f 49 53 5f 4d 53 44 4f  _FSFLAGS_IS_MSDO
c880: 53 29 21 3d 30 20 29 7b 0a 20 20 20 20 64 6f 7b  S)!=0 ){.    do{
c890: 20 72 63 20 3d 20 6f 73 57 72 69 74 65 28 66 64   rc = osWrite(fd
c8a0: 2c 20 22 53 22 2c 20 31 29 3b 20 7d 77 68 69 6c  , "S", 1); }whil
c8b0: 65 28 20 72 63 3c 30 20 26 26 20 65 72 72 6e 6f  e( rc<0 && errno
c8c0: 3d 3d 45 49 4e 54 52 20 29 3b 0a 20 20 20 20 69  ==EINTR );.    i
c8d0: 66 28 20 72 63 21 3d 31 20 29 7b 0a 20 20 20 20  f( rc!=1 ){.    
c8e0: 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72    pFile->lastErr
c8f0: 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20  no = errno;.    
c900: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
c910: 49 4f 45 52 52 3b 0a 20 20 20 20 7d 0a 20 20 20  IOERR;.    }.   
c920: 20 72 63 20 3d 20 6f 73 46 73 74 61 74 28 66 64   rc = osFstat(fd
c930: 2c 20 26 73 74 61 74 62 75 66 29 3b 0a 20 20 20  , &statbuf);.   
c940: 20 69 66 28 20 72 63 21 3d 30 20 29 7b 0a 20 20   if( rc!=0 ){.  
c950: 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45      pFile->lastE
c960: 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20  rrno = errno;.  
c970: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
c980: 45 5f 49 4f 45 52 52 3b 0a 20 20 20 20 7d 0a 20  E_IOERR;.    }. 
c990: 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 6d 65 6d   }.#endif..  mem
c9a0: 73 65 74 28 26 66 69 6c 65 49 64 2c 20 30 2c 20  set(&fileId, 0, 
c9b0: 73 69 7a 65 6f 66 28 66 69 6c 65 49 64 29 29 3b  sizeof(fileId));
c9c0: 0a 20 20 66 69 6c 65 49 64 2e 64 65 76 20 3d 20  .  fileId.dev = 
c9d0: 73 74 61 74 62 75 66 2e 73 74 5f 64 65 76 3b 0a  statbuf.st_dev;.
c9e0: 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 20  #if OS_VXWORKS. 
c9f0: 20 66 69 6c 65 49 64 2e 70 49 64 20 3d 20 70 46   fileId.pId = pF
ca00: 69 6c 65 2d 3e 70 49 64 3b 0a 23 65 6c 73 65 0a  ile->pId;.#else.
ca10: 20 20 66 69 6c 65 49 64 2e 69 6e 6f 20 3d 20 73    fileId.ino = s
ca20: 74 61 74 62 75 66 2e 73 74 5f 69 6e 6f 3b 0a 23  tatbuf.st_ino;.#
ca30: 65 6e 64 69 66 0a 20 20 70 49 6e 6f 64 65 20 3d  endif.  pInode =
ca40: 20 69 6e 6f 64 65 4c 69 73 74 3b 0a 20 20 77 68   inodeList;.  wh
ca50: 69 6c 65 28 20 70 49 6e 6f 64 65 20 26 26 20 6d  ile( pInode && m
ca60: 65 6d 63 6d 70 28 26 66 69 6c 65 49 64 2c 20 26  emcmp(&fileId, &
ca70: 70 49 6e 6f 64 65 2d 3e 66 69 6c 65 49 64 2c 20  pInode->fileId, 
ca80: 73 69 7a 65 6f 66 28 66 69 6c 65 49 64 29 29 20  sizeof(fileId)) 
ca90: 29 7b 0a 20 20 20 20 70 49 6e 6f 64 65 20 3d 20  ){.    pInode = 
caa0: 70 49 6e 6f 64 65 2d 3e 70 4e 65 78 74 3b 0a 20  pInode->pNext;. 
cab0: 20 7d 0a 20 20 69 66 28 20 70 49 6e 6f 64 65 3d   }.  if( pInode=
cac0: 3d 30 20 29 7b 0a 20 20 20 20 70 49 6e 6f 64 65  =0 ){.    pInode
cad0: 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f   = sqlite3_mallo
cae0: 63 28 20 73 69 7a 65 6f 66 28 2a 70 49 6e 6f 64  c( sizeof(*pInod
caf0: 65 29 20 29 3b 0a 20 20 20 20 69 66 28 20 70 49  e) );.    if( pI
cb00: 6e 6f 64 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20  node==0 ){.     
cb10: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
cb20: 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 20 20  OMEM;.    }.    
cb30: 6d 65 6d 73 65 74 28 70 49 6e 6f 64 65 2c 20 30  memset(pInode, 0
cb40: 2c 20 73 69 7a 65 6f 66 28 2a 70 49 6e 6f 64 65  , sizeof(*pInode
cb50: 29 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 26  ));.    memcpy(&
cb60: 70 49 6e 6f 64 65 2d 3e 66 69 6c 65 49 64 2c 20  pInode->fileId, 
cb70: 26 66 69 6c 65 49 64 2c 20 73 69 7a 65 6f 66 28  &fileId, sizeof(
cb80: 66 69 6c 65 49 64 29 29 3b 0a 20 20 20 20 70 49  fileId));.    pI
cb90: 6e 6f 64 65 2d 3e 6e 52 65 66 20 3d 20 31 3b 0a  node->nRef = 1;.
cba0: 20 20 20 20 70 49 6e 6f 64 65 2d 3e 70 4e 65 78      pInode->pNex
cbb0: 74 20 3d 20 69 6e 6f 64 65 4c 69 73 74 3b 0a 20  t = inodeList;. 
cbc0: 20 20 20 70 49 6e 6f 64 65 2d 3e 70 50 72 65 76     pInode->pPrev
cbd0: 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 69 6e   = 0;.    if( in
cbe0: 6f 64 65 4c 69 73 74 20 29 20 69 6e 6f 64 65 4c  odeList ) inodeL
cbf0: 69 73 74 2d 3e 70 50 72 65 76 20 3d 20 70 49 6e  ist->pPrev = pIn
cc00: 6f 64 65 3b 0a 20 20 20 20 69 6e 6f 64 65 4c 69  ode;.    inodeLi
cc10: 73 74 20 3d 20 70 49 6e 6f 64 65 3b 0a 20 20 7d  st = pInode;.  }
cc20: 65 6c 73 65 7b 0a 20 20 20 20 70 49 6e 6f 64 65  else{.    pInode
cc30: 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 7d 0a 20 20  ->nRef++;.  }.  
cc40: 2a 70 70 49 6e 6f 64 65 20 3d 20 70 49 6e 6f 64  *ppInode = pInod
cc50: 65 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  e;.  return SQLI
cc60: 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  TE_OK;.}.../*.**
cc70: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63 68   This routine ch
cc80: 65 63 6b 73 20 69 66 20 74 68 65 72 65 20 69 73  ecks if there is
cc90: 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b   a RESERVED lock
cca0: 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 73 70 65   held on the spe
ccb0: 63 69 66 69 65 64 0a 2a 2a 20 66 69 6c 65 20 62  cified.** file b
ccc0: 79 20 74 68 69 73 20 6f 72 20 61 6e 79 20 6f 74  y this or any ot
ccd0: 68 65 72 20 70 72 6f 63 65 73 73 2e 20 49 66 20  her process. If 
cce0: 73 75 63 68 20 61 20 6c 6f 63 6b 20 69 73 20 68  such a lock is h
ccf0: 65 6c 64 2c 20 73 65 74 20 2a 70 52 65 73 4f 75  eld, set *pResOu
cd00: 74 0a 2a 2a 20 74 6f 20 61 20 6e 6f 6e 2d 7a 65  t.** to a non-ze
cd10: 72 6f 20 76 61 6c 75 65 20 6f 74 68 65 72 77 69  ro value otherwi
cd20: 73 65 20 2a 70 52 65 73 4f 75 74 20 69 73 20 73  se *pResOut is s
cd30: 65 74 20 74 6f 20 7a 65 72 6f 2e 20 20 54 68 65  et to zero.  The
cd40: 20 72 65 74 75 72 6e 20 76 61 6c 75 65 0a 2a 2a   return value.**
cd50: 20 69 73 20 73 65 74 20 74 6f 20 53 51 4c 49 54   is set to SQLIT
cd60: 45 5f 4f 4b 20 75 6e 6c 65 73 73 20 61 6e 20 49  E_OK unless an I
cd70: 2f 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20  /O error occurs 
cd80: 64 75 72 69 6e 67 20 6c 6f 63 6b 20 63 68 65 63  during lock chec
cd90: 6b 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  king..*/.static 
cda0: 69 6e 74 20 75 6e 69 78 43 68 65 63 6b 52 65 73  int unixCheckRes
cdb0: 65 72 76 65 64 4c 6f 63 6b 28 73 71 6c 69 74 65  ervedLock(sqlite
cdc0: 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20  3_file *id, int 
cdd0: 2a 70 52 65 73 4f 75 74 29 7b 0a 20 20 69 6e 74  *pResOut){.  int
cde0: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
cdf0: 0a 20 20 69 6e 74 20 72 65 73 65 72 76 65 64 20  .  int reserved 
ce00: 3d 20 30 3b 0a 20 20 75 6e 69 78 46 69 6c 65 20  = 0;.  unixFile 
ce10: 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69  *pFile = (unixFi
ce20: 6c 65 2a 29 69 64 3b 0a 0a 20 20 53 69 6d 75 6c  le*)id;..  Simul
ce30: 61 74 65 49 4f 45 72 72 6f 72 28 20 72 65 74 75  ateIOError( retu
ce40: 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  rn SQLITE_IOERR_
ce50: 43 48 45 43 4b 52 45 53 45 52 56 45 44 4c 4f 43  CHECKRESERVEDLOC
ce60: 4b 3b 20 29 3b 0a 0a 20 20 61 73 73 65 72 74 28  K; );..  assert(
ce70: 20 70 46 69 6c 65 20 29 3b 0a 20 20 75 6e 69 78   pFile );.  unix
ce80: 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 20 2f 2a  EnterMutex(); /*
ce90: 20 42 65 63 61 75 73 65 20 70 46 69 6c 65 2d 3e   Because pFile->
cea0: 70 49 6e 6f 64 65 20 69 73 20 73 68 61 72 65 64  pInode is shared
ceb0: 20 61 63 72 6f 73 73 20 74 68 72 65 61 64 73 20   across threads 
cec0: 2a 2f 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 69  */..  /* Check i
ced0: 66 20 61 20 74 68 72 65 61 64 20 69 6e 20 74 68  f a thread in th
cee0: 69 73 20 70 72 6f 63 65 73 73 20 68 6f 6c 64 73  is process holds
cef0: 20 73 75 63 68 20 61 20 6c 6f 63 6b 20 2a 2f 0a   such a lock */.
cf00: 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 70 49 6e    if( pFile->pIn
cf10: 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3e 53  ode->eFileLock>S
cf20: 48 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20  HARED_LOCK ){.  
cf30: 20 20 72 65 73 65 72 76 65 64 20 3d 20 31 3b 0a    reserved = 1;.
cf40: 20 20 7d 0a 0a 20 20 2f 2a 20 4f 74 68 65 72 77    }..  /* Otherw
cf50: 69 73 65 20 73 65 65 20 69 66 20 73 6f 6d 65 20  ise see if some 
cf60: 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20 68 6f  other process ho
cf70: 6c 64 73 20 69 74 2e 0a 20 20 2a 2f 0a 23 69 66  lds it..  */.#if
cf80: 6e 64 65 66 20 5f 5f 44 4a 47 50 50 5f 5f 0a 20  ndef __DJGPP__. 
cf90: 20 69 66 28 20 21 72 65 73 65 72 76 65 64 20 26   if( !reserved &
cfa0: 26 20 21 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65  & !pFile->pInode
cfb0: 2d 3e 62 50 72 6f 63 65 73 73 4c 6f 63 6b 20 29  ->bProcessLock )
cfc0: 7b 0a 20 20 20 20 73 74 72 75 63 74 20 66 6c 6f  {.    struct flo
cfd0: 63 6b 20 6c 6f 63 6b 3b 0a 20 20 20 20 6c 6f 63  ck lock;.    loc
cfe0: 6b 2e 6c 5f 77 68 65 6e 63 65 20 3d 20 53 45 45  k.l_whence = SEE
cff0: 4b 5f 53 45 54 3b 0a 20 20 20 20 6c 6f 63 6b 2e  K_SET;.    lock.
d000: 6c 5f 73 74 61 72 74 20 3d 20 52 45 53 45 52 56  l_start = RESERV
d010: 45 44 5f 42 59 54 45 3b 0a 20 20 20 20 6c 6f 63  ED_BYTE;.    loc
d020: 6b 2e 6c 5f 6c 65 6e 20 3d 20 31 3b 0a 20 20 20  k.l_len = 1;.   
d030: 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d 20 46   lock.l_type = F
d040: 5f 57 52 4c 43 4b 3b 0a 20 20 20 20 69 66 28 20  _WRLCK;.    if( 
d050: 6f 73 46 63 6e 74 6c 28 70 46 69 6c 65 2d 3e 68  osFcntl(pFile->h
d060: 2c 20 46 5f 47 45 54 4c 4b 2c 20 26 6c 6f 63 6b  , F_GETLK, &lock
d070: 29 20 29 7b 0a 23 69 66 20 4f 53 4c 4f 43 4b 49  ) ){.#if OSLOCKI
d080: 4e 47 5f 43 48 45 43 4b 5f 42 55 53 59 5f 49 4f  NG_CHECK_BUSY_IO
d090: 45 52 52 0a 20 20 20 20 20 20 69 6e 74 20 74 45  ERR.      int tE
d0a0: 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20  rrno = errno;.  
d0b0: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 45      rc = sqliteE
d0c0: 72 72 6f 72 46 72 6f 6d 50 6f 73 69 78 45 72 72  rrorFromPosixErr
d0d0: 6f 72 28 74 45 72 72 6e 6f 2c 20 53 51 4c 49 54  or(tErrno, SQLIT
d0e0: 45 5f 49 4f 45 52 52 5f 43 48 45 43 4b 52 45 53  E_IOERR_CHECKRES
d0f0: 45 52 56 45 44 4c 4f 43 4b 29 3b 0a 20 20 20 20  ERVEDLOCK);.    
d100: 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72    pFile->lastErr
d110: 6e 6f 20 3d 20 74 45 72 72 6e 6f 3b 0a 23 65 6c  no = tErrno;.#el
d120: 73 65 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  se.      rc = SQ
d130: 4c 49 54 45 5f 49 4f 45 52 52 5f 43 48 45 43 4b  LITE_IOERR_CHECK
d140: 52 45 53 45 52 56 45 44 4c 4f 43 4b 3b 0a 20 20  RESERVEDLOCK;.  
d150: 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45      pFile->lastE
d160: 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 23 65  rrno = errno;.#e
d170: 6e 64 69 66 0a 20 20 20 20 7d 20 65 6c 73 65 20  ndif.    } else 
d180: 69 66 28 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65 21  if( lock.l_type!
d190: 3d 46 5f 55 4e 4c 43 4b 20 29 7b 0a 20 20 20 20  =F_UNLCK ){.    
d1a0: 20 20 72 65 73 65 72 76 65 64 20 3d 20 31 3b 0a    reserved = 1;.
d1b0: 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66      }.  }.#endif
d1c0: 0a 20 20 0a 20 20 75 6e 69 78 4c 65 61 76 65 4d  .  .  unixLeaveM
d1d0: 75 74 65 78 28 29 3b 0a 20 20 4f 53 54 52 41 43  utex();.  OSTRAC
d1e0: 45 28 28 22 54 45 53 54 20 57 52 2d 4c 4f 43 4b  E(("TEST WR-LOCK
d1f0: 20 25 64 20 25 64 20 25 64 20 28 75 6e 69 78 29   %d %d %d (unix)
d200: 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 72  \n", pFile->h, r
d210: 63 2c 20 72 65 73 65 72 76 65 64 29 29 3b 0a 0a  c, reserved));..
d220: 20 20 2a 70 52 65 73 4f 75 74 20 3d 20 72 65 73    *pResOut = res
d230: 65 72 76 65 64 3b 0a 20 20 72 65 74 75 72 6e 20  erved;.  return 
d240: 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 74 74  rc;.}../*.** Att
d250: 65 6d 70 74 20 74 6f 20 73 65 74 20 61 20 73 79  empt to set a sy
d260: 73 74 65 6d 2d 6c 6f 63 6b 20 6f 6e 20 74 68 65  stem-lock on the
d270: 20 66 69 6c 65 20 70 46 69 6c 65 2e 20 20 54 68   file pFile.  Th
d280: 65 20 6c 6f 63 6b 20 69 73 20 0a 2a 2a 20 64 65  e lock is .** de
d290: 73 63 72 69 62 65 64 20 62 79 20 70 4c 6f 63 6b  scribed by pLock
d2a0: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70  ..**.** If the p
d2b0: 46 69 6c 65 20 77 61 73 20 6f 70 65 6e 65 64 20  File was opened 
d2c0: 72 65 61 64 2f 77 72 69 74 65 20 66 72 6f 6d 20  read/write from 
d2d0: 75 6e 69 78 2d 65 78 63 6c 2c 20 74 68 65 6e 20  unix-excl, then 
d2e0: 74 68 65 20 6f 6e 6c 79 20 6c 6f 63 6b 0a 2a 2a  the only lock.**
d2f0: 20 65 76 65 72 20 6f 62 74 61 69 6e 65 64 20 69   ever obtained i
d300: 73 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c  s an exclusive l
d310: 6f 63 6b 2c 20 61 6e 64 20 69 74 20 69 73 20 6f  ock, and it is o
d320: 62 74 61 69 6e 65 64 20 65 78 61 63 74 6c 79 20  btained exactly 
d330: 6f 6e 63 65 0a 2a 2a 20 74 68 65 20 66 69 72 73  once.** the firs
d340: 74 20 74 69 6d 65 20 61 6e 79 20 6c 6f 63 6b 20  t time any lock 
d350: 69 73 20 61 74 74 65 6d 70 74 65 64 2e 20 20 41  is attempted.  A
d360: 6c 6c 20 73 75 62 73 65 71 75 65 6e 74 20 73 79  ll subsequent sy
d370: 73 74 65 6d 20 6c 6f 63 6b 69 6e 67 0a 2a 2a 20  stem locking.** 
d380: 6f 70 65 72 61 74 69 6f 6e 73 20 62 65 63 6f 6d  operations becom
d390: 65 20 6e 6f 2d 6f 70 73 2e 20 20 4c 6f 63 6b 69  e no-ops.  Locki
d3a0: 6e 67 20 6f 70 65 72 61 74 69 6f 6e 73 20 73 74  ng operations st
d3b0: 69 6c 6c 20 68 61 70 70 65 6e 20 69 6e 74 65 72  ill happen inter
d3c0: 6e 61 6c 6c 79 2c 0a 2a 2a 20 69 6e 20 6f 72 64  nally,.** in ord
d3d0: 65 72 20 74 6f 20 63 6f 6f 72 64 69 6e 61 74 65  er to coordinate
d3e0: 20 61 63 63 65 73 73 20 62 65 74 77 65 65 6e 20   access between 
d3f0: 73 65 70 61 72 61 74 65 20 64 61 74 61 62 61 73  separate databas
d400: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 0a 2a 2a  e connections.**
d410: 20 77 69 74 68 69 6e 20 74 68 69 73 20 70 72 6f   within this pro
d420: 63 65 73 73 2c 20 62 75 74 20 61 6c 6c 20 6f 66  cess, but all of
d430: 20 74 68 61 74 20 69 73 20 68 61 6e 64 6c 65 64   that is handled
d440: 20 69 6e 20 6d 65 6d 6f 72 79 20 61 6e 64 20 74   in memory and t
d450: 68 65 0a 2a 2a 20 6f 70 65 72 61 74 69 6e 67 20  he.** operating 
d460: 73 79 73 74 65 6d 20 64 6f 65 73 20 6e 6f 74 20  system does not 
d470: 70 61 72 74 69 63 69 70 61 74 65 2e 0a 2a 2a 0a  participate..**.
d480: 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
d490: 20 69 73 20 61 20 70 61 73 73 2d 74 68 72 6f 75   is a pass-throu
d4a0: 67 68 20 74 6f 20 66 63 6e 74 6c 28 46 5f 53 45  gh to fcntl(F_SE
d4b0: 54 4c 4b 29 20 69 66 20 70 46 69 6c 65 20 69 73  TLK) if pFile is
d4c0: 20 75 73 69 6e 67 0a 2a 2a 20 61 6e 79 20 56 46   using.** any VF
d4d0: 53 20 6f 74 68 65 72 20 74 68 61 6e 20 22 75 6e  S other than "un
d4e0: 69 78 2d 65 78 63 6c 22 20 6f 72 20 69 66 20 70  ix-excl" or if p
d4f0: 46 69 6c 65 20 69 73 20 6f 70 65 6e 65 64 20 6f  File is opened o
d500: 6e 20 22 75 6e 69 78 2d 65 78 63 6c 22 0a 2a 2a  n "unix-excl".**
d510: 20 61 6e 64 20 69 73 20 72 65 61 64 2d 6f 6e 6c   and is read-onl
d520: 79 2e 0a 2a 2a 0a 2a 2a 20 5a 65 72 6f 20 69 73  y..**.** Zero is
d530: 20 72 65 74 75 72 6e 65 64 20 69 66 20 74 68 65   returned if the
d540: 20 63 61 6c 6c 20 63 6f 6d 70 6c 65 74 65 73 20   call completes 
d550: 73 75 63 63 65 73 73 66 75 6c 6c 79 2c 20 6f 72  successfully, or
d560: 20 2d 31 20 69 66 20 61 20 63 61 6c 6c 0a 2a 2a   -1 if a call.**
d570: 20 74 6f 20 66 63 6e 74 6c 28 29 20 66 61 69 6c   to fcntl() fail
d580: 73 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 2c  s. In this case,
d590: 20 65 72 72 6e 6f 20 69 73 20 73 65 74 20 61 70   errno is set ap
d5a0: 70 72 6f 70 72 69 61 74 65 6c 79 20 28 62 79 20  propriately (by 
d5b0: 66 63 6e 74 6c 28 29 29 2e 0a 2a 2f 0a 73 74 61  fcntl())..*/.sta
d5c0: 74 69 63 20 69 6e 74 20 75 6e 69 78 46 69 6c 65  tic int unixFile
d5d0: 4c 6f 63 6b 28 75 6e 69 78 46 69 6c 65 20 2a 70  Lock(unixFile *p
d5e0: 46 69 6c 65 2c 20 73 74 72 75 63 74 20 66 6c 6f  File, struct flo
d5f0: 63 6b 20 2a 70 4c 6f 63 6b 29 7b 0a 20 20 69 6e  ck *pLock){.  in
d600: 74 20 72 63 3b 0a 20 20 75 6e 69 78 49 6e 6f 64  t rc;.  unixInod
d610: 65 49 6e 66 6f 20 2a 70 49 6e 6f 64 65 20 3d 20  eInfo *pInode = 
d620: 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 3b 0a 20  pFile->pInode;. 
d630: 20 61 73 73 65 72 74 28 20 75 6e 69 78 4d 75 74   assert( unixMut
d640: 65 78 48 65 6c 64 28 29 20 29 3b 0a 20 20 61 73  exHeld() );.  as
d650: 73 65 72 74 28 20 70 49 6e 6f 64 65 21 3d 30 20  sert( pInode!=0 
d660: 29 3b 0a 20 20 69 66 28 20 28 28 70 46 69 6c 65  );.  if( ((pFile
d670: 2d 3e 63 74 72 6c 46 6c 61 67 73 20 26 20 55 4e  ->ctrlFlags & UN
d680: 49 58 46 49 4c 45 5f 45 58 43 4c 29 21 3d 30 20  IXFILE_EXCL)!=0 
d690: 7c 7c 20 70 49 6e 6f 64 65 2d 3e 62 50 72 6f 63  || pInode->bProc
d6a0: 65 73 73 4c 6f 63 6b 29 0a 20 20 20 26 26 20 28  essLock).   && (
d6b0: 28 70 46 69 6c 65 2d 3e 63 74 72 6c 46 6c 61 67  (pFile->ctrlFlag
d6c0: 73 20 26 20 55 4e 49 58 46 49 4c 45 5f 52 44 4f  s & UNIXFILE_RDO
d6d0: 4e 4c 59 29 3d 3d 30 29 0a 20 20 29 7b 0a 20 20  NLY)==0).  ){.  
d6e0: 20 20 69 66 28 20 70 49 6e 6f 64 65 2d 3e 62 50    if( pInode->bP
d6f0: 72 6f 63 65 73 73 4c 6f 63 6b 3d 3d 30 20 29 7b  rocessLock==0 ){
d700: 0a 20 20 20 20 20 20 73 74 72 75 63 74 20 66 6c  .      struct fl
d710: 6f 63 6b 20 6c 6f 63 6b 3b 0a 20 20 20 20 20 20  ock lock;.      
d720: 61 73 73 65 72 74 28 20 70 49 6e 6f 64 65 2d 3e  assert( pInode->
d730: 6e 4c 6f 63 6b 3d 3d 30 20 29 3b 0a 20 20 20 20  nLock==0 );.    
d740: 20 20 6c 6f 63 6b 2e 6c 5f 77 68 65 6e 63 65 20    lock.l_whence 
d750: 3d 20 53 45 45 4b 5f 53 45 54 3b 0a 20 20 20 20  = SEEK_SET;.    
d760: 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d    lock.l_start =
d770: 20 53 48 41 52 45 44 5f 46 49 52 53 54 3b 0a 20   SHARED_FIRST;. 
d780: 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20       lock.l_len 
d790: 3d 20 53 48 41 52 45 44 5f 53 49 5a 45 3b 0a 20  = SHARED_SIZE;. 
d7a0: 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65       lock.l_type
d7b0: 20 3d 20 46 5f 57 52 4c 43 4b 3b 0a 20 20 20 20   = F_WRLCK;.    
d7c0: 20 20 72 63 20 3d 20 6f 73 46 63 6e 74 6c 28 70    rc = osFcntl(p
d7d0: 46 69 6c 65 2d 3e 68 2c 20 46 5f 53 45 54 4c 4b  File->h, F_SETLK
d7e0: 2c 20 26 6c 6f 63 6b 29 3b 0a 20 20 20 20 20 20  , &lock);.      
d7f0: 69 66 28 20 72 63 3c 30 20 29 20 72 65 74 75 72  if( rc<0 ) retur
d800: 6e 20 72 63 3b 0a 20 20 20 20 20 20 70 49 6e 6f  n rc;.      pIno
d810: 64 65 2d 3e 62 50 72 6f 63 65 73 73 4c 6f 63 6b  de->bProcessLock
d820: 20 3d 20 31 3b 0a 20 20 20 20 20 20 70 49 6e 6f   = 1;.      pIno
d830: 64 65 2d 3e 6e 4c 6f 63 6b 2b 2b 3b 0a 20 20 20  de->nLock++;.   
d840: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63   }else{.      rc
d850: 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 65   = 0;.    }.  }e
d860: 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 6f 73  lse{.    rc = os
d870: 46 63 6e 74 6c 28 70 46 69 6c 65 2d 3e 68 2c 20  Fcntl(pFile->h, 
d880: 46 5f 53 45 54 4c 4b 2c 20 70 4c 6f 63 6b 29 3b  F_SETLK, pLock);
d890: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
d8a0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 6b 20  ;.}../*.** Lock 
d8b0: 74 68 65 20 66 69 6c 65 20 77 69 74 68 20 74 68  the file with th
d8c0: 65 20 6c 6f 63 6b 20 73 70 65 63 69 66 69 65 64  e lock specified
d8d0: 20 62 79 20 70 61 72 61 6d 65 74 65 72 20 65 46   by parameter eF
d8e0: 69 6c 65 4c 6f 63 6b 20 2d 20 6f 6e 65 0a 2a 2a  ileLock - one.**
d8f0: 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   of the followin
d900: 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28 31 29  g:.**.**     (1)
d910: 20 53 48 41 52 45 44 5f 4c 4f 43 4b 0a 2a 2a 20   SHARED_LOCK.** 
d920: 20 20 20 20 28 32 29 20 52 45 53 45 52 56 45 44      (2) RESERVED
d930: 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 33 29  _LOCK.**     (3)
d940: 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 0a 2a 2a   PENDING_LOCK.**
d950: 20 20 20 20 20 28 34 29 20 45 58 43 4c 55 53 49       (4) EXCLUSI
d960: 56 45 5f 4c 4f 43 4b 0a 2a 2a 0a 2a 2a 20 53 6f  VE_LOCK.**.** So
d970: 6d 65 74 69 6d 65 73 20 77 68 65 6e 20 72 65 71  metimes when req
d980: 75 65 73 74 69 6e 67 20 6f 6e 65 20 6c 6f 63 6b  uesting one lock
d990: 20 73 74 61 74 65 2c 20 61 64 64 69 74 69 6f 6e   state, addition
d9a0: 61 6c 20 6c 6f 63 6b 20 73 74 61 74 65 73 0a 2a  al lock states.*
d9b0: 2a 20 61 72 65 20 69 6e 73 65 72 74 65 64 20 69  * are inserted i
d9c0: 6e 20 62 65 74 77 65 65 6e 2e 20 20 54 68 65 20  n between.  The 
d9d0: 6c 6f 63 6b 69 6e 67 20 6d 69 67 68 74 20 66 61  locking might fa
d9e0: 69 6c 20 6f 6e 20 6f 6e 65 20 6f 66 20 74 68 65  il on one of the
d9f0: 20 6c 61 74 65 72 0a 2a 2a 20 74 72 61 6e 73 69   later.** transi
da00: 74 69 6f 6e 73 20 6c 65 61 76 69 6e 67 20 74 68  tions leaving th
da10: 65 20 6c 6f 63 6b 20 73 74 61 74 65 20 64 69 66  e lock state dif
da20: 66 65 72 65 6e 74 20 66 72 6f 6d 20 77 68 61 74  ferent from what
da30: 20 69 74 20 73 74 61 72 74 65 64 20 62 75 74 0a   it started but.
da40: 2a 2a 20 73 74 69 6c 6c 20 73 68 6f 72 74 20 6f  ** still short o
da50: 66 20 69 74 73 20 67 6f 61 6c 2e 20 20 54 68 65  f its goal.  The
da60: 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 68 61 72 74   following chart
da70: 20 73 68 6f 77 73 20 74 68 65 20 61 6c 6c 6f 77   shows the allow
da80: 65 64 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e  ed.** transition
da90: 73 20 61 6e 64 20 74 68 65 20 69 6e 73 65 72 74  s and the insert
daa0: 65 64 20 69 6e 74 65 72 6d 65 64 69 61 74 65 20  ed intermediate 
dab0: 73 74 61 74 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  states:.**.**   
dac0: 20 55 4e 4c 4f 43 4b 45 44 20 2d 3e 20 53 48 41   UNLOCKED -> SHA
dad0: 52 45 44 0a 2a 2a 20 20 20 20 53 48 41 52 45 44  RED.**    SHARED
dae0: 20 2d 3e 20 52 45 53 45 52 56 45 44 0a 2a 2a 20   -> RESERVED.** 
daf0: 20 20 20 53 48 41 52 45 44 20 2d 3e 20 28 50 45     SHARED -> (PE
db00: 4e 44 49 4e 47 29 20 2d 3e 20 45 58 43 4c 55 53  NDING) -> EXCLUS
db10: 49 56 45 0a 2a 2a 20 20 20 20 52 45 53 45 52 56  IVE.**    RESERV
db20: 45 44 20 2d 3e 20 28 50 45 4e 44 49 4e 47 29 20  ED -> (PENDING) 
db30: 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20  -> EXCLUSIVE.** 
db40: 20 20 20 50 45 4e 44 49 4e 47 20 2d 3e 20 45 58     PENDING -> EX
db50: 43 4c 55 53 49 56 45 0a 2a 2a 0a 2a 2a 20 54 68  CLUSIVE.**.** Th
db60: 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20  is routine will 
db70: 6f 6e 6c 79 20 69 6e 63 72 65 61 73 65 20 61 20  only increase a 
db80: 6c 6f 63 6b 2e 20 20 55 73 65 20 74 68 65 20 73  lock.  Use the s
db90: 71 6c 69 74 65 33 4f 73 55 6e 6c 6f 63 6b 28 29  qlite3OsUnlock()
dba0: 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 74 6f 20 6c  .** routine to l
dbb0: 6f 77 65 72 20 61 20 6c 6f 63 6b 69 6e 67 20 6c  ower a locking l
dbc0: 65 76 65 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  evel..*/.static 
dbd0: 69 6e 74 20 75 6e 69 78 4c 6f 63 6b 28 73 71 6c  int unixLock(sql
dbe0: 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69  ite3_file *id, i
dbf0: 6e 74 20 65 46 69 6c 65 4c 6f 63 6b 29 7b 0a 20  nt eFileLock){. 
dc00: 20 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e   /* The followin
dc10: 67 20 64 65 73 63 72 69 62 65 73 20 74 68 65 20  g describes the 
dc20: 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f  implementation o
dc30: 66 20 74 68 65 20 76 61 72 69 6f 75 73 20 6c 6f  f the various lo
dc40: 63 6b 73 20 61 6e 64 0a 20 20 2a 2a 20 6c 6f 63  cks and.  ** loc
dc50: 6b 20 74 72 61 6e 73 69 74 69 6f 6e 73 20 69 6e  k transitions in
dc60: 20 74 65 72 6d 73 20 6f 66 20 74 68 65 20 50 4f   terms of the PO
dc70: 53 49 58 20 61 64 76 69 73 6f 72 79 20 73 68 61  SIX advisory sha
dc80: 72 65 64 20 61 6e 64 20 65 78 63 6c 75 73 69 76  red and exclusiv
dc90: 65 0a 20 20 2a 2a 20 6c 6f 63 6b 20 70 72 69 6d  e.  ** lock prim
dca0: 69 74 69 76 65 73 20 28 63 61 6c 6c 65 64 20 72  itives (called r
dcb0: 65 61 64 2d 6c 6f 63 6b 73 20 61 6e 64 20 77 72  ead-locks and wr
dcc0: 69 74 65 2d 6c 6f 63 6b 73 20 62 65 6c 6f 77 2c  ite-locks below,
dcd0: 20 74 6f 20 61 76 6f 69 64 0a 20 20 2a 2a 20 63   to avoid.  ** c
dce0: 6f 6e 66 75 73 69 6f 6e 20 77 69 74 68 20 53 51  onfusion with SQ
dcf0: 4c 69 74 65 20 6c 6f 63 6b 20 6e 61 6d 65 73 29  Lite lock names)
dd00: 2e 20 54 68 65 20 61 6c 67 6f 72 69 74 68 6d 73  . The algorithms
dd10: 20 61 72 65 20 63 6f 6d 70 6c 69 63 61 74 65 64   are complicated
dd20: 0a 20 20 2a 2a 20 73 6c 69 67 68 74 6c 79 20 69  .  ** slightly i
dd30: 6e 20 6f 72 64 65 72 20 74 6f 20 62 65 20 63 6f  n order to be co
dd40: 6d 70 61 74 69 62 6c 65 20 77 69 74 68 20 77 69  mpatible with wi
dd50: 6e 64 6f 77 73 20 73 79 73 74 65 6d 73 20 73 69  ndows systems si
dd60: 6d 75 6c 74 61 6e 65 6f 75 73 6c 79 0a 20 20 2a  multaneously.  *
dd70: 2a 20 61 63 63 65 73 73 69 6e 67 20 74 68 65 20  * accessing the 
dd80: 73 61 6d 65 20 64 61 74 61 62 61 73 65 20 66 69  same database fi
dd90: 6c 65 2c 20 69 6e 20 63 61 73 65 20 74 68 61 74  le, in case that
dda0: 20 69 73 20 65 76 65 72 20 72 65 71 75 69 72 65   is ever require
ddb0: 64 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 53 79 6d  d..  **.  ** Sym
ddc0: 62 6f 6c 73 20 64 65 66 69 6e 65 64 20 69 6e 20  bols defined in 
ddd0: 6f 73 2e 68 20 69 6e 64 65 6e 74 69 66 79 20 74  os.h indentify t
dde0: 68 65 20 27 70 65 6e 64 69 6e 67 20 62 79 74 65  he 'pending byte
ddf0: 27 20 61 6e 64 20 74 68 65 20 27 72 65 73 65 72  ' and the 'reser
de00: 76 65 64 0a 20 20 2a 2a 20 62 79 74 65 27 2c 20  ved.  ** byte', 
de10: 65 61 63 68 20 73 69 6e 67 6c 65 20 62 79 74 65  each single byte
de20: 73 20 61 74 20 77 65 6c 6c 20 6b 6e 6f 77 6e 20  s at well known 
de30: 6f 66 66 73 65 74 73 2c 20 61 6e 64 20 74 68 65  offsets, and the
de40: 20 27 73 68 61 72 65 64 20 62 79 74 65 0a 20 20   'shared byte.  
de50: 2a 2a 20 72 61 6e 67 65 27 2c 20 61 20 72 61 6e  ** range', a ran
de60: 67 65 20 6f 66 20 35 31 30 20 62 79 74 65 73 20  ge of 510 bytes 
de70: 61 74 20 61 20 77 65 6c 6c 20 6b 6e 6f 77 6e 20  at a well known 
de80: 6f 66 66 73 65 74 2e 0a 20 20 2a 2a 0a 20 20 2a  offset..  **.  *
de90: 2a 20 54 6f 20 6f 62 74 61 69 6e 20 61 20 53 48  * To obtain a SH
dea0: 41 52 45 44 20 6c 6f 63 6b 2c 20 61 20 72 65 61  ARED lock, a rea
deb0: 64 2d 6c 6f 63 6b 20 69 73 20 6f 62 74 61 69 6e  d-lock is obtain
dec0: 65 64 20 6f 6e 20 74 68 65 20 27 70 65 6e 64 69  ed on the 'pendi
ded0: 6e 67 0a 20 20 2a 2a 20 62 79 74 65 27 2e 20 20  ng.  ** byte'.  
dee0: 49 66 20 74 68 69 73 20 69 73 20 73 75 63 63 65  If this is succe
def0: 73 73 66 75 6c 2c 20 61 20 72 61 6e 64 6f 6d 20  ssful, a random 
df00: 62 79 74 65 20 66 72 6f 6d 20 74 68 65 20 27 73  byte from the 's
df10: 68 61 72 65 64 20 62 79 74 65 0a 20 20 2a 2a 20  hared byte.  ** 
df20: 72 61 6e 67 65 27 20 69 73 20 72 65 61 64 2d 6c  range' is read-l
df30: 6f 63 6b 65 64 20 61 6e 64 20 74 68 65 20 6c 6f  ocked and the lo
df40: 63 6b 20 6f 6e 20 74 68 65 20 27 70 65 6e 64 69  ck on the 'pendi
df50: 6e 67 20 62 79 74 65 27 20 72 65 6c 65 61 73 65  ng byte' release
df60: 64 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 20 70  d..  **.  ** A p
df70: 72 6f 63 65 73 73 20 6d 61 79 20 6f 6e 6c 79 20  rocess may only 
df80: 6f 62 74 61 69 6e 20 61 20 52 45 53 45 52 56 45  obtain a RESERVE
df90: 44 20 6c 6f 63 6b 20 61 66 74 65 72 20 69 74 20  D lock after it 
dfa0: 68 61 73 20 61 20 53 48 41 52 45 44 20 6c 6f 63  has a SHARED loc
dfb0: 6b 2e 0a 20 20 2a 2a 20 41 20 52 45 53 45 52 56  k..  ** A RESERV
dfc0: 45 44 20 6c 6f 63 6b 20 69 73 20 69 6d 70 6c 65  ED lock is imple
dfd0: 6d 65 6e 74 65 64 20 62 79 20 67 72 61 62 62 69  mented by grabbi
dfe0: 6e 67 20 61 20 77 72 69 74 65 2d 6c 6f 63 6b 20  ng a write-lock 
dff0: 6f 6e 20 74 68 65 0a 20 20 2a 2a 20 27 72 65 73  on the.  ** 'res
e000: 65 72 76 65 64 20 62 79 74 65 27 2e 20 0a 20 20  erved byte'. .  
e010: 2a 2a 0a 20 20 2a 2a 20 41 20 70 72 6f 63 65 73  **.  ** A proces
e020: 73 20 6d 61 79 20 6f 6e 6c 79 20 6f 62 74 61 69  s may only obtai
e030: 6e 20 61 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b  n a PENDING lock
e040: 20 61 66 74 65 72 20 69 74 20 68 61 73 20 6f 62   after it has ob
e050: 74 61 69 6e 65 64 20 61 0a 20 20 2a 2a 20 53 48  tained a.  ** SH
e060: 41 52 45 44 20 6c 6f 63 6b 2e 20 41 20 50 45 4e  ARED lock. A PEN
e070: 44 49 4e 47 20 6c 6f 63 6b 20 69 73 20 69 6d 70  DING lock is imp
e080: 6c 65 6d 65 6e 74 65 64 20 62 79 20 6f 62 74 61  lemented by obta
e090: 69 6e 69 6e 67 20 61 20 77 72 69 74 65 2d 6c 6f  ining a write-lo
e0a0: 63 6b 0a 20 20 2a 2a 20 6f 6e 20 74 68 65 20 27  ck.  ** on the '
e0b0: 70 65 6e 64 69 6e 67 20 62 79 74 65 27 2e 20 54  pending byte'. T
e0c0: 68 69 73 20 65 6e 73 75 72 65 73 20 74 68 61 74  his ensures that
e0d0: 20 6e 6f 20 6e 65 77 20 53 48 41 52 45 44 20 6c   no new SHARED l
e0e0: 6f 63 6b 73 20 63 61 6e 20 62 65 0a 20 20 2a 2a  ocks can be.  **
e0f0: 20 6f 62 74 61 69 6e 65 64 2c 20 62 75 74 20 65   obtained, but e
e100: 78 69 73 74 69 6e 67 20 53 48 41 52 45 44 20 6c  xisting SHARED l
e110: 6f 63 6b 73 20 61 72 65 20 61 6c 6c 6f 77 65 64  ocks are allowed
e120: 20 74 6f 20 70 65 72 73 69 73 74 2e 20 41 20 70   to persist. A p
e130: 72 6f 63 65 73 73 0a 20 20 2a 2a 20 64 6f 65 73  rocess.  ** does
e140: 20 6e 6f 74 20 68 61 76 65 20 74 6f 20 6f 62 74   not have to obt
e150: 61 69 6e 20 61 20 52 45 53 45 52 56 45 44 20 6c  ain a RESERVED l
e160: 6f 63 6b 20 6f 6e 20 74 68 65 20 77 61 79 20 74  ock on the way t
e170: 6f 20 61 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b  o a PENDING lock
e180: 2e 0a 20 20 2a 2a 20 54 68 69 73 20 70 72 6f 70  ..  ** This prop
e190: 65 72 74 79 20 69 73 20 75 73 65 64 20 62 79 20  erty is used by 
e1a0: 74 68 65 20 61 6c 67 6f 72 69 74 68 6d 20 66 6f  the algorithm fo
e1b0: 72 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 61  r rolling back a
e1c0: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 20 20   journal file.  
e1d0: 2a 2a 20 61 66 74 65 72 20 61 20 63 72 61 73 68  ** after a crash
e1e0: 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 6e 20 45  ..  **.  ** An E
e1f0: 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2c 20 6f  XCLUSIVE lock, o
e200: 62 74 61 69 6e 65 64 20 61 66 74 65 72 20 61 20  btained after a 
e210: 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 20 69 73 20  PENDING lock is 
e220: 68 65 6c 64 2c 20 69 73 0a 20 20 2a 2a 20 69 6d  held, is.  ** im
e230: 70 6c 65 6d 65 6e 74 65 64 20 62 79 20 6f 62 74  plemented by obt
e240: 61 69 6e 69 6e 67 20 61 20 77 72 69 74 65 2d 6c  aining a write-l
e250: 6f 63 6b 20 6f 6e 20 74 68 65 20 65 6e 74 69 72  ock on the entir
e260: 65 20 27 73 68 61 72 65 64 20 62 79 74 65 0a 20  e 'shared byte. 
e270: 20 2a 2a 20 72 61 6e 67 65 27 2e 20 53 69 6e 63   ** range'. Sinc
e280: 65 20 61 6c 6c 20 6f 74 68 65 72 20 6c 6f 63 6b  e all other lock
e290: 73 20 72 65 71 75 69 72 65 20 61 20 72 65 61 64  s require a read
e2a0: 2d 6c 6f 63 6b 20 6f 6e 20 6f 6e 65 20 6f 66 20  -lock on one of 
e2b0: 74 68 65 20 62 79 74 65 73 0a 20 20 2a 2a 20 77  the bytes.  ** w
e2c0: 69 74 68 69 6e 20 74 68 69 73 20 72 61 6e 67 65  ithin this range
e2d0: 2c 20 74 68 69 73 20 65 6e 73 75 72 65 73 20 74  , this ensures t
e2e0: 68 61 74 20 6e 6f 20 6f 74 68 65 72 20 6c 6f 63  hat no other loc
e2f0: 6b 73 20 61 72 65 20 68 65 6c 64 20 6f 6e 20 74  ks are held on t
e300: 68 65 0a 20 20 2a 2a 20 64 61 74 61 62 61 73 65  he.  ** database
e310: 2e 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65  . .  **.  ** The
e320: 20 72 65 61 73 6f 6e 20 61 20 73 69 6e 67 6c 65   reason a single
e330: 20 62 79 74 65 20 63 61 6e 6e 6f 74 20 62 65 20   byte cannot be 
e340: 75 73 65 64 20 69 6e 73 74 65 61 64 20 6f 66 20  used instead of 
e350: 74 68 65 20 27 73 68 61 72 65 64 20 62 79 74 65  the 'shared byte
e360: 0a 20 20 2a 2a 20 72 61 6e 67 65 27 20 69 73 20  .  ** range' is 
e370: 74 68 61 74 20 73 6f 6d 65 20 76 65 72 73 69 6f  that some versio
e380: 6e 73 20 6f 66 20 77 69 6e 64 6f 77 73 20 64 6f  ns of windows do
e390: 20 6e 6f 74 20 73 75 70 70 6f 72 74 20 72 65 61   not support rea
e3a0: 64 2d 6c 6f 63 6b 73 2e 20 42 79 0a 20 20 2a 2a  d-locks. By.  **
e3b0: 20 6c 6f 63 6b 69 6e 67 20 61 20 72 61 6e 64 6f   locking a rando
e3c0: 6d 20 62 79 74 65 20 66 72 6f 6d 20 61 20 72 61  m byte from a ra
e3d0: 6e 67 65 2c 20 63 6f 6e 63 75 72 72 65 6e 74 20  nge, concurrent 
e3e0: 53 48 41 52 45 44 20 6c 6f 63 6b 73 20 6d 61 79  SHARED locks may
e3f0: 20 65 78 69 73 74 0a 20 20 2a 2a 20 65 76 65 6e   exist.  ** even
e400: 20 69 66 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20   if the locking 
e410: 70 72 69 6d 69 74 69 76 65 20 75 73 65 64 20 69  primitive used i
e420: 73 20 61 6c 77 61 79 73 20 61 20 77 72 69 74 65  s always a write
e430: 2d 6c 6f 63 6b 2e 0a 20 20 2a 2f 0a 20 20 69 6e  -lock..  */.  in
e440: 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
e450: 3b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46  ;.  unixFile *pF
e460: 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a  ile = (unixFile*
e470: 29 69 64 3b 0a 20 20 75 6e 69 78 49 6e 6f 64 65  )id;.  unixInode
e480: 49 6e 66 6f 20 2a 70 49 6e 6f 64 65 20 3d 20 70  Info *pInode = p
e490: 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 3b 0a 20 20  File->pInode;.  
e4a0: 73 74 72 75 63 74 20 66 6c 6f 63 6b 20 6c 6f 63  struct flock loc
e4b0: 6b 3b 0a 20 20 69 6e 74 20 74 45 72 72 6e 6f 20  k;.  int tErrno 
e4c0: 3d 20 30 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  = 0;..  assert( 
e4d0: 70 46 69 6c 65 20 29 3b 0a 20 20 4f 53 54 52 41  pFile );.  OSTRA
e4e0: 43 45 28 28 22 4c 4f 43 4b 20 20 20 20 25 64 20  CE(("LOCK    %d 
e4f0: 25 73 20 77 61 73 20 25 73 28 25 73 2c 25 64 29  %s was %s(%s,%d)
e500: 20 70 69 64 3d 25 64 20 28 75 6e 69 78 29 5c 6e   pid=%d (unix)\n
e510: 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 0a 20 20 20  ", pFile->h,.   
e520: 20 20 20 61 7a 46 69 6c 65 4c 6f 63 6b 28 65 46     azFileLock(eF
e530: 69 6c 65 4c 6f 63 6b 29 2c 20 61 7a 46 69 6c 65  ileLock), azFile
e540: 4c 6f 63 6b 28 70 46 69 6c 65 2d 3e 65 46 69 6c  Lock(pFile->eFil
e550: 65 4c 6f 63 6b 29 2c 0a 20 20 20 20 20 20 61 7a  eLock),.      az
e560: 46 69 6c 65 4c 6f 63 6b 28 70 49 6e 6f 64 65 2d  FileLock(pInode-
e570: 3e 65 46 69 6c 65 4c 6f 63 6b 29 2c 20 70 49 6e  >eFileLock), pIn
e580: 6f 64 65 2d 3e 6e 53 68 61 72 65 64 20 2c 20 67  ode->nShared , g
e590: 65 74 70 69 64 28 29 29 29 3b 0a 0a 20 20 2f 2a  etpid()));..  /*
e5a0: 20 49 66 20 74 68 65 72 65 20 69 73 20 61 6c 72   If there is alr
e5b0: 65 61 64 79 20 61 20 6c 6f 63 6b 20 6f 66 20 74  eady a lock of t
e5c0: 68 69 73 20 74 79 70 65 20 6f 72 20 6d 6f 72 65  his type or more
e5d0: 20 72 65 73 74 72 69 63 74 69 76 65 20 6f 6e 20   restrictive on 
e5e0: 74 68 65 0a 20 20 2a 2a 20 75 6e 69 78 46 69 6c  the.  ** unixFil
e5f0: 65 2c 20 64 6f 20 6e 6f 74 68 69 6e 67 2e 20 44  e, do nothing. D
e600: 6f 6e 27 74 20 75 73 65 20 74 68 65 20 65 6e 64  on't use the end
e610: 5f 6c 6f 63 6b 3a 20 65 78 69 74 20 70 61 74 68  _lock: exit path
e620: 2c 20 61 73 0a 20 20 2a 2a 20 75 6e 69 78 45 6e  , as.  ** unixEn
e630: 74 65 72 4d 75 74 65 78 28 29 20 68 61 73 6e 27  terMutex() hasn'
e640: 74 20 62 65 65 6e 20 63 61 6c 6c 65 64 20 79 65  t been called ye
e650: 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 46  t..  */.  if( pF
e660: 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3e 3d  ile->eFileLock>=
e670: 65 46 69 6c 65 4c 6f 63 6b 20 29 7b 0a 20 20 20  eFileLock ){.   
e680: 20 4f 53 54 52 41 43 45 28 28 22 4c 4f 43 4b 20   OSTRACE(("LOCK 
e690: 20 20 20 25 64 20 25 73 20 6f 6b 20 28 61 6c 72     %d %s ok (alr
e6a0: 65 61 64 79 20 68 65 6c 64 29 20 28 75 6e 69 78  eady held) (unix
e6b0: 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 0a  )\n", pFile->h,.
e6c0: 20 20 20 20 20 20 20 20 20 20 20 20 61 7a 46 69              azFi
e6d0: 6c 65 4c 6f 63 6b 28 65 46 69 6c 65 4c 6f 63 6b  leLock(eFileLock
e6e0: 29 29 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  )));.    return 
e6f0: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a  SQLITE_OK;.  }..
e700: 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74    /* Make sure t
e710: 68 65 20 6c 6f 63 6b 69 6e 67 20 73 65 71 75 65  he locking seque
e720: 6e 63 65 20 69 73 20 63 6f 72 72 65 63 74 2e 0a  nce is correct..
e730: 20 20 2a 2a 20 20 28 31 29 20 57 65 20 6e 65 76    **  (1) We nev
e740: 65 72 20 6d 6f 76 65 20 66 72 6f 6d 20 75 6e 6c  er move from unl
e750: 6f 63 6b 65 64 20 74 6f 20 61 6e 79 74 68 69 6e  ocked to anythin
e760: 67 20 68 69 67 68 65 72 20 74 68 61 6e 20 73 68  g higher than sh
e770: 61 72 65 64 20 6c 6f 63 6b 2e 0a 20 20 2a 2a 20  ared lock..  ** 
e780: 20 28 32 29 20 53 51 4c 69 74 65 20 6e 65 76 65   (2) SQLite neve
e790: 72 20 65 78 70 6c 69 63 69 74 6c 79 20 72 65 71  r explicitly req
e7a0: 75 65 73 74 73 20 61 20 70 65 6e 64 69 67 20 6c  uests a pendig l
e7b0: 6f 63 6b 2e 0a 20 20 2a 2a 20 20 28 33 29 20 41  ock..  **  (3) A
e7c0: 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 69 73 20   shared lock is 
e7d0: 61 6c 77 61 79 73 20 68 65 6c 64 20 77 68 65 6e  always held when
e7e0: 20 61 20 72 65 73 65 72 76 65 20 6c 6f 63 6b 20   a reserve lock 
e7f0: 69 73 20 72 65 71 75 65 73 74 65 64 2e 0a 20 20  is requested..  
e800: 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 46 69  */.  assert( pFi
e810: 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 21 3d 4e  le->eFileLock!=N
e820: 4f 5f 4c 4f 43 4b 20 7c 7c 20 65 46 69 6c 65 4c  O_LOCK || eFileL
e830: 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b  ock==SHARED_LOCK
e840: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 65 46   );.  assert( eF
e850: 69 6c 65 4c 6f 63 6b 21 3d 50 45 4e 44 49 4e 47  ileLock!=PENDING
e860: 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65 72  _LOCK );.  asser
e870: 74 28 20 65 46 69 6c 65 4c 6f 63 6b 21 3d 52 45  t( eFileLock!=RE
e880: 53 45 52 56 45 44 5f 4c 4f 43 4b 20 7c 7c 20 70  SERVED_LOCK || p
e890: 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d  File->eFileLock=
e8a0: 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a  =SHARED_LOCK );.
e8b0: 0a 20 20 2f 2a 20 54 68 69 73 20 6d 75 74 65 78  .  /* This mutex
e8c0: 20 69 73 20 6e 65 65 64 65 64 20 62 65 63 61 75   is needed becau
e8d0: 73 65 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65  se pFile->pInode
e8e0: 20 69 73 20 73 68 61 72 65 64 20 61 63 72 6f 73   is shared acros
e8f0: 73 20 74 68 72 65 61 64 73 0a 20 20 2a 2f 0a 20  s threads.  */. 
e900: 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28   unixEnterMutex(
e910: 29 3b 0a 20 20 70 49 6e 6f 64 65 20 3d 20 70 46  );.  pInode = pF
e920: 69 6c 65 2d 3e 70 49 6e 6f 64 65 3b 0a 0a 20 20  ile->pInode;..  
e930: 2f 2a 20 49 66 20 73 6f 6d 65 20 74 68 72 65 61  /* If some threa
e940: 64 20 75 73 69 6e 67 20 74 68 69 73 20 50 49 44  d using this PID
e950: 20 68 61 73 20 61 20 6c 6f 63 6b 20 76 69 61 20   has a lock via 
e960: 61 20 64 69 66 66 65 72 65 6e 74 20 75 6e 69 78  a different unix
e970: 46 69 6c 65 2a 0a 20 20 2a 2a 20 68 61 6e 64 6c  File*.  ** handl
e980: 65 20 74 68 61 74 20 70 72 65 63 6c 75 64 65 73  e that precludes
e990: 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20 6c   the requested l
e9a0: 6f 63 6b 2c 20 72 65 74 75 72 6e 20 42 55 53 59  ock, return BUSY
e9b0: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 28 70 46  ..  */.  if( (pF
e9c0: 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 21 3d  ile->eFileLock!=
e9d0: 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63  pInode->eFileLoc
e9e0: 6b 20 26 26 20 0a 20 20 20 20 20 20 20 20 20 20  k && .          
e9f0: 28 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f  (pInode->eFileLo
ea00: 63 6b 3e 3d 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b  ck>=PENDING_LOCK
ea10: 20 7c 7c 20 65 46 69 6c 65 4c 6f 63 6b 3e 53 48   || eFileLock>SH
ea20: 41 52 45 44 5f 4c 4f 43 4b 29 29 0a 20 20 29 7b  ARED_LOCK)).  ){
ea30: 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
ea40: 5f 42 55 53 59 3b 0a 20 20 20 20 67 6f 74 6f 20  _BUSY;.    goto 
ea50: 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 7d 0a 0a 20  end_lock;.  }.. 
ea60: 20 2f 2a 20 49 66 20 61 20 53 48 41 52 45 44 20   /* If a SHARED 
ea70: 6c 6f 63 6b 20 69 73 20 72 65 71 75 65 73 74 65  lock is requeste
ea80: 64 2c 20 61 6e 64 20 73 6f 6d 65 20 74 68 72 65  d, and some thre
ea90: 61 64 20 75 73 69 6e 67 20 74 68 69 73 20 50 49  ad using this PI
eaa0: 44 20 61 6c 72 65 61 64 79 0a 20 20 2a 2a 20 68  D already.  ** h
eab0: 61 73 20 61 20 53 48 41 52 45 44 20 6f 72 20 52  as a SHARED or R
eac0: 45 53 45 52 56 45 44 20 6c 6f 63 6b 2c 20 74 68  ESERVED lock, th
ead0: 65 6e 20 69 6e 63 72 65 6d 65 6e 74 20 72 65 66  en increment ref
eae0: 65 72 65 6e 63 65 20 63 6f 75 6e 74 73 20 61 6e  erence counts an
eaf0: 64 0a 20 20 2a 2a 20 72 65 74 75 72 6e 20 53 51  d.  ** return SQ
eb00: 4c 49 54 45 5f 4f 4b 2e 0a 20 20 2a 2f 0a 20 20  LITE_OK..  */.  
eb10: 69 66 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53  if( eFileLock==S
eb20: 48 41 52 45 44 5f 4c 4f 43 4b 20 26 26 20 0a 20  HARED_LOCK && . 
eb30: 20 20 20 20 20 28 70 49 6e 6f 64 65 2d 3e 65 46       (pInode->eF
eb40: 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f  ileLock==SHARED_
eb50: 4c 4f 43 4b 20 7c 7c 20 70 49 6e 6f 64 65 2d 3e  LOCK || pInode->
eb60: 65 46 69 6c 65 4c 6f 63 6b 3d 3d 52 45 53 45 52  eFileLock==RESER
eb70: 56 45 44 5f 4c 4f 43 4b 29 20 29 7b 0a 20 20 20  VED_LOCK) ){.   
eb80: 20 61 73 73 65 72 74 28 20 65 46 69 6c 65 4c 6f   assert( eFileLo
eb90: 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20  ck==SHARED_LOCK 
eba0: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
ebb0: 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d  File->eFileLock=
ebc0: 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  =0 );.    assert
ebd0: 28 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65  ( pInode->nShare
ebe0: 64 3e 30 20 29 3b 0a 20 20 20 20 70 46 69 6c 65  d>0 );.    pFile
ebf0: 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 53 48  ->eFileLock = SH
ec00: 41 52 45 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20 70  ARED_LOCK;.    p
ec10: 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64 2b 2b  Inode->nShared++
ec20: 3b 0a 20 20 20 20 70 49 6e 6f 64 65 2d 3e 6e 4c  ;.    pInode->nL
ec30: 6f 63 6b 2b 2b 3b 0a 20 20 20 20 67 6f 74 6f 20  ock++;.    goto 
ec40: 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 7d 0a 0a 0a  end_lock;.  }...
ec50: 20 20 2f 2a 20 41 20 50 45 4e 44 49 4e 47 20 6c    /* A PENDING l
ec60: 6f 63 6b 20 69 73 20 6e 65 65 64 65 64 20 62 65  ock is needed be
ec70: 66 6f 72 65 20 61 63 71 75 69 72 69 6e 67 20 61  fore acquiring a
ec80: 20 53 48 41 52 45 44 20 6c 6f 63 6b 20 61 6e 64   SHARED lock and
ec90: 20 62 65 66 6f 72 65 0a 20 20 2a 2a 20 61 63 71   before.  ** acq
eca0: 75 69 72 69 6e 67 20 61 6e 20 45 58 43 4c 55 53  uiring an EXCLUS
ecb0: 49 56 45 20 6c 6f 63 6b 2e 20 20 46 6f 72 20 74  IVE lock.  For t
ecc0: 68 65 20 53 48 41 52 45 44 20 6c 6f 63 6b 2c 20  he SHARED lock, 
ecd0: 74 68 65 20 50 45 4e 44 49 4e 47 20 77 69 6c 6c  the PENDING will
ece0: 0a 20 20 2a 2a 20 62 65 20 72 65 6c 65 61 73 65  .  ** be release
ecf0: 64 2e 0a 20 20 2a 2f 0a 20 20 6c 6f 63 6b 2e 6c  d..  */.  lock.l
ed00: 5f 6c 65 6e 20 3d 20 31 4c 3b 0a 20 20 6c 6f 63  _len = 1L;.  loc
ed10: 6b 2e 6c 5f 77 68 65 6e 63 65 20 3d 20 53 45 45  k.l_whence = SEE
ed20: 4b 5f 53 45 54 3b 0a 20 20 69 66 28 20 65 46 69  K_SET;.  if( eFi
ed30: 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c  leLock==SHARED_L
ed40: 4f 43 4b 20 0a 20 20 20 20 20 20 7c 7c 20 28 65  OCK .      || (e
ed50: 46 69 6c 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53  FileLock==EXCLUS
ed60: 49 56 45 5f 4c 4f 43 4b 20 26 26 20 70 46 69 6c  IVE_LOCK && pFil
ed70: 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3c 50 45 4e  e->eFileLock<PEN
ed80: 44 49 4e 47 5f 4c 4f 43 4b 29 0a 20 20 29 7b 0a  DING_LOCK).  ){.
ed90: 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65 20      lock.l_type 
eda0: 3d 20 28 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48  = (eFileLock==SH
edb0: 41 52 45 44 5f 4c 4f 43 4b 3f 46 5f 52 44 4c 43  ARED_LOCK?F_RDLC
edc0: 4b 3a 46 5f 57 52 4c 43 4b 29 3b 0a 20 20 20 20  K:F_WRLCK);.    
edd0: 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 50  lock.l_start = P
ede0: 45 4e 44 49 4e 47 5f 42 59 54 45 3b 0a 20 20 20  ENDING_BYTE;.   
edf0: 20 69 66 28 20 75 6e 69 78 46 69 6c 65 4c 6f 63   if( unixFileLoc
ee00: 6b 28 70 46 69 6c 65 2c 20 26 6c 6f 63 6b 29 20  k(pFile, &lock) 
ee10: 29 7b 0a 20 20 20 20 20 20 74 45 72 72 6e 6f 20  ){.      tErrno 
ee20: 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20 72  = errno;.      r
ee30: 63 20 3d 20 73 71 6c 69 74 65 45 72 72 6f 72 46  c = sqliteErrorF
ee40: 72 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28 74 45  romPosixError(tE
ee50: 72 72 6e 6f 2c 20 53 51 4c 49 54 45 5f 49 4f 45  rrno, SQLITE_IOE
ee60: 52 52 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20  RR_LOCK);.      
ee70: 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f  if( IS_LOCK_ERRO
ee80: 52 28 72 63 29 20 29 7b 0a 20 20 20 20 20 20 20  R(rc) ){.       
ee90: 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e   pFile->lastErrn
eea0: 6f 20 3d 20 74 45 72 72 6e 6f 3b 0a 20 20 20 20  o = tErrno;.    
eeb0: 20 20 7d 0a 20 20 20 20 20 20 67 6f 74 6f 20 65    }.      goto e
eec0: 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 20 20 7d 0a 20  nd_lock;.    }. 
eed0: 20 7d 0a 0a 0a 20 20 2f 2a 20 49 66 20 63 6f 6e   }...  /* If con
eee0: 74 72 6f 6c 20 67 65 74 73 20 74 6f 20 74 68 69  trol gets to thi
eef0: 73 20 70 6f 69 6e 74 2c 20 74 68 65 6e 20 61 63  s point, then ac
ef00: 74 75 61 6c 6c 79 20 67 6f 20 61 68 65 61 64 20  tually go ahead 
ef10: 61 6e 64 20 6d 61 6b 65 0a 20 20 2a 2a 20 6f 70  and make.  ** op
ef20: 65 72 61 74 69 6e 67 20 73 79 73 74 65 6d 20 63  erating system c
ef30: 61 6c 6c 73 20 66 6f 72 20 74 68 65 20 73 70 65  alls for the spe
ef40: 63 69 66 69 65 64 20 6c 6f 63 6b 2e 0a 20 20 2a  cified lock..  *
ef50: 2f 0a 20 20 69 66 28 20 65 46 69 6c 65 4c 6f 63  /.  if( eFileLoc
ef60: 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29  k==SHARED_LOCK )
ef70: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 49  {.    assert( pI
ef80: 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64 3d 3d 30  node->nShared==0
ef90: 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
efa0: 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63  pInode->eFileLoc
efb0: 6b 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65  k==0 );.    asse
efc0: 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  rt( rc==SQLITE_O
efd0: 4b 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 4e 6f 77  K );..    /* Now
efe0: 20 67 65 74 20 74 68 65 20 72 65 61 64 2d 6c 6f   get the read-lo
eff0: 63 6b 20 2a 2f 0a 20 20 20 20 6c 6f 63 6b 2e 6c  ck */.    lock.l
f000: 5f 73 74 61 72 74 20 3d 20 53 48 41 52 45 44 5f  _start = SHARED_
f010: 46 49 52 53 54 3b 0a 20 20 20 20 6c 6f 63 6b 2e  FIRST;.    lock.
f020: 6c 5f 6c 65 6e 20 3d 20 53 48 41 52 45 44 5f 53  l_len = SHARED_S
f030: 49 5a 45 3b 0a 20 20 20 20 69 66 28 20 75 6e 69  IZE;.    if( uni
f040: 78 46 69 6c 65 4c 6f 63 6b 28 70 46 69 6c 65 2c  xFileLock(pFile,
f050: 20 26 6c 6f 63 6b 29 20 29 7b 0a 20 20 20 20 20   &lock) ){.     
f060: 20 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b   tErrno = errno;
f070: 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
f080: 74 65 45 72 72 6f 72 46 72 6f 6d 50 6f 73 69 78  teErrorFromPosix
f090: 45 72 72 6f 72 28 74 45 72 72 6e 6f 2c 20 53 51  Error(tErrno, SQ
f0a0: 4c 49 54 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b 29  LITE_IOERR_LOCK)
f0b0: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
f0c0: 44 72 6f 70 20 74 68 65 20 74 65 6d 70 6f 72 61  Drop the tempora
f0d0: 72 79 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 20  ry PENDING lock 
f0e0: 2a 2f 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74  */.    lock.l_st
f0f0: 61 72 74 20 3d 20 50 45 4e 44 49 4e 47 5f 42 59  art = PENDING_BY
f100: 54 45 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 6c  TE;.    lock.l_l
f110: 65 6e 20 3d 20 31 4c 3b 0a 20 20 20 20 6c 6f 63  en = 1L;.    loc
f120: 6b 2e 6c 5f 74 79 70 65 20 3d 20 46 5f 55 4e 4c  k.l_type = F_UNL
f130: 43 4b 3b 0a 20 20 20 20 69 66 28 20 75 6e 69 78  CK;.    if( unix
f140: 46 69 6c 65 4c 6f 63 6b 28 70 46 69 6c 65 2c 20  FileLock(pFile, 
f150: 26 6c 6f 63 6b 29 20 26 26 20 72 63 3d 3d 53 51  &lock) && rc==SQ
f160: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
f170: 20 2f 2a 20 54 68 69 73 20 63 6f 75 6c 64 20 68   /* This could h
f180: 61 70 70 65 6e 20 77 69 74 68 20 61 20 6e 65 74  appen with a net
f190: 77 6f 72 6b 20 6d 6f 75 6e 74 20 2a 2f 0a 20 20  work mount */.  
f1a0: 20 20 20 20 74 45 72 72 6e 6f 20 3d 20 65 72 72      tErrno = err
f1b0: 6e 6f 3b 0a 23 69 66 20 4f 53 4c 4f 43 4b 49 4e  no;.#if OSLOCKIN
f1c0: 47 5f 43 48 45 43 4b 5f 42 55 53 59 5f 49 4f 45  G_CHECK_BUSY_IOE
f1d0: 52 52 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  RR.      rc = sq
f1e0: 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d 50 6f 73  liteErrorFromPos
f1f0: 69 78 45 72 72 6f 72 28 74 45 72 72 6e 6f 2c 20  ixError(tErrno, 
f200: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c  SQLITE_IOERR_UNL
f210: 4f 43 4b 29 3b 20 0a 23 65 6c 73 65 0a 20 20 20  OCK); .#else.   
f220: 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49     rc = SQLITE_I
f230: 4f 45 52 52 5f 55 4e 4c 4f 43 4b 3b 20 0a 23 65  OERR_UNLOCK; .#e
f240: 6e 64 69 66 0a 20 20 20 20 7d 0a 0a 20 20 20 20  ndif.    }..    
f250: 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20  if( rc ){.      
f260: 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f  if( IS_LOCK_ERRO
f270: 52 28 72 63 29 20 29 7b 0a 20 20 20 20 20 20 20  R(rc) ){.       
f280: 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e   pFile->lastErrn
f290: 6f 20 3d 20 74 45 72 72 6e 6f 3b 0a 20 20 20 20  o = tErrno;.    
f2a0: 20 20 7d 0a 20 20 20 20 20 20 67 6f 74 6f 20 65    }.      goto e
f2b0: 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 20 20 7d 65 6c  nd_lock;.    }el
f2c0: 73 65 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d  se{.      pFile-
f2d0: 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 53 48 41  >eFileLock = SHA
f2e0: 52 45 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20 20 20  RED_LOCK;.      
f2f0: 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 2b 2b 3b  pInode->nLock++;
f300: 0a 20 20 20 20 20 20 70 49 6e 6f 64 65 2d 3e 6e  .      pInode->n
f310: 53 68 61 72 65 64 20 3d 20 31 3b 0a 20 20 20 20  Shared = 1;.    
f320: 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 65 46  }.  }else if( eF
f330: 69 6c 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49  ileLock==EXCLUSI
f340: 56 45 5f 4c 4f 43 4b 20 26 26 20 70 49 6e 6f 64  VE_LOCK && pInod
f350: 65 2d 3e 6e 53 68 61 72 65 64 3e 31 20 29 7b 0a  e->nShared>1 ){.
f360: 20 20 20 20 2f 2a 20 57 65 20 61 72 65 20 74 72      /* We are tr
f370: 79 69 6e 67 20 66 6f 72 20 61 6e 20 65 78 63 6c  ying for an excl
f380: 75 73 69 76 65 20 6c 6f 63 6b 20 62 75 74 20 61  usive lock but a
f390: 6e 6f 74 68 65 72 20 74 68 72 65 61 64 20 69 6e  nother thread in
f3a0: 20 74 68 69 73 0a 20 20 20 20 2a 2a 20 73 61 6d   this.    ** sam
f3b0: 65 20 70 72 6f 63 65 73 73 20 69 73 20 73 74 69  e process is sti
f3c0: 6c 6c 20 68 6f 6c 64 69 6e 67 20 61 20 73 68 61  ll holding a sha
f3d0: 72 65 64 20 6c 6f 63 6b 2e 20 2a 2f 0a 20 20 20  red lock. */.   
f3e0: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53   rc = SQLITE_BUS
f3f0: 59 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  Y;.  }else{.    
f400: 2f 2a 20 54 68 65 20 72 65 71 75 65 73 74 20 77  /* The request w
f410: 61 73 20 66 6f 72 20 61 20 52 45 53 45 52 56 45  as for a RESERVE
f420: 44 20 6f 72 20 45 58 43 4c 55 53 49 56 45 20 6c  D or EXCLUSIVE l
f430: 6f 63 6b 2e 20 20 49 74 20 69 73 0a 20 20 20 20  ock.  It is.    
f440: 2a 2a 20 61 73 73 75 6d 65 64 20 74 68 61 74 20  ** assumed that 
f450: 74 68 65 72 65 20 69 73 20 61 20 53 48 41 52 45  there is a SHARE
f460: 44 20 6f 72 20 67 72 65 61 74 65 72 20 6c 6f 63  D or greater loc
f470: 6b 20 6f 6e 20 74 68 65 20 66 69 6c 65 0a 20 20  k on the file.  
f480: 20 20 2a 2a 20 61 6c 72 65 61 64 79 2e 0a 20 20    ** already..  
f490: 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28    */.    assert(
f4a0: 20 30 21 3d 70 46 69 6c 65 2d 3e 65 46 69 6c 65   0!=pFile->eFile
f4b0: 4c 6f 63 6b 20 29 3b 0a 20 20 20 20 6c 6f 63 6b  Lock );.    lock
f4c0: 2e 6c 5f 74 79 70 65 20 3d 20 46 5f 57 52 4c 43  .l_type = F_WRLC
f4d0: 4b 3b 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20  K;..    assert( 
f4e0: 65 46 69 6c 65 4c 6f 63 6b 3d 3d 52 45 53 45 52  eFileLock==RESER
f4f0: 56 45 44 5f 4c 4f 43 4b 20 7c 7c 20 65 46 69 6c  VED_LOCK || eFil
f500: 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45  eLock==EXCLUSIVE
f510: 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 69 66 28  _LOCK );.    if(
f520: 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 52 45 53 45   eFileLock==RESE
f530: 52 56 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20  RVED_LOCK ){.   
f540: 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20     lock.l_start 
f550: 3d 20 52 45 53 45 52 56 45 44 5f 42 59 54 45 3b  = RESERVED_BYTE;
f560: 0a 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 6c 65  .      lock.l_le
f570: 6e 20 3d 20 31 4c 3b 0a 20 20 20 20 7d 65 6c 73  n = 1L;.    }els
f580: 65 7b 0a 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f  e{.      lock.l_
f590: 73 74 61 72 74 20 3d 20 53 48 41 52 45 44 5f 46  start = SHARED_F
f5a0: 49 52 53 54 3b 0a 20 20 20 20 20 20 6c 6f 63 6b  IRST;.      lock
f5b0: 2e 6c 5f 6c 65 6e 20 3d 20 53 48 41 52 45 44 5f  .l_len = SHARED_
f5c0: 53 49 5a 45 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  SIZE;.    }..   
f5d0: 20 69 66 28 20 75 6e 69 78 46 69 6c 65 4c 6f 63   if( unixFileLoc
f5e0: 6b 28 70 46 69 6c 65 2c 20 26 6c 6f 63 6b 29 20  k(pFile, &lock) 
f5f0: 29 7b 0a 20 20 20 20 20 20 74 45 72 72 6e 6f 20  ){.      tErrno 
f600: 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20 72  = errno;.      r
f610: 63 20 3d 20 73 71 6c 69 74 65 45 72 72 6f 72 46  c = sqliteErrorF
f620: 72 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28 74 45  romPosixError(tE
f630: 72 72 6e 6f 2c 20 53 51 4c 49 54 45 5f 49 4f 45  rrno, SQLITE_IOE
f640: 52 52 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20  RR_LOCK);.      
f650: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 42  if( rc!=SQLITE_B
f660: 55 53 59 20 29 7b 0a 20 20 20 20 20 20 20 20 70  USY ){.        p
f670: 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20  File->lastErrno 
f680: 3d 20 74 45 72 72 6e 6f 3b 0a 20 20 20 20 20 20  = tErrno;.      
f690: 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 0a 0a  }.    }.  }.  ..
f6a0: 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 20  #ifndef NDEBUG. 
f6b0: 20 2f 2a 20 53 65 74 20 75 70 20 74 68 65 20 74   /* Set up the t
f6c0: 72 61 6e 73 61 63 74 69 6f 6e 2d 63 6f 75 6e 74  ransaction-count
f6d0: 65 72 20 63 68 61 6e 67 65 20 63 68 65 63 6b 69  er change checki
f6e0: 6e 67 20 66 6c 61 67 73 20 77 68 65 6e 0a 20 20  ng flags when.  
f6f0: 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e 69 6e 67  ** transitioning
f700: 20 66 72 6f 6d 20 61 20 53 48 41 52 45 44 20 74   from a SHARED t
f710: 6f 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63  o a RESERVED loc
f720: 6b 2e 20 20 54 68 65 20 63 68 61 6e 67 65 0a 20  k.  The change. 
f730: 20 2a 2a 20 66 72 6f 6d 20 53 48 41 52 45 44 20   ** from SHARED 
f740: 74 6f 20 52 45 53 45 52 56 45 44 20 6d 61 72 6b  to RESERVED mark
f750: 73 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20  s the beginning 
f760: 6f 66 20 61 20 6e 6f 72 6d 61 6c 0a 20 20 2a 2a  of a normal.  **
f770: 20 77 72 69 74 65 20 6f 70 65 72 61 74 69 6f 6e   write operation
f780: 20 28 6e 6f 74 20 61 20 68 6f 74 20 6a 6f 75 72   (not a hot jour
f790: 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 29 2e 0a 20  nal rollback).. 
f7a0: 20 2a 2f 0a 20 20 69 66 28 20 72 63 3d 3d 53 51   */.  if( rc==SQ
f7b0: 4c 49 54 45 5f 4f 4b 0a 20 20 20 26 26 20 70 46  LITE_OK.   && pF
f7c0: 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3c 3d  ile->eFileLock<=
f7d0: 53 48 41 52 45 44 5f 4c 4f 43 4b 0a 20 20 20 26  SHARED_LOCK.   &
f7e0: 26 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 52 45 53  & eFileLock==RES
f7f0: 45 52 56 45 44 5f 4c 4f 43 4b 0a 20 20 29 7b 0a  ERVED_LOCK.  ){.
f800: 20 20 20 20 70 46 69 6c 65 2d 3e 74 72 61 6e 73      pFile->trans
f810: 43 6e 74 72 43 68 6e 67 20 3d 20 30 3b 0a 20 20  CntrChng = 0;.  
f820: 20 20 70 46 69 6c 65 2d 3e 64 62 55 70 64 61 74    pFile->dbUpdat
f830: 65 20 3d 20 30 3b 0a 20 20 20 20 70 46 69 6c 65  e = 0;.    pFile
f840: 2d 3e 69 6e 4e 6f 72 6d 61 6c 57 72 69 74 65 20  ->inNormalWrite 
f850: 3d 20 31 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  = 1;.  }.#endif.
f860: 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ..  if( rc==SQLI
f870: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 46 69  TE_OK ){.    pFi
f880: 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20  le->eFileLock = 
f890: 65 46 69 6c 65 4c 6f 63 6b 3b 0a 20 20 20 20 70  eFileLock;.    p
f8a0: 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  Inode->eFileLock
f8b0: 20 3d 20 65 46 69 6c 65 4c 6f 63 6b 3b 0a 20 20   = eFileLock;.  
f8c0: 7d 65 6c 73 65 20 69 66 28 20 65 46 69 6c 65 4c  }else if( eFileL
f8d0: 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c  ock==EXCLUSIVE_L
f8e0: 4f 43 4b 20 29 7b 0a 20 20 20 20 70 46 69 6c 65  OCK ){.    pFile
f8f0: 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 50 45  ->eFileLock = PE
f900: 4e 44 49 4e 47 5f 4c 4f 43 4b 3b 0a 20 20 20 20  NDING_LOCK;.    
f910: 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63  pInode->eFileLoc
f920: 6b 20 3d 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b  k = PENDING_LOCK
f930: 3b 0a 20 20 7d 0a 0a 65 6e 64 5f 6c 6f 63 6b 3a  ;.  }..end_lock:
f940: 0a 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65  .  unixLeaveMute
f950: 78 28 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28  x();.  OSTRACE((
f960: 22 4c 4f 43 4b 20 20 20 20 25 64 20 25 73 20 25  "LOCK    %d %s %
f970: 73 20 28 75 6e 69 78 29 5c 6e 22 2c 20 70 46 69  s (unix)\n", pFi
f980: 6c 65 2d 3e 68 2c 20 61 7a 46 69 6c 65 4c 6f 63  le->h, azFileLoc
f990: 6b 28 65 46 69 6c 65 4c 6f 63 6b 29 2c 20 0a 20  k(eFileLock), . 
f9a0: 20 20 20 20 20 72 63 3d 3d 53 51 4c 49 54 45 5f       rc==SQLITE_
f9b0: 4f 4b 20 3f 20 22 6f 6b 22 20 3a 20 22 66 61 69  OK ? "ok" : "fai
f9c0: 6c 65 64 22 29 29 3b 0a 20 20 72 65 74 75 72 6e  led"));.  return
f9d0: 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64   rc;.}../*.** Ad
f9e0: 64 20 74 68 65 20 66 69 6c 65 20 64 65 73 63 72  d the file descr
f9f0: 69 70 74 6f 72 20 75 73 65 64 20 62 79 20 66 69  iptor used by fi
fa00: 6c 65 20 68 61 6e 64 6c 65 20 70 46 69 6c 65 20  le handle pFile 
fa10: 74 6f 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e  to the correspon
fa20: 64 69 6e 67 0a 2a 2a 20 70 55 6e 75 73 65 64 20  ding.** pUnused 
fa30: 6c 69 73 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  list..*/.static 
fa40: 76 6f 69 64 20 73 65 74 50 65 6e 64 69 6e 67 46  void setPendingF
fa50: 64 28 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c  d(unixFile *pFil
fa60: 65 29 7b 0a 20 20 75 6e 69 78 49 6e 6f 64 65 49  e){.  unixInodeI
fa70: 6e 66 6f 20 2a 70 49 6e 6f 64 65 20 3d 20 70 46  nfo *pInode = pF
fa80: 69 6c 65 2d 3e 70 49 6e 6f 64 65 3b 0a 20 20 55  ile->pInode;.  U
fa90: 6e 69 78 55 6e 75 73 65 64 46 64 20 2a 70 20 3d  nixUnusedFd *p =
faa0: 20 70 46 69 6c 65 2d 3e 70 55 6e 75 73 65 64 3b   pFile->pUnused;
fab0: 0a 20 20 70 2d 3e 70 4e 65 78 74 20 3d 20 70 49  .  p->pNext = pI
fac0: 6e 6f 64 65 2d 3e 70 55 6e 75 73 65 64 3b 0a 20  node->pUnused;. 
fad0: 20 70 49 6e 6f 64 65 2d 3e 70 55 6e 75 73 65 64   pInode->pUnused
fae0: 20 3d 20 70 3b 0a 20 20 70 46 69 6c 65 2d 3e 68   = p;.  pFile->h
faf0: 20 3d 20 2d 31 3b 0a 20 20 70 46 69 6c 65 2d 3e   = -1;.  pFile->
fb00: 70 55 6e 75 73 65 64 20 3d 20 30 3b 0a 7d 0a 0a  pUnused = 0;.}..
fb10: 2f 2a 0a 2a 2a 20 4c 6f 77 65 72 20 74 68 65 20  /*.** Lower the 
fb20: 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 6e  locking level on
fb30: 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
fb40: 20 70 46 69 6c 65 20 74 6f 20 65 46 69 6c 65 4c   pFile to eFileL
fb50: 6f 63 6b 2e 20 20 65 46 69 6c 65 4c 6f 63 6b 0a  ock.  eFileLock.
fb60: 2a 2a 20 6d 75 73 74 20 62 65 20 65 69 74 68 65  ** must be eithe
fb70: 72 20 4e 4f 5f 4c 4f 43 4b 20 6f 72 20 53 48 41  r NO_LOCK or SHA
fb80: 52 45 44 5f 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20  RED_LOCK..**.** 
fb90: 49 66 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c  If the locking l
fba0: 65 76 65 6c 20 6f 66 20 74 68 65 20 66 69 6c 65  evel of the file
fbb0: 20 64 65 73 63 72 69 70 74 6f 72 20 69 73 20 61   descriptor is a
fbc0: 6c 72 65 61 64 79 20 61 74 20 6f 72 20 62 65 6c  lready at or bel
fbd0: 6f 77 0a 2a 2a 20 74 68 65 20 72 65 71 75 65 73  ow.** the reques
fbe0: 74 65 64 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65  ted locking leve
fbf0: 6c 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  l, this routine 
fc00: 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 20 0a  is a no-op..** .
fc10: 2a 2a 20 49 66 20 68 61 6e 64 6c 65 4e 46 53 55  ** If handleNFSU
fc20: 6e 6c 6f 63 6b 20 69 73 20 74 72 75 65 2c 20 74  nlock is true, t
fc30: 68 65 6e 20 6f 6e 20 64 6f 77 6e 67 72 61 64 69  hen on downgradi
fc40: 6e 67 20 61 6e 20 45 58 43 4c 55 53 49 56 45 5f  ng an EXCLUSIVE_
fc50: 4c 4f 43 4b 20 74 6f 20 53 48 41 52 45 44 0a 2a  LOCK to SHARED.*
fc60: 2a 20 74 68 65 20 62 79 74 65 20 72 61 6e 67 65  * the byte range
fc70: 20 69 73 20 64 69 76 69 64 65 64 20 69 6e 74 6f   is divided into
fc80: 20 32 20 70 61 72 74 73 20 61 6e 64 20 74 68 65   2 parts and the
fc90: 20 66 69 72 73 74 20 70 61 72 74 20 69 73 20 75   first part is u
fca0: 6e 6c 6f 63 6b 65 64 20 74 68 65 6e 0a 2a 2a 20  nlocked then.** 
fcb0: 73 65 74 20 74 6f 20 61 20 72 65 61 64 20 6c 6f  set to a read lo
fcc0: 63 6b 2c 20 74 68 65 6e 20 74 68 65 20 6f 74 68  ck, then the oth
fcd0: 65 72 20 70 61 72 74 20 69 73 20 73 69 6d 70 6c  er part is simpl
fce0: 79 20 75 6e 6c 6f 63 6b 65 64 2e 20 20 54 68 69  y unlocked.  Thi
fcf0: 73 20 77 6f 72 6b 73 20 0a 2a 2a 20 61 72 6f 75  s works .** arou
fd00: 6e 64 20 61 20 62 75 67 20 69 6e 20 42 53 44 20  nd a bug in BSD 
fd10: 4e 46 53 20 6c 6f 63 6b 64 20 28 61 6c 73 6f 20  NFS lockd (also 
fd20: 73 65 65 6e 20 6f 6e 20 4d 61 63 4f 53 58 20 31  seen on MacOSX 1
fd30: 30 2e 33 2b 29 20 74 68 61 74 20 66 61 69 6c 73  0.3+) that fails
fd40: 20 74 6f 20 0a 2a 2a 20 72 65 6d 6f 76 65 20 74   to .** remove t
fd50: 68 65 20 77 72 69 74 65 20 6c 6f 63 6b 20 6f 6e  he write lock on
fd60: 20 61 20 72 65 67 69 6f 6e 20 77 68 65 6e 20 61   a region when a
fd70: 20 72 65 61 64 20 6c 6f 63 6b 20 69 73 20 73 65   read lock is se
fd80: 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  t..*/.static int
fd90: 20 70 6f 73 69 78 55 6e 6c 6f 63 6b 28 73 71 6c   posixUnlock(sql
fda0: 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69  ite3_file *id, i
fdb0: 6e 74 20 65 46 69 6c 65 4c 6f 63 6b 2c 20 69 6e  nt eFileLock, in
fdc0: 74 20 68 61 6e 64 6c 65 4e 46 53 55 6e 6c 6f 63  t handleNFSUnloc
fdd0: 6b 29 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a  k){.  unixFile *
fde0: 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c  pFile = (unixFil
fdf0: 65 2a 29 69 64 3b 0a 20 20 75 6e 69 78 49 6e 6f  e*)id;.  unixIno
fe00: 64 65 49 6e 66 6f 20 2a 70 49 6e 6f 64 65 3b 0a  deInfo *pInode;.
fe10: 20 20 73 74 72 75 63 74 20 66 6c 6f 63 6b 20 6c    struct flock l
fe20: 6f 63 6b 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20  ock;.  int rc = 
fe30: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74  SQLITE_OK;.  int
fe40: 20 68 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70   h;..  assert( p
fe50: 46 69 6c 65 20 29 3b 0a 20 20 4f 53 54 52 41 43  File );.  OSTRAC
fe60: 45 28 28 22 55 4e 4c 4f 43 4b 20 20 25 64 20 25  E(("UNLOCK  %d %
fe70: 64 20 77 61 73 20 25 64 28 25 64 2c 25 64 29 20  d was %d(%d,%d) 
fe80: 70 69 64 3d 25 64 20 28 75 6e 69 78 29 5c 6e 22  pid=%d (unix)\n"
fe90: 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 65 46 69 6c  , pFile->h, eFil
fea0: 65 4c 6f 63 6b 2c 0a 20 20 20 20 20 20 70 46 69  eLock,.      pFi
feb0: 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 2c 20 70  le->eFileLock, p
fec0: 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e 65 46  File->pInode->eF
fed0: 69 6c 65 4c 6f 63 6b 2c 20 70 46 69 6c 65 2d 3e  ileLock, pFile->
fee0: 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64 2c  pInode->nShared,
fef0: 0a 20 20 20 20 20 20 67 65 74 70 69 64 28 29 29  .      getpid())
ff00: 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 65 46  );..  assert( eF
ff10: 69 6c 65 4c 6f 63 6b 3c 3d 53 48 41 52 45 44 5f  ileLock<=SHARED_
ff20: 4c 4f 43 4b 20 29 3b 0a 20 20 69 66 28 20 70 46  LOCK );.  if( pF
ff30: 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3c 3d  ile->eFileLock<=
ff40: 65 46 69 6c 65 4c 6f 63 6b 20 29 7b 0a 20 20 20  eFileLock ){.   
ff50: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
ff60: 4b 3b 0a 20 20 7d 0a 20 20 75 6e 69 78 45 6e 74  K;.  }.  unixEnt
ff70: 65 72 4d 75 74 65 78 28 29 3b 0a 20 20 68 20 3d  erMutex();.  h =
ff80: 20 70 46 69 6c 65 2d 3e 68 3b 0a 20 20 70 49 6e   pFile->h;.  pIn
ff90: 6f 64 65 20 3d 20 70 46 69 6c 65 2d 3e 70 49 6e  ode = pFile->pIn
ffa0: 6f 64 65 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ode;.  assert( p
ffb0: 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64 21 3d  Inode->nShared!=
ffc0: 30 20 29 3b 0a 20 20 69 66 28 20 70 46 69 6c 65  0 );.  if( pFile
ffd0: 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3e 53 48 41 52  ->eFileLock>SHAR
ffe0: 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 61  ED_LOCK ){.    a
fff0: 73 73 65 72 74 28 20 70 49 6e 6f 64 65 2d 3e 65  ssert( pInode->e
10000 46 69 6c 65 4c 6f 63 6b 3d 3d 70 46 69 6c 65 2d  FileLock==pFile-
10010 3e 65 46 69 6c 65 4c 6f 63 6b 20 29 3b 0a 20 20  >eFileLock );.  
10020 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f    SimulateIOErro
10030 72 42 65 6e 69 67 6e 28 31 29 3b 0a 20 20 20 20  rBenign(1);.    
10040 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28  SimulateIOError(
10050 20 68 3d 28 2d 31 29 20 29 0a 20 20 20 20 53 69   h=(-1) ).    Si
10060 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 42 65 6e  mulateIOErrorBen
10070 69 67 6e 28 30 29 3b 0a 0a 23 69 66 6e 64 65 66  ign(0);..#ifndef
10080 20 4e 44 45 42 55 47 0a 20 20 20 20 2f 2a 20 57   NDEBUG.    /* W
10090 68 65 6e 20 72 65 64 75 63 69 6e 67 20 61 20 6c  hen reducing a l
100a0 6f 63 6b 20 73 75 63 68 20 74 68 61 74 20 6f 74  ock such that ot
100b0 68 65 72 20 70 72 6f 63 65 73 73 65 73 20 63 61  her processes ca
100c0 6e 20 73 74 61 72 74 0a 20 20 20 20 2a 2a 20 72  n start.    ** r
100d0 65 61 64 69 6e 67 20 74 68 65 20 64 61 74 61 62  eading the datab
100e0 61 73 65 20 66 69 6c 65 20 61 67 61 69 6e 2c 20  ase file again, 
100f0 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74 20 74  make sure that t
10100 68 65 0a 20 20 20 20 2a 2a 20 74 72 61 6e 73 61  he.    ** transa
10110 63 74 69 6f 6e 20 63 6f 75 6e 74 65 72 20 77 61  ction counter wa
10120 73 20 75 70 64 61 74 65 64 20 69 66 20 61 6e 79  s updated if any
10130 20 70 61 72 74 20 6f 66 20 74 68 65 20 64 61 74   part of the dat
10140 61 62 61 73 65 0a 20 20 20 20 2a 2a 20 66 69 6c  abase.    ** fil
10150 65 20 63 68 61 6e 67 65 64 2e 20 20 49 66 20 74  e changed.  If t
10160 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63  he transaction c
10170 6f 75 6e 74 65 72 20 69 73 20 6e 6f 74 20 75 70  ounter is not up
10180 64 61 74 65 64 2c 0a 20 20 20 20 2a 2a 20 6f 74  dated,.    ** ot
10190 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20  her connections 
101a0 74 6f 20 74 68 65 20 73 61 6d 65 20 66 69 6c 65  to the same file
101b0 20 6d 69 67 68 74 20 6e 6f 74 20 72 65 61 6c 69   might not reali
101c0 7a 65 20 74 68 61 74 0a 20 20 20 20 2a 2a 20 74  ze that.    ** t
101d0 68 65 20 66 69 6c 65 20 68 61 73 20 63 68 61 6e  he file has chan
101e0 67 65 64 20 61 6e 64 20 68 65 6e 63 65 20 6d 69  ged and hence mi
101f0 67 68 74 20 6e 6f 74 20 6b 6e 6f 77 20 74 6f 20  ght not know to 
10200 66 6c 75 73 68 20 74 68 65 69 72 0a 20 20 20 20  flush their.    
10210 2a 2a 20 63 61 63 68 65 2e 20 20 54 68 65 20 75  ** cache.  The u
10220 73 65 20 6f 66 20 61 20 73 74 61 6c 65 20 63 61  se of a stale ca
10230 63 68 65 20 63 61 6e 20 6c 65 61 64 20 74 6f 20  che can lead to 
10240 64 61 74 61 62 61 73 65 20 63 6f 72 72 75 70 74  database corrupt
10250 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 23 69 66 20  ion..    */.#if 
10260 30 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 46  0.    assert( pF
10270 69 6c 65 2d 3e 69 6e 4e 6f 72 6d 61 6c 57 72 69  ile->inNormalWri
10280 74 65 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 7c  te==0.         |
10290 7c 20 70 46 69 6c 65 2d 3e 64 62 55 70 64 61 74  | pFile->dbUpdat
102a0 65 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 7c 7c  e==0.         ||
102b0 20 70 46 69 6c 65 2d 3e 74 72 61 6e 73 43 6e 74   pFile->transCnt
102c0 72 43 68 6e 67 3d 3d 31 20 29 3b 0a 23 65 6e 64  rChng==1 );.#end
102d0 69 66 0a 20 20 20 20 70 46 69 6c 65 2d 3e 69 6e  if.    pFile->in
102e0 4e 6f 72 6d 61 6c 57 72 69 74 65 20 3d 20 30 3b  NormalWrite = 0;
102f0 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20  .#endif..    /* 
10300 64 6f 77 6e 67 72 61 64 69 6e 67 20 74 6f 20 61  downgrading to a
10310 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 6f 6e 20   shared lock on 
10320 4e 46 53 20 69 6e 76 6f 6c 76 65 73 20 63 6c 65  NFS involves cle
10330 61 72 69 6e 67 20 74 68 65 20 77 72 69 74 65 20  aring the write 
10340 6c 6f 63 6b 0a 20 20 20 20 2a 2a 20 62 65 66 6f  lock.    ** befo
10350 72 65 20 65 73 74 61 62 6c 69 73 68 69 6e 67 20  re establishing 
10360 74 68 65 20 72 65 61 64 6c 6f 63 6b 20 2d 20 74  the readlock - t
10370 6f 20 61 76 6f 69 64 20 61 20 72 61 63 65 20 63  o avoid a race c
10380 6f 6e 64 69 74 69 6f 6e 20 77 65 20 64 6f 77 6e  ondition we down
10390 67 72 61 64 65 0a 20 20 20 20 2a 2a 20 74 68 65  grade.    ** the
103a0 20 6c 6f 63 6b 20 69 6e 20 32 20 62 6c 6f 63 6b   lock in 2 block
103b0 73 2c 20 73 6f 20 74 68 61 74 20 70 61 72 74 20  s, so that part 
103c0 6f 66 20 74 68 65 20 72 61 6e 67 65 20 77 69 6c  of the range wil
103d0 6c 20 62 65 20 63 6f 76 65 72 65 64 20 62 79 20  l be covered by 
103e0 61 20 0a 20 20 20 20 2a 2a 20 77 72 69 74 65 20  a .    ** write 
103f0 6c 6f 63 6b 20 75 6e 74 69 6c 20 74 68 65 20 72  lock until the r
10400 65 73 74 20 69 73 20 63 6f 76 65 72 65 64 20 62  est is covered b
10410 79 20 61 20 72 65 61 64 20 6c 6f 63 6b 3a 0a 20  y a read lock:. 
10420 20 20 20 2a 2a 20 20 31 3a 20 20 20 5b 57 57 57     **  1:   [WWW
10430 57 57 5d 0a 20 20 20 20 2a 2a 20 20 32 3a 20 20  WW].    **  2:  
10440 20 5b 2e 2e 2e 2e 57 5d 0a 20 20 20 20 2a 2a 20   [....W].    ** 
10450 20 33 3a 20 20 20 5b 52 52 52 52 57 5d 0a 20 20   3:   [RRRRW].  
10460 20 20 2a 2a 20 20 34 3a 20 20 20 5b 52 52 52 52    **  4:   [RRRR
10470 2e 5d 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  .].    */.    if
10480 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41  ( eFileLock==SHA
10490 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 0a 23 69 66  RED_LOCK ){..#if
104a0 20 21 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c   !defined(__APPL
104b0 45 5f 5f 29 20 7c 7c 20 21 53 51 4c 49 54 45 5f  E__) || !SQLITE_
104c0 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53  ENABLE_LOCKING_S
104d0 54 59 4c 45 0a 20 20 20 20 20 20 28 76 6f 69 64  TYLE.      (void
104e0 29 68 61 6e 64 6c 65 4e 46 53 55 6e 6c 6f 63 6b  )handleNFSUnlock
104f0 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
10500 68 61 6e 64 6c 65 4e 46 53 55 6e 6c 6f 63 6b 3d  handleNFSUnlock=
10510 3d 30 20 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66  =0 );.#endif.#if
10520 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45   defined(__APPLE
10530 5f 5f 29 20 26 26 20 53 51 4c 49 54 45 5f 45 4e  __) && SQLITE_EN
10540 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59  ABLE_LOCKING_STY
10550 4c 45 0a 20 20 20 20 20 20 69 66 28 20 68 61 6e  LE.      if( han
10560 64 6c 65 4e 46 53 55 6e 6c 6f 63 6b 20 29 7b 0a  dleNFSUnlock ){.
10570 20 20 20 20 20 20 20 20 69 6e 74 20 74 45 72 72          int tErr
10580 6e 6f 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  no;             
10590 20 20 2f 2a 20 45 72 72 6f 72 20 63 6f 64 65 20    /* Error code 
105a0 66 72 6f 6d 20 73 79 73 74 65 6d 20 63 61 6c 6c  from system call
105b0 20 65 72 72 6f 72 73 20 2a 2f 0a 20 20 20 20 20   errors */.     
105c0 20 20 20 6f 66 66 5f 74 20 64 69 76 53 69 7a 65     off_t divSize
105d0 20 3d 20 53 48 41 52 45 44 5f 53 49 5a 45 20 2d   = SHARED_SIZE -
105e0 20 31 3b 0a 20 20 20 20 20 20 20 20 0a 20 20 20   1;.        .   
105f0 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65       lock.l_type
10600 20 3d 20 46 5f 55 4e 4c 43 4b 3b 0a 20 20 20 20   = F_UNLCK;.    
10610 20 20 20 20 6c 6f 63 6b 2e 6c 5f 77 68 65 6e 63      lock.l_whenc
10620 65 20 3d 20 53 45 45 4b 5f 53 45 54 3b 0a 20 20  e = SEEK_SET;.  
10630 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61        lock.l_sta
10640 72 74 20 3d 20 53 48 41 52 45 44 5f 46 49 52 53  rt = SHARED_FIRS
10650 54 3b 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e  T;.        lock.
10660 6c 5f 6c 65 6e 20 3d 20 64 69 76 53 69 7a 65 3b  l_len = divSize;
10670 0a 20 20 20 20 20 20 20 20 69 66 28 20 75 6e 69  .        if( uni
10680 78 46 69 6c 65 4c 6f 63 6b 28 70 46 69 6c 65 2c  xFileLock(pFile,
10690 20 26 6c 6f 63 6b 29 3d 3d 28 2d 31 29 20 29 7b   &lock)==(-1) ){
106a0 0a 20 20 20 20 20 20 20 20 20 20 74 45 72 72 6e  .          tErrn
106b0 6f 20 3d 20 65 72 72 6e 6f 3b 0a 23 69 66 20 4f  o = errno;.#if O
106c0 53 4c 4f 43 4b 49 4e 47 5f 43 48 45 43 4b 5f 42  SLOCKING_CHECK_B
106d0 55 53 59 5f 49 4f 45 52 52 0a 20 20 20 20 20 20  USY_IOERR.      
106e0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 45      rc = sqliteE
106f0 72 72 6f 72 46 72 6f 6d 50 6f 73 69 78 45 72 72  rrorFromPosixErr
10700 6f 72 28 74 45 72 72 6e 6f 2c 20 53 51 4c 49 54  or(tErrno, SQLIT
10710 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 29 3b  E_IOERR_UNLOCK);
10720 0a 23 65 6c 73 65 0a 20 20 20 20 20 20 20 20 20  .#else.         
10730 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45   rc = SQLITE_IOE
10740 52 52 5f 55 4e 4c 4f 43 4b 3b 0a 23 65 6e 64 69  RR_UNLOCK;.#endi
10750 66 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  f.          if( 
10760 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 72 63  IS_LOCK_ERROR(rc
10770 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ) ){.           
10780 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e   pFile->lastErrn
10790 6f 20 3d 20 74 45 72 72 6e 6f 3b 0a 20 20 20 20  o = tErrno;.    
107a0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
107b0 20 20 67 6f 74 6f 20 65 6e 64 5f 75 6e 6c 6f 63    goto end_unloc
107c0 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  k;.        }.   
107d0 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65       lock.l_type
107e0 20 3d 20 46 5f 52 44 4c 43 4b 3b 0a 20 20 20 20   = F_RDLCK;.    
107f0 20 20 20 20 6c 6f 63 6b 2e 6c 5f 77 68 65 6e 63      lock.l_whenc
10800 65 20 3d 20 53 45 45 4b 5f 53 45 54 3b 0a 20 20  e = SEEK_SET;.  
10810 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61        lock.l_sta
10820 72 74 20 3d 20 53 48 41 52 45 44 5f 46 49 52 53  rt = SHARED_FIRS
10830 54 3b 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e  T;.        lock.
10840 6c 5f 6c 65 6e 20 3d 20 64 69 76 53 69 7a 65 3b  l_len = divSize;
10850 0a 20 20 20 20 20 20 20 20 69 66 28 20 75 6e 69  .        if( uni
10860 78 46 69 6c 65 4c 6f 63 6b 28 70 46 69 6c 65 2c  xFileLock(pFile,
10870 20 26 6c 6f 63 6b 29 3d 3d 28 2d 31 29 20 29 7b   &lock)==(-1) ){
10880 0a 20 20 20 20 20 20 20 20 20 20 74 45 72 72 6e  .          tErrn
10890 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20  o = errno;.     
108a0 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
108b0 45 72 72 6f 72 46 72 6f 6d 50 6f 73 69 78 45 72  ErrorFromPosixEr
108c0 72 6f 72 28 74 45 72 72 6e 6f 2c 20 53 51 4c 49  ror(tErrno, SQLI
108d0 54 45 5f 49 4f 45 52 52 5f 52 44 4c 4f 43 4b 29  TE_IOERR_RDLOCK)
108e0 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
108f0 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 72 63  IS_LOCK_ERROR(rc
10900 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ) ){.           
10910 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e   pFile->lastErrn
10920 6f 20 3d 20 74 45 72 72 6e 6f 3b 0a 20 20 20 20  o = tErrno;.    
10930 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
10940 20 20 67 6f 74 6f 20 65 6e 64 5f 75 6e 6c 6f 63    goto end_unloc
10950 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  k;.        }.   
10960 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65       lock.l_type
10970 20 3d 20 46 5f 55 4e 4c 43 4b 3b 0a 20 20 20 20   = F_UNLCK;.    
10980 20 20 20 20 6c 6f 63 6b 2e 6c 5f 77 68 65 6e 63      lock.l_whenc
10990 65 20 3d 20 53 45 45 4b 5f 53 45 54 3b 0a 20 20  e = SEEK_SET;.  
109a0 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61        lock.l_sta
109b0 72 74 20 3d 20 53 48 41 52 45 44 5f 46 49 52 53  rt = SHARED_FIRS
109c0 54 2b 64 69 76 53 69 7a 65 3b 0a 20 20 20 20 20  T+divSize;.     
109d0 20 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20     lock.l_len = 
109e0 53 48 41 52 45 44 5f 53 49 5a 45 2d 64 69 76 53  SHARED_SIZE-divS
109f0 69 7a 65 3b 0a 20 20 20 20 20 20 20 20 69 66 28  ize;.        if(
10a00 20 75 6e 69 78 46 69 6c 65 4c 6f 63 6b 28 70 46   unixFileLock(pF
10a10 69 6c 65 2c 20 26 6c 6f 63 6b 29 3d 3d 28 2d 31  ile, &lock)==(-1
10a20 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 74  ) ){.          t
10a30 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 23  Errno = errno;.#
10a40 69 66 20 4f 53 4c 4f 43 4b 49 4e 47 5f 43 48 45  if OSLOCKING_CHE
10a50 43 4b 5f 42 55 53 59 5f 49 4f 45 52 52 0a 20 20  CK_BUSY_IOERR.  
10a60 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
10a70 69 74 65 45 72 72 6f 72 46 72 6f 6d 50 6f 73 69  iteErrorFromPosi
10a80 78 45 72 72 6f 72 28 74 45 72 72 6e 6f 2c 20 53  xError(tErrno, S
10a90 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f  QLITE_IOERR_UNLO
10aa0 43 4b 29 3b 0a 23 65 6c 73 65 0a 20 20 20 20 20  CK);.#else.     
10ab0 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
10ac0 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 3b 0a 23  _IOERR_UNLOCK;.#
10ad0 65 6e 64 69 66 0a 20 20 20 20 20 20 20 20 20 20  endif.          
10ae0 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f  if( IS_LOCK_ERRO
10af0 52 28 72 63 29 20 29 7b 0a 20 20 20 20 20 20 20  R(rc) ){.       
10b00 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74       pFile->last
10b10 45 72 72 6e 6f 20 3d 20 74 45 72 72 6e 6f 3b 0a  Errno = tErrno;.
10b20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
10b30 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 75        goto end_u
10b40 6e 6c 6f 63 6b 3b 0a 20 20 20 20 20 20 20 20 7d  nlock;.        }
10b50 0a 20 20 20 20 20 20 7d 65 6c 73 65 0a 23 65 6e  .      }else.#en
10b60 64 69 66 20 2f 2a 20 64 65 66 69 6e 65 64 28 5f  dif /* defined(_
10b70 5f 41 50 50 4c 45 5f 5f 29 20 26 26 20 53 51 4c  _APPLE__) && SQL
10b80 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49  ITE_ENABLE_LOCKI
10b90 4e 47 5f 53 54 59 4c 45 20 2a 2f 0a 20 20 20 20  NG_STYLE */.    
10ba0 20 20 7b 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b    {.        lock
10bb0 2e 6c 5f 74 79 70 65 20 3d 20 46 5f 52 44 4c 43  .l_type = F_RDLC
10bc0 4b 3b 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e  K;.        lock.
10bd0 6c 5f 77 68 65 6e 63 65 20 3d 20 53 45 45 4b 5f  l_whence = SEEK_
10be0 53 45 54 3b 0a 20 20 20 20 20 20 20 20 6c 6f 63  SET;.        loc
10bf0 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 53 48 41 52  k.l_start = SHAR
10c00 45 44 5f 46 49 52 53 54 3b 0a 20 20 20 20 20 20  ED_FIRST;.      
10c10 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 53    lock.l_len = S
10c20 48 41 52 45 44 5f 53 49 5a 45 3b 0a 20 20 20 20  HARED_SIZE;.    
10c30 20 20 20 20 69 66 28 20 75 6e 69 78 46 69 6c 65      if( unixFile
10c40 4c 6f 63 6b 28 70 46 69 6c 65 2c 20 26 6c 6f 63  Lock(pFile, &loc
10c50 6b 29 20 29 7b 0a 23 69 66 20 4f 53 4c 4f 43 4b  k) ){.#if OSLOCK
10c60 49 4e 47 5f 43 48 45 43 4b 5f 42 55 53 59 5f 49  ING_CHECK_BUSY_I
10c70 4f 45 52 52 0a 20 20 20 20 20 20 20 20 20 20 74  OERR.          t
10c80 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20  Errno = errno;. 
10c90 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71           rc = sq
10ca0 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d 50 6f 73  liteErrorFromPos
10cb0 69 78 45 72 72 6f 72 28 74 45 72 72 6e 6f 2c 20  ixError(tErrno, 
10cc0 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 52 44 4c  SQLITE_IOERR_RDL
10cd0 4f 43 4b 29 3b 0a 20 20 20 20 20 20 20 20 20 20  OCK);.          
10ce0 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f  if( IS_LOCK_ERRO
10cf0 52 28 72 63 29 20 29 7b 0a 20 20 20 20 20 20 20  R(rc) ){.       
10d00 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74       pFile->last
10d10 45 72 72 6e 6f 20 3d 20 74 45 72 72 6e 6f 3b 0a  Errno = tErrno;.
10d20 20 20 20 20 20 20 20 20 20 20 7d 0a 23 65 6c 73            }.#els
10d30 65 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49  e.          /* I
10d40 6e 20 74 68 65 6f 72 79 2c 20 74 68 65 20 63 61  n theory, the ca
10d50 6c 6c 20 74 6f 20 75 6e 69 78 46 69 6c 65 4c 6f  ll to unixFileLo
10d60 63 6b 28 29 20 63 61 6e 6e 6f 74 20 66 61 69 6c  ck() cannot fail
10d70 20 62 65 63 61 75 73 65 20 61 6e 6f 74 68 65 72   because another
10d80 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 70 72  .          ** pr
10d90 6f 63 65 73 73 20 69 73 20 68 6f 6c 64 69 6e 67  ocess is holding
10da0 20 61 6e 20 69 6e 63 6f 6d 70 61 74 69 62 6c 65   an incompatible
10db0 20 6c 6f 63 6b 2e 20 49 66 20 69 74 20 64 6f 65   lock. If it doe
10dc0 73 2c 20 74 68 69 73 20 0a 20 20 20 20 20 20 20  s, this .       
10dd0 20 20 20 2a 2a 20 69 6e 64 69 63 61 74 65 73 20     ** indicates 
10de0 74 68 61 74 20 74 68 65 20 6f 74 68 65 72 20 70  that the other p
10df0 72 6f 63 65 73 73 20 69 73 20 6e 6f 74 20 66 6f  rocess is not fo
10e00 6c 6c 6f 77 69 6e 67 20 74 68 65 20 6c 6f 63 6b  llowing the lock
10e10 69 6e 67 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  ing.          **
10e20 20 70 72 6f 74 6f 63 6f 6c 2e 20 49 66 20 74 68   protocol. If th
10e30 69 73 20 68 61 70 70 65 6e 73 2c 20 72 65 74 75  is happens, retu
10e40 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  rn SQLITE_IOERR_
10e50 52 44 4c 4f 43 4b 2e 20 52 65 74 75 72 6e 69 6e  RDLOCK. Returnin
10e60 67 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 53  g.          ** S
10e70 51 4c 49 54 45 5f 42 55 53 59 20 77 6f 75 6c 64  QLITE_BUSY would
10e80 20 63 6f 6e 66 75 73 65 20 74 68 65 20 75 70 70   confuse the upp
10e90 65 72 20 6c 61 79 65 72 20 28 69 6e 20 70 72 61  er layer (in pra
10ea0 63 74 69 63 65 20 69 74 20 63 61 75 73 65 73 20  ctice it causes 
10eb0 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 61 6e  .          ** an
10ec0 20 61 73 73 65 72 74 20 74 6f 20 66 61 69 6c 29   assert to fail)
10ed0 2e 20 2a 2f 20 0a 20 20 20 20 20 20 20 20 20 20  . */ .          
10ee0 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52  rc = SQLITE_IOER
10ef0 52 5f 52 44 4c 4f 43 4b 3b 0a 20 20 20 20 20 20  R_RDLOCK;.      
10f00 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45      pFile->lastE
10f10 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 23 65  rrno = errno;.#e
10f20 6e 64 69 66 0a 20 20 20 20 20 20 20 20 20 20 67  ndif.          g
10f30 6f 74 6f 20 65 6e 64 5f 75 6e 6c 6f 63 6b 3b 0a  oto end_unlock;.
10f40 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
10f50 7d 0a 20 20 20 20 7d 0a 20 20 20 20 6c 6f 63 6b  }.    }.    lock
10f60 2e 6c 5f 74 79 70 65 20 3d 20 46 5f 55 4e 4c 43  .l_type = F_UNLC
10f70 4b 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 77 68  K;.    lock.l_wh
10f80 65 6e 63 65 20 3d 20 53 45 45 4b 5f 53 45 54 3b  ence = SEEK_SET;
10f90 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72  .    lock.l_star
10fa0 74 20 3d 20 50 45 4e 44 49 4e 47 5f 42 59 54 45  t = PENDING_BYTE
10fb0 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e  ;.    lock.l_len
10fc0 20 3d 20 32 4c 3b 20 20 61 73 73 65 72 74 28 20   = 2L;  assert( 
10fd0 50 45 4e 44 49 4e 47 5f 42 59 54 45 2b 31 3d 3d  PENDING_BYTE+1==
10fe0 52 45 53 45 52 56 45 44 5f 42 59 54 45 20 29 3b  RESERVED_BYTE );
10ff0 0a 20 20 20 20 69 66 28 20 75 6e 69 78 46 69 6c  .    if( unixFil
11000 65 4c 6f 63 6b 28 70 46 69 6c 65 2c 20 26 6c 6f  eLock(pFile, &lo
11010 63 6b 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ck)==0 ){.      
11020 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63  pInode->eFileLoc
11030 6b 20 3d 20 53 48 41 52 45 44 5f 4c 4f 43 4b 3b  k = SHARED_LOCK;
11040 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 23 69 66 20  .    }else{.#if 
11050 4f 53 4c 4f 43 4b 49 4e 47 5f 43 48 45 43 4b 5f  OSLOCKING_CHECK_
11060 42 55 53 59 5f 49 4f 45 52 52 0a 20 20 20 20 20  BUSY_IOERR.     
11070 20 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b   tErrno = errno;
11080 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
11090 74 65 45 72 72 6f 72 46 72 6f 6d 50 6f 73 69 78  teErrorFromPosix
110a0 45 72 72 6f 72 28 74 45 72 72 6e 6f 2c 20 53 51  Error(tErrno, SQ
110b0 4c 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43  LITE_IOERR_UNLOC
110c0 4b 29 3b 0a 20 20 20 20 20 20 69 66 28 20 49 53  K);.      if( IS
110d0 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 72 63 29 20  _LOCK_ERROR(rc) 
110e0 29 7b 0a 20 20 20 20 20 20 20 20 70 46 69 6c 65  ){.        pFile
110f0 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 74 45  ->lastErrno = tE
11100 72 72 6e 6f 3b 0a 20 20 20 20 20 20 7d 0a 23 65  rrno;.      }.#e
11110 6c 73 65 0a 20 20 20 20 20 20 72 63 20 3d 20 53  lse.      rc = S
11120 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f  QLITE_IOERR_UNLO
11130 43 4b 3b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d  CK;.      pFile-
11140 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 65 72 72  >lastErrno = err
11150 6e 6f 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20  no;.#endif.     
11160 20 67 6f 74 6f 20 65 6e 64 5f 75 6e 6c 6f 63 6b   goto end_unlock
11170 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66  ;.    }.  }.  if
11180 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 4e 4f 5f  ( eFileLock==NO_
11190 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 2f 2a 20 44  LOCK ){.    /* D
111a0 65 63 72 65 6d 65 6e 74 20 74 68 65 20 73 68 61  ecrement the sha
111b0 72 65 64 20 6c 6f 63 6b 20 63 6f 75 6e 74 65 72  red lock counter
111c0 2e 20 20 52 65 6c 65 61 73 65 20 74 68 65 20 6c  .  Release the l
111d0 6f 63 6b 20 75 73 69 6e 67 20 61 6e 0a 20 20 20  ock using an.   
111e0 20 2a 2a 20 4f 53 20 63 61 6c 6c 20 6f 6e 6c 79   ** OS call only
111f0 20 77 68 65 6e 20 61 6c 6c 20 74 68 72 65 61 64   when all thread
11200 73 20 69 6e 20 74 68 69 73 20 73 61 6d 65 20 70  s in this same p
11210 72 6f 63 65 73 73 20 68 61 76 65 20 72 65 6c 65  rocess have rele
11220 61 73 65 64 0a 20 20 20 20 2a 2a 20 74 68 65 20  ased.    ** the 
11230 6c 6f 63 6b 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  lock..    */.   
11240 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64   pInode->nShared
11250 2d 2d 3b 0a 20 20 20 20 69 66 28 20 70 49 6e 6f  --;.    if( pIno
11260 64 65 2d 3e 6e 53 68 61 72 65 64 3d 3d 30 20 29  de->nShared==0 )
11270 7b 0a 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74  {.      lock.l_t
11280 79 70 65 20 3d 20 46 5f 55 4e 4c 43 4b 3b 0a 20  ype = F_UNLCK;. 
11290 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 77 68 65 6e       lock.l_when
112a0 63 65 20 3d 20 53 45 45 4b 5f 53 45 54 3b 0a 20  ce = SEEK_SET;. 
112b0 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72       lock.l_star
112c0 74 20 3d 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d  t = lock.l_len =
112d0 20 30 4c 3b 0a 20 20 20 20 20 20 53 69 6d 75 6c   0L;.      Simul
112e0 61 74 65 49 4f 45 72 72 6f 72 42 65 6e 69 67 6e  ateIOErrorBenign
112f0 28 31 29 3b 0a 20 20 20 20 20 20 53 69 6d 75 6c  (1);.      Simul
11300 61 74 65 49 4f 45 72 72 6f 72 28 20 68 3d 28 2d  ateIOError( h=(-
11310 31 29 20 29 0a 20 20 20 20 20 20 53 69 6d 75 6c  1) ).      Simul
11320 61 74 65 49 4f 45 72 72 6f 72 42 65 6e 69 67 6e  ateIOErrorBenign
11330 28 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 75  (0);.      if( u
11340 6e 69 78 46 69 6c 65 4c 6f 63 6b 28 70 46 69 6c  nixFileLock(pFil
11350 65 2c 20 26 6c 6f 63 6b 29 3d 3d 30 20 29 7b 0a  e, &lock)==0 ){.
11360 20 20 20 20 20 20 20 20 70 49 6e 6f 64 65 2d 3e          pInode->
11370 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 4e 4f 5f 4c  eFileLock = NO_L
11380 4f 43 4b 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  OCK;.      }else
11390 7b 0a 23 69 66 20 4f 53 4c 4f 43 4b 49 4e 47 5f  {.#if OSLOCKING_
113a0 43 48 45 43 4b 5f 42 55 53 59 5f 49 4f 45 52 52  CHECK_BUSY_IOERR
113b0 0a 20 20 20 20 20 20 20 20 74 45 72 72 6e 6f 20  .        tErrno 
113c0 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20 20  = errno;.       
113d0 20 72 63 20 3d 20 73 71 6c 69 74 65 45 72 72 6f   rc = sqliteErro
113e0 72 46 72 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28  rFromPosixError(
113f0 74 45 72 72 6e 6f 2c 20 53 51 4c 49 54 45 5f 49  tErrno, SQLITE_I
11400 4f 45 52 52 5f 55 4e 4c 4f 43 4b 29 3b 0a 20 20  OERR_UNLOCK);.  
11410 20 20 20 20 20 20 69 66 28 20 49 53 5f 4c 4f 43        if( IS_LOC
11420 4b 5f 45 52 52 4f 52 28 72 63 29 20 29 7b 0a 20  K_ERROR(rc) ){. 
11430 20 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e           pFile->
11440 6c 61 73 74 45 72 72 6e 6f 20 3d 20 74 45 72 72  lastErrno = tErr
11450 6e 6f 3b 0a 20 20 20 20 20 20 20 20 7d 0a 23 65  no;.        }.#e
11460 6c 73 65 0a 20 20 20 20 20 20 20 20 72 63 20 3d  lse.        rc =
11470 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55 4e   SQLITE_IOERR_UN
11480 4c 4f 43 4b 3b 0a 09 20 20 20 20 70 46 69 6c 65  LOCK;..    pFile
11490 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 65 72  ->lastErrno = er
114a0 72 6e 6f 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  rno;.#endif.    
114b0 20 20 20 20 70 49 6e 6f 64 65 2d 3e 65 46 69 6c      pInode->eFil
114c0 65 4c 6f 63 6b 20 3d 20 4e 4f 5f 4c 4f 43 4b 3b  eLock = NO_LOCK;
114d0 0a 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e  .        pFile->
114e0 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 4e 4f 5f 4c  eFileLock = NO_L
114f0 4f 43 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  OCK;.      }.   
11500 20 7d 0a 0a 20 20 20 20 2f 2a 20 44 65 63 72 65   }..    /* Decre
11510 6d 65 6e 74 20 74 68 65 20 63 6f 75 6e 74 20 6f  ment the count o
11520 66 20 6c 6f 63 6b 73 20 61 67 61 69 6e 73 74 20  f locks against 
11530 74 68 69 73 20 73 61 6d 65 20 66 69 6c 65 2e 20  this same file. 
11540 20 57 68 65 6e 20 74 68 65 0a 20 20 20 20 2a 2a   When the.    **
11550 20 63 6f 75 6e 74 20 72 65 61 63 68 65 73 20 7a   count reaches z
11560 65 72 6f 2c 20 63 6c 6f 73 65 20 61 6e 79 20 6f  ero, close any o
11570 74 68 65 72 20 66 69 6c 65 20 64 65 73 63 72 69  ther file descri
11580 70 74 6f 72 73 20 77 68 6f 73 65 20 63 6c 6f 73  ptors whose clos
11590 65 0a 20 20 20 20 2a 2a 20 77 61 73 20 64 65 66  e.    ** was def
115a0 65 72 72 65 64 20 62 65 63 61 75 73 65 20 6f 66  erred because of
115b0 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 6c 6f 63   outstanding loc
115c0 6b 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70  ks..    */.    p
115d0 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 2d 2d 3b 0a  Inode->nLock--;.
115e0 20 20 20 20 61 73 73 65 72 74 28 20 70 49 6e 6f      assert( pIno
115f0 64 65 2d 3e 6e 4c 6f 63 6b 3e 3d 30 20 29 3b 0a  de->nLock>=0 );.
11600 20 20 20 20 69 66 28 20 70 49 6e 6f 64 65 2d 3e      if( pInode->
11610 6e 4c 6f 63 6b 3d 3d 30 20 29 7b 0a 20 20 20 20  nLock==0 ){.    
11620 20 20 63 6c 6f 73 65 50 65 6e 64 69 6e 67 46 64    closePendingFd
11630 73 28 70 46 69 6c 65 29 3b 0a 20 20 20 20 7d 0a  s(pFile);.    }.
11640 20 20 7d 0a 09 0a 65 6e 64 5f 75 6e 6c 6f 63 6b    }...end_unlock
11650 3a 0a 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74  :.  unixLeaveMut
11660 65 78 28 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d  ex();.  if( rc==
11670 53 51 4c 49 54 45 5f 4f 4b 20 29 20 70 46 69 6c  SQLITE_OK ) pFil
11680 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 65  e->eFileLock = e
11690 46 69 6c 65 4c 6f 63 6b 3b 0a 20 20 72 65 74 75  FileLock;.  retu
116a0 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
116b0 4c 6f 77 65 72 20 74 68 65 20 6c 6f 63 6b 69 6e  Lower the lockin
116c0 67 20 6c 65 76 65 6c 20 6f 6e 20 66 69 6c 65 20  g level on file 
116d0 64 65 73 63 72 69 70 74 6f 72 20 70 46 69 6c 65  descriptor pFile
116e0 20 74 6f 20 65 46 69 6c 65 4c 6f 63 6b 2e 20 20   to eFileLock.  
116f0 65 46 69 6c 65 4c 6f 63 6b 0a 2a 2a 20 6d 75 73  eFileLock.** mus
11700 74 20 62 65 20 65 69 74 68 65 72 20 4e 4f 5f 4c  t be either NO_L
11710 4f 43 4b 20 6f 72 20 53 48 41 52 45 44 5f 4c 4f  OCK or SHARED_LO
11720 43 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  CK..**.** If the
11730 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f   locking level o
11740 66 20 74 68 65 20 66 69 6c 65 20 64 65 73 63 72  f the file descr
11750 69 70 74 6f 72 20 69 73 20 61 6c 72 65 61 64 79  iptor is already
11760 20 61 74 20 6f 72 20 62 65 6c 6f 77 0a 2a 2a 20   at or below.** 
11770 74 68 65 20 72 65 71 75 65 73 74 65 64 20 6c 6f  the requested lo
11780 63 6b 69 6e 67 20 6c 65 76 65 6c 2c 20 74 68 69  cking level, thi
11790 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e  s routine is a n
117a0 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  o-op..*/.static 
117b0 69 6e 74 20 75 6e 69 78 55 6e 6c 6f 63 6b 28 73  int unixUnlock(s
117c0 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c  qlite3_file *id,
117d0 20 69 6e 74 20 65 46 69 6c 65 4c 6f 63 6b 29 7b   int eFileLock){
117e0 0a 20 20 72 65 74 75 72 6e 20 70 6f 73 69 78 55  .  return posixU
117f0 6e 6c 6f 63 6b 28 69 64 2c 20 65 46 69 6c 65 4c  nlock(id, eFileL
11800 6f 63 6b 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  ock, 0);.}../*.*
11810 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
11820 70 65 72 66 6f 72 6d 73 20 74 68 65 20 70 61 72  performs the par
11830 74 73 20 6f 66 20 74 68 65 20 22 63 6c 6f 73 65  ts of the "close
11840 20 66 69 6c 65 22 20 6f 70 65 72 61 74 69 6f 6e   file" operation
11850 20 0a 2a 2a 20 63 6f 6d 6d 6f 6e 20 74 6f 20 61   .** common to a
11860 6c 6c 20 6c 6f 63 6b 69 6e 67 20 73 63 68 65 6d  ll locking schem
11870 65 73 2e 20 49 74 20 63 6c 6f 73 65 73 20 74 68  es. It closes th
11880 65 20 64 69 72 65 63 74 6f 72 79 20 61 6e 64 20  e directory and 
11890 66 69 6c 65 0a 2a 2a 20 68 61 6e 64 6c 65 73 2c  file.** handles,
118a0 20 69 66 20 74 68 65 79 20 61 72 65 20 76 61 6c   if they are val
118b0 69 64 2c 20 61 6e 64 20 73 65 74 73 20 61 6c 6c  id, and sets all
118c0 20 66 69 65 6c 64 73 20 6f 66 20 74 68 65 20 75   fields of the u
118d0 6e 69 78 46 69 6c 65 0a 2a 2a 20 73 74 72 75 63  nixFile.** struc
118e0 74 75 72 65 20 74 6f 20 30 2e 0a 2a 2a 0a 2a 2a  ture to 0..**.**
118f0 20 49 74 20 69 73 20 2a 6e 6f 74 2a 20 6e 65 63   It is *not* nec
11900 65 73 73 61 72 79 20 74 6f 20 68 6f 6c 64 20 74  essary to hold t
11910 68 65 20 6d 75 74 65 78 20 77 68 65 6e 20 74 68  he mutex when th
11920 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  is routine is ca
11930 6c 6c 65 64 2c 0a 2a 2a 20 65 76 65 6e 20 6f 6e  lled,.** even on
11940 20 56 78 57 6f 72 6b 73 2e 20 20 41 20 6d 75 74   VxWorks.  A mut
11950 65 78 20 77 69 6c 6c 20 62 65 20 61 63 71 75 69  ex will be acqui
11960 72 65 64 20 6f 6e 20 56 78 57 6f 72 6b 73 20 62  red on VxWorks b
11970 79 20 74 68 65 0a 2a 2a 20 76 78 77 6f 72 6b 73  y the.** vxworks
11980 52 65 6c 65 61 73 65 46 69 6c 65 49 64 28 29 20  ReleaseFileId() 
11990 72 6f 75 74 69 6e 65 2e 0a 2a 2f 0a 73 74 61 74  routine..*/.stat
119a0 69 63 20 69 6e 74 20 63 6c 6f 73 65 55 6e 69 78  ic int closeUnix
119b0 46 69 6c 65 28 73 71 6c 69 74 65 33 5f 66 69 6c  File(sqlite3_fil
119c0 65 20 2a 69 64 29 7b 0a 20 20 75 6e 69 78 46 69  e *id){.  unixFi
119d0 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69  le *pFile = (uni
119e0 78 46 69 6c 65 2a 29 69 64 3b 0a 23 69 66 20 4f  xFile*)id;.#if O
119f0 53 43 4c 4f 53 45 5f 43 48 45 43 4b 5f 43 4c 4f  SCLOSE_CHECK_CLO
11a00 53 45 5f 49 4f 45 52 52 0a 20 20 69 66 28 20 70  SE_IOERR.  if( p
11a10 46 69 6c 65 2d 3e 68 3e 3d 30 20 29 7b 0a 20 20  File->h>=0 ){.  
11a20 20 20 69 6e 74 20 65 72 72 20 3d 20 63 6c 6f 73    int err = clos
11a30 65 28 70 46 69 6c 65 2d 3e 68 29 3b 0a 20 20 20  e(pFile->h);.   
11a40 20 69 66 28 20 65 72 72 20 29 7b 0a 20 20 20 20   if( err ){.    
11a50 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72    pFile->lastErr
11a60 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20  no = errno;.    
11a70 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
11a80 49 4f 45 52 52 5f 43 4c 4f 53 45 3b 0a 20 20 20  IOERR_CLOSE;.   
11a90 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 46   }else{.      pF
11aa0 69 6c 65 2d 3e 68 3d 2d 31 3b 0a 20 20 20 20 7d  ile->h=-1;.    }
11ab0 0a 20 20 7d 0a 23 65 6c 73 65 0a 20 20 69 66 28  .  }.#else.  if(
11ac0 20 70 46 69 6c 65 2d 3e 68 3e 3d 30 20 29 7b 0a   pFile->h>=0 ){.
11ad0 20 20 20 20 72 6f 62 75 73 74 5f 63 6c 6f 73 65      robust_close
11ae0 28 70 46 69 6c 65 2c 20 70 46 69 6c 65 2d 3e 68  (pFile, pFile->h
11af0 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20 20  , __LINE__);.   
11b00 20 70 46 69 6c 65 2d 3e 68 20 3d 20 2d 31 3b 0a   pFile->h = -1;.
11b10 20 20 7d 0a 23 65 6e 64 69 66 0a 23 69 66 20 4f    }.#endif.#if O
11b20 53 5f 56 58 57 4f 52 4b 53 0a 20 20 69 66 28 20  S_VXWORKS.  if( 
11b30 70 46 69 6c 65 2d 3e 70 49 64 20 29 7b 0a 20 20  pFile->pId ){.  
11b40 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 69 73 44    if( pFile->isD
11b50 65 6c 65 74 65 20 29 7b 0a 20 20 20 20 20 20 6f  elete ){.      o
11b60 73 55 6e 6c 69 6e 6b 28 70 46 69 6c 65 2d 3e 70  sUnlink(pFile->p
11b70 49 64 2d 3e 7a 43 61 6e 6f 6e 69 63 61 6c 4e 61  Id->zCanonicalNa
11b80 6d 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 76  me);.    }.    v
11b90 78 77 6f 72 6b 73 52 65 6c 65 61 73 65 46 69 6c  xworksReleaseFil
11ba0 65 49 64 28 70 46 69 6c 65 2d 3e 70 49 64 29 3b  eId(pFile->pId);
11bb0 0a 20 20 20 20 70 46 69 6c 65 2d 3e 70 49 64 20  .    pFile->pId 
11bc0 3d 20 30 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  = 0;.  }.#endif.
11bd0 20 20 4f 53 54 52 41 43 45 28 28 22 43 4c 4f 53    OSTRACE(("CLOS
11be0 45 20 20 20 25 2d 33 64 5c 6e 22 2c 20 70 46 69  E   %-3d\n", pFi
11bf0 6c 65 2d 3e 68 29 29 3b 0a 20 20 4f 70 65 6e 43  le->h));.  OpenC
11c00 6f 75 6e 74 65 72 28 2d 31 29 3b 0a 20 20 73 71  ounter(-1);.  sq
11c10 6c 69 74 65 33 5f 66 72 65 65 28 70 46 69 6c 65  lite3_free(pFile
11c20 2d 3e 70 55 6e 75 73 65 64 29 3b 0a 20 20 6d 65  ->pUnused);.  me
11c30 6d 73 65 74 28 70 46 69 6c 65 2c 20 30 2c 20 73  mset(pFile, 0, s
11c40 69 7a 65 6f 66 28 75 6e 69 78 46 69 6c 65 29 29  izeof(unixFile))
11c50 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
11c60 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  E_OK;.}../*.** C
11c70 6c 6f 73 65 20 61 20 66 69 6c 65 2e 0a 2a 2f 0a  lose a file..*/.
11c80 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 43  static int unixC
11c90 6c 6f 73 65 28 73 71 6c 69 74 65 33 5f 66 69 6c  lose(sqlite3_fil
11ca0 65 20 2a 69 64 29 7b 0a 20 20 69 6e 74 20 72 63  e *id){.  int rc
11cb0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
11cc0 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20  unixFile *pFile 
11cd0 3d 20 28 75 6e 69 78 46 69 6c 65 20 2a 29 69 64  = (unixFile *)id
11ce0 3b 0a 20 20 75 6e 69 78 55 6e 6c 6f 63 6b 28 69  ;.  unixUnlock(i
11cf0 64 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20 20 75  d, NO_LOCK);.  u
11d00 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29 3b  nixEnterMutex();
11d10 0a 0a 20 20 2f 2a 20 75 6e 69 78 46 69 6c 65 2e  ..  /* unixFile.
11d20 70 49 6e 6f 64 65 20 69 73 20 61 6c 77 61 79 73  pInode is always
11d30 20 76 61 6c 69 64 20 68 65 72 65 2e 20 4f 74 68   valid here. Oth
11d40 65 72 77 69 73 65 2c 20 61 20 64 69 66 66 65 72  erwise, a differ
11d50 65 6e 74 20 63 6c 6f 73 65 0a 20 20 2a 2a 20 72  ent close.  ** r
11d60 6f 75 74 69 6e 65 20 28 65 2e 67 2e 20 6e 6f 6c  outine (e.g. nol
11d70 6f 63 6b 43 6c 6f 73 65 28 29 29 20 77 6f 75 6c  ockClose()) woul
11d80 64 20 62 65 20 63 61 6c 6c 65 64 20 69 6e 73 74  d be called inst
11d90 65 61 64 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65  ead..  */.  asse
11da0 72 74 28 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64  rt( pFile->pInod
11db0 65 2d 3e 6e 4c 6f 63 6b 3e 30 20 7c 7c 20 70 46  e->nLock>0 || pF
11dc0 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e 62 50 72  ile->pInode->bPr
11dd0 6f 63 65 73 73 4c 6f 63 6b 3d 3d 30 20 29 3b 0a  ocessLock==0 );.
11de0 20 20 69 66 28 20 41 4c 57 41 59 53 28 70 46 69    if( ALWAYS(pFi
11df0 6c 65 2d 3e 70 49 6e 6f 64 65 29 20 26 26 20 70  le->pInode) && p
11e00 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e 6e 4c  File->pInode->nL
11e10 6f 63 6b 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66  ock ){.    /* If
11e20 20 74 68 65 72 65 20 61 72 65 20 6f 75 74 73 74   there are outst
11e30 61 6e 64 69 6e 67 20 6c 6f 63 6b 73 2c 20 64 6f  anding locks, do
11e40 20 6e 6f 74 20 61 63 74 75 61 6c 6c 79 20 63 6c   not actually cl
11e50 6f 73 65 20 74 68 65 20 66 69 6c 65 20 6a 75 73  ose the file jus
11e60 74 0a 20 20 20 20 2a 2a 20 79 65 74 20 62 65 63  t.    ** yet bec
11e70 61 75 73 65 20 74 68 61 74 20 77 6f 75 6c 64 20  ause that would 
11e80 63 6c 65 61 72 20 74 68 6f 73 65 20 6c 6f 63 6b  clear those lock
11e90 73 2e 20 20 49 6e 73 74 65 61 64 2c 20 61 64 64  s.  Instead, add
11ea0 20 74 68 65 20 66 69 6c 65 0a 20 20 20 20 2a 2a   the file.    **
11eb0 20 64 65 73 63 72 69 70 74 6f 72 20 74 6f 20 70   descriptor to p
11ec0 49 6e 6f 64 65 2d 3e 70 55 6e 75 73 65 64 20 6c  Inode->pUnused l
11ed0 69 73 74 2e 20 20 49 74 20 77 69 6c 6c 20 62 65  ist.  It will be
11ee0 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 63   automatically c
11ef0 6c 6f 73 65 64 20 0a 20 20 20 20 2a 2a 20 77 68  losed .    ** wh
11f00 65 6e 20 74 68 65 20 6c 61 73 74 20 6c 6f 63 6b  en the last lock
11f10 20 69 73 20 63 6c 65 61 72 65 64 2e 0a 20 20 20   is cleared..   
11f20 20 2a 2f 0a 20 20 20 20 73 65 74 50 65 6e 64 69   */.    setPendi
11f30 6e 67 46 64 28 70 46 69 6c 65 29 3b 0a 20 20 7d  ngFd(pFile);.  }
11f40 0a 20 20 72 65 6c 65 61 73 65 49 6e 6f 64 65 49  .  releaseInodeI
11f50 6e 66 6f 28 70 46 69 6c 65 29 3b 0a 20 20 72 63  nfo(pFile);.  rc
11f60 20 3d 20 63 6c 6f 73 65 55 6e 69 78 46 69 6c 65   = closeUnixFile
11f70 28 69 64 29 3b 0a 20 20 75 6e 69 78 4c 65 61 76  (id);.  unixLeav
11f80 65 4d 75 74 65 78 28 29 3b 0a 20 20 72 65 74 75  eMutex();.  retu
11f90 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 2a 2a 2a 2a  rn rc;.}../*****
11fa0 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64 20 6f 66  ********* End of
11fb0 20 74 68 65 20 70 6f 73 69 78 20 61 64 76 69 73   the posix advis
11fc0 6f 72 79 20 6c 6f 63 6b 20 69 6d 70 6c 65 6d 65  ory lock impleme
11fd0 6e 74 61 74 69 6f 6e 20 2a 2a 2a 2a 2a 2a 2a 2a  ntation ********
11fe0 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a  *********.******
11ff0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12000 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12010 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12020 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12030 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 2a 2a 2a  ********/../****
12040 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12050 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12060 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12070 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12080 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a  **********.*****
12090 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
120a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 4e 6f 2d 6f 70 20  ********* No-op 
120b0 4c 6f 63 6b 69 6e 67 20 2a 2a 2a 2a 2a 2a 2a 2a  Locking ********
120c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
120d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a  **********.**.**
120e0 20 4f 66 20 74 68 65 20 76 61 72 69 6f 75 73 20   Of the various 
120f0 6c 6f 63 6b 69 6e 67 20 69 6d 70 6c 65 6d 65 6e  locking implemen
12100 74 61 74 69 6f 6e 73 20 61 76 61 69 6c 61 62 6c  tations availabl
12110 65 2c 20 74 68 69 73 20 69 73 20 62 79 20 66 61  e, this is by fa
12120 72 20 74 68 65 0a 2a 2a 20 73 69 6d 70 6c 65 73  r the.** simples
12130 74 3a 20 20 6c 6f 63 6b 69 6e 67 20 69 73 20 69  t:  locking is i
12140 67 6e 6f 72 65 64 2e 20 20 4e 6f 20 61 74 74 65  gnored.  No atte
12150 6d 70 74 20 69 73 20 6d 61 64 65 20 74 6f 20 6c  mpt is made to l
12160 6f 63 6b 20 74 68 65 20 64 61 74 61 62 61 73 65  ock the database
12170 0a 2a 2a 20 66 69 6c 65 20 66 6f 72 20 72 65 61  .** file for rea
12180 64 69 6e 67 20 6f 72 20 77 72 69 74 69 6e 67 2e  ding or writing.
12190 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 6c 6f 63 6b  .**.** This lock
121a0 69 6e 67 20 6d 6f 64 65 20 69 73 20 61 70 70 72  ing mode is appr
121b0 6f 70 72 69 61 74 65 20 66 6f 72 20 75 73 65 20  opriate for use 
121c0 6f 6e 20 72 65 61 64 2d 6f 6e 6c 79 20 64 61 74  on read-only dat
121d0 61 62 61 73 65 73 0a 2a 2a 20 28 65 78 3a 20 64  abases.** (ex: d
121e0 61 74 61 62 61 73 65 73 20 74 68 61 74 20 61 72  atabases that ar
121f0 65 20 62 75 72 6e 65 64 20 69 6e 74 6f 20 43 44  e burned into CD
12200 2d 52 4f 4d 2c 20 66 6f 72 20 65 78 61 6d 70 6c  -ROM, for exampl
12210 65 2e 29 20 20 49 74 20 63 61 6e 0a 2a 2a 20 61  e.)  It can.** a
12220 6c 73 6f 20 62 65 20 75 73 65 64 20 69 66 20 74  lso be used if t
12230 68 65 20 61 70 70 6c 69 63 61 74 69 6f 6e 20 65  he application e
12240 6d 70 6c 6f 79 73 20 73 6f 6d 65 20 65 78 74 65  mploys some exte
12250 72 6e 61 6c 20 6d 65 63 68 61 6e 69 73 6d 20 74  rnal mechanism t
12260 6f 0a 2a 2a 20 70 72 65 76 65 6e 74 20 73 69 6d  o.** prevent sim
12270 75 6c 74 61 6e 65 6f 75 73 20 61 63 63 65 73 73  ultaneous access
12280 20 6f 66 20 74 68 65 20 73 61 6d 65 20 64 61 74   of the same dat
12290 61 62 61 73 65 20 62 79 20 74 77 6f 20 6f 72 20  abase by two or 
122a0 6d 6f 72 65 0a 2a 2a 20 64 61 74 61 62 61 73 65  more.** database
122b0 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 2e 20 20 42   connections.  B
122c0 75 74 20 74 68 65 72 65 20 69 73 20 61 20 73 65  ut there is a se
122d0 72 69 6f 75 73 20 72 69 73 6b 20 6f 66 20 64 61  rious risk of da
122e0 74 61 62 61 73 65 0a 2a 2a 20 63 6f 72 72 75 70  tabase.** corrup
122f0 74 69 6f 6e 20 69 66 20 74 68 69 73 20 6c 6f 63  tion if this loc
12300 6b 69 6e 67 20 6d 6f 64 65 20 69 73 20 75 73 65  king mode is use
12310 64 20 69 6e 20 73 69 74 75 61 74 69 6f 6e 73 20  d in situations 
12320 77 68 65 72 65 20 6d 75 6c 74 69 70 6c 65 0a 2a  where multiple.*
12330 2a 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  * database conne
12340 63 74 69 6f 6e 73 20 61 72 65 20 61 63 63 65 73  ctions are acces
12350 73 69 6e 67 20 74 68 65 20 73 61 6d 65 20 64 61  sing the same da
12360 74 61 62 61 73 65 20 66 69 6c 65 20 61 74 20 74  tabase file at t
12370 68 65 20 73 61 6d 65 0a 2a 2a 20 74 69 6d 65 20  he same.** time 
12380 61 6e 64 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20  and one or more 
12390 6f 66 20 74 68 6f 73 65 20 63 6f 6e 6e 65 63 74  of those connect
123a0 69 6f 6e 73 20 61 72 65 20 77 72 69 74 69 6e 67  ions are writing
123b0 2e 0a 2a 2f 0a 0a 73 74 61 74 69 63 20 69 6e 74  ..*/..static int
123c0 20 6e 6f 6c 6f 63 6b 43 68 65 63 6b 52 65 73 65   nolockCheckRese
123d0 72 76 65 64 4c 6f 63 6b 28 73 71 6c 69 74 65 33  rvedLock(sqlite3
123e0 5f 66 69 6c 65 20 2a 4e 6f 74 55 73 65 64 2c 20  _file *NotUsed, 
123f0 69 6e 74 20 2a 70 52 65 73 4f 75 74 29 7b 0a 20  int *pResOut){. 
12400 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
12410 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20 2a 70  R(NotUsed);.  *p
12420 52 65 73 4f 75 74 20 3d 20 30 3b 0a 20 20 72 65  ResOut = 0;.  re
12430 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
12440 7d 0a 73 74 61 74 69 63 20 69 6e 74 20 6e 6f 6c  }.static int nol
12450 6f 63 6b 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f  ockLock(sqlite3_
12460 66 69 6c 65 20 2a 4e 6f 74 55 73 65 64 2c 20 69  file *NotUsed, i
12470 6e 74 20 4e 6f 74 55 73 65 64 32 29 7b 0a 20 20  nt NotUsed2){.  
12480 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
12490 32 28 4e 6f 74 55 73 65 64 2c 20 4e 6f 74 55 73  2(NotUsed, NotUs
124a0 65 64 32 29 3b 0a 20 20 72 65 74 75 72 6e 20 53  ed2);.  return S
124b0 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 73 74 61 74  QLITE_OK;.}.stat
124c0 69 63 20 69 6e 74 20 6e 6f 6c 6f 63 6b 55 6e 6c  ic int nolockUnl
124d0 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  ock(sqlite3_file
124e0 20 2a 4e 6f 74 55 73 65 64 2c 20 69 6e 74 20 4e   *NotUsed, int N
124f0 6f 74 55 73 65 64 32 29 7b 0a 20 20 55 4e 55 53  otUsed2){.  UNUS
12500 45 44 5f 50 41 52 41 4d 45 54 45 52 32 28 4e 6f  ED_PARAMETER2(No
12510 74 55 73 65 64 2c 20 4e 6f 74 55 73 65 64 32 29  tUsed, NotUsed2)
12520 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
12530 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  E_OK;.}../*.** C
12540 6c 6f 73 65 20 74 68 65 20 66 69 6c 65 2e 0a 2a  lose the file..*
12550 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6e 6f 6c  /.static int nol
12560 6f 63 6b 43 6c 6f 73 65 28 73 71 6c 69 74 65 33  ockClose(sqlite3
12570 5f 66 69 6c 65 20 2a 69 64 29 20 7b 0a 20 20 72  _file *id) {.  r
12580 65 74 75 72 6e 20 63 6c 6f 73 65 55 6e 69 78 46  eturn closeUnixF
12590 69 6c 65 28 69 64 29 3b 0a 7d 0a 0a 2f 2a 2a 2a  ile(id);.}../***
125a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
125b0 20 45 6e 64 20 6f 66 20 74 68 65 20 6e 6f 2d 6f   End of the no-o
125c0 70 20 6c 6f 63 6b 20 69 6d 70 6c 65 6d 65 6e 74  p lock implement
125d0 61 74 69 6f 6e 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ation **********
125e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a  ***********.****
125f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12600 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12610 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12620 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12630 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 2a  **********/../**
12640 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12650 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12660 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12670 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12680 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a  ************.***
12690 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
126a0 2a 2a 2a 2a 2a 2a 20 42 65 67 69 6e 20 64 6f 74  ****** Begin dot
126b0 2d 66 69 6c 65 20 4c 6f 63 6b 69 6e 67 20 2a 2a  -file Locking **
126c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
126d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a  ************.**.
126e0 2a 2a 20 54 68 65 20 64 6f 74 66 69 6c 65 20 6c  ** The dotfile l
126f0 6f 63 6b 69 6e 67 20 69 6d 70 6c 65 6d 65 6e 74  ocking implement
12700 61 74 69 6f 6e 20 75 73 65 73 20 74 68 65 20 65  ation uses the e
12710 78 69 73 74 61 6e 63 65 20 6f 66 20 73 65 70 61  xistance of sepa
12720 72 61 74 65 20 6c 6f 63 6b 0a 2a 2a 20 66 69 6c  rate lock.** fil
12730 65 73 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 63  es in order to c
12740 6f 6e 74 72 6f 6c 20 61 63 63 65 73 73 20 74 6f  ontrol access to
12750 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 20   the database.  
12760 54 68 69 73 20 77 6f 72 6b 73 20 6f 6e 20 6a 75  This works on ju
12770 73 74 0a 2a 2a 20 61 62 6f 75 74 20 65 76 65 72  st.** about ever
12780 79 20 66 69 6c 65 73 79 73 74 65 6d 20 69 6d 61  y filesystem ima
12790 67 69 6e 61 62 6c 65 2e 20 20 42 75 74 20 74 68  ginable.  But th
127a0 65 72 65 20 61 72 65 20 73 65 72 69 6f 75 73 20  ere are serious 
127b0 64 6f 77 6e 73 69 64 65 73 3a 0a 2a 2a 0a 2a 2a  downsides:.**.**
127c0 20 20 20 20 28 31 29 20 20 54 68 65 72 65 20 69      (1)  There i
127d0 73 20 7a 65 72 6f 20 63 6f 6e 63 75 72 72 65 6e  s zero concurren
127e0 63 79 2e 20 20 41 20 73 69 6e 67 6c 65 20 72 65  cy.  A single re
127f0 61 64 65 72 20 62 6c 6f 63 6b 73 20 61 6c 6c 20  ader blocks all 
12800 6f 74 68 65 72 0a 2a 2a 20 20 20 20 20 20 20 20  other.**        
12810 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 66 72 6f   connections fro
12820 6d 20 72 65 61 64 69 6e 67 20 6f 72 20 77 72 69  m reading or wri
12830 74 69 6e 67 20 74 68 65 20 64 61 74 61 62 61 73  ting the databas
12840 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 28 32 29 20  e..**.**    (2) 
12850 20 41 6e 20 61 70 70 6c 69 63 61 74 69 6f 6e 20   An application 
12860 63 72 61 73 68 20 6f 72 20 70 6f 77 65 72 20 6c  crash or power l
12870 6f 73 73 20 63 61 6e 20 6c 65 61 76 65 20 73 74  oss can leave st
12880 61 6c 65 20 6c 6f 63 6b 20 66 69 6c 65 73 0a 2a  ale lock files.*
12890 2a 20 20 20 20 20 20 20 20 20 73 69 74 74 69 6e  *         sittin
128a0 67 20 61 72 6f 75 6e 64 20 74 68 61 74 20 6e 65  g around that ne
128b0 65 64 20 74 6f 20 62 65 20 63 6c 65 61 72 65 64  ed to be cleared
128c0 20 6d 61 6e 75 61 6c 6c 79 2e 0a 2a 2a 0a 2a 2a   manually..**.**
128d0 20 4e 65 76 65 72 74 68 65 6c 65 73 73 2c 20 61   Nevertheless, a
128e0 20 64 6f 74 6c 6f 63 6b 20 69 73 20 61 6e 20 61   dotlock is an a
128f0 70 70 72 6f 70 72 69 61 74 65 20 6c 6f 63 6b 69  ppropriate locki
12900 6e 67 20 6d 6f 64 65 20 66 6f 72 20 75 73 65 20  ng mode for use 
12910 69 66 20 6e 6f 0a 2a 2a 20 6f 74 68 65 72 20 6c  if no.** other l
12920 6f 63 6b 69 6e 67 20 73 74 72 61 74 65 67 79 20  ocking strategy 
12930 69 73 20 61 76 61 69 6c 61 62 6c 65 2e 0a 2a 2a  is available..**
12940 0a 2a 2a 20 44 6f 74 66 69 6c 65 20 6c 6f 63 6b  .** Dotfile lock
12950 69 6e 67 20 77 6f 72 6b 73 20 62 79 20 63 72 65  ing works by cre
12960 61 74 69 6e 67 20 61 20 66 69 6c 65 20 69 6e 20  ating a file in 
12970 74 68 65 20 73 61 6d 65 20 64 69 72 65 63 74 6f  the same directo
12980 72 79 20 61 73 20 74 68 65 0a 2a 2a 20 64 61 74  ry as the.** dat
12990 61 62 61 73 65 20 61 6e 64 20 77 69 74 68 20 74  abase and with t
129a0 68 65 20 73 61 6d 65 20 6e 61 6d 65 20 62 75 74  he same name but
129b0 20 77 69 74 68 20 61 20 22 2e 6c 6f 63 6b 22 20   with a ".lock" 
129c0 65 78 74 65 6e 73 69 6f 6e 20 61 64 64 65 64 2e  extension added.
129d0 0a 2a 2a 20 54 68 65 20 65 78 69 73 74 61 6e 63  .** The existanc
129e0 65 20 6f 66 20 61 20 6c 6f 63 6b 20 66 69 6c 65  e of a lock file
129f0 20 69 6d 70 6c 69 65 73 20 61 6e 20 45 58 43 4c   implies an EXCL
12a00 55 53 49 56 45 20 6c 6f 63 6b 2e 20 20 41 6c 6c  USIVE lock.  All
12a10 20 6f 74 68 65 72 20 6c 6f 63 6b 0a 2a 2a 20 74   other lock.** t
12a20 79 70 65 73 20 28 53 48 41 52 45 44 2c 20 52 45  ypes (SHARED, RE
12a30 53 45 52 56 45 44 2c 20 50 45 4e 44 49 4e 47 29  SERVED, PENDING)
12a40 20 61 72 65 20 6d 61 70 70 65 64 20 69 6e 74 6f   are mapped into
12a50 20 45 58 43 4c 55 53 49 56 45 2e 0a 2a 2f 0a 0a   EXCLUSIVE..*/..
12a60 2f 2a 0a 2a 2a 20 54 68 65 20 66 69 6c 65 20 73  /*.** The file s
12a70 75 66 66 69 78 20 61 64 64 65 64 20 74 6f 20 74  uffix added to t
12a80 68 65 20 64 61 74 61 20 62 61 73 65 20 66 69 6c  he data base fil
12a90 65 6e 61 6d 65 20 69 6e 20 6f 72 64 65 72 20 74  ename in order t
12aa0 6f 20 63 72 65 61 74 65 20 74 68 65 0a 2a 2a 20  o create the.** 
12ab0 6c 6f 63 6b 20 66 69 6c 65 2e 0a 2a 2f 0a 23 64  lock file..*/.#d
12ac0 65 66 69 6e 65 20 44 4f 54 4c 4f 43 4b 5f 53 55  efine DOTLOCK_SU
12ad0 46 46 49 58 20 22 2e 6c 6f 63 6b 22 0a 0a 2f 2a  FFIX ".lock"../*
12ae0 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
12af0 20 63 68 65 63 6b 73 20 69 66 20 74 68 65 72 65   checks if there
12b00 20 69 73 20 61 20 52 45 53 45 52 56 45 44 20 6c   is a RESERVED l
12b10 6f 63 6b 20 68 65 6c 64 20 6f 6e 20 74 68 65 20  ock held on the 
12b20 73 70 65 63 69 66 69 65 64 0a 2a 2a 20 66 69 6c  specified.** fil
12b30 65 20 62 79 20 74 68 69 73 20 6f 72 20 61 6e 79  e by this or any
12b40 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 2e 20   other process. 
12b50 49 66 20 73 75 63 68 20 61 20 6c 6f 63 6b 20 69  If such a lock i
12b60 73 20 68 65 6c 64 2c 20 73 65 74 20 2a 70 52 65  s held, set *pRe
12b70 73 4f 75 74 0a 2a 2a 20 74 6f 20 61 20 6e 6f 6e  sOut.** to a non
12b80 2d 7a 65 72 6f 20 76 61 6c 75 65 20 6f 74 68 65  -zero value othe
12b90 72 77 69 73 65 20 2a 70 52 65 73 4f 75 74 20 69  rwise *pResOut i
12ba0 73 20 73 65 74 20 74 6f 20 7a 65 72 6f 2e 20 20  s set to zero.  
12bb0 54 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65  The return value
12bc0 0a 2a 2a 20 69 73 20 73 65 74 20 74 6f 20 53 51  .** is set to SQ
12bd0 4c 49 54 45 5f 4f 4b 20 75 6e 6c 65 73 73 20 61  LITE_OK unless a
12be0 6e 20 49 2f 4f 20 65 72 72 6f 72 20 6f 63 63 75  n I/O error occu
12bf0 72 73 20 64 75 72 69 6e 67 20 6c 6f 63 6b 20 63  rs during lock c
12c00 68 65 63 6b 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 49  hecking..**.** I
12c10 6e 20 64 6f 74 66 69 6c 65 20 6c 6f 63 6b 69 6e  n dotfile lockin
12c20 67 2c 20 65 69 74 68 65 72 20 61 20 6c 6f 63 6b  g, either a lock
12c30 20 65 78 69 73 74 73 20 6f 72 20 69 74 20 64 6f   exists or it do
12c40 65 73 20 6e 6f 74 2e 20 20 53 6f 20 69 6e 20 74  es not.  So in t
12c50 68 69 73 0a 2a 2a 20 76 61 72 69 61 74 69 6f 6e  his.** variation
12c60 20 6f 66 20 43 68 65 63 6b 52 65 73 65 72 76 65   of CheckReserve
12c70 64 4c 6f 63 6b 28 29 2c 20 2a 70 52 65 73 4f 75  dLock(), *pResOu
12c80 74 20 69 73 20 73 65 74 20 74 6f 20 74 72 75 65  t is set to true
12c90 20 69 66 20 61 6e 79 20 6c 6f 63 6b 0a 2a 2a 20   if any lock.** 
12ca0 69 73 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 66  is held on the f
12cb0 69 6c 65 20 61 6e 64 20 66 61 6c 73 65 20 69 66  ile and false if
12cc0 20 74 68 65 20 66 69 6c 65 20 69 73 20 75 6e 6c   the file is unl
12cd0 6f 63 6b 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  ocked..*/.static
12ce0 20 69 6e 74 20 64 6f 74 6c 6f 63 6b 43 68 65 63   int dotlockChec
12cf0 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 28 73 71  kReservedLock(sq
12d00 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20  lite3_file *id, 
12d10 69 6e 74 20 2a 70 52 65 73 4f 75 74 29 20 7b 0a  int *pResOut) {.
12d20 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
12d30 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 72 65 73 65  E_OK;.  int rese
12d40 72 76 65 64 20 3d 20 30 3b 0a 20 20 75 6e 69 78  rved = 0;.  unix
12d50 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75  File *pFile = (u
12d60 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 0a 20 20  nixFile*)id;..  
12d70 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28  SimulateIOError(
12d80 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49   return SQLITE_I
12d90 4f 45 52 52 5f 43 48 45 43 4b 52 45 53 45 52 56  OERR_CHECKRESERV
12da0 45 44 4c 4f 43 4b 3b 20 29 3b 0a 20 20 0a 20 20  EDLOCK; );.  .  
12db0 61 73 73 65 72 74 28 20 70 46 69 6c 65 20 29 3b  assert( pFile );
12dc0 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 69 66 20  ..  /* Check if 
12dd0 61 20 74 68 72 65 61 64 20 69 6e 20 74 68 69 73  a thread in this
12de0 20 70 72 6f 63 65 73 73 20 68 6f 6c 64 73 20 73   process holds s
12df0 75 63 68 20 61 20 6c 6f 63 6b 20 2a 2f 0a 20 20  uch a lock */.  
12e00 69 66 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65  if( pFile->eFile
12e10 4c 6f 63 6b 3e 53 48 41 52 45 44 5f 4c 4f 43 4b  Lock>SHARED_LOCK
12e20 20 29 7b 0a 20 20 20 20 2f 2a 20 45 69 74 68 65   ){.    /* Eithe
12e30 72 20 74 68 69 73 20 63 6f 6e 6e 65 63 74 69 6f  r this connectio
12e40 6e 20 6f 72 20 73 6f 6d 65 20 6f 74 68 65 72 20  n or some other 
12e50 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 6e 20 74 68  connection in th
12e60 65 20 73 61 6d 65 20 70 72 6f 63 65 73 73 0a 20  e same process. 
12e70 20 20 20 2a 2a 20 68 6f 6c 64 73 20 61 20 6c 6f     ** holds a lo
12e80 63 6b 20 6f 6e 20 74 68 65 20 66 69 6c 65 2e 20  ck on the file. 
12e90 20 4e 6f 20 6e 65 65 64 20 74 6f 20 63 68 65 63   No need to chec
12ea0 6b 20 66 75 72 74 68 65 72 2e 20 2a 2f 0a 20 20  k further. */.  
12eb0 20 20 72 65 73 65 72 76 65 64 20 3d 20 31 3b 0a    reserved = 1;.
12ec0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20    }else{.    /* 
12ed0 54 68 65 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64  The lock is held
12ee0 20 69 66 20 61 6e 64 20 6f 6e 6c 79 20 69 66 20   if and only if 
12ef0 74 68 65 20 6c 6f 63 6b 66 69 6c 65 20 65 78 69  the lockfile exi
12f00 73 74 73 20 2a 2f 0a 20 20 20 20 63 6f 6e 73 74  sts */.    const
12f10 20 63 68 61 72 20 2a 7a 4c 6f 63 6b 46 69 6c 65   char *zLockFile
12f20 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29   = (const char*)
12f30 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f  pFile->lockingCo
12f40 6e 74 65 78 74 3b 0a 20 20 20 20 72 65 73 65 72  ntext;.    reser
12f50 76 65 64 20 3d 20 6f 73 41 63 63 65 73 73 28 7a  ved = osAccess(z
12f60 4c 6f 63 6b 46 69 6c 65 2c 20 30 29 3d 3d 30 3b  LockFile, 0)==0;
12f70 0a 20 20 7d 0a 20 20 4f 53 54 52 41 43 45 28 28  .  }.  OSTRACE((
12f80 22 54 45 53 54 20 57 52 2d 4c 4f 43 4b 20 25 64  "TEST WR-LOCK %d
12f90 20 25 64 20 25 64 20 28 64 6f 74 6c 6f 63 6b 29   %d %d (dotlock)
12fa0 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 72  \n", pFile->h, r
12fb0 63 2c 20 72 65 73 65 72 76 65 64 29 29 3b 0a 20  c, reserved));. 
12fc0 20 2a 70 52 65 73 4f 75 74 20 3d 20 72 65 73 65   *pResOut = rese
12fd0 72 76 65 64 3b 0a 20 20 72 65 74 75 72 6e 20 72  rved;.  return r
12fe0 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 6b  c;.}../*.** Lock
12ff0 20 74 68 65 20 66 69 6c 65 20 77 69 74 68 20 74   the file with t
13000 68 65 20 6c 6f 63 6b 20 73 70 65 63 69 66 69 65  he lock specifie
13010 64 20 62 79 20 70 61 72 61 6d 65 74 65 72 20 65  d by parameter e
13020 46 69 6c 65 4c 6f 63 6b 20 2d 20 6f 6e 65 0a 2a  FileLock - one.*
13030 2a 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  * of the followi
13040 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28 31  ng:.**.**     (1
13050 29 20 53 48 41 52 45 44 5f 4c 4f 43 4b 0a 2a 2a  ) SHARED_LOCK.**
13060 20 20 20 20 20 28 32 29 20 52 45 53 45 52 56 45       (2) RESERVE
13070 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 33  D_LOCK.**     (3
13080 29 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 0a 2a  ) PENDING_LOCK.*
13090 2a 20 20 20 20 20 28 34 29 20 45 58 43 4c 55 53  *     (4) EXCLUS
130a0 49 56 45 5f 4c 4f 43 4b 0a 2a 2a 0a 2a 2a 20 53  IVE_LOCK.**.** S
130b0 6f 6d 65 74 69 6d 65 73 20 77 68 65 6e 20 72 65  ometimes when re
130c0 71 75 65 73 74 69 6e 67 20 6f 6e 65 20 6c 6f 63  questing one loc
130d0 6b 20 73 74 61 74 65 2c 20 61 64 64 69 74 69 6f  k state, additio
130e0 6e 61 6c 20 6c 6f 63 6b 20 73 74 61 74 65 73 0a  nal lock states.
130f0 2a 2a 20 61 72 65 20 69 6e 73 65 72 74 65 64 20  ** are inserted 
13100 69 6e 20 62 65 74 77 65 65 6e 2e 20 20 54 68 65  in between.  The
13110 20 6c 6f 63 6b 69 6e 67 20 6d 69 67 68 74 20 66   locking might f
13120 61 69 6c 20 6f 6e 20 6f 6e 65 20 6f 66 20 74 68  ail on one of th
13130 65 20 6c 61 74 65 72 0a 2a 2a 20 74 72 61 6e 73  e later.** trans
13140 69 74 69 6f 6e 73 20 6c 65 61 76 69 6e 67 20 74  itions leaving t
13150 68 65 20 6c 6f 63 6b 20 73 74 61 74 65 20 64 69  he lock state di
13160 66 66 65 72 65 6e 74 20 66 72 6f 6d 20 77 68 61  fferent from wha
13170 74 20 69 74 20 73 74 61 72 74 65 64 20 62 75 74  t it started but
13180 0a 2a 2a 20 73 74 69 6c 6c 20 73 68 6f 72 74 20  .** still short 
13190 6f 66 20 69 74 73 20 67 6f 61 6c 2e 20 20 54 68  of its goal.  Th
131a0 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 68 61 72  e following char
131b0 74 20 73 68 6f 77 73 20 74 68 65 20 61 6c 6c 6f  t shows the allo
131c0 77 65 64 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f  wed.** transitio
131d0 6e 73 20 61 6e 64 20 74 68 65 20 69 6e 73 65 72  ns and the inser
131e0 74 65 64 20 69 6e 74 65 72 6d 65 64 69 61 74 65  ted intermediate
131f0 20 73 74 61 74 65 73 3a 0a 2a 2a 0a 2a 2a 20 20   states:.**.**  
13200 20 20 55 4e 4c 4f 43 4b 45 44 20 2d 3e 20 53 48    UNLOCKED -> SH
13210 41 52 45 44 0a 2a 2a 20 20 20 20 53 48 41 52 45  ARED.**    SHARE
13220 44 20 2d 3e 20 52 45 53 45 52 56 45 44 0a 2a 2a  D -> RESERVED.**
13230 20 20 20 20 53 48 41 52 45 44 20 2d 3e 20 28 50      SHARED -> (P
13240 45 4e 44 49 4e 47 29 20 2d 3e 20 45 58 43 4c 55  ENDING) -> EXCLU
13250 53 49 56 45 0a 2a 2a 20 20 20 20 52 45 53 45 52  SIVE.**    RESER
13260 56 45 44 20 2d 3e 20 28 50 45 4e 44 49 4e 47 29  VED -> (PENDING)
13270 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a   -> EXCLUSIVE.**
13280 20 20 20 20 50 45 4e 44 49 4e 47 20 2d 3e 20 45      PENDING -> E
13290 58 43 4c 55 53 49 56 45 0a 2a 2a 0a 2a 2a 20 54  XCLUSIVE.**.** T
132a0 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c  his routine will
132b0 20 6f 6e 6c 79 20 69 6e 63 72 65 61 73 65 20 61   only increase a
132c0 20 6c 6f 63 6b 2e 20 20 55 73 65 20 74 68 65 20   lock.  Use the 
132d0 73 71 6c 69 74 65 33 4f 73 55 6e 6c 6f 63 6b 28  sqlite3OsUnlock(
132e0 29 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 74 6f 20  ).** routine to 
132f0 6c 6f 77 65 72 20 61 20 6c 6f 63 6b 69 6e 67 20  lower a locking 
13300 6c 65 76 65 6c 2e 0a 2a 2a 0a 2a 2a 20 57 69 74  level..**.** Wit
13310 68 20 64 6f 74 66 69 6c 65 20 6c 6f 63 6b 69 6e  h dotfile lockin
13320 67 2c 20 77 65 20 72 65 61 6c 6c 79 20 6f 6e 6c  g, we really onl
13330 79 20 73 75 70 70 6f 72 74 20 73 74 61 74 65 20  y support state 
13340 28 34 29 3a 20 45 58 43 4c 55 53 49 56 45 2e 0a  (4): EXCLUSIVE..
13350 2a 2a 20 42 75 74 20 77 65 20 74 72 61 63 6b 20  ** But we track 
13360 74 68 65 20 6f 74 68 65 72 20 6c 6f 63 6b 69 6e  the other lockin
13370 67 20 6c 65 76 65 6c 73 20 69 6e 74 65 72 6e 61  g levels interna
13380 6c 6c 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  lly..*/.static i
13390 6e 74 20 64 6f 74 6c 6f 63 6b 4c 6f 63 6b 28 73  nt dotlockLock(s
133a0 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c  qlite3_file *id,
133b0 20 69 6e 74 20 65 46 69 6c 65 4c 6f 63 6b 29 20   int eFileLock) 
133c0 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46  {.  unixFile *pF
133d0 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a  ile = (unixFile*
133e0 29 69 64 3b 0a 20 20 69 6e 74 20 66 64 3b 0a 20  )id;.  int fd;. 
133f0 20 63 68 61 72 20 2a 7a 4c 6f 63 6b 46 69 6c 65   char *zLockFile
13400 20 3d 20 28 63 68 61 72 20 2a 29 70 46 69 6c 65   = (char *)pFile
13410 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  ->lockingContext
13420 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  ;.  int rc = SQL
13430 49 54 45 5f 4f 4b 3b 0a 0a 0a 20 20 2f 2a 20 49  ITE_OK;...  /* I
13440 66 20 77 65 20 68 61 76 65 20 61 6e 79 20 6c 6f  f we have any lo
13450 63 6b 2c 20 74 68 65 6e 20 74 68 65 20 6c 6f 63  ck, then the loc
13460 6b 20 66 69 6c 65 20 61 6c 72 65 61 64 79 20 65  k file already e
13470 78 69 73 74 73 2e 20 20 41 6c 6c 20 77 65 20 68  xists.  All we h
13480 61 76 65 0a 20 20 2a 2a 20 74 6f 20 64 6f 20 69  ave.  ** to do i
13490 73 20 61 64 6a 75 73 74 20 6f 75 72 20 69 6e 74  s adjust our int
134a0 65 72 6e 61 6c 20 72 65 63 6f 72 64 20 6f 66 20  ernal record of 
134b0 74 68 65 20 6c 6f 63 6b 20 6c 65 76 65 6c 2e 0a  the lock level..
134c0 20 20 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c 65    */.  if( pFile
134d0 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3e 20 4e 4f  ->eFileLock > NO
134e0 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 70 46 69  _LOCK ){.    pFi
134f0 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20  le->eFileLock = 
13500 65 46 69 6c 65 4c 6f 63 6b 3b 0a 20 20 20 20 2f  eFileLock;.    /
13510 2a 20 41 6c 77 61 79 73 20 75 70 64 61 74 65 20  * Always update 
13520 74 68 65 20 74 69 6d 65 73 74 61 6d 70 20 6f 6e  the timestamp on
13530 20 74 68 65 20 6f 6c 64 20 66 69 6c 65 20 2a 2f   the old file */
13540 0a 23 69 66 64 65 66 20 48 41 56 45 5f 55 54 49  .#ifdef HAVE_UTI
13550 4d 45 0a 20 20 20 20 75 74 69 6d 65 28 7a 4c 6f  ME.    utime(zLo
13560 63 6b 46 69 6c 65 2c 20 4e 55 4c 4c 29 3b 0a 23  ckFile, NULL);.#
13570 65 6c 73 65 0a 20 20 20 20 75 74 69 6d 65 73 28  else.    utimes(
13580 7a 4c 6f 63 6b 46 69 6c 65 2c 20 4e 55 4c 4c 29  zLockFile, NULL)
13590 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 72 65 74  ;.#endif.    ret
135a0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
135b0 20 7d 0a 20 20 0a 20 20 2f 2a 20 67 72 61 62 20   }.  .  /* grab 
135c0 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63  an exclusive loc
135d0 6b 20 2a 2f 0a 20 20 66 64 20 3d 20 72 6f 62 75  k */.  fd = robu
135e0 73 74 5f 6f 70 65 6e 28 7a 4c 6f 63 6b 46 69 6c  st_open(zLockFil
135f0 65 2c 4f 5f 52 44 4f 4e 4c 59 7c 4f 5f 43 52 45  e,O_RDONLY|O_CRE
13600 41 54 7c 4f 5f 45 58 43 4c 2c 30 36 30 30 29 3b  AT|O_EXCL,0600);
13610 0a 20 20 69 66 28 20 66 64 3c 30 20 29 7b 0a 20  .  if( fd<0 ){. 
13620 20 20 20 2f 2a 20 66 61 69 6c 65 64 20 74 6f 20     /* failed to 
13630 6f 70 65 6e 2f 63 72 65 61 74 65 20 74 68 65 20  open/create the 
13640 66 69 6c 65 2c 20 73 6f 6d 65 6f 6e 65 20 65 6c  file, someone el
13650 73 65 20 6d 61 79 20 68 61 76 65 20 73 74 6f 6c  se may have stol
13660 65 6e 20 74 68 65 20 6c 6f 63 6b 20 2a 2f 0a 20  en the lock */. 
13670 20 20 20 69 6e 74 20 74 45 72 72 6e 6f 20 3d 20     int tErrno = 
13680 65 72 72 6e 6f 3b 0a 20 20 20 20 69 66 28 20 45  errno;.    if( E
13690 45 58 49 53 54 20 3d 3d 20 74 45 72 72 6e 6f 20  EXIST == tErrno 
136a0 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  ){.      rc = SQ
136b0 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 7d  LITE_BUSY;.    }
136c0 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 72 63   else {.      rc
136d0 20 3d 20 73 71 6c 69 74 65 45 72 72 6f 72 46 72   = sqliteErrorFr
136e0 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28 74 45 72  omPosixError(tEr
136f0 72 6e 6f 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52  rno, SQLITE_IOER
13700 52 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 69  R_LOCK);.      i
13710 66 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52  f( IS_LOCK_ERROR
13720 28 72 63 29 20 29 7b 0a 20 20 20 20 20 20 20 20  (rc) ){.        
13730 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f  pFile->lastErrno
13740 20 3d 20 74 45 72 72 6e 6f 3b 0a 20 20 20 20 20   = tErrno;.     
13750 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74   }.    }.    ret
13760 75 72 6e 20 72 63 3b 0a 20 20 7d 20 0a 23 69 66  urn rc;.  } .#if
13770 20 4f 53 43 4c 4f 53 45 5f 43 48 45 43 4b 5f 43   OSCLOSE_CHECK_C
13780 4c 4f 53 45 5f 49 4f 45 52 52 0a 20 20 69 66 28  LOSE_IOERR.  if(
13790 20 63 6c 6f 73 65 28 66 64 29 20 29 7b 0a 20 20   close(fd) ){.  
137a0 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72    pFile->lastErr
137b0 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20  no = errno;.    
137c0 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52  rc = SQLITE_IOER
137d0 52 5f 43 4c 4f 53 45 3b 0a 20 20 7d 0a 23 65 6c  R_CLOSE;.  }.#el
137e0 73 65 0a 20 20 72 6f 62 75 73 74 5f 63 6c 6f 73  se.  robust_clos
137f0 65 28 70 46 69 6c 65 2c 20 66 64 2c 20 5f 5f 4c  e(pFile, fd, __L
13800 49 4e 45 5f 5f 29 3b 0a 23 65 6e 64 69 66 0a 20  INE__);.#endif. 
13810 20 0a 20 20 2f 2a 20 67 6f 74 20 69 74 2c 20 73   .  /* got it, s
13820 65 74 20 74 68 65 20 74 79 70 65 20 61 6e 64 20  et the type and 
13830 72 65 74 75 72 6e 20 6f 6b 20 2a 2f 0a 20 20 70  return ok */.  p
13840 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20  File->eFileLock 
13850 3d 20 65 46 69 6c 65 4c 6f 63 6b 3b 0a 20 20 72  = eFileLock;.  r
13860 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
13870 2a 2a 20 4c 6f 77 65 72 20 74 68 65 20 6c 6f 63  ** Lower the loc
13880 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 6e 20 66 69  king level on fi
13890 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 70 46  le descriptor pF
138a0 69 6c 65 20 74 6f 20 65 46 69 6c 65 4c 6f 63 6b  ile to eFileLock
138b0 2e 20 20 65 46 69 6c 65 4c 6f 63 6b 0a 2a 2a 20  .  eFileLock.** 
138c0 6d 75 73 74 20 62 65 20 65 69 74 68 65 72 20 4e  must be either N
138d0 4f 5f 4c 4f 43 4b 20 6f 72 20 53 48 41 52 45 44  O_LOCK or SHARED
138e0 5f 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  _LOCK..**.** If 
138f0 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65  the locking leve
13900 6c 20 6f 66 20 74 68 65 20 66 69 6c 65 20 64 65  l of the file de
13910 73 63 72 69 70 74 6f 72 20 69 73 20 61 6c 72 65  scriptor is alre
13920 61 64 79 20 61 74 20 6f 72 20 62 65 6c 6f 77 0a  ady at or below.
13930 2a 2a 20 74 68 65 20 72 65 71 75 65 73 74 65 64  ** the requested
13940 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 2c 20   locking level, 
13950 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
13960 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 57  a no-op..**.** W
13970 68 65 6e 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20  hen the locking 
13980 6c 65 76 65 6c 20 72 65 61 63 68 65 73 20 4e 4f  level reaches NO
13990 5f 4c 4f 43 4b 2c 20 64 65 6c 65 74 65 20 74 68  _LOCK, delete th
139a0 65 20 6c 6f 63 6b 20 66 69 6c 65 2e 0a 2a 2f 0a  e lock file..*/.
139b0 73 74 61 74 69 63 20 69 6e 74 20 64 6f 74 6c 6f  static int dotlo
139c0 63 6b 55 6e 6c 6f 63 6b 28 73 71 6c 69 74 65 33  ckUnlock(sqlite3
139d0 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 65  _file *id, int e
139e0 46 69 6c 65 4c 6f 63 6b 29 20 7b 0a 20 20 75 6e  FileLock) {.  un
139f0 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20  ixFile *pFile = 
13a00 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20  (unixFile*)id;. 
13a10 20 63 68 61 72 20 2a 7a 4c 6f 63 6b 46 69 6c 65   char *zLockFile
13a20 20 3d 20 28 63 68 61 72 20 2a 29 70 46 69 6c 65   = (char *)pFile
13a30 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  ->lockingContext
13a40 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 46 69  ;..  assert( pFi
13a50 6c 65 20 29 3b 0a 20 20 4f 53 54 52 41 43 45 28  le );.  OSTRACE(
13a60 28 22 55 4e 4c 4f 43 4b 20 20 25 64 20 25 64 20  ("UNLOCK  %d %d 
13a70 77 61 73 20 25 64 20 70 69 64 3d 25 64 20 28 64  was %d pid=%d (d
13a80 6f 74 6c 6f 63 6b 29 5c 6e 22 2c 20 70 46 69 6c  otlock)\n", pFil
13a90 65 2d 3e 68 2c 20 65 46 69 6c 65 4c 6f 63 6b 2c  e->h, eFileLock,
13aa0 0a 09 20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c  ..   pFile->eFil
13ab0 65 4c 6f 63 6b 2c 20 67 65 74 70 69 64 28 29 29  eLock, getpid())
13ac0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 65 46 69  );.  assert( eFi
13ad0 6c 65 4c 6f 63 6b 3c 3d 53 48 41 52 45 44 5f 4c  leLock<=SHARED_L
13ae0 4f 43 4b 20 29 3b 0a 20 20 0a 20 20 2f 2a 20 6e  OCK );.  .  /* n
13af0 6f 2d 6f 70 20 69 66 20 70 6f 73 73 69 62 6c 65  o-op if possible
13b00 20 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c 65 2d   */.  if( pFile-
13b10 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d 65 46 69 6c  >eFileLock==eFil
13b20 65 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 72 65 74  eLock ){.    ret
13b30 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
13b40 20 7d 0a 0a 20 20 2f 2a 20 54 6f 20 64 6f 77 6e   }..  /* To down
13b50 67 72 61 64 65 20 74 6f 20 73 68 61 72 65 64 2c  grade to shared,
13b60 20 73 69 6d 70 6c 79 20 75 70 64 61 74 65 20 6f   simply update o
13b70 75 72 20 69 6e 74 65 72 6e 61 6c 20 6e 6f 74 69  ur internal noti
13b80 6f 6e 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20 6c  on of the.  ** l
13b90 6f 63 6b 20 73 74 61 74 65 2e 20 20 4e 6f 20 6e  ock state.  No n
13ba0 65 65 64 20 74 6f 20 6d 65 73 73 20 77 69 74 68  eed to mess with
13bb0 20 74 68 65 20 66 69 6c 65 20 6f 6e 20 64 69 73   the file on dis
13bc0 6b 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65 46  k..  */.  if( eF
13bd0 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f  ileLock==SHARED_
13be0 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 70 46 69 6c  LOCK ){.    pFil
13bf0 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 53  e->eFileLock = S
13c00 48 41 52 45 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20  HARED_LOCK;.    
13c10 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
13c20 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 54 6f  ;.  }.  .  /* To
13c30 20 66 75 6c 6c 79 20 75 6e 6c 6f 63 6b 20 74 68   fully unlock th
13c40 65 20 64 61 74 61 62 61 73 65 2c 20 64 65 6c 65  e database, dele
13c50 74 65 20 74 68 65 20 6c 6f 63 6b 20 66 69 6c 65  te the lock file
13c60 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 65 46   */.  assert( eF
13c70 69 6c 65 4c 6f 63 6b 3d 3d 4e 4f 5f 4c 4f 43 4b  ileLock==NO_LOCK
13c80 20 29 3b 0a 20 20 69 66 28 20 6f 73 55 6e 6c 69   );.  if( osUnli
13c90 6e 6b 28 7a 4c 6f 63 6b 46 69 6c 65 29 20 29 7b  nk(zLockFile) ){
13ca0 0a 20 20 20 20 69 6e 74 20 72 63 20 3d 20 30 3b  .    int rc = 0;
13cb0 0a 20 20 20 20 69 6e 74 20 74 45 72 72 6e 6f 20  .    int tErrno 
13cc0 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 69 66 28  = errno;.    if(
13cd0 20 45 4e 4f 45 4e 54 20 21 3d 20 74 45 72 72 6e   ENOENT != tErrn
13ce0 6f 20 29 7b 0a 23 69 66 20 4f 53 4c 4f 43 4b 49  o ){.#if OSLOCKI
13cf0 4e 47 5f 43 48 45 43 4b 5f 42 55 53 59 5f 49 4f  NG_CHECK_BUSY_IO
13d00 45 52 52 0a 20 20 20 20 20 20 72 63 20 3d 20 73  ERR.      rc = s
13d10 71 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d 50 6f  qliteErrorFromPo
13d20 73 69 78 45 72 72 6f 72 28 74 45 72 72 6e 6f 2c  sixError(tErrno,
13d30 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55 4e   SQLITE_IOERR_UN
13d40 4c 4f 43 4b 29 3b 0a 23 65 6c 73 65 0a 20 20 20  LOCK);.#else.   
13d50 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49     rc = SQLITE_I
13d60 4f 45 52 52 5f 55 4e 4c 4f 43 4b 3b 0a 23 65 6e  OERR_UNLOCK;.#en
13d70 64 69 66 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  dif.    }.    if
13d80 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28  ( IS_LOCK_ERROR(
13d90 72 63 29 20 29 7b 0a 20 20 20 20 20 20 70 46 69  rc) ){.      pFi
13da0 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20  le->lastErrno = 
13db0 74 45 72 72 6e 6f 3b 0a 20 20 20 20 7d 0a 20 20  tErrno;.    }.  
13dc0 20 20 72 65 74 75 72 6e 20 72 63 3b 20 0a 20 20    return rc; .  
13dd0 7d 0a 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65  }.  pFile->eFile
13de0 4c 6f 63 6b 20 3d 20 4e 4f 5f 4c 4f 43 4b 3b 0a  Lock = NO_LOCK;.
13df0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
13e00 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f  OK;.}../*.** Clo
13e10 73 65 20 61 20 66 69 6c 65 2e 20 20 4d 61 6b 65  se a file.  Make
13e20 20 73 75 72 65 20 74 68 65 20 6c 6f 63 6b 20 68   sure the lock h
13e30 61 73 20 62 65 65 6e 20 72 65 6c 65 61 73 65 64  as been released
13e40 20 62 65 66 6f 72 65 20 63 6c 6f 73 69 6e 67 2e   before closing.
13e50 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 64  .*/.static int d
13e60 6f 74 6c 6f 63 6b 43 6c 6f 73 65 28 73 71 6c 69  otlockClose(sqli
13e70 74 65 33 5f 66 69 6c 65 20 2a 69 64 29 20 7b 0a  te3_file *id) {.
13e80 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 66 28 20    int rc;.  if( 
13e90 69 64 20 29 7b 0a 20 20 20 20 75 6e 69 78 46 69  id ){.    unixFi
13ea0 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69  le *pFile = (uni
13eb0 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 20 20 64  xFile*)id;.    d
13ec0 6f 74 6c 6f 63 6b 55 6e 6c 6f 63 6b 28 69 64 2c  otlockUnlock(id,
13ed0 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 73   NO_LOCK);.    s
13ee0 71 6c 69 74 65 33 5f 66 72 65 65 28 70 46 69 6c  qlite3_free(pFil
13ef0 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78  e->lockingContex
13f00 74 29 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 63  t);.  }.  rc = c
13f10 6c 6f 73 65 55 6e 69 78 46 69 6c 65 28 69 64 29  loseUnixFile(id)
13f20 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
13f30 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ./**************
13f40 2a 2a 2a 2a 20 45 6e 64 20 6f 66 20 74 68 65 20  **** End of the 
13f50 64 6f 74 2d 66 69 6c 65 20 6c 6f 63 6b 20 69 6d  dot-file lock im
13f60 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 2a 2a 2a  plementation ***
13f70 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13f80 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .***************
13f90 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13fa0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13fb0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13fc0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f  ***************/
13fd0 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ../*************
13fe0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13ff0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14000 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14010 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14020 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  *.**************
14030 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 42 65 67  ************ Beg
14040 69 6e 20 66 6c 6f 63 6b 20 4c 6f 63 6b 69 6e 67  in flock Locking
14050 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a   ***************
14060 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14070 2a 0a 2a 2a 0a 2a 2a 20 55 73 65 20 74 68 65 20  *.**.** Use the 
14080 66 6c 6f 63 6b 28 29 20 73 79 73 74 65 6d 20 63  flock() system c
14090 61 6c 6c 20 74 6f 20 64 6f 20 66 69 6c 65 20 6c  all to do file l
140a0 6f 63 6b 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 66 6c  ocking..**.** fl
140b0 6f 63 6b 28 29 20 6c 6f 63 6b 69 6e 67 20 69 73  ock() locking is
140c0 20 6c 69 6b 65 20 64 6f 74 2d 66 69 6c 65 20 6c   like dot-file l
140d0 6f 63 6b 69 6e 67 20 69 6e 20 74 68 61 74 20 74  ocking in that t
140e0 68 65 20 76 61 72 69 6f 75 73 0a 2a 2a 20 66 69  he various.** fi
140f0 6e 65 2d 67 72 61 69 6e 20 6c 6f 63 6b 69 6e 67  ne-grain locking
14100 20 6c 65 76 65 6c 73 20 73 75 70 70 6f 72 74 65   levels supporte
14110 64 20 62 79 20 53 51 4c 69 74 65 20 61 72 65 20  d by SQLite are 
14120 63 6f 6c 6c 61 70 73 65 64 20 69 6e 74 6f 0a 2a  collapsed into.*
14130 2a 20 61 20 73 69 6e 67 6c 65 20 65 78 63 6c 75  * a single exclu
14140 73 69 76 65 20 6c 6f 63 6b 2e 20 20 49 6e 20 6f  sive lock.  In o
14150 74 68 65 72 20 77 6f 72 64 73 2c 20 53 48 41 52  ther words, SHAR
14160 45 44 2c 20 52 45 53 45 52 56 45 44 2c 20 61 6e  ED, RESERVED, an
14170 64 0a 2a 2a 20 50 45 4e 44 49 4e 47 20 6c 6f 63  d.** PENDING loc
14180 6b 73 20 61 72 65 20 74 68 65 20 73 61 6d 65 20  ks are the same 
14190 74 68 69 6e 67 20 61 73 20 61 6e 20 45 58 43 4c  thing as an EXCL
141a0 55 53 49 56 45 20 6c 6f 63 6b 2e 20 20 53 51 4c  USIVE lock.  SQL
141b0 69 74 65 0a 2a 2a 20 73 74 69 6c 6c 20 77 6f 72  ite.** still wor
141c0 6b 73 20 77 68 65 6e 20 79 6f 75 20 64 6f 20 74  ks when you do t
141d0 68 69 73 2c 20 62 75 74 20 63 6f 6e 63 75 72 72  his, but concurr
141e0 65 6e 63 79 20 69 73 20 72 65 64 75 63 65 64 20  ency is reduced 
141f0 73 69 6e 63 65 0a 2a 2a 20 6f 6e 6c 79 20 61 20  since.** only a 
14200 73 69 6e 67 6c 65 20 70 72 6f 63 65 73 73 20 63  single process c
14210 61 6e 20 62 65 20 72 65 61 64 69 6e 67 20 74 68  an be reading th
14220 65 20 64 61 74 61 62 61 73 65 20 61 74 20 61 20  e database at a 
14230 74 69 6d 65 2e 0a 2a 2a 0a 2a 2a 20 4f 6d 69 74  time..**.** Omit
14240 20 74 68 69 73 20 73 65 63 74 69 6f 6e 20 69 66   this section if
14250 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c   SQLITE_ENABLE_L
14260 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 69 73 20  OCKING_STYLE is 
14270 74 75 72 6e 65 64 20 6f 66 66 20 6f 72 20 69 66  turned off or if
14280 0a 2a 2a 20 63 6f 6d 70 69 6c 69 6e 67 20 66 6f  .** compiling fo
14290 72 20 56 58 57 4f 52 4b 53 2e 0a 2a 2f 0a 23 69  r VXWORKS..*/.#i
142a0 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
142b0 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 26 26  LOCKING_STYLE &&
142c0 20 21 4f 53 5f 56 58 57 4f 52 4b 53 0a 0a 2f 2a   !OS_VXWORKS../*
142d0 0a 2a 2a 20 52 65 74 72 79 20 66 6c 6f 63 6b 28  .** Retry flock(
142e0 29 20 63 61 6c 6c 73 20 74 68 61 74 20 66 61 69  ) calls that fai
142f0 6c 20 77 69 74 68 20 45 49 4e 54 52 0a 2a 2f 0a  l with EINTR.*/.
14300 23 69 66 64 65 66 20 45 49 4e 54 52 0a 73 74 61  #ifdef EINTR.sta
14310 74 69 63 20 69 6e 74 20 72 6f 62 75 73 74 5f 66  tic int robust_f
14320 6c 6f 63 6b 28 69 6e 74 20 66 64 2c 20 69 6e 74  lock(int fd, int
14330 20 6f 70 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a   op){.  int rc;.
14340 20 20 64 6f 7b 20 72 63 20 3d 20 66 6c 6f 63 6b    do{ rc = flock
14350 28 66 64 2c 6f 70 29 3b 20 7d 77 68 69 6c 65 28  (fd,op); }while(
14360 20 72 63 3c 30 20 26 26 20 65 72 72 6e 6f 3d 3d   rc<0 && errno==
14370 45 49 4e 54 52 20 29 3b 0a 20 20 72 65 74 75 72  EINTR );.  retur
14380 6e 20 72 63 3b 0a 7d 0a 23 65 6c 73 65 0a 23 20  n rc;.}.#else.# 
14390 64 65 66 69 6e 65 20 72 6f 62 75 73 74 5f 66 6c  define robust_fl
143a0 6f 63 6b 28 61 2c 62 29 20 66 6c 6f 63 6b 28 61  ock(a,b) flock(a
143b0 2c 62 29 0a 23 65 6e 64 69 66 0a 20 20 20 20 20  ,b).#endif.     
143c0 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
143d0 74 69 6e 65 20 63 68 65 63 6b 73 20 69 66 20 74  tine checks if t
143e0 68 65 72 65 20 69 73 20 61 20 52 45 53 45 52 56  here is a RESERV
143f0 45 44 20 6c 6f 63 6b 20 68 65 6c 64 20 6f 6e 20  ED lock held on 
14400 74 68 65 20 73 70 65 63 69 66 69 65 64 0a 2a 2a  the specified.**
14410 20 66 69 6c 65 20 62 79 20 74 68 69 73 20 6f 72   file by this or
14420 20 61 6e 79 20 6f 74 68 65 72 20 70 72 6f 63 65   any other proce
14430 73 73 2e 20 49 66 20 73 75 63 68 20 61 20 6c 6f  ss. If such a lo
14440 63 6b 20 69 73 20 68 65 6c 64 2c 20 73 65 74 20  ck is held, set 
14450 2a 70 52 65 73 4f 75 74 0a 2a 2a 20 74 6f 20 61  *pResOut.** to a
14460 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75 65 20   non-zero value 
14470 6f 74 68 65 72 77 69 73 65 20 2a 70 52 65 73 4f  otherwise *pResO
14480 75 74 20 69 73 20 73 65 74 20 74 6f 20 7a 65 72  ut is set to zer
14490 6f 2e 20 20 54 68 65 20 72 65 74 75 72 6e 20 76  o.  The return v
144a0 61 6c 75 65 0a 2a 2a 20 69 73 20 73 65 74 20 74  alue.** is set t
144b0 6f 20 53 51 4c 49 54 45 5f 4f 4b 20 75 6e 6c 65  o SQLITE_OK unle
144c0 73 73 20 61 6e 20 49 2f 4f 20 65 72 72 6f 72 20  ss an I/O error 
144d0 6f 63 63 75 72 73 20 64 75 72 69 6e 67 20 6c 6f  occurs during lo
144e0 63 6b 20 63 68 65 63 6b 69 6e 67 2e 0a 2a 2f 0a  ck checking..*/.
144f0 73 74 61 74 69 63 20 69 6e 74 20 66 6c 6f 63 6b  static int flock
14500 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63  CheckReservedLoc
14510 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  k(sqlite3_file *
14520 69 64 2c 20 69 6e 74 20 2a 70 52 65 73 4f 75 74  id, int *pResOut
14530 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
14540 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 72  LITE_OK;.  int r
14550 65 73 65 72 76 65 64 20 3d 20 30 3b 0a 20 20 75  eserved = 0;.  u
14560 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d  nixFile *pFile =
14570 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a   (unixFile*)id;.
14580 20 20 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45    .  SimulateIOE
14590 72 72 6f 72 28 20 72 65 74 75 72 6e 20 53 51 4c  rror( return SQL
145a0 49 54 45 5f 49 4f 45 52 52 5f 43 48 45 43 4b 52  ITE_IOERR_CHECKR
145b0 45 53 45 52 56 45 44 4c 4f 43 4b 3b 20 29 3b 0a  ESERVEDLOCK; );.
145c0 20 20 0a 20 20 61 73 73 65 72 74 28 20 70 46 69    .  assert( pFi
145d0 6c 65 20 29 3b 0a 20 20 0a 20 20 2f 2a 20 43 68  le );.  .  /* Ch
145e0 65 63 6b 20 69 66 20 61 20 74 68 72 65 61 64 20  eck if a thread 
145f0 69 6e 20 74 68 69 73 20 70 72 6f 63 65 73 73 20  in this process 
14600 68 6f 6c 64 73 20 73 75 63 68 20 61 20 6c 6f 63  holds such a loc
14610 6b 20 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c 65  k */.  if( pFile
14620 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3e 53 48 41 52  ->eFileLock>SHAR
14630 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 72  ED_LOCK ){.    r
14640 65 73 65 72 76 65 64 20 3d 20 31 3b 0a 20 20 7d  eserved = 1;.  }
14650 0a 20 20 0a 20 20 2f 2a 20 4f 74 68 65 72 77 69  .  .  /* Otherwi
14660 73 65 20 73 65 65 20 69 66 20 73 6f 6d 65 20 6f  se see if some o
14670 74 68 65 72 20 70 72 6f 63 65 73 73 20 68 6f 6c  ther process hol
14680 64 73 20 69 74 2e 20 2a 2f 0a 20 20 69 66 28 20  ds it. */.  if( 
14690 21 72 65 73 65 72 76 65 64 20 29 7b 0a 20 20 20  !reserved ){.   
146a0 20 2f 2a 20 61 74 74 65 6d 70 74 20 74 6f 20 67   /* attempt to g
146b0 65 74 20 74 68 65 20 6c 6f 63 6b 20 2a 2f 0a 20  et the lock */. 
146c0 20 20 20 69 6e 74 20 6c 72 63 20 3d 20 72 6f 62     int lrc = rob
146d0 75 73 74 5f 66 6c 6f 63 6b 28 70 46 69 6c 65 2d  ust_flock(pFile-
146e0 3e 68 2c 20 4c 4f 43 4b 5f 45 58 20 7c 20 4c 4f  >h, LOCK_EX | LO
146f0 43 4b 5f 4e 42 29 3b 0a 20 20 20 20 69 66 28 20  CK_NB);.    if( 
14700 21 6c 72 63 20 29 7b 0a 20 20 20 20 20 20 2f 2a  !lrc ){.      /*
14710 20 67 6f 74 20 74 68 65 20 6c 6f 63 6b 2c 20 75   got the lock, u
14720 6e 6c 6f 63 6b 20 69 74 20 2a 2f 0a 20 20 20 20  nlock it */.    
14730 20 20 6c 72 63 20 3d 20 72 6f 62 75 73 74 5f 66    lrc = robust_f
14740 6c 6f 63 6b 28 70 46 69 6c 65 2d 3e 68 2c 20 4c  lock(pFile->h, L
14750 4f 43 4b 5f 55 4e 29 3b 0a 20 20 20 20 20 20 69  OCK_UN);.      i
14760 66 20 28 20 6c 72 63 20 29 20 7b 0a 20 20 20 20  f ( lrc ) {.    
14770 20 20 20 20 69 6e 74 20 74 45 72 72 6e 6f 20 3d      int tErrno =
14780 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20 20 20   errno;.        
14790 2f 2a 20 75 6e 6c 6f 63 6b 20 66 61 69 6c 65 64  /* unlock failed
147a0 20 77 69 74 68 20 61 6e 20 65 72 72 6f 72 20 2a   with an error *
147b0 2f 0a 23 69 66 20 4f 53 4c 4f 43 4b 49 4e 47 5f  /.#if OSLOCKING_
147c0 43 48 45 43 4b 5f 42 55 53 59 5f 49 4f 45 52 52  CHECK_BUSY_IOERR
147d0 0a 20 20 20 20 20 20 20 20 6c 72 63 20 3d 20 73  .        lrc = s
147e0 71 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d 50 6f  qliteErrorFromPo
147f0 73 69 78 45 72 72 6f 72 28 74 45 72 72 6e 6f 2c  sixError(tErrno,
14800 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55 4e   SQLITE_IOERR_UN
14810 4c 4f 43 4b 29 3b 0a 23 65 6c 73 65 20 0a 20 20  LOCK);.#else .  
14820 20 20 20 20 20 20 6c 72 63 20 3d 20 53 51 4c 49        lrc = SQLI
14830 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 3b  TE_IOERR_UNLOCK;
14840 20 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 20   .#endif.       
14850 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52   if( IS_LOCK_ERR
14860 4f 52 28 6c 72 63 29 20 29 7b 0a 20 20 20 20 20  OR(lrc) ){.     
14870 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74       pFile->last
14880 45 72 72 6e 6f 20 3d 20 74 45 72 72 6e 6f 3b 0a  Errno = tErrno;.
14890 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 6c            rc = l
148a0 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  rc;.        }.  
148b0 20 20 20 20 7d 0a 20 20 20 20 7d 20 65 6c 73 65      }.    } else
148c0 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 74 45 72   {.      int tEr
148d0 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20  rno = errno;.   
148e0 20 20 20 72 65 73 65 72 76 65 64 20 3d 20 31 3b     reserved = 1;
148f0 0a 20 20 20 20 20 20 2f 2a 20 73 6f 6d 65 6f 6e  .      /* someon
14900 65 20 65 6c 73 65 20 6d 69 67 68 74 20 68 61 76  e else might hav
14910 65 20 69 74 20 72 65 73 65 72 76 65 64 20 2a 2f  e it reserved */
14920 0a 20 20 20 20 20 20 6c 72 63 20 3d 20 73 71 6c  .      lrc = sql
14930 69 74 65 45 72 72 6f 72 46 72 6f 6d 50 6f 73 69  iteErrorFromPosi
14940 78 45 72 72 6f 72 28 74 45 72 72 6e 6f 2c 20 53  xError(tErrno, S
14950 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b  QLITE_IOERR_LOCK
14960 29 3b 20 0a 20 20 20 20 20 20 69 66 28 20 49 53  ); .      if( IS
14970 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 6c 72 63 29  _LOCK_ERROR(lrc)
14980 20 29 7b 0a 20 20 20 20 20 20 20 20 70 46 69 6c   ){.        pFil
14990 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 74  e->lastErrno = t
149a0 45 72 72 6e 6f 3b 0a 20 20 20 20 20 20 20 20 72  Errno;.        r
149b0 63 20 3d 20 6c 72 63 3b 0a 20 20 20 20 20 20 7d  c = lrc;.      }
149c0 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 4f 53 54  .    }.  }.  OST
149d0 52 41 43 45 28 28 22 54 45 53 54 20 57 52 2d 4c  RACE(("TEST WR-L
149e0 4f 43 4b 20 25 64 20 25 64 20 25 64 20 28 66 6c  OCK %d %d %d (fl
149f0 6f 63 6b 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e  ock)\n", pFile->
14a00 68 2c 20 72 63 2c 20 72 65 73 65 72 76 65 64 29  h, rc, reserved)
14a10 29 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  );..#ifdef SQLIT
14a20 45 5f 49 47 4e 4f 52 45 5f 46 4c 4f 43 4b 5f 4c  E_IGNORE_FLOCK_L
14a30 4f 43 4b 5f 45 52 52 4f 52 53 0a 20 20 69 66 28  OCK_ERRORS.  if(
14a40 20 28 72 63 20 26 20 53 51 4c 49 54 45 5f 49 4f   (rc & SQLITE_IO
14a50 45 52 52 29 20 3d 3d 20 53 51 4c 49 54 45 5f 49  ERR) == SQLITE_I
14a60 4f 45 52 52 20 29 7b 0a 20 20 20 20 72 63 20 3d  OERR ){.    rc =
14a70 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
14a80 72 65 73 65 72 76 65 64 3d 31 3b 0a 20 20 7d 0a  reserved=1;.  }.
14a90 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
14aa0 5f 49 47 4e 4f 52 45 5f 46 4c 4f 43 4b 5f 4c 4f  _IGNORE_FLOCK_LO
14ab0 43 4b 5f 45 52 52 4f 52 53 20 2a 2f 0a 20 20 2a  CK_ERRORS */.  *
14ac0 70 52 65 73 4f 75 74 20 3d 20 72 65 73 65 72 76  pResOut = reserv
14ad0 65 64 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  ed;.  return rc;
14ae0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 6b 20 74  .}../*.** Lock t
14af0 68 65 20 66 69 6c 65 20 77 69 74 68 20 74 68 65  he file with the
14b00 20 6c 6f 63 6b 20 73 70 65 63 69 66 69 65 64 20   lock specified 
14b10 62 79 20 70 61 72 61 6d 65 74 65 72 20 65 46 69  by parameter eFi
14b20 6c 65 4c 6f 63 6b 20 2d 20 6f 6e 65 0a 2a 2a 20  leLock - one.** 
14b30 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  of the following
14b40 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28 31 29 20  :.**.**     (1) 
14b50 53 48 41 52 45 44 5f 4c 4f 43 4b 0a 2a 2a 20 20  SHARED_LOCK.**  
14b60 20 20 20 28 32 29 20 52 45 53 45 52 56 45 44 5f     (2) RESERVED_
14b70 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 33 29 20  LOCK.**     (3) 
14b80 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 0a 2a 2a 20  PENDING_LOCK.** 
14b90 20 20 20 20 28 34 29 20 45 58 43 4c 55 53 49 56      (4) EXCLUSIV
14ba0 45 5f 4c 4f 43 4b 0a 2a 2a 0a 2a 2a 20 53 6f 6d  E_LOCK.**.** Som
14bb0 65 74 69 6d 65 73 20 77 68 65 6e 20 72 65 71 75  etimes when requ
14bc0 65 73 74 69 6e 67 20 6f 6e 65 20 6c 6f 63 6b 20  esting one lock 
14bd0 73 74 61 74 65 2c 20 61 64 64 69 74 69 6f 6e 61  state, additiona
14be0 6c 20 6c 6f 63 6b 20 73 74 61 74 65 73 0a 2a 2a  l lock states.**
14bf0 20 61 72 65 20 69 6e 73 65 72 74 65 64 20 69 6e   are inserted in
14c00 20 62 65 74 77 65 65 6e 2e 20 20 54 68 65 20 6c   between.  The l
14c10 6f 63 6b 69 6e 67 20 6d 69 67 68 74 20 66 61 69  ocking might fai
14c20 6c 20 6f 6e 20 6f 6e 65 20 6f 66 20 74 68 65 20  l on one of the 
14c30 6c 61 74 65 72 0a 2a 2a 20 74 72 61 6e 73 69 74  later.** transit
14c40 69 6f 6e 73 20 6c 65 61 76 69 6e 67 20 74 68 65  ions leaving the
14c50 20 6c 6f 63 6b 20 73 74 61 74 65 20 64 69 66 66   lock state diff
14c60 65 72 65 6e 74 20 66 72 6f 6d 20 77 68 61 74 20  erent from what 
14c70 69 74 20 73 74 61 72 74 65 64 20 62 75 74 0a 2a  it started but.*
14c80 2a 20 73 74 69 6c 6c 20 73 68 6f 72 74 20 6f 66  * still short of
14c90 20 69 74 73 20 67 6f 61 6c 2e 20 20 54 68 65 20   its goal.  The 
14ca0 66 6f 6c 6c 6f 77 69 6e 67 20 63 68 61 72 74 20  following chart 
14cb0 73 68 6f 77 73 20 74 68 65 20 61 6c 6c 6f 77 65  shows the allowe
14cc0 64 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e 73  d.** transitions
14cd0 20 61 6e 64 20 74 68 65 20 69 6e 73 65 72 74 65   and the inserte
14ce0 64 20 69 6e 74 65 72 6d 65 64 69 61 74 65 20 73  d intermediate s
14cf0 74 61 74 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  tates:.**.**    
14d00 55 4e 4c 4f 43 4b 45 44 20 2d 3e 20 53 48 41 52  UNLOCKED -> SHAR
14d10 45 44 0a 2a 2a 20 20 20 20 53 48 41 52 45 44 20  ED.**    SHARED 
14d20 2d 3e 20 52 45 53 45 52 56 45 44 0a 2a 2a 20 20  -> RESERVED.**  
14d30 20 20 53 48 41 52 45 44 20 2d 3e 20 28 50 45 4e    SHARED -> (PEN
14d40 44 49 4e 47 29 20 2d 3e 20 45 58 43 4c 55 53 49  DING) -> EXCLUSI
14d50 56 45 0a 2a 2a 20 20 20 20 52 45 53 45 52 56 45  VE.**    RESERVE
14d60 44 20 2d 3e 20 28 50 45 4e 44 49 4e 47 29 20 2d  D -> (PENDING) -
14d70 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20 20  > EXCLUSIVE.**  
14d80 20 20 50 45 4e 44 49 4e 47 20 2d 3e 20 45 58 43    PENDING -> EXC
14d90 4c 55 53 49 56 45 0a 2a 2a 0a 2a 2a 20 66 6c 6f  LUSIVE.**.** flo
14da0 63 6b 28 29 20 6f 6e 6c 79 20 72 65 61 6c 6c 79  ck() only really
14db0 20 73 75 70 70 6f 72 74 20 45 58 43 4c 55 53 49   support EXCLUSI
14dc0 56 45 20 6c 6f 63 6b 73 2e 20 20 57 65 20 74 72  VE locks.  We tr
14dd0 61 63 6b 20 69 6e 74 65 72 6d 65 64 69 61 74 65  ack intermediate
14de0 0a 2a 2a 20 6c 6f 63 6b 20 73 74 61 74 65 73 20  .** lock states 
14df0 69 6e 20 74 68 65 20 73 71 6c 69 74 65 33 5f 66  in the sqlite3_f
14e00 69 6c 65 20 73 74 72 75 63 74 75 72 65 2c 20 62  ile structure, b
14e10 75 74 20 61 6c 6c 20 6c 6f 63 6b 73 20 53 48 41  ut all locks SHA
14e20 52 45 44 20 6f 72 0a 2a 2a 20 61 62 6f 76 65 20  RED or.** above 
14e30 61 72 65 20 72 65 61 6c 6c 79 20 45 58 43 4c 55  are really EXCLU
14e40 53 49 56 45 20 6c 6f 63 6b 73 20 61 6e 64 20 65  SIVE locks and e
14e50 78 63 6c 75 64 65 20 61 6c 6c 20 6f 74 68 65 72  xclude all other
14e60 20 70 72 6f 63 65 73 73 65 73 20 66 72 6f 6d 0a   processes from.
14e70 2a 2a 20 61 63 63 65 73 73 20 74 68 65 20 66 69  ** access the fi
14e80 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  le..**.** This r
14e90 6f 75 74 69 6e 65 20 77 69 6c 6c 20 6f 6e 6c 79  outine will only
14ea0 20 69 6e 63 72 65 61 73 65 20 61 20 6c 6f 63 6b   increase a lock
14eb0 2e 20 20 55 73 65 20 74 68 65 20 73 71 6c 69 74  .  Use the sqlit
14ec0 65 33 4f 73 55 6e 6c 6f 63 6b 28 29 0a 2a 2a 20  e3OsUnlock().** 
14ed0 72 6f 75 74 69 6e 65 20 74 6f 20 6c 6f 77 65 72  routine to lower
14ee0 20 61 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c   a locking level
14ef0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
14f00 66 6c 6f 63 6b 4c 6f 63 6b 28 73 71 6c 69 74 65  flockLock(sqlite
14f10 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20  3_file *id, int 
14f20 65 46 69 6c 65 4c 6f 63 6b 29 20 7b 0a 20 20 69  eFileLock) {.  i
14f30 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
14f40 4b 3b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70  K;.  unixFile *p
14f50 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65  File = (unixFile
14f60 2a 29 69 64 3b 0a 0a 20 20 61 73 73 65 72 74 28  *)id;..  assert(
14f70 20 70 46 69 6c 65 20 29 3b 0a 0a 20 20 2f 2a 20   pFile );..  /* 
14f80 69 66 20 77 65 20 61 6c 72 65 61 64 79 20 68 61  if we already ha
14f90 76 65 20 61 20 6c 6f 63 6b 2c 20 69 74 20 69 73  ve a lock, it is
14fa0 20 65 78 63 6c 75 73 69 76 65 2e 20 20 0a 20 20   exclusive.  .  
14fb0 2a 2a 20 4a 75 73 74 20 61 64 6a 75 73 74 20 6c  ** Just adjust l
14fc0 65 76 65 6c 20 61 6e 64 20 70 75 6e 74 20 6f 6e  evel and punt on
14fd0 20 6f 75 74 74 61 20 68 65 72 65 2e 20 2a 2f 0a   outta here. */.
14fe0 20 20 69 66 20 28 70 46 69 6c 65 2d 3e 65 46 69    if (pFile->eFi
14ff0 6c 65 4c 6f 63 6b 20 3e 20 4e 4f 5f 4c 4f 43 4b  leLock > NO_LOCK
15000 29 20 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 65  ) {.    pFile->e
15010 46 69 6c 65 4c 6f 63 6b 20 3d 20 65 46 69 6c 65  FileLock = eFile
15020 4c 6f 63 6b 3b 0a 20 20 20 20 72 65 74 75 72 6e  Lock;.    return
15030 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
15040 20 20 0a 20 20 2f 2a 20 67 72 61 62 20 61 6e 20    .  /* grab an 
15050 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20 2a  exclusive lock *
15060 2f 0a 20 20 0a 20 20 69 66 20 28 72 6f 62 75 73  /.  .  if (robus
15070 74 5f 66 6c 6f 63 6b 28 70 46 69 6c 65 2d 3e 68  t_flock(pFile->h
15080 2c 20 4c 4f 43 4b 5f 45 58 20 7c 20 4c 4f 43 4b  , LOCK_EX | LOCK
15090 5f 4e 42 29 29 20 7b 0a 20 20 20 20 69 6e 74 20  _NB)) {.    int 
150a0 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a  tErrno = errno;.
150b0 20 20 20 20 2f 2a 20 64 69 64 6e 27 74 20 67 65      /* didn't ge
150c0 74 2c 20 6d 75 73 74 20 62 65 20 62 75 73 79 20  t, must be busy 
150d0 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  */.    rc = sqli
150e0 74 65 45 72 72 6f 72 46 72 6f 6d 50 6f 73 69 78  teErrorFromPosix
150f0 45 72 72 6f 72 28 74 45 72 72 6e 6f 2c 20 53 51  Error(tErrno, SQ
15100 4c 49 54 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b 29  LITE_IOERR_LOCK)
15110 3b 0a 20 20 20 20 69 66 28 20 49 53 5f 4c 4f 43  ;.    if( IS_LOC
15120 4b 5f 45 52 52 4f 52 28 72 63 29 20 29 7b 0a 20  K_ERROR(rc) ){. 
15130 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74       pFile->last
15140 45 72 72 6e 6f 20 3d 20 74 45 72 72 6e 6f 3b 0a  Errno = tErrno;.
15150 20 20 20 20 7d 0a 20 20 7d 20 65 6c 73 65 20 7b      }.  } else {
15160 0a 20 20 20 20 2f 2a 20 67 6f 74 20 69 74 2c 20  .    /* got it, 
15170 73 65 74 20 74 68 65 20 74 79 70 65 20 61 6e 64  set the type and
15180 20 72 65 74 75 72 6e 20 6f 6b 20 2a 2f 0a 20 20   return ok */.  
15190 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f    pFile->eFileLo
151a0 63 6b 20 3d 20 65 46 69 6c 65 4c 6f 63 6b 3b 0a  ck = eFileLock;.
151b0 20 20 7d 0a 20 20 4f 53 54 52 41 43 45 28 28 22    }.  OSTRACE(("
151c0 4c 4f 43 4b 20 20 20 20 25 64 20 25 73 20 25 73  LOCK    %d %s %s
151d0 20 28 66 6c 6f 63 6b 29 5c 6e 22 2c 20 70 46 69   (flock)\n", pFi
151e0 6c 65 2d 3e 68 2c 20 61 7a 46 69 6c 65 4c 6f 63  le->h, azFileLoc
151f0 6b 28 65 46 69 6c 65 4c 6f 63 6b 29 2c 20 0a 20  k(eFileLock), . 
15200 20 20 20 20 20 20 20 20 20 20 72 63 3d 3d 53 51            rc==SQ
15210 4c 49 54 45 5f 4f 4b 20 3f 20 22 6f 6b 22 20 3a  LITE_OK ? "ok" :
15220 20 22 66 61 69 6c 65 64 22 29 29 3b 0a 23 69 66   "failed"));.#if
15230 64 65 66 20 53 51 4c 49 54 45 5f 49 47 4e 4f 52  def SQLITE_IGNOR
15240 45 5f 46 4c 4f 43 4b 5f 4c 4f 43 4b 5f 45 52 52  E_FLOCK_LOCK_ERR
15250 4f 52 53 0a 20 20 69 66 28 20 28 72 63 20 26 20  ORS.  if( (rc & 
15260 53 51 4c 49 54 45 5f 49 4f 45 52 52 29 20 3d 3d  SQLITE_IOERR) ==
15270 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 20 29 7b   SQLITE_IOERR ){
15280 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
15290 5f 42 55 53 59 3b 0a 20 20 7d 0a 23 65 6e 64 69  _BUSY;.  }.#endi
152a0 66 20 2f 2a 20 53 51 4c 49 54 45 5f 49 47 4e 4f  f /* SQLITE_IGNO
152b0 52 45 5f 46 4c 4f 43 4b 5f 4c 4f 43 4b 5f 45 52  RE_FLOCK_LOCK_ER
152c0 52 4f 52 53 20 2a 2f 0a 20 20 72 65 74 75 72 6e  RORS */.  return
152d0 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 4c   rc;.}.../*.** L
152e0 6f 77 65 72 20 74 68 65 20 6c 6f 63 6b 69 6e 67  ower the locking
152f0 20 6c 65 76 65 6c 20 6f 6e 20 66 69 6c 65 20 64   level on file d
15300 65 73 63 72 69 70 74 6f 72 20 70 46 69 6c 65 20  escriptor pFile 
15310 74 6f 20 65 46 69 6c 65 4c 6f 63 6b 2e 20 20 65  to eFileLock.  e
15320 46 69 6c 65 4c 6f 63 6b 0a 2a 2a 20 6d 75 73 74  FileLock.** must
15330 20 62 65 20 65 69 74 68 65 72 20 4e 4f 5f 4c 4f   be either NO_LO
15340 43 4b 20 6f 72 20 53 48 41 52 45 44 5f 4c 4f 43  CK or SHARED_LOC
15350 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  K..**.** If the 
15360 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 66  locking level of
15370 20 74 68 65 20 66 69 6c 65 20 64 65 73 63 72 69   the file descri
15380 70 74 6f 72 20 69 73 20 61 6c 72 65 61 64 79 20  ptor is already 
15390 61 74 20 6f 72 20 62 65 6c 6f 77 0a 2a 2a 20 74  at or below.** t
153a0 68 65 20 72 65 71 75 65 73 74 65 64 20 6c 6f 63  he requested loc
153b0 6b 69 6e 67 20 6c 65 76 65 6c 2c 20 74 68 69 73  king level, this
153c0 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f   routine is a no
153d0 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  -op..*/.static i
153e0 6e 74 20 66 6c 6f 63 6b 55 6e 6c 6f 63 6b 28 73  nt flockUnlock(s
153f0 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c  qlite3_file *id,
15400 20 69 6e 74 20 65 46 69 6c 65 4c 6f 63 6b 29 20   int eFileLock) 
15410 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46  {.  unixFile *pF
15420 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a  ile = (unixFile*
15430 29 69 64 3b 0a 20 20 0a 20 20 61 73 73 65 72 74  )id;.  .  assert
15440 28 20 70 46 69 6c 65 20 29 3b 0a 20 20 4f 53 54  ( pFile );.  OST
15450 52 41 43 45 28 28 22 55 4e 4c 4f 43 4b 20 20 25  RACE(("UNLOCK  %
15460 64 20 25 64 20 77 61 73 20 25 64 20 70 69 64 3d  d %d was %d pid=
15470 25 64 20 28 66 6c 6f 63 6b 29 5c 6e 22 2c 20 70  %d (flock)\n", p
15480 46 69 6c 65 2d 3e 68 2c 20 65 46 69 6c 65 4c 6f  File->h, eFileLo
15490 63 6b 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70  ck,.           p
154a0 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 2c  File->eFileLock,
154b0 20 67 65 74 70 69 64 28 29 29 29 3b 0a 20 20 61   getpid()));.  a
154c0 73 73 65 72 74 28 20 65 46 69 6c 65 4c 6f 63 6b  ssert( eFileLock
154d0 3c 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b  <=SHARED_LOCK );
154e0 0a 20 20 0a 20 20 2f 2a 20 6e 6f 2d 6f 70 20 69  .  .  /* no-op i
154f0 66 20 70 6f 73 73 69 62 6c 65 20 2a 2f 0a 20 20  f possible */.  
15500 69 66 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65  if( pFile->eFile
15510 4c 6f 63 6b 3d 3d 65 46 69 6c 65 4c 6f 63 6b 20  Lock==eFileLock 
15520 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
15530 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 0a  LITE_OK;.  }.  .
15540 20 20 2f 2a 20 73 68 61 72 65 64 20 63 61 6e 20    /* shared can 
15550 6a 75 73 74 20 62 65 20 73 65 74 20 62 65 63 61  just be set beca
15560 75 73 65 20 77 65 20 61 6c 77 61 79 73 20 68 61  use we always ha
15570 76 65 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20  ve an exclusive 
15580 2a 2f 0a 20 20 69 66 20 28 65 46 69 6c 65 4c 6f  */.  if (eFileLo
15590 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 29  ck==SHARED_LOCK)
155a0 20 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 65 46   {.    pFile->eF
155b0 69 6c 65 4c 6f 63 6b 20 3d 20 65 46 69 6c 65 4c  ileLock = eFileL
155c0 6f 63 6b 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  ock;.    return 
155d0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20  SQLITE_OK;.  }. 
155e0 20 0a 20 20 2f 2a 20 6e 6f 2c 20 72 65 61 6c 6c   .  /* no, reall
155f0 79 2c 20 75 6e 6c 6f 63 6b 2e 20 2a 2f 0a 20 20  y, unlock. */.  
15600 69 66 28 20 72 6f 62 75 73 74 5f 66 6c 6f 63 6b  if( robust_flock
15610 28 70 46 69 6c 65 2d 3e 68 2c 20 4c 4f 43 4b 5f  (pFile->h, LOCK_
15620 55 4e 29 20 29 7b 0a 23 69 66 64 65 66 20 53 51  UN) ){.#ifdef SQ
15630 4c 49 54 45 5f 49 47 4e 4f 52 45 5f 46 4c 4f 43  LITE_IGNORE_FLOC
15640 4b 5f 4c 4f 43 4b 5f 45 52 52 4f 52 53 0a 20 20  K_LOCK_ERRORS.  
15650 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
15660 4f 4b 3b 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  OK;.#endif /* SQ
15670 4c 49 54 45 5f 49 47 4e 4f 52 45 5f 46 4c 4f 43  LITE_IGNORE_FLOC
15680 4b 5f 4c 4f 43 4b 5f 45 52 52 4f 52 53 20 2a 2f  K_LOCK_ERRORS */
15690 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
156a0 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 3b  TE_IOERR_UNLOCK;
156b0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 46  .  }else{.    pF
156c0 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d  ile->eFileLock =
156d0 20 4e 4f 5f 4c 4f 43 4b 3b 0a 20 20 20 20 72 65   NO_LOCK;.    re
156e0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
156f0 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f    }.}../*.** Clo
15700 73 65 20 61 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74  se a file..*/.st
15710 61 74 69 63 20 69 6e 74 20 66 6c 6f 63 6b 43 6c  atic int flockCl
15720 6f 73 65 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  ose(sqlite3_file
15730 20 2a 69 64 29 20 7b 0a 20 20 69 66 28 20 69 64   *id) {.  if( id
15740 20 29 7b 0a 20 20 20 20 66 6c 6f 63 6b 55 6e 6c   ){.    flockUnl
15750 6f 63 6b 28 69 64 2c 20 4e 4f 5f 4c 4f 43 4b 29  ock(id, NO_LOCK)
15760 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 63  ;.  }.  return c
15770 6c 6f 73 65 55 6e 69 78 46 69 6c 65 28 69 64 29  loseUnixFile(id)
15780 3b 0a 7d 0a 0a 23 65 6e 64 69 66 20 2f 2a 20 53  ;.}..#endif /* S
15790 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43  QLITE_ENABLE_LOC
157a0 4b 49 4e 47 5f 53 54 59 4c 45 20 26 26 20 21 4f  KING_STYLE && !O
157b0 53 5f 56 58 57 4f 52 4b 20 2a 2f 0a 0a 2f 2a 2a  S_VXWORK */../**
157c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
157d0 2a 20 45 6e 64 20 6f 66 20 74 68 65 20 66 6c 6f  * End of the flo
157e0 63 6b 20 6c 6f 63 6b 20 69 6d 70 6c 65 6d 65 6e  ck lock implemen
157f0 74 61 74 69 6f 6e 20 2a 2a 2a 2a 2a 2a 2a 2a 2a  tation *********
15800 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a  ************.***
15810 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
15820 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
15830 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
15840 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
15850 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a  ***********/../*
15860 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
15870 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
15880 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
15890 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
158a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a  *************.**
158b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
158c0 2a 2a 2a 2a 2a 2a 20 42 65 67 69 6e 20 4e 61 6d  ****** Begin Nam
158d0 65 64 20 53 65 6d 61 70 68 6f 72 65 20 4c 6f 63  ed Semaphore Loc
158e0 6b 69 6e 67 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  king ***********
158f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a  *************.**
15900 0a 2a 2a 20 4e 61 6d 65 64 20 73 65 6d 61 70 68  .** Named semaph
15910 6f 72 65 20 6c 6f 63 6b 69 6e 67 20 69 73 20 6f  ore locking is o
15920 6e 6c 79 20 73 75 70 70 6f 72 74 65 64 20 6f 6e  nly supported on
15930 20 56 78 57 6f 72 6b 73 2e 0a 2a 2a 0a 2a 2a 20   VxWorks..**.** 
15940 53 65 6d 61 70 68 6f 72 65 20 6c 6f 63 6b 69 6e  Semaphore lockin
15950 67 20 69 73 20 6c 69 6b 65 20 64 6f 74 2d 6c 6f  g is like dot-lo
15960 63 6b 20 61 6e 64 20 66 6c 6f 63 6b 20 69 6e 20  ck and flock in 
15970 74 68 61 74 20 69 74 20 72 65 61 6c 6c 79 20 6f  that it really o
15980 6e 6c 79 0a 2a 2a 20 73 75 70 70 6f 72 74 73 20  nly.** supports 
15990 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 69 6e  EXCLUSIVE lockin
159a0 67 2e 20 20 4f 6e 6c 79 20 61 20 73 69 6e 67 6c  g.  Only a singl
159b0 65 20 70 72 6f 63 65 73 73 20 63 61 6e 20 72 65  e process can re
159c0 61 64 20 6f 72 20 77 72 69 74 65 0a 2a 2a 20 74  ad or write.** t
159d0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
159e0 20 61 74 20 61 20 74 69 6d 65 2e 20 20 54 68 69   at a time.  Thi
159f0 73 20 72 65 64 75 63 65 73 20 70 6f 74 65 6e 74  s reduces potent
15a00 69 61 6c 20 63 6f 6e 63 75 72 72 65 6e 63 79 2c  ial concurrency,
15a10 20 62 75 74 0a 2a 2a 20 6d 61 6b 65 73 20 74 68   but.** makes th
15a20 65 20 6c 6f 63 6b 20 69 6d 70 6c 65 6d 65 6e 74  e lock implement
15a30 61 74 69 6f 6e 20 6d 75 63 68 20 65 61 73 69 65  ation much easie
15a40 72 2e 0a 2a 2f 0a 23 69 66 20 4f 53 5f 56 58 57  r..*/.#if OS_VXW
15a50 4f 52 4b 53 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  ORKS../*.** This
15a60 20 72 6f 75 74 69 6e 65 20 63 68 65 63 6b 73 20   routine checks 
15a70 69 66 20 74 68 65 72 65 20 69 73 20 61 20 52 45  if there is a RE
15a80 53 45 52 56 45 44 20 6c 6f 63 6b 20 68 65 6c 64  SERVED lock held
15a90 20 6f 6e 20 74 68 65 20 73 70 65 63 69 66 69 65   on the specifie
15aa0 64 0a 2a 2a 20 66 69 6c 65 20 62 79 20 74 68 69  d.** file by thi
15ab0 73 20 6f 72 20 61 6e 79 20 6f 74 68 65 72 20 70  s or any other p
15ac0 72 6f 63 65 73 73 2e 20 49 66 20 73 75 63 68 20  rocess. If such 
15ad0 61 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64 2c 20  a lock is held, 
15ae0 73 65 74 20 2a 70 52 65 73 4f 75 74 0a 2a 2a 20  set *pResOut.** 
15af0 74 6f 20 61 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61  to a non-zero va
15b00 6c 75 65 20 6f 74 68 65 72 77 69 73 65 20 2a 70  lue otherwise *p
15b10 52 65 73 4f 75 74 20 69 73 20 73 65 74 20 74 6f  ResOut is set to
15b20 20 7a 65 72 6f 2e 20 20 54 68 65 20 72 65 74 75   zero.  The retu
15b30 72 6e 20 76 61 6c 75 65 0a 2a 2a 20 69 73 20 73  rn value.** is s
15b40 65 74 20 74 6f 20 53 51 4c 49 54 45 5f 4f 4b 20  et to SQLITE_OK 
15b50 75 6e 6c 65 73 73 20 61 6e 20 49 2f 4f 20 65 72  unless an I/O er
15b60 72 6f 72 20 6f 63 63 75 72 73 20 64 75 72 69 6e  ror occurs durin
15b70 67 20 6c 6f 63 6b 20 63 68 65 63 6b 69 6e 67 2e  g lock checking.
15b80 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73  .*/.static int s
15b90 65 6d 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c  emCheckReservedL
15ba0 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  ock(sqlite3_file
15bb0 20 2a 69 64 2c 20 69 6e 74 20 2a 70 52 65 73 4f   *id, int *pResO
15bc0 75 74 29 20 7b 0a 20 20 69 6e 74 20 72 63 20 3d  ut) {.  int rc =
15bd0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e   SQLITE_OK;.  in
15be0 74 20 72 65 73 65 72 76 65 64 20 3d 20 30 3b 0a  t reserved = 0;.
15bf0 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c    unixFile *pFil
15c00 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69  e = (unixFile*)i
15c10 64 3b 0a 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f  d;..  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 0a 20 20 2f 2a 20 43 68 65  ile );..  /* Che
15c70 63 6b 20 69 66 20 61 20 74 68 72 65 61 64 20 69  ck if a thread i
15c80 6e 20 74 68 69 73 20 70 72 6f 63 65 73 73 20 68  n this process h
15c90 6f 6c 64 73 20 73 75 63 68 20 61 20 6c 6f 63 6b  olds such a lock
15ca0 20 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c 65 2d   */.  if( pFile-
15cb0 3e 65 46 69 6c 65 4c 6f 63 6b 3e 53 48 41 52 45  >eFileLock>SHARE
15cc0 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 72 65  D_LOCK ){.    re
15cd0 73 65 72 76 65 64 20 3d 20 31 3b 0a 20 20 7d 0a  served = 1;.  }.
15ce0 20 20 0a 20 20 2f 2a 20 4f 74 68 65 72 77 69 73    .  /* Otherwis
15cf0 65 20 73 65 65 20 69 66 20 73 6f 6d 65 20 6f 74  e see if some ot
15d00 68 65 72 20 70 72 6f 63 65 73 73 20 68 6f 6c 64  her process hold
15d10 73 20 69 74 2e 20 2a 2f 0a 20 20 69 66 28 20 21  s it. */.  if( !
15d20 72 65 73 65 72 76 65 64 20 29 7b 0a 20 20 20 20  reserved ){.    
15d30 73 65 6d 5f 74 20 2a 70 53 65 6d 20 3d 20 70 46  sem_t *pSem = pF
15d40 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e 70 53 65  ile->pInode->pSe
15d50 6d 3b 0a 20 20 20 20 73 74 72 75 63 74 20 73 74  m;.    struct st
15d60 61 74 20 73 74 61 74 42 75 66 3b 0a 0a 20 20 20  at statBuf;..   
15d70 20 69 66 28 20 73 65 6d 5f 74 72 79 77 61 69 74   if( sem_trywait
15d80 28 70 53 65 6d 29 3d 3d 2d 31 20 29 7b 0a 20 20  (pSem)==-1 ){.  
15d90 20 20 20 20 69 6e 74 20 74 45 72 72 6e 6f 20 3d      int tErrno =
15da0 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20 69 66   errno;.      if
15db0 28 20 45 41 47 41 49 4e 20 21 3d 20 74 45 72 72  ( EAGAIN != tErr
15dc0 6e 6f 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  no ){.        rc
15dd0 20 3d 20 73 71 6c 69 74 65 45 72 72 6f 72 46 72   = sqliteErrorFr
15de0 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28 74 45 72  omPosixError(tEr
15df0 72 6e 6f 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52  rno, SQLITE_IOER
15e00 52 5f 43 48 45 43 4b 52 45 53 45 52 56 45 44 4c  R_CHECKRESERVEDL
15e10 4f 43 4b 29 3b 0a 20 20 20 20 20 20 20 20 70 46  OCK);.        pF
15e20 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d  ile->lastErrno =
15e30 20 74 45 72 72 6e 6f 3b 0a 20 20 20 20 20 20 7d   tErrno;.      }
15e40 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 20 20   else {.        
15e50 2f 2a 20 73 6f 6d 65 6f 6e 65 20 65 6c 73 65 20  /* someone else 
15e60 68 61 73 20 74 68 65 20 6c 6f 63 6b 20 77 68 65  has the lock whe
15e70 6e 20 77 65 20 61 72 65 20 69 6e 20 4e 4f 5f 4c  n we are in NO_L
15e80 4f 43 4b 20 2a 2f 0a 20 20 20 20 20 20 20 20 72  OCK */.        r
15e90 65 73 65 72 76 65 64 20 3d 20 28 70 46 69 6c 65  eserved = (pFile
15ea0 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3c 20 53 48  ->eFileLock < SH
15eb0 41 52 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20  ARED_LOCK);.    
15ec0 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20    }.    }else{. 
15ed0 20 20 20 20 20 2f 2a 20 77 65 20 63 6f 75 6c 64       /* we could
15ee0 20 68 61 76 65 20 69 74 20 69 66 20 77 65 20 77   have it if we w
15ef0 61 6e 74 20 69 74 20 2a 2f 0a 20 20 20 20 20 20  ant it */.      
15f00 73 65 6d 5f 70 6f 73 74 28 70 53 65 6d 29 3b 0a  sem_post(pSem);.
15f10 20 20 20 20 7d 0a 20 20 7d 0a 20 20 4f 53 54 52      }.  }.  OSTR
15f20 41 43 45 28 28 22 54 45 53 54 20 57 52 2d 4c 4f  ACE(("TEST WR-LO
15f30 43 4b 20 25 64 20 25 64 20 25 64 20 28 73 65 6d  CK %d %d %d (sem
15f40 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20  )\n", pFile->h, 
15f50 72 63 2c 20 72 65 73 65 72 76 65 64 29 29 3b 0a  rc, reserved));.
15f60 0a 20 20 2a 70 52 65 73 4f 75 74 20 3d 20 72 65  .  *pResOut = re
15f70 73 65 72 76 65 64 3b 0a 20 20 72 65 74 75 72 6e  served;.  return
15f80 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f   rc;.}../*.** Lo
15f90 63 6b 20 74 68 65 20 66 69 6c 65 20 77 69 74 68  ck the file with
15fa0 20 74 68 65 20 6c 6f 63 6b 20 73 70 65 63 69 66   the lock specif
15fb0 69 65 64 20 62 79 20 70 61 72 61 6d 65 74 65 72  ied by parameter
15fc0 20 65 46 69 6c 65 4c 6f 63 6b 20 2d 20 6f 6e 65   eFileLock - one
15fd0 0a 2a 2a 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f  .** of the follo
15fe0 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  wing:.**.**     
15ff0 28 31 29 20 53 48 41 52 45 44 5f 4c 4f 43 4b 0a  (1) SHARED_LOCK.
16000 2a 2a 20 20 20 20 20 28 32 29 20 52 45 53 45 52  **     (2) RESER
16010 56 45 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20  VED_LOCK.**     
16020 28 33 29 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b  (3) PENDING_LOCK
16030 0a 2a 2a 20 20 20 20 20 28 34 29 20 45 58 43 4c  .**     (4) EXCL
16040 55 53 49 56 45 5f 4c 4f 43 4b 0a 2a 2a 0a 2a 2a  USIVE_LOCK.**.**
16050 20 53 6f 6d 65 74 69 6d 65 73 20 77 68 65 6e 20   Sometimes when 
16060 72 65 71 75 65 73 74 69 6e 67 20 6f 6e 65 20 6c  requesting one l
16070 6f 63 6b 20 73 74 61 74 65 2c 20 61 64 64 69 74  ock state, addit
16080 69 6f 6e 61 6c 20 6c 6f 63 6b 20 73 74 61 74 65  ional lock state
16090 73 0a 2a 2a 20 61 72 65 20 69 6e 73 65 72 74 65  s.** are inserte
160a0 64 20 69 6e 20 62 65 74 77 65 65 6e 2e 20 20 54  d in between.  T
160b0 68 65 20 6c 6f 63 6b 69 6e 67 20 6d 69 67 68 74  he locking might
160c0 20 66 61 69 6c 20 6f 6e 20 6f 6e 65 20 6f 66 20   fail on one of 
160d0 74 68 65 20 6c 61 74 65 72 0a 2a 2a 20 74 72 61  the later.** tra
160e0 6e 73 69 74 69 6f 6e 73 20 6c 65 61 76 69 6e 67  nsitions leaving
160f0 20 74 68 65 20 6c 6f 63 6b 20 73 74 61 74 65 20   the lock state 
16100 64 69 66 66 65 72 65 6e 74 20 66 72 6f 6d 20 77  different from w
16110 68 61 74 20 69 74 20 73 74 61 72 74 65 64 20 62  hat it started b
16120 75 74 0a 2a 2a 20 73 74 69 6c 6c 20 73 68 6f 72  ut.** still shor
16130 74 20 6f 66 20 69 74 73 20 67 6f 61 6c 2e 20 20  t of its goal.  
16140 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 68  The following ch
16150 61 72 74 20 73 68 6f 77 73 20 74 68 65 20 61 6c  art shows the al
16160 6c 6f 77 65 64 0a 2a 2a 20 74 72 61 6e 73 69 74  lowed.** transit
16170 69 6f 6e 73 20 61 6e 64 20 74 68 65 20 69 6e 73  ions and the ins
16180 65 72 74 65 64 20 69 6e 74 65 72 6d 65 64 69 61  erted intermedia
16190 74 65 20 73 74 61 74 65 73 3a 0a 2a 2a 0a 2a 2a  te states:.**.**
161a0 20 20 20 20 55 4e 4c 4f 43 4b 45 44 20 2d 3e 20      UNLOCKED -> 
161b0 53 48 41 52 45 44 0a 2a 2a 20 20 20 20 53 48 41  SHARED.**    SHA
161c0 52 45 44 20 2d 3e 20 52 45 53 45 52 56 45 44 0a  RED -> RESERVED.
161d0 2a 2a 20 20 20 20 53 48 41 52 45 44 20 2d 3e 20  **    SHARED -> 
161e0 28 50 45 4e 44 49 4e 47 29 20 2d 3e 20 45 58 43  (PENDING) -> EXC
161f0 4c 55 53 49 56 45 0a 2a 2a 20 20 20 20 52 45 53  LUSIVE.**    RES
16200 45 52 56 45 44 20 2d 3e 20 28 50 45 4e 44 49 4e  ERVED -> (PENDIN
16210 47 29 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a  G) -> EXCLUSIVE.
16220 2a 2a 20 20 20 20 50 45 4e 44 49 4e 47 20 2d 3e  **    PENDING ->
16230 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 0a 2a 2a   EXCLUSIVE.**.**
16240 20 53 65 6d 61 70 68 6f 72 65 20 6c 6f 63 6b 73   Semaphore locks
16250 20 6f 6e 6c 79 20 72 65 61 6c 6c 79 20 73 75 70   only really sup
16260 70 6f 72 74 20 45 58 43 4c 55 53 49 56 45 20 6c  port EXCLUSIVE l
16270 6f 63 6b 73 2e 20 20 57 65 20 74 72 61 63 6b 20  ocks.  We track 
16280 69 6e 74 65 72 6d 65 64 69 61 74 65 0a 2a 2a 20  intermediate.** 
16290 6c 6f 63 6b 20 73 74 61 74 65 73 20 69 6e 20 74  lock states in t
162a0 68 65 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  he sqlite3_file 
162b0 73 74 72 75 63 74 75 72 65 2c 20 62 75 74 20 61  structure, but a
162c0 6c 6c 20 6c 6f 63 6b 73 20 53 48 41 52 45 44 20  ll locks SHARED 
162d0 6f 72 0a 2a 2a 20 61 62 6f 76 65 20 61 72 65 20  or.** above are 
162e0 72 65 61 6c 6c 79 20 45 58 43 4c 55 53 49 56 45  really EXCLUSIVE
162f0 20 6c 6f 63 6b 73 20 61 6e 64 20 65 78 63 6c 75   locks and exclu
16300 64 65 20 61 6c 6c 20 6f 74 68 65 72 20 70 72 6f  de all other pro
16310 63 65 73 73 65 73 20 66 72 6f 6d 0a 2a 2a 20 61  cesses from.** a
16320 63 63 65 73 73 20 74 68 65 20 66 69 6c 65 2e 0a  ccess the file..
16330 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
16340 6e 65 20 77 69 6c 6c 20 6f 6e 6c 79 20 69 6e 63  ne will only inc
16350 72 65 61 73 65 20 61 20 6c 6f 63 6b 2e 20 20 55  rease a lock.  U
16360 73 65 20 74 68 65 20 73 71 6c 69 74 65 33 4f 73  se the sqlite3Os
16370 55 6e 6c 6f 63 6b 28 29 0a 2a 2a 20 72 6f 75 74  Unlock().** rout
16380 69 6e 65 20 74 6f 20 6c 6f 77 65 72 20 61 20 6c  ine to lower a l
16390 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 2e 0a 2a 2f  ocking level..*/
163a0 0a 73 74 61 74 69 63 20 69 6e 74 20 73 65 6d 4c  .static int semL
163b0 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  ock(sqlite3_file
163c0 20 2a 69 64 2c 20 69 6e 74 20 65 46 69 6c 65 4c   *id, int eFileL
163d0 6f 63 6b 29 20 7b 0a 20 20 75 6e 69 78 46 69 6c  ock) {.  unixFil
163e0 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78  e *pFile = (unix
163f0 46 69 6c 65 2a 29 69 64 3b 0a 20 20 69 6e 74 20  File*)id;.  int 
16400 66 64 3b 0a 20 20 73 65 6d 5f 74 20 2a 70 53 65  fd;.  sem_t *pSe
16410 6d 20 3d 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64  m = pFile->pInod
16420 65 2d 3e 70 53 65 6d 3b 0a 20 20 69 6e 74 20 72  e->pSem;.  int r
16430 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a  c = SQLITE_OK;..
16440 20 20 2f 2a 20 69 66 20 77 65 20 61 6c 72 65 61    /* if we alrea
16450 64 79 20 68 61 76 65 20 61 20 6c 6f 63 6b 2c 20  dy have a lock, 
16460 69 74 20 69 73 20 65 78 63 6c 75 73 69 76 65 2e  it is exclusive.
16470 20 20 0a 20 20 2a 2a 20 4a 75 73 74 20 61 64 6a    .  ** Just adj
16480 75 73 74 20 6c 65 76 65 6c 20 61 6e 64 20 70 75  ust level and pu
16490 6e 74 20 6f 6e 20 6f 75 74 74 61 20 68 65 72 65  nt on outta here
164a0 2e 20 2a 2f 0a 20 20 69 66 20 28 70 46 69 6c 65  . */.  if (pFile
164b0 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3e 20 4e 4f  ->eFileLock > NO
164c0 5f 4c 4f 43 4b 29 20 7b 0a 20 20 20 20 70 46 69  _LOCK) {.    pFi
164d0 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20  le->eFileLock = 
164e0 65 46 69 6c 65 4c 6f 63 6b 3b 0a 20 20 20 20 72  eFileLock;.    r
164f0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
16500 20 20 20 67 6f 74 6f 20 73 65 6d 5f 65 6e 64 5f     goto sem_end_
16510 6c 6f 63 6b 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f  lock;.  }.  .  /
16520 2a 20 6c 6f 63 6b 20 73 65 6d 61 70 68 6f 72 65  * lock semaphore
16530 20 6e 6f 77 20 62 75 74 20 62 61 69 6c 20 6f 75   now but bail ou
16540 74 20 77 68 65 6e 20 61 6c 72 65 61 64 79 20 6c  t when already l
16550 6f 63 6b 65 64 2e 20 2a 2f 0a 20 20 69 66 28 20  ocked. */.  if( 
16560 73 65 6d 5f 74 72 79 77 61 69 74 28 70 53 65 6d  sem_trywait(pSem
16570 29 3d 3d 2d 31 20 29 7b 0a 20 20 20 20 72 63 20  )==-1 ){.    rc 
16580 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20  = SQLITE_BUSY;. 
16590 20 20 20 67 6f 74 6f 20 73 65 6d 5f 65 6e 64 5f     goto sem_end_
165a0 6c 6f 63 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  lock;.  }..  /* 
165b0 67 6f 74 20 69 74 2c 20 73 65 74 20 74 68 65 20  got it, set the 
165c0 74 79 70 65 20 61 6e 64 20 72 65 74 75 72 6e 20  type and return 
165d0 6f 6b 20 2a 2f 0a 20 20 70 46 69 6c 65 2d 3e 65  ok */.  pFile->e
165e0 46 69 6c 65 4c 6f 63 6b 20 3d 20 65 46 69 6c 65  FileLock = eFile
165f0 4c 6f 63 6b 3b 0a 0a 20 73 65 6d 5f 65 6e 64 5f  Lock;.. sem_end_
16600 6c 6f 63 6b 3a 0a 20 20 72 65 74 75 72 6e 20 72  lock:.  return r
16610 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 77 65  c;.}../*.** Lowe
16620 72 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65  r the locking le
16630 76 65 6c 20 6f 6e 20 66 69 6c 65 20 64 65 73 63  vel on file desc
16640 72 69 70 74 6f 72 20 70 46 69 6c 65 20 74 6f 20  riptor pFile to 
16650 65 46 69 6c 65 4c 6f 63 6b 2e 20 20 65 46 69 6c  eFileLock.  eFil
16660 65 4c 6f 63 6b 0a 2a 2a 20 6d 75 73 74 20 62 65  eLock.** must be
16670 20 65 69 74 68 65 72 20 4e 4f 5f 4c 4f 43 4b 20   either NO_LOCK 
16680 6f 72 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2e 0a  or SHARED_LOCK..
16690 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6c 6f 63  **.** If the loc
166a0 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 66 20 74 68  king level of th
166b0 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  e file descripto
166c0 72 20 69 73 20 61 6c 72 65 61 64 79 20 61 74 20  r is already at 
166d0 6f 72 20 62 65 6c 6f 77 0a 2a 2a 20 74 68 65 20  or below.** the 
166e0 72 65 71 75 65 73 74 65 64 20 6c 6f 63 6b 69 6e  requested lockin
166f0 67 20 6c 65 76 65 6c 2c 20 74 68 69 73 20 72 6f  g level, this ro
16700 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70  utine is a no-op
16710 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
16720 73 65 6d 55 6e 6c 6f 63 6b 28 73 71 6c 69 74 65  semUnlock(sqlite
16730 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20  3_file *id, int 
16740 65 46 69 6c 65 4c 6f 63 6b 29 20 7b 0a 20 20 75  eFileLock) {.  u
16750 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d  nixFile *pFile =
16760 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a   (unixFile*)id;.
16770 20 20 73 65 6d 5f 74 20 2a 70 53 65 6d 20 3d 20    sem_t *pSem = 
16780 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e 70  pFile->pInode->p
16790 53 65 6d 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  Sem;..  assert( 
167a0 70 46 69 6c 65 20 29 3b 0a 20 20 61 73 73 65 72  pFile );.  asser
167b0 74 28 20 70 53 65 6d 20 29 3b 0a 20 20 4f 53 54  t( pSem );.  OST
167c0 52 41 43 45 28 28 22 55 4e 4c 4f 43 4b 20 20 25  RACE(("UNLOCK  %
167d0 64 20 25 64 20 77 61 73 20 25 64 20 70 69 64 3d  d %d was %d pid=
167e0 25 64 20 28 73 65 6d 29 5c 6e 22 2c 20 70 46 69  %d (sem)\n", pFi
167f0 6c 65 2d 3e 68 2c 20 65 46 69 6c 65 4c 6f 63 6b  le->h, eFileLock
16800 2c 0a 09 20 20 20 70 46 69 6c 65 2d 3e 65 46 69  ,..   pFile->eFi
16810 6c 65 4c 6f 63 6b 2c 20 67 65 74 70 69 64 28 29  leLock, getpid()
16820 29 29 3b 0a 20 20 61 73 73 65 72 74 28 20 65 46  ));.  assert( eF
16830 69 6c 65 4c 6f 63 6b 3c 3d 53 48 41 52 45 44 5f  ileLock<=SHARED_
16840 4c 4f 43 4b 20 29 3b 0a 20 20 0a 20 20 2f 2a 20  LOCK );.  .  /* 
16850 6e 6f 2d 6f 70 20 69 66 20 70 6f 73 73 69 62 6c  no-op if possibl
16860 65 20 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c 65  e */.  if( pFile
16870 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d 65 46 69  ->eFileLock==eFi
16880 6c 65 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 72 65  leLock ){.    re
16890 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
168a0 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 73 68 61 72    }.  .  /* shar
168b0 65 64 20 63 61 6e 20 6a 75 73 74 20 62 65 20 73  ed can just be s
168c0 65 74 20 62 65 63 61 75 73 65 20 77 65 20 61 6c  et because we al
168d0 77 61 79 73 20 68 61 76 65 20 61 6e 20 65 78 63  ways have an exc
168e0 6c 75 73 69 76 65 20 2a 2f 0a 20 20 69 66 20 28  lusive */.  if (
168f0 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45  eFileLock==SHARE
16900 44 5f 4c 4f 43 4b 29 20 7b 0a 20 20 20 20 70 46  D_LOCK) {.    pF
16910 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d  ile->eFileLock =
16920 20 65 46 69 6c 65 4c 6f 63 6b 3b 0a 20 20 20 20   eFileLock;.    
16930 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
16940 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 6e 6f  ;.  }.  .  /* no
16950 2c 20 72 65 61 6c 6c 79 20 75 6e 6c 6f 63 6b 2e  , really unlock.
16960 20 2a 2f 0a 20 20 69 66 20 28 20 73 65 6d 5f 70   */.  if ( sem_p
16970 6f 73 74 28 70 53 65 6d 29 3d 3d 2d 31 20 29 20  ost(pSem)==-1 ) 
16980 7b 0a 20 20 20 20 69 6e 74 20 72 63 2c 20 74 45  {.    int rc, tE
16990 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20  rrno = errno;.  
169a0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 45 72 72    rc = sqliteErr
169b0 6f 72 46 72 6f 6d 50 6f 73 69 78 45 72 72 6f 72  orFromPosixError
169c0 28 74 45 72 72 6e 6f 2c 20 53 51 4c 49 54 45 5f  (tErrno, SQLITE_
169d0 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 29 3b 0a 20  IOERR_UNLOCK);. 
169e0 20 20 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45     if( IS_LOCK_E
169f0 52 52 4f 52 28 72 63 29 20 29 7b 0a 20 20 20 20  RROR(rc) ){.    
16a00 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72    pFile->lastErr
16a10 6e 6f 20 3d 20 74 45 72 72 6e 6f 3b 0a 20 20 20  no = tErrno;.   
16a20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63   }.    return rc
16a30 3b 20 0a 20 20 7d 0a 20 20 70 46 69 6c 65 2d 3e  ; .  }.  pFile->
16a40 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 4e 4f 5f 4c  eFileLock = NO_L
16a50 4f 43 4b 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  OCK;.  return SQ
16a60 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 20  LITE_OK;.}../*. 
16a70 2a 2a 20 43 6c 6f 73 65 20 61 20 66 69 6c 65 2e  ** Close a file.
16a80 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  . */.static int 
16a90 73 65 6d 43 6c 6f 73 65 28 73 71 6c 69 74 65 33  semClose(sqlite3
16aa0 5f 66 69 6c 65 20 2a 69 64 29 20 7b 0a 20 20 69  _file *id) {.  i
16ab0 66 28 20 69 64 20 29 7b 0a 20 20 20 20 75 6e 69  f( id ){.    uni
16ac0 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28  xFile *pFile = (
16ad0 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20  unixFile*)id;.  
16ae0 20 20 73 65 6d 55 6e 6c 6f 63 6b 28 69 64 2c 20    semUnlock(id, 
16af0 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 61 73  NO_LOCK);.    as
16b00 73 65 72 74 28 20 70 46 69 6c 65 20 29 3b 0a 20  sert( pFile );. 
16b10 20 20 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65     unixEnterMute
16b20 78 28 29 3b 0a 20 20 20 20 72 65 6c 65 61 73 65  x();.    release
16b30 49 6e 6f 64 65 49 6e 66 6f 28 70 46 69 6c 65 29  InodeInfo(pFile)
16b40 3b 0a 20 20 20 20 75 6e 69 78 4c 65 61 76 65 4d  ;.    unixLeaveM
16b50 75 74 65 78 28 29 3b 0a 20 20 20 20 63 6c 6f 73  utex();.    clos
16b60 65 55 6e 69 78 46 69 6c 65 28 69 64 29 3b 0a 20  eUnixFile(id);. 
16b70 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49   }.  return SQLI
16b80 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 65 6e 64 69 66  TE_OK;.}..#endif
16b90 20 2f 2a 20 4f 53 5f 56 58 57 4f 52 4b 53 20 2a   /* OS_VXWORKS *
16ba0 2f 0a 2f 2a 0a 2a 2a 20 4e 61 6d 65 64 20 73 65  /./*.** Named se
16bb0 6d 61 70 68 6f 72 65 20 6c 6f 63 6b 69 6e 67 20  maphore locking 
16bc0 69 73 20 6f 6e 6c 79 20 61 76 61 69 6c 61 62 6c  is only availabl
16bd0 65 20 6f 6e 20 56 78 57 6f 72 6b 73 2e 0a 2a 2a  e on VxWorks..**
16be0 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .***************
16bf0 20 45 6e 64 20 6f 66 20 74 68 65 20 6e 61 6d 65   End of the name
16c00 64 20 73 65 6d 61 70 68 6f 72 65 20 6c 6f 63 6b  d semaphore lock
16c10 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   implementation 
16c20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
16c30 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .***************
16c40 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
16c50 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
16c60 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
16c70 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f  ***************/
16c80 0a 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .../************
16c90 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
16ca0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
16cb0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
16cc0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
16cd0 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  **.*************
16ce0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 42  ************** B
16cf0 65 67 69 6e 20 41 46 50 20 4c 6f 63 6b 69 6e 67  egin AFP Locking
16d00 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a   ***************
16d10 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
16d20 2a 2a 0a 2a 2a 0a 2a 2a 20 41 46 50 20 69 73 20  **.**.** AFP is 
16d30 74 68 65 20 41 70 70 6c 65 20 46 69 6c 69 6e 67  the Apple Filing
16d40 20 50 72 6f 74 6f 63 6f 6c 2e 20 20 41 46 50 20   Protocol.  AFP 
16d50 69 73 20 61 20 6e 65 74 77 6f 72 6b 20 66 69 6c  is a network fil
16d60 65 73 79 73 74 65 6d 20 66 6f 75 6e 64 0a 2a 2a  esystem found.**
16d70 20 6f 6e 20 41 70 70 6c 65 20 4d 61 63 69 6e 74   on Apple Macint
16d80 6f 73 68 20 63 6f 6d 70 75 74 65 72 73 20 2d 20  osh computers - 
16d90 62 6f 74 68 20 4f 53 39 20 61 6e 64 20 4f 53 58  both OS9 and OSX
16da0 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 72 64 2d 70 61  ..**.** Third-pa
16db0 72 74 79 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  rty implementati
16dc0 6f 6e 73 20 6f 66 20 41 46 50 20 61 72 65 20 61  ons of AFP are a
16dd0 76 61 69 6c 61 62 6c 65 2e 20 20 42 75 74 20 74  vailable.  But t
16de0 68 69 73 20 63 6f 64 65 20 68 65 72 65 0a 2a 2a  his code here.**
16df0 20 6f 6e 6c 79 20 77 6f 72 6b 73 20 6f 6e 20 4f   only works on O
16e00 53 58 2e 0a 2a 2f 0a 0a 23 69 66 20 64 65 66 69  SX..*/..#if defi
16e10 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 26  ned(__APPLE__) &
16e20 26 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  & SQLITE_ENABLE_
16e30 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 2f 2a  LOCKING_STYLE./*
16e40 0a 2a 2a 20 54 68 65 20 61 66 70 4c 6f 63 6b 69  .** The afpLocki
16e50 6e 67 43 6f 6e 74 65 78 74 20 73 74 72 75 63 74  ngContext struct
16e60 75 72 65 20 63 6f 6e 74 61 69 6e 73 20 61 6c 6c  ure contains all
16e70 20 61 66 70 20 6c 6f 63 6b 20 73 70 65 63 69 66   afp lock specif
16e80 69 63 20 73 74 61 74 65 0a 2a 2f 0a 74 79 70 65  ic state.*/.type
16e90 64 65 66 20 73 74 72 75 63 74 20 61 66 70 4c 6f  def struct afpLo
16ea0 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 61 66 70  ckingContext afp
16eb0 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 0a  LockingContext;.
16ec0 73 74 72 75 63 74 20 61 66 70 4c 6f 63 6b 69 6e  struct afpLockin
16ed0 67 43 6f 6e 74 65 78 74 20 7b 0a 20 20 69 6e 74  gContext {.  int
16ee0 20 72 65 73 65 72 76 65 64 3b 0a 20 20 63 6f 6e   reserved;.  con
16ef0 73 74 20 63 68 61 72 20 2a 64 62 50 61 74 68 3b  st char *dbPath;
16f00 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
16f10 4e 61 6d 65 20 6f 66 20 74 68 65 20 6f 70 65 6e  Name of the open
16f20 20 66 69 6c 65 20 2a 2f 0a 7d 3b 0a 0a 73 74 72   file */.};..str
16f30 75 63 74 20 42 79 74 65 52 61 6e 67 65 4c 6f 63  uct ByteRangeLoc
16f40 6b 50 42 32 0a 7b 0a 20 20 75 6e 73 69 67 6e 65  kPB2.{.  unsigne
16f50 64 20 6c 6f 6e 67 20 6c 6f 6e 67 20 6f 66 66 73  d long long offs
16f60 65 74 3b 20 20 20 20 20 20 20 20 2f 2a 20 6f 66  et;        /* of
16f70 66 73 65 74 20 74 6f 20 66 69 72 73 74 20 62 79  fset to first by
16f80 74 65 20 74 6f 20 6c 6f 63 6b 20 2a 2f 0a 20 20  te to lock */.  
16f90 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6c 6f  unsigned long lo
16fa0 6e 67 20 6c 65 6e 67 74 68 3b 20 20 20 20 20 20  ng length;      
16fb0 20 20 2f 2a 20 6e 62 72 20 6f 66 20 62 79 74 65    /* nbr of byte
16fc0 73 20 74 6f 20 6c 6f 63 6b 20 2a 2f 0a 20 20 75  s to lock */.  u
16fd0 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6c 6f 6e  nsigned long lon
16fe0 67 20 72 65 74 52 61 6e 67 65 53 74 61 72 74 3b  g retRangeStart;
16ff0 20 2f 2a 20 6e 62 72 20 6f 66 20 31 73 74 20 62   /* nbr of 1st b
17000 79 74 65 20 6c 6f 63 6b 65 64 20 69 66 20 73 75  yte locked if su
17010 63 63 65 73 73 66 75 6c 20 2a 2f 0a 20 20 75 6e  ccessful */.  un
17020 73 69 67 6e 65 64 20 63 68 61 72 20 75 6e 4c 6f  signed char unLo
17030 63 6b 46 6c 61 67 3b 20 20 20 20 20 20 20 20 20  ckFlag;         
17040 2f 2a 20 31 20 3d 20 75 6e 6c 6f 63 6b 2c 20 30  /* 1 = unlock, 0
17050 20 3d 20 6c 6f 63 6b 20 2a 2f 0a 20 20 75 6e 73   = lock */.  uns
17060 69 67 6e 65 64 20 63 68 61 72 20 73 74 61 72 74  igned char start
17070 45 6e 64 46 6c 61 67 3b 20 20 20 20 20 20 20 2f  EndFlag;       /
17080 2a 20 31 3d 72 65 6c 20 74 6f 20 65 6e 64 20 6f  * 1=rel to end o
17090 66 20 66 6f 72 6b 2c 20 30 3d 72 65 6c 20 74 6f  f fork, 0=rel to
170a0 20 73 74 61 72 74 20 2a 2f 0a 20 20 69 6e 74 20   start */.  int 
170b0 66 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  fd;             
170c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
170d0 20 66 69 6c 65 20 64 65 73 63 20 74 6f 20 61 73   file desc to as
170e0 73 6f 63 20 74 68 69 73 20 6c 6f 63 6b 20 77 69  soc this lock wi
170f0 74 68 20 2a 2f 0a 7d 3b 0a 0a 23 64 65 66 69 6e  th */.};..#defin
17100 65 20 61 66 70 66 73 42 79 74 65 52 61 6e 67 65  e afpfsByteRange
17110 4c 6f 63 6b 32 46 53 43 54 4c 20 20 20 20 20 20  Lock2FSCTL      
17120 20 20 5f 49 4f 57 52 28 27 7a 27 2c 20 32 33 2c    _IOWR('z', 23,
17130 20 73 74 72 75 63 74 20 42 79 74 65 52 61 6e 67   struct ByteRang
17140 65 4c 6f 63 6b 50 42 32 29 0a 0a 2f 2a 0a 2a 2a  eLockPB2)../*.**
17150 20 54 68 69 73 20 69 73 20 61 20 75 74 69 6c 69   This is a utili
17160 74 79 20 66 6f 72 20 73 65 74 74 69 6e 67 20 6f  ty for setting o
17170 72 20 63 6c 65 61 72 69 6e 67 20 61 20 62 69 74  r clearing a bit
17180 2d 72 61 6e 67 65 20 6c 6f 63 6b 20 6f 6e 20 61  -range lock on a
17190 6e 0a 2a 2a 20 41 46 50 20 66 69 6c 65 73 79 73  n.** AFP filesys
171a0 74 65 6d 2e 0a 2a 2a 20 0a 2a 2a 20 52 65 74 75  tem..** .** Retu
171b0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20  rn SQLITE_OK on 
171c0 73 75 63 63 65 73 73 2c 20 53 51 4c 49 54 45 5f  success, SQLITE_
171d0 42 55 53 59 20 6f 6e 20 66 61 69 6c 75 72 65 2e  BUSY on failure.
171e0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61  .*/.static int a
171f0 66 70 53 65 74 4c 6f 63 6b 28 0a 20 20 63 6f 6e  fpSetLock(.  con
17200 73 74 20 63 68 61 72 20 2a 70 61 74 68 2c 20 20  st char *path,  
17210 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
17220 61 6d 65 20 6f 66 20 74 68 65 20 66 69 6c 65 20  ame of the file 
17230 74 6f 20 62 65 20 6c 6f 63 6b 65 64 20 6f 72 20  to be locked or 
17240 75 6e 6c 6f 63 6b 65 64 20 2a 2f 0a 20 20 75 6e  unlocked */.  un
17250 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 2c 20 20  ixFile *pFile,  
17260 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
17270 4f 70 65 6e 20 66 69 6c 65 20 64 65 73 63 72 69  Open file descri
17280 70 74 6f 72 20 6f 6e 20 70 61 74 68 20 2a 2f 0a  ptor on path */.
17290 20 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20    unsigned long 
172a0 6c 6f 6e 67 20 6f 66 66 73 65 74 2c 20 20 20 20  long offset,    
172b0 20 2f 2a 20 46 69 72 73 74 20 62 79 74 65 20 74   /* First byte t
172c0 6f 20 62 65 20 6c 6f 63 6b 65 64 20 2a 2f 0a 20  o be locked */. 
172d0 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6c   unsigned long l
172e0 6f 6e 67 20 6c 65 6e 67 74 68 2c 20 20 20 20 20  ong length,     
172f0 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74  /* Number of byt
17300 65 73 20 74 6f 20 6c 6f 63 6b 20 2a 2f 0a 20 20  es to lock */.  
17310 69 6e 74 20 73 65 74 4c 6f 63 6b 46 6c 61 67 20  int setLockFlag 
17320 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
17330 2a 20 54 72 75 65 20 74 6f 20 73 65 74 20 6c 6f  * True to set lo
17340 63 6b 2e 20 20 46 61 6c 73 65 20 74 6f 20 63 6c  ck.  False to cl
17350 65 61 72 20 6c 6f 63 6b 20 2a 2f 0a 29 7b 0a 20  ear lock */.){. 
17360 20 73 74 72 75 63 74 20 42 79 74 65 52 61 6e 67   struct ByteRang
17370 65 4c 6f 63 6b 50 42 32 20 70 62 3b 0a 20 20 69  eLockPB2 pb;.  i
17380 6e 74 20 65 72 72 3b 0a 20 20 0a 20 20 70 62 2e  nt err;.  .  pb.
17390 75 6e 4c 6f 63 6b 46 6c 61 67 20 3d 20 73 65 74  unLockFlag = set
173a0 4c 6f 63 6b 46 6c 61 67 20 3f 20 30 20 3a 20 31  LockFlag ? 0 : 1
173b0 3b 0a 20 20 70 62 2e 73 74 61 72 74 45 6e 64 46  ;.  pb.startEndF
173c0 6c 61 67 20 3d 20 30 3b 0a 20 20 70 62 2e 6f 66  lag = 0;.  pb.of
173d0 66 73 65 74 20 3d 20 6f 66 66 73 65 74 3b 0a 20  fset = offset;. 
173e0 20 70 62 2e 6c 65 6e 67 74 68 20 3d 20 6c 65 6e   pb.length = len
173f0 67 74 68 3b 20 0a 20 20 70 62 2e 66 64 20 3d 20  gth; .  pb.fd = 
17400 70 46 69 6c 65 2d 3e 68 3b 0a 20 20 0a 20 20 4f  pFile->h;.  .  O
17410 53 54 52 41 43 45 28 28 22 41 46 50 53 45 54 4c  STRACE(("AFPSETL
17420 4f 43 4b 20 5b 25 73 5d 20 66 6f 72 20 25 64 25  OCK [%s] for %d%
17430 73 20 69 6e 20 72 61 6e 67 65 20 25 6c 6c 78 3a  s in range %llx:
17440 25 6c 6c 78 5c 6e 22 2c 20 0a 20 20 20 20 28 73  %llx\n", .    (s
17450 65 74 4c 6f 63 6b 46 6c 61 67 3f 22 4f 4e 22 3a  etLockFlag?"ON":
17460 22 4f 46 46 22 29 2c 20 70 46 69 6c 65 2d 3e 68  "OFF"), pFile->h
17470 2c 20 28 70 62 2e 66 64 3d 3d 2d 31 3f 22 5b 74  , (pb.fd==-1?"[t
17480 65 73 74 76 61 6c 2d 31 5d 22 3a 22 22 29 2c 0a  estval-1]":""),.
17490 20 20 20 20 6f 66 66 73 65 74 2c 20 6c 65 6e 67      offset, leng
174a0 74 68 29 29 3b 0a 20 20 65 72 72 20 3d 20 66 73  th));.  err = fs
174b0 63 74 6c 28 70 61 74 68 2c 20 61 66 70 66 73 42  ctl(path, afpfsB
174c0 79 74 65 52 61 6e 67 65 4c 6f 63 6b 32 46 53 43  yteRangeLock2FSC
174d0 54 4c 2c 20 26 70 62 2c 20 30 29 3b 0a 20 20 69  TL, &pb, 0);.  i
174e0 66 20 28 20 65 72 72 3d 3d 2d 31 20 29 20 7b 0a  f ( err==-1 ) {.
174f0 20 20 20 20 69 6e 74 20 72 63 3b 0a 20 20 20 20      int rc;.    
17500 69 6e 74 20 74 45 72 72 6e 6f 20 3d 20 65 72 72  int tErrno = err
17510 6e 6f 3b 0a 20 20 20 20 4f 53 54 52 41 43 45 28  no;.    OSTRACE(
17520 28 22 41 46 50 53 45 54 4c 4f 43 4b 20 66 61 69  ("AFPSETLOCK fai
17530 6c 65 64 20 74 6f 20 66 73 63 74 6c 28 29 20 27  led to fsctl() '
17540 25 73 27 20 25 64 20 25 73 5c 6e 22 2c 0a 20 20  %s' %d %s\n",.  
17550 20 20 20 20 20 20 20 20 20 20 20 70 61 74 68 2c             path,
17560 20 74 45 72 72 6e 6f 2c 20 73 74 72 65 72 72 6f   tErrno, strerro
17570 72 28 74 45 72 72 6e 6f 29 29 29 3b 0a 23 69 66  r(tErrno)));.#if
17580 64 65 66 20 53 51 4c 49 54 45 5f 49 47 4e 4f 52  def SQLITE_IGNOR
17590 45 5f 41 46 50 5f 4c 4f 43 4b 5f 45 52 52 4f 52  E_AFP_LOCK_ERROR
175a0 53 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  S.    rc = SQLIT
175b0 45 5f 42 55 53 59 3b 0a 23 65 6c 73 65 0a 20 20  E_BUSY;.#else.  
175c0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 45 72 72    rc = sqliteErr
175d0 6f 72 46 72 6f 6d 50 6f 73 69 78 45 72 72 6f 72  orFromPosixError
175e0 28 74 45 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20  (tErrno,.       
175f0 20 20 20 20 20 20 20 20 20 20 20 20 20 73 65 74               set
17600 4c 6f 63 6b 46 6c 61 67 20 3f 20 53 51 4c 49 54  LockFlag ? SQLIT
17610 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b 20 3a 20 53  E_IOERR_LOCK : S
17620 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f  QLITE_IOERR_UNLO
17630 43 4b 29 3b 0a 23 65 6e 64 69 66 20 2f 2a 20 53  CK);.#endif /* S
17640 51 4c 49 54 45 5f 49 47 4e 4f 52 45 5f 41 46 50  QLITE_IGNORE_AFP
17650 5f 4c 4f 43 4b 5f 45 52 52 4f 52 53 20 2a 2f 0a  _LOCK_ERRORS */.
17660 20 20 20 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f      if( IS_LOCK_
17670 45 52 52 4f 52 28 72 63 29 20 29 7b 0a 20 20 20  ERROR(rc) ){.   
17680 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72     pFile->lastEr
17690 72 6e 6f 20 3d 20 74 45 72 72 6e 6f 3b 0a 20 20  rno = tErrno;.  
176a0 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 72    }.    return r
176b0 63 3b 0a 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20  c;.  } else {.  
176c0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
176d0 4f 4b 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  OK;.  }.}../*.**
176e0 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63 68   This routine ch
176f0 65 63 6b 73 20 69 66 20 74 68 65 72 65 20 69 73  ecks if there is
17700 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b   a RESERVED lock
17710 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 73 70 65   held on the spe
17720 63 69 66 69 65 64 0a 2a 2a 20 66 69 6c 65 20 62  cified.** file b
17730 79 20 74 68 69 73 20 6f 72 20 61 6e 79 20 6f 74  y this or any ot
17740 68 65 72 20 70 72 6f 63 65 73 73 2e 20 49 66 20  her process. If 
17750 73 75 63 68 20 61 20 6c 6f 63 6b 20 69 73 20 68  such a lock is h
17760 65 6c 64 2c 20 73 65 74 20 2a 70 52 65 73 4f 75  eld, set *pResOu
17770 74 0a 2a 2a 20 74 6f 20 61 20 6e 6f 6e 2d 7a 65  t.** to a non-ze
17780 72 6f 20 76 61 6c 75 65 20 6f 74 68 65 72 77 69  ro value otherwi
17790 73 65 20 2a 70 52 65 73 4f 75 74 20 69 73 20 73  se *pResOut is s
177a0 65 74 20 74 6f 20 7a 65 72 6f 2e 20 20 54 68 65  et to zero.  The
177b0 20 72 65 74 75 72 6e 20 76 61 6c 75 65 0a 2a 2a   return value.**
177c0 20 69 73 20 73 65 74 20 74 6f 20 53 51 4c 49 54   is set to SQLIT
177d0 45 5f 4f 4b 20 75 6e 6c 65 73 73 20 61 6e 20 49  E_OK unless an I
177e0 2f 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20  /O error occurs 
177f0 64 75 72 69 6e 67 20 6c 6f 63 6b 20 63 68 65 63  during lock chec
17800 6b 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  king..*/.static 
17810 69 6e 74 20 61 66 70 43 68 65 63 6b 52 65 73 65  int afpCheckRese
17820 72 76 65 64 4c 6f 63 6b 28 73 71 6c 69 74 65 33  rvedLock(sqlite3
17830 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 2a  _file *id, int *
17840 70 52 65 73 4f 75 74 29 7b 0a 20 20 69 6e 74 20  pResOut){.  int 
17850 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
17860 20 20 69 6e 74 20 72 65 73 65 72 76 65 64 20 3d    int reserved =
17870 20 30 3b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a   0;.  unixFile *
17880 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c  pFile = (unixFil
17890 65 2a 29 69 64 3b 0a 20 20 0a 20 20 53 69 6d 75  e*)id;.  .  Simu
178a0 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 72 65 74  lateIOError( ret
178b0 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  urn SQLITE_IOERR
178c0 5f 43 48 45 43 4b 52 45 53 45 52 56 45 44 4c 4f  _CHECKRESERVEDLO
178d0 43 4b 3b 20 29 3b 0a 20 20 0a 20 20 61 73 73 65  CK; );.  .  asse
178e0 72 74 28 20 70 46 69 6c 65 20 29 3b 0a 20 20 61  rt( pFile );.  a
178f0 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  fpLockingContext
17900 20 2a 63 6f 6e 74 65 78 74 20 3d 20 28 61 66 70   *context = (afp
17910 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a  LockingContext *
17920 29 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67  ) pFile->locking
17930 43 6f 6e 74 65 78 74 3b 0a 20 20 69 66 28 20 63  Context;.  if( c
17940 6f 6e 74 65 78 74 2d 3e 72 65 73 65 72 76 65 64  ontext->reserved
17950 20 29 7b 0a 20 20 20 20 2a 70 52 65 73 4f 75 74   ){.    *pResOut
17960 20 3d 20 31 3b 0a 20 20 20 20 72 65 74 75 72 6e   = 1;.    return
17970 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
17980 20 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78    unixEnterMutex
17990 28 29 3b 20 2f 2a 20 42 65 63 61 75 73 65 20 70  (); /* Because p
179a0 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 20 69 73 20  File->pInode is 
179b0 73 68 61 72 65 64 20 61 63 72 6f 73 73 20 74 68  shared across th
179c0 72 65 61 64 73 20 2a 2f 0a 20 20 0a 20 20 2f 2a  reads */.  .  /*
179d0 20 43 68 65 63 6b 20 69 66 20 61 20 74 68 72 65   Check if a thre
179e0 61 64 20 69 6e 20 74 68 69 73 20 70 72 6f 63 65  ad in this proce
179f0 73 73 20 68 6f 6c 64 73 20 73 75 63 68 20 61 20  ss holds such a 
17a00 6c 6f 63 6b 20 2a 2f 0a 20 20 69 66 28 20 70 46  lock */.  if( pF
17a10 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e 65 46 69  ile->pInode->eFi
17a20 6c 65 4c 6f 63 6b 3e 53 48 41 52 45 44 5f 4c 4f  leLock>SHARED_LO
17a30 43 4b 20 29 7b 0a 20 20 20 20 72 65 73 65 72 76  CK ){.    reserv
17a40 65 64 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 0a 20  ed = 1;.  }.  . 
17a50 20 2f 2a 20 4f 74 68 65 72 77 69 73 65 20 73 65   /* Otherwise se
17a60 65 20 69 66 20 73 6f 6d 65 20 6f 74 68 65 72 20  e if some other 
17a70 70 72 6f 63 65 73 73 20 68 6f 6c 64 73 20 69 74  process holds it
17a80 2e 0a 20 20 20 2a 2f 0a 20 20 69 66 28 20 21 72  ..   */.  if( !r
17a90 65 73 65 72 76 65 64 20 29 7b 0a 20 20 20 20 2f  eserved ){.    /
17aa0 2a 20 6c 6f 63 6b 20 74 68 65 20 52 45 53 45 52  * lock the RESER
17ab0 56 45 44 20 62 79 74 65 20 2a 2f 0a 20 20 20 20  VED byte */.    
17ac0 69 6e 74 20 6c 72 63 20 3d 20 61 66 70 53 65 74  int lrc = afpSet
17ad0 4c 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 64 62  Lock(context->db
17ae0 50 61 74 68 2c 20 70 46 69 6c 65 2c 20 52 45 53  Path, pFile, RES
17af0 45 52 56 45 44 5f 42 59 54 45 2c 20 31 2c 31 29  ERVED_BYTE, 1,1)
17b00 3b 20 20 0a 20 20 20 20 69 66 28 20 53 51 4c 49  ;  .    if( SQLI
17b10 54 45 5f 4f 4b 3d 3d 6c 72 63 20 29 7b 0a 20 20  TE_OK==lrc ){.  
17b20 20 20 20 20 2f 2a 20 69 66 20 77 65 20 73 75 63      /* if we suc
17b30 63 65 65 64 65 64 20 69 6e 20 74 61 6b 69 6e 67  ceeded in taking
17b40 20 74 68 65 20 72 65 73 65 72 76 65 64 20 6c 6f   the reserved lo
17b50 63 6b 2c 20 75 6e 6c 6f 63 6b 20 69 74 20 74 6f  ck, unlock it to
17b60 20 72 65 73 74 6f 72 65 0a 20 20 20 20 20 20 2a   restore.      *
17b70 2a 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 73  * the original s
17b80 74 61 74 65 20 2a 2f 0a 20 20 20 20 20 20 6c 72  tate */.      lr
17b90 63 20 3d 20 61 66 70 53 65 74 4c 6f 63 6b 28 63  c = afpSetLock(c
17ba0 6f 6e 74 65 78 74 2d 3e 64 62 50 61 74 68 2c 20  ontext->dbPath, 
17bb0 70 46 69 6c 65 2c 20 52 45 53 45 52 56 45 44 5f  pFile, RESERVED_
17bc0 42 59 54 45 2c 20 31 2c 20 30 29 3b 0a 20 20 20  BYTE, 1, 0);.   
17bd0 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20   } else {.      
17be0 2f 2a 20 69 66 20 77 65 20 66 61 69 6c 65 64 20  /* if we failed 
17bf0 74 6f 20 67 65 74 20 74 68 65 20 6c 6f 63 6b 20  to get the lock 
17c00 74 68 65 6e 20 73 6f 6d 65 6f 6e 65 20 65 6c 73  then someone els
17c10 65 20 6d 75 73 74 20 68 61 76 65 20 69 74 20 2a  e must have it *
17c20 2f 0a 20 20 20 20 20 20 72 65 73 65 72 76 65 64  /.      reserved
17c30 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20   = 1;.    }.    
17c40 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f  if( IS_LOCK_ERRO
17c50 52 28 6c 72 63 29 20 29 7b 0a 20 20 20 20 20 20  R(lrc) ){.      
17c60 72 63 3d 6c 72 63 3b 0a 20 20 20 20 7d 0a 20 20  rc=lrc;.    }.  
17c70 7d 0a 20 20 0a 20 20 75 6e 69 78 4c 65 61 76 65  }.  .  unixLeave
17c80 4d 75 74 65 78 28 29 3b 0a 20 20 4f 53 54 52 41  Mutex();.  OSTRA
17c90 43 45 28 28 22 54 45 53 54 20 57 52 2d 4c 4f 43  CE(("TEST WR-LOC
17ca0 4b 20 25 64 20 25 64 20 25 64 20 28 61 66 70 29  K %d %d %d (afp)
17cb0 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 72  \n", pFile->h, r
17cc0 63 2c 20 72 65 73 65 72 76 65 64 29 29 3b 0a 20  c, reserved));. 
17cd0 20 0a 20 20 2a 70 52 65 73 4f 75 74 20 3d 20 72   .  *pResOut = r
17ce0 65 73 65 72 76 65 64 3b 0a 20 20 72 65 74 75 72  eserved;.  retur
17cf0 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c  n rc;.}../*.** L
17d00 6f 63 6b 20 74 68 65 20 66 69 6c 65 20 77 69 74  ock the file wit
17d10 68 20 74 68 65 20 6c 6f 63 6b 20 73 70 65 63 69  h the lock speci
17d20 66 69 65 64 20 62 79 20 70 61 72 61 6d 65 74 65  fied by paramete
17d30 72 20 65 46 69 6c 65 4c 6f 63 6b 20 2d 20 6f 6e  r eFileLock - on
17d40 65 0a 2a 2a 20 6f 66 20 74 68 65 20 66 6f 6c 6c  e.** of the foll
17d50 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  owing:.**.**    
17d60 20 28 31 29 20 53 48 41 52 45 44 5f 4c 4f 43 4b   (1) SHARED_LOCK
17d70 0a 2a 2a 20 20 20 20 20 28 32 29 20 52 45 53 45  .**     (2) RESE
17d80 52 56 45 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20  RVED_LOCK.**    
17d90 20 28 33 29 20 50 45 4e 44 49 4e 47 5f 4c 4f 43   (3) PENDING_LOC
17da0 4b 0a 2a 2a 20 20 20 20 20 28 34 29 20 45 58 43  K.**     (4) EXC
17db0 4c 55 53 49 56 45 5f 4c 4f 43 4b 0a 2a 2a 0a 2a  LUSIVE_LOCK.**.*
17dc0 2a 20 53 6f 6d 65 74 69 6d 65 73 20 77 68 65 6e  * Sometimes when
17dd0 20 72 65 71 75 65 73 74 69 6e 67 20 6f 6e 65 20   requesting one 
17de0 6c 6f 63 6b 20 73 74 61 74 65 2c 20 61 64 64 69  lock state, addi
17df0 74 69 6f 6e 61 6c 20 6c 6f 63 6b 20 73 74 61 74  tional lock stat
17e00 65 73 0a 2a 2a 20 61 72 65 20 69 6e 73 65 72 74  es.** are insert
17e10 65 64 20 69 6e 20 62 65 74 77 65 65 6e 2e 20 20  ed in between.  
17e20 54 68 65 20 6c 6f 63 6b 69 6e 67 20 6d 69 67 68  The locking migh
17e30 74 20 66 61 69 6c 20 6f 6e 20 6f 6e 65 20 6f 66  t fail on one of
17e40 20 74 68 65 20 6c 61 74 65 72 0a 2a 2a 20 74 72   the later.** tr
17e50 61 6e 73 69 74 69 6f 6e 73 20 6c 65 61 76 69 6e  ansitions leavin
17e60 67 20 74 68 65 20 6c 6f 63 6b 20 73 74 61 74 65  g the lock state
17e70 20 64 69 66 66 65 72 65 6e 74 20 66 72 6f 6d 20   different from 
17e80 77 68 61 74 20 69 74 20 73 74 61 72 74 65 64 20  what it started 
17e90 62 75 74 0a 2a 2a 20 73 74 69 6c 6c 20 73 68 6f  but.** still sho
17ea0 72 74 20 6f 66 20 69 74 73 20 67 6f 61 6c 2e 20  rt of its goal. 
17eb0 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63   The following c
17ec0 68 61 72 74 20 73 68 6f 77 73 20 74 68 65 20 61  hart shows the a
17ed0 6c 6c 6f 77 65 64 0a 2a 2a 20 74 72 61 6e 73 69  llowed.** transi
17ee0 74 69 6f 6e 73 20 61 6e 64 20 74 68 65 20 69 6e  tions and the in
17ef0 73 65 72 74 65 64 20 69 6e 74 65 72 6d 65 64 69  serted intermedi
17f00 61 74 65 20 73 74 61 74 65 73 3a 0a 2a 2a 0a 2a  ate states:.**.*
17f10 2a 20 20 20 20 55 4e 4c 4f 43 4b 45 44 20 2d 3e  *    UNLOCKED ->
17f20 20 53 48 41 52 45 44 0a 2a 2a 20 20 20 20 53 48   SHARED.**    SH
17f30 41 52 45 44 20 2d 3e 20 52 45 53 45 52 56 45 44  ARED -> RESERVED
17f40 0a 2a 2a 20 20 20 20 53 48 41 52 45 44 20 2d 3e  .**    SHARED ->
17f50 20 28 50 45 4e 44 49 4e 47 29 20 2d 3e 20 45 58   (PENDING) -> EX
17f60 43 4c 55 53 49 56 45 0a 2a 2a 20 20 20 20 52 45  CLUSIVE.**    RE
17f70 53 45 52 56 45 44 20 2d 3e 20 28 50 45 4e 44 49  SERVED -> (PENDI
17f80 4e 47 29 20 2d 3e 20 45 58 43 4c 55 53 49 56 45  NG) -> EXCLUSIVE
17f90 0a 2a 2a 20 20 20 20 50 45 4e 44 49 4e 47 20 2d  .**    PENDING -
17fa0 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 0a 2a  > EXCLUSIVE.**.*
17fb0 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77  * This routine w
17fc0 69 6c 6c 20 6f 6e 6c 79 20 69 6e 63 72 65 61 73  ill only increas
17fd0 65 20 61 20 6c 6f 63 6b 2e 20 20 55 73 65 20 74  e a lock.  Use t
17fe0 68 65 20 73 71 6c 69 74 65 33 4f 73 55 6e 6c 6f  he sqlite3OsUnlo
17ff0 63 6b 28 29 0a 2a 2a 20 72 6f 75 74 69 6e 65 20  ck().** routine 
18000 74 6f 20 6c 6f 77 65 72 20 61 20 6c 6f 63 6b 69  to lower a locki
18010 6e 67 20 6c 65 76 65 6c 2e 0a 2a 2f 0a 73 74 61  ng level..*/.sta
18020 74 69 63 20 69 6e 74 20 61 66 70 4c 6f 63 6b 28  tic int afpLock(
18030 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64  sqlite3_file *id
18040 2c 20 69 6e 74 20 65 46 69 6c 65 4c 6f 63 6b 29  , int eFileLock)
18050 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
18060 49 54 45 5f 4f 4b 3b 0a 20 20 75 6e 69 78 46 69  ITE_OK;.  unixFi
18070 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69  le *pFile = (uni
18080 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 75 6e 69  xFile*)id;.  uni
18090 78 49 6e 6f 64 65 49 6e 66 6f 20 2a 70 49 6e 6f  xInodeInfo *pIno
180a0 64 65 20 3d 20 70 46 69 6c 65 2d 3e 70 49 6e 6f  de = pFile->pIno
180b0 64 65 3b 0a 20 20 61 66 70 4c 6f 63 6b 69 6e 67  de;.  afpLocking
180c0 43 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74  Context *context
180d0 20 3d 20 28 61 66 70 4c 6f 63 6b 69 6e 67 43 6f   = (afpLockingCo
180e0 6e 74 65 78 74 20 2a 29 20 70 46 69 6c 65 2d 3e  ntext *) pFile->
180f0 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 0a  lockingContext;.
18100 20 20 0a 20 20 61 73 73 65 72 74 28 20 70 46 69    .  assert( pFi
18110 6c 65 20 29 3b 0a 20 20 4f 53 54 52 41 43 45 28  le );.  OSTRACE(
18120 28 22 4c 4f 43 4b 20 20 20 20 25 64 20 25 73 20  ("LOCK    %d %s 
18130 77 61 73 20 25 73 28 25 73 2c 25 64 29 20 70 69  was %s(%s,%d) pi
18140 64 3d 25 64 20 28 61 66 70 29 5c 6e 22 2c 20 70  d=%d (afp)\n", p
18150 46 69 6c 65 2d 3e 68 2c 0a 20 20 20 20 20 20 20  File->h,.       
18160 20 20 20 20 61 7a 46 69 6c 65 4c 6f 63 6b 28 65      azFileLock(e
18170 46 69 6c 65 4c 6f 63 6b 29 2c 20 61 7a 46 69 6c  FileLock), azFil
18180 65 4c 6f 63 6b 28 70 46 69 6c 65 2d 3e 65 46 69  eLock(pFile->eFi
18190 6c 65 4c 6f 63 6b 29 2c 0a 20 20 20 20 20 20 20  leLock),.       
181a0 20 20 20 20 61 7a 46 69 6c 65 4c 6f 63 6b 28 70      azFileLock(p
181b0 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  Inode->eFileLock
181c0 29 2c 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72  ), pInode->nShar
181d0 65 64 20 2c 20 67 65 74 70 69 64 28 29 29 29 3b  ed , getpid()));
181e0 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20  ..  /* If there 
181f0 69 73 20 61 6c 72 65 61 64 79 20 61 20 6c 6f 63  is already a loc
18200 6b 20 6f 66 20 74 68 69 73 20 74 79 70 65 20 6f  k of this type o
18210 72 20 6d 6f 72 65 20 72 65 73 74 72 69 63 74 69  r more restricti
18220 76 65 20 6f 6e 20 74 68 65 0a 20 20 2a 2a 20 75  ve on the.  ** u
18230 6e 69 78 46 69 6c 65 2c 20 64 6f 20 6e 6f 74 68  nixFile, do noth
18240 69 6e 67 2e 20 44 6f 6e 27 74 20 75 73 65 20 74  ing. Don't use t
18250 68 65 20 61 66 70 5f 65 6e 64 5f 6c 6f 63 6b 3a  he afp_end_lock:
18260 20 65 78 69 74 20 70 61 74 68 2c 20 61 73 0a 20   exit path, as. 
18270 20 2a 2a 20 75 6e 69 78 45 6e 74 65 72 4d 75 74   ** unixEnterMut
18280 65 78 28 29 20 68 61 73 6e 27 74 20 62 65 65 6e  ex() hasn't been
18290 20 63 61 6c 6c 65 64 20 79 65 74 2e 0a 20 20 2a   called yet..  *
182a0 2f 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 65  /.  if( pFile->e
182b0 46 69 6c 65 4c 6f 63 6b 3e 3d 65 46 69 6c 65 4c  FileLock>=eFileL
182c0 6f 63 6b 20 29 7b 0a 20 20 20 20 4f 53 54 52 41  ock ){.    OSTRA
182d0 43 45 28 28 22 4c 4f 43 4b 20 20 20 20 25 64 20  CE(("LOCK    %d 
182e0 25 73 20 6f 6b 20 28 61 6c 72 65 61 64 79 20 68  %s ok (already h
182f0 65 6c 64 29 20 28 61 66 70 29 5c 6e 22 2c 20 70  eld) (afp)\n", p
18300 46 69 6c 65 2d 3e 68 2c 0a 20 20 20 20 20 20 20  File->h,.       
18310 20 20 20 20 61 7a 46 69 6c 65 4c 6f 63 6b 28 65      azFileLock(e
18320 46 69 6c 65 4c 6f 63 6b 29 29 29 3b 0a 20 20 20  FileLock)));.   
18330 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
18340 4b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b  K;.  }..  /* Mak
18350 65 20 73 75 72 65 20 74 68 65 20 6c 6f 63 6b 69  e sure the locki
18360 6e 67 20 73 65 71 75 65 6e 63 65 20 69 73 20 63  ng sequence is c
18370 6f 72 72 65 63 74 0a 20 20 2a 2a 20 20 28 31 29  orrect.  **  (1)
18380 20 57 65 20 6e 65 76 65 72 20 6d 6f 76 65 20 66   We never move f
18390 72 6f 6d 20 75 6e 6c 6f 63 6b 65 64 20 74 6f 20  rom unlocked to 
183a0 61 6e 79 74 68 69 6e 67 20 68 69 67 68 65 72 20  anything higher 
183b0 74 68 61 6e 20 73 68 61 72 65 64 20 6c 6f 63 6b  than shared lock
183c0 2e 0a 20 20 2a 2a 20 20 28 32 29 20 53 51 4c 69  ..  **  (2) SQLi
183d0 74 65 20 6e 65 76 65 72 20 65 78 70 6c 69 63 69  te never explici
183e0 74 6c 79 20 72 65 71 75 65 73 74 73 20 61 20 70  tly requests a p
183f0 65 6e 64 69 67 20 6c 6f 63 6b 2e 0a 20 20 2a 2a  endig lock..  **
18400 20 20 28 33 29 20 41 20 73 68 61 72 65 64 20 6c    (3) A shared l
18410 6f 63 6b 20 69 73 20 61 6c 77 61 79 73 20 68 65  ock is always he
18420 6c 64 20 77 68 65 6e 20 61 20 72 65 73 65 72 76  ld when a reserv
18430 65 20 6c 6f 63 6b 20 69 73 20 72 65 71 75 65 73  e lock is reques
18440 74 65 64 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65  ted..  */.  asse
18450 72 74 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65  rt( pFile->eFile
18460 4c 6f 63 6b 21 3d 4e 4f 5f 4c 4f 43 4b 20 7c 7c  Lock!=NO_LOCK ||
18470 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52   eFileLock==SHAR
18480 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73  ED_LOCK );.  ass
18490 65 72 74 28 20 65 46 69 6c 65 4c 6f 63 6b 21 3d  ert( eFileLock!=
184a0 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 20 29 3b 0a  PENDING_LOCK );.
184b0 20 20 61 73 73 65 72 74 28 20 65 46 69 6c 65 4c    assert( eFileL
184c0 6f 63 6b 21 3d 52 45 53 45 52 56 45 44 5f 4c 4f  ock!=RESERVED_LO
184d0 43 4b 20 7c 7c 20 70 46 69 6c 65 2d 3e 65 46 69  CK || pFile->eFi
184e0 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c  leLock==SHARED_L
184f0 4f 43 4b 20 29 3b 0a 20 20 0a 20 20 2f 2a 20 54  OCK );.  .  /* T
18500 68 69 73 20 6d 75 74 65 78 20 69 73 20 6e 65 65  his mutex is nee
18510 64 65 64 20 62 65 63 61 75 73 65 20 70 46 69 6c  ded because pFil
18520 65 2d 3e 70 49 6e 6f 64 65 20 69 73 20 73 68 61  e->pInode is sha
18530 72 65 64 20 61 63 72 6f 73 73 20 74 68 72 65 61  red across threa
18540 64 73 0a 20 20 2a 2f 0a 20 20 75 6e 69 78 45 6e  ds.  */.  unixEn
18550 74 65 72 4d 75 74 65 78 28 29 3b 0a 20 20 70 49  terMutex();.  pI
18560 6e 6f 64 65 20 3d 20 70 46 69 6c 65 2d 3e 70 49  node = pFile->pI
18570 6e 6f 64 65 3b 0a 0a 20 20 2f 2a 20 49 66 20 73  node;..  /* If s
18580 6f 6d 65 20 74 68 72 65 61 64 20 75 73 69 6e 67  ome thread using
18590 20 74 68 69 73 20 50 49 44 20 68 61 73 20 61 20   this PID has a 
185a0 6c 6f 63 6b 20 76 69 61 20 61 20 64 69 66 66 65  lock via a diffe
185b0 72 65 6e 74 20 75 6e 69 78 46 69 6c 65 2a 0a 20  rent unixFile*. 
185c0 20 2a 2a 20 68 61 6e 64 6c 65 20 74 68 61 74 20   ** handle that 
185d0 70 72 65 63 6c 75 64 65 73 20 74 68 65 20 72 65  precludes the re
185e0 71 75 65 73 74 65 64 20 6c 6f 63 6b 2c 20 72 65  quested lock, re
185f0 74 75 72 6e 20 42 55 53 59 2e 0a 20 20 2a 2f 0a  turn BUSY..  */.
18600 20 20 69 66 28 20 28 70 46 69 6c 65 2d 3e 65 46    if( (pFile->eF
18610 69 6c 65 4c 6f 63 6b 21 3d 70 49 6e 6f 64 65 2d  ileLock!=pInode-
18620 3e 65 46 69 6c 65 4c 6f 63 6b 20 26 26 20 0a 20  >eFileLock && . 
18630 20 20 20 20 20 20 28 70 49 6e 6f 64 65 2d 3e 65        (pInode->e
18640 46 69 6c 65 4c 6f 63 6b 3e 3d 50 45 4e 44 49 4e  FileLock>=PENDIN
18650 47 5f 4c 4f 43 4b 20 7c 7c 20 65 46 69 6c 65 4c  G_LOCK || eFileL
18660 6f 63 6b 3e 53 48 41 52 45 44 5f 4c 4f 43 4b 29  ock>SHARED_LOCK)
18670 29 0a 20 20 20 20 20 29 7b 0a 20 20 20 20 72 63  ).     ){.    rc
18680 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a   = SQLITE_BUSY;.
18690 20 20 20 20 67 6f 74 6f 20 61 66 70 5f 65 6e 64      goto afp_end
186a0 5f 6c 6f 63 6b 3b 0a 20 20 7d 0a 20 20 0a 20 20  _lock;.  }.  .  
186b0 2f 2a 20 49 66 20 61 20 53 48 41 52 45 44 20 6c  /* If a SHARED l
186c0 6f 63 6b 20 69 73 20 72 65 71 75 65 73 74 65 64  ock is requested
186d0 2c 20 61 6e 64 20 73 6f 6d 65 20 74 68 72 65 61  , and some threa
186e0 64 20 75 73 69 6e 67 20 74 68 69 73 20 50 49 44  d using this PID
186f0 20 61 6c 72 65 61 64 79 0a 20 20 2a 2a 20 68 61   already.  ** ha
18700 73 20 61 20 53 48 41 52 45 44 20 6f 72 20 52 45  s a SHARED or RE
18710 53 45 52 56 45 44 20 6c 6f 63 6b 2c 20 74 68 65  SERVED lock, the
18720 6e 20 69 6e 63 72 65 6d 65 6e 74 20 72 65 66 65  n increment refe
18730 72 65 6e 63 65 20 63 6f 75 6e 74 73 20 61 6e 64  rence counts and
18740 0a 20 20 2a 2a 20 72 65 74 75 72 6e 20 53 51 4c  .  ** return SQL
18750 49 54 45 5f 4f 4b 2e 0a 20 20 2a 2f 0a 20 20 69  ITE_OK..  */.  i
18760 66 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48  f( eFileLock==SH
18770 41 52 45 44 5f 4c 4f 43 4b 20 26 26 20 0a 20 20  ARED_LOCK && .  
18780 20 20 20 28 70 49 6e 6f 64 65 2d 3e 65 46 69 6c     (pInode->eFil
18790 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f  eLock==SHARED_LO
187a0 43 4b 20 7c 7c 20 70 49 6e 6f 64 65 2d 3e 65 46  CK || pInode->eF
187b0 69 6c 65 4c 6f 63 6b 3d 3d 52 45 53 45 52 56 45  ileLock==RESERVE
187c0 44 5f 4c 4f 43 4b 29 20 29 7b 0a 20 20 20 20 61  D_LOCK) ){.    a
187d0 73 73 65 72 74 28 20 65 46 69 6c 65 4c 6f 63 6b  ssert( eFileLock
187e0 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b  ==SHARED_LOCK );
187f0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 46 69  .    assert( pFi
18800 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d 30  le->eFileLock==0
18810 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
18820 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64 3e  pInode->nShared>
18830 30 20 29 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e  0 );.    pFile->
18840 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 53 48 41 52  eFileLock = SHAR
18850 45 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20 70 49 6e  ED_LOCK;.    pIn
18860 6f 64 65 2d 3e 6e 53 68 61 72 65 64 2b 2b 3b 0a  ode->nShared++;.
18870 20 20 20 20 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63      pInode->nLoc
18880 6b 2b 2b 3b 0a 20 20 20 20 67 6f 74 6f 20 61 66  k++;.    goto af
18890 70 5f 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 7d 0a  p_end_lock;.  }.
188a0 20 20 20 20 0a 20 20 2f 2a 20 41 20 50 45 4e 44      .  /* A PEND
188b0 49 4e 47 20 6c 6f 63 6b 20 69 73 20 6e 65 65 64  ING lock is need
188c0 65 64 20 62 65 66 6f 72 65 20 61 63 71 75 69 72  ed before acquir
188d0 69 6e 67 20 61 20 53 48 41 52 45 44 20 6c 6f 63  ing a SHARED loc
188e0 6b 20 61 6e 64 20 62 65 66 6f 72 65 0a 20 20 2a  k and before.  *
188f0 2a 20 61 63 71 75 69 72 69 6e 67 20 61 6e 20 45  * acquiring an E
18900 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 20 20  XCLUSIVE lock.  
18910 46 6f 72 20 74 68 65 20 53 48 41 52 45 44 20 6c  For the SHARED l
18920 6f 63 6b 2c 20 74 68 65 20 50 45 4e 44 49 4e 47  ock, the PENDING
18930 20 77 69 6c 6c 0a 20 20 2a 2a 20 62 65 20 72 65   will.  ** be re
18940 6c 65 61 73 65 64 2e 0a 20 20 2a 2f 0a 20 20 69  leased..  */.  i
18950 66 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48  f( eFileLock==SH
18960 41 52 45 44 5f 4c 4f 43 4b 20 0a 20 20 20 20 20  ARED_LOCK .     
18970 20 7c 7c 20 28 65 46 69 6c 65 4c 6f 63 6b 3d 3d   || (eFileLock==
18980 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 26  EXCLUSIVE_LOCK &
18990 26 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f  & pFile->eFileLo
189a0 63 6b 3c 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 29  ck<PENDING_LOCK)
189b0 0a 20 20 29 7b 0a 20 20 20 20 69 6e 74 20 66 61  .  ){.    int fa
189c0 69 6c 65 64 3b 0a 20 20 20 20 66 61 69 6c 65 64  iled;.    failed
189d0 20 3d 20 61 66 70 53 65 74 4c 6f 63 6b 28 63 6f   = afpSetLock(co
189e0 6e 74 65 78 74 2d 3e 64 62 50 61 74 68 2c 20 70  ntext->dbPath, p
189f0 46 69 6c 65 2c 20 50 45 4e 44 49 4e 47 5f 42 59  File, PENDING_BY
18a00 54 45 2c 20 31 2c 20 31 29 3b 0a 20 20 20 20 69  TE, 1, 1);.    i
18a10 66 20 28 66 61 69 6c 65 64 29 20 7b 0a 20 20 20  f (failed) {.   
18a20 20 20 20 72 63 20 3d 20 66 61 69 6c 65 64 3b 0a     rc = failed;.
18a30 20 20 20 20 20 20 67 6f 74 6f 20 61 66 70 5f 65        goto afp_e
18a40 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 20 20 7d 0a 20  nd_lock;.    }. 
18a50 20 7d 0a 20 20 0a 20 20 2f 2a 20 49 66 20 63 6f   }.  .  /* If co
18a60 6e 74 72 6f 6c 20 67 65 74 73 20 74 6f 20 74 68  ntrol gets to th
18a70 69 73 20 70 6f 69 6e 74 2c 20 74 68 65 6e 20 61  is point, then a
18a80 63 74 75 61 6c 6c 79 20 67 6f 20 61 68 65 61 64  ctually go ahead
18a90 20 61 6e 64 20 6d 61 6b 65 0a 20 20 2a 2a 20 6f   and make.  ** o
18aa0 70 65 72 61 74 69 6e 67 20 73 79 73 74 65 6d 20  perating system 
18ab0 63 61 6c 6c 73 20 66 6f 72 20 74 68 65 20 73 70  calls for the sp
18ac0 65 63 69 66 69 65 64 20 6c 6f 63 6b 2e 0a 20 20  ecified lock..  
18ad0 2a 2f 0a 20 20 69 66 28 20 65 46 69 6c 65 4c 6f  */.  if( eFileLo
18ae0 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20  ck==SHARED_LOCK 
18af0 29 7b 0a 20 20 20 20 69 6e 74 20 6c 72 63 31 2c  ){.    int lrc1,
18b00 20 6c 72 63 32 2c 20 6c 72 63 31 45 72 72 6e 6f   lrc2, lrc1Errno
18b10 3b 0a 20 20 20 20 6c 6f 6e 67 20 6c 6b 2c 20 6d  ;.    long lk, m
18b20 61 73 6b 3b 0a 20 20 20 20 0a 20 20 20 20 61 73  ask;.    .    as
18b30 73 65 72 74 28 20 70 49 6e 6f 64 65 2d 3e 6e 53  sert( pInode->nS
18b40 68 61 72 65 64 3d 3d 30 20 29 3b 0a 20 20 20 20  hared==0 );.    
18b50 61 73 73 65 72 74 28 20 70 49 6e 6f 64 65 2d 3e  assert( pInode->
18b60 65 46 69 6c 65 4c 6f 63 6b 3d 3d 30 20 29 3b 0a  eFileLock==0 );.
18b70 20 20 20 20 20 20 20 20 0a 20 20 20 20 6d 61 73          .    mas
18b80 6b 20 3d 20 28 73 69 7a 65 6f 66 28 6c 6f 6e 67  k = (sizeof(long
18b90 29 3d 3d 38 29 20 3f 20 4c 41 52 47 45 53 54 5f  )==8) ? LARGEST_
18ba0 49 4e 54 36 34 20 3a 20 30 78 37 66 66 66 66 66  INT64 : 0x7fffff
18bb0 66 66 3b 0a 20 20 20 20 2f 2a 20 4e 6f 77 20 67  ff;.    /* Now g
18bc0 65 74 20 74 68 65 20 72 65 61 64 2d 6c 6f 63 6b  et the read-lock
18bd0 20 53 48 41 52 45 44 5f 4c 4f 43 4b 20 2a 2f 0a   SHARED_LOCK */.
18be0 20 20 20 20 2f 2a 20 6e 6f 74 65 20 74 68 61 74      /* note that
18bf0 20 74 68 65 20 71 75 61 6c 69 74 79 20 6f 66 20   the quality of 
18c00 74 68 65 20 72 61 6e 64 6f 6d 6e 65 73 73 20 64  the randomness d
18c10 6f 65 73 6e 27 74 20 6d 61 74 74 65 72 20 74 68  oesn't matter th
18c20 61 74 20 6d 75 63 68 20 2a 2f 0a 20 20 20 20 6c  at much */.    l
18c30 6b 20 3d 20 72 61 6e 64 6f 6d 28 29 3b 20 0a 20  k = random(); . 
18c40 20 20 20 70 49 6e 6f 64 65 2d 3e 73 68 61 72 65     pInode->share
18c50 64 42 79 74 65 20 3d 20 28 6c 6b 20 26 20 6d 61  dByte = (lk & ma
18c60 73 6b 29 25 28 53 48 41 52 45 44 5f 53 49 5a 45  sk)%(SHARED_SIZE
18c70 20 2d 20 31 29 3b 0a 20 20 20 20 6c 72 63 31 20   - 1);.    lrc1 
18c80 3d 20 61 66 70 53 65 74 4c 6f 63 6b 28 63 6f 6e  = afpSetLock(con
18c90 74 65 78 74 2d 3e 64 62 50 61 74 68 2c 20 70 46  text->dbPath, pF
18ca0 69 6c 65 2c 20 0a 20 20 20 20 20 20 20 20 20 20  ile, .          
18cb0 53 48 41 52 45 44 5f 46 49 52 53 54 2b 70 49 6e  SHARED_FIRST+pIn
18cc0 6f 64 65 2d 3e 73 68 61 72 65 64 42 79 74 65 2c  ode->sharedByte,
18cd0 20 31 2c 20 31 29 3b 0a 20 20 20 20 69 66 28 20   1, 1);.    if( 
18ce0 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 6c 72  IS_LOCK_ERROR(lr
18cf0 63 31 29 20 29 7b 0a 20 20 20 20 20 20 6c 72 63  c1) ){.      lrc
18d00 31 45 72 72 6e 6f 20 3d 20 70 46 69 6c 65 2d 3e  1Errno = pFile->
18d10 6c 61 73 74 45 72 72 6e 6f 3b 0a 20 20 20 20 7d  lastErrno;.    }
18d20 0a 20 20 20 20 2f 2a 20 44 72 6f 70 20 74 68 65  .    /* Drop the
18d30 20 74 65 6d 70 6f 72 61 72 79 20 50 45 4e 44 49   temporary PENDI
18d40 4e 47 20 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20 6c  NG lock */.    l
18d50 72 63 32 20 3d 20 61 66 70 53 65 74 4c 6f 63 6b  rc2 = afpSetLock
18d60 28 63 6f 6e 74 65 78 74 2d 3e 64 62 50 61 74 68  (context->dbPath
18d70 2c 20 70 46 69 6c 65 2c 20 50 45 4e 44 49 4e 47  , pFile, PENDING
18d80 5f 42 59 54 45 2c 20 31 2c 20 30 29 3b 0a 20 20  _BYTE, 1, 0);.  
18d90 20 20 0a 20 20 20 20 69 66 28 20 49 53 5f 4c 4f    .    if( IS_LO
18da0 43 4b 5f 45 52 52 4f 52 28 6c 72 63 31 29 20 29  CK_ERROR(lrc1) )
18db0 20 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e   {.      pFile->
18dc0 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6c 72 63 31  lastErrno = lrc1
18dd0 45 72 72 6e 6f 3b 0a 20 20 20 20 20 20 72 63 20  Errno;.      rc 
18de0 3d 20 6c 72 63 31 3b 0a 20 20 20 20 20 20 67 6f  = lrc1;.      go
18df0 74 6f 20 61 66 70 5f 65 6e 64 5f 6c 6f 63 6b 3b  to afp_end_lock;
18e00 0a 20 20 20 20 7d 20 65 6c 73 65 20 69 66 28 20  .    } else if( 
18e10 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 6c 72  IS_LOCK_ERROR(lr
18e20 63 32 29 20 29 7b 0a 20 20 20 20 20 20 72 63 20  c2) ){.      rc 
18e30 3d 20 6c 72 63 32 3b 0a 20 20 20 20 20 20 67 6f  = lrc2;.      go
18e40 74 6f 20 61 66 70 5f 65 6e 64 5f 6c 6f 63 6b 3b  to afp_end_lock;
18e50 0a 20 20 20 20 7d 20 65 6c 73 65 20 69 66 28 20  .    } else if( 
18e60 6c 72 63 31 20 21 3d 20 53 51 4c 49 54 45 5f 4f  lrc1 != SQLITE_O
18e70 4b 20 29 20 7b 0a 20 20 20 20 20 20 72 63 20 3d  K ) {.      rc =
18e80 20 6c 72 63 31 3b 0a 20 20 20 20 7d 20 65 6c 73   lrc1;.    } els
18e90 65 20 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d  e {.      pFile-
18ea0 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 53 48 41  >eFileLock = SHA
18eb0 52 45 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20 20 20  RED_LOCK;.      
18ec0 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 2b 2b 3b  pInode->nLock++;
18ed0 0a 20 20 20 20 20 20 70 49 6e 6f 64 65 2d 3e 6e  .      pInode->n
18ee0 53 68 61 72 65 64 20 3d 20 31 3b 0a 20 20 20 20  Shared = 1;.    
18ef0 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 65 46  }.  }else if( eF
18f00 69 6c 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49  ileLock==EXCLUSI
18f10 56 45 5f 4c 4f 43 4b 20 26 26 20 70 49 6e 6f 64  VE_LOCK && pInod
18f20 65 2d 3e 6e 53 68 61 72 65 64 3e 31 20 29 7b 0a  e->nShared>1 ){.
18f30 20 20 20 20 2f 2a 20 57 65 20 61 72 65 20 74 72      /* We are tr
18f40 79 69 6e 67 20 66 6f 72 20 61 6e 20 65 78 63 6c  ying for an excl
18f50 75 73 69 76 65 20 6c 6f 63 6b 20 62 75 74 20 61  usive lock but a
18f60 6e 6f 74 68 65 72 20 74 68 72 65 61 64 20 69 6e  nother thread in
18f70 20 74 68 69 73 0a 20 20 20 20 20 2a 2a 20 73 61   this.     ** sa
18f80 6d 65 20 70 72 6f 63 65 73 73 20 69 73 20 73 74  me process is st
18f90 69 6c 6c 20 68 6f 6c 64 69 6e 67 20 61 20 73 68  ill holding a sh
18fa0 61 72 65 64 20 6c 6f 63 6b 2e 20 2a 2f 0a 20 20  ared lock. */.  
18fb0 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55    rc = SQLITE_BU
18fc0 53 59 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  SY;.  }else{.   
18fd0 20 2f 2a 20 54 68 65 20 72 65 71 75 65 73 74 20   /* The request 
18fe0 77 61 73 20 66 6f 72 20 61 20 52 45 53 45 52 56  was for a RESERV
18ff0 45 44 20 6f 72 20 45 58 43 4c 55 53 49 56 45 20  ED or EXCLUSIVE 
19000 6c 6f 63 6b 2e 20 20 49 74 20 69 73 0a 20 20 20  lock.  It is.   
19010 20 2a 2a 20 61 73 73 75 6d 65 64 20 74 68 61 74   ** assumed that
19020 20 74 68 65 72 65 20 69 73 20 61 20 53 48 41 52   there is a SHAR
19030 45 44 20 6f 72 20 67 72 65 61 74 65 72 20 6c 6f  ED or greater lo
19040 63 6b 20 6f 6e 20 74 68 65 20 66 69 6c 65 0a 20  ck on the file. 
19050 20 20 20 2a 2a 20 61 6c 72 65 61 64 79 2e 0a 20     ** already.. 
19060 20 20 20 2a 2f 0a 20 20 20 20 69 6e 74 20 66 61     */.    int fa
19070 69 6c 65 64 20 3d 20 30 3b 0a 20 20 20 20 61 73  iled = 0;.    as
19080 73 65 72 74 28 20 30 21 3d 70 46 69 6c 65 2d 3e  sert( 0!=pFile->
19090 65 46 69 6c 65 4c 6f 63 6b 20 29 3b 0a 20 20 20  eFileLock );.   
190a0 20 69 66 20 28 65 46 69 6c 65 4c 6f 63 6b 20 3e   if (eFileLock >
190b0 3d 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20  = RESERVED_LOCK 
190c0 26 26 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c  && pFile->eFileL
190d0 6f 63 6b 20 3c 20 52 45 53 45 52 56 45 44 5f 4c  ock < RESERVED_L
190e0 4f 43 4b 29 20 7b 0a 20 20 20 20 20 20 20 20 2f  OCK) {.        /
190f0 2a 20 41 63 71 75 69 72 65 20 61 20 52 45 53 45  * Acquire a RESE
19100 52 56 45 44 20 6c 6f 63 6b 20 2a 2f 0a 20 20 20  RVED lock */.   
19110 20 20 20 20 20 66 61 69 6c 65 64 20 3d 20 61 66       failed = af
19120 70 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74  pSetLock(context
19130 2d 3e 64 62 50 61 74 68 2c 20 70 46 69 6c 65 2c  ->dbPath, pFile,
19140 20 52 45 53 45 52 56 45 44 5f 42 59 54 45 2c 20   RESERVED_BYTE, 
19150 31 2c 31 29 3b 0a 20 20 20 20 20 20 69 66 28 20  1,1);.      if( 
19160 21 66 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 20  !failed ){.     
19170 20 20 20 63 6f 6e 74 65 78 74 2d 3e 72 65 73 65     context->rese
19180 72 76 65 64 20 3d 20 31 3b 0a 20 20 20 20 20 20  rved = 1;.      
19190 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28  }.    }.    if (
191a0 21 66 61 69 6c 65 64 20 26 26 20 65 46 69 6c 65  !failed && eFile
191b0 4c 6f 63 6b 20 3d 3d 20 45 58 43 4c 55 53 49 56  Lock == EXCLUSIV
191c0 45 5f 4c 4f 43 4b 29 20 7b 0a 20 20 20 20 20 20  E_LOCK) {.      
191d0 2f 2a 20 41 63 71 75 69 72 65 20 61 6e 20 45 58  /* Acquire an EX
191e0 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 2a 2f 0a  CLUSIVE lock */.
191f0 20 20 20 20 20 20 20 20 0a 20 20 20 20 20 20 2f          .      /
19200 2a 20 52 65 6d 6f 76 65 20 74 68 65 20 73 68 61  * Remove the sha
19210 72 65 64 20 6c 6f 63 6b 20 62 65 66 6f 72 65 20  red lock before 
19220 74 72 79 69 6e 67 20 74 68 65 20 72 61 6e 67 65  trying the range
19230 2e 20 20 77 65 27 6c 6c 20 6e 65 65 64 20 74 6f  .  we'll need to
19240 20 0a 20 20 20 20 20 20 2a 2a 20 72 65 65 73 74   .      ** reest
19250 61 62 6c 69 73 68 20 74 68 65 20 73 68 61 72 65  ablish the share
19260 64 20 6c 6f 63 6b 20 69 66 20 77 65 20 63 61 6e  d lock if we can
19270 27 74 20 67 65 74 20 74 68 65 20 20 61 66 70 55  't get the  afpU
19280 6e 6c 6f 63 6b 0a 20 20 20 20 20 20 2a 2f 0a 20  nlock.      */. 
19290 20 20 20 20 20 69 66 28 20 21 28 66 61 69 6c 65       if( !(faile
192a0 64 20 3d 20 61 66 70 53 65 74 4c 6f 63 6b 28 63  d = afpSetLock(c
192b0 6f 6e 74 65 78 74 2d 3e 64 62 50 61 74 68 2c 20  ontext->dbPath, 
192c0 70 46 69 6c 65 2c 20 53 48 41 52 45 44 5f 46 49  pFile, SHARED_FI
192d0 52 53 54 20 2b 0a 20 20 20 20 20 20 20 20 20 20  RST +.          
192e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
192f0 49 6e 6f 64 65 2d 3e 73 68 61 72 65 64 42 79 74  Inode->sharedByt
19300 65 2c 20 31 2c 20 30 29 29 20 29 7b 0a 20 20 20  e, 1, 0)) ){.   
19310 20 20 20 20 20 69 6e 74 20 66 61 69 6c 65 64 32       int failed2
19320 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
19330 20 20 20 20 20 20 2f 2a 20 6e 6f 77 20 61 74 74        /* now att
19340 65 6d 6d 70 74 20 74 6f 20 67 65 74 20 74 68 65  emmpt to get the
19350 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20   exclusive lock 
19360 72 61 6e 67 65 20 2a 2f 0a 20 20 20 20 20 20 20  range */.       
19370 20 66 61 69 6c 65 64 20 3d 20 61 66 70 53 65 74   failed = afpSet
19380 4c 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 64 62  Lock(context->db
19390 50 61 74 68 2c 20 70 46 69 6c 65 2c 20 53 48 41  Path, pFile, SHA
193a0 52 45 44 5f 46 49 52 53 54 2c 20 0a 20 20 20 20  RED_FIRST, .    
193b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
193c0 20 20 20 20 20 20 20 20 20 20 20 53 48 41 52 45             SHARE
193d0 44 5f 53 49 5a 45 2c 20 31 29 3b 0a 20 20 20 20  D_SIZE, 1);.    
193e0 20 20 20 20 69 66 28 20 66 61 69 6c 65 64 20 26      if( failed &
193f0 26 20 28 66 61 69 6c 65 64 32 20 3d 20 61 66 70  & (failed2 = afp
19400 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74 2d  SetLock(context-
19410 3e 64 62 50 61 74 68 2c 20 70 46 69 6c 65 2c 20  >dbPath, pFile, 
19420 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
19430 20 20 20 20 20 20 20 20 53 48 41 52 45 44 5f 46          SHARED_F
19440 49 52 53 54 20 2b 20 70 49 6e 6f 64 65 2d 3e 73  IRST + pInode->s
19450 68 61 72 65 64 42 79 74 65 2c 20 31 2c 20 31 29  haredByte, 1, 1)
19460 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f  ) ){.          /
19470 2a 20 43 61 6e 27 74 20 72 65 65 73 74 61 62 6c  * Can't reestabl
19480 69 73 68 20 74 68 65 20 73 68 61 72 65 64 20 6c  ish the shared l
19490 6f 63 6b 2e 20 20 53 71 6c 69 74 65 20 63 61 6e  ock.  Sqlite can
194a0 27 74 20 64 65 61 6c 2c 20 74 68 69 73 20 69 73  't deal, this is
194b0 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 61 20  .          ** a 
194c0 63 72 69 74 69 63 61 6c 20 49 2f 4f 20 65 72 72  critical I/O err
194d0 6f 72 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a  or.          */.
194e0 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 28            rc = (
194f0 28 66 61 69 6c 65 64 20 26 20 53 51 4c 49 54 45  (failed & SQLITE
19500 5f 49 4f 45 52 52 29 20 3d 3d 20 53 51 4c 49 54  _IOERR) == SQLIT
19510 45 5f 49 4f 45 52 52 29 20 3f 20 66 61 69 6c 65  E_IOERR) ? faile
19520 64 32 20 3a 20 0a 20 20 20 20 20 20 20 20 20 20  d2 : .          
19530 20 20 20 20 20 53 51 4c 49 54 45 5f 49 4f 45 52       SQLITE_IOER
19540 52 5f 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 20 20  R_LOCK;.        
19550 20 20 67 6f 74 6f 20 61 66 70 5f 65 6e 64 5f 6c    goto afp_end_l
19560 6f 63 6b 3b 0a 20 20 20 20 20 20 20 20 7d 20 0a  ock;.        } .
19570 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
19580 20 20 20 20 20 72 63 20 3d 20 66 61 69 6c 65 64       rc = failed
19590 3b 20 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  ; .      }.    }
195a0 0a 20 20 20 20 69 66 28 20 66 61 69 6c 65 64 20  .    if( failed 
195b0 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 66 61  ){.      rc = fa
195c0 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  iled;.    }.  }.
195d0 20 20 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c    .  if( rc==SQL
195e0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 46  ITE_OK ){.    pF
195f0 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d  ile->eFileLock =
19600 20 65 46 69 6c 65 4c 6f 63 6b 3b 0a 20 20 20 20   eFileLock;.    
19610 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63  pInode->eFileLoc
19620 6b 20 3d 20 65 46 69 6c 65 4c 6f 63 6b 3b 0a 20  k = eFileLock;. 
19630 20 7d 65 6c 73 65 20 69 66 28 20 65 46 69 6c 65   }else if( eFile
19640 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f  Lock==EXCLUSIVE_
19650 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 70 46 69 6c  LOCK ){.    pFil
19660 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 50  e->eFileLock = P
19670 45 4e 44 49 4e 47 5f 4c 4f 43 4b 3b 0a 20 20 20  ENDING_LOCK;.   
19680 20 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f   pInode->eFileLo
19690 63 6b 20 3d 20 50 45 4e 44 49 4e 47 5f 4c 4f 43  ck = PENDING_LOC
196a0 4b 3b 0a 20 20 7d 0a 20 20 0a 61 66 70 5f 65 6e  K;.  }.  .afp_en
196b0 64 5f 6c 6f 63 6b 3a 0a 20 20 75 6e 69 78 4c 65  d_lock:.  unixLe
196c0 61 76 65 4d 75 74 65 78 28 29 3b 0a 20 20 4f 53  aveMutex();.  OS
196d0 54 52 41 43 45 28 28 22 4c 4f 43 4b 20 20 20 20  TRACE(("LOCK    
196e0 25 64 20 25 73 20 25 73 20 28 61 66 70 29 5c 6e  %d %s %s (afp)\n
196f0 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 61 7a 46  ", pFile->h, azF
19700 69 6c 65 4c 6f 63 6b 28 65 46 69 6c 65 4c 6f 63  ileLock(eFileLoc
19710 6b 29 2c 20 0a 20 20 20 20 20 20 20 20 20 72 63  k), .         rc
19720 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 3f 20 22 6f  ==SQLITE_OK ? "o
19730 6b 22 20 3a 20 22 66 61 69 6c 65 64 22 29 29 3b  k" : "failed"));
19740 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
19750 0a 2f 2a 0a 2a 2a 20 4c 6f 77 65 72 20 74 68 65  ./*.** Lower the
19760 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f   locking level o
19770 6e 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  n file descripto
19780 72 20 70 46 69 6c 65 20 74 6f 20 65 46 69 6c 65  r pFile to eFile
19790 4c 6f 63 6b 2e 20 20 65 46 69 6c 65 4c 6f 63 6b  Lock.  eFileLock
197a0 0a 2a 2a 20 6d 75 73 74 20 62 65 20 65 69 74 68  .** must be eith
197b0 65 72 20 4e 4f 5f 4c 4f 43 4b 20 6f 72 20 53 48  er NO_LOCK or SH
197c0 41 52 45 44 5f 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a  ARED_LOCK..**.**
197d0 20 49 66 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20   If the locking 
197e0 6c 65 76 65 6c 20 6f 66 20 74 68 65 20 66 69 6c  level of the fil
197f0 65 20 64 65 73 63 72 69 70 74 6f 72 20 69 73 20  e descriptor is 
19800 61 6c 72 65 61 64 79 20 61 74 20 6f 72 20 62 65  already at or be
19810 6c 6f 77 0a 2a 2a 20 74 68 65 20 72 65 71 75 65  low.** the reque
19820 73 74 65 64 20 6c 6f 63 6b 69 6e 67 20 6c 65 76  sted locking lev
19830 65 6c 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65  el, this routine
19840 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a   is a no-op..*/.
19850 73 74 61 74 69 63 20 69 6e 74 20 61 66 70 55 6e  static int afpUn
19860 6c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c  lock(sqlite3_fil
19870 65 20 2a 69 64 2c 20 69 6e 74 20 65 46 69 6c 65  e *id, int eFile
19880 4c 6f 63 6b 29 20 7b 0a 20 20 69 6e 74 20 72 63  Lock) {.  int rc
19890 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
198a0 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20  unixFile *pFile 
198b0 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b  = (unixFile*)id;
198c0 0a 20 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f  .  unixInodeInfo
198d0 20 2a 70 49 6e 6f 64 65 3b 0a 20 20 61 66 70 4c   *pInode;.  afpL
198e0 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 63  ockingContext *c
198f0 6f 6e 74 65 78 74 20 3d 20 28 61 66 70 4c 6f 63  ontext = (afpLoc
19900 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 29 20 70  kingContext *) p
19910 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e  File->lockingCon
19920 74 65 78 74 3b 0a 20 20 69 6e 74 20 73 6b 69 70  text;.  int skip
19930 53 68 61 72 65 64 20 3d 20 30 3b 0a 23 69 66 64  Shared = 0;.#ifd
19940 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20  ef SQLITE_TEST. 
19950 20 69 6e 74 20 68 20 3d 20 70 46 69 6c 65 2d 3e   int h = pFile->
19960 68 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 61 73 73  h;.#endif..  ass
19970 65 72 74 28 20 70 46 69 6c 65 20 29 3b 0a 20 20  ert( pFile );.  
19980 4f 53 54 52 41 43 45 28 28 22 55 4e 4c 4f 43 4b  OSTRACE(("UNLOCK
19990 20 20 25 64 20 25 64 20 77 61 73 20 25 64 28 25    %d %d was %d(%
199a0 64 2c 25 64 29 20 70 69 64 3d 25 64 20 28 61 66  d,%d) pid=%d (af
199b0 70 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c  p)\n", pFile->h,
199c0 20 65 46 69 6c 65 4c 6f 63 6b 2c 0a 20 20 20 20   eFileLock,.    
199d0 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 65 46         pFile->eF
199e0 69 6c 65 4c 6f 63 6b 2c 20 70 46 69 6c 65 2d 3e  ileLock, pFile->
199f0 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63  pInode->eFileLoc
19a00 6b 2c 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65  k, pFile->pInode
19a10 2d 3e 6e 53 68 61 72 65 64 2c 0a 20 20 20 20 20  ->nShared,.     
19a20 20 20 20 20 20 20 67 65 74 70 69 64 28 29 29 29        getpid()))
19a30 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 65 46 69  ;..  assert( eFi
19a40 6c 65 4c 6f 63 6b 3c 3d 53 48 41 52 45 44 5f 4c  leLock<=SHARED_L
19a50 4f 43 4b 20 29 3b 0a 20 20 69 66 28 20 70 46 69  OCK );.  if( pFi
19a60 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3c 3d 65  le->eFileLock<=e
19a70 46 69 6c 65 4c 6f 63 6b 20 29 7b 0a 20 20 20 20  FileLock ){.    
19a80 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
19a90 3b 0a 20 20 7d 0a 20 20 75 6e 69 78 45 6e 74 65  ;.  }.  unixEnte
19aa0 72 4d 75 74 65 78 28 29 3b 0a 20 20 70 49 6e 6f  rMutex();.  pIno
19ab0 64 65 20 3d 20 70 46 69 6c 65 2d 3e 70 49 6e 6f  de = pFile->pIno
19ac0 64 65 3b 0a 20 20 61 73 73 65 72 74 28 20 70 49  de;.  assert( pI
19ad0 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64 21 3d 30  node->nShared!=0
19ae0 20 29 3b 0a 20 20 69 66 28 20 70 46 69 6c 65 2d   );.  if( pFile-
19af0 3e 65 46 69 6c 65 4c 6f 63 6b 3e 53 48 41 52 45  >eFileLock>SHARE
19b00 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 61 73  D_LOCK ){.    as
19b10 73 65 72 74 28 20 70 49 6e 6f 64 65 2d 3e 65 46  sert( pInode->eF
19b20 69 6c 65 4c 6f 63 6b 3d 3d 70 46 69 6c 65 2d 3e  ileLock==pFile->
19b30 65 46 69 6c 65 4c 6f 63 6b 20 29 3b 0a 20 20 20  eFileLock );.   
19b40 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72   SimulateIOError
19b50 42 65 6e 69 67 6e 28 31 29 3b 0a 20 20 20 20 53  Benign(1);.    S
19b60 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20  imulateIOError( 
19b70 68 3d 28 2d 31 29 20 29 0a 20 20 20 20 53 69 6d  h=(-1) ).    Sim
19b80 75 6c 61 74 65 49 4f 45 72 72 6f 72 42 65 6e 69  ulateIOErrorBeni
19b90 67 6e 28 30 29 3b 0a 20 20 20 20 0a 23 69 66 6e  gn(0);.    .#ifn
19ba0 64 65 66 20 4e 44 45 42 55 47 0a 20 20 20 20 2f  def NDEBUG.    /
19bb0 2a 20 57 68 65 6e 20 72 65 64 75 63 69 6e 67 20  * When reducing 
19bc0 61 20 6c 6f 63 6b 20 73 75 63 68 20 74 68 61 74  a lock such that
19bd0 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 65 73   other processes
19be0 20 63 61 6e 20 73 74 61 72 74 0a 20 20 20 20 2a   can start.    *
19bf0 2a 20 72 65 61 64 69 6e 67 20 74 68 65 20 64 61  * reading the da
19c00 74 61 62 61 73 65 20 66 69 6c 65 20 61 67 61 69  tabase file agai
19c10 6e 2c 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61  n, make sure tha
19c20 74 20 74 68 65 0a 20 20 20 20 2a 2a 20 74 72 61  t the.    ** tra
19c30 6e 73 61 63 74 69 6f 6e 20 63 6f 75 6e 74 65 72  nsaction counter
19c40 20 77 61 73 20 75 70 64 61 74 65 64 20 69 66 20   was updated if 
19c50 61 6e 79 20 70 61 72 74 20 6f 66 20 74 68 65 20  any part of the 
19c60 64 61 74 61 62 61 73 65 0a 20 20 20 20 2a 2a 20  database.    ** 
19c70 66 69 6c 65 20 63 68 61 6e 67 65 64 2e 20 20 49  file changed.  I
19c80 66 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  f the transactio
19c90 6e 20 63 6f 75 6e 74 65 72 20 69 73 20 6e 6f 74  n counter is not
19ca0 20 75 70 64 61 74 65 64 2c 0a 20 20 20 20 2a 2a   updated,.    **
19cb0 20 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f   other connectio
19cc0 6e 73 20 74 6f 20 74 68 65 20 73 61 6d 65 20 66  ns to the same f
19cd0 69 6c 65 20 6d 69 67 68 74 20 6e 6f 74 20 72 65  ile might not re
19ce0 61 6c 69 7a 65 20 74 68 61 74 0a 20 20 20 20 2a  alize that.    *
19cf0 2a 20 74 68 65 20 66 69 6c 65 20 68 61 73 20 63  * the file has c
19d00 68 61 6e 67 65 64 20 61 6e 64 20 68 65 6e 63 65  hanged and hence
19d10 20 6d 69 67 68 74 20 6e 6f 74 20 6b 6e 6f 77 20   might not know 
19d20 74 6f 20 66 6c 75 73 68 20 74 68 65 69 72 0a 20  to flush their. 
19d30 20 20 20 2a 2a 20 63 61 63 68 65 2e 20 20 54 68     ** cache.  Th
19d40 65 20 75 73 65 20 6f 66 20 61 20 73 74 61 6c 65  e use of a stale
19d50 20 63 61 63 68 65 20 63 61 6e 20 6c 65 61 64 20   cache can lead 
19d60 74 6f 20 64 61 74 61 62 61 73 65 20 63 6f 72 72  to database corr
19d70 75 70 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20  uption..    */. 
19d80 20 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65     assert( pFile
19d90 2d 3e 69 6e 4e 6f 72 6d 61 6c 57 72 69 74 65 3d  ->inNormalWrite=
19da0 3d 30 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c  =0.           ||
19db0 20 70 46 69 6c 65 2d 3e 64 62 55 70 64 61 74 65   pFile->dbUpdate
19dc0 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 20 20 7c  ==0.           |
19dd0 7c 20 70 46 69 6c 65 2d 3e 74 72 61 6e 73 43 6e  | pFile->transCn
19de0 74 72 43 68 6e 67 3d 3d 31 20 29 3b 0a 20 20 20  trChng==1 );.   
19df0 20 70 46 69 6c 65 2d 3e 69 6e 4e 6f 72 6d 61 6c   pFile->inNormal
19e00 57 72 69 74 65 20 3d 20 30 3b 0a 23 65 6e 64 69  Write = 0;.#endi
19e10 66 0a 20 20 20 20 0a 20 20 20 20 69 66 28 20 70  f.    .    if( p
19e20 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d  File->eFileLock=
19e30 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20  =EXCLUSIVE_LOCK 
19e40 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 61 66  ){.      rc = af
19e50 70 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74  pSetLock(context
19e60 2d 3e 64 62 50 61 74 68 2c 20 70 46 69 6c 65 2c  ->dbPath, pFile,
19e70 20 53 48 41 52 45 44 5f 46 49 52 53 54 2c 20 53   SHARED_FIRST, S
19e80 48 41 52 45 44 5f 53 49 5a 45 2c 20 30 29 3b 0a  HARED_SIZE, 0);.
19e90 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
19ea0 4c 49 54 45 5f 4f 4b 20 26 26 20 28 65 46 69 6c  LITE_OK && (eFil
19eb0 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f  eLock==SHARED_LO
19ec0 43 4b 20 7c 7c 20 70 49 6e 6f 64 65 2d 3e 6e 53  CK || pInode->nS
19ed0 68 61 72 65 64 3e 31 29 20 29 7b 0a 20 20 20 20  hared>1) ){.    
19ee0 20 20 20 20 2f 2a 20 6f 6e 6c 79 20 72 65 2d 65      /* only re-e
19ef0 73 74 61 62 6c 69 73 68 20 74 68 65 20 73 68 61  stablish the sha
19f00 72 65 64 20 6c 6f 63 6b 20 69 66 20 6e 65 63 65  red lock if nece
19f10 73 73 61 72 79 20 2a 2f 0a 20 20 20 20 20 20 20  ssary */.       
19f20 20 69 6e 74 20 73 68 61 72 65 64 4c 6f 63 6b 42   int sharedLockB
19f30 79 74 65 20 3d 20 53 48 41 52 45 44 5f 46 49 52  yte = SHARED_FIR
19f40 53 54 2b 70 49 6e 6f 64 65 2d 3e 73 68 61 72 65  ST+pInode->share
19f50 64 42 79 74 65 3b 0a 20 20 20 20 20 20 20 20 72  dByte;.        r
19f60 63 20 3d 20 61 66 70 53 65 74 4c 6f 63 6b 28 63  c = afpSetLock(c
19f70 6f 6e 74 65 78 74 2d 3e 64 62 50 61 74 68 2c 20  ontext->dbPath, 
19f80 70 46 69 6c 65 2c 20 73 68 61 72 65 64 4c 6f 63  pFile, sharedLoc
19f90 6b 42 79 74 65 2c 20 31 2c 20 31 29 3b 0a 20 20  kByte, 1, 1);.  
19fa0 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20      } else {.   
19fb0 20 20 20 20 20 73 6b 69 70 53 68 61 72 65 64 20       skipShared 
19fc0 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = 1;.      }.   
19fd0 20 7d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53   }.    if( rc==S
19fe0 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 46 69 6c  QLITE_OK && pFil
19ff0 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3e 3d 50 45  e->eFileLock>=PE
1a000 4e 44 49 4e 47 5f 4c 4f 43 4b 20 29 7b 0a 20 20  NDING_LOCK ){.  
1a010 20 20 20 20 72 63 20 3d 20 61 66 70 53 65 74 4c      rc = afpSetL
1a020 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 64 62 50  ock(context->dbP
1a030 61 74 68 2c 20 70 46 69 6c 65 2c 20 50 45 4e 44  ath, pFile, PEND
1a040 49 4e 47 5f 42 59 54 45 2c 20 31 2c 20 30 29 3b  ING_BYTE, 1, 0);
1a050 0a 20 20 20 20 7d 20 0a 20 20 20 20 69 66 28 20  .    } .    if( 
1a060 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
1a070 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63   pFile->eFileLoc
1a080 6b 3e 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b  k>=RESERVED_LOCK
1a090 20 26 26 20 63 6f 6e 74 65 78 74 2d 3e 72 65 73   && context->res
1a0a0 65 72 76 65 64 20 29 7b 0a 20 20 20 20 20 20 72  erved ){.      r
1a0b0 63 20 3d 20 61 66 70 53 65 74 4c 6f 63 6b 28 63  c = afpSetLock(c
1a0c0 6f 6e 74 65 78 74 2d 3e 64 62 50 61 74 68 2c 20  ontext->dbPath, 
1a0d0 70 46 69 6c 65 2c 20 52 45 53 45 52 56 45 44 5f  pFile, RESERVED_
1a0e0 42 59 54 45 2c 20 31 2c 20 30 29 3b 0a 20 20 20  BYTE, 1, 0);.   
1a0f0 20 20 20 69 66 28 20 21 72 63 20 29 7b 20 0a 20     if( !rc ){ . 
1a100 20 20 20 20 20 20 20 63 6f 6e 74 65 78 74 2d 3e         context->
1a110 72 65 73 65 72 76 65 64 20 3d 20 30 3b 20 0a 20  reserved = 0; . 
1a120 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
1a130 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
1a140 4f 4b 20 26 26 20 28 65 46 69 6c 65 4c 6f 63 6b  OK && (eFileLock
1a150 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 7c 7c  ==SHARED_LOCK ||
1a160 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64   pInode->nShared
1a170 3e 31 29 29 7b 0a 20 20 20 20 20 20 70 49 6e 6f  >1)){.      pIno
1a180 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20  de->eFileLock = 
1a190 53 48 41 52 45 44 5f 4c 4f 43 4b 3b 0a 20 20 20  SHARED_LOCK;.   
1a1a0 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d   }.  }.  if( rc=
1a1b0 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 65 46  =SQLITE_OK && eF
1a1c0 69 6c 65 4c 6f 63 6b 3d 3d 4e 4f 5f 4c 4f 43 4b  ileLock==NO_LOCK
1a1d0 20 29 7b 0a 0a 20 20 20 20 2f 2a 20 44 65 63 72   ){..    /* Decr
1a1e0 65 6d 65 6e 74 20 74 68 65 20 73 68 61 72 65 64  ement the shared
1a1f0 20 6c 6f 63 6b 20 63 6f 75 6e 74 65 72 2e 20 20   lock counter.  
1a200 52 65 6c 65 61 73 65 20 74 68 65 20 6c 6f 63 6b  Release the lock
1a210 20 75 73 69 6e 67 20 61 6e 0a 20 20 20 20 2a 2a   using an.    **
1a220 20 4f 53 20 63 61 6c 6c 20 6f 6e 6c 79 20 77 68   OS call only wh
1a230 65 6e 20 61 6c 6c 20 74 68 72 65 61 64 73 20 69  en all threads i
1a240 6e 20 74 68 69 73 20 73 61 6d 65 20 70 72 6f 63  n this same proc
1a250 65 73 73 20 68 61 76 65 20 72 65 6c 65 61 73 65  ess have release
1a260 64 0a 20 20 20 20 2a 2a 20 74 68 65 20 6c 6f 63  d.    ** the loc
1a270 6b 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 75 6e  k..    */.    un
1a280 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6c 6f 6e 67  signed long long
1a290 20 73 68 61 72 65 64 4c 6f 63 6b 42 79 74 65 20   sharedLockByte 
1a2a0 3d 20 53 48 41 52 45 44 5f 46 49 52 53 54 2b 70  = SHARED_FIRST+p
1a2b0 49 6e 6f 64 65 2d 3e 73 68 61 72 65 64 42 79 74  Inode->sharedByt
1a2c0 65 3b 0a 20 20 20 20 70 49 6e 6f 64 65 2d 3e 6e  e;.    pInode->n
1a2d0 53 68 61 72 65 64 2d 2d 3b 0a 20 20 20 20 69 66  Shared--;.    if
1a2e0 28 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65  ( pInode->nShare
1a2f0 64 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 53 69  d==0 ){.      Si
1a300 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 42 65 6e  mulateIOErrorBen
1a310 69 67 6e 28 31 29 3b 0a 20 20 20 20 20 20 53 69  ign(1);.      Si
1a320 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 68  mulateIOError( h
1a330 3d 28 2d 31 29 20 29 0a 20 20 20 20 20 20 53 69  =(-1) ).      Si
1a340 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 42 65 6e  mulateIOErrorBen
1a350 69 67 6e 28 30 29 3b 0a 20 20 20 20 20 20 69 66  ign(0);.      if
1a360 28 20 21 73 6b 69 70 53 68 61 72 65 64 20 29 7b  ( !skipShared ){
1a370 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 61 66  .        rc = af
1a380 70 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74  pSetLock(context
1a390 2d 3e 64 62 50 61 74 68 2c 20 70 46 69 6c 65 2c  ->dbPath, pFile,
1a3a0 20 73 68 61 72 65 64 4c 6f 63 6b 42 79 74 65 2c   sharedLockByte,
1a3b0 20 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a   1, 0);.      }.
1a3c0 20 20 20 20 20 20 69 66 28 20 21 72 63 20 29 7b        if( !rc ){
1a3d0 0a 20 20 20 20 20 20 20 20 70 49 6e 6f 64 65 2d  .        pInode-
1a3e0 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 4e 4f 5f  >eFileLock = NO_
1a3f0 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 20 20 70 46  LOCK;.        pF
1a400 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d  ile->eFileLock =
1a410 20 4e 4f 5f 4c 4f 43 4b 3b 0a 20 20 20 20 20 20   NO_LOCK;.      
1a420 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  }.    }.    if( 
1a430 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
1a440 0a 20 20 20 20 20 20 70 49 6e 6f 64 65 2d 3e 6e  .      pInode->n
1a450 4c 6f 63 6b 2d 2d 3b 0a 20 20 20 20 20 20 61 73  Lock--;.      as
1a460 73 65 72 74 28 20 70 49 6e 6f 64 65 2d 3e 6e 4c  sert( pInode->nL
1a470 6f 63 6b 3e 3d 30 20 29 3b 0a 20 20 20 20 20 20  ock>=0 );.      
1a480 69 66 28 20 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63  if( pInode->nLoc
1a490 6b 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  k==0 ){.        
1a4a0 63 6c 6f 73 65 50 65 6e 64 69 6e 67 46 64 73 28  closePendingFds(
1a4b0 70 46 69 6c 65 29 3b 0a 20 20 20 20 20 20 7d 0a  pFile);.      }.
1a4c0 20 20 20 20 7d 0a 20 20 7d 0a 20 20 0a 20 20 75      }.  }.  .  u
1a4d0 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b  nixLeaveMutex();
1a4e0 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
1a4f0 45 5f 4f 4b 20 29 20 70 46 69 6c 65 2d 3e 65 46  E_OK ) pFile->eF
1a500 69 6c 65 4c 6f 63 6b 20 3d 20 65 46 69 6c 65 4c  ileLock = eFileL
1a510 6f 63 6b 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  ock;.  return rc
1a520 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65  ;.}../*.** Close
1a530 20 61 20 66 69 6c 65 20 26 20 63 6c 65 61 6e 75   a file & cleanu
1a540 70 20 41 46 50 20 73 70 65 63 69 66 69 63 20 6c  p AFP specific l
1a550 6f 63 6b 69 6e 67 20 63 6f 6e 74 65 78 74 20 0a  ocking context .
1a560 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 66  */.static int af
1a570 70 43 6c 6f 73 65 28 73 71 6c 69 74 65 33 5f 66  pClose(sqlite3_f
1a580 69 6c 65 20 2a 69 64 29 20 7b 0a 20 20 69 6e 74  ile *id) {.  int
1a590 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
1a5a0 0a 20 20 69 66 28 20 69 64 20 29 7b 0a 20 20 20  .  if( id ){.   
1a5b0 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65   unixFile *pFile
1a5c0 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64   = (unixFile*)id
1a5d0 3b 0a 20 20 20 20 61 66 70 55 6e 6c 6f 63 6b 28  ;.    afpUnlock(
1a5e0 69 64 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20 20  id, NO_LOCK);.  
1a5f0 20 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78    unixEnterMutex
1a600 28 29 3b 0a 20 20 20 20 69 66 28 20 70 46 69 6c  ();.    if( pFil
1a610 65 2d 3e 70 49 6e 6f 64 65 20 26 26 20 70 46 69  e->pInode && pFi
1a620 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63  le->pInode->nLoc
1a630 6b 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66  k ){.      /* If
1a640 20 74 68 65 72 65 20 61 72 65 20 6f 75 74 73 74   there are outst
1a650 61 6e 64 69 6e 67 20 6c 6f 63 6b 73 2c 20 64 6f  anding locks, do
1a660 20 6e 6f 74 20 61 63 74 75 61 6c 6c 79 20 63 6c   not actually cl
1a670 6f 73 65 20 74 68 65 20 66 69 6c 65 20 6a 75 73  ose the file jus
1a680 74 0a 20 20 20 20 20 20 2a 2a 20 79 65 74 20 62  t.      ** yet b
1a690 65 63 61 75 73 65 20 74 68 61 74 20 77 6f 75 6c  ecause that woul
1a6a0 64 20 63 6c 65 61 72 20 74 68 6f 73 65 20 6c 6f  d clear those lo
1a6b0 63 6b 73 2e 20 20 49 6e 73 74 65 61 64 2c 20 61  cks.  Instead, a
1a6c0 64 64 20 74 68 65 20 66 69 6c 65 0a 20 20 20 20  dd the file.    
1a6d0 20 20 2a 2a 20 64 65 73 63 72 69 70 74 6f 72 20    ** descriptor 
1a6e0 74 6f 20 70 49 6e 6f 64 65 2d 3e 61 50 65 6e 64  to pInode->aPend
1a6f0 69 6e 67 2e 20 20 49 74 20 77 69 6c 6c 20 62 65  ing.  It will be
1a700 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 63   automatically c
1a710 6c 6f 73 65 64 20 77 68 65 6e 0a 20 20 20 20 20  losed when.     
1a720 20 2a 2a 20 74 68 65 20 6c 61 73 74 20 6c 6f 63   ** the last loc
1a730 6b 20 69 73 20 63 6c 65 61 72 65 64 2e 0a 20 20  k is cleared..  
1a740 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 65 74      */.      set
1a750 50 65 6e 64 69 6e 67 46 64 28 70 46 69 6c 65 29  PendingFd(pFile)
1a760 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 6c 65  ;.    }.    rele
1a770 61 73 65 49 6e 6f 64 65 49 6e 66 6f 28 70 46 69  aseInodeInfo(pFi
1a780 6c 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  le);.    sqlite3
1a790 5f 66 72 65 65 28 70 46 69 6c 65 2d 3e 6c 6f 63  _free(pFile->loc
1a7a0 6b 69 6e 67 43 6f 6e 74 65 78 74 29 3b 0a 20 20  kingContext);.  
1a7b0 20 20 72 63 20 3d 20 63 6c 6f 73 65 55 6e 69 78    rc = closeUnix
1a7c0 46 69 6c 65 28 69 64 29 3b 0a 20 20 20 20 75 6e  File(id);.    un
1a7d0 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a  ixLeaveMutex();.
1a7e0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
1a7f0 0a 7d 0a 0a 23 65 6e 64 69 66 20 2f 2a 20 64 65  .}..#endif /* de
1a800 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29  fined(__APPLE__)
1a810 20 26 26 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c   && SQLITE_ENABL
1a820 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20  E_LOCKING_STYLE 
1a830 2a 2f 0a 2f 2a 0a 2a 2a 20 54 68 65 20 63 6f 64  */./*.** The cod
1a840 65 20 61 62 6f 76 65 20 69 73 20 74 68 65 20 41  e above is the A
1a850 46 50 20 6c 6f 63 6b 20 69 6d 70 6c 65 6d 65 6e  FP lock implemen
1a860 74 61 74 69 6f 6e 2e 20 20 54 68 65 20 63 6f 64  tation.  The cod
1a870 65 20 69 73 20 73 70 65 63 69 66 69 63 0a 2a 2a  e is specific.**
1a880 20 74 6f 20 4d 61 63 4f 53 58 20 61 6e 64 20 64   to MacOSX and d
1a890 6f 65 73 20 6e 6f 74 20 77 6f 72 6b 20 6f 6e 20  oes not work on 
1a8a0 6f 74 68 65 72 20 75 6e 69 78 20 70 6c 61 74 66  other unix platf
1a8b0 6f 72 6d 73 2e 20 20 4e 6f 20 61 6c 74 65 72 6e  orms.  No altern
1a8c0 61 74 69 76 65 0a 2a 2a 20 69 73 20 61 76 61 69  ative.** is avai
1a8d0 6c 61 62 6c 65 2e 20 20 49 66 20 79 6f 75 20 64  lable.  If you d
1a8e0 6f 6e 27 74 20 63 6f 6d 70 69 6c 65 20 66 6f 72  on't compile for
1a8f0 20 61 20 6d 61 63 2c 20 74 68 65 6e 20 74 68 65   a mac, then the
1a900 20 22 75 6e 69 78 2d 61 66 70 22 0a 2a 2a 20 56   "unix-afp".** V
1a910 46 53 20 69 73 20 6e 6f 74 20 61 76 61 69 6c 61  FS is not availa
1a920 62 6c 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a  ble..**.********
1a930 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e  ************* En
1a940 64 20 6f 66 20 74 68 65 20 41 46 50 20 6c 6f 63  d of the AFP loc
1a950 6b 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  k implementation
1a960 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a   ***************
1a970 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a  *******.********
1a980 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1a990 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1a9a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1a9b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1a9c0 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a  ******/../******
1a9d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1a9e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1a9f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1aa00 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1aa10 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a  ********.*******
1aa20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1aa30 2a 2a 2a 2a 20 42 65 67 69 6e 20 4e 46 53 20 4c  **** Begin NFS L
1aa40 6f 63 6b 69 6e 67 20 2a 2a 2a 2a 2a 2a 2a 2a 2a  ocking *********
1aa50 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1aa60 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 23 69 66 20 64 65  *******/..#if de
1aa70 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29  fined(__APPLE__)
1aa80 20 26 26 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c   && SQLITE_ENABL
1aa90 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a  E_LOCKING_STYLE.
1aaa0 2f 2a 0a 20 2a 2a 20 4c 6f 77 65 72 20 74 68 65  /*. ** Lower the
1aab0 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f   locking level o
1aac0 6e 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  n file descripto
1aad0 72 20 70 46 69 6c 65 20 74 6f 20 65 46 69 6c 65  r pFile to eFile
1aae0 4c 6f 63 6b 2e 20 20 65 46 69 6c 65 4c 6f 63 6b  Lock.  eFileLock
1aaf0 0a 20 2a 2a 20 6d 75 73 74 20 62 65 20 65 69 74  . ** must be eit
1ab00 68 65 72 20 4e 4f 5f 4c 4f 43 4b 20 6f 72 20 53  her NO_LOCK or S
1ab10 48 41 52 45 44 5f 4c 4f 43 4b 2e 0a 20 2a 2a 0a  HARED_LOCK.. **.
1ab20 20 2a 2a 20 49 66 20 74 68 65 20 6c 6f 63 6b 69   ** If the locki
1ab30 6e 67 20 6c 65 76 65 6c 20 6f 66 20 74 68 65 20  ng level of the 
1ab40 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
1ab50 69 73 20 61 6c 72 65 61 64 79 20 61 74 20 6f 72  is already at or
1ab60 20 62 65 6c 6f 77 0a 20 2a 2a 20 74 68 65 20 72   below. ** the r
1ab70 65 71 75 65 73 74 65 64 20 6c 6f 63 6b 69 6e 67  equested locking
1ab80 20 6c 65 76 65 6c 2c 20 74 68 69 73 20 72 6f 75   level, this rou
1ab90 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e  tine is a no-op.
1aba0 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  . */.static int 
1abb0 6e 66 73 55 6e 6c 6f 63 6b 28 73 71 6c 69 74 65  nfsUnlock(sqlite
1abc0 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20  3_file *id, int 
1abd0 65 46 69 6c 65 4c 6f 63 6b 29 7b 0a 20 20 72 65  eFileLock){.  re
1abe0 74 75 72 6e 20 70 6f 73 69 78 55 6e 6c 6f 63 6b  turn posixUnlock
1abf0 28 69 64 2c 20 65 46 69 6c 65 4c 6f 63 6b 2c 20  (id, eFileLock, 
1ac00 31 29 3b 0a 7d 0a 0a 23 65 6e 64 69 66 20 2f 2a  1);.}..#endif /*
1ac10 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45   defined(__APPLE
1ac20 5f 5f 29 20 26 26 20 53 51 4c 49 54 45 5f 45 4e  __) && SQLITE_EN
1ac30 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59  ABLE_LOCKING_STY
1ac40 4c 45 20 2a 2f 0a 2f 2a 0a 2a 2a 20 54 68 65 20  LE */./*.** The 
1ac50 63 6f 64 65 20 61 62 6f 76 65 20 69 73 20 74 68  code above is th
1ac60 65 20 4e 46 53 20 6c 6f 63 6b 20 69 6d 70 6c 65  e NFS lock imple
1ac70 6d 65 6e 74 61 74 69 6f 6e 2e 20 20 54 68 65 20  mentation.  The 
1ac80 63 6f 64 65 20 69 73 20 73 70 65 63 69 66 69 63  code is specific
1ac90 0a 2a 2a 20 74 6f 20 4d 61 63 4f 53 58 20 61 6e  .** to MacOSX an
1aca0 64 20 64 6f 65 73 20 6e 6f 74 20 77 6f 72 6b 20  d does not work 
1acb0 6f 6e 20 6f 74 68 65 72 20 75 6e 69 78 20 70 6c  on other unix pl
1acc0 61 74 66 6f 72 6d 73 2e 20 20 4e 6f 20 61 6c 74  atforms.  No alt
1acd0 65 72 6e 61 74 69 76 65 0a 2a 2a 20 69 73 20 61  ernative.** is a
1ace0 76 61 69 6c 61 62 6c 65 2e 20 20 0a 2a 2a 0a 2a  vailable.  .**.*
1acf0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1ad00 2a 2a 2a 2a 20 45 6e 64 20 6f 66 20 74 68 65 20  **** End of the 
1ad10 4e 46 53 20 6c 6f 63 6b 20 69 6d 70 6c 65 6d 65  NFS lock impleme
1ad20 6e 74 61 74 69 6f 6e 20 2a 2a 2a 2a 2a 2a 2a 2a  ntation ********
1ad30 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a  **************.*
1ad40 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1ad50 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1ad60 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1ad70 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1ad80 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a  *************/..
1ad90 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  /***************
1ada0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1adb0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1adc0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1add0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a  ***************.
1ade0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1adf0 20 4e 6f 6e 2d 6c 6f 63 6b 69 6e 67 20 73 71 6c   Non-locking sql
1ae00 69 74 65 33 5f 66 69 6c 65 20 6d 65 74 68 6f 64  ite3_file method
1ae10 73 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  s **************
1ae20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a  ***************.
1ae30 2a 2a 0a 2a 2a 20 54 68 65 20 6e 65 78 74 20 64  **.** The next d
1ae40 69 76 69 73 69 6f 6e 20 63 6f 6e 74 61 69 6e 73  ivision contains
1ae50 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 73   implementations
1ae60 20 66 6f 72 20 61 6c 6c 20 6d 65 74 68 6f 64 73   for all methods
1ae70 20 6f 66 20 74 68 65 20 0a 2a 2a 20 73 71 6c 69   of the .** sqli
1ae80 74 65 33 5f 66 69 6c 65 20 6f 62 6a 65 63 74 20  te3_file object 
1ae90 6f 74 68 65 72 20 74 68 61 6e 20 74 68 65 20 6c  other than the l
1aea0 6f 63 6b 69 6e 67 20 6d 65 74 68 6f 64 73 2e 20  ocking methods. 
1aeb0 20 54 68 65 20 6c 6f 63 6b 69 6e 67 0a 2a 2a 20   The locking.** 
1aec0 6d 65 74 68 6f 64 73 20 77 65 72 65 20 64 65 66  methods were def
1aed0 69 6e 65 64 20 69 6e 20 64 69 76 69 73 69 6f 6e  ined in division
1aee0 73 20 61 62 6f 76 65 20 28 6f 6e 65 20 6c 6f 63  s above (one loc
1aef0 6b 69 6e 67 20 6d 65 74 68 6f 64 20 70 65 72 0a  king method per.
1af00 2a 2a 20 64 69 76 69 73 69 6f 6e 29 2e 20 20 54  ** division).  T
1af10 68 6f 73 65 20 6d 65 74 68 6f 64 73 20 74 68 61  hose methods tha
1af20 74 20 61 72 65 20 63 6f 6d 6d 6f 6e 20 74 6f 20  t are common to 
1af30 61 6c 6c 20 6c 6f 63 6b 69 6e 67 20 6d 6f 64 65  all locking mode
1af40 73 0a 2a 2a 20 61 72 65 20 67 61 74 68 65 72 20  s.** are gather 
1af50 74 6f 67 65 74 68 65 72 20 69 6e 74 6f 20 74 68  together into th
1af60 69 73 20 64 69 76 69 73 69 6f 6e 2e 0a 2a 2f 0a  is division..*/.
1af70 0a 2f 2a 0a 2a 2a 20 53 65 65 6b 20 74 6f 20 74  ./*.** Seek to t
1af80 68 65 20 6f 66 66 73 65 74 20 70 61 73 73 65 64  he offset passed
1af90 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61   as the second a
1afa0 72 67 75 6d 65 6e 74 2c 20 74 68 65 6e 20 72 65  rgument, then re
1afb0 61 64 20 63 6e 74 20 0a 2a 2a 20 62 79 74 65 73  ad cnt .** bytes
1afc0 20 69 6e 74 6f 20 70 42 75 66 2e 20 52 65 74 75   into pBuf. Retu
1afd0 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  rn the number of
1afe0 20 62 79 74 65 73 20 61 63 74 75 61 6c 6c 79 20   bytes actually 
1aff0 72 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 4e 42 3a 20  read..**.** NB: 
1b000 20 49 66 20 79 6f 75 20 64 65 66 69 6e 65 20 55   If you define U
1b010 53 45 5f 50 52 45 41 44 20 6f 72 20 55 53 45 5f  SE_PREAD or USE_
1b020 50 52 45 41 44 36 34 2c 20 74 68 65 6e 20 69 74  PREAD64, then it
1b030 20 6d 69 67 68 74 20 61 6c 73 6f 0a 2a 2a 20 62   might also.** b
1b040 65 20 6e 65 63 65 73 73 61 72 79 20 74 6f 20 64  e necessary to d
1b050 65 66 69 6e 65 20 5f 58 4f 50 45 4e 5f 53 4f 55  efine _XOPEN_SOU
1b060 52 43 45 20 74 6f 20 62 65 20 35 30 30 2e 20 20  RCE to be 500.  
1b070 54 68 69 73 20 76 61 72 69 65 73 20 66 72 6f 6d  This varies from
1b080 0a 2a 2a 20 6f 6e 65 20 73 79 73 74 65 6d 20 74  .** one system t
1b090 6f 20 61 6e 6f 74 68 65 72 2e 20 20 53 69 6e 63  o another.  Sinc
1b0a0 65 20 53 51 4c 69 74 65 20 64 6f 65 73 20 6e 6f  e SQLite does no
1b0b0 74 20 64 65 66 69 6e 65 20 55 53 45 5f 50 52 45  t define USE_PRE
1b0c0 41 44 0a 2a 2a 20 61 6e 79 20 61 6e 79 20 66 6f  AD.** any any fo
1b0d0 72 6d 20 62 79 20 64 65 66 61 75 6c 74 2c 20 77  rm by default, w
1b0e0 65 20 77 69 6c 6c 20 6e 6f 74 20 61 74 74 65 6d  e will not attem
1b0f0 70 74 20 74 6f 20 64 65 66 69 6e 65 20 5f 58 4f  pt to define _XO
1b100 50 45 4e 5f 53 4f 55 52 43 45 2e 0a 2a 2a 20 53  PEN_SOURCE..** S
1b110 65 65 20 74 69 63 6b 65 74 73 20 23 32 37 34 31  ee tickets #2741
1b120 20 61 6e 64 20 23 32 36 38 31 2e 0a 2a 2a 0a 2a   and #2681..**.*
1b130 2a 20 54 6f 20 61 76 6f 69 64 20 73 74 6f 6d 70  * To avoid stomp
1b140 69 6e 67 20 74 68 65 20 65 72 72 6e 6f 20 76 61  ing the errno va
1b150 6c 75 65 20 6f 6e 20 61 20 66 61 69 6c 65 64 20  lue on a failed 
1b160 72 65 61 64 20 74 68 65 20 6c 61 73 74 45 72 72  read the lastErr
1b170 6e 6f 20 76 61 6c 75 65 0a 2a 2a 20 69 73 20 73  no value.** is s
1b180 65 74 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e  et before return
1b190 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ing..*/.static i
1b1a0 6e 74 20 73 65 65 6b 41 6e 64 52 65 61 64 28 75  nt seekAndRead(u
1b1b0 6e 69 78 46 69 6c 65 20 2a 69 64 2c 20 73 71 6c  nixFile *id, sql
1b1c0 69 74 65 33 5f 69 6e 74 36 34 20 6f 66 66 73 65  ite3_int64 offse
1b1d0 74 2c 20 76 6f 69 64 20 2a 70 42 75 66 2c 20 69  t, void *pBuf, i
1b1e0 6e 74 20 63 6e 74 29 7b 0a 20 20 69 6e 74 20 67  nt cnt){.  int g
1b1f0 6f 74 3b 0a 23 69 66 20 28 21 64 65 66 69 6e 65  ot;.#if (!define
1b200 64 28 55 53 45 5f 50 52 45 41 44 29 20 26 26 20  d(USE_PREAD) && 
1b210 21 64 65 66 69 6e 65 64 28 55 53 45 5f 50 52 45  !defined(USE_PRE
1b220 41 44 36 34 29 29 0a 20 20 69 36 34 20 6e 65 77  AD64)).  i64 new
1b230 4f 66 66 73 65 74 3b 0a 23 65 6e 64 69 66 0a 20  Offset;.#endif. 
1b240 20 54 49 4d 45 52 5f 53 54 41 52 54 3b 0a 23 69   TIMER_START;.#i
1b250 66 20 64 65 66 69 6e 65 64 28 55 53 45 5f 50 52  f defined(USE_PR
1b260 45 41 44 29 0a 20 20 64 6f 7b 20 67 6f 74 20 3d  EAD).  do{ got =
1b270 20 6f 73 50 72 65 61 64 28 69 64 2d 3e 68 2c 20   osPread(id->h, 
1b280 70 42 75 66 2c 20 63 6e 74 2c 20 6f 66 66 73 65  pBuf, cnt, offse
1b290 74 29 3b 20 7d 77 68 69 6c 65 28 20 67 6f 74 3c  t); }while( got<
1b2a0 30 20 26 26 20 65 72 72 6e 6f 3d 3d 45 49 4e 54  0 && errno==EINT
1b2b0 52 20 29 3b 0a 20 20 53 69 6d 75 6c 61 74 65 49  R );.  SimulateI
1b2c0 4f 45 72 72 6f 72 28 20 67 6f 74 20 3d 20 2d 31  OError( got = -1
1b2d0 20 29 3b 0a 23 65 6c 69 66 20 64 65 66 69 6e 65   );.#elif define
1b2e0 64 28 55 53 45 5f 50 52 45 41 44 36 34 29 0a 20  d(USE_PREAD64). 
1b2f0 20 64 6f 7b 20 67 6f 74 20 3d 20 6f 73 50 72 65   do{ got = osPre
1b300 61 64 36 34 28 69 64 2d 3e 68 2c 20 70 42 75 66  ad64(id->h, pBuf
1b310 2c 20 63 6e 74 2c 20 6f 66 66 73 65 74 29 3b 20  , cnt, offset); 
1b320 7d 77 68 69 6c 65 28 20 67 6f 74 3c 30 20 26 26  }while( got<0 &&
1b330 20 65 72 72 6e 6f 3d 3d 45 49 4e 54 52 29 3b 0a   errno==EINTR);.
1b340 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f    SimulateIOErro
1b350 72 28 20 67 6f 74 20 3d 20 2d 31 20 29 3b 0a 23  r( got = -1 );.#
1b360 65 6c 73 65 0a 20 20 6e 65 77 4f 66 66 73 65 74  else.  newOffset
1b370 20 3d 20 6c 73 65 65 6b 28 69 64 2d 3e 68 2c 20   = lseek(id->h, 
1b380 6f 66 66 73 65 74 2c 20 53 45 45 4b 5f 53 45 54  offset, SEEK_SET
1b390 29 3b 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45  );.  SimulateIOE
1b3a0 72 72 6f 72 28 20 6e 65 77 4f 66 66 73 65 74 2d  rror( newOffset-
1b3b0 2d 20 29 3b 0a 20 20 69 66 28 20 6e 65 77 4f 66  - );.  if( newOf
1b3c0 66 73 65 74 21 3d 6f 66 66 73 65 74 20 29 7b 0a  fset!=offset ){.
1b3d0 20 20 20 20 69 66 28 20 6e 65 77 4f 66 66 73 65      if( newOffse
1b3e0 74 20 3d 3d 20 2d 31 20 29 7b 0a 20 20 20 20 20  t == -1 ){.     
1b3f0 20 28 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 29   ((unixFile*)id)
1b400 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 65 72  ->lastErrno = er
1b410 72 6e 6f 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  rno;.    }else{.
1b420 20 20 20 20 20 20 28 28 75 6e 69 78 46 69 6c 65        ((unixFile
1b430 2a 29 69 64 29 2d 3e 6c 61 73 74 45 72 72 6e 6f  *)id)->lastErrno
1b440 20 3d 20 30 3b 09 09 09 0a 20 20 20 20 7d 0a 20   = 0;....    }. 
1b450 20 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20     return -1;.  
1b460 7d 0a 20 20 64 6f 7b 20 67 6f 74 20 3d 20 6f 73  }.  do{ got = os
1b470 52 65 61 64 28 69 64 2d 3e 68 2c 20 70 42 75 66  Read(id->h, pBuf
1b480 2c 20 63 6e 74 29 3b 20 7d 77 68 69 6c 65 28 20  , cnt); }while( 
1b490 67 6f 74 3c 30 20 26 26 20 65 72 72 6e 6f 3d 3d  got<0 && errno==
1b4a0 45 49 4e 54 52 20 29 3b 0a 23 65 6e 64 69 66 0a  EINTR );.#endif.
1b4b0 20 20 54 49 4d 45 52 5f 45 4e 44 3b 0a 20 20 69    TIMER_END;.  i
1b4c0 66 28 20 67 6f 74 3c 30 20 29 7b 0a 20 20 20 20  f( got<0 ){.    
1b4d0 28 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 29 2d  ((unixFile*)id)-
1b4e0 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 65 72 72  >lastErrno = err
1b4f0 6e 6f 3b 0a 20 20 7d 0a 20 20 4f 53 54 52 41 43  no;.  }.  OSTRAC
1b500 45 28 28 22 52 45 41 44 20 20 20 20 25 2d 33 64  E(("READ    %-3d
1b510 20 25 35 64 20 25 37 6c 6c 64 20 25 6c 6c 75 5c   %5d %7lld %llu\
1b520 6e 22 2c 20 69 64 2d 3e 68 2c 20 67 6f 74 2c 20  n", id->h, got, 
1b530 6f 66 66 73 65 74 2c 20 54 49 4d 45 52 5f 45 4c  offset, TIMER_EL
1b540 41 50 53 45 44 29 29 3b 0a 20 20 72 65 74 75 72  APSED));.  retur
1b550 6e 20 67 6f 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  n got;.}../*.** 
1b560 52 65 61 64 20 64 61 74 61 20 66 72 6f 6d 20 61  Read data from a
1b570 20 66 69 6c 65 20 69 6e 74 6f 20 61 20 62 75 66   file into a buf
1b580 66 65 72 2e 20 20 52 65 74 75 72 6e 20 53 51 4c  fer.  Return SQL
1b590 49 54 45 5f 4f 4b 20 69 66 20 61 6c 6c 0a 2a 2a  ITE_OK if all.**
1b5a0 20 62 79 74 65 73 20 77 65 72 65 20 72 65 61 64   bytes were read
1b5b0 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20 61 6e   successfully an
1b5c0 64 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 20 69  d SQLITE_IOERR i
1b5d0 66 20 61 6e 79 74 68 69 6e 67 20 67 6f 65 73 0a  f anything goes.
1b5e0 2a 2a 20 77 72 6f 6e 67 2e 0a 2a 2f 0a 73 74 61  ** wrong..*/.sta
1b5f0 74 69 63 20 69 6e 74 20 75 6e 69 78 52 65 61 64  tic int unixRead
1b600 28 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65  (.  sqlite3_file
1b610 20 2a 69 64 2c 20 0a 20 20 76 6f 69 64 20 2a 70   *id, .  void *p
1b620 42 75 66 2c 20 0a 20 20 69 6e 74 20 61 6d 74 2c  Buf, .  int amt,
1b630 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34  .  sqlite3_int64
1b640 20 6f 66 66 73 65 74 0a 29 7b 0a 20 20 75 6e 69   offset.){.  uni
1b650 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28  xFile *pFile = (
1b660 75 6e 69 78 46 69 6c 65 20 2a 29 69 64 3b 0a 20  unixFile *)id;. 
1b670 20 69 6e 74 20 67 6f 74 3b 0a 20 20 61 73 73 65   int got;.  asse
1b680 72 74 28 20 69 64 20 29 3b 0a 0a 20 20 2f 2a 20  rt( id );..  /* 
1b690 49 66 20 74 68 69 73 20 69 73 20 61 20 64 61 74  If this is a dat
1b6a0 61 62 61 73 65 20 66 69 6c 65 20 28 6e 6f 74 20  abase file (not 
1b6b0 61 20 6a 6f 75 72 6e 61 6c 2c 20 6d 61 73 74 65  a journal, maste
1b6c0 72 2d 6a 6f 75 72 6e 61 6c 20 6f 72 20 74 65 6d  r-journal or tem
1b6d0 70 0a 20 20 2a 2a 20 66 69 6c 65 29 2c 20 74 68  p.  ** file), th
1b6e0 65 20 62 79 74 65 73 20 69 6e 20 74 68 65 20 6c  e bytes in the l
1b6f0 6f 63 6b 69 6e 67 20 72 61 6e 67 65 20 73 68 6f  ocking range sho
1b700 75 6c 64 20 6e 65 76 65 72 20 62 65 20 72 65 61  uld never be rea
1b710 64 20 6f 72 20 77 72 69 74 74 65 6e 2e 20 2a 2f  d or written. */
1b720 0a 23 69 66 20 30 0a 20 20 61 73 73 65 72 74 28  .#if 0.  assert(
1b730 20 70 46 69 6c 65 2d 3e 70 55 6e 75 73 65 64 3d   pFile->pUnused=
1b740 3d 30 0a 20 20 20 20 20 20 20 7c 7c 20 6f 66 66  =0.       || off
1b750 73 65 74 3e 3d 50 45 4e 44 49 4e 47 5f 42 59 54  set>=PENDING_BYT
1b760 45 2b 35 31 32 0a 20 20 20 20 20 20 20 7c 7c 20  E+512.       || 
1b770 6f 66 66 73 65 74 2b 61 6d 74 3c 3d 50 45 4e 44  offset+amt<=PEND
1b780 49 4e 47 5f 42 59 54 45 20 0a 20 20 29 3b 0a 23  ING_BYTE .  );.#
1b790 65 6e 64 69 66 0a 0a 20 20 67 6f 74 20 3d 20 73  endif..  got = s
1b7a0 65 65 6b 41 6e 64 52 65 61 64 28 70 46 69 6c 65  eekAndRead(pFile
1b7b0 2c 20 6f 66 66 73 65 74 2c 20 70 42 75 66 2c 20  , offset, pBuf, 
1b7c0 61 6d 74 29 3b 0a 20 20 69 66 28 20 67 6f 74 3d  amt);.  if( got=
1b7d0 3d 61 6d 74 20 29 7b 0a 20 20 20 20 72 65 74 75  =amt ){.    retu
1b7e0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
1b7f0 7d 65 6c 73 65 20 69 66 28 20 67 6f 74 3c 30 20  }else if( got<0 
1b800 29 7b 0a 20 20 20 20 2f 2a 20 6c 61 73 74 45 72  ){.    /* lastEr
1b810 72 6e 6f 20 73 65 74 20 62 79 20 73 65 65 6b 41  rno set by seekA
1b820 6e 64 52 65 61 64 20 2a 2f 0a 20 20 20 20 72 65  ndRead */.    re
1b830 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52  turn SQLITE_IOER
1b840 52 5f 52 45 41 44 3b 0a 20 20 7d 65 6c 73 65 7b  R_READ;.  }else{
1b850 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74  .    pFile->last
1b860 45 72 72 6e 6f 20 3d 20 30 3b 20 2f 2a 20 6e 6f  Errno = 0; /* no
1b870 74 20 61 20 73 79 73 74 65 6d 20 65 72 72 6f 72  t a system error
1b880 20 2a 2f 0a 20 20 20 20 2f 2a 20 55 6e 72 65 61   */.    /* Unrea
1b890 64 20 70 61 72 74 73 20 6f 66 20 74 68 65 20 62  d parts of the b
1b8a0 75 66 66 65 72 20 6d 75 73 74 20 62 65 20 7a 65  uffer must be ze
1b8b0 72 6f 2d 66 69 6c 6c 65 64 20 2a 2f 0a 20 20 20  ro-filled */.   
1b8c0 20 6d 65 6d 73 65 74 28 26 28 28 63 68 61 72 2a   memset(&((char*
1b8d0 29 70 42 75 66 29 5b 67 6f 74 5d 2c 20 30 2c 20  )pBuf)[got], 0, 
1b8e0 61 6d 74 2d 67 6f 74 29 3b 0a 20 20 20 20 72 65  amt-got);.    re
1b8f0 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52  turn SQLITE_IOER
1b900 52 5f 53 48 4f 52 54 5f 52 45 41 44 3b 0a 20 20  R_SHORT_READ;.  
1b910 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 65 6b 20  }.}../*.** Seek 
1b920 74 6f 20 74 68 65 20 6f 66 66 73 65 74 20 69 6e  to the offset in
1b930 20 69 64 2d 3e 6f 66 66 73 65 74 20 74 68 65 6e   id->offset then
1b940 20 72 65 61 64 20 63 6e 74 20 62 79 74 65 73 20   read cnt bytes 
1b950 69 6e 74 6f 20 70 42 75 66 2e 0a 2a 2a 20 52 65  into pBuf..** Re
1b960 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20  turn the number 
1b970 6f 66 20 62 79 74 65 73 20 61 63 74 75 61 6c 6c  of bytes actuall
1b980 79 20 72 65 61 64 2e 20 20 55 70 64 61 74 65 20  y read.  Update 
1b990 74 68 65 20 6f 66 66 73 65 74 2e 0a 2a 2a 0a 2a  the offset..**.*
1b9a0 2a 20 54 6f 20 61 76 6f 69 64 20 73 74 6f 6d 70  * To avoid stomp
1b9b0 69 6e 67 20 74 68 65 20 65 72 72 6e 6f 20 76 61  ing the errno va
1b9c0 6c 75 65 20 6f 6e 20 61 20 66 61 69 6c 65 64 20  lue on a failed 
1b9d0 77 72 69 74 65 20 74 68 65 20 6c 61 73 74 45 72  write the lastEr
1b9e0 72 6e 6f 20 76 61 6c 75 65 0a 2a 2a 20 69 73 20  rno value.** is 
1b9f0 73 65 74 20 62 65 66 6f 72 65 20 72 65 74 75 72  set before retur
1ba00 6e 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ning..*/.static 
1ba10 69 6e 74 20 73 65 65 6b 41 6e 64 57 72 69 74 65  int seekAndWrite
1ba20 28 75 6e 69 78 46 69 6c 65 20 2a 69 64 2c 20 69  (unixFile *id, i
1ba30 36 34 20 6f 66 66 73 65 74 2c 20 63 6f 6e 73 74  64 offset, const
1ba40 20 76 6f 69 64 20 2a 70 42 75 66 2c 20 69 6e 74   void *pBuf, int
1ba50 20 63 6e 74 29 7b 0a 20 20 69 6e 74 20 67 6f 74   cnt){.  int got
1ba60 3b 0a 23 69 66 20 28 21 64 65 66 69 6e 65 64 28  ;.#if (!defined(
1ba70 55 53 45 5f 50 52 45 41 44 29 20 26 26 20 21 64  USE_PREAD) && !d
1ba80 65 66 69 6e 65 64 28 55 53 45 5f 50 52 45 41 44  efined(USE_PREAD
1ba90 36 34 29 29 0a 20 20 69 36 34 20 6e 65 77 4f 66  64)).  i64 newOf
1baa0 66 73 65 74 3b 0a 23 65 6e 64 69 66 0a 20 20 54  fset;.#endif.  T
1bab0 49 4d 45 52 5f 53 54 41 52 54 3b 0a 23 69 66 20  IMER_START;.#if 
1bac0 64 65 66 69 6e 65 64 28 55 53 45 5f 50 52 45 41  defined(USE_PREA
1bad0 44 29 0a 20 20 64 6f 7b 20 67 6f 74 20 3d 20 6f  D).  do{ got = o
1bae0 73 50 77 72 69 74 65 28 69 64 2d 3e 68 2c 20 70  sPwrite(id->h, p
1baf0 42 75 66 2c 20 63 6e 74 2c 20 6f 66 66 73 65 74  Buf, cnt, offset
1bb00 29 3b 20 7d 77 68 69 6c 65 28 20 67 6f 74 3c 30  ); }while( got<0
1bb10 20 26 26 20 65 72 72 6e 6f 3d 3d 45 49 4e 54 52   && errno==EINTR
1bb20 20 29 3b 0a 23 65 6c 69 66 20 64 65 66 69 6e 65   );.#elif define
1bb30 64 28 55 53 45 5f 50 52 45 41 44 36 34 29 0a 20  d(USE_PREAD64). 
1bb40 20 64 6f 7b 20 67 6f 74 20 3d 20 6f 73 50 77 72   do{ got = osPwr
1bb50 69 74 65 36 34 28 69 64 2d 3e 68 2c 20 70 42 75  ite64(id->h, pBu
1bb60 66 2c 20 63 6e 74 2c 20 6f 66 66 73 65 74 29 3b  f, cnt, offset);
1bb70 7d 77 68 69 6c 65 28 20 67 6f 74 3c 30 20 26 26  }while( got<0 &&
1bb80 20 65 72 72 6e 6f 3d 3d 45 49 4e 54 52 29 3b 0a   errno==EINTR);.
1bb90 23 65 6c 73 65 0a 20 20 64 6f 7b 0a 20 20 20 20  #else.  do{.    
1bba0 6e 65 77 4f 66 66 73 65 74 20 3d 20 6c 73 65 65  newOffset = lsee
1bbb0 6b 28 69 64 2d 3e 68 2c 20 6f 66 66 73 65 74 2c  k(id->h, offset,
1bbc0 20 53 45 45 4b 5f 53 45 54 29 3b 0a 20 20 20 20   SEEK_SET);.    
1bbd0 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28  SimulateIOError(
1bbe0 20 6e 65 77 4f 66 66 73 65 74 2d 2d 20 29 3b 0a   newOffset-- );.
1bbf0 20 20 20 20 69 66 28 20 6e 65 77 4f 66 66 73 65      if( newOffse
1bc00 74 21 3d 6f 66 66 73 65 74 20 29 7b 0a 20 20 20  t!=offset ){.   
1bc10 20 20 20 69 66 28 20 6e 65 77 4f 66 66 73 65 74     if( newOffset
1bc20 20 3d 3d 20 2d 31 20 29 7b 0a 20 20 20 20 20 20   == -1 ){.      
1bc30 20 20 28 28 75 6e 69 78 46 69 6c 65 2a 29 69 64    ((unixFile*)id
1bc40 29 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 65  )->lastErrno = e
1bc50 72 72 6e 6f 3b 0a 20 20 20 20 20 20 7d 65 6c 73  rrno;.      }els
1bc60 65 7b 0a 20 20 20 20 20 20 20 20 28 28 75 6e 69  e{.        ((uni
1bc70 78 46 69 6c 65 2a 29 69 64 29 2d 3e 6c 61 73 74  xFile*)id)->last
1bc80 45 72 72 6e 6f 20 3d 20 30 3b 09 09 09 0a 20 20  Errno = 0;....  
1bc90 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65 74 75      }.      retu
1bca0 72 6e 20 2d 31 3b 0a 20 20 20 20 7d 0a 20 20 20  rn -1;.    }.   
1bcb0 20 67 6f 74 20 3d 20 6f 73 57 72 69 74 65 28 69   got = osWrite(i
1bcc0 64 2d 3e 68 2c 20 70 42 75 66 2c 20 63 6e 74 29  d->h, pBuf, cnt)
1bcd0 3b 0a 20 20 7d 77 68 69 6c 65 28 20 67 6f 74 3c  ;.  }while( got<
1bce0 30 20 26 26 20 65 72 72 6e 6f 3d 3d 45 49 4e 54  0 && errno==EINT
1bcf0 52 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20 54 49  R );.#endif.  TI
1bd00 4d 45 52 5f 45 4e 44 3b 0a 20 20 69 66 28 20 67  MER_END;.  if( g
1bd10 6f 74 3c 30 20 29 7b 0a 20 20 20 20 28 28 75 6e  ot<0 ){.    ((un
1bd20 69 78 46 69 6c 65 2a 29 69 64 29 2d 3e 6c 61 73  ixFile*)id)->las
1bd30 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a  tErrno = errno;.
1bd40 20 20 7d 0a 0a 20 20 4f 53 54 52 41 43 45 28 28    }..  OSTRACE((
1bd50 22 57 52 49 54 45 20 20 20 25 2d 33 64 20 25 35  "WRITE   %-3d %5
1bd60 64 20 25 37 6c 6c 64 20 25 6c 6c 75 5c 6e 22 2c  d %7lld %llu\n",
1bd70 20 69 64 2d 3e 68 2c 20 67 6f 74 2c 20 6f 66 66   id->h, got, off
1bd80 73 65 74 2c 20 54 49 4d 45 52 5f 45 4c 41 50 53  set, TIMER_ELAPS
1bd90 45 44 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 67  ED));.  return g
1bda0 6f 74 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 57 72  ot;.}.../*.** Wr
1bdb0 69 74 65 20 64 61 74 61 20 66 72 6f 6d 20 61 20  ite data from a 
1bdc0 62 75 66 66 65 72 20 69 6e 74 6f 20 61 20 66 69  buffer into a fi
1bdd0 6c 65 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49  le.  Return SQLI
1bde0 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73  TE_OK on success
1bdf0 0a 2a 2a 20 6f 72 20 73 6f 6d 65 20 6f 74 68 65  .** or some othe
1be00 72 20 65 72 72 6f 72 20 63 6f 64 65 20 6f 6e 20  r error code on 
1be10 66 61 69 6c 75 72 65 2e 0a 2a 2f 0a 73 74 61 74  failure..*/.stat
1be20 69 63 20 69 6e 74 20 75 6e 69 78 57 72 69 74 65  ic int unixWrite
1be30 28 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65  (.  sqlite3_file
1be40 20 2a 69 64 2c 20 0a 20 20 63 6f 6e 73 74 20 76   *id, .  const v
1be50 6f 69 64 20 2a 70 42 75 66 2c 20 0a 20 20 69 6e  oid *pBuf, .  in
1be60 74 20 61 6d 74 2c 0a 20 20 73 71 6c 69 74 65 33  t amt,.  sqlite3
1be70 5f 69 6e 74 36 34 20 6f 66 66 73 65 74 20 0a 29  _int64 offset .)
1be80 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46  {.  unixFile *pF
1be90 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a  ile = (unixFile*
1bea0 29 69 64 3b 0a 20 20 69 6e 74 20 77 72 6f 74 65  )id;.  int wrote
1beb0 20 3d 20 30 3b 0a 20 20 61 73 73 65 72 74 28 20   = 0;.  assert( 
1bec0 69 64 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  id );.  assert( 
1bed0 61 6d 74 3e 30 20 29 3b 0a 0a 20 20 2f 2a 20 49  amt>0 );..  /* I
1bee0 66 20 74 68 69 73 20 69 73 20 61 20 64 61 74 61  f this is a data
1bef0 62 61 73 65 20 66 69 6c 65 20 28 6e 6f 74 20 61  base file (not a
1bf00 20 6a 6f 75 72 6e 61 6c 2c 20 6d 61 73 74 65 72   journal, master
1bf10 2d 6a 6f 75 72 6e 61 6c 20 6f 72 20 74 65 6d 70  -journal or temp
1bf20 0a 20 20 2a 2a 20 66 69 6c 65 29 2c 20 74 68 65  .  ** file), the
1bf30 20 62 79 74 65 73 20 69 6e 20 74 68 65 20 6c 6f   bytes in the lo
1bf40 63 6b 69 6e 67 20 72 61 6e 67 65 20 73 68 6f 75  cking range shou
1bf50 6c 64 20 6e 65 76 65 72 20 62 65 20 72 65 61 64  ld never be read
1bf60 20 6f 72 20 77 72 69 74 74 65 6e 2e 20 2a 2f 0a   or written. */.
1bf70 23 69 66 20 30 0a 20 20 61 73 73 65 72 74 28 20  #if 0.  assert( 
1bf80 70 46 69 6c 65 2d 3e 70 55 6e 75 73 65 64 3d 3d  pFile->pUnused==
1bf90 30 0a 20 20 20 20 20 20 20 7c 7c 20 6f 66 66 73  0.       || offs
1bfa0 65 74 3e 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45  et>=PENDING_BYTE
1bfb0 2b 35 31 32 0a 20 20 20 20 20 20 20 7c 7c 20 6f  +512.       || o
1bfc0 66 66 73 65 74 2b 61 6d 74 3c 3d 50 45 4e 44 49  ffset+amt<=PENDI
1bfd0 4e 47 5f 42 59 54 45 20 0a 20 20 29 3b 0a 23 65  NG_BYTE .  );.#e
1bfe0 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 4e 44  ndif..#ifndef ND
1bff0 45 42 55 47 0a 20 20 2f 2a 20 49 66 20 77 65 20  EBUG.  /* If we 
1c000 61 72 65 20 64 6f 69 6e 67 20 61 20 6e 6f 72 6d  are doing a norm
1c010 61 6c 20 77 72 69 74 65 20 74 6f 20 61 20 64 61  al write to a da
1c020 74 61 62 61 73 65 20 66 69 6c 65 20 28 61 73 20  tabase file (as 
1c030 6f 70 70 6f 73 65 64 20 74 6f 0a 20 20 2a 2a 20  opposed to.  ** 
1c040 64 6f 69 6e 67 20 61 20 68 6f 74 2d 6a 6f 75 72  doing a hot-jour
1c050 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 20 6f 72 20  nal rollback or 
1c060 61 20 77 72 69 74 65 20 74 6f 20 73 6f 6d 65 20  a write to some 
1c070 66 69 6c 65 20 6f 74 68 65 72 20 74 68 61 6e 20  file other than 
1c080 61 0a 20 20 2a 2a 20 6e 6f 72 6d 61 6c 20 64 61  a.  ** normal da
1c090 74 61 62 61 73 65 20 66 69 6c 65 29 20 74 68 65  tabase file) the
1c0a0 6e 20 72 65 63 6f 72 64 20 74 68 65 20 66 61 63  n record the fac
1c0b0 74 20 74 68 61 74 20 74 68 65 20 64 61 74 61 62  t that the datab
1c0c0 61 73 65 0a 20 20 2a 2a 20 68 61 73 20 63 68 61  ase.  ** has cha
1c0d0 6e 67 65 64 2e 20 20 49 66 20 74 68 65 20 74 72  nged.  If the tr
1c0e0 61 6e 73 61 63 74 69 6f 6e 20 63 6f 75 6e 74 65  ansaction counte
1c0f0 72 20 69 73 20 6d 6f 64 69 66 69 65 64 2c 20 72  r is modified, r
1c100 65 63 6f 72 64 20 74 68 61 74 0a 20 20 2a 2a 20  ecord that.  ** 
1c110 66 61 63 74 20 74 6f 6f 2e 0a 20 20 2a 2f 0a 20  fact too..  */. 
1c120 20 69 66 28 20 70 46 69 6c 65 2d 3e 69 6e 4e 6f   if( pFile->inNo
1c130 72 6d 61 6c 57 72 69 74 65 20 29 7b 0a 20 20 20  rmalWrite ){.   
1c140 20 70 46 69 6c 65 2d 3e 64 62 55 70 64 61 74 65   pFile->dbUpdate
1c150 20 3d 20 31 3b 20 20 2f 2a 20 54 68 65 20 64 61   = 1;  /* The da
1c160 74 61 62 61 73 65 20 68 61 73 20 62 65 65 6e 20  tabase has been 
1c170 6d 6f 64 69 66 69 65 64 20 2a 2f 0a 20 20 20 20  modified */.    
1c180 69 66 28 20 6f 66 66 73 65 74 3c 3d 32 34 20 26  if( offset<=24 &
1c190 26 20 6f 66 66 73 65 74 2b 61 6d 74 3e 3d 32 37  & offset+amt>=27
1c1a0 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 72 63   ){.      int rc
1c1b0 3b 0a 20 20 20 20 20 20 63 68 61 72 20 6f 6c 64  ;.      char old
1c1c0 43 6e 74 72 5b 34 5d 3b 0a 20 20 20 20 20 20 53  Cntr[4];.      S
1c1d0 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 42 65  imulateIOErrorBe
1c1e0 6e 69 67 6e 28 31 29 3b 0a 20 20 20 20 20 20 72  nign(1);.      r
1c1f0 63 20 3d 20 73 65 65 6b 41 6e 64 52 65 61 64 28  c = seekAndRead(
1c200 70 46 69 6c 65 2c 20 32 34 2c 20 6f 6c 64 43 6e  pFile, 24, oldCn
1c210 74 72 2c 20 34 29 3b 0a 20 20 20 20 20 20 53 69  tr, 4);.      Si
1c220 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 42 65 6e  mulateIOErrorBen
1c230 69 67 6e 28 30 29 3b 0a 20 20 20 20 20 20 69 66  ign(0);.      if
1c240 28 20 72 63 21 3d 34 20 7c 7c 20 6d 65 6d 63 6d  ( rc!=4 || memcm
1c250 70 28 6f 6c 64 43 6e 74 72 2c 20 26 28 28 63 68  p(oldCntr, &((ch
1c260 61 72 2a 29 70 42 75 66 29 5b 32 34 2d 6f 66 66  ar*)pBuf)[24-off
1c270 73 65 74 5d 2c 20 34 29 21 3d 30 20 29 7b 0a 20  set], 4)!=0 ){. 
1c280 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 74 72         pFile->tr
1c290 61 6e 73 43 6e 74 72 43 68 6e 67 20 3d 20 31 3b  ansCntrChng = 1;
1c2a0 20 20 2f 2a 20 54 68 65 20 74 72 61 6e 73 61 63    /* The transac
1c2b0 74 69 6f 6e 20 63 6f 75 6e 74 65 72 20 68 61 73  tion counter has
1c2c0 20 63 68 61 6e 67 65 64 20 2a 2f 0a 20 20 20 20   changed */.    
1c2d0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65    }.    }.  }.#e
1c2e0 6e 64 69 66 0a 0a 20 20 77 68 69 6c 65 28 20 61  ndif..  while( a
1c2f0 6d 74 3e 30 20 26 26 20 28 77 72 6f 74 65 20 3d  mt>0 && (wrote =
1c300 20 73 65 65 6b 41 6e 64 57 72 69 74 65 28 70 46   seekAndWrite(pF
1c310 69 6c 65 2c 20 6f 66 66 73 65 74 2c 20 70 42 75  ile, offset, pBu
1c320 66 2c 20 61 6d 74 29 29 3e 30 20 29 7b 0a 20 20  f, amt))>0 ){.  
1c330 20 20 61 6d 74 20 2d 3d 20 77 72 6f 74 65 3b 0a    amt -= wrote;.
1c340 20 20 20 20 6f 66 66 73 65 74 20 2b 3d 20 77 72      offset += wr
1c350 6f 74 65 3b 0a 20 20 20 20 70 42 75 66 20 3d 20  ote;.    pBuf = 
1c360 26 28 28 63 68 61 72 2a 29 70 42 75 66 29 5b 77  &((char*)pBuf)[w
1c370 72 6f 74 65 5d 3b 0a 20 20 7d 0a 20 20 53 69 6d  rote];.  }.  Sim
1c380 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 28 20 77  ulateIOError(( w
1c390 72 6f 74 65 3d 28 2d 31 29 2c 20 61 6d 74 3d 31  rote=(-1), amt=1
1c3a0 20 29 29 3b 0a 20 20 53 69 6d 75 6c 61 74 65 44   ));.  SimulateD
1c3b0 69 73 6b 66 75 6c 6c 45 72 72 6f 72 28 28 20 77  iskfullError(( w
1c3c0 72 6f 74 65 3d 30 2c 20 61 6d 74 3d 31 20 29 29  rote=0, amt=1 ))
1c3d0 3b 0a 0a 20 20 69 66 28 20 61 6d 74 3e 30 20 29  ;..  if( amt>0 )
1c3e0 7b 0a 20 20 20 20 69 66 28 20 77 72 6f 74 65 3c  {.    if( wrote<
1c3f0 30 20 26 26 20 70 46 69 6c 65 2d 3e 6c 61 73 74  0 && pFile->last
1c400 45 72 72 6e 6f 21 3d 45 4e 4f 53 50 43 20 29 7b  Errno!=ENOSPC ){
1c410 0a 20 20 20 20 20 20 2f 2a 20 6c 61 73 74 45 72  .      /* lastEr
1c420 72 6e 6f 20 73 65 74 20 62 79 20 73 65 65 6b 41  rno set by seekA
1c430 6e 64 57 72 69 74 65 20 2a 2f 0a 20 20 20 20 20  ndWrite */.     
1c440 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49   return SQLITE_I
1c450 4f 45 52 52 5f 57 52 49 54 45 3b 0a 20 20 20 20  OERR_WRITE;.    
1c460 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 46 69  }else{.      pFi
1c470 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20  le->lastErrno = 
1c480 30 3b 20 2f 2a 20 6e 6f 74 20 61 20 73 79 73 74  0; /* not a syst
1c490 65 6d 20 65 72 72 6f 72 20 2a 2f 0a 20 20 20 20  em error */.    
1c4a0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1c4b0 46 55 4c 4c 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  FULL;.    }.  }.
1c4c0 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
1c4d0 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53  _OK;.}..#ifdef S
1c4e0 51 4c 49 54 45 5f 54 45 53 54 0a 2f 2a 0a 2a 2a  QLITE_TEST./*.**
1c4f0 20 43 6f 75 6e 74 20 74 68 65 20 6e 75 6d 62 65   Count the numbe
1c500 72 20 6f 66 20 66 75 6c 6c 73 79 6e 63 73 20 61  r of fullsyncs a
1c510 6e 64 20 6e 6f 72 6d 61 6c 20 73 79 6e 63 73 2e  nd normal syncs.
1c520 20 20 54 68 69 73 20 69 73 20 75 73 65 64 20 74    This is used t
1c530 6f 20 74 65 73 74 0a 2a 2a 20 74 68 61 74 20 73  o test.** that s
1c540 79 6e 63 73 20 61 6e 64 20 66 75 6c 6c 73 79 6e  yncs and fullsyn
1c550 63 73 20 61 72 65 20 6f 63 63 75 72 72 69 6e 67  cs are occurring
1c560 20 61 74 20 74 68 65 20 72 69 67 68 74 20 74 69   at the right ti
1c570 6d 65 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  mes..*/.int sqli
1c580 74 65 33 5f 73 79 6e 63 5f 63 6f 75 6e 74 20 3d  te3_sync_count =
1c590 20 30 3b 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f   0;.int sqlite3_
1c5a0 66 75 6c 6c 73 79 6e 63 5f 63 6f 75 6e 74 20 3d  fullsync_count =
1c5b0 20 30 3b 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a   0;.#endif../*.*
1c5c0 2a 20 57 65 20 64 6f 20 6e 6f 74 20 74 72 75 73  * We do not trus
1c5d0 74 20 73 79 73 74 65 6d 73 20 74 6f 20 70 72 6f  t systems to pro
1c5e0 76 69 64 65 20 61 20 77 6f 72 6b 69 6e 67 20 66  vide a working f
1c5f0 64 61 74 61 73 79 6e 63 28 29 2e 20 20 53 6f 6d  datasync().  Som
1c600 65 20 64 6f 2e 0a 2a 2a 20 4f 74 68 65 72 73 20  e do..** Others 
1c610 64 6f 20 6e 6f 2e 20 20 54 6f 20 62 65 20 73 61  do no.  To be sa
1c620 66 65 2c 20 77 65 20 77 69 6c 6c 20 73 74 69 63  fe, we will stic
1c630 6b 20 77 69 74 68 20 74 68 65 20 28 73 6c 6f 77  k with the (slow
1c640 65 72 29 20 66 73 79 6e 63 28 29 2e 0a 2a 2a 20  er) fsync()..** 
1c650 49 66 20 79 6f 75 20 6b 6e 6f 77 20 74 68 61 74  If you know that
1c660 20 79 6f 75 72 20 73 79 73 74 65 6d 20 64 6f 65   your system doe
1c670 73 20 73 75 70 70 6f 72 74 20 66 64 61 74 61 73  s support fdatas
1c680 79 6e 63 28 29 20 63 6f 72 72 65 63 74 6c 79 2c  ync() correctly,
1c690 0a 2a 2a 20 74 68 65 6e 20 73 69 6d 70 6c 79 20  .** then simply 
1c6a0 63 6f 6d 70 69 6c 65 20 77 69 74 68 20 2d 44 66  compile with -Df
1c6b0 64 61 74 61 73 79 6e 63 3d 66 64 61 74 61 73 79  datasync=fdatasy
1c6c0 6e 63 0a 2a 2f 0a 23 69 66 20 21 64 65 66 69 6e  nc.*/.#if !defin
1c6d0 65 64 28 66 64 61 74 61 73 79 6e 63 29 20 26 26  ed(fdatasync) &&
1c6e0 20 21 64 65 66 69 6e 65 64 28 5f 5f 6c 69 6e 75   !defined(__linu
1c6f0 78 5f 5f 29 0a 23 20 64 65 66 69 6e 65 20 66 64  x__).# define fd
1c700 61 74 61 73 79 6e 63 20 66 73 79 6e 63 0a 23 65  atasync fsync.#e
1c710 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 44 65 66 69  ndif../*.** Defi
1c720 6e 65 20 48 41 56 45 5f 46 55 4c 4c 46 53 59 4e  ne HAVE_FULLFSYN
1c730 43 20 74 6f 20 30 20 6f 72 20 31 20 64 65 70 65  C to 0 or 1 depe
1c740 6e 64 69 6e 67 20 6f 6e 20 77 68 65 74 68 65 72  nding on whether
1c750 20 6f 72 20 6e 6f 74 0a 2a 2a 20 74 68 65 20 46   or not.** the F
1c760 5f 46 55 4c 4c 46 53 59 4e 43 20 6d 61 63 72 6f  _FULLFSYNC macro
1c770 20 69 73 20 64 65 66 69 6e 65 64 2e 20 20 46 5f   is defined.  F_
1c780 46 55 4c 4c 46 53 59 4e 43 20 69 73 20 63 75 72  FULLFSYNC is cur
1c790 72 65 6e 74 6c 79 0a 2a 2a 20 6f 6e 6c 79 20 61  rently.** only a
1c7a0 76 61 69 6c 61 62 6c 65 20 6f 6e 20 4d 61 63 20  vailable on Mac 
1c7b0 4f 53 20 58 2e 20 20 42 75 74 20 74 68 61 74 20  OS X.  But that 
1c7c0 63 6f 75 6c 64 20 63 68 61 6e 67 65 2e 0a 2a 2f  could change..*/
1c7d0 0a 23 69 66 64 65 66 20 46 5f 46 55 4c 4c 46 53  .#ifdef F_FULLFS
1c7e0 59 4e 43 0a 23 20 64 65 66 69 6e 65 20 48 41 56  YNC.# define HAV
1c7f0 45 5f 46 55 4c 4c 46 53 59 4e 43 20 31 0a 23 65  E_FULLFSYNC 1.#e
1c800 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 48 41 56  lse.# define HAV
1c810 45 5f 46 55 4c 4c 46 53 59 4e 43 20 30 0a 23 65  E_FULLFSYNC 0.#e
1c820 6e 64 69 66 0a 0a 23 69 66 64 65 66 20 53 51 4c  ndif..#ifdef SQL
1c830 49 54 45 5f 55 53 45 5f 52 45 51 55 45 53 54 5f  ITE_USE_REQUEST_
1c840 46 55 4c 4c 46 53 59 4e 43 0a 23 69 6d 70 6f 72  FULLFSYNC.#impor
1c850 74 20 3c 6e 6f 74 69 66 79 2e 68 3e 0a 23 69 6d  t <notify.h>.#im
1c860 70 6f 72 74 20 3c 6c 69 62 6b 65 72 6e 2f 4f 53  port <libkern/OS
1c870 41 74 6f 6d 69 63 2e 68 3e 0a 73 74 61 74 69 63  Atomic.h>.static
1c880 20 4f 53 53 70 69 6e 4c 6f 63 6b 20 6e 6f 74 69   OSSpinLock noti
1c890 66 79 5f 6c 6f 63 6b 20 3d 20 30 3b 0a 23 64 65  fy_lock = 0;.#de
1c8a0 66 69 6e 65 20 52 45 51 55 45 53 54 5f 46 55 4c  fine REQUEST_FUL
1c8b0 4c 53 59 4e 43 5f 4e 4f 54 49 46 49 43 41 54 49  LSYNC_NOTIFICATI
1c8c0 4f 4e 20 20 20 20 22 63 6f 6d 2e 61 70 70 6c 65  ON    "com.apple
1c8d0 2e 72 65 71 73 79 6e 63 22 0a 23 65 6e 64 69 66  .reqsync".#endif
1c8e0 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 73 79 6e  ../*.** The fsyn
1c8f0 63 28 29 20 73 79 73 74 65 6d 20 63 61 6c 6c 20  c() system call 
1c900 64 6f 65 73 20 6e 6f 74 20 77 6f 72 6b 20 61 73  does not work as
1c910 20 61 64 76 65 72 74 69 73 65 64 20 6f 6e 20 6d   advertised on m
1c920 61 6e 79 0a 2a 2a 20 75 6e 69 78 20 73 79 73 74  any.** unix syst
1c930 65 6d 73 2e 20 20 54 68 65 20 66 6f 6c 6c 6f 77  ems.  The follow
1c940 69 6e 67 20 70 72 6f 63 65 64 75 72 65 20 69 73  ing procedure is
1c950 20 61 6e 20 61 74 74 65 6d 70 74 20 74 6f 20 6d   an attempt to m
1c960 61 6b 65 0a 2a 2a 20 69 74 20 77 6f 72 6b 20 62  ake.** it work b
1c970 65 74 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  etter..**.** The
1c980 20 53 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e 43 20   SQLITE_NO_SYNC 
1c990 6d 61 63 72 6f 20 64 69 73 61 62 6c 65 73 20 61  macro disables a
1c9a0 6c 6c 20 66 73 79 6e 63 28 29 73 2e 20 20 54 68  ll fsync()s.  Th
1c9b0 69 73 20 69 73 20 75 73 65 66 75 6c 0a 2a 2a 20  is is useful.** 
1c9c0 66 6f 72 20 74 65 73 74 69 6e 67 20 77 68 65 6e  for testing when
1c9d0 20 77 65 20 77 61 6e 74 20 74 6f 20 72 75 6e 20   we want to run 
1c9e0 74 68 72 6f 75 67 68 20 74 68 65 20 74 65 73 74  through the test
1c9f0 20 73 75 69 74 65 20 71 75 69 63 6b 6c 79 2e 0a   suite quickly..
1ca00 2a 2a 20 59 6f 75 20 61 72 65 20 73 74 72 6f 6e  ** You are stron
1ca10 67 6c 79 20 61 64 76 69 73 65 64 20 2a 6e 6f 74  gly advised *not
1ca20 2a 20 74 6f 20 64 65 70 6c 6f 79 20 77 69 74 68  * to deploy with
1ca30 20 53 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e 43 0a   SQLITE_NO_SYNC.
1ca40 2a 2a 20 65 6e 61 62 6c 65 64 2c 20 68 6f 77 65  ** enabled, howe
1ca50 76 65 72 2c 20 73 69 6e 63 65 20 77 69 74 68 20  ver, since with 
1ca60 53 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e 43 20 65  SQLITE_NO_SYNC e
1ca70 6e 61 62 6c 65 64 2c 20 61 6e 20 4f 53 20 63 72  nabled, an OS cr
1ca80 61 73 68 0a 2a 2a 20 6f 72 20 70 6f 77 65 72 20  ash.** or power 
1ca90 66 61 69 6c 75 72 65 20 77 69 6c 6c 20 6c 69 6b  failure will lik
1caa0 65 6c 79 20 63 6f 72 72 75 70 74 20 74 68 65 20  ely corrupt the 
1cab0 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a  database file..*
1cac0 2a 0a 2a 2a 20 53 51 4c 69 74 65 20 73 65 74 73  *.** SQLite sets
1cad0 20 74 68 65 20 64 61 74 61 4f 6e 6c 79 20 66 6c   the dataOnly fl
1cae0 61 67 20 69 66 20 74 68 65 20 73 69 7a 65 20 6f  ag if the size o
1caf0 66 20 74 68 65 20 66 69 6c 65 20 69 73 20 75 6e  f the file is un
1cb00 63 68 61 6e 67 65 64 2e 0a 2a 2a 20 54 68 65 20  changed..** The 
1cb10 69 64 65 61 20 62 65 68 69 6e 64 20 64 61 74 61  idea behind data
1cb20 4f 6e 6c 79 20 69 73 20 74 68 61 74 20 69 74 20  Only is that it 
1cb30 73 68 6f 75 6c 64 20 6f 6e 6c 79 20 77 72 69 74  should only writ
1cb40 65 20 74 68 65 20 66 69 6c 65 20 63 6f 6e 74 65  e the file conte
1cb50 6e 74 0a 2a 2a 20 74 6f 20 64 69 73 6b 2c 20 6e  nt.** to disk, n
1cb60 6f 74 20 74 68 65 20 69 6e 6f 64 65 2e 20 20 57  ot the inode.  W
1cb70 65 20 6f 6e 6c 79 20 73 65 74 20 64 61 74 61 4f  e only set dataO
1cb80 6e 6c 79 20 69 66 20 74 68 65 20 66 69 6c 65 20  nly if the file 
1cb90 73 69 7a 65 20 69 73 20 0a 2a 2a 20 75 6e 63 68  size is .** unch
1cba0 61 6e 67 65 64 20 73 69 6e 63 65 20 74 68 65 20  anged since the 
1cbb0 66 69 6c 65 20 73 69 7a 65 20 69 73 20 70 61 72  file size is par
1cbc0 74 20 6f 66 20 74 68 65 20 69 6e 6f 64 65 2e 20  t of the inode. 
1cbd0 20 48 6f 77 65 76 65 72 2c 20 0a 2a 2a 20 54 65   However, .** Te
1cbe0 64 20 54 73 27 6f 20 74 65 6c 6c 73 20 75 73 20  d Ts'o tells us 
1cbf0 74 68 61 74 20 66 64 61 74 61 73 79 6e 63 28 29  that fdatasync()
1cc00 20 77 69 6c 6c 20 61 6c 73 6f 20 77 72 69 74 65   will also write
1cc10 20 74 68 65 20 69 6e 6f 64 65 20 69 66 20 74 68   the inode if th
1cc20 65 0a 2a 2a 20 66 69 6c 65 20 73 69 7a 65 20 68  e.** file size h
1cc30 61 73 20 63 68 61 6e 67 65 64 2e 20 20 54 68 65  as changed.  The
1cc40 20 6f 6e 6c 79 20 72 65 61 6c 20 64 69 66 66 65   only real diffe
1cc50 72 65 6e 63 65 20 62 65 74 77 65 65 6e 20 66 64  rence between fd
1cc60 61 74 61 73 79 6e 63 28 29 0a 2a 2a 20 61 6e 64  atasync().** and
1cc70 20 66 73 79 6e 63 28 29 2c 20 54 65 64 20 74 65   fsync(), Ted te
1cc80 6c 6c 73 20 75 73 2c 20 69 73 20 74 68 61 74 20  lls us, is that 
1cc90 66 64 61 74 61 73 79 6e 63 28 29 20 77 69 6c 6c  fdatasync() will
1cca0 20 6e 6f 74 20 66 6c 75 73 68 20 74 68 65 0a 2a   not flush the.*
1ccb0 2a 20 69 6e 6f 64 65 20 69 66 20 74 68 65 20 6d  * inode if the m
1ccc0 74 69 6d 65 20 6f 72 20 6f 77 6e 65 72 20 6f 72  time or owner or
1ccd0 20 6f 74 68 65 72 20 69 6e 6f 64 65 20 61 74 74   other inode att
1cce0 72 69 62 75 74 65 73 20 68 61 76 65 20 63 68 61  ributes have cha
1ccf0 6e 67 65 64 2e 0a 2a 2a 20 57 65 20 6f 6e 6c 79  nged..** We only
1cd00 20 63 61 72 65 20 61 62 6f 75 74 20 74 68 65 20   care about the 
1cd10 66 69 6c 65 20 73 69 7a 65 2c 20 6e 6f 74 20 74  file size, not t
1cd20 68 65 20 6f 74 68 65 72 20 66 69 6c 65 20 61 74  he other file at
1cd30 74 72 69 62 75 74 65 73 2c 20 73 6f 0a 2a 2a 20  tributes, so.** 
1cd40 61 73 20 66 61 72 20 61 73 20 53 51 4c 69 74 65  as far as SQLite
1cd50 20 69 73 20 63 6f 6e 63 65 72 6e 65 64 2c 20 61   is concerned, a
1cd60 6e 20 66 64 61 74 61 73 79 6e 63 28 29 20 69 73  n fdatasync() is
1cd70 20 61 6c 77 61 79 73 20 61 64 65 71 75 61 74 65   always adequate
1cd80 2e 0a 2a 2a 20 53 6f 2c 20 77 65 20 61 6c 77 61  ..** So, we alwa
1cd90 79 73 20 75 73 65 20 66 64 61 74 61 73 79 6e 63  ys use fdatasync
1cda0 28 29 20 69 66 20 69 74 20 69 73 20 61 76 61 69  () if it is avai
1cdb0 6c 61 62 6c 65 2c 20 72 65 67 61 72 64 6c 65 73  lable, regardles
1cdc0 73 20 6f 66 0a 2a 2a 20 74 68 65 20 76 61 6c 75  s of.** the valu
1cdd0 65 20 6f 66 20 74 68 65 20 64 61 74 61 4f 6e 6c  e of the dataOnl
1cde0 79 20 66 6c 61 67 2e 0a 2a 2f 0a 73 74 61 74 69  y flag..*/.stati
1cdf0 63 20 69 6e 74 20 66 75 6c 6c 5f 66 73 79 6e 63  c int full_fsync
1ce00 28 69 6e 74 20 66 64 2c 20 69 6e 74 20 66 75 6c  (int fd, int ful
1ce10 6c 53 79 6e 63 2c 20 69 6e 74 20 64 61 74 61 4f  lSync, int dataO
1ce20 6e 6c 79 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  nly){.  int rc;.
1ce30 0a 20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f 77  .  /* The follow
1ce40 69 6e 67 20 22 69 66 64 65 66 2f 65 6c 69 66 2f  ing "ifdef/elif/
1ce50 65 6c 73 65 2f 22 20 62 6c 6f 63 6b 20 68 61 73  else/" block has
1ce60 20 74 68 65 20 73 61 6d 65 20 73 74 72 75 63 74   the same struct
1ce70 75 72 65 20 61 73 0a 20 20 2a 2a 20 74 68 65 20  ure as.  ** the 
1ce80 6f 6e 65 20 62 65 6c 6f 77 2e 20 49 74 20 69 73  one below. It is
1ce90 20 72 65 70 6c 69 63 61 74 65 64 20 68 65 72 65   replicated here
1cea0 20 73 6f 6c 65 6c 79 20 74 6f 20 61 76 6f 69 64   solely to avoid
1ceb0 20 63 6c 75 74 74 65 72 69 6e 67 20 0a 20 20 2a   cluttering .  *
1cec0 2a 20 75 70 20 74 68 65 20 72 65 61 6c 20 63 6f  * up the real co
1ced0 64 65 20 77 69 74 68 20 74 68 65 20 55 4e 55 53  de with the UNUS
1cee0 45 44 5f 50 41 52 41 4d 45 54 45 52 28 29 20 6d  ED_PARAMETER() m
1cef0 61 63 72 6f 73 2e 0a 20 20 2a 2f 0a 23 69 66 64  acros..  */.#ifd
1cf00 65 66 20 53 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e  ef SQLITE_NO_SYN
1cf10 43 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  C.  UNUSED_PARAM
1cf20 45 54 45 52 28 66 64 29 3b 0a 20 20 55 4e 55 53  ETER(fd);.  UNUS
1cf30 45 44 5f 50 41 52 41 4d 45 54 45 52 28 66 75 6c  ED_PARAMETER(ful
1cf40 6c 53 79 6e 63 29 3b 0a 20 20 55 4e 55 53 45 44  lSync);.  UNUSED
1cf50 5f 50 41 52 41 4d 45 54 45 52 28 64 61 74 61 4f  _PARAMETER(dataO
1cf60 6e 6c 79 29 3b 0a 23 65 6c 69 66 20 48 41 56 45  nly);.#elif HAVE
1cf70 5f 46 55 4c 4c 46 53 59 4e 43 0a 20 20 55 4e 55  _FULLFSYNC.  UNU
1cf80 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 64 61  SED_PARAMETER(da
1cf90 74 61 4f 6e 6c 79 29 3b 0a 23 65 6c 73 65 0a 20  taOnly);.#else. 
1cfa0 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
1cfb0 52 28 66 75 6c 6c 53 79 6e 63 29 3b 0a 20 20 55  R(fullSync);.  U
1cfc0 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
1cfd0 64 61 74 61 4f 6e 6c 79 29 3b 0a 23 65 6e 64 69  dataOnly);.#endi
1cfe0 66 0a 0a 20 20 2f 2a 20 52 65 63 6f 72 64 20 74  f..  /* Record t
1cff0 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 69 6d  he number of tim
1d000 65 73 20 74 68 61 74 20 77 65 20 64 6f 20 61 20  es that we do a 
1d010 6e 6f 72 6d 61 6c 20 66 73 79 6e 63 28 29 20 61  normal fsync() a
1d020 6e 64 20 0a 20 20 2a 2a 20 46 55 4c 4c 53 59 4e  nd .  ** FULLSYN
1d030 43 2e 20 20 54 68 69 73 20 69 73 20 75 73 65 64  C.  This is used
1d040 20 64 75 72 69 6e 67 20 74 65 73 74 69 6e 67 20   during testing 
1d050 74 6f 20 76 65 72 69 66 79 20 74 68 61 74 20 74  to verify that t
1d060 68 69 73 20 70 72 6f 63 65 64 75 72 65 0a 20 20  his procedure.  
1d070 2a 2a 20 67 65 74 73 20 63 61 6c 6c 65 64 20 77  ** gets called w
1d080 69 74 68 20 74 68 65 20 63 6f 72 72 65 63 74 20  ith the correct 
1d090 61 72 67 75 6d 65 6e 74 73 2e 0a 20 20 2a 2f 0a  arguments..  */.
1d0a0 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45  #ifdef SQLITE_TE
1d0b0 53 54 0a 20 20 69 66 28 20 66 75 6c 6c 53 79 6e  ST.  if( fullSyn
1d0c0 63 20 29 20 73 71 6c 69 74 65 33 5f 66 75 6c 6c  c ) sqlite3_full
1d0d0 73 79 6e 63 5f 63 6f 75 6e 74 2b 2b 3b 0a 20 20  sync_count++;.  
1d0e0 73 71 6c 69 74 65 33 5f 73 79 6e 63 5f 63 6f 75  sqlite3_sync_cou
1d0f0 6e 74 2b 2b 3b 0a 23 65 6e 64 69 66 0a 0a 20 20  nt++;.#endif..  
1d100 2f 2a 20 49 66 20 77 65 20 63 6f 6d 70 69 6c 65  /* If we compile
1d110 64 20 77 69 74 68 20 74 68 65 20 53 51 4c 49 54  d with the SQLIT
1d120 45 5f 4e 4f 5f 53 59 4e 43 20 66 6c 61 67 2c 20  E_NO_SYNC flag, 
1d130 74 68 65 6e 20 73 79 6e 63 69 6e 67 20 69 73 20  then syncing is 
1d140 61 0a 20 20 2a 2a 20 6e 6f 2d 6f 70 0a 20 20 2a  a.  ** no-op.  *
1d150 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /.#ifdef SQLITE_
1d160 4e 4f 5f 53 59 4e 43 0a 20 20 72 63 20 3d 20 53  NO_SYNC.  rc = S
1d170 51 4c 49 54 45 5f 4f 4b 3b 0a 23 65 6c 69 66 20  QLITE_OK;.#elif 
1d180 48 41 56 45 5f 46 55 4c 4c 46 53 59 4e 43 0a 20  HAVE_FULLFSYNC. 
1d190 20 69 66 28 20 66 75 6c 6c 53 79 6e 63 20 29 7b   if( fullSync ){
1d1a0 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 55  .#ifdef SQLITE_U
1d1b0 53 45 5f 52 45 51 55 45 53 54 5f 46 55 4c 4c 46  SE_REQUEST_FULLF
1d1c0 53 59 4e 43 0a 20 20 20 20 72 63 20 3d 20 6f 73  SYNC.    rc = os
1d1d0 46 73 79 6e 63 28 66 64 29 3b 0a 20 20 20 20 69  Fsync(fd);.    i
1d1e0 66 20 28 21 72 63 29 20 7b 0a 20 20 20 20 20 20  f (!rc) {.      
1d1f0 4f 53 53 70 69 6e 4c 6f 63 6b 4c 6f 63 6b 28 26  OSSpinLockLock(&
1d200 6e 6f 74 69 66 79 5f 6c 6f 63 6b 29 3b 0a 20 20  notify_lock);.  
1d210 20 20 20 20 72 63 20 3d 20 6e 6f 74 69 66 79 5f      rc = notify_
1d220 70 6f 73 74 28 52 45 51 55 45 53 54 5f 46 55 4c  post(REQUEST_FUL
1d230 4c 53 59 4e 43 5f 4e 4f 54 49 46 49 43 41 54 49  LSYNC_NOTIFICATI
1d240 4f 4e 29 3b 0a 20 20 20 20 20 20 4f 53 53 70 69  ON);.      OSSpi
1d250 6e 4c 6f 63 6b 55 6e 6c 6f 63 6b 28 26 6e 6f 74  nLockUnlock(&not
1d260 69 66 79 5f 6c 6f 63 6b 29 3b 0a 20 20 20 20 7d  ify_lock);.    }
1d270 0a 23 65 6c 73 65 0a 20 20 20 20 72 63 20 3d 20  .#else.    rc = 
1d280 6f 73 46 63 6e 74 6c 28 66 64 2c 20 46 5f 46 55  osFcntl(fd, F_FU
1d290 4c 4c 46 53 59 4e 43 2c 20 30 29 3b 0a 23 65 6e  LLFSYNC, 0);.#en
1d2a0 64 69 66 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  dif.  }else{.   
1d2b0 20 72 63 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 2f   rc = 1;.  }.  /
1d2c0 2a 20 49 66 20 74 68 65 20 46 55 4c 4c 46 53 59  * If the FULLFSY
1d2d0 4e 43 20 66 61 69 6c 65 64 2c 20 66 61 6c 6c 20  NC failed, fall 
1d2e0 62 61 63 6b 20 74 6f 20 61 74 74 65 6d 70 74 69  back to attempti
1d2f0 6e 67 20 61 6e 20 66 73 79 6e 63 28 29 2e 0a 20  ng an fsync().. 
1d300 20 2a 2a 20 49 74 20 73 68 6f 75 6c 64 6e 27 74   ** It shouldn't
1d310 20 62 65 20 70 6f 73 73 69 62 6c 65 20 66 6f 72   be possible for
1d320 20 66 75 6c 6c 66 73 79 6e 63 20 74 6f 20 66 61   fullfsync to fa
1d330 69 6c 20 6f 6e 20 74 68 65 20 6c 6f 63 61 6c 20  il on the local 
1d340 0a 20 20 2a 2a 20 66 69 6c 65 20 73 79 73 74 65  .  ** file syste
1d350 6d 20 28 6f 6e 20 4f 53 58 29 2c 20 73 6f 20 66  m (on OSX), so f
1d360 61 69 6c 75 72 65 20 69 6e 64 69 63 61 74 65 73  ailure indicates
1d370 20 74 68 61 74 20 46 55 4c 4c 46 53 59 4e 43 0a   that FULLFSYNC.
1d380 20 20 2a 2a 20 69 73 6e 27 74 20 73 75 70 70 6f    ** isn't suppo
1d390 72 74 65 64 20 66 6f 72 20 74 68 69 73 20 66 69  rted for this fi
1d3a0 6c 65 20 73 79 73 74 65 6d 2e 20 53 6f 2c 20 61  le system. So, a
1d3b0 74 74 65 6d 70 74 20 61 6e 20 66 73 79 6e 63 20  ttempt an fsync 
1d3c0 0a 20 20 2a 2a 20 61 6e 64 20 28 66 6f 72 20 6e  .  ** and (for n
1d3d0 6f 77 29 20 69 67 6e 6f 72 65 20 74 68 65 20 6f  ow) ignore the o
1d3e0 76 65 72 68 65 61 64 20 6f 66 20 61 20 73 75 70  verhead of a sup
1d3f0 65 72 66 6c 75 6f 75 73 20 66 63 6e 74 6c 20 63  erfluous fcntl c
1d400 61 6c 6c 2e 20 20 0a 20 20 2a 2a 20 49 74 27 64  all.  .  ** It'd
1d410 20 62 65 20 62 65 74 74 65 72 20 74 6f 20 64 65   be better to de
1d420 74 65 63 74 20 66 75 6c 6c 66 73 79 6e 63 20 73  tect fullfsync s
1d430 75 70 70 6f 72 74 20 6f 6e 63 65 20 61 6e 64 20  upport once and 
1d440 61 76 6f 69 64 20 0a 20 20 2a 2a 20 74 68 65 20  avoid .  ** the 
1d450 66 63 6e 74 6c 20 63 61 6c 6c 20 65 76 65 72 79  fcntl call every
1d460 20 74 69 6d 65 20 73 79 6e 63 20 69 73 20 63 61   time sync is ca
1d470 6c 6c 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  lled..  */.  if(
1d480 20 72 63 20 29 20 72 63 20 3d 20 66 73 79 6e 63   rc ) rc = fsync
1d490 28 66 64 29 3b 0a 0a 23 65 6c 69 66 20 64 65 66  (fd);..#elif def
1d4a0 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 0a  ined(__APPLE__).
1d4b0 20 20 2f 2a 20 66 64 61 74 61 73 79 6e 63 28 29    /* fdatasync()
1d4c0 20 6f 6e 20 48 46 53 2b 20 64 6f 65 73 6e 27 74   on HFS+ doesn't
1d4d0 20 79 65 74 20 66 6c 75 73 68 20 74 68 65 20 66   yet flush the f
1d4e0 69 6c 65 20 73 69 7a 65 20 69 66 20 69 74 20 63  ile size if it c
1d4f0 68 61 6e 67 65 64 20 63 6f 72 72 65 63 74 6c 79  hanged correctly
1d500 0a 20 20 2a 2a 20 73 6f 20 63 75 72 72 65 6e 74  .  ** so current
1d510 6c 79 20 77 65 20 64 65 66 61 75 6c 74 20 74 6f  ly we default to
1d520 20 74 68 65 20 6d 61 63 72 6f 20 74 68 61 74 20   the macro that 
1d530 72 65 64 65 66 69 6e 65 73 20 66 64 61 74 61 73  redefines fdatas
1d540 79 6e 63 20 74 6f 20 66 73 79 6e 63 0a 20 20 2a  ync to fsync.  *
1d550 2f 0a 20 20 72 63 20 3d 20 66 73 79 6e 63 28 66  /.  rc = fsync(f
1d560 64 29 3b 0a 23 65 6c 73 65 20 0a 20 20 72 63 20  d);.#else .  rc 
1d570 3d 20 66 64 61 74 61 73 79 6e 63 28 66 64 29 3b  = fdatasync(fd);
1d580 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a  .#if OS_VXWORKS.
1d590 20 20 69 66 28 20 72 63 3d 3d 2d 31 20 26 26 20    if( rc==-1 && 
1d5a0 65 72 72 6e 6f 3d 3d 45 4e 4f 54 53 55 50 20 29  errno==ENOTSUP )
1d5b0 7b 0a 20 20 20 20 72 63 20 3d 20 66 73 79 6e 63  {.    rc = fsync
1d5c0 28 66 64 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  (fd);.  }.#endif
1d5d0 20 2f 2a 20 4f 53 5f 56 58 57 4f 52 4b 53 20 2a   /* OS_VXWORKS *
1d5e0 2f 0a 23 65 6e 64 69 66 20 2f 2a 20 69 66 64 65  /.#endif /* ifde
1d5f0 66 20 53 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e 43  f SQLITE_NO_SYNC
1d600 20 65 6c 69 66 20 48 41 56 45 5f 46 55 4c 4c 46   elif HAVE_FULLF
1d610 53 59 4e 43 20 2a 2f 0a 0a 20 20 69 66 28 20 4f  SYNC */..  if( O
1d620 53 5f 56 58 57 4f 52 4b 53 20 26 26 20 72 63 21  S_VXWORKS && rc!
1d630 3d 20 2d 31 20 29 7b 0a 20 20 20 20 72 63 20 3d  = -1 ){.    rc =
1d640 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e   0;.  }.  return
1d650 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70   rc;.}../*.** Op
1d660 65 6e 20 61 20 66 69 6c 65 20 64 65 73 63 72 69  en a file descri
1d670 70 74 6f 72 20 74 6f 20 74 68 65 20 64 69 72 65  ptor to the dire
1d680 63 74 6f 72 79 20 63 6f 6e 74 61 69 6e 69 6e 67  ctory containing
1d690 20 66 69 6c 65 20 7a 46 69 6c 65 6e 61 6d 65 2e   file zFilename.
1d6a0 0a 2a 2a 20 49 66 20 73 75 63 63 65 73 73 66 75  .** If successfu
1d6b0 6c 2c 20 2a 70 46 64 20 69 73 20 73 65 74 20 74  l, *pFd is set t
1d6c0 6f 20 74 68 65 20 6f 70 65 6e 65 64 20 66 69 6c  o the opened fil
1d6d0 65 20 64 65 73 63 72 69 70 74 6f 72 20 61 6e 64  e descriptor and
1d6e0 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73  .** SQLITE_OK is
1d6f0 20 72 65 74 75 72 6e 65 64 2e 20 49 66 20 61 6e   returned. If an
1d700 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 65   error occurs, e
1d710 69 74 68 65 72 20 53 51 4c 49 54 45 5f 4e 4f 4d  ither SQLITE_NOM
1d720 45 4d 0a 2a 2a 20 6f 72 20 53 51 4c 49 54 45 5f  EM.** or SQLITE_
1d730 43 41 4e 54 4f 50 45 4e 20 69 73 20 72 65 74 75  CANTOPEN is retu
1d740 72 6e 65 64 20 61 6e 64 20 2a 70 46 64 20 69 73  rned and *pFd is
1d750 20 73 65 74 20 74 6f 20 61 6e 20 75 6e 64 65 66   set to an undef
1d760 69 6e 65 64 0a 2a 2a 20 76 61 6c 75 65 2e 0a 2a  ined.** value..*
1d770 2a 0a 2a 2a 20 54 68 65 20 64 69 72 65 63 74 6f  *.** The directo
1d780 72 79 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  ry file descript
1d790 6f 72 20 69 73 20 75 73 65 64 20 66 6f 72 20 6f  or is used for o
1d7a0 6e 6c 79 20 6f 6e 65 20 74 68 69 6e 67 20 2d 20  nly one thing - 
1d7b0 74 6f 0a 2a 2a 20 66 73 79 6e 63 28 29 20 61 20  to.** fsync() a 
1d7c0 64 69 72 65 63 74 6f 72 79 20 74 6f 20 6d 61 6b  directory to mak
1d7d0 65 20 73 75 72 65 20 66 69 6c 65 20 63 72 65 61  e sure file crea
1d7e0 74 69 6f 6e 20 61 6e 64 20 64 65 6c 65 74 69 6f  tion and deletio
1d7f0 6e 20 65 76 65 6e 74 73 0a 2a 2a 20 61 72 65 20  n events.** are 
1d800 66 6c 75 73 68 65 64 20 74 6f 20 64 69 73 6b 2e  flushed to disk.
1d810 20 20 53 75 63 68 20 66 73 79 6e 63 73 20 61 72    Such fsyncs ar
1d820 65 20 6e 6f 74 20 6e 65 65 64 65 64 20 6f 6e 20  e not needed on 
1d830 6e 65 77 65 72 0a 2a 2a 20 6a 6f 75 72 6e 61 6c  newer.** journal
1d840 69 6e 67 20 66 69 6c 65 73 79 73 74 65 6d 73 2c  ing filesystems,
1d850 20 62 75 74 20 61 72 65 20 72 65 71 75 69 72 65   but are require
1d860 64 20 6f 6e 20 6f 6c 64 65 72 20 66 69 6c 65 73  d on older files
1d870 79 73 74 65 6d 73 2e 0a 2a 2a 0a 2a 2a 20 54 68  ystems..**.** Th
1d880 69 73 20 72 6f 75 74 69 6e 65 20 63 61 6e 20 62  is routine can b
1d890 65 20 6f 76 65 72 72 69 64 64 65 6e 20 75 73 69  e overridden usi
1d8a0 6e 67 20 74 68 65 20 78 53 65 74 53 79 73 43 61  ng the xSetSysCa
1d8b0 6c 6c 20 69 6e 74 65 72 66 61 63 65 2e 0a 2a 2a  ll interface..**
1d8c0 20 54 68 65 20 61 62 69 6c 69 74 79 20 74 6f 20   The ability to 
1d8d0 6f 76 65 72 72 69 64 65 20 74 68 69 73 20 72 6f  override this ro
1d8e0 75 74 69 6e 65 20 77 61 73 20 61 64 64 65 64 20  utine was added 
1d8f0 69 6e 20 73 75 70 70 6f 72 74 20 6f 66 20 74 68  in support of th
1d900 65 0a 2a 2a 20 63 68 72 6f 6d 69 75 6d 20 73 61  e.** chromium sa
1d910 6e 64 62 6f 78 2e 20 20 4f 70 65 6e 69 6e 67 20  ndbox.  Opening 
1d920 61 20 64 69 72 65 63 74 6f 72 79 20 69 73 20 61  a directory is a
1d930 20 73 65 63 75 72 69 74 79 20 72 69 73 6b 20 28   security risk (
1d940 77 65 20 61 72 65 0a 2a 2a 20 74 6f 6c 64 29 20  we are.** told) 
1d950 73 6f 20 6d 61 6b 69 6e 67 20 69 74 20 6f 76 65  so making it ove
1d960 72 72 69 64 65 61 62 6c 65 20 61 6c 6c 6f 77 73  rrideable allows
1d970 20 74 68 65 20 63 68 72 6f 6d 69 75 6d 20 73 61   the chromium sa
1d980 6e 64 62 6f 78 20 74 6f 0a 2a 2a 20 72 65 70 6c  ndbox to.** repl
1d990 61 63 65 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ace this routine
1d9a0 20 77 69 74 68 20 61 20 68 61 72 6d 6c 65 73 73   with a harmless
1d9b0 20 6e 6f 2d 6f 70 2e 20 20 54 6f 20 6d 61 6b 65   no-op.  To make
1d9c0 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a   this routine.**
1d9d0 20 61 20 6e 6f 2d 6f 70 2c 20 72 65 70 6c 61 63   a no-op, replac
1d9e0 65 20 69 74 20 77 69 74 68 20 61 20 73 74 75 62  e it with a stub
1d9f0 20 74 68 61 74 20 72 65 74 75 72 6e 73 20 53 51   that returns SQ
1da00 4c 49 54 45 5f 4f 4b 20 62 75 74 20 6c 65 61 76  LITE_OK but leav
1da10 65 73 0a 2a 2a 20 2a 70 46 64 20 73 65 74 20 74  es.** *pFd set t
1da20 6f 20 61 20 6e 65 67 61 74 69 76 65 20 6e 75 6d  o a negative num
1da30 62 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 53 51  ber..**.** If SQ
1da40 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72  LITE_OK is retur
1da50 6e 65 64 2c 20 74 68 65 20 63 61 6c 6c 65 72 20  ned, the caller 
1da60 69 73 20 72 65 73 70 6f 6e 73 69 62 6c 65 20 66  is responsible f
1da70 6f 72 20 63 6c 6f 73 69 6e 67 0a 2a 2a 20 74 68  or closing.** th
1da80 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  e file descripto
1da90 72 20 2a 70 46 64 20 75 73 69 6e 67 20 63 6c 6f  r *pFd using clo
1daa0 73 65 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  se()..*/.static 
1dab0 69 6e 74 20 6f 70 65 6e 44 69 72 65 63 74 6f 72  int openDirector
1dac0 79 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46  y(const char *zF
1dad0 69 6c 65 6e 61 6d 65 2c 20 69 6e 74 20 2a 70 46  ilename, int *pF
1dae0 64 29 7b 0a 20 20 69 6e 74 20 69 69 3b 0a 20 20  d){.  int ii;.  
1daf0 69 6e 74 20 66 64 20 3d 20 2d 31 3b 0a 20 20 63  int fd = -1;.  c
1db00 68 61 72 20 7a 44 69 72 6e 61 6d 65 5b 4d 41 58  har zDirname[MAX
1db10 5f 50 41 54 48 4e 41 4d 45 2b 31 5d 3b 0a 0a 20  _PATHNAME+1];.. 
1db20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
1db30 66 28 4d 41 58 5f 50 41 54 48 4e 41 4d 45 2c 20  f(MAX_PATHNAME, 
1db40 7a 44 69 72 6e 61 6d 65 2c 20 22 25 73 22 2c 20  zDirname, "%s", 
1db50 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 66 6f  zFilename);.  fo
1db60 72 28 69 69 3d 28 69 6e 74 29 73 74 72 6c 65 6e  r(ii=(int)strlen
1db70 28 7a 44 69 72 6e 61 6d 65 29 3b 20 69 69 3e 31  (zDirname); ii>1
1db80 20 26 26 20 7a 44 69 72 6e 61 6d 65 5b 69 69 5d   && zDirname[ii]
1db90 21 3d 27 2f 27 3b 20 69 69 2d 2d 29 3b 0a 20 20  !='/'; ii--);.  
1dba0 69 66 28 20 69 69 3e 30 20 29 7b 0a 20 20 20 20  if( ii>0 ){.    
1dbb0 7a 44 69 72 6e 61 6d 65 5b 69 69 5d 20 3d 20 27  zDirname[ii] = '
1dbc0 5c 30 27 3b 0a 20 20 20 20 66 64 20 3d 20 72 6f  \0';.    fd = ro
1dbd0 62 75 73 74 5f 6f 70 65 6e 28 7a 44 69 72 6e 61  bust_open(zDirna
1dbe0 6d 65 2c 20 4f 5f 52 44 4f 4e 4c 59 7c 4f 5f 42  me, O_RDONLY|O_B
1dbf0 49 4e 41 52 59 2c 20 30 29 3b 0a 20 20 20 20 69  INARY, 0);.    i
1dc00 66 28 20 66 64 3e 3d 30 20 29 7b 0a 23 69 66 64  f( fd>=0 ){.#ifd
1dc10 65 66 20 46 44 5f 43 4c 4f 45 58 45 43 0a 20 20  ef FD_CLOEXEC.  
1dc20 20 20 20 20 6f 73 46 63 6e 74 6c 28 66 64 2c 20      osFcntl(fd, 
1dc30 46 5f 53 45 54 46 44 2c 20 6f 73 46 63 6e 74 6c  F_SETFD, osFcntl
1dc40 28 66 64 2c 20 46 5f 47 45 54 46 44 2c 20 30 29  (fd, F_GETFD, 0)
1dc50 20 7c 20 46 44 5f 43 4c 4f 45 58 45 43 29 3b 0a   | FD_CLOEXEC);.
1dc60 23 65 6e 64 69 66 0a 20 20 20 20 20 20 4f 53 54  #endif.      OST
1dc70 52 41 43 45 28 28 22 4f 50 45 4e 44 49 52 20 25  RACE(("OPENDIR %
1dc80 2d 33 64 20 25 73 5c 6e 22 2c 20 66 64 2c 20 7a  -3d %s\n", fd, z
1dc90 44 69 72 6e 61 6d 65 29 29 3b 0a 20 20 20 20 7d  Dirname));.    }
1dca0 0a 20 20 7d 0a 20 20 2a 70 46 64 20 3d 20 66 64  .  }.  *pFd = fd
1dcb0 3b 0a 20 20 72 65 74 75 72 6e 20 28 66 64 3e 3d  ;.  return (fd>=
1dcc0 30 3f 53 51 4c 49 54 45 5f 4f 4b 3a 75 6e 69 78  0?SQLITE_OK:unix
1dcd0 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f  LogError(SQLITE_
1dce0 43 41 4e 54 4f 50 45 4e 5f 42 4b 50 54 2c 20 22  CANTOPEN_BKPT, "
1dcf0 6f 70 65 6e 22 2c 20 7a 44 69 72 6e 61 6d 65 29  open", zDirname)
1dd00 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65  );.}../*.** Make
1dd10 20 73 75 72 65 20 61 6c 6c 20 77 72 69 74 65 73   sure all writes
1dd20 20 74 6f 20 61 20 70 61 72 74 69 63 75 6c 61 72   to a particular
1dd30 20 66 69 6c 65 20 61 72 65 20 63 6f 6d 6d 69 74   file are commit
1dd40 74 65 64 20 74 6f 20 64 69 73 6b 2e 0a 2a 2a 0a  ted to disk..**.
1dd50 2a 2a 20 49 66 20 64 61 74 61 4f 6e 6c 79 3d 3d  ** If dataOnly==
1dd60 30 20 74 68 65 6e 20 62 6f 74 68 20 74 68 65 20  0 then both the 
1dd70 66 69 6c 65 20 69 74 73 65 6c 66 20 61 6e 64 20  file itself and 
1dd80 69 74 73 20 6d 65 74 61 64 61 74 61 20 28 66 69  its metadata (fi
1dd90 6c 65 0a 2a 2a 20 73 69 7a 65 2c 20 61 63 63 65  le.** size, acce
1dda0 73 73 20 74 69 6d 65 2c 20 65 74 63 29 20 61 72  ss time, etc) ar
1ddb0 65 20 73 79 6e 63 65 64 2e 20 20 49 66 20 64 61  e synced.  If da
1ddc0 74 61 4f 6e 6c 79 21 3d 30 20 74 68 65 6e 20 6f  taOnly!=0 then o
1ddd0 6e 6c 79 20 74 68 65 0a 2a 2a 20 66 69 6c 65 20  nly the.** file 
1dde0 64 61 74 61 20 69 73 20 73 79 6e 63 65 64 2e 0a  data is synced..
1ddf0 2a 2a 0a 2a 2a 20 55 6e 64 65 72 20 55 6e 69 78  **.** Under Unix
1de00 2c 20 61 6c 73 6f 20 6d 61 6b 65 20 73 75 72 65  , also make sure
1de10 20 74 68 61 74 20 74 68 65 20 64 69 72 65 63 74   that the direct
1de20 6f 72 79 20 65 6e 74 72 79 20 66 6f 72 20 74 68  ory entry for th
1de30 65 20 66 69 6c 65 0a 2a 2a 20 68 61 73 20 62 65  e file.** has be
1de40 65 6e 20 63 72 65 61 74 65 64 20 62 79 20 66 73  en created by fs
1de50 79 6e 63 2d 69 6e 67 20 74 68 65 20 64 69 72 65  ync-ing the dire
1de60 63 74 6f 72 79 20 74 68 61 74 20 63 6f 6e 74 61  ctory that conta
1de70 69 6e 73 20 74 68 65 20 66 69 6c 65 2e 0a 2a 2a  ins the file..**
1de80 20 49 66 20 77 65 20 64 6f 20 6e 6f 74 20 64 6f   If we do not do
1de90 20 74 68 69 73 20 61 6e 64 20 77 65 20 65 6e 63   this and we enc
1dea0 6f 75 6e 74 65 72 20 61 20 70 6f 77 65 72 20 66  ounter a power f
1deb0 61 69 6c 75 72 65 2c 20 74 68 65 20 64 69 72 65  ailure, the dire
1dec0 63 74 6f 72 79 0a 2a 2a 20 65 6e 74 72 79 20 66  ctory.** entry f
1ded0 6f 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 6d  or the journal m
1dee0 69 67 68 74 20 6e 6f 74 20 65 78 69 73 74 20 61  ight not exist a
1def0 66 74 65 72 20 77 65 20 72 65 62 6f 6f 74 2e 20  fter we reboot. 
1df00 20 54 68 65 20 6e 65 78 74 0a 2a 2a 20 53 51 4c   The next.** SQL
1df10 69 74 65 20 74 6f 20 61 63 63 65 73 73 20 74 68  ite to access th
1df20 65 20 66 69 6c 65 20 77 69 6c 6c 20 6e 6f 74 20  e file will not 
1df30 6b 6e 6f 77 20 74 68 61 74 20 74 68 65 20 6a 6f  know that the jo
1df40 75 72 6e 61 6c 20 65 78 69 73 74 73 20 28 62 65  urnal exists (be
1df50 63 61 75 73 65 0a 2a 2a 20 74 68 65 20 64 69 72  cause.** the dir
1df60 65 63 74 6f 72 79 20 65 6e 74 72 79 20 66 6f 72  ectory entry for
1df70 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 77 61 73   the journal was
1df80 20 6e 65 76 65 72 20 63 72 65 61 74 65 64 29 20   never created) 
1df90 61 6e 64 20 74 68 65 20 74 72 61 6e 73 61 63 74  and the transact
1dfa0 69 6f 6e 0a 2a 2a 20 77 69 6c 6c 20 6e 6f 74 20  ion.** will not 
1dfb0 72 6f 6c 6c 20 62 61 63 6b 20 2d 20 70 6f 73 73  roll back - poss
1dfc0 69 62 6c 79 20 6c 65 61 64 69 6e 67 20 74 6f 20  ibly leading to 
1dfd0 64 61 74 61 62 61 73 65 20 63 6f 72 72 75 70 74  database corrupt
1dfe0 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ion..*/.static i
1dff0 6e 74 20 75 6e 69 78 53 79 6e 63 28 73 71 6c 69  nt unixSync(sqli
1e000 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e  te3_file *id, in
1e010 74 20 66 6c 61 67 73 29 7b 0a 20 20 69 6e 74 20  t flags){.  int 
1e020 72 63 3b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a  rc;.  unixFile *
1e030 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c  pFile = (unixFil
1e040 65 2a 29 69 64 3b 0a 0a 20 20 69 6e 74 20 69 73  e*)id;..  int is
1e050 44 61 74 61 4f 6e 6c 79 20 3d 20 28 66 6c 61 67  DataOnly = (flag
1e060 73 26 53 51 4c 49 54 45 5f 53 59 4e 43 5f 44 41  s&SQLITE_SYNC_DA
1e070 54 41 4f 4e 4c 59 29 3b 0a 20 20 69 6e 74 20 69  TAONLY);.  int i
1e080 73 46 75 6c 6c 73 79 6e 63 20 3d 20 28 66 6c 61  sFullsync = (fla
1e090 67 73 26 30 78 30 46 29 3d 3d 53 51 4c 49 54 45  gs&0x0F)==SQLITE
1e0a0 5f 53 59 4e 43 5f 46 55 4c 4c 3b 0a 0a 20 20 2f  _SYNC_FULL;..  /
1e0b0 2a 20 43 68 65 63 6b 20 74 68 61 74 20 6f 6e 65  * Check that one
1e0c0 20 6f 66 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f   of SQLITE_SYNC_
1e0d0 4e 4f 52 4d 41 4c 20 6f 72 20 46 55 4c 4c 20 77  NORMAL or FULL w
1e0e0 61 73 20 70 61 73 73 65 64 20 2a 2f 0a 20 20 61  as passed */.  a
1e0f0 73 73 65 72 74 28 28 66 6c 61 67 73 26 30 78 30  ssert((flags&0x0
1e100 46 29 3d 3d 53 51 4c 49 54 45 5f 53 59 4e 43 5f  F)==SQLITE_SYNC_
1e110 4e 4f 52 4d 41 4c 0a 20 20 20 20 20 20 7c 7c 20  NORMAL.      || 
1e120 28 66 6c 61 67 73 26 30 78 30 46 29 3d 3d 53 51  (flags&0x0F)==SQ
1e130 4c 49 54 45 5f 53 59 4e 43 5f 46 55 4c 4c 0a 20  LITE_SYNC_FULL. 
1e140 20 29 3b 0a 0a 20 20 2f 2a 20 55 6e 69 78 20 63   );..  /* Unix c
1e150 61 6e 6e 6f 74 2c 20 62 75 74 20 73 6f 6d 65 20  annot, but some 
1e160 73 79 73 74 65 6d 73 20 6d 61 79 20 72 65 74 75  systems may retu
1e170 72 6e 20 53 51 4c 49 54 45 5f 46 55 4c 4c 20 66  rn SQLITE_FULL f
1e180 72 6f 6d 20 68 65 72 65 2e 20 54 68 69 73 0a 20  rom here. This. 
1e190 20 2a 2a 20 6c 69 6e 65 20 69 73 20 74 6f 20 74   ** line is to t
1e1a0 65 73 74 20 74 68 61 74 20 64 6f 69 6e 67 20 73  est that doing s
1e1b0 6f 20 64 6f 65 73 20 6e 6f 74 20 63 61 75 73 65  o does not cause
1e1c0 20 61 6e 79 20 70 72 6f 62 6c 65 6d 73 2e 0a 20   any problems.. 
1e1d0 20 2a 2f 0a 20 20 53 69 6d 75 6c 61 74 65 44 69   */.  SimulateDi
1e1e0 73 6b 66 75 6c 6c 45 72 72 6f 72 28 20 72 65 74  skfullError( ret
1e1f0 75 72 6e 20 53 51 4c 49 54 45 5f 46 55 4c 4c 20  urn SQLITE_FULL 
1e200 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 46  );..  assert( pF
1e210 69 6c 65 20 29 3b 0a 20 20 4f 53 54 52 41 43 45  ile );.  OSTRACE
1e220 28 28 22 53 59 4e 43 20 20 20 20 25 2d 33 64 5c  (("SYNC    %-3d\
1e230 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 29 29 3b 0a  n", pFile->h));.
1e240 20 20 72 63 20 3d 20 66 75 6c 6c 5f 66 73 79 6e    rc = full_fsyn
1e250 63 28 70 46 69 6c 65 2d 3e 68 2c 20 69 73 46 75  c(pFile->h, isFu
1e260 6c 6c 73 79 6e 63 2c 20 69 73 44 61 74 61 4f 6e  llsync, isDataOn
1e270 6c 79 29 3b 0a 20 20 53 69 6d 75 6c 61 74 65 49  ly);.  SimulateI
1e280 4f 45 72 72 6f 72 28 20 72 63 3d 31 20 29 3b 0a  OError( rc=1 );.
1e290 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
1e2a0 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f  pFile->lastErrno
1e2b0 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 72 65   = errno;.    re
1e2c0 74 75 72 6e 20 75 6e 69 78 4c 6f 67 45 72 72 6f  turn unixLogErro
1e2d0 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 46  r(SQLITE_IOERR_F
1e2e0 53 59 4e 43 2c 20 22 66 75 6c 6c 5f 66 73 79 6e  SYNC, "full_fsyn
1e2f0 63 22 2c 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68  c", pFile->zPath
1e300 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 6c 73  );.  }..  /* Als
1e310 6f 20 66 73 79 6e 63 20 74 68 65 20 64 69 72 65  o fsync the dire
1e320 63 74 6f 72 79 20 63 6f 6e 74 61 69 6e 69 6e 67  ctory containing
1e330 20 74 68 65 20 66 69 6c 65 20 69 66 20 74 68 65   the file if the
1e340 20 44 49 52 53 59 4e 43 20 66 6c 61 67 0a 20 20   DIRSYNC flag.  
1e350 2a 2a 20 69 73 20 73 65 74 2e 20 20 54 68 69 73  ** is set.  This
1e360 20 69 73 20 61 20 6f 6e 65 2d 74 69 6d 65 20 6f   is a one-time o
1e370 63 63 75 72 72 61 6e 63 65 2e 20 20 4d 61 6e 79  ccurrance.  Many
1e380 20 73 79 73 74 65 6d 73 20 28 65 78 61 6d 70 6c   systems (exampl
1e390 65 73 3a 20 41 49 58 29 0a 20 20 2a 2a 20 61 72  es: AIX).  ** ar
1e3a0 65 20 75 6e 61 62 6c 65 20 74 6f 20 66 73 79 6e  e unable to fsyn
1e3b0 63 20 61 20 64 69 72 65 63 74 6f 72 79 2c 20 73  c a directory, s
1e3c0 6f 20 69 67 6e 6f 72 65 20 65 72 72 6f 72 73 20  o ignore errors 
1e3d0 6f 6e 20 74 68 65 20 66 73 79 6e 63 2e 0a 20 20  on the fsync..  
1e3e0 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e  */.  if( pFile->
1e3f0 63 74 72 6c 46 6c 61 67 73 20 26 20 55 4e 49 58  ctrlFlags & UNIX
1e400 46 49 4c 45 5f 44 49 52 53 59 4e 43 20 29 7b 0a  FILE_DIRSYNC ){.
1e410 20 20 20 20 69 6e 74 20 64 69 72 66 64 3b 0a 20      int dirfd;. 
1e420 20 20 20 4f 53 54 52 41 43 45 28 28 22 44 49 52     OSTRACE(("DIR
1e430 53 59 4e 43 20 25 73 20 28 68 61 76 65 5f 66 75  SYNC %s (have_fu
1e440 6c 6c 66 73 79 6e 63 3d 25 64 20 66 75 6c 6c 73  llfsync=%d fulls
1e450 79 6e 63 3d 25 64 29 5c 6e 22 2c 20 70 46 69 6c  ync=%d)\n", pFil
1e460 65 2d 3e 7a 50 61 74 68 2c 0a 20 20 20 20 20 20  e->zPath,.      
1e470 20 20 20 20 20 20 48 41 56 45 5f 46 55 4c 4c 46        HAVE_FULLF
1e480 53 59 4e 43 2c 20 69 73 46 75 6c 6c 73 79 6e 63  SYNC, isFullsync
1e490 29 29 3b 0a 20 20 20 20 72 63 20 3d 20 6f 73 4f  ));.    rc = osO
1e4a0 70 65 6e 44 69 72 65 63 74 6f 72 79 28 70 46 69  penDirectory(pFi
1e4b0 6c 65 2d 3e 7a 50 61 74 68 2c 20 26 64 69 72 66  le->zPath, &dirf
1e4c0 64 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d  d);.    if( rc==
1e4d0 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 64 69 72  SQLITE_OK && dir
1e4e0 66 64 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 66  fd>=0 ){.      f
1e4f0 75 6c 6c 5f 66 73 79 6e 63 28 64 69 72 66 64 2c  ull_fsync(dirfd,
1e500 20 30 2c 20 30 29 3b 0a 23 69 66 20 4f 53 43 4c   0, 0);.#if OSCL
1e510 4f 53 45 5f 43 48 45 43 4b 5f 43 4c 4f 53 45 5f  OSE_CHECK_CLOSE_
1e520 49 4f 45 52 52 0a 20 20 20 20 20 20 69 66 28 20  IOERR.      if( 
1e530 63 6c 6f 73 65 28 70 46 69 6c 65 2d 3e 64 69 72  close(pFile->dir
1e540 66 64 29 20 29 7b 0a 20 20 20 20 20 20 20 20 70  fd) ){.        p
1e550 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20  File->lastErrno 
1e560 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20 20  = errno;.       
1e570 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45   rc = SQLITE_IOE
1e580 52 52 5f 44 49 52 5f 43 4c 4f 53 45 3b 0a 20 20  RR_DIR_CLOSE;.  
1e590 20 20 20 20 7d 0a 23 65 6c 73 65 0a 20 20 20 20      }.#else.    
1e5a0 20 20 72 6f 62 75 73 74 5f 63 6c 6f 73 65 28 70    robust_close(p
1e5b0 46 69 6c 65 2c 20 64 69 72 66 64 2c 20 5f 5f 4c  File, dirfd, __L
1e5c0 49 4e 45 5f 5f 29 3b 0a 23 65 6e 64 69 66 0a 20  INE__);.#endif. 
1e5d0 20 20 20 7d 0a 20 20 20 20 70 46 69 6c 65 2d 3e     }.    pFile->
1e5e0 63 74 72 6c 46 6c 61 67 73 20 26 3d 20 7e 55 4e  ctrlFlags &= ~UN
1e5f0 49 58 46 49 4c 45 5f 44 49 52 53 59 4e 43 3b 0a  IXFILE_DIRSYNC;.
1e600 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
1e610 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72 75 6e 63  ;.}../*.** Trunc
1e620 61 74 65 20 61 6e 20 6f 70 65 6e 20 66 69 6c 65  ate an open file
1e630 20 74 6f 20 61 20 73 70 65 63 69 66 69 65 64 20   to a specified 
1e640 73 69 7a 65 0a 2a 2f 0a 73 74 61 74 69 63 20 69  size.*/.static i
1e650 6e 74 20 75 6e 69 78 54 72 75 6e 63 61 74 65 28  nt unixTruncate(
1e660 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64  sqlite3_file *id
1e670 2c 20 69 36 34 20 6e 42 79 74 65 29 7b 0a 20 20  , i64 nByte){.  
1e680 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20  unixFile *pFile 
1e690 3d 20 28 75 6e 69 78 46 69 6c 65 20 2a 29 69 64  = (unixFile *)id
1e6a0 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 61 73  ;.  int rc;.  as
1e6b0 73 65 72 74 28 20 70 46 69 6c 65 20 29 3b 0a 20  sert( pFile );. 
1e6c0 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72   SimulateIOError
1e6d0 28 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ( return SQLITE_
1e6e0 49 4f 45 52 52 5f 54 52 55 4e 43 41 54 45 20 29  IOERR_TRUNCATE )
1e6f0 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 75  ;..  /* If the u
1e700 73 65 72 20 68 61 73 20 63 6f 6e 66 69 67 75 72  ser has configur
1e710 65 64 20 61 20 63 68 75 6e 6b 2d 73 69 7a 65 20  ed a chunk-size 
1e720 66 6f 72 20 74 68 69 73 20 66 69 6c 65 2c 20 74  for this file, t
1e730 72 75 6e 63 61 74 65 20 74 68 65 0a 20 20 2a 2a  runcate the.  **
1e740 20 66 69 6c 65 20 73 6f 20 74 68 61 74 20 69 74   file so that it
1e750 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 61 6e 20   consists of an 
1e760 69 6e 74 65 67 65 72 20 6e 75 6d 62 65 72 20 6f  integer number o
1e770 66 20 63 68 75 6e 6b 73 20 28 69 2e 65 2e 20 74  f chunks (i.e. t
1e780 68 65 0a 20 20 2a 2a 20 61 63 74 75 61 6c 20 66  he.  ** actual f
1e790 69 6c 65 20 73 69 7a 65 20 61 66 74 65 72 20 74  ile size after t
1e7a0 68 65 20 6f 70 65 72 61 74 69 6f 6e 20 6d 61 79  he operation may
1e7b0 20 62 65 20 6c 61 72 67 65 72 20 74 68 61 6e 20   be larger than 
1e7c0 74 68 65 20 72 65 71 75 65 73 74 65 64 0a 20 20  the requested.  
1e7d0 2a 2a 20 73 69 7a 65 29 2e 0a 20 20 2a 2f 0a 20  ** size)..  */. 
1e7e0 20 69 66 28 20 70 46 69 6c 65 2d 3e 73 7a 43 68   if( pFile->szCh
1e7f0 75 6e 6b 20 29 7b 0a 20 20 20 20 6e 42 79 74 65  unk ){.    nByte
1e800 20 3d 20 28 28 6e 42 79 74 65 20 2b 20 70 46 69   = ((nByte + pFi
1e810 6c 65 2d 3e 73 7a 43 68 75 6e 6b 20 2d 20 31 29  le->szChunk - 1)
1e820 2f 70 46 69 6c 65 2d 3e 73 7a 43 68 75 6e 6b 29  /pFile->szChunk)
1e830 20 2a 20 70 46 69 6c 65 2d 3e 73 7a 43 68 75 6e   * pFile->szChun
1e840 6b 3b 0a 20 20 7d 0a 0a 20 20 72 63 20 3d 20 72  k;.  }..  rc = r
1e850 6f 62 75 73 74 5f 66 74 72 75 6e 63 61 74 65 28  obust_ftruncate(
1e860 70 46 69 6c 65 2d 3e 68 2c 20 28 6f 66 66 5f 74  pFile->h, (off_t
1e870 29 6e 42 79 74 65 29 3b 0a 20 20 69 66 28 20 72  )nByte);.  if( r
1e880 63 20 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e  c ){.    pFile->
1e890 6c 61 73 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e  lastErrno = errn
1e8a0 6f 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 75 6e  o;.    return un
1e8b0 69 78 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54  ixLogError(SQLIT
1e8c0 45 5f 49 4f 45 52 52 5f 54 52 55 4e 43 41 54 45  E_IOERR_TRUNCATE
1e8d0 2c 20 22 66 74 72 75 6e 63 61 74 65 22 2c 20 70  , "ftruncate", p
1e8e0 46 69 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a 20 20  File->zPath);.  
1e8f0 7d 65 6c 73 65 7b 0a 23 69 66 6e 64 65 66 20 4e  }else{.#ifndef N
1e900 44 45 42 55 47 0a 20 20 20 20 2f 2a 20 49 66 20  DEBUG.    /* If 
1e910 77 65 20 61 72 65 20 64 6f 69 6e 67 20 61 20 6e  we are doing a n
1e920 6f 72 6d 61 6c 20 77 72 69 74 65 20 74 6f 20 61  ormal write to a
1e930 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 28   database file (
1e940 61 73 20 6f 70 70 6f 73 65 64 20 74 6f 0a 20 20  as opposed to.  
1e950 20 20 2a 2a 20 64 6f 69 6e 67 20 61 20 68 6f 74    ** doing a hot
1e960 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61 63  -journal rollbac
1e970 6b 20 6f 72 20 61 20 77 72 69 74 65 20 74 6f 20  k or a write to 
1e980 73 6f 6d 65 20 66 69 6c 65 20 6f 74 68 65 72 20  some file other 
1e990 74 68 61 6e 20 61 0a 20 20 20 20 2a 2a 20 6e 6f  than a.    ** no
1e9a0 72 6d 61 6c 20 64 61 74 61 62 61 73 65 20 66 69  rmal database fi
1e9b0 6c 65 29 20 61 6e 64 20 77 65 20 74 72 75 6e 63  le) and we trunc
1e9c0 61 74 65 20 74 68 65 20 66 69 6c 65 20 74 6f 20  ate the file to 
1e9d0 7a 65 72 6f 20 6c 65 6e 67 74 68 2c 0a 20 20 20  zero length,.   
1e9e0 20 2a 2a 20 74 68 61 74 20 65 66 66 65 63 74 69   ** that effecti
1e9f0 76 65 6c 79 20 75 70 64 61 74 65 73 20 74 68 65  vely updates the
1ea00 20 63 68 61 6e 67 65 20 63 6f 75 6e 74 65 72 2e   change counter.
1ea10 20 20 54 68 69 73 20 6d 69 67 68 74 20 68 61 70    This might hap
1ea20 70 65 6e 0a 20 20 20 20 2a 2a 20 77 68 65 6e 20  pen.    ** when 
1ea30 72 65 73 74 6f 72 69 6e 67 20 61 20 64 61 74 61  restoring a data
1ea40 62 61 73 65 20 75 73 69 6e 67 20 74 68 65 20 62  base using the b
1ea50 61 63 6b 75 70 20 41 50 49 20 66 72 6f 6d 20 61  ackup API from a
1ea60 20 7a 65 72 6f 2d 6c 65 6e 67 74 68 0a 20 20 20   zero-length.   
1ea70 20 2a 2a 20 73 6f 75 72 63 65 2e 0a 20 20 20 20   ** source..    
1ea80 2a 2f 0a 20 20 20 20 69 66 28 20 70 46 69 6c 65  */.    if( pFile
1ea90 2d 3e 69 6e 4e 6f 72 6d 61 6c 57 72 69 74 65 20  ->inNormalWrite 
1eaa0 26 26 20 6e 42 79 74 65 3d 3d 30 20 29 7b 0a 20  && nByte==0 ){. 
1eab0 20 20 20 20 20 70 46 69 6c 65 2d 3e 74 72 61 6e       pFile->tran
1eac0 73 43 6e 74 72 43 68 6e 67 20 3d 20 31 3b 0a 20  sCntrChng = 1;. 
1ead0 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20     }.#endif..   
1eae0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
1eaf0 4b 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  K;.  }.}../*.** 
1eb00 44 65 74 65 72 6d 69 6e 65 20 74 68 65 20 63 75  Determine the cu
1eb10 72 72 65 6e 74 20 73 69 7a 65 20 6f 66 20 61 20  rrent size of a 
1eb20 66 69 6c 65 20 69 6e 20 62 79 74 65 73 0a 2a 2f  file in bytes.*/
1eb30 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78  .static int unix
1eb40 46 69 6c 65 53 69 7a 65 28 73 71 6c 69 74 65 33  FileSize(sqlite3
1eb50 5f 66 69 6c 65 20 2a 69 64 2c 20 69 36 34 20 2a  _file *id, i64 *
1eb60 70 53 69 7a 65 29 7b 0a 20 20 69 6e 74 20 72 63  pSize){.  int rc
1eb70 3b 0a 20 20 73 74 72 75 63 74 20 73 74 61 74 20  ;.  struct stat 
1eb80 62 75 66 3b 0a 20 20 61 73 73 65 72 74 28 20 69  buf;.  assert( i
1eb90 64 20 29 3b 0a 20 20 72 63 20 3d 20 6f 73 46 73  d );.  rc = osFs
1eba0 74 61 74 28 28 28 75 6e 69 78 46 69 6c 65 2a 29  tat(((unixFile*)
1ebb0 69 64 29 2d 3e 68 2c 20 26 62 75 66 29 3b 0a 20  id)->h, &buf);. 
1ebc0 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72   SimulateIOError
1ebd0 28 20 72 63 3d 31 20 29 3b 0a 20 20 69 66 28 20  ( rc=1 );.  if( 
1ebe0 72 63 21 3d 30 20 29 7b 0a 20 20 20 20 28 28 75  rc!=0 ){.    ((u
1ebf0 6e 69 78 46 69 6c 65 2a 29 69 64 29 2d 3e 6c 61  nixFile*)id)->la
1ec00 73 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b  stErrno = errno;
1ec10 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
1ec20 54 45 5f 49 4f 45 52 52 5f 46 53 54 41 54 3b 0a  TE_IOERR_FSTAT;.
1ec30 20 20 7d 0a 20 20 2a 70 53 69 7a 65 20 3d 20 62    }.  *pSize = b
1ec40 75 66 2e 73 74 5f 73 69 7a 65 3b 0a 0a 20 20 2f  uf.st_size;..  /
1ec50 2a 20 57 68 65 6e 20 6f 70 65 6e 69 6e 67 20 61  * When opening a
1ec60 20 7a 65 72 6f 2d 73 69 7a 65 20 64 61 74 61 62   zero-size datab
1ec70 61 73 65 2c 20 74 68 65 20 66 69 6e 64 49 6e 6f  ase, the findIno
1ec80 64 65 49 6e 66 6f 28 29 20 70 72 6f 63 65 64 75  deInfo() procedu
1ec90 72 65 0a 20 20 2a 2a 20 77 72 69 74 65 73 20 61  re.  ** writes a
1eca0 20 73 69 6e 67 6c 65 20 62 79 74 65 20 69 6e 74   single byte int
1ecb0 6f 20 74 68 61 74 20 66 69 6c 65 20 69 6e 20 6f  o that file in o
1ecc0 72 64 65 72 20 74 6f 20 77 6f 72 6b 20 61 72 6f  rder to work aro
1ecd0 75 6e 64 20 61 20 62 75 67 0a 20 20 2a 2a 20 69  und a bug.  ** i
1ece0 6e 20 74 68 65 20 4f 53 2d 58 20 6d 73 64 6f 73  n the OS-X msdos
1ecf0 20 66 69 6c 65 73 79 73 74 65 6d 2e 20 20 49 6e   filesystem.  In
1ed00 20 6f 72 64 65 72 20 74 6f 20 61 76 6f 69 64 20   order to avoid 
1ed10 70 72 6f 62 6c 65 6d 73 20 77 69 74 68 20 75 70  problems with up
1ed20 70 65 72 0a 20 20 2a 2a 20 6c 61 79 65 72 73 2c  per.  ** layers,
1ed30 20 77 65 20 6e 65 65 64 20 74 6f 20 72 65 70 6f   we need to repo
1ed40 72 74 20 74 68 69 73 20 66 69 6c 65 20 73 69 7a  rt this file siz
1ed50 65 20 61 73 20 7a 65 72 6f 20 65 76 65 6e 20 74  e as zero even t
1ed60 68 6f 75 67 68 20 69 74 20 69 73 0a 20 20 2a 2a  hough it is.  **
1ed70 20 72 65 61 6c 6c 79 20 31 2e 20 20 20 54 69 63   really 1.   Tic
1ed80 6b 65 74 20 23 33 32 36 30 2e 0a 20 20 2a 2f 0a  ket #3260..  */.
1ed90 20 20 69 66 28 20 2a 70 53 69 7a 65 3d 3d 31 20    if( *pSize==1 
1eda0 29 20 2a 70 53 69 7a 65 20 3d 20 30 3b 0a 0a 0a  ) *pSize = 0;...
1edb0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1edc0 4f 4b 3b 0a 7d 0a 0a 23 69 66 20 53 51 4c 49 54  OK;.}..#if SQLIT
1edd0 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47  E_ENABLE_LOCKING
1ede0 5f 53 54 59 4c 45 20 26 26 20 64 65 66 69 6e 65  _STYLE && define
1edf0 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 0a 2f 2a 0a  d(__APPLE__)./*.
1ee00 2a 2a 20 48 61 6e 64 6c 65 72 20 66 6f 72 20 70  ** Handler for p
1ee10 72 6f 78 79 2d 6c 6f 63 6b 69 6e 67 20 66 69 6c  roxy-locking fil
1ee20 65 2d 63 6f 6e 74 72 6f 6c 20 76 65 72 62 73 2e  e-control verbs.
1ee30 20 20 44 65 66 69 6e 65 64 20 62 65 6c 6f 77 20    Defined below 
1ee40 69 6e 20 74 68 65 0a 2a 2a 20 70 72 6f 78 79 69  in the.** proxyi
1ee50 6e 67 20 6c 6f 63 6b 69 6e 67 20 64 69 76 69 73  ng locking divis
1ee60 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ion..*/.static i
1ee70 6e 74 20 70 72 6f 78 79 46 69 6c 65 43 6f 6e 74  nt proxyFileCont
1ee80 72 6f 6c 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  rol(sqlite3_file
1ee90 2a 2c 69 6e 74 2c 76 6f 69 64 2a 29 3b 0a 23 65  *,int,void*);.#e
1eea0 6e 64 69 66 0a 0a 2f 2a 20 0a 2a 2a 20 54 68 69  ndif../* .** Thi
1eeb0 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61  s function is ca
1eec0 6c 6c 65 64 20 74 6f 20 68 61 6e 64 6c 65 20 74  lled to handle t
1eed0 68 65 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f  he SQLITE_FCNTL_
1eee0 53 49 5a 45 5f 48 49 4e 54 20 0a 2a 2a 20 66 69  SIZE_HINT .** fi
1eef0 6c 65 2d 63 6f 6e 74 72 6f 6c 20 6f 70 65 72 61  le-control opera
1ef00 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  tion..**.** If t
1ef10 68 65 20 75 73 65 72 20 68 61 73 20 63 6f 6e 66  he user has conf
1ef20 69 67 75 72 65 64 20 61 20 63 68 75 6e 6b 2d 73  igured a chunk-s
1ef30 69 7a 65 20 66 6f 72 20 74 68 69 73 20 66 69 6c  ize for this fil
1ef40 65 2c 20 69 74 20 63 6f 75 6c 64 20 62 65 0a 2a  e, it could be.*
1ef50 2a 20 74 68 61 74 20 74 68 65 20 66 69 6c 65 20  * that the file 
1ef60 6e 65 65 64 73 20 74 6f 20 62 65 20 65 78 74 65  needs to be exte
1ef70 6e 64 65 64 20 61 74 20 74 68 69 73 20 70 6f 69  nded at this poi
1ef80 6e 74 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 74  nt. Otherwise, t
1ef90 68 65 0a 2a 2a 20 53 51 4c 49 54 45 5f 46 43 4e  he.** SQLITE_FCN
1efa0 54 4c 5f 53 49 5a 45 5f 48 49 4e 54 20 6f 70 65  TL_SIZE_HINT ope
1efb0 72 61 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f  ration is a no-o
1efc0 70 20 66 6f 72 20 55 6e 69 78 2e 0a 2a 2f 0a 73  p for Unix..*/.s
1efd0 74 61 74 69 63 20 69 6e 74 20 66 63 6e 74 6c 53  tatic int fcntlS
1efe0 69 7a 65 48 69 6e 74 28 75 6e 69 78 46 69 6c 65  izeHint(unixFile
1eff0 20 2a 70 46 69 6c 65 2c 20 69 36 34 20 6e 42 79   *pFile, i64 nBy
1f000 74 65 29 7b 0a 20 20 7b 20 2f 2a 20 70 72 65 73  te){.  { /* pres
1f010 65 72 76 65 20 69 6e 64 65 6e 74 61 74 69 6f 6e  erve indentation
1f020 20 6f 66 20 72 65 6d 6f 76 65 64 20 22 69 66 22   of removed "if"
1f030 20 2a 2f 0a 20 20 20 20 69 36 34 20 6e 53 69 7a   */.    i64 nSiz
1f040 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
1f050 20 20 20 20 20 20 2f 2a 20 52 65 71 75 69 72 65        /* Require
1f060 64 20 66 69 6c 65 20 73 69 7a 65 20 2a 2f 0a 20  d file size */. 
1f070 20 20 20 69 36 34 20 73 7a 43 68 75 6e 6b 3b 20     i64 szChunk; 
1f080 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f090 20 2f 2a 20 43 68 75 6e 6b 20 73 69 7a 65 20 2a   /* Chunk size *
1f0a0 2f 0a 20 20 20 20 73 74 72 75 63 74 20 73 74 61  /.    struct sta
1f0b0 74 20 62 75 66 3b 20 20 20 20 20 20 20 20 20 20  t buf;          
1f0c0 20 20 20 20 2f 2a 20 55 73 65 64 20 74 6f 20 68      /* Used to h
1f0d0 6f 6c 64 20 72 65 74 75 72 6e 20 76 61 6c 75 65  old return value
1f0e0 73 20 6f 66 20 66 73 74 61 74 28 29 20 2a 2f 0a  s of fstat() */.
1f0f0 20 20 20 0a 20 20 20 20 69 66 28 20 6f 73 46 73     .    if( osFs
1f100 74 61 74 28 70 46 69 6c 65 2d 3e 68 2c 20 26 62  tat(pFile->h, &b
1f110 75 66 29 20 29 20 72 65 74 75 72 6e 20 53 51 4c  uf) ) return SQL
1f120 49 54 45 5f 49 4f 45 52 52 5f 46 53 54 41 54 3b  ITE_IOERR_FSTAT;
1f130 0a 0a 20 20 20 20 73 7a 43 68 75 6e 6b 20 3d 20  ..    szChunk = 
1f140 70 46 69 6c 65 2d 3e 73 7a 43 68 75 6e 6b 3b 0a  pFile->szChunk;.
1f150 20 20 20 20 69 66 28 20 73 7a 43 68 75 6e 6b 3d      if( szChunk=
1f160 3d 30 20 29 7b 0a 20 20 20 20 20 20 6e 53 69 7a  =0 ){.      nSiz
1f170 65 20 3d 20 6e 42 79 74 65 3b 0a 20 20 20 20 7d  e = nByte;.    }
1f180 65 6c 73 65 7b 0a 20 20 20 20 20 20 6e 53 69 7a  else{.      nSiz
1f190 65 20 3d 20 28 28 6e 42 79 74 65 2b 73 7a 43 68  e = ((nByte+szCh
1f1a0 75 6e 6b 2d 31 29 20 2f 20 73 7a 43 68 75 6e 6b  unk-1) / szChunk
1f1b0 29 20 2a 20 73 7a 43 68 75 6e 6b 3b 0a 20 20 20  ) * szChunk;.   
1f1c0 20 7d 0a 20 20 20 20 69 66 28 20 6e 53 69 7a 65   }.    if( nSize
1f1d0 3e 28 69 36 34 29 62 75 66 2e 73 74 5f 73 69 7a  >(i64)buf.st_siz
1f1e0 65 20 29 7b 0a 0a 23 69 66 20 64 65 66 69 6e 65  e ){..#if define
1f1f0 64 28 48 41 56 45 5f 50 4f 53 49 58 5f 46 41 4c  d(HAVE_POSIX_FAL
1f200 4c 4f 43 41 54 45 29 20 26 26 20 48 41 56 45 5f  LOCATE) && HAVE_
1f210 50 4f 53 49 58 5f 46 41 4c 4c 4f 43 41 54 45 0a  POSIX_FALLOCATE.
1f220 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 64        /* The cod
1f230 65 20 62 65 6c 6f 77 20 69 73 20 68 61 6e 64 6c  e below is handl
1f240 69 6e 67 20 74 68 65 20 72 65 74 75 72 6e 20 76  ing the return v
1f250 61 6c 75 65 20 6f 66 20 6f 73 46 61 6c 6c 6f 63  alue of osFalloc
1f260 61 74 65 28 29 20 0a 20 20 20 20 20 20 2a 2a 20  ate() .      ** 
1f270 63 6f 72 72 65 63 74 6c 79 2e 20 70 6f 73 69 78  correctly. posix
1f280 5f 66 61 6c 6c 6f 63 61 74 65 28 29 20 69 73 20  _fallocate() is 
1f290 64 65 66 69 6e 65 64 20 74 6f 20 22 72 65 74 75  defined to "retu
1f2a0 72 6e 73 20 7a 65 72 6f 20 6f 6e 20 73 75 63 63  rns zero on succ
1f2b0 65 73 73 2c 20 0a 20 20 20 20 20 20 2a 2a 20 6f  ess, .      ** o
1f2c0 72 20 61 6e 20 65 72 72 6f 72 20 6e 75 6d 62 65  r an error numbe
1f2d0 72 20 6f 6e 20 20 66 61 69 6c 75 72 65 22 2e 20  r on  failure". 
1f2e0 53 65 65 20 74 68 65 20 6d 61 6e 70 61 67 65 20  See the manpage 
1f2f0 66 6f 72 20 64 65 74 61 69 6c 73 2e 20 2a 2f 0a  for details. */.
1f300 20 20 20 20 20 20 69 6e 74 20 65 72 72 3b 0a 20        int err;. 
1f310 20 20 20 20 20 64 6f 7b 0a 20 20 20 20 20 20 20       do{.       
1f320 20 65 72 72 20 3d 20 6f 73 46 61 6c 6c 6f 63 61   err = osFalloca
1f330 74 65 28 70 46 69 6c 65 2d 3e 68 2c 20 62 75 66  te(pFile->h, buf
1f340 2e 73 74 5f 73 69 7a 65 2c 20 6e 53 69 7a 65 2d  .st_size, nSize-
1f350 62 75 66 2e 73 74 5f 73 69 7a 65 29 3b 0a 20 20  buf.st_size);.  
1f360 20 20 20 20 7d 77 68 69 6c 65 28 20 65 72 72 3d      }while( err=
1f370 3d 45 49 4e 54 52 20 29 3b 0a 20 20 20 20 20 20  =EINTR );.      
1f380 69 66 28 20 65 72 72 20 29 20 72 65 74 75 72 6e  if( err ) return
1f390 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 57 52   SQLITE_IOERR_WR
1f3a0 49 54 45 3b 0a 23 65 6c 73 65 0a 20 20 20 20 20  ITE;.#else.     
1f3b0 20 2f 2a 20 49 66 20 74 68 65 20 4f 53 20 64 6f   /* If the OS do
1f3c0 65 73 20 6e 6f 74 20 68 61 76 65 20 70 6f 73 69  es not have posi
1f3d0 78 5f 66 61 6c 6c 6f 63 61 74 65 28 29 2c 20 66  x_fallocate(), f
1f3e0 61 6b 65 20 69 74 2e 20 46 69 72 73 74 20 75 73  ake it. First us
1f3f0 65 0a 20 20 20 20 20 20 2a 2a 20 66 74 72 75 6e  e.      ** ftrun
1f400 63 61 74 65 28 29 20 74 6f 20 73 65 74 20 74 68  cate() to set th
1f410 65 20 66 69 6c 65 20 73 69 7a 65 2c 20 74 68 65  e file size, the
1f420 6e 20 77 72 69 74 65 20 61 20 73 69 6e 67 6c 65  n write a single
1f430 20 62 79 74 65 20 74 6f 0a 20 20 20 20 20 20 2a   byte to.      *
1f440 2a 20 74 68 65 20 6c 61 73 74 20 62 79 74 65 20  * the last byte 
1f450 69 6e 20 65 61 63 68 20 62 6c 6f 63 6b 20 77 69  in each block wi
1f460 74 68 69 6e 20 74 68 65 20 65 78 74 65 6e 64 65  thin the extende
1f470 64 20 72 65 67 69 6f 6e 2e 20 54 68 69 73 0a 20  d region. This. 
1f480 20 20 20 20 20 2a 2a 20 69 73 20 74 68 65 20 73       ** is the s
1f490 61 6d 65 20 74 65 63 68 6e 69 71 75 65 20 75 73  ame technique us
1f4a0 65 64 20 62 79 20 67 6c 69 62 63 20 74 6f 20 69  ed by glibc to i
1f4b0 6d 70 6c 65 6d 65 6e 74 20 70 6f 73 69 78 5f 66  mplement posix_f
1f4c0 61 6c 6c 6f 63 61 74 65 28 29 0a 20 20 20 20 20  allocate().     
1f4d0 20 2a 2a 20 6f 6e 20 73 79 73 74 65 6d 73 20 74   ** on systems t
1f4e0 68 61 74 20 64 6f 20 6e 6f 74 20 68 61 76 65 20  hat do not have 
1f4f0 61 20 72 65 61 6c 20 66 61 6c 6c 6f 63 61 74 65  a real fallocate
1f500 28 29 20 73 79 73 74 65 6d 20 63 61 6c 6c 2e 0a  () system call..
1f510 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69        */.      i
1f520 6e 74 20 6e 42 6c 6b 20 3d 20 62 75 66 2e 73 74  nt nBlk = buf.st
1f530 5f 62 6c 6b 73 69 7a 65 3b 20 20 2f 2a 20 46 69  _blksize;  /* Fi
1f540 6c 65 2d 73 79 73 74 65 6d 20 62 6c 6f 63 6b 20  le-system block 
1f550 73 69 7a 65 20 2a 2f 0a 20 20 20 20 20 20 69 36  size */.      i6
1f560 34 20 69 57 72 69 74 65 3b 20 20 20 20 20 20 20  4 iWrite;       
1f570 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 78            /* Nex
1f580 74 20 6f 66 66 73 65 74 20 74 6f 20 77 72 69 74  t offset to writ
1f590 65 20 74 6f 20 2a 2f 0a 0a 20 20 20 20 20 20 69  e to */..      i
1f5a0 66 28 20 72 6f 62 75 73 74 5f 66 74 72 75 6e 63  f( robust_ftrunc
1f5b0 61 74 65 28 70 46 69 6c 65 2d 3e 68 2c 20 6e 53  ate(pFile->h, nS
1f5c0 69 7a 65 29 20 29 7b 0a 20 20 20 20 20 20 20 20  ize) ){.        
1f5d0 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f  pFile->lastErrno
1f5e0 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20   = errno;.      
1f5f0 20 20 72 65 74 75 72 6e 20 75 6e 69 78 4c 6f 67    return unixLog
1f600 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45  Error(SQLITE_IOE
1f610 52 52 5f 54 52 55 4e 43 41 54 45 2c 20 22 66 74  RR_TRUNCATE, "ft
1f620 72 75 6e 63 61 74 65 22 2c 20 70 46 69 6c 65 2d  runcate", pFile-
1f630 3e 7a 50 61 74 68 29 3b 0a 20 20 20 20 20 20 7d  >zPath);.      }
1f640 0a 20 20 20 20 20 20 69 57 72 69 74 65 20 3d 20  .      iWrite = 
1f650 28 28 62 75 66 2e 73 74 5f 73 69 7a 65 20 2b 20  ((buf.st_size + 
1f660 32 2a 6e 42 6c 6b 20 2d 20 31 29 2f 6e 42 6c 6b  2*nBlk - 1)/nBlk
1f670 29 2a 6e 42 6c 6b 2d 31 3b 0a 20 20 20 20 20 20  )*nBlk-1;.      
1f680 77 68 69 6c 65 28 20 69 57 72 69 74 65 3c 6e 53  while( iWrite<nS
1f690 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20 20 69  ize ){.        i
1f6a0 6e 74 20 6e 57 72 69 74 65 20 3d 20 73 65 65 6b  nt nWrite = seek
1f6b0 41 6e 64 57 72 69 74 65 28 70 46 69 6c 65 2c 20  AndWrite(pFile, 
1f6c0 69 57 72 69 74 65 2c 20 22 22 2c 20 31 29 3b 0a  iWrite, "", 1);.
1f6d0 20 20 20 20 20 20 20 20 69 66 28 20 6e 57 72 69          if( nWri
1f6e0 74 65 21 3d 31 20 29 20 72 65 74 75 72 6e 20 53  te!=1 ) return S
1f6f0 51 4c 49 54 45 5f 49 4f 45 52 52 5f 57 52 49 54  QLITE_IOERR_WRIT
1f700 45 3b 0a 20 20 20 20 20 20 20 20 69 57 72 69 74  E;.        iWrit
1f710 65 20 2b 3d 20 6e 42 6c 6b 3b 0a 20 20 20 20 20  e += nBlk;.     
1f720 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a   }.#endif.    }.
1f730 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 53 51    }..  return SQ
1f740 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 20  LITE_OK;.}..#if 
1f750 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41  (SQLITE_ENABLE_A
1f760 50 50 4c 45 5f 53 50 49 3e 30 29 20 26 26 20 64  PPLE_SPI>0) && d
1f770 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f  efined(__APPLE__
1f780 29 0a 23 69 6e 63 6c 75 64 65 20 22 73 71 6c 69  ).#include "sqli
1f790 74 65 33 5f 70 72 69 76 61 74 65 2e 68 22 0a 23  te3_private.h".#
1f7a0 69 6e 63 6c 75 64 65 20 3c 63 6f 70 79 66 69 6c  include <copyfil
1f7b0 65 2e 68 3e 0a 73 74 61 74 69 63 20 69 6e 74 20  e.h>.static int 
1f7c0 67 65 74 44 62 50 61 74 68 46 6f 72 55 6e 69 78  getDbPathForUnix
1f7d0 46 69 6c 65 28 75 6e 69 78 46 69 6c 65 20 2a 70  File(unixFile *p
1f7e0 46 69 6c 65 2c 20 63 68 61 72 20 2a 64 62 50 61  File, char *dbPa
1f7f0 74 68 29 3b 0a 23 65 6e 64 69 66 0a 73 74 61 74  th);.#endif.stat
1f800 69 63 20 69 6e 74 20 69 73 50 72 6f 78 79 4c 6f  ic int isProxyLo
1f810 63 6b 69 6e 67 4d 6f 64 65 28 75 6e 69 78 46 69  ckingMode(unixFi
1f820 6c 65 20 2a 29 3b 0a 0a 2f 2a 0a 2a 2a 20 49 6e  le *);../*.** In
1f830 66 6f 72 6d 61 74 69 6f 6e 20 61 6e 64 20 63 6f  formation and co
1f840 6e 74 72 6f 6c 20 6f 66 20 61 6e 20 6f 70 65 6e  ntrol of an open
1f850 20 66 69 6c 65 20 68 61 6e 64 6c 65 2e 0a 2a 2f   file handle..*/
1f860 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78  .static int unix
1f870 46 69 6c 65 43 6f 6e 74 72 6f 6c 28 73 71 6c 69  FileControl(sqli
1f880 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e  te3_file *id, in
1f890 74 20 6f 70 2c 20 76 6f 69 64 20 2a 70 41 72 67  t op, void *pArg
1f8a0 29 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70  ){.  unixFile *p
1f8b0 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65  File = (unixFile
1f8c0 2a 29 69 64 3b 0a 20 20 73 77 69 74 63 68 28 20  *)id;.  switch( 
1f8d0 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20 53  op ){.    case S
1f8e0 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 4c 4f 43 4b  QLITE_FCNTL_LOCK
1f8f0 53 54 41 54 45 3a 20 7b 0a 20 20 20 20 20 20 2a  STATE: {.      *
1f900 28 69 6e 74 2a 29 70 41 72 67 20 3d 20 70 46 69  (int*)pArg = pFi
1f910 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3b 0a 20  le->eFileLock;. 
1f920 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
1f930 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20  TE_OK;.    }.   
1f940 20 63 61 73 65 20 53 51 4c 49 54 45 5f 4c 41 53   case SQLITE_LAS
1f950 54 5f 45 52 52 4e 4f 3a 20 7b 0a 20 20 20 20 20  T_ERRNO: {.     
1f960 20 2a 28 69 6e 74 2a 29 70 41 72 67 20 3d 20 70   *(int*)pArg = p
1f970 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 3b  File->lastErrno;
1f980 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
1f990 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20  LITE_OK;.    }. 
1f9a0 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46     case SQLITE_F
1f9b0 43 4e 54 4c 5f 43 48 55 4e 4b 5f 53 49 5a 45 3a  CNTL_CHUNK_SIZE:
1f9c0 20 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e   {.      pFile->
1f9d0 73 7a 43 68 75 6e 6b 20 3d 20 2a 28 69 6e 74 20  szChunk = *(int 
1f9e0 2a 29 70 41 72 67 3b 0a 20 20 20 20 20 20 72 65  *)pArg;.      re
1f9f0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
1fa00 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53      }.    case S
1fa10 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 53 49 5a 45  QLITE_FCNTL_SIZE
1fa20 5f 48 49 4e 54 3a 20 7b 0a 20 20 20 20 20 20 69  _HINT: {.      i
1fa30 6e 74 20 72 63 3b 0a 20 20 20 20 20 20 53 69 6d  nt rc;.      Sim
1fa40 75 6c 61 74 65 49 4f 45 72 72 6f 72 42 65 6e 69  ulateIOErrorBeni
1fa50 67 6e 28 31 29 3b 0a 20 20 20 20 20 20 72 63 20  gn(1);.      rc 
1fa60 3d 20 66 63 6e 74 6c 53 69 7a 65 48 69 6e 74 28  = fcntlSizeHint(
1fa70 70 46 69 6c 65 2c 20 2a 28 69 36 34 20 2a 29 70  pFile, *(i64 *)p
1fa80 41 72 67 29 3b 0a 20 20 20 20 20 20 53 69 6d 75  Arg);.      Simu
1fa90 6c 61 74 65 49 4f 45 72 72 6f 72 42 65 6e 69 67  lateIOErrorBenig
1faa0 6e 28 30 29 3b 0a 20 20 20 20 20 20 72 65 74 75  n(0);.      retu
1fab0 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20  rn rc;.    }.   
1fac0 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46 43 4e   case SQLITE_FCN
1fad0 54 4c 5f 50 45 52 53 49 53 54 5f 57 41 4c 3a 20  TL_PERSIST_WAL: 
1fae0 7b 0a 20 20 20 20 20 20 69 6e 74 20 62 50 65 72  {.      int bPer
1faf0 73 69 73 74 20 3d 20 2a 28 69 6e 74 2a 29 70 41  sist = *(int*)pA
1fb00 72 67 3b 0a 20 20 20 20 20 20 69 66 28 20 62 50  rg;.      if( bP
1fb10 65 72 73 69 73 74 3c 30 20 29 7b 0a 20 20 20 20  ersist<0 ){.    
1fb20 20 20 20 20 2a 28 69 6e 74 2a 29 70 41 72 67 20      *(int*)pArg 
1fb30 3d 20 28 70 46 69 6c 65 2d 3e 63 74 72 6c 46 6c  = (pFile->ctrlFl
1fb40 61 67 73 20 26 20 55 4e 49 58 46 49 4c 45 5f 50  ags & UNIXFILE_P
1fb50 45 52 53 49 53 54 5f 57 41 4c 29 21 3d 30 3b 0a  ERSIST_WAL)!=0;.
1fb60 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
1fb70 62 50 65 72 73 69 73 74 3d 3d 30 20 29 7b 0a 20  bPersist==0 ){. 
1fb80 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 63 74         pFile->ct
1fb90 72 6c 46 6c 61 67 73 20 26 3d 20 7e 55 4e 49 58  rlFlags &= ~UNIX
1fba0 46 49 4c 45 5f 50 45 52 53 49 53 54 5f 57 41 4c  FILE_PERSIST_WAL
1fbb0 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
1fbc0 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 63 74         pFile->ct
1fbd0 72 6c 46 6c 61 67 73 20 7c 3d 20 55 4e 49 58 46  rlFlags |= UNIXF
1fbe0 49 4c 45 5f 50 45 52 53 49 53 54 5f 57 41 4c 3b  ILE_PERSIST_WAL;
1fbf0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72  .      }.      r
1fc00 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
1fc10 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 4e  .    }.#ifndef N
1fc20 44 45 42 55 47 0a 20 20 20 20 2f 2a 20 54 68 65  DEBUG.    /* The
1fc30 20 70 61 67 65 72 20 63 61 6c 6c 73 20 74 68 69   pager calls thi
1fc40 73 20 6d 65 74 68 6f 64 20 74 6f 20 73 69 67 6e  s method to sign
1fc50 61 6c 20 74 68 61 74 20 69 74 20 68 61 73 20 64  al that it has d
1fc60 6f 6e 65 0a 20 20 20 20 2a 2a 20 61 20 72 6f 6c  one.    ** a rol
1fc70 6c 62 61 63 6b 20 61 6e 64 20 74 68 61 74 20 74  lback and that t
1fc80 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20 74  he database is t
1fc90 68 65 72 65 66 6f 72 65 20 75 6e 63 68 61 6e 67  herefore unchang
1fca0 65 64 20 61 6e 64 0a 20 20 20 20 2a 2a 20 69 74  ed and.    ** it
1fcb0 20 68 65 6e 63 65 20 69 74 20 69 73 20 4f 4b 20   hence it is OK 
1fcc0 66 6f 72 20 74 68 65 20 74 72 61 6e 73 61 63 74  for the transact
1fcd0 69 6f 6e 20 63 68 61 6e 67 65 20 63 6f 75 6e 74  ion change count
1fce0 65 72 20 74 6f 20 62 65 0a 20 20 20 20 2a 2a 20  er to be.    ** 
1fcf0 75 6e 63 68 61 6e 67 65 64 2e 0a 20 20 20 20 2a  unchanged..    *
1fd00 2f 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  /.    case SQLIT
1fd10 45 5f 46 43 4e 54 4c 5f 44 42 5f 55 4e 43 48 41  E_FCNTL_DB_UNCHA
1fd20 4e 47 45 44 3a 20 7b 0a 20 20 20 20 20 20 28 28  NGED: {.      ((
1fd30 75 6e 69 78 46 69 6c 65 2a 29 69 64 29 2d 3e 64  unixFile*)id)->d
1fd40 62 55 70 64 61 74 65 20 3d 20 30 3b 0a 20 20 20  bUpdate = 0;.   
1fd50 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
1fd60 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  _OK;.    }.#endi
1fd70 66 0a 23 69 66 20 53 51 4c 49 54 45 5f 45 4e 41  f.#if SQLITE_ENA
1fd80 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c  BLE_LOCKING_STYL
1fd90 45 20 26 26 20 64 65 66 69 6e 65 64 28 5f 5f 41  E && defined(__A
1fda0 50 50 4c 45 5f 5f 29 0a 20 20 20 20 63 61 73 65  PPLE__).    case
1fdb0 20 53 51 4c 49 54 45 5f 53 45 54 5f 4c 4f 43 4b   SQLITE_SET_LOCK
1fdc0 50 52 4f 58 59 46 49 4c 45 3a 0a 20 20 20 20 63  PROXYFILE:.    c
1fdd0 61 73 65 20 53 51 4c 49 54 45 5f 47 45 54 5f 4c  ase SQLITE_GET_L
1fde0 4f 43 4b 50 52 4f 58 59 46 49 4c 45 3a 20 7b 0a  OCKPROXYFILE: {.
1fdf0 20 20 20 20 20 20 72 65 74 75 72 6e 20 70 72 6f        return pro
1fe00 78 79 46 69 6c 65 43 6f 6e 74 72 6f 6c 28 69 64  xyFileControl(id
1fe10 2c 6f 70 2c 70 41 72 67 29 3b 0a 20 20 20 20 7d  ,op,pArg);.    }
1fe20 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
1fe30 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47  E_ENABLE_LOCKING
1fe40 5f 53 54 59 4c 45 20 26 26 20 64 65 66 69 6e 65  _STYLE && define
1fe50 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 2a 2f 0a  d(__APPLE__) */.
1fe60 23 69 66 20 28 53 51 4c 49 54 45 5f 45 4e 41 42  #if (SQLITE_ENAB
1fe70 4c 45 5f 41 50 50 4c 45 5f 53 50 49 3e 30 29 20  LE_APPLE_SPI>0) 
1fe80 26 26 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50  && defined(__APP
1fe90 4c 45 5f 5f 29 0a 20 20 20 20 63 61 73 65 20 53  LE__).    case S
1fea0 51 4c 49 54 45 5f 54 52 55 4e 43 41 54 45 5f 44  QLITE_TRUNCATE_D
1feb0 41 54 41 42 41 53 45 3a 20 7b 0a 20 20 20 20 20  ATABASE: {.     
1fec0 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65   unixFile *pFile
1fed0 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64   = (unixFile*)id
1fee0 3b 0a 20 20 20 20 20 20 69 6e 74 20 72 63 20 3d  ;.      int rc =
1fef0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
1ff00 20 20 76 6f 69 64 20 2a 70 4c 6f 63 6b 20 3d 20    void *pLock = 
1ff10 4e 55 4c 4c 3b 0a 20 20 20 20 20 20 69 6e 74 20  NULL;.      int 
1ff20 66 6c 61 67 73 20 3d 20 30 3b 0a 20 20 20 20 20  flags = 0;.     
1ff30 20 69 6e 74 20 63 6f 72 72 75 70 74 46 69 6c 65   int corruptFile
1ff40 4c 6f 63 6b 20 3d 20 30 3b 0a 20 20 20 20 20 20  Lock = 0;.      
1ff50 69 6e 74 20 69 73 43 6f 72 72 75 70 74 20 3d 20  int isCorrupt = 
1ff60 30 3b 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 45  0;..#if SQLITE_E
1ff70 4e 41 42 4c 45 5f 44 41 54 41 5f 50 52 4f 54 45  NABLE_DATA_PROTE
1ff80 43 54 49 4f 4e 0a 20 20 20 20 20 20 66 6c 61 67  CTION.      flag
1ff90 73 20 7c 3d 20 70 46 69 6c 65 2d 3e 70 72 6f 74  s |= pFile->prot
1ffa0 46 6c 61 67 73 3b 0a 23 65 6e 64 69 66 0a 23 69  Flags;.#endif.#i
1ffb0 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
1ffc0 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 20 20  LOCKING_STYLE.  
1ffd0 20 20 20 20 69 66 28 20 69 73 50 72 6f 78 79 4c      if( isProxyL
1ffe0 6f 63 6b 69 6e 67 4d 6f 64 65 28 70 46 69 6c 65  ockingMode(pFile
1fff0 29 20 29 7b 0a 20 20 20 20 20 20 20 20 66 6c 61  ) ){.        fla
20000 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f 4f 50 45  gs |= SQLITE_OPE
20010 4e 5f 41 55 54 4f 50 52 4f 58 59 3b 0a 20 20 20  N_AUTOPROXY;.   
20020 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
20030 20 20 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71    .      rc = sq
20040 6c 69 74 65 33 64 65 6d 6f 5f 73 75 70 65 72 6c  lite3demo_superl
20050 6f 63 6b 28 70 46 69 6c 65 2d 3e 7a 50 61 74 68  ock(pFile->zPath
20060 2c 20 30 2c 20 66 6c 61 67 73 2c 20 30 2c 20 30  , 0, flags, 0, 0
20070 2c 20 26 70 4c 6f 63 6b 29 3b 0a 20 20 20 20 20  , &pLock);.     
20080 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20   if( rc ){.     
20090 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
200a0 45 5f 43 4f 52 52 55 50 54 20 7c 7c 20 72 63 3d  E_CORRUPT || rc=
200b0 3d 53 51 4c 49 54 45 5f 4e 4f 54 41 44 42 20 29  =SQLITE_NOTADB )
200c0 7b 0a 20 20 20 20 20 20 20 20 20 20 69 73 43 6f  {.          isCo
200d0 72 72 75 70 74 20 3d 20 31 3b 0a 20 20 20 20 20  rrupt = 1;.     
200e0 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
200f0 33 64 65 6d 6f 5f 73 75 70 65 72 6c 6f 63 6b 5f  3demo_superlock_
20100 63 6f 72 72 75 70 74 28 69 64 2c 20 53 51 4c 49  corrupt(id, SQLI
20110 54 45 5f 4c 4f 43 4b 5f 45 58 43 4c 55 53 49 56  TE_LOCK_EXCLUSIV
20120 45 2c 20 26 63 6f 72 72 75 70 74 46 69 6c 65 4c  E, &corruptFileL
20130 6f 63 6b 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  ock);.        }.
20140 20 20 20 20 20 20 20 20 69 66 28 20 72 63 20 29          if( rc )
20150 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75  {.          retu
20160 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d  rn rc;.        }
20170 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72  .      }.      r
20180 63 20 3d 20 70 46 69 6c 65 2d 3e 70 4d 65 74 68  c = pFile->pMeth
20190 6f 64 2d 3e 78 54 72 75 6e 63 61 74 65 28 69 64  od->xTruncate(id
201a0 2c 20 28 28 70 46 69 6c 65 2d 3e 66 73 46 6c 61  , ((pFile->fsFla
201b0 67 73 20 26 20 53 51 4c 49 54 45 5f 46 53 46 4c  gs & SQLITE_FSFL
201c0 41 47 53 5f 49 53 5f 4d 53 44 4f 53 29 20 21 3d  AGS_IS_MSDOS) !=
201d0 20 30 29 20 3f 20 31 4c 20 3a 20 30 4c 29 3b 0a   0) ? 1L : 0L);.
201e0 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53  .      if( rc==S
201f0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
20200 20 20 20 20 63 68 61 72 20 6a 50 61 74 68 5b 4d      char jPath[M
20210 41 58 50 41 54 48 4c 45 4e 2b 39 5d 3b 0a 20 20  AXPATHLEN+9];.  
20220 20 20 20 20 20 20 69 6e 74 20 7a 4c 65 6e 20 3d        int zLen =
20230 20 73 74 72 6c 63 70 79 28 6a 50 61 74 68 2c 20   strlcpy(jPath, 
20240 70 46 69 6c 65 2d 3e 7a 50 61 74 68 2c 20 4d 41  pFile->zPath, MA
20250 58 50 41 54 48 4c 45 4e 2b 39 29 3b 0a 20 20 20  XPATHLEN+9);.   
20260 20 20 20 20 20 69 66 28 20 7a 4c 65 6e 3c 4d 41       if( zLen<MA
20270 58 50 41 54 48 4c 45 4e 20 29 7b 0a 20 20 20 20  XPATHLEN ){.    
20280 20 20 20 20 20 20 73 69 7a 65 5f 74 20 6a 4c 65        size_t jLe
20290 6e 3b 0a 20 20 20 20 20 20 20 20 20 20 63 6f 6e  n;.          con
202a0 73 74 20 63 68 61 72 20 65 78 74 65 6e 73 69 6f  st char extensio
202b0 6e 73 5b 32 5d 5b 39 5d 20 3d 20 7b 20 22 2d 77  ns[2][9] = { "-w
202c0 61 6c 22 2c 20 22 2d 6a 6f 75 72 6e 61 6c 22 20  al", "-journal" 
202d0 2f 2a 2c 20 22 2d 73 68 6d 22 20 2a 2f 20 7d 3b  /*, "-shm" */ };
202e0 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 6a  .          int j
202f0 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20   = 0;.          
20300 66 6f 72 28 20 6a 3d 30 3b 20 6a 3c 32 3b 20 6a  for( j=0; j<2; j
20310 2b 2b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ++ ){.          
20320 20 20 6a 4c 65 6e 20 3d 20 73 74 72 6c 63 70 79    jLen = strlcpy
20330 28 26 6a 50 61 74 68 5b 7a 4c 65 6e 5d 2c 20 65  (&jPath[zLen], e
20340 78 74 65 6e 73 69 6f 6e 73 5b 6a 5d 2c 20 39 29  xtensions[j], 9)
20350 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ;.            if
20360 28 20 6a 4c 65 6e 20 3c 20 39 20 29 7b 0a 20 20  ( jLen < 9 ){.  
20370 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 74 20              int 
20380 6a 66 64 20 3d 20 6f 70 65 6e 28 6a 50 61 74 68  jfd = open(jPath
20390 2c 20 4f 5f 54 52 55 4e 43 29 3b 0a 20 20 20 20  , O_TRUNC);.    
203a0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 6a 66            if( jf
203b0 64 3d 3d 28 2d 31 29 20 29 7b 0a 20 20 20 20 20  d==(-1) ){.     
203c0 20 20 20 20 20 20 20 20 20 20 20 69 66 20 28 20             if ( 
203d0 65 72 72 6e 6f 21 3d 45 4e 4f 45 4e 54 20 29 7b  errno!=ENOENT ){
203e0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
203f0 20 20 20 70 65 72 72 6f 72 28 6a 50 61 74 68 29     perror(jPath)
20400 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
20410 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
20420 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 20    } else {.     
20430 20 20 20 20 20 20 20 20 20 20 20 66 73 79 6e 63             fsync
20440 28 6a 66 64 29 3b 0a 20 20 20 20 20 20 20 20 20  (jfd);.         
20450 20 20 20 20 20 20 20 63 6c 6f 73 65 28 6a 66 64         close(jfd
20460 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
20470 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d   }.            }
20480 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
20490 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70       }.        p
204a0 46 69 6c 65 2d 3e 70 4d 65 74 68 6f 64 2d 3e 78  File->pMethod->x
204b0 53 79 6e 63 28 69 64 2c 20 53 51 4c 49 54 45 5f  Sync(id, SQLITE_
204c0 53 59 4e 43 5f 46 55 4c 4c 29 3b 0a 20 20 20 20  SYNC_FULL);.    
204d0 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 69 73    }.      if( is
204e0 43 6f 72 72 75 70 74 20 29 7b 0a 20 20 20 20 20  Corrupt ){.     
204f0 20 20 20 73 71 6c 69 74 65 33 64 65 6d 6f 5f 73     sqlite3demo_s
20500 75 70 65 72 75 6e 6c 6f 63 6b 5f 63 6f 72 72 75  uperunlock_corru
20510 70 74 28 69 64 2c 20 63 6f 72 72 75 70 74 46 69  pt(id, corruptFi
20520 6c 65 4c 6f 63 6b 29 3b 0a 20 20 20 20 20 20 7d  leLock);.      }
20530 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71  else{.        sq
20540 6c 69 74 65 33 64 65 6d 6f 5f 73 75 70 65 72 75  lite3demo_superu
20550 6e 6c 6f 63 6b 28 70 4c 6f 63 6b 29 3b 0a 20 20  nlock(pLock);.  
20560 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65 74 75      }.      retu
20570 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20  rn rc;.    }.   
20580 20 20 20 0a 20 20 20 20 63 61 73 65 20 53 51 4c     .    case SQL
20590 49 54 45 5f 52 45 50 4c 41 43 45 5f 44 41 54 41  ITE_REPLACE_DATA
205a0 42 41 53 45 3a 20 7b 0a 20 20 20 20 20 20 75 6e  BASE: {.      un
205b0 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20  ixFile *pFile = 
205c0 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20  (unixFile*)id;. 
205d0 20 20 20 20 20 73 71 6c 69 74 65 33 20 2a 73 72       sqlite3 *sr
205e0 63 64 62 20 3d 20 28 73 71 6c 69 74 65 33 20 2a  cdb = (sqlite3 *
205f0 29 70 41 72 67 3b 0a 20 20 20 20 20 20 42 74 72  )pArg;.      Btr
20600 65 65 20 2a 70 53 72 63 42 74 72 65 65 20 3d 20  ee *pSrcBtree = 
20610 4e 55 4c 4c 3b 0a 20 20 20 20 20 20 73 71 6c 69  NULL;.      sqli
20620 74 65 33 5f 66 69 6c 65 20 2a 73 72 63 5f 66 69  te3_file *src_fi
20630 6c 65 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 20  le = NULL;.     
20640 20 75 6e 69 78 46 69 6c 65 20 2a 70 53 72 63 46   unixFile *pSrcF
20650 69 6c 65 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20  ile = NULL;.    
20660 20 20 63 68 61 72 20 73 72 63 57 61 6c 50 61 74    char srcWalPat
20670 68 5b 4d 41 58 50 41 54 48 4c 45 4e 2b 35 5d 3b  h[MAXPATHLEN+5];
20680 0a 20 20 20 20 20 20 69 6e 74 20 73 72 63 57 61  .      int srcWa
20690 6c 46 44 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20  lFD = -1;.      
206a0 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
206b0 4f 4b 3b 0a 20 20 20 20 20 20 76 6f 69 64 20 2a  OK;.      void *
206c0 70 4c 6f 63 6b 20 3d 20 4e 55 4c 4c 3b 0a 20 20  pLock = NULL;.  
206d0 20 20 20 20 69 6e 74 20 66 6c 61 67 73 20 3d 20      int flags = 
206e0 30 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  0;.      sqlite3
206f0 20 2a 73 72 63 64 62 32 20 3d 20 4e 55 4c 4c 3b   *srcdb2 = NULL;
20700 0a 20 20 20 20 20 20 63 6f 70 79 66 69 6c 65 5f  .      copyfile_
20710 73 74 61 74 65 5f 74 20 73 3b 0a 20 20 20 20 20  state_t s;.     
20720 20 69 6e 74 20 63 6f 72 72 75 70 74 53 72 63 46   int corruptSrcF
20730 69 6c 65 4c 6f 63 6b 20 3d 20 30 3b 0a 20 20 20  ileLock = 0;.   
20740 20 20 20 69 6e 74 20 63 6f 72 72 75 70 74 44 73     int corruptDs
20750 74 46 69 6c 65 4c 6f 63 6b 20 3d 20 30 3b 0a 20  tFileLock = 0;. 
20760 20 20 20 20 20 69 6e 74 20 69 73 53 72 63 43 6f       int isSrcCo
20770 72 72 75 70 74 20 3d 20 30 3b 0a 20 20 20 20 20  rrupt = 0;.     
20780 20 69 6e 74 20 69 73 44 73 74 43 6f 72 72 75 70   int isDstCorrup
20790 74 20 3d 20 30 3b 0a 0a 20 20 20 20 20 20 69 66  t = 0;..      if
207a0 28 20 21 73 71 6c 69 74 65 33 53 61 66 65 74 79  ( !sqlite3Safety
207b0 43 68 65 63 6b 4f 6b 28 73 72 63 64 62 29 20 29  CheckOk(srcdb) )
207c0 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  {.        return
207d0 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 3b 0a   SQLITE_MISUSE;.
207e0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 0a 23        }.      .#
207f0 69 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  if SQLITE_ENABLE
20800 5f 44 41 54 41 5f 50 52 4f 54 45 43 54 49 4f 4e  _DATA_PROTECTION
20810 0a 20 20 20 20 20 20 66 6c 61 67 73 20 7c 3d 20  .      flags |= 
20820 70 46 69 6c 65 2d 3e 70 72 6f 74 46 6c 61 67 73  pFile->protFlags
20830 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 53 51 4c  ;.#endif.#if SQL
20840 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49  ITE_ENABLE_LOCKI
20850 4e 47 5f 53 54 59 4c 45 0a 20 20 20 20 20 20 69  NG_STYLE.      i
20860 66 28 20 69 73 50 72 6f 78 79 4c 6f 63 6b 69 6e  f( isProxyLockin
20870 67 4d 6f 64 65 28 70 46 69 6c 65 29 20 29 7b 0a  gMode(pFile) ){.
20880 20 20 20 20 20 20 20 20 66 6c 61 67 73 20 7c 3d          flags |=
20890 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 41 55 54   SQLITE_OPEN_AUT
208a0 4f 50 52 4f 58 59 3b 0a 20 20 20 20 20 20 7d 0a  OPROXY;.      }.
208b0 23 65 6e 64 69 66 0a 20 20 20 20 20 20 0a 20 20  #endif.      .  
208c0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
208d0 64 65 6d 6f 5f 73 75 70 65 72 6c 6f 63 6b 28 70  demo_superlock(p
208e0 46 69 6c 65 2d 3e 7a 50 61 74 68 2c 20 30 2c 20  File->zPath, 0, 
208f0 66 6c 61 67 73 2c 20 30 2c 20 30 2c 20 26 70 4c  flags, 0, 0, &pL
20900 6f 63 6b 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ock);.      if( 
20910 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66  rc ){.        if
20920 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 43 4f 52  ( rc==SQLITE_COR
20930 52 55 50 54 20 7c 7c 20 72 63 3d 3d 53 51 4c 49  RUPT || rc==SQLI
20940 54 45 5f 4e 4f 54 41 44 42 20 29 7b 0a 20 20 20  TE_NOTADB ){.   
20950 20 20 20 20 20 20 20 69 73 44 73 74 43 6f 72 72         isDstCorr
20960 75 70 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  upt = 1;.       
20970 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 64     rc = sqlite3d
20980 65 6d 6f 5f 73 75 70 65 72 6c 6f 63 6b 5f 63 6f  emo_superlock_co
20990 72 72 75 70 74 28 69 64 2c 20 53 51 4c 49 54 45  rrupt(id, SQLITE
209a0 5f 4c 4f 43 4b 5f 45 58 43 4c 55 53 49 56 45 2c  _LOCK_EXCLUSIVE,
209b0 20 26 63 6f 72 72 75 70 74 44 73 74 46 69 6c 65   &corruptDstFile
209c0 4c 6f 63 6b 29 3b 0a 20 20 20 20 20 20 20 20 7d  Lock);.        }
209d0 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 20  .        if( rc 
209e0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74  ){.          ret
209f0 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20  urn rc;.        
20a00 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
20a10 2f 2a 20 67 65 74 20 74 68 65 20 73 72 63 20 66  /* get the src f
20a20 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 61  ile descriptor a
20a30 64 68 65 72 69 6e 67 20 74 6f 20 74 68 65 20 64  dhering to the d
20a40 62 20 73 74 72 75 63 74 20 61 63 63 65 73 73 20  b struct access 
20a50 72 75 6c 65 73 20 0a 20 20 20 20 20 20 20 2a 2a  rules .       **
20a60 20 74 68 69 73 20 63 6f 64 65 20 69 73 20 6d 6f   this code is mo
20a70 64 65 6c 65 64 20 61 66 74 65 72 20 73 71 6c 69  deled after sqli
20a80 74 65 33 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c  te3_file_control
20a90 28 29 20 69 6e 20 6d 61 69 6e 2e 63 0a 20 20 20  () in main.c.   
20aa0 20 20 20 20 2a 2f 20 0a 20 20 20 20 20 20 73 71      */ .      sq
20ab0 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65  lite3_mutex_ente
20ac0 72 28 73 72 63 64 62 2d 3e 6d 75 74 65 78 29 3b  r(srcdb->mutex);
20ad0 0a 20 20 20 20 20 20 69 66 28 20 73 72 63 64 62  .      if( srcdb
20ae0 2d 3e 6e 44 62 3e 30 20 29 7b 0a 20 20 20 20 20  ->nDb>0 ){.     
20af0 20 20 20 70 53 72 63 42 74 72 65 65 20 3d 20 73     pSrcBtree = s
20b00 72 63 64 62 2d 3e 61 44 62 5b 30 5d 2e 70 42 74  rcdb->aDb[0].pBt
20b10 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
20b20 69 66 28 20 70 53 72 63 42 74 72 65 65 20 29 7b  if( pSrcBtree ){
20b30 0a 20 20 20 20 20 20 20 20 50 61 67 65 72 20 2a  .        Pager *
20b40 70 53 72 63 50 61 67 65 72 3b 0a 20 20 20 20 20  pSrcPager;.     
20b50 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45     sqlite3BtreeE
20b60 6e 74 65 72 28 70 53 72 63 42 74 72 65 65 29 3b  nter(pSrcBtree);
20b70 0a 20 20 20 20 20 20 20 20 70 53 72 63 50 61 67  .        pSrcPag
20b80 65 72 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  er = sqlite3Btre
20b90 65 50 61 67 65 72 28 70 53 72 63 42 74 72 65 65  ePager(pSrcBtree
20ba0 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  );.        asser
20bb0 74 28 20 70 53 72 63 50 61 67 65 72 21 3d 30 20  t( pSrcPager!=0 
20bc0 29 3b 0a 20 20 20 20 20 20 20 20 73 72 63 5f 66  );.        src_f
20bd0 69 6c 65 20 3d 20 73 71 6c 69 74 65 33 50 61 67  ile = sqlite3Pag
20be0 65 72 46 69 6c 65 28 70 53 72 63 50 61 67 65 72  erFile(pSrcPager
20bf0 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  );.        asser
20c00 74 28 20 73 72 63 5f 66 69 6c 65 21 3d 30 20 29  t( src_file!=0 )
20c10 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 72  ;.        if( sr
20c20 63 5f 66 69 6c 65 2d 3e 70 4d 65 74 68 6f 64 73  c_file->pMethods
20c30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e   ){.          in
20c40 74 20 73 72 63 46 6c 61 67 73 20 3d 20 30 3b 0a  t srcFlags = 0;.
20c50 20 20 20 20 20 20 20 20 20 20 70 53 72 63 46 69            pSrcFi
20c60 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 20 2a  le = (unixFile *
20c70 29 73 72 63 5f 66 69 6c 65 3b 0a 20 20 20 20 20  )src_file;.     
20c80 20 20 20 20 20 2f 2a 20 77 61 6c 20 6d 6f 64 65       /* wal mode
20c90 20 64 62 20 63 61 6e 6e 6f 74 20 62 65 20 6f 70   db cannot be op
20ca0 65 6e 65 64 20 72 65 61 64 6f 6e 6c 79 20 2a 2f  ened readonly */
20cb0 0a 20 20 20 20 20 20 20 20 20 20 69 66 20 28 28  .          if ((
20cc0 70 53 72 63 46 69 6c 65 2d 3e 6f 70 65 6e 46 6c  pSrcFile->openFl
20cd0 61 67 73 20 26 20 4f 5f 52 44 57 52 29 20 3d 3d  ags & O_RDWR) ==
20ce0 20 4f 5f 52 44 57 52 29 20 7b 0a 20 20 20 20 20   O_RDWR) {.     
20cf0 20 20 20 20 20 20 20 73 72 63 46 6c 61 67 73 20         srcFlags 
20d00 3d 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45  = SQLITE_OPEN_RE
20d10 41 44 57 52 49 54 45 3b 0a 20 20 20 20 20 20 20  ADWRITE;.       
20d20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20     } else {.    
20d30 20 20 20 20 20 20 20 20 73 72 63 46 6c 61 67 73          srcFlags
20d40 20 3d 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52   = SQLITE_OPEN_R
20d50 45 41 44 4f 4e 4c 59 3b 0a 20 20 20 20 20 20 20  EADONLY;.       
20d60 20 20 20 7d 0a 23 69 66 20 53 51 4c 49 54 45 5f     }.#if SQLITE_
20d70 45 4e 41 42 4c 45 5f 44 41 54 41 5f 50 52 4f 54  ENABLE_DATA_PROT
20d80 45 43 54 49 4f 4e 0a 20 20 20 20 20 20 20 20 20  ECTION.         
20d90 20 73 72 63 46 6c 61 67 73 20 7c 3d 20 70 53 72   srcFlags |= pSr
20da0 63 46 69 6c 65 2d 3e 70 72 6f 74 46 6c 61 67 73  cFile->protFlags
20db0 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 53 51 4c  ;.#endif.#if SQL
20dc0 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49  ITE_ENABLE_LOCKI
20dd0 4e 47 5f 53 54 59 4c 45 0a 20 20 20 20 20 20 20  NG_STYLE.       
20de0 20 20 20 69 66 28 20 69 73 50 72 6f 78 79 4c 6f     if( isProxyLo
20df0 63 6b 69 6e 67 4d 6f 64 65 28 70 53 72 63 46 69  ckingMode(pSrcFi
20e00 6c 65 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  le) ){.         
20e10 20 20 20 73 72 63 46 6c 61 67 73 20 7c 3d 20 53     srcFlags |= S
20e20 51 4c 49 54 45 5f 4f 50 45 4e 5f 41 55 54 4f 50  QLITE_OPEN_AUTOP
20e30 52 4f 58 59 3b 0a 20 20 20 20 20 20 20 20 20 20  ROXY;.          
20e40 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 20  }.#endif.       
20e50 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f     rc = sqlite3_
20e60 6f 70 65 6e 5f 76 32 28 70 53 72 63 46 69 6c 65  open_v2(pSrcFile
20e70 2d 3e 7a 50 61 74 68 2c 20 26 73 72 63 64 62 32  ->zPath, &srcdb2
20e80 2c 20 73 72 63 46 6c 61 67 73 2c 20 30 29 3b 0a  , srcFlags, 0);.
20e90 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63            if( rc
20ea0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
20eb0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73 74             /* st
20ec0 61 72 74 20 61 20 64 65 66 65 72 72 65 64 20 74  art a deferred t
20ed0 72 61 6e 73 61 63 74 69 6f 6e 20 61 6e 64 20 72  ransaction and r
20ee0 65 61 64 20 74 6f 20 65 73 74 61 62 6c 69 73 68  ead to establish
20ef0 20 61 20 72 65 61 64 20 6c 6f 63 6b 20 2a 2f 0a   a read lock */.
20f00 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d              rc =
20f10 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28 73 72   sqlite3_exec(sr
20f20 63 64 62 32 2c 20 22 42 45 47 49 4e 20 44 45 46  cdb2, "BEGIN DEF
20f30 45 52 52 45 44 3b 20 50 52 41 47 4d 41 20 73 63  ERRED; PRAGMA sc
20f40 68 65 6d 61 5f 76 65 72 73 69 6f 6e 22 2c 20 30  hema_version", 0
20f50 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  , 0, 0);.       
20f60 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
20f70 49 54 45 5f 43 4f 52 52 55 50 54 20 7c 7c 20 72  ITE_CORRUPT || r
20f80 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 54 41 44 42  c==SQLITE_NOTADB
20f90 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
20fa0 20 20 69 73 53 72 63 43 6f 72 72 75 70 74 20 3d    isSrcCorrupt =
20fb0 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   1;.            
20fc0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 64 65    rc = sqlite3de
20fd0 6d 6f 5f 73 75 70 65 72 6c 6f 63 6b 5f 63 6f 72  mo_superlock_cor
20fe0 72 75 70 74 28 73 72 63 5f 66 69 6c 65 2c 20 53  rupt(src_file, S
20ff0 51 4c 49 54 45 5f 4c 4f 43 4b 5f 53 48 41 52 45  QLITE_LOCK_SHARE
21000 44 2c 20 26 63 6f 72 72 75 70 74 53 72 63 46 69  D, &corruptSrcFi
21010 6c 65 4c 6f 63 6b 29 3b 0a 20 20 20 20 20 20 20  leLock);.       
21020 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
21030 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
21040 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 21     }.      if( !
21050 73 72 63 64 62 32 20 7c 7c 20 70 53 72 63 46 69  srcdb2 || pSrcFi
21060 6c 65 3d 3d 4e 55 4c 4c 20 7c 7c 20 70 53 72 63  le==NULL || pSrc
21070 46 69 6c 65 2d 3e 68 3c 30 29 7b 0a 20 20 20 20  File->h<0){.    
21080 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
21090 49 4e 54 45 52 4e 41 4c 3b 0a 20 20 20 20 20 20  INTERNAL;.      
210a0 7d 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  }.      if( rc!=
210b0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
210c0 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 72 65       goto end_re
210d0 70 6c 61 63 65 5f 64 61 74 61 62 61 73 65 3b 0a  place_database;.
210e0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 2f 2a        }.      /*
210f0 20 62 6f 74 68 20 64 61 74 61 62 61 73 65 73 20   both databases 
21100 61 72 65 20 6c 6f 63 6b 65 64 20 61 70 70 72 6f  are locked appro
21110 70 72 69 61 74 65 6c 79 2c 20 63 6f 70 79 20 74  priately, copy t
21120 68 65 20 73 72 63 20 77 61 6c 20 6a 6f 75 72 6e  he src wal journ
21130 61 6c 20 69 66 20 0a 20 20 20 20 20 20 2a 2a 20  al if .      ** 
21140 6f 6e 65 20 65 78 69 73 74 73 20 61 6e 64 20 74  one exists and t
21150 68 65 6e 20 74 68 65 20 61 63 74 75 61 6c 20 64  hen the actual d
21160 61 74 61 62 61 73 65 20 66 69 6c 65 0a 20 20 20  atabase file.   
21170 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 74 72 6c     */.      strl
21180 63 70 79 28 73 72 63 57 61 6c 50 61 74 68 2c 20  cpy(srcWalPath, 
21190 70 53 72 63 46 69 6c 65 2d 3e 7a 50 61 74 68 2c  pSrcFile->zPath,
211a0 20 4d 41 58 50 41 54 48 4c 45 4e 2b 35 29 3b 0a   MAXPATHLEN+5);.
211b0 20 20 20 20 20 20 73 74 72 6c 63 61 74 28 73 72        strlcat(sr
211c0 63 57 61 6c 50 61 74 68 2c 20 22 2d 77 61 6c 22  cWalPath, "-wal"
211d0 2c 20 4d 41 58 50 41 54 48 4c 45 4e 2b 35 29 3b  , MAXPATHLEN+5);
211e0 0a 20 20 20 20 20 20 73 72 63 57 61 6c 46 44 20  .      srcWalFD 
211f0 3d 20 6f 70 65 6e 28 73 72 63 57 61 6c 50 61 74  = open(srcWalPat
21200 68 2c 20 4f 5f 52 44 4f 4e 4c 59 29 3b 0a 20 20  h, O_RDONLY);.  
21210 20 20 20 20 69 66 28 20 21 28 73 72 63 57 61 6c      if( !(srcWal
21220 46 44 3c 30 29 20 29 7b 0a 20 20 20 20 20 20 20  FD<0) ){.       
21230 20 63 68 61 72 20 64 73 74 57 61 6c 50 61 74 68   char dstWalPath
21240 5b 4d 41 58 50 41 54 48 4c 45 4e 2b 35 5d 3b 0a  [MAXPATHLEN+5];.
21250 20 20 20 20 20 20 20 20 69 6e 74 20 64 73 74 57          int dstW
21260 61 6c 46 44 20 3d 20 2d 31 3b 0a 20 20 20 20 20  alFD = -1;.     
21270 20 20 20 73 74 72 6c 63 70 79 28 64 73 74 57 61     strlcpy(dstWa
21280 6c 50 61 74 68 2c 20 70 46 69 6c 65 2d 3e 7a 50  lPath, pFile->zP
21290 61 74 68 2c 20 4d 41 58 50 41 54 48 4c 45 4e 2b  ath, MAXPATHLEN+
212a0 35 29 3b 0a 20 20 20 20 20 20 20 20 73 74 72 6c  5);.        strl
212b0 63 61 74 28 64 73 74 57 61 6c 50 61 74 68 2c 20  cat(dstWalPath, 
212c0 22 2d 77 61 6c 22 2c 20 4d 41 58 50 41 54 48 4c  "-wal", MAXPATHL
212d0 45 4e 2b 35 29 3b 0a 20 20 20 20 20 20 20 20 64  EN+5);.        d
212e0 73 74 57 61 6c 46 44 20 3d 20 6f 70 65 6e 28 64  stWalFD = open(d
212f0 73 74 57 61 6c 50 61 74 68 2c 20 4f 5f 52 44 57  stWalPath, O_RDW
21300 52 7c 4f 5f 43 52 45 41 54 2c 20 53 51 4c 49 54  R|O_CREAT, SQLIT
21310 45 5f 44 45 46 41 55 4c 54 5f 46 49 4c 45 5f 50  E_DEFAULT_FILE_P
21320 45 52 4d 49 53 53 49 4f 4e 53 29 3b 0a 20 20 20  ERMISSIONS);.   
21330 20 20 20 20 20 69 66 28 20 21 28 64 73 74 57 61       if( !(dstWa
21340 6c 46 44 3c 30 29 20 29 7b 0a 20 20 20 20 20 20  lFD<0) ){.      
21350 20 20 20 20 73 20 3d 20 63 6f 70 79 66 69 6c 65      s = copyfile
21360 5f 73 74 61 74 65 5f 61 6c 6c 6f 63 28 29 3b 0a  _state_alloc();.
21370 20 20 20 20 20 20 20 20 20 20 6c 73 65 65 6b 28            lseek(
21380 73 72 63 57 61 6c 46 44 2c 20 30 2c 20 53 45 45  srcWalFD, 0, SEE
21390 4b 5f 53 45 54 29 3b 0a 20 20 20 20 20 20 20 20  K_SET);.        
213a0 20 20 6c 73 65 65 6b 28 64 73 74 57 61 6c 46 44    lseek(dstWalFD
213b0 2c 20 30 2c 20 53 45 45 4b 5f 53 45 54 29 3b 0a  , 0, SEEK_SET);.
213c0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 66 63            if( fc
213d0 6f 70 79 66 69 6c 65 28 73 72 63 57 61 6c 46 44  opyfile(srcWalFD
213e0 2c 20 64 73 74 57 61 6c 46 44 2c 20 73 2c 20 43  , dstWalFD, s, C
213f0 4f 50 59 46 49 4c 45 5f 41 4c 4c 29 20 29 7b 0a  OPYFILE_ALL) ){.
21400 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 74 20              int 
21410 65 72 72 3d 65 72 72 6e 6f 3b 0a 20 20 20 20 20  err=errno;.     
21420 20 20 20 20 20 20 20 73 77 69 74 63 68 28 65 72         switch(er
21430 72 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20  r) {.           
21440 20 20 20 63 61 73 65 20 45 4e 4f 4d 45 4d 3a 0a     case ENOMEM:.
21450 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21460 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  rc = SQLITE_NOME
21470 4d 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  M;.             
21480 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
21490 20 20 20 20 20 20 20 20 64 65 66 61 75 6c 74 3a          default:
214a0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
214b0 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e   pFile->lastErrn
214c0 6f 20 3d 20 65 72 72 3b 0a 20 20 20 20 20 20 20  o = err;.       
214d0 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51           rc = SQ
214e0 4c 49 54 45 5f 49 4f 45 52 52 3b 0a 20 20 20 20  LITE_IOERR;.    
214f0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
21500 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
21510 63 6f 70 79 66 69 6c 65 5f 73 74 61 74 65 5f 66  copyfile_state_f
21520 72 65 65 28 73 29 3b 0a 20 20 20 20 20 20 20 20  ree(s);.        
21530 20 20 63 6c 6f 73 65 28 64 73 74 57 61 6c 46 44    close(dstWalFD
21540 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
21550 20 20 20 20 20 63 6c 6f 73 65 28 73 72 63 57 61       close(srcWa
21560 6c 46 44 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  lFD);.      }.  
21570 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
21580 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
21590 20 2f 2a 20 62 65 66 6f 72 65 20 77 65 20 63 6f   /* before we co
215a0 70 79 2c 20 65 6e 73 75 72 65 20 74 68 61 74 20  py, ensure that 
215b0 74 68 65 20 66 69 6c 65 20 63 68 61 6e 67 65 20  the file change 
215c0 63 6f 75 6e 74 65 72 20 77 69 6c 6c 20 62 65 20  counter will be 
215d0 6d 6f 64 69 66 69 65 64 20 2a 2f 0a 20 20 20 20  modified */.    
215e0 20 20 20 20 75 69 6e 74 33 32 5f 74 20 73 72 63      uint32_t src
215f0 43 68 61 6e 67 65 20 3d 20 30 3b 0a 20 20 20 20  Change = 0;.    
21600 20 20 20 20 75 69 6e 74 33 32 5f 74 20 64 73 74      uint32_t dst
21610 43 68 61 6e 67 65 20 3d 20 30 3b 0a 20 20 20 20  Change = 0;.    
21620 20 20 20 20 70 72 65 61 64 28 70 53 72 63 46 69      pread(pSrcFi
21630 6c 65 2d 3e 68 2c 20 26 73 72 63 43 68 61 6e 67  le->h, &srcChang
21640 65 2c 20 34 2c 20 32 34 29 3b 0a 20 20 20 20 20  e, 4, 24);.     
21650 20 20 20 70 72 65 61 64 28 70 46 69 6c 65 2d 3e     pread(pFile->
21660 68 2c 20 26 64 73 74 43 68 61 6e 67 65 2c 20 34  h, &dstChange, 4
21670 2c 20 32 34 29 3b 0a 20 20 20 20 20 20 20 20 0a  , 24);.        .
21680 20 20 20 20 20 20 20 20 2f 2a 20 63 6f 70 79 20          /* copy 
21690 74 68 65 20 61 63 74 75 61 6c 20 64 61 74 61 62  the actual datab
216a0 61 73 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 73  ase */.        s
216b0 20 3d 20 63 6f 70 79 66 69 6c 65 5f 73 74 61 74   = copyfile_stat
216c0 65 5f 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 20  e_alloc();.     
216d0 20 20 20 6c 73 65 65 6b 28 70 53 72 63 46 69 6c     lseek(pSrcFil
216e0 65 2d 3e 68 2c 20 30 2c 20 53 45 45 4b 5f 53 45  e->h, 0, SEEK_SE
216f0 54 29 3b 0a 20 20 20 20 20 20 20 20 6c 73 65 65  T);.        lsee
21700 6b 28 70 46 69 6c 65 2d 3e 68 2c 20 30 2c 20 53  k(pFile->h, 0, S
21710 45 45 4b 5f 53 45 54 29 3b 0a 20 20 20 20 20 20  EEK_SET);.      
21720 20 20 69 66 28 20 66 63 6f 70 79 66 69 6c 65 28    if( fcopyfile(
21730 70 53 72 63 46 69 6c 65 2d 3e 68 2c 20 70 46 69  pSrcFile->h, pFi
21740 6c 65 2d 3e 68 2c 20 73 2c 20 43 4f 50 59 46 49  le->h, s, COPYFI
21750 4c 45 5f 41 4c 4c 29 20 29 7b 0a 20 20 20 20 20  LE_ALL) ){.     
21760 20 20 20 20 20 69 6e 74 20 65 72 72 3d 65 72 72       int err=err
21770 6e 6f 3b 0a 20 20 20 20 20 20 20 20 20 20 73 77  no;.          sw
21780 69 74 63 68 28 65 72 72 29 20 7b 0a 20 20 20 20  itch(err) {.    
21790 20 20 20 20 20 20 20 20 63 61 73 65 20 45 4e 4f          case ENO
217a0 4d 45 4d 3a 0a 20 20 20 20 20 20 20 20 20 20 20  MEM:.           
217b0 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e     rc = SQLITE_N
217c0 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 20 20 20 20  OMEM;.          
217d0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
217e0 20 20 20 20 20 20 20 64 65 66 61 75 6c 74 3a 0a         default:.
217f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 46                pF
21800 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d  ile->lastErrno =
21810 20 65 72 72 3b 0a 20 20 20 20 20 20 20 20 20 20   err;.          
21820 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
21830 49 4f 45 52 52 3b 0a 20 20 20 20 20 20 20 20 20  IOERR;.         
21840 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
21850 20 20 20 20 20 63 6f 70 79 66 69 6c 65 5f 73 74       copyfile_st
21860 61 74 65 5f 66 72 65 65 28 73 29 3b 0a 20 20 20  ate_free(s);.   
21870 20 20 20 20 20 0a 20 20 20 20 20 20 20 20 69 66       .        if
21880 20 28 73 72 63 43 68 61 6e 67 65 20 3d 3d 20 64   (srcChange == d
21890 73 74 43 68 61 6e 67 65 29 20 7b 0a 20 20 20 20  stChange) {.    
218a0 20 20 20 20 20 20 2f 2a 20 6d 6f 64 69 66 79 20        /* modify 
218b0 74 68 65 20 63 68 61 6e 67 65 20 63 6f 75 6e 74  the change count
218c0 65 72 20 74 6f 20 66 6f 72 63 65 20 70 61 67 65  er to force page
218d0 20 7a 65 72 6f 20 74 6f 20 62 65 20 72 65 6c 6f   zero to be relo
218e0 61 64 65 64 20 2a 2f 0a 20 20 20 20 20 20 20 20  aded */.        
218f0 20 20 64 73 74 43 68 61 6e 67 65 20 2b 2b 3b 0a    dstChange ++;.
21900 20 20 20 20 20 20 20 20 20 20 70 77 72 69 74 65            pwrite
21910 28 70 46 69 6c 65 2d 3e 68 2c 20 26 64 73 74 43  (pFile->h, &dstC
21920 68 61 6e 67 65 2c 20 34 2c 20 32 34 29 3b 0a 20  hange, 4, 24);. 
21930 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
21940 0a 20 20 20 20 20 20 69 66 28 20 69 73 53 72 63  .      if( isSrc
21950 43 6f 72 72 75 70 74 20 29 7b 0a 20 20 20 20 20  Corrupt ){.     
21960 20 20 20 73 71 6c 69 74 65 33 64 65 6d 6f 5f 73     sqlite3demo_s
21970 75 70 65 72 75 6e 6c 6f 63 6b 5f 63 6f 72 72 75  uperunlock_corru
21980 70 74 28 73 72 63 5f 66 69 6c 65 2c 20 63 6f 72  pt(src_file, cor
21990 72 75 70 74 53 72 63 46 69 6c 65 4c 6f 63 6b 29  ruptSrcFileLock)
219a0 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
219b0 20 20 20 20 20 20 20 2f 2a 20 64 6f 6e 65 20 77         /* done w
219c0 69 74 68 20 74 68 65 20 73 6f 75 72 63 65 20 64  ith the source d
219d0 62 20 73 6f 20 65 6e 64 20 74 68 65 20 74 72 61  b so end the tra
219e0 6e 73 61 63 74 69 6f 6e 20 2a 2f 0a 20 20 20 20  nsaction */.    
219f0 20 20 20 20 73 71 6c 69 74 65 33 5f 65 78 65 63      sqlite3_exec
21a00 28 73 72 63 64 62 32 2c 20 22 43 4f 4d 4d 49 54  (srcdb2, "COMMIT
21a10 22 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20  ", 0, 0, 0);.   
21a20 20 20 20 7d 0a 20 20 20 20 20 20 2f 2a 20 7a 65     }.      /* ze
21a30 72 6f 20 6f 75 74 20 61 6e 79 20 6f 6c 64 20 6a  ro out any old j
21a40 6f 75 72 6e 61 6c 20 63 6c 75 74 74 65 72 20 2a  ournal clutter *
21a50 2f 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d  /.      if( rc==
21a60 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
21a70 20 20 20 20 20 63 68 61 72 20 6a 50 61 74 68 5b       char jPath[
21a80 4d 41 58 50 41 54 48 4c 45 4e 2b 39 5d 3b 0a 20  MAXPATHLEN+9];. 
21a90 20 20 20 20 20 20 20 69 6e 74 20 7a 4c 65 6e 20         int zLen 
21aa0 3d 20 73 74 72 6c 63 70 79 28 6a 50 61 74 68 2c  = strlcpy(jPath,
21ab0 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68 2c 20 4d   pFile->zPath, M
21ac0 41 58 50 41 54 48 4c 45 4e 2b 39 29 3b 0a 20 20  AXPATHLEN+9);.  
21ad0 20 20 20 20 20 20 69 66 28 20 7a 4c 65 6e 3c 4d        if( zLen<M
21ae0 41 58 50 41 54 48 4c 45 4e 20 29 7b 0a 20 20 20  AXPATHLEN ){.   
21af0 20 20 20 20 20 20 20 73 69 7a 65 5f 74 20 6a 4c         size_t jL
21b00 65 6e 3b 0a 20 20 20 20 20 20 20 20 20 20 63 6f  en;.          co
21b10 6e 73 74 20 63 68 61 72 20 65 78 74 65 6e 73 69  nst char extensi
21b20 6f 6e 73 5b 32 5d 5b 39 5d 20 3d 20 7b 20 22 2d  ons[2][9] = { "-
21b30 77 61 6c 22 2c 20 22 2d 6a 6f 75 72 6e 61 6c 22  wal", "-journal"
21b40 20 2f 2a 20 22 2d 73 68 6d 22 20 2a 2f 20 7d 3b   /* "-shm" */ };
21b50 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 6a  .          int j
21b60 20 3d 20 28 73 72 63 57 61 6c 46 44 3c 30 29 3f   = (srcWalFD<0)?
21b70 30 3a 31 3b 20 2f 2a 20 73 6b 69 70 20 74 68 65  0:1; /* skip the
21b80 20 77 61 6c 20 69 66 20 77 65 20 72 65 70 6c 61   wal if we repla
21b90 63 65 64 20 69 74 20 2a 2f 0a 20 20 20 20 20 20  ced it */.      
21ba0 20 20 20 20 66 6f 72 28 20 3b 20 6a 3c 32 3b 20      for( ; j<2; 
21bb0 6a 2b 2b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  j++ ){.         
21bc0 20 20 20 6a 4c 65 6e 20 3d 20 73 74 72 6c 63 70     jLen = strlcp
21bd0 79 28 26 6a 50 61 74 68 5b 7a 4c 65 6e 5d 2c 20  y(&jPath[zLen], 
21be0 65 78 74 65 6e 73 69 6f 6e 73 5b 6a 5d 2c 20 39  extensions[j], 9
21bf0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  );.            i
21c00 66 28 20 6a 4c 65 6e 20 3c 20 39 20 29 7b 0a 20  f( jLen < 9 ){. 
21c10 20 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 74               int
21c20 20 6a 66 64 20 3d 20 6f 70 65 6e 28 6a 50 61 74   jfd = open(jPat
21c30 68 2c 20 4f 5f 54 52 55 4e 43 29 3b 0a 20 20 20  h, O_TRUNC);.   
21c40 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 6a             if( j
21c50 66 64 3d 3d 28 2d 31 29 20 29 7b 0a 20 20 20 20  fd==(-1) ){.    
21c60 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20 28              if (
21c70 20 65 72 72 6e 6f 21 3d 45 4e 4f 45 4e 54 20 29   errno!=ENOENT )
21c80 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
21c90 20 20 20 20 70 65 72 72 6f 72 28 6a 50 61 74 68      perror(jPath
21ca0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
21cb0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
21cc0 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20     } else {.    
21cd0 20 20 20 20 20 20 20 20 20 20 20 20 66 73 79 6e              fsyn
21ce0 63 28 6a 66 64 29 3b 0a 20 20 20 20 20 20 20 20  c(jfd);.        
21cf0 20 20 20 20 20 20 20 20 63 6c 6f 73 65 28 6a 66          close(jf
21d00 64 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  d);.            
21d10 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
21d20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  }.          }.  
21d30 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
21d40 70 46 69 6c 65 2d 3e 70 4d 65 74 68 6f 64 2d 3e  pFile->pMethod->
21d50 78 53 79 6e 63 28 69 64 2c 20 53 51 4c 49 54 45  xSync(id, SQLITE
21d60 5f 53 59 4e 43 5f 46 55 4c 4c 29 3b 0a 20 20 20  _SYNC_FULL);.   
21d70 20 20 20 7d 0a 20 20 20 20 20 20 0a 20 20 20 20     }.      .    
21d80 65 6e 64 5f 72 65 70 6c 61 63 65 5f 64 61 74 61  end_replace_data
21d90 62 61 73 65 3a 0a 20 20 20 20 20 20 69 66 28 20  base:.      if( 
21da0 70 53 72 63 42 74 72 65 65 20 29 7b 0a 20 20 20  pSrcBtree ){.   
21db0 20 20 20 20 20 73 71 6c 69 74 65 33 5f 63 6c 6f       sqlite3_clo
21dc0 73 65 28 73 72 63 64 62 32 29 3b 0a 20 20 20 20  se(srcdb2);.    
21dd0 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
21de0 4c 65 61 76 65 28 70 53 72 63 42 74 72 65 65 29  Leave(pSrcBtree)
21df0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
21e00 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65  sqlite3_mutex_le
21e10 61 76 65 28 73 72 63 64 62 2d 3e 6d 75 74 65 78  ave(srcdb->mutex
21e20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 69 73 44  );.      if( isD
21e30 73 74 43 6f 72 72 75 70 74 20 29 7b 0a 20 20 20  stCorrupt ){.   
21e40 20 20 20 20 20 73 71 6c 69 74 65 33 64 65 6d 6f       sqlite3demo
21e50 5f 73 75 70 65 72 75 6e 6c 6f 63 6b 5f 63 6f 72  _superunlock_cor
21e60 72 75 70 74 28 69 64 2c 20 63 6f 72 72 75 70 74  rupt(id, corrupt
21e70 44 73 74 46 69 6c 65 4c 6f 63 6b 29 3b 0a 20 20  DstFileLock);.  
21e80 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
21e90 20 20 20 73 71 6c 69 74 65 33 64 65 6d 6f 5f 73     sqlite3demo_s
21ea0 75 70 65 72 75 6e 6c 6f 63 6b 28 70 4c 6f 63 6b  uperunlock(pLock
21eb0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
21ec0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
21ed0 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 28 53 51 4c  }.#endif /* (SQL
21ee0 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50 50 4c 45  ITE_ENABLE_APPLE
21ef0 5f 53 50 49 3e 30 29 20 26 26 20 64 65 66 69 6e  _SPI>0) && defin
21f00 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 2a 2f  ed(__APPLE__) */
21f10 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
21f20 5f 46 43 4e 54 4c 5f 53 59 4e 43 5f 4f 4d 49 54  _FCNTL_SYNC_OMIT
21f30 54 45 44 3a 20 7b 0a 20 20 20 20 20 20 72 65 74  TED: {.      ret
21f40 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20  urn SQLITE_OK;  
21f50 2f 2a 20 41 20 6e 6f 2d 6f 70 20 2a 2f 0a 20 20  /* A no-op */.  
21f60 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
21f70 20 53 51 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e 44   SQLITE_NOTFOUND
21f80 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
21f90 6e 20 74 68 65 20 73 65 63 74 6f 72 20 73 69 7a  n the sector siz
21fa0 65 20 69 6e 20 62 79 74 65 73 20 6f 66 20 74 68  e in bytes of th
21fb0 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 62 6c 6f  e underlying blo
21fc0 63 6b 20 64 65 76 69 63 65 20 66 6f 72 0a 2a 2a  ck device for.**
21fd0 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20 66   the specified f
21fe0 69 6c 65 2e 20 54 68 69 73 20 69 73 20 61 6c 6d  ile. This is alm
21ff0 6f 73 74 20 61 6c 77 61 79 73 20 35 31 32 20 62  ost always 512 b
22000 79 74 65 73 2c 20 62 75 74 20 6d 61 79 20 62 65  ytes, but may be
22010 0a 2a 2a 20 6c 61 72 67 65 72 20 66 6f 72 20 73  .** larger for s
22020 6f 6d 65 20 64 65 76 69 63 65 73 2e 0a 2a 2a 0a  ome devices..**.
22030 2a 2a 20 53 51 4c 69 74 65 20 63 6f 64 65 20 61  ** SQLite code a
22040 73 73 75 6d 65 73 20 74 68 69 73 20 66 75 6e 63  ssumes this func
22050 74 69 6f 6e 20 63 61 6e 6e 6f 74 20 66 61 69 6c  tion cannot fail
22060 2e 20 49 74 20 61 6c 73 6f 20 61 73 73 75 6d 65  . It also assume
22070 73 20 74 68 61 74 0a 2a 2a 20 69 66 20 74 77 6f  s that.** if two
22080 20 66 69 6c 65 73 20 61 72 65 20 63 72 65 61 74   files are creat
22090 65 64 20 69 6e 20 74 68 65 20 73 61 6d 65 20 66  ed in the same f
220a0 69 6c 65 2d 73 79 73 74 65 6d 20 64 69 72 65 63  ile-system direc
220b0 74 6f 72 79 20 28 69 2e 65 2e 0a 2a 2a 20 61 20  tory (i.e..** a 
220c0 64 61 74 61 62 61 73 65 20 61 6e 64 20 69 74 73  database and its
220d0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 29 20 74   journal file) t
220e0 68 61 74 20 74 68 65 20 73 65 63 74 6f 72 20 73  hat the sector s
220f0 69 7a 65 20 77 69 6c 6c 20 62 65 20 74 68 65 0a  ize will be the.
22100 2a 2a 20 73 61 6d 65 20 66 6f 72 20 62 6f 74 68  ** same for both
22110 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
22120 75 6e 69 78 53 65 63 74 6f 72 53 69 7a 65 28 73  unixSectorSize(s
22130 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 4e 6f 74  qlite3_file *Not
22140 55 73 65 64 29 7b 0a 20 20 55 4e 55 53 45 44 5f  Used){.  UNUSED_
22150 50 41 52 41 4d 45 54 45 52 28 4e 6f 74 55 73 65  PARAMETER(NotUse
22160 64 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  d);.  return SQL
22170 49 54 45 5f 44 45 46 41 55 4c 54 5f 53 45 43 54  ITE_DEFAULT_SECT
22180 4f 52 5f 53 49 5a 45 3b 0a 7d 0a 0a 2f 2a 0a 2a  OR_SIZE;.}../*.*
22190 2a 20 52 65 74 75 72 6e 20 74 68 65 20 64 65 76  * Return the dev
221a0 69 63 65 20 63 68 61 72 61 63 74 65 72 69 73 74  ice characterist
221b0 69 63 73 20 66 6f 72 20 74 68 65 20 66 69 6c 65  ics for the file
221c0 2e 20 54 68 69 73 20 69 73 20 61 6c 77 61 79 73  . This is always
221d0 20 30 20 66 6f 72 20 75 6e 69 78 2e 0a 2a 2f 0a   0 for unix..*/.
221e0 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 44  static int unixD
221f0 65 76 69 63 65 43 68 61 72 61 63 74 65 72 69 73  eviceCharacteris
22200 74 69 63 73 28 73 71 6c 69 74 65 33 5f 66 69 6c  tics(sqlite3_fil
22210 65 20 2a 4e 6f 74 55 73 65 64 29 7b 0a 20 20 55  e *NotUsed){.  U
22220 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
22230 4e 6f 74 55 73 65 64 29 3b 0a 20 20 72 65 74 75  NotUsed);.  retu
22240 72 6e 20 30 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66  rn 0;.}..#ifndef
22250 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c   SQLITE_OMIT_WAL
22260 0a 0a 0a 2f 2a 0a 2a 2a 20 4f 62 6a 65 63 74 20  .../*.** Object 
22270 75 73 65 64 20 74 6f 20 72 65 70 72 65 73 65 6e  used to represen
22280 74 20 61 6e 20 73 68 61 72 65 64 20 6d 65 6d 6f  t an shared memo
22290 72 79 20 62 75 66 66 65 72 2e 20 20 0a 2a 2a 0a  ry buffer.  .**.
222a0 2a 2a 20 57 68 65 6e 20 6d 75 6c 74 69 70 6c 65  ** When multiple
222b0 20 74 68 72 65 61 64 73 20 61 6c 6c 20 72 65 66   threads all ref
222c0 65 72 65 6e 63 65 20 74 68 65 20 73 61 6d 65 20  erence the same 
222d0 77 61 6c 2d 69 6e 64 65 78 2c 20 65 61 63 68 20  wal-index, each 
222e0 74 68 72 65 61 64 0a 2a 2a 20 68 61 73 20 69 74  thread.** has it
222f0 73 20 6f 77 6e 20 75 6e 69 78 53 68 6d 20 6f 62  s own unixShm ob
22300 6a 65 63 74 2c 20 62 75 74 20 74 68 65 79 20 61  ject, but they a
22310 6c 6c 20 70 6f 69 6e 74 20 74 6f 20 61 20 73 69  ll point to a si
22320 6e 67 6c 65 20 69 6e 73 74 61 6e 63 65 0a 2a 2a  ngle instance.**
22330 20 6f 66 20 74 68 69 73 20 75 6e 69 78 53 68 6d   of this unixShm
22340 4e 6f 64 65 20 6f 62 6a 65 63 74 2e 20 20 49 6e  Node object.  In
22350 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 65 61   other words, ea
22360 63 68 20 77 61 6c 2d 69 6e 64 65 78 20 69 73 20  ch wal-index is 
22370 6f 70 65 6e 65 64 0a 2a 2a 20 6f 6e 6c 79 20 6f  opened.** only o
22380 6e 63 65 20 70 65 72 20 70 72 6f 63 65 73 73 2e  nce per process.
22390 0a 2a 2a 0a 2a 2a 20 45 61 63 68 20 75 6e 69 78  .**.** Each unix
223a0 53 68 6d 4e 6f 64 65 20 6f 62 6a 65 63 74 20 69  ShmNode object i
223b0 73 20 63 6f 6e 6e 65 63 74 65 64 20 74 6f 20 61  s connected to a
223c0 20 73 69 6e 67 6c 65 20 75 6e 69 78 49 6e 6f 64   single unixInod
223d0 65 49 6e 66 6f 20 6f 62 6a 65 63 74 2e 0a 2a 2a  eInfo object..**
223e0 20 57 65 20 63 6f 75 6c 64 20 63 6f 61 6c 65 73   We could coales
223f0 63 65 20 74 68 69 73 20 6f 62 6a 65 63 74 20 69  ce this object i
22400 6e 74 6f 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66  nto unixInodeInf
22410 6f 2c 20 62 75 74 20 74 68 61 74 20 77 6f 75 6c  o, but that woul
22420 64 20 6d 65 61 6e 0a 2a 2a 20 65 76 65 72 79 20  d mean.** every 
22430 6f 70 65 6e 20 66 69 6c 65 20 74 68 61 74 20 64  open file that d
22440 6f 65 73 20 6e 6f 74 20 75 73 65 20 73 68 61 72  oes not use shar
22450 65 64 20 6d 65 6d 6f 72 79 20 28 69 6e 20 6f 74  ed memory (in ot
22460 68 65 72 20 77 6f 72 64 73 2c 20 6d 6f 73 74 0a  her words, most.
22470 2a 2a 20 6f 70 65 6e 20 66 69 6c 65 73 29 20 77  ** open files) w
22480 6f 75 6c 64 20 68 61 76 65 20 74 6f 20 63 61 72  ould have to car
22490 72 79 20 61 72 6f 75 6e 64 20 74 68 69 73 20 65  ry around this e
224a0 78 74 72 61 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  xtra information
224b0 2e 20 20 53 6f 0a 2a 2a 20 74 68 65 20 75 6e 69  .  So.** the uni
224c0 78 49 6e 6f 64 65 49 6e 66 6f 20 6f 62 6a 65 63  xInodeInfo objec
224d0 74 20 63 6f 6e 74 61 69 6e 73 20 61 20 70 6f 69  t contains a poi
224e0 6e 74 65 72 20 74 6f 20 74 68 69 73 20 75 6e 69  nter to this uni
224f0 78 53 68 6d 4e 6f 64 65 20 6f 62 6a 65 63 74 0a  xShmNode object.
22500 2a 2a 20 61 6e 64 20 74 68 65 20 75 6e 69 78 53  ** and the unixS
22510 68 6d 4e 6f 64 65 20 6f 62 6a 65 63 74 20 69 73  hmNode object is
22520 20 63 72 65 61 74 65 64 20 6f 6e 6c 79 20 77 68   created only wh
22530 65 6e 20 6e 65 65 64 65 64 2e 0a 2a 2a 0a 2a 2a  en needed..**.**
22540 20 75 6e 69 78 4d 75 74 65 78 48 65 6c 64 28 29   unixMutexHeld()
22550 20 6d 75 73 74 20 62 65 20 74 72 75 65 20 77 68   must be true wh
22560 65 6e 20 63 72 65 61 74 69 6e 67 20 6f 72 20 64  en creating or d
22570 65 73 74 72 6f 79 69 6e 67 0a 2a 2a 20 74 68 69  estroying.** thi
22580 73 20 6f 62 6a 65 63 74 20 6f 72 20 77 68 69 6c  s object or whil
22590 65 20 72 65 61 64 69 6e 67 20 6f 72 20 77 72 69  e reading or wri
225a0 74 69 6e 67 20 74 68 65 20 66 6f 6c 6c 6f 77 69  ting the followi
225b0 6e 67 20 66 69 65 6c 64 73 3a 0a 2a 2a 0a 2a 2a  ng fields:.**.**
225c0 20 20 20 20 20 20 6e 52 65 66 0a 2a 2a 0a 2a 2a        nRef.**.**
225d0 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 66   The following f
225e0 69 65 6c 64 73 20 61 72 65 20 72 65 61 64 2d 6f  ields are read-o
225f0 6e 6c 79 20 61 66 74 65 72 20 74 68 65 20 6f 62  nly after the ob
22600 6a 65 63 74 20 69 73 20 63 72 65 61 74 65 64 3a  ject is created:
22610 0a 2a 2a 20 0a 2a 2a 20 20 20 20 20 20 66 69 64  .** .**      fid
22620 0a 2a 2a 20 20 20 20 20 20 7a 46 69 6c 65 6e 61  .**      zFilena
22630 6d 65 0a 2a 2a 0a 2a 2a 20 45 69 74 68 65 72 20  me.**.** Either 
22640 75 6e 69 78 53 68 6d 4e 6f 64 65 2e 6d 75 74 65  unixShmNode.mute
22650 78 20 6d 75 73 74 20 62 65 20 68 65 6c 64 20 6f  x must be held o
22660 72 20 75 6e 69 78 53 68 6d 4e 6f 64 65 2e 6e 52  r unixShmNode.nR
22670 65 66 3d 3d 30 20 61 6e 64 0a 2a 2a 20 75 6e 69  ef==0 and.** uni
22680 78 4d 75 74 65 78 48 65 6c 64 28 29 20 69 73 20  xMutexHeld() is 
22690 74 72 75 65 20 77 68 65 6e 20 72 65 61 64 69 6e  true when readin
226a0 67 20 6f 72 20 77 72 69 74 69 6e 67 20 61 6e 79  g or writing any
226b0 20 6f 74 68 65 72 20 66 69 65 6c 64 0a 2a 2a 20   other field.** 
226c0 69 6e 20 74 68 69 73 20 73 74 72 75 63 74 75 72  in this structur
226d0 65 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 75 6e 69  e..*/.struct uni
226e0 78 53 68 6d 4e 6f 64 65 20 7b 0a 20 20 75 6e 69  xShmNode {.  uni
226f0 78 49 6e 6f 64 65 49 6e 66 6f 20 2a 70 49 6e 6f  xInodeInfo *pIno
22700 64 65 3b 20 20 20 20 20 2f 2a 20 75 6e 69 78 49  de;     /* unixI
22710 6e 6f 64 65 49 6e 66 6f 20 74 68 61 74 20 6f 77  nodeInfo that ow
22720 6e 73 20 74 68 69 73 20 53 48 4d 20 6e 6f 64 65  ns this SHM node
22730 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75   */.  sqlite3_mu
22740 74 65 78 20 2a 6d 75 74 65 78 3b 20 20 20 20 20  tex *mutex;     
22750 20 2f 2a 20 4d 75 74 65 78 20 74 6f 20 61 63 63   /* Mutex to acc
22760 65 73 73 20 74 68 69 73 20 6f 62 6a 65 63 74 20  ess this object 
22770 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 46 69 6c 65  */.  char *zFile
22780 6e 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20 20  name;           
22790 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 6d  /* Name of the m
227a0 6d 61 70 70 65 64 20 66 69 6c 65 20 2a 2f 0a 20  mapped file */. 
227b0 20 69 6e 74 20 68 3b 20 20 20 20 20 20 20 20 20   int h;         
227c0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
227d0 70 65 6e 20 66 69 6c 65 20 64 65 73 63 72 69 70  pen file descrip
227e0 74 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 73 7a 52  tor */.  int szR
227f0 65 67 69 6f 6e 3b 20 20 20 20 20 20 20 20 20 20  egion;          
22800 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 73      /* Size of s
22810 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 72 65 67  hared-memory reg
22820 69 6f 6e 73 20 2a 2f 0a 20 20 75 31 36 20 6e 52  ions */.  u16 nR
22830 65 67 69 6f 6e 3b 20 20 20 20 20 20 20 20 20 20  egion;          
22840 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20       /* Size of 
22850 61 72 72 61 79 20 61 70 52 65 67 69 6f 6e 20 2a  array apRegion *
22860 2f 0a 20 20 75 38 20 69 73 52 65 61 64 6f 6e 6c  /.  u8 isReadonl
22870 79 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  y;             /
22880 2a 20 54 72 75 65 20 69 66 20 72 65 61 64 2d 6f  * True if read-o
22890 6e 6c 79 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a  nly */.  char **
228a0 61 70 52 65 67 69 6f 6e 3b 20 20 20 20 20 20 20  apRegion;       
228b0 20 20 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20      /* Array of 
228c0 6d 61 70 70 65 64 20 73 68 61 72 65 64 2d 6d 65  mapped shared-me
228d0 6d 6f 72 79 20 72 65 67 69 6f 6e 73 20 2a 2f 0a  mory regions */.
228e0 20 20 69 6e 74 20 6e 52 65 66 3b 20 20 20 20 20    int nRef;     
228f0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
22900 4e 75 6d 62 65 72 20 6f 66 20 75 6e 69 78 53 68  Number of unixSh
22910 6d 20 6f 62 6a 65 63 74 73 20 70 6f 69 6e 74 69  m objects pointi
22920 6e 67 20 74 6f 20 74 68 69 73 20 2a 2f 0a 20 20  ng to this */.  
22930 75 6e 69 78 53 68 6d 20 2a 70 46 69 72 73 74 3b  unixShm *pFirst;
22940 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6c             /* Al
22950 6c 20 75 6e 69 78 53 68 6d 20 6f 62 6a 65 63 74  l unixShm object
22960 73 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68  s pointing to th
22970 69 73 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c  is */.#ifdef SQL
22980 49 54 45 5f 44 45 42 55 47 0a 20 20 75 38 20 65  ITE_DEBUG.  u8 e
22990 78 63 6c 4d 61 73 6b 3b 20 20 20 20 20 20 20 20  xclMask;        
229a0 20 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f         /* Mask o
229b0 66 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b  f exclusive lock
229c0 73 20 68 65 6c 64 20 2a 2f 0a 20 20 75 38 20 73  s held */.  u8 s
229d0 68 61 72 65 64 4d 61 73 6b 3b 20 20 20 20 20 20  haredMask;      
229e0 20 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f         /* Mask o
229f0 66 20 73 68 61 72 65 64 20 6c 6f 63 6b 73 20 68  f shared locks h
22a00 65 6c 64 20 2a 2f 0a 20 20 75 38 20 6e 65 78 74  eld */.  u8 next
22a10 53 68 6d 49 64 3b 20 20 20 20 20 20 20 20 20 20  ShmId;          
22a20 20 20 20 20 2f 2a 20 4e 65 78 74 20 61 76 61 69      /* Next avai
22a30 6c 61 62 6c 65 20 75 6e 69 78 53 68 6d 2e 69 64  lable unixShm.id
22a40 20 76 61 6c 75 65 20 2a 2f 0a 23 65 6e 64 69 66   value */.#endif
22a50 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 53 74 72 75 63  .};../*.** Struc
22a60 74 75 72 65 20 75 73 65 64 20 69 6e 74 65 72 6e  ture used intern
22a70 61 6c 6c 79 20 62 79 20 74 68 69 73 20 56 46 53  ally by this VFS
22a80 20 74 6f 20 72 65 63 6f 72 64 20 74 68 65 20 73   to record the s
22a90 74 61 74 65 20 6f 66 20 61 6e 0a 2a 2a 20 6f 70  tate of an.** op
22aa0 65 6e 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79  en shared memory
22ab0 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2a 0a   connection..**.
22ac0 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ** The following
22ad0 20 66 69 65 6c 64 73 20 61 72 65 20 69 6e 69 74   fields are init
22ae0 69 61 6c 69 7a 65 64 20 77 68 65 6e 20 74 68 69  ialized when thi
22af0 73 20 6f 62 6a 65 63 74 20 69 73 20 63 72 65 61  s object is crea
22b00 74 65 64 20 61 6e 64 0a 2a 2a 20 61 72 65 20 72  ted and.** are r
22b10 65 61 64 2d 6f 6e 6c 79 20 74 68 65 72 65 61 66  ead-only thereaf
22b20 74 65 72 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 75 6e  ter:.**.**    un
22b30 69 78 53 68 6d 2e 70 46 69 6c 65 0a 2a 2a 20 20  ixShm.pFile.**  
22b40 20 20 75 6e 69 78 53 68 6d 2e 69 64 0a 2a 2a 0a    unixShm.id.**.
22b50 2a 2a 20 41 6c 6c 20 6f 74 68 65 72 20 66 69 65  ** All other fie
22b60 6c 64 73 20 61 72 65 20 72 65 61 64 2f 77 72 69  lds are read/wri
22b70 74 65 2e 20 20 54 68 65 20 75 6e 69 78 53 68 6d  te.  The unixShm
22b80 2e 70 46 69 6c 65 2d 3e 6d 75 74 65 78 20 6d 75  .pFile->mutex mu
22b90 73 74 20 62 65 20 68 65 6c 64 0a 2a 2a 20 77 68  st be held.** wh
22ba0 69 6c 65 20 61 63 63 65 73 73 69 6e 67 20 61 6e  ile accessing an
22bb0 79 20 72 65 61 64 2f 77 72 69 74 65 20 66 69 65  y read/write fie
22bc0 6c 64 73 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 75  lds..*/.struct u
22bd0 6e 69 78 53 68 6d 20 7b 0a 20 20 75 6e 69 78 53  nixShm {.  unixS
22be0 68 6d 4e 6f 64 65 20 2a 70 53 68 6d 4e 6f 64 65  hmNode *pShmNode
22bf0 3b 20 20 20 20 20 2f 2a 20 54 68 65 20 75 6e 64  ;     /* The und
22c00 65 72 6c 79 69 6e 67 20 75 6e 69 78 53 68 6d 4e  erlying unixShmN
22c10 6f 64 65 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20  ode object */.  
22c20 75 6e 69 78 53 68 6d 20 2a 70 4e 65 78 74 3b 20  unixShm *pNext; 
22c30 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65             /* Ne
22c40 78 74 20 75 6e 69 78 53 68 6d 20 77 69 74 68 20  xt unixShm with 
22c50 74 68 65 20 73 61 6d 65 20 75 6e 69 78 53 68 6d  the same unixShm
22c60 4e 6f 64 65 20 2a 2f 0a 20 20 75 38 20 68 61 73  Node */.  u8 has
22c70 4d 75 74 65 78 3b 20 20 20 20 20 20 20 20 20 20  Mutex;          
22c80 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
22c90 68 6f 6c 64 69 6e 67 20 74 68 65 20 75 6e 69 78  holding the unix
22ca0 53 68 6d 4e 6f 64 65 20 6d 75 74 65 78 20 2a 2f  ShmNode mutex */
22cb0 0a 20 20 75 31 36 20 73 68 61 72 65 64 4d 61 73  .  u16 sharedMas
22cc0 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  k;            /*
22cd0 20 4d 61 73 6b 20 6f 66 20 73 68 61 72 65 64 20   Mask of shared 
22ce0 6c 6f 63 6b 73 20 68 65 6c 64 20 2a 2f 0a 20 20  locks held */.  
22cf0 75 31 36 20 65 78 63 6c 4d 61 73 6b 3b 20 20 20  u16 exclMask;   
22d00 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61             /* Ma
22d10 73 6b 20 6f 66 20 65 78 63 6c 75 73 69 76 65 20  sk of exclusive 
22d20 6c 6f 63 6b 73 20 68 65 6c 64 20 2a 2f 0a 23 69  locks held */.#i
22d30 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
22d40 47 0a 20 20 75 38 20 69 64 3b 20 20 20 20 20 20  G.  u8 id;      
22d50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
22d60 2a 20 49 64 20 6f 66 20 74 68 69 73 20 63 6f 6e  * Id of this con
22d70 6e 65 63 74 69 6f 6e 20 77 69 74 68 69 6e 20 69  nection within i
22d80 74 73 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20 2a  ts unixShmNode *
22d90 2f 0a 23 65 6e 64 69 66 0a 7d 3b 0a 0a 2f 2a 0a  /.#endif.};../*.
22da0 2a 2a 20 43 6f 6e 73 74 61 6e 74 73 20 75 73 65  ** Constants use
22db0 64 20 66 6f 72 20 6c 6f 63 6b 69 6e 67 0a 2a 2f  d for locking.*/
22dc0 0a 23 64 65 66 69 6e 65 20 55 4e 49 58 5f 53 48  .#define UNIX_SH
22dd0 4d 5f 42 41 53 45 20 20 20 28 28 32 32 2b 53 51  M_BASE   ((22+SQ
22de0 4c 49 54 45 5f 53 48 4d 5f 4e 4c 4f 43 4b 29 2a  LITE_SHM_NLOCK)*
22df0 34 29 20 20 20 20 20 20 20 20 20 2f 2a 20 66 69  4)         /* fi
22e00 72 73 74 20 6c 6f 63 6b 20 62 79 74 65 20 2a 2f  rst lock byte */
22e10 0a 23 64 65 66 69 6e 65 20 55 4e 49 58 5f 53 48  .#define UNIX_SH
22e20 4d 5f 44 4d 53 20 20 20 20 28 55 4e 49 58 5f 53  M_DMS    (UNIX_S
22e30 48 4d 5f 42 41 53 45 2b 53 51 4c 49 54 45 5f 53  HM_BASE+SQLITE_S
22e40 48 4d 5f 4e 4c 4f 43 4b 29 20 20 2f 2a 20 64 65  HM_NLOCK)  /* de
22e50 61 64 6d 61 6e 20 73 77 69 74 63 68 20 2a 2f 0a  adman switch */.
22e60 0a 2f 2a 0a 2a 2a 20 41 70 70 6c 79 20 70 6f 73  ./*.** Apply pos
22e70 69 78 20 61 64 76 69 73 6f 72 79 20 6c 6f 63 6b  ix advisory lock
22e80 73 20 66 6f 72 20 61 6c 6c 20 62 79 74 65 73 20  s for all bytes 
22e90 66 72 6f 6d 20 6f 66 73 74 20 74 68 72 6f 75 67  from ofst throug
22ea0 68 20 6f 66 73 74 2b 6e 2d 31 2e 0a 2a 2a 0a 2a  h ofst+n-1..**.*
22eb0 2a 20 4c 6f 63 6b 73 20 62 6c 6f 63 6b 20 69 66  * Locks block if
22ec0 20 74 68 65 20 6d 61 73 6b 20 69 73 20 65 78 61   the mask is exa
22ed0 63 74 6c 79 20 55 4e 49 58 5f 53 48 4d 5f 43 20  ctly UNIX_SHM_C 
22ee0 61 6e 64 20 61 72 65 20 6e 6f 6e 2d 62 6c 6f 63  and are non-bloc
22ef0 6b 69 6e 67 0a 2a 2a 20 6f 74 68 65 72 77 69 73  king.** otherwis
22f00 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
22f10 20 75 6e 69 78 53 68 6d 53 79 73 74 65 6d 4c 6f   unixShmSystemLo
22f20 63 6b 28 0a 20 20 75 6e 69 78 53 68 6d 4e 6f 64  ck(.  unixShmNod
22f30 65 20 2a 70 53 68 6d 4e 6f 64 65 2c 20 2f 2a 20  e *pShmNode, /* 
22f40 41 70 70 6c 79 20 6c 6f 63 6b 73 20 74 6f 20 74  Apply locks to t
22f50 68 69 73 20 6f 70 65 6e 20 73 68 61 72 65 64 2d  his open shared-
22f60 6d 65 6d 6f 72 79 20 73 65 67 6d 65 6e 74 20 2a  memory segment *
22f70 2f 0a 20 20 69 6e 74 20 6c 6f 63 6b 54 79 70 65  /.  int lockType
22f80 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 5f  ,          /* F_
22f90 55 4e 4c 43 4b 2c 20 46 5f 52 44 4c 43 4b 2c 20  UNLCK, F_RDLCK, 
22fa0 6f 72 20 46 5f 57 52 4c 43 4b 20 2a 2f 0a 20 20  or F_WRLCK */.  
22fb0 69 6e 74 20 6f 66 73 74 2c 20 20 20 20 20 20 20  int ofst,       
22fc0 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20         /* First 
22fd0 62 79 74 65 20 6f 66 20 74 68 65 20 6c 6f 63 6b  byte of the lock
22fe0 69 6e 67 20 72 61 6e 67 65 20 2a 2f 0a 20 20 69  ing range */.  i
22ff0 6e 74 20 6e 20 20 20 20 20 20 20 20 20 20 20 20  nt n            
23000 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
23010 6f 66 20 62 79 74 65 73 20 74 6f 20 6c 6f 63 6b  of bytes to lock
23020 20 2a 2f 0a 29 7b 0a 20 20 73 74 72 75 63 74 20   */.){.  struct 
23030 66 6c 6f 63 6b 20 66 3b 20 20 20 20 20 20 20 2f  flock f;       /
23040 2a 20 54 68 65 20 70 6f 73 69 78 20 61 64 76 69  * The posix advi
23050 73 6f 72 79 20 6c 6f 63 6b 69 6e 67 20 73 74 72  sory locking str
23060 75 63 74 75 72 65 20 2a 2f 0a 20 20 69 6e 74 20  ucture */.  int 
23070 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20  rc = SQLITE_OK; 
23080 20 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64 65    /* Result code
23090 20 66 6f 72 6d 20 66 63 6e 74 6c 28 29 20 2a 2f   form fcntl() */
230a0 0a 0a 20 20 2f 2a 20 41 63 63 65 73 73 20 74 6f  ..  /* Access to
230b0 20 74 68 65 20 75 6e 69 78 53 68 6d 4e 6f 64 65   the unixShmNode
230c0 20 6f 62 6a 65 63 74 20 69 73 20 73 65 72 69 61   object is seria
230d0 6c 69 7a 65 64 20 62 79 20 74 68 65 20 63 61 6c  lized by the cal
230e0 6c 65 72 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ler */.  assert(
230f0 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
23100 65 6c 64 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75  eld(pShmNode->mu
23110 74 65 78 29 20 7c 7c 20 70 53 68 6d 4e 6f 64 65  tex) || pShmNode
23120 2d 3e 6e 52 65 66 3d 3d 30 20 29 3b 0a 0a 20 20  ->nRef==0 );..  
23130 2f 2a 20 53 68 61 72 65 64 20 6c 6f 63 6b 73 20  /* Shared locks 
23140 6e 65 76 65 72 20 73 70 61 6e 20 6d 6f 72 65 20  never span more 
23150 74 68 61 6e 20 6f 6e 65 20 62 79 74 65 20 2a 2f  than one byte */
23160 0a 20 20 61 73 73 65 72 74 28 20 6e 3d 3d 31 20  .  assert( n==1 
23170 7c 7c 20 6c 6f 63 6b 54 79 70 65 21 3d 46 5f 52  || lockType!=F_R
23180 44 4c 43 4b 20 29 3b 0a 0a 20 20 2f 2a 20 4c 6f  DLCK );..  /* Lo
23190 63 6b 73 20 61 72 65 20 77 69 74 68 69 6e 20 72  cks are within r
231a0 61 6e 67 65 20 2a 2f 0a 20 20 61 73 73 65 72 74  ange */.  assert
231b0 28 20 6e 3e 3d 31 20 26 26 20 6e 3c 53 51 4c 49  ( n>=1 && n<SQLI
231c0 54 45 5f 53 48 4d 5f 4e 4c 4f 43 4b 20 29 3b 0a  TE_SHM_NLOCK );.
231d0 0a 20 20 69 66 28 20 70 53 68 6d 4e 6f 64 65 2d  .  if( pShmNode-
231e0 3e 68 3e 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20  >h>=0 ){.    /* 
231f0 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 6c  Initialize the l
23200 6f 63 6b 69 6e 67 20 70 61 72 61 6d 65 74 65 72  ocking parameter
23210 73 20 2a 2f 0a 20 20 20 20 6d 65 6d 73 65 74 28  s */.    memset(
23220 26 66 2c 20 30 2c 20 73 69 7a 65 6f 66 28 66 29  &f, 0, sizeof(f)
23230 29 3b 0a 20 20 20 20 66 2e 6c 5f 74 79 70 65 20  );.    f.l_type 
23240 3d 20 6c 6f 63 6b 54 79 70 65 3b 0a 20 20 20 20  = lockType;.    
23250 66 2e 6c 5f 77 68 65 6e 63 65 20 3d 20 53 45 45  f.l_whence = SEE
23260 4b 5f 53 45 54 3b 0a 20 20 20 20 66 2e 6c 5f 73  K_SET;.    f.l_s
23270 74 61 72 74 20 3d 20 6f 66 73 74 3b 0a 20 20 20  tart = ofst;.   
23280 20 66 2e 6c 5f 6c 65 6e 20 3d 20 6e 3b 0a 0a 20   f.l_len = n;.. 
23290 20 20 20 72 63 20 3d 20 6f 73 46 63 6e 74 6c 28     rc = osFcntl(
232a0 70 53 68 6d 4e 6f 64 65 2d 3e 68 2c 20 46 5f 53  pShmNode->h, F_S
232b0 45 54 4c 4b 2c 20 26 66 29 3b 0a 20 20 20 20 72  ETLK, &f);.    r
232c0 63 20 3d 20 28 72 63 21 3d 28 2d 31 29 29 20 3f  c = (rc!=(-1)) ?
232d0 20 53 51 4c 49 54 45 5f 4f 4b 20 3a 20 53 51 4c   SQLITE_OK : SQL
232e0 49 54 45 5f 42 55 53 59 3b 0a 20 20 7d 0a 0a 20  ITE_BUSY;.  }.. 
232f0 20 2f 2a 20 55 70 64 61 74 65 20 74 68 65 20 67   /* Update the g
23300 6c 6f 62 61 6c 20 6c 6f 63 6b 20 73 74 61 74 65  lobal lock state
23310 20 61 6e 64 20 64 6f 20 64 65 62 75 67 20 74 72   and do debug tr
23320 61 63 69 6e 67 20 2a 2f 0a 23 69 66 64 65 66 20  acing */.#ifdef 
23330 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 7b  SQLITE_DEBUG.  {
23340 20 75 31 36 20 6d 61 73 6b 3b 0a 20 20 4f 53 54   u16 mask;.  OST
23350 52 41 43 45 28 28 22 53 48 4d 2d 4c 4f 43 4b 20  RACE(("SHM-LOCK 
23360 22 29 29 3b 0a 20 20 6d 61 73 6b 20 3d 20 28 31  "));.  mask = (1
23370 3c 3c 28 6f 66 73 74 2b 6e 29 29 20 2d 20 28 31  <<(ofst+n)) - (1
23380 3c 3c 6f 66 73 74 29 3b 0a 20 20 69 66 28 20 72  <<ofst);.  if( r
23390 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
233a0 20 20 20 20 69 66 28 20 6c 6f 63 6b 54 79 70 65      if( lockType
233b0 3d 3d 46 5f 55 4e 4c 43 4b 20 29 7b 0a 20 20 20  ==F_UNLCK ){.   
233c0 20 20 20 4f 53 54 52 41 43 45 28 28 22 75 6e 6c     OSTRACE(("unl
233d0 6f 63 6b 20 25 64 20 6f 6b 22 2c 20 6f 66 73 74  ock %d ok", ofst
233e0 29 29 3b 0a 20 20 20 20 20 20 70 53 68 6d 4e 6f  ));.      pShmNo
233f0 64 65 2d 3e 65 78 63 6c 4d 61 73 6b 20 26 3d 20  de->exclMask &= 
23400 7e 6d 61 73 6b 3b 0a 20 20 20 20 20 20 70 53 68  ~mask;.      pSh
23410 6d 4e 6f 64 65 2d 3e 73 68 61 72 65 64 4d 61 73  mNode->sharedMas
23420 6b 20 26 3d 20 7e 6d 61 73 6b 3b 0a 20 20 20 20  k &= ~mask;.    
23430 7d 65 6c 73 65 20 69 66 28 20 6c 6f 63 6b 54 79  }else if( lockTy
23440 70 65 3d 3d 46 5f 52 44 4c 43 4b 20 29 7b 0a 20  pe==F_RDLCK ){. 
23450 20 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 72       OSTRACE(("r
23460 65 61 64 2d 6c 6f 63 6b 20 25 64 20 6f 6b 22 2c  ead-lock %d ok",
23470 20 6f 66 73 74 29 29 3b 0a 20 20 20 20 20 20 70   ofst));.      p
23480 53 68 6d 4e 6f 64 65 2d 3e 65 78 63 6c 4d 61 73  ShmNode->exclMas
23490 6b 20 26 3d 20 7e 6d 61 73 6b 3b 0a 20 20 20 20  k &= ~mask;.    
234a0 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 73 68 61 72    pShmNode->shar
234b0 65 64 4d 61 73 6b 20 7c 3d 20 6d 61 73 6b 3b 0a  edMask |= mask;.
234c0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
234d0 20 61 73 73 65 72 74 28 20 6c 6f 63 6b 54 79 70   assert( lockTyp
234e0 65 3d 3d 46 5f 57 52 4c 43 4b 20 29 3b 0a 20 20  e==F_WRLCK );.  
234f0 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 77 72      OSTRACE(("wr
23500 69 74 65 2d 6c 6f 63 6b 20 25 64 20 6f 6b 22 2c  ite-lock %d ok",
23510 20 6f 66 73 74 29 29 3b 0a 20 20 20 20 20 20 70   ofst));.      p
23520 53 68 6d 4e 6f 64 65 2d 3e 65 78 63 6c 4d 61 73  ShmNode->exclMas
23530 6b 20 7c 3d 20 6d 61 73 6b 3b 0a 20 20 20 20 20  k |= mask;.     
23540 20 70 53 68 6d 4e 6f 64 65 2d 3e 73 68 61 72 65   pShmNode->share
23550 64 4d 61 73 6b 20 26 3d 20 7e 6d 61 73 6b 3b 0a  dMask &= ~mask;.
23560 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20      }.  }else{. 
23570 20 20 20 69 66 28 20 6c 6f 63 6b 54 79 70 65 3d     if( lockType=
23580 3d 46 5f 55 4e 4c 43 4b 20 29 7b 0a 20 20 20 20  =F_UNLCK ){.    
23590 20 20 4f 53 54 52 41 43 45 28 28 22 75 6e 6c 6f    OSTRACE(("unlo
235a0 63 6b 20 25 64 20 66 61 69 6c 65 64 22 2c 20 6f  ck %d failed", o
235b0 66 73 74 29 29 3b 0a 20 20 20 20 7d 65 6c 73 65  fst));.    }else
235c0 20 69 66 28 20 6c 6f 63 6b 54 79 70 65 3d 3d 46   if( lockType==F
235d0 5f 52 44 4c 43 4b 20 29 7b 0a 20 20 20 20 20 20  _RDLCK ){.      
235e0 4f 53 54 52 41 43 45 28 28 22 72 65 61 64 2d 6c  OSTRACE(("read-l
235f0 6f 63 6b 20 66 61 69 6c 65 64 22 29 29 3b 0a 20  ock failed"));. 
23600 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
23610 61 73 73 65 72 74 28 20 6c 6f 63 6b 54 79 70 65  assert( lockType
23620 3d 3d 46 5f 57 52 4c 43 4b 20 29 3b 0a 20 20 20  ==F_WRLCK );.   
23630 20 20 20 4f 53 54 52 41 43 45 28 28 22 77 72 69     OSTRACE(("wri
23640 74 65 2d 6c 6f 63 6b 20 25 64 20 66 61 69 6c 65  te-lock %d faile
23650 64 22 2c 20 6f 66 73 74 29 29 3b 0a 20 20 20 20  d", ofst));.    
23660 7d 0a 20 20 7d 0a 20 20 4f 53 54 52 41 43 45 28  }.  }.  OSTRACE(
23670 28 22 20 2d 20 61 66 74 65 72 77 61 72 64 73 20  (" - afterwards 
23680 25 30 33 78 2c 25 30 33 78 5c 6e 22 2c 0a 20 20  %03x,%03x\n",.  
23690 20 20 20 20 20 20 20 20 20 70 53 68 6d 4e 6f 64           pShmNod
236a0 65 2d 3e 73 68 61 72 65 64 4d 61 73 6b 2c 20 70  e->sharedMask, p
236b0 53 68 6d 4e 6f 64 65 2d 3e 65 78 63 6c 4d 61 73  ShmNode->exclMas
236c0 6b 29 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  k));.  }.#endif.
236d0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 20 20 20  .  return rc;   
236e0 20 20 20 20 20 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20       .}.../*.** 
236f0 50 75 72 67 65 20 74 68 65 20 75 6e 69 78 53 68  Purge the unixSh
23700 6d 4e 6f 64 65 4c 69 73 74 20 6c 69 73 74 20 6f  mNodeList list o
23710 66 20 61 6c 6c 20 65 6e 74 72 69 65 73 20 77 69  f all entries wi
23720 74 68 20 75 6e 69 78 53 68 6d 4e 6f 64 65 2e 6e  th unixShmNode.n
23730 52 65 66 3d 3d 30 2e 0a 2a 2a 0a 2a 2a 20 54 68  Ref==0..**.** Th
23740 69 73 20 69 73 20 6e 6f 74 20 61 20 56 46 53 20  is is not a VFS 
23750 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 6d 65  shared-memory me
23760 74 68 6f 64 3b 20 69 74 20 69 73 20 61 20 75 74  thod; it is a ut
23770 69 6c 69 74 79 20 66 75 6e 63 74 69 6f 6e 20 63  ility function c
23780 61 6c 6c 65 64 0a 2a 2a 20 62 79 20 56 46 53 20  alled.** by VFS 
23790 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 6d 65  shared-memory me
237a0 74 68 6f 64 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  thods..*/.static
237b0 20 76 6f 69 64 20 75 6e 69 78 53 68 6d 50 75 72   void unixShmPur
237c0 67 65 28 75 6e 69 78 46 69 6c 65 20 2a 70 46 64  ge(unixFile *pFd
237d0 29 7b 0a 20 20 75 6e 69 78 53 68 6d 4e 6f 64 65  ){.  unixShmNode
237e0 20 2a 70 20 3d 20 70 46 64 2d 3e 70 49 6e 6f 64   *p = pFd->pInod
237f0 65 2d 3e 70 53 68 6d 4e 6f 64 65 3b 0a 20 20 61  e->pShmNode;.  a
23800 73 73 65 72 74 28 20 75 6e 69 78 4d 75 74 65 78  ssert( unixMutex
23810 48 65 6c 64 28 29 20 29 3b 0a 20 20 69 66 28 20  Held() );.  if( 
23820 70 20 26 26 20 70 2d 3e 6e 52 65 66 3d 3d 30 20  p && p->nRef==0 
23830 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20  ){.    int i;.  
23840 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 49 6e    assert( p->pIn
23850 6f 64 65 3d 3d 70 46 64 2d 3e 70 49 6e 6f 64 65  ode==pFd->pInode
23860 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   );.    sqlite3_
23870 6d 75 74 65 78 5f 66 72 65 65 28 70 2d 3e 6d 75  mutex_free(p->mu
23880 74 65 78 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d  tex);.    for(i=
23890 30 3b 20 69 3c 70 2d 3e 6e 52 65 67 69 6f 6e 3b  0; i<p->nRegion;
238a0 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28   i++){.      if(
238b0 20 70 2d 3e 68 3e 3d 30 20 29 7b 0a 20 20 20 20   p->h>=0 ){.    
238c0 20 20 20 20 6d 75 6e 6d 61 70 28 70 2d 3e 61 70      munmap(p->ap
238d0 52 65 67 69 6f 6e 5b 69 5d 2c 20 70 2d 3e 73 7a  Region[i], p->sz
238e0 52 65 67 69 6f 6e 29 3b 0a 20 20 20 20 20 20 7d  Region);.      }
238f0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71  else{.        sq
23900 6c 69 74 65 33 5f 66 72 65 65 28 70 2d 3e 61 70  lite3_free(p->ap
23910 52 65 67 69 6f 6e 5b 69 5d 29 3b 0a 20 20 20 20  Region[i]);.    
23920 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71    }.    }.    sq
23930 6c 69 74 65 33 5f 66 72 65 65 28 70 2d 3e 61 70  lite3_free(p->ap
23940 52 65 67 69 6f 6e 29 3b 0a 20 20 20 20 69 66 28  Region);.    if(
23950 20 70 2d 3e 68 3e 3d 30 20 29 7b 0a 20 20 20 20   p->h>=0 ){.    
23960 20 20 72 6f 62 75 73 74 5f 63 6c 6f 73 65 28 70    robust_close(p
23970 46 64 2c 20 70 2d 3e 68 2c 20 5f 5f 4c 49 4e 45  Fd, p->h, __LINE
23980 5f 5f 29 3b 0a 20 20 20 20 20 20 70 2d 3e 68 20  __);.      p->h 
23990 3d 20 2d 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20  = -1;.    }.    
239a0 70 2d 3e 70 49 6e 6f 64 65 2d 3e 70 53 68 6d 4e  p->pInode->pShmN
239b0 6f 64 65 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c  ode = 0;.    sql
239c0 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 20 20  ite3_free(p);.  
239d0 7d 0a 7d 0a 0a 73 74 61 74 69 63 20 63 6f 6e 73  }.}..static cons
239e0 74 20 63 68 61 72 20 2a 70 72 6f 78 79 53 68 61  t char *proxySha
239f0 72 65 64 4d 65 6d 6f 72 79 42 61 73 65 50 61 74  redMemoryBasePat
23a00 68 28 75 6e 69 78 46 69 6c 65 20 2a 29 3b 0a 0a  h(unixFile *);..
23a10 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20 73 68 61  /*.** Open a sha
23a20 72 65 64 2d 6d 65 6d 6f 72 79 20 61 72 65 61 20  red-memory area 
23a30 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
23a40 6f 70 65 6e 20 64 61 74 61 62 61 73 65 20 66 69  open database fi
23a50 6c 65 20 70 44 62 46 64 2e 20 20 0a 2a 2a 20 54  le pDbFd.  .** T
23a60 68 69 73 20 70 61 72 74 69 63 75 6c 61 72 20 69  his particular i
23a70 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 75 73  mplementation us
23a80 65 73 20 6d 6d 61 70 70 65 64 20 66 69 6c 65 73  es mmapped files
23a90 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 69 6c 65  ..**.** The file
23aa0 20 75 73 65 64 20 74 6f 20 69 6d 70 6c 65 6d 65   used to impleme
23ab0 6e 74 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79  nt shared-memory
23ac0 20 69 73 20 69 6e 20 74 68 65 20 73 61 6d 65 20   is in the same 
23ad0 64 69 72 65 63 74 6f 72 79 0a 2a 2a 20 61 73 20  directory.** as 
23ae0 74 68 65 20 6f 70 65 6e 20 64 61 74 61 62 61 73  the open databas
23af0 65 20 66 69 6c 65 20 61 6e 64 20 68 61 73 20 74  e file and has t
23b00 68 65 20 73 61 6d 65 20 6e 61 6d 65 20 61 73 20  he same name as 
23b10 74 68 65 20 6f 70 65 6e 20 64 61 74 61 62 61 73  the open databas
23b20 65 0a 2a 2a 20 66 69 6c 65 20 77 69 74 68 20 74  e.** file with t
23b30 68 65 20 22 2d 73 68 6d 22 20 73 75 66 66 69 78  he "-shm" suffix
23b40 20 61 64 64 65 64 2e 20 20 46 6f 72 20 65 78 61   added.  For exa
23b50 6d 70 6c 65 2c 20 69 66 20 74 68 65 20 64 61 74  mple, if the dat
23b60 61 62 61 73 65 20 66 69 6c 65 0a 2a 2a 20 69 73  abase file.** is
23b70 20 22 2f 68 6f 6d 65 2f 75 73 65 72 31 2f 63 6f   "/home/user1/co
23b80 6e 66 69 67 2e 64 62 22 20 74 68 65 6e 20 74 68  nfig.db" then th
23b90 65 20 66 69 6c 65 20 74 68 61 74 20 69 73 20 63  e file that is c
23ba0 72 65 61 74 65 64 20 61 6e 64 20 6d 6d 61 70 70  reated and mmapp
23bb0 65 64 0a 2a 2a 20 66 6f 72 20 73 68 61 72 65 64  ed.** for shared
23bc0 20 6d 65 6d 6f 72 79 20 77 69 6c 6c 20 62 65 20   memory will be 
23bd0 63 61 6c 6c 65 64 20 22 2f 68 6f 6d 65 2f 75 73  called "/home/us
23be0 65 72 31 2f 63 6f 6e 66 69 67 2e 64 62 2d 73 68  er1/config.db-sh
23bf0 6d 22 2e 20 20 0a 2a 2a 0a 2a 2a 20 41 6e 6f 74  m".  .**.** Anot
23c00 68 65 72 20 61 70 70 72 6f 61 63 68 20 74 6f 20  her approach to 
23c10 69 73 20 74 6f 20 75 73 65 20 66 69 6c 65 73 20  is to use files 
23c20 69 6e 20 2f 64 65 76 2f 73 68 6d 20 6f 72 20 2f  in /dev/shm or /
23c30 64 65 76 2f 74 6d 70 20 6f 72 20 61 6e 0a 2a 2a  dev/tmp or an.**
23c40 20 73 6f 6d 65 20 6f 74 68 65 72 20 74 6d 70 66   some other tmpf
23c50 73 20 6d 6f 75 6e 74 2e 20 42 75 74 20 69 66 20  s mount. But if 
23c60 61 20 66 69 6c 65 20 69 6e 20 61 20 64 69 66 66  a file in a diff
23c70 65 72 65 6e 74 20 64 69 72 65 63 74 6f 72 79 0a  erent directory.
23c80 2a 2a 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61  ** from the data
23c90 62 61 73 65 20 66 69 6c 65 20 69 73 20 75 73 65  base file is use
23ca0 64 2c 20 74 68 65 6e 20 64 69 66 66 65 72 69 6e  d, then differin
23cb0 67 20 61 63 63 65 73 73 20 70 65 72 6d 69 73 73  g access permiss
23cc0 69 6f 6e 73 0a 2a 2a 20 6f 72 20 61 20 63 68 72  ions.** or a chr
23cd0 6f 6f 74 28 29 20 6d 69 67 68 74 20 63 61 75 73  oot() might caus
23ce0 65 20 74 77 6f 20 64 69 66 66 65 72 65 6e 74 20  e two different 
23cf0 70 72 6f 63 65 73 73 65 73 20 6f 6e 20 74 68 65  processes on the
23d00 20 73 61 6d 65 0a 2a 2a 20 64 61 74 61 62 61 73   same.** databas
23d10 65 20 74 6f 20 65 6e 64 20 75 70 20 75 73 69 6e  e to end up usin
23d20 67 20 64 69 66 66 65 72 65 6e 74 20 66 69 6c 65  g different file
23d30 73 20 66 6f 72 20 73 68 61 72 65 64 20 6d 65 6d  s for shared mem
23d40 6f 72 79 20 2d 20 0a 2a 2a 20 6d 65 61 6e 69 6e  ory - .** meanin
23d50 67 20 74 68 61 74 20 74 68 65 69 72 20 6d 65 6d  g that their mem
23d60 6f 72 79 20 77 6f 75 6c 64 20 6e 6f 74 20 72 65  ory would not re
23d70 61 6c 6c 79 20 62 65 20 73 68 61 72 65 64 20 2d  ally be shared -
23d80 20 72 65 73 75 6c 74 69 6e 67 0a 2a 2a 20 69 6e   resulting.** in
23d90 20 64 61 74 61 62 61 73 65 20 63 6f 72 72 75 70   database corrup
23da0 74 69 6f 6e 2e 20 20 4e 65 76 65 72 74 68 65 6c  tion.  Neverthel
23db0 65 73 73 2c 20 74 68 69 73 20 74 6d 70 66 73 20  ess, this tmpfs 
23dc0 66 69 6c 65 20 75 73 61 67 65 0a 2a 2a 20 63 61  file usage.** ca
23dd0 6e 20 62 65 20 65 6e 61 62 6c 65 64 20 61 74 20  n be enabled at 
23de0 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 75 73 69  compile-time usi
23df0 6e 67 20 2d 44 53 51 4c 49 54 45 5f 53 48 4d 5f  ng -DSQLITE_SHM_
23e00 44 49 52 45 43 54 4f 52 59 3d 22 2f 64 65 76 2f  DIRECTORY="/dev/
23e10 73 68 6d 22 0a 2a 2a 20 6f 72 20 74 68 65 20 65  shm".** or the e
23e20 71 75 69 76 61 6c 65 6e 74 2e 20 20 54 68 65 20  quivalent.  The 
23e30 75 73 65 20 6f 66 20 74 68 65 20 53 51 4c 49 54  use of the SQLIT
23e40 45 5f 53 48 4d 5f 44 49 52 45 43 54 4f 52 59 20  E_SHM_DIRECTORY 
23e50 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 0a 2a 2a 20  compile-time.** 
23e60 6f 70 74 69 6f 6e 20 72 65 73 75 6c 74 73 20 69  option results i
23e70 6e 20 61 6e 20 69 6e 63 6f 6d 70 61 74 69 62 6c  n an incompatibl
23e80 65 20 62 75 69 6c 64 20 6f 66 20 53 51 4c 69 74  e build of SQLit
23e90 65 3b 20 20 62 75 69 6c 64 73 20 6f 66 20 53 51  e;  builds of SQ
23ea0 4c 69 74 65 0a 2a 2a 20 74 68 61 74 20 77 69 74  Lite.** that wit
23eb0 68 20 64 69 66 66 65 72 69 6e 67 20 53 51 4c 49  h differing SQLI
23ec0 54 45 5f 53 48 4d 5f 44 49 52 45 43 54 4f 52 59  TE_SHM_DIRECTORY
23ed0 20 73 65 74 74 69 6e 67 73 20 61 74 74 65 6d 70   settings attemp
23ee0 74 20 74 6f 20 75 73 65 20 74 68 65 0a 2a 2a 20  t to use the.** 
23ef0 73 61 6d 65 20 64 61 74 61 62 61 73 65 20 66 69  same database fi
23f00 6c 65 20 61 74 20 74 68 65 20 73 61 6d 65 20 74  le at the same t
23f10 69 6d 65 2c 20 64 61 74 61 62 61 73 65 20 63 6f  ime, database co
23f20 72 72 75 70 74 69 6f 6e 20 77 69 6c 6c 20 6c 69  rruption will li
23f30 6b 65 6c 79 0a 2a 2a 20 72 65 73 75 6c 74 2e 20  kely.** result. 
23f40 54 68 65 20 53 51 4c 49 54 45 5f 53 48 4d 5f 44  The SQLITE_SHM_D
23f50 49 52 45 43 54 4f 52 59 20 63 6f 6d 70 69 6c 65  IRECTORY compile
23f60 2d 74 69 6d 65 20 6f 70 74 69 6f 6e 20 69 73 20  -time option is 
23f70 63 6f 6e 73 69 64 65 72 65 64 0a 2a 2a 20 22 75  considered.** "u
23f80 6e 73 75 70 70 6f 72 74 65 64 22 20 61 6e 64 20  nsupported" and 
23f90 6d 61 79 20 67 6f 20 61 77 61 79 20 69 6e 20 61  may go away in a
23fa0 20 66 75 74 75 72 65 20 53 51 4c 69 74 65 20 72   future SQLite r
23fb0 65 6c 65 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 57 68  elease..**.** Wh
23fc0 65 6e 20 6f 70 65 6e 69 6e 67 20 61 20 6e 65 77  en opening a new
23fd0 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 66   shared-memory f
23fe0 69 6c 65 2c 20 69 66 20 6e 6f 20 6f 74 68 65 72  ile, if no other
23ff0 20 69 6e 73 74 61 6e 63 65 73 20 6f 66 20 74 68   instances of th
24000 61 74 0a 2a 2a 20 66 69 6c 65 20 61 72 65 20 63  at.** file are c
24010 75 72 72 65 6e 74 6c 79 20 6f 70 65 6e 2c 20 69  urrently open, i
24020 6e 20 74 68 69 73 20 70 72 6f 63 65 73 73 20 6f  n this process o
24030 72 20 69 6e 20 6f 74 68 65 72 20 70 72 6f 63 65  r in other proce
24040 73 73 65 73 2c 20 74 68 65 6e 0a 2a 2a 20 74 68  sses, then.** th
24050 65 20 66 69 6c 65 20 6d 75 73 74 20 62 65 20 74  e file must be t
24060 72 75 6e 63 61 74 65 64 20 74 6f 20 7a 65 72 6f  runcated to zero
24070 20 6c 65 6e 67 74 68 20 6f 72 20 68 61 76 65 20   length or have 
24080 69 74 73 20 68 65 61 64 65 72 20 63 6c 65 61 72  its header clear
24090 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ed..**.** If the
240a0 20 6f 72 69 67 69 6e 61 6c 20 64 61 74 61 62 61   original databa
240b0 73 65 20 66 69 6c 65 20 28 70 44 62 46 64 29 20  se file (pDbFd) 
240c0 69 73 20 75 73 69 6e 67 20 74 68 65 20 22 75 6e  is using the "un
240d0 69 78 2d 65 78 63 6c 22 20 56 46 53 0a 2a 2a 20  ix-excl" VFS.** 
240e0 74 68 61 74 20 6d 65 61 6e 73 20 74 68 61 74 20  that means that 
240f0 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63  an exclusive loc
24100 6b 20 69 73 20 68 65 6c 64 20 6f 6e 20 74 68 65  k is held on the
24110 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 61   database file a
24120 6e 64 0a 2a 2a 20 74 68 61 74 20 6e 6f 20 6f 74  nd.** that no ot
24130 68 65 72 20 70 72 6f 63 65 73 73 65 73 20 61 72  her processes ar
24140 65 20 61 62 6c 65 20 74 6f 20 72 65 61 64 20 6f  e able to read o
24150 72 20 77 72 69 74 65 20 74 68 65 20 64 61 74 61  r write the data
24160 62 61 73 65 2e 20 20 49 6e 0a 2a 2a 20 74 68 61  base.  In.** tha
24170 74 20 63 61 73 65 2c 20 77 65 20 64 6f 20 6e 6f  t case, we do no
24180 74 20 72 65 61 6c 6c 79 20 6e 65 65 64 20 73 68  t really need sh
24190 61 72 65 64 20 6d 65 6d 6f 72 79 2e 20 20 4e 6f  ared memory.  No
241a0 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 0a 2a   shared memory.*
241b0 2a 20 66 69 6c 65 20 69 73 20 63 72 65 61 74 65  * file is create
241c0 64 2e 20 20 54 68 65 20 73 68 61 72 65 64 20 6d  d.  The shared m
241d0 65 6d 6f 72 79 20 77 69 6c 6c 20 62 65 20 73 69  emory will be si
241e0 6d 75 6c 61 74 65 64 20 77 69 74 68 20 68 65 61  mulated with hea
241f0 70 20 6d 65 6d 6f 72 79 2e 0a 2a 2f 0a 73 74 61  p memory..*/.sta
24200 74 69 63 20 69 6e 74 20 75 6e 69 78 4f 70 65 6e  tic int unixOpen
24210 53 68 61 72 65 64 4d 65 6d 6f 72 79 28 75 6e 69  SharedMemory(uni
24220 78 46 69 6c 65 20 2a 70 44 62 46 64 29 7b 0a 20  xFile *pDbFd){. 
24230 20 73 74 72 75 63 74 20 75 6e 69 78 53 68 6d 20   struct unixShm 
24240 2a 70 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  *p = 0;         
24250 20 2f 2a 20 54 68 65 20 63 6f 6e 6e 65 63 74 69   /* The connecti
24260 6f 6e 20 74 6f 20 62 65 20 6f 70 65 6e 65 64 20  on to be opened 
24270 2a 2f 0a 20 20 73 74 72 75 63 74 20 75 6e 69 78  */.  struct unix
24280 53 68 6d 4e 6f 64 65 20 2a 70 53 68 6d 4e 6f 64  ShmNode *pShmNod
24290 65 3b 20 20 20 2f 2a 20 54 68 65 20 75 6e 64 65  e;   /* The unde
242a0 72 6c 79 69 6e 67 20 6d 6d 61 70 70 65 64 20 66  rlying mmapped f
242b0 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b  ile */.  int rc;
242c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
242d0 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75           /* Resu
242e0 6c 74 20 63 6f 64 65 20 2a 2f 0a 20 20 75 6e 69  lt code */.  uni
242f0 78 49 6e 6f 64 65 49 6e 66 6f 20 2a 70 49 6e 6f  xInodeInfo *pIno
24300 64 65 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  de;          /* 
24310 54 68 65 20 69 6e 6f 64 65 20 6f 66 20 66 64 20  The inode of fd 
24320 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 53 68 6d 46  */.  char *zShmF
24330 69 6c 65 6e 61 6d 65 3b 20 20 20 20 20 20 20 20  ilename;        
24340 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20       /* Name of 
24350 74 68 65 20 66 69 6c 65 20 75 73 65 64 20 66 6f  the file used fo
24360 72 20 53 48 4d 20 2a 2f 0a 20 20 69 6e 74 20 6e  r SHM */.  int n
24370 53 68 6d 46 69 6c 65 6e 61 6d 65 3b 20 20 20 20  ShmFilename;    
24380 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69             /* Si
24390 7a 65 20 6f 66 20 74 68 65 20 53 48 4d 20 66 69  ze of the SHM fi
243a0 6c 65 6e 61 6d 65 20 69 6e 20 62 79 74 65 73 20  lename in bytes 
243b0 2a 2f 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74  */..  /* Allocat
243c0 65 20 73 70 61 63 65 20 66 6f 72 20 74 68 65 20  e space for the 
243d0 6e 65 77 20 75 6e 69 78 53 68 6d 20 6f 62 6a 65  new unixShm obje
243e0 63 74 2e 20 2a 2f 0a 20 20 70 20 3d 20 73 71 6c  ct. */.  p = sql
243f0 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 20 73 69 7a  ite3_malloc( siz
24400 65 6f 66 28 2a 70 29 20 29 3b 0a 20 20 69 66 28  eof(*p) );.  if(
24410 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53   p==0 ) return S
24420 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 6d  QLITE_NOMEM;.  m
24430 65 6d 73 65 74 28 70 2c 20 30 2c 20 73 69 7a 65  emset(p, 0, size
24440 6f 66 28 2a 70 29 29 3b 0a 20 20 61 73 73 65 72  of(*p));.  asser
24450 74 28 20 70 44 62 46 64 2d 3e 70 53 68 6d 3d 3d  t( pDbFd->pShm==
24460 30 20 29 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b  0 );..  /* Check
24470 20 74 6f 20 73 65 65 20 69 66 20 61 20 75 6e 69   to see if a uni
24480 78 53 68 6d 4e 6f 64 65 20 6f 62 6a 65 63 74 20  xShmNode object 
24490 61 6c 72 65 61 64 79 20 65 78 69 73 74 73 2e 20  already exists. 
244a0 52 65 75 73 65 20 61 6e 20 65 78 69 73 74 69 6e  Reuse an existin
244b0 67 0a 20 20 2a 2a 20 6f 6e 65 20 69 66 20 70 72  g.  ** one if pr
244c0 65 73 65 6e 74 2e 20 43 72 65 61 74 65 20 61 20  esent. Create a 
244d0 6e 65 77 20 6f 6e 65 20 69 66 20 6e 65 63 65 73  new one if neces
244e0 73 61 72 79 2e 0a 20 20 2a 2f 0a 20 20 75 6e 69  sary..  */.  uni
244f0 78 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 20  xEnterMutex();. 
24500 20 70 49 6e 6f 64 65 20 3d 20 70 44 62 46 64 2d   pInode = pDbFd-
24510 3e 70 49 6e 6f 64 65 3b 0a 20 20 70 53 68 6d 4e  >pInode;.  pShmN
24520 6f 64 65 20 3d 20 70 49 6e 6f 64 65 2d 3e 70 53  ode = pInode->pS
24530 68 6d 4e 6f 64 65 3b 0a 20 20 69 66 28 20 70 53  hmNode;.  if( pS
24540 68 6d 4e 6f 64 65 3d 3d 30 20 29 7b 0a 20 20 20  hmNode==0 ){.   
24550 20 73 74 72 75 63 74 20 73 74 61 74 20 73 53 74   struct stat sSt
24560 61 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  at;             
24570 20 20 20 20 2f 2a 20 66 73 74 61 74 28 29 20 69      /* fstat() i
24580 6e 66 6f 20 66 6f 72 20 64 61 74 61 62 61 73 65  nfo for database
24590 20 66 69 6c 65 20 2a 2f 0a 0a 20 20 20 20 2f 2a   file */..    /*
245a0 20 43 61 6c 6c 20 66 73 74 61 74 28 29 20 74 6f   Call fstat() to
245b0 20 66 69 67 75 72 65 20 6f 75 74 20 74 68 65 20   figure out the 
245c0 70 65 72 6d 69 73 73 69 6f 6e 73 20 6f 6e 20 74  permissions on t
245d0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
245e0 2e 20 49 66 0a 20 20 20 20 2a 2a 20 61 20 6e 65  . If.    ** a ne
245f0 77 20 2a 2d 73 68 6d 20 66 69 6c 65 20 69 73 20  w *-shm file is 
24600 63 72 65 61 74 65 64 2c 20 61 6e 20 61 74 74 65  created, an atte
24610 6d 70 74 20 77 69 6c 6c 20 62 65 20 6d 61 64 65  mpt will be made
24620 20 74 6f 20 63 72 65 61 74 65 20 69 74 0a 20 20   to create it.  
24630 20 20 2a 2a 20 77 69 74 68 20 74 68 65 20 73 61    ** with the sa
24640 6d 65 20 70 65 72 6d 69 73 73 69 6f 6e 73 2e 20  me permissions. 
24650 54 68 65 20 61 63 74 75 61 6c 20 70 65 72 6d 69  The actual permi
24660 73 73 69 6f 6e 73 20 74 68 65 20 66 69 6c 65 20  ssions the file 
24670 69 73 20 63 72 65 61 74 65 64 0a 20 20 20 20 2a  is created.    *
24680 2a 20 77 69 74 68 20 61 72 65 20 73 75 62 6a 65  * with are subje
24690 63 74 20 74 6f 20 74 68 65 20 63 75 72 72 65 6e  ct to the curren
246a0 74 20 75 6d 61 73 6b 20 73 65 74 74 69 6e 67 2e  t umask setting.
246b0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
246c0 6f 73 46 73 74 61 74 28 70 44 62 46 64 2d 3e 68  osFstat(pDbFd->h
246d0 2c 20 26 73 53 74 61 74 29 20 26 26 20 70 49 6e  , &sStat) && pIn
246e0 6f 64 65 2d 3e 62 50 72 6f 63 65 73 73 4c 6f 63  ode->bProcessLoc
246f0 6b 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 63  k==0 ){.      rc
24700 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f   = SQLITE_IOERR_
24710 46 53 54 41 54 3b 0a 20 20 20 20 20 20 67 6f 74  FSTAT;.      got
24720 6f 20 73 68 6d 5f 6f 70 65 6e 5f 65 72 72 3b 0a  o shm_open_err;.
24730 20 20 20 20 7d 0a 0a 20 20 20 20 63 6f 6e 73 74      }..    const
24740 20 63 68 61 72 20 2a 7a 42 61 73 65 50 61 74 68   char *zBasePath
24750 20 3d 20 70 44 62 46 64 2d 3e 7a 50 61 74 68 3b   = pDbFd->zPath;
24760 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 41  .#if defined(__A
24770 50 50 4c 45 5f 5f 29 20 26 26 20 53 51 4c 49 54  PPLE__) && SQLIT
24780 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47  E_ENABLE_LOCKING
24790 5f 53 54 59 4c 45 0a 20 20 20 20 2f 2a 20 49 66  _STYLE.    /* If
247a0 20 70 44 62 46 64 20 69 73 20 63 6f 6e 66 69 67   pDbFd is config
247b0 75 72 65 64 20 77 69 74 68 20 70 72 6f 78 79 20  ured with proxy 
247c0 6c 6f 63 6b 69 6e 67 20 6d 6f 64 65 2c 20 75 73  locking mode, us
247d0 65 20 74 68 65 20 6c 6f 63 61 6c 20 0a 20 20 20  e the local .   
247e0 20 20 2a 2a 20 6c 6f 63 6b 20 66 69 6c 65 20 70    ** lock file p
247f0 61 74 68 20 74 6f 20 64 65 74 65 72 6d 69 6e 65  ath to determine
24800 20 74 68 65 20 2d 73 68 6d 20 66 69 6c 65 20 70   the -shm file p
24810 61 74 68 0a 20 20 20 20 20 2a 2f 0a 20 20 20 20  ath.     */.    
24820 69 66 28 20 69 73 50 72 6f 78 79 4c 6f 63 6b 69  if( isProxyLocki
24830 6e 67 4d 6f 64 65 28 70 44 62 46 64 29 20 29 7b  ngMode(pDbFd) ){
24840 0a 20 20 20 20 20 20 7a 42 61 73 65 50 61 74 68  .      zBasePath
24850 20 3d 20 70 72 6f 78 79 53 68 61 72 65 64 4d 65   = proxySharedMe
24860 6d 6f 72 79 42 61 73 65 50 61 74 68 28 70 44 62  moryBasePath(pDb
24870 46 64 29 3b 0a 20 20 20 20 20 20 69 66 28 20 21  Fd);.      if( !
24880 7a 42 61 73 65 50 61 74 68 20 29 7b 0a 20 20 20  zBasePath ){.   
24890 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
248a0 5f 43 41 4e 54 4f 50 45 4e 5f 42 4b 50 54 3b 0a  _CANTOPEN_BKPT;.
248b0 20 20 20 20 20 20 20 20 67 6f 74 6f 20 73 68 6d          goto shm
248c0 5f 6f 70 65 6e 5f 65 72 72 3b 0a 20 20 20 20 20  _open_err;.     
248d0 20 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a   }.    }.#endif.
248e0 20 20 20 20 0a 23 69 66 64 65 66 20 53 51 4c 49      .#ifdef SQLI
248f0 54 45 5f 53 48 4d 5f 44 49 52 45 43 54 4f 52 59  TE_SHM_DIRECTORY
24900 0a 20 20 20 20 6e 53 68 6d 46 69 6c 65 6e 61 6d  .    nShmFilenam
24910 65 20 3d 20 73 69 7a 65 6f 66 28 53 51 4c 49 54  e = sizeof(SQLIT
24920 45 5f 53 48 4d 5f 44 49 52 45 43 54 4f 52 59 29  E_SHM_DIRECTORY)
24930 20 2b 20 33 30 3b 0a 23 65 6c 73 65 0a 20 20 20   + 30;.#else.   
24940 20 6e 53 68 6d 46 69 6c 65 6e 61 6d 65 20 3d 20   nShmFilename = 
24950 35 20 2b 20 28 69 6e 74 29 73 74 72 6c 65 6e 28  5 + (int)strlen(
24960 7a 42 61 73 65 50 61 74 68 29 3b 0a 23 65 6e 64  zBasePath);.#end
24970 69 66 0a 20 20 20 20 70 53 68 6d 4e 6f 64 65 20  if.    pShmNode 
24980 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63  = sqlite3_malloc
24990 28 20 73 69 7a 65 6f 66 28 2a 70 53 68 6d 4e 6f  ( sizeof(*pShmNo
249a0 64 65 29 20 2b 20 6e 53 68 6d 46 69 6c 65 6e 61  de) + nShmFilena
249b0 6d 65 20 29 3b 0a 20 20 20 20 69 66 28 20 70 53  me );.    if( pS
249c0 68 6d 4e 6f 64 65 3d 3d 30 20 29 7b 0a 20 20 20  hmNode==0 ){.   
249d0 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e     rc = SQLITE_N
249e0 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 67 6f 74 6f  OMEM;.      goto
249f0 20 73 68 6d 5f 6f 70 65 6e 5f 65 72 72 3b 0a 20   shm_open_err;. 
24a00 20 20 20 7d 0a 20 20 20 20 6d 65 6d 73 65 74 28     }.    memset(
24a10 70 53 68 6d 4e 6f 64 65 2c 20 30 2c 20 73 69 7a  pShmNode, 0, siz
24a20 65 6f 66 28 2a 70 53 68 6d 4e 6f 64 65 29 29 3b  eof(*pShmNode));
24a30 0a 20 20 20 20 7a 53 68 6d 46 69 6c 65 6e 61 6d  .    zShmFilenam
24a40 65 20 3d 20 70 53 68 6d 4e 6f 64 65 2d 3e 7a 46  e = pShmNode->zF
24a50 69 6c 65 6e 61 6d 65 20 3d 20 28 63 68 61 72 2a  ilename = (char*
24a60 29 26 70 53 68 6d 4e 6f 64 65 5b 31 5d 3b 0a 23  )&pShmNode[1];.#
24a70 69 66 64 65 66 20 53 51 4c 49 54 45 5f 53 48 4d  ifdef SQLITE_SHM
24a80 5f 44 49 52 45 43 54 4f 52 59 0a 20 20 20 20 73  _DIRECTORY.    s
24a90 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
24aa0 6e 53 68 6d 46 69 6c 65 6e 61 6d 65 2c 20 7a 53  nShmFilename, zS
24ab0 68 6d 46 69 6c 65 6e 61 6d 65 2c 20 0a 20 20 20  hmFilename, .   
24ac0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24ad0 20 20 53 51 4c 49 54 45 5f 53 48 4d 5f 44 49 52    SQLITE_SHM_DIR
24ae0 45 43 54 4f 52 59 20 22 2f 73 71 6c 69 74 65 2d  ECTORY "/sqlite-
24af0 73 68 6d 2d 25 78 2d 25 78 22 2c 0a 20 20 20 20  shm-%x-%x",.    
24b00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24b10 20 28 75 33 32 29 73 53 74 61 74 2e 73 74 5f 69   (u32)sStat.st_i
24b20 6e 6f 2c 20 28 75 33 32 29 73 53 74 61 74 2e 73  no, (u32)sStat.s
24b30 74 5f 64 65 76 29 3b 0a 23 65 6c 73 65 0a 20 20  t_dev);.#else.  
24b40 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
24b50 74 66 28 6e 53 68 6d 46 69 6c 65 6e 61 6d 65 2c  tf(nShmFilename,
24b60 20 7a 53 68 6d 46 69 6c 65 6e 61 6d 65 2c 20 22   zShmFilename, "
24b70 25 73 2d 73 68 6d 22 2c 20 7a 42 61 73 65 50 61  %s-shm", zBasePa
24b80 74 68 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  th);.    sqlite3
24b90 46 69 6c 65 53 75 66 66 69 78 33 28 70 44 62 46  FileSuffix3(pDbF
24ba0 64 2d 3e 7a 50 61 74 68 2c 20 7a 53 68 6d 46 69  d->zPath, zShmFi
24bb0 6c 65 6e 61 6d 65 29 3b 0a 23 65 6e 64 69 66 0a  lename);.#endif.
24bc0 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 68 20      pShmNode->h 
24bd0 3d 20 2d 31 3b 0a 20 20 20 20 70 44 62 46 64 2d  = -1;.    pDbFd-
24be0 3e 70 49 6e 6f 64 65 2d 3e 70 53 68 6d 4e 6f 64  >pInode->pShmNod
24bf0 65 20 3d 20 70 53 68 6d 4e 6f 64 65 3b 0a 20 20  e = pShmNode;.  
24c00 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 70 49 6e 6f    pShmNode->pIno
24c10 64 65 20 3d 20 70 44 62 46 64 2d 3e 70 49 6e 6f  de = pDbFd->pIno
24c20 64 65 3b 0a 20 20 20 20 70 53 68 6d 4e 6f 64 65  de;.    pShmNode
24c30 2d 3e 6d 75 74 65 78 20 3d 20 73 71 6c 69 74 65  ->mutex = sqlite
24c40 33 5f 6d 75 74 65 78 5f 61 6c 6c 6f 63 28 53 51  3_mutex_alloc(SQ
24c50 4c 49 54 45 5f 4d 55 54 45 58 5f 46 41 53 54 29  LITE_MUTEX_FAST)
24c60 3b 0a 20 20 20 20 69 66 28 20 70 53 68 6d 4e 6f  ;.    if( pShmNo
24c70 64 65 2d 3e 6d 75 74 65 78 3d 3d 30 20 29 7b 0a  de->mutex==0 ){.
24c80 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
24c90 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 67  E_NOMEM;.      g
24ca0 6f 74 6f 20 73 68 6d 5f 6f 70 65 6e 5f 65 72 72  oto shm_open_err
24cb0 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28  ;.    }..    if(
24cc0 20 70 49 6e 6f 64 65 2d 3e 62 50 72 6f 63 65 73   pInode->bProces
24cd0 73 4c 6f 63 6b 3d 3d 30 20 29 7b 0a 20 20 20 20  sLock==0 ){.    
24ce0 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 68 20 3d 20    pShmNode->h = 
24cf0 72 6f 62 75 73 74 5f 6f 70 65 6e 28 7a 53 68 6d  robust_open(zShm
24d00 46 69 6c 65 6e 61 6d 65 2c 20 4f 5f 52 44 57 52  Filename, O_RDWR
24d10 7c 4f 5f 43 52 45 41 54 2c 0a 20 20 20 20 20 20  |O_CREAT,.      
24d20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24d30 20 20 20 20 20 20 20 20 20 28 73 53 74 61 74 2e           (sStat.
24d40 73 74 5f 6d 6f 64 65 20 26 20 30 37 37 37 29 29  st_mode & 0777))
24d50 3b 0a 20 20 20 20 20 20 69 66 28 20 70 53 68 6d  ;.      if( pShm
24d60 4e 6f 64 65 2d 3e 68 3c 30 20 29 7b 0a 20 20 20  Node->h<0 ){.   
24d70 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20       const char 
24d80 2a 7a 52 4f 3b 0a 20 20 20 20 20 20 20 20 7a 52  *zRO;.        zR
24d90 4f 20 3d 20 73 71 6c 69 74 65 33 5f 75 72 69 5f  O = sqlite3_uri_
24da0 70 61 72 61 6d 65 74 65 72 28 70 44 62 46 64 2d  parameter(pDbFd-
24db0 3e 7a 50 61 74 68 2c 20 22 72 65 61 64 6f 6e 6c  >zPath, "readonl
24dc0 79 5f 73 68 6d 22 29 3b 0a 20 20 20 20 20 20 20  y_shm");.       
24dd0 20 69 66 28 20 7a 52 4f 20 26 26 20 73 71 6c 69   if( zRO && sqli
24de0 74 65 33 47 65 74 42 6f 6f 6c 65 61 6e 28 7a 52  te3GetBoolean(zR
24df0 4f 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  O) ){.          
24e00 70 53 68 6d 4e 6f 64 65 2d 3e 68 20 3d 20 72 6f  pShmNode->h = ro
24e10 62 75 73 74 5f 6f 70 65 6e 28 7a 53 68 6d 46 69  bust_open(zShmFi
24e20 6c 65 6e 61 6d 65 2c 20 4f 5f 52 44 4f 4e 4c 59  lename, O_RDONLY
24e30 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
24e40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24e50 20 20 20 20 20 20 28 73 53 74 61 74 2e 73 74 5f        (sStat.st_
24e60 6d 6f 64 65 20 26 20 30 37 37 37 29 29 3b 0a 20  mode & 0777));. 
24e70 20 20 20 20 20 20 20 20 20 70 53 68 6d 4e 6f 64           pShmNod
24e80 65 2d 3e 69 73 52 65 61 64 6f 6e 6c 79 20 3d 20  e->isReadonly = 
24e90 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  1;.        }.   
24ea0 20 20 20 20 20 69 66 28 20 70 53 68 6d 4e 6f 64       if( pShmNod
24eb0 65 2d 3e 68 3c 30 20 29 7b 0a 20 20 20 20 20 20  e->h<0 ){.      
24ec0 20 20 20 20 72 63 20 3d 20 75 6e 69 78 4c 6f 67      rc = unixLog
24ed0 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 43 41 4e  Error(SQLITE_CAN
24ee0 54 4f 50 45 4e 5f 42 4b 50 54 2c 20 22 6f 70 65  TOPEN_BKPT, "ope
24ef0 6e 22 2c 20 7a 53 68 6d 46 69 6c 65 6e 61 6d 65  n", zShmFilename
24f00 29 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74  );.          got
24f10 6f 20 73 68 6d 5f 6f 70 65 6e 5f 65 72 72 3b 0a  o shm_open_err;.
24f20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
24f30 7d 0a 20 20 0a 20 20 20 20 20 20 2f 2a 20 43 68  }.  .      /* Ch
24f40 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 61 6e  eck to see if an
24f50 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20 69 73  other process is
24f60 20 68 6f 6c 64 69 6e 67 20 74 68 65 20 64 65 61   holding the dea
24f70 64 2d 6d 61 6e 20 73 77 69 74 63 68 2e 0a 20 20  d-man switch..  
24f80 20 20 20 20 2a 2a 20 49 66 20 6e 6f 74 2c 20 74      ** If not, t
24f90 72 75 6e 63 61 74 65 20 74 68 65 20 66 69 6c 65  runcate the file
24fa0 20 74 6f 20 7a 65 72 6f 20 6c 65 6e 67 74 68 2e   to zero length.
24fb0 20 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20   .      */.     
24fc0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
24fd0 0a 20 20 20 20 20 20 69 66 28 20 75 6e 69 78 53  .      if( unixS
24fe0 68 6d 53 79 73 74 65 6d 4c 6f 63 6b 28 70 53 68  hmSystemLock(pSh
24ff0 6d 4e 6f 64 65 2c 20 46 5f 57 52 4c 43 4b 2c 20  mNode, F_WRLCK, 
25000 55 4e 49 58 5f 53 48 4d 5f 44 4d 53 2c 20 31 29  UNIX_SHM_DMS, 1)
25010 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
25020 20 20 20 20 20 20 20 69 66 28 20 72 6f 62 75 73         if( robus
25030 74 5f 66 74 72 75 6e 63 61 74 65 28 70 53 68 6d  t_ftruncate(pShm
25040 4e 6f 64 65 2d 3e 68 2c 20 30 29 20 29 7b 0a 20  Node->h, 0) ){. 
25050 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 75 6e           rc = un
25060 69 78 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54  ixLogError(SQLIT
25070 45 5f 49 4f 45 52 52 5f 53 48 4d 4f 50 45 4e 2c  E_IOERR_SHMOPEN,
25080 20 22 66 74 72 75 6e 63 61 74 65 22 2c 20 7a 53   "ftruncate", zS
25090 68 6d 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20  hmFilename);.   
250a0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
250b0 20 20 20 20 20 20 2f 2a 20 49 66 20 72 75 6e 6e        /* If runn
250c0 69 6e 67 20 61 73 20 72 6f 6f 74 20 73 65 74 20  ing as root set 
250d0 74 68 65 20 75 69 64 2f 67 69 64 20 6f 66 20 74  the uid/gid of t
250e0 68 65 20 73 68 6d 20 66 69 6c 65 20 74 6f 20 6d  he shm file to m
250f0 61 74 63 68 20 74 68 65 20 64 61 74 61 62 61 73  atch the databas
25100 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 75  e */.          u
25110 69 64 5f 74 20 65 75 69 64 20 3d 20 67 65 74 65  id_t euid = gete
25120 75 69 64 28 29 3b 0a 20 20 20 20 20 20 20 20 20  uid();.         
25130 20 69 66 28 20 65 75 69 64 3d 3d 30 20 26 26 20   if( euid==0 && 
25140 28 65 75 69 64 21 3d 73 53 74 61 74 2e 73 74 5f  (euid!=sStat.st_
25150 75 69 64 20 7c 7c 20 67 65 74 65 67 69 64 28 29  uid || getegid()
25160 21 3d 73 53 74 61 74 2e 73 74 5f 67 69 64 29 20  !=sStat.st_gid) 
25170 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  ){.            i
25180 66 28 20 66 63 68 6f 77 6e 28 70 53 68 6d 4e 6f  f( fchown(pShmNo
25190 64 65 2d 3e 68 2c 20 73 53 74 61 74 2e 73 74 5f  de->h, sStat.st_
251a0 75 69 64 2c 20 73 53 74 61 74 2e 73 74 5f 67 69  uid, sStat.st_gi
251b0 64 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  d) ){.          
251c0 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
251d0 49 4f 45 52 52 5f 53 48 4d 4f 50 45 4e 3b 0a 20  IOERR_SHMOPEN;. 
251e0 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
251f0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
25200 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
25210 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
25220 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  OK ){.        rc
25230 20 3d 20 75 6e 69 78 53 68 6d 53 79 73 74 65 6d   = unixShmSystem
25240 4c 6f 63 6b 28 70 53 68 6d 4e 6f 64 65 2c 20 46  Lock(pShmNode, F
25250 5f 52 44 4c 43 4b 2c 20 55 4e 49 58 5f 53 48 4d  _RDLCK, UNIX_SHM
25260 5f 44 4d 53 2c 20 31 29 3b 0a 20 20 20 20 20 20  _DMS, 1);.      
25270 7d 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29  }.      if( rc )
25280 20 67 6f 74 6f 20 73 68 6d 5f 6f 70 65 6e 5f 65   goto shm_open_e
25290 72 72 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  rr;.    }.  }.. 
252a0 20 2f 2a 20 4d 61 6b 65 20 74 68 65 20 6e 65 77   /* Make the new
252b0 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 61 20 63 68   connection a ch
252c0 69 6c 64 20 6f 66 20 74 68 65 20 75 6e 69 78 53  ild of the unixS
252d0 68 6d 4e 6f 64 65 20 2a 2f 0a 20 20 70 2d 3e 70  hmNode */.  p->p
252e0 53 68 6d 4e 6f 64 65 20 3d 20 70 53 68 6d 4e 6f  ShmNode = pShmNo
252f0 64 65 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54  de;.#ifdef SQLIT
25300 45 5f 44 45 42 55 47 0a 20 20 70 2d 3e 69 64 20  E_DEBUG.  p->id 
25310 3d 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 65 78 74  = pShmNode->next
25320 53 68 6d 49 64 2b 2b 3b 0a 23 65 6e 64 69 66 0a  ShmId++;.#endif.
25330 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 66    pShmNode->nRef
25340 2b 2b 3b 0a 20 20 70 44 62 46 64 2d 3e 70 53 68  ++;.  pDbFd->pSh
25350 6d 20 3d 20 70 3b 0a 20 20 75 6e 69 78 4c 65 61  m = p;.  unixLea
25360 76 65 4d 75 74 65 78 28 29 3b 0a 0a 20 20 2f 2a  veMutex();..  /*
25370 20 54 68 65 20 72 65 66 65 72 65 6e 63 65 20 63   The reference c
25380 6f 75 6e 74 20 6f 6e 20 70 53 68 6d 4e 6f 64 65  ount on pShmNode
25390 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65   has already bee
253a0 6e 20 69 6e 63 72 65 6d 65 6e 74 65 64 20 75 6e  n incremented un
253b0 64 65 72 0a 20 20 2a 2a 20 74 68 65 20 63 6f 76  der.  ** the cov
253c0 65 72 20 6f 66 20 74 68 65 20 75 6e 69 78 45 6e  er of the unixEn
253d0 74 65 72 4d 75 74 65 78 28 29 20 6d 75 74 65 78  terMutex() mutex
253e0 20 61 6e 64 20 74 68 65 20 70 6f 69 6e 74 65 72   and the pointer
253f0 20 66 72 6f 6d 20 74 68 65 0a 20 20 2a 2a 20 6e   from the.  ** n
25400 65 77 20 28 73 74 72 75 63 74 20 75 6e 69 78 53  ew (struct unixS
25410 68 6d 29 20 6f 62 6a 65 63 74 20 74 6f 20 74 68  hm) object to th
25420 65 20 70 53 68 6d 4e 6f 64 65 20 68 61 73 20 62  e pShmNode has b
25430 65 65 6e 20 73 65 74 2e 20 41 6c 6c 20 74 68 61  een set. All tha
25440 74 20 69 73 0a 20 20 2a 2a 20 6c 65 66 74 20 74  t is.  ** left t
25450 6f 20 64 6f 20 69 73 20 74 6f 20 6c 69 6e 6b 20  o do is to link 
25460 74 68 65 20 6e 65 77 20 6f 62 6a 65 63 74 20 69  the new object i
25470 6e 74 6f 20 74 68 65 20 6c 69 6e 6b 65 64 20 6c  nto the linked l
25480 69 73 74 20 73 74 61 72 74 69 6e 67 0a 20 20 2a  ist starting.  *
25490 2a 20 61 74 20 70 53 68 6d 4e 6f 64 65 2d 3e 70  * at pShmNode->p
254a0 46 69 72 73 74 2e 20 54 68 69 73 20 6d 75 73 74  First. This must
254b0 20 62 65 20 64 6f 6e 65 20 77 68 69 6c 65 20 68   be done while h
254c0 6f 6c 64 69 6e 67 20 74 68 65 20 70 53 68 6d 4e  olding the pShmN
254d0 6f 64 65 2d 3e 6d 75 74 65 78 20 0a 20 20 2a 2a  ode->mutex .  **
254e0 20 6d 75 74 65 78 2e 0a 20 20 2a 2f 0a 20 20 73   mutex..  */.  s
254f0 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74  qlite3_mutex_ent
25500 65 72 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74  er(pShmNode->mut
25510 65 78 29 3b 0a 20 20 70 2d 3e 70 4e 65 78 74 20  ex);.  p->pNext 
25520 3d 20 70 53 68 6d 4e 6f 64 65 2d 3e 70 46 69 72  = pShmNode->pFir
25530 73 74 3b 0a 20 20 70 53 68 6d 4e 6f 64 65 2d 3e  st;.  pShmNode->
25540 70 46 69 72 73 74 20 3d 20 70 3b 0a 20 20 73 71  pFirst = p;.  sq
25550 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76  lite3_mutex_leav
25560 65 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65  e(pShmNode->mute
25570 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  x);.  return SQL
25580 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 4a 75  ITE_OK;..  /* Ju
25590 6d 70 20 68 65 72 65 20 6f 6e 20 61 6e 79 20 65  mp here on any e
255a0 72 72 6f 72 20 2a 2f 0a 73 68 6d 5f 6f 70 65 6e  rror */.shm_open
255b0 5f 65 72 72 3a 0a 20 20 75 6e 69 78 53 68 6d 50  _err:.  unixShmP
255c0 75 72 67 65 28 70 44 62 46 64 29 3b 20 20 20 20  urge(pDbFd);    
255d0 20 20 20 2f 2a 20 54 68 69 73 20 63 61 6c 6c 20     /* This call 
255e0 66 72 65 65 73 20 70 53 68 6d 4e 6f 64 65 20 69  frees pShmNode i
255f0 66 20 72 65 71 75 69 72 65 64 20 2a 2f 0a 20 20  f required */.  
25600 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 29 3b  sqlite3_free(p);
25610 0a 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65  .  unixLeaveMute
25620 78 28 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  x();.  return rc
25630 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
25640 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c  function is call
25650 65 64 20 74 6f 20 6f 62 74 61 69 6e 20 61 20 70  ed to obtain a p
25660 6f 69 6e 74 65 72 20 74 6f 20 72 65 67 69 6f 6e  ointer to region
25670 20 69 52 65 67 69 6f 6e 20 6f 66 20 74 68 65 20   iRegion of the 
25680 0a 2a 2a 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72  .** shared-memor
25690 79 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  y associated wit
256a0 68 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  h the database f
256b0 69 6c 65 20 66 64 2e 20 53 68 61 72 65 64 2d 6d  ile fd. Shared-m
256c0 65 6d 6f 72 79 20 72 65 67 69 6f 6e 73 20 0a 2a  emory regions .*
256d0 2a 20 61 72 65 20 6e 75 6d 62 65 72 65 64 20 73  * are numbered s
256e0 74 61 72 74 69 6e 67 20 66 72 6f 6d 20 7a 65 72  tarting from zer
256f0 6f 2e 20 45 61 63 68 20 73 68 61 72 65 64 2d 6d  o. Each shared-m
25700 65 6d 6f 72 79 20 72 65 67 69 6f 6e 20 69 73 20  emory region is 
25710 73 7a 52 65 67 69 6f 6e 20 0a 2a 2a 20 62 79 74  szRegion .** byt
25720 65 73 20 69 6e 20 73 69 7a 65 2e 0a 2a 2a 0a 2a  es in size..**.*
25730 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63  * If an error oc
25740 63 75 72 73 2c 20 61 6e 20 65 72 72 6f 72 20 63  curs, an error c
25750 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 20  ode is returned 
25760 61 6e 64 20 2a 70 70 20 69 73 20 73 65 74 20 74  and *pp is set t
25770 6f 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 4f 74  o NULL..**.** Ot
25780 68 65 72 77 69 73 65 2c 20 69 66 20 74 68 65 20  herwise, if the 
25790 62 45 78 74 65 6e 64 20 70 61 72 61 6d 65 74 65  bExtend paramete
257a0 72 20 69 73 20 30 20 61 6e 64 20 74 68 65 20 72  r is 0 and the r
257b0 65 71 75 65 73 74 65 64 20 73 68 61 72 65 64 2d  equested shared-
257c0 6d 65 6d 6f 72 79 0a 2a 2a 20 72 65 67 69 6f 6e  memory.** region
257d0 20 68 61 73 20 6e 6f 74 20 62 65 65 6e 20 61 6c   has not been al
257e0 6c 6f 63 61 74 65 64 20 28 62 79 20 61 6e 79 20  located (by any 
257f0 63 6c 69 65 6e 74 2c 20 69 6e 63 6c 75 64 69 6e  client, includin
25800 67 20 6f 6e 65 20 72 75 6e 6e 69 6e 67 20 69 6e  g one running in
25810 20 61 0a 2a 2a 20 73 65 70 61 72 61 74 65 20 70   a.** separate p
25820 72 6f 63 65 73 73 29 2c 20 74 68 65 6e 20 2a 70  rocess), then *p
25830 70 20 69 73 20 73 65 74 20 74 6f 20 4e 55 4c 4c  p is set to NULL
25840 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20 72   and SQLITE_OK r
25850 65 74 75 72 6e 65 64 2e 20 49 66 20 0a 2a 2a 20  eturned. If .** 
25860 62 45 78 74 65 6e 64 20 69 73 20 6e 6f 6e 2d 7a  bExtend is non-z
25870 65 72 6f 20 61 6e 64 20 74 68 65 20 72 65 71 75  ero and the requ
25880 65 73 74 65 64 20 73 68 61 72 65 64 2d 6d 65 6d  ested shared-mem
25890 6f 72 79 20 72 65 67 69 6f 6e 20 68 61 73 20 6e  ory region has n
258a0 6f 74 20 79 65 74 20 0a 2a 2a 20 62 65 65 6e 20  ot yet .** been 
258b0 61 6c 6c 6f 63 61 74 65 64 2c 20 69 74 20 69 73  allocated, it is
258c0 20 61 6c 6c 6f 63 61 74 65 64 20 62 79 20 74 68   allocated by th
258d0 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a  is function..**.
258e0 2a 2a 20 49 66 20 74 68 65 20 73 68 61 72 65 64  ** If the shared
258f0 2d 6d 65 6d 6f 72 79 20 72 65 67 69 6f 6e 20 68  -memory region h
25900 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  as already been 
25910 61 6c 6c 6f 63 61 74 65 64 20 6f 72 20 69 73 20  allocated or is 
25920 61 6c 6c 6f 63 61 74 65 64 20 62 79 0a 2a 2a 20  allocated by.** 
25930 74 68 69 73 20 63 61 6c 6c 20 61 73 20 64 65 73  this call as des
25940 63 72 69 62 65 64 20 61 62 6f 76 65 2c 20 74 68  cribed above, th
25950 65 6e 20 69 74 20 69 73 20 6d 61 70 70 65 64 20  en it is mapped 
25960 69 6e 74 6f 20 74 68 69 73 20 70 72 6f 63 65 73  into this proces
25970 73 65 73 20 0a 2a 2a 20 61 64 64 72 65 73 73 20  ses .** address 
25980 73 70 61 63 65 20 28 69 66 20 69 74 20 69 73 20  space (if it is 
25990 6e 6f 74 20 61 6c 72 65 61 64 79 29 2c 20 2a 70  not already), *p
259a0 70 20 69 73 20 73 65 74 20 74 6f 20 70 6f 69 6e  p is set to poin
259b0 74 20 74 6f 20 74 68 65 20 6d 61 70 70 65 64 20  t to the mapped 
259c0 0a 2a 2a 20 6d 65 6d 6f 72 79 20 61 6e 64 20 53  .** memory and S
259d0 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65  QLITE_OK returne
259e0 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
259f0 20 75 6e 69 78 53 68 6d 4d 61 70 28 0a 20 20 73   unixShmMap(.  s
25a00 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66 64 2c  qlite3_file *fd,
25a10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
25a20 2a 20 48 61 6e 64 6c 65 20 6f 70 65 6e 20 6f 6e  * Handle open on
25a30 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a   database file *
25a40 2f 0a 20 20 69 6e 74 20 69 52 65 67 69 6f 6e 2c  /.  int iRegion,
25a50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25a60 20 20 20 20 2f 2a 20 52 65 67 69 6f 6e 20 74 6f      /* Region to
25a70 20 72 65 74 72 69 65 76 65 20 2a 2f 0a 20 20 69   retrieve */.  i
25a80 6e 74 20 73 7a 52 65 67 69 6f 6e 2c 20 20 20 20  nt szRegion,    
25a90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
25aa0 2a 20 53 69 7a 65 20 6f 66 20 72 65 67 69 6f 6e  * Size of region
25ab0 73 20 2a 2f 0a 20 20 69 6e 74 20 62 45 78 74 65  s */.  int bExte
25ac0 6e 64 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  nd,             
25ad0 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 74         /* True t
25ae0 6f 20 65 78 74 65 6e 64 20 66 69 6c 65 20 69 66  o extend file if
25af0 20 6e 65 63 65 73 73 61 72 79 20 2a 2f 0a 20 20   necessary */.  
25b00 76 6f 69 64 20 76 6f 6c 61 74 69 6c 65 20 2a 2a  void volatile **
25b10 70 70 20 20 20 20 20 20 20 20 20 20 20 20 20 20  pp              
25b20 2f 2a 20 4f 55 54 3a 20 4d 61 70 70 65 64 20 6d  /* OUT: Mapped m
25b30 65 6d 6f 72 79 20 2a 2f 0a 29 7b 0a 20 20 75 6e  emory */.){.  un
25b40 69 78 46 69 6c 65 20 2a 70 44 62 46 64 20 3d 20  ixFile *pDbFd = 
25b50 28 75 6e 69 78 46 69 6c 65 2a 29 66 64 3b 0a 20  (unixFile*)fd;. 
25b60 20 75 6e 69 78 53 68 6d 20 2a 70 3b 0a 20 20 75   unixShm *p;.  u
25b70 6e 69 78 53 68 6d 4e 6f 64 65 20 2a 70 53 68 6d  nixShmNode *pShm
25b80 4e 6f 64 65 3b 0a 20 20 69 6e 74 20 72 63 20 3d  Node;.  int rc =
25b90 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f   SQLITE_OK;..  /
25ba0 2a 20 49 66 20 74 68 65 20 73 68 61 72 65 64 2d  * If the shared-
25bb0 6d 65 6d 6f 72 79 20 66 69 6c 65 20 68 61 73 20  memory file has 
25bc0 6e 6f 74 20 79 65 74 20 62 65 65 6e 20 6f 70 65  not yet been ope
25bd0 6e 65 64 2c 20 6f 70 65 6e 20 69 74 20 6e 6f 77  ned, open it now
25be0 2e 20 2a 2f 0a 20 20 69 66 28 20 70 44 62 46 64  . */.  if( pDbFd
25bf0 2d 3e 70 53 68 6d 3d 3d 30 20 29 7b 0a 20 20 20  ->pShm==0 ){.   
25c00 20 72 63 20 3d 20 75 6e 69 78 4f 70 65 6e 53 68   rc = unixOpenSh
25c10 61 72 65 64 4d 65 6d 6f 72 79 28 70 44 62 46 64  aredMemory(pDbFd
25c20 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
25c30 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72  QLITE_OK ) retur
25c40 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 70 20 3d  n rc;.  }..  p =
25c50 20 70 44 62 46 64 2d 3e 70 53 68 6d 3b 0a 20 20   pDbFd->pShm;.  
25c60 70 53 68 6d 4e 6f 64 65 20 3d 20 70 2d 3e 70 53  pShmNode = p->pS
25c70 68 6d 4e 6f 64 65 3b 0a 20 20 73 71 6c 69 74 65  hmNode;.  sqlite
25c80 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 70 53  3_mutex_enter(pS
25c90 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 29 3b 0a  hmNode->mutex);.
25ca0 20 20 61 73 73 65 72 74 28 20 73 7a 52 65 67 69    assert( szRegi
25cb0 6f 6e 3d 3d 70 53 68 6d 4e 6f 64 65 2d 3e 73 7a  on==pShmNode->sz
25cc0 52 65 67 69 6f 6e 20 7c 7c 20 70 53 68 6d 4e 6f  Region || pShmNo
25cd0 64 65 2d 3e 6e 52 65 67 69 6f 6e 3d 3d 30 20 29  de->nRegion==0 )
25ce0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53 68 6d  ;.  assert( pShm
25cf0 4e 6f 64 65 2d 3e 70 49 6e 6f 64 65 3d 3d 70 44  Node->pInode==pD
25d00 62 46 64 2d 3e 70 49 6e 6f 64 65 20 29 3b 0a 20  bFd->pInode );. 
25d10 20 61 73 73 65 72 74 28 20 70 53 68 6d 4e 6f 64   assert( pShmNod
25d20 65 2d 3e 68 3e 3d 30 20 7c 7c 20 70 44 62 46 64  e->h>=0 || pDbFd
25d30 2d 3e 70 49 6e 6f 64 65 2d 3e 62 50 72 6f 63 65  ->pInode->bProce
25d40 73 73 4c 6f 63 6b 3d 3d 31 20 29 3b 0a 20 20 61  ssLock==1 );.  a
25d50 73 73 65 72 74 28 20 70 53 68 6d 4e 6f 64 65 2d  ssert( pShmNode-
25d60 3e 68 3c 30 20 7c 7c 20 70 44 62 46 64 2d 3e 70  >h<0 || pDbFd->p
25d70 49 6e 6f 64 65 2d 3e 62 50 72 6f 63 65 73 73 4c  Inode->bProcessL
25d80 6f 63 6b 3d 3d 30 20 29 3b 0a 0a 20 20 69 66 28  ock==0 );..  if(
25d90 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69   pShmNode->nRegi
25da0 6f 6e 3c 3d 69 52 65 67 69 6f 6e 20 29 7b 0a 20  on<=iRegion ){. 
25db0 20 20 20 63 68 61 72 20 2a 2a 61 70 4e 65 77 3b     char **apNew;
25dc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25dd0 20 20 20 20 20 20 2f 2a 20 4e 65 77 20 61 70 52        /* New apR
25de0 65 67 69 6f 6e 5b 5d 20 61 72 72 61 79 20 2a 2f  egion[] array */
25df0 0a 20 20 20 20 69 6e 74 20 6e 42 79 74 65 20 3d  .    int nByte =
25e00 20 28 69 52 65 67 69 6f 6e 2b 31 29 2a 73 7a 52   (iRegion+1)*szR
25e10 65 67 69 6f 6e 3b 20 20 2f 2a 20 4d 69 6e 69 6d  egion;  /* Minim
25e20 75 6d 20 72 65 71 75 69 72 65 64 20 66 69 6c 65  um required file
25e30 20 73 69 7a 65 20 2a 2f 0a 20 20 20 20 73 74 72   size */.    str
25e40 75 63 74 20 73 74 61 74 20 73 53 74 61 74 3b 20  uct stat sStat; 
25e50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25e60 2f 2a 20 55 73 65 64 20 62 79 20 66 73 74 61 74  /* Used by fstat
25e70 28 29 20 2a 2f 0a 0a 20 20 20 20 70 53 68 6d 4e  () */..    pShmN
25e80 6f 64 65 2d 3e 73 7a 52 65 67 69 6f 6e 20 3d 20  ode->szRegion = 
25e90 73 7a 52 65 67 69 6f 6e 3b 0a 0a 20 20 20 20 69  szRegion;..    i
25ea0 66 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 68 3e 3d  f( pShmNode->h>=
25eb0 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68  0 ){.      /* Th
25ec0 65 20 72 65 71 75 65 73 74 65 64 20 72 65 67 69  e requested regi
25ed0 6f 6e 20 69 73 20 6e 6f 74 20 6d 61 70 70 65 64  on is not mapped
25ee0 20 69 6e 74 6f 20 74 68 69 73 20 70 72 6f 63 65   into this proce
25ef0 73 73 65 73 20 61 64 64 72 65 73 73 20 73 70 61  sses address spa
25f00 63 65 2e 0a 20 20 20 20 20 20 2a 2a 20 43 68 65  ce..      ** Che
25f10 63 6b 20 74 6f 20 73 65 65 20 69 66 20 69 74 20  ck to see if it 
25f20 68 61 73 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74  has been allocat
25f30 65 64 20 28 69 2e 65 2e 20 69 66 20 74 68 65 20  ed (i.e. if the 
25f40 77 61 6c 2d 69 6e 64 65 78 20 66 69 6c 65 20 69  wal-index file i
25f50 73 0a 20 20 20 20 20 20 2a 2a 20 6c 61 72 67 65  s.      ** large
25f60 20 65 6e 6f 75 67 68 20 74 6f 20 63 6f 6e 74 61   enough to conta
25f70 69 6e 20 74 68 65 20 72 65 71 75 65 73 74 65 64  in the requested
25f80 20 72 65 67 69 6f 6e 29 2e 0a 20 20 20 20 20 20   region)..      
25f90 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 6f 73 46  */.      if( osF
25fa0 73 74 61 74 28 70 53 68 6d 4e 6f 64 65 2d 3e 68  stat(pShmNode->h
25fb0 2c 20 26 73 53 74 61 74 29 20 29 7b 0a 20 20 20  , &sStat) ){.   
25fc0 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
25fd0 5f 49 4f 45 52 52 5f 53 48 4d 53 49 5a 45 3b 0a  _IOERR_SHMSIZE;.
25fe0 20 20 20 20 20 20 20 20 67 6f 74 6f 20 73 68 6d          goto shm
25ff0 70 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20 20 20  page_out;.      
26000 7d 0a 20 20 0a 20 20 20 20 20 20 69 66 28 20 73  }.  .      if( s
26010 53 74 61 74 2e 73 74 5f 73 69 7a 65 3c 6e 42 79  Stat.st_size<nBy
26020 74 65 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  te ){.        /*
26030 20 54 68 65 20 72 65 71 75 65 73 74 65 64 20 6d   The requested m
26040 65 6d 6f 72 79 20 72 65 67 69 6f 6e 20 64 6f 65  emory region doe
26050 73 20 6e 6f 74 20 65 78 69 73 74 2e 20 49 66 20  s not exist. If 
26060 62 45 78 74 65 6e 64 20 69 73 20 73 65 74 20 74  bExtend is set t
26070 6f 0a 20 20 20 20 20 20 20 20 2a 2a 20 66 61 6c  o.        ** fal
26080 73 65 2c 20 65 78 69 74 20 65 61 72 6c 79 2e 20  se, exit early. 
26090 2a 70 70 20 77 69 6c 6c 20 62 65 20 73 65 74 20  *pp will be set 
260a0 74 6f 20 4e 55 4c 4c 20 61 6e 64 20 53 51 4c 49  to NULL and SQLI
260b0 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e 0a  TE_OK returned..
260c0 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20          **.     
260d0 20 20 20 2a 2a 20 41 6c 74 65 72 6e 61 74 69 76     ** Alternativ
260e0 65 6c 79 2c 20 69 66 20 62 45 78 74 65 6e 64 20  ely, if bExtend 
260f0 69 73 20 74 72 75 65 2c 20 75 73 65 20 66 74 72  is true, use ftr
26100 75 6e 63 61 74 65 28 29 20 74 6f 20 61 6c 6c 6f  uncate() to allo
26110 63 61 74 65 0a 20 20 20 20 20 20 20 20 2a 2a 20  cate.        ** 
26120 74 68 65 20 72 65 71 75 65 73 74 65 64 20 6d 65  the requested me
26130 6d 6f 72 79 20 72 65 67 69 6f 6e 2e 0a 20 20 20  mory region..   
26140 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
26150 69 66 28 20 21 62 45 78 74 65 6e 64 20 29 20 67  if( !bExtend ) g
26160 6f 74 6f 20 73 68 6d 70 61 67 65 5f 6f 75 74 3b  oto shmpage_out;
26170 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 6f 62  .        if( rob
26180 75 73 74 5f 66 74 72 75 6e 63 61 74 65 28 70 53  ust_ftruncate(pS
26190 68 6d 4e 6f 64 65 2d 3e 68 2c 20 6e 42 79 74 65  hmNode->h, nByte
261a0 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  ) ){.          r
261b0 63 20 3d 20 75 6e 69 78 4c 6f 67 45 72 72 6f 72  c = unixLogError
261c0 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48  (SQLITE_IOERR_SH
261d0 4d 53 49 5a 45 2c 20 22 66 74 72 75 6e 63 61 74  MSIZE, "ftruncat
261e0 65 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  e",.            
261f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26200 70 53 68 6d 4e 6f 64 65 2d 3e 7a 46 69 6c 65 6e  pShmNode->zFilen
26210 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ame);.          
26220 67 6f 74 6f 20 73 68 6d 70 61 67 65 5f 6f 75 74  goto shmpage_out
26230 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
26240 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f    }.    }..    /
26250 2a 20 4d 61 70 20 74 68 65 20 72 65 71 75 65 73  * Map the reques
26260 74 65 64 20 6d 65 6d 6f 72 79 20 72 65 67 69 6f  ted memory regio
26270 6e 20 69 6e 74 6f 20 74 68 69 73 20 70 72 6f 63  n into this proc
26280 65 73 73 65 73 20 61 64 64 72 65 73 73 20 73 70  esses address sp
26290 61 63 65 2e 20 2a 2f 0a 20 20 20 20 61 70 4e 65  ace. */.    apNe
262a0 77 20 3d 20 28 63 68 61 72 20 2a 2a 29 73 71 6c  w = (char **)sql
262b0 69 74 65 33 5f 72 65 61 6c 6c 6f 63 28 0a 20 20  ite3_realloc(.  
262c0 20 20 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e        pShmNode->
262d0 61 70 52 65 67 69 6f 6e 2c 20 28 69 52 65 67 69  apRegion, (iRegi
262e0 6f 6e 2b 31 29 2a 73 69 7a 65 6f 66 28 63 68 61  on+1)*sizeof(cha
262f0 72 20 2a 29 0a 20 20 20 20 29 3b 0a 20 20 20 20  r *).    );.    
26300 69 66 28 20 21 61 70 4e 65 77 20 29 7b 0a 20 20  if( !apNew ){.  
26310 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
26320 49 4f 45 52 52 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  IOERR_NOMEM;.   
26330 20 20 20 67 6f 74 6f 20 73 68 6d 70 61 67 65 5f     goto shmpage_
26340 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  out;.    }.    p
26350 53 68 6d 4e 6f 64 65 2d 3e 61 70 52 65 67 69 6f  ShmNode->apRegio
26360 6e 20 3d 20 61 70 4e 65 77 3b 0a 20 20 20 20 77  n = apNew;.    w
26370 68 69 6c 65 28 70 53 68 6d 4e 6f 64 65 2d 3e 6e  hile(pShmNode->n
26380 52 65 67 69 6f 6e 3c 3d 69 52 65 67 69 6f 6e 29  Region<=iRegion)
26390 7b 0a 20 20 20 20 20 20 76 6f 69 64 20 2a 70 4d  {.      void *pM
263a0 65 6d 3b 0a 20 20 20 20 20 20 69 66 28 20 70 53  em;.      if( pS
263b0 68 6d 4e 6f 64 65 2d 3e 68 3e 3d 30 20 29 7b 0a  hmNode->h>=0 ){.
263c0 20 20 20 20 20 20 20 20 70 4d 65 6d 20 3d 20 6d          pMem = m
263d0 6d 61 70 28 30 2c 20 73 7a 52 65 67 69 6f 6e 2c  map(0, szRegion,
263e0 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 53 68  .            pSh
263f0 6d 4e 6f 64 65 2d 3e 69 73 52 65 61 64 6f 6e 6c  mNode->isReadonl
26400 79 20 3f 20 50 52 4f 54 5f 52 45 41 44 20 3a 20  y ? PROT_READ : 
26410 50 52 4f 54 5f 52 45 41 44 7c 50 52 4f 54 5f 57  PROT_READ|PROT_W
26420 52 49 54 45 2c 20 0a 20 20 20 20 20 20 20 20 20  RITE, .         
26430 20 20 20 4d 41 50 5f 53 48 41 52 45 44 2c 20 70     MAP_SHARED, p
26440 53 68 6d 4e 6f 64 65 2d 3e 68 2c 20 70 53 68 6d  ShmNode->h, pShm
26450 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e 2a 73 7a  Node->nRegion*sz
26460 52 65 67 69 6f 6e 0a 20 20 20 20 20 20 20 20 29  Region.        )
26470 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 4d  ;.        if( pM
26480 65 6d 3d 3d 4d 41 50 5f 46 41 49 4c 45 44 20 29  em==MAP_FAILED )
26490 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  {.          rc =
264a0 20 75 6e 69 78 4c 6f 67 45 72 72 6f 72 28 53 51   unixLogError(SQ
264b0 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4d 4d 41  LITE_IOERR_SHMMA
264c0 50 2c 20 22 6d 6d 61 70 22 2c 20 70 53 68 6d 4e  P, "mmap", pShmN
264d0 6f 64 65 2d 3e 7a 46 69 6c 65 6e 61 6d 65 29 3b  ode->zFilename);
264e0 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20  .          goto 
264f0 73 68 6d 70 61 67 65 5f 6f 75 74 3b 0a 20 20 20  shmpage_out;.   
26500 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c       }.      }el
26510 73 65 7b 0a 20 20 20 20 20 20 20 20 70 4d 65 6d  se{.        pMem
26520 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f   = sqlite3_mallo
26530 63 28 73 7a 52 65 67 69 6f 6e 29 3b 0a 20 20 20  c(szRegion);.   
26540 20 20 20 20 20 69 66 28 20 70 4d 65 6d 3d 3d 30       if( pMem==0
26550 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63   ){.          rc
26560 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b   = SQLITE_NOMEM;
26570 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20  .          goto 
26580 73 68 6d 70 61 67 65 5f 6f 75 74 3b 0a 20 20 20  shmpage_out;.   
26590 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 6d       }.        m
265a0 65 6d 73 65 74 28 70 4d 65 6d 2c 20 30 2c 20 73  emset(pMem, 0, s
265b0 7a 52 65 67 69 6f 6e 29 3b 0a 20 20 20 20 20 20  zRegion);.      
265c0 7d 0a 20 20 20 20 20 20 70 53 68 6d 4e 6f 64 65  }.      pShmNode
265d0 2d 3e 61 70 52 65 67 69 6f 6e 5b 70 53 68 6d 4e  ->apRegion[pShmN
265e0 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e 5d 20 3d 20  ode->nRegion] = 
265f0 70 4d 65 6d 3b 0a 20 20 20 20 20 20 70 53 68 6d  pMem;.      pShm
26600 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e 2b 2b 3b  Node->nRegion++;
26610 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 73 68 6d 70  .    }.  }..shmp
26620 61 67 65 5f 6f 75 74 3a 0a 20 20 69 66 28 20 70  age_out:.  if( p
26630 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e  ShmNode->nRegion
26640 3e 69 52 65 67 69 6f 6e 20 29 7b 0a 20 20 20 20  >iRegion ){.    
26650 2a 70 70 20 3d 20 70 53 68 6d 4e 6f 64 65 2d 3e  *pp = pShmNode->
26660 61 70 52 65 67 69 6f 6e 5b 69 52 65 67 69 6f 6e  apRegion[iRegion
26670 5d 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  ];.  }else{.    
26680 2a 70 70 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 69  *pp = 0;.  }.  i
26690 66 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 69 73 52  f( pShmNode->isR
266a0 65 61 64 6f 6e 6c 79 20 26 26 20 72 63 3d 3d 53  eadonly && rc==S
266b0 51 4c 49 54 45 5f 4f 4b 20 29 20 72 63 20 3d 20  QLITE_OK ) rc = 
266c0 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 3b  SQLITE_READONLY;
266d0 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
266e0 5f 6c 65 61 76 65 28 70 53 68 6d 4e 6f 64 65 2d  _leave(pShmNode-
266f0 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72  >mutex);.  retur
26700 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  n rc;.}../*.** C
26710 68 61 6e 67 65 20 74 68 65 20 6c 6f 63 6b 20 73  hange the lock s
26720 74 61 74 65 20 66 6f 72 20 61 20 73 68 61 72 65  tate for a share
26730 64 2d 6d 65 6d 6f 72 79 20 73 65 67 6d 65 6e 74  d-memory segment
26740 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61  ..**.** Note tha
26750 74 20 74 68 65 20 72 65 6c 61 74 69 6f 6e 73 68  t the relationsh
26760 69 70 20 62 65 74 77 65 65 6e 20 53 48 41 52 45  ip between SHARE
26770 64 20 61 6e 64 20 45 58 43 4c 55 53 49 56 45 20  d and EXCLUSIVE 
26780 6c 6f 63 6b 73 20 69 73 20 61 20 6c 69 74 74 6c  locks is a littl
26790 65 0a 2a 2a 20 64 69 66 66 65 72 65 6e 74 20 68  e.** different h
267a0 65 72 65 20 74 68 61 6e 20 69 6e 20 70 6f 73 69  ere than in posi
267b0 78 2e 20 20 49 6e 20 78 53 68 6d 4c 6f 63 6b 28  x.  In xShmLock(
267c0 29 2c 20 6f 6e 65 20 63 61 6e 20 67 6f 20 66 72  ), one can go fr
267d0 6f 6d 20 75 6e 6c 6f 63 6b 65 64 0a 2a 2a 20 74  om unlocked.** t
267e0 6f 20 73 68 61 72 65 64 20 61 6e 64 20 62 61 63  o shared and bac
267f0 6b 20 6f 72 20 66 72 6f 6d 20 75 6e 6c 6f 63 6b  k or from unlock
26800 65 64 20 74 6f 20 65 78 63 6c 75 73 69 76 65 20  ed to exclusive 
26810 61 6e 64 20 62 61 63 6b 2e 20 20 42 75 74 20 6f  and back.  But o
26820 6e 65 20 6d 61 79 0a 2a 2a 20 6e 6f 74 20 67 6f  ne may.** not go
26830 20 66 72 6f 6d 20 73 68 61 72 65 64 20 74 6f 20   from shared to 
26840 65 78 63 6c 75 73 69 76 65 20 6f 72 20 66 72 6f  exclusive or fro
26850 6d 20 65 78 63 6c 75 73 69 76 65 20 74 6f 20 73  m exclusive to s
26860 68 61 72 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  hared..*/.static
26870 20 69 6e 74 20 75 6e 69 78 53 68 6d 4c 6f 63 6b   int unixShmLock
26880 28 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65  (.  sqlite3_file
26890 20 2a 66 64 2c 20 20 20 20 20 20 20 20 20 20 2f   *fd,          /
268a0 2a 20 44 61 74 61 62 61 73 65 20 66 69 6c 65 20  * Database file 
268b0 68 6f 6c 64 69 6e 67 20 74 68 65 20 73 68 61 72  holding the shar
268c0 65 64 20 6d 65 6d 6f 72 79 20 2a 2f 0a 20 20 69  ed memory */.  i
268d0 6e 74 20 6f 66 73 74 2c 20 20 20 20 20 20 20 20  nt ofst,        
268e0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72            /* Fir
268f0 73 74 20 6c 6f 63 6b 20 74 6f 20 61 63 71 75 69  st lock to acqui
26900 72 65 20 6f 72 20 72 65 6c 65 61 73 65 20 2a 2f  re or release */
26910 0a 20 20 69 6e 74 20 6e 2c 20 20 20 20 20 20 20  .  int n,       
26920 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
26930 20 4e 75 6d 62 65 72 20 6f 66 20 6c 6f 63 6b 73   Number of locks
26940 20 74 6f 20 61 63 71 75 69 72 65 20 6f 72 20 72   to acquire or r
26950 65 6c 65 61 73 65 20 2a 2f 0a 20 20 69 6e 74 20  elease */.  int 
26960 66 6c 61 67 73 20 20 20 20 20 20 20 20 20 20 20  flags           
26970 20 20 20 20 20 20 20 2f 2a 20 57 68 61 74 20 74         /* What t
26980 6f 20 64 6f 20 77 69 74 68 20 74 68 65 20 6c 6f  o do with the lo
26990 63 6b 20 2a 2f 0a 29 7b 0a 20 20 75 6e 69 78 46  ck */.){.  unixF
269a0 69 6c 65 20 2a 70 44 62 46 64 20 3d 20 28 75 6e  ile *pDbFd = (un
269b0 69 78 46 69 6c 65 2a 29 66 64 3b 20 20 20 20 20  ixFile*)fd;     
269c0 20 2f 2a 20 43 6f 6e 6e 65 63 74 69 6f 6e 20 68   /* Connection h
269d0 6f 6c 64 69 6e 67 20 73 68 61 72 65 64 20 6d 65  olding shared me
269e0 6d 6f 72 79 20 2a 2f 0a 20 20 75 6e 69 78 53 68  mory */.  unixSh
269f0 6d 20 2a 70 20 3d 20 70 44 62 46 64 2d 3e 70 53  m *p = pDbFd->pS
26a00 68 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  hm;             
26a10 2f 2a 20 54 68 65 20 73 68 61 72 65 64 20 6d 65  /* The shared me
26a20 6d 6f 72 79 20 62 65 69 6e 67 20 6c 6f 63 6b 65  mory being locke
26a30 64 20 2a 2f 0a 20 20 75 6e 69 78 53 68 6d 20 2a  d */.  unixShm *
26a40 70 58 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  pX;             
26a50 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
26a60 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72  For looping over
26a70 20 61 6c 6c 20 73 69 62 6c 69 6e 67 73 20 2a 2f   all siblings */
26a80 0a 20 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20 2a  .  unixShmNode *
26a90 70 53 68 6d 4e 6f 64 65 20 3d 20 70 2d 3e 70 53  pShmNode = p->pS
26aa0 68 6d 4e 6f 64 65 3b 20 20 2f 2a 20 54 68 65 20  hmNode;  /* The 
26ab0 75 6e 64 65 72 6c 79 69 6e 67 20 66 69 6c 65 20  underlying file 
26ac0 69 4e 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 72  iNode */.  int r
26ad0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20  c = SQLITE_OK;  
26ae0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26af0 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64 65 20   /* Result code 
26b00 2a 2f 0a 20 20 75 31 36 20 6d 61 73 6b 3b 20 20  */.  u16 mask;  
26b10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26b20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61             /* Ma
26b30 73 6b 20 6f 66 20 6c 6f 63 6b 73 20 74 6f 20 74  sk of locks to t
26b40 61 6b 65 20 6f 72 20 72 65 6c 65 61 73 65 20 2a  ake or release *
26b50 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70 53 68  /..  assert( pSh
26b60 6d 4e 6f 64 65 3d 3d 70 44 62 46 64 2d 3e 70 49  mNode==pDbFd->pI
26b70 6e 6f 64 65 2d 3e 70 53 68 6d 4e 6f 64 65 20 29  node->pShmNode )
26b80 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53 68 6d  ;.  assert( pShm
26b90 4e 6f 64 65 2d 3e 70 49 6e 6f 64 65 3d 3d 70 44  Node->pInode==pD
26ba0 62 46 64 2d 3e 70 49 6e 6f 64 65 20 29 3b 0a 20  bFd->pInode );. 
26bb0 20 61 73 73 65 72 74 28 20 6f 66 73 74 3e 3d 30   assert( ofst>=0
26bc0 20 26 26 20 6f 66 73 74 2b 6e 3c 3d 53 51 4c 49   && ofst+n<=SQLI
26bd0 54 45 5f 53 48 4d 5f 4e 4c 4f 43 4b 20 29 3b 0a  TE_SHM_NLOCK );.
26be0 20 20 61 73 73 65 72 74 28 20 6e 3e 3d 31 20 29    assert( n>=1 )
26bf0 3b 0a 20 20 61 73 73 65 72 74 28 20 66 6c 61 67  ;.  assert( flag
26c00 73 3d 3d 28 53 51 4c 49 54 45 5f 53 48 4d 5f 4c  s==(SQLITE_SHM_L
26c10 4f 43 4b 20 7c 20 53 51 4c 49 54 45 5f 53 48 4d  OCK | SQLITE_SHM
26c20 5f 53 48 41 52 45 44 29 0a 20 20 20 20 20 20 20  _SHARED).       
26c30 7c 7c 20 66 6c 61 67 73 3d 3d 28 53 51 4c 49 54  || flags==(SQLIT
26c40 45 5f 53 48 4d 5f 4c 4f 43 4b 20 7c 20 53 51 4c  E_SHM_LOCK | SQL
26c50 49 54 45 5f 53 48 4d 5f 45 58 43 4c 55 53 49 56  ITE_SHM_EXCLUSIV
26c60 45 29 0a 20 20 20 20 20 20 20 7c 7c 20 66 6c 61  E).       || fla
26c70 67 73 3d 3d 28 53 51 4c 49 54 45 5f 53 48 4d 5f  gs==(SQLITE_SHM_
26c80 55 4e 4c 4f 43 4b 20 7c 20 53 51 4c 49 54 45 5f  UNLOCK | SQLITE_
26c90 53 48 4d 5f 53 48 41 52 45 44 29 0a 20 20 20 20  SHM_SHARED).    
26ca0 20 20 20 7c 7c 20 66 6c 61 67 73 3d 3d 28 53 51     || flags==(SQ
26cb0 4c 49 54 45 5f 53 48 4d 5f 55 4e 4c 4f 43 4b 20  LITE_SHM_UNLOCK 
26cc0 7c 20 53 51 4c 49 54 45 5f 53 48 4d 5f 45 58 43  | SQLITE_SHM_EXC
26cd0 4c 55 53 49 56 45 29 20 29 3b 0a 20 20 61 73 73  LUSIVE) );.  ass
26ce0 65 72 74 28 20 6e 3d 3d 31 20 7c 7c 20 28 66 6c  ert( n==1 || (fl
26cf0 61 67 73 20 26 20 53 51 4c 49 54 45 5f 53 48 4d  ags & SQLITE_SHM
26d00 5f 45 58 43 4c 55 53 49 56 45 29 21 3d 30 20 29  _EXCLUSIVE)!=0 )
26d10 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53 68 6d  ;.  assert( pShm
26d20 4e 6f 64 65 2d 3e 68 3e 3d 30 20 7c 7c 20 70 44  Node->h>=0 || pD
26d30 62 46 64 2d 3e 70 49 6e 6f 64 65 2d 3e 62 50 72  bFd->pInode->bPr
26d40 6f 63 65 73 73 4c 6f 63 6b 3d 3d 31 20 29 3b 0a  ocessLock==1 );.
26d50 20 20 61 73 73 65 72 74 28 20 70 53 68 6d 4e 6f    assert( pShmNo
26d60 64 65 2d 3e 68 3c 30 20 7c 7c 20 70 44 62 46 64  de->h<0 || pDbFd
26d70 2d 3e 70 49 6e 6f 64 65 2d 3e 62 50 72 6f 63 65  ->pInode->bProce
26d80 73 73 4c 6f 63 6b 3d 3d 30 20 29 3b 0a 0a 20 20  ssLock==0 );..  
26d90 6d 61 73 6b 20 3d 20 28 31 3c 3c 28 6f 66 73 74  mask = (1<<(ofst
26da0 2b 6e 29 29 20 2d 20 28 31 3c 3c 6f 66 73 74 29  +n)) - (1<<ofst)
26db0 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 3e 31 20  ;.  assert( n>1 
26dc0 7c 7c 20 6d 61 73 6b 3d 3d 28 31 3c 3c 6f 66 73  || mask==(1<<ofs
26dd0 74 29 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f  t) );.  sqlite3_
26de0 6d 75 74 65 78 5f 65 6e 74 65 72 28 70 53 68 6d  mutex_enter(pShm
26df0 4e 6f 64 65 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  Node->mutex);.  
26e00 69 66 28 20 66 6c 61 67 73 20 26 20 53 51 4c 49  if( flags & SQLI
26e10 54 45 5f 53 48 4d 5f 55 4e 4c 4f 43 4b 20 29 7b  TE_SHM_UNLOCK ){
26e20 0a 20 20 20 20 75 31 36 20 61 6c 6c 4d 61 73 6b  .    u16 allMask
26e30 20 3d 20 30 3b 20 2f 2a 20 4d 61 73 6b 20 6f 66   = 0; /* Mask of
26e40 20 6c 6f 63 6b 73 20 68 65 6c 64 20 62 79 20 73   locks held by s
26e50 69 62 6c 69 6e 67 73 20 2a 2f 0a 0a 20 20 20 20  iblings */..    
26e60 2f 2a 20 53 65 65 20 69 66 20 61 6e 79 20 73 69  /* See if any si
26e70 62 6c 69 6e 67 73 20 68 6f 6c 64 20 74 68 69 73  blings hold this
26e80 20 73 61 6d 65 20 6c 6f 63 6b 20 2a 2f 0a 20 20   same lock */.  
26e90 20 20 66 6f 72 28 70 58 3d 70 53 68 6d 4e 6f 64    for(pX=pShmNod
26ea0 65 2d 3e 70 46 69 72 73 74 3b 20 70 58 3b 20 70  e->pFirst; pX; p
26eb0 58 3d 70 58 2d 3e 70 4e 65 78 74 29 7b 0a 20 20  X=pX->pNext){.  
26ec0 20 20 20 20 69 66 28 20 70 58 3d 3d 70 20 29 20      if( pX==p ) 
26ed0 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
26ee0 61 73 73 65 72 74 28 20 28 70 58 2d 3e 65 78 63  assert( (pX->exc
26ef0 6c 4d 61 73 6b 20 26 20 28 70 2d 3e 65 78 63 6c  lMask & (p->excl
26f00 4d 61 73 6b 7c 70 2d 3e 73 68 61 72 65 64 4d 61  Mask|p->sharedMa
26f10 73 6b 29 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20  sk))==0 );.     
26f20 20 61 6c 6c 4d 61 73 6b 20 7c 3d 20 70 58 2d 3e   allMask |= pX->
26f30 73 68 61 72 65 64 4d 61 73 6b 3b 0a 20 20 20 20  sharedMask;.    
26f40 7d 0a 0a 20 20 20 20 2f 2a 20 55 6e 6c 6f 63 6b  }..    /* Unlock
26f50 20 74 68 65 20 73 79 73 74 65 6d 2d 6c 65 76 65   the system-leve
26f60 6c 20 6c 6f 63 6b 73 20 2a 2f 0a 20 20 20 20 69  l locks */.    i
26f70 66 28 20 28 6d 61 73 6b 20 26 20 61 6c 6c 4d 61  f( (mask & allMa
26f80 73 6b 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  sk)==0 ){.      
26f90 72 63 20 3d 20 75 6e 69 78 53 68 6d 53 79 73 74  rc = unixShmSyst
26fa0 65 6d 4c 6f 63 6b 28 70 53 68 6d 4e 6f 64 65 2c  emLock(pShmNode,
26fb0 20 46 5f 55 4e 4c 43 4b 2c 20 6f 66 73 74 2b 55   F_UNLCK, ofst+U
26fc0 4e 49 58 5f 53 48 4d 5f 42 41 53 45 2c 20 6e 29  NIX_SHM_BASE, n)
26fd0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
26fe0 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f     rc = SQLITE_O
26ff0 4b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  K;.    }..    /*
27000 20 55 6e 64 6f 20 74 68 65 20 6c 6f 63 61 6c 20   Undo the local 
27010 6c 6f 63 6b 73 20 2a 2f 0a 20 20 20 20 69 66 28  locks */.    if(
27020 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
27030 7b 0a 20 20 20 20 20 20 70 2d 3e 65 78 63 6c 4d  {.      p->exclM
27040 61 73 6b 20 26 3d 20 7e 6d 61 73 6b 3b 0a 20 20  ask &= ~mask;.  
27050 20 20 20 20 70 2d 3e 73 68 61 72 65 64 4d 61 73      p->sharedMas
27060 6b 20 26 3d 20 7e 6d 61 73 6b 3b 0a 20 20 20 20  k &= ~mask;.    
27070 7d 20 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 66  } .  }else if( f
27080 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 53 48  lags & SQLITE_SH
27090 4d 5f 53 48 41 52 45 44 20 29 7b 0a 20 20 20 20  M_SHARED ){.    
270a0 75 31 36 20 61 6c 6c 53 68 61 72 65 64 20 3d 20  u16 allShared = 
270b0 30 3b 20 20 2f 2a 20 55 6e 69 6f 6e 20 6f 66 20  0;  /* Union of 
270c0 6c 6f 63 6b 73 20 68 65 6c 64 20 62 79 20 63 6f  locks held by co
270d0 6e 6e 65 63 74 69 6f 6e 73 20 6f 74 68 65 72 20  nnections other 
270e0 74 68 61 6e 20 22 70 22 20 2a 2f 0a 0a 20 20 20  than "p" */..   
270f0 20 2f 2a 20 46 69 6e 64 20 6f 75 74 20 77 68 69   /* Find out whi
27100 63 68 20 73 68 61 72 65 64 20 6c 6f 63 6b 73 20  ch shared locks 
27110 61 72 65 20 61 6c 72 65 61 64 79 20 68 65 6c 64  are already held
27120 20 62 79 20 73 69 62 6c 69 6e 67 20 63 6f 6e 6e   by sibling conn
27130 65 63 74 69 6f 6e 73 2e 0a 20 20 20 20 2a 2a 20  ections..    ** 
27140 49 66 20 61 6e 79 20 73 69 62 6c 69 6e 67 20 61  If any sibling a
27150 6c 72 65 61 64 79 20 68 6f 6c 64 73 20 61 6e 20  lready holds an 
27160 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 2c 20  exclusive lock, 
27170 67 6f 20 61 68 65 61 64 20 61 6e 64 20 72 65 74  go ahead and ret
27180 75 72 6e 0a 20 20 20 20 2a 2a 20 53 51 4c 49 54  urn.    ** SQLIT
27190 45 5f 42 55 53 59 2e 0a 20 20 20 20 2a 2f 0a 20  E_BUSY..    */. 
271a0 20 20 20 66 6f 72 28 70 58 3d 70 53 68 6d 4e 6f     for(pX=pShmNo
271b0 64 65 2d 3e 70 46 69 72 73 74 3b 20 70 58 3b 20  de->pFirst; pX; 
271c0 70 58 3d 70 58 2d 3e 70 4e 65 78 74 29 7b 0a 20  pX=pX->pNext){. 
271d0 20 20 20 20 20 69 66 28 20 28 70 58 2d 3e 65 78       if( (pX->ex
271e0 63 6c 4d 61 73 6b 20 26 20 6d 61 73 6b 29 21 3d  clMask & mask)!=
271f0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  0 ){.        rc 
27200 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20  = SQLITE_BUSY;. 
27210 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
27220 20 20 20 20 7d 0a 20 20 20 20 20 20 61 6c 6c 53      }.      allS
27230 68 61 72 65 64 20 7c 3d 20 70 58 2d 3e 73 68 61  hared |= pX->sha
27240 72 65 64 4d 61 73 6b 3b 0a 20 20 20 20 7d 0a 0a  redMask;.    }..
27250 20 20 20 20 2f 2a 20 47 65 74 20 73 68 61 72 65      /* Get share
27260 64 20 6c 6f 63 6b 73 20 61 74 20 74 68 65 20 73  d locks at the s
27270 79 73 74 65 6d 20 6c 65 76 65 6c 2c 20 69 66 20  ystem level, if 
27280 6e 65 63 65 73 73 61 72 79 20 2a 2f 0a 20 20 20  necessary */.   
27290 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
272a0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  OK ){.      if( 
272b0 28 61 6c 6c 53 68 61 72 65 64 20 26 20 6d 61 73  (allShared & mas
272c0 6b 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  k)==0 ){.       
272d0 20 72 63 20 3d 20 75 6e 69 78 53 68 6d 53 79 73   rc = unixShmSys
272e0 74 65 6d 4c 6f 63 6b 28 70 53 68 6d 4e 6f 64 65  temLock(pShmNode
272f0 2c 20 46 5f 52 44 4c 43 4b 2c 20 6f 66 73 74 2b  , F_RDLCK, ofst+
27300 55 4e 49 58 5f 53 48 4d 5f 42 41 53 45 2c 20 6e  UNIX_SHM_BASE, n
27310 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
27320 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
27330 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a  ITE_OK;.      }.
27340 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 47 65      }..    /* Ge
27350 74 20 74 68 65 20 6c 6f 63 61 6c 20 73 68 61 72  t the local shar
27360 65 64 20 6c 6f 63 6b 73 20 2a 2f 0a 20 20 20 20  ed locks */.    
27370 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
27380 4b 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 73 68  K ){.      p->sh
27390 61 72 65 64 4d 61 73 6b 20 7c 3d 20 6d 61 73 6b  aredMask |= mask
273a0 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b  ;.    }.  }else{
273b0 0a 20 20 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72  .    /* Make sur
273c0 65 20 6e 6f 20 73 69 62 6c 69 6e 67 20 63 6f 6e  e no sibling con
273d0 6e 65 63 74 69 6f 6e 73 20 68 6f 6c 64 20 6c 6f  nections hold lo
273e0 63 6b 73 20 74 68 61 74 20 77 69 6c 6c 20 62 6c  cks that will bl
273f0 6f 63 6b 20 74 68 69 73 0a 20 20 20 20 2a 2a 20  ock this.    ** 
27400 6c 6f 63 6b 2e 20 20 49 66 20 61 6e 79 20 64 6f  lock.  If any do
27410 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  , return SQLITE_
27420 42 55 53 59 20 72 69 67 68 74 20 61 77 61 79 2e  BUSY right away.
27430 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28  .    */.    for(
27440 70 58 3d 70 53 68 6d 4e 6f 64 65 2d 3e 70 46 69  pX=pShmNode->pFi
27450 72 73 74 3b 20 70 58 3b 20 70 58 3d 70 58 2d 3e  rst; pX; pX=pX->
27460 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 69 66  pNext){.      if
27470 28 20 28 70 58 2d 3e 65 78 63 6c 4d 61 73 6b 20  ( (pX->exclMask 
27480 26 20 6d 61 73 6b 29 21 3d 30 20 7c 7c 20 28 70  & mask)!=0 || (p
27490 58 2d 3e 73 68 61 72 65 64 4d 61 73 6b 20 26 20  X->sharedMask & 
274a0 6d 61 73 6b 29 21 3d 30 20 29 7b 0a 20 20 20 20  mask)!=0 ){.    
274b0 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
274c0 42 55 53 59 3b 0a 20 20 20 20 20 20 20 20 62 72  BUSY;.        br
274d0 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
274e0 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 47 65 74   }.  .    /* Get
274f0 20 74 68 65 20 65 78 63 6c 75 73 69 76 65 20 6c   the exclusive l
27500 6f 63 6b 73 20 61 74 20 74 68 65 20 73 79 73 74  ocks at the syst
27510 65 6d 20 6c 65 76 65 6c 2e 20 20 54 68 65 6e 20  em level.  Then 
27520 69 66 20 73 75 63 63 65 73 73 66 75 6c 0a 20 20  if successful.  
27530 20 20 2a 2a 20 61 6c 73 6f 20 6d 61 72 6b 20 74    ** also mark t
27540 68 65 20 6c 6f 63 61 6c 20 63 6f 6e 6e 65 63 74  he local connect
27550 69 6f 6e 20 61 73 20 62 65 69 6e 67 20 6c 6f 63  ion as being loc
27560 6b 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ked..    */.    
27570 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
27580 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  K ){.      rc = 
27590 75 6e 69 78 53 68 6d 53 79 73 74 65 6d 4c 6f 63  unixShmSystemLoc
275a0 6b 28 70 53 68 6d 4e 6f 64 65 2c 20 46 5f 57 52  k(pShmNode, F_WR
275b0 4c 43 4b 2c 20 6f 66 73 74 2b 55 4e 49 58 5f 53  LCK, ofst+UNIX_S
275c0 48 4d 5f 42 41 53 45 2c 20 6e 29 3b 0a 20 20 20  HM_BASE, n);.   
275d0 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
275e0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
275f0 61 73 73 65 72 74 28 20 28 70 2d 3e 73 68 61 72  assert( (p->shar
27600 65 64 4d 61 73 6b 20 26 20 6d 61 73 6b 29 3d 3d  edMask & mask)==
27610 30 20 29 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e  0 );.        p->
27620 65 78 63 6c 4d 61 73 6b 20 7c 3d 20 6d 61 73 6b  exclMask |= mask
27630 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
27640 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75    }.  sqlite3_mu
27650 74 65 78 5f 6c 65 61 76 65 28 70 53 68 6d 4e 6f  tex_leave(pShmNo
27660 64 65 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 4f 53  de->mutex);.  OS
27670 54 52 41 43 45 28 28 22 53 48 4d 2d 4c 4f 43 4b  TRACE(("SHM-LOCK
27680 20 73 68 6d 69 64 2d 25 64 2c 20 70 69 64 2d 25   shmid-%d, pid-%
27690 64 20 67 6f 74 20 25 30 33 78 2c 25 30 33 78 5c  d got %03x,%03x\
276a0 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70  n",.           p
276b0 2d 3e 69 64 2c 20 67 65 74 70 69 64 28 29 2c 20  ->id, getpid(), 
276c0 70 2d 3e 73 68 61 72 65 64 4d 61 73 6b 2c 20 70  p->sharedMask, p
276d0 2d 3e 65 78 63 6c 4d 61 73 6b 29 29 3b 0a 20 20  ->exclMask));.  
276e0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
276f0 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 20 61 20  .** Implement a 
27700 6d 65 6d 6f 72 79 20 62 61 72 72 69 65 72 20 6f  memory barrier o
27710 72 20 6d 65 6d 6f 72 79 20 66 65 6e 63 65 20 6f  r memory fence o
27720 6e 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 2e  n shared memory.
27730 20 20 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 6c 6f 61    .**.** All loa
27740 64 73 20 61 6e 64 20 73 74 6f 72 65 73 20 62 65  ds and stores be
27750 67 75 6e 20 62 65 66 6f 72 65 20 74 68 65 20 62  gun before the b
27760 61 72 72 69 65 72 20 6d 75 73 74 20 63 6f 6d 70  arrier must comp
27770 6c 65 74 65 20 62 65 66 6f 72 65 0a 2a 2a 20 61  lete before.** a
27780 6e 79 20 6c 6f 61 64 20 6f 72 20 73 74 6f 72 65  ny load or store
27790 20 62 65 67 75 6e 20 61 66 74 65 72 20 74 68 65   begun after the
277a0 20 62 61 72 72 69 65 72 2e 0a 2a 2f 0a 73 74 61   barrier..*/.sta
277b0 74 69 63 20 76 6f 69 64 20 75 6e 69 78 53 68 6d  tic void unixShm
277c0 42 61 72 72 69 65 72 28 0a 20 20 73 71 6c 69 74  Barrier(.  sqlit
277d0 65 33 5f 66 69 6c 65 20 2a 66 64 20 20 20 20 20  e3_file *fd     
277e0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61             /* Da
277f0 74 61 62 61 73 65 20 66 69 6c 65 20 68 6f 6c 64  tabase file hold
27800 69 6e 67 20 74 68 65 20 73 68 61 72 65 64 20 6d  ing the shared m
27810 65 6d 6f 72 79 20 2a 2f 0a 29 7b 0a 20 20 55 4e  emory */.){.  UN
27820 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 66  USED_PARAMETER(f
27830 64 29 3b 0a 20 20 75 6e 69 78 45 6e 74 65 72 4d  d);.  unixEnterM
27840 75 74 65 78 28 29 3b 0a 20 20 75 6e 69 78 4c 65  utex();.  unixLe
27850 61 76 65 4d 75 74 65 78 28 29 3b 0a 7d 0a 0a 2f  aveMutex();.}../
27860 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 20 63 6f 6e  *.** Close a con
27870 6e 65 63 74 69 6f 6e 20 74 6f 20 73 68 61 72 65  nection to share
27880 64 2d 6d 65 6d 6f 72 79 2e 20 20 44 65 6c 65 74  d-memory.  Delet
27890 65 20 74 68 65 20 75 6e 64 65 72 6c 79 69 6e 67  e the underlying
278a0 20 0a 2a 2a 20 73 74 6f 72 61 67 65 20 69 66 20   .** storage if 
278b0 64 65 6c 65 74 65 46 6c 61 67 20 69 73 20 74 72  deleteFlag is tr
278c0 75 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ue..**.** If the
278d0 72 65 20 69 73 20 6e 6f 20 73 68 61 72 65 64 20  re is no shared 
278e0 6d 65 6d 6f 72 79 20 61 73 73 6f 63 69 61 74 65  memory associate
278f0 64 20 77 69 74 68 20 74 68 65 20 63 6f 6e 6e 65  d with the conne
27900 63 74 69 6f 6e 20 74 68 65 6e 20 74 68 69 73 0a  ction then this.
27910 2a 2a 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20  ** routine is a 
27920 68 61 72 6d 6c 65 73 73 20 6e 6f 2d 6f 70 2e 0a  harmless no-op..
27930 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e  */.static int un
27940 69 78 53 68 6d 55 6e 6d 61 70 28 0a 20 20 73 71  ixShmUnmap(.  sq
27950 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66 64 2c 20  lite3_file *fd, 
27960 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
27970 20 54 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20   The underlying 
27980 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f  database file */
27990 0a 20 20 69 6e 74 20 64 65 6c 65 74 65 46 6c 61  .  int deleteFla
279a0 67 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  g               
279b0 20 20 20 2f 2a 20 44 65 6c 65 74 65 20 73 68 61     /* Delete sha
279c0 72 65 64 2d 6d 65 6d 6f 72 79 20 69 66 20 74 72  red-memory if tr
279d0 75 65 20 2a 2f 0a 29 7b 0a 20 20 75 6e 69 78 53  ue */.){.  unixS
279e0 68 6d 20 2a 70 3b 20 20 20 20 20 20 20 20 20 20  hm *p;          
279f0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
27a00 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20  e connection to 
27a10 62 65 20 63 6c 6f 73 65 64 20 2a 2f 0a 20 20 75  be closed */.  u
27a20 6e 69 78 53 68 6d 4e 6f 64 65 20 2a 70 53 68 6d  nixShmNode *pShm
27a30 4e 6f 64 65 3b 20 20 20 20 20 20 20 20 20 20 2f  Node;          /
27a40 2a 20 54 68 65 20 75 6e 64 65 72 6c 79 69 6e 67  * The underlying
27a50 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 66   shared-memory f
27a60 69 6c 65 20 2a 2f 0a 20 20 75 6e 69 78 53 68 6d  ile */.  unixShm
27a70 20 2a 2a 70 70 3b 20 20 20 20 20 20 20 20 20 20   **pp;          
27a80 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6f 72 20           /* For 
27a90 6c 6f 6f 70 69 6e 67 20 6f 76 65 72 20 73 69 62  looping over sib
27aa0 6c 69 6e 67 20 63 6f 6e 6e 65 63 74 69 6f 6e 73  ling connections
27ab0 20 2a 2f 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a   */.  unixFile *
27ac0 70 44 62 46 64 3b 20 20 20 20 20 20 20 20 20 20  pDbFd;          
27ad0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 75 6e 64        /* The und
27ae0 65 72 6c 79 69 6e 67 20 64 61 74 61 62 61 73 65  erlying database
27af0 20 66 69 6c 65 20 2a 2f 0a 0a 20 20 70 44 62 46   file */..  pDbF
27b00 64 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 66  d = (unixFile*)f
27b10 64 3b 0a 20 20 70 20 3d 20 70 44 62 46 64 2d 3e  d;.  p = pDbFd->
27b20 70 53 68 6d 3b 0a 20 20 69 66 28 20 70 3d 3d 30  pShm;.  if( p==0
27b30 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
27b40 5f 4f 4b 3b 0a 20 20 70 53 68 6d 4e 6f 64 65 20  _OK;.  pShmNode 
27b50 3d 20 70 2d 3e 70 53 68 6d 4e 6f 64 65 3b 0a 0a  = p->pShmNode;..
27b60 20 20 61 73 73 65 72 74 28 20 70 53 68 6d 4e 6f    assert( pShmNo
27b70 64 65 3d 3d 70 44 62 46 64 2d 3e 70 49 6e 6f 64  de==pDbFd->pInod
27b80 65 2d 3e 70 53 68 6d 4e 6f 64 65 20 29 3b 0a 20  e->pShmNode );. 
27b90 20 61 73 73 65 72 74 28 20 70 53 68 6d 4e 6f 64   assert( pShmNod
27ba0 65 2d 3e 70 49 6e 6f 64 65 3d 3d 70 44 62 46 64  e->pInode==pDbFd
27bb0 2d 3e 70 49 6e 6f 64 65 20 29 3b 0a 0a 20 20 2f  ->pInode );..  /
27bc0 2a 20 52 65 6d 6f 76 65 20 63 6f 6e 6e 65 63 74  * Remove connect
27bd0 69 6f 6e 20 70 20 66 72 6f 6d 20 74 68 65 20 73  ion p from the s
27be0 65 74 20 6f 66 20 63 6f 6e 6e 65 63 74 69 6f 6e  et of connection
27bf0 73 20 61 73 73 6f 63 69 61 74 65 64 0a 20 20 2a  s associated.  *
27c00 2a 20 77 69 74 68 20 70 53 68 6d 4e 6f 64 65 20  * with pShmNode 
27c10 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  */.  sqlite3_mut
27c20 65 78 5f 65 6e 74 65 72 28 70 53 68 6d 4e 6f 64  ex_enter(pShmNod
27c30 65 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 66 6f 72  e->mutex);.  for
27c40 28 70 70 3d 26 70 53 68 6d 4e 6f 64 65 2d 3e 70  (pp=&pShmNode->p
27c50 46 69 72 73 74 3b 20 28 2a 70 70 29 21 3d 70 3b  First; (*pp)!=p;
27c60 20 70 70 20 3d 20 26 28 2a 70 70 29 2d 3e 70 4e   pp = &(*pp)->pN
27c70 65 78 74 29 7b 7d 0a 20 20 2a 70 70 20 3d 20 70  ext){}.  *pp = p
27c80 2d 3e 70 4e 65 78 74 3b 0a 0a 20 20 2f 2a 20 46  ->pNext;..  /* F
27c90 72 65 65 20 74 68 65 20 63 6f 6e 6e 65 63 74 69  ree the connecti
27ca0 6f 6e 20 70 20 2a 2f 0a 20 20 73 71 6c 69 74 65  on p */.  sqlite
27cb0 33 5f 66 72 65 65 28 70 29 3b 0a 20 20 70 44 62  3_free(p);.  pDb
27cc0 46 64 2d 3e 70 53 68 6d 20 3d 20 30 3b 0a 20 20  Fd->pShm = 0;.  
27cd0 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65  sqlite3_mutex_le
27ce0 61 76 65 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75  ave(pShmNode->mu
27cf0 74 65 78 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 70  tex);..  /* If p
27d00 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 66 20 68 61  ShmNode->nRef ha
27d10 73 20 72 65 61 63 68 65 64 20 30 2c 20 74 68 65  s reached 0, the
27d20 6e 20 63 6c 6f 73 65 20 74 68 65 20 75 6e 64 65  n close the unde
27d30 72 6c 79 69 6e 67 0a 20 20 2a 2a 20 73 68 61 72  rlying.  ** shar
27d40 65 64 2d 6d 65 6d 6f 72 79 20 66 69 6c 65 2c 20  ed-memory file, 
27d50 74 6f 6f 20 2a 2f 0a 20 20 75 6e 69 78 45 6e 74  too */.  unixEnt
27d60 65 72 4d 75 74 65 78 28 29 3b 0a 20 20 61 73 73  erMutex();.  ass
27d70 65 72 74 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e  ert( pShmNode->n
27d80 52 65 66 3e 30 20 29 3b 0a 20 20 70 53 68 6d 4e  Ref>0 );.  pShmN
27d90 6f 64 65 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20 69  ode->nRef--;.  i
27da0 66 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65  f( pShmNode->nRe
27db0 66 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20  f==0 ){.    if( 
27dc0 64 65 6c 65 74 65 46 6c 61 67 20 26 26 20 70 53  deleteFlag && pS
27dd0 68 6d 4e 6f 64 65 2d 3e 68 3e 3d 30 20 29 20 6f  hmNode->h>=0 ) o
27de0 73 55 6e 6c 69 6e 6b 28 70 53 68 6d 4e 6f 64 65  sUnlink(pShmNode
27df0 2d 3e 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20  ->zFilename);.  
27e00 20 20 75 6e 69 78 53 68 6d 50 75 72 67 65 28 70    unixShmPurge(p
27e10 44 62 46 64 29 3b 0a 20 20 7d 0a 20 20 75 6e 69  DbFd);.  }.  uni
27e20 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 0a  xLeaveMutex();..
27e30 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
27e40 4f 4b 3b 0a 7d 0a 0a 0a 23 65 6c 73 65 0a 23 20  OK;.}...#else.# 
27e50 64 65 66 69 6e 65 20 75 6e 69 78 53 68 6d 4d 61  define unixShmMa
27e60 70 20 20 20 20 20 30 0a 23 20 64 65 66 69 6e 65  p     0.# define
27e70 20 75 6e 69 78 53 68 6d 4c 6f 63 6b 20 20 20 20   unixShmLock    
27e80 30 0a 23 20 64 65 66 69 6e 65 20 75 6e 69 78 53  0.# define unixS
27e90 68 6d 42 61 72 72 69 65 72 20 30 0a 23 20 64 65  hmBarrier 0.# de
27ea0 66 69 6e 65 20 75 6e 69 78 53 68 6d 55 6e 6d 61  fine unixShmUnma
27eb0 70 20 20 20 30 0a 23 65 6e 64 69 66 20 2f 2a 20  p   0.#endif /* 
27ec0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
27ed0 4d 49 54 5f 57 41 4c 20 2a 2f 0a 0a 2f 2a 0a 2a  MIT_WAL */../*.*
27ee0 2a 20 48 65 72 65 20 65 6e 64 73 20 74 68 65 20  * Here ends the 
27ef0 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f  implementation o
27f00 66 20 61 6c 6c 20 73 71 6c 69 74 65 33 5f 66 69  f all sqlite3_fi
27f10 6c 65 20 6d 65 74 68 6f 64 73 2e 0a 2a 2a 0a 2a  le methods..**.*
27f20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
27f30 2a 2a 2a 2a 2a 20 45 6e 64 20 73 71 6c 69 74 65  ***** End sqlite
27f40 33 5f 66 69 6c 65 20 4d 65 74 68 6f 64 73 20 2a  3_file Methods *
27f50 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
27f60 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a  **************.*
27f70 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
27f80 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
27f90 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
27fa0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
27fb0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a  *************/..
27fc0 2f 2a 0a 2a 2a 20 54 68 69 73 20 64 69 76 69 73  /*.** This divis
27fd0 69 6f 6e 20 63 6f 6e 74 61 69 6e 73 20 64 65 66  ion contains def
27fe0 69 6e 69 74 69 6f 6e 73 20 6f 66 20 73 71 6c 69  initions of sqli
27ff0 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 6f  te3_io_methods o
28000 62 6a 65 63 74 73 20 74 68 61 74 0a 2a 2a 20 69  bjects that.** i
28010 6d 70 6c 65 6d 65 6e 74 20 76 61 72 69 6f 75 73  mplement various
28020 20 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 20 73 74   file locking st
28030 72 61 74 65 67 69 65 73 2e 20 20 49 74 20 61 6c  rategies.  It al
28040 73 6f 20 63 6f 6e 74 61 69 6e 73 20 64 65 66 69  so contains defi
28050 6e 69 74 69 6f 6e 73 0a 2a 2a 20 6f 66 20 22 66  nitions.** of "f
28060 69 6e 64 65 72 22 20 66 75 6e 63 74 69 6f 6e 73  inder" functions
28070 2e 20 20 41 20 66 69 6e 64 65 72 2d 66 75 6e 63  .  A finder-func
28080 74 69 6f 6e 20 69 73 20 75 73 65 64 20 74 6f 20  tion is used to 
28090 6c 6f 63 61 74 65 20 74 68 65 20 61 70 70 72 6f  locate the appro
280a0 70 72 69 61 74 65 0a 2a 2a 20 73 71 6c 69 74 65  priate.** sqlite
280b0 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 6f 62 6a  3_io_methods obj
280c0 65 63 74 20 66 6f 72 20 61 20 70 61 72 74 69 63  ect for a partic
280d0 75 6c 61 72 20 64 61 74 61 62 61 73 65 20 66 69  ular database fi
280e0 6c 65 2e 20 20 54 68 65 20 70 41 70 70 44 61 74  le.  The pAppDat
280f0 61 0a 2a 2a 20 66 69 65 6c 64 20 6f 66 20 74 68  a.** field of th
28100 65 20 73 71 6c 69 74 65 33 5f 76 66 73 20 56 46  e sqlite3_vfs VF
28110 53 20 6f 62 6a 65 63 74 73 20 61 72 65 20 69 6e  S objects are in
28120 69 74 69 61 6c 69 7a 65 64 20 74 6f 20 62 65 20  itialized to be 
28130 70 6f 69 6e 74 65 72 73 20 74 6f 0a 2a 2a 20 74  pointers to.** t
28140 68 65 20 63 6f 72 72 65 63 74 20 66 69 6e 64 65  he correct finde
28150 72 2d 66 75 6e 63 74 69 6f 6e 20 66 6f 72 20 74  r-function for t
28160 68 61 74 20 56 46 53 2e 0a 2a 2a 0a 2a 2a 20 4d  hat VFS..**.** M
28170 6f 73 74 20 66 69 6e 64 65 72 20 66 75 6e 63 74  ost finder funct
28180 69 6f 6e 73 20 72 65 74 75 72 6e 20 61 20 70 6f  ions return a po
28190 69 6e 74 65 72 20 74 6f 20 61 20 66 69 78 65 64  inter to a fixed
281a0 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68   sqlite3_io_meth
281b0 6f 64 73 0a 2a 2a 20 6f 62 6a 65 63 74 2e 20 20  ods.** object.  
281c0 54 68 65 20 6f 6e 6c 79 20 69 6e 74 65 72 65 73  The only interes
281d0 74 69 6e 67 20 66 69 6e 64 65 72 2d 66 75 6e 63  ting finder-func
281e0 74 69 6f 6e 20 69 73 20 61 75 74 6f 6c 6f 63 6b  tion is autolock
281f0 49 6f 46 69 6e 64 65 72 2c 20 77 68 69 63 68 0a  IoFinder, which.
28200 2a 2a 20 6c 6f 6f 6b 73 20 61 74 20 74 68 65 20  ** looks at the 
28210 66 69 6c 65 73 79 73 74 65 6d 20 74 79 70 65 20  filesystem type 
28220 61 6e 64 20 74 72 69 65 73 20 74 6f 20 67 75 65  and tries to gue
28230 73 73 20 74 68 65 20 62 65 73 74 20 6c 6f 63 6b  ss the best lock
28240 69 6e 67 0a 2a 2a 20 73 74 72 61 74 65 67 79 20  ing.** strategy 
28250 66 72 6f 6d 20 74 68 61 74 2e 0a 2a 2a 0a 2a 2a  from that..**.**
28260 20 46 6f 72 20 66 69 6e 64 65 72 2d 66 75 6e 74   For finder-funt
28270 69 6f 6e 20 46 2c 20 74 77 6f 20 6f 62 6a 65 63  ion F, two objec
28280 74 73 20 61 72 65 20 63 72 65 61 74 65 64 3a 0a  ts are created:.
28290 2a 2a 0a 2a 2a 20 20 20 20 28 31 29 20 54 68 65  **.**    (1) The
282a0 20 72 65 61 6c 20 66 69 6e 64 65 72 2d 66 75 6e   real finder-fun
282b0 63 74 69 6f 6e 20 6e 61 6d 65 64 20 22 46 49 6d  ction named "FIm
282c0 70 74 28 29 22 2e 0a 2a 2a 0a 2a 2a 20 20 20 20  pt()"..**.**    
282d0 28 32 29 20 41 20 63 6f 6e 73 74 61 6e 74 20 70  (2) A constant p
282e0 6f 69 6e 74 65 72 20 74 6f 20 74 68 69 73 20 66  ointer to this f
282f0 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 64 20 6a 75  unction named ju
28300 73 74 20 22 46 22 2e 0a 2a 2a 0a 2a 2a 0a 2a 2a  st "F"..**.**.**
28310 20 41 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68   A pointer to th
28320 65 20 46 20 70 6f 69 6e 74 65 72 20 69 73 20 75  e F pointer is u
28330 73 65 64 20 61 73 20 74 68 65 20 70 41 70 70 44  sed as the pAppD
28340 61 74 61 20 76 61 6c 75 65 20 66 6f 72 20 56 46  ata value for VF
28350 53 0a 2a 2a 20 6f 62 6a 65 63 74 73 2e 20 20 57  S.** objects.  W
28360 65 20 68 61 76 65 20 74 6f 20 64 6f 20 74 68 69  e have to do thi
28370 73 20 69 6e 73 74 65 61 64 20 6f 66 20 6c 65 74  s instead of let
28380 74 69 6e 67 20 70 41 70 70 44 61 74 61 20 70 6f  ting pAppData po
28390 69 6e 74 0a 2a 2a 20 64 69 72 65 63 74 6c 79 20  int.** directly 
283a0 61 74 20 74 68 65 20 66 69 6e 64 65 72 2d 66 75  at the finder-fu
283b0 6e 63 74 69 6f 6e 20 73 69 6e 63 65 20 43 39 30  nction since C90
283c0 20 72 75 6c 65 73 20 70 72 65 76 65 6e 74 20 61   rules prevent a
283d0 20 76 6f 69 64 2a 0a 2a 2a 20 66 72 6f 6d 20 62   void*.** from b
283e0 65 20 63 61 73 74 20 69 6e 74 6f 20 61 20 66 75  e cast into a fu
283f0 6e 63 74 69 6f 6e 20 70 6f 69 6e 74 65 72 2e 0a  nction pointer..
28400 2a 2a 0a 2a 2a 0a 2a 2a 20 45 61 63 68 20 69 6e  **.**.** Each in
28410 73 74 61 6e 63 65 20 6f 66 20 74 68 69 73 20 6d  stance of this m
28420 61 63 72 6f 20 67 65 6e 65 72 61 74 65 73 20 74  acro generates t
28430 77 6f 20 6f 62 6a 65 63 74 73 3a 0a 2a 2a 0a 2a  wo objects:.**.*
28440 2a 20 20 20 2a 20 20 41 20 63 6f 6e 73 74 61 6e  *   *  A constan
28450 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74  t sqlite3_io_met
28460 68 6f 64 73 20 6f 62 6a 65 63 74 20 63 61 6c 6c  hods object call
28470 20 4d 45 54 48 4f 44 20 74 68 61 74 20 68 61 73   METHOD that has
28480 20 6c 6f 63 6b 69 6e 67 0a 2a 2a 20 20 20 20 20   locking.**     
28490 20 6d 65 74 68 6f 64 73 20 43 4c 4f 53 45 2c 20   methods CLOSE, 
284a0 4c 4f 43 4b 2c 20 55 4e 4c 4f 43 4b 2c 20 43 4b  LOCK, UNLOCK, CK
284b0 52 45 53 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 20  RESLOCK..**.**  
284c0 20 2a 20 20 41 6e 20 49 2f 4f 20 6d 65 74 68 6f   *  An I/O metho
284d0 64 20 66 69 6e 64 65 72 20 66 75 6e 63 74 69 6f  d finder functio
284e0 6e 20 63 61 6c 6c 65 64 20 46 49 4e 44 45 52 20  n called FINDER 
284f0 74 68 61 74 20 72 65 74 75 72 6e 73 20 61 20 70  that returns a p
28500 6f 69 6e 74 65 72 0a 2a 2a 20 20 20 20 20 20 74  ointer.**      t
28510 6f 20 74 68 65 20 4d 45 54 48 4f 44 20 6f 62 6a  o the METHOD obj
28520 65 63 74 20 69 6e 20 74 68 65 20 70 72 65 76 69  ect in the previ
28530 6f 75 73 20 62 75 6c 6c 65 74 2e 0a 2a 2f 0a 23  ous bullet..*/.#
28540 64 65 66 69 6e 65 20 49 4f 4d 45 54 48 4f 44 53  define IOMETHODS
28550 28 46 49 4e 44 45 52 2c 20 4d 45 54 48 4f 44 2c  (FINDER, METHOD,
28560 20 56 45 52 53 49 4f 4e 2c 20 43 4c 4f 53 45 2c   VERSION, CLOSE,
28570 20 4c 4f 43 4b 2c 20 55 4e 4c 4f 43 4b 2c 20 43   LOCK, UNLOCK, C
28580 4b 4c 4f 43 4b 29 20 20 20 20 20 20 5c 0a 73 74  KLOCK)      \.st
28590 61 74 69 63 20 63 6f 6e 73 74 20 73 71 6c 69 74  atic const sqlit
285a0 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 4d 45  e3_io_methods ME
285b0 54 48 4f 44 20 3d 20 7b 20 20 20 20 20 20 20 20  THOD = {        
285c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
285d0 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20             \.   
285e0 56 45 52 53 49 4f 4e 2c 20 20 20 20 20 20 20 20  VERSION,        
285f0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 69              /* i
28600 56 65 72 73 69 6f 6e 20 2a 2f 20 20 20 20 20 20  Version */      
28610 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28620 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 43            \.   C
28630 4c 4f 53 45 2c 20 20 20 20 20 20 20 20 20 20 20  LOSE,           
28640 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 43             /* xC
28650 6c 6f 73 65 20 2a 2f 20 20 20 20 20 20 20 20 20  lose */         
28660 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28670 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 75 6e           \.   un
28680 69 78 52 65 61 64 2c 20 20 20 20 20 20 20 20 20  ixRead,         
28690 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 52 65            /* xRe
286a0 61 64 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20  ad */           
286b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
286c0 20 20 20 20 20 20 20 20 5c 0a 20 20 20 75 6e 69          \.   uni
286d0 78 57 72 69 74 65 2c 20 20 20 20 20 20 20 20 20  xWrite,         
286e0 20 20 20 20 20 20 20 20 20 2f 2a 20 78 57 72 69           /* xWri
286f0 74 65 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20  te */           
28700 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28710 20 20 20 20 20 20 20 5c 0a 20 20 20 75 6e 69 78         \.   unix
28720 54 72 75 6e 63 61 74 65 2c 20 20 20 20 20 20 20  Truncate,       
28730 20 20 20 20 20 20 20 20 2f 2a 20 78 54 72 75 6e          /* xTrun
28740 63 61 74 65 20 2a 2f 20 20 20 20 20 20 20 20 20  cate */         
28750 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28760 20 20 20 20 20 20 5c 0a 20 20 20 75 6e 69 78 53        \.   unixS
28770 79 6e 63 2c 20 20 20 20 20 20 20 20 20 20 20 20  ync,            
28780 20 20 20 20 20 20 20 2f 2a 20 78 53 79 6e 63 20         /* xSync 
28790 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20 20 20  */              
287a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
287b0 20 20 20 20 20 5c 0a 20 20 20 75 6e 69 78 46 69       \.   unixFi
287c0 6c 65 53 69 7a 65 2c 20 20 20 20 20 20 20 20 20  leSize,         
287d0 20 20 20 20 20 20 2f 2a 20 78 46 69 6c 65 53 69        /* xFileSi
287e0 7a 65 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20  ze */           
287f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28800 20 20 20 20 5c 0a 20 20 20 4c 4f 43 4b 2c 20 20      \.   LOCK,  
28810 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28820 20 20 20 20 20 2f 2a 20 78 4c 6f 63 6b 20 2a 2f       /* xLock */
28830 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28840 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28850 20 20 20 5c 0a 20 20 20 55 4e 4c 4f 43 4b 2c 20     \.   UNLOCK, 
28860 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28870 20 20 20 20 2f 2a 20 78 55 6e 6c 6f 63 6b 20 2a      /* xUnlock *
28880 2f 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  /               
28890 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
288a0 20 20 5c 0a 20 20 20 43 4b 4c 4f 43 4b 2c 20 20    \.   CKLOCK,  
288b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
288c0 20 20 20 2f 2a 20 78 43 68 65 63 6b 52 65 73 65     /* xCheckRese
288d0 72 76 65 64 4c 6f 63 6b 20 2a 2f 20 20 20 20 20  rvedLock */     
288e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
288f0 20 5c 0a 20 20 20 75 6e 69 78 46 69 6c 65 43 6f   \.   unixFileCo
28900 6e 74 72 6f 6c 2c 20 20 20 20 20 20 20 20 20 20  ntrol,          
28910 20 20 2f 2a 20 78 46 69 6c 65 43 6f 6e 74 72 6f    /* xFileContro
28920 6c 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20  l */            
28930 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28940 5c 0a 20 20 20 75 6e 69 78 53 65 63 74 6f 72 53  \.   unixSectorS
28950 69 7a 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  ize,            
28960 20 2f 2a 20 78 53 65 63 74 6f 72 53 69 7a 65 20   /* xSectorSize 
28970 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20 20 20  */              
28980 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c                 \
28990 0a 20 20 20 75 6e 69 78 44 65 76 69 63 65 43 68  .   unixDeviceCh
289a0 61 72 61 63 74 65 72 69 73 74 69 63 73 2c 20 20  aracteristics,  
289b0 2f 2a 20 78 44 65 76 69 63 65 43 61 70 61 62 69  /* xDeviceCapabi
289c0 6c 69 74 69 65 73 20 2a 2f 20 20 20 20 20 20 20  lities */       
289d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a                \.
289e0 20 20 20 75 6e 69 78 53 68 6d 4d 61 70 2c 20 20     unixShmMap,  
289f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
28a00 2a 20 78 53 68 6d 4d 61 70 20 2a 2f 20 20 20 20  * xShmMap */    
28a10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28a20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20               \. 
28a30 20 20 75 6e 69 78 53 68 6d 4c 6f 63 6b 2c 20 20    unixShmLock,  
28a40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
28a50 20 78 53 68 6d 4c 6f 63 6b 20 2a 2f 20 20 20 20   xShmLock */    
28a60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28a70 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20              \.  
28a80 20 75 6e 69 78 53 68 6d 42 61 72 72 69 65 72 2c   unixShmBarrier,
28a90 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
28aa0 78 53 68 6d 42 61 72 72 69 65 72 20 2a 2f 20 20  xShmBarrier */  
28ab0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28ac0 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20             \.   
28ad0 75 6e 69 78 53 68 6d 55 6e 6d 61 70 20 20 20 20  unixShmUnmap    
28ae0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
28af0 53 68 6d 55 6e 6d 61 70 20 2a 2f 20 20 20 20 20  ShmUnmap */     
28b00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28b10 20 20 20 20 20 20 20 20 20 20 5c 0a 7d 3b 20 20            \.};  
28b20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28b30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28b40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28b50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28b60 20 20 20 20 20 20 20 20 20 5c 0a 73 74 61 74 69           \.stati
28b70 63 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f  c const sqlite3_
28b80 69 6f 5f 6d 65 74 68 6f 64 73 20 2a 46 49 4e 44  io_methods *FIND
28b90 45 52 23 23 49 6d 70 6c 28 63 6f 6e 73 74 20 63  ER##Impl(const c
28ba0 68 61 72 20 2a 7a 2c 20 75 6e 69 78 46 69 6c 65  har *z, unixFile
28bb0 20 2a 70 29 7b 20 20 20 5c 0a 20 20 55 4e 55 53   *p){   \.  UNUS
28bc0 45 44 5f 50 41 52 41 4d 45 54 45 52 28 7a 29 3b  ED_PARAMETER(z);
28bd0 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
28be0 52 28 70 29 3b 20 20 20 20 20 20 20 20 20 20 20  R(p);           
28bf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28c00 20 20 20 20 20 20 20 5c 0a 20 20 72 65 74 75 72         \.  retur
28c10 6e 20 26 4d 45 54 48 4f 44 3b 20 20 20 20 20 20  n &METHOD;      
28c20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28c30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28c40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28c50 20 20 20 20 20 20 5c 0a 7d 20 20 20 20 20 20 20        \.}       
28c60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28c70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28c80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28c90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28ca0 20 20 20 20 20 5c 0a 73 74 61 74 69 63 20 63 6f       \.static co
28cb0 6e 73 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d  nst sqlite3_io_m
28cc0 65 74 68 6f 64 73 20 2a 28 2a 63 6f 6e 73 74 20  ethods *(*const 
28cd0 46 49 4e 44 45 52 29 28 63 6f 6e 73 74 20 63 68  FINDER)(const ch
28ce0 61 72 2a 2c 75 6e 69 78 46 69 6c 65 20 2a 70 29  ar*,unixFile *p)
28cf0 20 20 20 20 5c 0a 20 20 20 20 3d 20 46 49 4e 44      \.    = FIND
28d00 45 52 23 23 49 6d 70 6c 3b 0a 0a 2f 2a 0a 2a 2a  ER##Impl;../*.**
28d10 20 48 65 72 65 20 61 72 65 20 61 6c 6c 20 6f 66   Here are all of
28d20 20 74 68 65 20 73 71 6c 69 74 65 33 5f 69 6f 5f   the sqlite3_io_
28d30 6d 65 74 68 6f 64 73 20 6f 62 6a 65 63 74 73 20  methods objects 
28d40 66 6f 72 20 65 61 63 68 20 6f 66 20 74 68 65 0a  for each of the.
28d50 2a 2a 20 6c 6f 63 6b 69 6e 67 20 73 74 72 61 74  ** locking strat
28d60 65 67 69 65 73 2e 20 20 46 75 6e 63 74 69 6f 6e  egies.  Function
28d70 73 20 74 68 61 74 20 72 65 74 75 72 6e 20 70 6f  s that return po
28d80 69 6e 74 65 72 73 20 74 6f 20 74 68 65 73 65 20  inters to these 
28d90 6d 65 74 68 6f 64 73 0a 2a 2a 20 61 72 65 20 61  methods.** are a
28da0 6c 73 6f 20 63 72 65 61 74 65 64 2e 0a 2a 2f 0a  lso created..*/.
28db0 49 4f 4d 45 54 48 4f 44 53 28 0a 20 20 70 6f 73  IOMETHODS(.  pos
28dc0 69 78 49 6f 46 69 6e 64 65 72 2c 20 20 20 20 20  ixIoFinder,     
28dd0 20 20 20 20 20 20 20 2f 2a 20 46 69 6e 64 65 72         /* Finder
28de0 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 20 2a   function name *
28df0 2f 0a 20 20 70 6f 73 69 78 49 6f 4d 65 74 68 6f  /.  posixIoMetho
28e00 64 73 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ds,           /*
28e10 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68   sqlite3_io_meth
28e20 6f 64 73 20 6f 62 6a 65 63 74 20 6e 61 6d 65 20  ods object name 
28e30 2a 2f 0a 20 20 32 2c 20 20 20 20 20 20 20 20 20  */.  2,         
28e40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
28e50 2a 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20  * shared memory 
28e60 69 73 20 65 6e 61 62 6c 65 64 20 2a 2f 0a 20 20  is enabled */.  
28e70 75 6e 69 78 43 6c 6f 73 65 2c 20 20 20 20 20 20  unixClose,      
28e80 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 43 6c            /* xCl
28e90 6f 73 65 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20  ose method */.  
28ea0 75 6e 69 78 4c 6f 63 6b 2c 20 20 20 20 20 20 20  unixLock,       
28eb0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 4c 6f            /* xLo
28ec0 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 75  ck method */.  u
28ed0 6e 69 78 55 6e 6c 6f 63 6b 2c 20 20 20 20 20 20  nixUnlock,      
28ee0 20 20 20 20 20 20 20 20 20 2f 2a 20 78 55 6e 6c           /* xUnl
28ef0 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20  ock method */.  
28f00 75 6e 69 78 43 68 65 63 6b 52 65 73 65 72 76 65  unixCheckReserve
28f10 64 4c 6f 63 6b 20 20 20 20 20 2f 2a 20 78 43 68  dLock     /* xCh
28f20 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 20  eckReservedLock 
28f30 6d 65 74 68 6f 64 20 2a 2f 0a 29 0a 49 4f 4d 45  method */.).IOME
28f40 54 48 4f 44 53 28 0a 20 20 6e 6f 6c 6f 63 6b 49  THODS(.  nolockI
28f50 6f 46 69 6e 64 65 72 2c 20 20 20 20 20 20 20 20  oFinder,        
28f60 20 20 20 2f 2a 20 46 69 6e 64 65 72 20 66 75 6e     /* Finder fun
28f70 63 74 69 6f 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20  ction name */.  
28f80 6e 6f 6c 6f 63 6b 49 6f 4d 65 74 68 6f 64 73 2c  nolockIoMethods,
28f90 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73 71 6c            /* sql
28fa0 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20  ite3_io_methods 
28fb0 6f 62 6a 65 63 74 20 6e 61 6d 65 20 2a 2f 0a 20  object name */. 
28fc0 20 31 2c 20 20 20 20 20 20 20 20 20 20 20 20 20   1,             
28fd0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73 68             /* sh
28fe0 61 72 65 64 20 6d 65 6d 6f 72 79 20 69 73 20 64  ared memory is d
28ff0 69 73 61 62 6c 65 64 20 2a 2f 0a 20 20 6e 6f 6c  isabled */.  nol
29000 6f 63 6b 43 6c 6f 73 65 2c 20 20 20 20 20 20 20  ockClose,       
29010 20 20 20 20 20 20 20 2f 2a 20 78 43 6c 6f 73 65         /* xClose
29020 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 6e 6f 6c   method */.  nol
29030 6f 63 6b 4c 6f 63 6b 2c 20 20 20 20 20 20 20 20  ockLock,        
29040 20 20 20 20 20 20 20 2f 2a 20 78 4c 6f 63 6b 20         /* xLock 
29050 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 6e 6f 6c 6f  method */.  nolo
29060 63 6b 55 6e 6c 6f 63 6b 2c 20 20 20 20 20 20 20  ckUnlock,       
29070 20 20 20 20 20 20 2f 2a 20 78 55 6e 6c 6f 63 6b        /* xUnlock
29080 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 6e 6f 6c   method */.  nol
29090 6f 63 6b 43 68 65 63 6b 52 65 73 65 72 76 65 64  ockCheckReserved
290a0 4c 6f 63 6b 20 20 20 2f 2a 20 78 43 68 65 63 6b  Lock   /* xCheck
290b0 52 65 73 65 72 76 65 64 4c 6f 63 6b 20 6d 65 74  ReservedLock met
290c0 68 6f 64 20 2a 2f 0a 29 0a 49 4f 4d 45 54 48 4f  hod */.).IOMETHO
290d0 44 53 28 0a 20 20 64 6f 74 6c 6f 63 6b 49 6f 46  DS(.  dotlockIoF
290e0 69 6e 64 65 72 2c 20 20 20 20 20 20 20 20 20 20  inder,          
290f0 2f 2a 20 46 69 6e 64 65 72 20 66 75 6e 63 74 69  /* Finder functi
29100 6f 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20 64 6f 74  on name */.  dot
29110 6c 6f 63 6b 49 6f 4d 65 74 68 6f 64 73 2c 20 20  lockIoMethods,  
29120 20 20 20 20 20 20 20 2f 2a 20 73 71 6c 69 74 65         /* sqlite
29130 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 6f 62 6a  3_io_methods obj
29140 65 63 74 20 6e 61 6d 65 20 2a 2f 0a 20 20 31 2c  ect name */.  1,
29150 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29160 20 20 20 20 20 20 20 20 2f 2a 20 73 68 61 72 65          /* share
29170 64 20 6d 65 6d 6f 72 79 20 69 73 20 64 69 73 61  d memory is disa
29180 62 6c 65 64 20 2a 2f 0a 20 20 64 6f 74 6c 6f 63  bled */.  dotloc
29190 6b 43 6c 6f 73 65 2c 20 20 20 20 20 20 20 20 20  kClose,         
291a0 20 20 20 20 2f 2a 20 78 43 6c 6f 73 65 20 6d 65      /* xClose me
291b0 74 68 6f 64 20 2a 2f 0a 20 20 64 6f 74 6c 6f 63  thod */.  dotloc
291c0 6b 4c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20  kLock,          
291d0 20 20 20 20 2f 2a 20 78 4c 6f 63 6b 20 6d 65 74      /* xLock met
291e0 68 6f 64 20 2a 2f 0a 20 20 64 6f 74 6c 6f 63 6b  hod */.  dotlock
291f0 55 6e 6c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20  Unlock,         
29200 20 20 20 2f 2a 20 78 55 6e 6c 6f 63 6b 20 6d 65     /* xUnlock me
29210 74 68 6f 64 20 2a 2f 0a 20 20 64 6f 74 6c 6f 63  thod */.  dotloc
29220 6b 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f  kCheckReservedLo
29230 63 6b 20 20 2f 2a 20 78 43 68 65 63 6b 52 65 73  ck  /* xCheckRes
29240 65 72 76 65 64 4c 6f 63 6b 20 6d 65 74 68 6f 64  ervedLock method
29250 20 2a 2f 0a 29 0a 0a 23 69 66 20 53 51 4c 49 54   */.)..#if SQLIT
29260 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47  E_ENABLE_LOCKING
29270 5f 53 54 59 4c 45 20 26 26 20 21 4f 53 5f 56 58  _STYLE && !OS_VX
29280 57 4f 52 4b 53 0a 49 4f 4d 45 54 48 4f 44 53 28  WORKS.IOMETHODS(
29290 0a 20 20 66 6c 6f 63 6b 49 6f 46 69 6e 64 65 72  .  flockIoFinder
292a0 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
292b0 46 69 6e 64 65 72 20 66 75 6e 63 74 69 6f 6e 20  Finder function 
292c0 6e 61 6d 65 20 2a 2f 0a 20 20 66 6c 6f 63 6b 49  name */.  flockI
292d0 6f 4d 65 74 68 6f 64 73 2c 20 20 20 20 20 20 20  oMethods,       
292e0 20 20 20 20 2f 2a 20 73 71 6c 69 74 65 33 5f 69      /* sqlite3_i
292f0 6f 5f 6d 65 74 68 6f 64 73 20 6f 62 6a 65 63 74  o_methods object
29300 20 6e 61 6d 65 20 2a 2f 0a 20 20 31 2c 20 20 20   name */.  1,   
29310 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29320 20 20 20 20 20 2f 2a 20 73 68 61 72 65 64 20 6d       /* shared m
29330 65 6d 6f 72 79 20 69 73 20 64 69 73 61 62 6c 65  emory is disable
29340 64 20 2a 2f 0a 20 20 66 6c 6f 63 6b 43 6c 6f 73  d */.  flockClos
29350 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
29360 20 2f 2a 20 78 43 6c 6f 73 65 20 6d 65 74 68 6f   /* xClose metho
29370 64 20 2a 2f 0a 20 20 66 6c 6f 63 6b 4c 6f 63 6b  d */.  flockLock
29380 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
29390 20 2f 2a 20 78 4c 6f 63 6b 20 6d 65 74 68 6f 64   /* xLock method
293a0 20 2a 2f 0a 20 20 66 6c 6f 63 6b 55 6e 6c 6f 63   */.  flockUnloc
293b0 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  k,              
293c0 2f 2a 20 78 55 6e 6c 6f 63 6b 20 6d 65 74 68 6f  /* xUnlock metho
293d0 64 20 2a 2f 0a 20 20 66 6c 6f 63 6b 43 68 65 63  d */.  flockChec
293e0 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 20 20 20  kReservedLock   
293f0 20 2f 2a 20 78 43 68 65 63 6b 52 65 73 65 72 76   /* xCheckReserv
29400 65 64 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f  edLock method */
29410 0a 29 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 4f  .).#endif..#if O
29420 53 5f 56 58 57 4f 52 4b 53 0a 49 4f 4d 45 54 48  S_VXWORKS.IOMETH
29430 4f 44 53 28 0a 20 20 73 65 6d 49 6f 46 69 6e 64  ODS(.  semIoFind
29440 65 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  er,             
29450 20 2f 2a 20 46 69 6e 64 65 72 20 66 75 6e 63 74   /* Finder funct
29460 69 6f 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20 73 65  ion name */.  se
29470 6d 49 6f 4d 65 74 68 6f 64 73 2c 20 20 20 20 20  mIoMethods,     
29480 20 20 20 20 20 20 20 20 2f 2a 20 73 71 6c 69 74          /* sqlit
29490 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 6f 62  e3_io_methods ob
294a0 6a 65 63 74 20 6e 61 6d 65 20 2a 2f 0a 20 20 31  ject name */.  1
294b0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
294c0 20 20 20 20 20 20 20 20 20 2f 2a 20 73 68 61 72           /* shar
294d0 65 64 20 6d 65 6d 6f 72 79 20 69 73 20 64 69 73  ed memory is dis
294e0 61 62 6c 65 64 20 2a 2f 0a 20 20 73 65 6d 43 6c  abled */.  semCl
294f0 6f 73 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  ose,            
29500 20 20 20 20 20 2f 2a 20 78 43 6c 6f 73 65 20 6d       /* xClose m
29510 65 74 68 6f 64 20 2a 2f 0a 20 20 73 65 6d 4c 6f  ethod */.  semLo
29520 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ck,             
29530 20 20 20 20 20 2f 2a 20 78 4c 6f 63 6b 20 6d 65       /* xLock me
29540 74 68 6f 64 20 2a 2f 0a 20 20 73 65 6d 55 6e 6c  thod */.  semUnl
29550 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20  ock,            
29560 20 20 20 20 2f 2a 20 78 55 6e 6c 6f 63 6b 20 6d      /* xUnlock m
29570 65 74 68 6f 64 20 2a 2f 0a 20 20 73 65 6d 43 68  ethod */.  semCh
29580 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 20  eckReservedLock 
29590 20 20 20 20 20 2f 2a 20 78 43 68 65 63 6b 52 65       /* xCheckRe
295a0 73 65 72 76 65 64 4c 6f 63 6b 20 6d 65 74 68 6f  servedLock metho
295b0 64 20 2a 2f 0a 29 0a 23 65 6e 64 69 66 0a 0a 23  d */.).#endif..#
295c0 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50  if defined(__APP
295d0 4c 45 5f 5f 29 20 26 26 20 53 51 4c 49 54 45 5f  LE__) && SQLITE_
295e0 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53  ENABLE_LOCKING_S
295f0 54 59 4c 45 0a 49 4f 4d 45 54 48 4f 44 53 28 0a  TYLE.IOMETHODS(.
29600 20 20 61 66 70 49 6f 46 69 6e 64 65 72 2c 20 20    afpIoFinder,  
29610 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
29620 69 6e 64 65 72 20 66 75 6e 63 74 69 6f 6e 20 6e  inder function n
29630 61 6d 65 20 2a 2f 0a 20 20 61 66 70 49 6f 4d 65  ame */.  afpIoMe
29640 74 68 6f 64 73 2c 20 20 20 20 20 20 20 20 20 20  thods,          
29650 20 20 20 2f 2a 20 73 71 6c 69 74 65 33 5f 69 6f     /* sqlite3_io
29660 5f 6d 65 74 68 6f 64 73 20 6f 62 6a 65 63 74 20  _methods object 
29670 6e 61 6d 65 20 2a 2f 0a 20 20 31 2c 20 20 20 20  name */.  1,    
29680 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29690 20 20 20 20 2f 2a 20 73 68 61 72 65 64 20 6d 65      /* shared me
296a0 6d 6f 72 79 20 69 73 20 64 69 73 61 62 6c 65 64  mory is disabled
296b0 20 2a 2f 0a 20 20 61 66 70 43 6c 6f 73 65 2c 20   */.  afpClose, 
296c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
296d0 2f 2a 20 78 43 6c 6f 73 65 20 6d 65 74 68 6f 64  /* xClose method
296e0 20 2a 2f 0a 20 20 61 66 70 4c 6f 63 6b 2c 20 20   */.  afpLock,  
296f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29700 2f 2a 20 78 4c 6f 63 6b 20 6d 65 74 68 6f 64 20  /* xLock method 
29710 2a 2f 0a 20 20 61 66 70 55 6e 6c 6f 63 6b 2c 20  */.  afpUnlock, 
29720 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
29730 2a 20 78 55 6e 6c 6f 63 6b 20 6d 65 74 68 6f 64  * xUnlock method
29740 20 2a 2f 0a 20 20 61 66 70 43 68 65 63 6b 52 65   */.  afpCheckRe
29750 73 65 72 76 65 64 4c 6f 63 6b 20 20 20 20 20 20  servedLock      
29760 2f 2a 20 78 43 68 65 63 6b 52 65 73 65 72 76 65  /* xCheckReserve
29770 64 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a  dLock method */.
29780 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  ).#endif../*.** 
29790 54 68 65 20 70 72 6f 78 79 20 6c 6f 63 6b 69 6e  The proxy lockin
297a0 67 20 6d 65 74 68 6f 64 20 69 73 20 61 20 22 73  g method is a "s
297b0 75 70 65 72 2d 6d 65 74 68 6f 64 22 20 69 6e 20  uper-method" in 
297c0 74 68 65 20 73 65 6e 73 65 20 74 68 61 74 20 69  the sense that i
297d0 74 0a 2a 2a 20 6f 70 65 6e 73 20 73 65 63 6f 6e  t.** opens secon
297e0 64 61 72 79 20 66 69 6c 65 20 64 65 73 63 72 69  dary file descri
297f0 70 74 6f 72 73 20 66 6f 72 20 74 68 65 20 63 6f  ptors for the co
29800 6e 63 68 20 61 6e 64 20 6c 6f 63 6b 20 66 69 6c  nch and lock fil
29810 65 73 20 61 6e 64 0a 2a 2a 20 69 74 20 75 73 65  es and.** it use
29820 73 20 70 72 6f 78 79 2c 20 64 6f 74 2d 66 69 6c  s proxy, dot-fil
29830 65 2c 20 41 46 50 2c 20 61 6e 64 20 66 6c 6f 63  e, AFP, and floc
29840 6b 28 29 20 6c 6f 63 6b 69 6e 67 20 6d 65 74 68  k() locking meth
29850 6f 64 73 20 6f 6e 20 74 68 6f 73 65 0a 2a 2a 20  ods on those.** 
29860 73 65 63 6f 6e 64 61 72 79 20 66 69 6c 65 73 2e  secondary files.
29870 20 20 46 6f 72 20 74 68 69 73 20 72 65 61 73 6f    For this reaso
29880 6e 2c 20 74 68 65 20 64 69 76 69 73 69 6f 6e 20  n, the division 
29890 74 68 61 74 20 69 6d 70 6c 65 6d 65 6e 74 73 0a  that implements.
298a0 2a 2a 20 70 72 6f 78 79 20 6c 6f 63 6b 69 6e 67  ** proxy locking
298b0 20 69 73 20 6c 6f 63 61 74 65 64 20 6d 75 63 68   is located much
298c0 20 66 75 72 74 68 65 72 20 64 6f 77 6e 20 69 6e   further down in
298d0 20 74 68 65 20 66 69 6c 65 2e 20 20 42 75 74 20   the file.  But 
298e0 77 65 20 6e 65 65 64 0a 2a 2a 20 74 6f 20 67 6f  we need.** to go
298f0 20 61 68 65 61 64 20 61 6e 64 20 64 65 66 69 6e   ahead and defin
29900 65 20 74 68 65 20 73 71 6c 69 74 65 33 5f 69 6f  e the sqlite3_io
29910 5f 6d 65 74 68 6f 64 73 20 61 6e 64 20 66 69 6e  _methods and fin
29920 64 65 72 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20  der function.** 
29930 66 6f 72 20 70 72 6f 78 79 20 6c 6f 63 6b 69 6e  for proxy lockin
29940 67 20 68 65 72 65 2e 20 20 53 6f 20 77 65 20 66  g here.  So we f
29950 6f 72 77 61 72 64 20 64 65 63 6c 61 72 65 20 74  orward declare t
29960 68 65 20 49 2f 4f 20 6d 65 74 68 6f 64 73 2e 0a  he I/O methods..
29970 2a 2f 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f  */.#if defined(_
29980 5f 41 50 50 4c 45 5f 5f 29 20 26 26 20 53 51 4c  _APPLE__) && SQL
29990 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49  ITE_ENABLE_LOCKI
299a0 4e 47 5f 53 54 59 4c 45 0a 73 74 61 74 69 63 20  NG_STYLE.static 
299b0 69 6e 74 20 70 72 6f 78 79 43 6c 6f 73 65 28 73  int proxyClose(s
299c0 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29 3b 0a 73  qlite3_file*);.s
299d0 74 61 74 69 63 20 69 6e 74 20 70 72 6f 78 79 4c  tatic int proxyL
299e0 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  ock(sqlite3_file
299f0 2a 2c 20 69 6e 74 29 3b 0a 73 74 61 74 69 63 20  *, int);.static 
29a00 69 6e 74 20 70 72 6f 78 79 55 6e 6c 6f 63 6b 28  int proxyUnlock(
29a10 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 2c 20 69  sqlite3_file*, i
29a20 6e 74 29 3b 0a 73 74 61 74 69 63 20 69 6e 74 20  nt);.static int 
29a30 70 72 6f 78 79 43 68 65 63 6b 52 65 73 65 72 76  proxyCheckReserv
29a40 65 64 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66  edLock(sqlite3_f
29a50 69 6c 65 2a 2c 20 69 6e 74 2a 29 3b 0a 49 4f 4d  ile*, int*);.IOM
29a60 45 54 48 4f 44 53 28 0a 20 20 70 72 6f 78 79 49  ETHODS(.  proxyI
29a70 6f 46 69 6e 64 65 72 2c 20 20 20 20 20 20 20 20  oFinder,        
29a80 20 20 20 20 2f 2a 20 46 69 6e 64 65 72 20 66 75      /* Finder fu
29a90 6e 63 74 69 6f 6e 20 6e 61 6d 65 20 2a 2f 0a 20  nction name */. 
29aa0 20 70 72 6f 78 79 49 6f 4d 65 74 68 6f 64 73 2c   proxyIoMethods,
29ab0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73 71             /* sq
29ac0 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73  lite3_io_methods
29ad0 20 6f 62 6a 65 63 74 20 6e 61 6d 65 20 2a 2f 0a   object name */.
29ae0 20 20 32 2c 20 20 20 20 20 20 20 20 20 20 20 20    2,            
29af0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73              /* s
29b00 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 69 73 20  hared memory is 
29b10 65 6e 61 62 6c 65 64 20 2a 2f 0a 20 20 70 72 6f  enabled */.  pro
29b20 78 79 43 6c 6f 73 65 2c 20 20 20 20 20 20 20 20  xyClose,        
29b30 20 20 20 20 20 20 20 2f 2a 20 78 43 6c 6f 73 65         /* xClose
29b40 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 70 72 6f   method */.  pro
29b50 78 79 4c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20  xyLock,         
29b60 20 20 20 20 20 20 20 2f 2a 20 78 4c 6f 63 6b 20         /* xLock 
29b70 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 70 72 6f 78  method */.  prox
29b80 79 55 6e 6c 6f 63 6b 2c 20 20 20 20 20 20 20 20  yUnlock,        
29b90 20 20 20 20 20 20 2f 2a 20 78 55 6e 6c 6f 63 6b        /* xUnlock
29ba0 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 70 72 6f   method */.  pro
29bb0 78 79 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c  xyCheckReservedL
29bc0 6f 63 6b 20 20 20 20 2f 2a 20 78 43 68 65 63 6b  ock    /* xCheck
29bd0 52 65 73 65 72 76 65 64 4c 6f 63 6b 20 6d 65 74  ReservedLock met
29be0 68 6f 64 20 2a 2f 0a 29 0a 23 65 6e 64 69 66 0a  hod */.).#endif.
29bf0 0a 2f 2a 20 6e 66 73 20 6c 6f 63 6b 64 20 6f 6e  ./* nfs lockd on
29c00 20 4f 53 58 20 31 30 2e 33 2b 20 64 6f 65 73 6e   OSX 10.3+ doesn
29c10 27 74 20 63 6c 65 61 72 20 77 72 69 74 65 20 6c  't clear write l
29c20 6f 63 6b 73 20 77 68 65 6e 20 61 20 72 65 61 64  ocks when a read
29c30 20 6c 6f 63 6b 20 69 73 20 73 65 74 20 2a 2f 0a   lock is set */.
29c40 23 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 41 50  #if defined(__AP
29c50 50 4c 45 5f 5f 29 20 26 26 20 53 51 4c 49 54 45  PLE__) && SQLITE
29c60 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f  _ENABLE_LOCKING_
29c70 53 54 59 4c 45 0a 49 4f 4d 45 54 48 4f 44 53 28  STYLE.IOMETHODS(
29c80 0a 20 20 6e 66 73 49 6f 46 69 6e 64 65 72 2c 20  .  nfsIoFinder, 
29c90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
29ca0 20 46 69 6e 64 65 72 20 66 75 6e 63 74 69 6f 6e   Finder function
29cb0 20 6e 61 6d 65 20 2a 2f 0a 20 20 6e 66 73 49 6f   name */.  nfsIo
29cc0 4d 65 74 68 6f 64 73 2c 20 20 20 20 20 20 20 20  Methods,        
29cd0 20 20 20 20 20 20 2f 2a 20 73 71 6c 69 74 65 33        /* sqlite3
29ce0 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 6f 62 6a 65  _io_methods obje
29cf0 63 74 20 6e 61 6d 65 20 2a 2f 0a 20 20 31 2c 20  ct name */.  1, 
29d00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29d10 20 20 20 20 20 20 20 20 2f 2a 20 73 68 61 72 65          /* share
29d20 64 20 6d 65 6d 6f 72 79 20 69 73 20 64 69 73 61  d memory is disa
29d30 62 6c 65 64 20 2a 2f 0a 20 20 75 6e 69 78 43 6c  bled */.  unixCl
29d40 6f 73 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  ose,            
29d50 20 20 20 20 20 2f 2a 20 78 43 6c 6f 73 65 20 6d       /* xClose m
29d60 65 74 68 6f 64 20 2a 2f 0a 20 20 75 6e 69 78 4c  ethod */.  unixL
29d70 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20  ock,            
29d80 20 20 20 20 20 20 2f 2a 20 78 4c 6f 63 6b 20 6d        /* xLock m
29d90 65 74 68 6f 64 20 2a 2f 0a 20 20 6e 66 73 55 6e  ethod */.  nfsUn
29da0 6c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20  lock,           
29db0 20 20 20 20 20 20 2f 2a 20 78 55 6e 6c 6f 63 6b        /* xUnlock
29dc0 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 75 6e 69   method */.  uni
29dd0 78 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f  xCheckReservedLo
29de0 63 6b 20 20 20 20 20 20 2f 2a 20 78 43 68 65 63  ck      /* xChec
29df0 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 20 6d 65  kReservedLock me
29e00 74 68 6f 64 20 2a 2f 0a 29 0a 23 65 6e 64 69 66  thod */.).#endif
29e10 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f 5f  ..#if defined(__
29e20 41 50 50 4c 45 5f 5f 29 20 26 26 20 53 51 4c 49  APPLE__) && SQLI
29e30 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e  TE_ENABLE_LOCKIN
29e40 47 5f 53 54 59 4c 45 0a 2f 2a 20 0a 2a 2a 20 54  G_STYLE./* .** T
29e50 68 69 73 20 22 66 69 6e 64 65 72 22 20 66 75 6e  his "finder" fun
29e60 63 74 69 6f 6e 20 61 74 74 65 6d 70 74 73 20 74  ction attempts t
29e70 6f 20 64 65 74 65 72 6d 69 6e 65 20 74 68 65 20  o determine the 
29e80 62 65 73 74 20 6c 6f 63 6b 69 6e 67 20 73 74 72  best locking str
29e90 61 74 65 67 79 20 0a 2a 2a 20 66 6f 72 20 74 68  ategy .** for th
29ea0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
29eb0 22 66 69 6c 65 50 61 74 68 22 2e 20 20 49 74 20  "filePath".  It 
29ec0 74 68 65 6e 20 72 65 74 75 72 6e 73 20 74 68 65  then returns the
29ed0 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68   sqlite3_io_meth
29ee0 6f 64 73 0a 2a 2a 20 6f 62 6a 65 63 74 20 74 68  ods.** object th
29ef0 61 74 20 69 6d 70 6c 65 6d 65 6e 74 73 20 74 68  at implements th
29f00 61 74 20 73 74 72 61 74 65 67 79 2e 0a 2a 2a 0a  at strategy..**.
29f10 2a 2a 20 54 68 69 73 20 69 73 20 66 6f 72 20 4d  ** This is for M
29f20 61 63 4f 53 58 20 6f 6e 6c 79 2e 0a 2a 2f 0a 73  acOSX only..*/.s
29f30 74 61 74 69 63 20 63 6f 6e 73 74 20 73 71 6c 69  tatic const sqli
29f40 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 2a  te3_io_methods *
29f50 61 75 74 6f 6c 6f 63 6b 49 6f 46 69 6e 64 65 72  autolockIoFinder
29f60 49 6d 70 6c 28 0a 20 20 63 6f 6e 73 74 20 63 68  Impl(.  const ch
29f70 61 72 20 2a 66 69 6c 65 50 61 74 68 2c 20 20 20  ar *filePath,   
29f80 20 2f 2a 20 6e 61 6d 65 20 6f 66 20 74 68 65 20   /* name of the 
29f90 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f  database file */
29fa0 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 4e 65  .  unixFile *pNe
29fb0 77 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 6f  w           /* o
29fc0 70 65 6e 20 66 69 6c 65 20 6f 62 6a 65 63 74 20  pen file object 
29fd0 66 6f 72 20 74 68 65 20 64 61 74 61 62 61 73 65  for the database
29fe0 20 66 69 6c 65 20 2a 2f 0a 29 7b 0a 20 20 73 74   file */.){.  st
29ff0 61 74 69 63 20 63 6f 6e 73 74 20 73 74 72 75 63  atic const struc
2a000 74 20 4d 61 70 70 69 6e 67 20 7b 0a 20 20 20 20  t Mapping {.    
2a010 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c  const char *zFil
2a020 65 73 79 73 74 65 6d 3b 20 20 20 20 20 20 20 20  esystem;        
2a030 20 20 20 20 20 20 2f 2a 20 46 69 6c 65 73 79 73        /* Filesys
2a040 74 65 6d 20 74 79 70 65 20 6e 61 6d 65 20 2a 2f  tem type name */
2a050 0a 20 20 20 20 63 6f 6e 73 74 20 73 71 6c 69 74  .    const sqlit
2a060 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 2a 70  e3_io_methods *p
2a070 4d 65 74 68 6f 64 73 3b 20 20 20 2f 2a 20 41 70  Methods;   /* Ap
2a080 70 72 6f 70 72 69 61 74 65 20 6c 6f 63 6b 69 6e  propriate lockin
2a090 67 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 7d 20  g method */.  } 
2a0a0 61 4d 61 70 5b 5d 20 3d 20 7b 0a 20 20 20 20 7b  aMap[] = {.    {
2a0b0 20 22 68 66 73 22 2c 20 20 20 20 26 70 6f 73 69   "hfs",    &posi
2a0c0 78 49 6f 4d 65 74 68 6f 64 73 20 7d 2c 0a 20 20  xIoMethods },.  
2a0d0 20 20 7b 20 22 75 66 73 22 2c 20 20 20 20 26 70    { "ufs",    &p
2a0e0 6f 73 69 78 49 6f 4d 65 74 68 6f 64 73 20 7d 2c  osixIoMethods },
2a0f0 0a 20 20 20 20 7b 20 22 61 66 70 66 73 22 2c 20  .    { "afpfs", 
2a100 20 26 61 66 70 49 6f 4d 65 74 68 6f 64 73 20 7d   &afpIoMethods }
2a110 2c 0a 20 20 20 20 7b 20 22 73 6d 62 66 73 22 2c  ,.    { "smbfs",
2a120 20 20 26 61 66 70 49 6f 4d 65 74 68 6f 64 73 20    &afpIoMethods 
2a130 7d 2c 0a 20 20 20 20 7b 20 22 77 65 62 64 61 76  },.    { "webdav
2a140 22 2c 20 26 6e 6f 6c 6f 63 6b 49 6f 4d 65 74 68  ", &nolockIoMeth
2a150 6f 64 73 20 7d 2c 0a 20 20 20 20 7b 20 30 2c 20  ods },.    { 0, 
2a160 30 20 7d 0a 20 20 7d 3b 0a 20 20 69 6e 74 20 69  0 }.  };.  int i
2a170 3b 0a 20 20 73 74 72 75 63 74 20 73 74 61 74 66  ;.  struct statf
2a180 73 20 66 73 49 6e 66 6f 3b 0a 20 20 73 74 72 75  s fsInfo;.  stru
2a190 63 74 20 66 6c 6f 63 6b 20 6c 6f 63 6b 49 6e 66  ct flock lockInf
2a1a0 6f 3b 0a 0a 20 20 69 66 28 20 21 66 69 6c 65 50  o;..  if( !fileP
2a1b0 61 74 68 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66  ath ){.    /* If
2a1c0 20 66 69 6c 65 50 61 74 68 3d 3d 4e 55 4c 4c 20   filePath==NULL 
2a1d0 74 68 61 74 20 6d 65 61 6e 73 20 77 65 20 61 72  that means we ar
2a1e0 65 20 64 65 61 6c 69 6e 67 20 77 69 74 68 20 61  e dealing with a
2a1f0 20 74 72 61 6e 73 69 65 6e 74 20 66 69 6c 65 0a   transient file.
2a200 20 20 20 20 2a 2a 20 74 68 61 74 20 64 6f 65 73      ** that does
2a210 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20 62 65 20   not need to be 
2a220 6c 6f 63 6b 65 64 2e 20 2a 2f 0a 20 20 20 20 72  locked. */.    r
2a230 65 74 75 72 6e 20 26 6e 6f 6c 6f 63 6b 49 6f 4d  eturn &nolockIoM
2a240 65 74 68 6f 64 73 3b 0a 20 20 7d 0a 20 20 69 66  ethods;.  }.  if
2a250 28 20 73 74 61 74 66 73 28 66 69 6c 65 50 61 74  ( statfs(filePat
2a260 68 2c 20 26 66 73 49 6e 66 6f 29 20 21 3d 20 2d  h, &fsInfo) != -
2a270 31 20 29 7b 0a 20 20 20 20 69 66 28 20 66 73 49  1 ){.    if( fsI
2a280 6e 66 6f 2e 66 5f 66 6c 61 67 73 20 26 20 4d 4e  nfo.f_flags & MN
2a290 54 5f 52 44 4f 4e 4c 59 20 29 7b 0a 20 20 20 20  T_RDONLY ){.    
2a2a0 20 20 72 65 74 75 72 6e 20 26 6e 6f 6c 6f 63 6b    return &nolock
2a2b0 49 6f 4d 65 74 68 6f 64 73 3b 0a 20 20 20 20 7d  IoMethods;.    }
2a2c0 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 61 4d  .    for(i=0; aM
2a2d0 61 70 5b 69 5d 2e 7a 46 69 6c 65 73 79 73 74 65  ap[i].zFilesyste
2a2e0 6d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69  m; i++){.      i
2a2f0 66 28 20 73 74 72 63 6d 70 28 66 73 49 6e 66 6f  f( strcmp(fsInfo
2a300 2e 66 5f 66 73 74 79 70 65 6e 61 6d 65 2c 20 61  .f_fstypename, a
2a310 4d 61 70 5b 69 5d 2e 7a 46 69 6c 65 73 79 73 74  Map[i].zFilesyst
2a320 65 6d 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  em)==0 ){.      
2a330 20 20 72 65 74 75 72 6e 20 61 4d 61 70 5b 69 5d    return aMap[i]
2a340 2e 70 4d 65 74 68 6f 64 73 3b 0a 20 20 20 20 20  .pMethods;.     
2a350 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20   }.    }.  }..  
2a360 2f 2a 20 44 65 66 61 75 6c 74 20 63 61 73 65 2e  /* Default case.
2a370 20 48 61 6e 64 6c 65 73 2c 20 61 6d 6f 6e 67 73   Handles, amongs
2a380 74 20 6f 74 68 65 72 73 2c 20 22 6e 66 73 22 2e  t others, "nfs".
2a390 0a 20 20 2a 2a 20 54 65 73 74 20 62 79 74 65 2d  .  ** Test byte-
2a3a0 72 61 6e 67 65 20 6c 6f 63 6b 20 75 73 69 6e 67  range lock using
2a3b0 20 66 63 6e 74 6c 28 29 2e 20 49 66 20 74 68 65   fcntl(). If the
2a3c0 20 63 61 6c 6c 20 73 75 63 63 65 65 64 73 2c 20   call succeeds, 
2a3d0 0a 20 20 2a 2a 20 61 73 73 75 6d 65 20 74 68 61  .  ** assume tha
2a3e0 74 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65  t the file-syste
2a3f0 6d 20 73 75 70 70 6f 72 74 73 20 50 4f 53 49 58  m supports POSIX
2a400 20 73 74 79 6c 65 20 6c 6f 63 6b 73 2e 20 0a 20   style locks. . 
2a410 20 2a 2f 0a 20 20 6c 6f 63 6b 49 6e 66 6f 2e 6c   */.  lockInfo.l
2a420 5f 6c 65 6e 20 3d 20 31 3b 0a 20 20 6c 6f 63 6b  _len = 1;.  lock
2a430 49 6e 66 6f 2e 6c 5f 73 74 61 72 74 20 3d 20 30  Info.l_start = 0
2a440 3b 0a 20 20 6c 6f 63 6b 49 6e 66 6f 2e 6c 5f 77  ;.  lockInfo.l_w
2a450 68 65 6e 63 65 20 3d 20 53 45 45 4b 5f 53 45 54  hence = SEEK_SET
2a460 3b 0a 20 20 6c 6f 63 6b 49 6e 66 6f 2e 6c 5f 74  ;.  lockInfo.l_t
2a470 79 70 65 20 3d 20 46 5f 52 44 4c 43 4b 3b 0a 20  ype = F_RDLCK;. 
2a480 20 69 66 28 20 6f 73 46 63 6e 74 6c 28 70 4e 65   if( osFcntl(pNe
2a490 77 2d 3e 68 2c 20 46 5f 47 45 54 4c 4b 2c 20 26  w->h, F_GETLK, &
2a4a0 6c 6f 63 6b 49 6e 66 6f 29 21 3d 2d 31 20 29 20  lockInfo)!=-1 ) 
2a4b0 7b 0a 20 20 20 20 69 66 28 20 73 74 72 63 6d 70  {.    if( strcmp
2a4c0 28 66 73 49 6e 66 6f 2e 66 5f 66 73 74 79 70 65  (fsInfo.f_fstype
2a4d0 6e 61 6d 65 2c 20 22 6e 66 73 22 29 3d 3d 30 20  name, "nfs")==0 
2a4e0 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
2a4f0 26 6e 66 73 49 6f 4d 65 74 68 6f 64 73 3b 0a 20  &nfsIoMethods;. 
2a500 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20     } else {.    
2a510 20 20 72 65 74 75 72 6e 20 26 70 6f 73 69 78 49    return &posixI
2a520 6f 4d 65 74 68 6f 64 73 3b 0a 20 20 20 20 7d 0a  oMethods;.    }.
2a530 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 74    }else{.    ret
2a540 75 72 6e 20 26 64 6f 74 6c 6f 63 6b 49 6f 4d 65  urn &dotlockIoMe
2a550 74 68 6f 64 73 3b 0a 20 20 7d 0a 7d 0a 73 74 61  thods;.  }.}.sta
2a560 74 69 63 20 63 6f 6e 73 74 20 73 71 6c 69 74 65  tic const sqlite
2a570 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 0a 20 20  3_io_methods .  
2a580 2a 28 2a 63 6f 6e 73 74 20 61 75 74 6f 6c 6f 63  *(*const autoloc
2a590 6b 49 6f 46 69 6e 64 65 72 29 28 63 6f 6e 73 74  kIoFinder)(const
2a5a0 20 63 68 61 72 2a 2c 75 6e 69 78 46 69 6c 65 2a   char*,unixFile*
2a5b0 29 20 3d 20 61 75 74 6f 6c 6f 63 6b 49 6f 46 69  ) = autolockIoFi
2a5c0 6e 64 65 72 49 6d 70 6c 3b 0a 0a 23 65 6e 64 69  nderImpl;..#endi
2a5d0 66 20 2f 2a 20 64 65 66 69 6e 65 64 28 5f 5f 41  f /* defined(__A
2a5e0 50 50 4c 45 5f 5f 29 20 26 26 20 53 51 4c 49 54  PPLE__) && SQLIT
2a5f0 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47  E_ENABLE_LOCKING
2a600 5f 53 54 59 4c 45 20 2a 2f 0a 0a 23 69 66 20 4f  _STYLE */..#if O
2a610 53 5f 56 58 57 4f 52 4b 53 20 26 26 20 53 51 4c  S_VXWORKS && SQL
2a620 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49  ITE_ENABLE_LOCKI
2a630 4e 47 5f 53 54 59 4c 45 0a 2f 2a 20 0a 2a 2a 20  NG_STYLE./* .** 
2a640 54 68 69 73 20 22 66 69 6e 64 65 72 22 20 66 75  This "finder" fu
2a650 6e 63 74 69 6f 6e 20 61 74 74 65 6d 70 74 73 20  nction attempts 
2a660 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 74 68 65  to determine the
2a670 20 62 65 73 74 20 6c 6f 63 6b 69 6e 67 20 73 74   best locking st
2a680 72 61 74 65 67 79 20 0a 2a 2a 20 66 6f 72 20 74  rategy .** for t
2a690 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
2a6a0 20 22 66 69 6c 65 50 61 74 68 22 2e 20 20 49 74   "filePath".  It
2a6b0 20 74 68 65 6e 20 72 65 74 75 72 6e 73 20 74 68   then returns th
2a6c0 65 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74  e sqlite3_io_met
2a6d0 68 6f 64 73 0a 2a 2a 20 6f 62 6a 65 63 74 20 74  hods.** object t
2a6e0 68 61 74 20 69 6d 70 6c 65 6d 65 6e 74 73 20 74  hat implements t
2a6f0 68 61 74 20 73 74 72 61 74 65 67 79 2e 0a 2a 2a  hat strategy..**
2a700 0a 2a 2a 20 54 68 69 73 20 69 73 20 66 6f 72 20  .** This is for 
2a710 56 58 57 6f 72 6b 73 20 6f 6e 6c 79 2e 0a 2a 2f  VXWorks only..*/
2a720 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73 71  .static const sq
2a730 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73  lite3_io_methods
2a740 20 2a 61 75 74 6f 6c 6f 63 6b 49 6f 46 69 6e 64   *autolockIoFind
2a750 65 72 49 6d 70 6c 28 0a 20 20 63 6f 6e 73 74 20  erImpl(.  const 
2a760 63 68 61 72 20 2a 66 69 6c 65 50 61 74 68 2c 20  char *filePath, 
2a770 20 20 20 2f 2a 20 6e 61 6d 65 20 6f 66 20 74 68     /* name of th
2a780 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
2a790 2a 2f 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70  */.  unixFile *p
2a7a0 4e 65 77 20 20 20 20 20 20 20 20 20 20 20 2f 2a  New           /*
2a7b0 20 74 68 65 20 6f 70 65 6e 20 66 69 6c 65 20 6f   the open file o
2a7c0 62 6a 65 63 74 20 2a 2f 0a 29 7b 0a 20 20 73 74  bject */.){.  st
2a7d0 72 75 63 74 20 66 6c 6f 63 6b 20 6c 6f 63 6b 49  ruct flock lockI
2a7e0 6e 66 6f 3b 0a 0a 20 20 69 66 28 20 21 66 69 6c  nfo;..  if( !fil
2a7f0 65 50 61 74 68 20 29 7b 0a 20 20 20 20 2f 2a 20  ePath ){.    /* 
2a800 49 66 20 66 69 6c 65 50 61 74 68 3d 3d 4e 55 4c  If filePath==NUL
2a810 4c 20 74 68 61 74 20 6d 65 61 6e 73 20 77 65 20  L that means we 
2a820 61 72 65 20 64 65 61 6c 69 6e 67 20 77 69 74 68  are dealing with
2a830 20 61 20 74 72 61 6e 73 69 65 6e 74 20 66 69 6c   a transient fil
2a840 65 0a 20 20 20 20 2a 2a 20 74 68 61 74 20 64 6f  e.    ** that do
2a850 65 73 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20 62  es not need to b
2a860 65 20 6c 6f 63 6b 65 64 2e 20 2a 2f 0a 20 20 20  e locked. */.   
2a870 20 72 65 74 75 72 6e 20 26 6e 6f 6c 6f 63 6b 49   return &nolockI
2a880 6f 4d 65 74 68 6f 64 73 3b 0a 20 20 7d 0a 0a 20  oMethods;.  }.. 
2a890 20 2f 2a 20 54 65 73 74 20 69 66 20 66 63 6e 74   /* Test if fcnt
2a8a0 6c 28 29 20 69 73 20 73 75 70 70 6f 72 74 65 64  l() is supported
2a8b0 20 61 6e 64 20 75 73 65 20 50 4f 53 49 58 20 73   and use POSIX s
2a8c0 74 79 6c 65 20 6c 6f 63 6b 73 2e 0a 20 20 2a 2a  tyle locks..  **
2a8d0 20 4f 74 68 65 72 77 69 73 65 20 66 61 6c 6c 20   Otherwise fall 
2a8e0 62 61 63 6b 20 74 6f 20 74 68 65 20 6e 61 6d 65  back to the name
2a8f0 64 20 73 65 6d 61 70 68 6f 72 65 20 6d 65 74 68  d semaphore meth
2a900 6f 64 2e 0a 20 20 2a 2f 0a 20 20 6c 6f 63 6b 49  od..  */.  lockI
2a910 6e 66 6f 2e 6c 5f 6c 65 6e 20 3d 20 31 3b 0a 20  nfo.l_len = 1;. 
2a920 20 6c 6f 63 6b 49 6e 66 6f 2e 6c 5f 73 74 61 72   lockInfo.l_star
2a930 74 20 3d 20 30 3b 0a 20 20 6c 6f 63 6b 49 6e 66  t = 0;.  lockInf
2a940 6f 2e 6c 5f 77 68 65 6e 63 65 20 3d 20 53 45 45  o.l_whence = SEE
2a950 4b 5f 53 45 54 3b 0a 20 20 6c 6f 63 6b 49 6e 66  K_SET;.  lockInf
2a960 6f 2e 6c 5f 74 79 70 65 20 3d 20 46 5f 52 44 4c  o.l_type = F_RDL
2a970 43 4b 3b 0a 20 20 69 66 28 20 6f 73 46 63 6e 74  CK;.  if( osFcnt
2a980 6c 28 70 4e 65 77 2d 3e 68 2c 20 46 5f 47 45 54  l(pNew->h, F_GET
2a990 4c 4b 2c 20 26 6c 6f 63 6b 49 6e 66 6f 29 21 3d  LK, &lockInfo)!=
2a9a0 2d 31 20 29 20 7b 0a 20 20 20 20 72 65 74 75 72  -1 ) {.    retur
2a9b0 6e 20 26 70 6f 73 69 78 49 6f 4d 65 74 68 6f 64  n &posixIoMethod
2a9c0 73 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  s;.  }else{.    
2a9d0 72 65 74 75 72 6e 20 26 73 65 6d 49 6f 4d 65 74  return &semIoMet
2a9e0 68 6f 64 73 3b 0a 20 20 7d 0a 7d 0a 73 74 61 74  hods;.  }.}.stat
2a9f0 69 63 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33  ic const sqlite3
2aa00 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 0a 20 20 2a  _io_methods .  *
2aa10 28 2a 63 6f 6e 73 74 20 61 75 74 6f 6c 6f 63 6b  (*const autolock
2aa20 49 6f 46 69 6e 64 65 72 29 28 63 6f 6e 73 74 20  IoFinder)(const 
2aa30 63 68 61 72 2a 2c 75 6e 69 78 46 69 6c 65 2a 29  char*,unixFile*)
2aa40 20 3d 20 61 75 74 6f 6c 6f 63 6b 49 6f 46 69 6e   = autolockIoFin
2aa50 64 65 72 49 6d 70 6c 3b 0a 0a 23 65 6e 64 69 66  derImpl;..#endif
2aa60 20 2f 2a 20 4f 53 5f 56 58 57 4f 52 4b 53 20 26   /* OS_VXWORKS &
2aa70 26 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  & SQLITE_ENABLE_
2aa80 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 2a 2f  LOCKING_STYLE */
2aa90 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 61 62 73 74 72  ../*.** An abstr
2aaa0 61 63 74 20 74 79 70 65 20 66 6f 72 20 61 20 70  act type for a p
2aab0 6f 69 6e 74 65 72 20 74 6f 20 61 20 49 4f 20 6d  ointer to a IO m
2aac0 65 74 68 6f 64 20 66 69 6e 64 65 72 20 66 75 6e  ethod finder fun
2aad0 63 74 69 6f 6e 3a 0a 2a 2f 0a 74 79 70 65 64 65  ction:.*/.typede
2aae0 66 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f  f const sqlite3_
2aaf0 69 6f 5f 6d 65 74 68 6f 64 73 20 2a 28 2a 66 69  io_methods *(*fi
2ab00 6e 64 65 72 5f 74 79 70 65 29 28 63 6f 6e 73 74  nder_type)(const
2ab10 20 63 68 61 72 2a 2c 75 6e 69 78 46 69 6c 65 2a   char*,unixFile*
2ab20 29 3b 0a 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  );.../**********
2ab30 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2ab40 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2ab50 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2ab60 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2ab70 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  **.*************
2ab80 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20  *************** 
2ab90 73 71 6c 69 74 65 33 5f 76 66 73 20 6d 65 74 68  sqlite3_vfs meth
2aba0 6f 64 73 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ods ************
2abb0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2abc0 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 64 69 76 69  .**.** This divi
2abd0 73 69 6f 6e 20 63 6f 6e 74 61 69 6e 73 20 74 68  sion contains th
2abe0 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  e implementation
2abf0 20 6f 66 20 6d 65 74 68 6f 64 73 20 6f 6e 20 74   of methods on t
2ac00 68 65 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 76 66  he.** sqlite3_vf
2ac10 73 20 6f 62 6a 65 63 74 2e 0a 2a 2f 0a 0a 2f 2a  s object..*/../*
2ac20 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74  .** Initialize t
2ac30 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74  he contents of t
2ac40 68 65 20 75 6e 69 78 46 69 6c 65 20 73 74 72 75  he unixFile stru
2ac50 63 74 75 72 65 20 70 6f 69 6e 74 65 64 20 74 6f  cture pointed to
2ac60 20 62 79 20 70 49 64 2e 0a 2a 2f 0a 73 74 61 74   by pId..*/.stat
2ac70 69 63 20 69 6e 74 20 66 69 6c 6c 49 6e 55 6e 69  ic int fillInUni
2ac80 78 46 69 6c 65 28 0a 20 20 73 71 6c 69 74 65 33  xFile(.  sqlite3
2ac90 5f 76 66 73 20 2a 70 56 66 73 2c 20 20 20 20 20  _vfs *pVfs,     
2aca0 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 76   /* Pointer to v
2acb0 66 73 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 69  fs object */.  i
2acc0 6e 74 20 68 2c 20 20 20 20 20 20 20 20 20 20 20  nt h,           
2acd0 20 20 20 20 20 20 20 2f 2a 20 4f 70 65 6e 20 66         /* Open f
2ace0 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 6f  ile descriptor o
2acf0 66 20 66 69 6c 65 20 62 65 69 6e 67 20 6f 70 65  f file being ope
2ad00 6e 65 64 20 2a 2f 0a 20 20 69 6e 74 20 73 79 6e  ned */.  int syn
2ad10 63 44 69 72 2c 20 20 20 20 20 20 20 20 20 20 20  cDir,           
2ad20 20 2f 2a 20 54 72 75 65 20 74 6f 20 73 79 6e 63   /* True to sync
2ad30 20 64 69 72 65 63 74 6f 72 79 20 6f 6e 20 66 69   directory on fi
2ad40 72 73 74 20 73 79 6e 63 20 2a 2f 0a 20 20 73 71  rst sync */.  sq
2ad50 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 49 64 2c  lite3_file *pId,
2ad60 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74        /* Write t
2ad70 6f 20 74 68 65 20 75 6e 69 78 46 69 6c 65 20 73  o the unixFile s
2ad80 74 72 75 63 74 75 72 65 20 68 65 72 65 20 2a 2f  tructure here */
2ad90 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
2ada0 46 69 6c 65 6e 61 6d 65 2c 20 20 2f 2a 20 4e 61  Filename,  /* Na
2adb0 6d 65 20 6f 66 20 74 68 65 20 66 69 6c 65 20 62  me of the file b
2adc0 65 69 6e 67 20 6f 70 65 6e 65 64 20 2a 2f 0a 20  eing opened */. 
2add0 20 69 6e 74 20 6e 6f 4c 6f 63 6b 2c 20 20 20 20   int noLock,    
2ade0 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 6d 69 74           /* Omit
2adf0 20 6c 6f 63 6b 69 6e 67 20 69 66 20 74 72 75 65   locking if true
2ae00 20 2a 2f 0a 20 20 69 6e 74 20 69 73 44 65 6c 65   */.  int isDele
2ae10 74 65 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  te,           /*
2ae20 20 44 65 6c 65 74 65 20 6f 6e 20 63 6c 6f 73 65   Delete on close
2ae30 20 69 66 20 74 72 75 65 20 2a 2f 0a 20 20 69 6e   if true */.  in
2ae40 74 20 69 73 52 65 61 64 4f 6e 6c 79 20 20 20 20  t isReadOnly    
2ae50 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
2ae60 20 74 68 65 20 66 69 6c 65 20 69 73 20 6f 70 65   the file is ope
2ae70 6e 65 64 20 72 65 61 64 2d 6f 6e 6c 79 20 2a 2f  ned read-only */
2ae80 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 73 71 6c 69  .){.  const sqli
2ae90 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 2a  te3_io_methods *
2aea0 70 4c 6f 63 6b 69 6e 67 53 74 79 6c 65 3b 0a 20  pLockingStyle;. 
2aeb0 20 75 6e 69 78 46 69 6c 65 20 2a 70 4e 65 77 20   unixFile *pNew 
2aec0 3d 20 28 75 6e 69 78 46 69 6c 65 20 2a 29 70 49  = (unixFile *)pI
2aed0 64 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  d;.  int rc = SQ
2aee0 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 61 73 73 65  LITE_OK;..  asse
2aef0 72 74 28 20 70 4e 65 77 2d 3e 70 49 6e 6f 64 65  rt( pNew->pInode
2af00 3d 3d 4e 55 4c 4c 20 29 3b 0a 0a 20 20 2f 2a 20  ==NULL );..  /* 
2af10 50 61 72 61 6d 65 74 65 72 20 69 73 44 65 6c 65  Parameter isDele
2af20 74 65 20 69 73 20 6f 6e 6c 79 20 75 73 65 64 20  te is only used 
2af30 6f 6e 20 76 78 77 6f 72 6b 73 2e 20 45 78 70 72  on vxworks. Expr
2af40 65 73 73 20 74 68 69 73 20 65 78 70 6c 69 63 69  ess this explici
2af50 74 6c 79 20 0a 20 20 2a 2a 20 68 65 72 65 20 74  tly .  ** here t
2af60 6f 20 70 72 65 76 65 6e 74 20 63 6f 6d 70 69 6c  o prevent compil
2af70 65 72 20 77 61 72 6e 69 6e 67 73 20 61 62 6f 75  er warnings abou
2af80 74 20 75 6e 75 73 65 64 20 70 61 72 61 6d 65 74  t unused paramet
2af90 65 72 73 2e 0a 20 20 2a 2f 0a 20 20 55 4e 55 53  ers..  */.  UNUS
2afa0 45 44 5f 50 41 52 41 4d 45 54 45 52 28 69 73 44  ED_PARAMETER(isD
2afb0 65 6c 65 74 65 29 3b 0a 0a 20 20 2f 2a 20 55 73  elete);..  /* Us
2afc0 75 61 6c 6c 79 20 74 68 65 20 70 61 74 68 20 7a  ually the path z
2afd0 46 69 6c 65 6e 61 6d 65 20 73 68 6f 75 6c 64 20  Filename should 
2afe0 6e 6f 74 20 62 65 20 61 20 72 65 6c 61 74 69 76  not be a relativ
2aff0 65 20 70 61 74 68 6e 61 6d 65 2e 20 54 68 65 0a  e pathname. The.
2b000 20 20 2a 2a 20 65 78 63 65 70 74 69 6f 6e 20 69    ** exception i
2b010 73 20 77 68 65 6e 20 6f 70 65 6e 69 6e 67 20 74  s when opening t
2b020 68 65 20 70 72 6f 78 79 20 22 63 6f 6e 63 68 22  he proxy "conch"
2b030 20 66 69 6c 65 20 69 6e 20 62 75 69 6c 64 73 20   file in builds 
2b040 74 68 61 74 0a 20 20 2a 2a 20 69 6e 63 6c 75 64  that.  ** includ
2b050 65 20 74 68 65 20 73 70 65 63 69 61 6c 20 41 70  e the special Ap
2b060 70 6c 65 20 6c 6f 63 6b 69 6e 67 20 73 74 79 6c  ple locking styl
2b070 65 73 2e 0a 20 20 2a 2f 0a 23 69 66 20 64 65 66  es..  */.#if def
2b080 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20  ined(__APPLE__) 
2b090 26 26 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  && SQLITE_ENABLE
2b0a0 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 20  _LOCKING_STYLE. 
2b0b0 20 61 73 73 65 72 74 28 20 7a 46 69 6c 65 6e 61   assert( zFilena
2b0c0 6d 65 3d 3d 30 20 7c 7c 20 7a 46 69 6c 65 6e 61  me==0 || zFilena
2b0d0 6d 65 5b 30 5d 3d 3d 27 2f 27 20 0a 20 20 20 20  me[0]=='/' .    
2b0e0 7c 7c 20 70 56 66 73 2d 3e 70 41 70 70 44 61 74  || pVfs->pAppDat
2b0f0 61 3d 3d 28 76 6f 69 64 2a 29 26 61 75 74 6f 6c  a==(void*)&autol
2b100 6f 63 6b 49 6f 46 69 6e 64 65 72 20 29 3b 0a 23  ockIoFinder );.#
2b110 65 6c 73 65 0a 20 20 61 73 73 65 72 74 28 20 7a  else.  assert( z
2b120 46 69 6c 65 6e 61 6d 65 3d 3d 30 20 7c 7c 20 7a  Filename==0 || z
2b130 46 69 6c 65 6e 61 6d 65 5b 30 5d 3d 3d 27 2f 27  Filename[0]=='/'
2b140 20 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 4f 53   );.#endif..  OS
2b150 54 52 41 43 45 28 28 22 4f 50 45 4e 20 20 20 20  TRACE(("OPEN    
2b160 25 2d 33 64 20 25 73 5c 6e 22 2c 20 68 2c 20 7a  %-3d %s\n", h, z
2b170 46 69 6c 65 6e 61 6d 65 29 29 3b 0a 20 20 70 4e  Filename));.  pN
2b180 65 77 2d 3e 68 20 3d 20 68 3b 0a 20 20 70 4e 65  ew->h = h;.  pNe
2b190 77 2d 3e 7a 50 61 74 68 20 3d 20 7a 46 69 6c 65  w->zPath = zFile
2b1a0 6e 61 6d 65 3b 0a 20 20 69 66 28 20 6d 65 6d 63  name;.  if( memc
2b1b0 6d 70 28 70 56 66 73 2d 3e 7a 4e 61 6d 65 2c 22  mp(pVfs->zName,"
2b1c0 75 6e 69 78 2d 65 78 63 6c 22 2c 31 30 29 3d 3d  unix-excl",10)==
2b1d0 30 20 29 7b 0a 20 20 20 20 70 4e 65 77 2d 3e 63  0 ){.    pNew->c
2b1e0 74 72 6c 46 6c 61 67 73 20 3d 20 55 4e 49 58 46  trlFlags = UNIXF
2b1f0 49 4c 45 5f 45 58 43 4c 3b 0a 20 20 7d 65 6c 73  ILE_EXCL;.  }els
2b200 65 7b 0a 20 20 20 20 70 4e 65 77 2d 3e 63 74 72  e{.    pNew->ctr
2b210 6c 46 6c 61 67 73 20 3d 20 30 3b 0a 20 20 7d 0a  lFlags = 0;.  }.
2b220 20 20 69 66 28 20 69 73 52 65 61 64 4f 6e 6c 79    if( isReadOnly
2b230 20 29 7b 0a 20 20 20 20 70 4e 65 77 2d 3e 63 74   ){.    pNew->ct
2b240 72 6c 46 6c 61 67 73 20 7c 3d 20 55 4e 49 58 46  rlFlags |= UNIXF
2b250 49 4c 45 5f 52 44 4f 4e 4c 59 3b 0a 20 20 7d 0a  ILE_RDONLY;.  }.
2b260 20 20 69 66 28 20 73 79 6e 63 44 69 72 20 29 7b    if( syncDir ){
2b270 0a 20 20 20 20 70 4e 65 77 2d 3e 63 74 72 6c 46  .    pNew->ctrlF
2b280 6c 61 67 73 20 7c 3d 20 55 4e 49 58 46 49 4c 45  lags |= UNIXFILE
2b290 5f 44 49 52 53 59 4e 43 3b 0a 20 20 7d 0a 0a 23  _DIRSYNC;.  }..#
2b2a0 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20  if OS_VXWORKS.  
2b2b0 70 4e 65 77 2d 3e 70 49 64 20 3d 20 76 78 77 6f  pNew->pId = vxwo
2b2c0 72 6b 73 46 69 6e 64 46 69 6c 65 49 64 28 7a 46  rksFindFileId(zF
2b2d0 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 69 66 28 20  ilename);.  if( 
2b2e0 70 4e 65 77 2d 3e 70 49 64 3d 3d 30 20 29 7b 0a  pNew->pId==0 ){.
2b2f0 20 20 20 20 6e 6f 4c 6f 63 6b 20 3d 20 31 3b 0a      noLock = 1;.
2b300 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
2b310 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 23 65 6e 64 69  NOMEM;.  }.#endi
2b320 66 0a 0a 20 20 69 66 28 20 6e 6f 4c 6f 63 6b 20  f..  if( noLock 
2b330 29 7b 0a 20 20 20 20 70 4c 6f 63 6b 69 6e 67 53  ){.    pLockingS
2b340 74 79 6c 65 20 3d 20 26 6e 6f 6c 6f 63 6b 49 6f  tyle = &nolockIo
2b350 4d 65 74 68 6f 64 73 3b 0a 20 20 7d 65 6c 73 65  Methods;.  }else
2b360 7b 0a 20 20 20 20 70 4c 6f 63 6b 69 6e 67 53 74  {.    pLockingSt
2b370 79 6c 65 20 3d 20 28 2a 2a 28 66 69 6e 64 65 72  yle = (**(finder
2b380 5f 74 79 70 65 2a 29 70 56 66 73 2d 3e 70 41 70  _type*)pVfs->pAp
2b390 70 44 61 74 61 29 28 7a 46 69 6c 65 6e 61 6d 65  pData)(zFilename
2b3a0 2c 20 70 4e 65 77 29 3b 0a 23 69 66 20 53 51 4c  , pNew);.#if SQL
2b3b0 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49  ITE_ENABLE_LOCKI
2b3c0 4e 47 5f 53 54 59 4c 45 0a 20 20 20 20 2f 2a 20  NG_STYLE.    /* 
2b3d0 43 61 63 68 65 20 7a 46 69 6c 65 6e 61 6d 65 20  Cache zFilename 
2b3e0 69 6e 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 63  in the locking c
2b3f0 6f 6e 74 65 78 74 20 28 41 46 50 20 61 6e 64 20  ontext (AFP and 
2b400 64 6f 74 6c 6f 63 6b 20 6f 76 65 72 72 69 64 65  dotlock override
2b410 29 20 66 6f 72 0a 20 20 20 20 2a 2a 20 70 72 6f  ) for.    ** pro
2b420 78 79 4c 6f 63 6b 20 61 63 74 69 76 61 74 69 6f  xyLock activatio
2b430 6e 20 69 73 20 70 6f 73 73 69 62 6c 65 20 28 72  n is possible (r
2b440 65 6d 6f 74 65 20 70 72 6f 78 79 20 69 73 20 62  emote proxy is b
2b450 61 73 65 64 20 6f 6e 20 64 62 20 6e 61 6d 65 29  ased on db name)
2b460 0a 20 20 20 20 2a 2a 20 7a 46 69 6c 65 6e 61 6d  .    ** zFilenam
2b470 65 20 72 65 6d 61 69 6e 73 20 76 61 6c 69 64 20  e remains valid 
2b480 75 6e 74 69 6c 20 66 69 6c 65 20 69 73 20 63 6c  until file is cl
2b490 6f 73 65 64 2c 20 74 6f 20 73 75 70 70 6f 72 74  osed, to support
2b4a0 20 2a 2f 0a 20 20 20 20 70 4e 65 77 2d 3e 6c 6f   */.    pNew->lo
2b4b0 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 3d 20 28  ckingContext = (
2b4c0 76 6f 69 64 2a 29 7a 46 69 6c 65 6e 61 6d 65 3b  void*)zFilename;
2b4d0 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 0a 20 20 69  .#endif.  }..  i
2b4e0 66 28 20 70 4c 6f 63 6b 69 6e 67 53 74 79 6c 65  f( pLockingStyle
2b4f0 20 3d 3d 20 26 70 6f 73 69 78 49 6f 4d 65 74 68   == &posixIoMeth
2b500 6f 64 73 0a 23 69 66 20 64 65 66 69 6e 65 64 28  ods.#if defined(
2b510 5f 5f 41 50 50 4c 45 5f 5f 29 20 26 26 20 53 51  __APPLE__) && SQ
2b520 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b  LITE_ENABLE_LOCK
2b530 49 4e 47 5f 53 54 59 4c 45 0a 20 20 20 20 7c 7c  ING_STYLE.    ||
2b540 20 70 4c 6f 63 6b 69 6e 67 53 74 79 6c 65 20 3d   pLockingStyle =
2b550 3d 20 26 6e 66 73 49 6f 4d 65 74 68 6f 64 73 0a  = &nfsIoMethods.
2b560 23 65 6e 64 69 66 0a 20 20 29 7b 0a 20 20 20 20  #endif.  ){.    
2b570 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29  unixEnterMutex()
2b580 3b 0a 20 20 20 20 72 63 20 3d 20 66 69 6e 64 49  ;.    rc = findI
2b590 6e 6f 64 65 49 6e 66 6f 28 70 4e 65 77 2c 20 26  nodeInfo(pNew, &
2b5a0 70 4e 65 77 2d 3e 70 49 6e 6f 64 65 29 3b 0a 20  pNew->pInode);. 
2b5b0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
2b5c0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 2f 2a  E_OK ){.      /*
2b5d0 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   If an error occ
2b5e0 75 72 65 64 20 69 6e 20 66 69 6e 64 49 6e 6f 64  ured in findInod
2b5f0 65 49 6e 66 6f 28 29 2c 20 63 6c 6f 73 65 20 74  eInfo(), close t
2b600 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  he file descript
2b610 6f 72 0a 20 20 20 20 20 20 2a 2a 20 69 6d 6d 65  or.      ** imme
2b620 64 69 61 74 65 6c 79 2c 20 62 65 66 6f 72 65 20  diately, before 
2b630 72 65 6c 65 61 73 69 6e 67 20 74 68 65 20 6d 75  releasing the mu
2b640 74 65 78 2e 20 66 69 6e 64 49 6e 6f 64 65 49 6e  tex. findInodeIn
2b650 66 6f 28 29 20 6d 61 79 20 66 61 69 6c 0a 20 20  fo() may fail.  
2b660 20 20 20 20 2a 2a 20 69 6e 20 74 77 6f 20 73 63      ** in two sc
2b670 65 6e 61 72 69 6f 73 3a 0a 20 20 20 20 20 20 2a  enarios:.      *
2b680 2a 0a 20 20 20 20 20 20 2a 2a 20 20 20 28 61 29  *.      **   (a)
2b690 20 41 20 63 61 6c 6c 20 74 6f 20 66 73 74 61 74   A call to fstat
2b6a0 28 29 20 66 61 69 6c 65 64 2e 0a 20 20 20 20 20  () failed..     
2b6b0 20 2a 2a 20 20 20 28 62 29 20 41 20 6d 61 6c 6c   **   (b) A mall
2b6c0 6f 63 20 66 61 69 6c 65 64 2e 0a 20 20 20 20 20  oc failed..     
2b6d0 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 53 63 65   **.      ** Sce
2b6e0 6e 61 72 69 6f 20 28 62 29 20 6d 61 79 20 6f 6e  nario (b) may on
2b6f0 6c 79 20 6f 63 63 75 72 20 69 66 20 74 68 65 20  ly occur if the 
2b700 70 72 6f 63 65 73 73 20 69 73 20 68 6f 6c 64 69  process is holdi
2b710 6e 67 20 6e 6f 20 6f 74 68 65 72 0a 20 20 20 20  ng no other.    
2b720 20 20 2a 2a 20 66 69 6c 65 20 64 65 73 63 72 69    ** file descri
2b730 70 74 6f 72 73 20 6f 70 65 6e 20 6f 6e 20 74 68  ptors open on th
2b740 65 20 73 61 6d 65 20 66 69 6c 65 2e 20 49 66 20  e same file. If 
2b750 74 68 65 72 65 20 77 65 72 65 20 6f 74 68 65 72  there were other
2b760 20 66 69 6c 65 0a 20 20 20 20 20 20 2a 2a 20 64   file.      ** d
2b770 65 73 63 72 69 70 74 6f 72 73 20 6f 6e 20 74 68  escriptors on th
2b780 69 73 20 66 69 6c 65 2c 20 74 68 65 6e 20 6e 6f  is file, then no
2b790 20 6d 61 6c 6c 6f 63 20 77 6f 75 6c 64 20 62 65   malloc would be
2b7a0 20 72 65 71 75 69 72 65 64 20 62 79 0a 20 20 20   required by.   
2b7b0 20 20 20 2a 2a 20 66 69 6e 64 49 6e 6f 64 65 49     ** findInodeI
2b7c0 6e 66 6f 28 29 2e 20 49 66 20 74 68 69 73 20 69  nfo(). If this i
2b7d0 73 20 74 68 65 20 63 61 73 65 2c 20 69 74 20 69  s the case, it i
2b7e0 73 20 71 75 69 74 65 20 73 61 66 65 20 74 6f 20  s quite safe to 
2b7f0 63 6c 6f 73 65 0a 20 20 20 20 20 20 2a 2a 20 68  close.      ** h
2b800 61 6e 64 6c 65 20 68 20 2d 20 61 73 20 69 74 20  andle h - as it 
2b810 69 73 20 67 75 61 72 61 6e 74 65 65 64 20 74 68  is guaranteed th
2b820 61 74 20 6e 6f 20 70 6f 73 69 78 20 6c 6f 63 6b  at no posix lock
2b830 73 20 77 69 6c 6c 20 62 65 20 72 65 6c 65 61 73  s will be releas
2b840 65 64 0a 20 20 20 20 20 20 2a 2a 20 62 79 20 64  ed.      ** by d
2b850 6f 69 6e 67 20 73 6f 2e 0a 20 20 20 20 20 20 2a  oing so..      *
2b860 2a 0a 20 20 20 20 20 20 2a 2a 20 49 66 20 73 63  *.      ** If sc
2b870 65 6e 61 72 69 6f 20 28 61 29 20 63 61 75 73 65  enario (a) cause
2b880 64 20 74 68 65 20 65 72 72 6f 72 20 74 68 65 6e  d the error then
2b890 20 74 68 69 6e 67 73 20 61 72 65 20 6e 6f 74 20   things are not 
2b8a0 73 6f 20 73 61 66 65 2e 20 54 68 65 0a 20 20 20  so safe. The.   
2b8b0 20 20 20 2a 2a 20 69 6d 70 6c 69 63 69 74 20 61     ** implicit a
2b8c0 73 73 75 6d 70 74 69 6f 6e 20 68 65 72 65 20 69  ssumption here i
2b8d0 73 20 74 68 61 74 20 69 66 20 66 73 74 61 74 28  s that if fstat(
2b8e0 29 20 66 61 69 6c 73 2c 20 74 68 69 6e 67 73 20  ) fails, things 
2b8f0 61 72 65 20 69 6e 0a 20 20 20 20 20 20 2a 2a 20  are in.      ** 
2b900 73 75 63 68 20 62 61 64 20 73 68 61 70 65 20 74  such bad shape t
2b910 68 61 74 20 64 72 6f 70 70 69 6e 67 20 61 20 6c  hat dropping a l
2b920 6f 63 6b 20 6f 72 20 74 77 6f 20 64 6f 65 73 6e  ock or two doesn
2b930 27 74 20 6d 61 74 74 65 72 20 6d 75 63 68 2e 0a  't matter much..
2b940 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 72        */.      r
2b950 6f 62 75 73 74 5f 63 6c 6f 73 65 28 70 4e 65 77  obust_close(pNew
2b960 2c 20 68 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a  , h, __LINE__);.
2b970 20 20 20 20 20 20 68 20 3d 20 2d 31 3b 0a 20 20        h = -1;.  
2b980 20 20 7d 0a 20 20 20 20 75 6e 69 78 4c 65 61 76    }.    unixLeav
2b990 65 4d 75 74 65 78 28 29 3b 0a 20 20 7d 0a 0a 23  eMutex();.  }..#
2b9a0 69 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  if SQLITE_ENABLE
2b9b0 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 26  _LOCKING_STYLE &
2b9c0 26 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c  & defined(__APPL
2b9d0 45 5f 5f 29 0a 20 20 65 6c 73 65 20 69 66 28 20  E__).  else if( 
2b9e0 70 4c 6f 63 6b 69 6e 67 53 74 79 6c 65 20 3d 3d  pLockingStyle ==
2b9f0 20 26 61 66 70 49 6f 4d 65 74 68 6f 64 73 20 29   &afpIoMethods )
2ba00 7b 0a 20 20 20 20 2f 2a 20 41 46 50 20 6c 6f 63  {.    /* AFP loc
2ba10 6b 69 6e 67 20 75 73 65 73 20 74 68 65 20 66 69  king uses the fi
2ba20 6c 65 20 70 61 74 68 20 73 6f 20 69 74 20 6e 65  le path so it ne
2ba30 65 64 73 20 74 6f 20 62 65 20 69 6e 63 6c 75 64  eds to be includ
2ba40 65 64 20 69 6e 0a 20 20 20 20 2a 2a 20 74 68 65  ed in.    ** the
2ba50 20 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65   afpLockingConte
2ba60 78 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61  xt..    */.    a
2ba70 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  fpLockingContext
2ba80 20 2a 70 43 74 78 3b 0a 20 20 20 20 70 4e 65 77   *pCtx;.    pNew
2ba90 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  ->lockingContext
2baa0 20 3d 20 70 43 74 78 20 3d 20 73 71 6c 69 74 65   = pCtx = sqlite
2bab0 33 5f 6d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66  3_malloc( sizeof
2bac0 28 2a 70 43 74 78 29 20 29 3b 0a 20 20 20 20 69  (*pCtx) );.    i
2bad0 66 28 20 70 43 74 78 3d 3d 30 20 29 7b 0a 20 20  f( pCtx==0 ){.  
2bae0 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
2baf0 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 65 6c 73 65  NOMEM;.    }else
2bb00 7b 0a 20 20 20 20 20 20 2f 2a 20 4e 42 3a 20 7a  {.      /* NB: z
2bb10 46 69 6c 65 6e 61 6d 65 20 65 78 69 73 74 73 20  Filename exists 
2bb20 61 6e 64 20 72 65 6d 61 69 6e 73 20 76 61 6c 69  and remains vali
2bb30 64 20 75 6e 74 69 6c 20 74 68 65 20 66 69 6c 65  d until the file
2bb40 20 69 73 20 63 6c 6f 73 65 64 0a 20 20 20 20 20   is closed.     
2bb50 20 2a 2a 20 61 63 63 6f 72 64 69 6e 67 20 74 6f   ** according to
2bb60 20 72 65 71 75 69 72 65 6d 65 6e 74 20 46 31 31   requirement F11
2bb70 31 34 31 2e 20 20 53 6f 20 77 65 20 64 6f 20 6e  141.  So we do n
2bb80 6f 74 20 6e 65 65 64 20 74 6f 20 6d 61 6b 65 20  ot need to make 
2bb90 61 0a 20 20 20 20 20 20 2a 2a 20 63 6f 70 79 20  a.      ** copy 
2bba0 6f 66 20 74 68 65 20 66 69 6c 65 6e 61 6d 65 2e  of the filename.
2bbb0 20 2a 2f 0a 20 20 20 20 20 20 70 43 74 78 2d 3e   */.      pCtx->
2bbc0 64 62 50 61 74 68 20 3d 20 7a 46 69 6c 65 6e 61  dbPath = zFilena
2bbd0 6d 65 3b 0a 20 20 20 20 20 20 70 43 74 78 2d 3e  me;.      pCtx->
2bbe0 72 65 73 65 72 76 65 64 20 3d 20 30 3b 0a 20 20  reserved = 0;.  
2bbf0 20 20 20 20 73 72 61 6e 64 6f 6d 64 65 76 28 29      srandomdev()
2bc00 3b 0a 20 20 20 20 20 20 75 6e 69 78 45 6e 74 65  ;.      unixEnte
2bc10 72 4d 75 74 65 78 28 29 3b 0a 20 20 20 20 20 20  rMutex();.      
2bc20 72 63 20 3d 20 66 69 6e 64 49 6e 6f 64 65 49 6e  rc = findInodeIn
2bc30 66 6f 28 70 4e 65 77 2c 20 26 70 4e 65 77 2d 3e  fo(pNew, &pNew->
2bc40 70 49 6e 6f 64 65 29 3b 0a 20 20 20 20 20 20 69  pInode);.      i
2bc50 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
2bc60 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
2bc70 74 65 33 5f 66 72 65 65 28 70 4e 65 77 2d 3e 6c  te3_free(pNew->l
2bc80 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 29 3b 0a  ockingContext);.
2bc90 20 20 20 20 20 20 20 20 72 6f 62 75 73 74 5f 63          robust_c
2bca0 6c 6f 73 65 28 70 4e 65 77 2c 20 68 2c 20 5f 5f  lose(pNew, h, __
2bcb0 4c 49 4e 45 5f 5f 29 3b 0a 20 20 20 20 20 20 20  LINE__);.       
2bcc0 20 68 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 7d   h = -1;.      }
2bcd0 0a 20 20 20 20 20 20 75 6e 69 78 4c 65 61 76 65  .      unixLeave
2bce0 4d 75 74 65 78 28 29 3b 20 20 20 20 20 20 20 20  Mutex();        
2bcf0 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69  .    }.  }.#endi
2bd00 66 0a 0a 20 20 65 6c 73 65 20 69 66 28 20 70 4c  f..  else if( pL
2bd10 6f 63 6b 69 6e 67 53 74 79 6c 65 20 3d 3d 20 26  ockingStyle == &
2bd20 64 6f 74 6c 6f 63 6b 49 6f 4d 65 74 68 6f 64 73  dotlockIoMethods
2bd30 20 29 7b 0a 20 20 20 20 2f 2a 20 44 6f 74 66 69   ){.    /* Dotfi
2bd40 6c 65 20 6c 6f 63 6b 69 6e 67 20 75 73 65 73 20  le locking uses 
2bd50 74 68 65 20 66 69 6c 65 20 70 61 74 68 20 73 6f  the file path so
2bd60 20 69 74 20 6e 65 65 64 73 20 74 6f 20 62 65 20   it needs to be 
2bd70 69 6e 63 6c 75 64 65 64 20 69 6e 0a 20 20 20 20  included in.    
2bd80 2a 2a 20 74 68 65 20 64 6f 74 6c 6f 63 6b 4c 6f  ** the dotlockLo
2bd90 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 0a 20 20  ckingContext .  
2bda0 20 20 2a 2f 0a 20 20 20 20 63 68 61 72 20 2a 7a    */.    char *z
2bdb0 4c 6f 63 6b 46 69 6c 65 3b 0a 20 20 20 20 69 6e  LockFile;.    in
2bdc0 74 20 6e 46 69 6c 65 6e 61 6d 65 3b 0a 20 20 20  t nFilename;.   
2bdd0 20 6e 46 69 6c 65 6e 61 6d 65 20 3d 20 28 69 6e   nFilename = (in
2bde0 74 29 73 74 72 6c 65 6e 28 7a 46 69 6c 65 6e 61  t)strlen(zFilena
2bdf0 6d 65 29 20 2b 20 36 3b 0a 20 20 20 20 7a 4c 6f  me) + 6;.    zLo
2be00 63 6b 46 69 6c 65 20 3d 20 28 63 68 61 72 20 2a  ckFile = (char *
2be10 29 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28  )sqlite3_malloc(
2be20 6e 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20  nFilename);.    
2be30 69 66 28 20 7a 4c 6f 63 6b 46 69 6c 65 3d 3d 30  if( zLockFile==0
2be40 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53   ){.      rc = S
2be50 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
2be60 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71   }else{.      sq
2be70 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e  lite3_snprintf(n
2be80 46 69 6c 65 6e 61 6d 65 2c 20 7a 4c 6f 63 6b 46  Filename, zLockF
2be90 69 6c 65 2c 20 22 25 73 22 20 44 4f 54 4c 4f 43  ile, "%s" DOTLOC
2bea0 4b 5f 53 55 46 46 49 58 2c 20 7a 46 69 6c 65 6e  K_SUFFIX, zFilen
2beb0 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ame);.    }.    
2bec0 70 4e 65 77 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e  pNew->lockingCon
2bed0 74 65 78 74 20 3d 20 7a 4c 6f 63 6b 46 69 6c 65  text = zLockFile
2bee0 3b 0a 20 20 7d 0a 0a 23 69 66 20 4f 53 5f 56 58  ;.  }..#if OS_VX
2bef0 57 4f 52 4b 53 0a 20 20 65 6c 73 65 20 69 66 28  WORKS.  else if(
2bf00 20 70 4c 6f 63 6b 69 6e 67 53 74 79 6c 65 20 3d   pLockingStyle =
2bf10 3d 20 26 73 65 6d 49 6f 4d 65 74 68 6f 64 73 20  = &semIoMethods 
2bf20 29 7b 0a 20 20 20 20 2f 2a 20 4e 61 6d 65 64 20  ){.    /* Named 
2bf30 73 65 6d 61 70 68 6f 72 65 20 6c 6f 63 6b 69 6e  semaphore lockin
2bf40 67 20 75 73 65 73 20 74 68 65 20 66 69 6c 65 20  g uses the file 
2bf50 70 61 74 68 20 73 6f 20 69 74 20 6e 65 65 64 73  path so it needs
2bf60 20 74 6f 20 62 65 0a 20 20 20 20 2a 2a 20 69 6e   to be.    ** in
2bf70 63 6c 75 64 65 64 20 69 6e 20 74 68 65 20 73 65  cluded in the se
2bf80 6d 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 0a  mLockingContext.
2bf90 20 20 20 20 2a 2f 0a 20 20 20 20 75 6e 69 78 45      */.    unixE
2bfa0 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 20 20 20  nterMutex();.   
2bfb0 20 72 63 20 3d 20 66 69 6e 64 49 6e 6f 64 65 49   rc = findInodeI
2bfc0 6e 66 6f 28 70 4e 65 77 2c 20 26 70 4e 65 77 2d  nfo(pNew, &pNew-
2bfd0 3e 70 49 6e 6f 64 65 29 3b 0a 20 20 20 20 69 66  >pInode);.    if
2bfe0 28 20 28 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  ( (rc==SQLITE_OK
2bff0 29 20 26 26 20 28 70 4e 65 77 2d 3e 70 49 6e 6f  ) && (pNew->pIno
2c000 64 65 2d 3e 70 53 65 6d 3d 3d 4e 55 4c 4c 29 20  de->pSem==NULL) 
2c010 29 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a  ){.      char *z
2c020 53 65 6d 4e 61 6d 65 20 3d 20 70 4e 65 77 2d 3e  SemName = pNew->
2c030 70 49 6e 6f 64 65 2d 3e 61 53 65 6d 4e 61 6d 65  pInode->aSemName
2c040 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 3b 0a 20  ;.      int n;. 
2c050 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70       sqlite3_snp
2c060 72 69 6e 74 66 28 4d 41 58 5f 50 41 54 48 4e 41  rintf(MAX_PATHNA
2c070 4d 45 2c 20 7a 53 65 6d 4e 61 6d 65 2c 20 22 2f  ME, zSemName, "/
2c080 25 73 2e 73 65 6d 22 2c 0a 20 20 20 20 20 20 20  %s.sem",.       
2c090 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c0a0 70 4e 65 77 2d 3e 70 49 64 2d 3e 7a 43 61 6e 6f  pNew->pId->zCano
2c0b0 6e 69 63 61 6c 4e 61 6d 65 29 3b 0a 20 20 20 20  nicalName);.    
2c0c0 20 20 66 6f 72 28 20 6e 3d 31 3b 20 7a 53 65 6d    for( n=1; zSem
2c0d0 4e 61 6d 65 5b 6e 5d 3b 20 6e 2b 2b 20 29 0a 20  Name[n]; n++ ). 
2c0e0 20 20 20 20 20 20 20 69 66 28 20 7a 53 65 6d 4e         if( zSemN
2c0f0 61 6d 65 5b 6e 5d 3d 3d 27 2f 27 20 29 20 7a 53  ame[n]=='/' ) zS
2c100 65 6d 4e 61 6d 65 5b 6e 5d 20 3d 20 27 5f 27 3b  emName[n] = '_';
2c110 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 70 49 6e  .      pNew->pIn
2c120 6f 64 65 2d 3e 70 53 65 6d 20 3d 20 73 65 6d 5f  ode->pSem = sem_
2c130 6f 70 65 6e 28 7a 53 65 6d 4e 61 6d 65 2c 20 4f  open(zSemName, O
2c140 5f 43 52 45 41 54 2c 20 30 36 36 36 2c 20 31 29  _CREAT, 0666, 1)
2c150 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4e 65 77  ;.      if( pNew
2c160 2d 3e 70 49 6e 6f 64 65 2d 3e 70 53 65 6d 20 3d  ->pInode->pSem =
2c170 3d 20 53 45 4d 5f 46 41 49 4c 45 44 20 29 7b 0a  = SEM_FAILED ){.
2c180 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
2c190 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20  ITE_NOMEM;.     
2c1a0 20 20 20 70 4e 65 77 2d 3e 70 49 6e 6f 64 65 2d     pNew->pInode-
2c1b0 3e 61 53 65 6d 4e 61 6d 65 5b 30 5d 20 3d 20 27  >aSemName[0] = '
2c1c0 5c 30 27 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  \0';.      }.   
2c1d0 20 7d 0a 20 20 20 20 75 6e 69 78 4c 65 61 76 65   }.    unixLeave
2c1e0 4d 75 74 65 78 28 29 3b 0a 20 20 7d 0a 23 65 6e  Mutex();.  }.#en
2c1f0 64 69 66 0a 20 20 0a 20 20 70 4e 65 77 2d 3e 6c  dif.  .  pNew->l
2c200 61 73 74 45 72 72 6e 6f 20 3d 20 30 3b 0a 23 69  astErrno = 0;.#i
2c210 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20 69  f OS_VXWORKS.  i
2c220 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
2c230 20 29 7b 0a 20 20 20 20 69 66 28 20 68 3e 3d 30   ){.    if( h>=0
2c240 20 29 20 72 6f 62 75 73 74 5f 63 6c 6f 73 65 28   ) robust_close(
2c250 70 4e 65 77 2c 20 68 2c 20 5f 5f 4c 49 4e 45 5f  pNew, h, __LINE_
2c260 5f 29 3b 0a 20 20 20 20 68 20 3d 20 2d 31 3b 0a  _);.    h = -1;.
2c270 20 20 20 20 6f 73 55 6e 6c 69 6e 6b 28 7a 46 69      osUnlink(zFi
2c280 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20 69 73 44  lename);.    isD
2c290 65 6c 65 74 65 20 3d 20 30 3b 0a 20 20 7d 0a 20  elete = 0;.  }. 
2c2a0 20 70 4e 65 77 2d 3e 69 73 44 65 6c 65 74 65 20   pNew->isDelete 
2c2b0 3d 20 69 73 44 65 6c 65 74 65 3b 0a 23 65 6e 64  = isDelete;.#end
2c2c0 69 66 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  if.  if( rc!=SQL
2c2d0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66  ITE_OK ){.    if
2c2e0 28 20 68 3e 3d 30 20 29 20 72 6f 62 75 73 74 5f  ( h>=0 ) robust_
2c2f0 63 6c 6f 73 65 28 70 4e 65 77 2c 20 68 2c 20 5f  close(pNew, h, _
2c300 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20 7d 65 6c 73  _LINE__);.  }els
2c310 65 7b 0a 20 20 20 20 70 4e 65 77 2d 3e 70 4d 65  e{.    pNew->pMe
2c320 74 68 6f 64 20 3d 20 70 4c 6f 63 6b 69 6e 67 53  thod = pLockingS
2c330 74 79 6c 65 3b 0a 20 20 20 20 4f 70 65 6e 43 6f  tyle;.    OpenCo
2c340 75 6e 74 65 72 28 2b 31 29 3b 0a 20 20 7d 0a 20  unter(+1);.  }. 
2c350 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
2c360 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
2c370 6e 61 6d 65 20 6f 66 20 61 20 64 69 72 65 63 74  name of a direct
2c380 6f 72 79 20 69 6e 20 77 68 69 63 68 20 74 6f 20  ory in which to 
2c390 70 75 74 20 74 65 6d 70 6f 72 61 72 79 20 66 69  put temporary fi
2c3a0 6c 65 73 2e 0a 2a 2a 20 49 66 20 6e 6f 20 73 75  les..** If no su
2c3b0 69 74 61 62 6c 65 20 74 65 6d 70 6f 72 61 72 79  itable temporary
2c3c0 20 66 69 6c 65 20 64 69 72 65 63 74 6f 72 79 20   file directory 
2c3d0 63 61 6e 20 62 65 20 66 6f 75 6e 64 2c 20 72 65  can be found, re
2c3e0 74 75 72 6e 20 4e 55 4c 4c 2e 0a 2a 2f 0a 73 74  turn NULL..*/.st
2c3f0 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20  atic const char 
2c400 2a 75 6e 69 78 54 65 6d 70 46 69 6c 65 44 69 72  *unixTempFileDir
2c410 28 76 6f 69 64 29 7b 0a 20 20 73 74 61 74 69 63  (void){.  static
2c420 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 61 7a 44   const char *azD
2c430 69 72 73 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 30  irs[] = {.     0
2c440 2c 0a 20 20 20 20 20 30 2c 0a 20 20 20 20 20 22  ,.     0,.     "
2c450 2f 76 61 72 2f 74 6d 70 22 2c 0a 20 20 20 20 20  /var/tmp",.     
2c460 22 2f 75 73 72 2f 74 6d 70 22 2c 0a 20 20 20 20  "/usr/tmp",.    
2c470 20 22 2f 74 6d 70 22 2c 0a 20 20 20 20 20 30 20   "/tmp",.     0 
2c480 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 74         /* List t
2c490 65 72 6d 69 6e 61 74 6f 72 20 2a 2f 0a 20 20 7d  erminator */.  }
2c4a0 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 69 6e 74  ;.  unsigned int
2c4b0 20 69 3b 0a 20 20 73 74 72 75 63 74 20 73 74 61   i;.  struct sta
2c4c0 74 20 62 75 66 3b 0a 20 20 63 6f 6e 73 74 20 63  t buf;.  const c
2c4d0 68 61 72 20 2a 7a 44 69 72 20 3d 20 30 3b 0a 0a  har *zDir = 0;..
2c4e0 20 20 61 7a 44 69 72 73 5b 30 5d 20 3d 20 73 71    azDirs[0] = sq
2c4f0 6c 69 74 65 33 5f 74 65 6d 70 5f 64 69 72 65 63  lite3_temp_direc
2c500 74 6f 72 79 3b 0a 20 20 69 66 28 20 21 61 7a 44  tory;.  if( !azD
2c510 69 72 73 5b 31 5d 20 29 20 61 7a 44 69 72 73 5b  irs[1] ) azDirs[
2c520 31 5d 20 3d 20 67 65 74 65 6e 76 28 22 54 4d 50  1] = getenv("TMP
2c530 44 49 52 22 29 3b 0a 20 20 66 6f 72 28 69 3d 30  DIR");.  for(i=0
2c540 3b 20 69 3c 73 69 7a 65 6f 66 28 61 7a 44 69 72  ; i<sizeof(azDir
2c550 73 29 2f 73 69 7a 65 6f 66 28 61 7a 44 69 72 73  s)/sizeof(azDirs
2c560 5b 30 5d 29 3b 20 7a 44 69 72 3d 61 7a 44 69 72  [0]); zDir=azDir
2c570 73 5b 69 2b 2b 5d 29 7b 0a 20 20 20 20 69 66 28  s[i++]){.    if(
2c580 20 7a 44 69 72 3d 3d 30 20 29 20 63 6f 6e 74 69   zDir==0 ) conti
2c590 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 6f 73 53  nue;.    if( osS
2c5a0 74 61 74 28 7a 44 69 72 2c 20 26 62 75 66 29 20  tat(zDir, &buf) 
2c5b0 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
2c5c0 69 66 28 20 21 53 5f 49 53 44 49 52 28 62 75 66  if( !S_ISDIR(buf
2c5d0 2e 73 74 5f 6d 6f 64 65 29 20 29 20 63 6f 6e 74  .st_mode) ) cont
2c5e0 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 6f 73  inue;.    if( os
2c5f0 41 63 63 65 73 73 28 7a 44 69 72 2c 20 30 37 29  Access(zDir, 07)
2c600 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
2c610 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 72 65   break;.  }.  re
2c620 74 75 72 6e 20 7a 44 69 72 3b 0a 7d 0a 0a 2f 2a  turn zDir;.}../*
2c630 0a 2a 2a 20 43 72 65 61 74 65 20 61 20 74 65 6d  .** Create a tem
2c640 70 6f 72 61 72 79 20 66 69 6c 65 20 6e 61 6d 65  porary file name
2c650 20 69 6e 20 7a 42 75 66 2e 20 20 7a 42 75 66 20   in zBuf.  zBuf 
2c660 6d 75 73 74 20 62 65 20 61 6c 6c 6f 63 61 74 65  must be allocate
2c670 64 0a 2a 2a 20 62 79 20 74 68 65 20 63 61 6c 6c  d.** by the call
2c680 69 6e 67 20 70 72 6f 63 65 73 73 20 61 6e 64 20  ing process and 
2c690 6d 75 73 74 20 62 65 20 62 69 67 20 65 6e 6f 75  must be big enou
2c6a0 67 68 20 74 6f 20 68 6f 6c 64 20 61 74 20 6c 65  gh to hold at le
2c6b0 61 73 74 0a 2a 2a 20 70 56 66 73 2d 3e 6d 78 50  ast.** pVfs->mxP
2c6c0 61 74 68 6e 61 6d 65 20 62 79 74 65 73 2e 0a 2a  athname bytes..*
2c6d0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69  /.static int uni
2c6e0 78 47 65 74 54 65 6d 70 6e 61 6d 65 28 69 6e 74  xGetTempname(int
2c6f0 20 6e 42 75 66 2c 20 63 68 61 72 20 2a 7a 42 75   nBuf, char *zBu
2c700 66 29 7b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e  f){.  static con
2c710 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  st unsigned char
2c720 20 7a 43 68 61 72 73 5b 5d 20 3d 0a 20 20 20 20   zChars[] =.    
2c730 22 61 62 63 64 65 66 67 68 69 6a 6b 6c 6d 6e 6f  "abcdefghijklmno
2c740 70 71 72 73 74 75 76 77 78 79 7a 22 0a 20 20 20  pqrstuvwxyz".   
2c750 20 22 41 42 43 44 45 46 47 48 49 4a 4b 4c 4d 4e   "ABCDEFGHIJKLMN
2c760 4f 50 51 52 53 54 55 56 57 58 59 5a 22 0a 20 20  OPQRSTUVWXYZ".  
2c770 20 20 22 30 31 32 33 34 35 36 37 38 39 22 3b 0a    "0123456789";.
2c780 20 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 69    unsigned int i
2c790 2c 20 6a 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61  , j;.  const cha
2c7a0 72 20 2a 7a 44 69 72 3b 0a 0a 20 20 2f 2a 20 49  r *zDir;..  /* I
2c7b0 74 27 73 20 6f 64 64 20 74 6f 20 73 69 6d 75 6c  t's odd to simul
2c7c0 61 74 65 20 61 6e 20 69 6f 2d 65 72 72 6f 72 20  ate an io-error 
2c7d0 68 65 72 65 2c 20 62 75 74 20 72 65 61 6c 6c 79  here, but really
2c7e0 20 74 68 69 73 20 69 73 20 6a 75 73 74 0a 20 20   this is just.  
2c7f0 2a 2a 20 75 73 69 6e 67 20 74 68 65 20 69 6f 2d  ** using the io-
2c800 65 72 72 6f 72 20 69 6e 66 72 61 73 74 72 75 63  error infrastruc
2c810 74 75 72 65 20 74 6f 20 74 65 73 74 20 74 68 61  ture to test tha
2c820 74 20 53 51 4c 69 74 65 20 68 61 6e 64 6c 65 73  t SQLite handles
2c830 20 74 68 69 73 0a 20 20 2a 2a 20 66 75 6e 63 74   this.  ** funct
2c840 69 6f 6e 20 66 61 69 6c 69 6e 67 2e 20 0a 20 20  ion failing. .  
2c850 2a 2f 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45  */.  SimulateIOE
2c860 72 72 6f 72 28 20 72 65 74 75 72 6e 20 53 51 4c  rror( return SQL
2c870 49 54 45 5f 49 4f 45 52 52 20 29 3b 0a 0a 20 20  ITE_IOERR );..  
2c880 7a 44 69 72 20 3d 20 75 6e 69 78 54 65 6d 70 46  zDir = unixTempF
2c890 69 6c 65 44 69 72 28 29 3b 0a 20 20 69 66 28 20  ileDir();.  if( 
2c8a0 7a 44 69 72 3d 3d 30 20 29 20 7a 44 69 72 20 3d  zDir==0 ) zDir =
2c8b0 20 22 2e 22 3b 0a 0a 20 20 2f 2a 20 43 68 65 63   ".";..  /* Chec
2c8c0 6b 20 74 68 61 74 20 74 68 65 20 6f 75 74 70 75  k that the outpu
2c8d0 74 20 62 75 66 66 65 72 20 69 73 20 6c 61 72 67  t buffer is larg
2c8e0 65 20 65 6e 6f 75 67 68 20 66 6f 72 20 74 68 65  e enough for the
2c8f0 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 20   temporary file 
2c900 0a 20 20 2a 2a 20 6e 61 6d 65 2e 20 49 66 20 69  .  ** name. If i
2c910 74 20 69 73 20 6e 6f 74 2c 20 72 65 74 75 72 6e  t is not, return
2c920 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 2e 0a 20   SQLITE_ERROR.. 
2c930 20 2a 2f 0a 20 20 69 66 28 20 28 73 74 72 6c 65   */.  if( (strle
2c940 6e 28 7a 44 69 72 29 20 2b 20 73 74 72 6c 65 6e  n(zDir) + strlen
2c950 28 53 51 4c 49 54 45 5f 54 45 4d 50 5f 46 49 4c  (SQLITE_TEMP_FIL
2c960 45 5f 50 52 45 46 49 58 29 20 2b 20 31 37 29 20  E_PREFIX) + 17) 
2c970 3e 3d 20 28 73 69 7a 65 5f 74 29 6e 42 75 66 20  >= (size_t)nBuf 
2c980 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
2c990 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a  LITE_ERROR;.  }.
2c9a0 0a 20 20 64 6f 7b 0a 20 20 20 20 73 71 6c 69 74  .  do{.    sqlit
2c9b0 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 42 75 66  e3_snprintf(nBuf
2c9c0 2d 31 37 2c 20 7a 42 75 66 2c 20 22 25 73 2f 22  -17, zBuf, "%s/"
2c9d0 53 51 4c 49 54 45 5f 54 45 4d 50 5f 46 49 4c 45  SQLITE_TEMP_FILE
2c9e0 5f 50 52 45 46 49 58 2c 20 7a 44 69 72 29 3b 0a  _PREFIX, zDir);.
2c9f0 20 20 20 20 6a 20 3d 20 28 69 6e 74 29 73 74 72      j = (int)str
2ca00 6c 65 6e 28 7a 42 75 66 29 3b 0a 20 20 20 20 73  len(zBuf);.    s
2ca10 71 6c 69 74 65 33 5f 72 61 6e 64 6f 6d 6e 65 73  qlite3_randomnes
2ca20 73 28 31 35 2c 20 26 7a 42 75 66 5b 6a 5d 29 3b  s(15, &zBuf[j]);
2ca30 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
2ca40 31 35 3b 20 69 2b 2b 2c 20 6a 2b 2b 29 7b 0a 20  15; i++, j++){. 
2ca50 20 20 20 20 20 7a 42 75 66 5b 6a 5d 20 3d 20 28       zBuf[j] = (
2ca60 63 68 61 72 29 7a 43 68 61 72 73 5b 20 28 28 75  char)zChars[ ((u
2ca70 6e 73 69 67 6e 65 64 20 63 68 61 72 29 7a 42 75  nsigned char)zBu
2ca80 66 5b 6a 5d 29 25 28 73 69 7a 65 6f 66 28 7a 43  f[j])%(sizeof(zC
2ca90 68 61 72 73 29 2d 31 29 20 5d 3b 0a 20 20 20 20  hars)-1) ];.    
2caa0 7d 0a 20 20 20 20 7a 42 75 66 5b 6a 5d 20 3d 20  }.    zBuf[j] = 
2cab0 30 3b 0a 20 20 7d 77 68 69 6c 65 28 20 6f 73 41  0;.  }while( osA
2cac0 63 63 65 73 73 28 7a 42 75 66 2c 30 29 3d 3d 30  ccess(zBuf,0)==0
2cad0 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c   );.  return SQL
2cae0 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 20 53  ITE_OK;.}..#if S
2caf0 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43  QLITE_ENABLE_LOC
2cb00 4b 49 4e 47 5f 53 54 59 4c 45 20 26 26 20 64 65  KING_STYLE && de
2cb10 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29  fined(__APPLE__)
2cb20 0a 2f 2a 0a 2a 2a 20 52 6f 75 74 69 6e 65 20 74  ./*.** Routine t
2cb30 6f 20 74 72 61 6e 73 66 6f 72 6d 20 61 20 75 6e  o transform a un
2cb40 69 78 46 69 6c 65 20 69 6e 74 6f 20 61 20 70 72  ixFile into a pr
2cb50 6f 78 79 2d 6c 6f 63 6b 69 6e 67 20 75 6e 69 78  oxy-locking unix
2cb60 46 69 6c 65 2e 0a 2a 2a 20 49 6d 70 6c 65 6d 65  File..** Impleme
2cb70 6e 74 61 74 69 6f 6e 20 69 6e 20 74 68 65 20 70  ntation in the p
2cb80 72 6f 78 79 2d 6c 6f 63 6b 20 64 69 76 69 73 69  roxy-lock divisi
2cb90 6f 6e 2c 20 62 75 74 20 75 73 65 64 20 62 79 20  on, but used by 
2cba0 75 6e 69 78 4f 70 65 6e 28 29 0a 2a 2a 20 69 66  unixOpen().** if
2cbb0 20 53 51 4c 49 54 45 5f 50 52 45 46 45 52 5f 50   SQLITE_PREFER_P
2cbc0 52 4f 58 59 5f 4c 4f 43 4b 49 4e 47 20 69 73 20  ROXY_LOCKING is 
2cbd0 64 65 66 69 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74  defined..*/.stat
2cbe0 69 63 20 69 6e 74 20 70 72 6f 78 79 54 72 61 6e  ic int proxyTran
2cbf0 73 66 6f 72 6d 55 6e 69 78 46 69 6c 65 28 75 6e  sformUnixFile(un
2cc00 69 78 46 69 6c 65 2a 2c 20 63 6f 6e 73 74 20 63  ixFile*, const c
2cc10 68 61 72 2a 29 3b 0a 23 65 6e 64 69 66 0a 0a 2f  har*);.#endif../
2cc20 2a 0a 2a 2a 20 53 65 61 72 63 68 20 66 6f 72 20  *.** Search for 
2cc30 61 6e 20 75 6e 75 73 65 64 20 66 69 6c 65 20 64  an unused file d
2cc40 65 73 63 72 69 70 74 6f 72 20 74 68 61 74 20 77  escriptor that w
2cc50 61 73 20 6f 70 65 6e 65 64 20 6f 6e 20 74 68 65  as opened on the
2cc60 20 64 61 74 61 62 61 73 65 20 0a 2a 2a 20 66 69   database .** fi
2cc70 6c 65 20 28 6e 6f 74 20 61 20 6a 6f 75 72 6e 61  le (not a journa
2cc80 6c 20 6f 72 20 6d 61 73 74 65 72 2d 6a 6f 75 72  l or master-jour
2cc90 6e 61 6c 20 66 69 6c 65 29 20 69 64 65 6e 74 69  nal file) identi
2cca0 66 69 65 64 20 62 79 20 70 61 74 68 6e 61 6d 65  fied by pathname
2ccb0 0a 2a 2a 20 7a 50 61 74 68 20 77 69 74 68 20 53  .** zPath with S
2ccc0 51 4c 49 54 45 5f 4f 50 45 4e 5f 58 58 58 20 66  QLITE_OPEN_XXX f
2ccd0 6c 61 67 73 20 6d 61 74 63 68 69 6e 67 20 74 68  lags matching th
2cce0 6f 73 65 20 70 61 73 73 65 64 20 61 73 20 74 68  ose passed as th
2ccf0 65 20 73 65 63 6f 6e 64 0a 2a 2a 20 61 72 67 75  e second.** argu
2cd00 6d 65 6e 74 20 74 6f 20 74 68 69 73 20 66 75 6e  ment to this fun
2cd10 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 53 75 63  ction..**.** Suc
2cd20 68 20 61 20 66 69 6c 65 20 64 65 73 63 72 69 70  h a file descrip
2cd30 74 6f 72 20 6d 61 79 20 65 78 69 73 74 20 69 66  tor may exist if
2cd40 20 61 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e   a database conn
2cd50 65 63 74 69 6f 6e 20 77 61 73 20 63 6c 6f 73 65  ection was close
2cd60 64 0a 2a 2a 20 62 75 74 20 74 68 65 20 61 73 73  d.** but the ass
2cd70 6f 63 69 61 74 65 64 20 66 69 6c 65 20 64 65 73  ociated file des
2cd80 63 72 69 70 74 6f 72 20 63 6f 75 6c 64 20 6e 6f  criptor could no
2cd90 74 20 62 65 20 63 6c 6f 73 65 64 20 62 65 63 61  t be closed beca
2cda0 75 73 65 20 73 6f 6d 65 0a 2a 2a 20 6f 74 68 65  use some.** othe
2cdb0 72 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  r file descripto
2cdc0 72 20 6f 70 65 6e 20 6f 6e 20 74 68 65 20 73 61  r open on the sa
2cdd0 6d 65 20 66 69 6c 65 20 69 73 20 68 6f 6c 64 69  me file is holdi
2cde0 6e 67 20 61 20 66 69 6c 65 2d 6c 6f 63 6b 2e 0a  ng a file-lock..
2cdf0 2a 2a 20 52 65 66 65 72 20 74 6f 20 63 6f 6d 6d  ** Refer to comm
2ce00 65 6e 74 73 20 69 6e 20 74 68 65 20 75 6e 69 78  ents in the unix
2ce10 43 6c 6f 73 65 28 29 20 66 75 6e 63 74 69 6f 6e  Close() function
2ce20 20 61 6e 64 20 74 68 65 20 6c 65 6e 67 74 68 79   and the lengthy
2ce30 20 63 6f 6d 6d 65 6e 74 0a 2a 2a 20 64 65 73 63   comment.** desc
2ce40 72 69 62 69 6e 67 20 22 50 6f 73 69 78 20 41 64  ribing "Posix Ad
2ce50 76 69 73 6f 72 79 20 4c 6f 63 6b 69 6e 67 22 20  visory Locking" 
2ce60 61 74 20 74 68 65 20 73 74 61 72 74 20 6f 66 20  at the start of 
2ce70 74 68 69 73 20 66 69 6c 65 20 66 6f 72 20 0a 2a  this file for .*
2ce80 2a 20 66 75 72 74 68 65 72 20 64 65 74 61 69 6c  * further detail
2ce90 73 2e 20 41 6c 73 6f 2c 20 74 69 63 6b 65 74 20  s. Also, ticket 
2cea0 23 34 30 31 38 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  #4018..**.** If 
2ceb0 61 20 73 75 69 74 61 62 6c 65 20 66 69 6c 65 20  a suitable file 
2cec0 64 65 73 63 72 69 70 74 6f 72 20 69 73 20 66 6f  descriptor is fo
2ced0 75 6e 64 2c 20 74 68 65 6e 20 69 74 20 69 73 20  und, then it is 
2cee0 72 65 74 75 72 6e 65 64 2e 20 49 66 20 6e 6f 0a  returned. If no.
2cef0 2a 2a 20 73 75 63 68 20 66 69 6c 65 20 64 65 73  ** such file des
2cf00 63 72 69 70 74 6f 72 20 69 73 20 6c 6f 63 61 74  criptor is locat
2cf10 65 64 2c 20 2d 31 20 69 73 20 72 65 74 75 72 6e  ed, -1 is return
2cf20 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 55 6e  ed..*/.static Un
2cf30 69 78 55 6e 75 73 65 64 46 64 20 2a 66 69 6e 64  ixUnusedFd *find
2cf40 52 65 75 73 61 62 6c 65 46 64 28 63 6f 6e 73 74  ReusableFd(const
2cf50 20 63 68 61 72 20 2a 7a 50 61 74 68 2c 20 69 6e   char *zPath, in
2cf60 74 20 66 6c 61 67 73 29 7b 0a 20 20 55 6e 69 78  t flags){.  Unix
2cf70 55 6e 75 73 65 64 46 64 20 2a 70 55 6e 75 73 65  UnusedFd *pUnuse
2cf80 64 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 44 6f 20  d = 0;..  /* Do 
2cf90 6e 6f 74 20 73 65 61 72 63 68 20 66 6f 72 20 61  not search for a
2cfa0 6e 20 75 6e 75 73 65 64 20 66 69 6c 65 20 64 65  n unused file de
2cfb0 73 63 72 69 70 74 6f 72 20 6f 6e 20 76 78 77 6f  scriptor on vxwo
2cfc0 72 6b 73 2e 20 4e 6f 74 20 62 65 63 61 75 73 65  rks. Not because
2cfd0 0a 20 20 2a 2a 20 76 78 77 6f 72 6b 73 20 77 6f  .  ** vxworks wo
2cfe0 75 6c 64 20 6e 6f 74 20 62 65 6e 65 66 69 74 20  uld not benefit 
2cff0 66 72 6f 6d 20 74 68 65 20 63 68 61 6e 67 65 20  from the change 
2d000 28 69 74 20 6d 69 67 68 74 2c 20 77 65 27 72 65  (it might, we're
2d010 20 6e 6f 74 20 73 75 72 65 29 2c 0a 20 20 2a 2a   not sure),.  **
2d020 20 62 75 74 20 62 65 63 61 75 73 65 20 6e 6f 20   but because no 
2d030 77 61 79 20 74 6f 20 74 65 73 74 20 69 74 20 69  way to test it i
2d040 73 20 63 75 72 72 65 6e 74 6c 79 20 61 76 61 69  s currently avai
2d050 6c 61 62 6c 65 2e 20 49 74 20 69 73 20 62 65 74  lable. It is bet
2d060 74 65 72 20 0a 20 20 2a 2a 20 6e 6f 74 20 74 6f  ter .  ** not to
2d070 20 72 69 73 6b 20 62 72 65 61 6b 69 6e 67 20 76   risk breaking v
2d080 78 77 6f 72 6b 73 20 73 75 70 70 6f 72 74 20 66  xworks support f
2d090 6f 72 20 74 68 65 20 73 61 6b 65 20 6f 66 20 73  or the sake of s
2d0a0 75 63 68 20 61 6e 20 6f 62 73 63 75 72 65 20 0a  uch an obscure .
2d0b0 20 20 2a 2a 20 66 65 61 74 75 72 65 2e 20 20 2a    ** feature.  *
2d0c0 2f 0a 23 69 66 20 21 4f 53 5f 56 58 57 4f 52 4b  /.#if !OS_VXWORK
2d0d0 53 0a 20 20 73 74 72 75 63 74 20 73 74 61 74 20  S.  struct stat 
2d0e0 73 53 74 61 74 3b 20 20 20 20 20 20 20 20 20 20  sStat;          
2d0f0 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75           /* Resu
2d100 6c 74 73 20 6f 66 20 73 74 61 74 28 29 20 63 61  lts of stat() ca
2d110 6c 6c 20 2a 2f 0a 0a 20 20 2f 2a 20 41 20 73 74  ll */..  /* A st
2d120 61 74 28 29 20 63 61 6c 6c 20 6d 61 79 20 66 61  at() call may fa
2d130 69 6c 20 66 6f 72 20 76 61 72 69 6f 75 73 20 72  il for various r
2d140 65 61 73 6f 6e 73 2e 20 49 66 20 74 68 69 73 20  easons. If this 
2d150 68 61 70 70 65 6e 73 2c 20 69 74 20 69 73 0a 20  happens, it is. 
2d160 20 2a 2a 20 61 6c 6d 6f 73 74 20 63 65 72 74 61   ** almost certa
2d170 69 6e 20 74 68 61 74 20 61 6e 20 6f 70 65 6e 28  in that an open(
2d180 29 20 63 61 6c 6c 20 6f 6e 20 74 68 65 20 73 61  ) call on the sa
2d190 6d 65 20 70 61 74 68 20 77 69 6c 6c 20 61 6c 73  me path will als
2d1a0 6f 20 66 61 69 6c 2e 0a 20 20 2a 2a 20 46 6f 72  o fail..  ** For
2d1b0 20 74 68 69 73 20 72 65 61 73 6f 6e 2c 20 69 66   this reason, if
2d1c0 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   an error occurs
2d1d0 20 69 6e 20 74 68 65 20 73 74 61 74 28 29 20 63   in the stat() c
2d1e0 61 6c 6c 20 68 65 72 65 2c 20 69 74 20 69 73 0a  all here, it is.
2d1f0 20 20 2a 2a 20 69 67 6e 6f 72 65 64 20 61 6e 64    ** ignored and
2d200 20 2d 31 20 69 73 20 72 65 74 75 72 6e 65 64 2e   -1 is returned.
2d210 20 54 68 65 20 63 61 6c 6c 65 72 20 77 69 6c 6c   The caller will
2d220 20 74 72 79 20 74 6f 20 6f 70 65 6e 20 61 20 6e   try to open a n
2d230 65 77 20 66 69 6c 65 0a 20 20 2a 2a 20 64 65 73  ew file.  ** des
2d240 63 72 69 70 74 6f 72 20 6f 6e 20 74 68 65 20 73  criptor on the s
2d250 61 6d 65 20 70 61 74 68 2c 20 66 61 69 6c 2c 20  ame path, fail, 
2d260 61 6e 64 20 72 65 74 75 72 6e 20 61 6e 20 65 72  and return an er
2d270 72 6f 72 20 74 6f 20 53 51 4c 69 74 65 2e 0a 20  ror to SQLite.. 
2d280 20 2a 2a 0a 20 20 2a 2a 20 45 76 65 6e 20 69 66   **.  ** Even if
2d290 20 61 20 73 75 62 73 65 71 75 65 6e 74 20 6f 70   a subsequent op
2d2a0 65 6e 28 29 20 63 61 6c 6c 20 64 6f 65 73 20 73  en() call does s
2d2b0 75 63 63 65 65 64 2c 20 74 68 65 20 63 6f 6e 73  ucceed, the cons
2d2c0 65 71 75 65 6e 63 65 73 20 6f 66 0a 20 20 2a 2a  equences of.  **
2d2d0 20 6e 6f 74 20 73 65 61 72 63 68 69 6e 67 20 66   not searching f
2d2e0 6f 72 20 61 20 72 65 73 75 73 61 62 6c 65 20 66  or a resusable f
2d2f0 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 61  ile descriptor a
2d300 72 65 20 6e 6f 74 20 64 69 72 65 2e 20 20 2a 2f  re not dire.  */
2d310 0a 20 20 69 66 28 20 30 3d 3d 6f 73 53 74 61 74  .  if( 0==osStat
2d320 28 7a 50 61 74 68 2c 20 26 73 53 74 61 74 29 20  (zPath, &sStat) 
2d330 29 7b 0a 20 20 20 20 75 6e 69 78 49 6e 6f 64 65  ){.    unixInode
2d340 49 6e 66 6f 20 2a 70 49 6e 6f 64 65 3b 0a 0a 20  Info *pInode;.. 
2d350 20 20 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65     unixEnterMute
2d360 78 28 29 3b 0a 20 20 20 20 70 49 6e 6f 64 65 20  x();.    pInode 
2d370 3d 20 69 6e 6f 64 65 4c 69 73 74 3b 0a 20 20 20  = inodeList;.   
2d380 20 77 68 69 6c 65 28 20 70 49 6e 6f 64 65 20 26   while( pInode &
2d390 26 20 28 70 49 6e 6f 64 65 2d 3e 66 69 6c 65 49  & (pInode->fileI
2d3a0 64 2e 64 65 76 21 3d 73 53 74 61 74 2e 73 74 5f  d.dev!=sStat.st_
2d3b0 64 65 76 0a 20 20 20 20 20 20 20 20 20 20 20 20  dev.            
2d3c0 20 20 20 20 20 20 20 20 20 7c 7c 20 70 49 6e 6f           || pIno
2d3d0 64 65 2d 3e 66 69 6c 65 49 64 2e 69 6e 6f 21 3d  de->fileId.ino!=
2d3e0 73 53 74 61 74 2e 73 74 5f 69 6e 6f 29 20 29 7b  sStat.st_ino) ){
2d3f0 0a 20 20 20 20 20 20 20 70 49 6e 6f 64 65 20 3d  .       pInode =
2d400 20 70 49 6e 6f 64 65 2d 3e 70 4e 65 78 74 3b 0a   pInode->pNext;.
2d410 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 49      }.    if( pI
2d420 6e 6f 64 65 20 29 7b 0a 20 20 20 20 20 20 55 6e  node ){.      Un
2d430 69 78 55 6e 75 73 65 64 46 64 20 2a 2a 70 70 3b  ixUnusedFd **pp;
2d440 0a 20 20 20 20 20 20 66 6f 72 28 70 70 3d 26 70  .      for(pp=&p
2d450 49 6e 6f 64 65 2d 3e 70 55 6e 75 73 65 64 3b 20  Inode->pUnused; 
2d460 2a 70 70 20 26 26 20 28 2a 70 70 29 2d 3e 66 6c  *pp && (*pp)->fl
2d470 61 67 73 21 3d 66 6c 61 67 73 3b 20 70 70 3d 26  ags!=flags; pp=&
2d480 28 28 2a 70 70 29 2d 3e 70 4e 65 78 74 29 29 3b  ((*pp)->pNext));
2d490 0a 20 20 20 20 20 20 70 55 6e 75 73 65 64 20 3d  .      pUnused =
2d4a0 20 2a 70 70 3b 0a 20 20 20 20 20 20 69 66 28 20   *pp;.      if( 
2d4b0 70 55 6e 75 73 65 64 20 29 7b 0a 20 20 20 20 20  pUnused ){.     
2d4c0 20 20 20 2a 70 70 20 3d 20 70 55 6e 75 73 65 64     *pp = pUnused
2d4d0 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d  ->pNext;.      }
2d4e0 0a 20 20 20 20 7d 0a 20 20 20 20 75 6e 69 78 4c  .    }.    unixL
2d4f0 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 20 20 7d  eaveMutex();.  }
2d500 0a 23 65 6e 64 69 66 20 20 20 20 2f 2a 20 69 66  .#endif    /* if
2d510 20 21 4f 53 5f 56 58 57 4f 52 4b 53 20 2a 2f 0a   !OS_VXWORKS */.
2d520 20 20 72 65 74 75 72 6e 20 70 55 6e 75 73 65 64    return pUnused
2d530 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
2d540 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c  function is call
2d550 65 64 20 62 79 20 75 6e 69 78 4f 70 65 6e 28 29  ed by unixOpen()
2d560 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 74 68   to determine th
2d570 65 20 75 6e 69 78 20 70 65 72 6d 69 73 73 69 6f  e unix permissio
2d580 6e 73 0a 2a 2a 20 74 6f 20 63 72 65 61 74 65 20  ns.** to create 
2d590 6e 65 77 20 66 69 6c 65 73 20 77 69 74 68 2e 20  new files with. 
2d5a0 49 66 20 6e 6f 20 65 72 72 6f 72 20 6f 63 63 75  If no error occu
2d5b0 72 73 2c 20 74 68 65 6e 20 53 51 4c 49 54 45 5f  rs, then SQLITE_
2d5c0 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 0a 2a  OK is returned.*
2d5d0 2a 20 61 6e 64 20 61 20 76 61 6c 75 65 20 73 75  * and a value su
2d5e0 69 74 61 62 6c 65 20 66 6f 72 20 70 61 73 73 69  itable for passi
2d5f0 6e 67 20 61 73 20 74 68 65 20 74 68 69 72 64 20  ng as the third 
2d600 61 72 67 75 6d 65 6e 74 20 74 6f 20 6f 70 65 6e  argument to open
2d610 28 32 29 20 69 73 0a 2a 2a 20 77 72 69 74 74 65  (2) is.** writte
2d620 6e 20 74 6f 20 2a 70 4d 6f 64 65 2e 20 49 66 20  n to *pMode. If 
2d630 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63 63 75  an IO error occu
2d640 72 73 2c 20 61 6e 20 53 51 4c 69 74 65 20 65 72  rs, an SQLite er
2d650 72 6f 72 20 63 6f 64 65 20 69 73 20 0a 2a 2a 20  ror code is .** 
2d660 72 65 74 75 72 6e 65 64 20 61 6e 64 20 74 68 65  returned and the
2d670 20 76 61 6c 75 65 20 6f 66 20 2a 70 4d 6f 64 65   value of *pMode
2d680 20 69 73 20 6e 6f 74 20 6d 6f 64 69 66 69 65 64   is not modified
2d690 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 66  ..**.** If the f
2d6a0 69 6c 65 20 62 65 69 6e 67 20 6f 70 65 6e 65 64  ile being opened
2d6b0 20 69 73 20 61 20 74 65 6d 70 6f 72 61 72 79 20   is a temporary 
2d6c0 66 69 6c 65 2c 20 69 74 20 69 73 20 61 6c 77 61  file, it is alwa
2d6d0 79 73 20 63 72 65 61 74 65 64 20 77 69 74 68 0a  ys created with.
2d6e0 2a 2a 20 74 68 65 20 6f 63 74 61 6c 20 70 65 72  ** the octal per
2d6f0 6d 69 73 73 69 6f 6e 73 20 30 36 30 30 20 28 72  missions 0600 (r
2d700 65 61 64 2f 77 72 69 74 61 62 6c 65 20 62 79 20  ead/writable by 
2d710 6f 77 6e 65 72 20 6f 6e 6c 79 29 2e 20 49 66 20  owner only). If 
2d720 74 68 65 20 66 69 6c 65 0a 2a 2a 20 69 73 20 61  the file.** is a
2d730 20 64 61 74 61 62 61 73 65 20 6f 72 20 6d 61 73   database or mas
2d740 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
2d750 2c 20 69 74 20 69 73 20 63 72 65 61 74 65 64 20  , it is created 
2d760 77 69 74 68 20 74 68 65 20 70 65 72 6d 69 73 73  with the permiss
2d770 69 6f 6e 73 20 0a 2a 2a 20 6d 61 73 6b 20 53 51  ions .** mask SQ
2d780 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 46 49 4c  LITE_DEFAULT_FIL
2d790 45 5f 50 45 52 4d 49 53 53 49 4f 4e 53 2e 0a 2a  E_PERMISSIONS..*
2d7a0 2a 0a 2a 2a 20 46 69 6e 61 6c 6c 79 2c 20 69 66  *.** Finally, if
2d7b0 20 74 68 65 20 66 69 6c 65 20 62 65 69 6e 67 20   the file being 
2d7c0 6f 70 65 6e 65 64 20 69 73 20 61 20 57 41 4c 20  opened is a WAL 
2d7d0 6f 72 20 72 65 67 75 6c 61 72 20 6a 6f 75 72 6e  or regular journ
2d7e0 61 6c 20 66 69 6c 65 2c 20 74 68 65 6e 20 0a 2a  al file, then .*
2d7f0 2a 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * this function 
2d800 71 75 65 72 69 65 73 20 74 68 65 20 66 69 6c 65  queries the file
2d810 2d 73 79 73 74 65 6d 20 66 6f 72 20 74 68 65 20  -system for the 
2d820 70 65 72 6d 69 73 73 69 6f 6e 73 20 6f 6e 20 74  permissions on t
2d830 68 65 20 0a 2a 2a 20 63 6f 72 72 65 73 70 6f 6e  he .** correspon
2d840 64 69 6e 67 20 64 61 74 61 62 61 73 65 20 66 69  ding database fi
2d850 6c 65 20 61 6e 64 20 73 65 74 73 20 2a 70 4d 6f  le and sets *pMo
2d860 64 65 20 74 6f 20 74 68 69 73 20 76 61 6c 75 65  de to this value
2d870 2e 20 57 68 65 6e 65 76 65 72 20 0a 2a 2a 20 70  . Whenever .** p
2d880 6f 73 73 69 62 6c 65 2c 20 57 41 4c 20 61 6e 64  ossible, WAL and
2d890 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 73 20 61   journal files a
2d8a0 72 65 20 63 72 65 61 74 65 64 20 75 73 69 6e 67  re created using
2d8b0 20 74 68 65 20 73 61 6d 65 20 70 65 72 6d 69 73   the same permis
2d8c0 73 69 6f 6e 73 20 0a 2a 2a 20 61 73 20 74 68 65  sions .** as the
2d8d0 20 61 73 73 6f 63 69 61 74 65 64 20 64 61 74 61   associated data
2d8e0 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a  base file..**.**
2d8f0 20 49 66 20 74 68 65 20 53 51 4c 49 54 45 5f 45   If the SQLITE_E
2d900 4e 41 42 4c 45 5f 38 5f 33 5f 4e 41 4d 45 53 20  NABLE_8_3_NAMES 
2d910 6f 70 74 69 6f 6e 20 69 73 20 65 6e 61 62 6c 65  option is enable
2d920 64 2c 20 74 68 65 6e 20 74 68 65 0a 2a 2a 20 6f  d, then the.** o
2d930 72 69 67 69 6e 61 6c 20 66 69 6c 65 6e 61 6d 65  riginal filename
2d940 20 69 73 20 75 6e 61 76 61 69 6c 61 62 6c 65 2e   is unavailable.
2d950 20 20 42 75 74 20 38 5f 33 5f 4e 41 4d 45 53 20    But 8_3_NAMES 
2d960 69 73 20 6f 6e 6c 79 20 75 73 65 64 20 66 6f 72  is only used for
2d970 0a 2a 2a 20 46 41 54 20 66 69 6c 65 73 79 73 74  .** FAT filesyst
2d980 65 6d 73 20 61 6e 64 20 70 65 72 6d 69 73 73 69  ems and permissi
2d990 6f 6e 73 20 64 6f 20 6e 6f 74 20 6d 61 74 74 65  ons do not matte
2d9a0 72 20 74 68 65 72 65 2c 20 73 6f 20 6a 75 73 74  r there, so just
2d9b0 20 75 73 65 0a 2a 2a 20 74 68 65 20 64 65 66 61   use.** the defa
2d9c0 75 6c 74 20 70 65 72 6d 69 73 73 69 6f 6e 73 2e  ult permissions.
2d9d0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66  .*/.static int f
2d9e0 69 6e 64 43 72 65 61 74 65 46 69 6c 65 4d 6f 64  indCreateFileMod
2d9f0 65 28 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  e(.  const char 
2da00 2a 7a 50 61 74 68 2c 20 20 20 20 20 20 20 20 20  *zPath,         
2da10 20 20 20 20 20 2f 2a 20 50 61 74 68 20 6f 66 20       /* Path of 
2da20 66 69 6c 65 20 28 70 6f 73 73 69 62 6c 79 29 20  file (possibly) 
2da30 62 65 69 6e 67 20 63 72 65 61 74 65 64 20 2a 2f  being created */
2da40 0a 20 20 69 6e 74 20 66 6c 61 67 73 2c 20 20 20  .  int flags,   
2da50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2da60 20 20 20 2f 2a 20 46 6c 61 67 73 20 70 61 73 73     /* Flags pass
2da70 65 64 20 61 73 20 34 74 68 20 61 72 67 75 6d 65  ed as 4th argume
2da80 6e 74 20 74 6f 20 78 4f 70 65 6e 28 29 20 2a 2f  nt to xOpen() */
2da90 0a 20 20 6d 6f 64 65 5f 74 20 2a 70 4d 6f 64 65  .  mode_t *pMode
2daa0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
2dab0 20 20 20 2f 2a 20 4f 55 54 3a 20 50 65 72 6d 69     /* OUT: Permi
2dac0 73 73 69 6f 6e 73 20 74 6f 20 6f 70 65 6e 20 66  ssions to open f
2dad0 69 6c 65 20 77 69 74 68 20 2a 2f 0a 20 20 75 69  ile with */.  ui
2dae0 64 5f 74 20 2a 70 55 69 64 2c 20 20 20 20 20 20  d_t *pUid,      
2daf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2db00 20 4f 55 54 3a 20 75 69 64 20 74 6f 20 73 65 74   OUT: uid to set
2db10 20 6f 6e 20 74 68 65 20 66 69 6c 65 20 2a 2f 0a   on the file */.
2db20 20 20 67 69 64 5f 74 20 2a 70 47 69 64 20 20 20    gid_t *pGid   
2db30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2db40 20 20 2f 2a 20 4f 55 54 3a 20 67 69 64 20 74 6f    /* OUT: gid to
2db50 20 73 65 74 20 6f 6e 20 74 68 65 20 66 69 6c 65   set on the file
2db60 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20   */.){.  int rc 
2db70 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20  = SQLITE_OK;    
2db80 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
2db90 72 6e 20 43 6f 64 65 20 2a 2f 0a 20 20 2a 70 4d  rn Code */.  *pM
2dba0 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 44 45 46  ode = SQLITE_DEF
2dbb0 41 55 4c 54 5f 46 49 4c 45 5f 50 45 52 4d 49 53  AULT_FILE_PERMIS
2dbc0 53 49 4f 4e 53 3b 0a 20 20 69 66 28 20 66 6c 61  SIONS;.  if( fla
2dbd0 67 73 20 26 20 28 53 51 4c 49 54 45 5f 4f 50 45  gs & (SQLITE_OPE
2dbe0 4e 5f 57 41 4c 7c 53 51 4c 49 54 45 5f 4f 50 45  N_WAL|SQLITE_OPE
2dbf0 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 29 20  N_MAIN_JOURNAL) 
2dc00 29 7b 0a 20 20 20 20 63 68 61 72 20 7a 44 62 5b  ){.    char zDb[
2dc10 4d 41 58 5f 50 41 54 48 4e 41 4d 45 2b 31 5d 3b  MAX_PATHNAME+1];
2dc20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65       /* Database
2dc30 20 66 69 6c 65 20 70 61 74 68 20 2a 2f 0a 20 20   file path */.  
2dc40 20 20 69 6e 74 20 6e 44 62 3b 20 20 20 20 20 20    int nDb;      
2dc50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2dc60 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 76 61 6c  /* Number of val
2dc70 69 64 20 62 79 74 65 73 20 69 6e 20 7a 44 62 20  id bytes in zDb 
2dc80 2a 2f 0a 20 20 20 20 73 74 72 75 63 74 20 73 74  */.    struct st
2dc90 61 74 20 73 53 74 61 74 3b 20 20 20 20 20 20 20  at sStat;       
2dca0 20 20 20 20 20 2f 2a 20 4f 75 74 70 75 74 20 6f       /* Output o
2dcb0 66 20 73 74 61 74 28 29 20 6f 6e 20 64 61 74 61  f stat() on data
2dcc0 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 0a 20 20  base file */..  
2dcd0 20 20 2f 2a 20 7a 50 61 74 68 20 69 73 20 61 20    /* zPath is a 
2dce0 70 61 74 68 20 74 6f 20 61 20 57 41 4c 20 6f 72  path to a WAL or
2dcf0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 54   journal file. T
2dd00 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 62 6c 6f  he following blo
2dd10 63 6b 20 64 65 72 69 76 65 73 0a 20 20 20 20 2a  ck derives.    *
2dd20 2a 20 74 68 65 20 70 61 74 68 20 74 6f 20 74 68  * the path to th
2dd30 65 20 61 73 73 6f 63 69 61 74 65 64 20 64 61 74  e associated dat
2dd40 61 62 61 73 65 20 66 69 6c 65 20 66 72 6f 6d 20  abase file from 
2dd50 7a 50 61 74 68 2e 20 54 68 69 73 20 62 6c 6f 63  zPath. This bloc
2dd60 6b 20 68 61 6e 64 6c 65 73 0a 20 20 20 20 2a 2a  k handles.    **
2dd70 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 6e   the following n
2dd80 61 6d 69 6e 67 20 63 6f 6e 76 65 6e 74 69 6f 6e  aming convention
2dd90 73 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  s:.    **.    **
2dda0 20 20 20 22 3c 70 61 74 68 20 74 6f 20 64 62 3e     "<path to db>
2ddb0 2d 6a 6f 75 72 6e 61 6c 22 0a 20 20 20 20 2a 2a  -journal".    **
2ddc0 20 20 20 22 3c 70 61 74 68 20 74 6f 20 64 62 3e     "<path to db>
2ddd0 2d 77 61 6c 22 0a 20 20 20 20 2a 2a 20 20 20 22  -wal".    **   "
2dde0 3c 70 61 74 68 20 74 6f 20 64 62 3e 2d 6a 6f 75  <path to db>-jou
2ddf0 72 6e 61 6c 4e 4e 22 0a 20 20 20 20 2a 2a 20 20  rnalNN".    **  
2de00 20 22 3c 70 61 74 68 20 74 6f 20 64 62 3e 2d 77   "<path to db>-w
2de10 61 6c 4e 4e 22 0a 20 20 20 20 2a 2a 0a 20 20 20  alNN".    **.   
2de20 20 2a 2a 20 77 68 65 72 65 20 4e 4e 20 69 73 20   ** where NN is 
2de30 61 20 34 20 64 69 67 69 74 20 64 65 63 69 6d 61  a 4 digit decima
2de40 6c 20 6e 75 6d 62 65 72 2e 20 54 68 65 20 4e 4e  l number. The NN
2de50 20 6e 61 6d 69 6e 67 20 73 63 68 65 6d 65 73 20   naming schemes 
2de60 61 72 65 20 0a 20 20 20 20 2a 2a 20 75 73 65 64  are .    ** used
2de70 20 62 79 20 74 68 65 20 74 65 73 74 5f 6d 75 6c   by the test_mul
2de80 74 69 70 6c 65 78 2e 63 20 6d 6f 64 75 6c 65 2e  tiplex.c module.
2de90 0a 20 20 20 20 2a 2f 0a 20 20 20 20 6e 44 62 20  .    */.    nDb 
2dea0 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33  = sqlite3Strlen3
2deb0 30 28 7a 50 61 74 68 29 20 2d 20 31 3b 20 0a 20  0(zPath) - 1; . 
2dec0 20 20 20 77 68 69 6c 65 28 20 6e 44 62 3e 30 20     while( nDb>0 
2ded0 26 26 20 7a 50 61 74 68 5b 6e 44 62 5d 21 3d 27  && zPath[nDb]!='
2dee0 2d 27 20 29 20 6e 44 62 2d 2d 3b 0a 20 20 20 20  -' ) nDb--;.    
2def0 69 66 28 20 6e 44 62 3d 3d 30 20 29 20 72 65 74  if( nDb==0 ) ret
2df00 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
2df10 20 20 20 6d 65 6d 63 70 79 28 7a 44 62 2c 20 7a     memcpy(zDb, z
2df20 50 61 74 68 2c 20 6e 44 62 29 3b 0a 20 20 20 20  Path, nDb);.    
2df30 7a 44 62 5b 6e 44 62 5d 20 3d 20 27 5c 30 27 3b  zDb[nDb] = '\0';
2df40 0a 0a 20 20 20 20 69 66 28 20 30 3d 3d 6f 73 53  ..    if( 0==osS
2df50 74 61 74 28 7a 44 62 2c 20 26 73 53 74 61 74 29  tat(zDb, &sStat)
2df60 20 29 7b 0a 20 20 20 20 20 20 2a 70 4d 6f 64 65   ){.      *pMode
2df70 20 3d 20 73 53 74 61 74 2e 73 74 5f 6d 6f 64 65   = sStat.st_mode
2df80 20 26 20 30 37 37 37 3b 0a 20 20 20 20 20 20 2a   & 0777;.      *
2df90 70 55 69 64 20 3d 20 73 53 74 61 74 2e 73 74 5f  pUid = sStat.st_
2dfa0 75 69 64 3b 0a 20 20 20 20 20 20 2a 70 47 69 64  uid;.      *pGid
2dfb0 20 3d 20 73 53 74 61 74 2e 73 74 5f 67 69 64 3b   = sStat.st_gid;
2dfc0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
2dfd0 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f    rc = SQLITE_IO
2dfe0 45 52 52 5f 46 53 54 41 54 3b 0a 20 20 20 20 7d  ERR_FSTAT;.    }
2dff0 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 66 6c 61  .  }else if( fla
2e000 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e  gs & SQLITE_OPEN
2e010 5f 44 45 4c 45 54 45 4f 4e 43 4c 4f 53 45 20 29  _DELETEONCLOSE )
2e020 7b 0a 20 20 20 20 2a 70 4d 6f 64 65 20 3d 20 30  {.    *pMode = 0
2e030 36 30 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  600;.  }.  retur
2e040 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f  n rc;.}../*.** O
2e050 70 65 6e 20 74 68 65 20 66 69 6c 65 20 7a 50 61  pen the file zPa
2e060 74 68 2e 0a 2a 2a 20 0a 2a 2a 20 50 72 65 76 69  th..** .** Previ
2e070 6f 75 73 6c 79 2c 20 74 68 65 20 53 51 4c 69 74  ously, the SQLit
2e080 65 20 4f 53 20 6c 61 79 65 72 20 75 73 65 64 20  e OS layer used 
2e090 74 68 72 65 65 20 66 75 6e 63 74 69 6f 6e 73 20  three functions 
2e0a0 69 6e 20 70 6c 61 63 65 20 6f 66 20 74 68 69 73  in place of this
2e0b0 0a 2a 2a 20 6f 6e 65 3a 0a 2a 2a 0a 2a 2a 20 20  .** one:.**.**  
2e0c0 20 20 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e     sqlite3OsOpen
2e0d0 52 65 61 64 57 72 69 74 65 28 29 3b 0a 2a 2a 20  ReadWrite();.** 
2e0e0 20 20 20 20 73 71 6c 69 74 65 33 4f 73 4f 70 65      sqlite3OsOpe
2e0f0 6e 52 65 61 64 4f 6e 6c 79 28 29 3b 0a 2a 2a 20  nReadOnly();.** 
2e100 20 20 20 20 73 71 6c 69 74 65 33 4f 73 4f 70 65      sqlite3OsOpe
2e110 6e 45 78 63 6c 75 73 69 76 65 28 29 3b 0a 2a 2a  nExclusive();.**
2e120 0a 2a 2a 20 54 68 65 73 65 20 63 61 6c 6c 73 20  .** These calls 
2e130 63 6f 72 72 65 73 70 6f 6e 64 20 74 6f 20 74 68  correspond to th
2e140 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 6f 6d 62  e following comb
2e150 69 6e 61 74 69 6f 6e 73 20 6f 66 20 66 6c 61 67  inations of flag
2e160 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 52 65 61  s:.**.**     Rea
2e170 64 57 72 69 74 65 28 29 20 2d 3e 20 20 20 20 20  dWrite() ->     
2e180 28 52 45 41 44 57 52 49 54 45 20 7c 20 43 52 45  (READWRITE | CRE
2e190 41 54 45 29 0a 2a 2a 20 20 20 20 20 52 65 61 64  ATE).**     Read
2e1a0 4f 6e 6c 79 28 29 20 20 2d 3e 20 20 20 20 20 28  Only()  ->     (
2e1b0 52 45 41 44 4f 4e 4c 59 29 20 0a 2a 2a 20 20 20  READONLY) .**   
2e1c0 20 20 4f 70 65 6e 45 78 63 6c 75 73 69 76 65 28    OpenExclusive(
2e1d0 29 20 2d 3e 20 28 52 45 41 44 57 52 49 54 45 20  ) -> (READWRITE 
2e1e0 7c 20 43 52 45 41 54 45 20 7c 20 45 58 43 4c 55  | CREATE | EXCLU
2e1f0 53 49 56 45 29 0a 2a 2a 0a 2a 2a 20 54 68 65 20  SIVE).**.** The 
2e200 6f 6c 64 20 4f 70 65 6e 45 78 63 6c 75 73 69 76  old OpenExclusiv
2e210 65 28 29 20 61 63 63 65 70 74 65 64 20 61 20 62  e() accepted a b
2e220 6f 6f 6c 65 61 6e 20 61 72 67 75 6d 65 6e 74 20  oolean argument 
2e230 2d 20 22 64 65 6c 46 6c 61 67 22 2e 20 49 66 0a  - "delFlag". If.
2e240 2a 2a 20 74 72 75 65 2c 20 74 68 65 20 66 69 6c  ** true, the fil
2e250 65 20 77 61 73 20 63 6f 6e 66 69 67 75 72 65 64  e was configured
2e260 20 74 6f 20 62 65 20 61 75 74 6f 6d 61 74 69 63   to be automatic
2e270 61 6c 6c 79 20 64 65 6c 65 74 65 64 20 77 68 65  ally deleted whe
2e280 6e 20 74 68 65 0a 2a 2a 20 66 69 6c 65 20 68 61  n the.** file ha
2e290 6e 64 6c 65 20 63 6c 6f 73 65 64 2e 20 54 6f 20  ndle closed. To 
2e2a0 61 63 68 69 65 76 65 20 74 68 65 20 73 61 6d 65  achieve the same
2e2b0 20 65 66 66 65 63 74 20 75 73 69 6e 67 20 74 68   effect using th
2e2c0 69 73 20 6e 65 77 20 0a 2a 2a 20 69 6e 74 65 72  is new .** inter
2e2d0 66 61 63 65 2c 20 61 64 64 20 74 68 65 20 44 45  face, add the DE
2e2e0 4c 45 54 45 4f 4e 43 4c 4f 53 45 20 66 6c 61 67  LETEONCLOSE flag
2e2f0 20 74 6f 20 74 68 6f 73 65 20 73 70 65 63 69 66   to those specif
2e300 69 65 64 20 61 62 6f 76 65 20 66 6f 72 20 0a 2a  ied above for .*
2e310 2a 20 4f 70 65 6e 45 78 63 6c 75 73 69 76 65 28  * OpenExclusive(
2e320 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  )..*/.static int
2e330 20 75 6e 69 78 4f 70 65 6e 28 0a 20 20 73 71 6c   unixOpen(.  sql
2e340 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20  ite3_vfs *pVfs, 
2e350 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
2e360 20 56 46 53 20 66 6f 72 20 77 68 69 63 68 20 74   VFS for which t
2e370 68 69 73 20 69 73 20 74 68 65 20 78 4f 70 65 6e  his is the xOpen
2e380 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 63 6f 6e   method */.  con
2e390 73 74 20 63 68 61 72 20 2a 7a 50 61 74 68 2c 20  st char *zPath, 
2e3a0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 74            /* Pat
2e3b0 68 6e 61 6d 65 20 6f 66 20 66 69 6c 65 20 74 6f  hname of file to
2e3c0 20 62 65 20 6f 70 65 6e 65 64 20 2a 2f 0a 20 20   be opened */.  
2e3d0 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 46  sqlite3_file *pF
2e3e0 69 6c 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20  ile,         /* 
2e3f0 54 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70  The file descrip
2e400 74 6f 72 20 74 6f 20 62 65 20 66 69 6c 6c 65 64  tor to be filled
2e410 20 69 6e 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61   in */.  int fla
2e420 67 73 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  gs,             
2e430 20 20 20 20 20 20 2f 2a 20 49 6e 70 75 74 20 66        /* Input f
2e440 6c 61 67 73 20 74 6f 20 63 6f 6e 74 72 6f 6c 20  lags to control 
2e450 74 68 65 20 6f 70 65 6e 69 6e 67 20 2a 2f 0a 20  the opening */. 
2e460 20 69 6e 74 20 2a 70 4f 75 74 46 6c 61 67 73 20   int *pOutFlags 
2e470 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2e480 20 4f 75 74 70 75 74 20 66 6c 61 67 73 20 72 65   Output flags re
2e490 74 75 72 6e 65 64 20 74 6f 20 53 51 4c 69 74 65  turned to SQLite
2e4a0 20 63 6f 72 65 20 2a 2f 0a 29 7b 0a 20 20 75 6e   core */.){.  un
2e4b0 69 78 46 69 6c 65 20 2a 70 20 3d 20 28 75 6e 69  ixFile *p = (uni
2e4c0 78 46 69 6c 65 20 2a 29 70 46 69 6c 65 3b 0a 20  xFile *)pFile;. 
2e4d0 20 69 6e 74 20 66 64 20 3d 20 2d 31 3b 20 20 20   int fd = -1;   
2e4e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e4f0 2f 2a 20 46 69 6c 65 20 64 65 73 63 72 69 70 74  /* File descript
2e500 6f 72 20 72 65 74 75 72 6e 65 64 20 62 79 20 6f  or returned by o
2e510 70 65 6e 28 29 20 2a 2f 0a 20 20 69 6e 74 20 6f  pen() */.  int o
2e520 70 65 6e 46 6c 61 67 73 20 3d 20 30 3b 20 20 20  penFlags = 0;   
2e530 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6c 61            /* Fla
2e540 67 73 20 74 6f 20 70 61 73 73 20 74 6f 20 6f 70  gs to pass to op
2e550 65 6e 28 29 20 2a 2f 0a 23 69 66 20 53 51 4c 49  en() */.#if SQLI
2e560 54 45 5f 45 4e 41 42 4c 45 5f 44 41 54 41 5f 50  TE_ENABLE_DATA_P
2e570 52 4f 54 45 43 54 49 4f 4e 0a 20 20 69 6e 74 20  ROTECTION.  int 
2e580 65 54 79 70 65 20 3d 20 66 6c 61 67 73 26 30 78  eType = flags&0x
2e590 46 46 30 46 46 46 30 30 3b 20 20 2f 2a 20 54 79  FF0FFF00;  /* Ty
2e5a0 70 65 20 6f 66 20 66 69 6c 65 20 74 6f 20 6f 70  pe of file to op
2e5b0 65 6e 20 2a 2f 0a 23 65 6c 73 65 0a 20 20 69 6e  en */.#else.  in
2e5c0 74 20 65 54 79 70 65 20 3d 20 66 6c 61 67 73 26  t eType = flags&
2e5d0 30 78 46 46 46 46 46 46 30 30 3b 20 20 2f 2a 20  0xFFFFFF00;  /* 
2e5e0 54 79 70 65 20 6f 66 20 66 69 6c 65 20 74 6f 20  Type of file to 
2e5f0 6f 70 65 6e 20 2a 2f 0a 23 65 6e 64 69 66 0a 20  open */.#endif. 
2e600 20 69 6e 74 20 6e 6f 4c 6f 63 6b 3b 20 20 20 20   int noLock;    
2e610 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e620 2f 2a 20 54 72 75 65 20 74 6f 20 6f 6d 69 74 20  /* True to omit 
2e630 6c 6f 63 6b 69 6e 67 20 70 72 69 6d 69 74 69 76  locking primitiv
2e640 65 73 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d  es */.  int rc =
2e650 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20   SQLITE_OK;     
2e660 20 20 20 20 20 20 20 2f 2a 20 46 75 6e 63 74 69         /* Functi
2e670 6f 6e 20 52 65 74 75 72 6e 20 43 6f 64 65 20 2a  on Return Code *
2e680 2f 0a 0a 20 20 69 6e 74 20 69 73 45 78 63 6c 75  /..  int isExclu
2e690 73 69 76 65 20 20 3d 20 28 66 6c 61 67 73 20 26  sive  = (flags &
2e6a0 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 45 58 43   SQLITE_OPEN_EXC
2e6b0 4c 55 53 49 56 45 29 3b 0a 20 20 69 6e 74 20 69  LUSIVE);.  int i
2e6c0 73 44 65 6c 65 74 65 20 20 20 20 20 3d 20 28 66  sDelete     = (f
2e6d0 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50  lags & SQLITE_OP
2e6e0 45 4e 5f 44 45 4c 45 54 45 4f 4e 43 4c 4f 53 45  EN_DELETEONCLOSE
2e6f0 29 3b 0a 20 20 69 6e 74 20 69 73 43 72 65 61 74  );.  int isCreat
2e700 65 20 20 20 20 20 3d 20 28 66 6c 61 67 73 20 26  e     = (flags &
2e710 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45   SQLITE_OPEN_CRE
2e720 41 54 45 29 3b 0a 20 20 69 6e 74 20 69 73 52 65  ATE);.  int isRe
2e730 61 64 6f 6e 6c 79 20 20 20 3d 20 28 66 6c 61 67  adonly   = (flag
2e740 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  s & SQLITE_OPEN_
2e750 52 45 41 44 4f 4e 4c 59 29 3b 0a 20 20 69 6e 74  READONLY);.  int
2e760 20 69 73 52 65 61 64 57 72 69 74 65 20 20 3d 20   isReadWrite  = 
2e770 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  (flags & SQLITE_
2e780 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45 29 3b  OPEN_READWRITE);
2e790 0a 23 69 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  .#if SQLITE_ENAB
2e7a0 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45  LE_LOCKING_STYLE
2e7b0 0a 20 20 69 6e 74 20 69 73 41 75 74 6f 50 72 6f  .  int isAutoPro
2e7c0 78 79 20 20 3d 20 28 66 6c 61 67 73 20 26 20 53  xy  = (flags & S
2e7d0 51 4c 49 54 45 5f 4f 50 45 4e 5f 41 55 54 4f 50  QLITE_OPEN_AUTOP
2e7e0 52 4f 58 59 29 3b 0a 23 65 6e 64 69 66 0a 0a 20  ROXY);.#endif.. 
2e7f0 20 2f 2a 20 49 66 20 63 72 65 61 74 69 6e 67 20   /* If creating 
2e800 61 20 6d 61 73 74 65 72 20 6f 72 20 6d 61 69 6e  a master or main
2e810 2d 66 69 6c 65 20 6a 6f 75 72 6e 61 6c 2c 20 74  -file journal, t
2e820 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 77 69 6c  his function wil
2e830 6c 20 6f 70 65 6e 0a 20 20 2a 2a 20 61 20 66 69  l open.  ** a fi
2e840 6c 65 2d 64 65 73 63 72 69 70 74 6f 72 20 6f 6e  le-descriptor on
2e850 20 74 68 65 20 64 69 72 65 63 74 6f 72 79 20 74   the directory t
2e860 6f 6f 2e 20 54 68 65 20 66 69 72 73 74 20 74 69  oo. The first ti
2e870 6d 65 20 75 6e 69 78 53 79 6e 63 28 29 0a 20 20  me unixSync().  
2e880 2a 2a 20 69 73 20 63 61 6c 6c 65 64 20 74 68 65  ** is called the
2e890 20 64 69 72 65 63 74 6f 72 79 20 66 69 6c 65 20   directory file 
2e8a0 64 65 73 63 72 69 70 74 6f 72 20 77 69 6c 6c 20  descriptor will 
2e8b0 62 65 20 66 73 79 6e 63 28 29 65 64 20 61 6e 64  be fsync()ed and
2e8c0 20 63 6c 6f 73 65 28 29 64 2e 0a 20 20 2a 2f 0a   close()d..  */.
2e8d0 20 20 69 6e 74 20 73 79 6e 63 44 69 72 20 3d 20    int syncDir = 
2e8e0 28 69 73 43 72 65 61 74 65 20 26 26 20 28 0a 20  (isCreate && (. 
2e8f0 20 20 20 20 20 20 20 65 54 79 70 65 3d 3d 53 51         eType==SQ
2e900 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 53 54 45 52  LITE_OPEN_MASTER
2e910 5f 4a 4f 55 52 4e 41 4c 20 0a 20 20 20 20 20 7c  _JOURNAL .     |
2e920 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f  | eType==SQLITE_
2e930 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41  OPEN_MAIN_JOURNA
2e940 4c 20 0a 20 20 20 20 20 7c 7c 20 65 54 79 70 65  L .     || eType
2e950 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 57 41  ==SQLITE_OPEN_WA
2e960 4c 0a 20 20 29 29 3b 0a 0a 20 20 2f 2a 20 49 66  L.  ));..  /* If
2e970 20 61 72 67 75 6d 65 6e 74 20 7a 50 61 74 68 20   argument zPath 
2e980 69 73 20 61 20 4e 55 4c 4c 20 70 6f 69 6e 74 65  is a NULL pointe
2e990 72 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  r, this function
2e9a0 20 69 73 20 72 65 71 75 69 72 65 64 20 74 6f 20   is required to 
2e9b0 6f 70 65 6e 0a 20 20 2a 2a 20 61 20 74 65 6d 70  open.  ** a temp
2e9c0 6f 72 61 72 79 20 66 69 6c 65 2e 20 55 73 65 20  orary file. Use 
2e9d0 74 68 69 73 20 62 75 66 66 65 72 20 74 6f 20 73  this buffer to s
2e9e0 74 6f 72 65 20 74 68 65 20 66 69 6c 65 20 6e 61  tore the file na
2e9f0 6d 65 20 69 6e 2e 0a 20 20 2a 2f 0a 20 20 63 68  me in..  */.  ch
2ea00 61 72 20 7a 54 6d 70 6e 61 6d 65 5b 4d 41 58 5f  ar zTmpname[MAX_
2ea10 50 41 54 48 4e 41 4d 45 2b 31 5d 3b 0a 20 20 63  PATHNAME+1];.  c
2ea20 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65  onst char *zName
2ea30 20 3d 20 7a 50 61 74 68 3b 0a 0a 20 20 2f 2a 20   = zPath;..  /* 
2ea40 43 68 65 63 6b 20 74 68 65 20 66 6f 6c 6c 6f 77  Check the follow
2ea50 69 6e 67 20 73 74 61 74 65 6d 65 6e 74 73 20 61  ing statements a
2ea60 72 65 20 74 72 75 65 3a 20 0a 20 20 2a 2a 0a 20  re true: .  **. 
2ea70 20 2a 2a 20 20 20 28 61 29 20 45 78 61 63 74 6c   **   (a) Exactl
2ea80 79 20 6f 6e 65 20 6f 66 20 74 68 65 20 52 45 41  y one of the REA
2ea90 44 57 52 49 54 45 20 61 6e 64 20 52 45 41 44 4f  DWRITE and READO
2eaa0 4e 4c 59 20 66 6c 61 67 73 20 6d 75 73 74 20 62  NLY flags must b
2eab0 65 20 73 65 74 2c 20 61 6e 64 20 0a 20 20 2a 2a  e set, and .  **
2eac0 20 20 20 28 62 29 20 69 66 20 43 52 45 41 54 45     (b) if CREATE
2ead0 20 69 73 20 73 65 74 2c 20 74 68 65 6e 20 52 45   is set, then RE
2eae0 41 44 57 52 49 54 45 20 6d 75 73 74 20 61 6c 73  ADWRITE must als
2eaf0 6f 20 62 65 20 73 65 74 2c 20 61 6e 64 0a 20 20  o be set, and.  
2eb00 2a 2a 20 20 20 28 63 29 20 69 66 20 45 58 43 4c  **   (c) if EXCL
2eb10 55 53 49 56 45 20 69 73 20 73 65 74 2c 20 74 68  USIVE is set, th
2eb20 65 6e 20 43 52 45 41 54 45 20 6d 75 73 74 20 61  en CREATE must a
2eb30 6c 73 6f 20 62 65 20 73 65 74 2e 0a 20 20 2a 2a  lso be set..  **
2eb40 20 20 20 28 64 29 20 69 66 20 44 45 4c 45 54 45     (d) if DELETE
2eb50 4f 4e 43 4c 4f 53 45 20 69 73 20 73 65 74 2c 20  ONCLOSE is set, 
2eb60 74 68 65 6e 20 43 52 45 41 54 45 20 6d 75 73 74  then CREATE must
2eb70 20 61 6c 73 6f 20 62 65 20 73 65 74 2e 0a 20 20   also be set..  
2eb80 2a 2f 0a 20 20 61 73 73 65 72 74 28 28 69 73 52  */.  assert((isR
2eb90 65 61 64 6f 6e 6c 79 3d 3d 30 20 7c 7c 20 69 73  eadonly==0 || is
2eba0 52 65 61 64 57 72 69 74 65 3d 3d 30 29 20 26 26  ReadWrite==0) &&
2ebb0 20 28 69 73 52 65 61 64 57 72 69 74 65 20 7c 7c   (isReadWrite ||
2ebc0 20 69 73 52 65 61 64 6f 6e 6c 79 29 29 3b 0a 20   isReadonly));. 
2ebd0 20 61 73 73 65 72 74 28 69 73 43 72 65 61 74 65   assert(isCreate
2ebe0 3d 3d 30 20 7c 7c 20 69 73 52 65 61 64 57 72 69  ==0 || isReadWri
2ebf0 74 65 29 3b 0a 20 20 61 73 73 65 72 74 28 69 73  te);.  assert(is
2ec00 45 78 63 6c 75 73 69 76 65 3d 3d 30 20 7c 7c 20  Exclusive==0 || 
2ec10 69 73 43 72 65 61 74 65 29 3b 0a 20 20 61 73 73  isCreate);.  ass
2ec20 65 72 74 28 69 73 44 65 6c 65 74 65 3d 3d 30 20  ert(isDelete==0 
2ec30 7c 7c 20 69 73 43 72 65 61 74 65 29 3b 0a 0a 20  || isCreate);.. 
2ec40 20 2f 2a 20 54 68 65 20 6d 61 69 6e 20 44 42 2c   /* The main DB,
2ec50 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 2c 20 57   main journal, W
2ec60 41 4c 20 66 69 6c 65 20 61 6e 64 20 6d 61 73 74  AL file and mast
2ec70 65 72 20 6a 6f 75 72 6e 61 6c 20 61 72 65 20 6e  er journal are n
2ec80 65 76 65 72 20 0a 20 20 2a 2a 20 61 75 74 6f 6d  ever .  ** autom
2ec90 61 74 69 63 61 6c 6c 79 20 64 65 6c 65 74 65 64  atically deleted
2eca0 2e 20 4e 6f 72 20 61 72 65 20 74 68 65 79 20 65  . Nor are they e
2ecb0 76 65 72 20 74 65 6d 70 6f 72 61 72 79 20 66 69  ver temporary fi
2ecc0 6c 65 73 2e 20 20 2a 2f 0a 20 20 61 73 73 65 72  les.  */.  asser
2ecd0 74 28 20 28 21 69 73 44 65 6c 65 74 65 20 26 26  t( (!isDelete &&
2ece0 20 7a 4e 61 6d 65 29 20 7c 7c 20 65 54 79 70 65   zName) || eType
2ecf0 21 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41  !=SQLITE_OPEN_MA
2ed00 49 4e 5f 44 42 20 29 3b 0a 20 20 61 73 73 65 72  IN_DB );.  asser
2ed10 74 28 20 28 21 69 73 44 65 6c 65 74 65 20 26 26  t( (!isDelete &&
2ed20 20 7a 4e 61 6d 65 29 20 7c 7c 20 65 54 79 70 65   zName) || eType
2ed30 21 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41  !=SQLITE_OPEN_MA
2ed40 49 4e 5f 4a 4f 55 52 4e 41 4c 20 29 3b 0a 20 20  IN_JOURNAL );.  
2ed50 61 73 73 65 72 74 28 20 28 21 69 73 44 65 6c 65  assert( (!isDele
2ed60 74 65 20 26 26 20 7a 4e 61 6d 65 29 20 7c 7c 20  te && zName) || 
2ed70 65 54 79 70 65 21 3d 53 51 4c 49 54 45 5f 4f 50  eType!=SQLITE_OP
2ed80 45 4e 5f 4d 41 53 54 45 52 5f 4a 4f 55 52 4e 41  EN_MASTER_JOURNA
2ed90 4c 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28  L );.  assert( (
2eda0 21 69 73 44 65 6c 65 74 65 20 26 26 20 7a 4e 61  !isDelete && zNa
2edb0 6d 65 29 20 7c 7c 20 65 54 79 70 65 21 3d 53 51  me) || eType!=SQ
2edc0 4c 49 54 45 5f 4f 50 45 4e 5f 57 41 4c 20 29 3b  LITE_OPEN_WAL );
2edd0 0a 0a 20 20 2f 2a 20 41 73 73 65 72 74 20 74 68  ..  /* Assert th
2ede0 61 74 20 74 68 65 20 75 70 70 65 72 20 6c 61 79  at the upper lay
2edf0 65 72 20 68 61 73 20 73 65 74 20 6f 6e 65 20 6f  er has set one o
2ee00 66 20 74 68 65 20 22 66 69 6c 65 2d 74 79 70 65  f the "file-type
2ee10 22 20 66 6c 61 67 73 2e 20 2a 2f 0a 20 20 61 73  " flags. */.  as
2ee20 73 65 72 74 28 20 65 54 79 70 65 3d 3d 53 51 4c  sert( eType==SQL
2ee30 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42  ITE_OPEN_MAIN_DB
2ee40 20 20 20 20 20 20 7c 7c 20 65 54 79 70 65 3d 3d        || eType==
2ee50 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 45 4d 50  SQLITE_OPEN_TEMP
2ee60 5f 44 42 20 0a 20 20 20 20 20 20 20 7c 7c 20 65  _DB .       || e
2ee70 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45  Type==SQLITE_OPE
2ee80 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 20 7c  N_MAIN_JOURNAL |
2ee90 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f  | eType==SQLITE_
2eea0 4f 50 45 4e 5f 54 45 4d 50 5f 4a 4f 55 52 4e 41  OPEN_TEMP_JOURNA
2eeb0 4c 20 0a 20 20 20 20 20 20 20 7c 7c 20 65 54 79  L .       || eTy
2eec0 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  pe==SQLITE_OPEN_
2eed0 53 55 42 4a 4f 55 52 4e 41 4c 20 20 20 7c 7c 20  SUBJOURNAL   || 
2eee0 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50  eType==SQLITE_OP
2eef0 45 4e 5f 4d 41 53 54 45 52 5f 4a 4f 55 52 4e 41  EN_MASTER_JOURNA
2ef00 4c 20 0a 20 20 20 20 20 20 20 7c 7c 20 65 54 79  L .       || eTy
2ef10 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  pe==SQLITE_OPEN_
2ef20 54 52 41 4e 53 49 45 4e 54 5f 44 42 20 7c 7c 20  TRANSIENT_DB || 
2ef30 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50  eType==SQLITE_OP
2ef40 45 4e 5f 57 41 4c 0a 20 20 29 3b 0a 0a 20 20 6d  EN_WAL.  );..  m
2ef50 65 6d 73 65 74 28 70 2c 20 30 2c 20 73 69 7a 65  emset(p, 0, size
2ef60 6f 66 28 75 6e 69 78 46 69 6c 65 29 29 3b 0a 0a  of(unixFile));..
2ef70 20 20 69 66 28 20 65 54 79 70 65 3d 3d 53 51 4c    if( eType==SQL
2ef80 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42  ITE_OPEN_MAIN_DB
2ef90 20 29 7b 0a 20 20 20 20 55 6e 69 78 55 6e 75 73   ){.    UnixUnus
2efa0 65 64 46 64 20 2a 70 55 6e 75 73 65 64 3b 0a 20  edFd *pUnused;. 
2efb0 20 20 20 70 55 6e 75 73 65 64 20 3d 20 66 69 6e     pUnused = fin
2efc0 64 52 65 75 73 61 62 6c 65 46 64 28 7a 4e 61 6d  dReusableFd(zNam
2efd0 65 2c 20 66 6c 61 67 73 29 3b 0a 20 20 20 20 69  e, flags);.    i
2efe0 66 28 20 70 55 6e 75 73 65 64 20 29 7b 0a 20 20  f( pUnused ){.  
2eff0 20 20 20 20 66 64 20 3d 20 70 55 6e 75 73 65 64      fd = pUnused
2f000 2d 3e 66 64 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  ->fd;.    }else{
2f010 0a 20 20 20 20 20 20 70 55 6e 75 73 65 64 20 3d  .      pUnused =
2f020 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28   sqlite3_malloc(
2f030 73 69 7a 65 6f 66 28 2a 70 55 6e 75 73 65 64 29  sizeof(*pUnused)
2f040 29 3b 0a 20 20 20 20 20 20 69 66 28 20 21 70 55  );.      if( !pU
2f050 6e 75 73 65 64 20 29 7b 0a 20 20 20 20 20 20 20  nused ){.       
2f060 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
2f070 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 7d 0a 20 20  OMEM;.      }.  
2f080 20 20 7d 0a 20 20 20 20 70 2d 3e 70 55 6e 75 73    }.    p->pUnus
2f090 65 64 20 3d 20 70 55 6e 75 73 65 64 3b 0a 20 20  ed = pUnused;.  
2f0a0 7d 65 6c 73 65 20 69 66 28 20 21 7a 4e 61 6d 65  }else if( !zName
2f0b0 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 7a 4e   ){.    /* If zN
2f0c0 61 6d 65 20 69 73 20 4e 55 4c 4c 2c 20 74 68 65  ame is NULL, the
2f0d0 20 75 70 70 65 72 20 6c 61 79 65 72 20 69 73 20   upper layer is 
2f0e0 72 65 71 75 65 73 74 69 6e 67 20 61 20 74 65 6d  requesting a tem
2f0f0 70 20 66 69 6c 65 2e 20 2a 2f 0a 20 20 20 20 61  p file. */.    a
2f100 73 73 65 72 74 28 69 73 44 65 6c 65 74 65 20 26  ssert(isDelete &
2f110 26 20 21 73 79 6e 63 44 69 72 29 3b 0a 20 20 20  & !syncDir);.   
2f120 20 72 63 20 3d 20 75 6e 69 78 47 65 74 54 65 6d   rc = unixGetTem
2f130 70 6e 61 6d 65 28 4d 41 58 5f 50 41 54 48 4e 41  pname(MAX_PATHNA
2f140 4d 45 2b 31 2c 20 7a 54 6d 70 6e 61 6d 65 29 3b  ME+1, zTmpname);
2f150 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
2f160 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
2f170 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
2f180 0a 20 20 20 20 7a 4e 61 6d 65 20 3d 20 7a 54 6d  .    zName = zTm
2f190 70 6e 61 6d 65 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  pname;.  }..  /*
2f1a0 20 44 65 74 65 72 6d 69 6e 65 20 74 68 65 20 76   Determine the v
2f1b0 61 6c 75 65 20 6f 66 20 74 68 65 20 66 6c 61 67  alue of the flag
2f1c0 73 20 70 61 72 61 6d 65 74 65 72 20 70 61 73 73  s parameter pass
2f1d0 65 64 20 74 6f 20 50 4f 53 49 58 20 66 75 6e 63  ed to POSIX func
2f1e0 74 69 6f 6e 0a 20 20 2a 2a 20 6f 70 65 6e 28 29  tion.  ** open()
2f1f0 2e 20 54 68 65 73 65 20 6d 75 73 74 20 62 65 20  . These must be 
2f200 63 61 6c 63 75 6c 61 74 65 64 20 65 76 65 6e 20  calculated even 
2f210 69 66 20 6f 70 65 6e 28 29 20 69 73 20 6e 6f 74  if open() is not
2f220 20 63 61 6c 6c 65 64 2c 20 61 73 0a 20 20 2a 2a   called, as.  **
2f230 20 74 68 65 79 20 6d 61 79 20 62 65 20 73 74 6f   they may be sto
2f240 72 65 64 20 61 73 20 70 61 72 74 20 6f 66 20 74  red as part of t
2f250 68 65 20 66 69 6c 65 20 68 61 6e 64 6c 65 20 61  he file handle a
2f260 6e 64 20 75 73 65 64 20 62 79 20 74 68 65 20 0a  nd used by the .
2f270 20 20 2a 2a 20 27 63 6f 6e 63 68 20 66 69 6c 65    ** 'conch file
2f280 27 20 6c 6f 63 6b 69 6e 67 20 66 75 6e 63 74 69  ' locking functi
2f290 6f 6e 73 20 6c 61 74 65 72 20 6f 6e 2e 20 20 2a  ons later on.  *
2f2a0 2f 0a 20 20 69 66 28 20 69 73 52 65 61 64 6f 6e  /.  if( isReadon
2f2b0 6c 79 20 29 20 20 6f 70 65 6e 46 6c 61 67 73 20  ly )  openFlags 
2f2c0 7c 3d 20 4f 5f 52 44 4f 4e 4c 59 3b 0a 20 20 69  |= O_RDONLY;.  i
2f2d0 66 28 20 69 73 52 65 61 64 57 72 69 74 65 20 29  f( isReadWrite )
2f2e0 20 6f 70 65 6e 46 6c 61 67 73 20 7c 3d 20 4f 5f   openFlags |= O_
2f2f0 52 44 57 52 3b 0a 20 20 69 66 28 20 69 73 43 72  RDWR;.  if( isCr
2f300 65 61 74 65 20 29 20 20 20 20 6f 70 65 6e 46 6c  eate )    openFl
2f310 61 67 73 20 7c 3d 20 4f 5f 43 52 45 41 54 3b 0a  ags |= O_CREAT;.
2f320 20 20 69 66 28 20 69 73 45 78 63 6c 75 73 69 76    if( isExclusiv
2f330 65 20 29 20 6f 70 65 6e 46 6c 61 67 73 20 7c 3d  e ) openFlags |=
2f340 20 28 4f 5f 45 58 43 4c 7c 4f 5f 4e 4f 46 4f 4c   (O_EXCL|O_NOFOL
2f350 4c 4f 57 29 3b 0a 20 20 6f 70 65 6e 46 6c 61 67  LOW);.  openFlag
2f360 73 20 7c 3d 20 28 4f 5f 4c 41 52 47 45 46 49 4c  s |= (O_LARGEFIL
2f370 45 7c 4f 5f 42 49 4e 41 52 59 29 3b 0a 0a 23 69  E|O_BINARY);..#i
2f380 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
2f390 44 41 54 41 5f 50 52 4f 54 45 43 54 49 4f 4e 0a  DATA_PROTECTION.
2f3a0 20 20 70 2d 3e 70 72 6f 74 46 6c 61 67 73 20 3d    p->protFlags =
2f3b0 20 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45   (flags & SQLITE
2f3c0 5f 4f 50 45 4e 5f 46 49 4c 45 50 52 4f 54 45 43  _OPEN_FILEPROTEC
2f3d0 54 49 4f 4e 5f 4d 41 53 4b 29 3b 0a 23 65 6e 64  TION_MASK);.#end
2f3e0 69 66 0a 20 20 20 20 0a 20 20 69 66 28 20 66 64  if.    .  if( fd
2f3f0 3c 30 20 29 7b 0a 20 20 20 20 6d 6f 64 65 5f 74  <0 ){.    mode_t
2f400 20 6f 70 65 6e 4d 6f 64 65 3b 20 20 20 20 20 20   openMode;      
2f410 20 20 20 20 20 20 20 20 2f 2a 20 50 65 72 6d 69          /* Permi
2f420 73 73 69 6f 6e 73 20 74 6f 20 63 72 65 61 74 65  ssions to create
2f430 20 66 69 6c 65 20 77 69 74 68 20 2a 2f 0a 20 20   file with */.  
2f440 20 20 75 69 64 5f 74 20 75 69 64 3b 0a 20 20 20    uid_t uid;.   
2f450 20 67 69 64 5f 74 20 67 69 64 3b 0a 20 20 20 20   gid_t gid;.    
2f460 72 63 20 3d 20 66 69 6e 64 43 72 65 61 74 65 46  rc = findCreateF
2f470 69 6c 65 4d 6f 64 65 28 7a 4e 61 6d 65 2c 20 66  ileMode(zName, f
2f480 6c 61 67 73 2c 20 26 6f 70 65 6e 4d 6f 64 65 2c  lags, &openMode,
2f490 20 26 75 69 64 2c 20 26 67 69 64 29 3b 0a 20 20   &uid, &gid);.  
2f4a0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
2f4b0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 61 73 73  _OK ){.      ass
2f4c0 65 72 74 28 20 21 70 2d 3e 70 55 6e 75 73 65 64  ert( !p->pUnused
2f4d0 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
2f4e0 28 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f  ( eType==SQLITE_
2f4f0 4f 50 45 4e 5f 57 41 4c 20 7c 7c 20 65 54 79 70  OPEN_WAL || eTyp
2f500 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d  e==SQLITE_OPEN_M
2f510 41 49 4e 5f 4a 4f 55 52 4e 41 4c 20 29 3b 0a 20  AIN_JOURNAL );. 
2f520 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
2f530 20 20 20 20 7d 0a 20 20 20 20 66 64 20 3d 20 72      }.    fd = r
2f540 6f 62 75 73 74 5f 6f 70 65 6e 28 7a 4e 61 6d 65  obust_open(zName
2f550 2c 20 6f 70 65 6e 46 6c 61 67 73 2c 20 6f 70 65  , openFlags, ope
2f560 6e 4d 6f 64 65 29 3b 0a 20 20 20 20 4f 53 54 52  nMode);.    OSTR
2f570 41 43 45 28 28 22 4f 50 45 4e 58 20 20 20 25 2d  ACE(("OPENX   %-
2f580 33 64 20 25 73 20 30 25 6f 5c 6e 22 2c 20 66 64  3d %s 0%o\n", fd
2f590 2c 20 7a 4e 61 6d 65 2c 20 6f 70 65 6e 46 6c 61  , zName, openFla
2f5a0 67 73 29 29 3b 0a 20 20 20 20 69 66 28 20 66 64  gs));.    if( fd
2f5b0 3c 30 20 26 26 20 65 72 72 6e 6f 21 3d 45 49 53  <0 && errno!=EIS
2f5c0 44 49 52 20 26 26 20 69 73 52 65 61 64 57 72 69  DIR && isReadWri
2f5d0 74 65 20 26 26 20 21 69 73 45 78 63 6c 75 73 69  te && !isExclusi
2f5e0 76 65 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 46  ve ){.      /* F
2f5f0 61 69 6c 65 64 20 74 6f 20 6f 70 65 6e 20 74 68  ailed to open th
2f600 65 20 66 69 6c 65 20 66 6f 72 20 72 65 61 64 2f  e file for read/
2f610 77 72 69 74 65 20 61 63 63 65 73 73 2e 20 54 72  write access. Tr
2f620 79 20 72 65 61 64 2d 6f 6e 6c 79 2e 20 2a 2f 0a  y read-only. */.
2f630 20 20 20 20 20 20 66 6c 61 67 73 20 26 3d 20 7e        flags &= ~
2f640 28 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41  (SQLITE_OPEN_REA
2f650 44 57 52 49 54 45 7c 53 51 4c 49 54 45 5f 4f 50  DWRITE|SQLITE_OP
2f660 45 4e 5f 43 52 45 41 54 45 29 3b 0a 20 20 20 20  EN_CREATE);.    
2f670 20 20 6f 70 65 6e 46 6c 61 67 73 20 26 3d 20 7e    openFlags &= ~
2f680 28 4f 5f 52 44 57 52 7c 4f 5f 43 52 45 41 54 29  (O_RDWR|O_CREAT)
2f690 3b 0a 20 20 20 20 20 20 66 6c 61 67 73 20 7c 3d  ;.      flags |=
2f6a0 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41   SQLITE_OPEN_REA
2f6b0 44 4f 4e 4c 59 3b 0a 20 20 20 20 20 20 6f 70 65  DONLY;.      ope
2f6c0 6e 46 6c 61 67 73 20 7c 3d 20 4f 5f 52 44 4f 4e  nFlags |= O_RDON
2f6d0 4c 59 3b 0a 20 20 20 20 20 20 69 73 52 65 61 64  LY;.      isRead
2f6e0 6f 6e 6c 79 20 3d 20 31 3b 0a 20 20 20 20 20 20  only = 1;.      
2f6f0 66 64 20 3d 20 72 6f 62 75 73 74 5f 6f 70 65 6e  fd = robust_open
2f700 28 7a 4e 61 6d 65 2c 20 6f 70 65 6e 46 6c 61 67  (zName, openFlag
2f710 73 2c 20 6f 70 65 6e 4d 6f 64 65 29 3b 0a 20 20  s, openMode);.  
2f720 20 20 7d 0a 20 20 20 20 69 66 28 20 66 64 3c 30    }.    if( fd<0
2f730 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 75   ){.      rc = u
2f740 6e 69 78 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49  nixLogError(SQLI
2f750 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 42 4b 50 54  TE_CANTOPEN_BKPT
2f760 2c 20 22 6f 70 65 6e 22 2c 20 7a 4e 61 6d 65 29  , "open", zName)
2f770 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 6f 70 65  ;.      goto ope
2f780 6e 5f 66 69 6e 69 73 68 65 64 3b 0a 20 20 20 20  n_finished;.    
2f790 7d 0a 20 20 20 20 2f 2a 20 69 66 20 77 65 27 72  }.    /* if we'r
2f7a0 65 20 6f 70 65 6e 69 6e 67 20 74 68 65 20 77 61  e opening the wa
2f7b0 6c 20 6f 72 20 6a 6f 75 72 6e 61 6c 20 61 6e 64  l or journal and
2f7c0 20 72 75 6e 6e 69 6e 67 20 61 73 20 72 6f 6f 74   running as root
2f7d0 2c 20 73 65 74 20 74 68 65 20 6a 6f 75 72 6e 61  , set the journa
2f7e0 6c 20 75 69 64 2f 67 69 64 20 2a 2f 0a 20 20 20  l uid/gid */.   
2f7f0 20 69 66 28 20 21 69 73 52 65 61 64 6f 6e 6c 79   if( !isReadonly
2f800 20 26 26 20 28 66 6c 61 67 73 20 26 20 28 53 51   && (flags & (SQ
2f810 4c 49 54 45 5f 4f 50 45 4e 5f 57 41 4c 7c 53 51  LITE_OPEN_WAL|SQ
2f820 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a  LITE_OPEN_MAIN_J
2f830 4f 55 52 4e 41 4c 29 29 20 29 7b 0a 20 20 20 20  OURNAL)) ){.    
2f840 20 20 75 69 64 5f 74 20 65 75 69 64 20 3d 20 67    uid_t euid = g
2f850 65 74 65 75 69 64 28 29 3b 0a 20 20 20 20 20 20  eteuid();.      
2f860 69 66 28 20 65 75 69 64 3d 3d 30 20 26 26 20 28  if( euid==0 && (
2f870 65 75 69 64 21 3d 75 69 64 20 7c 7c 20 67 65 74  euid!=uid || get
2f880 65 67 69 64 28 29 21 3d 67 69 64 29 20 29 7b 0a  egid()!=gid) ){.
2f890 20 20 20 20 20 20 20 20 69 66 28 20 66 63 68 6f          if( fcho
2f8a0 77 6e 28 66 64 2c 20 75 69 64 2c 20 67 69 64 29  wn(fd, uid, gid)
2f8b0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63   ){.          rc
2f8c0 20 3d 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50   = SQLITE_CANTOP
2f8d0 45 4e 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 20  EN_BKPT;.       
2f8e0 20 20 20 67 6f 74 6f 20 6f 70 65 6e 5f 66 69 6e     goto open_fin
2f8f0 69 73 68 65 64 3b 0a 20 20 20 20 20 20 20 20 7d  ished;.        }
2f900 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
2f910 20 7d 0a 20 20 61 73 73 65 72 74 28 20 66 64 3e   }.  assert( fd>
2f920 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 4f 75 74  =0 );.  if( pOut
2f930 46 6c 61 67 73 20 29 7b 0a 20 20 20 20 2a 70 4f  Flags ){.    *pO
2f940 75 74 46 6c 61 67 73 20 3d 20 66 6c 61 67 73 3b  utFlags = flags;
2f950 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 2d 3e 70  .  }..  if( p->p
2f960 55 6e 75 73 65 64 20 29 7b 0a 20 20 20 20 70 2d  Unused ){.    p-
2f970 3e 70 55 6e 75 73 65 64 2d 3e 66 64 20 3d 20 66  >pUnused->fd = f
2f980 64 3b 0a 20 20 20 20 70 2d 3e 70 55 6e 75 73 65  d;.    p->pUnuse
2f990 64 2d 3e 66 6c 61 67 73 20 3d 20 66 6c 61 67 73  d->flags = flags
2f9a0 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 69 73 44  ;.  }..  if( isD
2f9b0 65 6c 65 74 65 20 29 7b 0a 23 69 66 20 4f 53 5f  elete ){.#if OS_
2f9c0 56 58 57 4f 52 4b 53 0a 20 20 20 20 7a 50 61 74  VXWORKS.    zPat
2f9d0 68 20 3d 20 7a 4e 61 6d 65 3b 0a 23 65 6c 73 65  h = zName;.#else
2f9e0 0a 20 20 20 20 6f 73 55 6e 6c 69 6e 6b 28 7a 4e  .    osUnlink(zN
2f9f0 61 6d 65 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d  ame);.#endif.  }
2fa00 0a 23 69 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  .#if SQLITE_ENAB
2fa10 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45  LE_LOCKING_STYLE
2fa20 0a 20 20 65 6c 73 65 7b 0a 20 20 20 20 70 2d 3e  .  else{.    p->
2fa30 6f 70 65 6e 46 6c 61 67 73 20 3d 20 6f 70 65 6e  openFlags = open
2fa40 46 6c 61 67 73 3b 0a 20 20 7d 0a 23 65 6e 64 69  Flags;.  }.#endi
2fa50 66 0a 0a 23 69 66 64 65 66 20 46 44 5f 43 4c 4f  f..#ifdef FD_CLO
2fa60 45 58 45 43 0a 20 20 6f 73 46 63 6e 74 6c 28 66  EXEC.  osFcntl(f
2fa70 64 2c 20 46 5f 53 45 54 46 44 2c 20 6f 73 46 63  d, F_SETFD, osFc
2fa80 6e 74 6c 28 66 64 2c 20 46 5f 47 45 54 46 44 2c  ntl(fd, F_GETFD,
2fa90 20 30 29 20 7c 20 46 44 5f 43 4c 4f 45 58 45 43   0) | FD_CLOEXEC
2faa0 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 6e 6f 4c  );.#endif..  noL
2fab0 6f 63 6b 20 3d 20 65 54 79 70 65 21 3d 53 51 4c  ock = eType!=SQL
2fac0 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42  ITE_OPEN_MAIN_DB
2fad0 3b 0a 0a 20 20 0a 23 69 66 20 64 65 66 69 6e 65  ;..  .#if define
2fae0 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 7c 7c 20  d(__APPLE__) || 
2faf0 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f  SQLITE_ENABLE_LO
2fb00 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 20 20 73 74  CKING_STYLE.  st
2fb10 72 75 63 74 20 73 74 61 74 66 73 20 66 73 49 6e  ruct statfs fsIn
2fb20 66 6f 3b 0a 20 20 69 66 28 20 66 73 74 61 74 66  fo;.  if( fstatf
2fb30 73 28 66 64 2c 20 26 66 73 49 6e 66 6f 29 20 3d  s(fd, &fsInfo) =
2fb40 3d 20 2d 31 20 29 7b 0a 20 20 20 20 28 28 75 6e  = -1 ){.    ((un
2fb50 69 78 46 69 6c 65 2a 29 70 46 69 6c 65 29 2d 3e  ixFile*)pFile)->
2fb60 6c 61 73 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e  lastErrno = errn
2fb70 6f 3b 0a 20 20 20 20 72 6f 62 75 73 74 5f 63 6c  o;.    robust_cl
2fb80 6f 73 65 28 70 2c 20 66 64 2c 20 5f 5f 4c 49 4e  ose(p, fd, __LIN
2fb90 45 5f 5f 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  E__);.    return
2fba0 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 41 43   SQLITE_IOERR_AC
2fbb0 43 45 53 53 3b 0a 20 20 7d 0a 20 20 69 66 20 28  CESS;.  }.  if (
2fbc0 30 20 3d 3d 20 73 74 72 6e 63 6d 70 28 22 6d 73  0 == strncmp("ms
2fbd0 64 6f 73 22 2c 20 66 73 49 6e 66 6f 2e 66 5f 66  dos", fsInfo.f_f
2fbe0 73 74 79 70 65 6e 61 6d 65 2c 20 35 29 29 20 7b  stypename, 5)) {
2fbf0 0a 20 20 20 20 28 28 75 6e 69 78 46 69 6c 65 2a  .    ((unixFile*
2fc00 29 70 46 69 6c 65 29 2d 3e 66 73 46 6c 61 67 73  )pFile)->fsFlags
2fc10 20 7c 3d 20 53 51 4c 49 54 45 5f 46 53 46 4c 41   |= SQLITE_FSFLA
2fc20 47 53 5f 49 53 5f 4d 53 44 4f 53 3b 0a 20 20 7d  GS_IS_MSDOS;.  }
2fc30 0a 20 20 69 66 20 28 30 20 3d 3d 20 73 74 72 6e  .  if (0 == strn
2fc40 63 6d 70 28 22 65 78 66 61 74 22 2c 20 66 73 49  cmp("exfat", fsI
2fc50 6e 66 6f 2e 66 5f 66 73 74 79 70 65 6e 61 6d 65  nfo.f_fstypename
2fc60 2c 20 35 29 29 20 7b 0a 20 20 20 20 28 28 75 6e  , 5)) {.    ((un
2fc70 69 78 46 69 6c 65 2a 29 70 46 69 6c 65 29 2d 3e  ixFile*)pFile)->
2fc80 66 73 46 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54  fsFlags |= SQLIT
2fc90 45 5f 46 53 46 4c 41 47 53 5f 49 53 5f 4d 53 44  E_FSFLAGS_IS_MSD
2fca0 4f 53 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20  OS;.  }.#endif. 
2fcb0 20 0a 23 69 66 20 53 51 4c 49 54 45 5f 45 4e 41   .#if SQLITE_ENA
2fcc0 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c  BLE_LOCKING_STYL
2fcd0 45 0a 23 69 66 20 53 51 4c 49 54 45 5f 50 52 45  E.#if SQLITE_PRE
2fce0 46 45 52 5f 50 52 4f 58 59 5f 4c 4f 43 4b 49 4e  FER_PROXY_LOCKIN
2fcf0 47 0a 20 20 69 73 41 75 74 6f 50 72 6f 78 79 20  G.  isAutoProxy 
2fd00 3d 20 31 3b 0a 23 65 6e 64 69 66 0a 20 20 69 66  = 1;.#endif.  if
2fd10 28 20 69 73 41 75 74 6f 50 72 6f 78 79 20 26 26  ( isAutoProxy &&
2fd20 20 28 7a 50 61 74 68 21 3d 4e 55 4c 4c 29 20 26   (zPath!=NULL) &
2fd30 26 20 28 21 6e 6f 4c 6f 63 6b 29 20 26 26 20 70  & (!noLock) && p
2fd40 56 66 73 2d 3e 78 4f 70 65 6e 20 29 7b 0a 20 20  Vfs->xOpen ){.  
2fd50 20 20 63 68 61 72 20 2a 65 6e 76 66 6f 72 63 65    char *envforce
2fd60 20 3d 20 67 65 74 65 6e 76 28 22 53 51 4c 49 54   = getenv("SQLIT
2fd70 45 5f 46 4f 52 43 45 5f 50 52 4f 58 59 5f 4c 4f  E_FORCE_PROXY_LO
2fd80 43 4b 49 4e 47 22 29 3b 0a 20 20 20 20 69 6e 74  CKING");.    int
2fd90 20 75 73 65 50 72 6f 78 79 20 3d 20 30 3b 0a 0a   useProxy = 0;..
2fda0 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 46 4f      /* SQLITE_FO
2fdb0 52 43 45 5f 50 52 4f 58 59 5f 4c 4f 43 4b 49 4e  RCE_PROXY_LOCKIN
2fdc0 47 3d 3d 31 20 6d 65 61 6e 73 20 66 6f 72 63 65  G==1 means force
2fdd0 20 61 6c 77 61 79 73 20 75 73 65 20 70 72 6f 78   always use prox
2fde0 79 2c 20 30 20 6d 65 61 6e 73 20 0a 20 20 20 20  y, 0 means .    
2fdf0 2a 2a 20 6e 65 76 65 72 20 75 73 65 20 70 72 6f  ** never use pro
2fe00 78 79 2c 20 4e 55 4c 4c 20 6d 65 61 6e 73 20 75  xy, NULL means u
2fe10 73 65 20 70 72 6f 78 79 20 66 6f 72 20 6e 6f 6e  se proxy for non
2fe20 2d 6c 6f 63 61 6c 20 66 69 6c 65 73 20 6f 6e 6c  -local files onl
2fe30 79 2e 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 65  y.  */.    if( e
2fe40 6e 76 66 6f 72 63 65 21 3d 4e 55 4c 4c 20 29 7b  nvforce!=NULL ){
2fe50 0a 20 20 20 20 20 20 75 73 65 50 72 6f 78 79 20  .      useProxy 
2fe60 3d 20 61 74 6f 69 28 65 6e 76 66 6f 72 63 65 29  = atoi(envforce)
2fe70 3e 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  >0;.    }else{. 
2fe80 20 20 20 20 20 73 74 72 75 63 74 20 73 74 61 74       struct stat
2fe90 66 73 20 66 73 49 6e 66 6f 3b 0a 20 20 20 20 20  fs fsInfo;.     
2fea0 20 69 66 28 20 73 74 61 74 66 73 28 7a 50 61 74   if( statfs(zPat
2feb0 68 2c 20 26 66 73 49 6e 66 6f 29 20 3d 3d 20 2d  h, &fsInfo) == -
2fec0 31 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  1 ){.        /* 
2fed0 49 6e 20 74 68 65 6f 72 79 2c 20 74 68 65 20 63  In theory, the c
2fee0 6c 6f 73 65 28 66 64 29 20 63 61 6c 6c 20 69 73  lose(fd) call is
2fef0 20 73 75 62 2d 6f 70 74 69 6d 61 6c 2e 20 49 66   sub-optimal. If
2ff00 20 74 68 65 20 66 69 6c 65 20 6f 70 65 6e 65 64   the file opened
2ff10 0a 20 20 20 20 20 20 20 20 2a 2a 20 77 69 74 68  .        ** with
2ff20 20 66 64 20 69 73 20 61 20 64 61 74 61 62 61 73   fd is a databas
2ff30 65 20 66 69 6c 65 2c 20 61 6e 64 20 74 68 65 72  e file, and ther
2ff40 65 20 61 72 65 20 6f 74 68 65 72 20 63 6f 6e 6e  e are other conn
2ff50 65 63 74 69 6f 6e 73 20 6f 70 65 6e 0a 20 20 20  ections open.   
2ff60 20 20 20 20 20 2a 2a 20 6f 6e 20 74 68 61 74 20       ** on that 
2ff70 66 69 6c 65 20 74 68 61 74 20 61 72 65 20 63 75  file that are cu
2ff80 72 72 65 6e 74 6c 79 20 68 6f 6c 64 69 6e 67 20  rrently holding 
2ff90 61 64 76 69 73 6f 72 79 20 6c 6f 63 6b 73 20 6f  advisory locks o
2ffa0 6e 20 69 74 2c 0a 20 20 20 20 20 20 20 20 2a 2a  n it,.        **
2ffb0 20 74 68 65 6e 20 74 68 65 20 63 61 6c 6c 20 74   then the call t
2ffc0 6f 20 63 6c 6f 73 65 28 29 20 77 69 6c 6c 20 63  o close() will c
2ffd0 61 6e 63 65 6c 20 74 68 6f 73 65 20 6c 6f 63 6b  ancel those lock
2ffe0 73 2e 20 49 6e 20 70 72 61 63 74 69 63 65 2c 0a  s. In practice,.
2fff0 20 20 20 20 20 20 20 20 2a 2a 20 77 65 27 72 65          ** we're
30000 20 61 73 73 75 6d 69 6e 67 20 74 68 61 74 20 73   assuming that s
30010 74 61 74 66 73 28 29 20 64 6f 65 73 6e 27 74 20  tatfs() doesn't 
30020 66 61 69 6c 20 76 65 72 79 20 6f 66 74 65 6e 2e  fail very often.
30030 20 41 74 20 6c 65 61 73 74 0a 20 20 20 20 20 20   At least.      
30040 20 20 2a 2a 20 6e 6f 74 20 77 68 69 6c 65 20 6f    ** not while o
30050 74 68 65 72 20 66 69 6c 65 20 64 65 73 63 72 69  ther file descri
30060 70 74 6f 72 73 20 6f 70 65 6e 65 64 20 62 79 20  ptors opened by 
30070 74 68 65 20 73 61 6d 65 20 70 72 6f 63 65 73 73  the same process
30080 20 6f 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 74   on.        ** t
30090 68 65 20 73 61 6d 65 20 66 69 6c 65 20 61 72 65  he same file are
300a0 20 77 6f 72 6b 69 6e 67 2e 20 20 2a 2f 0a 20 20   working.  */.  
300b0 20 20 20 20 20 20 70 2d 3e 6c 61 73 74 45 72 72        p->lastErr
300c0 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20  no = errno;.    
300d0 20 20 20 20 72 6f 62 75 73 74 5f 63 6c 6f 73 65      robust_close
300e0 28 70 2c 20 66 64 2c 20 5f 5f 4c 49 4e 45 5f 5f  (p, fd, __LINE__
300f0 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  );.        rc = 
30100 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 41 43 43  SQLITE_IOERR_ACC
30110 45 53 53 3b 0a 20 20 20 20 20 20 20 20 67 6f 74  ESS;.        got
30120 6f 20 6f 70 65 6e 5f 66 69 6e 69 73 68 65 64 3b  o open_finished;
30130 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 75  .      }.      u
30140 73 65 50 72 6f 78 79 20 3d 20 21 28 66 73 49 6e  seProxy = !(fsIn
30150 66 6f 2e 66 5f 66 6c 61 67 73 26 4d 4e 54 5f 4c  fo.f_flags&MNT_L
30160 4f 43 41 4c 29 3b 0a 20 20 20 20 7d 0a 20 20 20  OCAL);.    }.   
30170 20 69 66 28 20 75 73 65 50 72 6f 78 79 20 29 7b   if( useProxy ){
30180 0a 20 20 20 20 20 20 72 63 20 3d 20 66 69 6c 6c  .      rc = fill
30190 49 6e 55 6e 69 78 46 69 6c 65 28 70 56 66 73 2c  InUnixFile(pVfs,
301a0 20 66 64 2c 20 73 79 6e 63 44 69 72 2c 20 70 46   fd, syncDir, pF
301b0 69 6c 65 2c 20 7a 50 61 74 68 2c 20 6e 6f 4c 6f  ile, zPath, noLo
301c0 63 6b 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  ck,.            
301d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 73                is
301e0 44 65 6c 65 74 65 2c 20 69 73 52 65 61 64 6f 6e  Delete, isReadon
301f0 6c 79 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  ly);.      if( r
30200 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
30210 20 20 20 20 20 20 20 20 2f 2a 20 63 61 63 68 65          /* cache
30220 20 74 68 65 20 70 4d 65 74 68 6f 64 20 69 6e 20   the pMethod in 
30230 63 61 73 65 20 74 68 65 20 74 72 61 6e 73 66 6f  case the transfo
30240 72 6d 20 66 61 69 6c 73 20 2a 2f 0a 20 20 20 20  rm fails */.    
30250 20 20 20 20 63 6f 6e 73 74 20 73 74 72 75 63 74      const struct
30260 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68   sqlite3_io_meth
30270 6f 64 73 20 2a 70 4d 65 74 68 6f 64 20 3d 20 70  ods *pMethod = p
30280 46 69 6c 65 2d 3e 70 4d 65 74 68 6f 64 73 3b 0a  File->pMethods;.
30290 20 20 20 20 20 20 20 20 72 63 20 3d 20 70 72 6f          rc = pro
302a0 78 79 54 72 61 6e 73 66 6f 72 6d 55 6e 69 78 46  xyTransformUnixF
302b0 69 6c 65 28 28 75 6e 69 78 46 69 6c 65 2a 29 70  ile((unixFile*)p
302c0 46 69 6c 65 2c 20 22 3a 61 75 74 6f 3a 22 29 3b  File, ":auto:");
302d0 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21  .        if( rc!
302e0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
302f0 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65 20 75          /* Use u
30300 6e 69 78 43 6c 6f 73 65 20 74 6f 20 63 6c 65 61  nixClose to clea
30310 6e 20 75 70 20 74 68 65 20 72 65 73 6f 75 72 63  n up the resourc
30320 65 73 20 61 64 64 65 64 20 69 6e 20 66 69 6c 6c  es added in fill
30330 49 6e 55 6e 69 78 46 69 6c 65 20 0a 20 20 20 20  InUnixFile .    
30340 20 20 20 20 20 20 2a 2a 20 61 6e 64 20 63 6c 65        ** and cle
30350 61 72 20 61 6c 6c 20 74 68 65 20 73 74 72 75 63  ar all the struc
30360 74 75 72 65 27 73 20 72 65 66 65 72 65 6e 63 65  ture's reference
30370 73 2e 20 20 53 70 65 63 69 66 69 63 61 6c 6c 79  s.  Specifically
30380 2c 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  , .          ** 
30390 70 46 69 6c 65 2d 3e 70 4d 65 74 68 6f 64 73 20  pFile->pMethods 
303a0 77 69 6c 6c 20 62 65 20 4e 55 4c 4c 20 73 6f 20  will be NULL so 
303b0 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 20 77  sqlite3OsClose w
303c0 69 6c 6c 20 62 65 20 61 20 6e 6f 2d 6f 70 20 0a  ill be a no-op .
303d0 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20            */.   
303e0 20 20 20 20 20 20 20 69 66 28 20 70 4d 65 74 68         if( pMeth
303f0 6f 64 21 3d 4e 55 4c 4c 20 29 7b 0a 20 20 20 20  od!=NULL ){.    
30400 20 20 20 20 20 20 20 20 70 4d 65 74 68 6f 64 2d          pMethod-
30410 3e 78 43 6c 6f 73 65 28 70 46 69 6c 65 29 3b 0a  >xClose(pFile);.
30420 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b            }else{
30430 0a 20 20 20 20 20 20 20 20 20 20 20 20 75 6e 69  .            uni
30440 78 43 6c 6f 73 65 28 70 46 69 6c 65 29 3b 0a 20  xClose(pFile);. 
30450 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
30460 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
30470 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
30480 7d 0a 20 20 20 20 20 20 67 6f 74 6f 20 6f 70 65  }.      goto ope
30490 6e 5f 66 69 6e 69 73 68 65 64 3b 0a 20 20 20 20  n_finished;.    
304a0 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 0a  }.  }.#endif.  .
304b0 20 20 72 63 20 3d 20 66 69 6c 6c 49 6e 55 6e 69    rc = fillInUni
304c0 78 46 69 6c 65 28 70 56 66 73 2c 20 66 64 2c 20  xFile(pVfs, fd, 
304d0 73 79 6e 63 44 69 72 2c 20 70 46 69 6c 65 2c 20  syncDir, pFile, 
304e0 7a 50 61 74 68 2c 20 6e 6f 4c 6f 63 6b 2c 0a 20  zPath, noLock,. 
304f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30500 20 20 20 20 20 69 73 44 65 6c 65 74 65 2c 20 69       isDelete, i
30510 73 52 65 61 64 6f 6e 6c 79 29 3b 0a 6f 70 65 6e  sReadonly);.open
30520 5f 66 69 6e 69 73 68 65 64 3a 0a 20 20 69 66 28  _finished:.  if(
30530 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
30540 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  {.    sqlite3_fr
30550 65 65 28 70 2d 3e 70 55 6e 75 73 65 64 29 3b 0a  ee(p->pUnused);.
30560 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
30570 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74  .}.../*.** Delet
30580 65 20 74 68 65 20 66 69 6c 65 20 61 74 20 7a 50  e the file at zP
30590 61 74 68 2e 20 49 66 20 74 68 65 20 64 69 72 53  ath. If the dirS
305a0 79 6e 63 20 61 72 67 75 6d 65 6e 74 20 69 73 20  ync argument is 
305b0 74 72 75 65 2c 20 66 73 79 6e 63 28 29 0a 2a 2a  true, fsync().**
305c0 20 74 68 65 20 64 69 72 65 63 74 6f 72 79 20 61   the directory a
305d0 66 74 65 72 20 64 65 6c 65 74 69 6e 67 20 74 68  fter deleting th
305e0 65 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69  e file..*/.stati
305f0 63 20 69 6e 74 20 75 6e 69 78 44 65 6c 65 74 65  c int unixDelete
30600 28 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20  (.  sqlite3_vfs 
30610 2a 4e 6f 74 55 73 65 64 2c 20 20 20 20 20 2f 2a  *NotUsed,     /*
30620 20 56 46 53 20 63 6f 6e 74 61 69 6e 69 6e 67 20   VFS containing 
30630 74 68 69 73 20 61 73 20 74 68 65 20 78 44 65 6c  this as the xDel
30640 65 74 65 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20  ete method */.  
30650 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 61 74  const char *zPat
30660 68 2c 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d  h,        /* Nam
30670 65 20 6f 66 20 66 69 6c 65 20 74 6f 20 62 65 20  e of file to be 
30680 64 65 6c 65 74 65 64 20 2a 2f 0a 20 20 69 6e 74  deleted */.  int
30690 20 64 69 72 53 79 6e 63 20 20 20 20 20 20 20 20   dirSync        
306a0 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74 72 75         /* If tru
306b0 65 2c 20 66 73 79 6e 63 28 29 20 64 69 72 65 63  e, fsync() direc
306c0 74 6f 72 79 20 61 66 74 65 72 20 64 65 6c 65 74  tory after delet
306d0 69 6e 67 20 66 69 6c 65 20 2a 2f 0a 29 7b 0a 20  ing file */.){. 
306e0 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
306f0 5f 4f 4b 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41  _OK;.  UNUSED_PA
30700 52 41 4d 45 54 45 52 28 4e 6f 74 55 73 65 64 29  RAMETER(NotUsed)
30710 3b 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72  ;.  SimulateIOEr
30720 72 6f 72 28 72 65 74 75 72 6e 20 53 51 4c 49 54  ror(return SQLIT
30730 45 5f 49 4f 45 52 52 5f 44 45 4c 45 54 45 29 3b  E_IOERR_DELETE);
30740 0a 20 20 69 66 28 20 6f 73 55 6e 6c 69 6e 6b 28  .  if( osUnlink(
30750 7a 50 61 74 68 29 3d 3d 28 2d 31 29 20 26 26 20  zPath)==(-1) && 
30760 65 72 72 6e 6f 21 3d 45 4e 4f 45 4e 54 20 29 7b  errno!=ENOENT ){
30770 0a 20 20 20 20 72 65 74 75 72 6e 20 75 6e 69 78  .    return unix
30780 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f  LogError(SQLITE_
30790 49 4f 45 52 52 5f 44 45 4c 45 54 45 2c 20 22 75  IOERR_DELETE, "u
307a0 6e 6c 69 6e 6b 22 2c 20 7a 50 61 74 68 29 3b 0a  nlink", zPath);.
307b0 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49    }.#ifndef SQLI
307c0 54 45 5f 44 49 53 41 42 4c 45 5f 44 49 52 53 59  TE_DISABLE_DIRSY
307d0 4e 43 0a 20 20 69 66 28 20 64 69 72 53 79 6e 63  NC.  if( dirSync
307e0 20 29 7b 0a 20 20 20 20 69 6e 74 20 66 64 3b 0a   ){.    int fd;.
307f0 20 20 20 20 72 63 20 3d 20 6f 73 4f 70 65 6e 44      rc = osOpenD
30800 69 72 65 63 74 6f 72 79 28 7a 50 61 74 68 2c 20  irectory(zPath, 
30810 26 66 64 29 3b 0a 20 20 20 20 69 66 28 20 72 63  &fd);.    if( rc
30820 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 23  ==SQLITE_OK ){.#
30830 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20  if OS_VXWORKS.  
30840 20 20 20 20 69 66 28 20 66 73 79 6e 63 28 66 64      if( fsync(fd
30850 29 3d 3d 2d 31 20 29 0a 23 65 6c 73 65 0a 20 20  )==-1 ).#else.  
30860 20 20 20 20 69 66 28 20 66 73 79 6e 63 28 66 64      if( fsync(fd
30870 29 20 29 0a 23 65 6e 64 69 66 0a 20 20 20 20 20  ) ).#endif.     
30880 20 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20   {.        rc = 
30890 75 6e 69 78 4c 6f 67 45 72 72 6f 72 28 53 51 4c  unixLogError(SQL
308a0 49 54 45 5f 49 4f 45 52 52 5f 44 49 52 5f 46 53  ITE_IOERR_DIR_FS
308b0 59 4e 43 2c 20 22 66 73 79 6e 63 22 2c 20 7a 50  YNC, "fsync", zP
308c0 61 74 68 29 3b 0a 20 20 20 20 20 20 7d 0a 23 69  ath);.      }.#i
308d0 66 20 4f 53 43 4c 4f 53 45 5f 43 48 45 43 4b 5f  f OSCLOSE_CHECK_
308e0 43 4c 4f 53 45 5f 49 4f 45 52 52 0a 20 20 20 20  CLOSE_IOERR.    
308f0 20 20 69 66 28 20 63 6c 6f 73 65 28 66 64 29 26    if( close(fd)&
30900 26 21 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20  &!rc ){.        
30910 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52  rc = SQLITE_IOER
30920 52 5f 44 49 52 5f 43 4c 4f 53 45 3b 0a 20 20 20  R_DIR_CLOSE;.   
30930 20 20 20 7d 0a 23 65 6c 73 65 0a 20 20 20 20 20     }.#else.     
30940 20 72 6f 62 75 73 74 5f 63 6c 6f 73 65 28 30 2c   robust_close(0,
30950 20 66 64 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a   fd, __LINE__);.
30960 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20 7d  #endif.    }.  }
30970 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e  .#endif.  return
30980 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 65   rc;.}../*.** Te
30990 73 74 20 74 68 65 20 65 78 69 73 74 61 6e 63 65  st the existance
309a0 20 6f 66 20 6f 72 20 61 63 63 65 73 73 20 70 65   of or access pe
309b0 72 6d 69 73 73 69 6f 6e 73 20 6f 66 20 66 69 6c  rmissions of fil
309c0 65 20 7a 50 61 74 68 2e 20 54 68 65 0a 2a 2a 20  e zPath. The.** 
309d0 74 65 73 74 20 70 65 72 66 6f 72 6d 65 64 20 64  test performed d
309e0 65 70 65 6e 64 73 20 6f 6e 20 74 68 65 20 76 61  epends on the va
309f0 6c 75 65 20 6f 66 20 66 6c 61 67 73 3a 0a 2a 2a  lue of flags:.**
30a00 0a 2a 2a 20 20 20 20 20 53 51 4c 49 54 45 5f 41  .**     SQLITE_A
30a10 43 43 45 53 53 5f 45 58 49 53 54 53 3a 20 52 65  CCESS_EXISTS: Re
30a20 74 75 72 6e 20 31 20 69 66 20 74 68 65 20 66 69  turn 1 if the fi
30a30 6c 65 20 65 78 69 73 74 73 0a 2a 2a 20 20 20 20  le exists.**    
30a40 20 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 52   SQLITE_ACCESS_R
30a50 45 41 44 57 52 49 54 45 3a 20 52 65 74 75 72 6e  EADWRITE: Return
30a60 20 31 20 69 66 20 74 68 65 20 66 69 6c 65 20 69   1 if the file i
30a70 73 20 72 65 61 64 20 61 6e 64 20 77 72 69 74 61  s read and writa
30a80 62 6c 65 2e 0a 2a 2a 20 20 20 20 20 53 51 4c 49  ble..**     SQLI
30a90 54 45 5f 41 43 43 45 53 53 5f 52 45 41 44 4f 4e  TE_ACCESS_READON
30aa0 4c 59 3a 20 52 65 74 75 72 6e 20 31 20 69 66 20  LY: Return 1 if 
30ab0 74 68 65 20 66 69 6c 65 20 69 73 20 72 65 61 64  the file is read
30ac0 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65  able..**.** Othe
30ad0 72 77 69 73 65 20 72 65 74 75 72 6e 20 30 2e 0a  rwise return 0..
30ae0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e  */.static int un
30af0 69 78 41 63 63 65 73 73 28 0a 20 20 73 71 6c 69  ixAccess(.  sqli
30b00 74 65 33 5f 76 66 73 20 2a 4e 6f 74 55 73 65 64  te3_vfs *NotUsed
30b10 2c 20 20 20 2f 2a 20 54 68 65 20 56 46 53 20 63  ,   /* The VFS c
30b20 6f 6e 74 61 69 6e 69 6e 67 20 74 68 69 73 20 78  ontaining this x
30b30 41 63 63 65 73 73 20 6d 65 74 68 6f 64 20 2a 2f  Access method */
30b40 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
30b50 50 61 74 68 2c 20 20 20 20 20 20 2f 2a 20 50 61  Path,      /* Pa
30b60 74 68 20 6f 66 20 74 68 65 20 66 69 6c 65 20 74  th of the file t
30b70 6f 20 65 78 61 6d 69 6e 65 20 2a 2f 0a 20 20 69  o examine */.  i
30b80 6e 74 20 66 6c 61 67 73 2c 20 20 20 20 20 20 20  nt flags,       
30b90 20 20 20 20 20 20 20 2f 2a 20 57 68 61 74 20 64         /* What d
30ba0 6f 20 77 65 20 77 61 6e 74 20 74 6f 20 6c 65 61  o we want to lea
30bb0 72 6e 20 61 62 6f 75 74 20 74 68 65 20 7a 50 61  rn about the zPa
30bc0 74 68 20 66 69 6c 65 3f 20 2a 2f 0a 20 20 69 6e  th file? */.  in
30bd0 74 20 2a 70 52 65 73 4f 75 74 20 20 20 20 20 20  t *pResOut      
30be0 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 72        /* Write r
30bf0 65 73 75 6c 74 20 62 6f 6f 6c 65 61 6e 20 68 65  esult boolean he
30c00 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 61  re */.){.  int a
30c10 6d 6f 64 65 20 3d 20 30 3b 0a 20 20 55 4e 55 53  mode = 0;.  UNUS
30c20 45 44 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f 74  ED_PARAMETER(Not
30c30 55 73 65 64 29 3b 0a 20 20 53 69 6d 75 6c 61 74  Used);.  Simulat
30c40 65 49 4f 45 72 72 6f 72 28 20 72 65 74 75 72 6e  eIOError( return
30c50 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 41 43   SQLITE_IOERR_AC
30c60 43 45 53 53 3b 20 29 3b 0a 20 20 73 77 69 74 63  CESS; );.  switc
30c70 68 28 20 66 6c 61 67 73 20 29 7b 0a 20 20 20 20  h( flags ){.    
30c80 63 61 73 65 20 53 51 4c 49 54 45 5f 41 43 43 45  case SQLITE_ACCE
30c90 53 53 5f 45 58 49 53 54 53 3a 0a 20 20 20 20 20  SS_EXISTS:.     
30ca0 20 61 6d 6f 64 65 20 3d 20 46 5f 4f 4b 3b 0a 20   amode = F_OK;. 
30cb0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
30cc0 63 61 73 65 20 53 51 4c 49 54 45 5f 41 43 43 45  case SQLITE_ACCE
30cd0 53 53 5f 52 45 41 44 57 52 49 54 45 3a 0a 20 20  SS_READWRITE:.  
30ce0 20 20 20 20 61 6d 6f 64 65 20 3d 20 57 5f 4f 4b      amode = W_OK
30cf0 7c 52 5f 4f 4b 3b 0a 20 20 20 20 20 20 62 72 65  |R_OK;.      bre
30d00 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c  ak;.    case SQL
30d10 49 54 45 5f 41 43 43 45 53 53 5f 52 45 41 44 3a  ITE_ACCESS_READ:
30d20 0a 20 20 20 20 20 20 61 6d 6f 64 65 20 3d 20 52  .      amode = R
30d30 5f 4f 4b 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  _OK;.      break
30d40 3b 0a 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 0a  ;..    default:.
30d50 20 20 20 20 20 20 61 73 73 65 72 74 28 21 22 49        assert(!"I
30d60 6e 76 61 6c 69 64 20 66 6c 61 67 73 20 61 72 67  nvalid flags arg
30d70 75 6d 65 6e 74 22 29 3b 0a 20 20 7d 0a 20 20 2a  ument");.  }.  *
30d80 70 52 65 73 4f 75 74 20 3d 20 28 6f 73 41 63 63  pResOut = (osAcc
30d90 65 73 73 28 7a 50 61 74 68 2c 20 61 6d 6f 64 65  ess(zPath, amode
30da0 29 3d 3d 30 29 3b 0a 20 20 69 66 28 20 66 6c 61  )==0);.  if( fla
30db0 67 73 3d 3d 53 51 4c 49 54 45 5f 41 43 43 45 53  gs==SQLITE_ACCES
30dc0 53 5f 45 58 49 53 54 53 20 26 26 20 2a 70 52 65  S_EXISTS && *pRe
30dd0 73 4f 75 74 20 29 7b 0a 20 20 20 20 73 74 72 75  sOut ){.    stru
30de0 63 74 20 73 74 61 74 20 62 75 66 3b 0a 20 20 20  ct stat buf;.   
30df0 20 69 66 28 20 30 3d 3d 6f 73 53 74 61 74 28 7a   if( 0==osStat(z
30e00 50 61 74 68 2c 20 26 62 75 66 29 20 26 26 20 62  Path, &buf) && b
30e10 75 66 2e 73 74 5f 73 69 7a 65 3d 3d 30 20 29 7b  uf.st_size==0 ){
30e20 0a 20 20 20 20 20 20 2a 70 52 65 73 4f 75 74 20  .      *pResOut 
30e30 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  = 0;.    }.  }. 
30e40 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
30e50 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 75 72  K;.}.../*.** Tur
30e60 6e 20 61 20 72 65 6c 61 74 69 76 65 20 70 61 74  n a relative pat
30e70 68 6e 61 6d 65 20 69 6e 74 6f 20 61 20 66 75 6c  hname into a ful
30e80 6c 20 70 61 74 68 6e 61 6d 65 2e 20 54 68 65 20  l pathname. The 
30e90 72 65 6c 61 74 69 76 65 20 70 61 74 68 0a 2a 2a  relative path.**
30ea0 20 69 73 20 73 74 6f 72 65 64 20 61 73 20 61 20   is stored as a 
30eb0 6e 75 6c 2d 74 65 72 6d 69 6e 61 74 65 64 20 73  nul-terminated s
30ec0 74 72 69 6e 67 20 69 6e 20 74 68 65 20 62 75 66  tring in the buf
30ed0 66 65 72 20 70 6f 69 6e 74 65 64 20 74 6f 20 62  fer pointed to b
30ee0 79 0a 2a 2a 20 7a 50 61 74 68 2e 20 0a 2a 2a 0a  y.** zPath. .**.
30ef0 2a 2a 20 7a 4f 75 74 20 70 6f 69 6e 74 73 20 74  ** zOut points t
30f00 6f 20 61 20 62 75 66 66 65 72 20 6f 66 20 61 74  o a buffer of at
30f10 20 6c 65 61 73 74 20 73 71 6c 69 74 65 33 5f 76   least sqlite3_v
30f20 66 73 2e 6d 78 50 61 74 68 6e 61 6d 65 20 62 79  fs.mxPathname by
30f30 74 65 73 20 0a 2a 2a 20 28 69 6e 20 74 68 69 73  tes .** (in this
30f40 20 63 61 73 65 2c 20 4d 41 58 5f 50 41 54 48 4e   case, MAX_PATHN
30f50 41 4d 45 20 62 79 74 65 73 29 2e 20 54 68 65 20  AME bytes). The 
30f60 66 75 6c 6c 2d 70 61 74 68 20 69 73 20 77 72 69  full-path is wri
30f70 74 74 65 6e 20 74 6f 0a 2a 2a 20 74 68 69 73 20  tten to.** this 
30f80 62 75 66 66 65 72 20 62 65 66 6f 72 65 20 72 65  buffer before re
30f90 74 75 72 6e 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74  turning..*/.stat
30fa0 69 63 20 69 6e 74 20 75 6e 69 78 46 75 6c 6c 50  ic int unixFullP
30fb0 61 74 68 6e 61 6d 65 28 0a 20 20 73 71 6c 69 74  athname(.  sqlit
30fc0 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 20 20  e3_vfs *pVfs,   
30fd0 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e           /* Poin
30fe0 74 65 72 20 74 6f 20 76 66 73 20 6f 62 6a 65 63  ter to vfs objec
30ff0 74 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  t */.  const cha
31000 72 20 2a 7a 50 61 74 68 2c 20 20 20 20 20 20 20  r *zPath,       
31010 20 20 20 20 20 2f 2a 20 50 6f 73 73 69 62 6c 79       /* Possibly
31020 20 72 65 6c 61 74 69 76 65 20 69 6e 70 75 74 20   relative input 
31030 70 61 74 68 20 2a 2f 0a 20 20 69 6e 74 20 6e 4f  path */.  int nO
31040 75 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ut,             
31050 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20          /* Size 
31060 6f 66 20 6f 75 74 70 75 74 20 62 75 66 66 65 72  of output buffer
31070 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20 63   in bytes */.  c
31080 68 61 72 20 2a 7a 4f 75 74 20 20 20 20 20 20 20  har *zOut       
31090 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
310a0 4f 75 74 70 75 74 20 62 75 66 66 65 72 20 2a 2f  Output buffer */
310b0 0a 29 7b 0a 0a 20 20 2f 2a 20 49 74 27 73 20 6f  .){..  /* It's o
310c0 64 64 20 74 6f 20 73 69 6d 75 6c 61 74 65 20 61  dd to simulate a
310d0 6e 20 69 6f 2d 65 72 72 6f 72 20 68 65 72 65 2c  n io-error here,
310e0 20 62 75 74 20 72 65 61 6c 6c 79 20 74 68 69 73   but really this
310f0 20 69 73 20 6a 75 73 74 0a 20 20 2a 2a 20 75 73   is just.  ** us
31100 69 6e 67 20 74 68 65 20 69 6f 2d 65 72 72 6f 72  ing the io-error
31110 20 69 6e 66 72 61 73 74 72 75 63 74 75 72 65 20   infrastructure 
31120 74 6f 20 74 65 73 74 20 74 68 61 74 20 53 51 4c  to test that SQL
31130 69 74 65 20 68 61 6e 64 6c 65 73 20 74 68 69 73  ite handles this
31140 0a 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 66  .  ** function f
31150 61 69 6c 69 6e 67 2e 20 54 68 69 73 20 66 75 6e  ailing. This fun
31160 63 74 69 6f 6e 20 63 6f 75 6c 64 20 66 61 69 6c  ction could fail
31170 20 69 66 2c 20 66 6f 72 20 65 78 61 6d 70 6c 65   if, for example
31180 2c 20 74 68 65 0a 20 20 2a 2a 20 63 75 72 72 65  , the.  ** curre
31190 6e 74 20 77 6f 72 6b 69 6e 67 20 64 69 72 65 63  nt working direc
311a0 74 6f 72 79 20 68 61 73 20 62 65 65 6e 20 75 6e  tory has been un
311b0 6c 69 6e 6b 65 64 2e 0a 20 20 2a 2f 0a 20 20 53  linked..  */.  S
311c0 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20  imulateIOError( 
311d0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52  return SQLITE_ER
311e0 52 4f 52 20 29 3b 0a 0a 20 20 61 73 73 65 72 74  ROR );..  assert
311f0 28 20 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61  ( pVfs->mxPathna
31200 6d 65 3d 3d 4d 41 58 5f 50 41 54 48 4e 41 4d 45  me==MAX_PATHNAME
31210 20 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52   );.  UNUSED_PAR
31220 41 4d 45 54 45 52 28 70 56 66 73 29 3b 0a 0a 20  AMETER(pVfs);.. 
31230 20 7a 4f 75 74 5b 6e 4f 75 74 2d 31 5d 20 3d 20   zOut[nOut-1] = 
31240 27 5c 30 27 3b 0a 20 20 69 66 28 20 7a 50 61 74  '\0';.  if( zPat
31250 68 5b 30 5d 3d 3d 27 2f 27 20 29 7b 0a 20 20 20  h[0]=='/' ){.   
31260 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
31270 66 28 6e 4f 75 74 2c 20 7a 4f 75 74 2c 20 22 25  f(nOut, zOut, "%
31280 73 22 2c 20 7a 50 61 74 68 29 3b 0a 20 20 7d 65  s", zPath);.  }e
31290 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 6e 43 77  lse{.    int nCw
312a0 64 3b 0a 20 20 20 20 69 66 28 20 6f 73 47 65 74  d;.    if( osGet
312b0 63 77 64 28 7a 4f 75 74 2c 20 6e 4f 75 74 2d 31  cwd(zOut, nOut-1
312c0 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 65  )==0 ){.      re
312d0 74 75 72 6e 20 75 6e 69 78 4c 6f 67 45 72 72 6f  turn unixLogErro
312e0 72 28 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45  r(SQLITE_CANTOPE
312f0 4e 5f 42 4b 50 54 2c 20 22 67 65 74 63 77 64 22  N_BKPT, "getcwd"
31300 2c 20 7a 50 61 74 68 29 3b 0a 20 20 20 20 7d 0a  , zPath);.    }.
31310 20 20 20 20 6e 43 77 64 20 3d 20 28 69 6e 74 29      nCwd = (int)
31320 73 74 72 6c 65 6e 28 7a 4f 75 74 29 3b 0a 20 20  strlen(zOut);.  
31330 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
31340 74 66 28 6e 4f 75 74 2d 6e 43 77 64 2c 20 26 7a  tf(nOut-nCwd, &z
31350 4f 75 74 5b 6e 43 77 64 5d 2c 20 22 2f 25 73 22  Out[nCwd], "/%s"
31360 2c 20 7a 50 61 74 68 29 3b 0a 20 20 7d 0a 20 20  , zPath);.  }.  
31370 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
31380 3b 0a 7d 0a 0a 0a 23 69 66 6e 64 65 66 20 53 51  ;.}...#ifndef SQ
31390 4c 49 54 45 5f 4f 4d 49 54 5f 4c 4f 41 44 5f 45  LITE_OMIT_LOAD_E
313a0 58 54 45 4e 53 49 4f 4e 0a 2f 2a 0a 2a 2a 20 49  XTENSION./*.** I
313b0 6e 74 65 72 66 61 63 65 73 20 66 6f 72 20 6f 70  nterfaces for op
313c0 65 6e 69 6e 67 20 61 20 73 68 61 72 65 64 20 6c  ening a shared l
313d0 69 62 72 61 72 79 2c 20 66 69 6e 64 69 6e 67 20  ibrary, finding 
313e0 65 6e 74 72 79 20 70 6f 69 6e 74 73 0a 2a 2a 20  entry points.** 
313f0 77 69 74 68 69 6e 20 74 68 65 20 73 68 61 72 65  within the share
31400 64 20 6c 69 62 72 61 72 79 2c 20 61 6e 64 20 63  d library, and c
31410 6c 6f 73 69 6e 67 20 74 68 65 20 73 68 61 72 65  losing the share
31420 64 20 6c 69 62 72 61 72 79 2e 0a 2a 2f 0a 23 69  d library..*/.#i
31430 6e 63 6c 75 64 65 20 3c 64 6c 66 63 6e 2e 68 3e  nclude <dlfcn.h>
31440 0a 73 74 61 74 69 63 20 76 6f 69 64 20 2a 75 6e  .static void *un
31450 69 78 44 6c 4f 70 65 6e 28 73 71 6c 69 74 65 33  ixDlOpen(sqlite3
31460 5f 76 66 73 20 2a 4e 6f 74 55 73 65 64 2c 20 63  _vfs *NotUsed, c
31470 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65  onst char *zFile
31480 6e 61 6d 65 29 7b 0a 20 20 55 4e 55 53 45 44 5f  name){.  UNUSED_
31490 50 41 52 41 4d 45 54 45 52 28 4e 6f 74 55 73 65  PARAMETER(NotUse
314a0 64 29 3b 0a 20 20 72 65 74 75 72 6e 20 64 6c 6f  d);.  return dlo
314b0 70 65 6e 28 7a 46 69 6c 65 6e 61 6d 65 2c 20 52  pen(zFilename, R
314c0 54 4c 44 5f 4e 4f 57 20 7c 20 52 54 4c 44 5f 47  TLD_NOW | RTLD_G
314d0 4c 4f 42 41 4c 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  LOBAL);.}../*.**
314e0 20 53 51 4c 69 74 65 20 63 61 6c 6c 73 20 74 68   SQLite calls th
314f0 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 6d 6d 65  is function imme
31500 64 69 61 74 65 6c 79 20 61 66 74 65 72 20 61 20  diately after a 
31510 63 61 6c 6c 20 74 6f 20 75 6e 69 78 44 6c 53 79  call to unixDlSy
31520 6d 28 29 20 6f 72 0a 2a 2a 20 75 6e 69 78 44 6c  m() or.** unixDl
31530 4f 70 65 6e 28 29 20 66 61 69 6c 73 20 28 72 65  Open() fails (re
31540 74 75 72 6e 73 20 61 20 6e 75 6c 6c 20 70 6f 69  turns a null poi
31550 6e 74 65 72 29 2e 20 49 66 20 61 20 6d 6f 72 65  nter). If a more
31560 20 64 65 74 61 69 6c 65 64 20 65 72 72 6f 72 0a   detailed error.
31570 2a 2a 20 6d 65 73 73 61 67 65 20 69 73 20 61 76  ** message is av
31580 61 69 6c 61 62 6c 65 2c 20 69 74 20 69 73 20 77  ailable, it is w
31590 72 69 74 74 65 6e 20 74 6f 20 7a 42 75 66 4f 75  ritten to zBufOu
315a0 74 2e 20 49 66 20 6e 6f 20 65 72 72 6f 72 20 6d  t. If no error m
315b0 65 73 73 61 67 65 0a 2a 2a 20 69 73 20 61 76 61  essage.** is ava
315c0 69 6c 61 62 6c 65 2c 20 7a 42 75 66 4f 75 74 20  ilable, zBufOut 
315d0 69 73 20 6c 65 66 74 20 75 6e 6d 6f 64 69 66 69  is left unmodifi
315e0 65 64 20 61 6e 64 20 53 51 4c 69 74 65 20 75 73  ed and SQLite us
315f0 65 73 20 61 20 64 65 66 61 75 6c 74 0a 2a 2a 20  es a default.** 
31600 65 72 72 6f 72 20 6d 65 73 73 61 67 65 2e 0a 2a  error message..*
31610 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 75 6e  /.static void un
31620 69 78 44 6c 45 72 72 6f 72 28 73 71 6c 69 74 65  ixDlError(sqlite
31630 33 5f 76 66 73 20 2a 4e 6f 74 55 73 65 64 2c 20  3_vfs *NotUsed, 
31640 69 6e 74 20 6e 42 75 66 2c 20 63 68 61 72 20 2a  int nBuf, char *
31650 7a 42 75 66 4f 75 74 29 7b 0a 20 20 63 6f 6e 73  zBufOut){.  cons
31660 74 20 63 68 61 72 20 2a 7a 45 72 72 3b 0a 20 20  t char *zErr;.  
31670 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
31680 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20 75 6e 69  (NotUsed);.  uni
31690 78 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 20  xEnterMutex();. 
316a0 20 7a 45 72 72 20 3d 20 64 6c 65 72 72 6f 72 28   zErr = dlerror(
316b0 29 3b 0a 20 20 69 66 28 20 7a 45 72 72 20 29 7b  );.  if( zErr ){
316c0 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70  .    sqlite3_snp
316d0 72 69 6e 74 66 28 6e 42 75 66 2c 20 7a 42 75 66  rintf(nBuf, zBuf
316e0 4f 75 74 2c 20 22 25 73 22 2c 20 7a 45 72 72 29  Out, "%s", zErr)
316f0 3b 0a 20 20 7d 0a 20 20 75 6e 69 78 4c 65 61 76  ;.  }.  unixLeav
31700 65 4d 75 74 65 78 28 29 3b 0a 7d 0a 73 74 61 74  eMutex();.}.stat
31710 69 63 20 76 6f 69 64 20 28 2a 75 6e 69 78 44 6c  ic void (*unixDl
31720 53 79 6d 28 73 71 6c 69 74 65 33 5f 76 66 73 20  Sym(sqlite3_vfs 
31730 2a 4e 6f 74 55 73 65 64 2c 20 76 6f 69 64 20 2a  *NotUsed, void *
31740 70 2c 20 63 6f 6e 73 74 20 63 68 61 72 2a 7a 53  p, const char*zS
31750 79 6d 29 29 28 76 6f 69 64 29 7b 0a 20 20 2f 2a  ym))(void){.  /*
31760 20 0a 20 20 2a 2a 20 47 43 43 20 77 69 74 68 20   .  ** GCC with 
31770 2d 70 65 64 61 6e 74 69 63 2d 65 72 72 6f 72 73  -pedantic-errors
31780 20 73 61 79 73 20 74 68 61 74 20 43 39 30 20 64   says that C90 d
31790 6f 65 73 20 6e 6f 74 20 61 6c 6c 6f 77 20 61 20  oes not allow a 
317a0 76 6f 69 64 2a 20 74 6f 20 62 65 0a 20 20 2a 2a  void* to be.  **
317b0 20 63 61 73 74 20 69 6e 74 6f 20 61 20 70 6f 69   cast into a poi
317c0 6e 74 65 72 20 74 6f 20 61 20 66 75 6e 63 74 69  nter to a functi
317d0 6f 6e 2e 20 20 41 6e 64 20 79 65 74 20 74 68 65  on.  And yet the
317e0 20 6c 69 62 72 61 72 79 20 64 6c 73 79 6d 28 29   library dlsym()
317f0 20 72 6f 75 74 69 6e 65 0a 20 20 2a 2a 20 72 65   routine.  ** re
31800 74 75 72 6e 73 20 61 20 76 6f 69 64 2a 20 77 68  turns a void* wh
31810 69 63 68 20 69 73 20 72 65 61 6c 6c 79 20 61 20  ich is really a 
31820 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 66 75 6e  pointer to a fun
31830 63 74 69 6f 6e 2e 20 20 53 6f 20 68 6f 77 20 64  ction.  So how d
31840 6f 20 77 65 0a 20 20 2a 2a 20 75 73 65 20 64 6c  o we.  ** use dl
31850 73 79 6d 28 29 20 77 69 74 68 20 2d 70 65 64 61  sym() with -peda
31860 6e 74 69 63 2d 65 72 72 6f 72 73 3f 0a 20 20 2a  ntic-errors?.  *
31870 2a 0a 20 20 2a 2a 20 56 61 72 69 61 62 6c 65 20  *.  ** Variable 
31880 78 20 62 65 6c 6f 77 20 69 73 20 64 65 66 69 6e  x below is defin
31890 65 64 20 74 6f 20 62 65 20 61 20 70 6f 69 6e 74  ed to be a point
318a0 65 72 20 74 6f 20 61 20 66 75 6e 63 74 69 6f 6e  er to a function
318b0 20 74 61 6b 69 6e 67 0a 20 20 2a 2a 20 70 61 72   taking.  ** par
318c0 61 6d 65 74 65 72 73 20 76 6f 69 64 2a 20 61 6e  ameters void* an
318d0 64 20 63 6f 6e 73 74 20 63 68 61 72 2a 20 61 6e  d const char* an
318e0 64 20 72 65 74 75 72 6e 69 6e 67 20 61 20 70 6f  d returning a po
318f0 69 6e 74 65 72 20 74 6f 20 61 20 66 75 6e 63 74  inter to a funct
31900 69 6f 6e 2e 0a 20 20 2a 2a 20 57 65 20 69 6e 69  ion..  ** We ini
31910 74 69 61 6c 69 7a 65 20 78 20 62 79 20 61 73 73  tialize x by ass
31920 69 67 6e 69 6e 67 20 69 74 20 61 20 70 6f 69 6e  igning it a poin
31930 74 65 72 20 74 6f 20 74 68 65 20 64 6c 73 79 6d  ter to the dlsym
31940 28 29 20 66 75 6e 63 74 69 6f 6e 2e 0a 20 20 2a  () function..  *
31950 2a 20 28 54 68 61 74 20 61 73 73 69 67 6e 6d 65  * (That assignme
31960 6e 74 20 72 65 71 75 69 72 65 73 20 61 20 63 61  nt requires a ca
31970 73 74 2e 29 20 20 54 68 65 6e 20 77 65 20 63 61  st.)  Then we ca
31980 6c 6c 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20  ll the function 
31990 74 68 61 74 0a 20 20 2a 2a 20 78 20 70 6f 69 6e  that.  ** x poin
319a0 74 73 20 74 6f 2e 20 20 0a 20 20 2a 2a 0a 20 20  ts to.  .  **.  
319b0 2a 2a 20 54 68 69 73 20 77 6f 72 6b 2d 61 72 6f  ** This work-aro
319c0 75 6e 64 20 69 73 20 75 6e 6c 69 6b 65 6c 79 20  und is unlikely 
319d0 74 6f 20 77 6f 72 6b 20 63 6f 72 72 65 63 74 6c  to work correctl
319e0 79 20 6f 6e 20 61 6e 79 20 73 79 73 74 65 6d 20  y on any system 
319f0 77 68 65 72 65 0a 20 20 2a 2a 20 79 6f 75 20 72  where.  ** you r
31a00 65 61 6c 6c 79 20 63 61 6e 6e 6f 74 20 63 61 73  eally cannot cas
31a10 74 20 61 20 66 75 6e 63 74 69 6f 6e 20 70 6f 69  t a function poi
31a20 6e 74 65 72 20 69 6e 74 6f 20 76 6f 69 64 2a 2e  nter into void*.
31a30 20 20 42 75 74 20 74 68 65 6e 2c 20 6f 6e 20 74    But then, on t
31a40 68 65 0a 20 20 2a 2a 20 6f 74 68 65 72 20 68 61  he.  ** other ha
31a50 6e 64 2c 20 64 6c 73 79 6d 28 29 20 77 69 6c 6c  nd, dlsym() will
31a60 20 6e 6f 74 20 77 6f 72 6b 20 6f 6e 20 73 75 63   not work on suc
31a70 68 20 61 20 73 79 73 74 65 6d 20 65 69 74 68 65  h a system eithe
31a80 72 2c 20 73 6f 20 77 65 20 68 61 76 65 0a 20 20  r, so we have.  
31a90 2a 2a 20 6e 6f 74 20 72 65 61 6c 6c 79 20 6c 6f  ** not really lo
31aa0 73 74 20 61 6e 79 74 68 69 6e 67 2e 0a 20 20 2a  st anything..  *
31ab0 2f 0a 20 20 76 6f 69 64 20 28 2a 28 2a 78 29 28  /.  void (*(*x)(
31ac0 76 6f 69 64 2a 2c 63 6f 6e 73 74 20 63 68 61 72  void*,const char
31ad0 2a 29 29 28 76 6f 69 64 29 3b 0a 20 20 55 4e 55  *))(void);.  UNU
31ae0 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f  SED_PARAMETER(No
31af0 74 55 73 65 64 29 3b 0a 20 20 78 20 3d 20 28 76  tUsed);.  x = (v
31b00 6f 69 64 28 2a 28 2a 29 28 76 6f 69 64 2a 2c 63  oid(*(*)(void*,c
31b10 6f 6e 73 74 20 63 68 61 72 2a 29 29 28 76 6f 69  onst char*))(voi
31b20 64 29 29 64 6c 73 79 6d 3b 0a 20 20 72 65 74 75  d))dlsym;.  retu
31b30 72 6e 20 28 2a 78 29 28 70 2c 20 7a 53 79 6d 29  rn (*x)(p, zSym)
31b40 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20  ;.}.static void 
31b50 75 6e 69 78 44 6c 43 6c 6f 73 65 28 73 71 6c 69  unixDlClose(sqli
31b60 74 65 33 5f 76 66 73 20 2a 4e 6f 74 55 73 65 64  te3_vfs *NotUsed
31b70 2c 20 76 6f 69 64 20 2a 70 48 61 6e 64 6c 65 29  , void *pHandle)
31b80 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  {.  UNUSED_PARAM
31b90 45 54 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20  ETER(NotUsed);. 
31ba0 20 64 6c 63 6c 6f 73 65 28 70 48 61 6e 64 6c 65   dlclose(pHandle
31bb0 29 3b 0a 7d 0a 23 65 6c 73 65 20 2f 2a 20 69 66  );.}.#else /* if
31bc0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c 4f 41   SQLITE_OMIT_LOA
31bd0 44 5f 45 58 54 45 4e 53 49 4f 4e 20 69 73 20 64  D_EXTENSION is d
31be0 65 66 69 6e 65 64 3a 20 2a 2f 0a 20 20 23 64 65  efined: */.  #de
31bf0 66 69 6e 65 20 75 6e 69 78 44 6c 4f 70 65 6e 20  fine unixDlOpen 
31c00 20 30 0a 20 20 23 64 65 66 69 6e 65 20 75 6e 69   0.  #define uni
31c10 78 44 6c 45 72 72 6f 72 20 30 0a 20 20 23 64 65  xDlError 0.  #de
31c20 66 69 6e 65 20 75 6e 69 78 44 6c 53 79 6d 20 20  fine unixDlSym  
31c30 20 30 0a 20 20 23 64 65 66 69 6e 65 20 75 6e 69   0.  #define uni
31c40 78 44 6c 43 6c 6f 73 65 20 30 0a 23 65 6e 64 69  xDlClose 0.#endi
31c50 66 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 6e  f../*.** Write n
31c60 42 75 66 20 62 79 74 65 73 20 6f 66 20 72 61 6e  Buf bytes of ran
31c70 64 6f 6d 20 64 61 74 61 20 74 6f 20 74 68 65 20  dom data to the 
31c80 73 75 70 70 6c 69 65 64 20 62 75 66 66 65 72 20  supplied buffer 
31c90 7a 42 75 66 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  zBuf..*/.static 
31ca0 69 6e 74 20 75 6e 69 78 52 61 6e 64 6f 6d 6e 65  int unixRandomne
31cb0 73 73 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a  ss(sqlite3_vfs *
31cc0 4e 6f 74 55 73 65 64 2c 20 69 6e 74 20 6e 42 75  NotUsed, int nBu
31cd0 66 2c 20 63 68 61 72 20 2a 7a 42 75 66 29 7b 0a  f, char *zBuf){.
31ce0 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
31cf0 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20 61  ER(NotUsed);.  a
31d00 73 73 65 72 74 28 28 73 69 7a 65 5f 74 29 6e 42  ssert((size_t)nB
31d10 75 66 3e 3d 28 73 69 7a 65 6f 66 28 74 69 6d 65  uf>=(sizeof(time
31d20 5f 74 29 2b 73 69 7a 65 6f 66 28 69 6e 74 29 29  _t)+sizeof(int))
31d30 29 3b 0a 0a 20 20 2f 2a 20 57 65 20 68 61 76 65  );..  /* We have
31d40 20 74 6f 20 69 6e 69 74 69 61 6c 69 7a 65 20 7a   to initialize z
31d50 42 75 66 20 74 6f 20 70 72 65 76 65 6e 74 20 76  Buf to prevent v
31d60 61 6c 67 72 69 6e 64 20 66 72 6f 6d 20 72 65 70  algrind from rep
31d70 6f 72 74 69 6e 67 0a 20 20 2a 2a 20 65 72 72 6f  orting.  ** erro
31d80 72 73 2e 20 20 54 68 65 20 72 65 70 6f 72 74 73  rs.  The reports
31d90 20 69 73 73 75 65 64 20 62 79 20 76 61 6c 67 72   issued by valgr
31da0 69 6e 64 20 61 72 65 20 69 6e 63 6f 72 72 65 63  ind are incorrec
31db0 74 20 2d 20 77 65 20 77 6f 75 6c 64 0a 20 20 2a  t - we would.  *
31dc0 2a 20 70 72 65 66 65 72 20 74 68 61 74 20 74 68  * prefer that th
31dd0 65 20 72 61 6e 64 6f 6d 6e 65 73 73 20 62 65 20  e randomness be 
31de0 69 6e 63 72 65 61 73 65 64 20 62 79 20 6d 61 6b  increased by mak
31df0 69 6e 67 20 75 73 65 20 6f 66 20 74 68 65 0a 20  ing use of the. 
31e00 20 2a 2a 20 75 6e 69 6e 69 74 69 61 6c 69 7a 65   ** uninitialize
31e10 64 20 73 70 61 63 65 20 69 6e 20 7a 42 75 66 20  d space in zBuf 
31e20 2d 20 62 75 74 20 76 61 6c 67 72 69 6e 64 20 65  - but valgrind e
31e30 72 72 6f 72 73 20 74 65 6e 64 20 74 6f 20 77 6f  rrors tend to wo
31e40 72 72 79 0a 20 20 2a 2a 20 73 6f 6d 65 20 75 73  rry.  ** some us
31e50 65 72 73 2e 20 20 52 61 74 68 65 72 20 74 68 61  ers.  Rather tha
31e60 6e 20 61 72 67 75 65 2c 20 69 74 20 73 65 65 6d  n argue, it seem
31e70 73 20 65 61 73 69 65 72 20 6a 75 73 74 20 74 6f  s easier just to
31e80 20 69 6e 69 74 69 61 6c 69 7a 65 0a 20 20 2a 2a   initialize.  **
31e90 20 74 68 65 20 77 68 6f 6c 65 20 61 72 72 61 79   the whole array
31ea0 20 61 6e 64 20 73 69 6c 65 6e 63 65 20 76 61 6c   and silence val
31eb0 67 72 69 6e 64 2c 20 65 76 65 6e 20 69 66 20 74  grind, even if t
31ec0 68 61 74 20 6d 65 61 6e 73 20 6c 65 73 73 20 72  hat means less r
31ed0 61 6e 64 6f 6d 6e 65 73 73 0a 20 20 2a 2a 20 69  andomness.  ** i
31ee0 6e 20 74 68 65 20 72 61 6e 64 6f 6d 20 73 65 65  n the random see
31ef0 64 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 57 68 65  d..  **.  ** Whe
31f00 6e 20 74 65 73 74 69 6e 67 2c 20 69 6e 69 74 69  n testing, initi
31f10 61 6c 69 7a 69 6e 67 20 7a 42 75 66 5b 5d 20 74  alizing zBuf[] t
31f20 6f 20 7a 65 72 6f 20 69 73 20 61 6c 6c 20 77 65  o zero is all we
31f30 20 64 6f 2e 20 20 54 68 61 74 20 6d 65 61 6e 73   do.  That means
31f40 0a 20 20 2a 2a 20 74 68 61 74 20 77 65 20 61 6c  .  ** that we al
31f50 77 61 79 73 20 75 73 65 20 74 68 65 20 73 61 6d  ways use the sam
31f60 65 20 72 61 6e 64 6f 6d 20 6e 75 6d 62 65 72 20  e random number 
31f70 73 65 71 75 65 6e 63 65 2e 20 20 54 68 69 73 20  sequence.  This 
31f80 6d 61 6b 65 73 20 74 68 65 0a 20 20 2a 2a 20 74  makes the.  ** t
31f90 65 73 74 73 20 72 65 70 65 61 74 61 62 6c 65 2e  ests repeatable.
31fa0 0a 20 20 2a 2f 0a 20 20 6d 65 6d 73 65 74 28 7a  .  */.  memset(z
31fb0 42 75 66 2c 20 30 2c 20 6e 42 75 66 29 3b 0a 23  Buf, 0, nBuf);.#
31fc0 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  if !defined(SQLI
31fd0 54 45 5f 54 45 53 54 29 0a 20 20 7b 0a 20 20 20  TE_TEST).  {.   
31fe0 20 69 6e 74 20 70 69 64 2c 20 66 64 3b 0a 20 20   int pid, fd;.  
31ff0 20 20 66 64 20 3d 20 72 6f 62 75 73 74 5f 6f 70    fd = robust_op
32000 65 6e 28 22 2f 64 65 76 2f 75 72 61 6e 64 6f 6d  en("/dev/urandom
32010 22 2c 20 4f 5f 52 44 4f 4e 4c 59 2c 20 30 29 3b  ", O_RDONLY, 0);
32020 0a 20 20 20 20 69 66 28 20 66 64 3c 30 20 29 7b  .    if( fd<0 ){
32030 0a 20 20 20 20 20 20 74 69 6d 65 5f 74 20 74 3b  .      time_t t;
32040 0a 20 20 20 20 20 20 74 69 6d 65 28 26 74 29 3b  .      time(&t);
32050 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 7a 42  .      memcpy(zB
32060 75 66 2c 20 26 74 2c 20 73 69 7a 65 6f 66 28 74  uf, &t, sizeof(t
32070 29 29 3b 0a 20 20 20 20 20 20 70 69 64 20 3d 20  ));.      pid = 
32080 67 65 74 70 69 64 28 29 3b 0a 20 20 20 20 20 20  getpid();.      
32090 6d 65 6d 63 70 79 28 26 7a 42 75 66 5b 73 69 7a  memcpy(&zBuf[siz
320a0 65 6f 66 28 74 29 5d 2c 20 26 70 69 64 2c 20 73  eof(t)], &pid, s
320b0 69 7a 65 6f 66 28 70 69 64 29 29 3b 0a 20 20 20  izeof(pid));.   
320c0 20 20 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f     assert( sizeo
320d0 66 28 74 29 2b 73 69 7a 65 6f 66 28 70 69 64 29  f(t)+sizeof(pid)
320e0 3c 3d 28 73 69 7a 65 5f 74 29 6e 42 75 66 20 29  <=(size_t)nBuf )
320f0 3b 0a 20 20 20 20 20 20 6e 42 75 66 20 3d 20 73  ;.      nBuf = s
32100 69 7a 65 6f 66 28 74 29 20 2b 20 73 69 7a 65 6f  izeof(t) + sizeo
32110 66 28 70 69 64 29 3b 0a 20 20 20 20 7d 65 6c 73  f(pid);.    }els
32120 65 7b 0a 20 20 20 20 20 20 64 6f 7b 20 6e 42 75  e{.      do{ nBu
32130 66 20 3d 20 6f 73 52 65 61 64 28 66 64 2c 20 7a  f = osRead(fd, z
32140 42 75 66 2c 20 6e 42 75 66 29 3b 20 7d 77 68 69  Buf, nBuf); }whi
32150 6c 65 28 20 6e 42 75 66 3c 30 20 26 26 20 65 72  le( nBuf<0 && er
32160 72 6e 6f 3d 3d 45 49 4e 54 52 20 29 3b 0a 20 20  rno==EINTR );.  
32170 20 20 20 20 72 6f 62 75 73 74 5f 63 6c 6f 73 65      robust_close
32180 28 30 2c 20 66 64 2c 20 5f 5f 4c 49 4e 45 5f 5f  (0, fd, __LINE__
32190 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e  );.    }.  }.#en
321a0 64 69 66 0a 20 20 72 65 74 75 72 6e 20 6e 42 75  dif.  return nBu
321b0 66 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 53 6c 65  f;.}.../*.** Sle
321c0 65 70 20 66 6f 72 20 61 20 6c 69 74 74 6c 65 20  ep for a little 
321d0 77 68 69 6c 65 2e 20 20 52 65 74 75 72 6e 20 74  while.  Return t
321e0 68 65 20 61 6d 6f 75 6e 74 20 6f 66 20 74 69 6d  he amount of tim
321f0 65 20 73 6c 65 70 74 2e 0a 2a 2a 20 54 68 65 20  e slept..** The 
32200 61 72 67 75 6d 65 6e 74 20 69 73 20 74 68 65 20  argument is the 
32210 6e 75 6d 62 65 72 20 6f 66 20 6d 69 63 72 6f 73  number of micros
32220 65 63 6f 6e 64 73 20 77 65 20 77 61 6e 74 20 74  econds we want t
32230 6f 20 73 6c 65 65 70 2e 0a 2a 2a 20 54 68 65 20  o sleep..** The 
32240 72 65 74 75 72 6e 20 76 61 6c 75 65 20 69 73 20  return value is 
32250 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 6d 69  the number of mi
32260 63 72 6f 73 65 63 6f 6e 64 73 20 6f 66 20 73 6c  croseconds of sl
32270 65 65 70 20 61 63 74 75 61 6c 6c 79 0a 2a 2a 20  eep actually.** 
32280 72 65 71 75 65 73 74 65 64 20 66 72 6f 6d 20 74  requested from t
32290 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 6f 70  he underlying op
322a0 65 72 61 74 69 6e 67 20 73 79 73 74 65 6d 2c 20  erating system, 
322b0 61 20 6e 75 6d 62 65 72 20 77 68 69 63 68 0a 2a  a number which.*
322c0 2a 20 6d 69 67 68 74 20 62 65 20 67 72 65 61 74  * might be great
322d0 65 72 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c  er than or equal
322e0 20 74 6f 20 74 68 65 20 61 72 67 75 6d 65 6e 74   to the argument
322f0 2c 20 62 75 74 20 6e 6f 74 20 6c 65 73 73 0a 2a  , but not less.*
32300 2a 20 74 68 61 6e 20 74 68 65 20 61 72 67 75 6d  * than the argum
32310 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ent..*/.static i
32320 6e 74 20 75 6e 69 78 53 6c 65 65 70 28 73 71 6c  nt unixSleep(sql
32330 69 74 65 33 5f 76 66 73 20 2a 4e 6f 74 55 73 65  ite3_vfs *NotUse
32340 64 2c 20 69 6e 74 20 6d 69 63 72 6f 73 65 63 6f  d, int microseco
32350 6e 64 73 29 7b 0a 23 69 66 20 4f 53 5f 56 58 57  nds){.#if OS_VXW
32360 4f 52 4b 53 0a 20 20 73 74 72 75 63 74 20 74 69  ORKS.  struct ti
32370 6d 65 73 70 65 63 20 73 70 3b 0a 0a 20 20 73 70  mespec sp;..  sp
32380 2e 74 76 5f 73 65 63 20 3d 20 6d 69 63 72 6f 73  .tv_sec = micros
32390 65 63 6f 6e 64 73 20 2f 20 31 30 30 30 30 30 30  econds / 1000000
323a0 3b 0a 20 20 73 70 2e 74 76 5f 6e 73 65 63 20 3d  ;.  sp.tv_nsec =
323b0 20 28 6d 69 63 72 6f 73 65 63 6f 6e 64 73 20 25   (microseconds %
323c0 20 31 30 30 30 30 30 30 29 20 2a 20 31 30 30 30   1000000) * 1000
323d0 3b 0a 20 20 6e 61 6e 6f 73 6c 65 65 70 28 26 73  ;.  nanosleep(&s
323e0 70 2c 20 4e 55 4c 4c 29 3b 0a 20 20 55 4e 55 53  p, NULL);.  UNUS
323f0 45 44 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f 74  ED_PARAMETER(Not
32400 55 73 65 64 29 3b 0a 20 20 72 65 74 75 72 6e 20  Used);.  return 
32410 6d 69 63 72 6f 73 65 63 6f 6e 64 73 3b 0a 23 65  microseconds;.#e
32420 6c 69 66 20 64 65 66 69 6e 65 64 28 48 41 56 45  lif defined(HAVE
32430 5f 55 53 4c 45 45 50 29 20 26 26 20 48 41 56 45  _USLEEP) && HAVE
32440 5f 55 53 4c 45 45 50 0a 20 20 75 73 6c 65 65 70  _USLEEP.  usleep
32450 28 6d 69 63 72 6f 73 65 63 6f 6e 64 73 29 3b 0a  (microseconds);.
32460 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
32470 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20 72  ER(NotUsed);.  r
32480 65 74 75 72 6e 20 6d 69 63 72 6f 73 65 63 6f 6e  eturn microsecon
32490 64 73 3b 0a 23 65 6c 73 65 0a 20 20 69 6e 74 20  ds;.#else.  int 
324a0 73 65 63 6f 6e 64 73 20 3d 20 28 6d 69 63 72 6f  seconds = (micro
324b0 73 65 63 6f 6e 64 73 2b 39 39 39 39 39 39 29 2f  seconds+999999)/
324c0 31 30 30 30 30 30 30 3b 0a 20 20 73 6c 65 65 70  1000000;.  sleep
324d0 28 73 65 63 6f 6e 64 73 29 3b 0a 20 20 55 4e 55  (seconds);.  UNU
324e0 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f  SED_PARAMETER(No
324f0 74 55 73 65 64 29 3b 0a 20 20 72 65 74 75 72 6e  tUsed);.  return
32500 20 73 65 63 6f 6e 64 73 2a 31 30 30 30 30 30 30   seconds*1000000
32510 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a  ;.#endif.}../*.*
32520 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * The following 
32530 76 61 72 69 61 62 6c 65 2c 20 69 66 20 73 65 74  variable, if set
32540 20 74 6f 20 61 20 6e 6f 6e 2d 7a 65 72 6f 20 76   to a non-zero v
32550 61 6c 75 65 2c 20 69 73 20 69 6e 74 65 72 70 72  alue, is interpr
32560 65 74 65 64 20 61 73 0a 2a 2a 20 74 68 65 20 6e  eted as.** the n
32570 75 6d 62 65 72 20 6f 66 20 73 65 63 6f 6e 64 73  umber of seconds
32580 20 73 69 6e 63 65 20 31 39 37 30 20 61 6e 64 20   since 1970 and 
32590 69 73 20 75 73 65 64 20 74 6f 20 73 65 74 20 74  is used to set t
325a0 68 65 20 72 65 73 75 6c 74 20 6f 66 0a 2a 2a 20  he result of.** 
325b0 73 71 6c 69 74 65 33 4f 73 43 75 72 72 65 6e 74  sqlite3OsCurrent
325c0 54 69 6d 65 28 29 20 64 75 72 69 6e 67 20 74 65  Time() during te
325d0 73 74 69 6e 67 2e 0a 2a 2f 0a 23 69 66 64 65 66  sting..*/.#ifdef
325e0 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 69 6e 74   SQLITE_TEST.int
325f0 20 73 71 6c 69 74 65 33 5f 63 75 72 72 65 6e 74   sqlite3_current
32600 5f 74 69 6d 65 20 3d 20 30 3b 20 20 2f 2a 20 46  _time = 0;  /* F
32610 61 6b 65 20 73 79 73 74 65 6d 20 74 69 6d 65 20  ake system time 
32620 69 6e 20 73 65 63 6f 6e 64 73 20 73 69 6e 63 65  in seconds since
32630 20 31 39 37 30 2e 20 2a 2f 0a 23 65 6e 64 69 66   1970. */.#endif
32640 0a 0a 2f 2a 0a 2a 2a 20 46 69 6e 64 20 74 68 65  ../*.** Find the
32650 20 63 75 72 72 65 6e 74 20 74 69 6d 65 20 28 69   current time (i
32660 6e 20 55 6e 69 76 65 72 73 61 6c 20 43 6f 6f 72  n Universal Coor
32670 64 69 6e 61 74 65 64 20 54 69 6d 65 29 2e 20 20  dinated Time).  
32680 57 72 69 74 65 20 69 6e 74 6f 20 2a 70 69 4e 6f  Write into *piNo
32690 77 0a 2a 2a 20 74 68 65 20 63 75 72 72 65 6e 74  w.** the current
326a0 20 74 69 6d 65 20 61 6e 64 20 64 61 74 65 20 61   time and date a
326b0 73 20 61 20 4a 75 6c 69 61 6e 20 44 61 79 20 6e  s a Julian Day n
326c0 75 6d 62 65 72 20 74 69 6d 65 73 20 38 36 5f 34  umber times 86_4
326d0 30 30 5f 30 30 30 2e 20 20 49 6e 0a 2a 2a 20 6f  00_000.  In.** o
326e0 74 68 65 72 20 77 6f 72 64 73 2c 20 77 72 69 74  ther words, writ
326f0 65 20 69 6e 74 6f 20 2a 70 69 4e 6f 77 20 74 68  e into *piNow th
32700 65 20 6e 75 6d 62 65 72 20 6f 66 20 6d 69 6c 6c  e number of mill
32710 69 73 65 63 6f 6e 64 73 20 73 69 6e 63 65 20 74  iseconds since t
32720 68 65 20 4a 75 6c 69 61 6e 0a 2a 2a 20 65 70 6f  he Julian.** epo
32730 63 68 20 6f 66 20 6e 6f 6f 6e 20 69 6e 20 47 72  ch of noon in Gr
32740 65 65 6e 77 69 63 68 20 6f 6e 20 4e 6f 76 65 6d  eenwich on Novem
32750 62 65 72 20 32 34 2c 20 34 37 31 34 20 42 2e 43  ber 24, 4714 B.C
32760 20 61 63 63 6f 72 64 69 6e 67 20 74 6f 20 74 68   according to th
32770 65 0a 2a 2a 20 70 72 6f 6c 65 70 74 69 63 20 47  e.** proleptic G
32780 72 65 67 6f 72 69 61 6e 20 63 61 6c 65 6e 64 61  regorian calenda
32790 72 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 20 73 75 63 63  r..**.** On succ
327a0 65 73 73 2c 20 72 65 74 75 72 6e 20 30 2e 20 20  ess, return 0.  
327b0 52 65 74 75 72 6e 20 31 20 69 66 20 74 68 65 20  Return 1 if the 
327c0 74 69 6d 65 20 61 6e 64 20 64 61 74 65 20 63 61  time and date ca
327d0 6e 6e 6f 74 20 62 65 20 66 6f 75 6e 64 2e 0a 2a  nnot be found..*
327e0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69  /.static int uni
327f0 78 43 75 72 72 65 6e 74 54 69 6d 65 49 6e 74 36  xCurrentTimeInt6
32800 34 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 4e  4(sqlite3_vfs *N
32810 6f 74 55 73 65 64 2c 20 73 71 6c 69 74 65 33 5f  otUsed, sqlite3_
32820 69 6e 74 36 34 20 2a 70 69 4e 6f 77 29 7b 0a 20  int64 *piNow){. 
32830 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73 71   static const sq
32840 6c 69 74 65 33 5f 69 6e 74 36 34 20 75 6e 69 78  lite3_int64 unix
32850 45 70 6f 63 68 20 3d 20 32 34 34 30 35 38 37 35  Epoch = 24405875
32860 2a 28 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 29  *(sqlite3_int64)
32870 38 36 34 30 30 30 30 3b 0a 23 69 66 20 64 65 66  8640000;.#if def
32880 69 6e 65 64 28 4e 4f 5f 47 45 54 54 4f 44 29 0a  ined(NO_GETTOD).
32890 20 20 74 69 6d 65 5f 74 20 74 3b 0a 20 20 74 69    time_t t;.  ti
328a0 6d 65 28 26 74 29 3b 0a 20 20 2a 70 69 4e 6f 77  me(&t);.  *piNow
328b0 20 3d 20 28 28 73 71 6c 69 74 65 33 5f 69 6e 74   = ((sqlite3_int
328c0 36 34 29 74 29 2a 31 30 30 30 20 2b 20 75 6e 69  64)t)*1000 + uni
328d0 78 45 70 6f 63 68 3b 0a 23 65 6c 69 66 20 4f 53  xEpoch;.#elif OS
328e0 5f 56 58 57 4f 52 4b 53 0a 20 20 73 74 72 75 63  _VXWORKS.  struc
328f0 74 20 74 69 6d 65 73 70 65 63 20 73 4e 6f 77 3b  t timespec sNow;
32900 0a 20 20 63 6c 6f 63 6b 5f 67 65 74 74 69 6d 65  .  clock_gettime
32910 28 43 4c 4f 43 4b 5f 52 45 41 4c 54 49 4d 45 2c  (CLOCK_REALTIME,
32920 20 26 73 4e 6f 77 29 3b 0a 20 20 2a 70 69 4e 6f   &sNow);.  *piNo
32930 77 20 3d 20 75 6e 69 78 45 70 6f 63 68 20 2b 20  w = unixEpoch + 
32940 31 30 30 30 2a 28 73 71 6c 69 74 65 33 5f 69 6e  1000*(sqlite3_in
32950 74 36 34 29 73 4e 6f 77 2e 74 76 5f 73 65 63 20  t64)sNow.tv_sec 
32960 2b 20 73 4e 6f 77 2e 74 76 5f 6e 73 65 63 2f 31  + sNow.tv_nsec/1
32970 30 30 30 30 30 30 3b 0a 23 65 6c 73 65 0a 20 20  000000;.#else.  
32980 73 74 72 75 63 74 20 74 69 6d 65 76 61 6c 20 73  struct timeval s
32990 4e 6f 77 3b 0a 20 20 67 65 74 74 69 6d 65 6f 66  Now;.  gettimeof
329a0 64 61 79 28 26 73 4e 6f 77 2c 20 30 29 3b 0a 20  day(&sNow, 0);. 
329b0 20 2a 70 69 4e 6f 77 20 3d 20 75 6e 69 78 45 70   *piNow = unixEp
329c0 6f 63 68 20 2b 20 31 30 30 30 2a 28 73 71 6c 69  och + 1000*(sqli
329d0 74 65 33 5f 69 6e 74 36 34 29 73 4e 6f 77 2e 74  te3_int64)sNow.t
329e0 76 5f 73 65 63 20 2b 20 73 4e 6f 77 2e 74 76 5f  v_sec + sNow.tv_
329f0 75 73 65 63 2f 31 30 30 30 3b 0a 23 65 6e 64 69  usec/1000;.#endi
32a00 66 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  f..#ifdef SQLITE
32a10 5f 54 45 53 54 0a 20 20 69 66 28 20 73 71 6c 69  _TEST.  if( sqli
32a20 74 65 33 5f 63 75 72 72 65 6e 74 5f 74 69 6d 65  te3_current_time
32a30 20 29 7b 0a 20 20 20 20 2a 70 69 4e 6f 77 20 3d   ){.    *piNow =
32a40 20 31 30 30 30 2a 28 73 71 6c 69 74 65 33 5f 69   1000*(sqlite3_i
32a50 6e 74 36 34 29 73 71 6c 69 74 65 33 5f 63 75 72  nt64)sqlite3_cur
32a60 72 65 6e 74 5f 74 69 6d 65 20 2b 20 75 6e 69 78  rent_time + unix
32a70 45 70 6f 63 68 3b 0a 20 20 7d 0a 23 65 6e 64 69  Epoch;.  }.#endi
32a80 66 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  f.  UNUSED_PARAM
32a90 45 54 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20  ETER(NotUsed);. 
32aa0 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a   return 0;.}../*
32ab0 0a 2a 2a 20 46 69 6e 64 20 74 68 65 20 63 75 72  .** Find the cur
32ac0 72 65 6e 74 20 74 69 6d 65 20 28 69 6e 20 55 6e  rent time (in Un
32ad0 69 76 65 72 73 61 6c 20 43 6f 6f 72 64 69 6e 61  iversal Coordina
32ae0 74 65 64 20 54 69 6d 65 29 2e 20 20 57 72 69 74  ted Time).  Writ
32af0 65 20 74 68 65 0a 2a 2a 20 63 75 72 72 65 6e 74  e the.** current
32b00 20 74 69 6d 65 20 61 6e 64 20 64 61 74 65 20 61   time and date a
32b10 73 20 61 20 4a 75 6c 69 61 6e 20 44 61 79 20 6e  s a Julian Day n
32b20 75 6d 62 65 72 20 69 6e 74 6f 20 2a 70 72 4e 6f  umber into *prNo
32b30 77 20 61 6e 64 0a 2a 2a 20 72 65 74 75 72 6e 20  w and.** return 
32b40 30 2e 20 20 52 65 74 75 72 6e 20 31 20 69 66 20  0.  Return 1 if 
32b50 74 68 65 20 74 69 6d 65 20 61 6e 64 20 64 61 74  the time and dat
32b60 65 20 63 61 6e 6e 6f 74 20 62 65 20 66 6f 75 6e  e cannot be foun
32b70 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
32b80 20 75 6e 69 78 43 75 72 72 65 6e 74 54 69 6d 65   unixCurrentTime
32b90 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 4e 6f  (sqlite3_vfs *No
32ba0 74 55 73 65 64 2c 20 64 6f 75 62 6c 65 20 2a 70  tUsed, double *p
32bb0 72 4e 6f 77 29 7b 0a 20 20 73 71 6c 69 74 65 33  rNow){.  sqlite3
32bc0 5f 69 6e 74 36 34 20 69 3b 0a 20 20 55 4e 55 53  _int64 i;.  UNUS
32bd0 45 44 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f 74  ED_PARAMETER(Not
32be0 55 73 65 64 29 3b 0a 20 20 75 6e 69 78 43 75 72  Used);.  unixCur
32bf0 72 65 6e 74 54 69 6d 65 49 6e 74 36 34 28 30 2c  rentTimeInt64(0,
32c00 20 26 69 29 3b 0a 20 20 2a 70 72 4e 6f 77 20 3d   &i);.  *prNow =
32c10 20 69 2f 38 36 34 30 30 30 30 30 2e 30 3b 0a 20   i/86400000.0;. 
32c20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a   return 0;.}../*
32c30 0a 2a 2a 20 57 65 20 61 64 64 65 64 20 74 68 65  .** We added the
32c40 20 78 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29   xGetLastError()
32c50 20 6d 65 74 68 6f 64 20 77 69 74 68 20 74 68 65   method with the
32c60 20 69 6e 74 65 6e 74 69 6f 6e 20 6f 66 20 70 72   intention of pr
32c70 6f 76 69 64 69 6e 67 0a 2a 2a 20 62 65 74 74 65  oviding.** bette
32c80 72 20 6c 6f 77 2d 6c 65 76 65 6c 20 65 72 72 6f  r low-level erro
32c90 72 20 6d 65 73 73 61 67 65 73 20 77 68 65 6e 20  r messages when 
32ca0 6f 70 65 72 61 74 69 6e 67 2d 73 79 73 74 65 6d  operating-system
32cb0 20 70 72 6f 62 6c 65 6d 73 20 63 6f 6d 65 20 75   problems come u
32cc0 70 0a 2a 2a 20 64 75 72 69 6e 67 20 53 51 4c 69  p.** during SQLi
32cd0 74 65 20 6f 70 65 72 61 74 69 6f 6e 2e 20 20 42  te operation.  B
32ce0 75 74 20 73 6f 20 66 61 72 2c 20 6e 6f 6e 65 20  ut so far, none 
32cf0 6f 66 20 74 68 61 74 20 68 61 73 20 62 65 65 6e  of that has been
32d00 20 69 6d 70 6c 65 6d 65 6e 74 65 64 0a 2a 2a 20   implemented.** 
32d10 69 6e 20 74 68 65 20 63 6f 72 65 2e 20 20 53 6f  in the core.  So
32d20 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
32d30 20 6e 65 76 65 72 20 63 61 6c 6c 65 64 2e 20 20   never called.  
32d40 46 6f 72 20 6e 6f 77 2c 20 69 74 20 69 73 20 6d  For now, it is m
32d50 65 72 65 6c 79 0a 2a 2a 20 61 20 70 6c 61 63 65  erely.** a place
32d60 2d 68 6f 6c 64 65 72 2e 0a 2a 2f 0a 73 74 61 74  -holder..*/.stat
32d70 69 63 20 69 6e 74 20 75 6e 69 78 47 65 74 4c 61  ic int unixGetLa
32d80 73 74 45 72 72 6f 72 28 73 71 6c 69 74 65 33 5f  stError(sqlite3_
32d90 76 66 73 20 2a 4e 6f 74 55 73 65 64 2c 20 69 6e  vfs *NotUsed, in
32da0 74 20 4e 6f 74 55 73 65 64 32 2c 20 63 68 61 72  t NotUsed2, char
32db0 20 2a 4e 6f 74 55 73 65 64 33 29 7b 0a 20 20 55   *NotUsed3){.  U
32dc0 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
32dd0 4e 6f 74 55 73 65 64 29 3b 0a 20 20 55 4e 55 53  NotUsed);.  UNUS
32de0 45 44 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f 74  ED_PARAMETER(Not
32df0 55 73 65 64 32 29 3b 0a 20 20 55 4e 55 53 45 44  Used2);.  UNUSED
32e00 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f 74 55 73  _PARAMETER(NotUs
32e10 65 64 33 29 3b 0a 20 20 72 65 74 75 72 6e 20 30  ed3);.  return 0
32e20 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 2a 2a 2a 2a 2a  ;.}.../*.*******
32e30 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
32e40 2a 20 45 6e 64 20 6f 66 20 73 71 6c 69 74 65 33  * End of sqlite3
32e50 5f 76 66 73 20 6d 65 74 68 6f 64 73 20 2a 2a 2a  _vfs methods ***
32e60 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
32e70 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a  ********.*******
32e80 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
32e90 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
32ea0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
32eb0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
32ec0 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 2a 2a 2a 2a  *******/../*****
32ed0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
32ee0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
32ef0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
32f00 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
32f10 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a  *********.******
32f20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
32f30 2a 2a 2a 2a 20 42 65 67 69 6e 20 50 72 6f 78 79  **** Begin Proxy
32f40 20 4c 6f 63 6b 69 6e 67 20 2a 2a 2a 2a 2a 2a 2a   Locking *******
32f50 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
32f60 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20  *********.**.** 
32f70 50 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 20 69 73  Proxy locking is
32f80 20 61 20 22 75 62 65 72 2d 6c 6f 63 6b 69 6e 67   a "uber-locking
32f90 2d 6d 65 74 68 6f 64 22 20 69 6e 20 74 68 69 73  -method" in this
32fa0 20 73 65 6e 73 65 3a 20 20 49 74 20 75 73 65 73   sense:  It uses
32fb0 20 74 68 65 0a 2a 2a 20 6f 74 68 65 72 20 6c 6f   the.** other lo
32fc0 63 6b 69 6e 67 20 6d 65 74 68 6f 64 73 20 6f 6e  cking methods on
32fd0 20 73 65 63 6f 6e 64 61 72 79 20 6c 6f 63 6b 20   secondary lock 
32fe0 66 69 6c 65 73 2e 20 20 50 72 6f 78 79 20 6c 6f  files.  Proxy lo
32ff0 63 6b 69 6e 67 20 69 73 20 61 0a 2a 2a 20 6d 65  cking is a.** me
33000 74 61 2d 6c 61 79 65 72 20 6f 76 65 72 20 74 6f  ta-layer over to
33010 70 20 6f 66 20 74 68 65 20 70 72 69 6d 69 74 69  p of the primiti
33020 76 65 20 6c 6f 63 6b 69 6e 67 20 69 6d 70 6c 65  ve locking imple
33030 6d 65 6e 74 65 64 20 61 62 6f 76 65 2e 20 20 46  mented above.  F
33040 6f 72 0a 2a 2a 20 74 68 69 73 20 72 65 61 73 6f  or.** this reaso
33050 6e 2c 20 74 68 65 20 64 69 76 69 73 69 6f 6e 20  n, the division 
33060 74 68 61 74 20 69 6d 70 6c 65 6d 65 6e 74 73 20  that implements 
33070 6f 66 20 70 72 6f 78 79 20 6c 6f 63 6b 69 6e 67  of proxy locking
33080 20 69 73 20 64 65 66 65 72 72 65 64 0a 2a 2a 20   is deferred.** 
33090 75 6e 74 69 6c 20 6c 61 74 65 20 69 6e 20 74 68  until late in th
330a0 65 20 66 69 6c 65 20 28 68 65 72 65 29 20 61 66  e file (here) af
330b0 74 65 72 20 61 6c 6c 20 6f 66 20 74 68 65 20 6f  ter all of the o
330c0 74 68 65 72 20 49 2f 4f 20 6d 65 74 68 6f 64 73  ther I/O methods
330d0 20 68 61 76 65 0a 2a 2a 20 62 65 65 6e 20 64 65   have.** been de
330e0 66 69 6e 65 64 20 2d 20 73 6f 20 74 68 61 74 20  fined - so that 
330f0 74 68 65 20 70 72 69 6d 69 74 69 76 65 20 6c 6f  the primitive lo
33100 63 6b 69 6e 67 20 6d 65 74 68 6f 64 73 20 61 72  cking methods ar
33110 65 20 61 76 61 69 6c 61 62 6c 65 0a 2a 2a 20 61  e available.** a
33120 73 20 73 65 72 76 69 63 65 73 20 74 6f 20 68 65  s services to he
33130 6c 70 20 77 69 74 68 20 74 68 65 20 69 6d 70 6c  lp with the impl
33140 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 70 72  ementation of pr
33150 6f 78 79 20 6c 6f 63 6b 69 6e 67 2e 0a 2a 2a 0a  oxy locking..**.
33160 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64  ****.**.** The d
33170 65 66 61 75 6c 74 20 6c 6f 63 6b 69 6e 67 20 73  efault locking s
33180 63 68 65 6d 65 73 20 69 6e 20 53 51 4c 69 74 65  chemes in SQLite
33190 20 75 73 65 20 62 79 74 65 2d 72 61 6e 67 65 20   use byte-range 
331a0 6c 6f 63 6b 73 20 6f 6e 20 74 68 65 0a 2a 2a 20  locks on the.** 
331b0 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 74 6f  database file to
331c0 20 63 6f 6f 72 64 69 6e 61 74 65 20 73 61 66 65   coordinate safe
331d0 2c 20 63 6f 6e 63 75 72 72 65 6e 74 20 61 63 63  , concurrent acc
331e0 65 73 73 20 62 79 20 6d 75 6c 74 69 70 6c 65 20  ess by multiple 
331f0 72 65 61 64 65 72 73 0a 2a 2a 20 61 6e 64 20 77  readers.** and w
33200 72 69 74 65 72 73 20 5b 68 74 74 70 3a 2f 2f 73  riters [http://s
33210 71 6c 69 74 65 2e 6f 72 67 2f 6c 6f 63 6b 69 6e  qlite.org/lockin
33220 67 76 33 2e 68 74 6d 6c 5d 2e 20 20 54 68 65 20  gv3.html].  The 
33230 66 69 76 65 20 66 69 6c 65 20 6c 6f 63 6b 69 6e  five file lockin
33240 67 0a 2a 2a 20 73 74 61 74 65 73 20 28 55 4e 4c  g.** states (UNL
33250 4f 43 4b 45 44 2c 20 50 45 4e 44 49 4e 47 2c 20  OCKED, PENDING, 
33260 53 48 41 52 45 44 2c 20 52 45 53 45 52 56 45 44  SHARED, RESERVED
33270 2c 20 45 58 43 4c 55 53 49 56 45 29 20 61 72 65  , EXCLUSIVE) are
33280 20 69 6d 70 6c 65 6d 65 6e 74 65 64 0a 2a 2a 20   implemented.** 
33290 61 73 20 50 4f 53 49 58 20 72 65 61 64 20 26 20  as POSIX read & 
332a0 77 72 69 74 65 20 6c 6f 63 6b 73 20 6f 76 65 72  write locks over
332b0 20 66 69 78 65 64 20 73 65 74 20 6f 66 20 6c 6f   fixed set of lo
332c0 63 61 74 69 6f 6e 73 20 28 76 69 61 20 66 73 63  cations (via fsc
332d0 74 6c 29 2c 0a 2a 2a 20 6f 6e 20 41 46 50 20 61  tl),.** on AFP a
332e0 6e 64 20 53 4d 42 20 6f 6e 6c 79 20 65 78 63 6c  nd SMB only excl
332f0 75 73 69 76 65 20 62 79 74 65 2d 72 61 6e 67 65  usive byte-range
33300 20 6c 6f 63 6b 73 20 61 72 65 20 61 76 61 69 6c   locks are avail
33310 61 62 6c 65 20 76 69 61 20 66 73 63 74 6c 0a 2a  able via fsctl.*
33320 2a 20 77 69 74 68 20 5f 49 4f 57 52 28 27 7a 27  * with _IOWR('z'
33330 2c 20 32 33 2c 20 73 74 72 75 63 74 20 42 79 74  , 23, struct Byt
33340 65 52 61 6e 67 65 4c 6f 63 6b 50 42 32 29 20 74  eRangeLockPB2) t
33350 6f 20 74 72 61 63 6b 20 74 68 65 20 73 61 6d 65  o track the same
33360 20 35 20 73 74 61 74 65 73 2e 0a 2a 2a 20 54 6f   5 states..** To
33370 20 73 69 6d 75 6c 61 74 65 20 61 20 46 5f 52 44   simulate a F_RD
33380 4c 43 4b 20 6f 6e 20 74 68 65 20 73 68 61 72 65  LCK on the share
33390 64 20 72 61 6e 67 65 2c 20 6f 6e 20 41 46 50 20  d range, on AFP 
333a0 61 20 72 61 6e 64 6f 6d 6c 79 20 73 65 6c 65 63  a randomly selec
333b0 74 65 64 0a 2a 2a 20 61 64 64 72 65 73 73 20 69  ted.** address i
333c0 6e 20 74 68 65 20 73 68 61 72 65 64 20 72 61 6e  n the shared ran
333d0 67 65 20 69 73 20 74 61 6b 65 6e 20 66 6f 72 20  ge is taken for 
333e0 61 20 53 48 41 52 45 44 20 6c 6f 63 6b 2c 20 74  a SHARED lock, t
333f0 68 65 20 65 6e 74 69 72 65 0a 2a 2a 20 73 68 61  he entire.** sha
33400 72 65 64 20 72 61 6e 67 65 20 69 73 20 74 61 6b  red range is tak
33410 65 6e 20 66 6f 72 20 61 6e 20 45 58 43 4c 55 53  en for an EXCLUS
33420 49 56 45 20 6c 6f 63 6b 29 3a 0a 2a 2a 0a 2a 2a  IVE lock):.**.**
33430 20 20 20 20 20 20 50 45 4e 44 49 4e 47 5f 42 59        PENDING_BY
33440 54 45 20 20 20 20 20 20 20 20 30 78 34 30 30 30  TE        0x4000
33450 30 30 30 30 09 09 20 20 20 09 0a 2a 2a 20 20 20  0000..   ..**   
33460 20 20 20 52 45 53 45 52 56 45 44 5f 42 59 54 45     RESERVED_BYTE
33470 20 20 20 20 20 20 20 30 78 34 30 30 30 30 30 30         0x4000000
33480 31 0a 2a 2a 20 20 20 20 20 20 53 48 41 52 45 44  1.**      SHARED
33490 5f 52 41 4e 47 45 20 20 20 20 20 20 20 20 30 78  _RANGE        0x
334a0 34 30 30 30 30 30 30 32 20 2d 3e 20 30 78 34 30  40000002 -> 0x40
334b0 30 30 30 32 30 30 0a 2a 2a 0a 2a 2a 20 54 68 69  000200.**.** Thi
334c0 73 20 77 6f 72 6b 73 20 77 65 6c 6c 20 6f 6e 20  s works well on 
334d0 74 68 65 20 6c 6f 63 61 6c 20 66 69 6c 65 20 73  the local file s
334e0 79 73 74 65 6d 2c 20 62 75 74 20 73 68 6f 77 73  ystem, but shows
334f0 20 61 20 6e 65 61 72 6c 79 20 31 30 30 78 0a 2a   a nearly 100x.*
33500 2a 20 73 6c 6f 77 64 6f 77 6e 20 69 6e 20 72 65  * slowdown in re
33510 61 64 20 70 65 72 66 6f 72 6d 61 6e 63 65 20 6f  ad performance o
33520 6e 20 41 46 50 20 62 65 63 61 75 73 65 20 74 68  n AFP because th
33530 65 20 41 46 50 20 63 6c 69 65 6e 74 20 64 69 73  e AFP client dis
33540 61 62 6c 65 73 0a 2a 2a 20 74 68 65 20 72 65 61  ables.** the rea
33550 64 20 63 61 63 68 65 20 77 68 65 6e 20 62 79 74  d cache when byt
33560 65 2d 72 61 6e 67 65 20 6c 6f 63 6b 73 20 61 72  e-range locks ar
33570 65 20 70 72 65 73 65 6e 74 2e 20 20 45 6e 61 62  e present.  Enab
33580 6c 69 6e 67 20 74 68 65 20 72 65 61 64 0a 2a 2a  ling the read.**
33590 20 63 61 63 68 65 20 65 78 70 6f 73 65 73 20 61   cache exposes a
335a0 20 63 61 63 68 65 20 63 6f 68 65 72 65 6e 63 79   cache coherency
335b0 20 70 72 6f 62 6c 65 6d 20 74 68 61 74 20 69 73   problem that is
335c0 20 70 72 65 73 65 6e 74 20 6f 6e 20 61 6c 6c 20   present on all 
335d0 4f 53 20 58 0a 2a 2a 20 73 75 70 70 6f 72 74 65  OS X.** supporte
335e0 64 20 6e 65 74 77 6f 72 6b 20 66 69 6c 65 20 73  d network file s
335f0 79 73 74 65 6d 73 2e 20 20 4e 46 53 20 61 6e 64  ystems.  NFS and
33600 20 41 46 50 20 62 6f 74 68 20 6f 62 73 65 72 76   AFP both observ
33610 65 20 74 68 65 0a 2a 2a 20 63 6c 6f 73 65 2d 74  e the.** close-t
33620 6f 2d 6f 70 65 6e 20 73 65 6d 61 6e 74 69 63 73  o-open semantics
33630 20 66 6f 72 20 65 6e 73 75 72 69 6e 67 20 63 61   for ensuring ca
33640 63 68 65 20 63 6f 68 65 72 65 6e 63 79 0a 2a 2a  che coherency.**
33650 20 5b 68 74 74 70 3a 2f 2f 6e 66 73 2e 73 6f 75   [http://nfs.sou
33660 72 63 65 66 6f 72 67 65 2e 6e 65 74 2f 23 66 61  rceforge.net/#fa
33670 71 5f 61 38 5d 2c 20 77 68 69 63 68 20 64 6f 65  q_a8], which doe
33680 73 20 6e 6f 74 20 65 66 66 65 63 74 69 76 65 6c  s not effectivel
33690 79 0a 2a 2a 20 61 64 64 72 65 73 73 20 74 68 65  y.** address the
336a0 20 72 65 71 75 69 72 65 6d 65 6e 74 73 20 66 6f   requirements fo
336b0 72 20 63 6f 6e 63 75 72 72 65 6e 74 20 64 61 74  r concurrent dat
336c0 61 62 61 73 65 20 61 63 63 65 73 73 20 62 79 20  abase access by 
336d0 6d 75 6c 74 69 70 6c 65 0a 2a 2a 20 72 65 61 64  multiple.** read
336e0 65 72 73 20 61 6e 64 20 77 72 69 74 65 72 73 0a  ers and writers.
336f0 2a 2a 20 5b 68 74 74 70 3a 2f 2f 77 77 77 2e 6e  ** [http://www.n
33700 61 62 62 6c 65 2e 63 6f 6d 2f 53 51 4c 69 74 65  abble.com/SQLite
33710 2d 6f 6e 2d 4e 46 53 2d 63 61 63 68 65 2d 63 6f  -on-NFS-cache-co
33720 68 65 72 65 6e 63 79 2d 74 64 31 35 36 35 35 37  herency-td156557
33730 30 31 2e 68 74 6d 6c 5d 2e 0a 2a 2a 0a 2a 2a 20  01.html]..**.** 
33740 54 6f 20 61 64 64 72 65 73 73 20 74 68 65 20 70  To address the p
33750 65 72 66 6f 72 6d 61 6e 63 65 20 61 6e 64 20 63  erformance and c
33760 61 63 68 65 20 63 6f 68 65 72 65 6e 63 79 20 69  ache coherency i
33770 73 73 75 65 73 2c 20 70 72 6f 78 79 20 66 69 6c  ssues, proxy fil
33780 65 20 6c 6f 63 6b 69 6e 67 0a 2a 2a 20 63 68 61  e locking.** cha
33790 6e 67 65 73 20 74 68 65 20 77 61 79 20 64 61 74  nges the way dat
337a0 61 62 61 73 65 20 61 63 63 65 73 73 20 69 73 20  abase access is 
337b0 63 6f 6e 74 72 6f 6c 6c 65 64 20 62 79 20 6c 69  controlled by li
337c0 6d 69 74 69 6e 67 20 61 63 63 65 73 73 20 74 6f  miting access to
337d0 20 61 0a 2a 2a 20 73 69 6e 67 6c 65 20 68 6f 73   a.** single hos
337e0 74 20 61 74 20 61 20 74 69 6d 65 20 61 6e 64 20  t at a time and 
337f0 6d 6f 76 69 6e 67 20 66 69 6c 65 20 6c 6f 63 6b  moving file lock
33800 73 20 6f 66 66 20 6f 66 20 74 68 65 20 64 61 74  s off of the dat
33810 61 62 61 73 65 20 66 69 6c 65 0a 2a 2a 20 61 6e  abase file.** an
33820 64 20 6f 6e 74 6f 20 61 20 70 72 6f 78 79 20 66  d onto a proxy f
33830 69 6c 65 20 6f 6e 20 74 68 65 20 6c 6f 63 61 6c  ile on the local
33840 20 66 69 6c 65 20 73 79 73 74 65 6d 2e 20 20 0a   file system.  .
33850 2a 2a 0a 2a 2a 0a 2a 2a 20 55 73 69 6e 67 20 70  **.**.** Using p
33860 72 6f 78 79 20 6c 6f 63 6b 73 0a 2a 2a 20 2d 2d  roxy locks.** --
33870 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
33880 2a 2a 0a 2a 2a 20 43 20 41 50 49 73 0a 2a 2a 0a  **.** C APIs.**.
33890 2a 2a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65  **  sqlite3_file
338a0 5f 63 6f 6e 74 72 6f 6c 28 64 62 2c 20 64 62 6e  _control(db, dbn
338b0 61 6d 65 2c 20 53 51 4c 49 54 45 5f 53 45 54 5f  ame, SQLITE_SET_
338c0 4c 4f 43 4b 50 52 4f 58 59 46 49 4c 45 2c 0a 2a  LOCKPROXYFILE,.*
338d0 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
338e0 20 20 20 20 20 20 20 20 3c 70 72 6f 78 79 5f 70          <proxy_p
338f0 61 74 68 3e 20 7c 20 22 3a 61 75 74 6f 3a 22 29  ath> | ":auto:")
33900 3b 0a 2a 2a 20 20 73 71 6c 69 74 65 33 5f 66 69  ;.**  sqlite3_fi
33910 6c 65 5f 63 6f 6e 74 72 6f 6c 28 64 62 2c 20 64  le_control(db, d
33920 62 6e 61 6d 65 2c 20 53 51 4c 49 54 45 5f 47 45  bname, SQLITE_GE
33930 54 5f 4c 4f 43 4b 50 52 4f 58 59 46 49 4c 45 2c  T_LOCKPROXYFILE,
33940 20 26 3c 70 72 6f 78 79 5f 70 61 74 68 3e 29 3b   &<proxy_path>);
33950 0a 2a 2a 0a 2a 2a 0a 2a 2a 20 53 51 4c 20 70 72  .**.**.** SQL pr
33960 61 67 6d 61 73 0a 2a 2a 0a 2a 2a 20 20 50 52 41  agmas.**.**  PRA
33970 47 4d 41 20 5b 64 61 74 61 62 61 73 65 2e 5d 6c  GMA [database.]l
33980 6f 63 6b 5f 70 72 6f 78 79 5f 66 69 6c 65 3d 3c  ock_proxy_file=<
33990 70 72 6f 78 79 5f 70 61 74 68 3e 20 7c 20 3a 61  proxy_path> | :a
339a0 75 74 6f 3a 0a 2a 2a 20 20 50 52 41 47 4d 41 20  uto:.**  PRAGMA 
339b0 5b 64 61 74 61 62 61 73 65 2e 5d 6c 6f 63 6b 5f  [database.]lock_
339c0 70 72 6f 78 79 5f 66 69 6c 65 0a 2a 2a 0a 2a 2a  proxy_file.**.**
339d0 20 53 70 65 63 69 66 79 69 6e 67 20 22 3a 61 75   Specifying ":au
339e0 74 6f 3a 22 20 6d 65 61 6e 73 20 74 68 61 74 20  to:" means that 
339f0 69 66 20 74 68 65 72 65 20 69 73 20 61 20 63 6f  if there is a co
33a00 6e 63 68 20 66 69 6c 65 20 77 69 74 68 20 61 20  nch file with a 
33a10 6d 61 74 63 68 69 6e 67 0a 2a 2a 20 68 6f 73 74  matching.** host
33a20 20 49 44 20 69 6e 20 69 74 2c 20 74 68 65 20 70   ID in it, the p
33a30 72 6f 78 79 20 70 61 74 68 20 69 6e 20 74 68 65  roxy path in the
33a40 20 63 6f 6e 63 68 20 66 69 6c 65 20 77 69 6c 6c   conch file will
33a50 20 62 65 20 75 73 65 64 2c 20 6f 74 68 65 72 77   be used, otherw
33a60 69 73 65 0a 2a 2a 20 61 20 70 72 6f 78 79 20 70  ise.** a proxy p
33a70 61 74 68 20 62 61 73 65 64 20 6f 6e 20 74 68 65  ath based on the
33a80 20 75 73 65 72 27 73 20 74 65 6d 70 20 64 69 72   user's temp dir
33a90 0a 2a 2a 20 28 76 69 61 20 63 6f 6e 66 73 74 72  .** (via confstr
33aa0 28 5f 43 53 5f 44 41 52 57 49 4e 5f 55 53 45 52  (_CS_DARWIN_USER
33ab0 5f 54 45 4d 50 5f 44 49 52 2c 2e 2e 2e 29 29 20  _TEMP_DIR,...)) 
33ac0 77 69 6c 6c 20 62 65 20 75 73 65 64 20 61 6e 64  will be used and
33ad0 20 74 68 65 0a 2a 2a 20 61 63 74 75 61 6c 20 70   the.** actual p
33ae0 72 6f 78 79 20 66 69 6c 65 20 6e 61 6d 65 20 69  roxy file name i
33af0 73 20 67 65 6e 65 72 61 74 65 64 20 66 72 6f 6d  s generated from
33b00 20 74 68 65 20 6e 61 6d 65 20 61 6e 64 20 70 61   the name and pa
33b10 74 68 20 6f 66 20 74 68 65 0a 2a 2a 20 64 61 74  th of the.** dat
33b20 61 62 61 73 65 20 66 69 6c 65 2e 20 20 46 6f 72  abase file.  For
33b30 20 65 78 61 6d 70 6c 65 3a 0a 2a 2a 0a 2a 2a 20   example:.**.** 
33b40 20 20 20 20 20 20 46 6f 72 20 64 61 74 61 62 61        For databa
33b50 73 65 20 70 61 74 68 20 22 2f 55 73 65 72 73 2f  se path "/Users/
33b60 6d 65 2f 66 6f 6f 2e 64 62 22 20 0a 2a 2a 20 20  me/foo.db" .**  
33b70 20 20 20 20 20 54 68 65 20 6c 6f 63 6b 20 70 61       The lock pa
33b80 74 68 20 77 69 6c 6c 20 62 65 20 22 3c 74 6d 70  th will be "<tmp
33b90 64 69 72 3e 2f 73 71 6c 69 74 65 70 6c 6f 63 6b  dir>/sqliteplock
33ba0 73 2f 5f 55 73 65 72 73 5f 6d 65 5f 66 6f 6f 2e  s/_Users_me_foo.
33bb0 64 62 3a 61 75 74 6f 3a 22 29 0a 2a 2a 0a 2a 2a  db:auto:").**.**
33bc0 20 4f 6e 63 65 20 61 20 6c 6f 63 6b 20 70 72 6f   Once a lock pro
33bd0 78 79 20 69 73 20 63 6f 6e 66 69 67 75 72 65 64  xy is configured
33be0 20 66 6f 72 20 61 20 64 61 74 61 62 61 73 65 20   for a database 
33bf0 63 6f 6e 6e 65 63 74 69 6f 6e 2c 20 69 74 20 63  connection, it c
33c00 61 6e 20 6e 6f 74 0a 2a 2a 20 62 65 20 72 65 6d  an not.** be rem
33c10 6f 76 65 64 2c 20 68 6f 77 65 76 65 72 20 69 74  oved, however it
33c20 20 6d 61 79 20 62 65 20 73 77 69 74 63 68 65 64   may be switched
33c30 20 74 6f 20 61 20 64 69 66 66 65 72 65 6e 74 20   to a different 
33c40 70 72 6f 78 79 20 70 61 74 68 20 76 69 61 0a 2a  proxy path via.*
33c50 2a 20 74 68 65 20 61 62 6f 76 65 20 41 50 49 73  * the above APIs
33c60 20 28 61 73 73 75 6d 69 6e 67 20 74 68 65 20 63   (assuming the c
33c70 6f 6e 63 68 20 66 69 6c 65 20 69 73 20 6e 6f 74  onch file is not
33c80 20 62 65 69 6e 67 20 68 65 6c 64 20 62 79 20 61   being held by a
33c90 6e 6f 74 68 65 72 0a 2a 2a 20 63 6f 6e 6e 65 63  nother.** connec
33ca0 74 69 6f 6e 20 6f 72 20 70 72 6f 63 65 73 73 29  tion or process)
33cb0 2e 20 0a 2a 2a 0a 2a 2a 0a 2a 2a 20 48 6f 77 20  . .**.**.** How 
33cc0 70 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 20 77 6f  proxy locking wo
33cd0 72 6b 73 0a 2a 2a 20 2d 2d 2d 2d 2d 2d 2d 2d 2d  rks.** ---------
33ce0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a  --------------.*
33cf0 2a 0a 2a 2a 20 50 72 6f 78 79 20 66 69 6c 65 20  *.** Proxy file 
33d00 6c 6f 63 6b 69 6e 67 20 72 65 6c 69 65 73 20 70  locking relies p
33d10 72 69 6d 61 72 69 6c 79 20 6f 6e 20 74 77 6f 20  rimarily on two 
33d20 6e 65 77 20 73 75 70 70 6f 72 74 69 6e 67 20 66  new supporting f
33d30 69 6c 65 73 3a 20 0a 2a 2a 0a 2a 2a 20 20 20 2a  iles: .**.**   *
33d40 20 20 63 6f 6e 63 68 20 66 69 6c 65 20 74 6f 20    conch file to 
33d50 6c 69 6d 69 74 20 61 63 63 65 73 73 20 74 6f 20  limit access to 
33d60 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
33d70 65 20 74 6f 20 61 20 73 69 6e 67 6c 65 20 68 6f  e to a single ho
33d80 73 74 0a 2a 2a 20 20 20 20 20 20 61 74 20 61 20  st.**      at a 
33d90 74 69 6d 65 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 20  time.**.**   *  
33da0 70 72 6f 78 79 20 66 69 6c 65 20 74 6f 20 61 63  proxy file to ac
33db0 74 20 61 73 20 61 20 70 72 6f 78 79 20 66 6f 72  t as a proxy for
33dc0 20 74 68 65 20 61 64 76 69 73 6f 72 79 20 6c 6f   the advisory lo
33dd0 63 6b 73 20 6e 6f 72 6d 61 6c 6c 79 0a 2a 2a 20  cks normally.** 
33de0 20 20 20 20 20 74 61 6b 65 6e 20 6f 6e 20 74 68       taken on th
33df0 65 20 64 61 74 61 62 61 73 65 0a 2a 2a 0a 2a 2a  e database.**.**
33e00 20 54 68 65 20 63 6f 6e 63 68 20 66 69 6c 65 20   The conch file 
33e10 2d 20 74 6f 20 75 73 65 20 61 20 70 72 6f 78 79  - to use a proxy
33e20 20 66 69 6c 65 2c 20 73 71 6c 69 74 65 20 6d 75   file, sqlite mu
33e30 73 74 20 66 69 72 73 74 20 22 68 6f 6c 64 20 74  st first "hold t
33e40 68 65 20 63 6f 6e 63 68 22 0a 2a 2a 20 62 79 20  he conch".** by 
33e50 74 61 6b 69 6e 67 20 61 6e 20 73 71 6c 69 74 65  taking an sqlite
33e60 2d 73 74 79 6c 65 20 73 68 61 72 65 64 20 6c 6f  -style shared lo
33e70 63 6b 20 6f 6e 20 74 68 65 20 63 6f 6e 63 68 20  ck on the conch 
33e80 66 69 6c 65 2c 20 72 65 61 64 69 6e 67 20 74 68  file, reading th
33e90 65 0a 2a 2a 20 63 6f 6e 74 65 6e 74 73 20 61 6e  e.** contents an
33ea0 64 20 63 6f 6d 70 61 72 69 6e 67 20 74 68 65 20  d comparing the 
33eb0 68 6f 73 74 27 73 20 75 6e 69 71 75 65 20 68 6f  host's unique ho
33ec0 73 74 20 49 44 20 28 73 65 65 20 62 65 6c 6f 77  st ID (see below
33ed0 29 20 61 6e 64 20 6c 6f 63 6b 0a 2a 2a 20 70 72  ) and lock.** pr
33ee0 6f 78 79 20 70 61 74 68 20 61 67 61 69 6e 73 74  oxy path against
33ef0 20 74 68 65 20 76 61 6c 75 65 73 20 73 74 6f 72   the values stor
33f00 65 64 20 69 6e 20 74 68 65 20 63 6f 6e 63 68 2e  ed in the conch.
33f10 20 20 54 68 65 20 63 6f 6e 63 68 20 66 69 6c 65    The conch file
33f20 20 69 73 0a 2a 2a 20 73 74 6f 72 65 64 20 69 6e   is.** stored in
33f30 20 74 68 65 20 73 61 6d 65 20 64 69 72 65 63 74   the same direct
33f40 6f 72 79 20 61 73 20 74 68 65 20 64 61 74 61 62  ory as the datab
33f50 61 73 65 20 66 69 6c 65 20 61 6e 64 20 74 68 65  ase file and the
33f60 20 66 69 6c 65 20 6e 61 6d 65 0a 2a 2a 20 69 73   file name.** is
33f70 20 70 61 74 74 65 72 6e 65 64 20 61 66 74 65 72   patterned after
33f80 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
33f90 6c 65 20 6e 61 6d 65 20 61 73 20 22 2e 3c 64 61  le name as ".<da
33fa0 74 61 62 61 73 65 6e 61 6d 65 3e 2d 63 6f 6e 63  tabasename>-conc
33fb0 68 22 2e 0a 2a 2a 20 49 66 20 74 68 65 20 63 6f  h"..** If the co
33fc0 6e 63 68 20 66 69 6c 65 20 64 6f 65 73 20 6e 6f  nch file does no
33fd0 74 20 65 78 69 73 74 2c 20 6f 72 20 69 74 27 73  t exist, or it's
33fe0 20 63 6f 6e 74 65 6e 74 73 20 64 6f 20 6e 6f 74   contents do not
33ff0 20 6d 61 74 63 68 20 74 68 65 0a 2a 2a 20 68 6f   match the.** ho
34000 73 74 20 49 44 20 61 6e 64 2f 6f 72 20 70 72 6f  st ID and/or pro
34010 78 79 20 70 61 74 68 2c 20 74 68 65 6e 20 74 68  xy path, then th
34020 65 20 6c 6f 63 6b 20 69 73 20 65 73 63 61 6c 61  e lock is escala
34030 74 65 64 20 74 6f 20 61 6e 20 65 78 63 6c 75 73  ted to an exclus
34040 69 76 65 0a 2a 2a 20 6c 6f 63 6b 20 61 6e 64 20  ive.** lock and 
34050 74 68 65 20 63 6f 6e 63 68 20 66 69 6c 65 20 63  the conch file c
34060 6f 6e 74 65 6e 74 73 20 69 73 20 75 70 64 61 74  ontents is updat
34070 65 64 20 77 69 74 68 20 74 68 65 20 68 6f 73 74  ed with the host
34080 20 49 44 20 61 6e 64 20 70 72 6f 78 79 0a 2a 2a   ID and proxy.**
34090 20 70 61 74 68 20 61 6e 64 20 74 68 65 20 6c 6f   path and the lo
340a0 63 6b 20 69 73 20 64 6f 77 6e 67 72 61 64 65 64  ck is downgraded
340b0 20 74 6f 20 61 20 73 68 61 72 65 64 20 6c 6f 63   to a shared loc
340c0 6b 20 61 67 61 69 6e 2e 20 20 49 66 20 74 68 65  k again.  If the
340d0 20 63 6f 6e 63 68 0a 2a 2a 20 69 73 20 68 65 6c   conch.** is hel
340e0 64 20 62 79 20 61 6e 6f 74 68 65 72 20 70 72 6f  d by another pro
340f0 63 65 73 73 20 28 77 69 74 68 20 61 20 73 68 61  cess (with a sha
34100 72 65 64 20 6c 6f 63 6b 29 2c 20 74 68 65 20 65  red lock), the e
34110 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 0a 2a 2a  xclusive lock.**
34120 20 77 69 6c 6c 20 66 61 69 6c 20 61 6e 64 20 53   will fail and S
34130 51 4c 49 54 45 5f 42 55 53 59 20 69 73 20 72 65  QLITE_BUSY is re
34140 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68  turned..**.** Th
34150 65 20 70 72 6f 78 79 20 66 69 6c 65 20 2d 20 61  e proxy file - a
34160 20 73 69 6e 67 6c 65 2d 62 79 74 65 20 66 69 6c   single-byte fil
34170 65 20 75 73 65 64 20 66 6f 72 20 61 6c 6c 20 61  e used for all a
34180 64 76 69 73 6f 72 79 20 66 69 6c 65 20 6c 6f 63  dvisory file loc
34190 6b 73 0a 2a 2a 20 6e 6f 72 6d 61 6c 6c 79 20 74  ks.** normally t
341a0 61 6b 65 6e 20 6f 6e 20 74 68 65 20 64 61 74 61  aken on the data
341b0 62 61 73 65 20 66 69 6c 65 2e 20 20 20 54 68 69  base file.   Thi
341c0 73 20 61 6c 6c 6f 77 73 20 66 6f 72 20 73 61 66  s allows for saf
341d0 65 20 73 68 61 72 69 6e 67 0a 2a 2a 20 6f 66 20  e sharing.** of 
341e0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
341f0 65 20 66 6f 72 20 6d 75 6c 74 69 70 6c 65 20 72  e for multiple r
34200 65 61 64 65 72 73 20 61 6e 64 20 77 72 69 74 65  eaders and write
34210 72 73 20 6f 6e 20 74 68 65 20 73 61 6d 65 0a 2a  rs on the same.*
34220 2a 20 68 6f 73 74 20 28 74 68 65 20 63 6f 6e 63  * host (the conc
34230 68 20 65 6e 73 75 72 65 73 20 74 68 61 74 20 74  h ensures that t
34240 68 65 79 20 61 6c 6c 20 75 73 65 20 74 68 65 20  hey all use the 
34250 73 61 6d 65 20 6c 6f 63 61 6c 20 6c 6f 63 6b 20  same local lock 
34260 66 69 6c 65 29 2e 0a 2a 2a 0a 2a 2a 20 52 65 71  file)..**.** Req
34270 75 65 73 74 69 6e 67 20 74 68 65 20 6c 6f 63 6b  uesting the lock
34280 20 70 72 6f 78 79 20 64 6f 65 73 20 6e 6f 74 20   proxy does not 
34290 69 6d 6d 65 64 69 61 74 65 6c 79 20 74 61 6b 65  immediately take
342a0 20 74 68 65 20 63 6f 6e 63 68 2c 20 69 74 20 69   the conch, it i
342b0 73 0a 2a 2a 20 6f 6e 6c 79 20 74 61 6b 65 6e 20  s.** only taken 
342c0 77 68 65 6e 20 74 68 65 20 66 69 72 73 74 20 72  when the first r
342d0 65 71 75 65 73 74 20 74 6f 20 6c 6f 63 6b 20 64  equest to lock d
342e0 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 73 20  atabase file is 
342f0 6d 61 64 65 2e 20 20 0a 2a 2a 20 54 68 69 73 20  made.  .** This 
34300 6d 61 74 63 68 65 73 20 74 68 65 20 73 65 6d 61  matches the sema
34310 6e 74 69 63 73 20 6f 66 20 74 68 65 20 74 72 61  ntics of the tra
34320 64 69 74 69 6f 6e 61 6c 20 6c 6f 63 6b 69 6e 67  ditional locking
34330 20 62 65 68 61 76 69 6f 72 2c 20 77 68 65 72 65   behavior, where
34340 0a 2a 2a 20 6f 70 65 6e 69 6e 67 20 61 20 63 6f  .** opening a co
34350 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 61 20 64 61  nnection to a da
34360 74 61 62 61 73 65 20 66 69 6c 65 20 64 6f 65 73  tabase file does
34370 20 6e 6f 74 20 74 61 6b 65 20 61 20 6c 6f 63 6b   not take a lock
34380 20 6f 6e 20 69 74 2e 0a 2a 2a 20 54 68 65 20 73   on it..** The s
34390 68 61 72 65 64 20 6c 6f 63 6b 20 61 6e 64 20 61  hared lock and a
343a0 6e 20 6f 70 65 6e 20 66 69 6c 65 20 64 65 73 63  n open file desc
343b0 72 69 70 74 6f 72 20 61 72 65 20 6d 61 69 6e 74  riptor are maint
343c0 61 69 6e 65 64 20 75 6e 74 69 6c 20 0a 2a 2a 20  ained until .** 
343d0 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74  the connection t
343e0 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69  o the database i
343f0 73 20 63 6c 6f 73 65 64 2e 20 0a 2a 2a 0a 2a 2a  s closed. .**.**
34400 20 54 68 65 20 70 72 6f 78 79 20 66 69 6c 65 20   The proxy file 
34410 61 6e 64 20 74 68 65 20 6c 6f 63 6b 20 66 69 6c  and the lock fil
34420 65 20 61 72 65 20 6e 65 76 65 72 20 64 65 6c 65  e are never dele
34430 74 65 64 20 73 6f 20 74 68 65 79 20 6f 6e 6c 79  ted so they only
34440 20 6e 65 65 64 0a 2a 2a 20 74 6f 20 62 65 20 63   need.** to be c
34450 72 65 61 74 65 64 20 74 68 65 20 66 69 72 73 74  reated the first
34460 20 74 69 6d 65 20 74 68 65 79 20 61 72 65 20 75   time they are u
34470 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 43 6f 6e 66 69  sed..**.** Confi
34480 67 75 72 61 74 69 6f 6e 20 6f 70 74 69 6f 6e 73  guration options
34490 0a 2a 2a 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  .** ------------
344a0 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 0a 2a 2a 20  ---------.**.** 
344b0 20 53 51 4c 49 54 45 5f 50 52 45 46 45 52 5f 50   SQLITE_PREFER_P
344c0 52 4f 58 59 5f 4c 4f 43 4b 49 4e 47 0a 2a 2a 0a  ROXY_LOCKING.**.
344d0 2a 2a 20 20 20 20 20 20 20 44 61 74 61 62 61 73  **       Databas
344e0 65 20 66 69 6c 65 73 20 61 63 63 65 73 73 65 64  e files accessed
344f0 20 6f 6e 20 6e 6f 6e 2d 6c 6f 63 61 6c 20 66 69   on non-local fi
34500 6c 65 20 73 79 73 74 65 6d 73 20 61 72 65 0a 2a  le systems are.*
34510 2a 20 20 20 20 20 20 20 61 75 74 6f 6d 61 74 69  *       automati
34520 63 61 6c 6c 79 20 63 6f 6e 66 69 67 75 72 65 64  cally configured
34530 20 66 6f 72 20 70 72 6f 78 79 20 6c 6f 63 6b 69   for proxy locki
34540 6e 67 2c 20 6c 6f 63 6b 20 66 69 6c 65 73 20 61  ng, lock files a
34550 72 65 0a 2a 2a 20 20 20 20 20 20 20 6e 61 6d 65  re.**       name
34560 64 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20  d automatically 
34570 75 73 69 6e 67 20 74 68 65 20 73 61 6d 65 20 6c  using the same l
34580 6f 67 69 63 20 61 73 0a 2a 2a 20 20 20 20 20 20  ogic as.**      
34590 20 50 52 41 47 4d 41 20 6c 6f 63 6b 5f 70 72 6f   PRAGMA lock_pro
345a0 78 79 5f 66 69 6c 65 3d 22 3a 61 75 74 6f 3a 22  xy_file=":auto:"
345b0 0a 2a 2a 20 20 20 20 0a 2a 2a 20 20 53 51 4c 49  .**    .**  SQLI
345c0 54 45 5f 50 52 4f 58 59 5f 44 45 42 55 47 0a 2a  TE_PROXY_DEBUG.*
345d0 2a 0a 2a 2a 20 20 20 20 20 20 20 45 6e 61 62 6c  *.**       Enabl
345e0 65 73 20 74 68 65 20 6c 6f 67 67 69 6e 67 20 6f  es the logging o
345f0 66 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 73  f error messages
34600 20 64 75 72 69 6e 67 20 68 6f 73 74 20 69 64 20   during host id 
34610 66 69 6c 65 0a 2a 2a 20 20 20 20 20 20 20 72 65  file.**       re
34620 74 72 69 65 76 61 6c 20 61 6e 64 20 63 72 65 61  trieval and crea
34630 74 69 6f 6e 0a 2a 2a 0a 2a 2a 20 20 4c 4f 43 4b  tion.**.**  LOCK
34640 50 52 4f 58 59 44 49 52 0a 2a 2a 0a 2a 2a 20 20  PROXYDIR.**.**  
34650 20 20 20 20 20 4f 76 65 72 72 69 64 65 73 20 74       Overrides t
34660 68 65 20 64 65 66 61 75 6c 74 20 64 69 72 65 63  he default direc
34670 74 6f 72 79 20 75 73 65 64 20 66 6f 72 20 6c 6f  tory used for lo
34680 63 6b 20 70 72 6f 78 79 20 66 69 6c 65 73 20 74  ck proxy files t
34690 68 61 74 0a 2a 2a 20 20 20 20 20 20 20 61 72 65  hat.**       are
346a0 20 6e 61 6d 65 64 20 61 75 74 6f 6d 61 74 69 63   named automatic
346b0 61 6c 6c 79 20 76 69 61 20 74 68 65 20 22 3a 61  ally via the ":a
346c0 75 74 6f 3a 22 20 73 65 74 74 69 6e 67 0a 2a 2a  uto:" setting.**
346d0 0a 2a 2a 20 20 53 51 4c 49 54 45 5f 44 45 46 41  .**  SQLITE_DEFA
346e0 55 4c 54 5f 50 52 4f 58 59 44 49 52 5f 50 45 52  ULT_PROXYDIR_PER
346f0 4d 49 53 53 49 4f 4e 53 0a 2a 2a 0a 2a 2a 20 20  MISSIONS.**.**  
34700 20 20 20 20 20 50 65 72 6d 69 73 73 69 6f 6e 73       Permissions
34710 20 74 6f 20 75 73 65 20 77 68 65 6e 20 63 72 65   to use when cre
34720 61 74 69 6e 67 20 61 20 64 69 72 65 63 74 6f 72  ating a director
34730 79 20 66 6f 72 20 73 74 6f 72 69 6e 67 20 74 68  y for storing th
34740 65 0a 2a 2a 20 20 20 20 20 20 20 6c 6f 63 6b 20  e.**       lock 
34750 70 72 6f 78 79 20 66 69 6c 65 73 2c 20 6f 6e 6c  proxy files, onl
34760 79 20 75 73 65 64 20 77 68 65 6e 20 4c 4f 43 4b  y used when LOCK
34770 50 52 4f 58 59 44 49 52 20 69 73 20 6e 6f 74 20  PROXYDIR is not 
34780 73 65 74 2e 0a 2a 2a 20 20 20 20 0a 2a 2a 20 20  set..**    .**  
34790 20 20 0a 2a 2a 20 41 73 20 6d 65 6e 74 69 6f 6e    .** As mention
347a0 65 64 20 61 62 6f 76 65 2c 20 77 68 65 6e 20 63  ed above, when c
347b0 6f 6d 70 69 6c 65 64 20 77 69 74 68 20 53 51 4c  ompiled with SQL
347c0 49 54 45 5f 50 52 45 46 45 52 5f 50 52 4f 58 59  ITE_PREFER_PROXY
347d0 5f 4c 4f 43 4b 49 4e 47 2c 0a 2a 2a 20 73 65 74  _LOCKING,.** set
347e0 74 69 6e 67 20 74 68 65 20 65 6e 76 69 72 6f 6e  ting the environ
347f0 6d 65 6e 74 20 76 61 72 69 61 62 6c 65 20 53 51  ment variable SQ
34800 4c 49 54 45 5f 46 4f 52 43 45 5f 50 52 4f 58 59  LITE_FORCE_PROXY
34810 5f 4c 4f 43 4b 49 4e 47 20 74 6f 20 31 20 77 69  _LOCKING to 1 wi
34820 6c 6c 0a 2a 2a 20 66 6f 72 63 65 20 70 72 6f 78  ll.** force prox
34830 79 20 6c 6f 63 6b 69 6e 67 20 74 6f 20 62 65 20  y locking to be 
34840 75 73 65 64 20 66 6f 72 20 65 76 65 72 79 20 64  used for every d
34850 61 74 61 62 61 73 65 20 66 69 6c 65 20 6f 70 65  atabase file ope
34860 6e 65 64 2c 20 61 6e 64 20 30 0a 2a 2a 20 77 69  ned, and 0.** wi
34870 6c 6c 20 66 6f 72 63 65 20 61 75 74 6f 6d 61 74  ll force automat
34880 69 63 20 70 72 6f 78 79 20 6c 6f 63 6b 69 6e 67  ic proxy locking
34890 20 74 6f 20 62 65 20 64 69 73 61 62 6c 65 64 20   to be disabled 
348a0 66 6f 72 20 61 6c 6c 20 64 61 74 61 62 61 73 65  for all database
348b0 0a 2a 2a 20 66 69 6c 65 73 20 28 65 78 70 6c 69  .** files (expli
348c0 63 69 74 79 20 63 61 6c 6c 69 6e 67 20 74 68 65  city calling the
348d0 20 53 51 4c 49 54 45 5f 53 45 54 5f 4c 4f 43 4b   SQLITE_SET_LOCK
348e0 50 52 4f 58 59 46 49 4c 45 20 70 72 61 67 6d 61  PROXYFILE pragma
348f0 20 6f 72 0a 2a 2a 20 73 71 6c 69 74 65 5f 66 69   or.** sqlite_fi
34900 6c 65 5f 63 6f 6e 74 72 6f 6c 20 41 50 49 20 69  le_control API i
34910 73 20 6e 6f 74 20 61 66 66 65 63 74 65 64 20 62  s not affected b
34920 79 20 53 51 4c 49 54 45 5f 46 4f 52 43 45 5f 50  y SQLITE_FORCE_P
34930 52 4f 58 59 5f 4c 4f 43 4b 49 4e 47 29 2e 0a 2a  ROXY_LOCKING)..*
34940 2f 0a 0a 2f 2a 0a 2a 2a 20 50 72 6f 78 79 20 6c  /../*.** Proxy l
34950 6f 63 6b 69 6e 67 20 69 73 20 6f 6e 6c 79 20 61  ocking is only a
34960 76 61 69 6c 61 62 6c 65 20 6f 6e 20 4d 61 63 4f  vailable on MacO
34970 53 58 20 0a 2a 2f 0a 23 69 66 20 64 65 66 69 6e  SX .*/.#if defin
34980 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 26 26  ed(__APPLE__) &&
34990 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c   SQLITE_ENABLE_L
349a0 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 0a 2f 2a  OCKING_STYLE../*
349b0 0a 2a 2a 20 54 68 65 20 70 72 6f 78 79 4c 6f 63  .** The proxyLoc
349c0 6b 69 6e 67 43 6f 6e 74 65 78 74 20 68 61 73 20  kingContext has 
349d0 74 68 65 20 70 61 74 68 20 61 6e 64 20 66 69 6c  the path and fil
349e0 65 20 73 74 72 75 63 74 75 72 65 73 20 66 6f 72  e structures for
349f0 20 74 68 65 20 72 65 6d 6f 74 65 20 0a 2a 2a 20   the remote .** 
34a00 61 6e 64 20 6c 6f 63 61 6c 20 70 72 6f 78 79 20  and local proxy 
34a10 66 69 6c 65 73 20 69 6e 20 69 74 0a 2a 2f 0a 74  files in it.*/.t
34a20 79 70 65 64 65 66 20 73 74 72 75 63 74 20 70 72  ypedef struct pr
34a30 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78  oxyLockingContex
34a40 74 20 70 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f  t proxyLockingCo
34a50 6e 74 65 78 74 3b 0a 73 74 72 75 63 74 20 70 72  ntext;.struct pr
34a60 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78  oxyLockingContex
34a70 74 20 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a  t {.  unixFile *
34a80 63 6f 6e 63 68 46 69 6c 65 3b 20 20 20 20 20 20  conchFile;      
34a90 20 20 20 2f 2a 20 4f 70 65 6e 20 63 6f 6e 63 68     /* Open conch
34aa0 20 66 69 6c 65 20 2a 2f 0a 20 20 63 68 61 72 20   file */.  char 
34ab0 2a 63 6f 6e 63 68 46 69 6c 65 50 61 74 68 3b 20  *conchFilePath; 
34ac0 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20          /* Name 
34ad0 6f 66 20 74 68 65 20 63 6f 6e 63 68 20 66 69 6c  of the conch fil
34ae0 65 20 2a 2f 0a 20 20 75 6e 69 78 46 69 6c 65 20  e */.  unixFile 
34af0 2a 6c 6f 63 6b 50 72 6f 78 79 3b 20 20 20 20 20  *lockProxy;     
34b00 20 20 20 20 2f 2a 20 4f 70 65 6e 20 70 72 6f 78      /* Open prox
34b10 79 20 6c 6f 63 6b 20 66 69 6c 65 20 2a 2f 0a 20  y lock file */. 
34b20 20 63 68 61 72 20 2a 6c 6f 63 6b 50 72 6f 78 79   char *lockProxy
34b30 50 61 74 68 3b 20 20 20 20 20 20 20 20 20 2f 2a  Path;         /*
34b40 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 70 72 6f   Name of the pro
34b50 78 79 20 6c 6f 63 6b 20 66 69 6c 65 20 2a 2f 0a  xy lock file */.
34b60 20 20 63 68 61 72 20 2a 64 62 50 61 74 68 3b 20    char *dbPath; 
34b70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
34b80 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 6f 70  * Name of the op
34b90 65 6e 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74  en file */.  int
34ba0 20 63 6f 6e 63 68 48 65 6c 64 3b 20 20 20 20 20   conchHeld;     
34bb0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 31 20 69            /* 1 i
34bc0 66 20 74 68 65 20 63 6f 6e 63 68 20 69 73 20 68  f the conch is h
34bd0 65 6c 64 2c 20 2d 31 20 69 66 20 6c 6f 63 6b 6c  eld, -1 if lockl
34be0 65 73 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 46 61  ess */.  int nFa
34bf0 69 6c 73 3b 20 20 20 20 20 20 20 20 20 20 20 20  ils;            
34c00 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
34c10 6f 66 20 63 6f 6e 63 68 20 74 61 6b 69 6e 67 20  of conch taking 
34c20 66 61 69 6c 75 72 65 73 20 2a 2f 0a 20 20 76 6f  failures */.  vo
34c30 69 64 20 2a 6f 6c 64 4c 6f 63 6b 69 6e 67 43 6f  id *oldLockingCo
34c40 6e 74 65 78 74 3b 20 20 20 20 20 2f 2a 20 4f 72  ntext;     /* Or
34c50 69 67 69 6e 61 6c 20 6c 6f 63 6b 69 6e 67 63 6f  iginal lockingco
34c60 6e 74 65 78 74 20 74 6f 20 72 65 73 74 6f 72 65  ntext to restore
34c70 20 6f 6e 20 63 6c 6f 73 65 20 2a 2f 0a 20 20 73   on close */.  s
34c80 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64  qlite3_io_method
34c90 73 20 63 6f 6e 73 74 20 2a 70 4f 6c 64 4d 65 74  s const *pOldMet
34ca0 68 6f 64 3b 20 20 20 20 20 2f 2a 20 4f 72 69 67  hod;     /* Orig
34cb0 69 6e 61 6c 20 49 2f 4f 20 6d 65 74 68 6f 64 73  inal I/O methods
34cc0 20 66 6f 72 20 63 6c 6f 73 65 20 2a 2f 0a 7d 3b   for close */.};
34cd0 0a 0a 2f 2a 20 0a 2a 2a 20 54 68 65 20 70 72 6f  ../* .** The pro
34ce0 78 79 20 6c 6f 63 6b 20 66 69 6c 65 20 70 61 74  xy lock file pat
34cf0 68 20 66 6f 72 20 74 68 65 20 64 61 74 61 62 61  h for the databa
34d00 73 65 20 61 74 20 64 62 50 61 74 68 20 69 73 20  se at dbPath is 
34d10 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 6c 50 61  written into lPa
34d20 74 68 2c 20 0a 2a 2a 20 77 68 69 63 68 20 6d 75  th, .** which mu
34d30 73 74 20 70 6f 69 6e 74 20 74 6f 20 76 61 6c 69  st point to vali
34d40 64 2c 20 77 72 69 74 61 62 6c 65 20 6d 65 6d 6f  d, writable memo
34d50 72 79 20 6c 61 72 67 65 20 65 6e 6f 75 67 68 20  ry large enough 
34d60 66 6f 72 20 61 20 6d 61 78 4c 65 6e 20 6c 65 6e  for a maxLen len
34d70 67 74 68 0a 2a 2a 20 66 69 6c 65 20 70 61 74 68  gth.** file path
34d80 2e 20 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  . .*/.static int
34d90 20 70 72 6f 78 79 47 65 74 4c 6f 63 6b 50 61 74   proxyGetLockPat
34da0 68 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 64 62  h(const char *db
34db0 50 61 74 68 2c 20 63 68 61 72 20 2a 6c 50 61 74  Path, char *lPat
34dc0 68 2c 20 73 69 7a 65 5f 74 20 6d 61 78 4c 65 6e  h, size_t maxLen
34dd0 29 7b 0a 20 20 69 6e 74 20 6c 65 6e 3b 0a 20 20  ){.  int len;.  
34de0 69 6e 74 20 64 62 4c 65 6e 3b 0a 20 20 69 6e 74  int dbLen;.  int
34df0 20 69 3b 0a 0a 23 69 66 64 65 66 20 4c 4f 43 4b   i;..#ifdef LOCK
34e00 50 52 4f 58 59 44 49 52 0a 20 20 6c 65 6e 20 3d  PROXYDIR.  len =
34e10 20 73 74 72 6c 63 70 79 28 6c 50 61 74 68 2c 20   strlcpy(lPath, 
34e20 4c 4f 43 4b 50 52 4f 58 59 44 49 52 2c 20 6d 61  LOCKPROXYDIR, ma
34e30 78 4c 65 6e 29 3b 0a 23 65 6c 73 65 0a 23 20 69  xLen);.#else.# i
34e40 66 64 65 66 20 5f 43 53 5f 44 41 52 57 49 4e 5f  fdef _CS_DARWIN_
34e50 55 53 45 52 5f 54 45 4d 50 5f 44 49 52 0a 20 20  USER_TEMP_DIR.  
34e60 7b 0a 20 20 20 20 69 66 28 20 21 63 6f 6e 66 73  {.    if( !confs
34e70 74 72 28 5f 43 53 5f 44 41 52 57 49 4e 5f 55 53  tr(_CS_DARWIN_US
34e80 45 52 5f 54 45 4d 50 5f 44 49 52 2c 20 6c 50 61  ER_TEMP_DIR, lPa
34e90 74 68 2c 20 6d 61 78 4c 65 6e 29 20 29 7b 0a 20  th, maxLen) ){. 
34ea0 20 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 47       OSTRACE(("G
34eb0 45 54 4c 4f 43 4b 50 41 54 48 20 20 66 61 69 6c  ETLOCKPATH  fail
34ec0 65 64 20 25 73 20 65 72 72 6e 6f 3d 25 64 20 70  ed %s errno=%d p
34ed0 69 64 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20  id=%d\n",.      
34ee0 20 20 20 20 20 20 20 20 20 6c 50 61 74 68 2c 20           lPath, 
34ef0 65 72 72 6e 6f 2c 20 67 65 74 70 69 64 28 29 29  errno, getpid())
34f00 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
34f10 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4c 4f 43  SQLITE_IOERR_LOC
34f20 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6c 65 6e  K;.    }.    len
34f30 20 3d 20 73 74 72 6c 63 61 74 28 6c 50 61 74 68   = strlcat(lPath
34f40 2c 20 22 73 71 6c 69 74 65 70 6c 6f 63 6b 73 22  , "sqliteplocks"
34f50 2c 20 6d 61 78 4c 65 6e 29 3b 20 20 20 20 0a 20  , maxLen);    . 
34f60 20 7d 0a 23 20 65 6c 73 65 0a 20 20 6c 65 6e 20   }.# else.  len 
34f70 3d 20 73 74 72 6c 63 70 79 28 6c 50 61 74 68 2c  = strlcpy(lPath,
34f80 20 22 2f 74 6d 70 2f 22 2c 20 6d 61 78 4c 65 6e   "/tmp/", maxLen
34f90 29 3b 0a 23 20 65 6e 64 69 66 0a 23 65 6e 64 69  );.# endif.#endi
34fa0 66 0a 0a 20 20 69 66 28 20 6c 50 61 74 68 5b 6c  f..  if( lPath[l
34fb0 65 6e 2d 31 5d 21 3d 27 2f 27 20 29 7b 0a 20 20  en-1]!='/' ){.  
34fc0 20 20 6c 65 6e 20 3d 20 73 74 72 6c 63 61 74 28    len = strlcat(
34fd0 6c 50 61 74 68 2c 20 22 2f 22 2c 20 6d 61 78 4c  lPath, "/", maxL
34fe0 65 6e 29 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a  en);.  }.  .  /*
34ff0 20 74 72 61 6e 73 66 6f 72 6d 20 74 68 65 20 64   transform the d
35000 62 20 70 61 74 68 20 74 6f 20 61 20 75 6e 69 71  b path to a uniq
35010 75 65 20 63 61 63 68 65 20 6e 61 6d 65 20 2a 2f  ue cache name */
35020 0a 20 20 64 62 4c 65 6e 20 3d 20 28 69 6e 74 29  .  dbLen = (int)
35030 73 74 72 6c 65 6e 28 64 62 50 61 74 68 29 3b 0a  strlen(dbPath);.
35040 20 20 66 6f 72 28 20 69 3d 30 3b 20 69 3c 64 62    for( i=0; i<db
35050 4c 65 6e 20 26 26 20 28 69 2b 6c 65 6e 2b 37 29  Len && (i+len+7)
35060 3c 28 69 6e 74 29 6d 61 78 4c 65 6e 3b 20 69 2b  <(int)maxLen; i+
35070 2b 29 7b 0a 20 20 20 20 63 68 61 72 20 63 20 3d  +){.    char c =
35080 20 64 62 50 61 74 68 5b 69 5d 3b 0a 20 20 20 20   dbPath[i];.    
35090 6c 50 61 74 68 5b 69 2b 6c 65 6e 5d 20 3d 20 28  lPath[i+len] = (
350a0 63 3d 3d 27 2f 27 29 3f 27 5f 27 3a 63 3b 0a 20  c=='/')?'_':c;. 
350b0 20 7d 0a 20 20 6c 50 61 74 68 5b 69 2b 6c 65 6e   }.  lPath[i+len
350c0 5d 3d 27 5c 30 27 3b 0a 20 20 73 74 72 6c 63 61  ]='\0';.  strlca
350d0 74 28 6c 50 61 74 68 2c 20 22 3a 61 75 74 6f 3a  t(lPath, ":auto:
350e0 22 2c 20 6d 61 78 4c 65 6e 29 3b 0a 20 20 4f 53  ", maxLen);.  OS
350f0 54 52 41 43 45 28 28 22 47 45 54 4c 4f 43 4b 50  TRACE(("GETLOCKP
35100 41 54 48 20 20 70 72 6f 78 79 20 6c 6f 63 6b 20  ATH  proxy lock 
35110 70 61 74 68 3d 25 73 20 70 69 64 3d 25 64 5c 6e  path=%s pid=%d\n
35120 22 2c 20 6c 50 61 74 68 2c 20 67 65 74 70 69 64  ", lPath, getpid
35130 28 29 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 53  ()));.  return S
35140 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 20  QLITE_OK;.}../* 
35150 0a 20 2a 2a 20 43 72 65 61 74 65 73 20 74 68 65  . ** Creates the
35160 20 6c 6f 63 6b 20 66 69 6c 65 20 61 6e 64 20 61   lock file and a
35170 6e 79 20 6d 69 73 73 69 6e 67 20 64 69 72 65 63  ny missing direc
35180 74 6f 72 69 65 73 20 69 6e 20 6c 6f 63 6b 50 61  tories in lockPa
35190 74 68 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e  th. */.static in
351a0 74 20 70 72 6f 78 79 43 72 65 61 74 65 4c 6f 63  t proxyCreateLoc
351b0 6b 50 61 74 68 28 63 6f 6e 73 74 20 63 68 61 72  kPath(const char
351c0 20 2a 6c 6f 63 6b 50 61 74 68 29 7b 0a 20 20 69   *lockPath){.  i
351d0 6e 74 20 69 2c 20 6c 65 6e 3b 0a 20 20 63 68 61  nt i, len;.  cha
351e0 72 20 62 75 66 5b 4d 41 58 50 41 54 48 4c 45 4e  r buf[MAXPATHLEN
351f0 5d 3b 0a 20 20 69 6e 74 20 73 74 61 72 74 20 3d  ];.  int start =
35200 20 30 3b 0a 20 20 0a 20 20 61 73 73 65 72 74 28   0;.  .  assert(
35210 6c 6f 63 6b 50 61 74 68 21 3d 4e 55 4c 4c 29 3b  lockPath!=NULL);
35220 0a 20 20 2f 2a 20 74 72 79 20 74 6f 20 63 72 65  .  /* try to cre
35230 61 74 65 20 61 6c 6c 20 74 68 65 20 69 6e 74 65  ate all the inte
35240 72 6d 65 64 69 61 74 65 20 64 69 72 65 63 74 6f  rmediate directo
35250 72 69 65 73 20 2a 2f 0a 20 20 6c 65 6e 20 3d 20  ries */.  len = 
35260 28 69 6e 74 29 73 74 72 6c 65 6e 28 6c 6f 63 6b  (int)strlen(lock
35270 50 61 74 68 29 3b 0a 20 20 62 75 66 5b 30 5d 20  Path);.  buf[0] 
35280 3d 20 6c 6f 63 6b 50 61 74 68 5b 30 5d 3b 0a 20  = lockPath[0];. 
35290 20 66 6f 72 28 20 69 3d 31 3b 20 69 3c 6c 65 6e   for( i=1; i<len
352a0 3b 20 69 2b 2b 20 29 7b 0a 20 20 20 20 69 66 28  ; i++ ){.    if(
352b0 20 6c 6f 63 6b 50 61 74 68 5b 69 5d 20 3d 3d 20   lockPath[i] == 
352c0 27 2f 27 20 26 26 20 28 69 20 2d 20 73 74 61 72  '/' && (i - star
352d0 74 20 3e 20 30 29 20 29 7b 0a 20 20 20 20 20 20  t > 0) ){.      
352e0 2f 2a 20 6f 6e 6c 79 20 6d 6b 64 69 72 20 69 66  /* only mkdir if
352f0 20 6c 65 61 66 20 64 69 72 20 21 3d 20 22 2e 22   leaf dir != "."
35300 20 6f 72 20 22 2f 22 20 6f 72 20 22 2e 2e 22 20   or "/" or ".." 
35310 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 69 2d 73  */.      if( i-s
35320 74 61 72 74 3e 32 20 7c 7c 20 28 69 2d 73 74 61  tart>2 || (i-sta
35330 72 74 3d 3d 31 20 26 26 20 62 75 66 5b 73 74 61  rt==1 && buf[sta
35340 72 74 5d 20 21 3d 20 27 2e 27 20 26 26 20 62 75  rt] != '.' && bu
35350 66 5b 73 74 61 72 74 5d 20 21 3d 20 27 2f 27 29  f[start] != '/')
35360 20 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 28 69   .         || (i
35370 2d 73 74 61 72 74 3d 3d 32 20 26 26 20 62 75 66  -start==2 && buf
35380 5b 73 74 61 72 74 5d 20 21 3d 20 27 2e 27 20 26  [start] != '.' &
35390 26 20 62 75 66 5b 73 74 61 72 74 2b 31 5d 20 21  & buf[start+1] !
353a0 3d 20 27 2e 27 29 20 29 7b 0a 20 20 20 20 20 20  = '.') ){.      
353b0 20 20 62 75 66 5b 69 5d 3d 27 5c 30 27 3b 0a 20    buf[i]='\0';. 
353c0 20 20 20 20 20 20 20 69 66 28 20 6d 6b 64 69 72         if( mkdir
353d0 28 62 75 66 2c 20 53 51 4c 49 54 45 5f 44 45 46  (buf, SQLITE_DEF
353e0 41 55 4c 54 5f 50 52 4f 58 59 44 49 52 5f 50 45  AULT_PROXYDIR_PE
353f0 52 4d 49 53 53 49 4f 4e 53 29 20 29 7b 0a 20 20  RMISSIONS) ){.  
35400 20 20 20 20 20 20 20 20 69 6e 74 20 65 72 72 3d          int err=
35410 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20 20 20 20  errno;.         
35420 20 69 66 28 20 65 72 72 21 3d 45 45 58 49 53 54   if( err!=EEXIST
35430 20 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20   ) {.           
35440 20 4f 53 54 52 41 43 45 28 28 22 43 52 45 41 54   OSTRACE(("CREAT
35450 45 4c 4f 43 4b 50 41 54 48 20 20 46 41 49 4c 45  ELOCKPATH  FAILE
35460 44 20 63 72 65 61 74 69 6e 67 20 25 73 2c 20 22  D creating %s, "
35470 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
35480 20 20 20 20 20 20 22 27 25 73 27 20 70 72 6f 78        "'%s' prox
35490 79 20 6c 6f 63 6b 20 70 61 74 68 3d 25 73 20 70  y lock path=%s p
354a0 69 64 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20  id=%d\n",.      
354b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62                 b
354c0 75 66 2c 20 73 74 72 65 72 72 6f 72 28 65 72 72  uf, strerror(err
354d0 29 2c 20 6c 6f 63 6b 50 61 74 68 2c 20 67 65 74  ), lockPath, get
354e0 70 69 64 28 29 29 29 3b 0a 20 20 20 20 20 20 20  pid()));.       
354f0 20 20 20 20 20 72 65 74 75 72 6e 20 65 72 72 3b       return err;
35500 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
35510 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
35520 20 20 20 20 20 73 74 61 72 74 3d 69 2b 31 3b 0a       start=i+1;.
35530 20 20 20 20 7d 0a 20 20 20 20 62 75 66 5b 69 5d      }.    buf[i]
35540 20 3d 20 6c 6f 63 6b 50 61 74 68 5b 69 5d 3b 0a   = lockPath[i];.
35550 20 20 7d 0a 20 20 4f 53 54 52 41 43 45 28 28 22    }.  OSTRACE(("
35560 43 52 45 41 54 45 4c 4f 43 4b 50 41 54 48 20 20  CREATELOCKPATH  
35570 70 72 6f 78 79 20 6c 6f 63 6b 20 70 61 74 68 3d  proxy lock path=
35580 25 73 20 70 69 64 3d 25 64 5c 6e 22 2c 20 6c 6f  %s pid=%d\n", lo
35590 63 6b 50 61 74 68 2c 20 67 65 74 70 69 64 28 29  ckPath, getpid()
355a0 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a  ));.  return 0;.
355b0 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 69 73  }..static int is
355c0 50 72 6f 78 79 4c 6f 63 6b 69 6e 67 4d 6f 64 65  ProxyLockingMode
355d0 28 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65  (unixFile *pFile
355e0 29 20 7b 0a 20 20 72 65 74 75 72 6e 20 28 70 46  ) {.  return (pF
355f0 69 6c 65 2d 3e 70 4d 65 74 68 6f 64 20 3d 3d 20  ile->pMethod == 
35600 26 70 72 6f 78 79 49 6f 4d 65 74 68 6f 64 73 29  &proxyIoMethods)
35610 20 3f 20 31 20 3a 20 30 3b 0a 7d 0a 0a 2f 2a 0a   ? 1 : 0;.}../*.
35620 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 73 68  ** Return the sh
35630 61 72 65 64 20 6d 65 6d 6f 72 79 20 62 61 73 65  ared memory base
35640 20 70 61 74 68 20 62 61 73 65 64 20 6f 6e 20 74   path based on t
35650 68 65 20 6c 6f 63 6b 20 70 72 6f 78 79 20 66 69  he lock proxy fi
35660 6c 65 20 69 66 20 74 68 65 20 0a 2a 2a 20 6c 6f  le if the .** lo
35670 63 6b 20 70 72 6f 78 79 20 66 69 6c 65 20 69 73  ck proxy file is
35680 20 68 6f 73 74 65 64 20 6f 6e 20 61 20 73 68 61   hosted on a sha
35690 72 65 64 20 6d 65 6d 6f 72 79 20 63 6f 6d 70 61  red memory compa
356a0 74 69 62 6c 65 20 46 53 0a 2a 2f 0a 73 74 61 74  tible FS.*/.stat
356b0 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 70  ic const char *p
356c0 72 6f 78 79 53 68 61 72 65 64 4d 65 6d 6f 72 79  roxySharedMemory
356d0 42 61 73 65 50 61 74 68 28 75 6e 69 78 46 69 6c  BasePath(unixFil
356e0 65 20 2a 70 46 69 6c 65 29 20 7b 0a 20 20 70 72  e *pFile) {.  pr
356f0 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78  oxyLockingContex
35700 74 20 2a 70 43 74 78 3b 0a 20 20 75 6e 69 78 46  t *pCtx;.  unixF
35710 69 6c 65 20 2a 70 4c 6f 63 6b 46 69 6c 65 3b 0a  ile *pLockFile;.
35720 20 20 0a 20 20 61 73 73 65 72 74 28 70 46 69 6c    .  assert(pFil
35730 65 21 3d 4e 55 4c 4c 20 26 26 20 70 46 69 6c 65  e!=NULL && pFile
35740 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  ->lockingContext
35750 21 3d 4e 55 4c 4c 29 3b 0a 20 20 61 73 73 65 72  !=NULL);.  asser
35760 74 28 70 46 69 6c 65 2d 3e 70 4d 65 74 68 6f 64  t(pFile->pMethod
35770 20 3d 3d 20 26 70 72 6f 78 79 49 6f 4d 65 74 68   == &proxyIoMeth
35780 6f 64 73 29 3b 0a 20 20 70 43 74 78 20 3d 20 28  ods);.  pCtx = (
35790 28 70 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e  (proxyLockingCon
357a0 74 65 78 74 20 2a 29 28 70 46 69 6c 65 2d 3e 6c  text *)(pFile->l
357b0 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 29 29 3b  ockingContext));
357c0 0a 20 20 70 4c 6f 63 6b 46 69 6c 65 20 3d 20 70  .  pLockFile = p
357d0 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 3b 0a  Ctx->lockProxy;.
357e0 20 20 69 66 28 20 70 4c 6f 63 6b 46 69 6c 65 2d    if( pLockFile-
357f0 3e 70 4d 65 74 68 6f 64 2d 3e 69 56 65 72 73 69  >pMethod->iVersi
35800 6f 6e 3e 3d 32 20 26 26 20 70 4c 6f 63 6b 46 69  on>=2 && pLockFi
35810 6c 65 2d 3e 70 4d 65 74 68 6f 64 2d 3e 78 53 68  le->pMethod->xSh
35820 6d 4d 61 70 21 3d 30 20 29 7b 0a 20 20 20 20 72  mMap!=0 ){.    r
35830 65 74 75 72 6e 20 70 43 74 78 2d 3e 6c 6f 63 6b  eturn pCtx->lock
35840 50 72 6f 78 79 50 61 74 68 3b 0a 20 20 7d 0a 20  ProxyPath;.  }. 
35850 20 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 7d 0a   return NULL;.}.
35860 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61 20  ./*.** Create a 
35870 6e 65 77 20 56 46 53 20 66 69 6c 65 20 64 65 73  new VFS file des
35880 63 72 69 70 74 6f 72 20 28 73 74 6f 72 65 64 20  criptor (stored 
35890 69 6e 20 6d 65 6d 6f 72 79 20 6f 62 74 61 69 6e  in memory obtain
358a0 65 64 20 66 72 6f 6d 0a 2a 2a 20 73 71 6c 69 74  ed from.** sqlit
358b0 65 33 5f 6d 61 6c 6c 6f 63 29 20 61 6e 64 20 6f  e3_malloc) and o
358c0 70 65 6e 20 74 68 65 20 66 69 6c 65 20 6e 61 6d  pen the file nam
358d0 65 64 20 22 70 61 74 68 22 20 69 6e 20 74 68 65  ed "path" in the
358e0 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
358f0 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 61 6c 6c  ..**.** The call
35900 65 72 20 69 73 20 72 65 73 70 6f 6e 73 69 62 6c  er is responsibl
35910 65 20 6e 6f 74 20 6f 6e 6c 79 20 66 6f 72 20 63  e not only for c
35920 6c 6f 73 69 6e 67 20 74 68 65 20 66 69 6c 65 20  losing the file 
35930 64 65 73 63 72 69 70 74 6f 72 0a 2a 2a 20 62 75  descriptor.** bu
35940 74 20 61 6c 73 6f 20 66 6f 72 20 66 72 65 65 69  t also for freei
35950 6e 67 20 74 68 65 20 6d 65 6d 6f 72 79 20 61 73  ng the memory as
35960 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68  sociated with th
35970 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  e file descripto
35980 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  r..*/.static int
35990 20 70 72 6f 78 79 43 72 65 61 74 65 55 6e 69 78   proxyCreateUnix
359a0 46 69 6c 65 28 0a 20 20 20 20 63 6f 6e 73 74 20  File(.    const 
359b0 63 68 61 72 20 2a 70 61 74 68 2c 20 20 20 20 20  char *path,     
359c0 20 20 20 2f 2a 20 70 61 74 68 20 66 6f 72 20 74     /* path for t
359d0 68 65 20 6e 65 77 20 75 6e 69 78 46 69 6c 65 20  he new unixFile 
359e0 2a 2f 0a 20 20 20 20 75 6e 69 78 46 69 6c 65 20  */.    unixFile 
359f0 2a 2a 70 70 46 69 6c 65 2c 20 20 20 20 20 20 20  **ppFile,       
35a00 2f 2a 20 75 6e 69 78 46 69 6c 65 20 63 72 65 61  /* unixFile crea
35a10 74 65 64 20 61 6e 64 20 72 65 74 75 72 6e 65 64  ted and returned
35a20 20 62 79 20 72 65 66 20 2a 2f 0a 20 20 20 20 69   by ref */.    i
35a30 6e 74 20 69 73 6c 6f 63 6b 66 69 6c 65 20 20 20  nt islockfile   
35a40 20 20 20 20 20 20 20 20 2f 2a 20 69 66 20 6e 6f          /* if no
35a50 6e 20 7a 65 72 6f 20 6d 69 73 73 69 6e 67 20 64  n zero missing d
35a60 69 72 73 20 77 69 6c 6c 20 62 65 20 63 72 65 61  irs will be crea
35a70 74 65 64 20 2a 2f 0a 29 20 7b 0a 20 20 69 6e 74  ted */.) {.  int
35a80 20 66 64 20 3d 20 2d 31 3b 0a 20 20 75 6e 69 78   fd = -1;.  unix
35a90 46 69 6c 65 20 2a 70 4e 65 77 3b 0a 20 20 69 6e  File *pNew;.  in
35aa0 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
35ab0 3b 0a 20 20 69 6e 74 20 6f 70 65 6e 46 6c 61 67  ;.  int openFlag
35ac0 73 20 3d 20 4f 5f 52 44 57 52 20 7c 20 4f 5f 43  s = O_RDWR | O_C
35ad0 52 45 41 54 3b 0a 20 20 73 71 6c 69 74 65 33 5f  REAT;.  sqlite3_
35ae0 76 66 73 20 64 75 6d 6d 79 56 66 73 3b 0a 20 20  vfs dummyVfs;.  
35af0 69 6e 74 20 74 65 72 72 6e 6f 20 3d 20 30 3b 0a  int terrno = 0;.
35b00 20 20 55 6e 69 78 55 6e 75 73 65 64 46 64 20 2a    UnixUnusedFd *
35b10 70 55 6e 75 73 65 64 20 3d 20 4e 55 4c 4c 3b 0a  pUnused = NULL;.
35b20 0a 20 20 2f 2a 20 31 2e 20 66 69 72 73 74 20 74  .  /* 1. first t
35b30 72 79 20 74 6f 20 6f 70 65 6e 2f 63 72 65 61 74  ry to open/creat
35b40 65 20 74 68 65 20 66 69 6c 65 0a 20 20 2a 2a 20  e the file.  ** 
35b50 32 2e 20 69 66 20 74 68 61 74 20 66 61 69 6c 73  2. if that fails
35b60 2c 20 61 6e 64 20 74 68 69 73 20 69 73 20 61 20  , and this is a 
35b70 6c 6f 63 6b 20 66 69 6c 65 20 28 6e 6f 74 2d 63  lock file (not-c
35b80 6f 6e 63 68 29 2c 20 74 72 79 20 63 72 65 61 74  onch), try creat
35b90 69 6e 67 0a 20 20 2a 2a 20 74 68 65 20 70 61 72  ing.  ** the par
35ba0 65 6e 74 20 64 69 72 65 63 74 6f 72 69 65 73 20  ent directories 
35bb0 61 6e 64 20 74 68 65 6e 20 74 72 79 20 61 67 61  and then try aga
35bc0 69 6e 2e 0a 20 20 2a 2a 20 33 2e 20 69 66 20 74  in..  ** 3. if t
35bd0 68 61 74 20 66 61 69 6c 73 2c 20 74 72 79 20 74  hat fails, try t
35be0 6f 20 6f 70 65 6e 20 74 68 65 20 66 69 6c 65 20  o open the file 
35bf0 72 65 61 64 2d 6f 6e 6c 79 0a 20 20 2a 2a 20 6f  read-only.  ** o
35c00 74 68 65 72 77 69 73 65 20 72 65 74 75 72 6e 20  therwise return 
35c10 42 55 53 59 20 28 69 66 20 6c 6f 63 6b 20 66 69  BUSY (if lock fi
35c20 6c 65 29 20 6f 72 20 43 41 4e 54 4f 50 45 4e 20  le) or CANTOPEN 
35c30 66 6f 72 20 74 68 65 20 63 6f 6e 63 68 20 66 69  for the conch fi
35c40 6c 65 0a 20 20 2a 2f 0a 20 20 70 55 6e 75 73 65  le.  */.  pUnuse
35c50 64 20 3d 20 66 69 6e 64 52 65 75 73 61 62 6c 65  d = findReusable
35c60 46 64 28 70 61 74 68 2c 20 6f 70 65 6e 46 6c 61  Fd(path, openFla
35c70 67 73 29 3b 0a 20 20 69 66 28 20 70 55 6e 75 73  gs);.  if( pUnus
35c80 65 64 20 29 7b 0a 20 20 20 20 66 64 20 3d 20 70  ed ){.    fd = p
35c90 55 6e 75 73 65 64 2d 3e 66 64 3b 0a 20 20 7d 65  Unused->fd;.  }e
35ca0 6c 73 65 7b 0a 20 20 20 20 70 55 6e 75 73 65 64  lse{.    pUnused
35cb0 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f   = sqlite3_mallo
35cc0 63 28 73 69 7a 65 6f 66 28 2a 70 55 6e 75 73 65  c(sizeof(*pUnuse
35cd0 64 29 29 3b 0a 20 20 20 20 69 66 28 20 21 70 55  d));.    if( !pU
35ce0 6e 75 73 65 64 20 29 7b 0a 20 20 20 20 20 20 72  nused ){.      r
35cf0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
35d00 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  EM;.    }.  }.  
35d10 69 66 28 20 66 64 3c 30 20 29 7b 0a 20 20 20 20  if( fd<0 ){.    
35d20 66 64 20 3d 20 72 6f 62 75 73 74 5f 6f 70 65 6e  fd = robust_open
35d30 28 70 61 74 68 2c 20 6f 70 65 6e 46 6c 61 67 73  (path, openFlags
35d40 2c 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54  , SQLITE_DEFAULT
35d50 5f 46 49 4c 45 5f 50 45 52 4d 49 53 53 49 4f 4e  _FILE_PERMISSION
35d60 53 29 3b 0a 20 20 20 20 74 65 72 72 6e 6f 20 3d  S);.    terrno =
35d70 20 65 72 72 6e 6f 3b 0a 20 20 20 20 69 66 28 20   errno;.    if( 
35d80 66 64 3c 30 20 26 26 20 65 72 72 6e 6f 3d 3d 45  fd<0 && errno==E
35d90 4e 4f 45 4e 54 20 26 26 20 69 73 6c 6f 63 6b 66  NOENT && islockf
35da0 69 6c 65 20 29 7b 0a 20 20 20 20 20 20 69 66 28  ile ){.      if(
35db0 20 70 72 6f 78 79 43 72 65 61 74 65 4c 6f 63 6b   proxyCreateLock
35dc0 50 61 74 68 28 70 61 74 68 29 20 3d 3d 20 53 51  Path(path) == SQ
35dd0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
35de0 20 20 20 66 64 20 3d 20 72 6f 62 75 73 74 5f 6f     fd = robust_o
35df0 70 65 6e 28 70 61 74 68 2c 20 6f 70 65 6e 46 6c  pen(path, openFl
35e00 61 67 73 2c 20 53 51 4c 49 54 45 5f 44 45 46 41  ags, SQLITE_DEFA
35e10 55 4c 54 5f 46 49 4c 45 5f 50 45 52 4d 49 53 53  ULT_FILE_PERMISS
35e20 49 4f 4e 53 29 3b 0a 20 20 20 20 20 20 7d 0a 20  IONS);.      }. 
35e30 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 66     }.  }.  if( f
35e40 64 3c 30 20 29 7b 0a 20 20 20 20 6f 70 65 6e 46  d<0 ){.    openF
35e50 6c 61 67 73 20 3d 20 4f 5f 52 44 4f 4e 4c 59 3b  lags = O_RDONLY;
35e60 0a 20 20 20 20 66 64 20 3d 20 72 6f 62 75 73 74  .    fd = robust
35e70 5f 6f 70 65 6e 28 70 61 74 68 2c 20 6f 70 65 6e  _open(path, open
35e80 46 6c 61 67 73 2c 20 53 51 4c 49 54 45 5f 44 45  Flags, SQLITE_DE
35e90 46 41 55 4c 54 5f 46 49 4c 45 5f 50 45 52 4d 49  FAULT_FILE_PERMI
35ea0 53 53 49 4f 4e 53 29 3b 0a 20 20 20 20 74 65 72  SSIONS);.    ter
35eb0 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 7d  rno = errno;.  }
35ec0 0a 20 20 69 66 28 20 66 64 3c 30 20 29 7b 0a 20  .  if( fd<0 ){. 
35ed0 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
35ee0 70 55 6e 75 73 65 64 29 3b 0a 20 20 20 20 69 66  pUnused);.    if
35ef0 28 20 69 73 6c 6f 63 6b 66 69 6c 65 20 29 7b 0a  ( islockfile ){.
35f00 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
35f10 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 7d 0a  ITE_BUSY;.    }.
35f20 20 20 20 20 73 77 69 74 63 68 20 28 74 65 72 72      switch (terr
35f30 6e 6f 29 20 7b 0a 20 20 20 20 20 20 63 61 73 65  no) {.      case
35f40 20 45 41 43 43 45 53 3a 0a 20 20 20 20 20 20 20   EACCES:.       
35f50 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 50   return SQLITE_P
35f60 45 52 4d 3b 0a 20 20 20 20 20 20 63 61 73 65 20  ERM;.      case 
35f70 45 49 4f 3a 20 0a 20 20 20 20 20 20 20 20 72 65  EIO: .        re
35f80 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52  turn SQLITE_IOER
35f90 52 5f 4c 4f 43 4b 3b 20 2f 2a 20 65 76 65 6e 20  R_LOCK; /* even 
35fa0 74 68 6f 75 67 68 20 69 74 20 69 73 20 74 68 65  though it is the
35fb0 20 63 6f 6e 63 68 20 2a 2f 0a 20 20 20 20 20 20   conch */.      
35fc0 64 65 66 61 75 6c 74 3a 0a 20 20 20 20 20 20 20  default:.       
35fd0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
35fe0 41 4e 54 4f 50 45 4e 5f 42 4b 50 54 3b 0a 20 20  ANTOPEN_BKPT;.  
35ff0 20 20 7d 0a 20 20 7d 0a 20 20 0a 20 20 70 4e 65    }.  }.  .  pNe
36000 77 20 3d 20 28 75 6e 69 78 46 69 6c 65 20 2a 29  w = (unixFile *)
36010 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 73  sqlite3_malloc(s
36020 69 7a 65 6f 66 28 2a 70 4e 65 77 29 29 3b 0a 20  izeof(*pNew));. 
36030 20 69 66 28 20 70 4e 65 77 3d 3d 4e 55 4c 4c 20   if( pNew==NULL 
36040 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  ){.    rc = SQLI
36050 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 67 6f  TE_NOMEM;.    go
36060 74 6f 20 65 6e 64 5f 63 72 65 61 74 65 5f 70 72  to end_create_pr
36070 6f 78 79 3b 0a 20 20 7d 0a 20 20 6d 65 6d 73 65  oxy;.  }.  memse
36080 74 28 70 4e 65 77 2c 20 30 2c 20 73 69 7a 65 6f  t(pNew, 0, sizeo
36090 66 28 75 6e 69 78 46 69 6c 65 29 29 3b 0a 20 20  f(unixFile));.  
360a0 70 4e 65 77 2d 3e 6f 70 65 6e 46 6c 61 67 73 20  pNew->openFlags 
360b0 3d 20 6f 70 65 6e 46 6c 61 67 73 3b 0a 20 20 6d  = openFlags;.  m
360c0 65 6d 73 65 74 28 26 64 75 6d 6d 79 56 66 73 2c  emset(&dummyVfs,
360d0 20 30 2c 20 73 69 7a 65 6f 66 28 64 75 6d 6d 79   0, sizeof(dummy
360e0 56 66 73 29 29 3b 0a 20 20 64 75 6d 6d 79 56 66  Vfs));.  dummyVf
360f0 73 2e 70 41 70 70 44 61 74 61 20 3d 20 28 76 6f  s.pAppData = (vo
36100 69 64 2a 29 26 61 75 74 6f 6c 6f 63 6b 49 6f 46  id*)&autolockIoF
36110 69 6e 64 65 72 3b 0a 20 20 64 75 6d 6d 79 56 66  inder;.  dummyVf
36120 73 2e 7a 4e 61 6d 65 20 3d 20 22 64 75 6d 6d 79  s.zName = "dummy
36130 22 3b 0a 20 20 70 55 6e 75 73 65 64 2d 3e 66 64  ";.  pUnused->fd
36140 20 3d 20 66 64 3b 0a 20 20 70 55 6e 75 73 65 64   = fd;.  pUnused
36150 2d 3e 66 6c 61 67 73 20 3d 20 6f 70 65 6e 46 6c  ->flags = openFl
36160 61 67 73 3b 0a 20 20 70 4e 65 77 2d 3e 70 55 6e  ags;.  pNew->pUn
36170 75 73 65 64 20 3d 20 70 55 6e 75 73 65 64 3b 0a  used = pUnused;.
36180 20 20 0a 20 20 72 63 20 3d 20 66 69 6c 6c 49 6e    .  rc = fillIn
36190 55 6e 69 78 46 69 6c 65 28 26 64 75 6d 6d 79 56  UnixFile(&dummyV
361a0 66 73 2c 20 66 64 2c 20 30 2c 20 28 73 71 6c 69  fs, fd, 0, (sqli
361b0 74 65 33 5f 66 69 6c 65 2a 29 70 4e 65 77 2c 20  te3_file*)pNew, 
361c0 70 61 74 68 2c 20 30 2c 20 30 2c 20 30 29 3b 0a  path, 0, 0, 0);.
361d0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
361e0 5f 4f 4b 20 29 7b 0a 20 20 20 20 2a 70 70 46 69  _OK ){.    *ppFi
361f0 6c 65 20 3d 20 70 4e 65 77 3b 0a 20 20 20 20 72  le = pNew;.    r
36200 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
36210 0a 20 20 7d 0a 65 6e 64 5f 63 72 65 61 74 65 5f  .  }.end_create_
36220 70 72 6f 78 79 3a 20 20 20 20 0a 20 20 72 6f 62  proxy:    .  rob
36230 75 73 74 5f 63 6c 6f 73 65 28 70 4e 65 77 2c 20  ust_close(pNew, 
36240 66 64 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20  fd, __LINE__);. 
36250 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 4e   sqlite3_free(pN
36260 65 77 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66  ew);.  sqlite3_f
36270 72 65 65 28 70 55 6e 75 73 65 64 29 3b 0a 20 20  ree(pUnused);.  
36280 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69  return rc;.}..#i
36290 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54  fdef SQLITE_TEST
362a0 0a 2f 2a 20 73 69 6d 75 6c 61 74 65 20 6d 75 6c  ./* simulate mul
362b0 74 69 70 6c 65 20 68 6f 73 74 73 20 62 79 20 63  tiple hosts by c
362c0 72 65 61 74 69 6e 67 20 75 6e 69 71 75 65 20 68  reating unique h
362d0 6f 73 74 69 64 20 66 69 6c 65 20 70 61 74 68 73  ostid file paths
362e0 20 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f   */.int sqlite3_
362f0 68 6f 73 74 69 64 5f 6e 75 6d 20 3d 20 30 3b 0a  hostid_num = 0;.
36300 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20  #endif..#define 
36310 50 52 4f 58 59 5f 48 4f 53 54 49 44 4c 45 4e 20  PROXY_HOSTIDLEN 
36320 20 20 20 31 36 20 20 2f 2a 20 63 6f 6e 63 68 20     16  /* conch 
36330 66 69 6c 65 20 68 6f 73 74 20 69 64 20 6c 65 6e  file host id len
36340 67 74 68 20 2a 2f 0a 0a 2f 2a 20 4e 6f 74 20 61  gth */../* Not a
36350 6c 77 61 79 73 20 64 65 66 69 6e 65 64 20 69 6e  lways defined in
36360 20 74 68 65 20 68 65 61 64 65 72 73 20 61 73 20   the headers as 
36370 69 74 20 6f 75 67 68 74 20 74 6f 20 62 65 20 2a  it ought to be *
36380 2f 0a 65 78 74 65 72 6e 20 69 6e 74 20 67 65 74  /.extern int get
36390 68 6f 73 74 75 75 69 64 28 75 75 69 64 5f 74 20  hostuuid(uuid_t 
363a0 69 64 2c 20 63 6f 6e 73 74 20 73 74 72 75 63 74  id, const struct
363b0 20 74 69 6d 65 73 70 65 63 20 2a 77 61 69 74 29   timespec *wait)
363c0 3b 0a 0a 2f 2a 20 67 65 74 20 74 68 65 20 68 6f  ;../* get the ho
363d0 73 74 20 49 44 20 76 69 61 20 67 65 74 68 6f 73  st ID via gethos
363e0 74 75 75 69 64 28 29 2c 20 70 48 6f 73 74 49 44  tuuid(), pHostID
363f0 20 6d 75 73 74 20 70 6f 69 6e 74 20 74 6f 20 50   must point to P
36400 52 4f 58 59 5f 48 4f 53 54 49 44 4c 45 4e 20 0a  ROXY_HOSTIDLEN .
36410 2a 2a 20 62 79 74 65 73 20 6f 66 20 77 72 69 74  ** bytes of writ
36420 61 62 6c 65 20 6d 65 6d 6f 72 79 2e 0a 2a 2f 0a  able memory..*/.
36430 73 74 61 74 69 63 20 69 6e 74 20 70 72 6f 78 79  static int proxy
36440 47 65 74 48 6f 73 74 49 44 28 75 6e 73 69 67 6e  GetHostID(unsign
36450 65 64 20 63 68 61 72 20 2a 70 48 6f 73 74 49 44  ed char *pHostID
36460 2c 20 69 6e 74 20 2a 70 45 72 72 6f 72 29 7b 0a  , int *pError){.
36470 20 20 61 73 73 65 72 74 28 50 52 4f 58 59 5f 48    assert(PROXY_H
36480 4f 53 54 49 44 4c 45 4e 20 3d 3d 20 73 69 7a 65  OSTIDLEN == size
36490 6f 66 28 75 75 69 64 5f 74 29 29 3b 0a 20 20 6d  of(uuid_t));.  m
364a0 65 6d 73 65 74 28 70 48 6f 73 74 49 44 2c 20 30  emset(pHostID, 0
364b0 2c 20 50 52 4f 58 59 5f 48 4f 53 54 49 44 4c 45  , PROXY_HOSTIDLE
364c0 4e 29 3b 0a 23 69 66 20 48 41 56 45 5f 47 45 54  N);.#if HAVE_GET
364d0 48 4f 53 54 55 55 49 44 0a 20 20 7b 0a 20 20 20  HOSTUUID.  {.   
364e0 20 73 74 72 75 63 74 20 74 69 6d 65 73 70 65 63   struct timespec
364f0 20 74 69 6d 65 6f 75 74 20 3d 20 7b 31 2c 20 30   timeout = {1, 0
36500 7d 3b 20 2f 2a 20 31 20 73 65 63 20 74 69 6d 65  }; /* 1 sec time
36510 6f 75 74 20 2a 2f 0a 20 20 20 20 0a 20 20 20 20  out */.    .    
36520 69 66 28 20 67 65 74 68 6f 73 74 75 75 69 64 28  if( gethostuuid(
36530 70 48 6f 73 74 49 44 2c 20 26 74 69 6d 65 6f 75  pHostID, &timeou
36540 74 29 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  t) ){.      int 
36550 65 72 72 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20  err = errno;.   
36560 20 20 20 69 66 28 20 70 45 72 72 6f 72 20 29 7b     if( pError ){
36570 0a 20 20 20 20 20 20 20 20 2a 70 45 72 72 6f 72  .        *pError
36580 20 3d 20 65 72 72 3b 0a 20 20 20 20 20 20 7d 0a   = err;.      }.
36590 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
365a0 49 54 45 5f 49 4f 45 52 52 3b 0a 20 20 20 20 7d  ITE_IOERR;.    }
365b0 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 23 69 66 64  .  }.#endif.#ifd
365c0 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20  ef SQLITE_TEST. 
365d0 20 2f 2a 20 73 69 6d 75 6c 61 74 65 20 6d 75 6c   /* simulate mul
365e0 74 69 70 6c 65 20 68 6f 73 74 73 20 62 79 20 63  tiple hosts by c
365f0 72 65 61 74 69 6e 67 20 75 6e 69 71 75 65 20 68  reating unique h
36600 6f 73 74 69 64 20 66 69 6c 65 20 70 61 74 68 73  ostid file paths
36610 20 2a 2f 0a 20 20 69 66 28 20 73 71 6c 69 74 65   */.  if( sqlite
36620 33 5f 68 6f 73 74 69 64 5f 6e 75 6d 20 21 3d 20  3_hostid_num != 
36630 30 29 7b 0a 20 20 20 20 70 48 6f 73 74 49 44 5b  0){.    pHostID[
36640 30 5d 20 3d 20 28 63 68 61 72 29 28 70 48 6f 73  0] = (char)(pHos
36650 74 49 44 5b 30 5d 20 2b 20 28 63 68 61 72 29 28  tID[0] + (char)(
36660 73 71 6c 69 74 65 33 5f 68 6f 73 74 69 64 5f 6e  sqlite3_hostid_n
36670 75 6d 20 26 20 30 78 46 46 29 29 3b 0a 20 20 7d  um & 0xFF));.  }
36680 0a 23 65 6e 64 69 66 0a 20 20 0a 20 20 72 65 74  .#endif.  .  ret
36690 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
366a0 0a 0a 2f 2a 20 54 68 65 20 63 6f 6e 63 68 20 66  ../* The conch f
366b0 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 74 68 65  ile contains the
366c0 20 68 65 61 64 65 72 2c 20 68 6f 73 74 20 69 64   header, host id
366d0 20 61 6e 64 20 6c 6f 63 6b 20 66 69 6c 65 20 70   and lock file p
366e0 61 74 68 0a 20 2a 2f 0a 23 64 65 66 69 6e 65 20  ath. */.#define 
366f0 50 52 4f 58 59 5f 43 4f 4e 43 48 56 45 52 53 49  PROXY_CONCHVERSI
36700 4f 4e 20 32 20 20 20 2f 2a 20 31 2d 62 79 74 65  ON 2   /* 1-byte
36710 20 68 65 61 64 65 72 2c 20 31 36 2d 62 79 74 65   header, 16-byte
36720 20 68 6f 73 74 20 69 64 2c 20 70 61 74 68 20 2a   host id, path *
36730 2f 0a 23 64 65 66 69 6e 65 20 50 52 4f 58 59 5f  /.#define PROXY_
36740 48 45 41 44 45 52 4c 45 4e 20 20 20 20 31 20 20  HEADERLEN    1  
36750 20 2f 2a 20 63 6f 6e 63 68 20 66 69 6c 65 20 68   /* conch file h
36760 65 61 64 65 72 20 6c 65 6e 67 74 68 20 2a 2f 0a  eader length */.
36770 23 64 65 66 69 6e 65 20 50 52 4f 58 59 5f 50 41  #define PROXY_PA
36780 54 48 49 4e 44 45 58 20 20 20 20 28 50 52 4f 58  THINDEX    (PROX
36790 59 5f 48 45 41 44 45 52 4c 45 4e 2b 50 52 4f 58  Y_HEADERLEN+PROX
367a0 59 5f 48 4f 53 54 49 44 4c 45 4e 29 0a 23 64 65  Y_HOSTIDLEN).#de
367b0 66 69 6e 65 20 50 52 4f 58 59 5f 4d 41 58 43 4f  fine PROXY_MAXCO
367c0 4e 43 48 4c 45 4e 20 20 28 50 52 4f 58 59 5f 48  NCHLEN  (PROXY_H
367d0 45 41 44 45 52 4c 45 4e 2b 50 52 4f 58 59 5f 48  EADERLEN+PROXY_H
367e0 4f 53 54 49 44 4c 45 4e 2b 4d 41 58 50 41 54 48  OSTIDLEN+MAXPATH
367f0 4c 45 4e 29 0a 0a 2f 2a 20 0a 2a 2a 20 54 61 6b  LEN)../* .** Tak
36800 65 73 20 61 6e 20 6f 70 65 6e 20 63 6f 6e 63 68  es an open conch
36810 20 66 69 6c 65 2c 20 63 6f 70 69 65 73 20 74 68   file, copies th
36820 65 20 63 6f 6e 74 65 6e 74 73 20 74 6f 20 61 20  e contents to a 
36830 6e 65 77 20 70 61 74 68 20 61 6e 64 20 74 68 65  new path and the
36840 6e 20 6d 6f 76 65 73 20 0a 2a 2a 20 69 74 20 62  n moves .** it b
36850 61 63 6b 2e 20 20 54 68 65 20 6e 65 77 6c 79 20  ack.  The newly 
36860 63 72 65 61 74 65 64 20 66 69 6c 65 27 73 20 66  created file's f
36870 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 69  ile descriptor i
36880 73 20 61 73 73 69 67 6e 65 64 20 74 6f 20 74 68  s assigned to th
36890 65 0a 2a 2a 20 63 6f 6e 63 68 20 66 69 6c 65 20  e.** conch file 
368a0 73 74 72 75 63 74 75 72 65 20 61 6e 64 20 66 69  structure and fi
368b0 6e 61 6c 6c 79 20 74 68 65 20 6f 72 69 67 69 6e  nally the origin
368c0 61 6c 20 63 6f 6e 63 68 20 66 69 6c 65 20 64 65  al conch file de
368d0 73 63 72 69 70 74 6f 72 20 69 73 20 0a 2a 2a 20  scriptor is .** 
368e0 63 6c 6f 73 65 64 2e 20 20 52 65 74 75 72 6e 73  closed.  Returns
368f0 20 7a 65 72 6f 20 69 66 20 73 75 63 63 65 73 73   zero if success
36900 66 75 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ful..*/.static i
36910 6e 74 20 70 72 6f 78 79 42 72 65 61 6b 43 6f 6e  nt proxyBreakCon
36920 63 68 4c 6f 63 6b 28 75 6e 69 78 46 69 6c 65 20  chLock(unixFile 
36930 2a 70 46 69 6c 65 2c 20 75 75 69 64 5f 74 20 6d  *pFile, uuid_t m
36940 79 48 6f 73 74 49 44 29 7b 0a 20 20 70 72 6f 78  yHostID){.  prox
36950 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20  yLockingContext 
36960 2a 70 43 74 78 20 3d 20 28 70 72 6f 78 79 4c 6f  *pCtx = (proxyLo
36970 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 29 70  ckingContext *)p
36980 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e  File->lockingCon
36990 74 65 78 74 3b 20 0a 20 20 75 6e 69 78 46 69 6c  text; .  unixFil
369a0 65 20 2a 63 6f 6e 63 68 46 69 6c 65 20 3d 20 70  e *conchFile = p
369b0 43 74 78 2d 3e 63 6f 6e 63 68 46 69 6c 65 3b 0a  Ctx->conchFile;.
369c0 20 20 63 68 61 72 20 74 50 61 74 68 5b 4d 41 58    char tPath[MAX
369d0 50 41 54 48 4c 45 4e 5d 3b 0a 20 20 63 68 61 72  PATHLEN];.  char
369e0 20 62 75 66 5b 50 52 4f 58 59 5f 4d 41 58 43 4f   buf[PROXY_MAXCO
369f0 4e 43 48 4c 45 4e 5d 3b 0a 20 20 63 68 61 72 20  NCHLEN];.  char 
36a00 2a 63 50 61 74 68 20 3d 20 70 43 74 78 2d 3e 63  *cPath = pCtx->c
36a10 6f 6e 63 68 46 69 6c 65 50 61 74 68 3b 0a 20 20  onchFilePath;.  
36a20 73 69 7a 65 5f 74 20 72 65 61 64 4c 65 6e 20 3d  size_t readLen =
36a30 20 30 3b 0a 20 20 73 69 7a 65 5f 74 20 70 61 74   0;.  size_t pat
36a40 68 4c 65 6e 20 3d 20 30 3b 0a 20 20 63 68 61 72  hLen = 0;.  char
36a50 20 65 72 72 6d 73 67 5b 36 34 5d 20 3d 20 22 22   errmsg[64] = ""
36a60 3b 0a 20 20 69 6e 74 20 66 64 20 3d 20 2d 31 3b  ;.  int fd = -1;
36a70 0a 20 20 69 6e 74 20 72 63 20 3d 20 2d 31 3b 0a  .  int rc = -1;.
36a80 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
36a90 45 52 28 6d 79 48 6f 73 74 49 44 29 3b 0a 0a 20  ER(myHostID);.. 
36aa0 20 2f 2a 20 63 72 65 61 74 65 20 61 20 6e 65 77   /* create a new
36ab0 20 70 61 74 68 20 62 79 20 72 65 70 6c 61 63 65   path by replace
36ac0 20 74 68 65 20 74 72 61 69 6c 69 6e 67 20 27 2d   the trailing '-
36ad0 63 6f 6e 63 68 27 20 77 69 74 68 20 27 2d 62 72  conch' with '-br
36ae0 65 61 6b 27 20 2a 2f 0a 20 20 70 61 74 68 4c 65  eak' */.  pathLe
36af0 6e 20 3d 20 73 74 72 6c 63 70 79 28 74 50 61 74  n = strlcpy(tPat
36b00 68 2c 20 63 50 61 74 68 2c 20 4d 41 58 50 41 54  h, cPath, MAXPAT
36b10 48 4c 45 4e 29 3b 0a 20 20 69 66 28 20 70 61 74  HLEN);.  if( pat
36b20 68 4c 65 6e 3e 4d 41 58 50 41 54 48 4c 45 4e 20  hLen>MAXPATHLEN 
36b30 7c 7c 20 70 61 74 68 4c 65 6e 3c 36 20 7c 7c 20  || pathLen<6 || 
36b40 0a 20 20 20 20 20 28 73 74 72 6c 63 70 79 28 26  .     (strlcpy(&
36b50 74 50 61 74 68 5b 70 61 74 68 4c 65 6e 2d 35 5d  tPath[pathLen-5]
36b60 2c 20 22 62 72 65 61 6b 22 2c 20 36 29 20 21 3d  , "break", 6) !=
36b70 20 35 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74   5) ){.    sqlit
36b80 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65  e3_snprintf(size
36b90 6f 66 28 65 72 72 6d 73 67 29 2c 65 72 72 6d 73  of(errmsg),errms
36ba0 67 2c 22 70 61 74 68 20 65 72 72 6f 72 20 28 6c  g,"path error (l
36bb0 65 6e 20 25 64 29 22 2c 28 69 6e 74 29 70 61 74  en %d)",(int)pat
36bc0 68 4c 65 6e 29 3b 0a 20 20 20 20 67 6f 74 6f 20  hLen);.    goto 
36bd0 65 6e 64 5f 62 72 65 61 6b 6c 6f 63 6b 3b 0a 20  end_breaklock;. 
36be0 20 7d 0a 20 20 2f 2a 20 72 65 61 64 20 74 68 65   }.  /* read the
36bf0 20 63 6f 6e 63 68 20 63 6f 6e 74 65 6e 74 20 2a   conch content *
36c00 2f 0a 20 20 72 65 61 64 4c 65 6e 20 3d 20 6f 73  /.  readLen = os
36c10 50 72 65 61 64 28 63 6f 6e 63 68 46 69 6c 65 2d  Pread(conchFile-
36c20 3e 68 2c 20 62 75 66 2c 20 50 52 4f 58 59 5f 4d  >h, buf, PROXY_M
36c30 41 58 43 4f 4e 43 48 4c 45 4e 2c 20 30 29 3b 0a  AXCONCHLEN, 0);.
36c40 20 20 69 66 28 20 72 65 61 64 4c 65 6e 3c 50 52    if( readLen<PR
36c50 4f 58 59 5f 50 41 54 48 49 4e 44 45 58 20 29 7b  OXY_PATHINDEX ){
36c60 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70  .    sqlite3_snp
36c70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 65 72 72  rintf(sizeof(err
36c80 6d 73 67 29 2c 65 72 72 6d 73 67 2c 22 72 65 61  msg),errmsg,"rea
36c90 64 20 65 72 72 6f 72 20 28 6c 65 6e 20 25 64 29  d error (len %d)
36ca0 22 2c 28 69 6e 74 29 72 65 61 64 4c 65 6e 29 3b  ",(int)readLen);
36cb0 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 62 72  .    goto end_br
36cc0 65 61 6b 6c 6f 63 6b 3b 0a 20 20 7d 0a 20 20 2f  eaklock;.  }.  /
36cd0 2a 20 77 72 69 74 65 20 69 74 20 6f 75 74 20 74  * write it out t
36ce0 6f 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20  o the temporary 
36cf0 62 72 65 61 6b 20 66 69 6c 65 20 2a 2f 0a 20 20  break file */.  
36d00 66 64 20 3d 20 72 6f 62 75 73 74 5f 6f 70 65 6e  fd = robust_open
36d10 28 74 50 61 74 68 2c 20 28 4f 5f 52 44 57 52 7c  (tPath, (O_RDWR|
36d20 4f 5f 43 52 45 41 54 7c 4f 5f 45 58 43 4c 29 2c  O_CREAT|O_EXCL),
36d30 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
36d40 20 20 20 20 53 51 4c 49 54 45 5f 44 45 46 41 55      SQLITE_DEFAU
36d50 4c 54 5f 46 49 4c 45 5f 50 45 52 4d 49 53 53 49  LT_FILE_PERMISSI
36d60 4f 4e 53 29 3b 0a 20 20 69 66 28 20 66 64 3c 30  ONS);.  if( fd<0
36d70 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
36d80 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28  snprintf(sizeof(
36d90 65 72 72 6d 73 67 29 2c 20 65 72 72 6d 73 67 2c  errmsg), errmsg,
36da0 20 22 63 72 65 61 74 65 20 66 61 69 6c 65 64 20   "create failed 
36db0 28 25 64 29 22 2c 20 65 72 72 6e 6f 29 3b 0a 20  (%d)", errno);. 
36dc0 20 20 20 67 6f 74 6f 20 65 6e 64 5f 62 72 65 61     goto end_brea
36dd0 6b 6c 6f 63 6b 3b 0a 20 20 7d 0a 20 20 69 66 28  klock;.  }.  if(
36de0 20 6f 73 50 77 72 69 74 65 28 66 64 2c 20 62 75   osPwrite(fd, bu
36df0 66 2c 20 72 65 61 64 4c 65 6e 2c 20 30 29 20 21  f, readLen, 0) !
36e00 3d 20 28 73 73 69 7a 65 5f 74 29 72 65 61 64 4c  = (ssize_t)readL
36e10 65 6e 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  en ){.    sqlite
36e20 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f  3_snprintf(sizeo
36e30 66 28 65 72 72 6d 73 67 29 2c 20 65 72 72 6d 73  f(errmsg), errms
36e40 67 2c 20 22 77 72 69 74 65 20 66 61 69 6c 65 64  g, "write failed
36e50 20 28 25 64 29 22 2c 20 65 72 72 6e 6f 29 3b 0a   (%d)", errno);.
36e60 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 62 72 65      goto end_bre
36e70 61 6b 6c 6f 63 6b 3b 0a 20 20 7d 0a 20 20 69 66  aklock;.  }.  if
36e80 28 20 72 65 6e 61 6d 65 28 74 50 61 74 68 2c 20  ( rename(tPath, 
36e90 63 50 61 74 68 29 20 29 7b 0a 20 20 20 20 73 71  cPath) ){.    sq
36ea0 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73  lite3_snprintf(s
36eb0 69 7a 65 6f 66 28 65 72 72 6d 73 67 29 2c 20 65  izeof(errmsg), e
36ec0 72 72 6d 73 67 2c 20 22 72 65 6e 61 6d 65 20 66  rrmsg, "rename f
36ed0 61 69 6c 65 64 20 28 25 64 29 22 2c 20 65 72 72  ailed (%d)", err
36ee0 6e 6f 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65 6e  no);.    goto en
36ef0 64 5f 62 72 65 61 6b 6c 6f 63 6b 3b 0a 20 20 7d  d_breaklock;.  }
36f00 0a 20 20 72 63 20 3d 20 30 3b 0a 20 20 66 70 72  .  rc = 0;.  fpr
36f10 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 62 72  intf(stderr, "br
36f20 6f 6b 65 20 73 74 61 6c 65 20 6c 6f 63 6b 20 6f  oke stale lock o
36f30 6e 20 25 73 5c 6e 22 2c 20 63 50 61 74 68 29 3b  n %s\n", cPath);
36f40 0a 20 20 72 6f 62 75 73 74 5f 63 6c 6f 73 65 28  .  robust_close(
36f50 70 46 69 6c 65 2c 20 63 6f 6e 63 68 46 69 6c 65  pFile, conchFile
36f60 2d 3e 68 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a  ->h, __LINE__);.
36f70 20 20 63 6f 6e 63 68 46 69 6c 65 2d 3e 68 20 3d    conchFile->h =
36f80 20 66 64 3b 0a 20 20 63 6f 6e 63 68 46 69 6c 65   fd;.  conchFile
36f90 2d 3e 6f 70 65 6e 46 6c 61 67 73 20 3d 20 4f 5f  ->openFlags = O_
36fa0 52 44 57 52 20 7c 20 4f 5f 43 52 45 41 54 3b 0a  RDWR | O_CREAT;.
36fb0 0a 65 6e 64 5f 62 72 65 61 6b 6c 6f 63 6b 3a 0a  .end_breaklock:.
36fc0 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
36fd0 69 66 28 20 66 64 3e 3d 30 20 29 7b 0a 20 20 20  if( fd>=0 ){.   
36fe0 20 20 20 6f 73 55 6e 6c 69 6e 6b 28 74 50 61 74     osUnlink(tPat
36ff0 68 29 3b 0a 20 20 20 20 20 20 72 6f 62 75 73 74  h);.      robust
37000 5f 63 6c 6f 73 65 28 70 46 69 6c 65 2c 20 66 64  _close(pFile, fd
37010 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20 20  , __LINE__);.   
37020 20 7d 0a 20 20 20 20 66 70 72 69 6e 74 66 28 73   }.    fprintf(s
37030 74 64 65 72 72 2c 20 22 66 61 69 6c 65 64 20 74  tderr, "failed t
37040 6f 20 62 72 65 61 6b 20 73 74 61 6c 65 20 6c 6f  o break stale lo
37050 63 6b 20 6f 6e 20 25 73 2c 20 25 73 5c 6e 22 2c  ck on %s, %s\n",
37060 20 63 50 61 74 68 2c 20 65 72 72 6d 73 67 29 3b   cPath, errmsg);
37070 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
37080 3b 0a 7d 0a 0a 2f 2a 20 54 61 6b 65 20 74 68 65  ;.}../* Take the
37090 20 72 65 71 75 65 73 74 65 64 20 6c 6f 63 6b 20   requested lock 
370a0 6f 6e 20 74 68 65 20 63 6f 6e 63 68 20 66 69 6c  on the conch fil
370b0 65 20 61 6e 64 20 62 72 65 61 6b 20 61 20 73 74  e and break a st
370c0 61 6c 65 20 6c 6f 63 6b 20 69 66 20 74 68 65 20  ale lock if the 
370d0 0a 2a 2a 20 68 6f 73 74 20 69 64 20 6d 61 74 63  .** host id matc
370e0 68 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  hes..*/.static i
370f0 6e 74 20 70 72 6f 78 79 43 6f 6e 63 68 4c 6f 63  nt proxyConchLoc
37100 6b 28 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c  k(unixFile *pFil
37110 65 2c 20 75 75 69 64 5f 74 20 6d 79 48 6f 73 74  e, uuid_t myHost
37120 49 44 2c 20 69 6e 74 20 6c 6f 63 6b 54 79 70 65  ID, int lockType
37130 29 7b 0a 20 20 70 72 6f 78 79 4c 6f 63 6b 69 6e  ){.  proxyLockin
37140 67 43 6f 6e 74 65 78 74 20 2a 70 43 74 78 20 3d  gContext *pCtx =
37150 20 28 70 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f   (proxyLockingCo
37160 6e 74 65 78 74 20 2a 29 70 46 69 6c 65 2d 3e 6c  ntext *)pFile->l
37170 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 20 0a  ockingContext; .
37180 20 20 75 6e 69 78 46 69 6c 65 20 2a 63 6f 6e 63    unixFile *conc
37190 68 46 69 6c 65 20 3d 20 70 43 74 78 2d 3e 63 6f  hFile = pCtx->co
371a0 6e 63 68 46 69 6c 65 3b 0a 20 20 69 6e 74 20 72  nchFile;.  int r
371b0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
371c0 20 73 74 72 75 63 74 20 74 69 6d 65 73 70 65 63   struct timespec
371d0 20 63 6f 6e 63 68 4d 6f 64 54 69 6d 65 3b 0a 20   conchModTime;. 
371e0 20 0a 20 20 64 6f 20 7b 0a 20 20 20 20 72 63 20   .  do {.    rc 
371f0 3d 20 63 6f 6e 63 68 46 69 6c 65 2d 3e 70 4d 65  = conchFile->pMe
37200 74 68 6f 64 2d 3e 78 4c 6f 63 6b 28 28 73 71 6c  thod->xLock((sql
37210 69 74 65 33 5f 66 69 6c 65 2a 29 63 6f 6e 63 68  ite3_file*)conch
37220 46 69 6c 65 2c 20 6c 6f 63 6b 54 79 70 65 29 3b  File, lockType);
37230 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
37240 49 54 45 5f 42 55 53 59 20 29 7b 0a 20 20 20 20  ITE_BUSY ){.    
37250 20 20 70 43 74 78 2d 3e 6e 46 61 69 6c 73 20 2b    pCtx->nFails +
37260 2b 3b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74  +;.      /* If t
37270 68 65 20 6c 6f 63 6b 20 66 61 69 6c 65 64 20 28  he lock failed (
37280 62 75 73 79 29 3a 0a 20 20 20 20 20 20 20 2a 20  busy):.       * 
37290 31 73 74 20 74 72 79 3a 20 67 65 74 20 74 68 65  1st try: get the
372a0 20 6d 6f 64 20 74 69 6d 65 20 6f 66 20 74 68 65   mod time of the
372b0 20 63 6f 6e 63 68 2c 20 77 61 69 74 20 30 2e 35   conch, wait 0.5
372c0 73 20 61 6e 64 20 74 72 79 20 61 67 61 69 6e 2e  s and try again.
372d0 20 0a 20 20 20 20 20 20 20 2a 20 32 6e 64 20 74   .       * 2nd t
372e0 72 79 3a 20 66 61 69 6c 20 69 66 20 74 68 65 20  ry: fail if the 
372f0 6d 6f 64 20 74 69 6d 65 20 63 68 61 6e 67 65 64  mod time changed
37300 20 6f 72 20 68 6f 73 74 20 69 64 20 69 73 20 64   or host id is d
37310 69 66 66 65 72 65 6e 74 2c 20 77 61 69 74 20 0a  ifferent, wait .
37320 20 20 20 20 20 20 20 2a 20 20 20 20 20 20 20 20         *        
37330 20 20 20 31 30 20 73 65 63 20 61 6e 64 20 74 72     10 sec and tr
37340 79 20 61 67 61 69 6e 0a 20 20 20 20 20 20 20 2a  y again.       *
37350 20 33 72 64 20 74 72 79 3a 20 62 72 65 61 6b 20   3rd try: break 
37360 74 68 65 20 6c 6f 63 6b 20 75 6e 6c 65 73 73 20  the lock unless 
37370 74 68 65 20 6d 6f 64 20 74 69 6d 65 20 68 61 73  the mod time has
37380 20 63 68 61 6e 67 65 64 2e 0a 20 20 20 20 20 20   changed..      
37390 20 2a 2f 0a 20 20 20 20 20 20 73 74 72 75 63 74   */.      struct
373a0 20 73 74 61 74 20 62 75 66 3b 0a 20 20 20 20 20   stat buf;.     
373b0 20 69 66 28 20 6f 73 46 73 74 61 74 28 63 6f 6e   if( osFstat(con
373c0 63 68 46 69 6c 65 2d 3e 68 2c 20 26 62 75 66 29  chFile->h, &buf)
373d0 20 29 7b 0a 20 20 20 20 20 20 20 20 70 46 69 6c   ){.        pFil
373e0 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 65  e->lastErrno = e
373f0 72 72 6e 6f 3b 0a 20 20 20 20 20 20 20 20 72 65  rrno;.        re
37400 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52  turn SQLITE_IOER
37410 52 5f 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 7d 0a  R_LOCK;.      }.
37420 20 20 20 20 20 20 0a 20 20 20 20 20 20 69 66 28        .      if(
37430 20 70 43 74 78 2d 3e 6e 46 61 69 6c 73 3d 3d 31   pCtx->nFails==1
37440 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 6e 63   ){.        conc
37450 68 4d 6f 64 54 69 6d 65 20 3d 20 62 75 66 2e 73  hModTime = buf.s
37460 74 5f 6d 74 69 6d 65 73 70 65 63 3b 0a 20 20 20  t_mtimespec;.   
37470 20 20 20 20 20 75 73 6c 65 65 70 28 35 30 30 30       usleep(5000
37480 30 30 29 3b 20 2f 2a 20 77 61 69 74 20 30 2e 35  00); /* wait 0.5
37490 20 73 65 63 20 61 6e 64 20 74 72 79 20 74 68 65   sec and try the
374a0 20 6c 6f 63 6b 20 61 67 61 69 6e 2a 2f 0a 20 20   lock again*/.  
374b0 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 20        continue; 
374c0 20 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20   .      }..     
374d0 20 61 73 73 65 72 74 28 20 70 43 74 78 2d 3e 6e   assert( pCtx->n
374e0 46 61 69 6c 73 3e 31 20 29 3b 0a 20 20 20 20 20  Fails>1 );.     
374f0 20 69 66 28 20 63 6f 6e 63 68 4d 6f 64 54 69 6d   if( conchModTim
37500 65 2e 74 76 5f 73 65 63 20 21 3d 20 62 75 66 2e  e.tv_sec != buf.
37510 73 74 5f 6d 74 69 6d 65 73 70 65 63 2e 74 76 5f  st_mtimespec.tv_
37520 73 65 63 20 7c 7c 20 0a 20 20 20 20 20 20 20 20  sec || .        
37530 20 63 6f 6e 63 68 4d 6f 64 54 69 6d 65 2e 74 76   conchModTime.tv
37540 5f 6e 73 65 63 20 21 3d 20 62 75 66 2e 73 74 5f  _nsec != buf.st_
37550 6d 74 69 6d 65 73 70 65 63 2e 74 76 5f 6e 73 65  mtimespec.tv_nse
37560 63 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74  c ){.        ret
37570 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 3b  urn SQLITE_BUSY;
37580 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 0a  .      }.      .
37590 20 20 20 20 20 20 69 66 28 20 70 43 74 78 2d 3e        if( pCtx->
375a0 6e 46 61 69 6c 73 3d 3d 32 20 29 7b 20 20 0a 20  nFails==2 ){  . 
375b0 20 20 20 20 20 20 20 63 68 61 72 20 74 42 75 66         char tBuf
375c0 5b 50 52 4f 58 59 5f 4d 41 58 43 4f 4e 43 48 4c  [PROXY_MAXCONCHL
375d0 45 4e 5d 3b 0a 20 20 20 20 20 20 20 20 69 6e 74  EN];.        int
375e0 20 6c 65 6e 20 3d 20 6f 73 50 72 65 61 64 28 63   len = osPread(c
375f0 6f 6e 63 68 46 69 6c 65 2d 3e 68 2c 20 74 42 75  onchFile->h, tBu
37600 66 2c 20 50 52 4f 58 59 5f 4d 41 58 43 4f 4e 43  f, PROXY_MAXCONC
37610 48 4c 45 4e 2c 20 30 29 3b 0a 20 20 20 20 20 20  HLEN, 0);.      
37620 20 20 69 66 28 20 6c 65 6e 3c 30 20 29 7b 0a 20    if( len<0 ){. 
37630 20 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e           pFile->
37640 6c 61 73 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e  lastErrno = errn
37650 6f 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74  o;.          ret
37660 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  urn SQLITE_IOERR
37670 5f 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 20 20 7d  _LOCK;.        }
37680 0a 20 20 20 20 20 20 20 20 69 66 28 20 6c 65 6e  .        if( len
37690 3e 50 52 4f 58 59 5f 50 41 54 48 49 4e 44 45 58  >PROXY_PATHINDEX
376a0 20 26 26 20 74 42 75 66 5b 30 5d 3d 3d 28 63 68   && tBuf[0]==(ch
376b0 61 72 29 50 52 4f 58 59 5f 43 4f 4e 43 48 56 45  ar)PROXY_CONCHVE
376c0 52 53 49 4f 4e 29 7b 0a 20 20 20 20 20 20 20 20  RSION){.        
376d0 20 20 2f 2a 20 64 6f 6e 27 74 20 62 72 65 61 6b    /* don't break
376e0 20 74 68 65 20 6c 6f 63 6b 20 69 66 20 74 68 65   the lock if the
376f0 20 68 6f 73 74 20 69 64 20 64 6f 65 73 6e 27 74   host id doesn't
37700 20 6d 61 74 63 68 2c 20 62 75 74 20 64 6f 20 6c   match, but do l
37710 6f 67 0a 20 20 20 20 20 20 20 20 20 20 20 2a 20  og.           * 
37720 61 6e 20 65 72 72 6f 72 20 74 6f 20 63 6f 6e 73  an error to cons
37730 6f 6c 65 20 73 6f 20 75 73 65 72 73 20 63 61 6e  ole so users can
37740 20 64 69 61 67 6e 6f 73 65 20 73 74 61 6c 65 20   diagnose stale 
37750 4e 46 53 20 6c 6f 63 6b 73 20 6d 6f 72 65 20 0a  NFS locks more .
37760 20 20 20 20 20 20 20 20 20 20 20 2a 20 65 61 73             * eas
37770 69 6c 79 20 0a 20 20 20 20 20 20 20 20 20 20 20  ily .           
37780 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  */.          if(
37790 20 30 21 3d 6d 65 6d 63 6d 70 28 26 74 42 75 66   0!=memcmp(&tBuf
377a0 5b 50 52 4f 58 59 5f 48 45 41 44 45 52 4c 45 4e  [PROXY_HEADERLEN
377b0 5d 2c 20 6d 79 48 6f 73 74 49 44 2c 20 50 52 4f  ], myHostID, PRO
377c0 58 59 5f 48 4f 53 54 49 44 4c 45 4e 29 20 29 7b  XY_HOSTIDLEN) ){
377d0 0a 20 20 20 20 20 20 20 20 20 20 20 20 75 75 69  .            uui
377e0 64 5f 74 20 63 6f 6e 63 68 55 55 49 44 3b 0a 20  d_t conchUUID;. 
377f0 20 20 20 20 20 20 20 20 20 20 20 75 75 69 64 5f             uuid_
37800 73 74 72 69 6e 67 5f 74 20 63 6f 6e 63 68 55 55  string_t conchUU
37810 49 44 53 74 72 69 6e 67 3b 0a 20 20 20 20 20 20  IDString;.      
37820 20 20 20 20 20 20 75 75 69 64 5f 73 74 72 69 6e        uuid_strin
37830 67 5f 74 20 6d 79 55 55 49 44 53 74 72 69 6e 67  g_t myUUIDString
37840 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 61 73  ;.            as
37850 73 65 72 74 28 50 52 4f 58 59 5f 48 4f 53 54 49  sert(PROXY_HOSTI
37860 44 4c 45 4e 20 3d 3d 20 73 69 7a 65 6f 66 28 75  DLEN == sizeof(u
37870 75 69 64 5f 74 29 29 3b 0a 20 20 20 20 20 20 20  uid_t));.       
37880 20 20 20 20 20 6d 65 6d 63 70 79 28 63 6f 6e 63       memcpy(conc
37890 68 55 55 49 44 2c 20 26 74 42 75 66 5b 50 52 4f  hUUID, &tBuf[PRO
378a0 58 59 5f 48 45 41 44 45 52 4c 45 4e 5d 2c 20 50  XY_HEADERLEN], P
378b0 52 4f 58 59 5f 48 4f 53 54 49 44 4c 45 4e 29 3b  ROXY_HOSTIDLEN);
378c0 0a 20 20 20 20 20 20 20 20 20 20 20 20 75 75 69  .            uui
378d0 64 5f 75 6e 70 61 72 73 65 28 63 6f 6e 63 68 55  d_unparse(conchU
378e0 55 49 44 2c 20 63 6f 6e 63 68 55 55 49 44 53 74  UID, conchUUIDSt
378f0 72 69 6e 67 29 3b 0a 20 20 20 20 20 20 20 20 20  ring);.         
37900 20 20 20 75 75 69 64 5f 75 6e 70 61 72 73 65 28     uuid_unparse(
37910 6d 79 48 6f 73 74 49 44 2c 20 6d 79 55 55 49 44  myHostID, myUUID
37920 53 74 72 69 6e 67 29 3b 0a 20 20 20 20 20 20 20  String);.       
37930 20 20 20 20 20 66 70 72 69 6e 74 66 28 73 74 64       fprintf(std
37940 65 72 72 2c 20 22 45 52 52 4f 52 3a 20 73 71 6c  err, "ERROR: sql
37950 69 74 65 20 64 61 74 61 62 61 73 65 20 69 73 20  ite database is 
37960 6c 6f 63 6b 65 64 20 62 65 63 61 75 73 65 20 69  locked because i
37970 74 20 69 73 20 69 6e 20 75 73 65 20 22 0a 20 20  t is in use ".  
37980 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
37990 20 20 22 62 79 20 61 6e 6f 74 68 65 72 20 68 6f    "by another ho
379a0 73 74 20 74 68 61 74 20 68 6f 6c 64 73 20 61 20  st that holds a 
379b0 68 6f 73 74 2d 65 78 63 6c 75 73 69 76 65 20 6c  host-exclusive l
379c0 6f 63 6b 20 6f 6e 20 25 73 3b 20 22 0a 20 20 20  ock on %s; ".   
379d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
379e0 20 22 74 68 69 73 20 68 6f 73 74 20 28 55 55 49   "this host (UUI
379f0 44 20 25 73 29 20 63 61 6e 6e 6f 74 20 6f 76 65  D %s) cannot ove
37a00 72 72 69 64 65 20 74 68 65 20 68 6f 73 74 2d 65  rride the host-e
37a10 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20 22 0a  xclusive lock ".
37a20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
37a30 20 20 20 20 22 75 6e 74 69 6c 20 74 68 65 20 6f      "until the o
37a40 74 68 65 72 20 68 6f 73 74 20 28 55 55 49 44 20  ther host (UUID 
37a50 25 73 29 20 72 65 6c 65 61 73 65 73 20 69 74 73  %s) releases its
37a60 20 6c 6f 63 6b 73 20 6f 6e 20 25 73 5c 6e 22 2c   locks on %s\n",
37a70 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
37a80 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 7a 50 61        pFile->zPa
37a90 74 68 2c 20 6d 79 55 55 49 44 53 74 72 69 6e 67  th, myUUIDString
37aa0 2c 20 63 6f 6e 63 68 55 55 49 44 53 74 72 69 6e  , conchUUIDStrin
37ab0 67 2c 20 63 6f 6e 63 68 46 69 6c 65 2d 3e 7a 50  g, conchFile->zP
37ac0 61 74 68 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ath);.          
37ad0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
37ae0 42 55 53 59 3b 0a 20 20 20 20 20 20 20 20 20 20  BUSY;.          
37af0 7d 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  }.        }else{
37b00 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 64 6f  .          /* do
37b10 6e 27 74 20 62 72 65 61 6b 20 74 68 65 20 6c 6f  n't break the lo
37b20 63 6b 20 6f 6e 20 73 68 6f 72 74 20 72 65 61 64  ck on short read
37b30 20 6f 72 20 61 20 76 65 72 73 69 6f 6e 20 6d 69   or a version mi
37b40 73 6d 61 74 63 68 20 2a 2f 0a 20 20 20 20 20 20  smatch */.      
37b50 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
37b60 45 5f 42 55 53 59 3b 0a 20 20 20 20 20 20 20 20  E_BUSY;.        
37b70 7d 0a 20 20 20 20 20 20 20 20 75 73 6c 65 65 70  }.        usleep
37b80 28 31 30 30 30 30 30 30 30 29 3b 20 2f 2a 20 77  (10000000); /* w
37b90 61 69 74 20 31 30 20 73 65 63 20 61 6e 64 20 74  ait 10 sec and t
37ba0 72 79 20 74 68 65 20 6c 6f 63 6b 20 61 67 61 69  ry the lock agai
37bb0 6e 20 2a 2f 0a 20 20 20 20 20 20 20 20 63 6f 6e  n */.        con
37bc0 74 69 6e 75 65 3b 20 0a 20 20 20 20 20 20 7d 0a  tinue; .      }.
37bd0 20 20 20 20 20 20 0a 20 20 20 20 20 20 61 73 73        .      ass
37be0 65 72 74 28 20 70 43 74 78 2d 3e 6e 46 61 69 6c  ert( pCtx->nFail
37bf0 73 3e 3d 33 20 29 3b 0a 20 20 20 20 20 20 69 66  s>=3 );.      if
37c00 28 20 28 70 43 74 78 2d 3e 6e 46 61 69 6c 73 3d  ( (pCtx->nFails=
37c10 3d 33 29 26 26 28 30 3d 3d 70 72 6f 78 79 42 72  =3)&&(0==proxyBr
37c20 65 61 6b 43 6f 6e 63 68 4c 6f 63 6b 28 70 46 69  eakConchLock(pFi
37c30 6c 65 2c 20 6d 79 48 6f 73 74 49 44 29 29 20 29  le, myHostID)) )
37c40 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53  {.        rc = S
37c50 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20  QLITE_OK;.      
37c60 20 20 69 66 28 20 6c 6f 63 6b 54 79 70 65 3d 3d    if( lockType==
37c70 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 29  EXCLUSIVE_LOCK )
37c80 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  {.          rc =
37c90 20 63 6f 6e 63 68 46 69 6c 65 2d 3e 70 4d 65 74   conchFile->pMet
37ca0 68 6f 64 2d 3e 78 4c 6f 63 6b 28 28 73 71 6c 69  hod->xLock((sqli
37cb0 74 65 33 5f 66 69 6c 65 2a 29 63 6f 6e 63 68 46  te3_file*)conchF
37cc0 69 6c 65 2c 20 53 48 41 52 45 44 5f 4c 4f 43 4b  ile, SHARED_LOCK
37cd0 29 3b 20 20 20 20 20 20 20 20 20 20 0a 20 20 20  );          .   
37ce0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
37cf0 66 28 20 21 72 63 20 29 7b 0a 20 20 20 20 20 20  f( !rc ){.      
37d00 20 20 20 20 72 63 20 3d 20 63 6f 6e 63 68 46 69      rc = conchFi
37d10 6c 65 2d 3e 70 4d 65 74 68 6f 64 2d 3e 78 4c 6f  le->pMethod->xLo
37d20 63 6b 28 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  ck((sqlite3_file
37d30 2a 29 63 6f 6e 63 68 46 69 6c 65 2c 20 6c 6f 63  *)conchFile, loc
37d40 6b 54 79 70 65 29 3b 0a 20 20 20 20 20 20 20 20  kType);.        
37d50 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  }.      }.    }.
37d60 20 20 7d 20 77 68 69 6c 65 28 20 72 63 3d 3d 53    } while( rc==S
37d70 51 4c 49 54 45 5f 42 55 53 59 20 26 26 20 70 43  QLITE_BUSY && pC
37d80 74 78 2d 3e 6e 46 61 69 6c 73 3c 33 20 29 3b 0a  tx->nFails<3 );.
37d90 20 20 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a    .  return rc;.
37da0 7d 0a 0a 2f 2a 20 54 61 6b 65 73 20 74 68 65 20  }../* Takes the 
37db0 63 6f 6e 63 68 20 62 79 20 74 61 6b 69 6e 67 20  conch by taking 
37dc0 61 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 61 6e  a shared lock an
37dd0 64 20 72 65 61 64 20 74 68 65 20 63 6f 6e 74 65  d read the conte
37de0 6e 74 73 20 63 6f 6e 63 68 2c 20 69 66 20 0a 2a  nts conch, if .*
37df0 2a 20 6c 6f 63 6b 50 61 74 68 20 69 73 20 6e 6f  * lockPath is no
37e00 6e 2d 4e 55 4c 4c 2c 20 74 68 65 20 68 6f 73 74  n-NULL, the host
37e10 20 49 44 20 61 6e 64 20 6c 6f 63 6b 20 66 69 6c   ID and lock fil
37e20 65 20 70 61 74 68 20 6d 75 73 74 20 6d 61 74 63  e path must matc
37e30 68 2e 20 20 41 20 4e 55 4c 4c 20 0a 2a 2a 20 6c  h.  A NULL .** l
37e40 6f 63 6b 50 61 74 68 20 6d 65 61 6e 73 20 74 68  ockPath means th
37e50 61 74 20 74 68 65 20 6c 6f 63 6b 50 61 74 68 20  at the lockPath 
37e60 69 6e 20 74 68 65 20 63 6f 6e 63 68 20 66 69 6c  in the conch fil
37e70 65 20 77 69 6c 6c 20 62 65 20 75 73 65 64 20 69  e will be used i
37e80 66 20 74 68 65 20 0a 2a 2a 20 68 6f 73 74 20 49  f the .** host I
37e90 44 73 20 6d 61 74 63 68 2c 20 6f 72 20 61 20 6e  Ds match, or a n
37ea0 65 77 20 6c 6f 63 6b 20 70 61 74 68 20 77 69 6c  ew lock path wil
37eb0 6c 20 62 65 20 67 65 6e 65 72 61 74 65 64 20 61  l be generated a
37ec0 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 0a 2a 2a  utomatically .**
37ed0 20 61 6e 64 20 77 72 69 74 74 65 6e 20 74 6f 20   and written to 
37ee0 74 68 65 20 63 6f 6e 63 68 20 66 69 6c 65 2e 0a  the conch file..
37ef0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72  */.static int pr
37f00 6f 78 79 54 61 6b 65 43 6f 6e 63 68 28 75 6e 69  oxyTakeConch(uni
37f10 78 46 69 6c 65 20 2a 70 46 69 6c 65 29 7b 0a 20  xFile *pFile){. 
37f20 20 70 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e   proxyLockingCon
37f30 74 65 78 74 20 2a 70 43 74 78 20 3d 20 28 70 72  text *pCtx = (pr
37f40 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78  oxyLockingContex
37f50 74 20 2a 29 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69  t *)pFile->locki
37f60 6e 67 43 6f 6e 74 65 78 74 3b 20 0a 20 20 0a 20  ngContext; .  . 
37f70 20 69 66 28 20 70 43 74 78 2d 3e 63 6f 6e 63 68   if( pCtx->conch
37f80 48 65 6c 64 21 3d 30 20 29 7b 0a 20 20 20 20 72  Held!=0 ){.    r
37f90 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
37fa0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 75 6e  .  }else{.    un
37fb0 69 78 46 69 6c 65 20 2a 63 6f 6e 63 68 46 69 6c  ixFile *conchFil
37fc0 65 20 3d 20 70 43 74 78 2d 3e 63 6f 6e 63 68 46  e = pCtx->conchF
37fd0 69 6c 65 3b 0a 20 20 20 20 75 75 69 64 5f 74 20  ile;.    uuid_t 
37fe0 6d 79 48 6f 73 74 49 44 3b 0a 20 20 20 20 69 6e  myHostID;.    in
37ff0 74 20 70 45 72 72 6f 72 20 3d 20 30 3b 0a 20 20  t pError = 0;.  
38000 20 20 63 68 61 72 20 72 65 61 64 42 75 66 5b 50    char readBuf[P
38010 52 4f 58 59 5f 4d 41 58 43 4f 4e 43 48 4c 45 4e  ROXY_MAXCONCHLEN
38020 5d 3b 0a 20 20 20 20 63 68 61 72 20 6c 6f 63 6b  ];.    char lock
38030 50 61 74 68 5b 4d 41 58 50 41 54 48 4c 45 4e 5d  Path[MAXPATHLEN]
38040 3b 0a 20 20 20 20 63 68 61 72 20 2a 74 65 6d 70  ;.    char *temp
38050 4c 6f 63 6b 50 61 74 68 20 3d 20 4e 55 4c 4c 3b  LockPath = NULL;
38060 0a 20 20 20 20 69 6e 74 20 72 63 20 3d 20 53 51  .    int rc = SQ
38070 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 69 6e 74  LITE_OK;.    int
38080 20 63 72 65 61 74 65 43 6f 6e 63 68 20 3d 20 30   createConch = 0
38090 3b 0a 20 20 20 20 69 6e 74 20 68 6f 73 74 49 64  ;.    int hostId
380a0 4d 61 74 63 68 20 3d 20 30 3b 0a 20 20 20 20 69  Match = 0;.    i
380b0 6e 74 20 72 65 61 64 4c 65 6e 20 3d 20 30 3b 0a  nt readLen = 0;.
380c0 20 20 20 20 69 6e 74 20 74 72 79 4f 6c 64 4c 6f      int tryOldLo
380d0 63 6b 50 61 74 68 20 3d 20 30 3b 0a 20 20 20 20  ckPath = 0;.    
380e0 69 6e 74 20 66 6f 72 63 65 4e 65 77 4c 6f 63 6b  int forceNewLock
380f0 50 61 74 68 20 3d 20 30 3b 0a 20 20 20 20 0a 20  Path = 0;.    . 
38100 20 20 20 4f 53 54 52 41 43 45 28 28 22 54 41 4b     OSTRACE(("TAK
38110 45 43 4f 4e 43 48 20 20 25 64 20 66 6f 72 20 25  ECONCH  %d for %
38120 73 20 70 69 64 3d 25 64 5c 6e 22 2c 20 63 6f 6e  s pid=%d\n", con
38130 63 68 46 69 6c 65 2d 3e 68 2c 0a 20 20 20 20 20  chFile->h,.     
38140 20 20 20 20 20 20 20 20 28 70 43 74 78 2d 3e 6c          (pCtx->l
38150 6f 63 6b 50 72 6f 78 79 50 61 74 68 20 3f 20 70  ockProxyPath ? p
38160 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 50 61  Ctx->lockProxyPa
38170 74 68 20 3a 20 22 3a 61 75 74 6f 3a 22 29 2c 20  th : ":auto:"), 
38180 67 65 74 70 69 64 28 29 29 29 3b 0a 0a 20 20 20  getpid()));..   
38190 20 72 63 20 3d 20 70 72 6f 78 79 47 65 74 48 6f   rc = proxyGetHo
381a0 73 74 49 44 28 6d 79 48 6f 73 74 49 44 2c 20 26  stID(myHostID, &
381b0 70 45 72 72 6f 72 29 3b 0a 20 20 20 20 69 66 28  pError);.    if(
381c0 20 28 72 63 26 30 78 66 66 29 3d 3d 53 51 4c 49   (rc&0xff)==SQLI
381d0 54 45 5f 49 4f 45 52 52 20 29 7b 0a 20 20 20 20  TE_IOERR ){.    
381e0 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72    pFile->lastErr
381f0 6e 6f 20 3d 20 70 45 72 72 6f 72 3b 0a 20 20 20  no = pError;.   
38200 20 20 20 67 6f 74 6f 20 65 6e 64 5f 74 61 6b 65     goto end_take
38210 63 6f 6e 63 68 3b 0a 20 20 20 20 7d 0a 20 20 20  conch;.    }.   
38220 20 72 63 20 3d 20 70 72 6f 78 79 43 6f 6e 63 68   rc = proxyConch
38230 4c 6f 63 6b 28 70 46 69 6c 65 2c 20 6d 79 48 6f  Lock(pFile, myHo
38240 73 74 49 44 2c 20 53 48 41 52 45 44 5f 4c 4f 43  stID, SHARED_LOC
38250 4b 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  K);.    if( rc!=
38260 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
38270 20 20 20 67 6f 74 6f 20 65 6e 64 5f 74 61 6b 65     goto end_take
38280 63 6f 6e 63 68 3b 0a 20 20 20 20 7d 0a 20 20 20  conch;.    }.   
38290 20 2f 2a 20 72 65 61 64 20 74 68 65 20 65 78 69   /* read the exi
382a0 73 74 69 6e 67 20 63 6f 6e 63 68 20 66 69 6c 65  sting conch file
382b0 20 2a 2f 0a 20 20 20 20 72 65 61 64 4c 65 6e 20   */.    readLen 
382c0 3d 20 73 65 65 6b 41 6e 64 52 65 61 64 28 28 75  = seekAndRead((u
382d0 6e 69 78 46 69 6c 65 2a 29 63 6f 6e 63 68 46 69  nixFile*)conchFi
382e0 6c 65 2c 20 30 2c 20 72 65 61 64 42 75 66 2c 20  le, 0, readBuf, 
382f0 50 52 4f 58 59 5f 4d 41 58 43 4f 4e 43 48 4c 45  PROXY_MAXCONCHLE
38300 4e 29 3b 0a 20 20 20 20 69 66 28 20 72 65 61 64  N);.    if( read
38310 4c 65 6e 3c 30 20 29 7b 0a 20 20 20 20 20 20 2f  Len<0 ){.      /
38320 2a 20 49 2f 4f 20 65 72 72 6f 72 3a 20 6c 61 73  * I/O error: las
38330 74 45 72 72 6e 6f 20 73 65 74 20 62 79 20 73 65  tErrno set by se
38340 65 6b 41 6e 64 52 65 61 64 20 2a 2f 0a 20 20 20  ekAndRead */.   
38350 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72     pFile->lastEr
38360 72 6e 6f 20 3d 20 63 6f 6e 63 68 46 69 6c 65 2d  rno = conchFile-
38370 3e 6c 61 73 74 45 72 72 6e 6f 3b 0a 20 20 20 20  >lastErrno;.    
38380 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f    rc = SQLITE_IO
38390 45 52 52 5f 52 45 41 44 3b 0a 20 20 20 20 20 20  ERR_READ;.      
383a0 67 6f 74 6f 20 65 6e 64 5f 74 61 6b 65 63 6f 6e  goto end_takecon
383b0 63 68 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  ch;.    }else if
383c0 28 20 72 65 61 64 4c 65 6e 3c 3d 28 50 52 4f 58  ( readLen<=(PROX
383d0 59 5f 48 45 41 44 45 52 4c 45 4e 2b 50 52 4f 58  Y_HEADERLEN+PROX
383e0 59 5f 48 4f 53 54 49 44 4c 45 4e 29 20 7c 7c 20  Y_HOSTIDLEN) || 
383f0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65  .             re
38400 61 64 42 75 66 5b 30 5d 21 3d 28 63 68 61 72 29  adBuf[0]!=(char)
38410 50 52 4f 58 59 5f 43 4f 4e 43 48 56 45 52 53 49  PROXY_CONCHVERSI
38420 4f 4e 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 61  ON ){.      /* a
38430 20 73 68 6f 72 74 20 72 65 61 64 20 6f 72 20 76   short read or v
38440 65 72 73 69 6f 6e 20 66 6f 72 6d 61 74 20 6d 69  ersion format mi
38450 73 6d 61 74 63 68 20 6d 65 61 6e 73 20 77 65 20  smatch means we 
38460 6e 65 65 64 20 74 6f 20 63 72 65 61 74 65 20 61  need to create a
38470 20 6e 65 77 20 0a 20 20 20 20 20 20 2a 2a 20 63   new .      ** c
38480 6f 6e 63 68 20 66 69 6c 65 2e 20 0a 20 20 20 20  onch file. .    
38490 20 20 2a 2f 0a 20 20 20 20 20 20 63 72 65 61 74    */.      creat
384a0 65 43 6f 6e 63 68 20 3d 20 31 3b 0a 20 20 20 20  eConch = 1;.    
384b0 7d 0a 20 20 20 20 2f 2a 20 69 66 20 74 68 65 20  }.    /* if the 
384c0 68 6f 73 74 20 69 64 20 6d 61 74 63 68 65 73 20  host id matches 
384d0 61 6e 64 20 74 68 65 20 6c 6f 63 6b 20 70 61 74  and the lock pat
384e0 68 20 61 6c 72 65 61 64 79 20 65 78 69 73 74 73  h already exists
384f0 20 69 6e 20 74 68 65 20 63 6f 6e 63 68 0a 20 20   in the conch.  
38500 20 20 2a 2a 20 77 65 27 6c 6c 20 74 72 79 20 74    ** we'll try t
38510 6f 20 75 73 65 20 74 68 65 20 70 61 74 68 20 74  o use the path t
38520 68 65 72 65 2c 20 69 66 20 77 65 20 63 61 6e 27  here, if we can'
38530 74 20 6f 70 65 6e 20 74 68 61 74 20 70 61 74 68  t open that path
38540 2c 20 77 65 27 6c 6c 20 0a 20 20 20 20 2a 2a 20  , we'll .    ** 
38550 72 65 74 72 79 20 77 69 74 68 20 61 20 6e 65 77  retry with a new
38560 20 61 75 74 6f 2d 67 65 6e 65 72 61 74 65 64 20   auto-generated 
38570 70 61 74 68 20 0a 20 20 20 20 2a 2f 0a 20 20 20  path .    */.   
38580 20 64 6f 20 7b 20 2f 2a 20 69 6e 20 63 61 73 65   do { /* in case
38590 20 77 65 20 6e 65 65 64 20 74 6f 20 74 72 79 20   we need to try 
385a0 61 67 61 69 6e 20 66 6f 72 20 61 6e 20 3a 61 75  again for an :au
385b0 74 6f 3a 20 6e 61 6d 65 64 20 6c 6f 63 6b 20 66  to: named lock f
385c0 69 6c 65 20 2