/ Hex Artifact Content
Login

Artifact 28caddcd74e6f0ded69476de5cf3f3b670ed840a:


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 6e 63 6c 75 64 65 20 3c  no.h>.#include <
1140: 73 79 73 2f 6d 6d 61 6e 2e 68 3e 0a 0a 23 69 66  sys/mman.h>..#if
1150: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c   SQLITE_ENABLE_L
1160: 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 23 20 69  OCKING_STYLE.# i
1170: 6e 63 6c 75 64 65 20 3c 73 79 73 2f 69 6f 63 74  nclude <sys/ioct
1180: 6c 2e 68 3e 0a 23 20 69 66 20 4f 53 5f 56 58 57  l.h>.# if OS_VXW
1190: 4f 52 4b 53 0a 23 20 20 69 6e 63 6c 75 64 65 20  ORKS.#  include 
11a0: 3c 73 65 6d 61 70 68 6f 72 65 2e 68 3e 0a 23 20  <semaphore.h>.# 
11b0: 20 69 6e 63 6c 75 64 65 20 3c 6c 69 6d 69 74 73   include <limits
11c0: 2e 68 3e 0a 23 20 65 6c 73 65 0a 23 20 20 69 6e  .h>.# else.#  in
11d0: 63 6c 75 64 65 20 3c 73 79 73 2f 66 69 6c 65 2e  clude <sys/file.
11e0: 68 3e 0a 23 20 20 69 6e 63 6c 75 64 65 20 3c 73  h>.#  include <s
11f0: 79 73 2f 70 61 72 61 6d 2e 68 3e 0a 23 20 65 6e  ys/param.h>.# en
1200: 64 69 66 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  dif.#endif /* SQ
1210: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b  LITE_ENABLE_LOCK
1220: 49 4e 47 5f 53 54 59 4c 45 20 2a 2f 0a 0a 23 69  ING_STYLE */..#i
1230: 66 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c  f defined(__APPL
1240: 45 5f 5f 29 20 7c 7c 20 28 53 51 4c 49 54 45 5f  E__) || (SQLITE_
1250: 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53  ENABLE_LOCKING_S
1260: 54 59 4c 45 20 26 26 20 21 4f 53 5f 56 58 57 4f  TYLE && !OS_VXWO
1270: 52 4b 53 29 0a 23 20 69 6e 63 6c 75 64 65 20 3c  RKS).# include <
1280: 73 79 73 2f 6d 6f 75 6e 74 2e 68 3e 0a 23 65 6e  sys/mount.h>.#en
1290: 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 77  dif../*.** Allow
12a0: 65 64 20 76 61 6c 75 65 73 20 6f 66 20 75 6e 69  ed values of uni
12b0: 78 46 69 6c 65 2e 66 73 46 6c 61 67 73 0a 2a 2f  xFile.fsFlags.*/
12c0: 0a 23 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f  .#define SQLITE_
12d0: 46 53 46 4c 41 47 53 5f 49 53 5f 4d 53 44 4f 53  FSFLAGS_IS_MSDOS
12e0: 20 20 20 20 20 30 78 31 0a 0a 2f 2a 0a 2a 2a 20       0x1../*.** 
12f0: 49 66 20 77 65 20 61 72 65 20 74 6f 20 62 65 20  If we are to be 
1300: 74 68 72 65 61 64 2d 73 61 66 65 2c 20 69 6e 63  thread-safe, inc
1310: 6c 75 64 65 20 74 68 65 20 70 74 68 72 65 61 64  lude the pthread
1320: 73 20 68 65 61 64 65 72 20 61 6e 64 20 64 65 66  s header and def
1330: 69 6e 65 0a 2a 2a 20 74 68 65 20 53 51 4c 49 54  ine.** the SQLIT
1340: 45 5f 55 4e 49 58 5f 54 48 52 45 41 44 53 20 6d  E_UNIX_THREADS m
1350: 61 63 72 6f 2e 0a 2a 2f 0a 23 69 66 20 53 51 4c  acro..*/.#if SQL
1360: 49 54 45 5f 54 48 52 45 41 44 53 41 46 45 0a 23  ITE_THREADSAFE.#
1370: 20 69 6e 63 6c 75 64 65 20 3c 70 74 68 72 65 61   include <pthrea
1380: 64 2e 68 3e 0a 23 20 64 65 66 69 6e 65 20 53 51  d.h>.# define SQ
1390: 4c 49 54 45 5f 55 4e 49 58 5f 54 48 52 45 41 44  LITE_UNIX_THREAD
13a0: 53 20 31 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  S 1.#endif../*.*
13b0: 2a 20 44 65 66 61 75 6c 74 20 70 65 72 6d 69 73  * Default permis
13c0: 73 69 6f 6e 73 20 77 68 65 6e 20 63 72 65 61 74  sions when creat
13d0: 69 6e 67 20 61 20 6e 65 77 20 66 69 6c 65 0a 2a  ing a new file.*
13e0: 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
13f0: 5f 44 45 46 41 55 4c 54 5f 46 49 4c 45 5f 50 45  _DEFAULT_FILE_PE
1400: 52 4d 49 53 53 49 4f 4e 53 0a 23 20 64 65 66 69  RMISSIONS.# defi
1410: 6e 65 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c  ne SQLITE_DEFAUL
1420: 54 5f 46 49 4c 45 5f 50 45 52 4d 49 53 53 49 4f  T_FILE_PERMISSIO
1430: 4e 53 20 30 36 34 34 0a 23 65 6e 64 69 66 0a 0a  NS 0644.#endif..
1440: 2f 2a 0a 20 2a 2a 20 44 65 66 61 75 6c 74 20 70  /*. ** Default p
1450: 65 72 6d 69 73 73 69 6f 6e 73 20 77 68 65 6e 20  ermissions when 
1460: 63 72 65 61 74 69 6e 67 20 61 75 74 6f 20 70 72  creating auto pr
1470: 6f 78 79 20 64 69 72 0a 20 2a 2f 0a 23 69 66 6e  oxy dir. */.#ifn
1480: 64 65 66 20 53 51 4c 49 54 45 5f 44 45 46 41 55  def SQLITE_DEFAU
1490: 4c 54 5f 50 52 4f 58 59 44 49 52 5f 50 45 52 4d  LT_PROXYDIR_PERM
14a0: 49 53 53 49 4f 4e 53 0a 23 20 64 65 66 69 6e 65  ISSIONS.# define
14b0: 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f   SQLITE_DEFAULT_
14c0: 50 52 4f 58 59 44 49 52 5f 50 45 52 4d 49 53 53  PROXYDIR_PERMISS
14d0: 49 4f 4e 53 20 30 37 35 35 0a 23 65 6e 64 69 66  IONS 0755.#endif
14e0: 0a 0a 2f 2a 0a 2a 2a 20 4d 61 78 69 6d 75 6d 20  ../*.** Maximum 
14f0: 73 75 70 70 6f 72 74 65 64 20 70 61 74 68 2d 6c  supported path-l
1500: 65 6e 67 74 68 2e 0a 2a 2f 0a 23 64 65 66 69 6e  ength..*/.#defin
1510: 65 20 4d 41 58 5f 50 41 54 48 4e 41 4d 45 20 35  e MAX_PATHNAME 5
1520: 31 32 0a 0a 2f 2a 0a 2a 2a 20 4f 6e 6c 79 20 73  12../*.** Only s
1530: 65 74 20 74 68 65 20 6c 61 73 74 45 72 72 6e 6f  et the lastErrno
1540: 20 69 66 20 74 68 65 20 65 72 72 6f 72 20 63 6f   if the error co
1550: 64 65 20 69 73 20 61 20 72 65 61 6c 20 65 72 72  de is a real err
1560: 6f 72 20 61 6e 64 20 6e 6f 74 20 0a 2a 2a 20 61  or and not .** a
1570: 20 6e 6f 72 6d 61 6c 20 65 78 70 65 63 74 65 64   normal expected
1580: 20 72 65 74 75 72 6e 20 63 6f 64 65 20 6f 66 20   return code of 
1590: 53 51 4c 49 54 45 5f 42 55 53 59 20 6f 72 20 53  SQLITE_BUSY or S
15a0: 51 4c 49 54 45 5f 4f 4b 0a 2a 2f 0a 23 64 65 66  QLITE_OK.*/.#def
15b0: 69 6e 65 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f  ine IS_LOCK_ERRO
15c0: 52 28 78 29 20 20 28 28 78 20 21 3d 20 53 51 4c  R(x)  ((x != SQL
15d0: 49 54 45 5f 4f 4b 29 20 26 26 20 28 78 20 21 3d  ITE_OK) && (x !=
15e0: 20 53 51 4c 49 54 45 5f 42 55 53 59 29 29 0a 0a   SQLITE_BUSY))..
15f0: 2f 2a 20 46 6f 72 77 61 72 64 20 72 65 66 65 72  /* Forward refer
1600: 65 6e 63 65 73 20 2a 2f 0a 74 79 70 65 64 65 66  ences */.typedef
1610: 20 73 74 72 75 63 74 20 75 6e 69 78 53 68 6d 20   struct unixShm 
1620: 75 6e 69 78 53 68 6d 3b 20 20 20 20 20 20 20 20  unixShm;        
1630: 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e 6e 65 63         /* Connec
1640: 74 69 6f 6e 20 73 68 61 72 65 64 20 6d 65 6d 6f  tion shared memo
1650: 72 79 20 2a 2f 0a 74 79 70 65 64 65 66 20 73 74  ry */.typedef st
1660: 72 75 63 74 20 75 6e 69 78 53 68 6d 4e 6f 64 65  ruct unixShmNode
1670: 20 75 6e 69 78 53 68 6d 4e 6f 64 65 3b 20 20 20   unixShmNode;   
1680: 20 20 20 20 2f 2a 20 53 68 61 72 65 64 20 6d 65      /* Shared me
1690: 6d 6f 72 79 20 69 6e 73 74 61 6e 63 65 20 2a 2f  mory instance */
16a0: 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20  .typedef struct 
16b0: 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 75 6e  unixInodeInfo un
16c0: 69 78 49 6e 6f 64 65 49 6e 66 6f 3b 20 20 20 2f  ixInodeInfo;   /
16d0: 2a 20 41 6e 20 69 2d 6e 6f 64 65 20 2a 2f 0a 74  * An i-node */.t
16e0: 79 70 65 64 65 66 20 73 74 72 75 63 74 20 55 6e  ypedef struct Un
16f0: 69 78 55 6e 75 73 65 64 46 64 20 55 6e 69 78 55  ixUnusedFd UnixU
1700: 6e 75 73 65 64 46 64 3b 20 20 20 20 20 2f 2a 20  nusedFd;     /* 
1710: 41 6e 20 75 6e 75 73 65 64 20 66 69 6c 65 20 64  An unused file d
1720: 65 73 63 72 69 70 74 6f 72 20 2a 2f 0a 0a 2f 2a  escriptor */../*
1730: 0a 2a 2a 20 53 6f 6d 65 74 69 6d 65 73 2c 20 61  .** Sometimes, a
1740: 66 74 65 72 20 61 20 66 69 6c 65 20 68 61 6e 64  fter a file hand
1750: 6c 65 20 69 73 20 63 6c 6f 73 65 64 20 62 79 20  le is closed by 
1760: 53 51 4c 69 74 65 2c 20 74 68 65 20 66 69 6c 65  SQLite, the file
1770: 20 64 65 73 63 72 69 70 74 6f 72 0a 2a 2a 20 63   descriptor.** c
1780: 61 6e 6e 6f 74 20 62 65 20 63 6c 6f 73 65 64 20  annot be closed 
1790: 69 6d 6d 65 64 69 61 74 65 6c 79 2e 20 49 6e 20  immediately. In 
17a0: 74 68 65 73 65 20 63 61 73 65 73 2c 20 69 6e 73  these cases, ins
17b0: 74 61 6e 63 65 73 20 6f 66 20 74 68 65 20 66 6f  tances of the fo
17c0: 6c 6c 6f 77 69 6e 67 0a 2a 2a 20 73 74 72 75 63  llowing.** struc
17d0: 74 75 72 65 20 61 72 65 20 75 73 65 64 20 74 6f  ture are used to
17e0: 20 73 74 6f 72 65 20 74 68 65 20 66 69 6c 65 20   store the file 
17f0: 64 65 73 63 72 69 70 74 6f 72 20 77 68 69 6c 65  descriptor while
1800: 20 77 61 69 74 69 6e 67 20 66 6f 72 20 61 6e 0a   waiting for an.
1810: 2a 2a 20 6f 70 70 6f 72 74 75 6e 69 74 79 20 74  ** opportunity t
1820: 6f 20 65 69 74 68 65 72 20 63 6c 6f 73 65 20 6f  o either close o
1830: 72 20 72 65 75 73 65 20 69 74 2e 0a 2a 2f 0a 73  r reuse it..*/.s
1840: 74 72 75 63 74 20 55 6e 69 78 55 6e 75 73 65 64  truct UnixUnused
1850: 46 64 20 7b 0a 20 20 69 6e 74 20 66 64 3b 20 20  Fd {.  int fd;  
1860: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1870: 20 2f 2a 20 46 69 6c 65 20 64 65 73 63 72 69 70   /* File descrip
1880: 74 6f 72 20 74 6f 20 63 6c 6f 73 65 20 2a 2f 0a  tor to close */.
1890: 20 20 69 6e 74 20 66 6c 61 67 73 3b 20 20 20 20    int flags;    
18a0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
18b0: 6c 61 67 73 20 74 68 69 73 20 66 69 6c 65 20 64  lags this file d
18c0: 65 73 63 72 69 70 74 6f 72 20 77 61 73 20 6f 70  escriptor was op
18d0: 65 6e 65 64 20 77 69 74 68 20 2a 2f 0a 20 20 55  ened with */.  U
18e0: 6e 69 78 55 6e 75 73 65 64 46 64 20 2a 70 4e 65  nixUnusedFd *pNe
18f0: 78 74 3b 20 20 20 20 20 20 2f 2a 20 4e 65 78 74  xt;      /* Next
1900: 20 75 6e 75 73 65 64 20 66 69 6c 65 20 64 65 73   unused file des
1910: 63 72 69 70 74 6f 72 20 6f 6e 20 73 61 6d 65 20  criptor on same 
1920: 66 69 6c 65 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a  file */.};../*.*
1930: 2a 20 54 68 65 20 75 6e 69 78 46 69 6c 65 20 73  * The unixFile s
1940: 74 72 75 63 74 75 72 65 20 69 73 20 73 75 62 63  tructure is subc
1950: 6c 61 73 73 20 6f 66 20 73 71 6c 69 74 65 33 5f  lass of sqlite3_
1960: 66 69 6c 65 20 73 70 65 63 69 66 69 63 20 74 6f  file specific to
1970: 20 74 68 65 20 75 6e 69 78 0a 2a 2a 20 56 46 53   the unix.** VFS
1980: 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 73   implementations
1990: 2e 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72  ..*/.typedef str
19a0: 75 63 74 20 75 6e 69 78 46 69 6c 65 20 75 6e 69  uct unixFile uni
19b0: 78 46 69 6c 65 3b 0a 73 74 72 75 63 74 20 75 6e  xFile;.struct un
19c0: 69 78 46 69 6c 65 20 7b 0a 20 20 73 71 6c 69 74  ixFile {.  sqlit
19d0: 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 63 6f  e3_io_methods co
19e0: 6e 73 74 20 2a 70 4d 65 74 68 6f 64 3b 20 20 2f  nst *pMethod;  /
19f0: 2a 20 41 6c 77 61 79 73 20 74 68 65 20 66 69 72  * Always the fir
1a00: 73 74 20 65 6e 74 72 79 20 2a 2f 0a 20 20 75 6e  st entry */.  un
1a10: 69 78 49 6e 6f 64 65 49 6e 66 6f 20 2a 70 49 6e  ixInodeInfo *pIn
1a20: 6f 64 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ode;            
1a30: 20 20 2f 2a 20 49 6e 66 6f 20 61 62 6f 75 74 20    /* Info about 
1a40: 6c 6f 63 6b 73 20 6f 6e 20 74 68 69 73 20 69 6e  locks on this in
1a50: 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 68 3b 20  ode */.  int h; 
1a60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a70: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1a80: 54 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70  The file descrip
1a90: 74 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 64 69 72  tor */.  int dir
1aa0: 66 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  fd;             
1ab0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1ac0: 46 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  File descriptor 
1ad0: 66 6f 72 20 74 68 65 20 64 69 72 65 63 74 6f 72  for the director
1ae0: 79 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20  y */.  unsigned 
1af0: 63 68 61 72 20 65 46 69 6c 65 4c 6f 63 6b 3b 20  char eFileLock; 
1b00: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
1b10: 65 20 74 79 70 65 20 6f 66 20 6c 6f 63 6b 20 68  e type of lock h
1b20: 65 6c 64 20 6f 6e 20 74 68 69 73 20 66 64 20 2a  eld on this fd *
1b30: 2f 0a 20 20 69 6e 74 20 6c 61 73 74 45 72 72 6e  /.  int lastErrn
1b40: 6f 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  o;              
1b50: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 75          /* The u
1b60: 6e 69 78 20 65 72 72 6e 6f 20 66 72 6f 6d 20 6c  nix errno from l
1b70: 61 73 74 20 49 2f 4f 20 65 72 72 6f 72 20 2a 2f  ast I/O error */
1b80: 0a 20 20 76 6f 69 64 20 2a 6c 6f 63 6b 69 6e 67  .  void *locking
1b90: 43 6f 6e 74 65 78 74 3b 20 20 20 20 20 20 20 20  Context;        
1ba0: 20 20 20 20 20 20 20 2f 2a 20 4c 6f 63 6b 69 6e         /* Lockin
1bb0: 67 20 73 74 79 6c 65 20 73 70 65 63 69 66 69 63  g style specific
1bc0: 20 73 74 61 74 65 20 2a 2f 0a 20 20 55 6e 69 78   state */.  Unix
1bd0: 55 6e 75 73 65 64 46 64 20 2a 70 55 6e 75 73 65  UnusedFd *pUnuse
1be0: 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d;              
1bf0: 2f 2a 20 50 72 65 2d 61 6c 6c 6f 63 61 74 65 64  /* Pre-allocated
1c00: 20 55 6e 69 78 55 6e 75 73 65 64 46 64 20 2a 2f   UnixUnusedFd */
1c10: 0a 20 20 69 6e 74 20 66 69 6c 65 46 6c 61 67 73  .  int fileFlags
1c20: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1c30: 20 20 20 20 20 20 20 2f 2a 20 4d 69 73 63 65 6c         /* Miscel
1c40: 6c 61 6e 6f 75 73 20 66 6c 61 67 73 20 2a 2f 0a  lanous flags */.
1c50: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50    const char *zP
1c60: 61 74 68 3b 20 20 20 20 20 20 20 20 20 20 20 20  ath;            
1c70: 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66        /* Name of
1c80: 20 74 68 65 20 66 69 6c 65 20 2a 2f 0a 20 20 75   the file */.  u
1c90: 6e 69 78 53 68 6d 20 2a 70 53 68 6d 3b 20 20 20  nixShm *pShm;   
1ca0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cb0: 20 20 20 2f 2a 20 53 68 61 72 65 64 20 6d 65 6d     /* Shared mem
1cc0: 6f 72 79 20 73 65 67 6d 65 6e 74 20 69 6e 66 6f  ory segment info
1cd0: 72 6d 61 74 69 6f 6e 20 2a 2f 0a 23 69 66 20 53  rmation */.#if S
1ce0: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43  QLITE_ENABLE_LOC
1cf0: 4b 49 4e 47 5f 53 54 59 4c 45 0a 20 20 69 6e 74  KING_STYLE.  int
1d00: 20 6f 70 65 6e 46 6c 61 67 73 3b 20 20 20 20 20   openFlags;     
1d10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d20: 20 2f 2a 20 54 68 65 20 66 6c 61 67 73 20 73 70   /* The flags sp
1d30: 65 63 69 66 69 65 64 20 61 74 20 6f 70 65 6e 28  ecified at open(
1d40: 29 20 2a 2f 0a 23 65 6e 64 69 66 0a 23 69 66 20  ) */.#endif.#if 
1d50: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f  SQLITE_ENABLE_LO
1d60: 43 4b 49 4e 47 5f 53 54 59 4c 45 20 7c 7c 20 64  CKING_STYLE || d
1d70: 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f  efined(__APPLE__
1d80: 29 0a 20 20 75 6e 73 69 67 6e 65 64 20 66 73 46  ).  unsigned fsF
1d90: 6c 61 67 73 3b 20 20 20 20 20 20 20 20 20 20 20  lags;           
1da0: 20 20 20 20 20 20 20 20 2f 2a 20 63 61 63 68 65          /* cache
1db0: 64 20 64 65 74 61 69 6c 73 20 66 72 6f 6d 20 73  d details from s
1dc0: 74 61 74 66 73 28 29 20 2a 2f 0a 23 65 6e 64 69  tatfs() */.#endi
1dd0: 66 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53  f.#if OS_VXWORKS
1de0: 0a 20 20 69 6e 74 20 69 73 44 65 6c 65 74 65 3b  .  int isDelete;
1df0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e00: 20 20 20 20 20 20 20 2f 2a 20 44 65 6c 65 74 65         /* Delete
1e10: 20 6f 6e 20 63 6c 6f 73 65 20 69 66 20 74 72 75   on close if tru
1e20: 65 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 76 78  e */.  struct vx
1e30: 77 6f 72 6b 73 46 69 6c 65 49 64 20 2a 70 49 64  worksFileId *pId
1e40: 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55 6e  ;          /* Un
1e50: 69 71 75 65 20 66 69 6c 65 20 49 44 20 2a 2f 0a  ique file ID */.
1e60: 23 65 6e 64 69 66 0a 23 69 66 6e 64 65 66 20 4e  #endif.#ifndef N
1e70: 44 45 42 55 47 0a 20 20 2f 2a 20 54 68 65 20 6e  DEBUG.  /* The n
1e80: 65 78 74 20 67 72 6f 75 70 20 6f 66 20 76 61 72  ext group of var
1e90: 69 61 62 6c 65 73 20 61 72 65 20 75 73 65 64 20  iables are used 
1ea0: 74 6f 20 74 72 61 63 6b 20 77 68 65 74 68 65 72  to track whether
1eb0: 20 6f 72 20 6e 6f 74 20 74 68 65 0a 20 20 2a 2a   or not the.  **
1ec0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f 75   transaction cou
1ed0: 6e 74 65 72 20 69 6e 20 62 79 74 65 73 20 32 34  nter in bytes 24
1ee0: 2d 32 37 20 6f 66 20 64 61 74 61 62 61 73 65 20  -27 of database 
1ef0: 66 69 6c 65 73 20 61 72 65 20 75 70 64 61 74 65  files are update
1f00: 64 0a 20 20 2a 2a 20 77 68 65 6e 65 76 65 72 20  d.  ** whenever 
1f10: 61 6e 79 20 70 61 72 74 20 6f 66 20 74 68 65 20  any part of the 
1f20: 64 61 74 61 62 61 73 65 20 63 68 61 6e 67 65 73  database changes
1f30: 2e 20 20 41 6e 20 61 73 73 65 72 74 69 6f 6e 20  .  An assertion 
1f40: 66 61 75 6c 74 20 77 69 6c 6c 0a 20 20 2a 2a 20  fault will.  ** 
1f50: 6f 63 63 75 72 20 69 66 20 61 20 66 69 6c 65 20  occur if a file 
1f60: 69 73 20 75 70 64 61 74 65 64 20 77 69 74 68 6f  is updated witho
1f70: 75 74 20 61 6c 73 6f 20 75 70 64 61 74 69 6e 67  ut also updating
1f80: 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
1f90: 0a 20 20 2a 2a 20 63 6f 75 6e 74 65 72 2e 20 20  .  ** counter.  
1fa0: 54 68 69 73 20 74 65 73 74 20 69 73 20 6d 61 64  This test is mad
1fb0: 65 20 74 6f 20 61 76 6f 69 64 20 6e 65 77 20 70  e to avoid new p
1fc0: 72 6f 62 6c 65 6d 73 20 73 69 6d 69 6c 61 72 20  roblems similar 
1fd0: 74 6f 20 74 68 65 0a 20 20 2a 2a 20 6f 6e 65 20  to the.  ** one 
1fe0: 64 65 73 63 72 69 62 65 64 20 62 79 20 74 69 63  described by tic
1ff0: 6b 65 74 20 23 33 35 38 34 2e 20 0a 20 20 2a 2f  ket #3584. .  */
2000: 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
2010: 20 74 72 61 6e 73 43 6e 74 72 43 68 6e 67 3b 20   transCntrChng; 
2020: 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68 65    /* True if the
2030: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f 75   transaction cou
2040: 6e 74 65 72 20 63 68 61 6e 67 65 64 20 2a 2f 0a  nter changed */.
2050: 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
2060: 64 62 55 70 64 61 74 65 3b 20 20 20 20 20 20 20  dbUpdate;       
2070: 20 2f 2a 20 54 72 75 65 20 69 66 20 61 6e 79 20   /* True if any 
2080: 70 61 72 74 20 6f 66 20 64 61 74 61 62 61 73 65  part of database
2090: 20 66 69 6c 65 20 63 68 61 6e 67 65 64 20 2a 2f   file changed */
20a0: 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
20b0: 20 69 6e 4e 6f 72 6d 61 6c 57 72 69 74 65 3b 20   inNormalWrite; 
20c0: 20 20 2f 2a 20 54 72 75 65 20 69 66 20 69 6e 20    /* True if in 
20d0: 61 20 6e 6f 72 6d 61 6c 20 77 72 69 74 65 20 6f  a normal write o
20e0: 70 65 72 61 74 69 6f 6e 20 2a 2f 0a 23 65 6e 64  peration */.#end
20f0: 69 66 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  if.#ifdef SQLITE
2100: 5f 54 45 53 54 0a 20 20 2f 2a 20 49 6e 20 74 65  _TEST.  /* In te
2110: 73 74 20 6d 6f 64 65 2c 20 69 6e 63 72 65 61 73  st mode, increas
2120: 65 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68  e the size of th
2130: 69 73 20 73 74 72 75 63 74 75 72 65 20 61 20 62  is structure a b
2140: 69 74 20 73 6f 20 74 68 61 74 20 0a 20 20 2a 2a  it so that .  **
2150: 20 69 74 20 69 73 20 6c 61 72 67 65 72 20 74 68   it is larger th
2160: 61 6e 20 74 68 65 20 73 74 72 75 63 74 20 43 72  an the struct Cr
2170: 61 73 68 46 69 6c 65 20 64 65 66 69 6e 65 64 20  ashFile defined 
2180: 69 6e 20 74 65 73 74 36 2e 63 2e 0a 20 20 2a 2f  in test6.c..  */
2190: 0a 20 20 63 68 61 72 20 61 50 61 64 64 69 6e 67  .  char aPadding
21a0: 5b 33 32 5d 3b 0a 23 65 6e 64 69 66 0a 7d 3b 0a  [32];.#endif.};.
21b0: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f  ./*.** The follo
21c0: 77 69 6e 67 20 6d 61 63 72 6f 73 20 64 65 66 69  wing macros defi
21d0: 6e 65 20 62 69 74 73 20 69 6e 20 75 6e 69 78 46  ne bits in unixF
21e0: 69 6c 65 2e 66 69 6c 65 46 6c 61 67 73 0a 2a 2f  ile.fileFlags.*/
21f0: 0a 23 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f  .#define SQLITE_
2200: 57 48 4f 4c 45 5f 46 49 4c 45 5f 4c 4f 43 4b 49  WHOLE_FILE_LOCKI
2210: 4e 47 20 20 30 78 30 30 30 31 20 20 20 2f 2a 20  NG  0x0001   /* 
2220: 55 73 65 20 77 68 6f 6c 65 2d 66 69 6c 65 20 6c  Use whole-file l
2230: 6f 63 6b 69 6e 67 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  ocking */../*.**
2240: 20 49 6e 63 6c 75 64 65 20 63 6f 64 65 20 74 68   Include code th
2250: 61 74 20 69 73 20 63 6f 6d 6d 6f 6e 20 74 6f 20  at is common to 
2260: 61 6c 6c 20 6f 73 5f 2a 2e 63 20 66 69 6c 65 73  all os_*.c files
2270: 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 22 6f 73  .*/.#include "os
2280: 5f 63 6f 6d 6d 6f 6e 2e 68 22 0a 0a 2f 2a 0a 2a  _common.h"../*.*
2290: 2a 20 44 65 66 69 6e 65 20 76 61 72 69 6f 75 73  * Define various
22a0: 20 6d 61 63 72 6f 73 20 74 68 61 74 20 61 72 65   macros that are
22b0: 20 6d 69 73 73 69 6e 67 20 66 72 6f 6d 20 73 6f   missing from so
22c0: 6d 65 20 73 79 73 74 65 6d 73 2e 0a 2a 2f 0a 23  me systems..*/.#
22d0: 69 66 6e 64 65 66 20 4f 5f 4c 41 52 47 45 46 49  ifndef O_LARGEFI
22e0: 4c 45 0a 23 20 64 65 66 69 6e 65 20 4f 5f 4c 41  LE.# define O_LA
22f0: 52 47 45 46 49 4c 45 20 30 0a 23 65 6e 64 69 66  RGEFILE 0.#endif
2300: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
2310: 49 53 41 42 4c 45 5f 4c 46 53 0a 23 20 75 6e 64  ISABLE_LFS.# und
2320: 65 66 20 4f 5f 4c 41 52 47 45 46 49 4c 45 0a 23  ef O_LARGEFILE.#
2330: 20 64 65 66 69 6e 65 20 4f 5f 4c 41 52 47 45 46   define O_LARGEF
2340: 49 4c 45 20 30 0a 23 65 6e 64 69 66 0a 23 69 66  ILE 0.#endif.#if
2350: 6e 64 65 66 20 4f 5f 4e 4f 46 4f 4c 4c 4f 57 0a  ndef O_NOFOLLOW.
2360: 23 20 64 65 66 69 6e 65 20 4f 5f 4e 4f 46 4f 4c  # define O_NOFOL
2370: 4c 4f 57 20 30 0a 23 65 6e 64 69 66 0a 23 69 66  LOW 0.#endif.#if
2380: 6e 64 65 66 20 4f 5f 42 49 4e 41 52 59 0a 23 20  ndef O_BINARY.# 
2390: 64 65 66 69 6e 65 20 4f 5f 42 49 4e 41 52 59 20  define O_BINARY 
23a0: 30 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  0.#endif../*.** 
23b0: 54 68 65 20 44 4a 47 50 50 20 63 6f 6d 70 69 6c  The DJGPP compil
23c0: 65 72 20 65 6e 76 69 72 6f 6e 6d 65 6e 74 20 6c  er environment l
23d0: 6f 6f 6b 73 20 6d 6f 73 74 6c 79 20 6c 69 6b 65  ooks mostly like
23e0: 20 55 6e 69 78 2c 20 62 75 74 20 69 74 0a 2a 2a   Unix, but it.**
23f0: 20 6c 61 63 6b 73 20 74 68 65 20 66 63 6e 74 6c   lacks the fcntl
2400: 28 29 20 73 79 73 74 65 6d 20 63 61 6c 6c 2e 20  () system call. 
2410: 20 53 6f 20 72 65 64 65 66 69 6e 65 20 66 63 6e   So redefine fcn
2420: 74 6c 28 29 20 74 6f 20 62 65 20 73 6f 6d 65 74  tl() to be somet
2430: 68 69 6e 67 0a 2a 2a 20 74 68 61 74 20 61 6c 77  hing.** that alw
2440: 61 79 73 20 73 75 63 63 65 65 64 73 2e 20 20 54  ays succeeds.  T
2450: 68 69 73 20 6d 65 61 6e 73 20 74 68 61 74 20 6c  his means that l
2460: 6f 63 6b 69 6e 67 20 64 6f 65 73 20 6e 6f 74 20  ocking does not 
2470: 6f 63 63 75 72 20 75 6e 64 65 72 0a 2a 2a 20 44  occur under.** D
2480: 4a 47 50 50 2e 20 20 42 75 74 20 69 74 20 69 73  JGPP.  But it is
2490: 20 44 4f 53 20 2d 20 77 68 61 74 20 64 69 64 20   DOS - what did 
24a0: 79 6f 75 20 65 78 70 65 63 74 3f 0a 2a 2f 0a 23  you expect?.*/.#
24b0: 69 66 64 65 66 20 5f 5f 44 4a 47 50 50 5f 5f 0a  ifdef __DJGPP__.
24c0: 23 20 64 65 66 69 6e 65 20 66 63 6e 74 6c 28 41  # define fcntl(A
24d0: 2c 42 2c 43 29 20 30 0a 23 65 6e 64 69 66 0a 0a  ,B,C) 0.#endif..
24e0: 2f 2a 0a 2a 2a 20 54 68 65 20 74 68 72 65 61 64  /*.** The thread
24f0: 69 64 20 6d 61 63 72 6f 20 72 65 73 6f 6c 76 65  id macro resolve
2500: 73 20 74 6f 20 74 68 65 20 74 68 72 65 61 64 2d  s to the thread-
2510: 69 64 20 6f 72 20 74 6f 20 30 2e 20 20 55 73 65  id or to 0.  Use
2520: 64 20 66 6f 72 0a 2a 2a 20 74 65 73 74 69 6e 67  d for.** testing
2530: 20 61 6e 64 20 64 65 62 75 67 67 69 6e 67 20 6f   and debugging o
2540: 6e 6c 79 2e 0a 2a 2f 0a 23 69 66 20 53 51 4c 49  nly..*/.#if SQLI
2550: 54 45 5f 54 48 52 45 41 44 53 41 46 45 0a 23 64  TE_THREADSAFE.#d
2560: 65 66 69 6e 65 20 74 68 72 65 61 64 69 64 20 70  efine threadid p
2570: 74 68 72 65 61 64 5f 73 65 6c 66 28 29 0a 23 65  thread_self().#e
2580: 6c 73 65 0a 23 64 65 66 69 6e 65 20 74 68 72 65  lse.#define thre
2590: 61 64 69 64 20 30 0a 23 65 6e 64 69 66 0a 0a 0a  adid 0.#endif...
25a0: 2f 2a 0a 2a 2a 20 48 65 6c 70 65 72 20 66 75 6e  /*.** Helper fun
25b0: 63 74 69 6f 6e 73 20 74 6f 20 6f 62 74 61 69 6e  ctions to obtain
25c0: 20 61 6e 64 20 72 65 6c 69 6e 71 75 69 73 68 20   and relinquish 
25d0: 74 68 65 20 67 6c 6f 62 61 6c 20 6d 75 74 65 78  the global mutex
25e0: 2e 20 54 68 65 0a 2a 2a 20 67 6c 6f 62 61 6c 20  . The.** global 
25f0: 6d 75 74 65 78 20 69 73 20 75 73 65 64 20 74 6f  mutex is used to
2600: 20 70 72 6f 74 65 63 74 20 74 68 65 20 75 6e 69   protect the uni
2610: 78 49 6e 6f 64 65 49 6e 66 6f 20 61 6e 64 0a 2a  xInodeInfo and.*
2620: 2a 20 76 78 77 6f 72 6b 73 46 69 6c 65 49 64 20  * vxworksFileId 
2630: 6f 62 6a 65 63 74 73 20 75 73 65 64 20 62 79 20  objects used by 
2640: 74 68 69 73 20 66 69 6c 65 2c 20 61 6c 6c 20 6f  this file, all o
2650: 66 20 77 68 69 63 68 20 6d 61 79 20 62 65 20 0a  f which may be .
2660: 2a 2a 20 73 68 61 72 65 64 20 62 79 20 6d 75 6c  ** shared by mul
2670: 74 69 70 6c 65 20 74 68 72 65 61 64 73 2e 0a 2a  tiple threads..*
2680: 2a 0a 2a 2a 20 46 75 6e 63 74 69 6f 6e 20 75 6e  *.** Function un
2690: 69 78 4d 75 74 65 78 48 65 6c 64 28 29 20 69 73  ixMutexHeld() is
26a0: 20 75 73 65 64 20 74 6f 20 61 73 73 65 72 74 28   used to assert(
26b0: 29 20 74 68 61 74 20 74 68 65 20 67 6c 6f 62 61  ) that the globa
26c0: 6c 20 6d 75 74 65 78 20 0a 2a 2a 20 69 73 20 68  l mutex .** is h
26d0: 65 6c 64 20 77 68 65 6e 20 72 65 71 75 69 72 65  eld when require
26e0: 64 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  d. This function
26f0: 20 69 73 20 6f 6e 6c 79 20 75 73 65 64 20 61 73   is only used as
2700: 20 70 61 72 74 20 6f 66 20 61 73 73 65 72 74 28   part of assert(
2710: 29 20 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74 73  ) .** statements
2720: 2e 20 65 2e 67 2e 0a 2a 2a 0a 2a 2a 20 20 20 75  . e.g..**.**   u
2730: 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29 0a  nixEnterMutex().
2740: 2a 2a 20 20 20 20 20 61 73 73 65 72 74 28 20 75  **     assert( u
2750: 6e 69 78 4d 75 74 65 78 48 65 6c 64 28 29 20 29  nixMutexHeld() )
2760: 3b 0a 2a 2a 20 20 20 75 6e 69 78 45 6e 74 65 72  ;.**   unixEnter
2770: 4c 65 61 76 65 28 29 0a 2a 2f 0a 73 74 61 74 69  Leave().*/.stati
2780: 63 20 76 6f 69 64 20 75 6e 69 78 45 6e 74 65 72  c void unixEnter
2790: 4d 75 74 65 78 28 76 6f 69 64 29 7b 0a 20 20 73  Mutex(void){.  s
27a0: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74  qlite3_mutex_ent
27b0: 65 72 28 73 71 6c 69 74 65 33 4d 75 74 65 78 41  er(sqlite3MutexA
27c0: 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45  lloc(SQLITE_MUTE
27d0: 58 5f 53 54 41 54 49 43 5f 4d 41 53 54 45 52 29  X_STATIC_MASTER)
27e0: 29 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64  );.}.static void
27f0: 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28   unixLeaveMutex(
2800: 76 6f 69 64 29 7b 0a 20 20 73 71 6c 69 74 65 33  void){.  sqlite3
2810: 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 73 71 6c  _mutex_leave(sql
2820: 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53  ite3MutexAlloc(S
2830: 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54 41 54  QLITE_MUTEX_STAT
2840: 49 43 5f 4d 41 53 54 45 52 29 29 3b 0a 7d 0a 23  IC_MASTER));.}.#
2850: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42  ifdef SQLITE_DEB
2860: 55 47 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e  UG.static int un
2870: 69 78 4d 75 74 65 78 48 65 6c 64 28 76 6f 69 64  ixMutexHeld(void
2880: 29 20 7b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c  ) {.  return sql
2890: 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
28a0: 73 71 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f  sqlite3MutexAllo
28b0: 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53  c(SQLITE_MUTEX_S
28c0: 54 41 54 49 43 5f 4d 41 53 54 45 52 29 29 3b 0a  TATIC_MASTER));.
28d0: 7d 0a 23 65 6e 64 69 66 0a 0a 0a 23 69 66 64 65  }.#endif...#ifde
28e0: 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 2f  f SQLITE_DEBUG./
28f0: 2a 0a 2a 2a 20 48 65 6c 70 65 72 20 66 75 6e 63  *.** Helper func
2900: 74 69 6f 6e 20 66 6f 72 20 70 72 69 6e 74 69 6e  tion for printin
2910: 67 20 6f 75 74 20 74 72 61 63 65 20 69 6e 66 6f  g out trace info
2920: 72 6d 61 74 69 6f 6e 20 66 72 6f 6d 20 64 65 62  rmation from deb
2930: 75 67 67 69 6e 67 0a 2a 2a 20 62 69 6e 61 72 69  ugging.** binari
2940: 65 73 2e 20 54 68 69 73 20 72 65 74 75 72 6e 73  es. This returns
2950: 20 74 68 65 20 73 74 72 69 6e 67 20 72 65 70 72   the string repr
2960: 65 73 65 74 61 74 69 6f 6e 20 6f 66 20 74 68 65  esetation of the
2970: 20 73 75 70 70 6c 69 65 64 0a 2a 2a 20 69 6e 74   supplied.** int
2980: 65 67 65 72 20 6c 6f 63 6b 2d 74 79 70 65 2e 0a  eger lock-type..
2990: 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20  */.static const 
29a0: 63 68 61 72 20 2a 61 7a 46 69 6c 65 4c 6f 63 6b  char *azFileLock
29b0: 28 69 6e 74 20 65 46 69 6c 65 4c 6f 63 6b 29 7b  (int eFileLock){
29c0: 0a 20 20 73 77 69 74 63 68 28 20 65 46 69 6c 65  .  switch( eFile
29d0: 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 63 61 73 65  Lock ){.    case
29e0: 20 4e 4f 5f 4c 4f 43 4b 3a 20 72 65 74 75 72 6e   NO_LOCK: return
29f0: 20 22 4e 4f 4e 45 22 3b 0a 20 20 20 20 63 61 73   "NONE";.    cas
2a00: 65 20 53 48 41 52 45 44 5f 4c 4f 43 4b 3a 20 72  e SHARED_LOCK: r
2a10: 65 74 75 72 6e 20 22 53 48 41 52 45 44 22 3b 0a  eturn "SHARED";.
2a20: 20 20 20 20 63 61 73 65 20 52 45 53 45 52 56 45      case RESERVE
2a30: 44 5f 4c 4f 43 4b 3a 20 72 65 74 75 72 6e 20 22  D_LOCK: return "
2a40: 52 45 53 45 52 56 45 44 22 3b 0a 20 20 20 20 63  RESERVED";.    c
2a50: 61 73 65 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b  ase PENDING_LOCK
2a60: 3a 20 72 65 74 75 72 6e 20 22 50 45 4e 44 49 4e  : return "PENDIN
2a70: 47 22 3b 0a 20 20 20 20 63 61 73 65 20 45 58 43  G";.    case EXC
2a80: 4c 55 53 49 56 45 5f 4c 4f 43 4b 3a 20 72 65 74  LUSIVE_LOCK: ret
2a90: 75 72 6e 20 22 45 58 43 4c 55 53 49 56 45 22 3b  urn "EXCLUSIVE";
2aa0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 22 45  .  }.  return "E
2ab0: 52 52 4f 52 22 3b 0a 7d 0a 23 65 6e 64 69 66 0a  RROR";.}.#endif.
2ac0: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4c  .#ifdef SQLITE_L
2ad0: 4f 43 4b 5f 54 52 41 43 45 0a 2f 2a 0a 2a 2a 20  OCK_TRACE./*.** 
2ae0: 50 72 69 6e 74 20 6f 75 74 20 69 6e 66 6f 72 6d  Print out inform
2af0: 61 74 69 6f 6e 20 61 62 6f 75 74 20 61 6c 6c 20  ation about all 
2b00: 6c 6f 63 6b 69 6e 67 20 6f 70 65 72 61 74 69 6f  locking operatio
2b10: 6e 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  ns..**.** This r
2b20: 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64 20 66  outine is used f
2b30: 6f 72 20 74 72 6f 75 62 6c 65 73 68 6f 6f 74 69  or troubleshooti
2b40: 6e 67 20 6c 6f 63 6b 73 20 6f 6e 20 6d 75 6c 74  ng locks on mult
2b50: 69 74 68 72 65 61 64 65 64 0a 2a 2a 20 70 6c 61  ithreaded.** pla
2b60: 74 66 6f 72 6d 73 2e 20 20 45 6e 61 62 6c 65 20  tforms.  Enable 
2b70: 62 79 20 63 6f 6d 70 69 6c 69 6e 67 20 77 69 74  by compiling wit
2b80: 68 20 74 68 65 20 2d 44 53 51 4c 49 54 45 5f 4c  h the -DSQLITE_L
2b90: 4f 43 4b 5f 54 52 41 43 45 0a 2a 2a 20 63 6f 6d  OCK_TRACE.** com
2ba0: 6d 61 6e 64 2d 6c 69 6e 65 20 6f 70 74 69 6f 6e  mand-line option
2bb0: 20 6f 6e 20 74 68 65 20 63 6f 6d 70 69 6c 65 72   on the compiler
2bc0: 2e 20 20 54 68 69 73 20 63 6f 64 65 20 69 73 20  .  This code is 
2bd0: 6e 6f 72 6d 61 6c 6c 79 0a 2a 2a 20 74 75 72 6e  normally.** turn
2be0: 65 64 20 6f 66 66 2e 0a 2a 2f 0a 73 74 61 74 69  ed off..*/.stati
2bf0: 63 20 69 6e 74 20 6c 6f 63 6b 54 72 61 63 65 28  c int lockTrace(
2c00: 69 6e 74 20 66 64 2c 20 69 6e 74 20 6f 70 2c 20  int fd, int op, 
2c10: 73 74 72 75 63 74 20 66 6c 6f 63 6b 20 2a 70 29  struct flock *p)
2c20: 7b 0a 20 20 63 68 61 72 20 2a 7a 4f 70 4e 61 6d  {.  char *zOpNam
2c30: 65 2c 20 2a 7a 54 79 70 65 3b 0a 20 20 69 6e 74  e, *zType;.  int
2c40: 20 73 3b 0a 20 20 69 6e 74 20 73 61 76 65 64 45   s;.  int savedE
2c50: 72 72 6e 6f 3b 0a 20 20 69 66 28 20 6f 70 3d 3d  rrno;.  if( op==
2c60: 46 5f 47 45 54 4c 4b 20 29 7b 0a 20 20 20 20 7a  F_GETLK ){.    z
2c70: 4f 70 4e 61 6d 65 20 3d 20 22 47 45 54 4c 4b 22  OpName = "GETLK"
2c80: 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 6f 70  ;.  }else if( op
2c90: 3d 3d 46 5f 53 45 54 4c 4b 20 29 7b 0a 20 20 20  ==F_SETLK ){.   
2ca0: 20 7a 4f 70 4e 61 6d 65 20 3d 20 22 53 45 54 4c   zOpName = "SETL
2cb0: 4b 22 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  K";.  }else{.   
2cc0: 20 73 20 3d 20 66 63 6e 74 6c 28 66 64 2c 20 6f   s = fcntl(fd, o
2cd0: 70 2c 20 70 29 3b 0a 20 20 20 20 73 71 6c 69 74  p, p);.    sqlit
2ce0: 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 66  e3DebugPrintf("f
2cf0: 63 6e 74 6c 20 75 6e 6b 6e 6f 77 6e 20 25 64 20  cntl unknown %d 
2d00: 25 64 20 25 64 5c 6e 22 2c 20 66 64 2c 20 6f 70  %d %d\n", fd, op
2d10: 2c 20 73 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  , s);.    return
2d20: 20 73 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d   s;.  }.  if( p-
2d30: 3e 6c 5f 74 79 70 65 3d 3d 46 5f 52 44 4c 43 4b  >l_type==F_RDLCK
2d40: 20 29 7b 0a 20 20 20 20 7a 54 79 70 65 20 3d 20   ){.    zType = 
2d50: 22 52 44 4c 43 4b 22 3b 0a 20 20 7d 65 6c 73 65  "RDLCK";.  }else
2d60: 20 69 66 28 20 70 2d 3e 6c 5f 74 79 70 65 3d 3d   if( p->l_type==
2d70: 46 5f 57 52 4c 43 4b 20 29 7b 0a 20 20 20 20 7a  F_WRLCK ){.    z
2d80: 54 79 70 65 20 3d 20 22 57 52 4c 43 4b 22 3b 0a  Type = "WRLCK";.
2d90: 20 20 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e 6c    }else if( p->l
2da0: 5f 74 79 70 65 3d 3d 46 5f 55 4e 4c 43 4b 20 29  _type==F_UNLCK )
2db0: 7b 0a 20 20 20 20 7a 54 79 70 65 20 3d 20 22 55  {.    zType = "U
2dc0: 4e 4c 43 4b 22 3b 0a 20 20 7d 65 6c 73 65 7b 0a  NLCK";.  }else{.
2dd0: 20 20 20 20 61 73 73 65 72 74 28 20 30 20 29 3b      assert( 0 );
2de0: 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70  .  }.  assert( p
2df0: 2d 3e 6c 5f 77 68 65 6e 63 65 3d 3d 53 45 45 4b  ->l_whence==SEEK
2e00: 5f 53 45 54 20 29 3b 0a 20 20 73 20 3d 20 66 63  _SET );.  s = fc
2e10: 6e 74 6c 28 66 64 2c 20 6f 70 2c 20 70 29 3b 0a  ntl(fd, op, p);.
2e20: 20 20 73 61 76 65 64 45 72 72 6e 6f 20 3d 20 65    savedErrno = e
2e30: 72 72 6e 6f 3b 0a 20 20 73 71 6c 69 74 65 33 44  rrno;.  sqlite3D
2e40: 65 62 75 67 50 72 69 6e 74 66 28 22 66 63 6e 74  ebugPrintf("fcnt
2e50: 6c 20 25 64 20 25 64 20 25 73 20 25 73 20 25 64  l %d %d %s %s %d
2e60: 20 25 64 20 25 64 20 25 64 5c 6e 22 2c 0a 20 20   %d %d %d\n",.  
2e70: 20 20 20 74 68 72 65 61 64 69 64 2c 20 66 64 2c     threadid, fd,
2e80: 20 7a 4f 70 4e 61 6d 65 2c 20 7a 54 79 70 65 2c   zOpName, zType,
2e90: 20 28 69 6e 74 29 70 2d 3e 6c 5f 73 74 61 72 74   (int)p->l_start
2ea0: 2c 20 28 69 6e 74 29 70 2d 3e 6c 5f 6c 65 6e 2c  , (int)p->l_len,
2eb0: 0a 20 20 20 20 20 28 69 6e 74 29 70 2d 3e 6c 5f  .     (int)p->l_
2ec0: 70 69 64 2c 20 73 29 3b 0a 20 20 69 66 28 20 73  pid, s);.  if( s
2ed0: 3d 3d 28 2d 31 29 20 26 26 20 6f 70 3d 3d 46 5f  ==(-1) && op==F_
2ee0: 53 45 54 4c 4b 20 26 26 20 28 70 2d 3e 6c 5f 74  SETLK && (p->l_t
2ef0: 79 70 65 3d 3d 46 5f 52 44 4c 43 4b 20 7c 7c 20  ype==F_RDLCK || 
2f00: 70 2d 3e 6c 5f 74 79 70 65 3d 3d 46 5f 57 52 4c  p->l_type==F_WRL
2f10: 43 4b 29 20 29 7b 0a 20 20 20 20 73 74 72 75 63  CK) ){.    struc
2f20: 74 20 66 6c 6f 63 6b 20 6c 32 3b 0a 20 20 20 20  t flock l2;.    
2f30: 6c 32 20 3d 20 2a 70 3b 0a 20 20 20 20 66 63 6e  l2 = *p;.    fcn
2f40: 74 6c 28 66 64 2c 20 46 5f 47 45 54 4c 4b 2c 20  tl(fd, F_GETLK, 
2f50: 26 6c 32 29 3b 0a 20 20 20 20 69 66 28 20 6c 32  &l2);.    if( l2
2f60: 2e 6c 5f 74 79 70 65 3d 3d 46 5f 52 44 4c 43 4b  .l_type==F_RDLCK
2f70: 20 29 7b 0a 20 20 20 20 20 20 7a 54 79 70 65 20   ){.      zType 
2f80: 3d 20 22 52 44 4c 43 4b 22 3b 0a 20 20 20 20 7d  = "RDLCK";.    }
2f90: 65 6c 73 65 20 69 66 28 20 6c 32 2e 6c 5f 74 79  else if( l2.l_ty
2fa0: 70 65 3d 3d 46 5f 57 52 4c 43 4b 20 29 7b 0a 20  pe==F_WRLCK ){. 
2fb0: 20 20 20 20 20 7a 54 79 70 65 20 3d 20 22 57 52       zType = "WR
2fc0: 4c 43 4b 22 3b 0a 20 20 20 20 7d 65 6c 73 65 20  LCK";.    }else 
2fd0: 69 66 28 20 6c 32 2e 6c 5f 74 79 70 65 3d 3d 46  if( l2.l_type==F
2fe0: 5f 55 4e 4c 43 4b 20 29 7b 0a 20 20 20 20 20 20  _UNLCK ){.      
2ff0: 7a 54 79 70 65 20 3d 20 22 55 4e 4c 43 4b 22 3b  zType = "UNLCK";
3000: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
3010: 20 20 61 73 73 65 72 74 28 20 30 20 29 3b 0a 20    assert( 0 );. 
3020: 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
3030: 44 65 62 75 67 50 72 69 6e 74 66 28 22 66 63 6e  DebugPrintf("fcn
3040: 74 6c 2d 66 61 69 6c 75 72 65 2d 72 65 61 73 6f  tl-failure-reaso
3050: 6e 3a 20 25 73 20 25 64 20 25 64 20 25 64 5c 6e  n: %s %d %d %d\n
3060: 22 2c 0a 20 20 20 20 20 20 20 7a 54 79 70 65 2c  ",.       zType,
3070: 20 28 69 6e 74 29 6c 32 2e 6c 5f 73 74 61 72 74   (int)l2.l_start
3080: 2c 20 28 69 6e 74 29 6c 32 2e 6c 5f 6c 65 6e 2c  , (int)l2.l_len,
3090: 20 28 69 6e 74 29 6c 32 2e 6c 5f 70 69 64 29 3b   (int)l2.l_pid);
30a0: 0a 20 20 7d 0a 20 20 65 72 72 6e 6f 20 3d 20 73  .  }.  errno = s
30b0: 61 76 65 64 45 72 72 6e 6f 3b 0a 20 20 72 65 74  avedErrno;.  ret
30c0: 75 72 6e 20 73 3b 0a 7d 0a 23 64 65 66 69 6e 65  urn s;.}.#define
30d0: 20 66 63 6e 74 6c 20 6c 6f 63 6b 54 72 61 63 65   fcntl lockTrace
30e0: 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
30f0: 45 5f 4c 4f 43 4b 5f 54 52 41 43 45 20 2a 2f 0a  E_LOCK_TRACE */.
3100: 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  .../*.** This ro
3110: 75 74 69 6e 65 20 74 72 61 6e 73 6c 61 74 65 73  utine translates
3120: 20 61 20 73 74 61 6e 64 61 72 64 20 50 4f 53 49   a standard POSI
3130: 58 20 65 72 72 6e 6f 20 63 6f 64 65 20 69 6e 74  X errno code int
3140: 6f 20 73 6f 6d 65 74 68 69 6e 67 0a 2a 2a 20 75  o something.** u
3150: 73 65 66 75 6c 20 74 6f 20 74 68 65 20 63 6c 69  seful to the cli
3160: 65 6e 74 73 20 6f 66 20 74 68 65 20 73 71 6c 69  ents of the sqli
3170: 74 65 33 20 66 75 6e 63 74 69 6f 6e 73 2e 20 20  te3 functions.  
3180: 53 70 65 63 69 66 69 63 61 6c 6c 79 2c 20 69 74  Specifically, it
3190: 20 69 73 0a 2a 2a 20 69 6e 74 65 6e 64 65 64 20   is.** intended 
31a0: 74 6f 20 74 72 61 6e 73 6c 61 74 65 20 61 20 76  to translate a v
31b0: 61 72 69 65 74 79 20 6f 66 20 22 74 72 79 20 61  ariety of "try a
31c0: 67 61 69 6e 22 20 65 72 72 6f 72 73 20 69 6e 74  gain" errors int
31d0: 6f 20 53 51 4c 49 54 45 5f 42 55 53 59 0a 2a 2a  o SQLITE_BUSY.**
31e0: 20 61 6e 64 20 61 20 76 61 72 69 65 74 79 20 6f   and a variety o
31f0: 66 20 22 70 6c 65 61 73 65 20 63 6c 6f 73 65 20  f "please close 
3200: 74 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70  the file descrip
3210: 74 6f 72 20 4e 4f 57 22 20 65 72 72 6f 72 73 20  tor NOW" errors 
3220: 69 6e 74 6f 20 0a 2a 2a 20 53 51 4c 49 54 45 5f  into .** SQLITE_
3230: 49 4f 45 52 52 0a 2a 2a 20 0a 2a 2a 20 45 72 72  IOERR.** .** Err
3240: 6f 72 73 20 64 75 72 69 6e 67 20 69 6e 69 74 69  ors during initi
3250: 61 6c 69 7a 61 74 69 6f 6e 20 6f 66 20 6c 6f 63  alization of loc
3260: 6b 73 2c 20 6f 72 20 66 69 6c 65 20 73 79 73 74  ks, or file syst
3270: 65 6d 20 73 75 70 70 6f 72 74 20 66 6f 72 20 6c  em support for l
3280: 6f 63 6b 73 2c 0a 2a 2a 20 73 68 6f 75 6c 64 20  ocks,.** should 
3290: 68 61 6e 64 6c 65 20 45 4e 4f 4c 43 4b 2c 20 45  handle ENOLCK, E
32a0: 4e 4f 54 53 55 50 2c 20 45 4f 50 4e 4f 54 53 55  NOTSUP, EOPNOTSU
32b0: 50 50 20 73 65 70 61 72 61 74 65 6c 79 2e 0a 2a  PP separately..*
32c0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 71 6c  /.static int sql
32d0: 69 74 65 45 72 72 6f 72 46 72 6f 6d 50 6f 73 69  iteErrorFromPosi
32e0: 78 45 72 72 6f 72 28 69 6e 74 20 70 6f 73 69 78  xError(int posix
32f0: 45 72 72 6f 72 2c 20 69 6e 74 20 73 71 6c 69 74  Error, int sqlit
3300: 65 49 4f 45 72 72 29 20 7b 0a 20 20 73 77 69 74  eIOErr) {.  swit
3310: 63 68 20 28 70 6f 73 69 78 45 72 72 6f 72 29 20  ch (posixError) 
3320: 7b 0a 20 20 63 61 73 65 20 30 3a 20 0a 20 20 20  {.  case 0: .   
3330: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
3340: 4b 3b 0a 20 20 20 20 0a 20 20 63 61 73 65 20 45  K;.    .  case E
3350: 41 47 41 49 4e 3a 0a 20 20 63 61 73 65 20 45 54  AGAIN:.  case ET
3360: 49 4d 45 44 4f 55 54 3a 0a 20 20 63 61 73 65 20  IMEDOUT:.  case 
3370: 45 42 55 53 59 3a 0a 20 20 63 61 73 65 20 45 49  EBUSY:.  case EI
3380: 4e 54 52 3a 0a 20 20 63 61 73 65 20 45 4e 4f 4c  NTR:.  case ENOL
3390: 43 4b 3a 20 20 0a 20 20 20 20 2f 2a 20 72 61 6e  CK:  .    /* ran
33a0: 64 6f 6d 20 4e 46 53 20 72 65 74 72 79 20 65 72  dom NFS retry er
33b0: 72 6f 72 2c 20 75 6e 6c 65 73 73 20 64 75 72 69  ror, unless duri
33c0: 6e 67 20 66 69 6c 65 20 73 79 73 74 65 6d 20 73  ng file system s
33d0: 75 70 70 6f 72 74 20 0a 20 20 20 20 20 2a 20 69  upport .     * i
33e0: 6e 74 72 6f 73 70 65 63 74 69 6f 6e 2c 20 69 6e  ntrospection, in
33f0: 20 77 68 69 63 68 20 69 74 20 61 63 74 75 61 6c   which it actual
3400: 6c 79 20 6d 65 61 6e 73 20 77 68 61 74 20 69 74  ly means what it
3410: 20 73 61 79 73 20 2a 2f 0a 20 20 20 20 72 65 74   says */.    ret
3420: 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 3b  urn SQLITE_BUSY;
3430: 0a 20 20 20 20 0a 20 20 63 61 73 65 20 45 41 43  .    .  case EAC
3440: 43 45 53 3a 20 0a 20 20 20 20 2f 2a 20 45 41 43  CES: .    /* EAC
3450: 43 45 53 20 69 73 20 6c 69 6b 65 20 45 41 47 41  CES is like EAGA
3460: 49 4e 20 64 75 72 69 6e 67 20 6c 6f 63 6b 69 6e  IN during lockin
3470: 67 20 6f 70 65 72 61 74 69 6f 6e 73 2c 20 62 75  g operations, bu
3480: 74 20 6e 6f 74 20 61 6e 79 20 6f 74 68 65 72 20  t not any other 
3490: 74 69 6d 65 2a 2f 0a 20 20 20 20 69 66 28 20 28  time*/.    if( (
34a0: 73 71 6c 69 74 65 49 4f 45 72 72 20 3d 3d 20 53  sqliteIOErr == S
34b0: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b  QLITE_IOERR_LOCK
34c0: 29 20 7c 7c 20 0a 09 28 73 71 6c 69 74 65 49 4f  ) || ..(sqliteIO
34d0: 45 72 72 20 3d 3d 20 53 51 4c 49 54 45 5f 49 4f  Err == SQLITE_IO
34e0: 45 52 52 5f 55 4e 4c 4f 43 4b 29 20 7c 7c 20 0a  ERR_UNLOCK) || .
34f0: 09 28 73 71 6c 69 74 65 49 4f 45 72 72 20 3d 3d  .(sqliteIOErr ==
3500: 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 52 44   SQLITE_IOERR_RD
3510: 4c 4f 43 4b 29 20 7c 7c 0a 09 28 73 71 6c 69 74  LOCK) ||..(sqlit
3520: 65 49 4f 45 72 72 20 3d 3d 20 53 51 4c 49 54 45  eIOErr == SQLITE
3530: 5f 49 4f 45 52 52 5f 43 48 45 43 4b 52 45 53 45  _IOERR_CHECKRESE
3540: 52 56 45 44 4c 4f 43 4b 29 20 29 7b 0a 20 20 20  RVEDLOCK) ){.   
3550: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
3560: 5f 42 55 53 59 3b 0a 20 20 20 20 7d 0a 20 20 20  _BUSY;.    }.   
3570: 20 2f 2a 20 65 6c 73 65 20 66 61 6c 6c 20 74 68   /* else fall th
3580: 72 6f 75 67 68 20 2a 2f 0a 20 20 63 61 73 65 20  rough */.  case 
3590: 45 50 45 52 4d 3a 20 0a 20 20 20 20 72 65 74 75  EPERM: .    retu
35a0: 72 6e 20 53 51 4c 49 54 45 5f 50 45 52 4d 3b 0a  rn SQLITE_PERM;.
35b0: 20 20 20 20 0a 20 20 63 61 73 65 20 45 44 45 41      .  case EDEA
35c0: 44 4c 4b 3a 0a 20 20 20 20 72 65 74 75 72 6e 20  DLK:.    return 
35d0: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 42 4c 4f  SQLITE_IOERR_BLO
35e0: 43 4b 45 44 3b 0a 20 20 20 20 0a 23 69 66 20 45  CKED;.    .#if E
35f0: 4f 50 4e 4f 54 53 55 50 50 21 3d 45 4e 4f 54 53  OPNOTSUPP!=ENOTS
3600: 55 50 0a 20 20 63 61 73 65 20 45 4f 50 4e 4f 54  UP.  case EOPNOT
3610: 53 55 50 50 3a 20 0a 20 20 20 20 2f 2a 20 73 6f  SUPP: .    /* so
3620: 6d 65 74 68 69 6e 67 20 77 65 6e 74 20 74 65 72  mething went ter
3630: 72 69 62 6c 79 20 61 77 72 79 2c 20 75 6e 6c 65  ribly awry, unle
3640: 73 73 20 64 75 72 69 6e 67 20 66 69 6c 65 20 73  ss during file s
3650: 79 73 74 65 6d 20 73 75 70 70 6f 72 74 20 0a 20  ystem support . 
3660: 20 20 20 20 2a 20 69 6e 74 72 6f 73 70 65 63 74      * introspect
3670: 69 6f 6e 2c 20 69 6e 20 77 68 69 63 68 20 69 74  ion, in which it
3680: 20 61 63 74 75 61 6c 6c 79 20 6d 65 61 6e 73 20   actually means 
3690: 77 68 61 74 20 69 74 20 73 61 79 73 20 2a 2f 0a  what it says */.
36a0: 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20 45 4e  #endif.#ifdef EN
36b0: 4f 54 53 55 50 0a 20 20 63 61 73 65 20 45 4e 4f  OTSUP.  case ENO
36c0: 54 53 55 50 3a 20 0a 20 20 20 20 2f 2a 20 69 6e  TSUP: .    /* in
36d0: 76 61 6c 69 64 20 66 64 2c 20 75 6e 6c 65 73 73  valid fd, unless
36e0: 20 64 75 72 69 6e 67 20 66 69 6c 65 20 73 79 73   during file sys
36f0: 74 65 6d 20 73 75 70 70 6f 72 74 20 69 6e 74 72  tem support intr
3700: 6f 73 70 65 63 74 69 6f 6e 2c 20 69 6e 20 77 68  ospection, in wh
3710: 69 63 68 20 0a 20 20 20 20 20 2a 20 69 74 20 61  ich .     * it a
3720: 63 74 75 61 6c 6c 79 20 6d 65 61 6e 73 20 77 68  ctually means wh
3730: 61 74 20 69 74 20 73 61 79 73 20 2a 2f 0a 23 65  at it says */.#e
3740: 6e 64 69 66 0a 20 20 63 61 73 65 20 45 49 4f 3a  ndif.  case EIO:
3750: 0a 20 20 63 61 73 65 20 45 42 41 44 46 3a 0a 20  .  case EBADF:. 
3760: 20 63 61 73 65 20 45 49 4e 56 41 4c 3a 0a 20 20   case EINVAL:.  
3770: 63 61 73 65 20 45 4e 4f 54 43 4f 4e 4e 3a 0a 20  case ENOTCONN:. 
3780: 20 63 61 73 65 20 45 4e 4f 44 45 56 3a 0a 20 20   case ENODEV:.  
3790: 63 61 73 65 20 45 4e 58 49 4f 3a 0a 20 20 63 61  case ENXIO:.  ca
37a0: 73 65 20 45 4e 4f 45 4e 54 3a 0a 20 20 63 61 73  se ENOENT:.  cas
37b0: 65 20 45 53 54 41 4c 45 3a 0a 20 20 63 61 73 65  e ESTALE:.  case
37c0: 20 45 4e 4f 53 59 53 3a 0a 20 20 20 20 2f 2a 20   ENOSYS:.    /* 
37d0: 74 68 65 73 65 20 73 68 6f 75 6c 64 20 66 6f 72  these should for
37e0: 63 65 20 74 68 65 20 63 6c 69 65 6e 74 20 74 6f  ce the client to
37f0: 20 63 6c 6f 73 65 20 74 68 65 20 66 69 6c 65 20   close the file 
3800: 61 6e 64 20 72 65 63 6f 6e 6e 65 63 74 20 2a 2f  and reconnect */
3810: 0a 20 20 20 20 0a 20 20 64 65 66 61 75 6c 74 3a  .    .  default:
3820: 20 0a 20 20 20 20 72 65 74 75 72 6e 20 73 71 6c   .    return sql
3830: 69 74 65 49 4f 45 72 72 3b 0a 20 20 7d 0a 7d 0a  iteIOErr;.  }.}.
3840: 0a 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .../************
3850: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
3860: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
3870: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
3880: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
3890: 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  **.*************
38a0: 2a 2a 2a 2a 2a 20 42 65 67 69 6e 20 55 6e 69 71  ***** Begin Uniq
38b0: 75 65 20 46 69 6c 65 20 49 44 20 55 74 69 6c 69  ue File ID Utili
38c0: 74 79 20 55 73 65 64 20 42 79 20 56 78 57 6f 72  ty Used By VxWor
38d0: 6b 73 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ks *************
38e0: 2a 2a 0a 2a 2a 0a 2a 2a 20 4f 6e 20 6d 6f 73 74  **.**.** On most
38f0: 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 75 6e 69   versions of uni
3900: 78 2c 20 77 65 20 63 61 6e 20 67 65 74 20 61 20  x, we can get a 
3910: 75 6e 69 71 75 65 20 49 44 20 66 6f 72 20 61 20  unique ID for a 
3920: 66 69 6c 65 20 62 79 20 63 6f 6e 63 61 74 65 6e  file by concaten
3930: 61 74 69 6e 67 0a 2a 2a 20 74 68 65 20 64 65 76  ating.** the dev
3940: 69 63 65 20 6e 75 6d 62 65 72 20 61 6e 64 20 74  ice number and t
3950: 68 65 20 69 6e 6f 64 65 20 6e 75 6d 62 65 72 2e  he inode number.
3960: 20 20 42 75 74 20 74 68 69 73 20 64 6f 65 73 20    But this does 
3970: 6e 6f 74 20 77 6f 72 6b 20 6f 6e 20 56 78 57 6f  not work on VxWo
3980: 72 6b 73 2e 0a 2a 2a 20 4f 6e 20 56 78 57 6f 72  rks..** On VxWor
3990: 6b 73 2c 20 61 20 75 6e 69 71 75 65 20 66 69 6c  ks, a unique fil
39a0: 65 20 69 64 20 6d 75 73 74 20 62 65 20 62 61 73  e id must be bas
39b0: 65 64 20 6f 6e 20 74 68 65 20 63 61 6e 6f 6e 69  ed on the canoni
39c0: 63 61 6c 20 66 69 6c 65 6e 61 6d 65 2e 0a 2a 2a  cal filename..**
39d0: 0a 2a 2a 20 41 20 70 6f 69 6e 74 65 72 20 74 6f  .** A pointer to
39e0: 20 61 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20   an instance of 
39f0: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74  the following st
3a00: 72 75 63 74 75 72 65 20 63 61 6e 20 62 65 20 75  ructure can be u
3a10: 73 65 64 20 61 73 20 61 0a 2a 2a 20 75 6e 69 71  sed as a.** uniq
3a20: 75 65 20 66 69 6c 65 20 49 44 20 69 6e 20 56 78  ue file ID in Vx
3a30: 57 6f 72 6b 73 2e 20 20 45 61 63 68 20 69 6e 73  Works.  Each ins
3a40: 74 61 6e 63 65 20 6f 66 20 74 68 69 73 20 73 74  tance of this st
3a50: 72 75 63 74 75 72 65 20 63 6f 6e 74 61 69 6e 73  ructure contains
3a60: 0a 2a 2a 20 61 20 63 6f 70 79 20 6f 66 20 74 68  .** a copy of th
3a70: 65 20 63 61 6e 6f 6e 69 63 61 6c 20 66 69 6c 65  e canonical file
3a80: 6e 61 6d 65 2e 20 20 54 68 65 72 65 20 69 73 20  name.  There is 
3a90: 61 6c 73 6f 20 61 20 72 65 66 65 72 65 6e 63 65  also a reference
3aa0: 20 63 6f 75 6e 74 2e 20 20 0a 2a 2a 20 54 68 65   count.  .** The
3ab0: 20 73 74 72 75 63 74 75 72 65 20 69 73 20 72 65   structure is re
3ac0: 63 6c 61 69 6d 65 64 20 77 68 65 6e 20 74 68 65  claimed when the
3ad0: 20 6e 75 6d 62 65 72 20 6f 66 20 70 6f 69 6e 74   number of point
3ae0: 65 72 73 20 74 6f 20 69 74 20 64 72 6f 70 73 20  ers to it drops 
3af0: 74 6f 0a 2a 2a 20 7a 65 72 6f 2e 0a 2a 2a 0a 2a  to.** zero..**.*
3b00: 2a 20 54 68 65 72 65 20 61 72 65 20 6e 65 76 65  * There are neve
3b10: 72 20 76 65 72 79 20 6d 61 6e 79 20 66 69 6c 65  r very many file
3b20: 73 20 6f 70 65 6e 20 61 74 20 6f 6e 65 20 74 69  s open at one ti
3b30: 6d 65 20 61 6e 64 20 6c 6f 6f 6b 75 70 73 20 61  me and lookups a
3b40: 72 65 20 6e 6f 74 0a 2a 2a 20 61 20 70 65 72 66  re not.** a perf
3b50: 6f 72 6d 61 6e 63 65 2d 63 72 69 74 69 63 61 6c  ormance-critical
3b60: 20 70 61 74 68 2c 20 73 6f 20 69 74 20 69 73 20   path, so it is 
3b70: 73 75 66 66 69 63 69 65 6e 74 20 74 6f 20 70 75  sufficient to pu
3b80: 74 20 74 68 65 73 65 0a 2a 2a 20 73 74 72 75 63  t these.** struc
3b90: 74 75 72 65 73 20 6f 6e 20 61 20 6c 69 6e 6b 65  tures on a linke
3ba0: 64 20 6c 69 73 74 2e 0a 2a 2f 0a 73 74 72 75 63  d list..*/.struc
3bb0: 74 20 76 78 77 6f 72 6b 73 46 69 6c 65 49 64 20  t vxworksFileId 
3bc0: 7b 0a 20 20 73 74 72 75 63 74 20 76 78 77 6f 72  {.  struct vxwor
3bd0: 6b 73 46 69 6c 65 49 64 20 2a 70 4e 65 78 74 3b  ksFileId *pNext;
3be0: 20 20 2f 2a 20 4e 65 78 74 20 69 6e 20 61 20 6c    /* Next in a l
3bf0: 69 73 74 20 6f 66 20 74 68 65 6d 20 61 6c 6c 20  ist of them all 
3c00: 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 66 3b 20 20  */.  int nRef;  
3c10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3c20: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
3c30: 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 74 68  references to th
3c40: 69 73 20 6f 6e 65 20 2a 2f 0a 20 20 69 6e 74 20  is one */.  int 
3c50: 6e 4e 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20  nName;          
3c60: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 65 6e            /* Len
3c70: 67 74 68 20 6f 66 20 74 68 65 20 7a 43 61 6e 6f  gth of the zCano
3c80: 6e 69 63 61 6c 4e 61 6d 65 5b 5d 20 73 74 72 69  nicalName[] stri
3c90: 6e 67 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 43  ng */.  char *zC
3ca0: 61 6e 6f 6e 69 63 61 6c 4e 61 6d 65 3b 20 20 20  anonicalName;   
3cb0: 20 20 20 20 20 20 2f 2a 20 43 61 6e 6f 6e 69 63        /* Canonic
3cc0: 61 6c 20 66 69 6c 65 6e 61 6d 65 20 2a 2f 0a 7d  al filename */.}
3cd0: 3b 0a 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b  ;..#if OS_VXWORK
3ce0: 53 0a 2f 2a 20 0a 2a 2a 20 41 6c 6c 20 75 6e 69  S./* .** All uni
3cf0: 71 75 65 20 66 69 6c 65 6e 61 6d 65 73 20 61 72  que filenames ar
3d00: 65 20 68 65 6c 64 20 6f 6e 20 61 20 6c 69 6e 6b  e held on a link
3d10: 65 64 20 6c 69 73 74 20 68 65 61 64 65 64 20 62  ed list headed b
3d20: 79 20 74 68 69 73 0a 2a 2a 20 76 61 72 69 61 62  y this.** variab
3d30: 6c 65 3a 0a 2a 2f 0a 73 74 61 74 69 63 20 73 74  le:.*/.static st
3d40: 72 75 63 74 20 76 78 77 6f 72 6b 73 46 69 6c 65  ruct vxworksFile
3d50: 49 64 20 2a 76 78 77 6f 72 6b 73 46 69 6c 65 4c  Id *vxworksFileL
3d60: 69 73 74 20 3d 20 30 3b 0a 0a 2f 2a 0a 2a 2a 20  ist = 0;../*.** 
3d70: 53 69 6d 70 6c 69 66 79 20 61 20 66 69 6c 65 6e  Simplify a filen
3d80: 61 6d 65 20 69 6e 74 6f 20 69 74 73 20 63 61 6e  ame into its can
3d90: 6f 6e 69 63 61 6c 20 66 6f 72 6d 0a 2a 2a 20 62  onical form.** b
3da0: 79 20 6d 61 6b 69 6e 67 20 74 68 65 20 66 6f 6c  y making the fol
3db0: 6c 6f 77 69 6e 67 20 63 68 61 6e 67 65 73 3a 0a  lowing changes:.
3dc0: 2a 2a 0a 2a 2a 20 20 2a 20 72 65 6d 6f 76 69 6e  **.**  * removin
3dd0: 67 20 61 6e 79 20 74 72 61 69 6c 69 6e 67 20 61  g any trailing a
3de0: 6e 64 20 64 75 70 6c 69 63 61 74 65 20 2f 0a 2a  nd duplicate /.*
3df0: 2a 20 20 2a 20 63 6f 6e 76 65 72 74 20 2f 2e 2f  *  * convert /./
3e00: 20 69 6e 74 6f 20 6a 75 73 74 20 2f 0a 2a 2a 20   into just /.** 
3e10: 20 2a 20 63 6f 6e 76 65 72 74 20 2f 41 2f 2e 2e   * convert /A/..
3e20: 2f 20 77 68 65 72 65 20 41 20 69 73 20 61 6e 79  / where A is any
3e30: 20 73 69 6d 70 6c 65 20 6e 61 6d 65 20 69 6e 74   simple name int
3e40: 6f 20 6a 75 73 74 20 2f 0a 2a 2a 0a 2a 2a 20 43  o just /.**.** C
3e50: 68 61 6e 67 65 73 20 61 72 65 20 6d 61 64 65 20  hanges are made 
3e60: 69 6e 2d 70 6c 61 63 65 2e 20 20 52 65 74 75 72  in-place.  Retur
3e70: 6e 20 74 68 65 20 6e 65 77 20 6e 61 6d 65 20 6c  n the new name l
3e80: 65 6e 67 74 68 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  ength..**.** The
3e90: 20 6f 72 69 67 69 6e 61 6c 20 66 69 6c 65 6e 61   original filena
3ea0: 6d 65 20 69 73 20 69 6e 20 7a 5b 30 2e 2e 6e 2d  me is in z[0..n-
3eb0: 31 5d 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20  1].  Return the 
3ec0: 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a 20 63 68 61  number of.** cha
3ed0: 72 61 63 74 65 72 73 20 69 6e 20 74 68 65 20 73  racters in the s
3ee0: 69 6d 70 6c 69 66 69 65 64 20 6e 61 6d 65 2e 0a  implified name..
3ef0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 76 78  */.static int vx
3f00: 77 6f 72 6b 73 53 69 6d 70 6c 69 66 79 4e 61 6d  worksSimplifyNam
3f10: 65 28 63 68 61 72 20 2a 7a 2c 20 69 6e 74 20 6e  e(char *z, int n
3f20: 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20  ){.  int i, j;. 
3f30: 20 77 68 69 6c 65 28 20 6e 3e 31 20 26 26 20 7a   while( n>1 && z
3f40: 5b 6e 2d 31 5d 3d 3d 27 2f 27 20 29 7b 20 6e 2d  [n-1]=='/' ){ n-
3f50: 2d 3b 20 7d 0a 20 20 66 6f 72 28 69 3d 6a 3d 30  -; }.  for(i=j=0
3f60: 3b 20 69 3c 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20  ; i<n; i++){.   
3f70: 20 69 66 28 20 7a 5b 69 5d 3d 3d 27 2f 27 20 29   if( z[i]=='/' )
3f80: 7b 0a 20 20 20 20 20 20 69 66 28 20 7a 5b 69 2b  {.      if( z[i+
3f90: 31 5d 3d 3d 27 2f 27 20 29 20 63 6f 6e 74 69 6e  1]=='/' ) contin
3fa0: 75 65 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 5b  ue;.      if( z[
3fb0: 69 2b 31 5d 3d 3d 27 2e 27 20 26 26 20 69 2b 32  i+1]=='.' && i+2
3fc0: 3c 6e 20 26 26 20 7a 5b 69 2b 32 5d 3d 3d 27 2f  <n && z[i+2]=='/
3fd0: 27 20 29 7b 0a 20 20 20 20 20 20 20 20 69 20 2b  ' ){.        i +
3fe0: 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 63 6f 6e  = 1;.        con
3ff0: 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 7d 0a 20  tinue;.      }. 
4000: 20 20 20 20 20 69 66 28 20 7a 5b 69 2b 31 5d 3d       if( z[i+1]=
4010: 3d 27 2e 27 20 26 26 20 69 2b 33 3c 6e 20 26 26  ='.' && i+3<n &&
4020: 20 7a 5b 69 2b 32 5d 3d 3d 27 2e 27 20 26 26 20   z[i+2]=='.' && 
4030: 7a 5b 69 2b 33 5d 3d 3d 27 2f 27 20 29 7b 0a 20  z[i+3]=='/' ){. 
4040: 20 20 20 20 20 20 20 77 68 69 6c 65 28 20 6a 3e         while( j>
4050: 30 20 26 26 20 7a 5b 6a 2d 31 5d 21 3d 27 2f 27  0 && z[j-1]!='/'
4060: 20 29 7b 20 6a 2d 2d 3b 20 7d 0a 20 20 20 20 20   ){ j--; }.     
4070: 20 20 20 69 66 28 20 6a 3e 30 20 29 7b 20 6a 2d     if( j>0 ){ j-
4080: 2d 3b 20 7d 0a 20 20 20 20 20 20 20 20 69 20 2b  -; }.        i +
4090: 3d 20 32 3b 0a 20 20 20 20 20 20 20 20 63 6f 6e  = 2;.        con
40a0: 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 7d 0a 20  tinue;.      }. 
40b0: 20 20 20 7d 0a 20 20 20 20 7a 5b 6a 2b 2b 5d 20     }.    z[j++] 
40c0: 3d 20 7a 5b 69 5d 3b 0a 20 20 7d 0a 20 20 7a 5b  = z[i];.  }.  z[
40d0: 6a 5d 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e  j] = 0;.  return
40e0: 20 6a 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 69 6e   j;.}../*.** Fin
40f0: 64 20 61 20 75 6e 69 71 75 65 20 66 69 6c 65 20  d a unique file 
4100: 49 44 20 66 6f 72 20 74 68 65 20 67 69 76 65 6e  ID for the given
4110: 20 61 62 73 6f 6c 75 74 65 20 70 61 74 68 6e 61   absolute pathna
4120: 6d 65 2e 20 20 52 65 74 75 72 6e 0a 2a 2a 20 61  me.  Return.** a
4130: 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
4140: 76 78 77 6f 72 6b 73 46 69 6c 65 49 64 20 6f 62  vxworksFileId ob
4150: 6a 65 63 74 2e 20 20 54 68 69 73 20 70 6f 69 6e  ject.  This poin
4160: 74 65 72 20 69 73 20 74 68 65 20 75 6e 69 71 75  ter is the uniqu
4170: 65 0a 2a 2a 20 66 69 6c 65 20 49 44 2e 0a 2a 2a  e.** file ID..**
4180: 0a 2a 2a 20 54 68 65 20 6e 52 65 66 20 66 69 65  .** The nRef fie
4190: 6c 64 20 6f 66 20 74 68 65 20 76 78 77 6f 72 6b  ld of the vxwork
41a0: 73 46 69 6c 65 49 64 20 6f 62 6a 65 63 74 20 69  sFileId object i
41b0: 73 20 69 6e 63 72 65 6d 65 6e 74 65 64 20 62 65  s incremented be
41c0: 66 6f 72 65 0a 2a 2a 20 74 68 65 20 6f 62 6a 65  fore.** the obje
41d0: 63 74 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20  ct is returned. 
41e0: 20 41 20 6e 65 77 20 76 78 77 6f 72 6b 73 46 69   A new vxworksFi
41f0: 6c 65 49 64 20 6f 62 6a 65 63 74 20 69 73 20 63  leId object is c
4200: 72 65 61 74 65 64 0a 2a 2a 20 61 6e 64 20 61 64  reated.** and ad
4210: 64 65 64 20 74 6f 20 74 68 65 20 67 6c 6f 62 61  ded to the globa
4220: 6c 20 6c 69 73 74 20 69 66 20 6e 65 63 65 73 73  l list if necess
4230: 61 72 79 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20  ary..**.** If a 
4240: 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f  memory allocatio
4250: 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20  n error occurs, 
4260: 72 65 74 75 72 6e 20 4e 55 4c 4c 2e 0a 2a 2f 0a  return NULL..*/.
4270: 73 74 61 74 69 63 20 73 74 72 75 63 74 20 76 78  static struct vx
4280: 77 6f 72 6b 73 46 69 6c 65 49 64 20 2a 76 78 77  worksFileId *vxw
4290: 6f 72 6b 73 46 69 6e 64 46 69 6c 65 49 64 28 63  orksFindFileId(c
42a0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 41 62 73 6f  onst char *zAbso
42b0: 6c 75 74 65 4e 61 6d 65 29 7b 0a 20 20 73 74 72  luteName){.  str
42c0: 75 63 74 20 76 78 77 6f 72 6b 73 46 69 6c 65 49  uct vxworksFileI
42d0: 64 20 2a 70 4e 65 77 3b 20 20 20 20 20 20 20 20  d *pNew;        
42e0: 20 2f 2a 20 73 65 61 72 63 68 20 6b 65 79 20 61   /* search key a
42f0: 6e 64 20 6e 65 77 20 66 69 6c 65 20 49 44 20 2a  nd new file ID *
4300: 2f 0a 20 20 73 74 72 75 63 74 20 76 78 77 6f 72  /.  struct vxwor
4310: 6b 73 46 69 6c 65 49 64 20 2a 70 43 61 6e 64 69  ksFileId *pCandi
4320: 64 61 74 65 3b 20 20 20 2f 2a 20 46 6f 72 20 6c  date;   /* For l
4330: 6f 6f 70 69 6e 67 20 6f 76 65 72 20 65 78 69 73  ooping over exis
4340: 74 69 6e 67 20 66 69 6c 65 20 49 44 73 20 2a 2f  ting file IDs */
4350: 0a 20 20 69 6e 74 20 6e 3b 20 20 20 20 20 20 20  .  int n;       
4360: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4370: 20 20 20 20 20 20 20 2f 2a 20 4c 65 6e 67 74 68         /* Length
4380: 20 6f 66 20 7a 41 62 73 6f 6c 75 74 65 4e 61 6d   of zAbsoluteNam
4390: 65 20 73 74 72 69 6e 67 20 2a 2f 0a 0a 20 20 61  e string */..  a
43a0: 73 73 65 72 74 28 20 7a 41 62 73 6f 6c 75 74 65  ssert( zAbsolute
43b0: 4e 61 6d 65 5b 30 5d 3d 3d 27 2f 27 20 29 3b 0a  Name[0]=='/' );.
43c0: 20 20 6e 20 3d 20 28 69 6e 74 29 73 74 72 6c 65    n = (int)strle
43d0: 6e 28 7a 41 62 73 6f 6c 75 74 65 4e 61 6d 65 29  n(zAbsoluteName)
43e0: 3b 0a 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74  ;.  pNew = sqlit
43f0: 65 33 5f 6d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f  e3_malloc( sizeo
4400: 66 28 2a 70 4e 65 77 29 20 2b 20 28 6e 2b 31 29  f(*pNew) + (n+1)
4410: 20 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d   );.  if( pNew==
4420: 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
4430: 70 4e 65 77 2d 3e 7a 43 61 6e 6f 6e 69 63 61 6c  pNew->zCanonical
4440: 4e 61 6d 65 20 3d 20 28 63 68 61 72 2a 29 26 70  Name = (char*)&p
4450: 4e 65 77 5b 31 5d 3b 0a 20 20 6d 65 6d 63 70 79  New[1];.  memcpy
4460: 28 70 4e 65 77 2d 3e 7a 43 61 6e 6f 6e 69 63 61  (pNew->zCanonica
4470: 6c 4e 61 6d 65 2c 20 7a 41 62 73 6f 6c 75 74 65  lName, zAbsolute
4480: 4e 61 6d 65 2c 20 6e 2b 31 29 3b 0a 20 20 6e 20  Name, n+1);.  n 
4490: 3d 20 76 78 77 6f 72 6b 73 53 69 6d 70 6c 69 66  = vxworksSimplif
44a0: 79 4e 61 6d 65 28 70 4e 65 77 2d 3e 7a 43 61 6e  yName(pNew->zCan
44b0: 6f 6e 69 63 61 6c 4e 61 6d 65 2c 20 6e 29 3b 0a  onicalName, n);.
44c0: 0a 20 20 2f 2a 20 53 65 61 72 63 68 20 66 6f 72  .  /* Search for
44d0: 20 61 6e 20 65 78 69 73 74 69 6e 67 20 65 6e 74   an existing ent
44e0: 72 79 20 74 68 61 74 20 6d 61 74 63 68 69 6e 67  ry that matching
44f0: 20 74 68 65 20 63 61 6e 6f 6e 69 63 61 6c 20 6e   the canonical n
4500: 61 6d 65 2e 0a 20 20 2a 2a 20 49 66 20 66 6f 75  ame..  ** If fou
4510: 6e 64 2c 20 69 6e 63 72 65 6d 65 6e 74 20 74 68  nd, increment th
4520: 65 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e  e reference coun
4530: 74 20 61 6e 64 20 72 65 74 75 72 6e 20 61 20 70  t and return a p
4540: 6f 69 6e 74 65 72 20 74 6f 0a 20 20 2a 2a 20 74  ointer to.  ** t
4550: 68 65 20 65 78 69 73 74 69 6e 67 20 66 69 6c 65  he existing file
4560: 20 49 44 2e 0a 20 20 2a 2f 0a 20 20 75 6e 69 78   ID..  */.  unix
4570: 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 20 20  EnterMutex();.  
4580: 66 6f 72 28 70 43 61 6e 64 69 64 61 74 65 3d 76  for(pCandidate=v
4590: 78 77 6f 72 6b 73 46 69 6c 65 4c 69 73 74 3b 20  xworksFileList; 
45a0: 70 43 61 6e 64 69 64 61 74 65 3b 20 70 43 61 6e  pCandidate; pCan
45b0: 64 69 64 61 74 65 3d 70 43 61 6e 64 69 64 61 74  didate=pCandidat
45c0: 65 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 69  e->pNext){.    i
45d0: 66 28 20 70 43 61 6e 64 69 64 61 74 65 2d 3e 6e  f( pCandidate->n
45e0: 4e 61 6d 65 3d 3d 6e 20 0a 20 20 20 20 20 26 26  Name==n .     &&
45f0: 20 6d 65 6d 63 6d 70 28 70 43 61 6e 64 69 64 61   memcmp(pCandida
4600: 74 65 2d 3e 7a 43 61 6e 6f 6e 69 63 61 6c 4e 61  te->zCanonicalNa
4610: 6d 65 2c 20 70 4e 65 77 2d 3e 7a 43 61 6e 6f 6e  me, pNew->zCanon
4620: 69 63 61 6c 4e 61 6d 65 2c 20 6e 29 3d 3d 30 0a  icalName, n)==0.
4630: 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 73 71      ){.       sq
4640: 6c 69 74 65 33 5f 66 72 65 65 28 70 4e 65 77 29  lite3_free(pNew)
4650: 3b 0a 20 20 20 20 20 20 20 70 43 61 6e 64 69 64  ;.       pCandid
4660: 61 74 65 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 20  ate->nRef++;.   
4670: 20 20 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74      unixLeaveMut
4680: 65 78 28 29 3b 0a 20 20 20 20 20 20 20 72 65 74  ex();.       ret
4690: 75 72 6e 20 70 43 61 6e 64 69 64 61 74 65 3b 0a  urn pCandidate;.
46a0: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
46b0: 4e 6f 20 6d 61 74 63 68 20 77 61 73 20 66 6f 75  No match was fou
46c0: 6e 64 2e 20 20 57 65 20 77 69 6c 6c 20 6d 61 6b  nd.  We will mak
46d0: 65 20 61 20 6e 65 77 20 66 69 6c 65 20 49 44 20  e a new file ID 
46e0: 2a 2f 0a 20 20 70 4e 65 77 2d 3e 6e 52 65 66 20  */.  pNew->nRef 
46f0: 3d 20 31 3b 0a 20 20 70 4e 65 77 2d 3e 6e 4e 61  = 1;.  pNew->nNa
4700: 6d 65 20 3d 20 6e 3b 0a 20 20 70 4e 65 77 2d 3e  me = n;.  pNew->
4710: 70 4e 65 78 74 20 3d 20 76 78 77 6f 72 6b 73 46  pNext = vxworksF
4720: 69 6c 65 4c 69 73 74 3b 0a 20 20 76 78 77 6f 72  ileList;.  vxwor
4730: 6b 73 46 69 6c 65 4c 69 73 74 20 3d 20 70 4e 65  ksFileList = pNe
4740: 77 3b 0a 20 20 75 6e 69 78 4c 65 61 76 65 4d 75  w;.  unixLeaveMu
4750: 74 65 78 28 29 3b 0a 20 20 72 65 74 75 72 6e 20  tex();.  return 
4760: 70 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44  pNew;.}../*.** D
4770: 65 63 72 65 6d 65 6e 74 20 74 68 65 20 72 65 66  ecrement the ref
4780: 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 6f 6e 20  erence count on 
4790: 61 20 76 78 77 6f 72 6b 73 46 69 6c 65 49 64 20  a vxworksFileId 
47a0: 6f 62 6a 65 63 74 2e 20 20 46 72 65 65 0a 2a 2a  object.  Free.**
47b0: 20 74 68 65 20 6f 62 6a 65 63 74 20 77 68 65 6e   the object when
47c0: 20 74 68 65 20 72 65 66 65 72 65 6e 63 65 20 63   the reference c
47d0: 6f 75 6e 74 20 72 65 61 63 68 65 73 20 7a 65 72  ount reaches zer
47e0: 6f 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  o..*/.static voi
47f0: 64 20 76 78 77 6f 72 6b 73 52 65 6c 65 61 73 65  d vxworksRelease
4800: 46 69 6c 65 49 64 28 73 74 72 75 63 74 20 76 78  FileId(struct vx
4810: 77 6f 72 6b 73 46 69 6c 65 49 64 20 2a 70 49 64  worksFileId *pId
4820: 29 7b 0a 20 20 75 6e 69 78 45 6e 74 65 72 4d 75  ){.  unixEnterMu
4830: 74 65 78 28 29 3b 0a 20 20 61 73 73 65 72 74 28  tex();.  assert(
4840: 20 70 49 64 2d 3e 6e 52 65 66 3e 30 20 29 3b 0a   pId->nRef>0 );.
4850: 20 20 70 49 64 2d 3e 6e 52 65 66 2d 2d 3b 0a 20    pId->nRef--;. 
4860: 20 69 66 28 20 70 49 64 2d 3e 6e 52 65 66 3d 3d   if( pId->nRef==
4870: 30 20 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20  0 ){.    struct 
4880: 76 78 77 6f 72 6b 73 46 69 6c 65 49 64 20 2a 2a  vxworksFileId **
4890: 70 70 3b 0a 20 20 20 20 66 6f 72 28 70 70 3d 26  pp;.    for(pp=&
48a0: 76 78 77 6f 72 6b 73 46 69 6c 65 4c 69 73 74 3b  vxworksFileList;
48b0: 20 2a 70 70 20 26 26 20 2a 70 70 21 3d 70 49 64   *pp && *pp!=pId
48c0: 3b 20 70 70 20 3d 20 26 28 28 2a 70 70 29 2d 3e  ; pp = &((*pp)->
48d0: 70 4e 65 78 74 29 29 7b 7d 0a 20 20 20 20 61 73  pNext)){}.    as
48e0: 73 65 72 74 28 20 2a 70 70 3d 3d 70 49 64 20 29  sert( *pp==pId )
48f0: 3b 0a 20 20 20 20 2a 70 70 20 3d 20 70 49 64 2d  ;.    *pp = pId-
4900: 3e 70 4e 65 78 74 3b 0a 20 20 20 20 73 71 6c 69  >pNext;.    sqli
4910: 74 65 33 5f 66 72 65 65 28 70 49 64 29 3b 0a 20  te3_free(pId);. 
4920: 20 7d 0a 20 20 75 6e 69 78 4c 65 61 76 65 4d 75   }.  unixLeaveMu
4930: 74 65 78 28 29 3b 0a 7d 0a 23 65 6e 64 69 66 20  tex();.}.#endif 
4940: 2f 2a 20 4f 53 5f 56 58 57 4f 52 4b 53 20 2a 2f  /* OS_VXWORKS */
4950: 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ./**************
4960: 2a 20 45 6e 64 20 6f 66 20 55 6e 69 71 75 65 20  * End of Unique 
4970: 46 69 6c 65 20 49 44 20 55 74 69 6c 69 74 79 20  File ID Utility 
4980: 55 73 65 64 20 42 79 20 56 78 57 6f 72 6b 73 20  Used By VxWorks 
4990: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
49a0: 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .***************
49b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
49c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
49d0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
49e0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f  ***************/
49f0: 0a 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .../************
4a00: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4a10: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4a20: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4a30: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4a40: 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  **.*************
4a50: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 50  ************** P
4a60: 6f 73 69 78 20 41 64 76 69 73 6f 72 79 20 4c 6f  osix Advisory Lo
4a70: 63 6b 69 6e 67 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  cking **********
4a80: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4a90: 2a 2a 0a 2a 2a 0a 2a 2a 20 50 4f 53 49 58 20 61  **.**.** POSIX a
4aa0: 64 76 69 73 6f 72 79 20 6c 6f 63 6b 73 20 61 72  dvisory locks ar
4ab0: 65 20 62 72 6f 6b 65 6e 20 62 79 20 64 65 73 69  e broken by desi
4ac0: 67 6e 2e 20 20 41 4e 53 49 20 53 54 44 20 31 30  gn.  ANSI STD 10
4ad0: 30 33 2e 31 20 28 31 39 39 36 29 0a 2a 2a 20 73  03.1 (1996).** s
4ae0: 65 63 74 69 6f 6e 20 36 2e 35 2e 32 2e 32 20 6c  ection 6.5.2.2 l
4af0: 69 6e 65 73 20 34 38 33 20 74 68 72 6f 75 67 68  ines 483 through
4b00: 20 34 39 30 20 73 70 65 63 69 66 79 20 74 68 61   490 specify tha
4b10: 74 20 77 68 65 6e 20 61 20 70 72 6f 63 65 73 73  t when a process
4b20: 0a 2a 2a 20 73 65 74 73 20 6f 72 20 63 6c 65 61  .** sets or clea
4b30: 72 73 20 61 20 6c 6f 63 6b 2c 20 74 68 61 74 20  rs a lock, that 
4b40: 6f 70 65 72 61 74 69 6f 6e 20 6f 76 65 72 72 69  operation overri
4b50: 64 65 73 20 61 6e 79 20 70 72 69 6f 72 20 6c 6f  des any prior lo
4b60: 63 6b 73 20 73 65 74 0a 2a 2a 20 62 79 20 74 68  cks set.** by th
4b70: 65 20 73 61 6d 65 20 70 72 6f 63 65 73 73 2e 20  e same process. 
4b80: 20 49 74 20 64 6f 65 73 20 6e 6f 74 20 65 78 70   It does not exp
4b90: 6c 69 63 69 74 6c 79 20 73 61 79 20 73 6f 2c 20  licitly say so, 
4ba0: 62 75 74 20 74 68 69 73 20 69 6d 70 6c 69 65 73  but this implies
4bb0: 0a 2a 2a 20 74 68 61 74 20 69 74 20 6f 76 65 72  .** that it over
4bc0: 72 69 64 65 73 20 6c 6f 63 6b 73 20 73 65 74 20  rides locks set 
4bd0: 62 79 20 74 68 65 20 73 61 6d 65 20 70 72 6f 63  by the same proc
4be0: 65 73 73 20 75 73 69 6e 67 20 61 20 64 69 66 66  ess using a diff
4bf0: 65 72 65 6e 74 0a 2a 2a 20 66 69 6c 65 20 64 65  erent.** file de
4c00: 73 63 72 69 70 74 6f 72 2e 20 20 43 6f 6e 73 69  scriptor.  Consi
4c10: 64 65 72 20 74 68 69 73 20 74 65 73 74 20 63 61  der this test ca
4c20: 73 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20  se:.**.**       
4c30: 69 6e 74 20 66 64 31 20 3d 20 6f 70 65 6e 28 22  int fd1 = open("
4c40: 2e 2f 66 69 6c 65 31 22 2c 20 4f 5f 52 44 57 52  ./file1", O_RDWR
4c50: 7c 4f 5f 43 52 45 41 54 2c 20 30 36 34 34 29 3b  |O_CREAT, 0644);
4c60: 0a 2a 2a 20 20 20 20 20 20 20 69 6e 74 20 66 64  .**       int fd
4c70: 32 20 3d 20 6f 70 65 6e 28 22 2e 2f 66 69 6c 65  2 = open("./file
4c80: 32 22 2c 20 4f 5f 52 44 57 52 7c 4f 5f 43 52 45  2", O_RDWR|O_CRE
4c90: 41 54 2c 20 30 36 34 34 29 3b 0a 2a 2a 0a 2a 2a  AT, 0644);.**.**
4ca0: 20 53 75 70 70 6f 73 65 20 2e 2f 66 69 6c 65 31   Suppose ./file1
4cb0: 20 61 6e 64 20 2e 2f 66 69 6c 65 32 20 61 72 65   and ./file2 are
4cc0: 20 72 65 61 6c 6c 79 20 74 68 65 20 73 61 6d 65   really the same
4cd0: 20 66 69 6c 65 20 28 62 65 63 61 75 73 65 0a 2a   file (because.*
4ce0: 2a 20 6f 6e 65 20 69 73 20 61 20 68 61 72 64 20  * one is a hard 
4cf0: 6f 72 20 73 79 6d 62 6f 6c 69 63 20 6c 69 6e 6b  or symbolic link
4d00: 20 74 6f 20 74 68 65 20 6f 74 68 65 72 29 20 74   to the other) t
4d10: 68 65 6e 20 69 66 20 79 6f 75 20 73 65 74 0a 2a  hen if you set.*
4d20: 2a 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c  * an exclusive l
4d30: 6f 63 6b 20 6f 6e 20 66 64 31 2c 20 74 68 65 6e  ock on fd1, then
4d40: 20 74 72 79 20 74 6f 20 67 65 74 20 61 6e 20 65   try to get an e
4d50: 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 0a 2a 2a  xclusive lock.**
4d60: 20 6f 6e 20 66 64 32 2c 20 69 74 20 77 6f 72 6b   on fd2, it work
4d70: 73 2e 20 20 49 20 77 6f 75 6c 64 20 68 61 76 65  s.  I would have
4d80: 20 65 78 70 65 63 74 65 64 20 74 68 65 20 73 65   expected the se
4d90: 63 6f 6e 64 20 6c 6f 63 6b 20 74 6f 0a 2a 2a 20  cond lock to.** 
4da0: 66 61 69 6c 20 73 69 6e 63 65 20 74 68 65 72 65  fail since there
4db0: 20 77 61 73 20 61 6c 72 65 61 64 79 20 61 20 6c   was already a l
4dc0: 6f 63 6b 20 6f 6e 20 74 68 65 20 66 69 6c 65 20  ock on the file 
4dd0: 64 75 65 20 74 6f 20 66 64 31 2e 0a 2a 2a 20 42  due to fd1..** B
4de0: 75 74 20 6e 6f 74 20 73 6f 2e 20 20 53 69 6e 63  ut not so.  Sinc
4df0: 65 20 62 6f 74 68 20 6c 6f 63 6b 73 20 63 61 6d  e both locks cam
4e00: 65 20 66 72 6f 6d 20 74 68 65 20 73 61 6d 65 20  e from the same 
4e10: 70 72 6f 63 65 73 73 2c 20 74 68 65 0a 2a 2a 20  process, the.** 
4e20: 73 65 63 6f 6e 64 20 6f 76 65 72 72 69 64 65 73  second overrides
4e30: 20 74 68 65 20 66 69 72 73 74 2c 20 65 76 65 6e   the first, even
4e40: 20 74 68 6f 75 67 68 20 74 68 65 79 20 77 65 72   though they wer
4e50: 65 20 6f 6e 20 64 69 66 66 65 72 65 6e 74 0a 2a  e on different.*
4e60: 2a 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  * file descripto
4e70: 72 73 20 6f 70 65 6e 65 64 20 6f 6e 20 64 69 66  rs opened on dif
4e80: 66 65 72 65 6e 74 20 66 69 6c 65 20 6e 61 6d 65  ferent file name
4e90: 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 6d 65  s..**.** This me
4ea0: 61 6e 73 20 74 68 61 74 20 77 65 20 63 61 6e 6e  ans that we cann
4eb0: 6f 74 20 75 73 65 20 50 4f 53 49 58 20 6c 6f 63  ot use POSIX loc
4ec0: 6b 73 20 74 6f 20 73 79 6e 63 68 72 6f 6e 69 7a  ks to synchroniz
4ed0: 65 20 66 69 6c 65 20 61 63 63 65 73 73 0a 2a 2a  e file access.**
4ee0: 20 61 6d 6f 6e 67 20 63 6f 6d 70 65 74 69 6e 67   among competing
4ef0: 20 74 68 72 65 61 64 73 20 6f 66 20 74 68 65 20   threads of the 
4f00: 73 61 6d 65 20 70 72 6f 63 65 73 73 2e 20 20 50  same process.  P
4f10: 4f 53 49 58 20 6c 6f 63 6b 73 20 77 69 6c 6c 20  OSIX locks will 
4f20: 77 6f 72 6b 20 66 69 6e 65 0a 2a 2a 20 74 6f 20  work fine.** to 
4f30: 73 79 6e 63 68 72 6f 6e 69 7a 65 20 61 63 63 65  synchronize acce
4f40: 73 73 20 66 6f 72 20 74 68 72 65 61 64 73 20 69  ss for threads i
4f50: 6e 20 73 65 70 61 72 61 74 65 20 70 72 6f 63 65  n separate proce
4f60: 73 73 65 73 2c 20 62 75 74 20 6e 6f 74 0a 2a 2a  sses, but not.**
4f70: 20 74 68 72 65 61 64 73 20 77 69 74 68 69 6e 20   threads within 
4f80: 74 68 65 20 73 61 6d 65 20 70 72 6f 63 65 73 73  the same process
4f90: 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20 77 6f 72 6b 20  ..**.** To work 
4fa0: 61 72 6f 75 6e 64 20 74 68 65 20 70 72 6f 62 6c  around the probl
4fb0: 65 6d 2c 20 53 51 4c 69 74 65 20 68 61 73 20 74  em, SQLite has t
4fc0: 6f 20 6d 61 6e 61 67 65 20 66 69 6c 65 20 6c 6f  o manage file lo
4fd0: 63 6b 73 20 69 6e 74 65 72 6e 61 6c 6c 79 0a 2a  cks internally.*
4fe0: 2a 20 6f 6e 20 69 74 73 20 6f 77 6e 2e 20 20 57  * on its own.  W
4ff0: 68 65 6e 65 76 65 72 20 61 20 6e 65 77 20 64 61  henever a new da
5000: 74 61 62 61 73 65 20 69 73 20 6f 70 65 6e 65 64  tabase is opened
5010: 2c 20 77 65 20 68 61 76 65 20 74 6f 20 66 69 6e  , we have to fin
5020: 64 20 74 68 65 0a 2a 2a 20 73 70 65 63 69 66 69  d the.** specifi
5030: 63 20 69 6e 6f 64 65 20 6f 66 20 74 68 65 20 64  c inode of the d
5040: 61 74 61 62 61 73 65 20 66 69 6c 65 20 28 74 68  atabase file (th
5050: 65 20 69 6e 6f 64 65 20 69 73 20 64 65 74 65 72  e inode is deter
5060: 6d 69 6e 65 64 20 62 79 20 74 68 65 0a 2a 2a 20  mined by the.** 
5070: 73 74 5f 64 65 76 20 61 6e 64 20 73 74 5f 69 6e  st_dev and st_in
5080: 6f 20 66 69 65 6c 64 73 20 6f 66 20 74 68 65 20  o fields of the 
5090: 73 74 61 74 20 73 74 72 75 63 74 75 72 65 20 74  stat structure t
50a0: 68 61 74 20 66 73 74 61 74 28 29 20 66 69 6c 6c  hat fstat() fill
50b0: 73 20 69 6e 29 0a 2a 2a 20 61 6e 64 20 63 68 65  s in).** and che
50c0: 63 6b 20 66 6f 72 20 6c 6f 63 6b 73 20 61 6c 72  ck for locks alr
50d0: 65 61 64 79 20 65 78 69 73 74 69 6e 67 20 6f 6e  eady existing on
50e0: 20 74 68 61 74 20 69 6e 6f 64 65 2e 20 20 57 68   that inode.  Wh
50f0: 65 6e 20 6c 6f 63 6b 73 20 61 72 65 0a 2a 2a 20  en locks are.** 
5100: 63 72 65 61 74 65 64 20 6f 72 20 72 65 6d 6f 76  created or remov
5110: 65 64 2c 20 77 65 20 68 61 76 65 20 74 6f 20 6c  ed, we have to l
5120: 6f 6f 6b 20 61 74 20 6f 75 72 20 6f 77 6e 20 69  ook at our own i
5130: 6e 74 65 72 6e 61 6c 20 72 65 63 6f 72 64 20 6f  nternal record o
5140: 66 20 74 68 65 0a 2a 2a 20 6c 6f 63 6b 73 20 74  f the.** locks t
5150: 6f 20 73 65 65 20 69 66 20 61 6e 6f 74 68 65 72  o see if another
5160: 20 74 68 72 65 61 64 20 68 61 73 20 70 72 65 76   thread has prev
5170: 69 6f 75 73 6c 79 20 73 65 74 20 61 20 6c 6f 63  iously set a loc
5180: 6b 20 6f 6e 20 74 68 61 74 20 73 61 6d 65 0a 2a  k on that same.*
5190: 2a 20 69 6e 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 28  * inode..**.** (
51a0: 41 73 69 64 65 3a 20 54 68 65 20 75 73 65 20 6f  Aside: The use o
51b0: 66 20 69 6e 6f 64 65 20 6e 75 6d 62 65 72 73 20  f inode numbers 
51c0: 61 73 20 75 6e 69 71 75 65 20 49 44 73 20 64 6f  as unique IDs do
51d0: 65 73 20 6e 6f 74 20 77 6f 72 6b 20 6f 6e 20 56  es not work on V
51e0: 78 57 6f 72 6b 73 2e 0a 2a 2a 20 46 6f 72 20 56  xWorks..** For V
51f0: 78 57 6f 72 6b 73 2c 20 77 65 20 68 61 76 65 20  xWorks, we have 
5200: 74 6f 20 75 73 65 20 74 68 65 20 61 6c 74 65 72  to use the alter
5210: 6e 61 74 69 76 65 20 75 6e 69 71 75 65 20 49 44  native unique ID
5220: 20 73 79 73 74 65 6d 20 62 61 73 65 64 20 6f 6e   system based on
5230: 0a 2a 2a 20 63 61 6e 6f 6e 69 63 61 6c 20 66 69  .** canonical fi
5240: 6c 65 6e 61 6d 65 20 61 6e 64 20 69 6d 70 6c 65  lename and imple
5250: 6d 65 6e 74 65 64 20 69 6e 20 74 68 65 20 70 72  mented in the pr
5260: 65 76 69 6f 75 73 20 64 69 76 69 73 69 6f 6e 2e  evious division.
5270: 29 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 71 6c 69  ).**.** The sqli
5280: 74 65 33 5f 66 69 6c 65 20 73 74 72 75 63 74 75  te3_file structu
5290: 72 65 20 66 6f 72 20 50 4f 53 49 58 20 69 73 20  re for POSIX is 
52a0: 6e 6f 20 6c 6f 6e 67 65 72 20 6a 75 73 74 20 61  no longer just a
52b0: 6e 20 69 6e 74 65 67 65 72 20 66 69 6c 65 0a 2a  n integer file.*
52c0: 2a 20 64 65 73 63 72 69 70 74 6f 72 2e 20 20 49  * descriptor.  I
52d0: 74 20 69 73 20 6e 6f 77 20 61 20 73 74 72 75 63  t is now a struc
52e0: 74 75 72 65 20 74 68 61 74 20 68 6f 6c 64 73 20  ture that holds 
52f0: 74 68 65 20 69 6e 74 65 67 65 72 20 66 69 6c 65  the integer file
5300: 0a 2a 2a 20 64 65 73 63 72 69 70 74 6f 72 20 61  .** descriptor a
5310: 6e 64 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  nd a pointer to 
5320: 61 20 73 74 72 75 63 74 75 72 65 20 74 68 61 74  a structure that
5330: 20 64 65 73 63 72 69 62 65 73 20 74 68 65 20 69   describes the i
5340: 6e 74 65 72 6e 61 6c 0a 2a 2a 20 6c 6f 63 6b 73  nternal.** locks
5350: 20 6f 6e 20 74 68 65 20 63 6f 72 72 65 73 70 6f   on the correspo
5360: 6e 64 69 6e 67 20 69 6e 6f 64 65 2e 20 20 54 68  nding inode.  Th
5370: 65 72 65 20 69 73 20 6f 6e 65 20 6c 6f 63 6b 69  ere is one locki
5380: 6e 67 20 73 74 72 75 63 74 75 72 65 0a 2a 2a 20  ng structure.** 
5390: 70 65 72 20 69 6e 6f 64 65 2c 20 73 6f 20 69 66  per inode, so if
53a0: 20 74 68 65 20 73 61 6d 65 20 69 6e 6f 64 65 20   the same inode 
53b0: 69 73 20 6f 70 65 6e 65 64 20 74 77 69 63 65 2c  is opened twice,
53c0: 20 62 6f 74 68 20 75 6e 69 78 46 69 6c 65 20 73   both unixFile s
53d0: 74 72 75 63 74 75 72 65 73 0a 2a 2a 20 70 6f 69  tructures.** poi
53e0: 6e 74 20 74 6f 20 74 68 65 20 73 61 6d 65 20 6c  nt to the same l
53f0: 6f 63 6b 69 6e 67 20 73 74 72 75 63 74 75 72 65  ocking structure
5400: 2e 20 20 54 68 65 20 6c 6f 63 6b 69 6e 67 20 73  .  The locking s
5410: 74 72 75 63 74 75 72 65 20 6b 65 65 70 73 0a 2a  tructure keeps.*
5420: 2a 20 61 20 72 65 66 65 72 65 6e 63 65 20 63 6f  * a reference co
5430: 75 6e 74 20 28 73 6f 20 77 65 20 77 69 6c 6c 20  unt (so we will 
5440: 6b 6e 6f 77 20 77 68 65 6e 20 74 6f 20 64 65 6c  know when to del
5450: 65 74 65 20 69 74 29 20 61 6e 64 20 61 20 22 63  ete it) and a "c
5460: 6e 74 22 0a 2a 2a 20 66 69 65 6c 64 20 74 68 61  nt".** field tha
5470: 74 20 74 65 6c 6c 73 20 75 73 20 69 74 73 20 69  t tells us its i
5480: 6e 74 65 72 6e 61 6c 20 6c 6f 63 6b 20 73 74 61  nternal lock sta
5490: 74 75 73 2e 20 20 63 6e 74 3d 3d 30 20 6d 65 61  tus.  cnt==0 mea
54a0: 6e 73 20 74 68 65 0a 2a 2a 20 66 69 6c 65 20 69  ns the.** file i
54b0: 73 20 75 6e 6c 6f 63 6b 65 64 2e 20 20 63 6e 74  s unlocked.  cnt
54c0: 3d 3d 2d 31 20 6d 65 61 6e 73 20 74 68 65 20 66  ==-1 means the f
54d0: 69 6c 65 20 68 61 73 20 61 6e 20 65 78 63 6c 75  ile has an exclu
54e0: 73 69 76 65 20 6c 6f 63 6b 2e 0a 2a 2a 20 63 6e  sive lock..** cn
54f0: 74 3e 30 20 6d 65 61 6e 73 20 74 68 65 72 65 20  t>0 means there 
5500: 61 72 65 20 63 6e 74 20 73 68 61 72 65 64 20 6c  are cnt shared l
5510: 6f 63 6b 73 20 6f 6e 20 74 68 65 20 66 69 6c 65  ocks on the file
5520: 2e 0a 2a 2a 0a 2a 2a 20 41 6e 79 20 61 74 74 65  ..**.** Any atte
5530: 6d 70 74 20 74 6f 20 6c 6f 63 6b 20 6f 72 20 75  mpt to lock or u
5540: 6e 6c 6f 63 6b 20 61 20 66 69 6c 65 20 66 69 72  nlock a file fir
5550: 73 74 20 63 68 65 63 6b 73 20 74 68 65 20 6c 6f  st checks the lo
5560: 63 6b 69 6e 67 0a 2a 2a 20 73 74 72 75 63 74 75  cking.** structu
5570: 72 65 2e 20 20 54 68 65 20 66 63 6e 74 6c 28 29  re.  The fcntl()
5580: 20 73 79 73 74 65 6d 20 63 61 6c 6c 20 69 73 20   system call is 
5590: 6f 6e 6c 79 20 69 6e 76 6f 6b 65 64 20 74 6f 20  only invoked to 
55a0: 73 65 74 20 61 20 0a 2a 2a 20 50 4f 53 49 58 20  set a .** POSIX 
55b0: 6c 6f 63 6b 20 69 66 20 74 68 65 20 69 6e 74 65  lock if the inte
55c0: 72 6e 61 6c 20 6c 6f 63 6b 20 73 74 72 75 63 74  rnal lock struct
55d0: 75 72 65 20 74 72 61 6e 73 69 74 69 6f 6e 73 20  ure transitions 
55e0: 62 65 74 77 65 65 6e 0a 2a 2a 20 61 20 6c 6f 63  between.** a loc
55f0: 6b 65 64 20 61 6e 64 20 61 6e 20 75 6e 6c 6f 63  ked and an unloc
5600: 6b 65 64 20 73 74 61 74 65 2e 0a 2a 2a 0a 2a 2a  ked state..**.**
5610: 20 42 75 74 20 77 61 69 74 3a 20 20 74 68 65 72   But wait:  ther
5620: 65 20 61 72 65 20 79 65 74 20 6d 6f 72 65 20 70  e are yet more p
5630: 72 6f 62 6c 65 6d 73 20 77 69 74 68 20 50 4f 53  roblems with POS
5640: 49 58 20 61 64 76 69 73 6f 72 79 20 6c 6f 63 6b  IX advisory lock
5650: 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 79 6f 75 20  s..**.** If you 
5660: 63 6c 6f 73 65 20 61 20 66 69 6c 65 20 64 65 73  close a file des
5670: 63 72 69 70 74 6f 72 20 74 68 61 74 20 70 6f 69  criptor that poi
5680: 6e 74 73 20 74 6f 20 61 20 66 69 6c 65 20 74 68  nts to a file th
5690: 61 74 20 68 61 73 20 6c 6f 63 6b 73 2c 0a 2a 2a  at has locks,.**
56a0: 20 61 6c 6c 20 6c 6f 63 6b 73 20 6f 6e 20 74 68   all locks on th
56b0: 61 74 20 66 69 6c 65 20 74 68 61 74 20 61 72 65  at file that are
56c0: 20 6f 77 6e 65 64 20 62 79 20 74 68 65 20 63 75   owned by the cu
56d0: 72 72 65 6e 74 20 70 72 6f 63 65 73 73 20 61 72  rrent process ar
56e0: 65 0a 2a 2a 20 72 65 6c 65 61 73 65 64 2e 20 20  e.** released.  
56f0: 54 6f 20 77 6f 72 6b 20 61 72 6f 75 6e 64 20 74  To work around t
5700: 68 69 73 20 70 72 6f 62 6c 65 6d 2c 20 65 61 63  his problem, eac
5710: 68 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20  h unixInodeInfo 
5720: 6f 62 6a 65 63 74 0a 2a 2a 20 6d 61 69 6e 74 61  object.** mainta
5730: 69 6e 73 20 61 20 63 6f 75 6e 74 20 6f 66 20 74  ins a count of t
5740: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 65 6e  he number of pen
5750: 64 69 6e 67 20 6c 6f 63 6b 73 20 6f 6e 20 74 68  ding locks on th
5760: 61 20 69 6e 6f 64 65 2e 0a 2a 2a 20 57 68 65 6e  a inode..** When
5770: 20 61 6e 20 61 74 74 65 6d 70 74 20 69 73 20 6d   an attempt is m
5780: 61 64 65 20 74 6f 20 63 6c 6f 73 65 20 61 6e 20  ade to close an 
5790: 75 6e 69 78 46 69 6c 65 2c 20 69 66 20 74 68 65  unixFile, if the
57a0: 72 65 20 61 72 65 0a 2a 2a 20 6f 74 68 65 72 20  re are.** other 
57b0: 75 6e 69 78 46 69 6c 65 20 6f 70 65 6e 20 6f 6e  unixFile open on
57c0: 20 74 68 65 20 73 61 6d 65 20 69 6e 6f 64 65 20   the same inode 
57d0: 74 68 61 74 20 61 72 65 20 68 6f 6c 64 69 6e 67  that are holding
57e0: 20 6c 6f 63 6b 73 2c 20 74 68 65 20 63 61 6c 6c   locks, the call
57f0: 0a 2a 2a 20 74 6f 20 63 6c 6f 73 65 28 29 20 74  .** to close() t
5800: 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  he file descript
5810: 6f 72 20 69 73 20 64 65 66 65 72 72 65 64 20 75  or is deferred u
5820: 6e 74 69 6c 20 61 6c 6c 20 6f 66 20 74 68 65 20  ntil all of the 
5830: 6c 6f 63 6b 73 20 63 6c 65 61 72 2e 0a 2a 2a 20  locks clear..** 
5840: 54 68 65 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66  The unixInodeInf
5850: 6f 20 73 74 72 75 63 74 75 72 65 20 6b 65 65 70  o structure keep
5860: 73 20 61 20 6c 69 73 74 20 6f 66 20 66 69 6c 65  s a list of file
5870: 20 64 65 73 63 72 69 70 74 6f 72 73 20 74 68 61   descriptors tha
5880: 74 20 6e 65 65 64 20 74 6f 0a 2a 2a 20 62 65 20  t need to.** be 
5890: 63 6c 6f 73 65 64 20 61 6e 64 20 74 68 61 74 20  closed and that 
58a0: 6c 69 73 74 20 69 73 20 77 61 6c 6b 65 64 20 28  list is walked (
58b0: 61 6e 64 20 63 6c 65 61 72 65 64 29 20 77 68 65  and cleared) whe
58c0: 6e 20 74 68 65 20 6c 61 73 74 20 6c 6f 63 6b 0a  n the last lock.
58d0: 2a 2a 20 63 6c 65 61 72 73 2e 0a 2a 2a 0a 2a 2a  ** clears..**.**
58e0: 20 59 65 74 20 61 6e 6f 74 68 65 72 20 70 72 6f   Yet another pro
58f0: 62 6c 65 6d 3a 20 20 4c 69 6e 75 78 54 68 72 65  blem:  LinuxThre
5900: 61 64 73 20 64 6f 20 6e 6f 74 20 70 6c 61 79 20  ads do not play 
5910: 77 65 6c 6c 20 77 69 74 68 20 70 6f 73 69 78 20  well with posix 
5920: 6c 6f 63 6b 73 2e 0a 2a 2a 0a 2a 2a 20 4d 61 6e  locks..**.** Man
5930: 79 20 6f 6c 64 65 72 20 76 65 72 73 69 6f 6e 73  y older versions
5940: 20 6f 66 20 6c 69 6e 75 78 20 75 73 65 20 74 68   of linux use th
5950: 65 20 4c 69 6e 75 78 54 68 72 65 61 64 73 20 6c  e LinuxThreads l
5960: 69 62 72 61 72 79 20 77 68 69 63 68 20 69 73 0a  ibrary which is.
5970: 2a 2a 20 6e 6f 74 20 70 6f 73 69 78 20 63 6f 6d  ** not posix com
5980: 70 6c 69 61 6e 74 2e 20 20 55 6e 64 65 72 20 4c  pliant.  Under L
5990: 69 6e 75 78 54 68 72 65 61 64 73 2c 20 61 20 6c  inuxThreads, a l
59a0: 6f 63 6b 20 63 72 65 61 74 65 64 20 62 79 20 74  ock created by t
59b0: 68 72 65 61 64 0a 2a 2a 20 41 20 63 61 6e 6e 6f  hread.** A canno
59c0: 74 20 62 65 20 6d 6f 64 69 66 69 65 64 20 6f 72  t be modified or
59d0: 20 6f 76 65 72 72 69 64 64 65 6e 20 62 79 20 61   overridden by a
59e0: 20 64 69 66 66 65 72 65 6e 74 20 74 68 72 65 61   different threa
59f0: 64 20 42 2e 0a 2a 2a 20 4f 6e 6c 79 20 74 68 72  d B..** Only thr
5a00: 65 61 64 20 41 20 63 61 6e 20 6d 6f 64 69 66 79  ead A can modify
5a10: 20 74 68 65 20 6c 6f 63 6b 2e 20 20 4c 6f 63 6b   the lock.  Lock
5a20: 69 6e 67 20 62 65 68 61 76 69 6f 72 20 69 73 20  ing behavior is 
5a30: 63 6f 72 72 65 63 74 0a 2a 2a 20 69 66 20 74 68  correct.** if th
5a40: 65 20 61 70 70 6c 69 61 74 69 6f 6e 20 75 73 65  e appliation use
5a50: 73 20 74 68 65 20 6e 65 77 65 72 20 4e 61 74 69  s the newer Nati
5a60: 76 65 20 50 6f 73 69 78 20 54 68 72 65 61 64 20  ve Posix Thread 
5a70: 4c 69 62 72 61 72 79 20 28 4e 50 54 4c 29 0a 2a  Library (NPTL).*
5a80: 2a 20 6f 6e 20 6c 69 6e 75 78 20 2d 20 77 69 74  * on linux - wit
5a90: 68 20 4e 50 54 4c 20 61 20 6c 6f 63 6b 20 63 72  h NPTL a lock cr
5aa0: 65 61 74 65 64 20 62 79 20 74 68 72 65 61 64 20  eated by thread 
5ab0: 41 20 63 61 6e 20 6f 76 65 72 72 69 64 65 20 6c  A can override l
5ac0: 6f 63 6b 73 0a 2a 2a 20 69 6e 20 74 68 72 65 61  ocks.** in threa
5ad0: 64 20 42 2e 20 20 42 75 74 20 74 68 65 72 65 20  d B.  But there 
5ae0: 69 73 20 6e 6f 20 77 61 79 20 74 6f 20 6b 6e 6f  is no way to kno
5af0: 77 20 61 74 20 63 6f 6d 70 69 6c 65 2d 74 69 6d  w at compile-tim
5b00: 65 20 77 68 69 63 68 0a 2a 2a 20 74 68 72 65 61  e which.** threa
5b10: 64 69 6e 67 20 6c 69 62 72 61 72 79 20 69 73 20  ding library is 
5b20: 62 65 69 6e 67 20 75 73 65 64 2e 20 20 53 6f 20  being used.  So 
5b30: 74 68 65 72 65 20 69 73 20 6e 6f 20 77 61 79 20  there is no way 
5b40: 74 6f 20 6b 6e 6f 77 20 61 74 0a 2a 2a 20 63 6f  to know at.** co
5b50: 6d 70 69 6c 65 2d 74 69 6d 65 20 77 68 65 74 68  mpile-time wheth
5b60: 65 72 20 6f 72 20 6e 6f 74 20 74 68 72 65 61 64  er or not thread
5b70: 20 41 20 63 61 6e 20 6f 76 65 72 72 69 64 65 20   A can override 
5b80: 6c 6f 63 6b 73 20 6f 6e 20 74 68 72 65 61 64 20  locks on thread 
5b90: 42 2e 0a 2a 2a 20 4f 6e 65 20 68 61 73 20 74 6f  B..** One has to
5ba0: 20 64 6f 20 61 20 72 75 6e 2d 74 69 6d 65 20 63   do a run-time c
5bb0: 68 65 63 6b 20 74 6f 20 64 69 73 63 6f 76 65 72  heck to discover
5bc0: 20 74 68 65 20 62 65 68 61 76 69 6f 72 20 6f 66   the behavior of
5bd0: 20 74 68 65 0a 2a 2a 20 63 75 72 72 65 6e 74 20   the.** current 
5be0: 70 72 6f 63 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 53  process..**.** S
5bf0: 51 4c 69 74 65 20 75 73 65 64 20 74 6f 20 73 75  QLite used to su
5c00: 70 70 6f 72 74 20 4c 69 6e 75 78 54 68 72 65 61  pport LinuxThrea
5c10: 64 73 2e 20 20 42 75 74 20 73 75 70 70 6f 72 74  ds.  But support
5c20: 20 66 6f 72 20 4c 69 6e 75 78 54 68 72 65 61 64   for LinuxThread
5c30: 73 0a 2a 2a 20 77 61 73 20 64 72 6f 70 70 65 64  s.** was dropped
5c40: 20 62 65 67 69 6e 6e 69 6e 67 20 77 69 74 68 20   beginning with 
5c50: 76 65 72 73 69 6f 6e 20 33 2e 37 2e 30 2e 20 20  version 3.7.0.  
5c60: 53 51 4c 69 74 65 20 77 69 6c 6c 20 73 74 69 6c  SQLite will stil
5c70: 6c 20 77 6f 72 6b 20 77 69 74 68 0a 2a 2a 20 4c  l work with.** L
5c80: 69 6e 75 78 54 68 72 65 61 64 73 20 70 72 6f 76  inuxThreads prov
5c90: 69 64 65 64 20 74 68 61 74 20 28 31 29 20 74 68  ided that (1) th
5ca0: 65 72 65 20 69 73 20 6e 6f 20 6d 6f 72 65 20 74  ere is no more t
5cb0: 68 61 6e 20 6f 6e 65 20 63 6f 6e 6e 65 63 74 69  han one connecti
5cc0: 6f 6e 20 0a 2a 2a 20 70 65 72 20 64 61 74 61 62  on .** per datab
5cd0: 61 73 65 20 66 69 6c 65 20 69 6e 20 74 68 65 20  ase file in the 
5ce0: 73 61 6d 65 20 70 72 6f 63 65 73 73 20 61 6e 64  same process and
5cf0: 20 28 32 29 20 64 61 74 61 62 61 73 65 20 63 6f   (2) database co
5d00: 6e 6e 65 63 74 69 6f 6e 73 0a 2a 2a 20 64 6f 20  nnections.** do 
5d10: 6e 6f 74 20 6d 6f 76 65 20 61 63 72 6f 73 73 20  not move across 
5d20: 74 68 72 65 61 64 73 2e 0a 2a 2f 0a 0a 2f 2a 0a  threads..*/../*.
5d30: 2a 2a 20 41 6e 20 69 6e 73 74 61 6e 63 65 20 6f  ** An instance o
5d40: 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  f the following 
5d50: 73 74 72 75 63 74 75 72 65 20 73 65 72 76 65 73  structure serves
5d60: 20 61 73 20 74 68 65 20 6b 65 79 20 75 73 65 64   as the key used
5d70: 0a 2a 2a 20 74 6f 20 6c 6f 63 61 74 65 20 61 20  .** to locate a 
5d80: 70 61 72 74 69 63 75 6c 61 72 20 75 6e 69 78 49  particular unixI
5d90: 6e 6f 64 65 49 6e 66 6f 20 6f 62 6a 65 63 74 2e  nodeInfo object.
5da0: 0a 2a 2f 0a 73 74 72 75 63 74 20 75 6e 69 78 46  .*/.struct unixF
5db0: 69 6c 65 49 64 20 7b 0a 20 20 64 65 76 5f 74 20  ileId {.  dev_t 
5dc0: 64 65 76 3b 20 20 20 20 20 20 20 20 20 20 20 20  dev;            
5dd0: 20 20 20 20 20 20 2f 2a 20 44 65 76 69 63 65 20        /* Device 
5de0: 6e 75 6d 62 65 72 20 2a 2f 0a 23 69 66 20 4f 53  number */.#if OS
5df0: 5f 56 58 57 4f 52 4b 53 0a 20 20 73 74 72 75 63  _VXWORKS.  struc
5e00: 74 20 76 78 77 6f 72 6b 73 46 69 6c 65 49 64 20  t vxworksFileId 
5e10: 2a 70 49 64 3b 20 20 2f 2a 20 55 6e 69 71 75 65  *pId;  /* Unique
5e20: 20 66 69 6c 65 20 49 44 20 66 6f 72 20 76 78 77   file ID for vxw
5e30: 6f 72 6b 73 2e 20 2a 2f 0a 23 65 6c 73 65 0a 20  orks. */.#else. 
5e40: 20 69 6e 6f 5f 74 20 69 6e 6f 3b 20 20 20 20 20   ino_t ino;     
5e50: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
5e60: 49 6e 6f 64 65 20 6e 75 6d 62 65 72 20 2a 2f 0a  Inode number */.
5e70: 23 65 6e 64 69 66 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a  #endif.};../*.**
5e80: 20 41 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20   An instance of 
5e90: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74  the following st
5ea0: 72 75 63 74 75 72 65 20 69 73 20 61 6c 6c 6f 63  ructure is alloc
5eb0: 61 74 65 64 20 66 6f 72 20 65 61 63 68 20 6f 70  ated for each op
5ec0: 65 6e 0a 2a 2a 20 69 6e 6f 64 65 2e 20 20 4f 72  en.** inode.  Or
5ed0: 2c 20 6f 6e 20 4c 69 6e 75 78 54 68 72 65 61 64  , on LinuxThread
5ee0: 73 2c 20 74 68 65 72 65 20 69 73 20 6f 6e 65 20  s, there is one 
5ef0: 6f 66 20 74 68 65 73 65 20 73 74 72 75 63 74 75  of these structu
5f00: 72 65 73 20 66 6f 72 0a 2a 2a 20 65 61 63 68 20  res for.** each 
5f10: 69 6e 6f 64 65 20 6f 70 65 6e 65 64 20 62 79 20  inode opened by 
5f20: 65 61 63 68 20 74 68 72 65 61 64 2e 0a 2a 2a 0a  each thread..**.
5f30: 2a 2a 20 41 20 73 69 6e 67 6c 65 20 69 6e 6f 64  ** A single inod
5f40: 65 20 63 61 6e 20 68 61 76 65 20 6d 75 6c 74 69  e can have multi
5f50: 70 6c 65 20 66 69 6c 65 20 64 65 73 63 72 69 70  ple file descrip
5f60: 74 6f 72 73 2c 20 73 6f 20 65 61 63 68 20 75 6e  tors, so each un
5f70: 69 78 46 69 6c 65 0a 2a 2a 20 73 74 72 75 63 74  ixFile.** struct
5f80: 75 72 65 20 63 6f 6e 74 61 69 6e 73 20 61 20 70  ure contains a p
5f90: 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20 69 6e 73  ointer to an ins
5fa0: 74 61 6e 63 65 20 6f 66 20 74 68 69 73 20 6f 62  tance of this ob
5fb0: 6a 65 63 74 20 61 6e 64 20 74 68 69 73 0a 2a 2a  ject and this.**
5fc0: 20 6f 62 6a 65 63 74 20 6b 65 65 70 73 20 61 20   object keeps a 
5fd0: 63 6f 75 6e 74 20 6f 66 20 74 68 65 20 6e 75 6d  count of the num
5fe0: 62 65 72 20 6f 66 20 75 6e 69 78 46 69 6c 65 20  ber of unixFile 
5ff0: 70 6f 69 6e 74 69 6e 67 20 74 6f 20 69 74 2e 0a  pointing to it..
6000: 2a 2f 0a 73 74 72 75 63 74 20 75 6e 69 78 49 6e  */.struct unixIn
6010: 6f 64 65 49 6e 66 6f 20 7b 0a 20 20 73 74 72 75  odeInfo {.  stru
6020: 63 74 20 75 6e 69 78 46 69 6c 65 49 64 20 66 69  ct unixFileId fi
6030: 6c 65 49 64 3b 20 20 20 20 20 20 20 2f 2a 20 54  leId;       /* T
6040: 68 65 20 6c 6f 6f 6b 75 70 20 6b 65 79 20 2a 2f  he lookup key */
6050: 0a 20 20 69 6e 74 20 6e 53 68 61 72 65 64 3b 20  .  int nShared; 
6060: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6070: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
6080: 53 48 41 52 45 44 20 6c 6f 63 6b 73 20 68 65 6c  SHARED locks hel
6090: 64 20 2a 2f 0a 20 20 69 6e 74 20 65 46 69 6c 65  d */.  int eFile
60a0: 4c 6f 63 6b 3b 20 20 20 20 20 20 20 20 20 20 20  Lock;           
60b0: 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66         /* One of
60c0: 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2c 20 52 45   SHARED_LOCK, RE
60d0: 53 45 52 56 45 44 5f 4c 4f 43 4b 20 65 74 63 2e  SERVED_LOCK etc.
60e0: 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 66 3b 20   */.  int nRef; 
60f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6100: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
6110: 6f 66 20 70 6f 69 6e 74 65 72 73 20 74 6f 20 74  of pointers to t
6120: 68 69 73 20 73 74 72 75 63 74 75 72 65 20 2a 2f  his structure */
6130: 0a 20 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20 2a  .  unixShmNode *
6140: 70 53 68 6d 4e 6f 64 65 3b 20 20 20 20 20 20 20  pShmNode;       
6150: 20 20 20 2f 2a 20 53 68 61 72 65 64 20 6d 65 6d     /* Shared mem
6160: 6f 72 79 20 61 73 73 6f 63 69 61 74 65 64 20 77  ory associated w
6170: 69 74 68 20 74 68 69 73 20 69 6e 6f 64 65 20 2a  ith this inode *
6180: 2f 0a 20 20 69 6e 74 20 6e 4c 6f 63 6b 3b 20 20  /.  int nLock;  
6190: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
61a0: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
61b0: 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 66 69 6c   outstanding fil
61c0: 65 20 6c 6f 63 6b 73 20 2a 2f 0a 20 20 55 6e 69  e locks */.  Uni
61d0: 78 55 6e 75 73 65 64 46 64 20 2a 70 55 6e 75 73  xUnusedFd *pUnus
61e0: 65 64 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ed;          /* 
61f0: 55 6e 75 73 65 64 20 66 69 6c 65 20 64 65 73 63  Unused file desc
6200: 72 69 70 74 6f 72 73 20 74 6f 20 63 6c 6f 73 65  riptors to close
6210: 20 2a 2f 0a 20 20 75 6e 69 78 49 6e 6f 64 65 49   */.  unixInodeI
6220: 6e 66 6f 20 2a 70 4e 65 78 74 3b 20 20 20 20 20  nfo *pNext;     
6230: 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66        /* List of
6240: 20 61 6c 6c 20 75 6e 69 78 49 6e 6f 64 65 49 6e   all unixInodeIn
6250: 66 6f 20 6f 62 6a 65 63 74 73 20 2a 2f 0a 20 20  fo objects */.  
6260: 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 2a 70  unixInodeInfo *p
6270: 50 72 65 76 3b 20 20 20 20 20 20 20 20 20 20 20  Prev;           
6280: 2f 2a 20 20 20 20 2e 2e 2e 2e 20 64 6f 75 62 6c  /*    .... doubl
6290: 79 20 6c 69 6e 6b 65 64 20 2a 2f 0a 23 69 66 20  y linked */.#if 
62a0: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45  defined(SQLITE_E
62b0: 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54  NABLE_LOCKING_ST
62c0: 59 4c 45 29 0a 20 20 75 6e 73 69 67 6e 65 64 20  YLE).  unsigned 
62d0: 6c 6f 6e 67 20 6c 6f 6e 67 20 73 68 61 72 65 64  long long shared
62e0: 42 79 74 65 3b 20 20 2f 2a 20 66 6f 72 20 41 46  Byte;  /* for AF
62f0: 50 20 73 69 6d 75 6c 61 74 65 64 20 73 68 61 72  P simulated shar
6300: 65 64 20 6c 6f 63 6b 20 2a 2f 0a 23 65 6e 64 69  ed lock */.#endi
6310: 66 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53  f.#if OS_VXWORKS
6320: 0a 20 20 73 65 6d 5f 74 20 2a 70 53 65 6d 3b 20  .  sem_t *pSem; 
6330: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6340: 20 20 20 2f 2a 20 4e 61 6d 65 64 20 50 4f 53 49     /* Named POSI
6350: 58 20 73 65 6d 61 70 68 6f 72 65 20 2a 2f 0a 20  X semaphore */. 
6360: 20 63 68 61 72 20 61 53 65 6d 4e 61 6d 65 5b 4d   char aSemName[M
6370: 41 58 5f 50 41 54 48 4e 41 4d 45 2b 32 5d 3b 20  AX_PATHNAME+2]; 
6380: 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 61 74   /* Name of that
6390: 20 73 65 6d 61 70 68 6f 72 65 20 2a 2f 0a 23 65   semaphore */.#e
63a0: 6e 64 69 66 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41  ndif.};../*.** A
63b0: 20 6c 69 73 74 73 20 6f 66 20 61 6c 6c 20 75 6e   lists of all un
63c0: 69 78 49 6e 6f 64 65 49 6e 66 6f 20 6f 62 6a 65  ixInodeInfo obje
63d0: 63 74 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 75  cts..*/.static u
63e0: 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 2a 69 6e  nixInodeInfo *in
63f0: 6f 64 65 4c 69 73 74 20 3d 20 30 3b 0a 0a 2f 2a  odeList = 0;../*
6400: 0a 2a 2a 20 52 65 6c 65 61 73 65 20 61 20 75 6e  .** Release a un
6410: 69 78 49 6e 6f 64 65 49 6e 66 6f 20 73 74 72 75  ixInodeInfo stru
6420: 63 74 75 72 65 20 70 72 65 76 69 6f 75 73 6c 79  cture previously
6430: 20 61 6c 6c 6f 63 61 74 65 64 20 62 79 20 66 69   allocated by fi
6440: 6e 64 49 6e 6f 64 65 49 6e 66 6f 28 29 2e 0a 2a  ndInodeInfo()..*
6450: 2a 0a 2a 2a 20 54 68 65 20 6d 75 74 65 78 20 65  *.** The mutex e
6460: 6e 74 65 72 65 64 20 75 73 69 6e 67 20 74 68 65  ntered using the
6470: 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28   unixEnterMutex(
6480: 29 20 66 75 6e 63 74 69 6f 6e 20 6d 75 73 74 20  ) function must 
6490: 62 65 20 68 65 6c 64 0a 2a 2a 20 77 68 65 6e 20  be held.** when 
64a0: 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  this function is
64b0: 20 63 61 6c 6c 65 64 2e 0a 2a 2f 0a 73 74 61 74   called..*/.stat
64c0: 69 63 20 76 6f 69 64 20 72 65 6c 65 61 73 65 49  ic void releaseI
64d0: 6e 6f 64 65 49 6e 66 6f 28 75 6e 69 78 49 6e 6f  nodeInfo(unixIno
64e0: 64 65 49 6e 66 6f 20 2a 70 49 6e 6f 64 65 29 7b  deInfo *pInode){
64f0: 0a 20 20 61 73 73 65 72 74 28 20 75 6e 69 78 4d  .  assert( unixM
6500: 75 74 65 78 48 65 6c 64 28 29 20 29 3b 0a 20 20  utexHeld() );.  
6510: 69 66 28 20 70 49 6e 6f 64 65 20 29 7b 0a 20 20  if( pInode ){.  
6520: 20 20 70 49 6e 6f 64 65 2d 3e 6e 52 65 66 2d 2d    pInode->nRef--
6530: 3b 0a 20 20 20 20 69 66 28 20 70 49 6e 6f 64 65  ;.    if( pInode
6540: 2d 3e 6e 52 65 66 3d 3d 30 20 29 7b 0a 20 20 20  ->nRef==0 ){.   
6550: 20 20 20 61 73 73 65 72 74 28 20 70 49 6e 6f 64     assert( pInod
6560: 65 2d 3e 70 53 68 6d 4e 6f 64 65 3d 3d 30 20 29  e->pShmNode==0 )
6570: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 49 6e 6f  ;.      if( pIno
6580: 64 65 2d 3e 70 50 72 65 76 20 29 7b 0a 20 20 20  de->pPrev ){.   
6590: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 49 6e       assert( pIn
65a0: 6f 64 65 2d 3e 70 50 72 65 76 2d 3e 70 4e 65 78  ode->pPrev->pNex
65b0: 74 3d 3d 70 49 6e 6f 64 65 20 29 3b 0a 20 20 20  t==pInode );.   
65c0: 20 20 20 20 20 70 49 6e 6f 64 65 2d 3e 70 50 72       pInode->pPr
65d0: 65 76 2d 3e 70 4e 65 78 74 20 3d 20 70 49 6e 6f  ev->pNext = pIno
65e0: 64 65 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20  de->pNext;.     
65f0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
6600: 61 73 73 65 72 74 28 20 69 6e 6f 64 65 4c 69 73  assert( inodeLis
6610: 74 3d 3d 70 49 6e 6f 64 65 20 29 3b 0a 20 20 20  t==pInode );.   
6620: 20 20 20 20 20 69 6e 6f 64 65 4c 69 73 74 20 3d       inodeList =
6630: 20 70 49 6e 6f 64 65 2d 3e 70 4e 65 78 74 3b 0a   pInode->pNext;.
6640: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
6650: 28 20 70 49 6e 6f 64 65 2d 3e 70 4e 65 78 74 20  ( pInode->pNext 
6660: 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  ){.        asser
6670: 74 28 20 70 49 6e 6f 64 65 2d 3e 70 4e 65 78 74  t( pInode->pNext
6680: 2d 3e 70 50 72 65 76 3d 3d 70 49 6e 6f 64 65 20  ->pPrev==pInode 
6690: 29 3b 0a 20 20 20 20 20 20 20 20 70 49 6e 6f 64  );.        pInod
66a0: 65 2d 3e 70 4e 65 78 74 2d 3e 70 50 72 65 76 20  e->pNext->pPrev 
66b0: 3d 20 70 49 6e 6f 64 65 2d 3e 70 50 72 65 76 3b  = pInode->pPrev;
66c0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73  .      }.      s
66d0: 71 6c 69 74 65 33 5f 66 72 65 65 28 70 49 6e 6f  qlite3_free(pIno
66e0: 64 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d  de);.    }.  }.}
66f0: 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 61 20  ../*.** Given a 
6700: 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 2c  file descriptor,
6710: 20 6c 6f 63 61 74 65 20 74 68 65 20 75 6e 69 78   locate the unix
6720: 49 6e 6f 64 65 49 6e 66 6f 20 6f 62 6a 65 63 74  InodeInfo object
6730: 20 74 68 61 74 0a 2a 2a 20 64 65 73 63 72 69 62   that.** describ
6740: 65 73 20 74 68 61 74 20 66 69 6c 65 20 64 65 73  es that file des
6750: 63 72 69 70 74 6f 72 2e 20 20 43 72 65 61 74 65  criptor.  Create
6760: 20 61 20 6e 65 77 20 6f 6e 65 20 69 66 20 6e 65   a new one if ne
6770: 63 65 73 73 61 72 79 2e 20 20 54 68 65 0a 2a 2a  cessary.  The.**
6780: 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 6d 69   return value mi
6790: 67 68 74 20 62 65 20 75 6e 69 6e 69 74 69 61 6c  ght be uninitial
67a0: 69 7a 65 64 20 69 66 20 61 6e 20 65 72 72 6f 72  ized if an error
67b0: 20 6f 63 63 75 72 73 2e 0a 2a 2a 0a 2a 2a 20 54   occurs..**.** T
67c0: 68 65 20 6d 75 74 65 78 20 65 6e 74 65 72 65 64  he mutex entered
67d0: 20 75 73 69 6e 67 20 74 68 65 20 75 6e 69 78 45   using the unixE
67e0: 6e 74 65 72 4d 75 74 65 78 28 29 20 66 75 6e 63  nterMutex() func
67f0: 74 69 6f 6e 20 6d 75 73 74 20 62 65 20 68 65 6c  tion must be hel
6800: 64 0a 2a 2a 20 77 68 65 6e 20 74 68 69 73 20 66  d.** when this f
6810: 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65  unction is calle
6820: 64 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  d..**.** Return 
6830: 61 6e 20 61 70 70 72 6f 70 72 69 61 74 65 20 65  an appropriate e
6840: 72 72 6f 72 20 63 6f 64 65 2e 0a 2a 2f 0a 73 74  rror code..*/.st
6850: 61 74 69 63 20 69 6e 74 20 66 69 6e 64 49 6e 6f  atic int findIno
6860: 64 65 49 6e 66 6f 28 0a 20 20 75 6e 69 78 46 69  deInfo(.  unixFi
6870: 6c 65 20 2a 70 46 69 6c 65 2c 20 20 20 20 20 20  le *pFile,      
6880: 20 20 20 20 20 20 20 20 20 2f 2a 20 55 6e 69 78           /* Unix
6890: 20 66 69 6c 65 20 77 69 74 68 20 66 69 6c 65 20   file with file 
68a0: 64 65 73 63 20 75 73 65 64 20 69 6e 20 74 68 65  desc used in the
68b0: 20 6b 65 79 20 2a 2f 0a 20 20 75 6e 69 78 49 6e   key */.  unixIn
68c0: 6f 64 65 49 6e 66 6f 20 2a 2a 70 70 49 6e 6f 64  odeInfo **ppInod
68d0: 65 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75  e        /* Retu
68e0: 72 6e 20 74 68 65 20 75 6e 69 78 49 6e 6f 64 65  rn the unixInode
68f0: 49 6e 66 6f 20 6f 62 6a 65 63 74 20 68 65 72 65  Info object here
6900: 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b   */.){.  int rc;
6910: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6920: 20 20 20 20 20 20 20 20 2f 2a 20 53 79 73 74 65          /* Syste
6930: 6d 20 63 61 6c 6c 20 72 65 74 75 72 6e 20 63 6f  m call return co
6940: 64 65 20 2a 2f 0a 20 20 69 6e 74 20 66 64 3b 20  de */.  int fd; 
6950: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6960: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 66 69         /* The fi
6970: 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 66 6f  le descriptor fo
6980: 72 20 70 46 69 6c 65 20 2a 2f 0a 20 20 73 74 72  r pFile */.  str
6990: 75 63 74 20 75 6e 69 78 46 69 6c 65 49 64 20 66  uct unixFileId f
69a0: 69 6c 65 49 64 3b 20 20 20 20 20 20 2f 2a 20 4c  ileId;      /* L
69b0: 6f 6f 6b 75 70 20 6b 65 79 20 66 6f 72 20 74 68  ookup key for th
69c0: 65 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20  e unixInodeInfo 
69d0: 2a 2f 0a 20 20 73 74 72 75 63 74 20 73 74 61 74  */.  struct stat
69e0: 20 73 74 61 74 62 75 66 3b 20 20 20 20 20 20 20   statbuf;       
69f0: 20 20 20 20 2f 2a 20 4c 6f 77 2d 6c 65 76 65 6c      /* Low-level
6a00: 20 66 69 6c 65 20 69 6e 66 6f 72 6d 61 74 69 6f   file informatio
6a10: 6e 20 2a 2f 0a 20 20 75 6e 69 78 49 6e 6f 64 65  n */.  unixInode
6a20: 49 6e 66 6f 20 2a 70 49 6e 6f 64 65 20 3d 20 30  Info *pInode = 0
6a30: 3b 20 20 20 20 20 2f 2a 20 43 61 6e 64 69 64 61  ;     /* Candida
6a40: 74 65 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f  te unixInodeInfo
6a50: 20 6f 62 6a 65 63 74 20 2a 2f 0a 0a 20 20 61 73   object */..  as
6a60: 73 65 72 74 28 20 75 6e 69 78 4d 75 74 65 78 48  sert( unixMutexH
6a70: 65 6c 64 28 29 20 29 3b 0a 0a 20 20 2f 2a 20 47  eld() );..  /* G
6a80: 65 74 20 6c 6f 77 2d 6c 65 76 65 6c 20 69 6e 66  et low-level inf
6a90: 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20 74  ormation about t
6aa0: 68 65 20 66 69 6c 65 20 74 68 61 74 20 77 65 20  he file that we 
6ab0: 63 61 6e 20 75 73 65 64 20 74 6f 0a 20 20 2a 2a  can used to.  **
6ac0: 20 63 72 65 61 74 65 20 61 20 75 6e 69 71 75 65   create a unique
6ad0: 20 6e 61 6d 65 20 66 6f 72 20 74 68 65 20 66 69   name for the fi
6ae0: 6c 65 2e 0a 20 20 2a 2f 0a 20 20 66 64 20 3d 20  le..  */.  fd = 
6af0: 70 46 69 6c 65 2d 3e 68 3b 0a 20 20 72 63 20 3d  pFile->h;.  rc =
6b00: 20 66 73 74 61 74 28 66 64 2c 20 26 73 74 61 74   fstat(fd, &stat
6b10: 62 75 66 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  buf);.  if( rc!=
6b20: 30 20 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e  0 ){.    pFile->
6b30: 6c 61 73 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e  lastErrno = errn
6b40: 6f 3b 0a 23 69 66 64 65 66 20 45 4f 56 45 52 46  o;.#ifdef EOVERF
6b50: 4c 4f 57 0a 20 20 20 20 69 66 28 20 70 46 69 6c  LOW.    if( pFil
6b60: 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 3d 3d 45 4f  e->lastErrno==EO
6b70: 56 45 52 46 4c 4f 57 20 29 20 72 65 74 75 72 6e  VERFLOW ) return
6b80: 20 53 51 4c 49 54 45 5f 4e 4f 4c 46 53 3b 0a 23   SQLITE_NOLFS;.#
6b90: 65 6e 64 69 66 0a 20 20 20 20 72 65 74 75 72 6e  endif.    return
6ba0: 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 3b 0a 20   SQLITE_IOERR;. 
6bb0: 20 7d 0a 0a 23 69 66 64 65 66 20 5f 5f 41 50 50   }..#ifdef __APP
6bc0: 4c 45 5f 5f 0a 20 20 2f 2a 20 4f 6e 20 4f 53 20  LE__.  /* On OS 
6bd0: 58 20 6f 6e 20 61 6e 20 6d 73 64 6f 73 20 66 69  X on an msdos fi
6be0: 6c 65 73 79 73 74 65 6d 2c 20 74 68 65 20 69 6e  lesystem, the in
6bf0: 6f 64 65 20 6e 75 6d 62 65 72 20 69 73 20 72 65  ode number is re
6c00: 70 6f 72 74 65 64 0a 20 20 2a 2a 20 69 6e 63 6f  ported.  ** inco
6c10: 72 72 65 63 74 6c 79 20 66 6f 72 20 7a 65 72 6f  rrectly for zero
6c20: 2d 73 69 7a 65 20 66 69 6c 65 73 2e 20 20 53 65  -size files.  Se
6c30: 65 20 74 69 63 6b 65 74 20 23 33 32 36 30 2e 20  e ticket #3260. 
6c40: 20 54 6f 20 77 6f 72 6b 0a 20 20 2a 2a 20 61 72   To work.  ** ar
6c50: 6f 75 6e 64 20 74 68 69 73 20 70 72 6f 62 6c 65  ound this proble
6c60: 6d 20 28 77 65 20 63 6f 6e 73 69 64 65 72 20 69  m (we consider i
6c70: 74 20 61 20 62 75 67 20 69 6e 20 4f 53 20 58 2c  t a bug in OS X,
6c80: 20 6e 6f 74 20 53 51 4c 69 74 65 29 0a 20 20 2a   not SQLite).  *
6c90: 2a 20 77 65 20 61 6c 77 61 79 73 20 69 6e 63 72  * we always incr
6ca0: 65 61 73 65 20 74 68 65 20 66 69 6c 65 20 73 69  ease the file si
6cb0: 7a 65 20 74 6f 20 31 20 62 79 20 77 72 69 74 69  ze to 1 by writi
6cc0: 6e 67 20 61 20 73 69 6e 67 6c 65 20 62 79 74 65  ng a single byte
6cd0: 0a 20 20 2a 2a 20 70 72 69 6f 72 20 74 6f 20 61  .  ** prior to a
6ce0: 63 63 65 73 73 69 6e 67 20 74 68 65 20 69 6e 6f  ccessing the ino
6cf0: 64 65 20 6e 75 6d 62 65 72 2e 20 20 54 68 65 20  de number.  The 
6d00: 6f 6e 65 20 62 79 74 65 20 77 72 69 74 74 65 6e  one byte written
6d10: 20 69 73 0a 20 20 2a 2a 20 61 6e 20 41 53 43 49   is.  ** an ASCI
6d20: 49 20 27 53 27 20 63 68 61 72 61 63 74 65 72 20  I 'S' character 
6d30: 77 68 69 63 68 20 61 6c 73 6f 20 68 61 70 70 65  which also happe
6d40: 6e 73 20 74 6f 20 62 65 20 74 68 65 20 66 69 72  ns to be the fir
6d50: 73 74 20 62 79 74 65 0a 20 20 2a 2a 20 69 6e 20  st byte.  ** in 
6d60: 74 68 65 20 68 65 61 64 65 72 20 6f 66 20 65 76  the header of ev
6d70: 65 72 79 20 53 51 4c 69 74 65 20 64 61 74 61 62  ery SQLite datab
6d80: 61 73 65 2e 20 20 49 6e 20 74 68 69 73 20 77 61  ase.  In this wa
6d90: 79 2c 20 69 66 20 74 68 65 72 65 0a 20 20 2a 2a  y, if there.  **
6da0: 20 69 73 20 61 20 72 61 63 65 20 63 6f 6e 64 69   is a race condi
6db0: 74 69 6f 6e 20 73 75 63 68 20 74 68 61 74 20 61  tion such that a
6dc0: 6e 6f 74 68 65 72 20 74 68 72 65 61 64 20 68 61  nother thread ha
6dd0: 73 20 61 6c 72 65 61 64 79 20 70 6f 70 75 6c 61  s already popula
6de0: 74 65 64 0a 20 20 2a 2a 20 74 68 65 20 66 69 72  ted.  ** the fir
6df0: 73 74 20 70 61 67 65 20 6f 66 20 74 68 65 20 64  st page of the d
6e00: 61 74 61 62 61 73 65 2c 20 6e 6f 20 64 61 6d 61  atabase, no dama
6e10: 67 65 20 69 73 20 64 6f 6e 65 2e 0a 20 20 2a 2f  ge is done..  */
6e20: 0a 20 20 69 66 28 20 73 74 61 74 62 75 66 2e 73  .  if( statbuf.s
6e30: 74 5f 73 69 7a 65 3d 3d 30 20 26 26 20 28 70 46  t_size==0 && (pF
6e40: 69 6c 65 2d 3e 66 73 46 6c 61 67 73 20 26 20 53  ile->fsFlags & S
6e50: 51 4c 49 54 45 5f 46 53 46 4c 41 47 53 5f 49 53  QLITE_FSFLAGS_IS
6e60: 5f 4d 53 44 4f 53 29 21 3d 30 20 29 7b 0a 20 20  _MSDOS)!=0 ){.  
6e70: 20 20 72 63 20 3d 20 77 72 69 74 65 28 66 64 2c    rc = write(fd,
6e80: 20 22 53 22 2c 20 31 29 3b 0a 20 20 20 20 69 66   "S", 1);.    if
6e90: 28 20 72 63 21 3d 31 20 29 7b 0a 20 20 20 20 20  ( rc!=1 ){.     
6ea0: 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e   pFile->lastErrn
6eb0: 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20  o = errno;.     
6ec0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49   return SQLITE_I
6ed0: 4f 45 52 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20  OERR;.    }.    
6ee0: 72 63 20 3d 20 66 73 74 61 74 28 66 64 2c 20 26  rc = fstat(fd, &
6ef0: 73 74 61 74 62 75 66 29 3b 0a 20 20 20 20 69 66  statbuf);.    if
6f00: 28 20 72 63 21 3d 30 20 29 7b 0a 20 20 20 20 20  ( rc!=0 ){.     
6f10: 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e   pFile->lastErrn
6f20: 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20  o = errno;.     
6f30: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49   return SQLITE_I
6f40: 4f 45 52 52 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  OERR;.    }.  }.
6f50: 23 65 6e 64 69 66 0a 0a 20 20 6d 65 6d 73 65 74  #endif..  memset
6f60: 28 26 66 69 6c 65 49 64 2c 20 30 2c 20 73 69 7a  (&fileId, 0, siz
6f70: 65 6f 66 28 66 69 6c 65 49 64 29 29 3b 0a 20 20  eof(fileId));.  
6f80: 66 69 6c 65 49 64 2e 64 65 76 20 3d 20 73 74 61  fileId.dev = sta
6f90: 74 62 75 66 2e 73 74 5f 64 65 76 3b 0a 23 69 66  tbuf.st_dev;.#if
6fa0: 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20 66 69   OS_VXWORKS.  fi
6fb0: 6c 65 49 64 2e 70 49 64 20 3d 20 70 46 69 6c 65  leId.pId = pFile
6fc0: 2d 3e 70 49 64 3b 0a 23 65 6c 73 65 0a 20 20 66  ->pId;.#else.  f
6fd0: 69 6c 65 49 64 2e 69 6e 6f 20 3d 20 73 74 61 74  ileId.ino = stat
6fe0: 62 75 66 2e 73 74 5f 69 6e 6f 3b 0a 23 65 6e 64  buf.st_ino;.#end
6ff0: 69 66 0a 20 20 70 49 6e 6f 64 65 20 3d 20 69 6e  if.  pInode = in
7000: 6f 64 65 4c 69 73 74 3b 0a 20 20 77 68 69 6c 65  odeList;.  while
7010: 28 20 70 49 6e 6f 64 65 20 26 26 20 6d 65 6d 63  ( pInode && memc
7020: 6d 70 28 26 66 69 6c 65 49 64 2c 20 26 70 49 6e  mp(&fileId, &pIn
7030: 6f 64 65 2d 3e 66 69 6c 65 49 64 2c 20 73 69 7a  ode->fileId, siz
7040: 65 6f 66 28 66 69 6c 65 49 64 29 29 20 29 7b 0a  eof(fileId)) ){.
7050: 20 20 20 20 70 49 6e 6f 64 65 20 3d 20 70 49 6e      pInode = pIn
7060: 6f 64 65 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d 0a  ode->pNext;.  }.
7070: 20 20 69 66 28 20 70 49 6e 6f 64 65 3d 3d 30 20    if( pInode==0 
7080: 29 7b 0a 20 20 20 20 70 49 6e 6f 64 65 20 3d 20  ){.    pInode = 
7090: 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 20  sqlite3_malloc( 
70a0: 73 69 7a 65 6f 66 28 2a 70 49 6e 6f 64 65 29 20  sizeof(*pInode) 
70b0: 29 3b 0a 20 20 20 20 69 66 28 20 70 49 6e 6f 64  );.    if( pInod
70c0: 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 65  e==0 ){.      re
70d0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
70e0: 4d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6d 65 6d  M;.    }.    mem
70f0: 73 65 74 28 70 49 6e 6f 64 65 2c 20 30 2c 20 73  set(pInode, 0, s
7100: 69 7a 65 6f 66 28 2a 70 49 6e 6f 64 65 29 29 3b  izeof(*pInode));
7110: 0a 20 20 20 20 6d 65 6d 63 70 79 28 26 70 49 6e  .    memcpy(&pIn
7120: 6f 64 65 2d 3e 66 69 6c 65 49 64 2c 20 26 66 69  ode->fileId, &fi
7130: 6c 65 49 64 2c 20 73 69 7a 65 6f 66 28 66 69 6c  leId, sizeof(fil
7140: 65 49 64 29 29 3b 0a 20 20 20 20 70 49 6e 6f 64  eId));.    pInod
7150: 65 2d 3e 6e 52 65 66 20 3d 20 31 3b 0a 20 20 20  e->nRef = 1;.   
7160: 20 70 49 6e 6f 64 65 2d 3e 70 4e 65 78 74 20 3d   pInode->pNext =
7170: 20 69 6e 6f 64 65 4c 69 73 74 3b 0a 20 20 20 20   inodeList;.    
7180: 70 49 6e 6f 64 65 2d 3e 70 50 72 65 76 20 3d 20  pInode->pPrev = 
7190: 30 3b 0a 20 20 20 20 69 66 28 20 69 6e 6f 64 65  0;.    if( inode
71a0: 4c 69 73 74 20 29 20 69 6e 6f 64 65 4c 69 73 74  List ) inodeList
71b0: 2d 3e 70 50 72 65 76 20 3d 20 70 49 6e 6f 64 65  ->pPrev = pInode
71c0: 3b 0a 20 20 20 20 69 6e 6f 64 65 4c 69 73 74 20  ;.    inodeList 
71d0: 3d 20 70 49 6e 6f 64 65 3b 0a 20 20 7d 65 6c 73  = pInode;.  }els
71e0: 65 7b 0a 20 20 20 20 70 49 6e 6f 64 65 2d 3e 6e  e{.    pInode->n
71f0: 52 65 66 2b 2b 3b 0a 20 20 7d 0a 20 20 2a 70 70  Ref++;.  }.  *pp
7200: 49 6e 6f 64 65 20 3d 20 70 49 6e 6f 64 65 3b 0a  Inode = pInode;.
7210: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
7220: 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68  OK;.}.../*.** Th
7230: 69 73 20 72 6f 75 74 69 6e 65 20 63 68 65 63 6b  is routine check
7240: 73 20 69 66 20 74 68 65 72 65 20 69 73 20 61 20  s if there is a 
7250: 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 68 65  RESERVED lock he
7260: 6c 64 20 6f 6e 20 74 68 65 20 73 70 65 63 69 66  ld on the specif
7270: 69 65 64 0a 2a 2a 20 66 69 6c 65 20 62 79 20 74  ied.** file by t
7280: 68 69 73 20 6f 72 20 61 6e 79 20 6f 74 68 65 72  his or any other
7290: 20 70 72 6f 63 65 73 73 2e 20 49 66 20 73 75 63   process. If suc
72a0: 68 20 61 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64  h a lock is held
72b0: 2c 20 73 65 74 20 2a 70 52 65 73 4f 75 74 0a 2a  , set *pResOut.*
72c0: 2a 20 74 6f 20 61 20 6e 6f 6e 2d 7a 65 72 6f 20  * to a non-zero 
72d0: 76 61 6c 75 65 20 6f 74 68 65 72 77 69 73 65 20  value otherwise 
72e0: 2a 70 52 65 73 4f 75 74 20 69 73 20 73 65 74 20  *pResOut is set 
72f0: 74 6f 20 7a 65 72 6f 2e 20 20 54 68 65 20 72 65  to zero.  The re
7300: 74 75 72 6e 20 76 61 6c 75 65 0a 2a 2a 20 69 73  turn value.** is
7310: 20 73 65 74 20 74 6f 20 53 51 4c 49 54 45 5f 4f   set to SQLITE_O
7320: 4b 20 75 6e 6c 65 73 73 20 61 6e 20 49 2f 4f 20  K unless an I/O 
7330: 65 72 72 6f 72 20 6f 63 63 75 72 73 20 64 75 72  error occurs dur
7340: 69 6e 67 20 6c 6f 63 6b 20 63 68 65 63 6b 69 6e  ing lock checkin
7350: 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  g..*/.static int
7360: 20 75 6e 69 78 43 68 65 63 6b 52 65 73 65 72 76   unixCheckReserv
7370: 65 64 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66  edLock(sqlite3_f
7380: 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 2a 70 52  ile *id, int *pR
7390: 65 73 4f 75 74 29 7b 0a 20 20 69 6e 74 20 72 63  esOut){.  int rc
73a0: 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
73b0: 69 6e 74 20 72 65 73 65 72 76 65 64 20 3d 20 30  int reserved = 0
73c0: 3b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46  ;.  unixFile *pF
73d0: 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a  ile = (unixFile*
73e0: 29 69 64 3b 0a 0a 20 20 53 69 6d 75 6c 61 74 65  )id;..  Simulate
73f0: 49 4f 45 72 72 6f 72 28 20 72 65 74 75 72 6e 20  IOError( return 
7400: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43 48 45  SQLITE_IOERR_CHE
7410: 43 4b 52 45 53 45 52 56 45 44 4c 4f 43 4b 3b 20  CKRESERVEDLOCK; 
7420: 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 46  );..  assert( pF
7430: 69 6c 65 20 29 3b 0a 20 20 75 6e 69 78 45 6e 74  ile );.  unixEnt
7440: 65 72 4d 75 74 65 78 28 29 3b 20 2f 2a 20 42 65  erMutex(); /* Be
7450: 63 61 75 73 65 20 70 46 69 6c 65 2d 3e 70 49 6e  cause pFile->pIn
7460: 6f 64 65 20 69 73 20 73 68 61 72 65 64 20 61 63  ode is shared ac
7470: 72 6f 73 73 20 74 68 72 65 61 64 73 20 2a 2f 0a  ross threads */.
7480: 0a 20 20 2f 2a 20 43 68 65 63 6b 20 69 66 20 61  .  /* Check if a
7490: 20 74 68 72 65 61 64 20 69 6e 20 74 68 69 73 20   thread in this 
74a0: 70 72 6f 63 65 73 73 20 68 6f 6c 64 73 20 73 75  process holds su
74b0: 63 68 20 61 20 6c 6f 63 6b 20 2a 2f 0a 20 20 69  ch a lock */.  i
74c0: 66 28 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65  f( pFile->pInode
74d0: 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3e 53 48 41 52  ->eFileLock>SHAR
74e0: 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 72  ED_LOCK ){.    r
74f0: 65 73 65 72 76 65 64 20 3d 20 31 3b 0a 20 20 7d  eserved = 1;.  }
7500: 0a 0a 20 20 2f 2a 20 4f 74 68 65 72 77 69 73 65  ..  /* Otherwise
7510: 20 73 65 65 20 69 66 20 73 6f 6d 65 20 6f 74 68   see if some oth
7520: 65 72 20 70 72 6f 63 65 73 73 20 68 6f 6c 64 73  er process holds
7530: 20 69 74 2e 0a 20 20 2a 2f 0a 23 69 66 6e 64 65   it..  */.#ifnde
7540: 66 20 5f 5f 44 4a 47 50 50 5f 5f 0a 20 20 69 66  f __DJGPP__.  if
7550: 28 20 21 72 65 73 65 72 76 65 64 20 29 7b 0a 20  ( !reserved ){. 
7560: 20 20 20 73 74 72 75 63 74 20 66 6c 6f 63 6b 20     struct flock 
7570: 6c 6f 63 6b 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c  lock;.    lock.l
7580: 5f 77 68 65 6e 63 65 20 3d 20 53 45 45 4b 5f 53  _whence = SEEK_S
7590: 45 54 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73  ET;.    lock.l_s
75a0: 74 61 72 74 20 3d 20 52 45 53 45 52 56 45 44 5f  tart = RESERVED_
75b0: 42 59 54 45 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c  BYTE;.    lock.l
75c0: 5f 6c 65 6e 20 3d 20 31 3b 0a 20 20 20 20 6c 6f  _len = 1;.    lo
75d0: 63 6b 2e 6c 5f 74 79 70 65 20 3d 20 46 5f 57 52  ck.l_type = F_WR
75e0: 4c 43 4b 3b 0a 20 20 20 20 69 66 20 28 2d 31 20  LCK;.    if (-1 
75f0: 3d 3d 20 66 63 6e 74 6c 28 70 46 69 6c 65 2d 3e  == fcntl(pFile->
7600: 68 2c 20 46 5f 47 45 54 4c 4b 2c 20 26 6c 6f 63  h, F_GETLK, &loc
7610: 6b 29 29 20 7b 0a 20 20 20 20 20 20 69 6e 74 20  k)) {.      int 
7620: 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a  tErrno = errno;.
7630: 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
7640: 65 45 72 72 6f 72 46 72 6f 6d 50 6f 73 69 78 45  eErrorFromPosixE
7650: 72 72 6f 72 28 74 45 72 72 6e 6f 2c 20 53 51 4c  rror(tErrno, SQL
7660: 49 54 45 5f 49 4f 45 52 52 5f 43 48 45 43 4b 52  ITE_IOERR_CHECKR
7670: 45 53 45 52 56 45 44 4c 4f 43 4b 29 3b 0a 20 20  ESERVEDLOCK);.  
7680: 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45      pFile->lastE
7690: 72 72 6e 6f 20 3d 20 74 45 72 72 6e 6f 3b 0a 20  rrno = tErrno;. 
76a0: 20 20 20 7d 20 65 6c 73 65 20 69 66 28 20 6c 6f     } else if( lo
76b0: 63 6b 2e 6c 5f 74 79 70 65 21 3d 46 5f 55 4e 4c  ck.l_type!=F_UNL
76c0: 43 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 73 65  CK ){.      rese
76d0: 72 76 65 64 20 3d 20 31 3b 0a 20 20 20 20 7d 0a  rved = 1;.    }.
76e0: 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 0a 20 20    }.#endif.  .  
76f0: 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29  unixLeaveMutex()
7700: 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22 54 45  ;.  OSTRACE(("TE
7710: 53 54 20 57 52 2d 4c 4f 43 4b 20 25 64 20 25 64  ST WR-LOCK %d %d
7720: 20 25 64 20 28 75 6e 69 78 29 5c 6e 22 2c 20 70   %d (unix)\n", p
7730: 46 69 6c 65 2d 3e 68 2c 20 72 63 2c 20 72 65 73  File->h, rc, res
7740: 65 72 76 65 64 29 29 3b 0a 0a 20 20 2a 70 52 65  erved));..  *pRe
7750: 73 4f 75 74 20 3d 20 72 65 73 65 72 76 65 64 3b  sOut = reserved;
7760: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
7770: 0a 2f 2a 0a 2a 2a 20 4c 6f 63 6b 20 74 68 65 20  ./*.** Lock the 
7780: 66 69 6c 65 20 77 69 74 68 20 74 68 65 20 6c 6f  file with the lo
7790: 63 6b 20 73 70 65 63 69 66 69 65 64 20 62 79 20  ck specified by 
77a0: 70 61 72 61 6d 65 74 65 72 20 65 46 69 6c 65 4c  parameter eFileL
77b0: 6f 63 6b 20 2d 20 6f 6e 65 0a 2a 2a 20 6f 66 20  ock - one.** of 
77c0: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a  the following:.*
77d0: 2a 0a 2a 2a 20 20 20 20 20 28 31 29 20 53 48 41  *.**     (1) SHA
77e0: 52 45 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20  RED_LOCK.**     
77f0: 28 32 29 20 52 45 53 45 52 56 45 44 5f 4c 4f 43  (2) RESERVED_LOC
7800: 4b 0a 2a 2a 20 20 20 20 20 28 33 29 20 50 45 4e  K.**     (3) PEN
7810: 44 49 4e 47 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20  DING_LOCK.**    
7820: 20 28 34 29 20 45 58 43 4c 55 53 49 56 45 5f 4c   (4) EXCLUSIVE_L
7830: 4f 43 4b 0a 2a 2a 0a 2a 2a 20 53 6f 6d 65 74 69  OCK.**.** Someti
7840: 6d 65 73 20 77 68 65 6e 20 72 65 71 75 65 73 74  mes when request
7850: 69 6e 67 20 6f 6e 65 20 6c 6f 63 6b 20 73 74 61  ing one lock sta
7860: 74 65 2c 20 61 64 64 69 74 69 6f 6e 61 6c 20 6c  te, additional l
7870: 6f 63 6b 20 73 74 61 74 65 73 0a 2a 2a 20 61 72  ock states.** ar
7880: 65 20 69 6e 73 65 72 74 65 64 20 69 6e 20 62 65  e inserted in be
7890: 74 77 65 65 6e 2e 20 20 54 68 65 20 6c 6f 63 6b  tween.  The lock
78a0: 69 6e 67 20 6d 69 67 68 74 20 66 61 69 6c 20 6f  ing might fail o
78b0: 6e 20 6f 6e 65 20 6f 66 20 74 68 65 20 6c 61 74  n one of the lat
78c0: 65 72 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e  er.** transition
78d0: 73 20 6c 65 61 76 69 6e 67 20 74 68 65 20 6c 6f  s leaving the lo
78e0: 63 6b 20 73 74 61 74 65 20 64 69 66 66 65 72 65  ck state differe
78f0: 6e 74 20 66 72 6f 6d 20 77 68 61 74 20 69 74 20  nt from what it 
7900: 73 74 61 72 74 65 64 20 62 75 74 0a 2a 2a 20 73  started but.** s
7910: 74 69 6c 6c 20 73 68 6f 72 74 20 6f 66 20 69 74  till short of it
7920: 73 20 67 6f 61 6c 2e 20 20 54 68 65 20 66 6f 6c  s goal.  The fol
7930: 6c 6f 77 69 6e 67 20 63 68 61 72 74 20 73 68 6f  lowing chart sho
7940: 77 73 20 74 68 65 20 61 6c 6c 6f 77 65 64 0a 2a  ws the allowed.*
7950: 2a 20 74 72 61 6e 73 69 74 69 6f 6e 73 20 61 6e  * transitions an
7960: 64 20 74 68 65 20 69 6e 73 65 72 74 65 64 20 69  d the inserted i
7970: 6e 74 65 72 6d 65 64 69 61 74 65 20 73 74 61 74  ntermediate stat
7980: 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 55 4e 4c  es:.**.**    UNL
7990: 4f 43 4b 45 44 20 2d 3e 20 53 48 41 52 45 44 0a  OCKED -> SHARED.
79a0: 2a 2a 20 20 20 20 53 48 41 52 45 44 20 2d 3e 20  **    SHARED -> 
79b0: 52 45 53 45 52 56 45 44 0a 2a 2a 20 20 20 20 53  RESERVED.**    S
79c0: 48 41 52 45 44 20 2d 3e 20 28 50 45 4e 44 49 4e  HARED -> (PENDIN
79d0: 47 29 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a  G) -> EXCLUSIVE.
79e0: 2a 2a 20 20 20 20 52 45 53 45 52 56 45 44 20 2d  **    RESERVED -
79f0: 3e 20 28 50 45 4e 44 49 4e 47 29 20 2d 3e 20 45  > (PENDING) -> E
7a00: 58 43 4c 55 53 49 56 45 0a 2a 2a 20 20 20 20 50  XCLUSIVE.**    P
7a10: 45 4e 44 49 4e 47 20 2d 3e 20 45 58 43 4c 55 53  ENDING -> EXCLUS
7a20: 49 56 45 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  IVE.**.** This r
7a30: 6f 75 74 69 6e 65 20 77 69 6c 6c 20 6f 6e 6c 79  outine will only
7a40: 20 69 6e 63 72 65 61 73 65 20 61 20 6c 6f 63 6b   increase a lock
7a50: 2e 20 20 55 73 65 20 74 68 65 20 73 71 6c 69 74  .  Use the sqlit
7a60: 65 33 4f 73 55 6e 6c 6f 63 6b 28 29 0a 2a 2a 20  e3OsUnlock().** 
7a70: 72 6f 75 74 69 6e 65 20 74 6f 20 6c 6f 77 65 72  routine to lower
7a80: 20 61 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c   a locking level
7a90: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
7aa0: 75 6e 69 78 4c 6f 63 6b 28 73 71 6c 69 74 65 33  unixLock(sqlite3
7ab0: 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 65  _file *id, int e
7ac0: 46 69 6c 65 4c 6f 63 6b 29 7b 0a 20 20 2f 2a 20  FileLock){.  /* 
7ad0: 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 64 65  The following de
7ae0: 73 63 72 69 62 65 73 20 74 68 65 20 69 6d 70 6c  scribes the impl
7af0: 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68  ementation of th
7b00: 65 20 76 61 72 69 6f 75 73 20 6c 6f 63 6b 73 20  e various locks 
7b10: 61 6e 64 0a 20 20 2a 2a 20 6c 6f 63 6b 20 74 72  and.  ** lock tr
7b20: 61 6e 73 69 74 69 6f 6e 73 20 69 6e 20 74 65 72  ansitions in ter
7b30: 6d 73 20 6f 66 20 74 68 65 20 50 4f 53 49 58 20  ms of the POSIX 
7b40: 61 64 76 69 73 6f 72 79 20 73 68 61 72 65 64 20  advisory shared 
7b50: 61 6e 64 20 65 78 63 6c 75 73 69 76 65 0a 20 20  and exclusive.  
7b60: 2a 2a 20 6c 6f 63 6b 20 70 72 69 6d 69 74 69 76  ** lock primitiv
7b70: 65 73 20 28 63 61 6c 6c 65 64 20 72 65 61 64 2d  es (called read-
7b80: 6c 6f 63 6b 73 20 61 6e 64 20 77 72 69 74 65 2d  locks and write-
7b90: 6c 6f 63 6b 73 20 62 65 6c 6f 77 2c 20 74 6f 20  locks below, to 
7ba0: 61 76 6f 69 64 0a 20 20 2a 2a 20 63 6f 6e 66 75  avoid.  ** confu
7bb0: 73 69 6f 6e 20 77 69 74 68 20 53 51 4c 69 74 65  sion with SQLite
7bc0: 20 6c 6f 63 6b 20 6e 61 6d 65 73 29 2e 20 54 68   lock names). Th
7bd0: 65 20 61 6c 67 6f 72 69 74 68 6d 73 20 61 72 65  e algorithms are
7be0: 20 63 6f 6d 70 6c 69 63 61 74 65 64 0a 20 20 2a   complicated.  *
7bf0: 2a 20 73 6c 69 67 68 74 6c 79 20 69 6e 20 6f 72  * slightly in or
7c00: 64 65 72 20 74 6f 20 62 65 20 63 6f 6d 70 61 74  der to be compat
7c10: 69 62 6c 65 20 77 69 74 68 20 77 69 6e 64 6f 77  ible with window
7c20: 73 20 73 79 73 74 65 6d 73 20 73 69 6d 75 6c 74  s systems simult
7c30: 61 6e 65 6f 75 73 6c 79 0a 20 20 2a 2a 20 61 63  aneously.  ** ac
7c40: 63 65 73 73 69 6e 67 20 74 68 65 20 73 61 6d 65  cessing the same
7c50: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20   database file, 
7c60: 69 6e 20 63 61 73 65 20 74 68 61 74 20 69 73 20  in case that is 
7c70: 65 76 65 72 20 72 65 71 75 69 72 65 64 2e 0a 20  ever required.. 
7c80: 20 2a 2a 0a 20 20 2a 2a 20 53 79 6d 62 6f 6c 73   **.  ** Symbols
7c90: 20 64 65 66 69 6e 65 64 20 69 6e 20 6f 73 2e 68   defined in os.h
7ca0: 20 69 6e 64 65 6e 74 69 66 79 20 74 68 65 20 27   indentify the '
7cb0: 70 65 6e 64 69 6e 67 20 62 79 74 65 27 20 61 6e  pending byte' an
7cc0: 64 20 74 68 65 20 27 72 65 73 65 72 76 65 64 0a  d the 'reserved.
7cd0: 20 20 2a 2a 20 62 79 74 65 27 2c 20 65 61 63 68    ** byte', each
7ce0: 20 73 69 6e 67 6c 65 20 62 79 74 65 73 20 61 74   single bytes at
7cf0: 20 77 65 6c 6c 20 6b 6e 6f 77 6e 20 6f 66 66 73   well known offs
7d00: 65 74 73 2c 20 61 6e 64 20 74 68 65 20 27 73 68  ets, and the 'sh
7d10: 61 72 65 64 20 62 79 74 65 0a 20 20 2a 2a 20 72  ared byte.  ** r
7d20: 61 6e 67 65 27 2c 20 61 20 72 61 6e 67 65 20 6f  ange', a range o
7d30: 66 20 35 31 30 20 62 79 74 65 73 20 61 74 20 61  f 510 bytes at a
7d40: 20 77 65 6c 6c 20 6b 6e 6f 77 6e 20 6f 66 66 73   well known offs
7d50: 65 74 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 6f  et..  **.  ** To
7d60: 20 6f 62 74 61 69 6e 20 61 20 53 48 41 52 45 44   obtain a SHARED
7d70: 20 6c 6f 63 6b 2c 20 61 20 72 65 61 64 2d 6c 6f   lock, a read-lo
7d80: 63 6b 20 69 73 20 6f 62 74 61 69 6e 65 64 20 6f  ck is obtained o
7d90: 6e 20 74 68 65 20 27 70 65 6e 64 69 6e 67 0a 20  n the 'pending. 
7da0: 20 2a 2a 20 62 79 74 65 27 2e 20 20 49 66 20 74   ** byte'.  If t
7db0: 68 69 73 20 69 73 20 73 75 63 63 65 73 73 66 75  his is successfu
7dc0: 6c 2c 20 61 20 72 61 6e 64 6f 6d 20 62 79 74 65  l, a random byte
7dd0: 20 66 72 6f 6d 20 74 68 65 20 27 73 68 61 72 65   from the 'share
7de0: 64 20 62 79 74 65 0a 20 20 2a 2a 20 72 61 6e 67  d byte.  ** rang
7df0: 65 27 20 69 73 20 72 65 61 64 2d 6c 6f 63 6b 65  e' is read-locke
7e00: 64 20 61 6e 64 20 74 68 65 20 6c 6f 63 6b 20 6f  d and the lock o
7e10: 6e 20 74 68 65 20 27 70 65 6e 64 69 6e 67 20 62  n the 'pending b
7e20: 79 74 65 27 20 72 65 6c 65 61 73 65 64 2e 0a 20  yte' released.. 
7e30: 20 2a 2a 0a 20 20 2a 2a 20 41 20 70 72 6f 63 65   **.  ** A proce
7e40: 73 73 20 6d 61 79 20 6f 6e 6c 79 20 6f 62 74 61  ss may only obta
7e50: 69 6e 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f  in a RESERVED lo
7e60: 63 6b 20 61 66 74 65 72 20 69 74 20 68 61 73 20  ck after it has 
7e70: 61 20 53 48 41 52 45 44 20 6c 6f 63 6b 2e 0a 20  a SHARED lock.. 
7e80: 20 2a 2a 20 41 20 52 45 53 45 52 56 45 44 20 6c   ** A RESERVED l
7e90: 6f 63 6b 20 69 73 20 69 6d 70 6c 65 6d 65 6e 74  ock is implement
7ea0: 65 64 20 62 79 20 67 72 61 62 62 69 6e 67 20 61  ed by grabbing a
7eb0: 20 77 72 69 74 65 2d 6c 6f 63 6b 20 6f 6e 20 74   write-lock on t
7ec0: 68 65 0a 20 20 2a 2a 20 27 72 65 73 65 72 76 65  he.  ** 'reserve
7ed0: 64 20 62 79 74 65 27 2e 20 0a 20 20 2a 2a 0a 20  d byte'. .  **. 
7ee0: 20 2a 2a 20 41 20 70 72 6f 63 65 73 73 20 6d 61   ** A process ma
7ef0: 79 20 6f 6e 6c 79 20 6f 62 74 61 69 6e 20 61 20  y only obtain a 
7f00: 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 20 61 66 74  PENDING lock aft
7f10: 65 72 20 69 74 20 68 61 73 20 6f 62 74 61 69 6e  er it has obtain
7f20: 65 64 20 61 0a 20 20 2a 2a 20 53 48 41 52 45 44  ed a.  ** SHARED
7f30: 20 6c 6f 63 6b 2e 20 41 20 50 45 4e 44 49 4e 47   lock. A PENDING
7f40: 20 6c 6f 63 6b 20 69 73 20 69 6d 70 6c 65 6d 65   lock is impleme
7f50: 6e 74 65 64 20 62 79 20 6f 62 74 61 69 6e 69 6e  nted by obtainin
7f60: 67 20 61 20 77 72 69 74 65 2d 6c 6f 63 6b 0a 20  g a write-lock. 
7f70: 20 2a 2a 20 6f 6e 20 74 68 65 20 27 70 65 6e 64   ** on the 'pend
7f80: 69 6e 67 20 62 79 74 65 27 2e 20 54 68 69 73 20  ing byte'. This 
7f90: 65 6e 73 75 72 65 73 20 74 68 61 74 20 6e 6f 20  ensures that no 
7fa0: 6e 65 77 20 53 48 41 52 45 44 20 6c 6f 63 6b 73  new SHARED locks
7fb0: 20 63 61 6e 20 62 65 0a 20 20 2a 2a 20 6f 62 74   can be.  ** obt
7fc0: 61 69 6e 65 64 2c 20 62 75 74 20 65 78 69 73 74  ained, but exist
7fd0: 69 6e 67 20 53 48 41 52 45 44 20 6c 6f 63 6b 73  ing SHARED locks
7fe0: 20 61 72 65 20 61 6c 6c 6f 77 65 64 20 74 6f 20   are allowed to 
7ff0: 70 65 72 73 69 73 74 2e 20 41 20 70 72 6f 63 65  persist. A proce
8000: 73 73 0a 20 20 2a 2a 20 64 6f 65 73 20 6e 6f 74  ss.  ** does not
8010: 20 68 61 76 65 20 74 6f 20 6f 62 74 61 69 6e 20   have to obtain 
8020: 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20  a RESERVED lock 
8030: 6f 6e 20 74 68 65 20 77 61 79 20 74 6f 20 61 20  on the way to a 
8040: 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 2e 0a 20 20  PENDING lock..  
8050: 2a 2a 20 54 68 69 73 20 70 72 6f 70 65 72 74 79  ** This property
8060: 20 69 73 20 75 73 65 64 20 62 79 20 74 68 65 20   is used by the 
8070: 61 6c 67 6f 72 69 74 68 6d 20 66 6f 72 20 72 6f  algorithm for ro
8080: 6c 6c 69 6e 67 20 62 61 63 6b 20 61 20 6a 6f 75  lling back a jou
8090: 72 6e 61 6c 20 66 69 6c 65 0a 20 20 2a 2a 20 61  rnal file.  ** a
80a0: 66 74 65 72 20 61 20 63 72 61 73 68 2e 0a 20 20  fter a crash..  
80b0: 2a 2a 0a 20 20 2a 2a 20 41 6e 20 45 58 43 4c 55  **.  ** An EXCLU
80c0: 53 49 56 45 20 6c 6f 63 6b 2c 20 6f 62 74 61 69  SIVE lock, obtai
80d0: 6e 65 64 20 61 66 74 65 72 20 61 20 50 45 4e 44  ned after a PEND
80e0: 49 4e 47 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64  ING lock is held
80f0: 2c 20 69 73 0a 20 20 2a 2a 20 69 6d 70 6c 65 6d  , is.  ** implem
8100: 65 6e 74 65 64 20 62 79 20 6f 62 74 61 69 6e 69  ented by obtaini
8110: 6e 67 20 61 20 77 72 69 74 65 2d 6c 6f 63 6b 20  ng a write-lock 
8120: 6f 6e 20 74 68 65 20 65 6e 74 69 72 65 20 27 73  on the entire 's
8130: 68 61 72 65 64 20 62 79 74 65 0a 20 20 2a 2a 20  hared byte.  ** 
8140: 72 61 6e 67 65 27 2e 20 53 69 6e 63 65 20 61 6c  range'. Since al
8150: 6c 20 6f 74 68 65 72 20 6c 6f 63 6b 73 20 72 65  l other locks re
8160: 71 75 69 72 65 20 61 20 72 65 61 64 2d 6c 6f 63  quire a read-loc
8170: 6b 20 6f 6e 20 6f 6e 65 20 6f 66 20 74 68 65 20  k on one of the 
8180: 62 79 74 65 73 0a 20 20 2a 2a 20 77 69 74 68 69  bytes.  ** withi
8190: 6e 20 74 68 69 73 20 72 61 6e 67 65 2c 20 74 68  n this range, th
81a0: 69 73 20 65 6e 73 75 72 65 73 20 74 68 61 74 20  is ensures that 
81b0: 6e 6f 20 6f 74 68 65 72 20 6c 6f 63 6b 73 20 61  no other locks a
81c0: 72 65 20 68 65 6c 64 20 6f 6e 20 74 68 65 0a 20  re held on the. 
81d0: 20 2a 2a 20 64 61 74 61 62 61 73 65 2e 20 0a 20   ** database. . 
81e0: 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 72 65 61   **.  ** The rea
81f0: 73 6f 6e 20 61 20 73 69 6e 67 6c 65 20 62 79 74  son a single byt
8200: 65 20 63 61 6e 6e 6f 74 20 62 65 20 75 73 65 64  e cannot be used
8210: 20 69 6e 73 74 65 61 64 20 6f 66 20 74 68 65 20   instead of the 
8220: 27 73 68 61 72 65 64 20 62 79 74 65 0a 20 20 2a  'shared byte.  *
8230: 2a 20 72 61 6e 67 65 27 20 69 73 20 74 68 61 74  * range' is that
8240: 20 73 6f 6d 65 20 76 65 72 73 69 6f 6e 73 20 6f   some versions o
8250: 66 20 77 69 6e 64 6f 77 73 20 64 6f 20 6e 6f 74  f windows do not
8260: 20 73 75 70 70 6f 72 74 20 72 65 61 64 2d 6c 6f   support read-lo
8270: 63 6b 73 2e 20 42 79 0a 20 20 2a 2a 20 6c 6f 63  cks. By.  ** loc
8280: 6b 69 6e 67 20 61 20 72 61 6e 64 6f 6d 20 62 79  king a random by
8290: 74 65 20 66 72 6f 6d 20 61 20 72 61 6e 67 65 2c  te from a range,
82a0: 20 63 6f 6e 63 75 72 72 65 6e 74 20 53 48 41 52   concurrent SHAR
82b0: 45 44 20 6c 6f 63 6b 73 20 6d 61 79 20 65 78 69  ED locks may exi
82c0: 73 74 0a 20 20 2a 2a 20 65 76 65 6e 20 69 66 20  st.  ** even if 
82d0: 74 68 65 20 6c 6f 63 6b 69 6e 67 20 70 72 69 6d  the locking prim
82e0: 69 74 69 76 65 20 75 73 65 64 20 69 73 20 61 6c  itive used is al
82f0: 77 61 79 73 20 61 20 77 72 69 74 65 2d 6c 6f 63  ways a write-loc
8300: 6b 2e 0a 20 20 2a 2f 0a 20 20 69 6e 74 20 72 63  k..  */.  int rc
8310: 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
8320: 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20  unixFile *pFile 
8330: 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b  = (unixFile*)id;
8340: 0a 20 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f  .  unixInodeInfo
8350: 20 2a 70 49 6e 6f 64 65 20 3d 20 70 46 69 6c 65   *pInode = pFile
8360: 2d 3e 70 49 6e 6f 64 65 3b 0a 20 20 73 74 72 75  ->pInode;.  stru
8370: 63 74 20 66 6c 6f 63 6b 20 6c 6f 63 6b 3b 0a 20  ct flock lock;. 
8380: 20 69 6e 74 20 73 20 3d 20 30 3b 0a 20 20 69 6e   int s = 0;.  in
8390: 74 20 74 45 72 72 6e 6f 20 3d 20 30 3b 0a 0a 20  t tErrno = 0;.. 
83a0: 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 20 29   assert( pFile )
83b0: 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22 4c 4f  ;.  OSTRACE(("LO
83c0: 43 4b 20 20 20 20 25 64 20 25 73 20 77 61 73 20  CK    %d %s was 
83d0: 25 73 28 25 73 2c 25 64 29 20 70 69 64 3d 25 64  %s(%s,%d) pid=%d
83e0: 20 28 75 6e 69 78 29 5c 6e 22 2c 20 70 46 69 6c   (unix)\n", pFil
83f0: 65 2d 3e 68 2c 0a 20 20 20 20 20 20 61 7a 46 69  e->h,.      azFi
8400: 6c 65 4c 6f 63 6b 28 65 46 69 6c 65 4c 6f 63 6b  leLock(eFileLock
8410: 29 2c 20 61 7a 46 69 6c 65 4c 6f 63 6b 28 70 46  ), azFileLock(pF
8420: 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 29 2c  ile->eFileLock),
8430: 0a 20 20 20 20 20 20 61 7a 46 69 6c 65 4c 6f 63  .      azFileLoc
8440: 6b 28 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c  k(pInode->eFileL
8450: 6f 63 6b 29 2c 20 70 49 6e 6f 64 65 2d 3e 6e 53  ock), pInode->nS
8460: 68 61 72 65 64 20 2c 20 67 65 74 70 69 64 28 29  hared , getpid()
8470: 29 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65  ));..  /* If the
8480: 72 65 20 69 73 20 61 6c 72 65 61 64 79 20 61 20  re is already a 
8490: 6c 6f 63 6b 20 6f 66 20 74 68 69 73 20 74 79 70  lock of this typ
84a0: 65 20 6f 72 20 6d 6f 72 65 20 72 65 73 74 72 69  e or more restri
84b0: 63 74 69 76 65 20 6f 6e 20 74 68 65 0a 20 20 2a  ctive on the.  *
84c0: 2a 20 75 6e 69 78 46 69 6c 65 2c 20 64 6f 20 6e  * unixFile, do n
84d0: 6f 74 68 69 6e 67 2e 20 44 6f 6e 27 74 20 75 73  othing. Don't us
84e0: 65 20 74 68 65 20 65 6e 64 5f 6c 6f 63 6b 3a 20  e the end_lock: 
84f0: 65 78 69 74 20 70 61 74 68 2c 20 61 73 0a 20 20  exit path, as.  
8500: 2a 2a 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65  ** unixEnterMute
8510: 78 28 29 20 68 61 73 6e 27 74 20 62 65 65 6e 20  x() hasn't been 
8520: 63 61 6c 6c 65 64 20 79 65 74 2e 0a 20 20 2a 2f  called yet..  */
8530: 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 65 46  .  if( pFile->eF
8540: 69 6c 65 4c 6f 63 6b 3e 3d 65 46 69 6c 65 4c 6f  ileLock>=eFileLo
8550: 63 6b 20 29 7b 0a 20 20 20 20 4f 53 54 52 41 43  ck ){.    OSTRAC
8560: 45 28 28 22 4c 4f 43 4b 20 20 20 20 25 64 20 25  E(("LOCK    %d %
8570: 73 20 6f 6b 20 28 61 6c 72 65 61 64 79 20 68 65  s ok (already he
8580: 6c 64 29 20 28 75 6e 69 78 29 5c 6e 22 2c 20 70  ld) (unix)\n", p
8590: 46 69 6c 65 2d 3e 68 2c 0a 20 20 20 20 20 20 20  File->h,.       
85a0: 20 20 20 20 20 61 7a 46 69 6c 65 4c 6f 63 6b 28       azFileLock(
85b0: 65 46 69 6c 65 4c 6f 63 6b 29 29 29 3b 0a 20 20  eFileLock)));.  
85c0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
85d0: 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61  OK;.  }..  /* Ma
85e0: 6b 65 20 73 75 72 65 20 74 68 65 20 6c 6f 63 6b  ke sure the lock
85f0: 69 6e 67 20 73 65 71 75 65 6e 63 65 20 69 73 20  ing sequence is 
8600: 63 6f 72 72 65 63 74 2e 0a 20 20 2a 2a 20 20 28  correct..  **  (
8610: 31 29 20 57 65 20 6e 65 76 65 72 20 6d 6f 76 65  1) We never move
8620: 20 66 72 6f 6d 20 75 6e 6c 6f 63 6b 65 64 20 74   from unlocked t
8630: 6f 20 61 6e 79 74 68 69 6e 67 20 68 69 67 68 65  o anything highe
8640: 72 20 74 68 61 6e 20 73 68 61 72 65 64 20 6c 6f  r than shared lo
8650: 63 6b 2e 0a 20 20 2a 2a 20 20 28 32 29 20 53 51  ck..  **  (2) SQ
8660: 4c 69 74 65 20 6e 65 76 65 72 20 65 78 70 6c 69  Lite never expli
8670: 63 69 74 6c 79 20 72 65 71 75 65 73 74 73 20 61  citly requests a
8680: 20 70 65 6e 64 69 67 20 6c 6f 63 6b 2e 0a 20 20   pendig lock..  
8690: 2a 2a 20 20 28 33 29 20 41 20 73 68 61 72 65 64  **  (3) A shared
86a0: 20 6c 6f 63 6b 20 69 73 20 61 6c 77 61 79 73 20   lock is always 
86b0: 68 65 6c 64 20 77 68 65 6e 20 61 20 72 65 73 65  held when a rese
86c0: 72 76 65 20 6c 6f 63 6b 20 69 73 20 72 65 71 75  rve lock is requ
86d0: 65 73 74 65 64 2e 0a 20 20 2a 2f 0a 20 20 61 73  ested..  */.  as
86e0: 73 65 72 74 28 20 70 46 69 6c 65 2d 3e 65 46 69  sert( pFile->eFi
86f0: 6c 65 4c 6f 63 6b 21 3d 4e 4f 5f 4c 4f 43 4b 20  leLock!=NO_LOCK 
8700: 7c 7c 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48  || eFileLock==SH
8710: 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61  ARED_LOCK );.  a
8720: 73 73 65 72 74 28 20 65 46 69 6c 65 4c 6f 63 6b  ssert( eFileLock
8730: 21 3d 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 20 29  !=PENDING_LOCK )
8740: 3b 0a 20 20 61 73 73 65 72 74 28 20 65 46 69 6c  ;.  assert( eFil
8750: 65 4c 6f 63 6b 21 3d 52 45 53 45 52 56 45 44 5f  eLock!=RESERVED_
8760: 4c 4f 43 4b 20 7c 7c 20 70 46 69 6c 65 2d 3e 65  LOCK || pFile->e
8770: 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44  FileLock==SHARED
8780: 5f 4c 4f 43 4b 20 29 3b 0a 0a 20 20 2f 2a 20 54  _LOCK );..  /* T
8790: 68 69 73 20 6d 75 74 65 78 20 69 73 20 6e 65 65  his mutex is nee
87a0: 64 65 64 20 62 65 63 61 75 73 65 20 70 46 69 6c  ded because pFil
87b0: 65 2d 3e 70 49 6e 6f 64 65 20 69 73 20 73 68 61  e->pInode is sha
87c0: 72 65 64 20 61 63 72 6f 73 73 20 74 68 72 65 61  red across threa
87d0: 64 73 0a 20 20 2a 2f 0a 20 20 75 6e 69 78 45 6e  ds.  */.  unixEn
87e0: 74 65 72 4d 75 74 65 78 28 29 3b 0a 20 20 70 49  terMutex();.  pI
87f0: 6e 6f 64 65 20 3d 20 70 46 69 6c 65 2d 3e 70 49  node = pFile->pI
8800: 6e 6f 64 65 3b 0a 0a 20 20 2f 2a 20 49 66 20 73  node;..  /* If s
8810: 6f 6d 65 20 74 68 72 65 61 64 20 75 73 69 6e 67  ome thread using
8820: 20 74 68 69 73 20 50 49 44 20 68 61 73 20 61 20   this PID has a 
8830: 6c 6f 63 6b 20 76 69 61 20 61 20 64 69 66 66 65  lock via a diffe
8840: 72 65 6e 74 20 75 6e 69 78 46 69 6c 65 2a 0a 20  rent unixFile*. 
8850: 20 2a 2a 20 68 61 6e 64 6c 65 20 74 68 61 74 20   ** handle that 
8860: 70 72 65 63 6c 75 64 65 73 20 74 68 65 20 72 65  precludes the re
8870: 71 75 65 73 74 65 64 20 6c 6f 63 6b 2c 20 72 65  quested lock, re
8880: 74 75 72 6e 20 42 55 53 59 2e 0a 20 20 2a 2f 0a  turn BUSY..  */.
8890: 20 20 69 66 28 20 28 70 46 69 6c 65 2d 3e 65 46    if( (pFile->eF
88a0: 69 6c 65 4c 6f 63 6b 21 3d 70 49 6e 6f 64 65 2d  ileLock!=pInode-
88b0: 3e 65 46 69 6c 65 4c 6f 63 6b 20 26 26 20 0a 20  >eFileLock && . 
88c0: 20 20 20 20 20 20 20 20 20 28 70 49 6e 6f 64 65           (pInode
88d0: 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3e 3d 50 45 4e  ->eFileLock>=PEN
88e0: 44 49 4e 47 5f 4c 4f 43 4b 20 7c 7c 20 65 46 69  DING_LOCK || eFi
88f0: 6c 65 4c 6f 63 6b 3e 53 48 41 52 45 44 5f 4c 4f  leLock>SHARED_LO
8900: 43 4b 29 29 0a 20 20 29 7b 0a 20 20 20 20 72 63  CK)).  ){.    rc
8910: 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a   = SQLITE_BUSY;.
8920: 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 6c 6f 63      goto end_loc
8930: 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20  k;.  }..  /* If 
8940: 61 20 53 48 41 52 45 44 20 6c 6f 63 6b 20 69 73  a SHARED lock is
8950: 20 72 65 71 75 65 73 74 65 64 2c 20 61 6e 64 20   requested, and 
8960: 73 6f 6d 65 20 74 68 72 65 61 64 20 75 73 69 6e  some thread usin
8970: 67 20 74 68 69 73 20 50 49 44 20 61 6c 72 65 61  g this PID alrea
8980: 64 79 0a 20 20 2a 2a 20 68 61 73 20 61 20 53 48  dy.  ** has a SH
8990: 41 52 45 44 20 6f 72 20 52 45 53 45 52 56 45 44  ARED or RESERVED
89a0: 20 6c 6f 63 6b 2c 20 74 68 65 6e 20 69 6e 63 72   lock, then incr
89b0: 65 6d 65 6e 74 20 72 65 66 65 72 65 6e 63 65 20  ement reference 
89c0: 63 6f 75 6e 74 73 20 61 6e 64 0a 20 20 2a 2a 20  counts and.  ** 
89d0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
89e0: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65 46 69  ..  */.  if( eFi
89f0: 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c  leLock==SHARED_L
8a00: 4f 43 4b 20 26 26 20 0a 20 20 20 20 20 20 28 70  OCK && .      (p
8a10: 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  Inode->eFileLock
8a20: 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 7c 7c  ==SHARED_LOCK ||
8a30: 20 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f   pInode->eFileLo
8a40: 63 6b 3d 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43  ck==RESERVED_LOC
8a50: 4b 29 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  K) ){.    assert
8a60: 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41  ( eFileLock==SHA
8a70: 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20  RED_LOCK );.    
8a80: 61 73 73 65 72 74 28 20 70 46 69 6c 65 2d 3e 65  assert( pFile->e
8a90: 46 69 6c 65 4c 6f 63 6b 3d 3d 30 20 29 3b 0a 20  FileLock==0 );. 
8aa0: 20 20 20 61 73 73 65 72 74 28 20 70 49 6e 6f 64     assert( pInod
8ab0: 65 2d 3e 6e 53 68 61 72 65 64 3e 30 20 29 3b 0a  e->nShared>0 );.
8ac0: 20 20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65      pFile->eFile
8ad0: 4c 6f 63 6b 20 3d 20 53 48 41 52 45 44 5f 4c 4f  Lock = SHARED_LO
8ae0: 43 4b 3b 0a 20 20 20 20 70 49 6e 6f 64 65 2d 3e  CK;.    pInode->
8af0: 6e 53 68 61 72 65 64 2b 2b 3b 0a 20 20 20 20 70  nShared++;.    p
8b00: 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 2b 2b 3b 0a  Inode->nLock++;.
8b10: 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 6c 6f 63      goto end_loc
8b20: 6b 3b 0a 20 20 7d 0a 0a 0a 20 20 2f 2a 20 41 20  k;.  }...  /* A 
8b30: 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 20 69 73 20  PENDING lock is 
8b40: 6e 65 65 64 65 64 20 62 65 66 6f 72 65 20 61 63  needed before ac
8b50: 71 75 69 72 69 6e 67 20 61 20 53 48 41 52 45 44  quiring a SHARED
8b60: 20 6c 6f 63 6b 20 61 6e 64 20 62 65 66 6f 72 65   lock and before
8b70: 0a 20 20 2a 2a 20 61 63 71 75 69 72 69 6e 67 20  .  ** acquiring 
8b80: 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63  an EXCLUSIVE loc
8b90: 6b 2e 20 20 46 6f 72 20 74 68 65 20 53 48 41 52  k.  For the SHAR
8ba0: 45 44 20 6c 6f 63 6b 2c 20 74 68 65 20 50 45 4e  ED lock, the PEN
8bb0: 44 49 4e 47 20 77 69 6c 6c 0a 20 20 2a 2a 20 62  DING will.  ** b
8bc0: 65 20 72 65 6c 65 61 73 65 64 2e 0a 20 20 2a 2f  e released..  */
8bd0: 0a 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20  .  lock.l_len = 
8be0: 31 4c 3b 0a 20 20 6c 6f 63 6b 2e 6c 5f 77 68 65  1L;.  lock.l_whe
8bf0: 6e 63 65 20 3d 20 53 45 45 4b 5f 53 45 54 3b 0a  nce = SEEK_SET;.
8c00: 20 20 69 66 28 20 65 46 69 6c 65 4c 6f 63 6b 3d    if( eFileLock=
8c10: 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 0a 20 20  =SHARED_LOCK .  
8c20: 20 20 20 20 7c 7c 20 28 65 46 69 6c 65 4c 6f 63      || (eFileLoc
8c30: 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43  k==EXCLUSIVE_LOC
8c40: 4b 20 26 26 20 70 46 69 6c 65 2d 3e 65 46 69 6c  K && pFile->eFil
8c50: 65 4c 6f 63 6b 3c 50 45 4e 44 49 4e 47 5f 4c 4f  eLock<PENDING_LO
8c60: 43 4b 29 0a 20 20 29 7b 0a 20 20 20 20 6c 6f 63  CK).  ){.    loc
8c70: 6b 2e 6c 5f 74 79 70 65 20 3d 20 28 65 46 69 6c  k.l_type = (eFil
8c80: 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f  eLock==SHARED_LO
8c90: 43 4b 3f 46 5f 52 44 4c 43 4b 3a 46 5f 57 52 4c  CK?F_RDLCK:F_WRL
8ca0: 43 4b 29 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f  CK);.    lock.l_
8cb0: 73 74 61 72 74 20 3d 20 50 45 4e 44 49 4e 47 5f  start = PENDING_
8cc0: 42 59 54 45 3b 0a 20 20 20 20 73 20 3d 20 66 63  BYTE;.    s = fc
8cd0: 6e 74 6c 28 70 46 69 6c 65 2d 3e 68 2c 20 46 5f  ntl(pFile->h, F_
8ce0: 53 45 54 4c 4b 2c 20 26 6c 6f 63 6b 29 3b 0a 20  SETLK, &lock);. 
8cf0: 20 20 20 69 66 28 20 73 3d 3d 28 2d 31 29 20 29     if( s==(-1) )
8d00: 7b 0a 20 20 20 20 20 20 74 45 72 72 6e 6f 20 3d  {.      tErrno =
8d10: 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20 72 63   errno;.      rc
8d20: 20 3d 20 73 71 6c 69 74 65 45 72 72 6f 72 46 72   = sqliteErrorFr
8d30: 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28 74 45 72  omPosixError(tEr
8d40: 72 6e 6f 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52  rno, SQLITE_IOER
8d50: 52 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 69  R_LOCK);.      i
8d60: 66 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52  f( IS_LOCK_ERROR
8d70: 28 72 63 29 20 29 7b 0a 20 20 20 20 20 20 20 20  (rc) ){.        
8d80: 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f  pFile->lastErrno
8d90: 20 3d 20 74 45 72 72 6e 6f 3b 0a 20 20 20 20 20   = tErrno;.     
8da0: 20 7d 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 6e   }.      goto en
8db0: 64 5f 6c 6f 63 6b 3b 0a 20 20 20 20 7d 0a 20 20  d_lock;.    }.  
8dc0: 7d 0a 0a 0a 20 20 2f 2a 20 49 66 20 63 6f 6e 74  }...  /* If cont
8dd0: 72 6f 6c 20 67 65 74 73 20 74 6f 20 74 68 69 73  rol gets to this
8de0: 20 70 6f 69 6e 74 2c 20 74 68 65 6e 20 61 63 74   point, then act
8df0: 75 61 6c 6c 79 20 67 6f 20 61 68 65 61 64 20 61  ually go ahead a
8e00: 6e 64 20 6d 61 6b 65 0a 20 20 2a 2a 20 6f 70 65  nd make.  ** ope
8e10: 72 61 74 69 6e 67 20 73 79 73 74 65 6d 20 63 61  rating system ca
8e20: 6c 6c 73 20 66 6f 72 20 74 68 65 20 73 70 65 63  lls for the spec
8e30: 69 66 69 65 64 20 6c 6f 63 6b 2e 0a 20 20 2a 2f  ified lock..  */
8e40: 0a 20 20 69 66 28 20 65 46 69 6c 65 4c 6f 63 6b  .  if( eFileLock
8e50: 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 7b  ==SHARED_LOCK ){
8e60: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 49 6e  .    assert( pIn
8e70: 6f 64 65 2d 3e 6e 53 68 61 72 65 64 3d 3d 30 20  ode->nShared==0 
8e80: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
8e90: 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  Inode->eFileLock
8ea0: 3d 3d 30 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 4e  ==0 );..    /* N
8eb0: 6f 77 20 67 65 74 20 74 68 65 20 72 65 61 64 2d  ow get the read-
8ec0: 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20 6c 6f 63 6b  lock */.    lock
8ed0: 2e 6c 5f 73 74 61 72 74 20 3d 20 53 48 41 52 45  .l_start = SHARE
8ee0: 44 5f 46 49 52 53 54 3b 0a 20 20 20 20 6c 6f 63  D_FIRST;.    loc
8ef0: 6b 2e 6c 5f 6c 65 6e 20 3d 20 53 48 41 52 45 44  k.l_len = SHARED
8f00: 5f 53 49 5a 45 3b 0a 20 20 20 20 69 66 28 20 28  _SIZE;.    if( (
8f10: 73 20 3d 20 66 63 6e 74 6c 28 70 46 69 6c 65 2d  s = fcntl(pFile-
8f20: 3e 68 2c 20 46 5f 53 45 54 4c 4b 2c 20 26 6c 6f  >h, F_SETLK, &lo
8f30: 63 6b 29 29 3d 3d 28 2d 31 29 20 29 7b 0a 20 20  ck))==(-1) ){.  
8f40: 20 20 20 20 74 45 72 72 6e 6f 20 3d 20 65 72 72      tErrno = err
8f50: 6e 6f 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2f 2a  no;.    }.    /*
8f60: 20 44 72 6f 70 20 74 68 65 20 74 65 6d 70 6f 72   Drop the tempor
8f70: 61 72 79 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b  ary PENDING lock
8f80: 20 2a 2f 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73   */.    lock.l_s
8f90: 74 61 72 74 20 3d 20 50 45 4e 44 49 4e 47 5f 42  tart = PENDING_B
8fa0: 59 54 45 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f  YTE;.    lock.l_
8fb0: 6c 65 6e 20 3d 20 31 4c 3b 0a 20 20 20 20 6c 6f  len = 1L;.    lo
8fc0: 63 6b 2e 6c 5f 74 79 70 65 20 3d 20 46 5f 55 4e  ck.l_type = F_UN
8fd0: 4c 43 4b 3b 0a 20 20 20 20 69 66 28 20 66 63 6e  LCK;.    if( fcn
8fe0: 74 6c 28 70 46 69 6c 65 2d 3e 68 2c 20 46 5f 53  tl(pFile->h, F_S
8ff0: 45 54 4c 4b 2c 20 26 6c 6f 63 6b 29 21 3d 30 20  ETLK, &lock)!=0 
9000: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73 20 21  ){.      if( s !
9010: 3d 20 2d 31 20 29 7b 0a 20 20 20 20 20 20 20 20  = -1 ){.        
9020: 2f 2a 20 54 68 69 73 20 63 6f 75 6c 64 20 68 61  /* This could ha
9030: 70 70 65 6e 20 77 69 74 68 20 61 20 6e 65 74 77  ppen with a netw
9040: 6f 72 6b 20 6d 6f 75 6e 74 20 2a 2f 0a 20 20 20  ork mount */.   
9050: 20 20 20 20 20 74 45 72 72 6e 6f 20 3d 20 65 72       tErrno = er
9060: 72 6e 6f 3b 20 0a 20 20 20 20 20 20 20 20 72 63  rno; .        rc
9070: 20 3d 20 73 71 6c 69 74 65 45 72 72 6f 72 46 72   = sqliteErrorFr
9080: 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28 74 45 72  omPosixError(tEr
9090: 72 6e 6f 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52  rno, SQLITE_IOER
90a0: 52 5f 55 4e 4c 4f 43 4b 29 3b 20 0a 20 20 20 20  R_UNLOCK); .    
90b0: 20 20 20 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f      if( IS_LOCK_
90c0: 45 52 52 4f 52 28 72 63 29 20 29 7b 0a 20 20 20  ERROR(rc) ){.   
90d0: 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61         pFile->la
90e0: 73 74 45 72 72 6e 6f 20 3d 20 74 45 72 72 6e 6f  stErrno = tErrno
90f0: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
9100: 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 6c 6f 63      goto end_loc
9110: 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  k;.      }.    }
9120: 0a 20 20 20 20 69 66 28 20 73 3d 3d 28 2d 31 29  .    if( s==(-1)
9130: 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73   ){.      rc = s
9140: 71 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d 50 6f  qliteErrorFromPo
9150: 73 69 78 45 72 72 6f 72 28 74 45 72 72 6e 6f 2c  sixError(tErrno,
9160: 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4c 4f   SQLITE_IOERR_LO
9170: 43 4b 29 3b 0a 20 20 20 20 20 20 69 66 28 20 49  CK);.      if( I
9180: 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 72 63 29  S_LOCK_ERROR(rc)
9190: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 46 69 6c   ){.        pFil
91a0: 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 74  e->lastErrno = t
91b0: 45 72 72 6e 6f 3b 0a 20 20 20 20 20 20 7d 0a 20  Errno;.      }. 
91c0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
91d0: 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  pFile->eFileLock
91e0: 20 3d 20 53 48 41 52 45 44 5f 4c 4f 43 4b 3b 0a   = SHARED_LOCK;.
91f0: 20 20 20 20 20 20 70 49 6e 6f 64 65 2d 3e 6e 4c        pInode->nL
9200: 6f 63 6b 2b 2b 3b 0a 20 20 20 20 20 20 70 49 6e  ock++;.      pIn
9210: 6f 64 65 2d 3e 6e 53 68 61 72 65 64 20 3d 20 31  ode->nShared = 1
9220: 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20  ;.    }.  }else 
9230: 69 66 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 45  if( eFileLock==E
9240: 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 26 26  XCLUSIVE_LOCK &&
9250: 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64   pInode->nShared
9260: 3e 31 20 29 7b 0a 20 20 20 20 2f 2a 20 57 65 20  >1 ){.    /* We 
9270: 61 72 65 20 74 72 79 69 6e 67 20 66 6f 72 20 61  are trying for a
9280: 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b  n exclusive lock
9290: 20 62 75 74 20 61 6e 6f 74 68 65 72 20 74 68 72   but another thr
92a0: 65 61 64 20 69 6e 20 74 68 69 73 0a 20 20 20 20  ead in this.    
92b0: 2a 2a 20 73 61 6d 65 20 70 72 6f 63 65 73 73 20  ** same process 
92c0: 69 73 20 73 74 69 6c 6c 20 68 6f 6c 64 69 6e 67  is still holding
92d0: 20 61 20 73 68 61 72 65 64 20 6c 6f 63 6b 2e 20   a shared lock. 
92e0: 2a 2f 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  */.    rc = SQLI
92f0: 54 45 5f 42 55 53 59 3b 0a 20 20 7d 65 6c 73 65  TE_BUSY;.  }else
9300: 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 72 65 71  {.    /* The req
9310: 75 65 73 74 20 77 61 73 20 66 6f 72 20 61 20 52  uest was for a R
9320: 45 53 45 52 56 45 44 20 6f 72 20 45 58 43 4c 55  ESERVED or EXCLU
9330: 53 49 56 45 20 6c 6f 63 6b 2e 20 20 49 74 20 69  SIVE lock.  It i
9340: 73 0a 20 20 20 20 2a 2a 20 61 73 73 75 6d 65 64  s.    ** assumed
9350: 20 74 68 61 74 20 74 68 65 72 65 20 69 73 20 61   that there is a
9360: 20 53 48 41 52 45 44 20 6f 72 20 67 72 65 61 74   SHARED or great
9370: 65 72 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 66  er lock on the f
9380: 69 6c 65 0a 20 20 20 20 2a 2a 20 61 6c 72 65 61  ile.    ** alrea
9390: 64 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61  dy..    */.    a
93a0: 73 73 65 72 74 28 20 30 21 3d 70 46 69 6c 65 2d  ssert( 0!=pFile-
93b0: 3e 65 46 69 6c 65 4c 6f 63 6b 20 29 3b 0a 20 20  >eFileLock );.  
93c0: 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d 20    lock.l_type = 
93d0: 46 5f 57 52 4c 43 4b 3b 0a 20 20 20 20 73 77 69  F_WRLCK;.    swi
93e0: 74 63 68 28 20 65 46 69 6c 65 4c 6f 63 6b 20 29  tch( eFileLock )
93f0: 7b 0a 20 20 20 20 20 20 63 61 73 65 20 52 45 53  {.      case RES
9400: 45 52 56 45 44 5f 4c 4f 43 4b 3a 0a 20 20 20 20  ERVED_LOCK:.    
9410: 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74      lock.l_start
9420: 20 3d 20 52 45 53 45 52 56 45 44 5f 42 59 54 45   = RESERVED_BYTE
9430: 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;.        break;
9440: 0a 20 20 20 20 20 20 63 61 73 65 20 45 58 43 4c  .      case EXCL
9450: 55 53 49 56 45 5f 4c 4f 43 4b 3a 0a 20 20 20 20  USIVE_LOCK:.    
9460: 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74      lock.l_start
9470: 20 3d 20 53 48 41 52 45 44 5f 46 49 52 53 54 3b   = SHARED_FIRST;
9480: 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f  .        lock.l_
9490: 6c 65 6e 20 3d 20 53 48 41 52 45 44 5f 53 49 5a  len = SHARED_SIZ
94a0: 45 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  E;.        break
94b0: 3b 0a 20 20 20 20 20 20 64 65 66 61 75 6c 74 3a  ;.      default:
94c0: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
94d0: 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 20  0);.    }.    s 
94e0: 3d 20 66 63 6e 74 6c 28 70 46 69 6c 65 2d 3e 68  = fcntl(pFile->h
94f0: 2c 20 46 5f 53 45 54 4c 4b 2c 20 26 6c 6f 63 6b  , F_SETLK, &lock
9500: 29 3b 0a 20 20 20 20 69 66 28 20 73 3d 3d 28 2d  );.    if( s==(-
9510: 31 29 20 29 7b 0a 20 20 20 20 20 20 74 45 72 72  1) ){.      tErr
9520: 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20  no = errno;.    
9530: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 45 72 72    rc = sqliteErr
9540: 6f 72 46 72 6f 6d 50 6f 73 69 78 45 72 72 6f 72  orFromPosixError
9550: 28 74 45 72 72 6e 6f 2c 20 53 51 4c 49 54 45 5f  (tErrno, SQLITE_
9560: 49 4f 45 52 52 5f 4c 4f 43 4b 29 3b 0a 20 20 20  IOERR_LOCK);.   
9570: 20 20 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45     if( IS_LOCK_E
9580: 52 52 4f 52 28 72 63 29 20 29 7b 0a 20 20 20 20  RROR(rc) ){.    
9590: 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45      pFile->lastE
95a0: 72 72 6e 6f 20 3d 20 74 45 72 72 6e 6f 3b 0a 20  rrno = tErrno;. 
95b0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
95c0: 0a 20 20 0a 0a 23 69 66 6e 64 65 66 20 4e 44 45  .  ..#ifndef NDE
95d0: 42 55 47 0a 20 20 2f 2a 20 53 65 74 20 75 70 20  BUG.  /* Set up 
95e0: 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2d  the transaction-
95f0: 63 6f 75 6e 74 65 72 20 63 68 61 6e 67 65 20 63  counter change c
9600: 68 65 63 6b 69 6e 67 20 66 6c 61 67 73 20 77 68  hecking flags wh
9610: 65 6e 0a 20 20 2a 2a 20 74 72 61 6e 73 69 74 69  en.  ** transiti
9620: 6f 6e 69 6e 67 20 66 72 6f 6d 20 61 20 53 48 41  oning from a SHA
9630: 52 45 44 20 74 6f 20 61 20 52 45 53 45 52 56 45  RED to a RESERVE
9640: 44 20 6c 6f 63 6b 2e 20 20 54 68 65 20 63 68 61  D lock.  The cha
9650: 6e 67 65 0a 20 20 2a 2a 20 66 72 6f 6d 20 53 48  nge.  ** from SH
9660: 41 52 45 44 20 74 6f 20 52 45 53 45 52 56 45 44  ARED to RESERVED
9670: 20 6d 61 72 6b 73 20 74 68 65 20 62 65 67 69 6e   marks the begin
9680: 6e 69 6e 67 20 6f 66 20 61 20 6e 6f 72 6d 61 6c  ning of a normal
9690: 0a 20 20 2a 2a 20 77 72 69 74 65 20 6f 70 65 72  .  ** write oper
96a0: 61 74 69 6f 6e 20 28 6e 6f 74 20 61 20 68 6f 74  ation (not a hot
96b0: 20 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61 63   journal rollbac
96c0: 6b 29 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 72  k)..  */.  if( r
96d0: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 0a 20 20 20  c==SQLITE_OK.   
96e0: 26 26 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c  && pFile->eFileL
96f0: 6f 63 6b 3c 3d 53 48 41 52 45 44 5f 4c 4f 43 4b  ock<=SHARED_LOCK
9700: 0a 20 20 20 26 26 20 65 46 69 6c 65 4c 6f 63 6b  .   && eFileLock
9710: 3d 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 0a  ==RESERVED_LOCK.
9720: 20 20 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e    ){.    pFile->
9730: 74 72 61 6e 73 43 6e 74 72 43 68 6e 67 20 3d 20  transCntrChng = 
9740: 30 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 64 62  0;.    pFile->db
9750: 55 70 64 61 74 65 20 3d 20 30 3b 0a 20 20 20 20  Update = 0;.    
9760: 70 46 69 6c 65 2d 3e 69 6e 4e 6f 72 6d 61 6c 57  pFile->inNormalW
9770: 72 69 74 65 20 3d 20 31 3b 0a 20 20 7d 0a 23 65  rite = 1;.  }.#e
9780: 6e 64 69 66 0a 0a 0a 20 20 69 66 28 20 72 63 3d  ndif...  if( rc=
9790: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
97a0: 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f    pFile->eFileLo
97b0: 63 6b 20 3d 20 65 46 69 6c 65 4c 6f 63 6b 3b 0a  ck = eFileLock;.
97c0: 20 20 20 20 70 49 6e 6f 64 65 2d 3e 65 46 69 6c      pInode->eFil
97d0: 65 4c 6f 63 6b 20 3d 20 65 46 69 6c 65 4c 6f 63  eLock = eFileLoc
97e0: 6b 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 65  k;.  }else if( e
97f0: 46 69 6c 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53  FileLock==EXCLUS
9800: 49 56 45 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20  IVE_LOCK ){.    
9810: 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  pFile->eFileLock
9820: 20 3d 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 3b   = PENDING_LOCK;
9830: 0a 20 20 20 20 70 49 6e 6f 64 65 2d 3e 65 46 69  .    pInode->eFi
9840: 6c 65 4c 6f 63 6b 20 3d 20 50 45 4e 44 49 4e 47  leLock = PENDING
9850: 5f 4c 4f 43 4b 3b 0a 20 20 7d 0a 0a 65 6e 64 5f  _LOCK;.  }..end_
9860: 6c 6f 63 6b 3a 0a 20 20 75 6e 69 78 4c 65 61 76  lock:.  unixLeav
9870: 65 4d 75 74 65 78 28 29 3b 0a 20 20 4f 53 54 52  eMutex();.  OSTR
9880: 41 43 45 28 28 22 4c 4f 43 4b 20 20 20 20 25 64  ACE(("LOCK    %d
9890: 20 25 73 20 25 73 20 28 75 6e 69 78 29 5c 6e 22   %s %s (unix)\n"
98a0: 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 61 7a 46 69  , pFile->h, azFi
98b0: 6c 65 4c 6f 63 6b 28 65 46 69 6c 65 4c 6f 63 6b  leLock(eFileLock
98c0: 29 2c 20 0a 20 20 20 20 20 20 72 63 3d 3d 53 51  ), .      rc==SQ
98d0: 4c 49 54 45 5f 4f 4b 20 3f 20 22 6f 6b 22 20 3a  LITE_OK ? "ok" :
98e0: 20 22 66 61 69 6c 65 64 22 29 29 3b 0a 20 20 72   "failed"));.  r
98f0: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
9900: 2a 2a 20 43 6c 6f 73 65 20 61 6c 6c 20 66 69 6c  ** Close all fil
9910: 65 20 64 65 73 63 72 69 70 74 6f 72 73 20 61 63  e descriptors ac
9920: 63 75 6d 75 61 74 65 64 20 69 6e 20 74 68 65 20  cumuated in the 
9930: 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 2d 3e 70  unixInodeInfo->p
9940: 55 6e 75 73 65 64 20 6c 69 73 74 2e 0a 2a 2a 20  Unused list..** 
9950: 49 66 20 61 6c 6c 20 73 75 63 68 20 66 69 6c 65  If all such file
9960: 20 64 65 73 63 72 69 70 74 6f 72 73 20 61 72 65   descriptors are
9970: 20 63 6c 6f 73 65 64 20 77 69 74 68 6f 75 74 20   closed without 
9980: 65 72 72 6f 72 2c 20 74 68 65 20 6c 69 73 74 20  error, the list 
9990: 69 73 0a 2a 2a 20 63 6c 65 61 72 65 64 20 61 6e  is.** cleared an
99a0: 64 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75  d SQLITE_OK retu
99b0: 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65  rned..**.** Othe
99c0: 72 77 69 73 65 2c 20 69 66 20 61 6e 20 65 72 72  rwise, if an err
99d0: 6f 72 20 6f 63 63 75 72 73 2c 20 74 68 65 6e 20  or occurs, then 
99e0: 73 75 63 63 65 73 73 66 75 6c 6c 79 20 63 6c 6f  successfully clo
99f0: 73 65 64 20 66 69 6c 65 20 64 65 73 63 72 69 70  sed file descrip
9a00: 74 6f 72 0a 2a 2a 20 65 6e 74 72 69 65 73 20 61  tor.** entries a
9a10: 72 65 20 72 65 6d 6f 76 65 64 20 66 72 6f 6d 20  re removed from 
9a20: 74 68 65 20 6c 69 73 74 2c 20 61 6e 64 20 53 51  the list, and SQ
9a30: 4c 49 54 45 5f 49 4f 45 52 52 5f 43 4c 4f 53 45  LITE_IOERR_CLOSE
9a40: 20 72 65 74 75 72 6e 65 64 2e 20 0a 2a 2a 20 6e   returned. .** n
9a50: 6f 74 20 64 65 6c 65 74 65 64 20 61 6e 64 20 53  ot deleted and S
9a60: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43 4c 4f 53  QLITE_IOERR_CLOS
9a70: 45 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 20 0a  E returned..*/ .
9a80: 73 74 61 74 69 63 20 69 6e 74 20 63 6c 6f 73 65  static int close
9a90: 50 65 6e 64 69 6e 67 46 64 73 28 75 6e 69 78 46  PendingFds(unixF
9aa0: 69 6c 65 20 2a 70 46 69 6c 65 29 7b 0a 20 20 69  ile *pFile){.  i
9ab0: 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
9ac0: 4b 3b 0a 20 20 75 6e 69 78 49 6e 6f 64 65 49 6e  K;.  unixInodeIn
9ad0: 66 6f 20 2a 70 49 6e 6f 64 65 20 3d 20 70 46 69  fo *pInode = pFi
9ae0: 6c 65 2d 3e 70 49 6e 6f 64 65 3b 0a 20 20 55 6e  le->pInode;.  Un
9af0: 69 78 55 6e 75 73 65 64 46 64 20 2a 70 45 72 72  ixUnusedFd *pErr
9b00: 6f 72 20 3d 20 30 3b 0a 20 20 55 6e 69 78 55 6e  or = 0;.  UnixUn
9b10: 75 73 65 64 46 64 20 2a 70 3b 0a 20 20 55 6e 69  usedFd *p;.  Uni
9b20: 78 55 6e 75 73 65 64 46 64 20 2a 70 4e 65 78 74  xUnusedFd *pNext
9b30: 3b 0a 20 20 66 6f 72 28 70 3d 70 49 6e 6f 64 65  ;.  for(p=pInode
9b40: 2d 3e 70 55 6e 75 73 65 64 3b 20 70 3b 20 70 3d  ->pUnused; p; p=
9b50: 70 4e 65 78 74 29 7b 0a 20 20 20 20 70 4e 65 78  pNext){.    pNex
9b60: 74 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a 20 20  t = p->pNext;.  
9b70: 20 20 69 66 28 20 63 6c 6f 73 65 28 70 2d 3e 66    if( close(p->f
9b80: 64 29 20 29 7b 0a 20 20 20 20 20 20 70 46 69 6c  d) ){.      pFil
9b90: 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 65  e->lastErrno = e
9ba0: 72 72 6e 6f 3b 0a 20 20 20 20 20 20 72 63 20 3d  rrno;.      rc =
9bb0: 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43 4c   SQLITE_IOERR_CL
9bc0: 4f 53 45 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4e  OSE;.      p->pN
9bd0: 65 78 74 20 3d 20 70 45 72 72 6f 72 3b 0a 20 20  ext = pError;.  
9be0: 20 20 20 20 70 45 72 72 6f 72 20 3d 20 70 3b 0a      pError = p;.
9bf0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
9c00: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 29   sqlite3_free(p)
9c10: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 49  ;.    }.  }.  pI
9c20: 6e 6f 64 65 2d 3e 70 55 6e 75 73 65 64 20 3d 20  node->pUnused = 
9c30: 70 45 72 72 6f 72 3b 0a 20 20 72 65 74 75 72 6e  pError;.  return
9c40: 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64   rc;.}../*.** Ad
9c50: 64 20 74 68 65 20 66 69 6c 65 20 64 65 73 63 72  d the file descr
9c60: 69 70 74 6f 72 20 75 73 65 64 20 62 79 20 66 69  iptor used by fi
9c70: 6c 65 20 68 61 6e 64 6c 65 20 70 46 69 6c 65 20  le handle pFile 
9c80: 74 6f 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e  to the correspon
9c90: 64 69 6e 67 0a 2a 2a 20 70 55 6e 75 73 65 64 20  ding.** pUnused 
9ca0: 6c 69 73 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  list..*/.static 
9cb0: 76 6f 69 64 20 73 65 74 50 65 6e 64 69 6e 67 46  void setPendingF
9cc0: 64 28 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c  d(unixFile *pFil
9cd0: 65 29 7b 0a 20 20 75 6e 69 78 49 6e 6f 64 65 49  e){.  unixInodeI
9ce0: 6e 66 6f 20 2a 70 49 6e 6f 64 65 20 3d 20 70 46  nfo *pInode = pF
9cf0: 69 6c 65 2d 3e 70 49 6e 6f 64 65 3b 0a 20 20 55  ile->pInode;.  U
9d00: 6e 69 78 55 6e 75 73 65 64 46 64 20 2a 70 20 3d  nixUnusedFd *p =
9d10: 20 70 46 69 6c 65 2d 3e 70 55 6e 75 73 65 64 3b   pFile->pUnused;
9d20: 0a 20 20 70 2d 3e 70 4e 65 78 74 20 3d 20 70 49  .  p->pNext = pI
9d30: 6e 6f 64 65 2d 3e 70 55 6e 75 73 65 64 3b 0a 20  node->pUnused;. 
9d40: 20 70 49 6e 6f 64 65 2d 3e 70 55 6e 75 73 65 64   pInode->pUnused
9d50: 20 3d 20 70 3b 0a 20 20 70 46 69 6c 65 2d 3e 68   = p;.  pFile->h
9d60: 20 3d 20 2d 31 3b 0a 20 20 70 46 69 6c 65 2d 3e   = -1;.  pFile->
9d70: 70 55 6e 75 73 65 64 20 3d 20 30 3b 0a 7d 0a 0a  pUnused = 0;.}..
9d80: 2f 2a 0a 2a 2a 20 4c 6f 77 65 72 20 74 68 65 20  /*.** Lower the 
9d90: 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 6e  locking level on
9da0: 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
9db0: 20 70 46 69 6c 65 20 74 6f 20 65 46 69 6c 65 4c   pFile to eFileL
9dc0: 6f 63 6b 2e 20 20 65 46 69 6c 65 4c 6f 63 6b 0a  ock.  eFileLock.
9dd0: 2a 2a 20 6d 75 73 74 20 62 65 20 65 69 74 68 65  ** must be eithe
9de0: 72 20 4e 4f 5f 4c 4f 43 4b 20 6f 72 20 53 48 41  r NO_LOCK or SHA
9df0: 52 45 44 5f 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20  RED_LOCK..**.** 
9e00: 49 66 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c  If the locking l
9e10: 65 76 65 6c 20 6f 66 20 74 68 65 20 66 69 6c 65  evel of the file
9e20: 20 64 65 73 63 72 69 70 74 6f 72 20 69 73 20 61   descriptor is a
9e30: 6c 72 65 61 64 79 20 61 74 20 6f 72 20 62 65 6c  lready at or bel
9e40: 6f 77 0a 2a 2a 20 74 68 65 20 72 65 71 75 65 73  ow.** the reques
9e50: 74 65 64 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65  ted locking leve
9e60: 6c 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  l, this routine 
9e70: 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 20 0a  is a no-op..** .
9e80: 2a 2a 20 49 66 20 68 61 6e 64 6c 65 4e 46 53 55  ** If handleNFSU
9e90: 6e 6c 6f 63 6b 20 69 73 20 74 72 75 65 2c 20 74  nlock is true, t
9ea0: 68 65 6e 20 6f 6e 20 64 6f 77 6e 67 72 61 64 69  hen on downgradi
9eb0: 6e 67 20 61 6e 20 45 58 43 4c 55 53 49 56 45 5f  ng an EXCLUSIVE_
9ec0: 4c 4f 43 4b 20 74 6f 20 53 48 41 52 45 44 0a 2a  LOCK to SHARED.*
9ed0: 2a 20 74 68 65 20 62 79 74 65 20 72 61 6e 67 65  * the byte range
9ee0: 20 69 73 20 64 69 76 69 64 65 64 20 69 6e 74 6f   is divided into
9ef0: 20 32 20 70 61 72 74 73 20 61 6e 64 20 74 68 65   2 parts and the
9f00: 20 66 69 72 73 74 20 70 61 72 74 20 69 73 20 75   first part is u
9f10: 6e 6c 6f 63 6b 65 64 20 74 68 65 6e 0a 2a 2a 20  nlocked then.** 
9f20: 73 65 74 20 74 6f 20 61 20 72 65 61 64 20 6c 6f  set to a read lo
9f30: 63 6b 2c 20 74 68 65 6e 20 74 68 65 20 6f 74 68  ck, then the oth
9f40: 65 72 20 70 61 72 74 20 69 73 20 73 69 6d 70 6c  er part is simpl
9f50: 79 20 75 6e 6c 6f 63 6b 65 64 2e 20 20 54 68 69  y unlocked.  Thi
9f60: 73 20 77 6f 72 6b 73 20 0a 2a 2a 20 61 72 6f 75  s works .** arou
9f70: 6e 64 20 61 20 62 75 67 20 69 6e 20 42 53 44 20  nd a bug in BSD 
9f80: 4e 46 53 20 6c 6f 63 6b 64 20 28 61 6c 73 6f 20  NFS lockd (also 
9f90: 73 65 65 6e 20 6f 6e 20 4d 61 63 4f 53 58 20 31  seen on MacOSX 1
9fa0: 30 2e 33 2b 29 20 74 68 61 74 20 66 61 69 6c 73  0.3+) that fails
9fb0: 20 74 6f 20 0a 2a 2a 20 72 65 6d 6f 76 65 20 74   to .** remove t
9fc0: 68 65 20 77 72 69 74 65 20 6c 6f 63 6b 20 6f 6e  he write lock on
9fd0: 20 61 20 72 65 67 69 6f 6e 20 77 68 65 6e 20 61   a region when a
9fe0: 20 72 65 61 64 20 6c 6f 63 6b 20 69 73 20 73 65   read lock is se
9ff0: 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  t..*/.static int
a000: 20 5f 70 6f 73 69 78 55 6e 6c 6f 63 6b 28 73 71   _posixUnlock(sq
a010: 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20  lite3_file *id, 
a020: 69 6e 74 20 65 46 69 6c 65 4c 6f 63 6b 2c 20 69  int eFileLock, i
a030: 6e 74 20 68 61 6e 64 6c 65 4e 46 53 55 6e 6c 6f  nt handleNFSUnlo
a040: 63 6b 29 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20  ck){.  unixFile 
a050: 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69  *pFile = (unixFi
a060: 6c 65 2a 29 69 64 3b 0a 20 20 75 6e 69 78 49 6e  le*)id;.  unixIn
a070: 6f 64 65 49 6e 66 6f 20 2a 70 49 6e 6f 64 65 3b  odeInfo *pInode;
a080: 0a 20 20 73 74 72 75 63 74 20 66 6c 6f 63 6b 20  .  struct flock 
a090: 6c 6f 63 6b 3b 0a 20 20 69 6e 74 20 72 63 20 3d  lock;.  int rc =
a0a0: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e   SQLITE_OK;.  in
a0b0: 74 20 68 3b 0a 20 20 69 6e 74 20 74 45 72 72 6e  t h;.  int tErrn
a0c0: 6f 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  o;              
a0d0: 20 20 20 20 20 20 20 20 2f 2a 20 45 72 72 6f 72          /* Error
a0e0: 20 63 6f 64 65 20 66 72 6f 6d 20 73 79 73 74 65   code from syste
a0f0: 6d 20 63 61 6c 6c 20 65 72 72 6f 72 73 20 2a 2f  m call errors */
a100: 0a 0a 20 20 61 73 73 65 72 74 28 20 70 46 69 6c  ..  assert( pFil
a110: 65 20 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28  e );.  OSTRACE((
a120: 22 55 4e 4c 4f 43 4b 20 20 25 64 20 25 64 20 77  "UNLOCK  %d %d w
a130: 61 73 20 25 64 28 25 64 2c 25 64 29 20 70 69 64  as %d(%d,%d) pid
a140: 3d 25 64 20 28 75 6e 69 78 29 5c 6e 22 2c 20 70  =%d (unix)\n", p
a150: 46 69 6c 65 2d 3e 68 2c 20 65 46 69 6c 65 4c 6f  File->h, eFileLo
a160: 63 6b 2c 0a 20 20 20 20 20 20 70 46 69 6c 65 2d  ck,.      pFile-
a170: 3e 65 46 69 6c 65 4c 6f 63 6b 2c 20 70 46 69 6c  >eFileLock, pFil
a180: 65 2d 3e 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65  e->pInode->eFile
a190: 4c 6f 63 6b 2c 20 70 46 69 6c 65 2d 3e 70 49 6e  Lock, pFile->pIn
a1a0: 6f 64 65 2d 3e 6e 53 68 61 72 65 64 2c 0a 20 20  ode->nShared,.  
a1b0: 20 20 20 20 67 65 74 70 69 64 28 29 29 29 3b 0a      getpid()));.
a1c0: 0a 20 20 61 73 73 65 72 74 28 20 65 46 69 6c 65  .  assert( eFile
a1d0: 4c 6f 63 6b 3c 3d 53 48 41 52 45 44 5f 4c 4f 43  Lock<=SHARED_LOC
a1e0: 4b 20 29 3b 0a 20 20 69 66 28 20 70 46 69 6c 65  K );.  if( pFile
a1f0: 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3c 3d 65 46 69  ->eFileLock<=eFi
a200: 6c 65 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 72 65  leLock ){.    re
a210: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
a220: 20 20 7d 0a 20 20 75 6e 69 78 45 6e 74 65 72 4d    }.  unixEnterM
a230: 75 74 65 78 28 29 3b 0a 20 20 68 20 3d 20 70 46  utex();.  h = pF
a240: 69 6c 65 2d 3e 68 3b 0a 20 20 70 49 6e 6f 64 65  ile->h;.  pInode
a250: 20 3d 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65   = pFile->pInode
a260: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 49 6e 6f  ;.  assert( pIno
a270: 64 65 2d 3e 6e 53 68 61 72 65 64 21 3d 30 20 29  de->nShared!=0 )
a280: 3b 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 65  ;.  if( pFile->e
a290: 46 69 6c 65 4c 6f 63 6b 3e 53 48 41 52 45 44 5f  FileLock>SHARED_
a2a0: 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 61 73 73 65  LOCK ){.    asse
a2b0: 72 74 28 20 70 49 6e 6f 64 65 2d 3e 65 46 69 6c  rt( pInode->eFil
a2c0: 65 4c 6f 63 6b 3d 3d 70 46 69 6c 65 2d 3e 65 46  eLock==pFile->eF
a2d0: 69 6c 65 4c 6f 63 6b 20 29 3b 0a 20 20 20 20 53  ileLock );.    S
a2e0: 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 42 65  imulateIOErrorBe
a2f0: 6e 69 67 6e 28 31 29 3b 0a 20 20 20 20 53 69 6d  nign(1);.    Sim
a300: 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 68 3d  ulateIOError( h=
a310: 28 2d 31 29 20 29 0a 20 20 20 20 53 69 6d 75 6c  (-1) ).    Simul
a320: 61 74 65 49 4f 45 72 72 6f 72 42 65 6e 69 67 6e  ateIOErrorBenign
a330: 28 30 29 3b 0a 0a 23 69 66 6e 64 65 66 20 4e 44  (0);..#ifndef ND
a340: 45 42 55 47 0a 20 20 20 20 2f 2a 20 57 68 65 6e  EBUG.    /* When
a350: 20 72 65 64 75 63 69 6e 67 20 61 20 6c 6f 63 6b   reducing a lock
a360: 20 73 75 63 68 20 74 68 61 74 20 6f 74 68 65 72   such that other
a370: 20 70 72 6f 63 65 73 73 65 73 20 63 61 6e 20 73   processes can s
a380: 74 61 72 74 0a 20 20 20 20 2a 2a 20 72 65 61 64  tart.    ** read
a390: 69 6e 67 20 74 68 65 20 64 61 74 61 62 61 73 65  ing the database
a3a0: 20 66 69 6c 65 20 61 67 61 69 6e 2c 20 6d 61 6b   file again, mak
a3b0: 65 20 73 75 72 65 20 74 68 61 74 20 74 68 65 0a  e sure that the.
a3c0: 20 20 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69      ** transacti
a3d0: 6f 6e 20 63 6f 75 6e 74 65 72 20 77 61 73 20 75  on counter was u
a3e0: 70 64 61 74 65 64 20 69 66 20 61 6e 79 20 70 61  pdated if any pa
a3f0: 72 74 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  rt of the databa
a400: 73 65 0a 20 20 20 20 2a 2a 20 66 69 6c 65 20 63  se.    ** file c
a410: 68 61 6e 67 65 64 2e 20 20 49 66 20 74 68 65 20  hanged.  If the 
a420: 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f 75 6e  transaction coun
a430: 74 65 72 20 69 73 20 6e 6f 74 20 75 70 64 61 74  ter is not updat
a440: 65 64 2c 0a 20 20 20 20 2a 2a 20 6f 74 68 65 72  ed,.    ** other
a450: 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 74 6f 20   connections to 
a460: 74 68 65 20 73 61 6d 65 20 66 69 6c 65 20 6d 69  the same file mi
a470: 67 68 74 20 6e 6f 74 20 72 65 61 6c 69 7a 65 20  ght not realize 
a480: 74 68 61 74 0a 20 20 20 20 2a 2a 20 74 68 65 20  that.    ** the 
a490: 66 69 6c 65 20 68 61 73 20 63 68 61 6e 67 65 64  file has changed
a4a0: 20 61 6e 64 20 68 65 6e 63 65 20 6d 69 67 68 74   and hence might
a4b0: 20 6e 6f 74 20 6b 6e 6f 77 20 74 6f 20 66 6c 75   not know to flu
a4c0: 73 68 20 74 68 65 69 72 0a 20 20 20 20 2a 2a 20  sh their.    ** 
a4d0: 63 61 63 68 65 2e 20 20 54 68 65 20 75 73 65 20  cache.  The use 
a4e0: 6f 66 20 61 20 73 74 61 6c 65 20 63 61 63 68 65  of a stale cache
a4f0: 20 63 61 6e 20 6c 65 61 64 20 74 6f 20 64 61 74   can lead to dat
a500: 61 62 61 73 65 20 63 6f 72 72 75 70 74 69 6f 6e  abase corruption
a510: 2e 0a 20 20 20 20 2a 2f 0a 23 69 66 20 30 0a 20  ..    */.#if 0. 
a520: 20 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65     assert( pFile
a530: 2d 3e 69 6e 4e 6f 72 6d 61 6c 57 72 69 74 65 3d  ->inNormalWrite=
a540: 3d 30 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 70  =0.         || p
a550: 46 69 6c 65 2d 3e 64 62 55 70 64 61 74 65 3d 3d  File->dbUpdate==
a560: 30 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 70 46  0.         || pF
a570: 69 6c 65 2d 3e 74 72 61 6e 73 43 6e 74 72 43 68  ile->transCntrCh
a580: 6e 67 3d 3d 31 20 29 3b 0a 23 65 6e 64 69 66 0a  ng==1 );.#endif.
a590: 20 20 20 20 70 46 69 6c 65 2d 3e 69 6e 4e 6f 72      pFile->inNor
a5a0: 6d 61 6c 57 72 69 74 65 20 3d 20 30 3b 0a 23 65  malWrite = 0;.#e
a5b0: 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 64 6f 77  ndif..    /* dow
a5c0: 6e 67 72 61 64 69 6e 67 20 74 6f 20 61 20 73 68  ngrading to a sh
a5d0: 61 72 65 64 20 6c 6f 63 6b 20 6f 6e 20 4e 46 53  ared lock on NFS
a5e0: 20 69 6e 76 6f 6c 76 65 73 20 63 6c 65 61 72 69   involves cleari
a5f0: 6e 67 20 74 68 65 20 77 72 69 74 65 20 6c 6f 63  ng the write loc
a600: 6b 0a 20 20 20 20 2a 2a 20 62 65 66 6f 72 65 20  k.    ** before 
a610: 65 73 74 61 62 6c 69 73 68 69 6e 67 20 74 68 65  establishing the
a620: 20 72 65 61 64 6c 6f 63 6b 20 2d 20 74 6f 20 61   readlock - to a
a630: 76 6f 69 64 20 61 20 72 61 63 65 20 63 6f 6e 64  void a race cond
a640: 69 74 69 6f 6e 20 77 65 20 64 6f 77 6e 67 72 61  ition we downgra
a650: 64 65 0a 20 20 20 20 2a 2a 20 74 68 65 20 6c 6f  de.    ** the lo
a660: 63 6b 20 69 6e 20 32 20 62 6c 6f 63 6b 73 2c 20  ck in 2 blocks, 
a670: 73 6f 20 74 68 61 74 20 70 61 72 74 20 6f 66 20  so that part of 
a680: 74 68 65 20 72 61 6e 67 65 20 77 69 6c 6c 20 62  the range will b
a690: 65 20 63 6f 76 65 72 65 64 20 62 79 20 61 20 0a  e covered by a .
a6a0: 20 20 20 20 2a 2a 20 77 72 69 74 65 20 6c 6f 63      ** write loc
a6b0: 6b 20 75 6e 74 69 6c 20 74 68 65 20 72 65 73 74  k until the rest
a6c0: 20 69 73 20 63 6f 76 65 72 65 64 20 62 79 20 61   is covered by a
a6d0: 20 72 65 61 64 20 6c 6f 63 6b 3a 0a 20 20 20 20   read lock:.    
a6e0: 2a 2a 20 20 31 3a 20 20 20 5b 57 57 57 57 57 5d  **  1:   [WWWWW]
a6f0: 0a 20 20 20 20 2a 2a 20 20 32 3a 20 20 20 5b 2e  .    **  2:   [.
a700: 2e 2e 2e 57 5d 0a 20 20 20 20 2a 2a 20 20 33 3a  ...W].    **  3:
a710: 20 20 20 5b 52 52 52 52 57 5d 0a 20 20 20 20 2a     [RRRRW].    *
a720: 2a 20 20 34 3a 20 20 20 5b 52 52 52 52 2e 5d 0a  *  4:   [RRRR.].
a730: 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 65      */.    if( e
a740: 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44  FileLock==SHARED
a750: 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 20 20 69  _LOCK ){.      i
a760: 66 28 20 68 61 6e 64 6c 65 4e 46 53 55 6e 6c 6f  f( handleNFSUnlo
a770: 63 6b 20 29 7b 0a 20 20 20 20 20 20 20 20 6f 66  ck ){.        of
a780: 66 5f 74 20 64 69 76 53 69 7a 65 20 3d 20 53 48  f_t divSize = SH
a790: 41 52 45 44 5f 53 49 5a 45 20 2d 20 31 3b 0a 20  ARED_SIZE - 1;. 
a7a0: 20 20 20 20 20 20 20 0a 20 20 20 20 20 20 20 20         .        
a7b0: 6c 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d 20 46 5f  lock.l_type = F_
a7c0: 55 4e 4c 43 4b 3b 0a 20 20 20 20 20 20 20 20 6c  UNLCK;.        l
a7d0: 6f 63 6b 2e 6c 5f 77 68 65 6e 63 65 20 3d 20 53  ock.l_whence = S
a7e0: 45 45 4b 5f 53 45 54 3b 0a 20 20 20 20 20 20 20  EEK_SET;.       
a7f0: 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20   lock.l_start = 
a800: 53 48 41 52 45 44 5f 46 49 52 53 54 3b 0a 20 20  SHARED_FIRST;.  
a810: 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e        lock.l_len
a820: 20 3d 20 64 69 76 53 69 7a 65 3b 0a 20 20 20 20   = divSize;.    
a830: 20 20 20 20 69 66 28 20 66 63 6e 74 6c 28 68 2c      if( fcntl(h,
a840: 20 46 5f 53 45 54 4c 4b 2c 20 26 6c 6f 63 6b 29   F_SETLK, &lock)
a850: 3d 3d 28 2d 31 29 20 29 7b 0a 20 20 20 20 20 20  ==(-1) ){.      
a860: 20 20 20 20 74 45 72 72 6e 6f 20 3d 20 65 72 72      tErrno = err
a870: 6e 6f 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63  no;.          rc
a880: 20 3d 20 73 71 6c 69 74 65 45 72 72 6f 72 46 72   = sqliteErrorFr
a890: 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28 74 45 72  omPosixError(tEr
a8a0: 72 6e 6f 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52  rno, SQLITE_IOER
a8b0: 52 5f 55 4e 4c 4f 43 4b 29 3b 0a 20 20 20 20 20  R_UNLOCK);.     
a8c0: 20 20 20 20 20 69 66 28 20 49 53 5f 4c 4f 43 4b       if( IS_LOCK
a8d0: 5f 45 52 52 4f 52 28 72 63 29 20 29 7b 0a 20 20  _ERROR(rc) ){.  
a8e0: 20 20 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d            pFile-
a8f0: 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 74 45 72  >lastErrno = tEr
a900: 72 6e 6f 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  rno;.          }
a910: 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20  .          goto 
a920: 65 6e 64 5f 75 6e 6c 6f 63 6b 3b 0a 20 20 20 20  end_unlock;.    
a930: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 6c 6f      }.        lo
a940: 63 6b 2e 6c 5f 74 79 70 65 20 3d 20 46 5f 52 44  ck.l_type = F_RD
a950: 4c 43 4b 3b 0a 20 20 20 20 20 20 20 20 6c 6f 63  LCK;.        loc
a960: 6b 2e 6c 5f 77 68 65 6e 63 65 20 3d 20 53 45 45  k.l_whence = SEE
a970: 4b 5f 53 45 54 3b 0a 20 20 20 20 20 20 20 20 6c  K_SET;.        l
a980: 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 53 48  ock.l_start = SH
a990: 41 52 45 44 5f 46 49 52 53 54 3b 0a 20 20 20 20  ARED_FIRST;.    
a9a0: 20 20 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d      lock.l_len =
a9b0: 20 64 69 76 53 69 7a 65 3b 0a 20 20 20 20 20 20   divSize;.      
a9c0: 20 20 69 66 28 20 66 63 6e 74 6c 28 68 2c 20 46    if( fcntl(h, F
a9d0: 5f 53 45 54 4c 4b 2c 20 26 6c 6f 63 6b 29 3d 3d  _SETLK, &lock)==
a9e0: 28 2d 31 29 20 29 7b 0a 20 20 20 20 20 20 20 20  (-1) ){.        
a9f0: 20 20 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f    tErrno = errno
aa00: 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  ;.          rc =
aa10: 20 73 71 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d   sqliteErrorFrom
aa20: 50 6f 73 69 78 45 72 72 6f 72 28 74 45 72 72 6e  PosixError(tErrn
aa30: 6f 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  o, SQLITE_IOERR_
aa40: 52 44 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 20  RDLOCK);.       
aa50: 20 20 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45     if( IS_LOCK_E
aa60: 52 52 4f 52 28 72 63 29 20 29 7b 0a 20 20 20 20  RROR(rc) ){.    
aa70: 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c          pFile->l
aa80: 61 73 74 45 72 72 6e 6f 20 3d 20 74 45 72 72 6e  astErrno = tErrn
aa90: 6f 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  o;.          }. 
aaa0: 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e           goto en
aab0: 64 5f 75 6e 6c 6f 63 6b 3b 0a 20 20 20 20 20 20  d_unlock;.      
aac0: 20 20 7d 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b    }.        lock
aad0: 2e 6c 5f 74 79 70 65 20 3d 20 46 5f 55 4e 4c 43  .l_type = F_UNLC
aae0: 4b 3b 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e  K;.        lock.
aaf0: 6c 5f 77 68 65 6e 63 65 20 3d 20 53 45 45 4b 5f  l_whence = SEEK_
ab00: 53 45 54 3b 0a 20 20 20 20 20 20 20 20 6c 6f 63  SET;.        loc
ab10: 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 53 48 41 52  k.l_start = SHAR
ab20: 45 44 5f 46 49 52 53 54 2b 64 69 76 53 69 7a 65  ED_FIRST+divSize
ab30: 3b 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e 6c  ;.        lock.l
ab40: 5f 6c 65 6e 20 3d 20 53 48 41 52 45 44 5f 53 49  _len = SHARED_SI
ab50: 5a 45 2d 64 69 76 53 69 7a 65 3b 0a 20 20 20 20  ZE-divSize;.    
ab60: 20 20 20 20 69 66 28 20 66 63 6e 74 6c 28 68 2c      if( fcntl(h,
ab70: 20 46 5f 53 45 54 4c 4b 2c 20 26 6c 6f 63 6b 29   F_SETLK, &lock)
ab80: 3d 3d 28 2d 31 29 20 29 7b 0a 20 20 20 20 20 20  ==(-1) ){.      
ab90: 20 20 20 20 74 45 72 72 6e 6f 20 3d 20 65 72 72      tErrno = err
aba0: 6e 6f 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63  no;.          rc
abb0: 20 3d 20 73 71 6c 69 74 65 45 72 72 6f 72 46 72   = sqliteErrorFr
abc0: 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28 74 45 72  omPosixError(tEr
abd0: 72 6e 6f 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52  rno, SQLITE_IOER
abe0: 52 5f 55 4e 4c 4f 43 4b 29 3b 0a 20 20 20 20 20  R_UNLOCK);.     
abf0: 20 20 20 20 20 69 66 28 20 49 53 5f 4c 4f 43 4b       if( IS_LOCK
ac00: 5f 45 52 52 4f 52 28 72 63 29 20 29 7b 0a 20 20  _ERROR(rc) ){.  
ac10: 20 20 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d            pFile-
ac20: 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 74 45 72  >lastErrno = tEr
ac30: 72 6e 6f 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  rno;.          }
ac40: 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20  .          goto 
ac50: 65 6e 64 5f 75 6e 6c 6f 63 6b 3b 0a 20 20 20 20  end_unlock;.    
ac60: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73      }.      }els
ac70: 65 7b 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e  e{.        lock.
ac80: 6c 5f 74 79 70 65 20 3d 20 46 5f 52 44 4c 43 4b  l_type = F_RDLCK
ac90: 3b 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e 6c  ;.        lock.l
aca0: 5f 77 68 65 6e 63 65 20 3d 20 53 45 45 4b 5f 53  _whence = SEEK_S
acb0: 45 54 3b 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b  ET;.        lock
acc0: 2e 6c 5f 73 74 61 72 74 20 3d 20 53 48 41 52 45  .l_start = SHARE
acd0: 44 5f 46 49 52 53 54 3b 0a 20 20 20 20 20 20 20  D_FIRST;.       
ace0: 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 53 48   lock.l_len = SH
acf0: 41 52 45 44 5f 53 49 5a 45 3b 0a 20 20 20 20 20  ARED_SIZE;.     
ad00: 20 20 20 69 66 28 20 66 63 6e 74 6c 28 68 2c 20     if( fcntl(h, 
ad10: 46 5f 53 45 54 4c 4b 2c 20 26 6c 6f 63 6b 29 3d  F_SETLK, &lock)=
ad20: 3d 28 2d 31 29 20 29 7b 0a 20 20 20 20 20 20 20  =(-1) ){.       
ad30: 20 20 20 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e     tErrno = errn
ad40: 6f 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  o;.          rc 
ad50: 3d 20 73 71 6c 69 74 65 45 72 72 6f 72 46 72 6f  = sqliteErrorFro
ad60: 6d 50 6f 73 69 78 45 72 72 6f 72 28 74 45 72 72  mPosixError(tErr
ad70: 6e 6f 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  no, SQLITE_IOERR
ad80: 5f 52 44 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20  _RDLOCK);.      
ad90: 20 20 20 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f      if( IS_LOCK_
ada0: 45 52 52 4f 52 28 72 63 29 20 29 7b 0a 20 20 20  ERROR(rc) ){.   
adb0: 20 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e           pFile->
adc0: 6c 61 73 74 45 72 72 6e 6f 20 3d 20 74 45 72 72  lastErrno = tErr
add0: 6e 6f 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  no;.          }.
ade0: 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65            goto e
adf0: 6e 64 5f 75 6e 6c 6f 63 6b 3b 0a 20 20 20 20 20  nd_unlock;.     
ae00: 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
ae10: 20 7d 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74 79   }.    lock.l_ty
ae20: 70 65 20 3d 20 46 5f 55 4e 4c 43 4b 3b 0a 20 20  pe = F_UNLCK;.  
ae30: 20 20 6c 6f 63 6b 2e 6c 5f 77 68 65 6e 63 65 20    lock.l_whence 
ae40: 3d 20 53 45 45 4b 5f 53 45 54 3b 0a 20 20 20 20  = SEEK_SET;.    
ae50: 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 50  lock.l_start = P
ae60: 45 4e 44 49 4e 47 5f 42 59 54 45 3b 0a 20 20 20  ENDING_BYTE;.   
ae70: 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 32 4c   lock.l_len = 2L
ae80: 3b 20 20 61 73 73 65 72 74 28 20 50 45 4e 44 49  ;  assert( PENDI
ae90: 4e 47 5f 42 59 54 45 2b 31 3d 3d 52 45 53 45 52  NG_BYTE+1==RESER
aea0: 56 45 44 5f 42 59 54 45 20 29 3b 0a 20 20 20 20  VED_BYTE );.    
aeb0: 69 66 28 20 66 63 6e 74 6c 28 68 2c 20 46 5f 53  if( fcntl(h, F_S
aec0: 45 54 4c 4b 2c 20 26 6c 6f 63 6b 29 21 3d 28 2d  ETLK, &lock)!=(-
aed0: 31 29 20 29 7b 0a 20 20 20 20 20 20 70 49 6e 6f  1) ){.      pIno
aee0: 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20  de->eFileLock = 
aef0: 53 48 41 52 45 44 5f 4c 4f 43 4b 3b 0a 20 20 20  SHARED_LOCK;.   
af00: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 74 45   }else{.      tE
af10: 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20  rrno = errno;.  
af20: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 45      rc = sqliteE
af30: 72 72 6f 72 46 72 6f 6d 50 6f 73 69 78 45 72 72  rrorFromPosixErr
af40: 6f 72 28 74 45 72 72 6e 6f 2c 20 53 51 4c 49 54  or(tErrno, SQLIT
af50: 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 29 3b  E_IOERR_UNLOCK);
af60: 0a 20 20 20 20 20 20 69 66 28 20 49 53 5f 4c 4f  .      if( IS_LO
af70: 43 4b 5f 45 52 52 4f 52 28 72 63 29 20 29 7b 0a  CK_ERROR(rc) ){.
af80: 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c          pFile->l
af90: 61 73 74 45 72 72 6e 6f 20 3d 20 74 45 72 72 6e  astErrno = tErrn
afa0: 6f 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  o;.      }.     
afb0: 20 67 6f 74 6f 20 65 6e 64 5f 75 6e 6c 6f 63 6b   goto end_unlock
afc0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66  ;.    }.  }.  if
afd0: 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 4e 4f 5f  ( eFileLock==NO_
afe0: 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 2f 2a 20 44  LOCK ){.    /* D
aff0: 65 63 72 65 6d 65 6e 74 20 74 68 65 20 73 68 61  ecrement the sha
b000: 72 65 64 20 6c 6f 63 6b 20 63 6f 75 6e 74 65 72  red lock counter
b010: 2e 20 20 52 65 6c 65 61 73 65 20 74 68 65 20 6c  .  Release the l
b020: 6f 63 6b 20 75 73 69 6e 67 20 61 6e 0a 20 20 20  ock using an.   
b030: 20 2a 2a 20 4f 53 20 63 61 6c 6c 20 6f 6e 6c 79   ** OS call only
b040: 20 77 68 65 6e 20 61 6c 6c 20 74 68 72 65 61 64   when all thread
b050: 73 20 69 6e 20 74 68 69 73 20 73 61 6d 65 20 70  s in this same p
b060: 72 6f 63 65 73 73 20 68 61 76 65 20 72 65 6c 65  rocess have rele
b070: 61 73 65 64 0a 20 20 20 20 2a 2a 20 74 68 65 20  ased.    ** the 
b080: 6c 6f 63 6b 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  lock..    */.   
b090: 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64   pInode->nShared
b0a0: 2d 2d 3b 0a 20 20 20 20 69 66 28 20 70 49 6e 6f  --;.    if( pIno
b0b0: 64 65 2d 3e 6e 53 68 61 72 65 64 3d 3d 30 20 29  de->nShared==0 )
b0c0: 7b 0a 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74  {.      lock.l_t
b0d0: 79 70 65 20 3d 20 46 5f 55 4e 4c 43 4b 3b 0a 20  ype = F_UNLCK;. 
b0e0: 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 77 68 65 6e       lock.l_when
b0f0: 63 65 20 3d 20 53 45 45 4b 5f 53 45 54 3b 0a 20  ce = SEEK_SET;. 
b100: 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72       lock.l_star
b110: 74 20 3d 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d  t = lock.l_len =
b120: 20 30 4c 3b 0a 20 20 20 20 20 20 53 69 6d 75 6c   0L;.      Simul
b130: 61 74 65 49 4f 45 72 72 6f 72 42 65 6e 69 67 6e  ateIOErrorBenign
b140: 28 31 29 3b 0a 20 20 20 20 20 20 53 69 6d 75 6c  (1);.      Simul
b150: 61 74 65 49 4f 45 72 72 6f 72 28 20 68 3d 28 2d  ateIOError( h=(-
b160: 31 29 20 29 0a 20 20 20 20 20 20 53 69 6d 75 6c  1) ).      Simul
b170: 61 74 65 49 4f 45 72 72 6f 72 42 65 6e 69 67 6e  ateIOErrorBenign
b180: 28 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 66  (0);.      if( f
b190: 63 6e 74 6c 28 68 2c 20 46 5f 53 45 54 4c 4b 2c  cntl(h, F_SETLK,
b1a0: 20 26 6c 6f 63 6b 29 21 3d 28 2d 31 29 20 29 7b   &lock)!=(-1) ){
b1b0: 0a 20 20 20 20 20 20 20 20 70 49 6e 6f 64 65 2d  .        pInode-
b1c0: 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 4e 4f 5f  >eFileLock = NO_
b1d0: 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 7d 65 6c 73  LOCK;.      }els
b1e0: 65 7b 0a 20 20 20 20 20 20 20 20 74 45 72 72 6e  e{.        tErrn
b1f0: 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20  o = errno;.     
b200: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 45 72     rc = sqliteEr
b210: 72 6f 72 46 72 6f 6d 50 6f 73 69 78 45 72 72 6f  rorFromPosixErro
b220: 72 28 74 45 72 72 6e 6f 2c 20 53 51 4c 49 54 45  r(tErrno, SQLITE
b230: 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 29 3b 0a  _IOERR_UNLOCK);.
b240: 20 20 20 20 20 20 20 20 69 66 28 20 49 53 5f 4c          if( IS_L
b250: 4f 43 4b 5f 45 52 52 4f 52 28 72 63 29 20 29 7b  OCK_ERROR(rc) ){
b260: 0a 20 20 20 20 20 20 20 20 20 20 70 46 69 6c 65  .          pFile
b270: 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 74 45  ->lastErrno = tE
b280: 72 72 6e 6f 3b 0a 20 20 20 20 20 20 20 20 7d 0a  rrno;.        }.
b290: 20 20 20 20 20 20 20 20 70 49 6e 6f 64 65 2d 3e          pInode->
b2a0: 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 4e 4f 5f 4c  eFileLock = NO_L
b2b0: 4f 43 4b 3b 0a 20 20 20 20 20 20 20 20 70 46 69  OCK;.        pFi
b2c0: 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20  le->eFileLock = 
b2d0: 4e 4f 5f 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 7d  NO_LOCK;.      }
b2e0: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 44  .    }..    /* D
b2f0: 65 63 72 65 6d 65 6e 74 20 74 68 65 20 63 6f 75  ecrement the cou
b300: 6e 74 20 6f 66 20 6c 6f 63 6b 73 20 61 67 61 69  nt of locks agai
b310: 6e 73 74 20 74 68 69 73 20 73 61 6d 65 20 66 69  nst this same fi
b320: 6c 65 2e 20 20 57 68 65 6e 20 74 68 65 0a 20 20  le.  When the.  
b330: 20 20 2a 2a 20 63 6f 75 6e 74 20 72 65 61 63 68    ** count reach
b340: 65 73 20 7a 65 72 6f 2c 20 63 6c 6f 73 65 20 61  es zero, close a
b350: 6e 79 20 6f 74 68 65 72 20 66 69 6c 65 20 64 65  ny other file de
b360: 73 63 72 69 70 74 6f 72 73 20 77 68 6f 73 65 20  scriptors whose 
b370: 63 6c 6f 73 65 0a 20 20 20 20 2a 2a 20 77 61 73  close.    ** was
b380: 20 64 65 66 65 72 72 65 64 20 62 65 63 61 75 73   deferred becaus
b390: 65 20 6f 66 20 6f 75 74 73 74 61 6e 64 69 6e 67  e of outstanding
b3a0: 20 6c 6f 63 6b 73 2e 0a 20 20 20 20 2a 2f 0a 20   locks..    */. 
b3b0: 20 20 20 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b     pInode->nLock
b3c0: 2d 2d 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  --;.    assert( 
b3d0: 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 3e 3d 30  pInode->nLock>=0
b3e0: 20 29 3b 0a 20 20 20 20 69 66 28 20 70 49 6e 6f   );.    if( pIno
b3f0: 64 65 2d 3e 6e 4c 6f 63 6b 3d 3d 30 20 29 7b 0a  de->nLock==0 ){.
b400: 20 20 20 20 20 20 69 6e 74 20 72 63 32 20 3d 20        int rc2 = 
b410: 63 6c 6f 73 65 50 65 6e 64 69 6e 67 46 64 73 28  closePendingFds(
b420: 70 46 69 6c 65 29 3b 0a 20 20 20 20 20 20 69 66  pFile);.      if
b430: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
b440: 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
b450: 72 63 32 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  rc2;.      }.   
b460: 20 7d 0a 20 20 7d 0a 09 0a 65 6e 64 5f 75 6e 6c   }.  }...end_unl
b470: 6f 63 6b 3a 0a 20 20 75 6e 69 78 4c 65 61 76 65  ock:.  unixLeave
b480: 4d 75 74 65 78 28 29 3b 0a 20 20 69 66 28 20 72  Mutex();.  if( r
b490: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 70  c==SQLITE_OK ) p
b4a0: 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20  File->eFileLock 
b4b0: 3d 20 65 46 69 6c 65 4c 6f 63 6b 3b 0a 20 20 72  = eFileLock;.  r
b4c0: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
b4d0: 2a 2a 20 4c 6f 77 65 72 20 74 68 65 20 6c 6f 63  ** Lower the loc
b4e0: 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 6e 20 66 69  king level on fi
b4f0: 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 70 46  le descriptor pF
b500: 69 6c 65 20 74 6f 20 65 46 69 6c 65 4c 6f 63 6b  ile to eFileLock
b510: 2e 20 20 65 46 69 6c 65 4c 6f 63 6b 0a 2a 2a 20  .  eFileLock.** 
b520: 6d 75 73 74 20 62 65 20 65 69 74 68 65 72 20 4e  must be either N
b530: 4f 5f 4c 4f 43 4b 20 6f 72 20 53 48 41 52 45 44  O_LOCK or SHARED
b540: 5f 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  _LOCK..**.** If 
b550: 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65  the locking leve
b560: 6c 20 6f 66 20 74 68 65 20 66 69 6c 65 20 64 65  l of the file de
b570: 73 63 72 69 70 74 6f 72 20 69 73 20 61 6c 72 65  scriptor is alre
b580: 61 64 79 20 61 74 20 6f 72 20 62 65 6c 6f 77 0a  ady at or below.
b590: 2a 2a 20 74 68 65 20 72 65 71 75 65 73 74 65 64  ** the requested
b5a0: 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 2c 20   locking level, 
b5b0: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
b5c0: 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74  a no-op..*/.stat
b5d0: 69 63 20 69 6e 74 20 75 6e 69 78 55 6e 6c 6f 63  ic int unixUnloc
b5e0: 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  k(sqlite3_file *
b5f0: 69 64 2c 20 69 6e 74 20 65 46 69 6c 65 4c 6f 63  id, int eFileLoc
b600: 6b 29 7b 0a 20 20 72 65 74 75 72 6e 20 5f 70 6f  k){.  return _po
b610: 73 69 78 55 6e 6c 6f 63 6b 28 69 64 2c 20 65 46  sixUnlock(id, eF
b620: 69 6c 65 4c 6f 63 6b 2c 20 30 29 3b 0a 7d 0a 0a  ileLock, 0);.}..
b630: 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
b640: 69 6f 6e 20 70 65 72 66 6f 72 6d 73 20 74 68 65  ion performs the
b650: 20 70 61 72 74 73 20 6f 66 20 74 68 65 20 22 63   parts of the "c
b660: 6c 6f 73 65 20 66 69 6c 65 22 20 6f 70 65 72 61  lose file" opera
b670: 74 69 6f 6e 20 0a 2a 2a 20 63 6f 6d 6d 6f 6e 20  tion .** common 
b680: 74 6f 20 61 6c 6c 20 6c 6f 63 6b 69 6e 67 20 73  to all locking s
b690: 63 68 65 6d 65 73 2e 20 49 74 20 63 6c 6f 73 65  chemes. It close
b6a0: 73 20 74 68 65 20 64 69 72 65 63 74 6f 72 79 20  s the directory 
b6b0: 61 6e 64 20 66 69 6c 65 0a 2a 2a 20 68 61 6e 64  and file.** hand
b6c0: 6c 65 73 2c 20 69 66 20 74 68 65 79 20 61 72 65  les, if they are
b6d0: 20 76 61 6c 69 64 2c 20 61 6e 64 20 73 65 74 73   valid, and sets
b6e0: 20 61 6c 6c 20 66 69 65 6c 64 73 20 6f 66 20 74   all fields of t
b6f0: 68 65 20 75 6e 69 78 46 69 6c 65 0a 2a 2a 20 73  he unixFile.** s
b700: 74 72 75 63 74 75 72 65 20 74 6f 20 30 2e 0a 2a  tructure to 0..*
b710: 2a 0a 2a 2a 20 49 74 20 69 73 20 2a 6e 6f 74 2a  *.** It is *not*
b720: 20 6e 65 63 65 73 73 61 72 79 20 74 6f 20 68 6f   necessary to ho
b730: 6c 64 20 74 68 65 20 6d 75 74 65 78 20 77 68 65  ld the mutex whe
b740: 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  n this routine i
b750: 73 20 63 61 6c 6c 65 64 2c 0a 2a 2a 20 65 76 65  s called,.** eve
b760: 6e 20 6f 6e 20 56 78 57 6f 72 6b 73 2e 20 20 41  n on VxWorks.  A
b770: 20 6d 75 74 65 78 20 77 69 6c 6c 20 62 65 20 61   mutex will be a
b780: 63 71 75 69 72 65 64 20 6f 6e 20 56 78 57 6f 72  cquired on VxWor
b790: 6b 73 20 62 79 20 74 68 65 0a 2a 2a 20 76 78 77  ks by the.** vxw
b7a0: 6f 72 6b 73 52 65 6c 65 61 73 65 46 69 6c 65 49  orksReleaseFileI
b7b0: 64 28 29 20 72 6f 75 74 69 6e 65 2e 0a 2a 2f 0a  d() routine..*/.
b7c0: 73 74 61 74 69 63 20 69 6e 74 20 63 6c 6f 73 65  static int close
b7d0: 55 6e 69 78 46 69 6c 65 28 73 71 6c 69 74 65 33  UnixFile(sqlite3
b7e0: 5f 66 69 6c 65 20 2a 69 64 29 7b 0a 20 20 75 6e  _file *id){.  un
b7f0: 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20  ixFile *pFile = 
b800: 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20  (unixFile*)id;. 
b810: 20 69 66 28 20 70 46 69 6c 65 20 29 7b 0a 20 20   if( pFile ){.  
b820: 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 64 69 72    if( pFile->dir
b830: 66 64 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 69  fd>=0 ){.      i
b840: 6e 74 20 65 72 72 20 3d 20 63 6c 6f 73 65 28 70  nt err = close(p
b850: 46 69 6c 65 2d 3e 64 69 72 66 64 29 3b 0a 20 20  File->dirfd);.  
b860: 20 20 20 20 69 66 28 20 65 72 72 20 29 7b 0a 20      if( err ){. 
b870: 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61         pFile->la
b880: 73 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b  stErrno = errno;
b890: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
b8a0: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 44 49 52  SQLITE_IOERR_DIR
b8b0: 5f 43 4c 4f 53 45 3b 0a 20 20 20 20 20 20 7d 65  _CLOSE;.      }e
b8c0: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70 46 69  lse{.        pFi
b8d0: 6c 65 2d 3e 64 69 72 66 64 3d 2d 31 3b 0a 20 20  le->dirfd=-1;.  
b8e0: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
b8f0: 69 66 28 20 70 46 69 6c 65 2d 3e 68 3e 3d 30 20  if( pFile->h>=0 
b900: 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 65 72 72  ){.      int err
b910: 20 3d 20 63 6c 6f 73 65 28 70 46 69 6c 65 2d 3e   = close(pFile->
b920: 68 29 3b 0a 20 20 20 20 20 20 69 66 28 20 65 72  h);.      if( er
b930: 72 20 29 7b 0a 20 20 20 20 20 20 20 20 70 46 69  r ){.        pFi
b940: 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20  le->lastErrno = 
b950: 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20 20 20 72  errno;.        r
b960: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45  eturn SQLITE_IOE
b970: 52 52 5f 43 4c 4f 53 45 3b 0a 20 20 20 20 20 20  RR_CLOSE;.      
b980: 7d 0a 20 20 20 20 7d 0a 23 69 66 20 4f 53 5f 56  }.    }.#if OS_V
b990: 58 57 4f 52 4b 53 0a 20 20 20 20 69 66 28 20 70  XWORKS.    if( p
b9a0: 46 69 6c 65 2d 3e 70 49 64 20 29 7b 0a 20 20 20  File->pId ){.   
b9b0: 20 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 69 73     if( pFile->is
b9c0: 44 65 6c 65 74 65 20 29 7b 0a 20 20 20 20 20 20  Delete ){.      
b9d0: 20 20 75 6e 6c 69 6e 6b 28 70 46 69 6c 65 2d 3e    unlink(pFile->
b9e0: 70 49 64 2d 3e 7a 43 61 6e 6f 6e 69 63 61 6c 4e  pId->zCanonicalN
b9f0: 61 6d 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ame);.      }.  
ba00: 20 20 20 20 76 78 77 6f 72 6b 73 52 65 6c 65 61      vxworksRelea
ba10: 73 65 46 69 6c 65 49 64 28 70 46 69 6c 65 2d 3e  seFileId(pFile->
ba20: 70 49 64 29 3b 0a 20 20 20 20 20 20 70 46 69 6c  pId);.      pFil
ba30: 65 2d 3e 70 49 64 20 3d 20 30 3b 0a 20 20 20 20  e->pId = 0;.    
ba40: 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 4f 53 54  }.#endif.    OST
ba50: 52 41 43 45 28 28 22 43 4c 4f 53 45 20 20 20 25  RACE(("CLOSE   %
ba60: 2d 33 64 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68  -3d\n", pFile->h
ba70: 29 29 3b 0a 20 20 20 20 4f 70 65 6e 43 6f 75 6e  ));.    OpenCoun
ba80: 74 65 72 28 2d 31 29 3b 0a 20 20 20 20 73 71 6c  ter(-1);.    sql
ba90: 69 74 65 33 5f 66 72 65 65 28 70 46 69 6c 65 2d  ite3_free(pFile-
baa0: 3e 70 55 6e 75 73 65 64 29 3b 0a 20 20 20 20 6d  >pUnused);.    m
bab0: 65 6d 73 65 74 28 70 46 69 6c 65 2c 20 30 2c 20  emset(pFile, 0, 
bac0: 73 69 7a 65 6f 66 28 75 6e 69 78 46 69 6c 65 29  sizeof(unixFile)
bad0: 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
bae0: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
baf0: 0a 2a 2a 20 43 6c 6f 73 65 20 61 20 66 69 6c 65  .** Close a file
bb00: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
bb10: 75 6e 69 78 43 6c 6f 73 65 28 73 71 6c 69 74 65  unixClose(sqlite
bb20: 33 5f 66 69 6c 65 20 2a 69 64 29 7b 0a 20 20 69  3_file *id){.  i
bb30: 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
bb40: 4b 3b 0a 20 20 69 66 28 20 69 64 20 29 7b 0a 20  K;.  if( id ){. 
bb50: 20 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69     unixFile *pFi
bb60: 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 20 2a  le = (unixFile *
bb70: 29 69 64 3b 0a 20 20 20 20 75 6e 69 78 55 6e 6c  )id;.    unixUnl
bb80: 6f 63 6b 28 69 64 2c 20 4e 4f 5f 4c 4f 43 4b 29  ock(id, NO_LOCK)
bb90: 3b 0a 20 20 20 20 75 6e 69 78 45 6e 74 65 72 4d  ;.    unixEnterM
bba0: 75 74 65 78 28 29 3b 0a 20 20 20 20 69 66 28 20  utex();.    if( 
bbb0: 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 20 26 26  pFile->pInode &&
bbc0: 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e   pFile->pInode->
bbd0: 6e 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 20 20 2f  nLock ){.      /
bbe0: 2a 20 49 66 20 74 68 65 72 65 20 61 72 65 20 6f  * If there are o
bbf0: 75 74 73 74 61 6e 64 69 6e 67 20 6c 6f 63 6b 73  utstanding locks
bc00: 2c 20 64 6f 20 6e 6f 74 20 61 63 74 75 61 6c 6c  , do not actuall
bc10: 79 20 63 6c 6f 73 65 20 74 68 65 20 66 69 6c 65  y close the file
bc20: 20 6a 75 73 74 0a 20 20 20 20 20 20 2a 2a 20 79   just.      ** y
bc30: 65 74 20 62 65 63 61 75 73 65 20 74 68 61 74 20  et because that 
bc40: 77 6f 75 6c 64 20 63 6c 65 61 72 20 74 68 6f 73  would clear thos
bc50: 65 20 6c 6f 63 6b 73 2e 20 20 49 6e 73 74 65 61  e locks.  Instea
bc60: 64 2c 20 61 64 64 20 74 68 65 20 66 69 6c 65 0a  d, add the file.
bc70: 20 20 20 20 20 20 2a 2a 20 64 65 73 63 72 69 70        ** descrip
bc80: 74 6f 72 20 74 6f 20 70 49 6e 6f 64 65 2d 3e 70  tor to pInode->p
bc90: 55 6e 75 73 65 64 20 6c 69 73 74 2e 20 20 49 74  Unused list.  It
bca0: 20 77 69 6c 6c 20 62 65 20 61 75 74 6f 6d 61 74   will be automat
bcb0: 69 63 61 6c 6c 79 20 63 6c 6f 73 65 64 20 0a 20  ically closed . 
bcc0: 20 20 20 20 20 2a 2a 20 77 68 65 6e 20 74 68 65       ** when the
bcd0: 20 6c 61 73 74 20 6c 6f 63 6b 20 69 73 20 63 6c   last lock is cl
bce0: 65 61 72 65 64 2e 0a 20 20 20 20 20 20 2a 2f 0a  eared..      */.
bcf0: 20 20 20 20 20 20 73 65 74 50 65 6e 64 69 6e 67        setPending
bd00: 46 64 28 70 46 69 6c 65 29 3b 0a 20 20 20 20 7d  Fd(pFile);.    }
bd10: 0a 20 20 20 20 72 65 6c 65 61 73 65 49 6e 6f 64  .    releaseInod
bd20: 65 49 6e 66 6f 28 70 46 69 6c 65 2d 3e 70 49 6e  eInfo(pFile->pIn
bd30: 6f 64 65 29 3b 0a 20 20 20 20 72 63 20 3d 20 63  ode);.    rc = c
bd40: 6c 6f 73 65 55 6e 69 78 46 69 6c 65 28 69 64 29  loseUnixFile(id)
bd50: 3b 0a 20 20 20 20 75 6e 69 78 4c 65 61 76 65 4d  ;.    unixLeaveM
bd60: 75 74 65 78 28 29 3b 0a 20 20 7d 0a 20 20 72 65  utex();.  }.  re
bd70: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 2a 2a  turn rc;.}../***
bd80: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64 20  *********** End 
bd90: 6f 66 20 74 68 65 20 70 6f 73 69 78 20 61 64 76  of the posix adv
bda0: 69 73 6f 72 79 20 6c 6f 63 6b 20 69 6d 70 6c 65  isory lock imple
bdb0: 6d 65 6e 74 61 74 69 6f 6e 20 2a 2a 2a 2a 2a 2a  mentation ******
bdc0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a  ***********.****
bdd0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
bde0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
bdf0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
be00: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
be10: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 2a  **********/../**
be20: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
be30: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
be40: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
be50: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
be60: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a  ************.***
be70: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
be80: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 4e 6f 2d 6f  *********** No-o
be90: 70 20 4c 6f 63 6b 69 6e 67 20 2a 2a 2a 2a 2a 2a  p Locking ******
bea0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
beb0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a  ************.**.
bec0: 2a 2a 20 4f 66 20 74 68 65 20 76 61 72 69 6f 75  ** Of the variou
bed0: 73 20 6c 6f 63 6b 69 6e 67 20 69 6d 70 6c 65 6d  s locking implem
bee0: 65 6e 74 61 74 69 6f 6e 73 20 61 76 61 69 6c 61  entations availa
bef0: 62 6c 65 2c 20 74 68 69 73 20 69 73 20 62 79 20  ble, this is by 
bf00: 66 61 72 20 74 68 65 0a 2a 2a 20 73 69 6d 70 6c  far the.** simpl
bf10: 65 73 74 3a 20 20 6c 6f 63 6b 69 6e 67 20 69 73  est:  locking is
bf20: 20 69 67 6e 6f 72 65 64 2e 20 20 4e 6f 20 61 74   ignored.  No at
bf30: 74 65 6d 70 74 20 69 73 20 6d 61 64 65 20 74 6f  tempt is made to
bf40: 20 6c 6f 63 6b 20 74 68 65 20 64 61 74 61 62 61   lock the databa
bf50: 73 65 0a 2a 2a 20 66 69 6c 65 20 66 6f 72 20 72  se.** file for r
bf60: 65 61 64 69 6e 67 20 6f 72 20 77 72 69 74 69 6e  eading or writin
bf70: 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 6c 6f  g..**.** This lo
bf80: 63 6b 69 6e 67 20 6d 6f 64 65 20 69 73 20 61 70  cking mode is ap
bf90: 70 72 6f 70 72 69 61 74 65 20 66 6f 72 20 75 73  propriate for us
bfa0: 65 20 6f 6e 20 72 65 61 64 2d 6f 6e 6c 79 20 64  e on read-only d
bfb0: 61 74 61 62 61 73 65 73 0a 2a 2a 20 28 65 78 3a  atabases.** (ex:
bfc0: 20 64 61 74 61 62 61 73 65 73 20 74 68 61 74 20   databases that 
bfd0: 61 72 65 20 62 75 72 6e 65 64 20 69 6e 74 6f 20  are burned into 
bfe0: 43 44 2d 52 4f 4d 2c 20 66 6f 72 20 65 78 61 6d  CD-ROM, for exam
bff0: 70 6c 65 2e 29 20 20 49 74 20 63 61 6e 0a 2a 2a  ple.)  It can.**
c000: 20 61 6c 73 6f 20 62 65 20 75 73 65 64 20 69 66   also be used if
c010: 20 74 68 65 20 61 70 70 6c 69 63 61 74 69 6f 6e   the application
c020: 20 65 6d 70 6c 6f 79 73 20 73 6f 6d 65 20 65 78   employs some ex
c030: 74 65 72 6e 61 6c 20 6d 65 63 68 61 6e 69 73 6d  ternal mechanism
c040: 20 74 6f 0a 2a 2a 20 70 72 65 76 65 6e 74 20 73   to.** prevent s
c050: 69 6d 75 6c 74 61 6e 65 6f 75 73 20 61 63 63 65  imultaneous acce
c060: 73 73 20 6f 66 20 74 68 65 20 73 61 6d 65 20 64  ss of the same d
c070: 61 74 61 62 61 73 65 20 62 79 20 74 77 6f 20 6f  atabase by two o
c080: 72 20 6d 6f 72 65 0a 2a 2a 20 64 61 74 61 62 61  r more.** databa
c090: 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 2e 20  se connections. 
c0a0: 20 42 75 74 20 74 68 65 72 65 20 69 73 20 61 20   But there is a 
c0b0: 73 65 72 69 6f 75 73 20 72 69 73 6b 20 6f 66 20  serious risk of 
c0c0: 64 61 74 61 62 61 73 65 0a 2a 2a 20 63 6f 72 72  database.** corr
c0d0: 75 70 74 69 6f 6e 20 69 66 20 74 68 69 73 20 6c  uption if this l
c0e0: 6f 63 6b 69 6e 67 20 6d 6f 64 65 20 69 73 20 75  ocking mode is u
c0f0: 73 65 64 20 69 6e 20 73 69 74 75 61 74 69 6f 6e  sed in situation
c100: 73 20 77 68 65 72 65 20 6d 75 6c 74 69 70 6c 65  s where multiple
c110: 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 63 6f 6e  .** database con
c120: 6e 65 63 74 69 6f 6e 73 20 61 72 65 20 61 63 63  nections are acc
c130: 65 73 73 69 6e 67 20 74 68 65 20 73 61 6d 65 20  essing the same 
c140: 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 61 74  database file at
c150: 20 74 68 65 20 73 61 6d 65 0a 2a 2a 20 74 69 6d   the same.** tim
c160: 65 20 61 6e 64 20 6f 6e 65 20 6f 72 20 6d 6f 72  e and one or mor
c170: 65 20 6f 66 20 74 68 6f 73 65 20 63 6f 6e 6e 65  e of those conne
c180: 63 74 69 6f 6e 73 20 61 72 65 20 77 72 69 74 69  ctions are writi
c190: 6e 67 2e 0a 2a 2f 0a 0a 73 74 61 74 69 63 20 69  ng..*/..static i
c1a0: 6e 74 20 6e 6f 6c 6f 63 6b 43 68 65 63 6b 52 65  nt nolockCheckRe
c1b0: 73 65 72 76 65 64 4c 6f 63 6b 28 73 71 6c 69 74  servedLock(sqlit
c1c0: 65 33 5f 66 69 6c 65 20 2a 4e 6f 74 55 73 65 64  e3_file *NotUsed
c1d0: 2c 20 69 6e 74 20 2a 70 52 65 73 4f 75 74 29 7b  , int *pResOut){
c1e0: 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
c1f0: 54 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20  TER(NotUsed);.  
c200: 2a 70 52 65 73 4f 75 74 20 3d 20 30 3b 0a 20 20  *pResOut = 0;.  
c210: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
c220: 3b 0a 7d 0a 73 74 61 74 69 63 20 69 6e 74 20 6e  ;.}.static int n
c230: 6f 6c 6f 63 6b 4c 6f 63 6b 28 73 71 6c 69 74 65  olockLock(sqlite
c240: 33 5f 66 69 6c 65 20 2a 4e 6f 74 55 73 65 64 2c  3_file *NotUsed,
c250: 20 69 6e 74 20 4e 6f 74 55 73 65 64 32 29 7b 0a   int NotUsed2){.
c260: 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
c270: 45 52 32 28 4e 6f 74 55 73 65 64 2c 20 4e 6f 74  ER2(NotUsed, Not
c280: 55 73 65 64 32 29 3b 0a 20 20 72 65 74 75 72 6e  Used2);.  return
c290: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 73 74   SQLITE_OK;.}.st
c2a0: 61 74 69 63 20 69 6e 74 20 6e 6f 6c 6f 63 6b 55  atic int nolockU
c2b0: 6e 6c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69  nlock(sqlite3_fi
c2c0: 6c 65 20 2a 4e 6f 74 55 73 65 64 2c 20 69 6e 74  le *NotUsed, int
c2d0: 20 4e 6f 74 55 73 65 64 32 29 7b 0a 20 20 55 4e   NotUsed2){.  UN
c2e0: 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 32 28  USED_PARAMETER2(
c2f0: 4e 6f 74 55 73 65 64 2c 20 4e 6f 74 55 73 65 64  NotUsed, NotUsed
c300: 32 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  2);.  return SQL
c310: 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
c320: 20 43 6c 6f 73 65 20 74 68 65 20 66 69 6c 65 2e   Close the file.
c330: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6e  .*/.static int n
c340: 6f 6c 6f 63 6b 43 6c 6f 73 65 28 73 71 6c 69 74  olockClose(sqlit
c350: 65 33 5f 66 69 6c 65 20 2a 69 64 29 20 7b 0a 20  e3_file *id) {. 
c360: 20 72 65 74 75 72 6e 20 63 6c 6f 73 65 55 6e 69   return closeUni
c370: 78 46 69 6c 65 28 69 64 29 3b 0a 7d 0a 0a 2f 2a  xFile(id);.}../*
c380: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
c390: 2a 2a 20 45 6e 64 20 6f 66 20 74 68 65 20 6e 6f  ** End of the no
c3a0: 2d 6f 70 20 6c 6f 63 6b 20 69 6d 70 6c 65 6d 65  -op lock impleme
c3b0: 6e 74 61 74 69 6f 6e 20 2a 2a 2a 2a 2a 2a 2a 2a  ntation ********
c3c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a  *************.**
c3d0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
c3e0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
c3f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
c400: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
c410: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f  ************/../
c420: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
c430: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
c440: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
c450: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
c460: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a  **************.*
c470: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
c480: 2a 2a 2a 2a 2a 2a 2a 2a 20 42 65 67 69 6e 20 64  ******** Begin d
c490: 6f 74 2d 66 69 6c 65 20 4c 6f 63 6b 69 6e 67 20  ot-file Locking 
c4a0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
c4b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a  **************.*
c4c0: 2a 0a 2a 2a 20 54 68 65 20 64 6f 74 66 69 6c 65  *.** The dotfile
c4d0: 20 6c 6f 63 6b 69 6e 67 20 69 6d 70 6c 65 6d 65   locking impleme
c4e0: 6e 74 61 74 69 6f 6e 20 75 73 65 73 20 74 68 65  ntation uses the
c4f0: 20 65 78 69 73 74 61 6e 63 65 20 6f 66 20 73 65   existance of se
c500: 70 61 72 61 74 65 20 6c 6f 63 6b 0a 2a 2a 20 66  parate lock.** f
c510: 69 6c 65 73 20 69 6e 20 6f 72 64 65 72 20 74 6f  iles in order to
c520: 20 63 6f 6e 74 72 6f 6c 20 61 63 63 65 73 73 20   control access 
c530: 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  to the database.
c540: 20 20 54 68 69 73 20 77 6f 72 6b 73 20 6f 6e 20    This works on 
c550: 6a 75 73 74 0a 2a 2a 20 61 62 6f 75 74 20 65 76  just.** about ev
c560: 65 72 79 20 66 69 6c 65 73 79 73 74 65 6d 20 69  ery filesystem i
c570: 6d 61 67 69 6e 61 62 6c 65 2e 20 20 42 75 74 20  maginable.  But 
c580: 74 68 65 72 65 20 61 72 65 20 73 65 72 69 6f 75  there are seriou
c590: 73 20 64 6f 77 6e 73 69 64 65 73 3a 0a 2a 2a 0a  s downsides:.**.
c5a0: 2a 2a 20 20 20 20 28 31 29 20 20 54 68 65 72 65  **    (1)  There
c5b0: 20 69 73 20 7a 65 72 6f 20 63 6f 6e 63 75 72 72   is zero concurr
c5c0: 65 6e 63 79 2e 20 20 41 20 73 69 6e 67 6c 65 20  ency.  A single 
c5d0: 72 65 61 64 65 72 20 62 6c 6f 63 6b 73 20 61 6c  reader blocks al
c5e0: 6c 20 6f 74 68 65 72 0a 2a 2a 20 20 20 20 20 20  l other.**      
c5f0: 20 20 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 66     connections f
c600: 72 6f 6d 20 72 65 61 64 69 6e 67 20 6f 72 20 77  rom reading or w
c610: 72 69 74 69 6e 67 20 74 68 65 20 64 61 74 61 62  riting the datab
c620: 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 28 32  ase..**.**    (2
c630: 29 20 20 41 6e 20 61 70 70 6c 69 63 61 74 69 6f  )  An applicatio
c640: 6e 20 63 72 61 73 68 20 6f 72 20 70 6f 77 65 72  n crash or power
c650: 20 6c 6f 73 73 20 63 61 6e 20 6c 65 61 76 65 20   loss can leave 
c660: 73 74 61 6c 65 20 6c 6f 63 6b 20 66 69 6c 65 73  stale lock files
c670: 0a 2a 2a 20 20 20 20 20 20 20 20 20 73 69 74 74  .**         sitt
c680: 69 6e 67 20 61 72 6f 75 6e 64 20 74 68 61 74 20  ing around that 
c690: 6e 65 65 64 20 74 6f 20 62 65 20 63 6c 65 61 72  need to be clear
c6a0: 65 64 20 6d 61 6e 75 61 6c 6c 79 2e 0a 2a 2a 0a  ed manually..**.
c6b0: 2a 2a 20 4e 65 76 65 72 74 68 65 6c 65 73 73 2c  ** Nevertheless,
c6c0: 20 61 20 64 6f 74 6c 6f 63 6b 20 69 73 20 61 6e   a dotlock is an
c6d0: 20 61 70 70 72 6f 70 72 69 61 74 65 20 6c 6f 63   appropriate loc
c6e0: 6b 69 6e 67 20 6d 6f 64 65 20 66 6f 72 20 75 73  king mode for us
c6f0: 65 20 69 66 20 6e 6f 0a 2a 2a 20 6f 74 68 65 72  e if no.** other
c700: 20 6c 6f 63 6b 69 6e 67 20 73 74 72 61 74 65 67   locking strateg
c710: 79 20 69 73 20 61 76 61 69 6c 61 62 6c 65 2e 0a  y is available..
c720: 2a 2a 0a 2a 2a 20 44 6f 74 66 69 6c 65 20 6c 6f  **.** Dotfile lo
c730: 63 6b 69 6e 67 20 77 6f 72 6b 73 20 62 79 20 63  cking works by c
c740: 72 65 61 74 69 6e 67 20 61 20 66 69 6c 65 20 69  reating a file i
c750: 6e 20 74 68 65 20 73 61 6d 65 20 64 69 72 65 63  n the same direc
c760: 74 6f 72 79 20 61 73 20 74 68 65 0a 2a 2a 20 64  tory as the.** d
c770: 61 74 61 62 61 73 65 20 61 6e 64 20 77 69 74 68  atabase and with
c780: 20 74 68 65 20 73 61 6d 65 20 6e 61 6d 65 20 62   the same name b
c790: 75 74 20 77 69 74 68 20 61 20 22 2e 6c 6f 63 6b  ut with a ".lock
c7a0: 22 20 65 78 74 65 6e 73 69 6f 6e 20 61 64 64 65  " extension adde
c7b0: 64 2e 0a 2a 2a 20 54 68 65 20 65 78 69 73 74 61  d..** The exista
c7c0: 6e 63 65 20 6f 66 20 61 20 6c 6f 63 6b 20 66 69  nce of a lock fi
c7d0: 6c 65 20 69 6d 70 6c 69 65 73 20 61 6e 20 45 58  le implies an EX
c7e0: 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 20 20 41  CLUSIVE lock.  A
c7f0: 6c 6c 20 6f 74 68 65 72 20 6c 6f 63 6b 0a 2a 2a  ll other lock.**
c800: 20 74 79 70 65 73 20 28 53 48 41 52 45 44 2c 20   types (SHARED, 
c810: 52 45 53 45 52 56 45 44 2c 20 50 45 4e 44 49 4e  RESERVED, PENDIN
c820: 47 29 20 61 72 65 20 6d 61 70 70 65 64 20 69 6e  G) are mapped in
c830: 74 6f 20 45 58 43 4c 55 53 49 56 45 2e 0a 2a 2f  to EXCLUSIVE..*/
c840: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 69 6c 65  ../*.** The file
c850: 20 73 75 66 66 69 78 20 61 64 64 65 64 20 74 6f   suffix added to
c860: 20 74 68 65 20 64 61 74 61 20 62 61 73 65 20 66   the data base f
c870: 69 6c 65 6e 61 6d 65 20 69 6e 20 6f 72 64 65 72  ilename in order
c880: 20 74 6f 20 63 72 65 61 74 65 20 74 68 65 0a 2a   to create the.*
c890: 2a 20 6c 6f 63 6b 20 66 69 6c 65 2e 0a 2a 2f 0a  * lock file..*/.
c8a0: 23 64 65 66 69 6e 65 20 44 4f 54 4c 4f 43 4b 5f  #define DOTLOCK_
c8b0: 53 55 46 46 49 58 20 22 2e 6c 6f 63 6b 22 0a 0a  SUFFIX ".lock"..
c8c0: 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
c8d0: 6e 65 20 63 68 65 63 6b 73 20 69 66 20 74 68 65  ne checks if the
c8e0: 72 65 20 69 73 20 61 20 52 45 53 45 52 56 45 44  re is a RESERVED
c8f0: 20 6c 6f 63 6b 20 68 65 6c 64 20 6f 6e 20 74 68   lock held on th
c900: 65 20 73 70 65 63 69 66 69 65 64 0a 2a 2a 20 66  e specified.** f
c910: 69 6c 65 20 62 79 20 74 68 69 73 20 6f 72 20 61  ile by this or a
c920: 6e 79 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73  ny other process
c930: 2e 20 49 66 20 73 75 63 68 20 61 20 6c 6f 63 6b  . If such a lock
c940: 20 69 73 20 68 65 6c 64 2c 20 73 65 74 20 2a 70   is held, set *p
c950: 52 65 73 4f 75 74 0a 2a 2a 20 74 6f 20 61 20 6e  ResOut.** to a n
c960: 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75 65 20 6f 74  on-zero value ot
c970: 68 65 72 77 69 73 65 20 2a 70 52 65 73 4f 75 74  herwise *pResOut
c980: 20 69 73 20 73 65 74 20 74 6f 20 7a 65 72 6f 2e   is set to zero.
c990: 20 20 54 68 65 20 72 65 74 75 72 6e 20 76 61 6c    The return val
c9a0: 75 65 0a 2a 2a 20 69 73 20 73 65 74 20 74 6f 20  ue.** is set to 
c9b0: 53 51 4c 49 54 45 5f 4f 4b 20 75 6e 6c 65 73 73  SQLITE_OK unless
c9c0: 20 61 6e 20 49 2f 4f 20 65 72 72 6f 72 20 6f 63   an I/O error oc
c9d0: 63 75 72 73 20 64 75 72 69 6e 67 20 6c 6f 63 6b  curs during lock
c9e0: 20 63 68 65 63 6b 69 6e 67 2e 0a 2a 2a 0a 2a 2a   checking..**.**
c9f0: 20 49 6e 20 64 6f 74 66 69 6c 65 20 6c 6f 63 6b   In dotfile lock
ca00: 69 6e 67 2c 20 65 69 74 68 65 72 20 61 20 6c 6f  ing, either a lo
ca10: 63 6b 20 65 78 69 73 74 73 20 6f 72 20 69 74 20  ck exists or it 
ca20: 64 6f 65 73 20 6e 6f 74 2e 20 20 53 6f 20 69 6e  does not.  So in
ca30: 20 74 68 69 73 0a 2a 2a 20 76 61 72 69 61 74 69   this.** variati
ca40: 6f 6e 20 6f 66 20 43 68 65 63 6b 52 65 73 65 72  on of CheckReser
ca50: 76 65 64 4c 6f 63 6b 28 29 2c 20 2a 70 52 65 73  vedLock(), *pRes
ca60: 4f 75 74 20 69 73 20 73 65 74 20 74 6f 20 74 72  Out is set to tr
ca70: 75 65 20 69 66 20 61 6e 79 20 6c 6f 63 6b 0a 2a  ue if any lock.*
ca80: 2a 20 69 73 20 68 65 6c 64 20 6f 6e 20 74 68 65  * is held on the
ca90: 20 66 69 6c 65 20 61 6e 64 20 66 61 6c 73 65 20   file and false 
caa0: 69 66 20 74 68 65 20 66 69 6c 65 20 69 73 20 75  if the file is u
cab0: 6e 6c 6f 63 6b 65 64 2e 0a 2a 2f 0a 73 74 61 74  nlocked..*/.stat
cac0: 69 63 20 69 6e 74 20 64 6f 74 6c 6f 63 6b 43 68  ic int dotlockCh
cad0: 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 28  eckReservedLock(
cae0: 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64  sqlite3_file *id
caf0: 2c 20 69 6e 74 20 2a 70 52 65 73 4f 75 74 29 20  , int *pResOut) 
cb00: 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
cb10: 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 72 65  ITE_OK;.  int re
cb20: 73 65 72 76 65 64 20 3d 20 30 3b 0a 20 20 75 6e  served = 0;.  un
cb30: 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20  ixFile *pFile = 
cb40: 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 0a  (unixFile*)id;..
cb50: 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f    SimulateIOErro
cb60: 72 28 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  r( return SQLITE
cb70: 5f 49 4f 45 52 52 5f 43 48 45 43 4b 52 45 53 45  _IOERR_CHECKRESE
cb80: 52 56 45 44 4c 4f 43 4b 3b 20 29 3b 0a 20 20 0a  RVEDLOCK; );.  .
cb90: 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 20    assert( pFile 
cba0: 29 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 69  );..  /* Check i
cbb0: 66 20 61 20 74 68 72 65 61 64 20 69 6e 20 74 68  f a thread in th
cbc0: 69 73 20 70 72 6f 63 65 73 73 20 68 6f 6c 64 73  is process holds
cbd0: 20 73 75 63 68 20 61 20 6c 6f 63 6b 20 2a 2f 0a   such a lock */.
cbe0: 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 65 46 69    if( pFile->eFi
cbf0: 6c 65 4c 6f 63 6b 3e 53 48 41 52 45 44 5f 4c 4f  leLock>SHARED_LO
cc00: 43 4b 20 29 7b 0a 20 20 20 20 2f 2a 20 45 69 74  CK ){.    /* Eit
cc10: 68 65 72 20 74 68 69 73 20 63 6f 6e 6e 65 63 74  her this connect
cc20: 69 6f 6e 20 6f 72 20 73 6f 6d 65 20 6f 74 68 65  ion or some othe
cc30: 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 6e 20  r connection in 
cc40: 74 68 65 20 73 61 6d 65 20 70 72 6f 63 65 73 73  the same process
cc50: 0a 20 20 20 20 2a 2a 20 68 6f 6c 64 73 20 61 20  .    ** holds a 
cc60: 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 66 69 6c 65  lock on the file
cc70: 2e 20 20 4e 6f 20 6e 65 65 64 20 74 6f 20 63 68  .  No need to ch
cc80: 65 63 6b 20 66 75 72 74 68 65 72 2e 20 2a 2f 0a  eck further. */.
cc90: 20 20 20 20 72 65 73 65 72 76 65 64 20 3d 20 31      reserved = 1
cca0: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f  ;.  }else{.    /
ccb0: 2a 20 54 68 65 20 6c 6f 63 6b 20 69 73 20 68 65  * The lock is he
ccc0: 6c 64 20 69 66 20 61 6e 64 20 6f 6e 6c 79 20 69  ld if and only i
ccd0: 66 20 74 68 65 20 6c 6f 63 6b 66 69 6c 65 20 65  f the lockfile e
cce0: 78 69 73 74 73 20 2a 2f 0a 20 20 20 20 63 6f 6e  xists */.    con
ccf0: 73 74 20 63 68 61 72 20 2a 7a 4c 6f 63 6b 46 69  st char *zLockFi
cd00: 6c 65 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72  le = (const char
cd10: 2a 29 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67  *)pFile->locking
cd20: 43 6f 6e 74 65 78 74 3b 0a 20 20 20 20 72 65 73  Context;.    res
cd30: 65 72 76 65 64 20 3d 20 61 63 63 65 73 73 28 7a  erved = access(z
cd40: 4c 6f 63 6b 46 69 6c 65 2c 20 30 29 3d 3d 30 3b  LockFile, 0)==0;
cd50: 0a 20 20 7d 0a 20 20 4f 53 54 52 41 43 45 28 28  .  }.  OSTRACE((
cd60: 22 54 45 53 54 20 57 52 2d 4c 4f 43 4b 20 25 64  "TEST WR-LOCK %d
cd70: 20 25 64 20 25 64 20 28 64 6f 74 6c 6f 63 6b 29   %d %d (dotlock)
cd80: 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 72  \n", pFile->h, r
cd90: 63 2c 20 72 65 73 65 72 76 65 64 29 29 3b 0a 20  c, reserved));. 
cda0: 20 2a 70 52 65 73 4f 75 74 20 3d 20 72 65 73 65   *pResOut = rese
cdb0: 72 76 65 64 3b 0a 20 20 72 65 74 75 72 6e 20 72  rved;.  return r
cdc0: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 6b  c;.}../*.** Lock
cdd0: 20 74 68 65 20 66 69 6c 65 20 77 69 74 68 20 74   the file with t
cde0: 68 65 20 6c 6f 63 6b 20 73 70 65 63 69 66 69 65  he lock specifie
cdf0: 64 20 62 79 20 70 61 72 61 6d 65 74 65 72 20 65  d by parameter e
ce00: 46 69 6c 65 4c 6f 63 6b 20 2d 20 6f 6e 65 0a 2a  FileLock - one.*
ce10: 2a 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  * of the followi
ce20: 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28 31  ng:.**.**     (1
ce30: 29 20 53 48 41 52 45 44 5f 4c 4f 43 4b 0a 2a 2a  ) SHARED_LOCK.**
ce40: 20 20 20 20 20 28 32 29 20 52 45 53 45 52 56 45       (2) RESERVE
ce50: 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 33  D_LOCK.**     (3
ce60: 29 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 0a 2a  ) PENDING_LOCK.*
ce70: 2a 20 20 20 20 20 28 34 29 20 45 58 43 4c 55 53  *     (4) EXCLUS
ce80: 49 56 45 5f 4c 4f 43 4b 0a 2a 2a 0a 2a 2a 20 53  IVE_LOCK.**.** S
ce90: 6f 6d 65 74 69 6d 65 73 20 77 68 65 6e 20 72 65  ometimes when re
cea0: 71 75 65 73 74 69 6e 67 20 6f 6e 65 20 6c 6f 63  questing one loc
ceb0: 6b 20 73 74 61 74 65 2c 20 61 64 64 69 74 69 6f  k state, additio
cec0: 6e 61 6c 20 6c 6f 63 6b 20 73 74 61 74 65 73 0a  nal lock states.
ced0: 2a 2a 20 61 72 65 20 69 6e 73 65 72 74 65 64 20  ** are inserted 
cee0: 69 6e 20 62 65 74 77 65 65 6e 2e 20 20 54 68 65  in between.  The
cef0: 20 6c 6f 63 6b 69 6e 67 20 6d 69 67 68 74 20 66   locking might f
cf00: 61 69 6c 20 6f 6e 20 6f 6e 65 20 6f 66 20 74 68  ail on one of th
cf10: 65 20 6c 61 74 65 72 0a 2a 2a 20 74 72 61 6e 73  e later.** trans
cf20: 69 74 69 6f 6e 73 20 6c 65 61 76 69 6e 67 20 74  itions leaving t
cf30: 68 65 20 6c 6f 63 6b 20 73 74 61 74 65 20 64 69  he lock state di
cf40: 66 66 65 72 65 6e 74 20 66 72 6f 6d 20 77 68 61  fferent from wha
cf50: 74 20 69 74 20 73 74 61 72 74 65 64 20 62 75 74  t it started but
cf60: 0a 2a 2a 20 73 74 69 6c 6c 20 73 68 6f 72 74 20  .** still short 
cf70: 6f 66 20 69 74 73 20 67 6f 61 6c 2e 20 20 54 68  of its goal.  Th
cf80: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 68 61 72  e following char
cf90: 74 20 73 68 6f 77 73 20 74 68 65 20 61 6c 6c 6f  t shows the allo
cfa0: 77 65 64 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f  wed.** transitio
cfb0: 6e 73 20 61 6e 64 20 74 68 65 20 69 6e 73 65 72  ns and the inser
cfc0: 74 65 64 20 69 6e 74 65 72 6d 65 64 69 61 74 65  ted intermediate
cfd0: 20 73 74 61 74 65 73 3a 0a 2a 2a 0a 2a 2a 20 20   states:.**.**  
cfe0: 20 20 55 4e 4c 4f 43 4b 45 44 20 2d 3e 20 53 48    UNLOCKED -> SH
cff0: 41 52 45 44 0a 2a 2a 20 20 20 20 53 48 41 52 45  ARED.**    SHARE
d000: 44 20 2d 3e 20 52 45 53 45 52 56 45 44 0a 2a 2a  D -> RESERVED.**
d010: 20 20 20 20 53 48 41 52 45 44 20 2d 3e 20 28 50      SHARED -> (P
d020: 45 4e 44 49 4e 47 29 20 2d 3e 20 45 58 43 4c 55  ENDING) -> EXCLU
d030: 53 49 56 45 0a 2a 2a 20 20 20 20 52 45 53 45 52  SIVE.**    RESER
d040: 56 45 44 20 2d 3e 20 28 50 45 4e 44 49 4e 47 29  VED -> (PENDING)
d050: 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a   -> EXCLUSIVE.**
d060: 20 20 20 20 50 45 4e 44 49 4e 47 20 2d 3e 20 45      PENDING -> E
d070: 58 43 4c 55 53 49 56 45 0a 2a 2a 0a 2a 2a 20 54  XCLUSIVE.**.** T
d080: 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c  his routine will
d090: 20 6f 6e 6c 79 20 69 6e 63 72 65 61 73 65 20 61   only increase a
d0a0: 20 6c 6f 63 6b 2e 20 20 55 73 65 20 74 68 65 20   lock.  Use the 
d0b0: 73 71 6c 69 74 65 33 4f 73 55 6e 6c 6f 63 6b 28  sqlite3OsUnlock(
d0c0: 29 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 74 6f 20  ).** routine to 
d0d0: 6c 6f 77 65 72 20 61 20 6c 6f 63 6b 69 6e 67 20  lower a locking 
d0e0: 6c 65 76 65 6c 2e 0a 2a 2a 0a 2a 2a 20 57 69 74  level..**.** Wit
d0f0: 68 20 64 6f 74 66 69 6c 65 20 6c 6f 63 6b 69 6e  h dotfile lockin
d100: 67 2c 20 77 65 20 72 65 61 6c 6c 79 20 6f 6e 6c  g, we really onl
d110: 79 20 73 75 70 70 6f 72 74 20 73 74 61 74 65 20  y support state 
d120: 28 34 29 3a 20 45 58 43 4c 55 53 49 56 45 2e 0a  (4): EXCLUSIVE..
d130: 2a 2a 20 42 75 74 20 77 65 20 74 72 61 63 6b 20  ** But we track 
d140: 74 68 65 20 6f 74 68 65 72 20 6c 6f 63 6b 69 6e  the other lockin
d150: 67 20 6c 65 76 65 6c 73 20 69 6e 74 65 72 6e 61  g levels interna
d160: 6c 6c 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  lly..*/.static i
d170: 6e 74 20 64 6f 74 6c 6f 63 6b 4c 6f 63 6b 28 73  nt dotlockLock(s
d180: 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c  qlite3_file *id,
d190: 20 69 6e 74 20 65 46 69 6c 65 4c 6f 63 6b 29 20   int eFileLock) 
d1a0: 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46  {.  unixFile *pF
d1b0: 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a  ile = (unixFile*
d1c0: 29 69 64 3b 0a 20 20 69 6e 74 20 66 64 3b 0a 20  )id;.  int fd;. 
d1d0: 20 63 68 61 72 20 2a 7a 4c 6f 63 6b 46 69 6c 65   char *zLockFile
d1e0: 20 3d 20 28 63 68 61 72 20 2a 29 70 46 69 6c 65   = (char *)pFile
d1f0: 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  ->lockingContext
d200: 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  ;.  int rc = SQL
d210: 49 54 45 5f 4f 4b 3b 0a 0a 0a 20 20 2f 2a 20 49  ITE_OK;...  /* I
d220: 66 20 77 65 20 68 61 76 65 20 61 6e 79 20 6c 6f  f we have any lo
d230: 63 6b 2c 20 74 68 65 6e 20 74 68 65 20 6c 6f 63  ck, then the loc
d240: 6b 20 66 69 6c 65 20 61 6c 72 65 61 64 79 20 65  k file already e
d250: 78 69 73 74 73 2e 20 20 41 6c 6c 20 77 65 20 68  xists.  All we h
d260: 61 76 65 0a 20 20 2a 2a 20 74 6f 20 64 6f 20 69  ave.  ** to do i
d270: 73 20 61 64 6a 75 73 74 20 6f 75 72 20 69 6e 74  s adjust our int
d280: 65 72 6e 61 6c 20 72 65 63 6f 72 64 20 6f 66 20  ernal record of 
d290: 74 68 65 20 6c 6f 63 6b 20 6c 65 76 65 6c 2e 0a  the lock level..
d2a0: 20 20 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c 65    */.  if( pFile
d2b0: 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3e 20 4e 4f  ->eFileLock > NO
d2c0: 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 70 46 69  _LOCK ){.    pFi
d2d0: 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20  le->eFileLock = 
d2e0: 65 46 69 6c 65 4c 6f 63 6b 3b 0a 23 69 66 20 21  eFileLock;.#if !
d2f0: 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20 20 20 2f  OS_VXWORKS.    /
d300: 2a 20 41 6c 77 61 79 73 20 75 70 64 61 74 65 20  * Always update 
d310: 74 68 65 20 74 69 6d 65 73 74 61 6d 70 20 6f 6e  the timestamp on
d320: 20 74 68 65 20 6f 6c 64 20 66 69 6c 65 20 2a 2f   the old file */
d330: 0a 20 20 20 20 75 74 69 6d 65 73 28 7a 4c 6f 63  .    utimes(zLoc
d340: 6b 46 69 6c 65 2c 20 4e 55 4c 4c 29 3b 0a 23 65  kFile, NULL);.#e
d350: 6e 64 69 66 0a 20 20 20 20 72 65 74 75 72 6e 20  ndif.    return 
d360: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20  SQLITE_OK;.  }. 
d370: 20 0a 20 20 2f 2a 20 67 72 61 62 20 61 6e 20 65   .  /* grab an e
d380: 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20 2a 2f  xclusive lock */
d390: 0a 20 20 66 64 20 3d 20 6f 70 65 6e 28 7a 4c 6f  .  fd = open(zLo
d3a0: 63 6b 46 69 6c 65 2c 4f 5f 52 44 4f 4e 4c 59 7c  ckFile,O_RDONLY|
d3b0: 4f 5f 43 52 45 41 54 7c 4f 5f 45 58 43 4c 2c 30  O_CREAT|O_EXCL,0
d3c0: 36 30 30 29 3b 0a 20 20 69 66 28 20 66 64 3c 30  600);.  if( fd<0
d3d0: 20 29 7b 0a 20 20 20 20 2f 2a 20 66 61 69 6c 65   ){.    /* faile
d3e0: 64 20 74 6f 20 6f 70 65 6e 2f 63 72 65 61 74 65  d to open/create
d3f0: 20 74 68 65 20 66 69 6c 65 2c 20 73 6f 6d 65 6f   the file, someo
d400: 6e 65 20 65 6c 73 65 20 6d 61 79 20 68 61 76 65  ne else may have
d410: 20 73 74 6f 6c 65 6e 20 74 68 65 20 6c 6f 63 6b   stolen the lock
d420: 20 2a 2f 0a 20 20 20 20 69 6e 74 20 74 45 72 72   */.    int tErr
d430: 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20  no = errno;.    
d440: 69 66 28 20 45 45 58 49 53 54 20 3d 3d 20 74 45  if( EEXIST == tE
d450: 72 72 6e 6f 20 29 7b 0a 20 20 20 20 20 20 72 63  rrno ){.      rc
d460: 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a   = SQLITE_BUSY;.
d470: 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20      } else {.   
d480: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 45 72     rc = sqliteEr
d490: 72 6f 72 46 72 6f 6d 50 6f 73 69 78 45 72 72 6f  rorFromPosixErro
d4a0: 72 28 74 45 72 72 6e 6f 2c 20 53 51 4c 49 54 45  r(tErrno, SQLITE
d4b0: 5f 49 4f 45 52 52 5f 4c 4f 43 4b 29 3b 0a 20 20  _IOERR_LOCK);.  
d4c0: 20 20 20 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f      if( IS_LOCK_
d4d0: 45 52 52 4f 52 28 72 63 29 20 29 7b 0a 20 20 20  ERROR(rc) ){.   
d4e0: 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74       pFile->last
d4f0: 45 72 72 6e 6f 20 3d 20 74 45 72 72 6e 6f 3b 0a  Errno = tErrno;.
d500: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
d510: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d    return rc;.  }
d520: 20 0a 20 20 69 66 28 20 63 6c 6f 73 65 28 66 64   .  if( close(fd
d530: 29 20 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e  ) ){.    pFile->
d540: 6c 61 73 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e  lastErrno = errn
d550: 6f 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  o;.    rc = SQLI
d560: 54 45 5f 49 4f 45 52 52 5f 43 4c 4f 53 45 3b 0a  TE_IOERR_CLOSE;.
d570: 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 67 6f 74 20    }.  .  /* got 
d580: 69 74 2c 20 73 65 74 20 74 68 65 20 74 79 70 65  it, set the type
d590: 20 61 6e 64 20 72 65 74 75 72 6e 20 6f 6b 20 2a   and return ok *
d5a0: 2f 0a 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65  /.  pFile->eFile
d5b0: 4c 6f 63 6b 20 3d 20 65 46 69 6c 65 4c 6f 63 6b  Lock = eFileLock
d5c0: 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
d5d0: 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 77 65 72 20 74 68  ../*.** Lower th
d5e0: 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20  e locking level 
d5f0: 6f 6e 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  on file descript
d600: 6f 72 20 70 46 69 6c 65 20 74 6f 20 65 46 69 6c  or pFile to eFil
d610: 65 4c 6f 63 6b 2e 20 20 65 46 69 6c 65 4c 6f 63  eLock.  eFileLoc
d620: 6b 0a 2a 2a 20 6d 75 73 74 20 62 65 20 65 69 74  k.** must be eit
d630: 68 65 72 20 4e 4f 5f 4c 4f 43 4b 20 6f 72 20 53  her NO_LOCK or S
d640: 48 41 52 45 44 5f 4c 4f 43 4b 2e 0a 2a 2a 0a 2a  HARED_LOCK..**.*
d650: 2a 20 49 66 20 74 68 65 20 6c 6f 63 6b 69 6e 67  * If the locking
d660: 20 6c 65 76 65 6c 20 6f 66 20 74 68 65 20 66 69   level of the fi
d670: 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 69 73  le descriptor is
d680: 20 61 6c 72 65 61 64 79 20 61 74 20 6f 72 20 62   already at or b
d690: 65 6c 6f 77 0a 2a 2a 20 74 68 65 20 72 65 71 75  elow.** the requ
d6a0: 65 73 74 65 64 20 6c 6f 63 6b 69 6e 67 20 6c 65  ested locking le
d6b0: 76 65 6c 2c 20 74 68 69 73 20 72 6f 75 74 69 6e  vel, this routin
d6c0: 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a  e is a no-op..**
d6d0: 0a 2a 2a 20 57 68 65 6e 20 74 68 65 20 6c 6f 63  .** When the loc
d6e0: 6b 69 6e 67 20 6c 65 76 65 6c 20 72 65 61 63 68  king level reach
d6f0: 65 73 20 4e 4f 5f 4c 4f 43 4b 2c 20 64 65 6c 65  es NO_LOCK, dele
d700: 74 65 20 74 68 65 20 6c 6f 63 6b 20 66 69 6c 65  te the lock file
d710: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
d720: 64 6f 74 6c 6f 63 6b 55 6e 6c 6f 63 6b 28 73 71  dotlockUnlock(sq
d730: 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20  lite3_file *id, 
d740: 69 6e 74 20 65 46 69 6c 65 4c 6f 63 6b 29 20 7b  int eFileLock) {
d750: 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69  .  unixFile *pFi
d760: 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29  le = (unixFile*)
d770: 69 64 3b 0a 20 20 63 68 61 72 20 2a 7a 4c 6f 63  id;.  char *zLoc
d780: 6b 46 69 6c 65 20 3d 20 28 63 68 61 72 20 2a 29  kFile = (char *)
d790: 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f  pFile->lockingCo
d7a0: 6e 74 65 78 74 3b 0a 0a 20 20 61 73 73 65 72 74  ntext;..  assert
d7b0: 28 20 70 46 69 6c 65 20 29 3b 0a 20 20 4f 53 54  ( pFile );.  OST
d7c0: 52 41 43 45 28 28 22 55 4e 4c 4f 43 4b 20 20 25  RACE(("UNLOCK  %
d7d0: 64 20 25 64 20 77 61 73 20 25 64 20 70 69 64 3d  d %d was %d pid=
d7e0: 25 64 20 28 64 6f 74 6c 6f 63 6b 29 5c 6e 22 2c  %d (dotlock)\n",
d7f0: 20 70 46 69 6c 65 2d 3e 68 2c 20 65 46 69 6c 65   pFile->h, eFile
d800: 4c 6f 63 6b 2c 0a 09 20 20 20 70 46 69 6c 65 2d  Lock,..   pFile-
d810: 3e 65 46 69 6c 65 4c 6f 63 6b 2c 20 67 65 74 70  >eFileLock, getp
d820: 69 64 28 29 29 29 3b 0a 20 20 61 73 73 65 72 74  id()));.  assert
d830: 28 20 65 46 69 6c 65 4c 6f 63 6b 3c 3d 53 48 41  ( eFileLock<=SHA
d840: 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 0a 20  RED_LOCK );.  . 
d850: 20 2f 2a 20 6e 6f 2d 6f 70 20 69 66 20 70 6f 73   /* no-op if pos
d860: 73 69 62 6c 65 20 2a 2f 0a 20 20 69 66 28 20 70  sible */.  if( p
d870: 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d  File->eFileLock=
d880: 3d 65 46 69 6c 65 4c 6f 63 6b 20 29 7b 0a 20 20  =eFileLock ){.  
d890: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
d8a0: 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 6f  OK;.  }..  /* To
d8b0: 20 64 6f 77 6e 67 72 61 64 65 20 74 6f 20 73 68   downgrade to sh
d8c0: 61 72 65 64 2c 20 73 69 6d 70 6c 79 20 75 70 64  ared, simply upd
d8d0: 61 74 65 20 6f 75 72 20 69 6e 74 65 72 6e 61 6c  ate our internal
d8e0: 20 6e 6f 74 69 6f 6e 20 6f 66 20 74 68 65 0a 20   notion of the. 
d8f0: 20 2a 2a 20 6c 6f 63 6b 20 73 74 61 74 65 2e 20   ** lock state. 
d900: 20 4e 6f 20 6e 65 65 64 20 74 6f 20 6d 65 73 73   No need to mess
d910: 20 77 69 74 68 20 74 68 65 20 66 69 6c 65 20 6f   with the file o
d920: 6e 20 64 69 73 6b 2e 0a 20 20 2a 2f 0a 20 20 69  n disk..  */.  i
d930: 66 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48  f( eFileLock==SH
d940: 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20  ARED_LOCK ){.   
d950: 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63   pFile->eFileLoc
d960: 6b 20 3d 20 53 48 41 52 45 44 5f 4c 4f 43 4b 3b  k = SHARED_LOCK;
d970: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
d980: 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 0a 20 20  TE_OK;.  }.  .  
d990: 2f 2a 20 54 6f 20 66 75 6c 6c 79 20 75 6e 6c 6f  /* To fully unlo
d9a0: 63 6b 20 74 68 65 20 64 61 74 61 62 61 73 65 2c  ck the database,
d9b0: 20 64 65 6c 65 74 65 20 74 68 65 20 6c 6f 63 6b   delete the lock
d9c0: 20 66 69 6c 65 20 2a 2f 0a 20 20 61 73 73 65 72   file */.  asser
d9d0: 74 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 4e 4f  t( eFileLock==NO
d9e0: 5f 4c 4f 43 4b 20 29 3b 0a 20 20 69 66 28 20 75  _LOCK );.  if( u
d9f0: 6e 6c 69 6e 6b 28 7a 4c 6f 63 6b 46 69 6c 65 29  nlink(zLockFile)
da00: 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 63 20 3d   ){.    int rc =
da10: 20 30 3b 0a 20 20 20 20 69 6e 74 20 74 45 72 72   0;.    int tErr
da20: 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20  no = errno;.    
da30: 69 66 28 20 45 4e 4f 45 4e 54 20 21 3d 20 74 45  if( ENOENT != tE
da40: 72 72 6e 6f 20 29 7b 0a 20 20 20 20 20 20 72 63  rrno ){.      rc
da50: 20 3d 20 73 71 6c 69 74 65 45 72 72 6f 72 46 72   = sqliteErrorFr
da60: 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28 74 45 72  omPosixError(tEr
da70: 72 6e 6f 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52  rno, SQLITE_IOER
da80: 52 5f 55 4e 4c 4f 43 4b 29 3b 0a 20 20 20 20 7d  R_UNLOCK);.    }
da90: 0a 20 20 20 20 69 66 28 20 49 53 5f 4c 4f 43 4b  .    if( IS_LOCK
daa0: 5f 45 52 52 4f 52 28 72 63 29 20 29 7b 0a 20 20  _ERROR(rc) ){.  
dab0: 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45      pFile->lastE
dac0: 72 72 6e 6f 20 3d 20 74 45 72 72 6e 6f 3b 0a 20  rrno = tErrno;. 
dad0: 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20     }.    return 
dae0: 72 63 3b 20 0a 20 20 7d 0a 20 20 70 46 69 6c 65  rc; .  }.  pFile
daf0: 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 4e 4f  ->eFileLock = NO
db00: 5f 4c 4f 43 4b 3b 0a 20 20 72 65 74 75 72 6e 20  _LOCK;.  return 
db10: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
db20: 0a 2a 2a 20 43 6c 6f 73 65 20 61 20 66 69 6c 65  .** Close a file
db30: 2e 20 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65  .  Make sure the
db40: 20 6c 6f 63 6b 20 68 61 73 20 62 65 65 6e 20 72   lock has been r
db50: 65 6c 65 61 73 65 64 20 62 65 66 6f 72 65 20 63  eleased before c
db60: 6c 6f 73 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69  losing..*/.stati
db70: 63 20 69 6e 74 20 64 6f 74 6c 6f 63 6b 43 6c 6f  c int dotlockClo
db80: 73 65 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  se(sqlite3_file 
db90: 2a 69 64 29 20 7b 0a 20 20 69 6e 74 20 72 63 3b  *id) {.  int rc;
dba0: 0a 20 20 69 66 28 20 69 64 20 29 7b 0a 20 20 20  .  if( id ){.   
dbb0: 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65   unixFile *pFile
dbc0: 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64   = (unixFile*)id
dbd0: 3b 0a 20 20 20 20 64 6f 74 6c 6f 63 6b 55 6e 6c  ;.    dotlockUnl
dbe0: 6f 63 6b 28 69 64 2c 20 4e 4f 5f 4c 4f 43 4b 29  ock(id, NO_LOCK)
dbf0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  ;.    sqlite3_fr
dc00: 65 65 28 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e  ee(pFile->lockin
dc10: 67 43 6f 6e 74 65 78 74 29 3b 0a 20 20 7d 0a 20  gContext);.  }. 
dc20: 20 72 63 20 3d 20 63 6c 6f 73 65 55 6e 69 78 46   rc = closeUnixF
dc30: 69 6c 65 28 69 64 29 3b 0a 20 20 72 65 74 75 72  ile(id);.  retur
dc40: 6e 20 72 63 3b 0a 7d 0a 2f 2a 2a 2a 2a 2a 2a 2a  n rc;.}./*******
dc50: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64 20  *********** End 
dc60: 6f 66 20 74 68 65 20 64 6f 74 2d 66 69 6c 65 20  of the dot-file 
dc70: 6c 6f 63 6b 20 69 6d 70 6c 65 6d 65 6e 74 61 74  lock implementat
dc80: 69 6f 6e 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ion ************
dc90: 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a  *******.********
dca0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
dcb0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
dcc0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
dcd0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
dce0: 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a  ******/../******
dcf0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
dd00: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
dd10: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
dd20: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
dd30: 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a  ********.*******
dd40: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
dd50: 2a 2a 2a 20 42 65 67 69 6e 20 66 6c 6f 63 6b 20  *** Begin flock 
dd60: 4c 6f 63 6b 69 6e 67 20 2a 2a 2a 2a 2a 2a 2a 2a  Locking ********
dd70: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
dd80: 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 55  ********.**.** U
dd90: 73 65 20 74 68 65 20 66 6c 6f 63 6b 28 29 20 73  se the flock() s
dda0: 79 73 74 65 6d 20 63 61 6c 6c 20 74 6f 20 64 6f  ystem call to do
ddb0: 20 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 2e 0a 2a   file locking..*
ddc0: 2a 0a 2a 2a 20 66 6c 6f 63 6b 28 29 20 6c 6f 63  *.** flock() loc
ddd0: 6b 69 6e 67 20 69 73 20 6c 69 6b 65 20 64 6f 74  king is like dot
dde0: 2d 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 20 69 6e  -file locking in
ddf0: 20 74 68 61 74 20 74 68 65 20 76 61 72 69 6f 75   that the variou
de00: 73 0a 2a 2a 20 66 69 6e 65 2d 67 72 61 69 6e 20  s.** fine-grain 
de10: 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 73 20 73  locking levels s
de20: 75 70 70 6f 72 74 65 64 20 62 79 20 53 51 4c 69  upported by SQLi
de30: 74 65 20 61 72 65 20 63 6f 6c 6c 61 70 73 65 64  te are collapsed
de40: 20 69 6e 74 6f 0a 2a 2a 20 61 20 73 69 6e 67 6c   into.** a singl
de50: 65 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b  e exclusive lock
de60: 2e 20 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64  .  In other word
de70: 73 2c 20 53 48 41 52 45 44 2c 20 52 45 53 45 52  s, SHARED, RESER
de80: 56 45 44 2c 20 61 6e 64 0a 2a 2a 20 50 45 4e 44  VED, and.** PEND
de90: 49 4e 47 20 6c 6f 63 6b 73 20 61 72 65 20 74 68  ING locks are th
dea0: 65 20 73 61 6d 65 20 74 68 69 6e 67 20 61 73 20  e same thing as 
deb0: 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63  an EXCLUSIVE loc
dec0: 6b 2e 20 20 53 51 4c 69 74 65 0a 2a 2a 20 73 74  k.  SQLite.** st
ded0: 69 6c 6c 20 77 6f 72 6b 73 20 77 68 65 6e 20 79  ill works when y
dee0: 6f 75 20 64 6f 20 74 68 69 73 2c 20 62 75 74 20  ou do this, but 
def0: 63 6f 6e 63 75 72 72 65 6e 63 79 20 69 73 20 72  concurrency is r
df00: 65 64 75 63 65 64 20 73 69 6e 63 65 0a 2a 2a 20  educed since.** 
df10: 6f 6e 6c 79 20 61 20 73 69 6e 67 6c 65 20 70 72  only a single pr
df20: 6f 63 65 73 73 20 63 61 6e 20 62 65 20 72 65 61  ocess can be rea
df30: 64 69 6e 67 20 74 68 65 20 64 61 74 61 62 61 73  ding the databas
df40: 65 20 61 74 20 61 20 74 69 6d 65 2e 0a 2a 2a 0a  e at a time..**.
df50: 2a 2a 20 4f 6d 69 74 20 74 68 69 73 20 73 65 63  ** Omit this sec
df60: 74 69 6f 6e 20 69 66 20 53 51 4c 49 54 45 5f 45  tion if SQLITE_E
df70: 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54  NABLE_LOCKING_ST
df80: 59 4c 45 20 69 73 20 74 75 72 6e 65 64 20 6f 66  YLE is turned of
df90: 66 20 6f 72 20 69 66 0a 2a 2a 20 63 6f 6d 70 69  f or if.** compi
dfa0: 6c 69 6e 67 20 66 6f 72 20 56 58 57 4f 52 4b 53  ling for VXWORKS
dfb0: 2e 0a 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f  ..*/.#if SQLITE_
dfc0: 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53  ENABLE_LOCKING_S
dfd0: 54 59 4c 45 20 26 26 20 21 4f 53 5f 56 58 57 4f  TYLE && !OS_VXWO
dfe0: 52 4b 53 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  RKS../*.** This 
dff0: 72 6f 75 74 69 6e 65 20 63 68 65 63 6b 73 20 69  routine checks i
e000: 66 20 74 68 65 72 65 20 69 73 20 61 20 52 45 53  f there is a RES
e010: 45 52 56 45 44 20 6c 6f 63 6b 20 68 65 6c 64 20  ERVED lock held 
e020: 6f 6e 20 74 68 65 20 73 70 65 63 69 66 69 65 64  on the specified
e030: 0a 2a 2a 20 66 69 6c 65 20 62 79 20 74 68 69 73  .** file by this
e040: 20 6f 72 20 61 6e 79 20 6f 74 68 65 72 20 70 72   or any other pr
e050: 6f 63 65 73 73 2e 20 49 66 20 73 75 63 68 20 61  ocess. If such a
e060: 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64 2c 20 73   lock is held, s
e070: 65 74 20 2a 70 52 65 73 4f 75 74 0a 2a 2a 20 74  et *pResOut.** t
e080: 6f 20 61 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c  o a non-zero val
e090: 75 65 20 6f 74 68 65 72 77 69 73 65 20 2a 70 52  ue otherwise *pR
e0a0: 65 73 4f 75 74 20 69 73 20 73 65 74 20 74 6f 20  esOut is set to 
e0b0: 7a 65 72 6f 2e 20 20 54 68 65 20 72 65 74 75 72  zero.  The retur
e0c0: 6e 20 76 61 6c 75 65 0a 2a 2a 20 69 73 20 73 65  n value.** is se
e0d0: 74 20 74 6f 20 53 51 4c 49 54 45 5f 4f 4b 20 75  t to SQLITE_OK u
e0e0: 6e 6c 65 73 73 20 61 6e 20 49 2f 4f 20 65 72 72  nless an I/O err
e0f0: 6f 72 20 6f 63 63 75 72 73 20 64 75 72 69 6e 67  or occurs during
e100: 20 6c 6f 63 6b 20 63 68 65 63 6b 69 6e 67 2e 0a   lock checking..
e110: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 6c  */.static int fl
e120: 6f 63 6b 43 68 65 63 6b 52 65 73 65 72 76 65 64  ockCheckReserved
e130: 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c  Lock(sqlite3_fil
e140: 65 20 2a 69 64 2c 20 69 6e 74 20 2a 70 52 65 73  e *id, int *pRes
e150: 4f 75 74 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  Out){.  int rc =
e160: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e   SQLITE_OK;.  in
e170: 74 20 72 65 73 65 72 76 65 64 20 3d 20 30 3b 0a  t reserved = 0;.
e180: 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c    unixFile *pFil
e190: 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69  e = (unixFile*)i
e1a0: 64 3b 0a 20 20 0a 20 20 53 69 6d 75 6c 61 74 65  d;.  .  Simulate
e1b0: 49 4f 45 72 72 6f 72 28 20 72 65 74 75 72 6e 20  IOError( return 
e1c0: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43 48 45  SQLITE_IOERR_CHE
e1d0: 43 4b 52 45 53 45 52 56 45 44 4c 4f 43 4b 3b 20  CKRESERVEDLOCK; 
e1e0: 29 3b 0a 20 20 0a 20 20 61 73 73 65 72 74 28 20  );.  .  assert( 
e1f0: 70 46 69 6c 65 20 29 3b 0a 20 20 0a 20 20 2f 2a  pFile );.  .  /*
e200: 20 43 68 65 63 6b 20 69 66 20 61 20 74 68 72 65   Check if a thre
e210: 61 64 20 69 6e 20 74 68 69 73 20 70 72 6f 63 65  ad in this proce
e220: 73 73 20 68 6f 6c 64 73 20 73 75 63 68 20 61 20  ss holds such a 
e230: 6c 6f 63 6b 20 2a 2f 0a 20 20 69 66 28 20 70 46  lock */.  if( pF
e240: 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3e 53  ile->eFileLock>S
e250: 48 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20  HARED_LOCK ){.  
e260: 20 20 72 65 73 65 72 76 65 64 20 3d 20 31 3b 0a    reserved = 1;.
e270: 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 4f 74 68 65    }.  .  /* Othe
e280: 72 77 69 73 65 20 73 65 65 20 69 66 20 73 6f 6d  rwise see if som
e290: 65 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20  e other process 
e2a0: 68 6f 6c 64 73 20 69 74 2e 20 2a 2f 0a 20 20 69  holds it. */.  i
e2b0: 66 28 20 21 72 65 73 65 72 76 65 64 20 29 7b 0a  f( !reserved ){.
e2c0: 20 20 20 20 2f 2a 20 61 74 74 65 6d 70 74 20 74      /* attempt t
e2d0: 6f 20 67 65 74 20 74 68 65 20 6c 6f 63 6b 20 2a  o get the lock *
e2e0: 2f 0a 20 20 20 20 69 6e 74 20 6c 72 63 20 3d 20  /.    int lrc = 
e2f0: 66 6c 6f 63 6b 28 70 46 69 6c 65 2d 3e 68 2c 20  flock(pFile->h, 
e300: 4c 4f 43 4b 5f 45 58 20 7c 20 4c 4f 43 4b 5f 4e  LOCK_EX | LOCK_N
e310: 42 29 3b 0a 20 20 20 20 69 66 28 20 21 6c 72 63  B);.    if( !lrc
e320: 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 67 6f 74   ){.      /* got
e330: 20 74 68 65 20 6c 6f 63 6b 2c 20 75 6e 6c 6f 63   the lock, unloc
e340: 6b 20 69 74 20 2a 2f 0a 20 20 20 20 20 20 6c 72  k it */.      lr
e350: 63 20 3d 20 66 6c 6f 63 6b 28 70 46 69 6c 65 2d  c = flock(pFile-
e360: 3e 68 2c 20 4c 4f 43 4b 5f 55 4e 29 3b 0a 20 20  >h, LOCK_UN);.  
e370: 20 20 20 20 69 66 20 28 20 6c 72 63 20 29 20 7b      if ( lrc ) {
e380: 0a 20 20 20 20 20 20 20 20 69 6e 74 20 74 45 72  .        int tEr
e390: 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20  rno = errno;.   
e3a0: 20 20 20 20 20 2f 2a 20 75 6e 6c 6f 63 6b 20 66       /* unlock f
e3b0: 61 69 6c 65 64 20 77 69 74 68 20 61 6e 20 65 72  ailed with an er
e3c0: 72 6f 72 20 2a 2f 0a 20 20 20 20 20 20 20 20 6c  ror */.        l
e3d0: 72 63 20 3d 20 73 71 6c 69 74 65 45 72 72 6f 72  rc = sqliteError
e3e0: 46 72 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28 74  FromPosixError(t
e3f0: 45 72 72 6e 6f 2c 20 53 51 4c 49 54 45 5f 49 4f  Errno, SQLITE_IO
e400: 45 52 52 5f 55 4e 4c 4f 43 4b 29 3b 20 0a 20 20  ERR_UNLOCK); .  
e410: 20 20 20 20 20 20 69 66 28 20 49 53 5f 4c 4f 43        if( IS_LOC
e420: 4b 5f 45 52 52 4f 52 28 6c 72 63 29 20 29 7b 0a  K_ERROR(lrc) ){.
e430: 20 20 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d            pFile-
e440: 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 74 45 72  >lastErrno = tEr
e450: 72 6e 6f 3b 0a 20 20 20 20 20 20 20 20 20 20 72  rno;.          r
e460: 63 20 3d 20 6c 72 63 3b 0a 20 20 20 20 20 20 20  c = lrc;.       
e470: 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
e480: 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 69 6e   else {.      in
e490: 74 20 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f  t tErrno = errno
e4a0: 3b 0a 20 20 20 20 20 20 72 65 73 65 72 76 65 64  ;.      reserved
e4b0: 20 3d 20 31 3b 0a 20 20 20 20 20 20 2f 2a 20 73   = 1;.      /* s
e4c0: 6f 6d 65 6f 6e 65 20 65 6c 73 65 20 6d 69 67 68  omeone else migh
e4d0: 74 20 68 61 76 65 20 69 74 20 72 65 73 65 72 76  t have it reserv
e4e0: 65 64 20 2a 2f 0a 20 20 20 20 20 20 6c 72 63 20  ed */.      lrc 
e4f0: 3d 20 73 71 6c 69 74 65 45 72 72 6f 72 46 72 6f  = sqliteErrorFro
e500: 6d 50 6f 73 69 78 45 72 72 6f 72 28 74 45 72 72  mPosixError(tErr
e510: 6e 6f 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  no, SQLITE_IOERR
e520: 5f 4c 4f 43 4b 29 3b 20 0a 20 20 20 20 20 20 69  _LOCK); .      i
e530: 66 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52  f( IS_LOCK_ERROR
e540: 28 6c 72 63 29 20 29 7b 0a 20 20 20 20 20 20 20  (lrc) ){.       
e550: 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e   pFile->lastErrn
e560: 6f 20 3d 20 74 45 72 72 6e 6f 3b 0a 20 20 20 20  o = tErrno;.    
e570: 20 20 20 20 72 63 20 3d 20 6c 72 63 3b 0a 20 20      rc = lrc;.  
e580: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
e590: 20 20 4f 53 54 52 41 43 45 28 28 22 54 45 53 54    OSTRACE(("TEST
e5a0: 20 57 52 2d 4c 4f 43 4b 20 25 64 20 25 64 20 25   WR-LOCK %d %d %
e5b0: 64 20 28 66 6c 6f 63 6b 29 5c 6e 22 2c 20 70 46  d (flock)\n", pF
e5c0: 69 6c 65 2d 3e 68 2c 20 72 63 2c 20 72 65 73 65  ile->h, rc, rese
e5d0: 72 76 65 64 29 29 3b 0a 0a 23 69 66 64 65 66 20  rved));..#ifdef 
e5e0: 53 51 4c 49 54 45 5f 49 47 4e 4f 52 45 5f 46 4c  SQLITE_IGNORE_FL
e5f0: 4f 43 4b 5f 4c 4f 43 4b 5f 45 52 52 4f 52 53 0a  OCK_LOCK_ERRORS.
e600: 20 20 69 66 28 20 28 72 63 20 26 20 53 51 4c 49    if( (rc & SQLI
e610: 54 45 5f 49 4f 45 52 52 29 20 3d 3d 20 53 51 4c  TE_IOERR) == SQL
e620: 49 54 45 5f 49 4f 45 52 52 20 29 7b 0a 20 20 20  ITE_IOERR ){.   
e630: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
e640: 0a 20 20 20 20 72 65 73 65 72 76 65 64 3d 31 3b  .    reserved=1;
e650: 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53  .  }.#endif /* S
e660: 51 4c 49 54 45 5f 49 47 4e 4f 52 45 5f 46 4c 4f  QLITE_IGNORE_FLO
e670: 43 4b 5f 4c 4f 43 4b 5f 45 52 52 4f 52 53 20 2a  CK_LOCK_ERRORS *
e680: 2f 0a 20 20 2a 70 52 65 73 4f 75 74 20 3d 20 72  /.  *pResOut = r
e690: 65 73 65 72 76 65 64 3b 0a 20 20 72 65 74 75 72  eserved;.  retur
e6a0: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c  n rc;.}../*.** L
e6b0: 6f 63 6b 20 74 68 65 20 66 69 6c 65 20 77 69 74  ock the file wit
e6c0: 68 20 74 68 65 20 6c 6f 63 6b 20 73 70 65 63 69  h the lock speci
e6d0: 66 69 65 64 20 62 79 20 70 61 72 61 6d 65 74 65  fied by paramete
e6e0: 72 20 65 46 69 6c 65 4c 6f 63 6b 20 2d 20 6f 6e  r eFileLock - on
e6f0: 65 0a 2a 2a 20 6f 66 20 74 68 65 20 66 6f 6c 6c  e.** of the foll
e700: 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  owing:.**.**    
e710: 20 28 31 29 20 53 48 41 52 45 44 5f 4c 4f 43 4b   (1) SHARED_LOCK
e720: 0a 2a 2a 20 20 20 20 20 28 32 29 20 52 45 53 45  .**     (2) RESE
e730: 52 56 45 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20  RVED_LOCK.**    
e740: 20 28 33 29 20 50 45 4e 44 49 4e 47 5f 4c 4f 43   (3) PENDING_LOC
e750: 4b 0a 2a 2a 20 20 20 20 20 28 34 29 20 45 58 43  K.**     (4) EXC
e760: 4c 55 53 49 56 45 5f 4c 4f 43 4b 0a 2a 2a 0a 2a  LUSIVE_LOCK.**.*
e770: 2a 20 53 6f 6d 65 74 69 6d 65 73 20 77 68 65 6e  * Sometimes when
e780: 20 72 65 71 75 65 73 74 69 6e 67 20 6f 6e 65 20   requesting one 
e790: 6c 6f 63 6b 20 73 74 61 74 65 2c 20 61 64 64 69  lock state, addi
e7a0: 74 69 6f 6e 61 6c 20 6c 6f 63 6b 20 73 74 61 74  tional lock stat
e7b0: 65 73 0a 2a 2a 20 61 72 65 20 69 6e 73 65 72 74  es.** are insert
e7c0: 65 64 20 69 6e 20 62 65 74 77 65 65 6e 2e 20 20  ed in between.  
e7d0: 54 68 65 20 6c 6f 63 6b 69 6e 67 20 6d 69 67 68  The locking migh
e7e0: 74 20 66 61 69 6c 20 6f 6e 20 6f 6e 65 20 6f 66  t fail on one of
e7f0: 20 74 68 65 20 6c 61 74 65 72 0a 2a 2a 20 74 72   the later.** tr
e800: 61 6e 73 69 74 69 6f 6e 73 20 6c 65 61 76 69 6e  ansitions leavin
e810: 67 20 74 68 65 20 6c 6f 63 6b 20 73 74 61 74 65  g the lock state
e820: 20 64 69 66 66 65 72 65 6e 74 20 66 72 6f 6d 20   different from 
e830: 77 68 61 74 20 69 74 20 73 74 61 72 74 65 64 20  what it started 
e840: 62 75 74 0a 2a 2a 20 73 74 69 6c 6c 20 73 68 6f  but.** still sho
e850: 72 74 20 6f 66 20 69 74 73 20 67 6f 61 6c 2e 20  rt of its goal. 
e860: 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63   The following c
e870: 68 61 72 74 20 73 68 6f 77 73 20 74 68 65 20 61  hart shows the a
e880: 6c 6c 6f 77 65 64 0a 2a 2a 20 74 72 61 6e 73 69  llowed.** transi
e890: 74 69 6f 6e 73 20 61 6e 64 20 74 68 65 20 69 6e  tions and the in
e8a0: 73 65 72 74 65 64 20 69 6e 74 65 72 6d 65 64 69  serted intermedi
e8b0: 61 74 65 20 73 74 61 74 65 73 3a 0a 2a 2a 0a 2a  ate states:.**.*
e8c0: 2a 20 20 20 20 55 4e 4c 4f 43 4b 45 44 20 2d 3e  *    UNLOCKED ->
e8d0: 20 53 48 41 52 45 44 0a 2a 2a 20 20 20 20 53 48   SHARED.**    SH
e8e0: 41 52 45 44 20 2d 3e 20 52 45 53 45 52 56 45 44  ARED -> RESERVED
e8f0: 0a 2a 2a 20 20 20 20 53 48 41 52 45 44 20 2d 3e  .**    SHARED ->
e900: 20 28 50 45 4e 44 49 4e 47 29 20 2d 3e 20 45 58   (PENDING) -> EX
e910: 43 4c 55 53 49 56 45 0a 2a 2a 20 20 20 20 52 45  CLUSIVE.**    RE
e920: 53 45 52 56 45 44 20 2d 3e 20 28 50 45 4e 44 49  SERVED -> (PENDI
e930: 4e 47 29 20 2d 3e 20 45 58 43 4c 55 53 49 56 45  NG) -> EXCLUSIVE
e940: 0a 2a 2a 20 20 20 20 50 45 4e 44 49 4e 47 20 2d  .**    PENDING -
e950: 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 0a 2a  > EXCLUSIVE.**.*
e960: 2a 20 66 6c 6f 63 6b 28 29 20 6f 6e 6c 79 20 72  * flock() only r
e970: 65 61 6c 6c 79 20 73 75 70 70 6f 72 74 20 45 58  eally support EX
e980: 43 4c 55 53 49 56 45 20 6c 6f 63 6b 73 2e 20 20  CLUSIVE locks.  
e990: 57 65 20 74 72 61 63 6b 20 69 6e 74 65 72 6d 65  We track interme
e9a0: 64 69 61 74 65 0a 2a 2a 20 6c 6f 63 6b 20 73 74  diate.** lock st
e9b0: 61 74 65 73 20 69 6e 20 74 68 65 20 73 71 6c 69  ates in the sqli
e9c0: 74 65 33 5f 66 69 6c 65 20 73 74 72 75 63 74 75  te3_file structu
e9d0: 72 65 2c 20 62 75 74 20 61 6c 6c 20 6c 6f 63 6b  re, but all lock
e9e0: 73 20 53 48 41 52 45 44 20 6f 72 0a 2a 2a 20 61  s SHARED or.** a
e9f0: 62 6f 76 65 20 61 72 65 20 72 65 61 6c 6c 79 20  bove are really 
ea00: 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 73 20  EXCLUSIVE locks 
ea10: 61 6e 64 20 65 78 63 6c 75 64 65 20 61 6c 6c 20  and exclude all 
ea20: 6f 74 68 65 72 20 70 72 6f 63 65 73 73 65 73 20  other processes 
ea30: 66 72 6f 6d 0a 2a 2a 20 61 63 63 65 73 73 20 74  from.** access t
ea40: 68 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54  he file..**.** T
ea50: 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c  his routine will
ea60: 20 6f 6e 6c 79 20 69 6e 63 72 65 61 73 65 20 61   only increase a
ea70: 20 6c 6f 63 6b 2e 20 20 55 73 65 20 74 68 65 20   lock.  Use the 
ea80: 73 71 6c 69 74 65 33 4f 73 55 6e 6c 6f 63 6b 28  sqlite3OsUnlock(
ea90: 29 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 74 6f 20  ).** routine to 
eaa0: 6c 6f 77 65 72 20 61 20 6c 6f 63 6b 69 6e 67 20  lower a locking 
eab0: 6c 65 76 65 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63  level..*/.static
eac0: 20 69 6e 74 20 66 6c 6f 63 6b 4c 6f 63 6b 28 73   int flockLock(s
ead0: 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c  qlite3_file *id,
eae0: 20 69 6e 74 20 65 46 69 6c 65 4c 6f 63 6b 29 20   int eFileLock) 
eaf0: 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
eb00: 49 54 45 5f 4f 4b 3b 0a 20 20 75 6e 69 78 46 69  ITE_OK;.  unixFi
eb10: 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69  le *pFile = (uni
eb20: 78 46 69 6c 65 2a 29 69 64 3b 0a 0a 20 20 61 73  xFile*)id;..  as
eb30: 73 65 72 74 28 20 70 46 69 6c 65 20 29 3b 0a 0a  sert( pFile );..
eb40: 20 20 2f 2a 20 69 66 20 77 65 20 61 6c 72 65 61    /* if we alrea
eb50: 64 79 20 68 61 76 65 20 61 20 6c 6f 63 6b 2c 20  dy have a lock, 
eb60: 69 74 20 69 73 20 65 78 63 6c 75 73 69 76 65 2e  it is exclusive.
eb70: 20 20 0a 20 20 2a 2a 20 4a 75 73 74 20 61 64 6a    .  ** Just adj
eb80: 75 73 74 20 6c 65 76 65 6c 20 61 6e 64 20 70 75  ust level and pu
eb90: 6e 74 20 6f 6e 20 6f 75 74 74 61 20 68 65 72 65  nt on outta here
eba0: 2e 20 2a 2f 0a 20 20 69 66 20 28 70 46 69 6c 65  . */.  if (pFile
ebb0: 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3e 20 4e 4f  ->eFileLock > NO
ebc0: 5f 4c 4f 43 4b 29 20 7b 0a 20 20 20 20 70 46 69  _LOCK) {.    pFi
ebd0: 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20  le->eFileLock = 
ebe0: 65 46 69 6c 65 4c 6f 63 6b 3b 0a 20 20 20 20 72  eFileLock;.    r
ebf0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
ec00: 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 67 72 61  .  }.  .  /* gra
ec10: 62 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c  b an exclusive l
ec20: 6f 63 6b 20 2a 2f 0a 20 20 0a 20 20 69 66 20 28  ock */.  .  if (
ec30: 66 6c 6f 63 6b 28 70 46 69 6c 65 2d 3e 68 2c 20  flock(pFile->h, 
ec40: 4c 4f 43 4b 5f 45 58 20 7c 20 4c 4f 43 4b 5f 4e  LOCK_EX | LOCK_N
ec50: 42 29 29 20 7b 0a 20 20 20 20 69 6e 74 20 74 45  B)) {.    int tE
ec60: 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20  rrno = errno;.  
ec70: 20 20 2f 2a 20 64 69 64 6e 27 74 20 67 65 74 2c    /* didn't get,
ec80: 20 6d 75 73 74 20 62 65 20 62 75 73 79 20 2a 2f   must be busy */
ec90: 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
eca0: 45 72 72 6f 72 46 72 6f 6d 50 6f 73 69 78 45 72  ErrorFromPosixEr
ecb0: 72 6f 72 28 74 45 72 72 6e 6f 2c 20 53 51 4c 49  ror(tErrno, SQLI
ecc0: 54 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b 29 3b 0a  TE_IOERR_LOCK);.
ecd0: 20 20 20 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f      if( IS_LOCK_
ece0: 45 52 52 4f 52 28 72 63 29 20 29 7b 0a 20 20 20  ERROR(rc) ){.   
ecf0: 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72     pFile->lastEr
ed00: 72 6e 6f 20 3d 20 74 45 72 72 6e 6f 3b 0a 20 20  rno = tErrno;.  
ed10: 20 20 7d 0a 20 20 7d 20 65 6c 73 65 20 7b 0a 20    }.  } else {. 
ed20: 20 20 20 2f 2a 20 67 6f 74 20 69 74 2c 20 73 65     /* got it, se
ed30: 74 20 74 68 65 20 74 79 70 65 20 61 6e 64 20 72  t the type and r
ed40: 65 74 75 72 6e 20 6f 6b 20 2a 2f 0a 20 20 20 20  eturn ok */.    
ed50: 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  pFile->eFileLock
ed60: 20 3d 20 65 46 69 6c 65 4c 6f 63 6b 3b 0a 20 20   = eFileLock;.  
ed70: 7d 0a 20 20 4f 53 54 52 41 43 45 28 28 22 4c 4f  }.  OSTRACE(("LO
ed80: 43 4b 20 20 20 20 25 64 20 25 73 20 25 73 20 28  CK    %d %s %s (
ed90: 66 6c 6f 63 6b 29 5c 6e 22 2c 20 70 46 69 6c 65  flock)\n", pFile
eda0: 2d 3e 68 2c 20 61 7a 46 69 6c 65 4c 6f 63 6b 28  ->h, azFileLock(
edb0: 65 46 69 6c 65 4c 6f 63 6b 29 2c 20 0a 20 20 20  eFileLock), .   
edc0: 20 20 20 20 20 20 20 20 72 63 3d 3d 53 51 4c 49          rc==SQLI
edd0: 54 45 5f 4f 4b 20 3f 20 22 6f 6b 22 20 3a 20 22  TE_OK ? "ok" : "
ede0: 66 61 69 6c 65 64 22 29 29 3b 0a 23 69 66 64 65  failed"));.#ifde
edf0: 66 20 53 51 4c 49 54 45 5f 49 47 4e 4f 52 45 5f  f SQLITE_IGNORE_
ee00: 46 4c 4f 43 4b 5f 4c 4f 43 4b 5f 45 52 52 4f 52  FLOCK_LOCK_ERROR
ee10: 53 0a 20 20 69 66 28 20 28 72 63 20 26 20 53 51  S.  if( (rc & SQ
ee20: 4c 49 54 45 5f 49 4f 45 52 52 29 20 3d 3d 20 53  LITE_IOERR) == S
ee30: 51 4c 49 54 45 5f 49 4f 45 52 52 20 29 7b 0a 20  QLITE_IOERR ){. 
ee40: 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42     rc = SQLITE_B
ee50: 55 53 59 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 20  USY;.  }.#endif 
ee60: 2f 2a 20 53 51 4c 49 54 45 5f 49 47 4e 4f 52 45  /* SQLITE_IGNORE
ee70: 5f 46 4c 4f 43 4b 5f 4c 4f 43 4b 5f 45 52 52 4f  _FLOCK_LOCK_ERRO
ee80: 52 53 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 72  RS */.  return r
ee90: 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 77  c;.}.../*.** Low
eea0: 65 72 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c  er the locking l
eeb0: 65 76 65 6c 20 6f 6e 20 66 69 6c 65 20 64 65 73  evel on file des
eec0: 63 72 69 70 74 6f 72 20 70 46 69 6c 65 20 74 6f  criptor pFile to
eed0: 20 65 46 69 6c 65 4c 6f 63 6b 2e 20 20 65 46 69   eFileLock.  eFi
eee0: 6c 65 4c 6f 63 6b 0a 2a 2a 20 6d 75 73 74 20 62  leLock.** must b
eef0: 65 20 65 69 74 68 65 72 20 4e 4f 5f 4c 4f 43 4b  e either NO_LOCK
ef00: 20 6f 72 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2e   or SHARED_LOCK.
ef10: 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6c 6f  .**.** If the lo
ef20: 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 66 20 74  cking level of t
ef30: 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  he file descript
ef40: 6f 72 20 69 73 20 61 6c 72 65 61 64 79 20 61 74  or is already at
ef50: 20 6f 72 20 62 65 6c 6f 77 0a 2a 2a 20 74 68 65   or below.** the
ef60: 20 72 65 71 75 65 73 74 65 64 20 6c 6f 63 6b 69   requested locki
ef70: 6e 67 20 6c 65 76 65 6c 2c 20 74 68 69 73 20 72  ng level, this r
ef80: 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f  outine is a no-o
ef90: 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  p..*/.static int
efa0: 20 66 6c 6f 63 6b 55 6e 6c 6f 63 6b 28 73 71 6c   flockUnlock(sql
efb0: 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69  ite3_file *id, i
efc0: 6e 74 20 65 46 69 6c 65 4c 6f 63 6b 29 20 7b 0a  nt eFileLock) {.
efd0: 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c    unixFile *pFil
efe0: 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69  e = (unixFile*)i
eff0: 64 3b 0a 20 20 0a 20 20 61 73 73 65 72 74 28 20  d;.  .  assert( 
f000: 70 46 69 6c 65 20 29 3b 0a 20 20 4f 53 54 52 41  pFile );.  OSTRA
f010: 43 45 28 28 22 55 4e 4c 4f 43 4b 20 20 25 64 20  CE(("UNLOCK  %d 
f020: 25 64 20 77 61 73 20 25 64 20 70 69 64 3d 25 64  %d was %d pid=%d
f030: 20 28 66 6c 6f 63 6b 29 5c 6e 22 2c 20 70 46 69   (flock)\n", pFi
f040: 6c 65 2d 3e 68 2c 20 65 46 69 6c 65 4c 6f 63 6b  le->h, eFileLock
f050: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70 46 69  ,.           pFi
f060: 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 2c 20 67  le->eFileLock, g
f070: 65 74 70 69 64 28 29 29 29 3b 0a 20 20 61 73 73  etpid()));.  ass
f080: 65 72 74 28 20 65 46 69 6c 65 4c 6f 63 6b 3c 3d  ert( eFileLock<=
f090: 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20  SHARED_LOCK );. 
f0a0: 20 0a 20 20 2f 2a 20 6e 6f 2d 6f 70 20 69 66 20   .  /* no-op if 
f0b0: 70 6f 73 73 69 62 6c 65 20 2a 2f 0a 20 20 69 66  possible */.  if
f0c0: 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f  ( pFile->eFileLo
f0d0: 63 6b 3d 3d 65 46 69 6c 65 4c 6f 63 6b 20 29 7b  ck==eFileLock ){
f0e0: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
f0f0: 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 0a 20 20  TE_OK;.  }.  .  
f100: 2f 2a 20 73 68 61 72 65 64 20 63 61 6e 20 6a 75  /* shared can ju
f110: 73 74 20 62 65 20 73 65 74 20 62 65 63 61 75 73  st be set becaus
f120: 65 20 77 65 20 61 6c 77 61 79 73 20 68 61 76 65  e we always have
f130: 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20 2a 2f   an exclusive */
f140: 0a 20 20 69 66 20 28 65 46 69 6c 65 4c 6f 63 6b  .  if (eFileLock
f150: 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 29 20 7b  ==SHARED_LOCK) {
f160: 0a 20 20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c  .    pFile->eFil
f170: 65 4c 6f 63 6b 20 3d 20 65 46 69 6c 65 4c 6f 63  eLock = eFileLoc
f180: 6b 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  k;.    return SQ
f190: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 0a  LITE_OK;.  }.  .
f1a0: 20 20 2f 2a 20 6e 6f 2c 20 72 65 61 6c 6c 79 2c    /* no, really,
f1b0: 20 75 6e 6c 6f 63 6b 2e 20 2a 2f 0a 20 20 69 6e   unlock. */.  in
f1c0: 74 20 72 63 20 3d 20 66 6c 6f 63 6b 28 70 46 69  t rc = flock(pFi
f1d0: 6c 65 2d 3e 68 2c 20 4c 4f 43 4b 5f 55 4e 29 3b  le->h, LOCK_UN);
f1e0: 0a 20 20 69 66 20 28 72 63 29 20 7b 0a 20 20 20  .  if (rc) {.   
f1f0: 20 69 6e 74 20 72 2c 20 74 45 72 72 6e 6f 20 3d   int r, tErrno =
f200: 20 65 72 72 6e 6f 3b 0a 20 20 20 20 72 20 3d 20   errno;.    r = 
f210: 73 71 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d 50  sqliteErrorFromP
f220: 6f 73 69 78 45 72 72 6f 72 28 74 45 72 72 6e 6f  osixError(tErrno
f230: 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55  , SQLITE_IOERR_U
f240: 4e 4c 4f 43 4b 29 3b 0a 20 20 20 20 69 66 28 20  NLOCK);.    if( 
f250: 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 72 29  IS_LOCK_ERROR(r)
f260: 20 29 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d   ){.      pFile-
f270: 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 74 45 72  >lastErrno = tEr
f280: 72 6e 6f 3b 0a 20 20 20 20 7d 0a 23 69 66 64 65  rno;.    }.#ifde
f290: 66 20 53 51 4c 49 54 45 5f 49 47 4e 4f 52 45 5f  f SQLITE_IGNORE_
f2a0: 46 4c 4f 43 4b 5f 4c 4f 43 4b 5f 45 52 52 4f 52  FLOCK_LOCK_ERROR
f2b0: 53 0a 20 20 20 20 69 66 28 20 28 72 20 26 20 53  S.    if( (r & S
f2c0: 51 4c 49 54 45 5f 49 4f 45 52 52 29 20 3d 3d 20  QLITE_IOERR) == 
f2d0: 53 51 4c 49 54 45 5f 49 4f 45 52 52 20 29 7b 0a  SQLITE_IOERR ){.
f2e0: 20 20 20 20 20 20 72 20 3d 20 53 51 4c 49 54 45        r = SQLITE
f2f0: 5f 42 55 53 59 3b 0a 20 20 20 20 7d 0a 23 65 6e  _BUSY;.    }.#en
f300: 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 49 47  dif /* SQLITE_IG
f310: 4e 4f 52 45 5f 46 4c 4f 43 4b 5f 4c 4f 43 4b 5f  NORE_FLOCK_LOCK_
f320: 45 52 52 4f 52 53 20 2a 2f 0a 20 20 20 20 0a 20  ERRORS */.    . 
f330: 20 20 20 72 65 74 75 72 6e 20 72 3b 0a 20 20 7d     return r;.  }
f340: 20 65 6c 73 65 20 7b 0a 20 20 20 20 70 46 69 6c   else {.    pFil
f350: 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 4e  e->eFileLock = N
f360: 4f 5f 4c 4f 43 4b 3b 0a 20 20 20 20 72 65 74 75  O_LOCK;.    retu
f370: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
f380: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65  }.}../*.** Close
f390: 20 61 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74   a file..*/.stat
f3a0: 69 63 20 69 6e 74 20 66 6c 6f 63 6b 43 6c 6f 73  ic int flockClos
f3b0: 65 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  e(sqlite3_file *
f3c0: 69 64 29 20 7b 0a 20 20 69 66 28 20 69 64 20 29  id) {.  if( id )
f3d0: 7b 0a 20 20 20 20 66 6c 6f 63 6b 55 6e 6c 6f 63  {.    flockUnloc
f3e0: 6b 28 69 64 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a  k(id, NO_LOCK);.
f3f0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 63 6c 6f    }.  return clo
f400: 73 65 55 6e 69 78 46 69 6c 65 28 69 64 29 3b 0a  seUnixFile(id);.
f410: 7d 0a 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  }..#endif /* SQL
f420: 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49  ITE_ENABLE_LOCKI
f430: 4e 47 5f 53 54 59 4c 45 20 26 26 20 21 4f 53 5f  NG_STYLE && !OS_
f440: 56 58 57 4f 52 4b 20 2a 2f 0a 0a 2f 2a 2a 2a 2a  VXWORK */../****
f450: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20  *************** 
f460: 45 6e 64 20 6f 66 20 74 68 65 20 66 6c 6f 63 6b  End of the flock
f470: 20 6c 6f 63 6b 20 69 6d 70 6c 65 6d 65 6e 74 61   lock implementa
f480: 74 69 6f 6e 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  tion ***********
f490: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a  **********.*****
f4a0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f4b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f4c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f4d0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f4e0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 2a 2a  *********/../***
f4f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f500: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f510: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f520: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f530: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a  ***********.****
f540: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f550: 2a 2a 2a 2a 20 42 65 67 69 6e 20 4e 61 6d 65 64  **** Begin Named
f560: 20 53 65 6d 61 70 68 6f 72 65 20 4c 6f 63 6b 69   Semaphore Locki
f570: 6e 67 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ng *************
f580: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a  ***********.**.*
f590: 2a 20 4e 61 6d 65 64 20 73 65 6d 61 70 68 6f 72  * Named semaphor
f5a0: 65 20 6c 6f 63 6b 69 6e 67 20 69 73 20 6f 6e 6c  e locking is onl
f5b0: 79 20 73 75 70 70 6f 72 74 65 64 20 6f 6e 20 56  y supported on V
f5c0: 78 57 6f 72 6b 73 2e 0a 2a 2a 0a 2a 2a 20 53 65  xWorks..**.** Se
f5d0: 6d 61 70 68 6f 72 65 20 6c 6f 63 6b 69 6e 67 20  maphore locking 
f5e0: 69 73 20 6c 69 6b 65 20 64 6f 74 2d 6c 6f 63 6b  is like dot-lock
f5f0: 20 61 6e 64 20 66 6c 6f 63 6b 20 69 6e 20 74 68   and flock in th
f600: 61 74 20 69 74 20 72 65 61 6c 6c 79 20 6f 6e 6c  at it really onl
f610: 79 0a 2a 2a 20 73 75 70 70 6f 72 74 73 20 45 58  y.** supports EX
f620: 43 4c 55 53 49 56 45 20 6c 6f 63 6b 69 6e 67 2e  CLUSIVE locking.
f630: 20 20 4f 6e 6c 79 20 61 20 73 69 6e 67 6c 65 20    Only a single 
f640: 70 72 6f 63 65 73 73 20 63 61 6e 20 72 65 61 64  process can read
f650: 20 6f 72 20 77 72 69 74 65 0a 2a 2a 20 74 68 65   or write.** the
f660: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 61   database file a
f670: 74 20 61 20 74 69 6d 65 2e 20 20 54 68 69 73 20  t a time.  This 
f680: 72 65 64 75 63 65 73 20 70 6f 74 65 6e 74 69 61  reduces potentia
f690: 6c 20 63 6f 6e 63 75 72 72 65 6e 63 79 2c 20 62  l concurrency, b
f6a0: 75 74 0a 2a 2a 20 6d 61 6b 65 73 20 74 68 65 20  ut.** makes the 
f6b0: 6c 6f 63 6b 20 69 6d 70 6c 65 6d 65 6e 74 61 74  lock implementat
f6c0: 69 6f 6e 20 6d 75 63 68 20 65 61 73 69 65 72 2e  ion much easier.
f6d0: 0a 2a 2f 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52  .*/.#if OS_VXWOR
f6e0: 4b 53 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  KS../*.** This r
f6f0: 6f 75 74 69 6e 65 20 63 68 65 63 6b 73 20 69 66  outine checks if
f700: 20 74 68 65 72 65 20 69 73 20 61 20 52 45 53 45   there is a RESE
f710: 52 56 45 44 20 6c 6f 63 6b 20 68 65 6c 64 20 6f  RVED lock held o
f720: 6e 20 74 68 65 20 73 70 65 63 69 66 69 65 64 0a  n the specified.
f730: 2a 2a 20 66 69 6c 65 20 62 79 20 74 68 69 73 20  ** file by this 
f740: 6f 72 20 61 6e 79 20 6f 74 68 65 72 20 70 72 6f  or any other pro
f750: 63 65 73 73 2e 20 49 66 20 73 75 63 68 20 61 20  cess. If such a 
f760: 6c 6f 63 6b 20 69 73 20 68 65 6c 64 2c 20 73 65  lock is held, se
f770: 74 20 2a 70 52 65 73 4f 75 74 0a 2a 2a 20 74 6f  t *pResOut.** to
f780: 20 61 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75   a non-zero valu
f790: 65 20 6f 74 68 65 72 77 69 73 65 20 2a 70 52 65  e otherwise *pRe
f7a0: 73 4f 75 74 20 69 73 20 73 65 74 20 74 6f 20 7a  sOut is set to z
f7b0: 65 72 6f 2e 20 20 54 68 65 20 72 65 74 75 72 6e  ero.  The return
f7c0: 20 76 61 6c 75 65 0a 2a 2a 20 69 73 20 73 65 74   value.** is set
f7d0: 20 74 6f 20 53 51 4c 49 54 45 5f 4f 4b 20 75 6e   to SQLITE_OK un
f7e0: 6c 65 73 73 20 61 6e 20 49 2f 4f 20 65 72 72 6f  less an I/O erro
f7f0: 72 20 6f 63 63 75 72 73 20 64 75 72 69 6e 67 20  r occurs during 
f800: 6c 6f 63 6b 20 63 68 65 63 6b 69 6e 67 2e 0a 2a  lock checking..*
f810: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 65 6d  /.static int sem
f820: 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63  CheckReservedLoc
f830: 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  k(sqlite3_file *
f840: 69 64 2c 20 69 6e 74 20 2a 70 52 65 73 4f 75 74  id, int *pResOut
f850: 29 20 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  ) {.  int rc = S
f860: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20  QLITE_OK;.  int 
f870: 72 65 73 65 72 76 65 64 20 3d 20 30 3b 0a 20 20  reserved = 0;.  
f880: 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20  unixFile *pFile 
f890: 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b  = (unixFile*)id;
f8a0: 0a 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72  ..  SimulateIOEr
f8b0: 72 6f 72 28 20 72 65 74 75 72 6e 20 53 51 4c 49  ror( return SQLI
f8c0: 54 45 5f 49 4f 45 52 52 5f 43 48 45 43 4b 52 45  TE_IOERR_CHECKRE
f8d0: 53 45 52 56 45 44 4c 4f 43 4b 3b 20 29 3b 0a 20  SERVEDLOCK; );. 
f8e0: 20 0a 20 20 61 73 73 65 72 74 28 20 70 46 69 6c   .  assert( pFil
f8f0: 65 20 29 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b  e );..  /* Check
f900: 20 69 66 20 61 20 74 68 72 65 61 64 20 69 6e 20   if a thread in 
f910: 74 68 69 73 20 70 72 6f 63 65 73 73 20 68 6f 6c  this process hol
f920: 64 73 20 73 75 63 68 20 61 20 6c 6f 63 6b 20 2a  ds such a lock *
f930: 2f 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 65  /.  if( pFile->e
f940: 46 69 6c 65 4c 6f 63 6b 3e 53 48 41 52 45 44 5f  FileLock>SHARED_
f950: 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 72 65 73 65  LOCK ){.    rese
f960: 72 76 65 64 20 3d 20 31 3b 0a 20 20 7d 0a 20 20  rved = 1;.  }.  
f970: 0a 20 20 2f 2a 20 4f 74 68 65 72 77 69 73 65 20  .  /* Otherwise 
f980: 73 65 65 20 69 66 20 73 6f 6d 65 20 6f 74 68 65  see if some othe
f990: 72 20 70 72 6f 63 65 73 73 20 68 6f 6c 64 73 20  r process holds 
f9a0: 69 74 2e 20 2a 2f 0a 20 20 69 66 28 20 21 72 65  it. */.  if( !re
f9b0: 73 65 72 76 65 64 20 29 7b 0a 20 20 20 20 73 65  served ){.    se
f9c0: 6d 5f 74 20 2a 70 53 65 6d 20 3d 20 70 46 69 6c  m_t *pSem = pFil
f9d0: 65 2d 3e 70 49 6e 6f 64 65 2d 3e 70 53 65 6d 3b  e->pInode->pSem;
f9e0: 0a 20 20 20 20 73 74 72 75 63 74 20 73 74 61 74  .    struct stat
f9f0: 20 73 74 61 74 42 75 66 3b 0a 0a 20 20 20 20 69   statBuf;..    i
fa00: 66 28 20 73 65 6d 5f 74 72 79 77 61 69 74 28 70  f( sem_trywait(p
fa10: 53 65 6d 29 3d 3d 2d 31 20 29 7b 0a 20 20 20 20  Sem)==-1 ){.    
fa20: 20 20 69 6e 74 20 74 45 72 72 6e 6f 20 3d 20 65    int tErrno = e
fa30: 72 72 6e 6f 3b 0a 20 20 20 20 20 20 69 66 28 20  rrno;.      if( 
fa40: 45 41 47 41 49 4e 20 21 3d 20 74 45 72 72 6e 6f  EAGAIN != tErrno
fa50: 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
fa60: 20 73 71 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d   sqliteErrorFrom
fa70: 50 6f 73 69 78 45 72 72 6f 72 28 74 45 72 72 6e  PosixError(tErrn
fa80: 6f 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  o, SQLITE_IOERR_
fa90: 43 48 45 43 4b 52 45 53 45 52 56 45 44 4c 4f 43  CHECKRESERVEDLOC
faa0: 4b 29 3b 0a 20 20 20 20 20 20 20 20 70 46 69 6c  K);.        pFil
fab0: 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 74  e->lastErrno = t
fac0: 45 72 72 6e 6f 3b 0a 20 20 20 20 20 20 7d 20 65  Errno;.      } e
fad0: 6c 73 65 20 7b 0a 20 20 20 20 20 20 20 20 2f 2a  lse {.        /*
fae0: 20 73 6f 6d 65 6f 6e 65 20 65 6c 73 65 20 68 61   someone else ha
faf0: 73 20 74 68 65 20 6c 6f 63 6b 20 77 68 65 6e 20  s the lock when 
fb00: 77 65 20 61 72 65 20 69 6e 20 4e 4f 5f 4c 4f 43  we are in NO_LOC
fb10: 4b 20 2a 2f 0a 20 20 20 20 20 20 20 20 72 65 73  K */.        res
fb20: 65 72 76 65 64 20 3d 20 28 70 46 69 6c 65 2d 3e  erved = (pFile->
fb30: 65 46 69 6c 65 4c 6f 63 6b 20 3c 20 53 48 41 52  eFileLock < SHAR
fb40: 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20  ED_LOCK);.      
fb50: 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  }.    }else{.   
fb60: 20 20 20 2f 2a 20 77 65 20 63 6f 75 6c 64 20 68     /* we could h
fb70: 61 76 65 20 69 74 20 69 66 20 77 65 20 77 61 6e  ave it if we wan
fb80: 74 20 69 74 20 2a 2f 0a 20 20 20 20 20 20 73 65  t it */.      se
fb90: 6d 5f 70 6f 73 74 28 70 53 65 6d 29 3b 0a 20 20  m_post(pSem);.  
fba0: 20 20 7d 0a 20 20 7d 0a 20 20 4f 53 54 52 41 43    }.  }.  OSTRAC
fbb0: 45 28 28 22 54 45 53 54 20 57 52 2d 4c 4f 43 4b  E(("TEST WR-LOCK
fbc0: 20 25 64 20 25 64 20 25 64 20 28 73 65 6d 29 5c   %d %d %d (sem)\
fbd0: 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 72 63  n", pFile->h, rc
fbe0: 2c 20 72 65 73 65 72 76 65 64 29 29 3b 0a 0a 20  , reserved));.. 
fbf0: 20 2a 70 52 65 73 4f 75 74 20 3d 20 72 65 73 65   *pResOut = rese
fc00: 72 76 65 64 3b 0a 20 20 72 65 74 75 72 6e 20 72  rved;.  return r
fc10: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 6b  c;.}../*.** Lock
fc20: 20 74 68 65 20 66 69 6c 65 20 77 69 74 68 20 74   the file with t
fc30: 68 65 20 6c 6f 63 6b 20 73 70 65 63 69 66 69 65  he lock specifie
fc40: 64 20 62 79 20 70 61 72 61 6d 65 74 65 72 20 65  d by parameter e
fc50: 46 69 6c 65 4c 6f 63 6b 20 2d 20 6f 6e 65 0a 2a  FileLock - one.*
fc60: 2a 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  * of the followi
fc70: 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28 31  ng:.**.**     (1
fc80: 29 20 53 48 41 52 45 44 5f 4c 4f 43 4b 0a 2a 2a  ) SHARED_LOCK.**
fc90: 20 20 20 20 20 28 32 29 20 52 45 53 45 52 56 45       (2) RESERVE
fca0: 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 33  D_LOCK.**     (3
fcb0: 29 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 0a 2a  ) PENDING_LOCK.*
fcc0: 2a 20 20 20 20 20 28 34 29 20 45 58 43 4c 55 53  *     (4) EXCLUS
fcd0: 49 56 45 5f 4c 4f 43 4b 0a 2a 2a 0a 2a 2a 20 53  IVE_LOCK.**.** S
fce0: 6f 6d 65 74 69 6d 65 73 20 77 68 65 6e 20 72 65  ometimes when re
fcf0: 71 75 65 73 74 69 6e 67 20 6f 6e 65 20 6c 6f 63  questing one loc
fd00: 6b 20 73 74 61 74 65 2c 20 61 64 64 69 74 69 6f  k state, additio
fd10: 6e 61 6c 20 6c 6f 63 6b 20 73 74 61 74 65 73 0a  nal lock states.
fd20: 2a 2a 20 61 72 65 20 69 6e 73 65 72 74 65 64 20  ** are inserted 
fd30: 69 6e 20 62 65 74 77 65 65 6e 2e 20 20 54 68 65  in between.  The
fd40: 20 6c 6f 63 6b 69 6e 67 20 6d 69 67 68 74 20 66   locking might f
fd50: 61 69 6c 20 6f 6e 20 6f 6e 65 20 6f 66 20 74 68  ail on one of th
fd60: 65 20 6c 61 74 65 72 0a 2a 2a 20 74 72 61 6e 73  e later.** trans
fd70: 69 74 69 6f 6e 73 20 6c 65 61 76 69 6e 67 20 74  itions leaving t
fd80: 68 65 20 6c 6f 63 6b 20 73 74 61 74 65 20 64 69  he lock state di
fd90: 66 66 65 72 65 6e 74 20 66 72 6f 6d 20 77 68 61  fferent from wha
fda0: 74 20 69 74 20 73 74 61 72 74 65 64 20 62 75 74  t it started but
fdb0: 0a 2a 2a 20 73 74 69 6c 6c 20 73 68 6f 72 74 20  .** still short 
fdc0: 6f 66 20 69 74 73 20 67 6f 61 6c 2e 20 20 54 68  of its goal.  Th
fdd0: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 68 61 72  e following char
fde0: 74 20 73 68 6f 77 73 20 74 68 65 20 61 6c 6c 6f  t shows the allo
fdf0: 77 65 64 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f  wed.** transitio
fe00: 6e 73 20 61 6e 64 20 74 68 65 20 69 6e 73 65 72  ns and the inser
fe10: 74 65 64 20 69 6e 74 65 72 6d 65 64 69 61 74 65  ted intermediate
fe20: 20 73 74 61 74 65 73 3a 0a 2a 2a 0a 2a 2a 20 20   states:.**.**  
fe30: 20 20 55 4e 4c 4f 43 4b 45 44 20 2d 3e 20 53 48    UNLOCKED -> SH
fe40: 41 52 45 44 0a 2a 2a 20 20 20 20 53 48 41 52 45  ARED.**    SHARE
fe50: 44 20 2d 3e 20 52 45 53 45 52 56 45 44 0a 2a 2a  D -> RESERVED.**
fe60: 20 20 20 20 53 48 41 52 45 44 20 2d 3e 20 28 50      SHARED -> (P
fe70: 45 4e 44 49 4e 47 29 20 2d 3e 20 45 58 43 4c 55  ENDING) -> EXCLU
fe80: 53 49 56 45 0a 2a 2a 20 20 20 20 52 45 53 45 52  SIVE.**    RESER
fe90: 56 45 44 20 2d 3e 20 28 50 45 4e 44 49 4e 47 29  VED -> (PENDING)
fea0: 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a   -> EXCLUSIVE.**
feb0: 20 20 20 20 50 45 4e 44 49 4e 47 20 2d 3e 20 45      PENDING -> E
fec0: 58 43 4c 55 53 49 56 45 0a 2a 2a 0a 2a 2a 20 53  XCLUSIVE.**.** S
fed0: 65 6d 61 70 68 6f 72 65 20 6c 6f 63 6b 73 20 6f  emaphore locks o
fee0: 6e 6c 79 20 72 65 61 6c 6c 79 20 73 75 70 70 6f  nly really suppo
fef0: 72 74 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63  rt EXCLUSIVE loc
ff00: 6b 73 2e 20 20 57 65 20 74 72 61 63 6b 20 69 6e  ks.  We track in
ff10: 74 65 72 6d 65 64 69 61 74 65 0a 2a 2a 20 6c 6f  termediate.** lo
ff20: 63 6b 20 73 74 61 74 65 73 20 69 6e 20 74 68 65  ck states in the
ff30: 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 73 74   sqlite3_file st
ff40: 72 75 63 74 75 72 65 2c 20 62 75 74 20 61 6c 6c  ructure, but all
ff50: 20 6c 6f 63 6b 73 20 53 48 41 52 45 44 20 6f 72   locks SHARED or
ff60: 0a 2a 2a 20 61 62 6f 76 65 20 61 72 65 20 72 65  .** above are re
ff70: 61 6c 6c 79 20 45 58 43 4c 55 53 49 56 45 20 6c  ally EXCLUSIVE l
ff80: 6f 63 6b 73 20 61 6e 64 20 65 78 63 6c 75 64 65  ocks and exclude
ff90: 20 61 6c 6c 20 6f 74 68 65 72 20 70 72 6f 63 65   all other proce
ffa0: 73 73 65 73 20 66 72 6f 6d 0a 2a 2a 20 61 63 63  sses from.** acc
ffb0: 65 73 73 20 74 68 65 20 66 69 6c 65 2e 0a 2a 2a  ess the file..**
ffc0: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
ffd0: 20 77 69 6c 6c 20 6f 6e 6c 79 20 69 6e 63 72 65   will only incre
ffe0: 61 73 65 20 61 20 6c 6f 63 6b 2e 20 20 55 73 65  ase a lock.  Use
fff0: 20 74 68 65 20 73 71 6c 69 74 65 33 4f 73 55 6e   the sqlite3OsUn
10000 6c 6f 63 6b 28 29 0a 2a 2a 20 72 6f 75 74 69 6e  lock().** routin
10010 65 20 74 6f 20 6c 6f 77 65 72 20 61 20 6c 6f 63  e to lower a loc
10020 6b 69 6e 67 20 6c 65 76 65 6c 2e 0a 2a 2f 0a 73  king level..*/.s
10030 74 61 74 69 63 20 69 6e 74 20 73 65 6d 4c 6f 63  tatic int semLoc
10040 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  k(sqlite3_file *
10050 69 64 2c 20 69 6e 74 20 65 46 69 6c 65 4c 6f 63  id, int eFileLoc
10060 6b 29 20 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20  k) {.  unixFile 
10070 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69  *pFile = (unixFi
10080 6c 65 2a 29 69 64 3b 0a 20 20 69 6e 74 20 66 64  le*)id;.  int fd
10090 3b 0a 20 20 73 65 6d 5f 74 20 2a 70 53 65 6d 20  ;.  sem_t *pSem 
100a0 3d 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d  = pFile->pInode-
100b0 3e 70 53 65 6d 3b 0a 20 20 69 6e 74 20 72 63 20  >pSem;.  int rc 
100c0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20  = SQLITE_OK;..  
100d0 2f 2a 20 69 66 20 77 65 20 61 6c 72 65 61 64 79  /* if we already
100e0 20 68 61 76 65 20 61 20 6c 6f 63 6b 2c 20 69 74   have a lock, it
100f0 20 69 73 20 65 78 63 6c 75 73 69 76 65 2e 20 20   is exclusive.  
10100 0a 20 20 2a 2a 20 4a 75 73 74 20 61 64 6a 75 73  .  ** Just adjus
10110 74 20 6c 65 76 65 6c 20 61 6e 64 20 70 75 6e 74  t level and punt
10120 20 6f 6e 20 6f 75 74 74 61 20 68 65 72 65 2e 20   on outta here. 
10130 2a 2f 0a 20 20 69 66 20 28 70 46 69 6c 65 2d 3e  */.  if (pFile->
10140 65 46 69 6c 65 4c 6f 63 6b 20 3e 20 4e 4f 5f 4c  eFileLock > NO_L
10150 4f 43 4b 29 20 7b 0a 20 20 20 20 70 46 69 6c 65  OCK) {.    pFile
10160 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 65 46  ->eFileLock = eF
10170 69 6c 65 4c 6f 63 6b 3b 0a 20 20 20 20 72 63 20  ileLock;.    rc 
10180 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  = SQLITE_OK;.   
10190 20 67 6f 74 6f 20 73 65 6d 5f 65 6e 64 5f 6c 6f   goto sem_end_lo
101a0 63 6b 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20  ck;.  }.  .  /* 
101b0 6c 6f 63 6b 20 73 65 6d 61 70 68 6f 72 65 20 6e  lock semaphore n
101c0 6f 77 20 62 75 74 20 62 61 69 6c 20 6f 75 74 20  ow but bail out 
101d0 77 68 65 6e 20 61 6c 72 65 61 64 79 20 6c 6f 63  when already loc
101e0 6b 65 64 2e 20 2a 2f 0a 20 20 69 66 28 20 73 65  ked. */.  if( se
101f0 6d 5f 74 72 79 77 61 69 74 28 70 53 65 6d 29 3d  m_trywait(pSem)=
10200 3d 2d 31 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  =-1 ){.    rc = 
10210 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20  SQLITE_BUSY;.   
10220 20 67 6f 74 6f 20 73 65 6d 5f 65 6e 64 5f 6c 6f   goto sem_end_lo
10230 63 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 67 6f  ck;.  }..  /* go
10240 74 20 69 74 2c 20 73 65 74 20 74 68 65 20 74 79  t it, set the ty
10250 70 65 20 61 6e 64 20 72 65 74 75 72 6e 20 6f 6b  pe and return ok
10260 20 2a 2f 0a 20 20 70 46 69 6c 65 2d 3e 65 46 69   */.  pFile->eFi
10270 6c 65 4c 6f 63 6b 20 3d 20 65 46 69 6c 65 4c 6f  leLock = eFileLo
10280 63 6b 3b 0a 0a 20 73 65 6d 5f 65 6e 64 5f 6c 6f  ck;.. sem_end_lo
10290 63 6b 3a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  ck:.  return rc;
102a0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 77 65 72 20  .}../*.** Lower 
102b0 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65  the locking leve
102c0 6c 20 6f 6e 20 66 69 6c 65 20 64 65 73 63 72 69  l on file descri
102d0 70 74 6f 72 20 70 46 69 6c 65 20 74 6f 20 65 46  ptor pFile to eF
102e0 69 6c 65 4c 6f 63 6b 2e 20 20 65 46 69 6c 65 4c  ileLock.  eFileL
102f0 6f 63 6b 0a 2a 2a 20 6d 75 73 74 20 62 65 20 65  ock.** must be e
10300 69 74 68 65 72 20 4e 4f 5f 4c 4f 43 4b 20 6f 72  ither NO_LOCK or
10310 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2e 0a 2a 2a   SHARED_LOCK..**
10320 0a 2a 2a 20 49 66 20 74 68 65 20 6c 6f 63 6b 69  .** If the locki
10330 6e 67 20 6c 65 76 65 6c 20 6f 66 20 74 68 65 20  ng level of the 
10340 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
10350 69 73 20 61 6c 72 65 61 64 79 20 61 74 20 6f 72  is already at or
10360 20 62 65 6c 6f 77 0a 2a 2a 20 74 68 65 20 72 65   below.** the re
10370 71 75 65 73 74 65 64 20 6c 6f 63 6b 69 6e 67 20  quested locking 
10380 6c 65 76 65 6c 2c 20 74 68 69 73 20 72 6f 75 74  level, this rout
10390 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a  ine is a no-op..
103a0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 65  */.static int se
103b0 6d 55 6e 6c 6f 63 6b 28 73 71 6c 69 74 65 33 5f  mUnlock(sqlite3_
103c0 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 65 46  file *id, int eF
103d0 69 6c 65 4c 6f 63 6b 29 20 7b 0a 20 20 75 6e 69  ileLock) {.  uni
103e0 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28  xFile *pFile = (
103f0 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20  unixFile*)id;.  
10400 73 65 6d 5f 74 20 2a 70 53 65 6d 20 3d 20 70 46  sem_t *pSem = pF
10410 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e 70 53 65  ile->pInode->pSe
10420 6d 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 46  m;..  assert( pF
10430 69 6c 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ile );.  assert(
10440 20 70 53 65 6d 20 29 3b 0a 20 20 4f 53 54 52 41   pSem );.  OSTRA
10450 43 45 28 28 22 55 4e 4c 4f 43 4b 20 20 25 64 20  CE(("UNLOCK  %d 
10460 25 64 20 77 61 73 20 25 64 20 70 69 64 3d 25 64  %d was %d pid=%d
10470 20 28 73 65 6d 29 5c 6e 22 2c 20 70 46 69 6c 65   (sem)\n", pFile
10480 2d 3e 68 2c 20 65 46 69 6c 65 4c 6f 63 6b 2c 0a  ->h, eFileLock,.
10490 09 20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65  .   pFile->eFile
104a0 4c 6f 63 6b 2c 20 67 65 74 70 69 64 28 29 29 29  Lock, getpid()))
104b0 3b 0a 20 20 61 73 73 65 72 74 28 20 65 46 69 6c  ;.  assert( eFil
104c0 65 4c 6f 63 6b 3c 3d 53 48 41 52 45 44 5f 4c 4f  eLock<=SHARED_LO
104d0 43 4b 20 29 3b 0a 20 20 0a 20 20 2f 2a 20 6e 6f  CK );.  .  /* no
104e0 2d 6f 70 20 69 66 20 70 6f 73 73 69 62 6c 65 20  -op if possible 
104f0 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e  */.  if( pFile->
10500 65 46 69 6c 65 4c 6f 63 6b 3d 3d 65 46 69 6c 65  eFileLock==eFile
10510 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 72 65 74 75  Lock ){.    retu
10520 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
10530 7d 0a 20 20 0a 20 20 2f 2a 20 73 68 61 72 65 64  }.  .  /* shared
10540 20 63 61 6e 20 6a 75 73 74 20 62 65 20 73 65 74   can just be set
10550 20 62 65 63 61 75 73 65 20 77 65 20 61 6c 77 61   because we alwa
10560 79 73 20 68 61 76 65 20 61 6e 20 65 78 63 6c 75  ys have an exclu
10570 73 69 76 65 20 2a 2f 0a 20 20 69 66 20 28 65 46  sive */.  if (eF
10580 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f  ileLock==SHARED_
10590 4c 4f 43 4b 29 20 7b 0a 20 20 20 20 70 46 69 6c  LOCK) {.    pFil
105a0 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 65  e->eFileLock = e
105b0 46 69 6c 65 4c 6f 63 6b 3b 0a 20 20 20 20 72 65  FileLock;.    re
105c0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
105d0 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 6e 6f 2c 20    }.  .  /* no, 
105e0 72 65 61 6c 6c 79 20 75 6e 6c 6f 63 6b 2e 20 2a  really unlock. *
105f0 2f 0a 20 20 69 66 20 28 20 73 65 6d 5f 70 6f 73  /.  if ( sem_pos
10600 74 28 70 53 65 6d 29 3d 3d 2d 31 20 29 20 7b 0a  t(pSem)==-1 ) {.
10610 20 20 20 20 69 6e 74 20 72 63 2c 20 74 45 72 72      int rc, tErr
10620 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20  no = errno;.    
10630 72 63 20 3d 20 73 71 6c 69 74 65 45 72 72 6f 72  rc = sqliteError
10640 46 72 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28 74  FromPosixError(t
10650 45 72 72 6e 6f 2c 20 53 51 4c 49 54 45 5f 49 4f  Errno, SQLITE_IO
10660 45 52 52 5f 55 4e 4c 4f 43 4b 29 3b 0a 20 20 20  ERR_UNLOCK);.   
10670 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52   if( IS_LOCK_ERR
10680 4f 52 28 72 63 29 20 29 7b 0a 20 20 20 20 20 20  OR(rc) ){.      
10690 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f  pFile->lastErrno
106a0 20 3d 20 74 45 72 72 6e 6f 3b 0a 20 20 20 20 7d   = tErrno;.    }
106b0 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 20  .    return rc; 
106c0 0a 20 20 7d 0a 20 20 70 46 69 6c 65 2d 3e 65 46  .  }.  pFile->eF
106d0 69 6c 65 4c 6f 63 6b 20 3d 20 4e 4f 5f 4c 4f 43  ileLock = NO_LOC
106e0 4b 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  K;.  return SQLI
106f0 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2a  TE_OK;.}../*. **
10700 20 43 6c 6f 73 65 20 61 20 66 69 6c 65 2e 0a 20   Close a file.. 
10710 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 65  */.static int se
10720 6d 43 6c 6f 73 65 28 73 71 6c 69 74 65 33 5f 66  mClose(sqlite3_f
10730 69 6c 65 20 2a 69 64 29 20 7b 0a 20 20 69 66 28  ile *id) {.  if(
10740 20 69 64 20 29 7b 0a 20 20 20 20 75 6e 69 78 46   id ){.    unixF
10750 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e  ile *pFile = (un
10760 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 20 20  ixFile*)id;.    
10770 73 65 6d 55 6e 6c 6f 63 6b 28 69 64 2c 20 4e 4f  semUnlock(id, NO
10780 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 61 73 73 65  _LOCK);.    asse
10790 72 74 28 20 70 46 69 6c 65 20 29 3b 0a 20 20 20  rt( pFile );.   
107a0 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28   unixEnterMutex(
107b0 29 3b 0a 20 20 20 20 72 65 6c 65 61 73 65 4c 6f  );.    releaseLo
107c0 63 6b 49 6e 66 6f 28 70 46 69 6c 65 2d 3e 70 49  ckInfo(pFile->pI
107d0 6e 6f 64 65 29 3b 0a 20 20 20 20 75 6e 69 78 4c  node);.    unixL
107e0 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 20 20 20  eaveMutex();.   
107f0 20 63 6c 6f 73 65 55 6e 69 78 46 69 6c 65 28 69   closeUnixFile(i
10800 64 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  d);.  }.  return
10810 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23   SQLITE_OK;.}..#
10820 65 6e 64 69 66 20 2f 2a 20 4f 53 5f 56 58 57 4f  endif /* OS_VXWO
10830 52 4b 53 20 2a 2f 0a 2f 2a 0a 2a 2a 20 4e 61 6d  RKS */./*.** Nam
10840 65 64 20 73 65 6d 61 70 68 6f 72 65 20 6c 6f 63  ed semaphore loc
10850 6b 69 6e 67 20 69 73 20 6f 6e 6c 79 20 61 76 61  king is only ava
10860 69 6c 61 62 6c 65 20 6f 6e 20 56 78 57 6f 72 6b  ilable on VxWork
10870 73 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  s..**.**********
10880 2a 2a 2a 2a 2a 20 45 6e 64 20 6f 66 20 74 68 65  ***** End of the
10890 20 6e 61 6d 65 64 20 73 65 6d 61 70 68 6f 72 65   named semaphore
108a0 20 6c 6f 63 6b 20 69 6d 70 6c 65 6d 65 6e 74 61   lock implementa
108b0 74 69 6f 6e 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  tion ***********
108c0 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  *****.**********
108d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
108e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
108f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10900 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10910 2a 2a 2a 2a 2f 0a 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a  ****/.../*******
10920 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10930 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10940 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10950 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10960 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a  *******.********
10970 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10980 2a 2a 2a 20 42 65 67 69 6e 20 41 46 50 20 4c 6f  *** Begin AFP Lo
10990 63 6b 69 6e 67 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  cking **********
109a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
109b0 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 41 46  *******.**.** AF
109c0 50 20 69 73 20 74 68 65 20 41 70 70 6c 65 20 46  P is the Apple F
109d0 69 6c 69 6e 67 20 50 72 6f 74 6f 63 6f 6c 2e 20  iling Protocol. 
109e0 20 41 46 50 20 69 73 20 61 20 6e 65 74 77 6f 72   AFP is a networ
109f0 6b 20 66 69 6c 65 73 79 73 74 65 6d 20 66 6f 75  k filesystem fou
10a00 6e 64 0a 2a 2a 20 6f 6e 20 41 70 70 6c 65 20 4d  nd.** on Apple M
10a10 61 63 69 6e 74 6f 73 68 20 63 6f 6d 70 75 74 65  acintosh compute
10a20 72 73 20 2d 20 62 6f 74 68 20 4f 53 39 20 61 6e  rs - both OS9 an
10a30 64 20 4f 53 58 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  d OSX..**.** Thi
10a40 72 64 2d 70 61 72 74 79 20 69 6d 70 6c 65 6d 65  rd-party impleme
10a50 6e 74 61 74 69 6f 6e 73 20 6f 66 20 41 46 50 20  ntations of AFP 
10a60 61 72 65 20 61 76 61 69 6c 61 62 6c 65 2e 20 20  are available.  
10a70 42 75 74 20 74 68 69 73 20 63 6f 64 65 20 68 65  But this code he
10a80 72 65 0a 2a 2a 20 6f 6e 6c 79 20 77 6f 72 6b 73  re.** only works
10a90 20 6f 6e 20 4f 53 58 2e 0a 2a 2f 0a 0a 23 69 66   on OSX..*/..#if
10aa0 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45   defined(__APPLE
10ab0 5f 5f 29 20 26 26 20 53 51 4c 49 54 45 5f 45 4e  __) && SQLITE_EN
10ac0 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59  ABLE_LOCKING_STY
10ad0 4c 45 0a 2f 2a 0a 2a 2a 20 54 68 65 20 61 66 70  LE./*.** The afp
10ae0 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 73  LockingContext s
10af0 74 72 75 63 74 75 72 65 20 63 6f 6e 74 61 69 6e  tructure contain
10b00 73 20 61 6c 6c 20 61 66 70 20 6c 6f 63 6b 20 73  s all afp lock s
10b10 70 65 63 69 66 69 63 20 73 74 61 74 65 0a 2a 2f  pecific state.*/
10b20 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20  .typedef struct 
10b30 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78  afpLockingContex
10b40 74 20 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74  t afpLockingCont
10b50 65 78 74 3b 0a 73 74 72 75 63 74 20 61 66 70 4c  ext;.struct afpL
10b60 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 7b 0a  ockingContext {.
10b70 20 20 69 6e 74 20 72 65 73 65 72 76 65 64 3b 0a    int reserved;.
10b80 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 64 62    const char *db
10b90 50 61 74 68 3b 20 20 20 20 20 20 20 20 20 20 20  Path;           
10ba0 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65    /* Name of the
10bb0 20 6f 70 65 6e 20 66 69 6c 65 20 2a 2f 0a 7d 3b   open file */.};
10bc0 0a 0a 73 74 72 75 63 74 20 42 79 74 65 52 61 6e  ..struct ByteRan
10bd0 67 65 4c 6f 63 6b 50 42 32 0a 7b 0a 20 20 75 6e  geLockPB2.{.  un
10be0 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6c 6f 6e 67  signed long long
10bf0 20 6f 66 66 73 65 74 3b 20 20 20 20 20 20 20 20   offset;        
10c00 2f 2a 20 6f 66 66 73 65 74 20 74 6f 20 66 69 72  /* offset to fir
10c10 73 74 20 62 79 74 65 20 74 6f 20 6c 6f 63 6b 20  st byte to lock 
10c20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 6c 6f  */.  unsigned lo
10c30 6e 67 20 6c 6f 6e 67 20 6c 65 6e 67 74 68 3b 20  ng long length; 
10c40 20 20 20 20 20 20 20 2f 2a 20 6e 62 72 20 6f 66         /* nbr of
10c50 20 62 79 74 65 73 20 74 6f 20 6c 6f 63 6b 20 2a   bytes to lock *
10c60 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  /.  unsigned lon
10c70 67 20 6c 6f 6e 67 20 72 65 74 52 61 6e 67 65 53  g long retRangeS
10c80 74 61 72 74 3b 20 2f 2a 20 6e 62 72 20 6f 66 20  tart; /* nbr of 
10c90 31 73 74 20 62 79 74 65 20 6c 6f 63 6b 65 64 20  1st byte locked 
10ca0 69 66 20 73 75 63 63 65 73 73 66 75 6c 20 2a 2f  if successful */
10cb0 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
10cc0 20 75 6e 4c 6f 63 6b 46 6c 61 67 3b 20 20 20 20   unLockFlag;    
10cd0 20 20 20 20 20 2f 2a 20 31 20 3d 20 75 6e 6c 6f       /* 1 = unlo
10ce0 63 6b 2c 20 30 20 3d 20 6c 6f 63 6b 20 2a 2f 0a  ck, 0 = lock */.
10cf0 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
10d00 73 74 61 72 74 45 6e 64 46 6c 61 67 3b 20 20 20  startEndFlag;   
10d10 20 20 20 20 2f 2a 20 31 3d 72 65 6c 20 74 6f 20      /* 1=rel to 
10d20 65 6e 64 20 6f 66 20 66 6f 72 6b 2c 20 30 3d 72  end of fork, 0=r
10d30 65 6c 20 74 6f 20 73 74 61 72 74 20 2a 2f 0a 20  el to start */. 
10d40 20 69 6e 74 20 66 64 3b 20 20 20 20 20 20 20 20   int fd;        
10d50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10d60 20 20 20 2f 2a 20 66 69 6c 65 20 64 65 73 63 20     /* file desc 
10d70 74 6f 20 61 73 73 6f 63 20 74 68 69 73 20 6c 6f  to assoc this lo
10d80 63 6b 20 77 69 74 68 20 2a 2f 0a 7d 3b 0a 0a 23  ck with */.};..#
10d90 64 65 66 69 6e 65 20 61 66 70 66 73 42 79 74 65  define afpfsByte
10da0 52 61 6e 67 65 4c 6f 63 6b 32 46 53 43 54 4c 20  RangeLock2FSCTL 
10db0 20 20 20 20 20 20 20 5f 49 4f 57 52 28 27 7a 27         _IOWR('z'
10dc0 2c 20 32 33 2c 20 73 74 72 75 63 74 20 42 79 74  , 23, struct Byt
10dd0 65 52 61 6e 67 65 4c 6f 63 6b 50 42 32 29 0a 0a  eRangeLockPB2)..
10de0 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 61 20  /*.** This is a 
10df0 75 74 69 6c 69 74 79 20 66 6f 72 20 73 65 74 74  utility for sett
10e00 69 6e 67 20 6f 72 20 63 6c 65 61 72 69 6e 67 20  ing or clearing 
10e10 61 20 62 69 74 2d 72 61 6e 67 65 20 6c 6f 63 6b  a bit-range lock
10e20 20 6f 6e 20 61 6e 0a 2a 2a 20 41 46 50 20 66 69   on an.** AFP fi
10e30 6c 65 73 79 73 74 65 6d 2e 0a 2a 2a 20 0a 2a 2a  lesystem..** .**
10e40 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   Return SQLITE_O
10e50 4b 20 6f 6e 20 73 75 63 63 65 73 73 2c 20 53 51  K on success, SQ
10e60 4c 49 54 45 5f 42 55 53 59 20 6f 6e 20 66 61 69  LITE_BUSY on fai
10e70 6c 75 72 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  lure..*/.static 
10e80 69 6e 74 20 61 66 70 53 65 74 4c 6f 63 6b 28 0a  int afpSetLock(.
10e90 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 70 61    const char *pa
10ea0 74 68 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  th,             
10eb0 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20   /* Name of the 
10ec0 66 69 6c 65 20 74 6f 20 62 65 20 6c 6f 63 6b 65  file to be locke
10ed0 64 20 6f 72 20 75 6e 6c 6f 63 6b 65 64 20 2a 2f  d or unlocked */
10ee0 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69  .  unixFile *pFi
10ef0 6c 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  le,             
10f00 20 20 2f 2a 20 4f 70 65 6e 20 66 69 6c 65 20 64    /* Open file d
10f10 65 73 63 72 69 70 74 6f 72 20 6f 6e 20 70 61 74  escriptor on pat
10f20 68 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20  h */.  unsigned 
10f30 6c 6f 6e 67 20 6c 6f 6e 67 20 6f 66 66 73 65 74  long long offset
10f40 2c 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 62  ,     /* First b
10f50 79 74 65 20 74 6f 20 62 65 20 6c 6f 63 6b 65 64  yte to be locked
10f60 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 6c   */.  unsigned l
10f70 6f 6e 67 20 6c 6f 6e 67 20 6c 65 6e 67 74 68 2c  ong long length,
10f80 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
10f90 66 20 62 79 74 65 73 20 74 6f 20 6c 6f 63 6b 20  f bytes to lock 
10fa0 2a 2f 0a 20 20 69 6e 74 20 73 65 74 4c 6f 63 6b  */.  int setLock
10fb0 46 6c 61 67 20 20 20 20 20 20 20 20 20 20 20 20  Flag            
10fc0 20 20 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 73      /* True to s
10fd0 65 74 20 6c 6f 63 6b 2e 20 20 46 61 6c 73 65 20  et lock.  False 
10fe0 74 6f 20 63 6c 65 61 72 20 6c 6f 63 6b 20 2a 2f  to clear lock */
10ff0 0a 29 7b 0a 20 20 73 74 72 75 63 74 20 42 79 74  .){.  struct Byt
11000 65 52 61 6e 67 65 4c 6f 63 6b 50 42 32 20 70 62  eRangeLockPB2 pb
11010 3b 0a 20 20 69 6e 74 20 65 72 72 3b 0a 20 20 0a  ;.  int err;.  .
11020 20 20 70 62 2e 75 6e 4c 6f 63 6b 46 6c 61 67 20    pb.unLockFlag 
11030 3d 20 73 65 74 4c 6f 63 6b 46 6c 61 67 20 3f 20  = setLockFlag ? 
11040 30 20 3a 20 31 3b 0a 20 20 70 62 2e 73 74 61 72  0 : 1;.  pb.star
11050 74 45 6e 64 46 6c 61 67 20 3d 20 30 3b 0a 20 20  tEndFlag = 0;.  
11060 70 62 2e 6f 66 66 73 65 74 20 3d 20 6f 66 66 73  pb.offset = offs
11070 65 74 3b 0a 20 20 70 62 2e 6c 65 6e 67 74 68 20  et;.  pb.length 
11080 3d 20 6c 65 6e 67 74 68 3b 20 0a 20 20 70 62 2e  = length; .  pb.
11090 66 64 20 3d 20 70 46 69 6c 65 2d 3e 68 3b 0a 20  fd = pFile->h;. 
110a0 20 0a 20 20 4f 53 54 52 41 43 45 28 28 22 41 46   .  OSTRACE(("AF
110b0 50 53 45 54 4c 4f 43 4b 20 5b 25 73 5d 20 66 6f  PSETLOCK [%s] fo
110c0 72 20 25 64 25 73 20 69 6e 20 72 61 6e 67 65 20  r %d%s in range 
110d0 25 6c 6c 78 3a 25 6c 6c 78 5c 6e 22 2c 20 0a 20  %llx:%llx\n", . 
110e0 20 20 20 28 73 65 74 4c 6f 63 6b 46 6c 61 67 3f     (setLockFlag?
110f0 22 4f 4e 22 3a 22 4f 46 46 22 29 2c 20 70 46 69  "ON":"OFF"), pFi
11100 6c 65 2d 3e 68 2c 20 28 70 62 2e 66 64 3d 3d 2d  le->h, (pb.fd==-
11110 31 3f 22 5b 74 65 73 74 76 61 6c 2d 31 5d 22 3a  1?"[testval-1]":
11120 22 22 29 2c 0a 20 20 20 20 6f 66 66 73 65 74 2c  ""),.    offset,
11130 20 6c 65 6e 67 74 68 29 29 3b 0a 20 20 65 72 72   length));.  err
11140 20 3d 20 66 73 63 74 6c 28 70 61 74 68 2c 20 61   = fsctl(path, a
11150 66 70 66 73 42 79 74 65 52 61 6e 67 65 4c 6f 63  fpfsByteRangeLoc
11160 6b 32 46 53 43 54 4c 2c 20 26 70 62 2c 20 30 29  k2FSCTL, &pb, 0)
11170 3b 0a 20 20 69 66 20 28 20 65 72 72 3d 3d 2d 31  ;.  if ( err==-1
11180 20 29 20 7b 0a 20 20 20 20 69 6e 74 20 72 63 3b   ) {.    int rc;
11190 0a 20 20 20 20 69 6e 74 20 74 45 72 72 6e 6f 20  .    int tErrno 
111a0 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 4f 53 54  = errno;.    OST
111b0 52 41 43 45 28 28 22 41 46 50 53 45 54 4c 4f 43  RACE(("AFPSETLOC
111c0 4b 20 66 61 69 6c 65 64 20 74 6f 20 66 73 63 74  K failed to fsct
111d0 6c 28 29 20 27 25 73 27 20 25 64 20 25 73 5c 6e  l() '%s' %d %s\n
111e0 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
111f0 70 61 74 68 2c 20 74 45 72 72 6e 6f 2c 20 73 74  path, tErrno, st
11200 72 65 72 72 6f 72 28 74 45 72 72 6e 6f 29 29 29  rerror(tErrno)))
11210 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ;.#ifdef SQLITE_
11220 49 47 4e 4f 52 45 5f 41 46 50 5f 4c 4f 43 4b 5f  IGNORE_AFP_LOCK_
11230 45 52 52 4f 52 53 0a 20 20 20 20 72 63 20 3d 20  ERRORS.    rc = 
11240 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 23 65 6c  SQLITE_BUSY;.#el
11250 73 65 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  se.    rc = sqli
11260 74 65 45 72 72 6f 72 46 72 6f 6d 50 6f 73 69 78  teErrorFromPosix
11270 45 72 72 6f 72 28 74 45 72 72 6e 6f 2c 0a 20 20  Error(tErrno,.  
11280 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11290 20 20 73 65 74 4c 6f 63 6b 46 6c 61 67 20 3f 20    setLockFlag ? 
112a0 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4c 4f 43  SQLITE_IOERR_LOC
112b0 4b 20 3a 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  K : SQLITE_IOERR
112c0 5f 55 4e 4c 4f 43 4b 29 3b 0a 23 65 6e 64 69 66  _UNLOCK);.#endif
112d0 20 2f 2a 20 53 51 4c 49 54 45 5f 49 47 4e 4f 52   /* SQLITE_IGNOR
112e0 45 5f 41 46 50 5f 4c 4f 43 4b 5f 45 52 52 4f 52  E_AFP_LOCK_ERROR
112f0 53 20 2a 2f 0a 20 20 20 20 69 66 28 20 49 53 5f  S */.    if( IS_
11300 4c 4f 43 4b 5f 45 52 52 4f 52 28 72 63 29 20 29  LOCK_ERROR(rc) )
11310 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c  {.      pFile->l
11320 61 73 74 45 72 72 6e 6f 20 3d 20 74 45 72 72 6e  astErrno = tErrn
11330 6f 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74  o;.    }.    ret
11340 75 72 6e 20 72 63 3b 0a 20 20 7d 20 65 6c 73 65  urn rc;.  } else
11350 20 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51   {.    return SQ
11360 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 7d 0a 0a  LITE_OK;.  }.}..
11370 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
11380 6e 65 20 63 68 65 63 6b 73 20 69 66 20 74 68 65  ne checks if the
11390 72 65 20 69 73 20 61 20 52 45 53 45 52 56 45 44  re is a RESERVED
113a0 20 6c 6f 63 6b 20 68 65 6c 64 20 6f 6e 20 74 68   lock held on th
113b0 65 20 73 70 65 63 69 66 69 65 64 0a 2a 2a 20 66  e specified.** f
113c0 69 6c 65 20 62 79 20 74 68 69 73 20 6f 72 20 61  ile by this or a
113d0 6e 79 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73  ny other process
113e0 2e 20 49 66 20 73 75 63 68 20 61 20 6c 6f 63 6b  . If such a lock
113f0 20 69 73 20 68 65 6c 64 2c 20 73 65 74 20 2a 70   is held, set *p
11400 52 65 73 4f 75 74 0a 2a 2a 20 74 6f 20 61 20 6e  ResOut.** to a n
11410 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75 65 20 6f 74  on-zero value ot
11420 68 65 72 77 69 73 65 20 2a 70 52 65 73 4f 75 74  herwise *pResOut
11430 20 69 73 20 73 65 74 20 74 6f 20 7a 65 72 6f 2e   is set to zero.
11440 20 20 54 68 65 20 72 65 74 75 72 6e 20 76 61 6c    The return val
11450 75 65 0a 2a 2a 20 69 73 20 73 65 74 20 74 6f 20  ue.** is set to 
11460 53 51 4c 49 54 45 5f 4f 4b 20 75 6e 6c 65 73 73  SQLITE_OK unless
11470 20 61 6e 20 49 2f 4f 20 65 72 72 6f 72 20 6f 63   an I/O error oc
11480 63 75 72 73 20 64 75 72 69 6e 67 20 6c 6f 63 6b  curs during lock
11490 20 63 68 65 63 6b 69 6e 67 2e 0a 2a 2f 0a 73 74   checking..*/.st
114a0 61 74 69 63 20 69 6e 74 20 61 66 70 43 68 65 63  atic int afpChec
114b0 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 28 73 71  kReservedLock(sq
114c0 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20  lite3_file *id, 
114d0 69 6e 74 20 2a 70 52 65 73 4f 75 74 29 7b 0a 20  int *pResOut){. 
114e0 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
114f0 5f 4f 4b 3b 0a 20 20 69 6e 74 20 72 65 73 65 72  _OK;.  int reser
11500 76 65 64 20 3d 20 30 3b 0a 20 20 75 6e 69 78 46  ved = 0;.  unixF
11510 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e  ile *pFile = (un
11520 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 0a 20  ixFile*)id;.  . 
11530 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72   SimulateIOError
11540 28 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ( return SQLITE_
11550 49 4f 45 52 52 5f 43 48 45 43 4b 52 45 53 45 52  IOERR_CHECKRESER
11560 56 45 44 4c 4f 43 4b 3b 20 29 3b 0a 20 20 0a 20  VEDLOCK; );.  . 
11570 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 20 29   assert( pFile )
11580 3b 0a 20 20 61 66 70 4c 6f 63 6b 69 6e 67 43 6f  ;.  afpLockingCo
11590 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 20 3d  ntext *context =
115a0 20 28 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74   (afpLockingCont
115b0 65 78 74 20 2a 29 20 70 46 69 6c 65 2d 3e 6c 6f  ext *) pFile->lo
115c0 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 0a 20 20  ckingContext;.  
115d0 69 66 28 20 63 6f 6e 74 65 78 74 2d 3e 72 65 73  if( context->res
115e0 65 72 76 65 64 20 29 7b 0a 20 20 20 20 2a 70 52  erved ){.    *pR
115f0 65 73 4f 75 74 20 3d 20 31 3b 0a 20 20 20 20 72  esOut = 1;.    r
11600 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
11610 0a 20 20 7d 0a 20 20 75 6e 69 78 45 6e 74 65 72  .  }.  unixEnter
11620 4d 75 74 65 78 28 29 3b 20 2f 2a 20 42 65 63 61  Mutex(); /* Beca
11630 75 73 65 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64  use pFile->pInod
11640 65 20 69 73 20 73 68 61 72 65 64 20 61 63 72 6f  e is shared acro
11650 73 73 20 74 68 72 65 61 64 73 20 2a 2f 0a 20 20  ss threads */.  
11660 0a 20 20 2f 2a 20 43 68 65 63 6b 20 69 66 20 61  .  /* Check if a
11670 20 74 68 72 65 61 64 20 69 6e 20 74 68 69 73 20   thread in this 
11680 70 72 6f 63 65 73 73 20 68 6f 6c 64 73 20 73 75  process holds su
11690 63 68 20 61 20 6c 6f 63 6b 20 2a 2f 0a 20 20 69  ch a lock */.  i
116a0 66 28 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65  f( pFile->pInode
116b0 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3e 53 48 41 52  ->eFileLock>SHAR
116c0 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 72  ED_LOCK ){.    r
116d0 65 73 65 72 76 65 64 20 3d 20 31 3b 0a 20 20 7d  eserved = 1;.  }
116e0 0a 20 20 0a 20 20 2f 2a 20 4f 74 68 65 72 77 69  .  .  /* Otherwi
116f0 73 65 20 73 65 65 20 69 66 20 73 6f 6d 65 20 6f  se see if some o
11700 74 68 65 72 20 70 72 6f 63 65 73 73 20 68 6f 6c  ther process hol
11710 64 73 20 69 74 2e 0a 20 20 20 2a 2f 0a 20 20 69  ds it..   */.  i
11720 66 28 20 21 72 65 73 65 72 76 65 64 20 29 7b 0a  f( !reserved ){.
11730 20 20 20 20 2f 2a 20 6c 6f 63 6b 20 74 68 65 20      /* lock the 
11740 52 45 53 45 52 56 45 44 20 62 79 74 65 20 2a 2f  RESERVED byte */
11750 0a 20 20 20 20 69 6e 74 20 6c 72 63 20 3d 20 61  .    int lrc = a
11760 66 70 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65 78  fpSetLock(contex
11770 74 2d 3e 64 62 50 61 74 68 2c 20 70 46 69 6c 65  t->dbPath, pFile
11780 2c 20 52 45 53 45 52 56 45 44 5f 42 59 54 45 2c  , RESERVED_BYTE,
11790 20 31 2c 31 29 3b 20 20 0a 20 20 20 20 69 66 28   1,1);  .    if(
117a0 20 53 51 4c 49 54 45 5f 4f 4b 3d 3d 6c 72 63 20   SQLITE_OK==lrc 
117b0 29 7b 0a 20 20 20 20 20 20 2f 2a 20 69 66 20 77  ){.      /* if w
117c0 65 20 73 75 63 63 65 65 64 65 64 20 69 6e 20 74  e succeeded in t
117d0 61 6b 69 6e 67 20 74 68 65 20 72 65 73 65 72 76  aking the reserv
117e0 65 64 20 6c 6f 63 6b 2c 20 75 6e 6c 6f 63 6b 20  ed lock, unlock 
117f0 69 74 20 74 6f 20 72 65 73 74 6f 72 65 0a 20 20  it to restore.  
11800 20 20 20 20 2a 2a 20 74 68 65 20 6f 72 69 67 69      ** the origi
11810 6e 61 6c 20 73 74 61 74 65 20 2a 2f 0a 20 20 20  nal state */.   
11820 20 20 20 6c 72 63 20 3d 20 61 66 70 53 65 74 4c     lrc = afpSetL
11830 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 64 62 50  ock(context->dbP
11840 61 74 68 2c 20 70 46 69 6c 65 2c 20 52 45 53 45  ath, pFile, RESE
11850 52 56 45 44 5f 42 59 54 45 2c 20 31 2c 20 30 29  RVED_BYTE, 1, 0)
11860 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20  ;.    } else {. 
11870 20 20 20 20 20 2f 2a 20 69 66 20 77 65 20 66 61       /* if we fa
11880 69 6c 65 64 20 74 6f 20 67 65 74 20 74 68 65 20  iled to get the 
11890 6c 6f 63 6b 20 74 68 65 6e 20 73 6f 6d 65 6f 6e  lock then someon
118a0 65 20 65 6c 73 65 20 6d 75 73 74 20 68 61 76 65  e else must have
118b0 20 69 74 20 2a 2f 0a 20 20 20 20 20 20 72 65 73   it */.      res
118c0 65 72 76 65 64 20 3d 20 31 3b 0a 20 20 20 20 7d  erved = 1;.    }
118d0 0a 20 20 20 20 69 66 28 20 49 53 5f 4c 4f 43 4b  .    if( IS_LOCK
118e0 5f 45 52 52 4f 52 28 6c 72 63 29 20 29 7b 0a 20  _ERROR(lrc) ){. 
118f0 20 20 20 20 20 72 63 3d 6c 72 63 3b 0a 20 20 20       rc=lrc;.   
11900 20 7d 0a 20 20 7d 0a 20 20 0a 20 20 75 6e 69 78   }.  }.  .  unix
11910 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 20 20  LeaveMutex();.  
11920 4f 53 54 52 41 43 45 28 28 22 54 45 53 54 20 57  OSTRACE(("TEST W
11930 52 2d 4c 4f 43 4b 20 25 64 20 25 64 20 25 64 20  R-LOCK %d %d %d 
11940 28 61 66 70 29 5c 6e 22 2c 20 70 46 69 6c 65 2d  (afp)\n", pFile-
11950 3e 68 2c 20 72 63 2c 20 72 65 73 65 72 76 65 64  >h, rc, reserved
11960 29 29 3b 0a 20 20 0a 20 20 2a 70 52 65 73 4f 75  ));.  .  *pResOu
11970 74 20 3d 20 72 65 73 65 72 76 65 64 3b 0a 20 20  t = reserved;.  
11980 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
11990 0a 2a 2a 20 4c 6f 63 6b 20 74 68 65 20 66 69 6c  .** Lock the fil
119a0 65 20 77 69 74 68 20 74 68 65 20 6c 6f 63 6b 20  e with the lock 
119b0 73 70 65 63 69 66 69 65 64 20 62 79 20 70 61 72  specified by par
119c0 61 6d 65 74 65 72 20 65 46 69 6c 65 4c 6f 63 6b  ameter eFileLock
119d0 20 2d 20 6f 6e 65 0a 2a 2a 20 6f 66 20 74 68 65   - one.** of the
119e0 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a   following:.**.*
119f0 2a 20 20 20 20 20 28 31 29 20 53 48 41 52 45 44  *     (1) SHARED
11a00 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 32 29  _LOCK.**     (2)
11a10 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 0a 2a   RESERVED_LOCK.*
11a20 2a 20 20 20 20 20 28 33 29 20 50 45 4e 44 49 4e  *     (3) PENDIN
11a30 47 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 34  G_LOCK.**     (4
11a40 29 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b  ) EXCLUSIVE_LOCK
11a50 0a 2a 2a 0a 2a 2a 20 53 6f 6d 65 74 69 6d 65 73  .**.** Sometimes
11a60 20 77 68 65 6e 20 72 65 71 75 65 73 74 69 6e 67   when requesting
11a70 20 6f 6e 65 20 6c 6f 63 6b 20 73 74 61 74 65 2c   one lock state,
11a80 20 61 64 64 69 74 69 6f 6e 61 6c 20 6c 6f 63 6b   additional lock
11a90 20 73 74 61 74 65 73 0a 2a 2a 20 61 72 65 20 69   states.** are i
11aa0 6e 73 65 72 74 65 64 20 69 6e 20 62 65 74 77 65  nserted in betwe
11ab0 65 6e 2e 20 20 54 68 65 20 6c 6f 63 6b 69 6e 67  en.  The locking
11ac0 20 6d 69 67 68 74 20 66 61 69 6c 20 6f 6e 20 6f   might fail on o
11ad0 6e 65 20 6f 66 20 74 68 65 20 6c 61 74 65 72 0a  ne of the later.
11ae0 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e 73 20 6c  ** transitions l
11af0 65 61 76 69 6e 67 20 74 68 65 20 6c 6f 63 6b 20  eaving the lock 
11b00 73 74 61 74 65 20 64 69 66 66 65 72 65 6e 74 20  state different 
11b10 66 72 6f 6d 20 77 68 61 74 20 69 74 20 73 74 61  from what it sta
11b20 72 74 65 64 20 62 75 74 0a 2a 2a 20 73 74 69 6c  rted but.** stil
11b30 6c 20 73 68 6f 72 74 20 6f 66 20 69 74 73 20 67  l short of its g
11b40 6f 61 6c 2e 20 20 54 68 65 20 66 6f 6c 6c 6f 77  oal.  The follow
11b50 69 6e 67 20 63 68 61 72 74 20 73 68 6f 77 73 20  ing chart shows 
11b60 74 68 65 20 61 6c 6c 6f 77 65 64 0a 2a 2a 20 74  the allowed.** t
11b70 72 61 6e 73 69 74 69 6f 6e 73 20 61 6e 64 20 74  ransitions and t
11b80 68 65 20 69 6e 73 65 72 74 65 64 20 69 6e 74 65  he inserted inte
11b90 72 6d 65 64 69 61 74 65 20 73 74 61 74 65 73 3a  rmediate states:
11ba0 0a 2a 2a 0a 2a 2a 20 20 20 20 55 4e 4c 4f 43 4b  .**.**    UNLOCK
11bb0 45 44 20 2d 3e 20 53 48 41 52 45 44 0a 2a 2a 20  ED -> SHARED.** 
11bc0 20 20 20 53 48 41 52 45 44 20 2d 3e 20 52 45 53     SHARED -> RES
11bd0 45 52 56 45 44 0a 2a 2a 20 20 20 20 53 48 41 52  ERVED.**    SHAR
11be0 45 44 20 2d 3e 20 28 50 45 4e 44 49 4e 47 29 20  ED -> (PENDING) 
11bf0 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20  -> EXCLUSIVE.** 
11c00 20 20 20 52 45 53 45 52 56 45 44 20 2d 3e 20 28     RESERVED -> (
11c10 50 45 4e 44 49 4e 47 29 20 2d 3e 20 45 58 43 4c  PENDING) -> EXCL
11c20 55 53 49 56 45 0a 2a 2a 20 20 20 20 50 45 4e 44  USIVE.**    PEND
11c30 49 4e 47 20 2d 3e 20 45 58 43 4c 55 53 49 56 45  ING -> EXCLUSIVE
11c40 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
11c50 69 6e 65 20 77 69 6c 6c 20 6f 6e 6c 79 20 69 6e  ine will only in
11c60 63 72 65 61 73 65 20 61 20 6c 6f 63 6b 2e 20 20  crease a lock.  
11c70 55 73 65 20 74 68 65 20 73 71 6c 69 74 65 33 4f  Use the sqlite3O
11c80 73 55 6e 6c 6f 63 6b 28 29 0a 2a 2a 20 72 6f 75  sUnlock().** rou
11c90 74 69 6e 65 20 74 6f 20 6c 6f 77 65 72 20 61 20  tine to lower a 
11ca0 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 2e 0a 2a  locking level..*
11cb0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 66 70  /.static int afp
11cc0 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c  Lock(sqlite3_fil
11cd0 65 20 2a 69 64 2c 20 69 6e 74 20 65 46 69 6c 65  e *id, int eFile
11ce0 4c 6f 63 6b 29 7b 0a 20 20 69 6e 74 20 72 63 20  Lock){.  int rc 
11cf0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 75  = SQLITE_OK;.  u
11d00 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d  nixFile *pFile =
11d10 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a   (unixFile*)id;.
11d20 20 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20    unixInodeInfo 
11d30 2a 70 49 6e 6f 64 65 20 3d 20 70 46 69 6c 65 2d  *pInode = pFile-
11d40 3e 70 49 6e 6f 64 65 3b 0a 20 20 61 66 70 4c 6f  >pInode;.  afpLo
11d50 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 63 6f  ckingContext *co
11d60 6e 74 65 78 74 20 3d 20 28 61 66 70 4c 6f 63 6b  ntext = (afpLock
11d70 69 6e 67 43 6f 6e 74 65 78 74 20 2a 29 20 70 46  ingContext *) pF
11d80 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74  ile->lockingCont
11d90 65 78 74 3b 0a 20 20 0a 20 20 61 73 73 65 72 74  ext;.  .  assert
11da0 28 20 70 46 69 6c 65 20 29 3b 0a 20 20 4f 53 54  ( pFile );.  OST
11db0 52 41 43 45 28 28 22 4c 4f 43 4b 20 20 20 20 25  RACE(("LOCK    %
11dc0 64 20 25 73 20 77 61 73 20 25 73 28 25 73 2c 25  d %s was %s(%s,%
11dd0 64 29 20 70 69 64 3d 25 64 20 28 61 66 70 29 5c  d) pid=%d (afp)\
11de0 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 0a 20 20  n", pFile->h,.  
11df0 20 20 20 20 20 20 20 20 20 61 7a 46 69 6c 65 4c           azFileL
11e00 6f 63 6b 28 65 46 69 6c 65 4c 6f 63 6b 29 2c 20  ock(eFileLock), 
11e10 61 7a 46 69 6c 65 4c 6f 63 6b 28 70 46 69 6c 65  azFileLock(pFile
11e20 2d 3e 65 46 69 6c 65 4c 6f 63 6b 29 2c 0a 20 20  ->eFileLock),.  
11e30 20 20 20 20 20 20 20 20 20 61 7a 46 69 6c 65 4c           azFileL
11e40 6f 63 6b 28 70 49 6e 6f 64 65 2d 3e 65 46 69 6c  ock(pInode->eFil
11e50 65 4c 6f 63 6b 29 2c 20 70 49 6e 6f 64 65 2d 3e  eLock), pInode->
11e60 6e 53 68 61 72 65 64 20 2c 20 67 65 74 70 69 64  nShared , getpid
11e70 28 29 29 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74  ()));..  /* If t
11e80 68 65 72 65 20 69 73 20 61 6c 72 65 61 64 79 20  here is already 
11e90 61 20 6c 6f 63 6b 20 6f 66 20 74 68 69 73 20 74  a lock of this t
11ea0 79 70 65 20 6f 72 20 6d 6f 72 65 20 72 65 73 74  ype or more rest
11eb0 72 69 63 74 69 76 65 20 6f 6e 20 74 68 65 0a 20  rictive on the. 
11ec0 20 2a 2a 20 75 6e 69 78 46 69 6c 65 2c 20 64 6f   ** unixFile, do
11ed0 20 6e 6f 74 68 69 6e 67 2e 20 44 6f 6e 27 74 20   nothing. Don't 
11ee0 75 73 65 20 74 68 65 20 61 66 70 5f 65 6e 64 5f  use the afp_end_
11ef0 6c 6f 63 6b 3a 20 65 78 69 74 20 70 61 74 68 2c  lock: exit path,
11f00 20 61 73 0a 20 20 2a 2a 20 75 6e 69 78 45 6e 74   as.  ** unixEnt
11f10 65 72 4d 75 74 65 78 28 29 20 68 61 73 6e 27 74  erMutex() hasn't
11f20 20 62 65 65 6e 20 63 61 6c 6c 65 64 20 79 65 74   been called yet
11f30 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 46 69  ..  */.  if( pFi
11f40 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3e 3d 65  le->eFileLock>=e
11f50 46 69 6c 65 4c 6f 63 6b 20 29 7b 0a 20 20 20 20  FileLock ){.    
11f60 4f 53 54 52 41 43 45 28 28 22 4c 4f 43 4b 20 20  OSTRACE(("LOCK  
11f70 20 20 25 64 20 25 73 20 6f 6b 20 28 61 6c 72 65    %d %s ok (alre
11f80 61 64 79 20 68 65 6c 64 29 20 28 61 66 70 29 5c  ady held) (afp)\
11f90 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 0a 20 20  n", pFile->h,.  
11fa0 20 20 20 20 20 20 20 20 20 61 7a 46 69 6c 65 4c           azFileL
11fb0 6f 63 6b 28 65 46 69 6c 65 4c 6f 63 6b 29 29 29  ock(eFileLock)))
11fc0 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
11fd0 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 2f  ITE_OK;.  }..  /
11fe0 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20  * Make sure the 
11ff0 6c 6f 63 6b 69 6e 67 20 73 65 71 75 65 6e 63 65  locking sequence
12000 20 69 73 20 63 6f 72 72 65 63 74 0a 20 20 2a 2a   is correct.  **
12010 20 20 28 31 29 20 57 65 20 6e 65 76 65 72 20 6d    (1) We never m
12020 6f 76 65 20 66 72 6f 6d 20 75 6e 6c 6f 63 6b 65  ove from unlocke
12030 64 20 74 6f 20 61 6e 79 74 68 69 6e 67 20 68 69  d to anything hi
12040 67 68 65 72 20 74 68 61 6e 20 73 68 61 72 65 64  gher than shared
12050 20 6c 6f 63 6b 2e 0a 20 20 2a 2a 20 20 28 32 29   lock..  **  (2)
12060 20 53 51 4c 69 74 65 20 6e 65 76 65 72 20 65 78   SQLite never ex
12070 70 6c 69 63 69 74 6c 79 20 72 65 71 75 65 73 74  plicitly request
12080 73 20 61 20 70 65 6e 64 69 67 20 6c 6f 63 6b 2e  s a pendig lock.
12090 0a 20 20 2a 2a 20 20 28 33 29 20 41 20 73 68 61  .  **  (3) A sha
120a0 72 65 64 20 6c 6f 63 6b 20 69 73 20 61 6c 77 61  red lock is alwa
120b0 79 73 20 68 65 6c 64 20 77 68 65 6e 20 61 20 72  ys held when a r
120c0 65 73 65 72 76 65 20 6c 6f 63 6b 20 69 73 20 72  eserve lock is r
120d0 65 71 75 65 73 74 65 64 2e 0a 20 20 2a 2f 0a 20  equested..  */. 
120e0 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 2d 3e   assert( pFile->
120f0 65 46 69 6c 65 4c 6f 63 6b 21 3d 4e 4f 5f 4c 4f  eFileLock!=NO_LO
12100 43 4b 20 7c 7c 20 65 46 69 6c 65 4c 6f 63 6b 3d  CK || eFileLock=
12110 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a  =SHARED_LOCK );.
12120 20 20 61 73 73 65 72 74 28 20 65 46 69 6c 65 4c    assert( eFileL
12130 6f 63 6b 21 3d 50 45 4e 44 49 4e 47 5f 4c 4f 43  ock!=PENDING_LOC
12140 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 65  K );.  assert( e
12150 46 69 6c 65 4c 6f 63 6b 21 3d 52 45 53 45 52 56  FileLock!=RESERV
12160 45 44 5f 4c 4f 43 4b 20 7c 7c 20 70 46 69 6c 65  ED_LOCK || pFile
12170 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41  ->eFileLock==SHA
12180 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 0a 20  RED_LOCK );.  . 
12190 20 2f 2a 20 54 68 69 73 20 6d 75 74 65 78 20 69   /* This mutex i
121a0 73 20 6e 65 65 64 65 64 20 62 65 63 61 75 73 65  s needed because
121b0 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 20 69   pFile->pInode i
121c0 73 20 73 68 61 72 65 64 20 61 63 72 6f 73 73 20  s shared across 
121d0 74 68 72 65 61 64 73 0a 20 20 2a 2f 0a 20 20 75  threads.  */.  u
121e0 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29 3b  nixEnterMutex();
121f0 0a 20 20 70 49 6e 6f 64 65 20 3d 20 70 46 69 6c  .  pInode = pFil
12200 65 2d 3e 70 49 6e 6f 64 65 3b 0a 0a 20 20 2f 2a  e->pInode;..  /*
12210 20 49 66 20 73 6f 6d 65 20 74 68 72 65 61 64 20   If some thread 
12220 75 73 69 6e 67 20 74 68 69 73 20 50 49 44 20 68  using this PID h
12230 61 73 20 61 20 6c 6f 63 6b 20 76 69 61 20 61 20  as a lock via a 
12240 64 69 66 66 65 72 65 6e 74 20 75 6e 69 78 46 69  different unixFi
12250 6c 65 2a 0a 20 20 2a 2a 20 68 61 6e 64 6c 65 20  le*.  ** handle 
12260 74 68 61 74 20 70 72 65 63 6c 75 64 65 73 20 74  that precludes t
12270 68 65 20 72 65 71 75 65 73 74 65 64 20 6c 6f 63  he requested loc
12280 6b 2c 20 72 65 74 75 72 6e 20 42 55 53 59 2e 0a  k, return BUSY..
12290 20 20 2a 2f 0a 20 20 69 66 28 20 28 70 46 69 6c    */.  if( (pFil
122a0 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 21 3d 70 49  e->eFileLock!=pI
122b0 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20  node->eFileLock 
122c0 26 26 20 0a 20 20 20 20 20 20 20 28 70 49 6e 6f  && .       (pIno
122d0 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3e 3d 50  de->eFileLock>=P
122e0 45 4e 44 49 4e 47 5f 4c 4f 43 4b 20 7c 7c 20 65  ENDING_LOCK || e
122f0 46 69 6c 65 4c 6f 63 6b 3e 53 48 41 52 45 44 5f  FileLock>SHARED_
12300 4c 4f 43 4b 29 29 0a 20 20 20 20 20 29 7b 0a 20  LOCK)).     ){. 
12310 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42     rc = SQLITE_B
12320 55 53 59 3b 0a 20 20 20 20 67 6f 74 6f 20 61 66  USY;.    goto af
12330 70 5f 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 7d 0a  p_end_lock;.  }.
12340 20 20 0a 20 20 2f 2a 20 49 66 20 61 20 53 48 41    .  /* If a SHA
12350 52 45 44 20 6c 6f 63 6b 20 69 73 20 72 65 71 75  RED lock is requ
12360 65 73 74 65 64 2c 20 61 6e 64 20 73 6f 6d 65 20  ested, and some 
12370 74 68 72 65 61 64 20 75 73 69 6e 67 20 74 68 69  thread using thi
12380 73 20 50 49 44 20 61 6c 72 65 61 64 79 0a 20 20  s PID already.  
12390 2a 2a 20 68 61 73 20 61 20 53 48 41 52 45 44 20  ** has a SHARED 
123a0 6f 72 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b  or RESERVED lock
123b0 2c 20 74 68 65 6e 20 69 6e 63 72 65 6d 65 6e 74  , then increment
123c0 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74   reference count
123d0 73 20 61 6e 64 0a 20 20 2a 2a 20 72 65 74 75 72  s and.  ** retur
123e0 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 20 20 2a  n SQLITE_OK..  *
123f0 2f 0a 20 20 69 66 28 20 65 46 69 6c 65 4c 6f 63  /.  if( eFileLoc
12400 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 26  k==SHARED_LOCK &
12410 26 20 0a 20 20 20 20 20 28 70 49 6e 6f 64 65 2d  & .     (pInode-
12420 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52  >eFileLock==SHAR
12430 45 44 5f 4c 4f 43 4b 20 7c 7c 20 70 49 6e 6f 64  ED_LOCK || pInod
12440 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d 52 45  e->eFileLock==RE
12450 53 45 52 56 45 44 5f 4c 4f 43 4b 29 20 29 7b 0a  SERVED_LOCK) ){.
12460 20 20 20 20 61 73 73 65 72 74 28 20 65 46 69 6c      assert( eFil
12470 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f  eLock==SHARED_LO
12480 43 4b 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  CK );.    assert
12490 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f  ( pFile->eFileLo
124a0 63 6b 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73  ck==0 );.    ass
124b0 65 72 74 28 20 70 49 6e 6f 64 65 2d 3e 6e 53 68  ert( pInode->nSh
124c0 61 72 65 64 3e 30 20 29 3b 0a 20 20 20 20 70 46  ared>0 );.    pF
124d0 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d  ile->eFileLock =
124e0 20 53 48 41 52 45 44 5f 4c 4f 43 4b 3b 0a 20 20   SHARED_LOCK;.  
124f0 20 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65    pInode->nShare
12500 64 2b 2b 3b 0a 20 20 20 20 70 49 6e 6f 64 65 2d  d++;.    pInode-
12510 3e 6e 4c 6f 63 6b 2b 2b 3b 0a 20 20 20 20 67 6f  >nLock++;.    go
12520 74 6f 20 61 66 70 5f 65 6e 64 5f 6c 6f 63 6b 3b  to afp_end_lock;
12530 0a 20 20 7d 0a 20 20 20 20 0a 20 20 2f 2a 20 41  .  }.    .  /* A
12540 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 20 69 73   PENDING lock is
12550 20 6e 65 65 64 65 64 20 62 65 66 6f 72 65 20 61   needed before a
12560 63 71 75 69 72 69 6e 67 20 61 20 53 48 41 52 45  cquiring a SHARE
12570 44 20 6c 6f 63 6b 20 61 6e 64 20 62 65 66 6f 72  D lock and befor
12580 65 0a 20 20 2a 2a 20 61 63 71 75 69 72 69 6e 67  e.  ** acquiring
12590 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f   an EXCLUSIVE lo
125a0 63 6b 2e 20 20 46 6f 72 20 74 68 65 20 53 48 41  ck.  For the SHA
125b0 52 45 44 20 6c 6f 63 6b 2c 20 74 68 65 20 50 45  RED lock, the PE
125c0 4e 44 49 4e 47 20 77 69 6c 6c 0a 20 20 2a 2a 20  NDING will.  ** 
125d0 62 65 20 72 65 6c 65 61 73 65 64 2e 0a 20 20 2a  be released..  *
125e0 2f 0a 20 20 69 66 28 20 65 46 69 6c 65 4c 6f 63  /.  if( eFileLoc
125f0 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 0a  k==SHARED_LOCK .
12600 20 20 20 20 20 20 7c 7c 20 28 65 46 69 6c 65 4c        || (eFileL
12610 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c  ock==EXCLUSIVE_L
12620 4f 43 4b 20 26 26 20 70 46 69 6c 65 2d 3e 65 46  OCK && pFile->eF
12630 69 6c 65 4c 6f 63 6b 3c 50 45 4e 44 49 4e 47 5f  ileLock<PENDING_
12640 4c 4f 43 4b 29 0a 20 20 29 7b 0a 20 20 20 20 69  LOCK).  ){.    i
12650 6e 74 20 66 61 69 6c 65 64 3b 0a 20 20 20 20 66  nt failed;.    f
12660 61 69 6c 65 64 20 3d 20 61 66 70 53 65 74 4c 6f  ailed = afpSetLo
12670 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 64 62 50 61  ck(context->dbPa
12680 74 68 2c 20 70 46 69 6c 65 2c 20 50 45 4e 44 49  th, pFile, PENDI
12690 4e 47 5f 42 59 54 45 2c 20 31 2c 20 31 29 3b 0a  NG_BYTE, 1, 1);.
126a0 20 20 20 20 69 66 20 28 66 61 69 6c 65 64 29 20      if (failed) 
126b0 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 66 61 69  {.      rc = fai
126c0 6c 65 64 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20  led;.      goto 
126d0 61 66 70 5f 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20  afp_end_lock;.  
126e0 20 20 7d 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20    }.  }.  .  /* 
126f0 49 66 20 63 6f 6e 74 72 6f 6c 20 67 65 74 73 20  If control gets 
12700 74 6f 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 74  to this point, t
12710 68 65 6e 20 61 63 74 75 61 6c 6c 79 20 67 6f 20  hen actually go 
12720 61 68 65 61 64 20 61 6e 64 20 6d 61 6b 65 0a 20  ahead and make. 
12730 20 2a 2a 20 6f 70 65 72 61 74 69 6e 67 20 73 79   ** operating sy
12740 73 74 65 6d 20 63 61 6c 6c 73 20 66 6f 72 20 74  stem calls for t
12750 68 65 20 73 70 65 63 69 66 69 65 64 20 6c 6f 63  he specified loc
12760 6b 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65 46  k..  */.  if( eF
12770 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f  ileLock==SHARED_
12780 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 69 6e 74 20  LOCK ){.    int 
12790 6c 72 63 31 2c 20 6c 72 63 32 2c 20 6c 72 63 31  lrc1, lrc2, lrc1
127a0 45 72 72 6e 6f 3b 0a 20 20 20 20 6c 6f 6e 67 20  Errno;.    long 
127b0 6c 6b 2c 20 6d 61 73 6b 3b 0a 20 20 20 20 0a 20  lk, mask;.    . 
127c0 20 20 20 61 73 73 65 72 74 28 20 70 49 6e 6f 64     assert( pInod
127d0 65 2d 3e 6e 53 68 61 72 65 64 3d 3d 30 20 29 3b  e->nShared==0 );
127e0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 49 6e  .    assert( pIn
127f0 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d  ode->eFileLock==
12800 30 20 29 3b 0a 20 20 20 20 20 20 20 20 0a 20 20  0 );.        .  
12810 20 20 6d 61 73 6b 20 3d 20 28 73 69 7a 65 6f 66    mask = (sizeof
12820 28 6c 6f 6e 67 29 3d 3d 38 29 20 3f 20 4c 41 52  (long)==8) ? LAR
12830 47 45 53 54 5f 49 4e 54 36 34 20 3a 20 30 78 37  GEST_INT64 : 0x7
12840 66 66 66 66 66 66 66 3b 0a 20 20 20 20 2f 2a 20  fffffff;.    /* 
12850 4e 6f 77 20 67 65 74 20 74 68 65 20 72 65 61 64  Now get the read
12860 2d 6c 6f 63 6b 20 53 48 41 52 45 44 5f 4c 4f 43  -lock SHARED_LOC
12870 4b 20 2a 2f 0a 20 20 20 20 2f 2a 20 6e 6f 74 65  K */.    /* note
12880 20 74 68 61 74 20 74 68 65 20 71 75 61 6c 69 74   that the qualit
12890 79 20 6f 66 20 74 68 65 20 72 61 6e 64 6f 6d 6e  y of the randomn
128a0 65 73 73 20 64 6f 65 73 6e 27 74 20 6d 61 74 74  ess doesn't matt
128b0 65 72 20 74 68 61 74 20 6d 75 63 68 20 2a 2f 0a  er that much */.
128c0 20 20 20 20 6c 6b 20 3d 20 72 61 6e 64 6f 6d 28      lk = random(
128d0 29 3b 20 0a 20 20 20 20 70 49 6e 6f 64 65 2d 3e  ); .    pInode->
128e0 73 68 61 72 65 64 42 79 74 65 20 3d 20 28 6c 6b  sharedByte = (lk
128f0 20 26 20 6d 61 73 6b 29 25 28 53 48 41 52 45 44   & mask)%(SHARED
12900 5f 53 49 5a 45 20 2d 20 31 29 3b 0a 20 20 20 20  _SIZE - 1);.    
12910 6c 72 63 31 20 3d 20 61 66 70 53 65 74 4c 6f 63  lrc1 = afpSetLoc
12920 6b 28 63 6f 6e 74 65 78 74 2d 3e 64 62 50 61 74  k(context->dbPat
12930 68 2c 20 70 46 69 6c 65 2c 20 0a 20 20 20 20 20  h, pFile, .     
12940 20 20 20 20 20 53 48 41 52 45 44 5f 46 49 52 53       SHARED_FIRS
12950 54 2b 70 49 6e 6f 64 65 2d 3e 73 68 61 72 65 64  T+pInode->shared
12960 42 79 74 65 2c 20 31 2c 20 31 29 3b 0a 20 20 20  Byte, 1, 1);.   
12970 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52   if( IS_LOCK_ERR
12980 4f 52 28 6c 72 63 31 29 20 29 7b 0a 20 20 20 20  OR(lrc1) ){.    
12990 20 20 6c 72 63 31 45 72 72 6e 6f 20 3d 20 70 46    lrc1Errno = pF
129a0 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 3b 0a  ile->lastErrno;.
129b0 20 20 20 20 7d 0a 20 20 20 20 2f 2a 20 44 72 6f      }.    /* Dro
129c0 70 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20  p the temporary 
129d0 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 20 2a 2f 0a  PENDING lock */.
129e0 20 20 20 20 6c 72 63 32 20 3d 20 61 66 70 53 65      lrc2 = afpSe
129f0 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 64  tLock(context->d
12a00 62 50 61 74 68 2c 20 70 46 69 6c 65 2c 20 50 45  bPath, pFile, PE
12a10 4e 44 49 4e 47 5f 42 59 54 45 2c 20 31 2c 20 30  NDING_BYTE, 1, 0
12a20 29 3b 0a 20 20 20 20 0a 20 20 20 20 69 66 28 20  );.    .    if( 
12a30 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 6c 72  IS_LOCK_ERROR(lr
12a40 63 31 29 20 29 20 7b 0a 20 20 20 20 20 20 70 46  c1) ) {.      pF
12a50 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d  ile->lastErrno =
12a60 20 6c 72 63 31 45 72 72 6e 6f 3b 0a 20 20 20 20   lrc1Errno;.    
12a70 20 20 72 63 20 3d 20 6c 72 63 31 3b 0a 20 20 20    rc = lrc1;.   
12a80 20 20 20 67 6f 74 6f 20 61 66 70 5f 65 6e 64 5f     goto afp_end_
12a90 6c 6f 63 6b 3b 0a 20 20 20 20 7d 20 65 6c 73 65  lock;.    } else
12aa0 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52   if( IS_LOCK_ERR
12ab0 4f 52 28 6c 72 63 32 29 20 29 7b 0a 20 20 20 20  OR(lrc2) ){.    
12ac0 20 20 72 63 20 3d 20 6c 72 63 32 3b 0a 20 20 20    rc = lrc2;.   
12ad0 20 20 20 67 6f 74 6f 20 61 66 70 5f 65 6e 64 5f     goto afp_end_
12ae0 6c 6f 63 6b 3b 0a 20 20 20 20 7d 20 65 6c 73 65  lock;.    } else
12af0 20 69 66 28 20 6c 72 63 31 20 21 3d 20 53 51 4c   if( lrc1 != SQL
12b00 49 54 45 5f 4f 4b 20 29 20 7b 0a 20 20 20 20 20  ITE_OK ) {.     
12b10 20 72 63 20 3d 20 6c 72 63 31 3b 0a 20 20 20 20   rc = lrc1;.    
12b20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 70  } else {.      p
12b30 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20  File->eFileLock 
12b40 3d 20 53 48 41 52 45 44 5f 4c 4f 43 4b 3b 0a 20  = SHARED_LOCK;. 
12b50 20 20 20 20 20 70 49 6e 6f 64 65 2d 3e 6e 4c 6f       pInode->nLo
12b60 63 6b 2b 2b 3b 0a 20 20 20 20 20 20 70 49 6e 6f  ck++;.      pIno
12b70 64 65 2d 3e 6e 53 68 61 72 65 64 20 3d 20 31 3b  de->nShared = 1;
12b80 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69  .    }.  }else i
12b90 66 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 45 58  f( eFileLock==EX
12ba0 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 26 26 20  CLUSIVE_LOCK && 
12bb0 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64 3e  pInode->nShared>
12bc0 31 20 29 7b 0a 20 20 20 20 2f 2a 20 57 65 20 61  1 ){.    /* We a
12bd0 72 65 20 74 72 79 69 6e 67 20 66 6f 72 20 61 6e  re trying for an
12be0 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20   exclusive lock 
12bf0 62 75 74 20 61 6e 6f 74 68 65 72 20 74 68 72 65  but another thre
12c00 61 64 20 69 6e 20 74 68 69 73 0a 20 20 20 20 20  ad in this.     
12c10 2a 2a 20 73 61 6d 65 20 70 72 6f 63 65 73 73 20  ** same process 
12c20 69 73 20 73 74 69 6c 6c 20 68 6f 6c 64 69 6e 67  is still holding
12c30 20 61 20 73 68 61 72 65 64 20 6c 6f 63 6b 2e 20   a shared lock. 
12c40 2a 2f 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  */.    rc = SQLI
12c50 54 45 5f 42 55 53 59 3b 0a 20 20 7d 65 6c 73 65  TE_BUSY;.  }else
12c60 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 72 65 71  {.    /* The req
12c70 75 65 73 74 20 77 61 73 20 66 6f 72 20 61 20 52  uest was for a R
12c80 45 53 45 52 56 45 44 20 6f 72 20 45 58 43 4c 55  ESERVED or EXCLU
12c90 53 49 56 45 20 6c 6f 63 6b 2e 20 20 49 74 20 69  SIVE lock.  It i
12ca0 73 0a 20 20 20 20 2a 2a 20 61 73 73 75 6d 65 64  s.    ** assumed
12cb0 20 74 68 61 74 20 74 68 65 72 65 20 69 73 20 61   that there is a
12cc0 20 53 48 41 52 45 44 20 6f 72 20 67 72 65 61 74   SHARED or great
12cd0 65 72 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 66  er lock on the f
12ce0 69 6c 65 0a 20 20 20 20 2a 2a 20 61 6c 72 65 61  ile.    ** alrea
12cf0 64 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  dy..    */.    i
12d00 6e 74 20 66 61 69 6c 65 64 20 3d 20 30 3b 0a 20  nt failed = 0;. 
12d10 20 20 20 61 73 73 65 72 74 28 20 30 21 3d 70 46     assert( 0!=pF
12d20 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 29  ile->eFileLock )
12d30 3b 0a 20 20 20 20 69 66 20 28 65 46 69 6c 65 4c  ;.    if (eFileL
12d40 6f 63 6b 20 3e 3d 20 52 45 53 45 52 56 45 44 5f  ock >= RESERVED_
12d50 4c 4f 43 4b 20 26 26 20 70 46 69 6c 65 2d 3e 65  LOCK && pFile->e
12d60 46 69 6c 65 4c 6f 63 6b 20 3c 20 52 45 53 45 52  FileLock < RESER
12d70 56 45 44 5f 4c 4f 43 4b 29 20 7b 0a 20 20 20 20  VED_LOCK) {.    
12d80 20 20 20 20 2f 2a 20 41 63 71 75 69 72 65 20 61      /* Acquire a
12d90 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 2a   RESERVED lock *
12da0 2f 0a 20 20 20 20 20 20 20 20 66 61 69 6c 65 64  /.        failed
12db0 20 3d 20 61 66 70 53 65 74 4c 6f 63 6b 28 63 6f   = afpSetLock(co
12dc0 6e 74 65 78 74 2d 3e 64 62 50 61 74 68 2c 20 70  ntext->dbPath, p
12dd0 46 69 6c 65 2c 20 52 45 53 45 52 56 45 44 5f 42  File, RESERVED_B
12de0 59 54 45 2c 20 31 2c 31 29 3b 0a 20 20 20 20 20  YTE, 1,1);.     
12df0 20 69 66 28 20 21 66 61 69 6c 65 64 20 29 7b 0a   if( !failed ){.
12e00 20 20 20 20 20 20 20 20 63 6f 6e 74 65 78 74 2d          context-
12e10 3e 72 65 73 65 72 76 65 64 20 3d 20 31 3b 0a 20  >reserved = 1;. 
12e20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
12e30 20 69 66 20 28 21 66 61 69 6c 65 64 20 26 26 20   if (!failed && 
12e40 65 46 69 6c 65 4c 6f 63 6b 20 3d 3d 20 45 58 43  eFileLock == EXC
12e50 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 20 7b 0a 20  LUSIVE_LOCK) {. 
12e60 20 20 20 20 20 2f 2a 20 41 63 71 75 69 72 65 20       /* Acquire 
12e70 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63  an EXCLUSIVE loc
12e80 6b 20 2a 2f 0a 20 20 20 20 20 20 20 20 0a 20 20  k */.        .  
12e90 20 20 20 20 2f 2a 20 52 65 6d 6f 76 65 20 74 68      /* Remove th
12ea0 65 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 62 65  e shared lock be
12eb0 66 6f 72 65 20 74 72 79 69 6e 67 20 74 68 65 20  fore trying the 
12ec0 72 61 6e 67 65 2e 20 20 77 65 27 6c 6c 20 6e 65  range.  we'll ne
12ed0 65 64 20 74 6f 20 0a 20 20 20 20 20 20 2a 2a 20  ed to .      ** 
12ee0 72 65 65 73 74 61 62 6c 69 73 68 20 74 68 65 20  reestablish the 
12ef0 73 68 61 72 65 64 20 6c 6f 63 6b 20 69 66 20 77  shared lock if w
12f00 65 20 63 61 6e 27 74 20 67 65 74 20 74 68 65 20  e can't get the 
12f10 20 61 66 70 55 6e 6c 6f 63 6b 0a 20 20 20 20 20   afpUnlock.     
12f20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 21 28   */.      if( !(
12f30 66 61 69 6c 65 64 20 3d 20 61 66 70 53 65 74 4c  failed = afpSetL
12f40 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 64 62 50  ock(context->dbP
12f50 61 74 68 2c 20 70 46 69 6c 65 2c 20 53 48 41 52  ath, pFile, SHAR
12f60 45 44 5f 46 49 52 53 54 20 2b 0a 20 20 20 20 20  ED_FIRST +.     
12f70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12f80 20 20 20 20 70 49 6e 6f 64 65 2d 3e 73 68 61 72      pInode->shar
12f90 65 64 42 79 74 65 2c 20 31 2c 20 30 29 29 20 29  edByte, 1, 0)) )
12fa0 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 66 61  {.        int fa
12fb0 69 6c 65 64 32 20 3d 20 53 51 4c 49 54 45 5f 4f  iled2 = SQLITE_O
12fc0 4b 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20 6e 6f  K;.        /* no
12fd0 77 20 61 74 74 65 6d 6d 70 74 20 74 6f 20 67 65  w attemmpt to ge
12fe0 74 20 74 68 65 20 65 78 63 6c 75 73 69 76 65 20  t the exclusive 
12ff0 6c 6f 63 6b 20 72 61 6e 67 65 20 2a 2f 0a 20 20  lock range */.  
13000 20 20 20 20 20 20 66 61 69 6c 65 64 20 3d 20 61        failed = a
13010 66 70 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65 78  fpSetLock(contex
13020 74 2d 3e 64 62 50 61 74 68 2c 20 70 46 69 6c 65  t->dbPath, pFile
13030 2c 20 53 48 41 52 45 44 5f 46 49 52 53 54 2c 20  , SHARED_FIRST, 
13040 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
13050 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13060 53 48 41 52 45 44 5f 53 49 5a 45 2c 20 31 29 3b  SHARED_SIZE, 1);
13070 0a 20 20 20 20 20 20 20 20 69 66 28 20 66 61 69  .        if( fai
13080 6c 65 64 20 26 26 20 28 66 61 69 6c 65 64 32 20  led && (failed2 
13090 3d 20 61 66 70 53 65 74 4c 6f 63 6b 28 63 6f 6e  = afpSetLock(con
130a0 74 65 78 74 2d 3e 64 62 50 61 74 68 2c 20 70 46  text->dbPath, pF
130b0 69 6c 65 2c 20 0a 20 20 20 20 20 20 20 20 20 20  ile, .          
130c0 20 20 20 20 20 20 20 20 20 20 20 20 20 53 48 41               SHA
130d0 52 45 44 5f 46 49 52 53 54 20 2b 20 70 49 6e 6f  RED_FIRST + pIno
130e0 64 65 2d 3e 73 68 61 72 65 64 42 79 74 65 2c 20  de->sharedByte, 
130f0 31 2c 20 31 29 29 20 29 7b 0a 20 20 20 20 20 20  1, 1)) ){.      
13100 20 20 20 20 2f 2a 20 43 61 6e 27 74 20 72 65 65      /* Can't ree
13110 73 74 61 62 6c 69 73 68 20 74 68 65 20 73 68 61  stablish the sha
13120 72 65 64 20 6c 6f 63 6b 2e 20 20 53 71 6c 69 74  red lock.  Sqlit
13130 65 20 63 61 6e 27 74 20 64 65 61 6c 2c 20 74 68  e can't deal, th
13140 69 73 20 69 73 0a 20 20 20 20 20 20 20 20 20 20  is is.          
13150 2a 2a 20 61 20 63 72 69 74 69 63 61 6c 20 49 2f  ** a critical I/
13160 4f 20 65 72 72 6f 72 0a 20 20 20 20 20 20 20 20  O error.        
13170 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 72    */.          r
13180 63 20 3d 20 28 28 66 61 69 6c 65 64 20 26 20 53  c = ((failed & S
13190 51 4c 49 54 45 5f 49 4f 45 52 52 29 20 3d 3d 20  QLITE_IOERR) == 
131a0 53 51 4c 49 54 45 5f 49 4f 45 52 52 29 20 3f 20  SQLITE_IOERR) ? 
131b0 66 61 69 6c 65 64 32 20 3a 20 0a 20 20 20 20 20  failed2 : .     
131c0 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45            SQLITE
131d0 5f 49 4f 45 52 52 5f 4c 4f 43 4b 3b 0a 20 20 20  _IOERR_LOCK;.   
131e0 20 20 20 20 20 20 20 67 6f 74 6f 20 61 66 70 5f         goto afp_
131f0 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 20 20 20 20  end_lock;.      
13200 20 20 7d 20 0a 20 20 20 20 20 20 7d 65 6c 73 65    } .      }else
13210 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 66  {.        rc = f
13220 61 69 6c 65 64 3b 20 0a 20 20 20 20 20 20 7d 0a  ailed; .      }.
13230 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 66 61      }.    if( fa
13240 69 6c 65 64 20 29 7b 0a 20 20 20 20 20 20 72 63  iled ){.      rc
13250 20 3d 20 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d   = failed;.    }
13260 0a 20 20 7d 0a 20 20 0a 20 20 69 66 28 20 72 63  .  }.  .  if( rc
13270 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
13280 20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c     pFile->eFileL
13290 6f 63 6b 20 3d 20 65 46 69 6c 65 4c 6f 63 6b 3b  ock = eFileLock;
132a0 0a 20 20 20 20 70 49 6e 6f 64 65 2d 3e 65 46 69  .    pInode->eFi
132b0 6c 65 4c 6f 63 6b 20 3d 20 65 46 69 6c 65 4c 6f  leLock = eFileLo
132c0 63 6b 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  ck;.  }else if( 
132d0 65 46 69 6c 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55  eFileLock==EXCLU
132e0 53 49 56 45 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20  SIVE_LOCK ){.   
132f0 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63   pFile->eFileLoc
13300 6b 20 3d 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b  k = PENDING_LOCK
13310 3b 0a 20 20 20 20 70 49 6e 6f 64 65 2d 3e 65 46  ;.    pInode->eF
13320 69 6c 65 4c 6f 63 6b 20 3d 20 50 45 4e 44 49 4e  ileLock = PENDIN
13330 47 5f 4c 4f 43 4b 3b 0a 20 20 7d 0a 20 20 0a 61  G_LOCK;.  }.  .a
13340 66 70 5f 65 6e 64 5f 6c 6f 63 6b 3a 0a 20 20 75  fp_end_lock:.  u
13350 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b  nixLeaveMutex();
13360 0a 20 20 4f 53 54 52 41 43 45 28 28 22 4c 4f 43  .  OSTRACE(("LOC
13370 4b 20 20 20 20 25 64 20 25 73 20 25 73 20 28 61  K    %d %s %s (a
13380 66 70 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68  fp)\n", pFile->h
13390 2c 20 61 7a 46 69 6c 65 4c 6f 63 6b 28 65 46 69  , azFileLock(eFi
133a0 6c 65 4c 6f 63 6b 29 2c 20 0a 20 20 20 20 20 20  leLock), .      
133b0 20 20 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b     rc==SQLITE_OK
133c0 20 3f 20 22 6f 6b 22 20 3a 20 22 66 61 69 6c 65   ? "ok" : "faile
133d0 64 22 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  d"));.  return r
133e0 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 77 65  c;.}../*.** Lowe
133f0 72 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65  r the locking le
13400 76 65 6c 20 6f 6e 20 66 69 6c 65 20 64 65 73 63  vel on file desc
13410 72 69 70 74 6f 72 20 70 46 69 6c 65 20 74 6f 20  riptor pFile to 
13420 65 46 69 6c 65 4c 6f 63 6b 2e 20 20 65 46 69 6c  eFileLock.  eFil
13430 65 4c 6f 63 6b 0a 2a 2a 20 6d 75 73 74 20 62 65  eLock.** must be
13440 20 65 69 74 68 65 72 20 4e 4f 5f 4c 4f 43 4b 20   either NO_LOCK 
13450 6f 72 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2e 0a  or SHARED_LOCK..
13460 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6c 6f 63  **.** If the loc
13470 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 66 20 74 68  king level of th
13480 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  e file descripto
13490 72 20 69 73 20 61 6c 72 65 61 64 79 20 61 74 20  r is already at 
134a0 6f 72 20 62 65 6c 6f 77 0a 2a 2a 20 74 68 65 20  or below.** the 
134b0 72 65 71 75 65 73 74 65 64 20 6c 6f 63 6b 69 6e  requested lockin
134c0 67 20 6c 65 76 65 6c 2c 20 74 68 69 73 20 72 6f  g level, this ro
134d0 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70  utine is a no-op
134e0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
134f0 61 66 70 55 6e 6c 6f 63 6b 28 73 71 6c 69 74 65  afpUnlock(sqlite
13500 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20  3_file *id, int 
13510 65 46 69 6c 65 4c 6f 63 6b 29 20 7b 0a 20 20 69  eFileLock) {.  i
13520 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
13530 4b 3b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70  K;.  unixFile *p
13540 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65  File = (unixFile
13550 2a 29 69 64 3b 0a 20 20 75 6e 69 78 49 6e 6f 64  *)id;.  unixInod
13560 65 49 6e 66 6f 20 2a 70 49 6e 6f 64 65 3b 0a 20  eInfo *pInode;. 
13570 20 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65   afpLockingConte
13580 78 74 20 2a 63 6f 6e 74 65 78 74 20 3d 20 28 61  xt *context = (a
13590 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  fpLockingContext
135a0 20 2a 29 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69   *) pFile->locki
135b0 6e 67 43 6f 6e 74 65 78 74 3b 0a 20 20 69 6e 74  ngContext;.  int
135c0 20 73 6b 69 70 53 68 61 72 65 64 20 3d 20 30 3b   skipShared = 0;
135d0 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54  .#ifdef SQLITE_T
135e0 45 53 54 0a 20 20 69 6e 74 20 68 20 3d 20 70 46  EST.  int h = pF
135f0 69 6c 65 2d 3e 68 3b 0a 23 65 6e 64 69 66 0a 0a  ile->h;.#endif..
13600 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 20    assert( pFile 
13610 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22 55  );.  OSTRACE(("U
13620 4e 4c 4f 43 4b 20 20 25 64 20 25 64 20 77 61 73  NLOCK  %d %d was
13630 20 25 64 28 25 64 2c 25 64 29 20 70 69 64 3d 25   %d(%d,%d) pid=%
13640 64 20 28 61 66 70 29 5c 6e 22 2c 20 70 46 69 6c  d (afp)\n", pFil
13650 65 2d 3e 68 2c 20 65 46 69 6c 65 4c 6f 63 6b 2c  e->h, eFileLock,
13660 0a 20 20 20 20 20 20 20 20 20 20 20 70 46 69 6c  .           pFil
13670 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 2c 20 70 46  e->eFileLock, pF
13680 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e 65 46 69  ile->pInode->eFi
13690 6c 65 4c 6f 63 6b 2c 20 70 46 69 6c 65 2d 3e 70  leLock, pFile->p
136a0 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64 2c 0a  Inode->nShared,.
136b0 20 20 20 20 20 20 20 20 20 20 20 67 65 74 70 69             getpi
136c0 64 28 29 29 29 3b 0a 0a 20 20 61 73 73 65 72 74  d()));..  assert
136d0 28 20 65 46 69 6c 65 4c 6f 63 6b 3c 3d 53 48 41  ( eFileLock<=SHA
136e0 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 69 66  RED_LOCK );.  if
136f0 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f  ( pFile->eFileLo
13700 63 6b 3c 3d 65 46 69 6c 65 4c 6f 63 6b 20 29 7b  ck<=eFileLock ){
13710 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
13720 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 75 6e 69  TE_OK;.  }.  uni
13730 78 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 20  xEnterMutex();. 
13740 20 70 49 6e 6f 64 65 20 3d 20 70 46 69 6c 65 2d   pInode = pFile-
13750 3e 70 49 6e 6f 64 65 3b 0a 20 20 61 73 73 65 72  >pInode;.  asser
13760 74 28 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72  t( pInode->nShar
13770 65 64 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70  ed!=0 );.  if( p
13780 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3e  File->eFileLock>
13790 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20  SHARED_LOCK ){. 
137a0 20 20 20 61 73 73 65 72 74 28 20 70 49 6e 6f 64     assert( pInod
137b0 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d 70 46  e->eFileLock==pF
137c0 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 29  ile->eFileLock )
137d0 3b 0a 20 20 20 20 53 69 6d 75 6c 61 74 65 49 4f  ;.    SimulateIO
137e0 45 72 72 6f 72 42 65 6e 69 67 6e 28 31 29 3b 0a  ErrorBenign(1);.
137f0 20 20 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72      SimulateIOEr
13800 72 6f 72 28 20 68 3d 28 2d 31 29 20 29 0a 20 20  ror( h=(-1) ).  
13810 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f    SimulateIOErro
13820 72 42 65 6e 69 67 6e 28 30 29 3b 0a 20 20 20 20  rBenign(0);.    
13830 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a  .#ifndef NDEBUG.
13840 20 20 20 20 2f 2a 20 57 68 65 6e 20 72 65 64 75      /* When redu
13850 63 69 6e 67 20 61 20 6c 6f 63 6b 20 73 75 63 68  cing a lock such
13860 20 74 68 61 74 20 6f 74 68 65 72 20 70 72 6f 63   that other proc
13870 65 73 73 65 73 20 63 61 6e 20 73 74 61 72 74 0a  esses can start.
13880 20 20 20 20 2a 2a 20 72 65 61 64 69 6e 67 20 74      ** reading t
13890 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
138a0 20 61 67 61 69 6e 2c 20 6d 61 6b 65 20 73 75 72   again, make sur
138b0 65 20 74 68 61 74 20 74 68 65 0a 20 20 20 20 2a  e that the.    *
138c0 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f  * transaction co
138d0 75 6e 74 65 72 20 77 61 73 20 75 70 64 61 74 65  unter was update
138e0 64 20 69 66 20 61 6e 79 20 70 61 72 74 20 6f 66  d if any part of
138f0 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 20 20   the database.  
13900 20 20 2a 2a 20 66 69 6c 65 20 63 68 61 6e 67 65    ** file change
13910 64 2e 20 20 49 66 20 74 68 65 20 74 72 61 6e 73  d.  If the trans
13920 61 63 74 69 6f 6e 20 63 6f 75 6e 74 65 72 20 69  action counter i
13930 73 20 6e 6f 74 20 75 70 64 61 74 65 64 2c 0a 20  s not updated,. 
13940 20 20 20 2a 2a 20 6f 74 68 65 72 20 63 6f 6e 6e     ** other conn
13950 65 63 74 69 6f 6e 73 20 74 6f 20 74 68 65 20 73  ections to the s
13960 61 6d 65 20 66 69 6c 65 20 6d 69 67 68 74 20 6e  ame file might n
13970 6f 74 20 72 65 61 6c 69 7a 65 20 74 68 61 74 0a  ot realize that.
13980 20 20 20 20 2a 2a 20 74 68 65 20 66 69 6c 65 20      ** the file 
13990 68 61 73 20 63 68 61 6e 67 65 64 20 61 6e 64 20  has changed and 
139a0 68 65 6e 63 65 20 6d 69 67 68 74 20 6e 6f 74 20  hence might not 
139b0 6b 6e 6f 77 20 74 6f 20 66 6c 75 73 68 20 74 68  know to flush th
139c0 65 69 72 0a 20 20 20 20 2a 2a 20 63 61 63 68 65  eir.    ** cache
139d0 2e 20 20 54 68 65 20 75 73 65 20 6f 66 20 61 20  .  The use of a 
139e0 73 74 61 6c 65 20 63 61 63 68 65 20 63 61 6e 20  stale cache can 
139f0 6c 65 61 64 20 74 6f 20 64 61 74 61 62 61 73 65  lead to database
13a00 20 63 6f 72 72 75 70 74 69 6f 6e 2e 0a 20 20 20   corruption..   
13a10 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20   */.    assert( 
13a20 70 46 69 6c 65 2d 3e 69 6e 4e 6f 72 6d 61 6c 57  pFile->inNormalW
13a30 72 69 74 65 3d 3d 30 0a 20 20 20 20 20 20 20 20  rite==0.        
13a40 20 20 20 7c 7c 20 70 46 69 6c 65 2d 3e 64 62 55     || pFile->dbU
13a50 70 64 61 74 65 3d 3d 30 0a 20 20 20 20 20 20 20  pdate==0.       
13a60 20 20 20 20 7c 7c 20 70 46 69 6c 65 2d 3e 74 72      || pFile->tr
13a70 61 6e 73 43 6e 74 72 43 68 6e 67 3d 3d 31 20 29  ansCntrChng==1 )
13a80 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 69 6e 4e  ;.    pFile->inN
13a90 6f 72 6d 61 6c 57 72 69 74 65 20 3d 20 30 3b 0a  ormalWrite = 0;.
13aa0 23 65 6e 64 69 66 0a 20 20 20 20 0a 20 20 20 20  #endif.    .    
13ab0 69 66 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65  if( pFile->eFile
13ac0 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f  Lock==EXCLUSIVE_
13ad0 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 20 20 72 63  LOCK ){.      rc
13ae0 20 3d 20 61 66 70 53 65 74 4c 6f 63 6b 28 63 6f   = afpSetLock(co
13af0 6e 74 65 78 74 2d 3e 64 62 50 61 74 68 2c 20 70  ntext->dbPath, p
13b00 46 69 6c 65 2c 20 53 48 41 52 45 44 5f 46 49 52  File, SHARED_FIR
13b10 53 54 2c 20 53 48 41 52 45 44 5f 53 49 5a 45 2c  ST, SHARED_SIZE,
13b20 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72   0);.      if( r
13b30 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
13b40 28 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52  (eFileLock==SHAR
13b50 45 44 5f 4c 4f 43 4b 20 7c 7c 20 70 49 6e 6f 64  ED_LOCK || pInod
13b60 65 2d 3e 6e 53 68 61 72 65 64 3e 31 29 20 29 7b  e->nShared>1) ){
13b70 0a 20 20 20 20 20 20 20 20 2f 2a 20 6f 6e 6c 79  .        /* only
13b80 20 72 65 2d 65 73 74 61 62 6c 69 73 68 20 74 68   re-establish th
13b90 65 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 69 66  e shared lock if
13ba0 20 6e 65 63 65 73 73 61 72 79 20 2a 2f 0a 20 20   necessary */.  
13bb0 20 20 20 20 20 20 69 6e 74 20 73 68 61 72 65 64        int shared
13bc0 4c 6f 63 6b 42 79 74 65 20 3d 20 53 48 41 52 45  LockByte = SHARE
13bd0 44 5f 46 49 52 53 54 2b 70 49 6e 6f 64 65 2d 3e  D_FIRST+pInode->
13be0 73 68 61 72 65 64 42 79 74 65 3b 0a 20 20 20 20  sharedByte;.    
13bf0 20 20 20 20 72 63 20 3d 20 61 66 70 53 65 74 4c      rc = afpSetL
13c00 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 64 62 50  ock(context->dbP
13c10 61 74 68 2c 20 70 46 69 6c 65 2c 20 73 68 61 72  ath, pFile, shar
13c20 65 64 4c 6f 63 6b 42 79 74 65 2c 20 31 2c 20 31  edLockByte, 1, 1
13c30 29 3b 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 20  );.      } else 
13c40 7b 0a 20 20 20 20 20 20 20 20 73 6b 69 70 53 68  {.        skipSh
13c50 61 72 65 64 20 3d 20 31 3b 0a 20 20 20 20 20 20  ared = 1;.      
13c60 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  }.    }.    if( 
13c70 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
13c80 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63   pFile->eFileLoc
13c90 6b 3e 3d 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 20  k>=PENDING_LOCK 
13ca0 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 61 66  ){.      rc = af
13cb0 70 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74  pSetLock(context
13cc0 2d 3e 64 62 50 61 74 68 2c 20 70 46 69 6c 65 2c  ->dbPath, pFile,
13cd0 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 2c 20 31   PENDING_BYTE, 1
13ce0 2c 20 30 29 3b 0a 20 20 20 20 7d 20 0a 20 20 20  , 0);.    } .   
13cf0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
13d00 4f 4b 20 26 26 20 70 46 69 6c 65 2d 3e 65 46 69  OK && pFile->eFi
13d10 6c 65 4c 6f 63 6b 3e 3d 52 45 53 45 52 56 45 44  leLock>=RESERVED
13d20 5f 4c 4f 43 4b 20 26 26 20 63 6f 6e 74 65 78 74  _LOCK && context
13d30 2d 3e 72 65 73 65 72 76 65 64 20 29 7b 0a 20 20  ->reserved ){.  
13d40 20 20 20 20 72 63 20 3d 20 61 66 70 53 65 74 4c      rc = afpSetL
13d50 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 64 62 50  ock(context->dbP
13d60 61 74 68 2c 20 70 46 69 6c 65 2c 20 52 45 53 45  ath, pFile, RESE
13d70 52 56 45 44 5f 42 59 54 45 2c 20 31 2c 20 30 29  RVED_BYTE, 1, 0)
13d80 3b 0a 20 20 20 20 20 20 69 66 28 20 21 72 63 20  ;.      if( !rc 
13d90 29 7b 20 0a 20 20 20 20 20 20 20 20 63 6f 6e 74  ){ .        cont
13da0 65 78 74 2d 3e 72 65 73 65 72 76 65 64 20 3d 20  ext->reserved = 
13db0 30 3b 20 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  0; .      }.    
13dc0 7d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  }.    if( rc==SQ
13dd0 4c 49 54 45 5f 4f 4b 20 26 26 20 28 65 46 69 6c  LITE_OK && (eFil
13de0 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f  eLock==SHARED_LO
13df0 43 4b 20 7c 7c 20 70 49 6e 6f 64 65 2d 3e 6e 53  CK || pInode->nS
13e00 68 61 72 65 64 3e 31 29 29 7b 0a 20 20 20 20 20  hared>1)){.     
13e10 20 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f   pInode->eFileLo
13e20 63 6b 20 3d 20 53 48 41 52 45 44 5f 4c 4f 43 4b  ck = SHARED_LOCK
13e30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66  ;.    }.  }.  if
13e40 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
13e50 26 26 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 4e 4f  && eFileLock==NO
13e60 5f 4c 4f 43 4b 20 29 7b 0a 0a 20 20 20 20 2f 2a  _LOCK ){..    /*
13e70 20 44 65 63 72 65 6d 65 6e 74 20 74 68 65 20 73   Decrement the s
13e80 68 61 72 65 64 20 6c 6f 63 6b 20 63 6f 75 6e 74  hared lock count
13e90 65 72 2e 20 20 52 65 6c 65 61 73 65 20 74 68 65  er.  Release the
13ea0 20 6c 6f 63 6b 20 75 73 69 6e 67 20 61 6e 0a 20   lock using an. 
13eb0 20 20 20 2a 2a 20 4f 53 20 63 61 6c 6c 20 6f 6e     ** OS call on
13ec0 6c 79 20 77 68 65 6e 20 61 6c 6c 20 74 68 72 65  ly when all thre
13ed0 61 64 73 20 69 6e 20 74 68 69 73 20 73 61 6d 65  ads in this same
13ee0 20 70 72 6f 63 65 73 73 20 68 61 76 65 20 72 65   process have re
13ef0 6c 65 61 73 65 64 0a 20 20 20 20 2a 2a 20 74 68  leased.    ** th
13f00 65 20 6c 6f 63 6b 2e 0a 20 20 20 20 2a 2f 0a 20  e lock..    */. 
13f10 20 20 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67     unsigned long
13f20 20 6c 6f 6e 67 20 73 68 61 72 65 64 4c 6f 63 6b   long sharedLock
13f30 42 79 74 65 20 3d 20 53 48 41 52 45 44 5f 46 49  Byte = SHARED_FI
13f40 52 53 54 2b 70 49 6e 6f 64 65 2d 3e 73 68 61 72  RST+pInode->shar
13f50 65 64 42 79 74 65 3b 0a 20 20 20 20 70 49 6e 6f  edByte;.    pIno
13f60 64 65 2d 3e 6e 53 68 61 72 65 64 2d 2d 3b 0a 20  de->nShared--;. 
13f70 20 20 20 69 66 28 20 70 49 6e 6f 64 65 2d 3e 6e     if( pInode->n
13f80 53 68 61 72 65 64 3d 3d 30 20 29 7b 0a 20 20 20  Shared==0 ){.   
13f90 20 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72     SimulateIOErr
13fa0 6f 72 42 65 6e 69 67 6e 28 31 29 3b 0a 20 20 20  orBenign(1);.   
13fb0 20 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72     SimulateIOErr
13fc0 6f 72 28 20 68 3d 28 2d 31 29 20 29 0a 20 20 20  or( h=(-1) ).   
13fd0 20 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72     SimulateIOErr
13fe0 6f 72 42 65 6e 69 67 6e 28 30 29 3b 0a 20 20 20  orBenign(0);.   
13ff0 20 20 20 69 66 28 20 21 73 6b 69 70 53 68 61 72     if( !skipShar
14000 65 64 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  ed ){.        rc
14010 20 3d 20 61 66 70 53 65 74 4c 6f 63 6b 28 63 6f   = afpSetLock(co
14020 6e 74 65 78 74 2d 3e 64 62 50 61 74 68 2c 20 70  ntext->dbPath, p
14030 46 69 6c 65 2c 20 73 68 61 72 65 64 4c 6f 63 6b  File, sharedLock
14040 42 79 74 65 2c 20 31 2c 20 30 29 3b 0a 20 20 20  Byte, 1, 0);.   
14050 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 21     }.      if( !
14060 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 70 49  rc ){.        pI
14070 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20  node->eFileLock 
14080 3d 20 4e 4f 5f 4c 4f 43 4b 3b 0a 20 20 20 20 20  = NO_LOCK;.     
14090 20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c     pFile->eFileL
140a0 6f 63 6b 20 3d 20 4e 4f 5f 4c 4f 43 4b 3b 0a 20  ock = NO_LOCK;. 
140b0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
140c0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
140d0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 49 6e 6f  OK ){.      pIno
140e0 64 65 2d 3e 6e 4c 6f 63 6b 2d 2d 3b 0a 20 20 20  de->nLock--;.   
140f0 20 20 20 61 73 73 65 72 74 28 20 70 49 6e 6f 64     assert( pInod
14100 65 2d 3e 6e 4c 6f 63 6b 3e 3d 30 20 29 3b 0a 20  e->nLock>=0 );. 
14110 20 20 20 20 20 69 66 28 20 70 49 6e 6f 64 65 2d       if( pInode-
14120 3e 6e 4c 6f 63 6b 3d 3d 30 20 29 7b 0a 20 20 20  >nLock==0 ){.   
14130 20 20 20 20 20 72 63 20 3d 20 63 6c 6f 73 65 50       rc = closeP
14140 65 6e 64 69 6e 67 46 64 73 28 70 46 69 6c 65 29  endingFds(pFile)
14150 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
14160 20 20 7d 0a 20 20 0a 20 20 75 6e 69 78 4c 65 61    }.  .  unixLea
14170 76 65 4d 75 74 65 78 28 29 3b 0a 20 20 69 66 28  veMutex();.  if(
14180 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
14190 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63   pFile->eFileLoc
141a0 6b 20 3d 20 65 46 69 6c 65 4c 6f 63 6b 3b 0a 20  k = eFileLock;. 
141b0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
141c0 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 20 66 69 6c  *.** Close a fil
141d0 65 20 26 20 63 6c 65 61 6e 75 70 20 41 46 50 20  e & cleanup AFP 
141e0 73 70 65 63 69 66 69 63 20 6c 6f 63 6b 69 6e 67  specific locking
141f0 20 63 6f 6e 74 65 78 74 20 0a 2a 2f 0a 73 74 61   context .*/.sta
14200 74 69 63 20 69 6e 74 20 61 66 70 43 6c 6f 73 65  tic int afpClose
14210 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69  (sqlite3_file *i
14220 64 29 20 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  d) {.  int rc = 
14230 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28  SQLITE_OK;.  if(
14240 20 69 64 20 29 7b 0a 20 20 20 20 75 6e 69 78 46   id ){.    unixF
14250 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e  ile *pFile = (un
14260 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 20 20  ixFile*)id;.    
14270 61 66 70 55 6e 6c 6f 63 6b 28 69 64 2c 20 4e 4f  afpUnlock(id, NO
14280 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 75 6e 69 78  _LOCK);.    unix
14290 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 20 20  EnterMutex();.  
142a0 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 70 49 6e    if( pFile->pIn
142b0 6f 64 65 20 26 26 20 70 46 69 6c 65 2d 3e 70 49  ode && pFile->pI
142c0 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 20 29 7b 0a 20  node->nLock ){. 
142d0 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65       /* If there
142e0 20 61 72 65 20 6f 75 74 73 74 61 6e 64 69 6e 67   are outstanding
142f0 20 6c 6f 63 6b 73 2c 20 64 6f 20 6e 6f 74 20 61   locks, do not a
14300 63 74 75 61 6c 6c 79 20 63 6c 6f 73 65 20 74 68  ctually close th
14310 65 20 66 69 6c 65 20 6a 75 73 74 0a 20 20 20 20  e file just.    
14320 20 20 2a 2a 20 79 65 74 20 62 65 63 61 75 73 65    ** yet because
14330 20 74 68 61 74 20 77 6f 75 6c 64 20 63 6c 65 61   that would clea
14340 72 20 74 68 6f 73 65 20 6c 6f 63 6b 73 2e 20 20  r those locks.  
14350 49 6e 73 74 65 61 64 2c 20 61 64 64 20 74 68 65  Instead, add the
14360 20 66 69 6c 65 0a 20 20 20 20 20 20 2a 2a 20 64   file.      ** d
14370 65 73 63 72 69 70 74 6f 72 20 74 6f 20 70 49 6e  escriptor to pIn
14380 6f 64 65 2d 3e 61 50 65 6e 64 69 6e 67 2e 20 20  ode->aPending.  
14390 49 74 20 77 69 6c 6c 20 62 65 20 61 75 74 6f 6d  It will be autom
143a0 61 74 69 63 61 6c 6c 79 20 63 6c 6f 73 65 64 20  atically closed 
143b0 77 68 65 6e 0a 20 20 20 20 20 20 2a 2a 20 74 68  when.      ** th
143c0 65 20 6c 61 73 74 20 6c 6f 63 6b 20 69 73 20 63  e last lock is c
143d0 6c 65 61 72 65 64 2e 0a 20 20 20 20 20 20 2a 2f  leared..      */
143e0 0a 20 20 20 20 20 20 73 65 74 50 65 6e 64 69 6e  .      setPendin
143f0 67 46 64 28 70 46 69 6c 65 29 3b 0a 20 20 20 20  gFd(pFile);.    
14400 7d 0a 20 20 20 20 72 65 6c 65 61 73 65 4c 6f 63  }.    releaseLoc
14410 6b 49 6e 66 6f 28 70 46 69 6c 65 2d 3e 70 49 6e  kInfo(pFile->pIn
14420 6f 64 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ode);.    sqlite
14430 33 5f 66 72 65 65 28 70 46 69 6c 65 2d 3e 6c 6f  3_free(pFile->lo
14440 63 6b 69 6e 67 43 6f 6e 74 65 78 74 29 3b 0a 20  ckingContext);. 
14450 20 20 20 72 63 20 3d 20 63 6c 6f 73 65 55 6e 69     rc = closeUni
14460 78 46 69 6c 65 28 69 64 29 3b 0a 20 20 20 20 75  xFile(id);.    u
14470 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b  nixLeaveMutex();
14480 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
14490 3b 0a 7d 0a 0a 23 65 6e 64 69 66 20 2f 2a 20 64  ;.}..#endif /* d
144a0 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f  efined(__APPLE__
144b0 29 20 26 26 20 53 51 4c 49 54 45 5f 45 4e 41 42  ) && SQLITE_ENAB
144c0 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45  LE_LOCKING_STYLE
144d0 20 2a 2f 0a 2f 2a 0a 2a 2a 20 54 68 65 20 63 6f   */./*.** The co
144e0 64 65 20 61 62 6f 76 65 20 69 73 20 74 68 65 20  de above is the 
144f0 41 46 50 20 6c 6f 63 6b 20 69 6d 70 6c 65 6d 65  AFP lock impleme
14500 6e 74 61 74 69 6f 6e 2e 20 20 54 68 65 20 63 6f  ntation.  The co
14510 64 65 20 69 73 20 73 70 65 63 69 66 69 63 0a 2a  de is specific.*
14520 2a 20 74 6f 20 4d 61 63 4f 53 58 20 61 6e 64 20  * to MacOSX and 
14530 64 6f 65 73 20 6e 6f 74 20 77 6f 72 6b 20 6f 6e  does not work on
14540 20 6f 74 68 65 72 20 75 6e 69 78 20 70 6c 61 74   other unix plat
14550 66 6f 72 6d 73 2e 20 20 4e 6f 20 61 6c 74 65 72  forms.  No alter
14560 6e 61 74 69 76 65 0a 2a 2a 20 69 73 20 61 76 61  native.** is ava
14570 69 6c 61 62 6c 65 2e 20 20 49 66 20 79 6f 75 20  ilable.  If you 
14580 64 6f 6e 27 74 20 63 6f 6d 70 69 6c 65 20 66 6f  don't compile fo
14590 72 20 61 20 6d 61 63 2c 20 74 68 65 6e 20 74 68  r a mac, then th
145a0 65 20 22 75 6e 69 78 2d 61 66 70 22 0a 2a 2a 20  e "unix-afp".** 
145b0 56 46 53 20 69 73 20 6e 6f 74 20 61 76 61 69 6c  VFS is not avail
145c0 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a  able..**.*******
145d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45  ************** E
145e0 6e 64 20 6f 66 20 74 68 65 20 41 46 50 20 6c 6f  nd of the AFP lo
145f0 63 6b 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  ck implementatio
14600 6e 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  n **************
14610 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a  ********.*******
14620 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14630 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14640 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14650 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14660 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 2a 2a 2a 2a  *******/../*****
14670 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14680 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14690 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
146a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
146b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a  *********.******
146c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
146d0 2a 2a 2a 2a 2a 20 42 65 67 69 6e 20 4e 46 53 20  ***** Begin NFS 
146e0 4c 6f 63 6b 69 6e 67 20 2a 2a 2a 2a 2a 2a 2a 2a  Locking ********
146f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14700 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 23 69 66 20 64  ********/..#if d
14710 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f  efined(__APPLE__
14720 29 20 26 26 20 53 51 4c 49 54 45 5f 45 4e 41 42  ) && SQLITE_ENAB
14730 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45  LE_LOCKING_STYLE
14740 0a 2f 2a 0a 20 2a 2a 20 4c 6f 77 65 72 20 74 68  ./*. ** Lower th
14750 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20  e locking level 
14760 6f 6e 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  on file descript
14770 6f 72 20 70 46 69 6c 65 20 74 6f 20 65 46 69 6c  or pFile to eFil
14780 65 4c 6f 63 6b 2e 20 20 65 46 69 6c 65 4c 6f 63  eLock.  eFileLoc
14790 6b 0a 20 2a 2a 20 6d 75 73 74 20 62 65 20 65 69  k. ** must be ei
147a0 74 68 65 72 20 4e 4f 5f 4c 4f 43 4b 20 6f 72 20  ther NO_LOCK or 
147b0 53 48 41 52 45 44 5f 4c 4f 43 4b 2e 0a 20 2a 2a  SHARED_LOCK.. **
147c0 0a 20 2a 2a 20 49 66 20 74 68 65 20 6c 6f 63 6b  . ** If the lock
147d0 69 6e 67 20 6c 65 76 65 6c 20 6f 66 20 74 68 65  ing level of the
147e0 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
147f0 20 69 73 20 61 6c 72 65 61 64 79 20 61 74 20 6f   is already at o
14800 72 20 62 65 6c 6f 77 0a 20 2a 2a 20 74 68 65 20  r below. ** the 
14810 72 65 71 75 65 73 74 65 64 20 6c 6f 63 6b 69 6e  requested lockin
14820 67 20 6c 65 76 65 6c 2c 20 74 68 69 73 20 72 6f  g level, this ro
14830 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70  utine is a no-op
14840 2e 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  .. */.static int
14850 20 6e 66 73 55 6e 6c 6f 63 6b 28 73 71 6c 69 74   nfsUnlock(sqlit
14860 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74  e3_file *id, int
14870 20 65 46 69 6c 65 4c 6f 63 6b 29 7b 0a 20 20 72   eFileLock){.  r
14880 65 74 75 72 6e 20 5f 70 6f 73 69 78 55 6e 6c 6f  eturn _posixUnlo
14890 63 6b 28 69 64 2c 20 65 46 69 6c 65 4c 6f 63 6b  ck(id, eFileLock
148a0 2c 20 31 29 3b 0a 7d 0a 0a 23 65 6e 64 69 66 20  , 1);.}..#endif 
148b0 2f 2a 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50  /* defined(__APP
148c0 4c 45 5f 5f 29 20 26 26 20 53 51 4c 49 54 45 5f  LE__) && SQLITE_
148d0 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53  ENABLE_LOCKING_S
148e0 54 59 4c 45 20 2a 2f 0a 2f 2a 0a 2a 2a 20 54 68  TYLE */./*.** Th
148f0 65 20 63 6f 64 65 20 61 62 6f 76 65 20 69 73 20  e code above is 
14900 74 68 65 20 4e 46 53 20 6c 6f 63 6b 20 69 6d 70  the NFS lock imp
14910 6c 65 6d 65 6e 74 61 74 69 6f 6e 2e 20 20 54 68  lementation.  Th
14920 65 20 63 6f 64 65 20 69 73 20 73 70 65 63 69 66  e code is specif
14930 69 63 0a 2a 2a 20 74 6f 20 4d 61 63 4f 53 58 20  ic.** to MacOSX 
14940 61 6e 64 20 64 6f 65 73 20 6e 6f 74 20 77 6f 72  and does not wor
14950 6b 20 6f 6e 20 6f 74 68 65 72 20 75 6e 69 78 20  k on other unix 
14960 70 6c 61 74 66 6f 72 6d 73 2e 20 20 4e 6f 20 61  platforms.  No a
14970 6c 74 65 72 6e 61 74 69 76 65 0a 2a 2a 20 69 73  lternative.** is
14980 20 61 76 61 69 6c 61 62 6c 65 2e 20 20 0a 2a 2a   available.  .**
14990 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .***************
149a0 2a 2a 2a 2a 2a 2a 20 45 6e 64 20 6f 66 20 74 68  ****** End of th
149b0 65 20 4e 46 53 20 6c 6f 63 6b 20 69 6d 70 6c 65  e NFS lock imple
149c0 6d 65 6e 74 61 74 69 6f 6e 20 2a 2a 2a 2a 2a 2a  mentation ******
149d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
149e0 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .***************
149f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14a00 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14a10 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14a20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f  ***************/
14a30 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ../*************
14a40 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14a50 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14a60 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14a70 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14a80 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  *.**************
14a90 2a 2a 20 4e 6f 6e 2d 6c 6f 63 6b 69 6e 67 20 73  ** Non-locking s
14aa0 71 6c 69 74 65 33 5f 66 69 6c 65 20 6d 65 74 68  qlite3_file meth
14ab0 6f 64 73 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ods ************
14ac0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14ad0 2a 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6e 65 78 74  *.**.** The next
14ae0 20 64 69 76 69 73 69 6f 6e 20 63 6f 6e 74 61 69   division contai
14af0 6e 73 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  ns implementatio
14b00 6e 73 20 66 6f 72 20 61 6c 6c 20 6d 65 74 68 6f  ns for all metho
14b10 64 73 20 6f 66 20 74 68 65 20 0a 2a 2a 20 73 71  ds of the .** sq
14b20 6c 69 74 65 33 5f 66 69 6c 65 20 6f 62 6a 65 63  lite3_file objec
14b30 74 20 6f 74 68 65 72 20 74 68 61 6e 20 74 68 65  t other than the
14b40 20 6c 6f 63 6b 69 6e 67 20 6d 65 74 68 6f 64 73   locking methods
14b50 2e 20 20 54 68 65 20 6c 6f 63 6b 69 6e 67 0a 2a  .  The locking.*
14b60 2a 20 6d 65 74 68 6f 64 73 20 77 65 72 65 20 64  * methods were d
14b70 65 66 69 6e 65 64 20 69 6e 20 64 69 76 69 73 69  efined in divisi
14b80 6f 6e 73 20 61 62 6f 76 65 20 28 6f 6e 65 20 6c  ons above (one l
14b90 6f 63 6b 69 6e 67 20 6d 65 74 68 6f 64 20 70 65  ocking method pe
14ba0 72 0a 2a 2a 20 64 69 76 69 73 69 6f 6e 29 2e 20  r.** division). 
14bb0 20 54 68 6f 73 65 20 6d 65 74 68 6f 64 73 20 74   Those methods t
14bc0 68 61 74 20 61 72 65 20 63 6f 6d 6d 6f 6e 20 74  hat are common t
14bd0 6f 20 61 6c 6c 20 6c 6f 63 6b 69 6e 67 20 6d 6f  o all locking mo
14be0 64 65 73 0a 2a 2a 20 61 72 65 20 67 61 74 68 65  des.** are gathe
14bf0 72 20 74 6f 67 65 74 68 65 72 20 69 6e 74 6f 20  r together into 
14c00 74 68 69 73 20 64 69 76 69 73 69 6f 6e 2e 0a 2a  this division..*
14c10 2f 0a 0a 2f 2a 0a 2a 2a 20 53 65 65 6b 20 74 6f  /../*.** Seek to
14c20 20 74 68 65 20 6f 66 66 73 65 74 20 70 61 73 73   the offset pass
14c30 65 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64  ed as the second
14c40 20 61 72 67 75 6d 65 6e 74 2c 20 74 68 65 6e 20   argument, then 
14c50 72 65 61 64 20 63 6e 74 20 0a 2a 2a 20 62 79 74  read cnt .** byt
14c60 65 73 20 69 6e 74 6f 20 70 42 75 66 2e 20 52 65  es into pBuf. Re
14c70 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20  turn the number 
14c80 6f 66 20 62 79 74 65 73 20 61 63 74 75 61 6c 6c  of bytes actuall
14c90 79 20 72 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 4e 42  y read..**.** NB
14ca0 3a 20 20 49 66 20 79 6f 75 20 64 65 66 69 6e 65  :  If you define
14cb0 20 55 53 45 5f 50 52 45 41 44 20 6f 72 20 55 53   USE_PREAD or US
14cc0 45 5f 50 52 45 41 44 36 34 2c 20 74 68 65 6e 20  E_PREAD64, then 
14cd0 69 74 20 6d 69 67 68 74 20 61 6c 73 6f 0a 2a 2a  it might also.**
14ce0 20 62 65 20 6e 65 63 65 73 73 61 72 79 20 74 6f   be necessary to
14cf0 20 64 65 66 69 6e 65 20 5f 58 4f 50 45 4e 5f 53   define _XOPEN_S
14d00 4f 55 52 43 45 20 74 6f 20 62 65 20 35 30 30 2e  OURCE to be 500.
14d10 20 20 54 68 69 73 20 76 61 72 69 65 73 20 66 72    This varies fr
14d20 6f 6d 0a 2a 2a 20 6f 6e 65 20 73 79 73 74 65 6d  om.** one system
14d30 20 74 6f 20 61 6e 6f 74 68 65 72 2e 20 20 53 69   to another.  Si
14d40 6e 63 65 20 53 51 4c 69 74 65 20 64 6f 65 73 20  nce SQLite does 
14d50 6e 6f 74 20 64 65 66 69 6e 65 20 55 53 45 5f 50  not define USE_P
14d60 52 45 41 44 0a 2a 2a 20 61 6e 79 20 61 6e 79 20  READ.** any any 
14d70 66 6f 72 6d 20 62 79 20 64 65 66 61 75 6c 74 2c  form by default,
14d80 20 77 65 20 77 69 6c 6c 20 6e 6f 74 20 61 74 74   we will not att
14d90 65 6d 70 74 20 74 6f 20 64 65 66 69 6e 65 20 5f  empt to define _
14da0 58 4f 50 45 4e 5f 53 4f 55 52 43 45 2e 0a 2a 2a  XOPEN_SOURCE..**
14db0 20 53 65 65 20 74 69 63 6b 65 74 73 20 23 32 37   See tickets #27
14dc0 34 31 20 61 6e 64 20 23 32 36 38 31 2e 0a 2a 2a  41 and #2681..**
14dd0 0a 2a 2a 20 54 6f 20 61 76 6f 69 64 20 73 74 6f  .** To avoid sto
14de0 6d 70 69 6e 67 20 74 68 65 20 65 72 72 6e 6f 20  mping the errno 
14df0 76 61 6c 75 65 20 6f 6e 20 61 20 66 61 69 6c 65  value on a faile
14e00 64 20 72 65 61 64 20 74 68 65 20 6c 61 73 74 45  d read the lastE
14e10 72 72 6e 6f 20 76 61 6c 75 65 0a 2a 2a 20 69 73  rrno value.** is
14e20 20 73 65 74 20 62 65 66 6f 72 65 20 72 65 74 75   set before retu
14e30 72 6e 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63  rning..*/.static
14e40 20 69 6e 74 20 73 65 65 6b 41 6e 64 52 65 61 64   int seekAndRead
14e50 28 75 6e 69 78 46 69 6c 65 20 2a 69 64 2c 20 73  (unixFile *id, s
14e60 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 6f 66 66  qlite3_int64 off
14e70 73 65 74 2c 20 76 6f 69 64 20 2a 70 42 75 66 2c  set, void *pBuf,
14e80 20 69 6e 74 20 63 6e 74 29 7b 0a 20 20 69 6e 74   int cnt){.  int
14e90 20 67 6f 74 3b 0a 23 69 66 20 28 21 64 65 66 69   got;.#if (!defi
14ea0 6e 65 64 28 55 53 45 5f 50 52 45 41 44 29 20 26  ned(USE_PREAD) &
14eb0 26 20 21 64 65 66 69 6e 65 64 28 55 53 45 5f 50  & !defined(USE_P
14ec0 52 45 41 44 36 34 29 29 0a 20 20 69 36 34 20 6e  READ64)).  i64 n
14ed0 65 77 4f 66 66 73 65 74 3b 0a 23 65 6e 64 69 66  ewOffset;.#endif
14ee0 0a 20 20 54 49 4d 45 52 5f 53 54 41 52 54 3b 0a  .  TIMER_START;.
14ef0 23 69 66 20 64 65 66 69 6e 65 64 28 55 53 45 5f  #if defined(USE_
14f00 50 52 45 41 44 29 0a 20 20 67 6f 74 20 3d 20 70  PREAD).  got = p
14f10 72 65 61 64 28 69 64 2d 3e 68 2c 20 70 42 75 66  read(id->h, pBuf
14f20 2c 20 63 6e 74 2c 20 6f 66 66 73 65 74 29 3b 0a  , cnt, offset);.
14f30 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f    SimulateIOErro
14f40 72 28 20 67 6f 74 20 3d 20 2d 31 20 29 3b 0a 23  r( got = -1 );.#
14f50 65 6c 69 66 20 64 65 66 69 6e 65 64 28 55 53 45  elif defined(USE
14f60 5f 50 52 45 41 44 36 34 29 0a 20 20 67 6f 74 20  _PREAD64).  got 
14f70 3d 20 70 72 65 61 64 36 34 28 69 64 2d 3e 68 2c  = pread64(id->h,
14f80 20 70 42 75 66 2c 20 63 6e 74 2c 20 6f 66 66 73   pBuf, cnt, offs
14f90 65 74 29 3b 0a 20 20 53 69 6d 75 6c 61 74 65 49  et);.  SimulateI
14fa0 4f 45 72 72 6f 72 28 20 67 6f 74 20 3d 20 2d 31  OError( got = -1
14fb0 20 29 3b 0a 23 65 6c 73 65 0a 20 20 6e 65 77 4f   );.#else.  newO
14fc0 66 66 73 65 74 20 3d 20 6c 73 65 65 6b 28 69 64  ffset = lseek(id
14fd0 2d 3e 68 2c 20 6f 66 66 73 65 74 2c 20 53 45 45  ->h, offset, SEE
14fe0 4b 5f 53 45 54 29 3b 0a 20 20 53 69 6d 75 6c 61  K_SET);.  Simula
14ff0 74 65 49 4f 45 72 72 6f 72 28 20 6e 65 77 4f 66  teIOError( newOf
15000 66 73 65 74 2d 2d 20 29 3b 0a 20 20 69 66 28 20  fset-- );.  if( 
15010 6e 65 77 4f 66 66 73 65 74 21 3d 6f 66 66 73 65  newOffset!=offse
15020 74 20 29 7b 0a 20 20 20 20 69 66 28 20 6e 65 77  t ){.    if( new
15030 4f 66 66 73 65 74 20 3d 3d 20 2d 31 20 29 7b 0a  Offset == -1 ){.
15040 20 20 20 20 20 20 28 28 75 6e 69 78 46 69 6c 65        ((unixFile
15050 2a 29 69 64 29 2d 3e 6c 61 73 74 45 72 72 6e 6f  *)id)->lastErrno
15060 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 7d 65   = errno;.    }e
15070 6c 73 65 7b 0a 20 20 20 20 20 20 28 28 75 6e 69  lse{.      ((uni
15080 78 46 69 6c 65 2a 29 69 64 29 2d 3e 6c 61 73 74  xFile*)id)->last
15090 45 72 72 6e 6f 20 3d 20 30 3b 09 09 09 0a 20 20  Errno = 0;....  
150a0 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 2d    }.    return -
150b0 31 3b 0a 20 20 7d 0a 20 20 67 6f 74 20 3d 20 72  1;.  }.  got = r
150c0 65 61 64 28 69 64 2d 3e 68 2c 20 70 42 75 66 2c  ead(id->h, pBuf,
150d0 20 63 6e 74 29 3b 0a 23 65 6e 64 69 66 0a 20 20   cnt);.#endif.  
150e0 54 49 4d 45 52 5f 45 4e 44 3b 0a 20 20 69 66 28  TIMER_END;.  if(
150f0 20 67 6f 74 3c 30 20 29 7b 0a 20 20 20 20 28 28   got<0 ){.    ((
15100 75 6e 69 78 46 69 6c 65 2a 29 69 64 29 2d 3e 6c  unixFile*)id)->l
15110 61 73 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f  astErrno = errno
15120 3b 0a 20 20 7d 0a 20 20 4f 53 54 52 41 43 45 28  ;.  }.  OSTRACE(
15130 28 22 52 45 41 44 20 20 20 20 25 2d 33 64 20 25  ("READ    %-3d %
15140 35 64 20 25 37 6c 6c 64 20 25 6c 6c 75 5c 6e 22  5d %7lld %llu\n"
15150 2c 20 69 64 2d 3e 68 2c 20 67 6f 74 2c 20 6f 66  , id->h, got, of
15160 66 73 65 74 2c 20 54 49 4d 45 52 5f 45 4c 41 50  fset, TIMER_ELAP
15170 53 45 44 29 29 3b 0a 20 20 72 65 74 75 72 6e 20  SED));.  return 
15180 67 6f 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  got;.}../*.** Re
15190 61 64 20 64 61 74 61 20 66 72 6f 6d 20 61 20 66  ad data from a f
151a0 69 6c 65 20 69 6e 74 6f 20 61 20 62 75 66 66 65  ile into a buffe
151b0 72 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54  r.  Return SQLIT
151c0 45 5f 4f 4b 20 69 66 20 61 6c 6c 0a 2a 2a 20 62  E_OK if all.** b
151d0 79 74 65 73 20 77 65 72 65 20 72 65 61 64 20 73  ytes were read s
151e0 75 63 63 65 73 73 66 75 6c 6c 79 20 61 6e 64 20  uccessfully and 
151f0 53 51 4c 49 54 45 5f 49 4f 45 52 52 20 69 66 20  SQLITE_IOERR if 
15200 61 6e 79 74 68 69 6e 67 20 67 6f 65 73 0a 2a 2a  anything goes.**
15210 20 77 72 6f 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69   wrong..*/.stati
15220 63 20 69 6e 74 20 75 6e 69 78 52 65 61 64 28 0a  c int unixRead(.
15230 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a    sqlite3_file *
15240 69 64 2c 20 0a 20 20 76 6f 69 64 20 2a 70 42 75  id, .  void *pBu
15250 66 2c 20 0a 20 20 69 6e 74 20 61 6d 74 2c 0a 20  f, .  int amt,. 
15260 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 6f   sqlite3_int64 o
15270 66 66 73 65 74 0a 29 7b 0a 20 20 75 6e 69 78 46  ffset.){.  unixF
15280 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e  ile *pFile = (un
15290 69 78 46 69 6c 65 20 2a 29 69 64 3b 0a 20 20 69  ixFile *)id;.  i
152a0 6e 74 20 67 6f 74 3b 0a 20 20 61 73 73 65 72 74  nt got;.  assert
152b0 28 20 69 64 20 29 3b 0a 0a 20 20 2f 2a 20 49 66  ( id );..  /* If
152c0 20 74 68 69 73 20 69 73 20 61 20 64 61 74 61 62   this is a datab
152d0 61 73 65 20 66 69 6c 65 20 28 6e 6f 74 20 61 20  ase file (not a 
152e0 6a 6f 75 72 6e 61 6c 2c 20 6d 61 73 74 65 72 2d  journal, master-
152f0 6a 6f 75 72 6e 61 6c 20 6f 72 20 74 65 6d 70 0a  journal or temp.
15300 20 20 2a 2a 20 66 69 6c 65 29 2c 20 74 68 65 20    ** file), the 
15310 62 79 74 65 73 20 69 6e 20 74 68 65 20 6c 6f 63  bytes in the loc
15320 6b 69 6e 67 20 72 61 6e 67 65 20 73 68 6f 75 6c  king range shoul
15330 64 20 6e 65 76 65 72 20 62 65 20 72 65 61 64 20  d never be read 
15340 6f 72 20 77 72 69 74 74 65 6e 2e 20 2a 2f 0a 23  or written. */.#
15350 69 66 20 30 0a 20 20 61 73 73 65 72 74 28 20 70  if 0.  assert( p
15360 46 69 6c 65 2d 3e 70 55 6e 75 73 65 64 3d 3d 30  File->pUnused==0
15370 0a 20 20 20 20 20 20 20 7c 7c 20 6f 66 66 73 65  .       || offse
15380 74 3e 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 2b  t>=PENDING_BYTE+
15390 35 31 32 0a 20 20 20 20 20 20 20 7c 7c 20 6f 66  512.       || of
153a0 66 73 65 74 2b 61 6d 74 3c 3d 50 45 4e 44 49 4e  fset+amt<=PENDIN
153b0 47 5f 42 59 54 45 20 0a 20 20 29 3b 0a 23 65 6e  G_BYTE .  );.#en
153c0 64 69 66 0a 0a 20 20 67 6f 74 20 3d 20 73 65 65  dif..  got = see
153d0 6b 41 6e 64 52 65 61 64 28 70 46 69 6c 65 2c 20  kAndRead(pFile, 
153e0 6f 66 66 73 65 74 2c 20 70 42 75 66 2c 20 61 6d  offset, pBuf, am
153f0 74 29 3b 0a 20 20 69 66 28 20 67 6f 74 3d 3d 61  t);.  if( got==a
15400 6d 74 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  mt ){.    return
15410 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65   SQLITE_OK;.  }e
15420 6c 73 65 20 69 66 28 20 67 6f 74 3c 30 20 29 7b  lse if( got<0 ){
15430 0a 20 20 20 20 2f 2a 20 6c 61 73 74 45 72 72 6e  .    /* lastErrn
15440 6f 20 73 65 74 20 62 79 20 73 65 65 6b 41 6e 64  o set by seekAnd
15450 52 65 61 64 20 2a 2f 0a 20 20 20 20 72 65 74 75  Read */.    retu
15460 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  rn SQLITE_IOERR_
15470 52 45 41 44 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  READ;.  }else{. 
15480 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72     pFile->lastEr
15490 72 6e 6f 20 3d 20 30 3b 20 2f 2a 20 6e 6f 74 20  rno = 0; /* not 
154a0 61 20 73 79 73 74 65 6d 20 65 72 72 6f 72 20 2a  a system error *
154b0 2f 0a 20 20 20 20 2f 2a 20 55 6e 72 65 61 64 20  /.    /* Unread 
154c0 70 61 72 74 73 20 6f 66 20 74 68 65 20 62 75 66  parts of the buf
154d0 66 65 72 20 6d 75 73 74 20 62 65 20 7a 65 72 6f  fer must be zero
154e0 2d 66 69 6c 6c 65 64 20 2a 2f 0a 20 20 20 20 6d  -filled */.    m
154f0 65 6d 73 65 74 28 26 28 28 63 68 61 72 2a 29 70  emset(&((char*)p
15500 42 75 66 29 5b 67 6f 74 5d 2c 20 30 2c 20 61 6d  Buf)[got], 0, am
15510 74 2d 67 6f 74 29 3b 0a 20 20 20 20 72 65 74 75  t-got);.    retu
15520 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  rn SQLITE_IOERR_
15530 53 48 4f 52 54 5f 52 45 41 44 3b 0a 20 20 7d 0a  SHORT_READ;.  }.
15540 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 65 6b 20 74 6f  }../*.** Seek to
15550 20 74 68 65 20 6f 66 66 73 65 74 20 69 6e 20 69   the offset in i
15560 64 2d 3e 6f 66 66 73 65 74 20 74 68 65 6e 20 72  d->offset then r
15570 65 61 64 20 63 6e 74 20 62 79 74 65 73 20 69 6e  ead cnt bytes in
15580 74 6f 20 70 42 75 66 2e 0a 2a 2a 20 52 65 74 75  to pBuf..** Retu
15590 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  rn the number of
155a0 20 62 79 74 65 73 20 61 63 74 75 61 6c 6c 79 20   bytes actually 
155b0 72 65 61 64 2e 20 20 55 70 64 61 74 65 20 74 68  read.  Update th
155c0 65 20 6f 66 66 73 65 74 2e 0a 2a 2a 0a 2a 2a 20  e offset..**.** 
155d0 54 6f 20 61 76 6f 69 64 20 73 74 6f 6d 70 69 6e  To avoid stompin
155e0 67 20 74 68 65 20 65 72 72 6e 6f 20 76 61 6c 75  g the errno valu
155f0 65 20 6f 6e 20 61 20 66 61 69 6c 65 64 20 77 72  e on a failed wr
15600 69 74 65 20 74 68 65 20 6c 61 73 74 45 72 72 6e  ite the lastErrn
15610 6f 20 76 61 6c 75 65 0a 2a 2a 20 69 73 20 73 65  o value.** is se
15620 74 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69  t before returni
15630 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ng..*/.static in
15640 74 20 73 65 65 6b 41 6e 64 57 72 69 74 65 28 75  t seekAndWrite(u
15650 6e 69 78 46 69 6c 65 20 2a 69 64 2c 20 69 36 34  nixFile *id, i64
15660 20 6f 66 66 73 65 74 2c 20 63 6f 6e 73 74 20 76   offset, const v
15670 6f 69 64 20 2a 70 42 75 66 2c 20 69 6e 74 20 63  oid *pBuf, int c
15680 6e 74 29 7b 0a 20 20 69 6e 74 20 67 6f 74 3b 0a  nt){.  int got;.
15690 23 69 66 20 28 21 64 65 66 69 6e 65 64 28 55 53  #if (!defined(US
156a0 45 5f 50 52 45 41 44 29 20 26 26 20 21 64 65 66  E_PREAD) && !def
156b0 69 6e 65 64 28 55 53 45 5f 50 52 45 41 44 36 34  ined(USE_PREAD64
156c0 29 29 0a 20 20 69 36 34 20 6e 65 77 4f 66 66 73  )).  i64 newOffs
156d0 65 74 3b 0a 23 65 6e 64 69 66 0a 20 20 54 49 4d  et;.#endif.  TIM
156e0 45 52 5f 53 54 41 52 54 3b 0a 23 69 66 20 64 65  ER_START;.#if de
156f0 66 69 6e 65 64 28 55 53 45 5f 50 52 45 41 44 29  fined(USE_PREAD)
15700 0a 20 20 67 6f 74 20 3d 20 70 77 72 69 74 65 28  .  got = pwrite(
15710 69 64 2d 3e 68 2c 20 70 42 75 66 2c 20 63 6e 74  id->h, pBuf, cnt
15720 2c 20 6f 66 66 73 65 74 29 3b 0a 23 65 6c 69 66  , offset);.#elif
15730 20 64 65 66 69 6e 65 64 28 55 53 45 5f 50 52 45   defined(USE_PRE
15740 41 44 36 34 29 0a 20 20 67 6f 74 20 3d 20 70 77  AD64).  got = pw
15750 72 69 74 65 36 34 28 69 64 2d 3e 68 2c 20 70 42  rite64(id->h, pB
15760 75 66 2c 20 63 6e 74 2c 20 6f 66 66 73 65 74 29  uf, cnt, offset)
15770 3b 0a 23 65 6c 73 65 0a 20 20 6e 65 77 4f 66 66  ;.#else.  newOff
15780 73 65 74 20 3d 20 6c 73 65 65 6b 28 69 64 2d 3e  set = lseek(id->
15790 68 2c 20 6f 66 66 73 65 74 2c 20 53 45 45 4b 5f  h, offset, SEEK_
157a0 53 45 54 29 3b 0a 20 20 69 66 28 20 6e 65 77 4f  SET);.  if( newO
157b0 66 66 73 65 74 21 3d 6f 66 66 73 65 74 20 29 7b  ffset!=offset ){
157c0 0a 20 20 20 20 69 66 28 20 6e 65 77 4f 66 66 73  .    if( newOffs
157d0 65 74 20 3d 3d 20 2d 31 20 29 7b 0a 20 20 20 20  et == -1 ){.    
157e0 20 20 28 28 75 6e 69 78 46 69 6c 65 2a 29 69 64    ((unixFile*)id
157f0 29 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 65  )->lastErrno = e
15800 72 72 6e 6f 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  rrno;.    }else{
15810 0a 20 20 20 20 20 20 28 28 75 6e 69 78 46 69 6c  .      ((unixFil
15820 65 2a 29 69 64 29 2d 3e 6c 61 73 74 45 72 72 6e  e*)id)->lastErrn
15830 6f 20 3d 20 30 3b 09 09 09 0a 20 20 20 20 7d 0a  o = 0;....    }.
15840 20 20 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20      return -1;. 
15850 20 7d 0a 20 20 67 6f 74 20 3d 20 77 72 69 74 65   }.  got = write
15860 28 69 64 2d 3e 68 2c 20 70 42 75 66 2c 20 63 6e  (id->h, pBuf, cn
15870 74 29 3b 0a 23 65 6e 64 69 66 0a 20 20 54 49 4d  t);.#endif.  TIM
15880 45 52 5f 45 4e 44 3b 0a 20 20 69 66 28 20 67 6f  ER_END;.  if( go
15890 74 3c 30 20 29 7b 0a 20 20 20 20 28 28 75 6e 69  t<0 ){.    ((uni
158a0 78 46 69 6c 65 2a 29 69 64 29 2d 3e 6c 61 73 74  xFile*)id)->last
158b0 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20  Errno = errno;. 
158c0 20 7d 0a 0a 20 20 4f 53 54 52 41 43 45 28 28 22   }..  OSTRACE(("
158d0 57 52 49 54 45 20 20 20 25 2d 33 64 20 25 35 64  WRITE   %-3d %5d
158e0 20 25 37 6c 6c 64 20 25 6c 6c 75 5c 6e 22 2c 20   %7lld %llu\n", 
158f0 69 64 2d 3e 68 2c 20 67 6f 74 2c 20 6f 66 66 73  id->h, got, offs
15900 65 74 2c 20 54 49 4d 45 52 5f 45 4c 41 50 53 45  et, TIMER_ELAPSE
15910 44 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 67 6f  D));.  return go
15920 74 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 57 72 69  t;.}.../*.** Wri
15930 74 65 20 64 61 74 61 20 66 72 6f 6d 20 61 20 62  te data from a b
15940 75 66 66 65 72 20 69 6e 74 6f 20 61 20 66 69 6c  uffer into a fil
15950 65 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54  e.  Return SQLIT
15960 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73 0a  E_OK on success.
15970 2a 2a 20 6f 72 20 73 6f 6d 65 20 6f 74 68 65 72  ** or some other
15980 20 65 72 72 6f 72 20 63 6f 64 65 20 6f 6e 20 66   error code on f
15990 61 69 6c 75 72 65 2e 0a 2a 2f 0a 73 74 61 74 69  ailure..*/.stati
159a0 63 20 69 6e 74 20 75 6e 69 78 57 72 69 74 65 28  c int unixWrite(
159b0 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  .  sqlite3_file 
159c0 2a 69 64 2c 20 0a 20 20 63 6f 6e 73 74 20 76 6f  *id, .  const vo
159d0 69 64 20 2a 70 42 75 66 2c 20 0a 20 20 69 6e 74  id *pBuf, .  int
159e0 20 61 6d 74 2c 0a 20 20 73 71 6c 69 74 65 33 5f   amt,.  sqlite3_
159f0 69 6e 74 36 34 20 6f 66 66 73 65 74 20 0a 29 7b  int64 offset .){
15a00 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69  .  unixFile *pFi
15a10 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29  le = (unixFile*)
15a20 69 64 3b 0a 20 20 69 6e 74 20 77 72 6f 74 65 20  id;.  int wrote 
15a30 3d 20 30 3b 0a 20 20 61 73 73 65 72 74 28 20 69  = 0;.  assert( i
15a40 64 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61  d );.  assert( a
15a50 6d 74 3e 30 20 29 3b 0a 0a 20 20 2f 2a 20 49 66  mt>0 );..  /* If
15a60 20 74 68 69 73 20 69 73 20 61 20 64 61 74 61 62   this is a datab
15a70 61 73 65 20 66 69 6c 65 20 28 6e 6f 74 20 61 20  ase file (not a 
15a80 6a 6f 75 72 6e 61 6c 2c 20 6d 61 73 74 65 72 2d  journal, master-
15a90 6a 6f 75 72 6e 61 6c 20 6f 72 20 74 65 6d 70 0a  journal or temp.
15aa0 20 20 2a 2a 20 66 69 6c 65 29 2c 20 74 68 65 20    ** file), the 
15ab0 62 79 74 65 73 20 69 6e 20 74 68 65 20 6c 6f 63  bytes in the loc
15ac0 6b 69 6e 67 20 72 61 6e 67 65 20 73 68 6f 75 6c  king range shoul
15ad0 64 20 6e 65 76 65 72 20 62 65 20 72 65 61 64 20  d never be read 
15ae0 6f 72 20 77 72 69 74 74 65 6e 2e 20 2a 2f 0a 23  or written. */.#
15af0 69 66 20 30 0a 20 20 61 73 73 65 72 74 28 20 70  if 0.  assert( p
15b00 46 69 6c 65 2d 3e 70 55 6e 75 73 65 64 3d 3d 30  File->pUnused==0
15b10 0a 20 20 20 20 20 20 20 7c 7c 20 6f 66 66 73 65  .       || offse
15b20 74 3e 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 2b  t>=PENDING_BYTE+
15b30 35 31 32 0a 20 20 20 20 20 20 20 7c 7c 20 6f 66  512.       || of
15b40 66 73 65 74 2b 61 6d 74 3c 3d 50 45 4e 44 49 4e  fset+amt<=PENDIN
15b50 47 5f 42 59 54 45 20 0a 20 20 29 3b 0a 23 65 6e  G_BYTE .  );.#en
15b60 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 4e 44 45  dif..#ifndef NDE
15b70 42 55 47 0a 20 20 2f 2a 20 49 66 20 77 65 20 61  BUG.  /* If we a
15b80 72 65 20 64 6f 69 6e 67 20 61 20 6e 6f 72 6d 61  re doing a norma
15b90 6c 20 77 72 69 74 65 20 74 6f 20 61 20 64 61 74  l write to a dat
15ba0 61 62 61 73 65 20 66 69 6c 65 20 28 61 73 20 6f  abase file (as o
15bb0 70 70 6f 73 65 64 20 74 6f 0a 20 20 2a 2a 20 64  pposed to.  ** d
15bc0 6f 69 6e 67 20 61 20 68 6f 74 2d 6a 6f 75 72 6e  oing a hot-journ
15bd0 61 6c 20 72 6f 6c 6c 62 61 63 6b 20 6f 72 20 61  al rollback or a
15be0 20 77 72 69 74 65 20 74 6f 20 73 6f 6d 65 20 66   write to some f
15bf0 69 6c 65 20 6f 74 68 65 72 20 74 68 61 6e 20 61  ile other than a
15c00 0a 20 20 2a 2a 20 6e 6f 72 6d 61 6c 20 64 61 74  .  ** normal dat
15c10 61 62 61 73 65 20 66 69 6c 65 29 20 74 68 65 6e  abase file) then
15c20 20 72 65 63 6f 72 64 20 74 68 65 20 66 61 63 74   record the fact
15c30 20 74 68 61 74 20 74 68 65 20 64 61 74 61 62 61   that the databa
15c40 73 65 0a 20 20 2a 2a 20 68 61 73 20 63 68 61 6e  se.  ** has chan
15c50 67 65 64 2e 20 20 49 66 20 74 68 65 20 74 72 61  ged.  If the tra
15c60 6e 73 61 63 74 69 6f 6e 20 63 6f 75 6e 74 65 72  nsaction counter
15c70 20 69 73 20 6d 6f 64 69 66 69 65 64 2c 20 72 65   is modified, re
15c80 63 6f 72 64 20 74 68 61 74 0a 20 20 2a 2a 20 66  cord that.  ** f
15c90 61 63 74 20 74 6f 6f 2e 0a 20 20 2a 2f 0a 20 20  act too..  */.  
15ca0 69 66 28 20 70 46 69 6c 65 2d 3e 69 6e 4e 6f 72  if( pFile->inNor
15cb0 6d 61 6c 57 72 69 74 65 20 29 7b 0a 20 20 20 20  malWrite ){.    
15cc0 70 46 69 6c 65 2d 3e 64 62 55 70 64 61 74 65 20  pFile->dbUpdate 
15cd0 3d 20 31 3b 20 20 2f 2a 20 54 68 65 20 64 61 74  = 1;  /* The dat
15ce0 61 62 61 73 65 20 68 61 73 20 62 65 65 6e 20 6d  abase has been m
15cf0 6f 64 69 66 69 65 64 20 2a 2f 0a 20 20 20 20 69  odified */.    i
15d00 66 28 20 6f 66 66 73 65 74 3c 3d 32 34 20 26 26  f( offset<=24 &&
15d10 20 6f 66 66 73 65 74 2b 61 6d 74 3e 3d 32 37 20   offset+amt>=27 
15d20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 72 63 3b  ){.      int rc;
15d30 0a 20 20 20 20 20 20 63 68 61 72 20 6f 6c 64 43  .      char oldC
15d40 6e 74 72 5b 34 5d 3b 0a 20 20 20 20 20 20 53 69  ntr[4];.      Si
15d50 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 42 65 6e  mulateIOErrorBen
15d60 69 67 6e 28 31 29 3b 0a 20 20 20 20 20 20 72 63  ign(1);.      rc
15d70 20 3d 20 73 65 65 6b 41 6e 64 52 65 61 64 28 70   = seekAndRead(p
15d80 46 69 6c 65 2c 20 32 34 2c 20 6f 6c 64 43 6e 74  File, 24, oldCnt
15d90 72 2c 20 34 29 3b 0a 20 20 20 20 20 20 53 69 6d  r, 4);.      Sim
15da0 75 6c 61 74 65 49 4f 45 72 72 6f 72 42 65 6e 69  ulateIOErrorBeni
15db0 67 6e 28 30 29 3b 0a 20 20 20 20 20 20 69 66 28  gn(0);.      if(
15dc0 20 72 63 21 3d 34 20 7c 7c 20 6d 65 6d 63 6d 70   rc!=4 || memcmp
15dd0 28 6f 6c 64 43 6e 74 72 2c 20 26 28 28 63 68 61  (oldCntr, &((cha
15de0 72 2a 29 70 42 75 66 29 5b 32 34 2d 6f 66 66 73  r*)pBuf)[24-offs
15df0 65 74 5d 2c 20 34 29 21 3d 30 20 29 7b 0a 20 20  et], 4)!=0 ){.  
15e00 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 74 72 61        pFile->tra
15e10 6e 73 43 6e 74 72 43 68 6e 67 20 3d 20 31 3b 20  nsCntrChng = 1; 
15e20 20 2f 2a 20 54 68 65 20 74 72 61 6e 73 61 63 74   /* The transact
15e30 69 6f 6e 20 63 6f 75 6e 74 65 72 20 68 61 73 20  ion counter has 
15e40 63 68 61 6e 67 65 64 20 2a 2f 0a 20 20 20 20 20  changed */.     
15e50 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e   }.    }.  }.#en
15e60 64 69 66 0a 0a 20 20 77 68 69 6c 65 28 20 61 6d  dif..  while( am
15e70 74 3e 30 20 26 26 20 28 77 72 6f 74 65 20 3d 20  t>0 && (wrote = 
15e80 73 65 65 6b 41 6e 64 57 72 69 74 65 28 70 46 69  seekAndWrite(pFi
15e90 6c 65 2c 20 6f 66 66 73 65 74 2c 20 70 42 75 66  le, offset, pBuf
15ea0 2c 20 61 6d 74 29 29 3e 30 20 29 7b 0a 20 20 20  , amt))>0 ){.   
15eb0 20 61 6d 74 20 2d 3d 20 77 72 6f 74 65 3b 0a 20   amt -= wrote;. 
15ec0 20 20 20 6f 66 66 73 65 74 20 2b 3d 20 77 72 6f     offset += wro
15ed0 74 65 3b 0a 20 20 20 20 70 42 75 66 20 3d 20 26  te;.    pBuf = &
15ee0 28 28 63 68 61 72 2a 29 70 42 75 66 29 5b 77 72  ((char*)pBuf)[wr
15ef0 6f 74 65 5d 3b 0a 20 20 7d 0a 20 20 53 69 6d 75  ote];.  }.  Simu
15f00 6c 61 74 65 49 4f 45 72 72 6f 72 28 28 20 77 72  lateIOError(( wr
15f10 6f 74 65 3d 28 2d 31 29 2c 20 61 6d 74 3d 31 20  ote=(-1), amt=1 
15f20 29 29 3b 0a 20 20 53 69 6d 75 6c 61 74 65 44 69  ));.  SimulateDi
15f30 73 6b 66 75 6c 6c 45 72 72 6f 72 28 28 20 77 72  skfullError(( wr
15f40 6f 74 65 3d 30 2c 20 61 6d 74 3d 31 20 29 29 3b  ote=0, amt=1 ));
15f50 0a 20 20 69 66 28 20 61 6d 74 3e 30 20 29 7b 0a  .  if( amt>0 ){.
15f60 20 20 20 20 69 66 28 20 77 72 6f 74 65 3c 30 20      if( wrote<0 
15f70 29 7b 0a 20 20 20 20 20 20 2f 2a 20 6c 61 73 74  ){.      /* last
15f80 45 72 72 6e 6f 20 73 65 74 20 62 79 20 73 65 65  Errno set by see
15f90 6b 41 6e 64 57 72 69 74 65 20 2a 2f 0a 20 20 20  kAndWrite */.   
15fa0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
15fb0 5f 49 4f 45 52 52 5f 57 52 49 54 45 3b 0a 20 20  _IOERR_WRITE;.  
15fc0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70    }else{.      p
15fd0 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20  File->lastErrno 
15fe0 3d 20 30 3b 20 2f 2a 20 6e 6f 74 20 61 20 73 79  = 0; /* not a sy
15ff0 73 74 65 6d 20 65 72 72 6f 72 20 2a 2f 0a 20 20  stem error */.  
16000 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
16010 45 5f 46 55 4c 4c 3b 0a 20 20 20 20 7d 0a 20 20  E_FULL;.    }.  
16020 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  }.  return SQLIT
16030 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 64 65 66 20  E_OK;.}..#ifdef 
16040 53 51 4c 49 54 45 5f 54 45 53 54 0a 2f 2a 0a 2a  SQLITE_TEST./*.*
16050 2a 20 43 6f 75 6e 74 20 74 68 65 20 6e 75 6d 62  * Count the numb
16060 65 72 20 6f 66 20 66 75 6c 6c 73 79 6e 63 73 20  er of fullsyncs 
16070 61 6e 64 20 6e 6f 72 6d 61 6c 20 73 79 6e 63 73  and normal syncs
16080 2e 20 20 54 68 69 73 20 69 73 20 75 73 65 64 20  .  This is used 
16090 74 6f 20 74 65 73 74 0a 2a 2a 20 74 68 61 74 20  to test.** that 
160a0 73 79 6e 63 73 20 61 6e 64 20 66 75 6c 6c 73 79  syncs and fullsy
160b0 6e 63 73 20 61 72 65 20 6f 63 63 75 72 72 69 6e  ncs are occurrin
160c0 67 20 61 74 20 74 68 65 20 72 69 67 68 74 20 74  g at the right t
160d0 69 6d 65 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  imes..*/.int sql
160e0 69 74 65 33 5f 73 79 6e 63 5f 63 6f 75 6e 74 20  ite3_sync_count 
160f0 3d 20 30 3b 0a 69 6e 74 20 73 71 6c 69 74 65 33  = 0;.int sqlite3
16100 5f 66 75 6c 6c 73 79 6e 63 5f 63 6f 75 6e 74 20  _fullsync_count 
16110 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  = 0;.#endif../*.
16120 2a 2a 20 57 65 20 64 6f 20 6e 6f 74 20 74 72 75  ** We do not tru
16130 73 74 20 73 79 73 74 65 6d 73 20 74 6f 20 70 72  st systems to pr
16140 6f 76 69 64 65 20 61 20 77 6f 72 6b 69 6e 67 20  ovide a working 
16150 66 64 61 74 61 73 79 6e 63 28 29 2e 20 20 53 6f  fdatasync().  So
16160 6d 65 20 64 6f 2e 0a 2a 2a 20 4f 74 68 65 72 73  me do..** Others
16170 20 64 6f 20 6e 6f 2e 20 20 54 6f 20 62 65 20 73   do no.  To be s
16180 61 66 65 2c 20 77 65 20 77 69 6c 6c 20 73 74 69  afe, we will sti
16190 63 6b 20 77 69 74 68 20 74 68 65 20 28 73 6c 6f  ck with the (slo
161a0 77 65 72 29 20 66 73 79 6e 63 28 29 2e 0a 2a 2a  wer) fsync()..**
161b0 20 49 66 20 79 6f 75 20 6b 6e 6f 77 20 74 68 61   If you know tha
161c0 74 20 79 6f 75 72 20 73 79 73 74 65 6d 20 64 6f  t your system do
161d0 65 73 20 73 75 70 70 6f 72 74 20 66 64 61 74 61  es support fdata
161e0 73 79 6e 63 28 29 20 63 6f 72 72 65 63 74 6c 79  sync() correctly
161f0 2c 0a 2a 2a 20 74 68 65 6e 20 73 69 6d 70 6c 79  ,.** then simply
16200 20 63 6f 6d 70 69 6c 65 20 77 69 74 68 20 2d 44   compile with -D
16210 66 64 61 74 61 73 79 6e 63 3d 66 64 61 74 61 73  fdatasync=fdatas
16220 79 6e 63 0a 2a 2f 0a 23 69 66 20 21 64 65 66 69  ync.*/.#if !defi
16230 6e 65 64 28 66 64 61 74 61 73 79 6e 63 29 20 26  ned(fdatasync) &
16240 26 20 21 64 65 66 69 6e 65 64 28 5f 5f 6c 69 6e  & !defined(__lin
16250 75 78 5f 5f 29 0a 23 20 64 65 66 69 6e 65 20 66  ux__).# define f
16260 64 61 74 61 73 79 6e 63 20 66 73 79 6e 63 0a 23  datasync fsync.#
16270 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 44 65 66  endif../*.** Def
16280 69 6e 65 20 48 41 56 45 5f 46 55 4c 4c 46 53 59  ine HAVE_FULLFSY
16290 4e 43 20 74 6f 20 30 20 6f 72 20 31 20 64 65 70  NC to 0 or 1 dep
162a0 65 6e 64 69 6e 67 20 6f 6e 20 77 68 65 74 68 65  ending on whethe
162b0 72 20 6f 72 20 6e 6f 74 0a 2a 2a 20 74 68 65 20  r or not.** the 
162c0 46 5f 46 55 4c 4c 46 53 59 4e 43 20 6d 61 63 72  F_FULLFSYNC macr
162d0 6f 20 69 73 20 64 65 66 69 6e 65 64 2e 20 20 46  o is defined.  F
162e0 5f 46 55 4c 4c 46 53 59 4e 43 20 69 73 20 63 75  _FULLFSYNC is cu
162f0 72 72 65 6e 74 6c 79 0a 2a 2a 20 6f 6e 6c 79 20  rrently.** only 
16300 61 76 61 69 6c 61 62 6c 65 20 6f 6e 20 4d 61 63  available on Mac
16310 20 4f 53 20 58 2e 20 20 42 75 74 20 74 68 61 74   OS X.  But that
16320 20 63 6f 75 6c 64 20 63 68 61 6e 67 65 2e 0a 2a   could change..*
16330 2f 0a 23 69 66 64 65 66 20 46 5f 46 55 4c 4c 46  /.#ifdef F_FULLF
16340 53 59 4e 43 0a 23 20 64 65 66 69 6e 65 20 48 41  SYNC.# define HA
16350 56 45 5f 46 55 4c 4c 46 53 59 4e 43 20 31 0a 23  VE_FULLFSYNC 1.#
16360 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 48 41  else.# define HA
16370 56 45 5f 46 55 4c 4c 46 53 59 4e 43 20 30 0a 23  VE_FULLFSYNC 0.#
16380 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68  endif.../*.** Th
16390 65 20 66 73 79 6e 63 28 29 20 73 79 73 74 65 6d  e fsync() system
163a0 20 63 61 6c 6c 20 64 6f 65 73 20 6e 6f 74 20 77   call does not w
163b0 6f 72 6b 20 61 73 20 61 64 76 65 72 74 69 73 65  ork as advertise
163c0 64 20 6f 6e 20 6d 61 6e 79 0a 2a 2a 20 75 6e 69  d on many.** uni
163d0 78 20 73 79 73 74 65 6d 73 2e 20 20 54 68 65 20  x systems.  The 
163e0 66 6f 6c 6c 6f 77 69 6e 67 20 70 72 6f 63 65 64  following proced
163f0 75 72 65 20 69 73 20 61 6e 20 61 74 74 65 6d 70  ure is an attemp
16400 74 20 74 6f 20 6d 61 6b 65 0a 2a 2a 20 69 74 20  t to make.** it 
16410 77 6f 72 6b 20 62 65 74 74 65 72 2e 0a 2a 2a 0a  work better..**.
16420 2a 2a 20 54 68 65 20 53 51 4c 49 54 45 5f 4e 4f  ** The SQLITE_NO
16430 5f 53 59 4e 43 20 6d 61 63 72 6f 20 64 69 73 61  _SYNC macro disa
16440 62 6c 65 73 20 61 6c 6c 20 66 73 79 6e 63 28 29  bles all fsync()
16450 73 2e 20 20 54 68 69 73 20 69 73 20 75 73 65 66  s.  This is usef
16460 75 6c 0a 2a 2a 20 66 6f 72 20 74 65 73 74 69 6e  ul.** for testin
16470 67 20 77 68 65 6e 20 77 65 20 77 61 6e 74 20 74  g when we want t
16480 6f 20 72 75 6e 20 74 68 72 6f 75 67 68 20 74 68  o run through th
16490 65 20 74 65 73 74 20 73 75 69 74 65 20 71 75 69  e test suite qui
164a0 63 6b 6c 79 2e 0a 2a 2a 20 59 6f 75 20 61 72 65  ckly..** You are
164b0 20 73 74 72 6f 6e 67 6c 79 20 61 64 76 69 73 65   strongly advise
164c0 64 20 2a 6e 6f 74 2a 20 74 6f 20 64 65 70 6c 6f  d *not* to deplo
164d0 79 20 77 69 74 68 20 53 51 4c 49 54 45 5f 4e 4f  y with SQLITE_NO
164e0 5f 53 59 4e 43 0a 2a 2a 20 65 6e 61 62 6c 65 64  _SYNC.** enabled
164f0 2c 20 68 6f 77 65 76 65 72 2c 20 73 69 6e 63 65  , however, since
16500 20 77 69 74 68 20 53 51 4c 49 54 45 5f 4e 4f 5f   with SQLITE_NO_
16510 53 59 4e 43 20 65 6e 61 62 6c 65 64 2c 20 61 6e  SYNC enabled, an
16520 20 4f 53 20 63 72 61 73 68 0a 2a 2a 20 6f 72 20   OS crash.** or 
16530 70 6f 77 65 72 20 66 61 69 6c 75 72 65 20 77 69  power failure wi
16540 6c 6c 20 6c 69 6b 65 6c 79 20 63 6f 72 72 75 70  ll likely corrup
16550 74 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  t the database f
16560 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 69 74  ile..**.** SQLit
16570 65 20 73 65 74 73 20 74 68 65 20 64 61 74 61 4f  e sets the dataO
16580 6e 6c 79 20 66 6c 61 67 20 69 66 20 74 68 65 20  nly flag if the 
16590 73 69 7a 65 20 6f 66 20 74 68 65 20 66 69 6c 65  size of the file
165a0 20 69 73 20 75 6e 63 68 61 6e 67 65 64 2e 0a 2a   is unchanged..*
165b0 2a 20 54 68 65 20 69 64 65 61 20 62 65 68 69 6e  * The idea behin
165c0 64 20 64 61 74 61 4f 6e 6c 79 20 69 73 20 74 68  d dataOnly is th
165d0 61 74 20 69 74 20 73 68 6f 75 6c 64 20 6f 6e 6c  at it should onl
165e0 79 20 77 72 69 74 65 20 74 68 65 20 66 69 6c 65  y write the file
165f0 20 63 6f 6e 74 65 6e 74 0a 2a 2a 20 74 6f 20 64   content.** to d
16600 69 73 6b 2c 20 6e 6f 74 20 74 68 65 20 69 6e 6f  isk, not the ino
16610 64 65 2e 20 20 57 65 20 6f 6e 6c 79 20 73 65 74  de.  We only set
16620 20 64 61 74 61 4f 6e 6c 79 20 69 66 20 74 68 65   dataOnly if the
16630 20 66 69 6c 65 20 73 69 7a 65 20 69 73 20 0a 2a   file size is .*
16640 2a 20 75 6e 63 68 61 6e 67 65 64 20 73 69 6e 63  * unchanged sinc
16650 65 20 74 68 65 20 66 69 6c 65 20 73 69 7a 65 20  e the file size 
16660 69 73 20 70 61 72 74 20 6f 66 20 74 68 65 20 69  is part of the i
16670 6e 6f 64 65 2e 20 20 48 6f 77 65 76 65 72 2c 20  node.  However, 
16680 0a 2a 2a 20 54 65 64 20 54 73 27 6f 20 74 65 6c  .** Ted Ts'o tel
16690 6c 73 20 75 73 20 74 68 61 74 20 66 64 61 74 61  ls us that fdata
166a0 73 79 6e 63 28 29 20 77 69 6c 6c 20 61 6c 73 6f  sync() will also
166b0 20 77 72 69 74 65 20 74 68 65 20 69 6e 6f 64 65   write the inode
166c0 20 69 66 20 74 68 65 0a 2a 2a 20 66 69 6c 65 20   if the.** file 
166d0 73 69 7a 65 20 68 61 73 20 63 68 61 6e 67 65 64  size has changed
166e0 2e 20 20 54 68 65 20 6f 6e 6c 79 20 72 65 61 6c  .  The only real
166f0 20 64 69 66 66 65 72 65 6e 63 65 20 62 65 74 77   difference betw
16700 65 65 6e 20 66 64 61 74 61 73 79 6e 63 28 29 0a  een fdatasync().
16710 2a 2a 20 61 6e 64 20 66 73 79 6e 63 28 29 2c 20  ** and fsync(), 
16720 54 65 64 20 74 65 6c 6c 73 20 75 73 2c 20 69 73  Ted tells us, is
16730 20 74 68 61 74 20 66 64 61 74 61 73 79 6e 63 28   that fdatasync(
16740 29 20 77 69 6c 6c 20 6e 6f 74 20 66 6c 75 73 68  ) will not flush
16750 20 74 68 65 0a 2a 2a 20 69 6e 6f 64 65 20 69 66   the.** inode if
16760 20 74 68 65 20 6d 74 69 6d 65 20 6f 72 20 6f 77   the mtime or ow
16770 6e 65 72 20 6f 72 20 6f 74 68 65 72 20 69 6e 6f  ner or other ino
16780 64 65 20 61 74 74 72 69 62 75 74 65 73 20 68 61  de attributes ha
16790 76 65 20 63 68 61 6e 67 65 64 2e 0a 2a 2a 20 57  ve changed..** W
167a0 65 20 6f 6e 6c 79 20 63 61 72 65 20 61 62 6f 75  e only care abou
167b0 74 20 74 68 65 20 66 69 6c 65 20 73 69 7a 65 2c  t the file size,
167c0 20 6e 6f 74 20 74 68 65 20 6f 74 68 65 72 20 66   not the other f
167d0 69 6c 65 20 61 74 74 72 69 62 75 74 65 73 2c 20  ile attributes, 
167e0 73 6f 0a 2a 2a 20 61 73 20 66 61 72 20 61 73 20  so.** as far as 
167f0 53 51 4c 69 74 65 20 69 73 20 63 6f 6e 63 65 72  SQLite is concer
16800 6e 65 64 2c 20 61 6e 20 66 64 61 74 61 73 79 6e  ned, an fdatasyn
16810 63 28 29 20 69 73 20 61 6c 77 61 79 73 20 61 64  c() is always ad
16820 65 71 75 61 74 65 2e 0a 2a 2a 20 53 6f 2c 20 77  equate..** So, w
16830 65 20 61 6c 77 61 79 73 20 75 73 65 20 66 64 61  e always use fda
16840 74 61 73 79 6e 63 28 29 20 69 66 20 69 74 20 69  tasync() if it i
16850 73 20 61 76 61 69 6c 61 62 6c 65 2c 20 72 65 67  s available, reg
16860 61 72 64 6c 65 73 73 20 6f 66 0a 2a 2a 20 74 68  ardless of.** th
16870 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 64  e value of the d
16880 61 74 61 4f 6e 6c 79 20 66 6c 61 67 2e 0a 2a 2f  ataOnly flag..*/
16890 0a 73 74 61 74 69 63 20 69 6e 74 20 66 75 6c 6c  .static int full
168a0 5f 66 73 79 6e 63 28 69 6e 74 20 66 64 2c 20 69  _fsync(int fd, i
168b0 6e 74 20 66 75 6c 6c 53 79 6e 63 2c 20 69 6e 74  nt fullSync, int
168c0 20 64 61 74 61 4f 6e 6c 79 29 7b 0a 20 20 69 6e   dataOnly){.  in
168d0 74 20 72 63 3b 0a 0a 20 20 2f 2a 20 54 68 65 20  t rc;..  /* The 
168e0 66 6f 6c 6c 6f 77 69 6e 67 20 22 69 66 64 65 66  following "ifdef
168f0 2f 65 6c 69 66 2f 65 6c 73 65 2f 22 20 62 6c 6f  /elif/else/" blo
16900 63 6b 20 68 61 73 20 74 68 65 20 73 61 6d 65 20  ck has the same 
16910 73 74 72 75 63 74 75 72 65 20 61 73 0a 20 20 2a  structure as.  *
16920 2a 20 74 68 65 20 6f 6e 65 20 62 65 6c 6f 77 2e  * the one below.
16930 20 49 74 20 69 73 20 72 65 70 6c 69 63 61 74 65   It is replicate
16940 64 20 68 65 72 65 20 73 6f 6c 65 6c 79 20 74 6f  d here solely to
16950 20 61 76 6f 69 64 20 63 6c 75 74 74 65 72 69 6e   avoid clutterin
16960 67 20 0a 20 20 2a 2a 20 75 70 20 74 68 65 20 72  g .  ** up the r
16970 65 61 6c 20 63 6f 64 65 20 77 69 74 68 20 74 68  eal code with th
16980 65 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54  e UNUSED_PARAMET
16990 45 52 28 29 20 6d 61 63 72 6f 73 2e 0a 20 20 2a  ER() macros..  *
169a0 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /.#ifdef SQLITE_
169b0 4e 4f 5f 53 59 4e 43 0a 20 20 55 4e 55 53 45 44  NO_SYNC.  UNUSED
169c0 5f 50 41 52 41 4d 45 54 45 52 28 66 64 29 3b 0a  _PARAMETER(fd);.
169d0 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
169e0 45 52 28 66 75 6c 6c 53 79 6e 63 29 3b 0a 20 20  ER(fullSync);.  
169f0 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
16a00 28 64 61 74 61 4f 6e 6c 79 29 3b 0a 23 65 6c 69  (dataOnly);.#eli
16a10 66 20 48 41 56 45 5f 46 55 4c 4c 46 53 59 4e 43  f HAVE_FULLFSYNC
16a20 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
16a30 54 45 52 28 64 61 74 61 4f 6e 6c 79 29 3b 0a 23  TER(dataOnly);.#
16a40 65 6c 73 65 0a 20 20 55 4e 55 53 45 44 5f 50 41  else.  UNUSED_PA
16a50 52 41 4d 45 54 45 52 28 66 75 6c 6c 53 79 6e 63  RAMETER(fullSync
16a60 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  );.  UNUSED_PARA
16a70 4d 45 54 45 52 28 64 61 74 61 4f 6e 6c 79 29 3b  METER(dataOnly);
16a80 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 52 65  .#endif..  /* Re
16a90 63 6f 72 64 20 74 68 65 20 6e 75 6d 62 65 72 20  cord the number 
16aa0 6f 66 20 74 69 6d 65 73 20 74 68 61 74 20 77 65  of times that we
16ab0 20 64 6f 20 61 20 6e 6f 72 6d 61 6c 20 66 73 79   do a normal fsy
16ac0 6e 63 28 29 20 61 6e 64 20 0a 20 20 2a 2a 20 46  nc() and .  ** F
16ad0 55 4c 4c 53 59 4e 43 2e 20 20 54 68 69 73 20 69  ULLSYNC.  This i
16ae0 73 20 75 73 65 64 20 64 75 72 69 6e 67 20 74 65  s used during te
16af0 73 74 69 6e 67 20 74 6f 20 76 65 72 69 66 79 20  sting to verify 
16b00 74 68 61 74 20 74 68 69 73 20 70 72 6f 63 65 64  that this proced
16b10 75 72 65 0a 20 20 2a 2a 20 67 65 74 73 20 63 61  ure.  ** gets ca
16b20 6c 6c 65 64 20 77 69 74 68 20 74 68 65 20 63 6f  lled with the co
16b30 72 72 65 63 74 20 61 72 67 75 6d 65 6e 74 73 2e  rrect arguments.
16b40 0a 20 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c  .  */.#ifdef SQL
16b50 49 54 45 5f 54 45 53 54 0a 20 20 69 66 28 20 66  ITE_TEST.  if( f
16b60 75 6c 6c 53 79 6e 63 20 29 20 73 71 6c 69 74 65  ullSync ) sqlite
16b70 33 5f 66 75 6c 6c 73 79 6e 63 5f 63 6f 75 6e 74  3_fullsync_count
16b80 2b 2b 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73 79  ++;.  sqlite3_sy
16b90 6e 63 5f 63 6f 75 6e 74 2b 2b 3b 0a 23 65 6e 64  nc_count++;.#end
16ba0 69 66 0a 0a 20 20 2f 2a 20 49 66 20 77 65 20 63  if..  /* If we c
16bb0 6f 6d 70 69 6c 65 64 20 77 69 74 68 20 74 68 65  ompiled with the
16bc0 20 53 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e 43 20   SQLITE_NO_SYNC 
16bd0 66 6c 61 67 2c 20 74 68 65 6e 20 73 79 6e 63 69  flag, then synci
16be0 6e 67 20 69 73 20 61 0a 20 20 2a 2a 20 6e 6f 2d  ng is a.  ** no-
16bf0 6f 70 0a 20 20 2a 2f 0a 23 69 66 64 65 66 20 53  op.  */.#ifdef S
16c00 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e 43 0a 20 20  QLITE_NO_SYNC.  
16c10 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
16c20 23 65 6c 69 66 20 48 41 56 45 5f 46 55 4c 4c 46  #elif HAVE_FULLF
16c30 53 59 4e 43 0a 20 20 69 66 28 20 66 75 6c 6c 53  SYNC.  if( fullS
16c40 79 6e 63 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  ync ){.    rc = 
16c50 66 63 6e 74 6c 28 66 64 2c 20 46 5f 46 55 4c 4c  fcntl(fd, F_FULL
16c60 46 53 59 4e 43 2c 20 30 29 3b 0a 20 20 7d 65 6c  FSYNC, 0);.  }el
16c70 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 31 3b 0a  se{.    rc = 1;.
16c80 20 20 7d 0a 20 20 2f 2a 20 49 66 20 74 68 65 20    }.  /* If the 
16c90 46 55 4c 4c 46 53 59 4e 43 20 66 61 69 6c 65 64  FULLFSYNC failed
16ca0 2c 20 66 61 6c 6c 20 62 61 63 6b 20 74 6f 20 61  , fall back to a
16cb0 74 74 65 6d 70 74 69 6e 67 20 61 6e 20 66 73 79  ttempting an fsy
16cc0 6e 63 28 29 2e 0a 20 20 2a 2a 20 49 74 20 73 68  nc()..  ** It sh
16cd0 6f 75 6c 64 6e 27 74 20 62 65 20 70 6f 73 73 69  ouldn't be possi
16ce0 62 6c 65 20 66 6f 72 20 66 75 6c 6c 66 73 79 6e  ble for fullfsyn
16cf0 63 20 74 6f 20 66 61 69 6c 20 6f 6e 20 74 68 65  c to fail on the
16d00 20 6c 6f 63 61 6c 20 0a 20 20 2a 2a 20 66 69 6c   local .  ** fil
16d10 65 20 73 79 73 74 65 6d 20 28 6f 6e 20 4f 53 58  e system (on OSX
16d20 29 2c 20 73 6f 20 66 61 69 6c 75 72 65 20 69 6e  ), so failure in
16d30 64 69 63 61 74 65 73 20 74 68 61 74 20 46 55 4c  dicates that FUL
16d40 4c 46 53 59 4e 43 0a 20 20 2a 2a 20 69 73 6e 27  LFSYNC.  ** isn'
16d50 74 20 73 75 70 70 6f 72 74 65 64 20 66 6f 72 20  t supported for 
16d60 74 68 69 73 20 66 69 6c 65 20 73 79 73 74 65 6d  this file system
16d70 2e 20 53 6f 2c 20 61 74 74 65 6d 70 74 20 61 6e  . So, attempt an
16d80 20 66 73 79 6e 63 20 0a 20 20 2a 2a 20 61 6e 64   fsync .  ** and
16d90 20 28 66 6f 72 20 6e 6f 77 29 20 69 67 6e 6f 72   (for now) ignor
16da0 65 20 74 68 65 20 6f 76 65 72 68 65 61 64 20 6f  e the overhead o
16db0 66 20 61 20 73 75 70 65 72 66 6c 75 6f 75 73 20  f a superfluous 
16dc0 66 63 6e 74 6c 20 63 61 6c 6c 2e 20 20 0a 20 20  fcntl call.  .  
16dd0 2a 2a 20 49 74 27 64 20 62 65 20 62 65 74 74 65  ** It'd be bette
16de0 72 20 74 6f 20 64 65 74 65 63 74 20 66 75 6c 6c  r to detect full
16df0 66 73 79 6e 63 20 73 75 70 70 6f 72 74 20 6f 6e  fsync support on
16e00 63 65 20 61 6e 64 20 61 76 6f 69 64 20 0a 20 20  ce and avoid .  
16e10 2a 2a 20 74 68 65 20 66 63 6e 74 6c 20 63 61 6c  ** the fcntl cal
16e20 6c 20 65 76 65 72 79 20 74 69 6d 65 20 73 79 6e  l every time syn
16e30 63 20 69 73 20 63 61 6c 6c 65 64 2e 0a 20 20 2a  c is called..  *
16e40 2f 0a 20 20 69 66 28 20 72 63 20 29 20 72 63 20  /.  if( rc ) rc 
16e50 3d 20 66 73 79 6e 63 28 66 64 29 3b 0a 0a 23 65  = fsync(fd);..#e
16e60 6c 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 41 50  lif defined(__AP
16e70 50 4c 45 5f 5f 29 0a 20 20 2f 2a 20 66 64 61 74  PLE__).  /* fdat
16e80 61 73 79 6e 63 28 29 20 6f 6e 20 48 46 53 2b 20  async() on HFS+ 
16e90 64 6f 65 73 6e 27 74 20 79 65 74 20 66 6c 75 73  doesn't yet flus
16ea0 68 20 74 68 65 20 66 69 6c 65 20 73 69 7a 65 20  h the file size 
16eb0 69 66 20 69 74 20 63 68 61 6e 67 65 64 20 63 6f  if it changed co
16ec0 72 72 65 63 74 6c 79 0a 20 20 2a 2a 20 73 6f 20  rrectly.  ** so 
16ed0 63 75 72 72 65 6e 74 6c 79 20 77 65 20 64 65 66  currently we def
16ee0 61 75 6c 74 20 74 6f 20 74 68 65 20 6d 61 63 72  ault to the macr
16ef0 6f 20 74 68 61 74 20 72 65 64 65 66 69 6e 65 73  o that redefines
16f00 20 66 64 61 74 61 73 79 6e 63 20 74 6f 20 66 73   fdatasync to fs
16f10 79 6e 63 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20  ync.  */.  rc = 
16f20 66 73 79 6e 63 28 66 64 29 3b 0a 23 65 6c 73 65  fsync(fd);.#else
16f30 20 0a 20 20 72 63 20 3d 20 66 64 61 74 61 73 79   .  rc = fdatasy
16f40 6e 63 28 66 64 29 3b 0a 23 69 66 20 4f 53 5f 56  nc(fd);.#if OS_V
16f50 58 57 4f 52 4b 53 0a 20 20 69 66 28 20 72 63 3d  XWORKS.  if( rc=
16f60 3d 2d 31 20 26 26 20 65 72 72 6e 6f 3d 3d 45 4e  =-1 && errno==EN
16f70 4f 54 53 55 50 20 29 7b 0a 20 20 20 20 72 63 20  OTSUP ){.    rc 
16f80 3d 20 66 73 79 6e 63 28 66 64 29 3b 0a 20 20 7d  = fsync(fd);.  }
16f90 0a 23 65 6e 64 69 66 20 2f 2a 20 4f 53 5f 56 58  .#endif /* OS_VX
16fa0 57 4f 52 4b 53 20 2a 2f 0a 23 65 6e 64 69 66 20  WORKS */.#endif 
16fb0 2f 2a 20 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /* ifdef SQLITE_
16fc0 4e 4f 5f 53 59 4e 43 20 65 6c 69 66 20 48 41 56  NO_SYNC elif HAV
16fd0 45 5f 46 55 4c 4c 46 53 59 4e 43 20 2a 2f 0a 0a  E_FULLFSYNC */..
16fe0 20 20 69 66 28 20 4f 53 5f 56 58 57 4f 52 4b 53    if( OS_VXWORKS
16ff0 20 26 26 20 72 63 21 3d 20 2d 31 20 29 7b 0a 20   && rc!= -1 ){. 
17000 20 20 20 72 63 20 3d 20 30 3b 0a 20 20 7d 0a 20     rc = 0;.  }. 
17010 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
17020 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75 72 65 20 61  *.** Make sure a
17030 6c 6c 20 77 72 69 74 65 73 20 74 6f 20 61 20 70  ll writes to a p
17040 61 72 74 69 63 75 6c 61 72 20 66 69 6c 65 20 61  articular file a
17050 72 65 20 63 6f 6d 6d 69 74 74 65 64 20 74 6f 20  re committed to 
17060 64 69 73 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 64  disk..**.** If d
17070 61 74 61 4f 6e 6c 79 3d 3d 30 20 74 68 65 6e 20  ataOnly==0 then 
17080 62 6f 74 68 20 74 68 65 20 66 69 6c 65 20 69 74  both the file it
17090 73 65 6c 66 20 61 6e 64 20 69 74 73 20 6d 65 74  self and its met
170a0 61 64 61 74 61 20 28 66 69 6c 65 0a 2a 2a 20 73  adata (file.** s
170b0 69 7a 65 2c 20 61 63 63 65 73 73 20 74 69 6d 65  ize, access time
170c0 2c 20 65 74 63 29 20 61 72 65 20 73 79 6e 63 65  , etc) are synce
170d0 64 2e 20 20 49 66 20 64 61 74 61 4f 6e 6c 79 21  d.  If dataOnly!
170e0 3d 30 20 74 68 65 6e 20 6f 6e 6c 79 20 74 68 65  =0 then only the
170f0 0a 2a 2a 20 66 69 6c 65 20 64 61 74 61 20 69 73  .** file data is
17100 20 73 79 6e 63 65 64 2e 0a 2a 2a 0a 2a 2a 20 55   synced..**.** U
17110 6e 64 65 72 20 55 6e 69 78 2c 20 61 6c 73 6f 20  nder Unix, also 
17120 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74 20 74  make sure that t
17130 68 65 20 64 69 72 65 63 74 6f 72 79 20 65 6e 74  he directory ent
17140 72 79 20 66 6f 72 20 74 68 65 20 66 69 6c 65 0a  ry for the file.
17150 2a 2a 20 68 61 73 20 62 65 65 6e 20 63 72 65 61  ** has been crea
17160 74 65 64 20 62 79 20 66 73 79 6e 63 2d 69 6e 67  ted by fsync-ing
17170 20 74 68 65 20 64 69 72 65 63 74 6f 72 79 20 74   the directory t
17180 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65  hat contains the
17190 20 66 69 6c 65 2e 0a 2a 2a 20 49 66 20 77 65 20   file..** If we 
171a0 64 6f 20 6e 6f 74 20 64 6f 20 74 68 69 73 20 61  do not do this a
171b0 6e 64 20 77 65 20 65 6e 63 6f 75 6e 74 65 72 20  nd we encounter 
171c0 61 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65 2c  a power failure,
171d0 20 74 68 65 20 64 69 72 65 63 74 6f 72 79 0a 2a   the directory.*
171e0 2a 20 65 6e 74 72 79 20 66 6f 72 20 74 68 65 20  * entry for the 
171f0 6a 6f 75 72 6e 61 6c 20 6d 69 67 68 74 20 6e 6f  journal might no
17200 74 20 65 78 69 73 74 20 61 66 74 65 72 20 77 65  t exist after we
17210 20 72 65 62 6f 6f 74 2e 20 20 54 68 65 20 6e 65   reboot.  The ne
17220 78 74 0a 2a 2a 20 53 51 4c 69 74 65 20 74 6f 20  xt.** SQLite to 
17230 61 63 63 65 73 73 20 74 68 65 20 66 69 6c 65 20  access the file 
17240 77 69 6c 6c 20 6e 6f 74 20 6b 6e 6f 77 20 74 68  will not know th
17250 61 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 65  at the journal e
17260 78 69 73 74 73 20 28 62 65 63 61 75 73 65 0a 2a  xists (because.*
17270 2a 20 74 68 65 20 64 69 72 65 63 74 6f 72 79 20  * the directory 
17280 65 6e 74 72 79 20 66 6f 72 20 74 68 65 20 6a 6f  entry for the jo
17290 75 72 6e 61 6c 20 77 61 73 20 6e 65 76 65 72 20  urnal was never 
172a0 63 72 65 61 74 65 64 29 20 61 6e 64 20 74 68 65  created) and the
172b0 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20   transaction.** 
172c0 77 69 6c 6c 20 6e 6f 74 20 72 6f 6c 6c 20 62 61  will not roll ba
172d0 63 6b 20 2d 20 70 6f 73 73 69 62 6c 79 20 6c 65  ck - possibly le
172e0 61 64 69 6e 67 20 74 6f 20 64 61 74 61 62 61 73  ading to databas
172f0 65 20 63 6f 72 72 75 70 74 69 6f 6e 2e 0a 2a 2f  e corruption..*/
17300 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78  .static int unix
17310 53 79 6e 63 28 73 71 6c 69 74 65 33 5f 66 69 6c  Sync(sqlite3_fil
17320 65 20 2a 69 64 2c 20 69 6e 74 20 66 6c 61 67 73  e *id, int flags
17330 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 75  ){.  int rc;.  u
17340 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d  nixFile *pFile =
17350 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a   (unixFile*)id;.
17360 0a 20 20 69 6e 74 20 69 73 44 61 74 61 4f 6e 6c  .  int isDataOnl
17370 79 20 3d 20 28 66 6c 61 67 73 26 53 51 4c 49 54  y = (flags&SQLIT
17380 45 5f 53 59 4e 43 5f 44 41 54 41 4f 4e 4c 59 29  E_SYNC_DATAONLY)
17390 3b 0a 20 20 69 6e 74 20 69 73 46 75 6c 6c 73 79  ;.  int isFullsy
173a0 6e 63 20 3d 20 28 66 6c 61 67 73 26 30 78 30 46  nc = (flags&0x0F
173b0 29 3d 3d 53 51 4c 49 54 45 5f 53 59 4e 43 5f 46  )==SQLITE_SYNC_F
173c0 55 4c 4c 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b  ULL;..  /* Check
173d0 20 74 68 61 74 20 6f 6e 65 20 6f 66 20 53 51 4c   that one of SQL
173e0 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c 20  ITE_SYNC_NORMAL 
173f0 6f 72 20 46 55 4c 4c 20 77 61 73 20 70 61 73 73  or FULL was pass
17400 65 64 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 28  ed */.  assert((
17410 66 6c 61 67 73 26 30 78 30 46 29 3d 3d 53 51 4c  flags&0x0F)==SQL
17420 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c 0a  ITE_SYNC_NORMAL.
17430 20 20 20 20 20 20 7c 7c 20 28 66 6c 61 67 73 26        || (flags&
17440 30 78 30 46 29 3d 3d 53 51 4c 49 54 45 5f 53 59  0x0F)==SQLITE_SY
17450 4e 43 5f 46 55 4c 4c 0a 20 20 29 3b 0a 0a 20 20  NC_FULL.  );..  
17460 2f 2a 20 55 6e 69 78 20 63 61 6e 6e 6f 74 2c 20  /* Unix cannot, 
17470 62 75 74 20 73 6f 6d 65 20 73 79 73 74 65 6d 73  but some systems
17480 20 6d 61 79 20 72 65 74 75 72 6e 20 53 51 4c 49   may return SQLI
17490 54 45 5f 46 55 4c 4c 20 66 72 6f 6d 20 68 65 72  TE_FULL from her
174a0 65 2e 20 54 68 69 73 0a 20 20 2a 2a 20 6c 69 6e  e. This.  ** lin
174b0 65 20 69 73 20 74 6f 20 74 65 73 74 20 74 68 61  e is to test tha
174c0 74 20 64 6f 69 6e 67 20 73 6f 20 64 6f 65 73 20  t doing so does 
174d0 6e 6f 74 20 63 61 75 73 65 20 61 6e 79 20 70 72  not cause any pr
174e0 6f 62 6c 65 6d 73 2e 0a 20 20 2a 2f 0a 20 20 53  oblems..  */.  S
174f0 69 6d 75 6c 61 74 65 44 69 73 6b 66 75 6c 6c 45  imulateDiskfullE
17500 72 72 6f 72 28 20 72 65 74 75 72 6e 20 53 51 4c  rror( return SQL
17510 49 54 45 5f 46 55 4c 4c 20 29 3b 0a 0a 20 20 61  ITE_FULL );..  a
17520 73 73 65 72 74 28 20 70 46 69 6c 65 20 29 3b 0a  ssert( pFile );.
17530 20 20 4f 53 54 52 41 43 45 28 28 22 53 59 4e 43    OSTRACE(("SYNC
17540 20 20 20 20 25 2d 33 64 5c 6e 22 2c 20 70 46 69      %-3d\n", pFi
17550 6c 65 2d 3e 68 29 29 3b 0a 20 20 72 63 20 3d 20  le->h));.  rc = 
17560 66 75 6c 6c 5f 66 73 79 6e 63 28 70 46 69 6c 65  full_fsync(pFile
17570 2d 3e 68 2c 20 69 73 46 75 6c 6c 73 79 6e 63 2c  ->h, isFullsync,
17580 20 69 73 44 61 74 61 4f 6e 6c 79 29 3b 0a 20 20   isDataOnly);.  
17590 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28  SimulateIOError(
175a0 20 72 63 3d 31 20 29 3b 0a 20 20 69 66 28 20 72   rc=1 );.  if( r
175b0 63 20 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e  c ){.    pFile->
175c0 6c 61 73 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e  lastErrno = errn
175d0 6f 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  o;.    return SQ
175e0 4c 49 54 45 5f 49 4f 45 52 52 5f 46 53 59 4e 43  LITE_IOERR_FSYNC
175f0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 46 69 6c  ;.  }.  if( pFil
17600 65 2d 3e 64 69 72 66 64 3e 3d 30 20 29 7b 0a 20  e->dirfd>=0 ){. 
17610 20 20 20 69 6e 74 20 65 72 72 3b 0a 20 20 20 20     int err;.    
17620 4f 53 54 52 41 43 45 28 28 22 44 49 52 53 59 4e  OSTRACE(("DIRSYN
17630 43 20 25 2d 33 64 20 28 68 61 76 65 5f 66 75 6c  C %-3d (have_ful
17640 6c 66 73 79 6e 63 3d 25 64 20 66 75 6c 6c 73 79  lfsync=%d fullsy
17650 6e 63 3d 25 64 29 5c 6e 22 2c 20 70 46 69 6c 65  nc=%d)\n", pFile
17660 2d 3e 64 69 72 66 64 2c 0a 20 20 20 20 20 20 20  ->dirfd,.       
17670 20 20 20 20 20 48 41 56 45 5f 46 55 4c 4c 46 53       HAVE_FULLFS
17680 59 4e 43 2c 20 69 73 46 75 6c 6c 73 79 6e 63 29  YNC, isFullsync)
17690 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  );.#ifndef SQLIT
176a0 45 5f 44 49 53 41 42 4c 45 5f 44 49 52 53 59 4e  E_DISABLE_DIRSYN
176b0 43 0a 20 20 20 20 2f 2a 20 54 68 65 20 64 69 72  C.    /* The dir
176c0 65 63 74 6f 72 79 20 73 79 6e 63 20 69 73 20 6f  ectory sync is o
176d0 6e 6c 79 20 61 74 74 65 6d 70 74 65 64 20 69 66  nly attempted if
176e0 20 66 75 6c 6c 5f 66 73 79 6e 63 20 69 73 0a 20   full_fsync is. 
176f0 20 20 20 2a 2a 20 74 75 72 6e 65 64 20 6f 66 66     ** turned off
17700 20 6f 72 20 75 6e 61 76 61 69 6c 61 62 6c 65 2e   or unavailable.
17710 20 20 49 66 20 61 20 66 75 6c 6c 5f 66 73 79 6e    If a full_fsyn
17720 63 20 6f 63 63 75 72 72 65 64 20 61 62 6f 76 65  c occurred above
17730 2c 0a 20 20 20 20 2a 2a 20 74 68 65 6e 20 74 68  ,.    ** then th
17740 65 20 64 69 72 65 63 74 6f 72 79 20 73 79 6e 63  e directory sync
17750 20 69 73 20 73 75 70 65 72 66 6c 75 6f 75 73 2e   is superfluous.
17760 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
17770 28 21 48 41 56 45 5f 46 55 4c 4c 46 53 59 4e 43  (!HAVE_FULLFSYNC
17780 20 7c 7c 20 21 69 73 46 75 6c 6c 73 79 6e 63 29   || !isFullsync)
17790 20 26 26 20 66 75 6c 6c 5f 66 73 79 6e 63 28 70   && full_fsync(p
177a0 46 69 6c 65 2d 3e 64 69 72 66 64 2c 30 2c 30 29  File->dirfd,0,0)
177b0 20 29 7b 0a 20 20 20 20 20 20 20 2f 2a 0a 20 20   ){.       /*.  
177c0 20 20 20 20 20 2a 2a 20 57 65 20 68 61 76 65 20       ** We have 
177d0 72 65 63 65 69 76 65 64 20 6d 75 6c 74 69 70 6c  received multipl
177e0 65 20 72 65 70 6f 72 74 73 20 6f 66 20 66 73 79  e reports of fsy
177f0 6e 63 28 29 20 72 65 74 75 72 6e 69 6e 67 0a 20  nc() returning. 
17800 20 20 20 20 20 20 2a 2a 20 65 72 72 6f 72 73 20        ** errors 
17810 77 68 65 6e 20 61 70 70 6c 69 65 64 20 74 6f 20  when applied to 
17820 64 69 72 65 63 74 6f 72 69 65 73 20 6f 6e 20 63  directories on c
17830 65 72 74 61 69 6e 20 66 69 6c 65 20 73 79 73 74  ertain file syst
17840 65 6d 73 2e 0a 20 20 20 20 20 20 20 2a 2a 20 41  ems..       ** A
17850 20 66 61 69 6c 65 64 20 64 69 72 65 63 74 6f 72   failed director
17860 79 20 73 79 6e 63 20 69 73 20 6e 6f 74 20 61 20  y sync is not a 
17870 62 69 67 20 64 65 61 6c 2e 20 20 53 6f 20 69 74  big deal.  So it
17880 20 73 65 65 6d 73 0a 20 20 20 20 20 20 20 2a 2a   seems.       **
17890 20 62 65 74 74 65 72 20 74 6f 20 69 67 6e 6f 72   better to ignor
178a0 65 20 74 68 65 20 65 72 72 6f 72 2e 20 20 54 69  e the error.  Ti
178b0 63 6b 65 74 20 23 31 36 35 37 0a 20 20 20 20 20  cket #1657.     
178c0 20 20 2a 2f 0a 20 20 20 20 20 20 20 2f 2a 20 70    */.       /* p
178d0 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20  File->lastErrno 
178e0 3d 20 65 72 72 6e 6f 3b 20 2a 2f 0a 20 20 20 20  = errno; */.    
178f0 20 20 20 2f 2a 20 72 65 74 75 72 6e 20 53 51 4c     /* return SQL
17900 49 54 45 5f 49 4f 45 52 52 3b 20 2a 2f 0a 20 20  ITE_IOERR; */.  
17910 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 65    }.#endif.    e
17920 72 72 20 3d 20 63 6c 6f 73 65 28 70 46 69 6c 65  rr = close(pFile
17930 2d 3e 64 69 72 66 64 29 3b 20 2f 2a 20 4f 6e 6c  ->dirfd); /* Onl
17940 79 20 6e 65 65 64 20 74 6f 20 73 79 6e 63 20 6f  y need to sync o
17950 6e 63 65 2c 20 73 6f 20 63 6c 6f 73 65 20 74 68  nce, so close th
17960 65 20 2a 2f 0a 20 20 20 20 69 66 28 20 65 72 72  e */.    if( err
17970 3d 3d 30 20 29 7b 20 20 20 20 20 20 20 20 20 20  ==0 ){          
17980 20 20 20 20 2f 2a 20 64 69 72 65 63 74 6f 72 79      /* directory
17990 20 77 68 65 6e 20 77 65 20 61 72 65 20 64 6f 6e   when we are don
179a0 65 20 2a 2f 0a 20 20 20 20 20 20 70 46 69 6c 65  e */.      pFile
179b0 2d 3e 64 69 72 66 64 20 3d 20 2d 31 3b 0a 20 20  ->dirfd = -1;.  
179c0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70    }else{.      p
179d0 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20  File->lastErrno 
179e0 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20 72  = errno;.      r
179f0 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  c = SQLITE_IOERR
17a00 5f 44 49 52 5f 43 4c 4f 53 45 3b 0a 20 20 20 20  _DIR_CLOSE;.    
17a10 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  }.  }.  return r
17a20 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72 75 6e  c;.}../*.** Trun
17a30 63 61 74 65 20 61 6e 20 6f 70 65 6e 20 66 69 6c  cate an open fil
17a40 65 20 74 6f 20 61 20 73 70 65 63 69 66 69 65 64  e to a specified
17a50 20 73 69 7a 65 0a 2a 2f 0a 73 74 61 74 69 63 20   size.*/.static 
17a60 69 6e 74 20 75 6e 69 78 54 72 75 6e 63 61 74 65  int unixTruncate
17a70 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69  (sqlite3_file *i
17a80 64 2c 20 69 36 34 20 6e 42 79 74 65 29 7b 0a 20  d, i64 nByte){. 
17a90 20 69 6e 74 20 72 63 3b 0a 20 20 61 73 73 65 72   int rc;.  asser
17aa0 74 28 20 69 64 20 29 3b 0a 20 20 53 69 6d 75 6c  t( id );.  Simul
17ab0 61 74 65 49 4f 45 72 72 6f 72 28 20 72 65 74 75  ateIOError( retu
17ac0 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  rn SQLITE_IOERR_
17ad0 54 52 55 4e 43 41 54 45 20 29 3b 0a 20 20 72 63  TRUNCATE );.  rc
17ae0 20 3d 20 66 74 72 75 6e 63 61 74 65 28 28 28 75   = ftruncate(((u
17af0 6e 69 78 46 69 6c 65 2a 29 69 64 29 2d 3e 68 2c  nixFile*)id)->h,
17b00 20 28 6f 66 66 5f 74 29 6e 42 79 74 65 29 3b 0a   (off_t)nByte);.
17b10 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
17b20 28 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 29 2d  ((unixFile*)id)-
17b30 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 65 72 72  >lastErrno = err
17b40 6e 6f 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53  no;.    return S
17b50 51 4c 49 54 45 5f 49 4f 45 52 52 5f 54 52 55 4e  QLITE_IOERR_TRUN
17b60 43 41 54 45 3b 0a 20 20 7d 65 6c 73 65 7b 0a 23  CATE;.  }else{.#
17b70 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 20 20  ifndef NDEBUG.  
17b80 20 20 2f 2a 20 49 66 20 77 65 20 61 72 65 20 64    /* If we are d
17b90 6f 69 6e 67 20 61 20 6e 6f 72 6d 61 6c 20 77 72  oing a normal wr
17ba0 69 74 65 20 74 6f 20 61 20 64 61 74 61 62 61 73  ite to a databas
17bb0 65 20 66 69 6c 65 20 28 61 73 20 6f 70 70 6f 73  e file (as oppos
17bc0 65 64 20 74 6f 0a 20 20 20 20 2a 2a 20 64 6f 69  ed to.    ** doi
17bd0 6e 67 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c  ng a hot-journal
17be0 20 72 6f 6c 6c 62 61 63 6b 20 6f 72 20 61 20 77   rollback or a w
17bf0 72 69 74 65 20 74 6f 20 73 6f 6d 65 20 66 69 6c  rite to some fil
17c00 65 20 6f 74 68 65 72 20 74 68 61 6e 20 61 0a 20  e other than a. 
17c10 20 20 20 2a 2a 20 6e 6f 72 6d 61 6c 20 64 61 74     ** normal dat
17c20 61 62 61 73 65 20 66 69 6c 65 29 20 61 6e 64 20  abase file) and 
17c30 77 65 20 74 72 75 6e 63 61 74 65 20 74 68 65 20  we truncate the 
17c40 66 69 6c 65 20 74 6f 20 7a 65 72 6f 20 6c 65 6e  file to zero len
17c50 67 74 68 2c 0a 20 20 20 20 2a 2a 20 74 68 61 74  gth,.    ** that
17c60 20 65 66 66 65 63 74 69 76 65 6c 79 20 75 70 64   effectively upd
17c70 61 74 65 73 20 74 68 65 20 63 68 61 6e 67 65 20  ates the change 
17c80 63 6f 75 6e 74 65 72 2e 20 20 54 68 69 73 20 6d  counter.  This m
17c90 69 67 68 74 20 68 61 70 70 65 6e 0a 20 20 20 20  ight happen.    
17ca0 2a 2a 20 77 68 65 6e 20 72 65 73 74 6f 72 69 6e  ** when restorin
17cb0 67 20 61 20 64 61 74 61 62 61 73 65 20 75 73 69  g a database usi
17cc0 6e 67 20 74 68 65 20 62 61 63 6b 75 70 20 41 50  ng the backup AP
17cd0 49 20 66 72 6f 6d 20 61 20 7a 65 72 6f 2d 6c 65  I from a zero-le
17ce0 6e 67 74 68 0a 20 20 20 20 2a 2a 20 73 6f 75 72  ngth.    ** sour
17cf0 63 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  ce..    */.    i
17d00 66 28 20 28 28 75 6e 69 78 46 69 6c 65 2a 29 69  f( ((unixFile*)i
17d10 64 29 2d 3e 69 6e 4e 6f 72 6d 61 6c 57 72 69 74  d)->inNormalWrit
17d20 65 20 26 26 20 6e 42 79 74 65 3d 3d 30 20 29 7b  e && nByte==0 ){
17d30 0a 20 20 20 20 20 20 28 28 75 6e 69 78 46 69 6c  .      ((unixFil
17d40 65 2a 29 69 64 29 2d 3e 74 72 61 6e 73 43 6e 74  e*)id)->transCnt
17d50 72 43 68 6e 67 20 3d 20 31 3b 0a 20 20 20 20 7d  rChng = 1;.    }
17d60 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 72 65 74  .#endif..    ret
17d70 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
17d80 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 74 65   }.}../*.** Dete
17d90 72 6d 69 6e 65 20 74 68 65 20 63 75 72 72 65 6e  rmine the curren
17da0 74 20 73 69 7a 65 20 6f 66 20 61 20 66 69 6c 65  t size of a file
17db0 20 69 6e 20 62 79 74 65 73 0a 2a 2f 0a 73 74 61   in bytes.*/.sta
17dc0 74 69 63 20 69 6e 74 20 75 6e 69 78 46 69 6c 65  tic int unixFile
17dd0 53 69 7a 65 28 73 71 6c 69 74 65 33 5f 66 69 6c  Size(sqlite3_fil
17de0 65 20 2a 69 64 2c 20 69 36 34 20 2a 70 53 69 7a  e *id, i64 *pSiz
17df0 65 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  e){.  int rc;.  
17e00 73 74 72 75 63 74 20 73 74 61 74 20 62 75 66 3b  struct stat buf;
17e10 0a 20 20 61 73 73 65 72 74 28 20 69 64 20 29 3b  .  assert( id );
17e20 0a 20 20 72 63 20 3d 20 66 73 74 61 74 28 28 28  .  rc = fstat(((
17e30 75 6e 69 78 46 69 6c 65 2a 29 69 64 29 2d 3e 68  unixFile*)id)->h
17e40 2c 20 26 62 75 66 29 3b 0a 20 20 53 69 6d 75 6c  , &buf);.  Simul
17e50 61 74 65 49 4f 45 72 72 6f 72 28 20 72 63 3d 31  ateIOError( rc=1
17e60 20 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 30 20   );.  if( rc!=0 
17e70 29 7b 0a 20 20 20 20 28 28 75 6e 69 78 46 69 6c  ){.    ((unixFil
17e80 65 2a 29 69 64 29 2d 3e 6c 61 73 74 45 72 72 6e  e*)id)->lastErrn
17e90 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 72  o = errno;.    r
17ea0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45  eturn SQLITE_IOE
17eb0 52 52 5f 46 53 54 41 54 3b 0a 20 20 7d 0a 20 20  RR_FSTAT;.  }.  
17ec0 2a 70 53 69 7a 65 20 3d 20 62 75 66 2e 73 74 5f  *pSize = buf.st_
17ed0 73 69 7a 65 3b 0a 0a 20 20 2f 2a 20 57 68 65 6e  size;..  /* When
17ee0 20 6f 70 65 6e 69 6e 67 20 61 20 7a 65 72 6f 2d   opening a zero-
17ef0 73 69 7a 65 20 64 61 74 61 62 61 73 65 2c 20 74  size database, t
17f00 68 65 20 66 69 6e 64 49 6e 6f 64 65 49 6e 66 6f  he findInodeInfo
17f10 28 29 20 70 72 6f 63 65 64 75 72 65 0a 20 20 2a  () procedure.  *
17f20 2a 20 77 72 69 74 65 73 20 61 20 73 69 6e 67 6c  * writes a singl
17f30 65 20 62 79 74 65 20 69 6e 74 6f 20 74 68 61 74  e byte into that
17f40 20 66 69 6c 65 20 69 6e 20 6f 72 64 65 72 20 74   file in order t
17f50 6f 20 77 6f 72 6b 20 61 72 6f 75 6e 64 20 61 20  o work around a 
17f60 62 75 67 0a 20 20 2a 2a 20 69 6e 20 74 68 65 20  bug.  ** in the 
17f70 4f 53 2d 58 20 6d 73 64 6f 73 20 66 69 6c 65 73  OS-X msdos files
17f80 79 73 74 65 6d 2e 20 20 49 6e 20 6f 72 64 65 72  ystem.  In order
17f90 20 74 6f 20 61 76 6f 69 64 20 70 72 6f 62 6c 65   to avoid proble
17fa0 6d 73 20 77 69 74 68 20 75 70 70 65 72 0a 20 20  ms with upper.  
17fb0 2a 2a 20 6c 61 79 65 72 73 2c 20 77 65 20 6e 65  ** layers, we ne
17fc0 65 64 20 74 6f 20 72 65 70 6f 72 74 20 74 68 69  ed to report thi
17fd0 73 20 66 69 6c 65 20 73 69 7a 65 20 61 73 20 7a  s file size as z
17fe0 65 72 6f 20 65 76 65 6e 20 74 68 6f 75 67 68 20  ero even though 
17ff0 69 74 20 69 73 0a 20 20 2a 2a 20 72 65 61 6c 6c  it is.  ** reall
18000 79 20 31 2e 20 20 20 54 69 63 6b 65 74 20 23 33  y 1.   Ticket #3
18010 32 36 30 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  260..  */.  if( 
18020 2a 70 53 69 7a 65 3d 3d 31 20 29 20 2a 70 53 69  *pSize==1 ) *pSi
18030 7a 65 20 3d 20 30 3b 0a 0a 0a 20 20 72 65 74 75  ze = 0;...  retu
18040 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
18050 0a 23 69 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  .#if SQLITE_ENAB
18060 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45  LE_LOCKING_STYLE
18070 20 26 26 20 64 65 66 69 6e 65 64 28 5f 5f 41 50   && defined(__AP
18080 50 4c 45 5f 5f 29 0a 2f 2a 0a 2a 2a 20 48 61 6e  PLE__)./*.** Han
18090 64 6c 65 72 20 66 6f 72 20 70 72 6f 78 79 2d 6c  dler for proxy-l
180a0 6f 63 6b 69 6e 67 20 66 69 6c 65 2d 63 6f 6e 74  ocking file-cont
180b0 72 6f 6c 20 76 65 72 62 73 2e 20 20 44 65 66 69  rol verbs.  Defi
180c0 6e 65 64 20 62 65 6c 6f 77 20 69 6e 20 74 68 65  ned below in the
180d0 0a 2a 2a 20 70 72 6f 78 79 69 6e 67 20 6c 6f 63  .** proxying loc
180e0 6b 69 6e 67 20 64 69 76 69 73 69 6f 6e 2e 0a 2a  king division..*
180f0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72 6f  /.static int pro
18100 78 79 46 69 6c 65 43 6f 6e 74 72 6f 6c 28 73 71  xyFileControl(sq
18110 6c 69 74 65 33 5f 66 69 6c 65 2a 2c 69 6e 74 2c  lite3_file*,int,
18120 76 6f 69 64 2a 29 3b 0a 23 65 6e 64 69 66 0a 0a  void*);.#endif..
18130 0a 2f 2a 0a 2a 2a 20 49 6e 66 6f 72 6d 61 74 69  ./*.** Informati
18140 6f 6e 20 61 6e 64 20 63 6f 6e 74 72 6f 6c 20 6f  on and control o
18150 66 20 61 6e 20 6f 70 65 6e 20 66 69 6c 65 20 68  f an open file h
18160 61 6e 64 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  andle..*/.static
18170 20 69 6e 74 20 75 6e 69 78 46 69 6c 65 43 6f 6e   int unixFileCon
18180 74 72 6f 6c 28 73 71 6c 69 74 65 33 5f 66 69 6c  trol(sqlite3_fil
18190 65 20 2a 69 64 2c 20 69 6e 74 20 6f 70 2c 20 76  e *id, int op, v
181a0 6f 69 64 20 2a 70 41 72 67 29 7b 0a 20 20 73 77  oid *pArg){.  sw
181b0 69 74 63 68 28 20 6f 70 20 29 7b 0a 20 20 20 20  itch( op ){.    
181c0 63 61 73 65 20 53 51 4c 49 54 45 5f 46 43 4e 54  case SQLITE_FCNT
181d0 4c 5f 4c 4f 43 4b 53 54 41 54 45 3a 20 7b 0a 20  L_LOCKSTATE: {. 
181e0 20 20 20 20 20 2a 28 69 6e 74 2a 29 70 41 72 67       *(int*)pArg
181f0 20 3d 20 28 28 75 6e 69 78 46 69 6c 65 2a 29 69   = ((unixFile*)i
18200 64 29 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3b 0a 20  d)->eFileLock;. 
18210 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
18220 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20  TE_OK;.    }.   
18230 20 63 61 73 65 20 53 51 4c 49 54 45 5f 4c 41 53   case SQLITE_LAS
18240 54 5f 45 52 52 4e 4f 3a 20 7b 0a 20 20 20 20 20  T_ERRNO: {.     
18250 20 2a 28 69 6e 74 2a 29 70 41 72 67 20 3d 20 28   *(int*)pArg = (
18260 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 29 2d 3e  (unixFile*)id)->
18270 6c 61 73 74 45 72 72 6e 6f 3b 0a 20 20 20 20 20  lastErrno;.     
18280 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
18290 4b 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66  K;.    }.#ifndef
182a0 20 4e 44 45 42 55 47 0a 20 20 20 20 2f 2a 20 54   NDEBUG.    /* T
182b0 68 65 20 70 61 67 65 72 20 63 61 6c 6c 73 20 74  he pager calls t
182c0 68 69 73 20 6d 65 74 68 6f 64 20 74 6f 20 73 69  his method to si
182d0 67 6e 61 6c 20 74 68 61 74 20 69 74 20 68 61 73  gnal that it has
182e0 20 64 6f 6e 65 0a 20 20 20 20 2a 2a 20 61 20 72   done.    ** a r
182f0 6f 6c 6c 62 61 63 6b 20 61 6e 64 20 74 68 61 74  ollback and that
18300 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73   the database is
18310 20 74 68 65 72 65 66 6f 72 65 20 75 6e 63 68 61   therefore uncha
18320 6e 67 65 64 20 61 6e 64 0a 20 20 20 20 2a 2a 20  nged and.    ** 
18330 69 74 20 68 65 6e 63 65 20 69 74 20 69 73 20 4f  it hence it is O
18340 4b 20 66 6f 72 20 74 68 65 20 74 72 61 6e 73 61  K for the transa
18350 63 74 69 6f 6e 20 63 68 61 6e 67 65 20 63 6f 75  ction change cou
18360 6e 74 65 72 20 74 6f 20 62 65 0a 20 20 20 20 2a  nter to be.    *
18370 2a 20 75 6e 63 68 61 6e 67 65 64 2e 0a 20 20 20  * unchanged..   
18380 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 51 4c   */.    case SQL
18390 49 54 45 5f 46 43 4e 54 4c 5f 44 42 5f 55 4e 43  ITE_FCNTL_DB_UNC
183a0 48 41 4e 47 45 44 3a 20 7b 0a 20 20 20 20 20 20  HANGED: {.      
183b0 28 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 29 2d  ((unixFile*)id)-
183c0 3e 64 62 55 70 64 61 74 65 20 3d 20 30 3b 0a 20  >dbUpdate = 0;. 
183d0 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
183e0 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 23 65 6e  TE_OK;.    }.#en
183f0 64 69 66 0a 23 69 66 20 53 51 4c 49 54 45 5f 45  dif.#if SQLITE_E
18400 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54  NABLE_LOCKING_ST
18410 59 4c 45 20 26 26 20 64 65 66 69 6e 65 64 28 5f  YLE && defined(_
18420 5f 41 50 50 4c 45 5f 5f 29 0a 20 20 20 20 63 61  _APPLE__).    ca
18430 73 65 20 53 51 4c 49 54 45 5f 53 45 54 5f 4c 4f  se SQLITE_SET_LO
18440 43 4b 50 52 4f 58 59 46 49 4c 45 3a 0a 20 20 20  CKPROXYFILE:.   
18450 20 63 61 73 65 20 53 51 4c 49 54 45 5f 47 45 54   case SQLITE_GET
18460 5f 4c 4f 43 4b 50 52 4f 58 59 46 49 4c 45 3a 20  _LOCKPROXYFILE: 
18470 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 70  {.      return p
18480 72 6f 78 79 46 69 6c 65 43 6f 6e 74 72 6f 6c 28  roxyFileControl(
18490 69 64 2c 6f 70 2c 70 41 72 67 29 3b 0a 20 20 20  id,op,pArg);.   
184a0 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c   }.#endif /* SQL
184b0 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49  ITE_ENABLE_LOCKI
184c0 4e 47 5f 53 54 59 4c 45 20 26 26 20 64 65 66 69  NG_STYLE && defi
184d0 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 2a  ned(__APPLE__) *
184e0 2f 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53  /.  }.  return S
184f0 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 7d 0a 0a  QLITE_ERROR;.}..
18500 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
18510 20 73 65 63 74 6f 72 20 73 69 7a 65 20 69 6e 20   sector size in 
18520 62 79 74 65 73 20 6f 66 20 74 68 65 20 75 6e 64  bytes of the und
18530 65 72 6c 79 69 6e 67 20 62 6c 6f 63 6b 20 64 65  erlying block de
18540 76 69 63 65 20 66 6f 72 0a 2a 2a 20 74 68 65 20  vice for.** the 
18550 73 70 65 63 69 66 69 65 64 20 66 69 6c 65 2e 20  specified file. 
18560 54 68 69 73 20 69 73 20 61 6c 6d 6f 73 74 20 61  This is almost a
18570 6c 77 61 79 73 20 35 31 32 20 62 79 74 65 73 2c  lways 512 bytes,
18580 20 62 75 74 20 6d 61 79 20 62 65 0a 2a 2a 20 6c   but may be.** l
18590 61 72 67 65 72 20 66 6f 72 20 73 6f 6d 65 20 64  arger for some d
185a0 65 76 69 63 65 73 2e 0a 2a 2a 0a 2a 2a 20 53 51  evices..**.** SQ
185b0 4c 69 74 65 20 63 6f 64 65 20 61 73 73 75 6d 65  Lite code assume
185c0 73 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  s this function 
185d0 63 61 6e 6e 6f 74 20 66 61 69 6c 2e 20 49 74 20  cannot fail. It 
185e0 61 6c 73 6f 20 61 73 73 75 6d 65 73 20 74 68 61  also assumes tha
185f0 74 0a 2a 2a 20 69 66 20 74 77 6f 20 66 69 6c 65  t.** if two file
18600 73 20 61 72 65 20 63 72 65 61 74 65 64 20 69 6e  s are created in
18610 20 74 68 65 20 73 61 6d 65 20 66 69 6c 65 2d 73   the same file-s
18620 79 73 74 65 6d 20 64 69 72 65 63 74 6f 72 79 20  ystem directory 
18630 28 69 2e 65 2e 0a 2a 2a 20 61 20 64 61 74 61 62  (i.e..** a datab
18640 61 73 65 20 61 6e 64 20 69 74 73 20 6a 6f 75 72  ase and its jour
18650 6e 61 6c 20 66 69 6c 65 29 20 74 68 61 74 20 74  nal file) that t
18660 68 65 20 73 65 63 74 6f 72 20 73 69 7a 65 20 77  he sector size w
18670 69 6c 6c 20 62 65 20 74 68 65 0a 2a 2a 20 73 61  ill be the.** sa
18680 6d 65 20 66 6f 72 20 62 6f 74 68 2e 0a 2a 2f 0a  me for both..*/.
18690 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 53  static int unixS
186a0 65 63 74 6f 72 53 69 7a 65 28 73 71 6c 69 74 65  ectorSize(sqlite
186b0 33 5f 66 69 6c 65 20 2a 4e 6f 74 55 73 65 64 29  3_file *NotUsed)
186c0 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  {.  UNUSED_PARAM
186d0 45 54 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20  ETER(NotUsed);. 
186e0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 44   return SQLITE_D
186f0 45 46 41 55 4c 54 5f 53 45 43 54 4f 52 5f 53 49  EFAULT_SECTOR_SI
18700 5a 45 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  ZE;.}../*.** Ret
18710 75 72 6e 20 74 68 65 20 64 65 76 69 63 65 20 63  urn the device c
18720 68 61 72 61 63 74 65 72 69 73 74 69 63 73 20 66  haracteristics f
18730 6f 72 20 74 68 65 20 66 69 6c 65 2e 20 54 68 69  or the file. Thi
18740 73 20 69 73 20 61 6c 77 61 79 73 20 30 20 66 6f  s is always 0 fo
18750 72 20 75 6e 69 78 2e 0a 2a 2f 0a 73 74 61 74 69  r unix..*/.stati
18760 63 20 69 6e 74 20 75 6e 69 78 44 65 76 69 63 65  c int unixDevice
18770 43 68 61 72 61 63 74 65 72 69 73 74 69 63 73 28  Characteristics(
18780 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 4e 6f  sqlite3_file *No
18790 74 55 73 65 64 29 7b 0a 20 20 55 4e 55 53 45 44  tUsed){.  UNUSED
187a0 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f 74 55 73  _PARAMETER(NotUs
187b0 65 64 29 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b  ed);.  return 0;
187c0 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .}..#ifndef SQLI
187d0 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 0a 0a 2f 2a  TE_OMIT_WAL.../*
187e0 0a 2a 2a 20 4f 62 6a 65 63 74 20 75 73 65 64 20  .** Object used 
187f0 74 6f 20 72 65 70 72 65 73 65 6e 74 20 61 6e 20  to represent an 
18800 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 62 75  shared memory bu
18810 66 66 65 72 2e 20 20 0a 2a 2a 0a 2a 2a 20 57 68  ffer.  .**.** Wh
18820 65 6e 20 6d 75 6c 74 69 70 6c 65 20 74 68 72 65  en multiple thre
18830 61 64 73 20 61 6c 6c 20 72 65 66 65 72 65 6e 63  ads all referenc
18840 65 20 74 68 65 20 73 61 6d 65 20 77 61 6c 2d 69  e the same wal-i
18850 6e 64 65 78 2c 20 65 61 63 68 20 74 68 72 65 61  ndex, each threa
18860 64 0a 2a 2a 20 68 61 73 20 69 74 73 20 6f 77 6e  d.** has its own
18870 20 75 6e 69 78 53 68 6d 20 6f 62 6a 65 63 74 2c   unixShm object,
18880 20 62 75 74 20 74 68 65 79 20 61 6c 6c 20 70 6f   but they all po
18890 69 6e 74 20 74 6f 20 61 20 73 69 6e 67 6c 65 20  int to a single 
188a0 69 6e 73 74 61 6e 63 65 0a 2a 2a 20 6f 66 20 74  instance.** of t
188b0 68 69 73 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20  his unixShmNode 
188c0 6f 62 6a 65 63 74 2e 20 20 49 6e 20 6f 74 68 65  object.  In othe
188d0 72 20 77 6f 72 64 73 2c 20 65 61 63 68 20 77 61  r words, each wa
188e0 6c 2d 69 6e 64 65 78 20 69 73 20 6f 70 65 6e 65  l-index is opene
188f0 64 0a 2a 2a 20 6f 6e 6c 79 20 6f 6e 63 65 20 70  d.** only once p
18900 65 72 20 70 72 6f 63 65 73 73 2e 0a 2a 2a 0a 2a  er process..**.*
18910 2a 20 45 61 63 68 20 75 6e 69 78 53 68 6d 4e 6f  * Each unixShmNo
18920 64 65 20 6f 62 6a 65 63 74 20 69 73 20 63 6f 6e  de object is con
18930 6e 65 63 74 65 64 20 74 6f 20 61 20 73 69 6e 67  nected to a sing
18940 6c 65 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f  le unixInodeInfo
18950 20 6f 62 6a 65 63 74 2e 0a 2a 2a 20 57 65 20 63   object..** We c
18960 6f 75 6c 64 20 63 6f 61 6c 65 73 63 65 20 74 68  ould coalesce th
18970 69 73 20 6f 62 6a 65 63 74 20 69 6e 74 6f 20 75  is object into u
18980 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 2c 20 62 75  nixInodeInfo, bu
18990 74 20 74 68 61 74 20 77 6f 75 6c 64 20 6d 65 61  t that would mea
189a0 6e 0a 2a 2a 20 65 76 65 72 79 20 6f 70 65 6e 20  n.** every open 
189b0 66 69 6c 65 20 74 68 61 74 20 64 6f 65 73 20 6e  file that does n
189c0 6f 74 20 75 73 65 20 73 68 61 72 65 64 20 6d 65  ot use shared me
189d0 6d 6f 72 79 20 28 69 6e 20 6f 74 68 65 72 20 77  mory (in other w
189e0 6f 72 64 73 2c 20 6d 6f 73 74 0a 2a 2a 20 6f 70  ords, most.** op
189f0 65 6e 20 66 69 6c 65 73 29 20 77 6f 75 6c 64 20  en files) would 
18a00 68 61 76 65 20 74 6f 20 63 61 72 72 79 20 61 72  have to carry ar
18a10 6f 75 6e 64 20 74 68 69 73 20 65 78 74 72 61 20  ound this extra 
18a20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 20 20 53 6f  information.  So
18a30 0a 2a 2a 20 74 68 65 20 75 6e 69 78 49 6e 6f 64  .** the unixInod
18a40 65 49 6e 66 6f 20 6f 62 6a 65 63 74 20 63 6f 6e  eInfo object con
18a50 74 61 69 6e 73 20 61 20 70 6f 69 6e 74 65 72 20  tains a pointer 
18a60 74 6f 20 74 68 69 73 20 75 6e 69 78 53 68 6d 4e  to this unixShmN
18a70 6f 64 65 20 6f 62 6a 65 63 74 0a 2a 2a 20 61 6e  ode object.** an
18a80 64 20 74 68 65 20 75 6e 69 78 53 68 6d 4e 6f 64  d the unixShmNod
18a90 65 20 6f 62 6a 65 63 74 20 69 73 20 63 72 65 61  e object is crea
18aa0 74 65 64 20 6f 6e 6c 79 20 77 68 65 6e 20 6e 65  ted only when ne
18ab0 65 64 65 64 2e 0a 2a 2a 0a 2a 2a 20 75 6e 69 78  eded..**.** unix
18ac0 4d 75 74 65 78 48 65 6c 64 28 29 20 6d 75 73 74  MutexHeld() must
18ad0 20 62 65 20 74 72 75 65 20 77 68 65 6e 20 63 72   be true when cr
18ae0 65 61 74 69 6e 67 20 6f 72 20 64 65 73 74 72 6f  eating or destro
18af0 79 69 6e 67 0a 2a 2a 20 74 68 69 73 20 6f 62 6a  ying.** this obj
18b00 65 63 74 20 6f 72 20 77 68 69 6c 65 20 72 65 61  ect or while rea
18b10 64 69 6e 67 20 6f 72 20 77 72 69 74 69 6e 67 20  ding or writing 
18b20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 66 69  the following fi
18b30 65 6c 64 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  elds:.**.**     
18b40 20 6e 52 65 66 0a 2a 2a 0a 2a 2a 20 54 68 65 20   nRef.**.** The 
18b50 66 6f 6c 6c 6f 77 69 6e 67 20 66 69 65 6c 64 73  following fields
18b60 20 61 72 65 20 72 65 61 64 2d 6f 6e 6c 79 20 61   are read-only a
18b70 66 74 65 72 20 74 68 65 20 6f 62 6a 65 63 74 20  fter the object 
18b80 69 73 20 63 72 65 61 74 65 64 3a 0a 2a 2a 20 0a  is created:.** .
18b90 2a 2a 20 20 20 20 20 20 66 69 64 0a 2a 2a 20 20  **      fid.**  
18ba0 20 20 20 20 7a 46 69 6c 65 6e 61 6d 65 0a 2a 2a      zFilename.**
18bb0 0a 2a 2a 20 45 69 74 68 65 72 20 75 6e 69 78 53  .** Either unixS
18bc0 68 6d 4e 6f 64 65 2e 6d 75 74 65 78 20 6d 75 73  hmNode.mutex mus
18bd0 74 20 62 65 20 68 65 6c 64 20 6f 72 20 75 6e 69  t be held or uni
18be0 78 53 68 6d 4e 6f 64 65 2e 6e 52 65 66 3d 3d 30  xShmNode.nRef==0
18bf0 20 61 6e 64 0a 2a 2a 20 75 6e 69 78 4d 75 74 65   and.** unixMute
18c00 78 48 65 6c 64 28 29 20 69 73 20 74 72 75 65 20  xHeld() is true 
18c10 77 68 65 6e 20 72 65 61 64 69 6e 67 20 6f 72 20  when reading or 
18c20 77 72 69 74 69 6e 67 20 61 6e 79 20 6f 74 68 65  writing any othe
18c30 72 20 66 69 65 6c 64 0a 2a 2a 20 69 6e 20 74 68  r field.** in th
18c40 69 73 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2a  is structure..**
18c50 0a 2a 2a 20 54 6f 20 61 76 6f 69 64 20 64 65 61  .** To avoid dea
18c60 64 6c 6f 63 6b 73 2c 20 6d 75 74 65 78 20 61 6e  dlocks, mutex an
18c70 64 20 6d 75 74 65 78 42 75 66 20 61 72 65 20 61  d mutexBuf are a
18c80 6c 77 61 79 73 20 72 65 6c 65 61 73 65 64 20 69  lways released i
18c90 6e 20 74 68 65 0a 2a 2a 20 72 65 76 65 72 73 65  n the.** reverse
18ca0 20 6f 72 64 65 72 20 74 68 61 74 20 74 68 65 79   order that they
18cb0 20 61 72 65 20 61 63 71 75 69 72 65 64 2e 20 20   are acquired.  
18cc0 6d 75 74 65 78 42 75 66 20 69 73 20 61 6c 77 61  mutexBuf is alwa
18cd0 79 73 20 61 63 71 75 69 72 65 64 0a 2a 2a 20 66  ys acquired.** f
18ce0 69 72 73 74 20 61 6e 64 20 72 65 6c 65 61 73 65  irst and release
18cf0 64 20 6c 61 73 74 2e 20 20 54 68 69 73 20 69 6e  d last.  This in
18d00 76 61 72 69 61 6e 74 20 69 73 20 63 68 65 63 6b  variant is check
18d10 20 62 79 20 61 73 73 65 72 74 69 6e 67 0a 2a 2a   by asserting.**
18d20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6e   sqlite3_mutex_n
18d30 6f 74 68 65 6c 64 28 29 20 6f 6e 20 6d 75 74 65  otheld() on mute
18d40 78 20 77 68 65 6e 65 76 65 72 20 6d 75 74 65 78  x whenever mutex
18d50 42 75 66 20 69 73 20 61 63 71 75 69 72 65 64 20  Buf is acquired 
18d60 6f 72 0a 2a 2a 20 72 65 6c 65 61 73 65 64 2e 0a  or.** released..
18d70 2a 2f 0a 73 74 72 75 63 74 20 75 6e 69 78 53 68  */.struct unixSh
18d80 6d 4e 6f 64 65 20 7b 0a 20 20 75 6e 69 78 49 6e  mNode {.  unixIn
18d90 6f 64 65 49 6e 66 6f 20 2a 70 49 6e 6f 64 65 3b  odeInfo *pInode;
18da0 20 20 20 20 20 2f 2a 20 75 6e 69 78 49 6e 6f 64       /* unixInod
18db0 65 49 6e 66 6f 20 74 68 61 74 20 6f 77 6e 73 20  eInfo that owns 
18dc0 74 68 69 73 20 53 48 4d 20 6e 6f 64 65 20 2a 2f  this SHM node */
18dd0 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
18de0 20 2a 6d 75 74 65 78 3b 20 20 20 20 20 20 2f 2a   *mutex;      /*
18df0 20 4d 75 74 65 78 20 74 6f 20 61 63 63 65 73 73   Mutex to access
18e00 20 74 68 69 73 20 6f 62 6a 65 63 74 20 2a 2f 0a   this object */.
18e10 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 20    sqlite3_mutex 
18e20 2a 6d 75 74 65 78 42 75 66 3b 20 20 20 2f 2a 20  *mutexBuf;   /* 
18e30 4d 75 74 65 78 20 74 6f 20 61 63 63 65 73 73 20  Mutex to access 
18e40 7a 42 75 66 5b 5d 20 2a 2f 0a 20 20 63 68 61 72  zBuf[] */.  char
18e50 20 2a 7a 46 69 6c 65 6e 61 6d 65 3b 20 20 20 20   *zFilename;    
18e60 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f         /* Name o
18e70 66 20 74 68 65 20 6d 6d 61 70 70 65 64 20 66 69  f the mmapped fi
18e80 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 68 3b 20 20  le */.  int h;  
18e90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18ea0 20 20 20 2f 2a 20 4f 70 65 6e 20 66 69 6c 65 20     /* Open file 
18eb0 64 65 73 63 72 69 70 74 6f 72 20 2a 2f 0a 20 20  descriptor */.  
18ec0 69 6e 74 20 73 7a 4d 61 70 3b 20 20 20 20 20 20  int szMap;      
18ed0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69             /* Si
18ee0 7a 65 20 6f 66 20 74 68 65 20 6d 61 70 70 69 6e  ze of the mappin
18ef0 67 20 69 6e 74 6f 20 6d 65 6d 6f 72 79 20 2a 2f  g into memory */
18f00 0a 20 20 63 68 61 72 20 2a 70 4d 4d 61 70 42 75  .  char *pMMapBu
18f10 66 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  f;            /*
18f20 20 57 68 65 72 65 20 63 75 72 72 65 6e 74 6c 79   Where currently
18f30 20 6d 6d 61 70 70 65 64 28 29 2e 20 20 4e 55 4c   mmapped().  NUL
18f40 4c 20 69 66 20 75 6e 6d 61 70 70 65 64 20 2a 2f  L if unmapped */
18f50 0a 20 20 69 6e 74 20 6e 52 65 66 3b 20 20 20 20  .  int nRef;    
18f60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
18f70 20 4e 75 6d 62 65 72 20 6f 66 20 75 6e 69 78 53   Number of unixS
18f80 68 6d 20 6f 62 6a 65 63 74 73 20 70 6f 69 6e 74  hm objects point
18f90 69 6e 67 20 74 6f 20 74 68 69 73 20 2a 2f 0a 20  ing to this */. 
18fa0 20 75 6e 69 78 53 68 6d 20 2a 70 46 69 72 73 74   unixShm *pFirst
18fb0 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41  ;           /* A
18fc0 6c 6c 20 75 6e 69 78 53 68 6d 20 6f 62 6a 65 63  ll unixShm objec
18fd0 74 73 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74  ts pointing to t
18fe0 68 69 73 20 2a 2f 0a 23 69 66 64 65 66 20 53 51  his */.#ifdef SQ
18ff0 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 75 38 20  LITE_DEBUG.  u8 
19000 65 78 63 6c 4d 61 73 6b 3b 20 20 20 20 20 20 20  exclMask;       
19010 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20          /* Mask 
19020 6f 66 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63  of exclusive loc
19030 6b 73 20 68 65 6c 64 20 2a 2f 0a 20 20 75 38 20  ks held */.  u8 
19040 73 68 61 72 65 64 4d 61 73 6b 3b 20 20 20 20 20  sharedMask;     
19050 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20          /* Mask 
19060 6f 66 20 73 68 61 72 65 64 20 6c 6f 63 6b 73 20  of shared locks 
19070 68 65 6c 64 20 2a 2f 0a 20 20 75 38 20 6e 65 78  held */.  u8 nex
19080 74 53 68 6d 49 64 3b 20 20 20 20 20 20 20 20 20  tShmId;         
19090 20 20 20 20 20 2f 2a 20 4e 65 78 74 20 61 76 61       /* Next ava
190a0 69 6c 61 62 6c 65 20 75 6e 69 78 53 68 6d 2e 69  ilable unixShm.i
190b0 64 20 76 61 6c 75 65 20 2a 2f 0a 23 65 6e 64 69  d value */.#endi
190c0 66 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 53 74 72 75  f.};../*.** Stru
190d0 63 74 75 72 65 20 75 73 65 64 20 69 6e 74 65 72  cture used inter
190e0 6e 61 6c 6c 79 20 62 79 20 74 68 69 73 20 56 46  nally by this VF
190f0 53 20 74 6f 20 72 65 63 6f 72 64 20 74 68 65 20  S to record the 
19100 73 74 61 74 65 20 6f 66 20 61 6e 0a 2a 2a 20 6f  state of an.** o
19110 70 65 6e 20 73 68 61 72 65 64 20 6d 65 6d 6f 72  pen shared memor
19120 79 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2a  y connection..**
19130 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  .** The followin
19140 67 20 66 69 65 6c 64 73 20 61 72 65 20 69 6e 69  g fields are ini
19150 74 69 61 6c 69 7a 65 64 20 77 68 65 6e 20 74 68  tialized when th
19160 69 73 20 6f 62 6a 65 63 74 20 69 73 20 63 72 65  is object is cre
19170 61 74 65 64 20 61 6e 64 0a 2a 2a 20 61 72 65 20  ated and.** are 
19180 72 65 61 64 2d 6f 6e 6c 79 20 74 68 65 72 65 61  read-only therea
19190 66 74 65 72 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 75  fter:.**.**    u
191a0 6e 69 78 53 68 6d 2e 70 46 69 6c 65 0a 2a 2a 20  nixShm.pFile.** 
191b0 20 20 20 75 6e 69 78 53 68 6d 2e 69 64 0a 2a 2a     unixShm.id.**
191c0 0a 2a 2a 20 41 6c 6c 20 6f 74 68 65 72 20 66 69  .** All other fi
191d0 65 6c 64 73 20 61 72 65 20 72 65 61 64 2f 77 72  elds are read/wr
191e0 69 74 65 2e 20 20 54 68 65 20 75 6e 69 78 53 68  ite.  The unixSh
191f0 6d 2e 70 46 69 6c 65 2d 3e 6d 75 74 65 78 20 6d  m.pFile->mutex m
19200 75 73 74 20 62 65 20 68 65 6c 64 0a 2a 2a 20 77  ust be held.** w
19210 68 69 6c 65 20 61 63 63 65 73 73 69 6e 67 20 61  hile accessing a
19220 6e 79 20 72 65 61 64 2f 77 72 69 74 65 20 66 69  ny read/write fi
19230 65 6c 64 73 2e 0a 2a 2f 0a 73 74 72 75 63 74 20  elds..*/.struct 
19240 75 6e 69 78 53 68 6d 20 7b 0a 20 20 75 6e 69 78  unixShm {.  unix
19250 53 68 6d 4e 6f 64 65 20 2a 70 53 68 6d 4e 6f 64  ShmNode *pShmNod
19260 65 3b 20 20 20 20 20 2f 2a 20 54 68 65 20 75 6e  e;     /* The un
19270 64 65 72 6c 79 69 6e 67 20 75 6e 69 78 53 68 6d  derlying unixShm
19280 4e 6f 64 65 20 6f 62 6a 65 63 74 20 2a 2f 0a 20  Node object */. 
19290 20 75 6e 69 78 53 68 6d 20 2a 70 4e 65 78 74 3b   unixShm *pNext;
192a0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
192b0 65 78 74 20 75 6e 69 78 53 68 6d 20 77 69 74 68  ext unixShm with
192c0 20 74 68 65 20 73 61 6d 65 20 75 6e 69 78 53 68   the same unixSh
192d0 6d 4e 6f 64 65 20 2a 2f 0a 20 20 75 38 20 6c 6f  mNode */.  u8 lo
192e0 63 6b 53 74 61 74 65 3b 20 20 20 20 20 20 20 20  ckState;        
192f0 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74        /* Current
19300 20 6c 6f 63 6b 20 73 74 61 74 65 20 2a 2f 0a 20   lock state */. 
19310 20 75 38 20 68 61 73 4d 75 74 65 78 3b 20 20 20   u8 hasMutex;   
19320 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
19330 72 75 65 20 69 66 20 68 6f 6c 64 69 6e 67 20 74  rue if holding t
19340 68 65 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20 6d  he unixShmNode m
19350 75 74 65 78 20 2a 2f 0a 20 20 75 38 20 68 61 73  utex */.  u8 has
19360 4d 75 74 65 78 42 75 66 3b 20 20 20 20 20 20 20  MutexBuf;       
19370 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
19380 68 6f 6c 64 69 6e 67 20 70 46 69 6c 65 2d 3e 6d  holding pFile->m
19390 75 74 65 78 42 75 66 20 2a 2f 0a 20 20 75 38 20  utexBuf */.  u8 
193a0 73 68 61 72 65 64 4d 61 73 6b 3b 20 20 20 20 20  sharedMask;     
193b0 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20          /* Mask 
193c0 6f 66 20 73 68 61 72 65 64 20 6c 6f 63 6b 73 20  of shared locks 
193d0 68 65 6c 64 20 2a 2f 0a 20 20 75 38 20 65 78 63  held */.  u8 exc
193e0 6c 4d 61 73 6b 3b 20 20 20 20 20 20 20 20 20 20  lMask;          
193f0 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20       /* Mask of 
19400 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 73 20  exclusive locks 
19410 68 65 6c 64 20 2a 2f 0a 23 69 66 64 65 66 20 53  held */.#ifdef S
19420 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 75 38  QLITE_DEBUG.  u8
19430 20 69 64 3b 20 20 20 20 20 20 20 20 20 20 20 20   id;            
19440 20 20 20 20 20 20 20 20 20 2f 2a 20 49 64 20 6f           /* Id o
19450 66 20 74 68 69 73 20 63 6f 6e 6e 65 63 74 69 6f  f this connectio
19460 6e 20 77 69 74 68 69 6e 20 69 74 73 20 75 6e 69  n within its uni
19470 78 53 68 6d 4e 6f 64 65 20 2a 2f 0a 23 65 6e 64  xShmNode */.#end
19480 69 66 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 53 69 7a  if.};../*.** Siz
19490 65 20 69 6e 63 72 65 6d 65 6e 74 20 62 79 20 77  e increment by w
194a0 68 69 63 68 20 73 68 61 72 65 64 20 6d 65 6d 6f  hich shared memo
194b0 72 79 20 67 72 6f 77 73 0a 2a 2f 0a 23 64 65 66  ry grows.*/.#def
194c0 69 6e 65 20 53 51 4c 49 54 45 5f 55 4e 49 58 5f  ine SQLITE_UNIX_
194d0 53 48 4d 5f 49 4e 43 52 20 20 34 30 39 36 0a 0a  SHM_INCR  4096..
194e0 2f 2a 0a 2a 2a 20 43 6f 6e 73 74 61 6e 74 73 20  /*.** Constants 
194f0 75 73 65 64 20 66 6f 72 20 6c 6f 63 6b 69 6e 67  used for locking
19500 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 55 4e 49 58  .*/.#define UNIX
19510 5f 53 48 4d 5f 42 41 53 45 20 20 20 20 20 20 33  _SHM_BASE      3
19520 32 20 20 20 20 20 20 20 20 2f 2a 20 42 79 74 65  2        /* Byte
19530 20 6f 66 66 73 65 74 20 6f 66 20 74 68 65 20 66   offset of the f
19540 69 72 73 74 20 6c 6f 63 6b 20 62 79 74 65 20 2a  irst lock byte *
19550 2f 0a 23 64 65 66 69 6e 65 20 55 4e 49 58 5f 53  /.#define UNIX_S
19560 48 4d 5f 44 4d 53 20 20 20 20 20 20 20 30 78 30  HM_DMS       0x0
19570 31 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20 66  1      /* Mask f
19580 6f 72 20 44 65 61 64 2d 4d 61 6e 2d 53 77 69 74  or Dead-Man-Swit
19590 63 68 20 6c 6f 63 6b 20 2a 2f 0a 23 64 65 66 69  ch lock */.#defi
195a0 6e 65 20 55 4e 49 58 5f 53 48 4d 5f 41 20 20 20  ne UNIX_SHM_A   
195b0 20 20 20 20 20 20 30 78 31 30 20 20 20 20 20 20        0x10      
195c0 2f 2a 20 4d 61 73 6b 20 66 6f 72 20 72 65 67 69  /* Mask for regi
195d0 6f 6e 20 6c 6f 63 6b 73 2e 2e 2e 20 2a 2f 0a 23  on locks... */.#
195e0 64 65 66 69 6e 65 20 55 4e 49 58 5f 53 48 4d 5f  define UNIX_SHM_
195f0 42 20 20 20 20 20 20 20 20 20 30 78 32 30 0a 23  B         0x20.#
19600 64 65 66 69 6e 65 20 55 4e 49 58 5f 53 48 4d 5f  define UNIX_SHM_
19610 43 20 20 20 20 20 20 20 20 20 30 78 34 30 0a 23  C         0x40.#
19620 64 65 66 69 6e 65 20 55 4e 49 58 5f 53 48 4d 5f  define UNIX_SHM_
19630 44 20 20 20 20 20 20 20 20 20 30 78 38 30 0a 0a  D         0x80..
19640 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45  #ifdef SQLITE_DE
19650 42 55 47 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  BUG./*.** Return
19660 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20   a pointer to a 
19670 6e 75 6c 2d 74 65 72 6d 69 6e 61 74 65 64 20 73  nul-terminated s
19680 74 72 69 6e 67 20 69 6e 20 73 74 61 74 69 63 20  tring in static 
19690 6d 65 6d 6f 72 79 20 74 68 61 74 0a 2a 2a 20 64  memory that.** d
196a0 65 73 63 72 69 62 65 73 20 61 20 6c 6f 63 6b 69  escribes a locki
196b0 6e 67 20 6d 61 73 6b 2e 20 20 54 68 65 20 73 74  ng mask.  The st
196c0 72 69 6e 67 20 69 73 20 6f 66 20 74 68 65 20 66  ring is of the f
196d0 6f 72 6d 20 22 4d 53 41 42 43 44 22 20 77 69 74  orm "MSABCD" wit
196e0 68 0a 2a 2a 20 65 61 63 68 20 63 68 61 72 61 63  h.** each charac
196f0 74 65 72 20 72 65 70 72 65 73 65 6e 74 69 6e 67  ter representing
19700 20 61 20 6c 6f 63 6b 2e 20 20 22 4d 22 20 66 6f   a lock.  "M" fo
19710 72 20 4d 55 54 45 58 2c 20 22 53 22 20 66 6f 72  r MUTEX, "S" for
19720 20 44 4d 53 2c 20 0a 2a 2a 20 61 6e 64 20 22 41   DMS, .** and "A
19730 22 20 74 68 72 6f 75 67 68 20 22 44 22 20 66 6f  " through "D" fo
19740 72 20 74 68 65 20 72 65 67 69 6f 6e 20 6c 6f 63  r the region loc
19750 6b 73 2e 20 20 49 66 20 61 20 6c 6f 63 6b 20 69  ks.  If a lock i
19760 73 20 68 65 6c 64 2c 20 74 68 65 0a 2a 2a 20 6c  s held, the.** l
19770 65 74 74 65 72 20 69 73 20 73 68 6f 77 6e 2e 20  etter is shown. 
19780 20 49 66 20 74 68 65 20 6c 6f 63 6b 20 69 73 20   If the lock is 
19790 6e 6f 74 20 68 65 6c 64 2c 20 74 68 65 20 6c 65  not held, the le
197a0 74 74 65 72 20 69 73 20 63 6f 6e 76 65 72 74 65  tter is converte
197b0 64 0a 2a 2a 20 74 6f 20 22 2e 22 2e 0a 2a 2a 0a  d.** to "."..**.
197c0 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
197d0 69 73 20 66 6f 72 20 64 65 62 75 67 67 69 6e 67  is for debugging
197e0 20 70 75 72 70 6f 73 65 73 20 6f 6e 6c 79 20 61   purposes only a
197f0 6e 64 20 64 6f 65 73 20 6e 6f 74 20 61 70 70 65  nd does not appe
19800 61 72 0a 2a 2a 20 69 6e 20 61 20 70 72 6f 64 75  ar.** in a produ
19810 63 74 69 6f 6e 20 62 75 69 6c 64 2e 0a 2a 2f 0a  ction build..*/.
19820 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61  static const cha
19830 72 20 2a 75 6e 69 78 53 68 6d 4c 6f 63 6b 53 74  r *unixShmLockSt
19840 72 69 6e 67 28 75 38 20 6d 61 73 6b 29 7b 0a 20  ring(u8 mask){. 
19850 20 73 74 61 74 69 63 20 63 68 61 72 20 7a 42 75   static char zBu
19860 66 5b 34 38 5d 3b 0a 20 20 73 74 61 74 69 63 20  f[48];.  static 
19870 69 6e 74 20 69 42 75 66 20 3d 20 30 3b 0a 20 20  int iBuf = 0;.  
19880 63 68 61 72 20 2a 7a 3b 0a 0a 20 20 7a 20 3d 20  char *z;..  z = 
19890 26 7a 42 75 66 5b 69 42 75 66 5d 3b 0a 20 20 69  &zBuf[iBuf];.  i
198a0 42 75 66 20 2b 3d 20 38 3b 0a 20 20 69 66 28 20  Buf += 8;.  if( 
198b0 69 42 75 66 3e 3d 73 69 7a 65 6f 66 28 7a 42 75  iBuf>=sizeof(zBu
198c0 66 29 20 29 20 69 42 75 66 20 3d 20 30 3b 0a 0a  f) ) iBuf = 0;..
198d0 20 20 7a 5b 30 5d 20 3d 20 28 6d 61 73 6b 20 26    z[0] = (mask &
198e0 20 55 4e 49 58 5f 53 48 4d 5f 44 4d 53 29 20 20   UNIX_SHM_DMS)  
198f0 20 3f 20 27 53 27 20 3a 20 27 2e 27 3b 0a 20 20   ? 'S' : '.';.  
19900 7a 5b 31 5d 20 3d 20 28 6d 61 73 6b 20 26 20 55  z[1] = (mask & U
19910 4e 49 58 5f 53 48 4d 5f 41 29 20 20 20 20 20 3f  NIX_SHM_A)     ?
19920 20 27 41 27 20 3a 20 27 2e 27 3b 0a 20 20 7a 5b   'A' : '.';.  z[
19930 32 5d 20 3d 20 28 6d 61 73 6b 20 26 20 55 4e 49  2] = (mask & UNI
19940 58 5f 53 48 4d 5f 42 29 20 20 20 20 20 3f 20 27  X_SHM_B)     ? '
19950 42 27 20 3a 20 27 2e 27 3b 0a 20 20 7a 5b 33 5d  B' : '.';.  z[3]
19960 20 3d 20 28 6d 61 73 6b 20 26 20 55 4e 49 58 5f   = (mask & UNIX_
19970 53 48 4d 5f 43 29 20 20 20 20 20 3f 20 27 43 27  SHM_C)     ? 'C'
19980 20 3a 20 27 2e 27 3b 0a 20 20 7a 5b 34 5d 20 3d   : '.';.  z[4] =
19990 20 28 6d 61 73 6b 20 26 20 55 4e 49 58 5f 53 48   (mask & UNIX_SH
199a0 4d 5f 44 29 20 20 20 20 20 3f 20 27 44 27 20 3a  M_D)     ? 'D' :
199b0 20 27 2e 27 3b 0a 20 20 7a 5b 35 5d 20 3d 20 30   '.';.  z[5] = 0
199c0 3b 0a 20 20 72 65 74 75 72 6e 20 7a 3b 0a 7d 0a  ;.  return z;.}.
199d0 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
199e0 5f 44 45 42 55 47 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  _DEBUG */../*.**
199f0 20 41 70 70 6c 79 20 70 6f 73 69 78 20 61 64 76   Apply posix adv
19a00 69 73 6f 72 79 20 6c 6f 63 6b 73 20 66 6f 72 20  isory locks for 
19a10 61 6c 6c 20 62 79 74 65 73 20 69 64 65 6e 74 69  all bytes identi
19a20 66 69 65 64 20 69 6e 20 6c 6f 63 6b 4d 61 73 6b  fied in lockMask
19a30 2e 0a 2a 2a 0a 2a 2a 20 6c 6f 63 6b 4d 61 73 6b  ..**.** lockMask
19a40 20 6d 69 67 68 74 20 63 6f 6e 74 61 69 6e 20 6d   might contain m
19a50 75 6c 74 69 70 6c 65 20 62 69 74 73 20 62 75 74  ultiple bits but
19a60 20 61 6c 6c 20 62 69 74 73 20 61 72 65 20 67 75   all bits are gu
19a70 61 72 61 6e 74 65 65 64 0a 2a 2a 20 74 6f 20 62  aranteed.** to b
19a80 65 20 63 6f 6e 74 69 67 75 6f 75 73 2e 0a 2a 2a  e contiguous..**
19a90 0a 2a 2a 20 4c 6f 63 6b 73 20 62 6c 6f 63 6b 20  .** Locks block 
19aa0 69 66 20 74 68 65 20 6d 61 73 6b 20 69 73 20 65  if the mask is e
19ab0 78 61 63 74 6c 79 20 55 4e 49 58 5f 53 48 4d 5f  xactly UNIX_SHM_
19ac0 43 20 61 6e 64 20 61 72 65 20 6e 6f 6e 2d 62 6c  C and are non-bl
19ad0 6f 63 6b 69 6e 67 0a 2a 2a 20 6f 74 68 65 72 77  ocking.** otherw
19ae0 69 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ise..*/.static i
19af0 6e 74 20 75 6e 69 78 53 68 6d 53 79 73 74 65 6d  nt unixShmSystem
19b00 4c 6f 63 6b 28 0a 20 20 75 6e 69 78 53 68 6d 4e  Lock(.  unixShmN
19b10 6f 64 65 20 2a 70 53 68 6d 4e 6f 64 65 2c 20 2f  ode *pShmNode, /
19b20 2a 20 41 70 70 6c 79 20 6c 6f 63 6b 73 20 74 6f  * Apply locks to
19b30 20 74 68 69 73 20 6f 70 65 6e 20 73 68 61 72 65   this open share
19b40 64 2d 6d 65 6d 6f 72 79 20 73 65 67 6d 65 6e 74  d-memory segment
19b50 20 2a 2f 0a 20 20 69 6e 74 20 6c 6f 63 6b 54 79   */.  int lockTy
19b60 70 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  pe,          /* 
19b70 46 5f 55 4e 4c 43 4b 2c 20 46 5f 52 44 4c 43 4b  F_UNLCK, F_RDLCK
19b80 2c 20 6f 72 20 46 5f 57 52 4c 43 4b 20 2a 2f 0a  , or F_WRLCK */.
19b90 20 20 75 38 20 6c 6f 63 6b 4d 61 73 6b 20 20 20    u8 lockMask   
19ba0 20 20 20 20 20 20 20 20 20 2f 2a 20 57 68 69 63           /* Whic
19bb0 68 20 62 79 74 65 73 20 74 6f 20 6c 6f 63 6b 20  h bytes to lock 
19bc0 6f 72 20 75 6e 6c 6f 63 6b 20 2a 2f 0a 29 7b 0a  or unlock */.){.
19bd0 20 20 73 74 72 75 63 74 20 66 6c 6f 63 6b 20 66    struct flock f
19be0 3b 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70  ;       /* The p
19bf0 6f 73 69 78 20 61 64 76 69 73 6f 72 79 20 6c 6f  osix advisory lo
19c00 63 6b 69 6e 67 20 73 74 72 75 63 74 75 72 65 20  cking structure 
19c10 2a 2f 0a 20 20 69 6e 74 20 6c 6f 63 6b 4f 70 3b  */.  int lockOp;
19c20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
19c30 65 20 6f 70 63 6f 64 65 20 66 6f 72 20 66 63 6e  e opcode for fcn
19c40 74 6c 28 29 20 2a 2f 0a 20 20 69 6e 74 20 69 3b  tl() */.  int i;
19c50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19c60 2f 2a 20 4f 66 66 73 65 74 20 69 6e 74 6f 20 74  /* Offset into t
19c70 68 65 20 6c 6f 63 6b 69 6e 67 20 62 79 74 65 20  he locking byte 
19c80 72 61 6e 67 65 20 2a 2f 0a 20 20 69 6e 74 20 72  range */.  int r
19c90 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
19ca0 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64 65 20   /* Result code 
19cb0 66 6f 72 6d 20 66 63 6e 74 6c 28 29 20 2a 2f 0a  form fcntl() */.
19cc0 20 20 75 38 20 6d 61 73 6b 3b 20 20 20 20 20 20    u8 mask;      
19cd0 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20          /* Mask 
19ce0 6f 66 20 62 69 74 73 20 69 6e 20 6c 6f 63 6b 4d  of bits in lockM
19cf0 61 73 6b 20 2a 2f 0a 0a 20 20 2f 2a 20 41 63 63  ask */..  /* Acc
19d00 65 73 73 20 74 6f 20 74 68 65 20 75 6e 69 78 53  ess to the unixS
19d10 68 6d 4e 6f 64 65 20 6f 62 6a 65 63 74 20 69 73  hmNode object is
19d20 20 73 65 72 69 61 6c 69 7a 65 64 20 62 79 20 74   serialized by t
19d30 68 65 20 63 61 6c 6c 65 72 20 2a 2f 0a 20 20 61  he caller */.  a
19d40 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
19d50 75 74 65 78 5f 68 65 6c 64 28 70 53 68 6d 4e 6f  utex_held(pShmNo
19d60 64 65 2d 3e 6d 75 74 65 78 29 20 7c 7c 20 70 53  de->mutex) || pS
19d70 68 6d 4e 6f 64 65 2d 3e 6e 52 65 66 3d 3d 30 20  hmNode->nRef==0 
19d80 29 3b 0a 0a 20 20 2f 2a 20 49 6e 69 74 69 61 6c  );..  /* Initial
19d90 69 7a 65 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20  ize the locking 
19da0 70 61 72 61 6d 65 74 65 72 73 20 2a 2f 0a 20 20  parameters */.  
19db0 6d 65 6d 73 65 74 28 26 66 2c 20 30 2c 20 73 69  memset(&f, 0, si
19dc0 7a 65 6f 66 28 66 29 29 3b 0a 20 20 66 2e 6c 5f  zeof(f));.  f.l_
19dd0 74 79 70 65 20 3d 20 6c 6f 63 6b 54 79 70 65 3b  type = lockType;
19de0 0a 20 20 66 2e 6c 5f 77 68 65 6e 63 65 20 3d 20  .  f.l_whence = 
19df0 53 45 45 4b 5f 53 45 54 3b 0a 20 20 69 66 28 20  SEEK_SET;.  if( 
19e00 6c 6f 63 6b 4d 61 73 6b 3d 3d 55 4e 49 58 5f 53  lockMask==UNIX_S
19e10 48 4d 5f 43 20 26 26 20 6c 6f 63 6b 54 79 70 65  HM_C && lockType
19e20 21 3d 46 5f 55 4e 4c 43 4b 20 29 7b 0a 20 20 20  !=F_UNLCK ){.   
19e30 20 6c 6f 63 6b 4f 70 20 3d 20 46 5f 53 45 54 4c   lockOp = F_SETL
19e40 4b 57 3b 0a 20 20 20 20 4f 53 54 52 41 43 45 28  KW;.    OSTRACE(
19e50 28 22 53 48 4d 2d 4c 4f 43 4b 20 72 65 71 75 65  ("SHM-LOCK reque
19e60 73 74 69 6e 67 20 62 6c 6f 63 6b 69 6e 67 20 6c  sting blocking l
19e70 6f 63 6b 5c 6e 22 29 29 3b 0a 20 20 7d 65 6c 73  ock\n"));.  }els
19e80 65 7b 0a 20 20 20 20 6c 6f 63 6b 4f 70 20 3d 20  e{.    lockOp = 
19e90 46 5f 53 45 54 4c 4b 3b 0a 20 20 7d 0a 0a 20 20  F_SETLK;.  }..  
19ea0 2f 2a 20 46 69 6e 64 20 74 68 65 20 66 69 72 73  /* Find the firs
19eb0 74 20 62 69 74 20 69 6e 20 6c 6f 63 6b 4d 61 73  t bit in lockMas
19ec0 6b 20 74 68 61 74 20 69 73 20 73 65 74 20 2a 2f  k that is set */
19ed0 0a 20 20 66 6f 72 28 69 3d 30 2c 20 6d 61 73 6b  .  for(i=0, mask
19ee0 3d 30 78 30 31 3b 20 6d 61 73 6b 21 3d 30 20 26  =0x01; mask!=0 &
19ef0 26 20 28 6c 6f 63 6b 4d 61 73 6b 26 6d 61 73 6b  & (lockMask&mask
19f00 29 3d 3d 30 3b 20 6d 61 73 6b 20 3c 3c 3d 20 31  )==0; mask <<= 1
19f10 2c 20 69 2b 2b 29 7b 7d 0a 20 20 61 73 73 65 72  , i++){}.  asser
19f20 74 28 20 6d 61 73 6b 21 3d 30 20 29 3b 0a 20 20  t( mask!=0 );.  
19f30 66 2e 6c 5f 73 74 61 72 74 20 3d 20 69 2b 55 4e  f.l_start = i+UN
19f40 49 58 5f 53 48 4d 5f 42 41 53 45 3b 0a 20 20 66  IX_SHM_BASE;.  f
19f50 2e 6c 5f 6c 65 6e 20 3d 20 31 3b 0a 0a 20 20 2f  .l_len = 1;..  /
19f60 2a 20 45 78 74 65 6e 64 20 74 68 65 20 6c 6f 63  * Extend the loc
19f70 6b 69 6e 67 20 72 61 6e 67 65 20 66 6f 72 20 65  king range for e
19f80 61 63 68 20 61 64 64 69 74 69 6f 6e 61 6c 20 62  ach additional b
19f90 69 74 20 74 68 61 74 20 69 73 20 73 65 74 20 2a  it that is set *
19fa0 2f 0a 20 20 6d 61 73 6b 20 3c 3c 3d 20 31 3b 0a  /.  mask <<= 1;.
19fb0 20 20 77 68 69 6c 65 28 20 6d 61 73 6b 21 3d 30    while( mask!=0
19fc0 20 26 26 20 28 6c 6f 63 6b 4d 61 73 6b 20 26 20   && (lockMask & 
19fd0 6d 61 73 6b 29 21 3d 30 20 29 7b 0a 20 20 20 20  mask)!=0 ){.    
19fe0 66 2e 6c 5f 6c 65 6e 2b 2b 3b 0a 20 20 20 20 6d  f.l_len++;.    m
19ff0 61 73 6b 20 3c 3c 3d 20 31 3b 0a 20 20 7d 0a 0a  ask <<= 1;.  }..
1a000 20 20 2f 2a 20 56 65 72 69 66 79 20 74 68 61 74    /* Verify that
1a010 20 61 6c 6c 20 62 69 74 73 20 73 65 74 20 69 6e   all bits set in
1a020 20 6c 6f 63 6b 4d 61 73 6b 20 61 72 65 20 63 6f   lockMask are co
1a030 6e 74 69 67 75 6f 75 73 20 2a 2f 0a 20 20 61 73  ntiguous */.  as
1a040 73 65 72 74 28 20 6d 61 73 6b 3d 3d 30 20 7c 7c  sert( mask==0 ||
1a050 20 28 6c 6f 63 6b 4d 61 73 6b 20 26 20 7e 28 6d   (lockMask & ~(m
1a060 61 73 6b 20 7c 20 28 6d 61 73 6b 2d 31 29 29 29  ask | (mask-1)))
1a070 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 41 63 71  ==0 );..  /* Acq
1a080 75 69 72 65 20 74 68 65 20 73 79 73 74 65 6d 2d  uire the system-
1a090 6c 65 76 65 6c 20 6c 6f 63 6b 20 2a 2f 0a 20 20  level lock */.  
1a0a0 72 63 20 3d 20 66 63 6e 74 6c 28 70 53 68 6d 4e  rc = fcntl(pShmN
1a0b0 6f 64 65 2d 3e 68 2c 20 6c 6f 63 6b 4f 70 2c 20  ode->h, lockOp, 
1a0c0 26 66 29 3b 0a 20 20 72 63 20 3d 20 28 72 63 21  &f);.  rc = (rc!
1a0d0 3d 28 2d 31 29 29 20 3f 20 53 51 4c 49 54 45 5f  =(-1)) ? SQLITE_
1a0e0 4f 4b 20 3a 20 53 51 4c 49 54 45 5f 42 55 53 59  OK : SQLITE_BUSY
1a0f0 3b 0a 0a 20 20 2f 2a 20 55 70 64 61 74 65 20 74  ;..  /* Update t
1a100 68 65 20 67 6c 6f 62 61 6c 20 6c 6f 63 6b 20 73  he global lock s
1a110 74 61 74 65 20 61 6e 64 20 64 6f 20 64 65 62 75  tate and do debu
1a120 67 20 74 72 61 63 69 6e 67 20 2a 2f 0a 23 69 66  g tracing */.#if
1a130 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  def SQLITE_DEBUG
1a140 0a 20 20 4f 53 54 52 41 43 45 28 28 22 53 48 4d  .  OSTRACE(("SHM
1a150 2d 4c 4f 43 4b 20 22 29 29 3b 0a 20 20 69 66 28  -LOCK "));.  if(
1a160 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
1a170 7b 0a 20 20 20 20 69 66 28 20 6c 6f 63 6b 54 79  {.    if( lockTy
1a180 70 65 3d 3d 46 5f 55 4e 4c 43 4b 20 29 7b 0a 20  pe==F_UNLCK ){. 
1a190 20 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 75       OSTRACE(("u
1a1a0 6e 6c 6f 63 6b 20 6f 6b 22 29 29 3b 0a 20 20 20  nlock ok"));.   
1a1b0 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 65 78 63     pShmNode->exc
1a1c0 6c 4d 61 73 6b 20 26 3d 20 7e 6c 6f 63 6b 4d 61  lMask &= ~lockMa
1a1d0 73 6b 3b 0a 20 20 20 20 20 20 70 53 68 6d 4e 6f  sk;.      pShmNo
1a1e0 64 65 2d 3e 73 68 61 72 65 64 4d 61 73 6b 20 26  de->sharedMask &
1a1f0 3d 20 7e 6c 6f 63 6b 4d 61 73 6b 3b 0a 20 20 20  = ~lockMask;.   
1a200 20 7d 65 6c 73 65 20 69 66 28 20 6c 6f 63 6b 54   }else if( lockT
1a210 79 70 65 3d 3d 46 5f 52 44 4c 43 4b 20 29 7b 0a  ype==F_RDLCK ){.
1a220 20 20 20 20 20 20 4f 53 54 52 41 43 45 28 28 22        OSTRACE(("
1a230 72 65 61 64 2d 6c 6f 63 6b 20 6f 6b 22 29 29 3b  read-lock ok"));
1a240 0a 20 20 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d  .      pShmNode-
1a250 3e 65 78 63 6c 4d 61 73 6b 20 26 3d 20 7e 6c 6f  >exclMask &= ~lo
1a260 63 6b 4d 61 73 6b 3b 0a 20 20 20 20 20 20 70 53  ckMask;.      pS
1a270 68 6d 4e 6f 64 65 2d 3e 73 68 61 72 65 64 4d 61  hmNode->sharedMa
1a280 73 6b 20 7c 3d 20 6c 6f 63 6b 4d 61 73 6b 3b 0a  sk |= lockMask;.
1a290 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1a2a0 20 61 73 73 65 72 74 28 20 6c 6f 63 6b 54 79 70   assert( lockTyp
1a2b0 65 3d 3d 46 5f 57 52 4c 43 4b 20 29 3b 0a 20 20  e==F_WRLCK );.  
1a2c0 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 77 72      OSTRACE(("wr
1a2d0 69 74 65 2d 6c 6f 63 6b 20 6f 6b 22 29 29 3b 0a  ite-lock ok"));.
1a2e0 20 20 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e        pShmNode->
1a2f0 65 78 63 6c 4d 61 73 6b 20 7c 3d 20 6c 6f 63 6b  exclMask |= lock
1a300 4d 61 73 6b 3b 0a 20 20 20 20 20 20 70 53 68 6d  Mask;.      pShm
1a310 4e 6f 64 65 2d 3e 73 68 61 72 65 64 4d 61 73 6b  Node->sharedMask
1a320 20 26 3d 20 7e 6c 6f 63 6b 4d 61 73 6b 3b 0a 20   &= ~lockMask;. 
1a330 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20     }.  }else{.  
1a340 20 20 69 66 28 20 6c 6f 63 6b 54 79 70 65 3d 3d    if( lockType==
1a350 46 5f 55 4e 4c 43 4b 20 29 7b 0a 20 20 20 20 20  F_UNLCK ){.     
1a360 20 4f 53 54 52 41 43 45 28 28 22 75 6e 6c 6f 63   OSTRACE(("unloc
1a370 6b 20 66 61 69 6c 65 64 22 29 29 3b 0a 20 20 20  k failed"));.   
1a380 20 7d 65 6c 73 65 20 69 66 28 20 6c 6f 63 6b 54   }else if( lockT
1a390 79 70 65 3d 3d 46 5f 52 44 4c 43 4b 20 29 7b 0a  ype==F_RDLCK ){.
1a3a0 20 20 20 20 20 20 4f 53 54 52 41 43 45 28 28 22        OSTRACE(("
1a3b0 72 65 61 64 2d 6c 6f 63 6b 20 66 61 69 6c 65 64  read-lock failed
1a3c0 22 29 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  "));.    }else{.
1a3d0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6c 6f        assert( lo
1a3e0 63 6b 54 79 70 65 3d 3d 46 5f 57 52 4c 43 4b 20  ckType==F_WRLCK 
1a3f0 29 3b 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45  );.      OSTRACE
1a400 28 28 22 77 72 69 74 65 2d 6c 6f 63 6b 20 66 61  (("write-lock fa
1a410 69 6c 65 64 22 29 29 3b 0a 20 20 20 20 7d 0a 20  iled"));.    }. 
1a420 20 7d 0a 20 20 4f 53 54 52 41 43 45 28 28 22 20   }.  OSTRACE((" 
1a430 2d 20 63 68 61 6e 67 65 20 72 65 71 75 65 73 74  - change request
1a440 65 64 20 25 73 20 2d 20 61 66 74 65 72 77 61 72  ed %s - afterwar
1a450 64 73 20 25 73 3a 25 73 5c 6e 22 2c 0a 20 20 20  ds %s:%s\n",.   
1a460 20 20 20 20 20 20 20 20 75 6e 69 78 53 68 6d 4c          unixShmL
1a470 6f 63 6b 53 74 72 69 6e 67 28 6c 6f 63 6b 4d 61  ockString(lockMa
1a480 73 6b 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20  sk),.           
1a490 75 6e 69 78 53 68 6d 4c 6f 63 6b 53 74 72 69 6e  unixShmLockStrin
1a4a0 67 28 70 53 68 6d 4e 6f 64 65 2d 3e 73 68 61 72  g(pShmNode->shar
1a4b0 65 64 4d 61 73 6b 29 2c 0a 20 20 20 20 20 20 20  edMask),.       
1a4c0 20 20 20 20 75 6e 69 78 53 68 6d 4c 6f 63 6b 53      unixShmLockS
1a4d0 74 72 69 6e 67 28 70 53 68 6d 4e 6f 64 65 2d 3e  tring(pShmNode->
1a4e0 65 78 63 6c 4d 61 73 6b 29 29 29 3b 0a 23 65 6e  exclMask)));.#en
1a4f0 64 69 66 0a 0a 20 20 72 65 74 75 72 6e 20 72 63  dif..  return rc
1a500 3b 20 20 20 20 20 20 20 20 0a 7d 0a 0a 2f 2a 0a  ;        .}../*.
1a510 2a 2a 20 46 6f 72 20 63 6f 6e 6e 65 63 74 69 6f  ** For connectio
1a520 6e 20 70 2c 20 75 6e 6c 6f 63 6b 20 61 6c 6c 20  n p, unlock all 
1a530 6f 66 20 74 68 65 20 6c 6f 63 6b 73 20 69 64 65  of the locks ide
1a540 6e 74 69 66 69 65 64 20 62 79 20 74 68 65 20 75  ntified by the u
1a550 6e 6c 6f 63 6b 4d 61 73 6b 0a 2a 2a 20 70 61 72  nlockMask.** par
1a560 61 6d 65 74 65 72 2e 0a 2a 2f 0a 73 74 61 74 69  ameter..*/.stati
1a570 63 20 69 6e 74 20 75 6e 69 78 53 68 6d 55 6e 6c  c int unixShmUnl
1a580 6f 63 6b 28 0a 20 20 75 6e 69 78 53 68 6d 4e 6f  ock(.  unixShmNo
1a590 64 65 20 2a 70 53 68 6d 4e 6f 64 65 2c 20 20 20  de *pShmNode,   
1a5a0 2f 2a 20 54 68 65 20 75 6e 64 65 72 6c 79 69 6e  /* The underlyin
1a5b0 67 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20  g shared-memory 
1a5c0 66 69 6c 65 20 2a 2f 0a 20 20 75 6e 69 78 53 68  file */.  unixSh
1a5d0 6d 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20  m *p,           
1a5e0 20 20 20 2f 2a 20 54 68 65 20 63 6f 6e 6e 65 63     /* The connec
1a5f0 74 69 6f 6e 20 74 6f 20 62 65 20 75 6e 6c 6f 63  tion to be unloc
1a600 6b 65 64 20 2a 2f 0a 20 20 75 38 20 75 6e 6c 6f  ked */.  u8 unlo
1a610 63 6b 4d 61 73 6b 20 20 20 20 20 20 20 20 20 20  ckMask          
1a620 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 6c 6f 63    /* Mask of loc
1a630 6b 73 20 74 6f 20 62 65 20 75 6e 6c 6f 63 6b 65  ks to be unlocke
1a640 64 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63  d */.){.  int rc
1a650 3b 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74  ;      /* Result
1a660 20 63 6f 64 65 20 2a 2f 0a 20 20 75 6e 69 78 53   code */.  unixS
1a670 68 6d 20 2a 70 58 3b 20 2f 2a 20 46 6f 72 20 6c  hm *pX; /* For l
1a680 6f 6f 70 69 6e 67 20 6f 76 65 72 20 61 6c 6c 20  ooping over all 
1a690 73 69 62 6c 69 6e 67 20 63 6f 6e 6e 65 63 74 69  sibling connecti
1a6a0 6f 6e 73 20 2a 2f 0a 20 20 75 38 20 61 6c 6c 4d  ons */.  u8 allM
1a6b0 61 73 6b 3b 20 20 2f 2a 20 55 6e 69 6f 6e 20 6f  ask;  /* Union o
1a6c0 66 20 6c 6f 63 6b 73 20 68 65 6c 64 20 62 79 20  f locks held by 
1a6d0 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 6f 74 68 65  connections othe
1a6e0 72 20 74 68 61 6e 20 22 70 22 20 2a 2f 0a 0a 20  r than "p" */.. 
1a6f0 20 2f 2a 20 41 63 63 65 73 73 20 74 6f 20 74 68   /* Access to th
1a700 65 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20 6f 62  e unixShmNode ob
1a710 6a 65 63 74 20 69 73 20 73 65 72 69 61 6c 69 7a  ject is serializ
1a720 65 64 20 62 79 20 74 68 65 20 63 61 6c 6c 65 72  ed by the caller
1a730 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 73 71   */.  assert( sq
1a740 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
1a750 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78  (pShmNode->mutex
1a760 29 20 29 3b 0a 0a 20 20 2f 2a 20 43 6f 6d 70 75  ) );..  /* Compu
1a770 74 65 20 6c 6f 63 6b 73 20 68 65 6c 64 20 62 79  te locks held by
1a780 20 73 69 62 6c 69 6e 67 20 63 6f 6e 6e 65 63 74   sibling connect
1a790 69 6f 6e 73 20 2a 2f 0a 20 20 61 6c 6c 4d 61 73  ions */.  allMas
1a7a0 6b 20 3d 20 30 3b 0a 20 20 66 6f 72 28 70 58 3d  k = 0;.  for(pX=
1a7b0 70 53 68 6d 4e 6f 64 65 2d 3e 70 46 69 72 73 74  pShmNode->pFirst
1a7c0 3b 20 70 58 3b 20 70 58 3d 70 58 2d 3e 70 4e 65  ; pX; pX=pX->pNe
1a7d0 78 74 29 7b 0a 20 20 20 20 69 66 28 20 70 58 3d  xt){.    if( pX=
1a7e0 3d 70 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  =p ) continue;. 
1a7f0 20 20 20 61 73 73 65 72 74 28 20 28 70 58 2d 3e     assert( (pX->
1a800 65 78 63 6c 4d 61 73 6b 20 26 20 28 70 2d 3e 65  exclMask & (p->e
1a810 78 63 6c 4d 61 73 6b 7c 70 2d 3e 73 68 61 72 65  xclMask|p->share
1a820 64 4d 61 73 6b 29 29 3d 3d 30 20 29 3b 0a 20 20  dMask))==0 );.  
1a830 20 20 61 6c 6c 4d 61 73 6b 20 7c 3d 20 70 58 2d    allMask |= pX-
1a840 3e 73 68 61 72 65 64 4d 61 73 6b 3b 0a 20 20 7d  >sharedMask;.  }
1a850 0a 0a 20 20 2f 2a 20 55 6e 6c 6f 63 6b 20 74 68  ..  /* Unlock th
1a860 65 20 73 79 73 74 65 6d 2d 6c 65 76 65 6c 20 6c  e system-level l
1a870 6f 63 6b 73 20 2a 2f 0a 20 20 69 66 28 20 28 75  ocks */.  if( (u
1a880 6e 6c 6f 63 6b 4d 61 73 6b 20 26 20 61 6c 6c 4d  nlockMask & allM
1a890 61 73 6b 29 21 3d 75 6e 6c 6f 63 6b 4d 61 73 6b  ask)!=unlockMask
1a8a0 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 75 6e 69   ){.    rc = uni
1a8b0 78 53 68 6d 53 79 73 74 65 6d 4c 6f 63 6b 28 70  xShmSystemLock(p
1a8c0 53 68 6d 4e 6f 64 65 2c 20 46 5f 55 4e 4c 43 4b  ShmNode, F_UNLCK
1a8d0 2c 20 75 6e 6c 6f 63 6b 4d 61 73 6b 20 26 20 7e  , unlockMask & ~
1a8e0 61 6c 6c 4d 61 73 6b 29 3b 0a 20 20 7d 65 6c 73  allMask);.  }els
1a8f0 65 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  e{.    rc = SQLI
1a900 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  TE_OK;.  }..  /*
1a910 20 55 6e 64 6f 20 74 68 65 20 6c 6f 63 61 6c 20   Undo the local 
1a920 6c 6f 63 6b 73 20 2a 2f 0a 20 20 69 66 28 20 72  locks */.  if( r
1a930 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
1a940 20 20 20 20 70 2d 3e 65 78 63 6c 4d 61 73 6b 20      p->exclMask 
1a950 26 3d 20 7e 75 6e 6c 6f 63 6b 4d 61 73 6b 3b 0a  &= ~unlockMask;.
1a960 20 20 20 20 70 2d 3e 73 68 61 72 65 64 4d 61 73      p->sharedMas
1a970 6b 20 26 3d 20 7e 75 6e 6c 6f 63 6b 4d 61 73 6b  k &= ~unlockMask
1a980 3b 0a 20 20 7d 20 0a 20 20 72 65 74 75 72 6e 20  ;.  } .  return 
1a990 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 74  rc;.}../*.** Get
1a9a0 20 72 65 61 64 65 72 20 6c 6f 63 6b 73 20 66 6f   reader locks fo
1a9b0 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 70 20 6f  r connection p o
1a9c0 6e 20 61 6c 6c 20 6c 6f 63 6b 73 20 69 6e 20 74  n all locks in t
1a9d0 68 65 20 72 65 61 64 4d 61 73 6b 20 70 61 72 61  he readMask para
1a9e0 6d 65 74 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63  meter..*/.static
1a9f0 20 69 6e 74 20 75 6e 69 78 53 68 6d 53 68 61 72   int unixShmShar
1aa00 65 64 4c 6f 63 6b 28 0a 20 20 75 6e 69 78 53 68  edLock(.  unixSh
1aa10 6d 4e 6f 64 65 20 2a 70 53 68 6d 4e 6f 64 65 2c  mNode *pShmNode,
1aa20 20 20 20 2f 2a 20 54 68 65 20 75 6e 64 65 72 6c     /* The underl
1aa30 79 69 6e 67 20 73 68 61 72 65 64 2d 6d 65 6d 6f  ying shared-memo
1aa40 72 79 20 66 69 6c 65 20 2a 2f 0a 20 20 75 6e 69  ry file */.  uni
1aa50 78 53 68 6d 20 2a 70 2c 20 20 20 20 20 20 20 20  xShm *p,        
1aa60 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 6e        /* The con
1aa70 6e 65 63 74 69 6f 6e 20 74 6f 20 67 65 74 20 74  nection to get t
1aa80 68 65 20 73 68 61 72 65 64 20 6c 6f 63 6b 73 20  he shared locks 
1aa90 2a 2f 0a 20 20 75 38 20 72 65 61 64 4d 61 73 6b  */.  u8 readMask
1aaa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1aab0 20 4d 61 73 6b 20 6f 66 20 73 68 61 72 65 64 20   Mask of shared 
1aac0 6c 6f 63 6b 73 20 74 6f 20 62 65 20 61 63 71 75  locks to be acqu
1aad0 69 72 65 64 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  ired */.){.  int
1aae0 20 72 63 3b 20 20 20 20 20 20 20 20 2f 2a 20 52   rc;        /* R
1aaf0 65 73 75 6c 74 20 63 6f 64 65 20 2a 2f 0a 20 20  esult code */.  
1ab00 75 6e 69 78 53 68 6d 20 2a 70 58 3b 20 20 20 2f  unixShm *pX;   /
1ab10 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f 76  * For looping ov
1ab20 65 72 20 61 6c 6c 20 73 69 62 6c 69 6e 67 20 63  er all sibling c
1ab30 6f 6e 6e 65 63 74 69 6f 6e 73 20 2a 2f 0a 20 20  onnections */.  
1ab40 75 38 20 61 6c 6c 53 68 61 72 65 64 3b 20 20 2f  u8 allShared;  /
1ab50 2a 20 55 6e 69 6f 6e 20 6f 66 20 6c 6f 63 6b 73  * Union of locks
1ab60 20 68 65 6c 64 20 62 79 20 63 6f 6e 6e 65 63 74   held by connect
1ab70 69 6f 6e 73 20 6f 74 68 65 72 20 74 68 61 6e 20  ions other than 
1ab80 22 70 22 20 2a 2f 0a 0a 20 20 2f 2a 20 41 63 63  "p" */..  /* Acc
1ab90 65 73 73 20 74 6f 20 74 68 65 20 75 6e 69 78 53  ess to the unixS
1aba0 68 6d 4e 6f 64 65 20 6f 62 6a 65 63 74 20 69 73  hmNode object is
1abb0 20 73 65 72 69 61 6c 69 7a 65 64 20 62 79 20 74   serialized by t
1abc0 68 65 20 63 61 6c 6c 65 72 20 2a 2f 0a 20 20 61  he caller */.  a
1abd0 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
1abe0 75 74 65 78 5f 68 65 6c 64 28 70 53 68 6d 4e 6f  utex_held(pShmNo
1abf0 64 65 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 0a 20  de->mutex) );.. 
1ac00 20 2f 2a 20 46 69 6e 64 20 6f 75 74 20 77 68 69   /* Find out whi
1ac10 63 68 20 73 68 61 72 65 64 20 6c 6f 63 6b 73 20  ch shared locks 
1ac20 61 72 65 20 61 6c 72 65 61 64 79 20 68 65 6c 64  are already held
1ac30 20 62 79 20 73 69 62 6c 69 6e 67 20 63 6f 6e 6e   by sibling conn
1ac40 65 63 74 69 6f 6e 73 2e 0a 20 20 2a 2a 20 49 66  ections..  ** If
1ac50 20 61 6e 79 20 73 69 62 6c 69 6e 67 20 61 6c 72   any sibling alr
1ac60 65 61 64 79 20 68 6f 6c 64 73 20 61 6e 20 65 78  eady holds an ex
1ac70 63 6c 75 73 69 76 65 20 6c 6f 63 6b 2c 20 67 6f  clusive lock, go
1ac80 20 61 68 65 61 64 20 61 6e 64 20 72 65 74 75 72   ahead and retur
1ac90 6e 0a 20 20 2a 2a 20 53 51 4c 49 54 45 5f 42 55  n.  ** SQLITE_BU
1aca0 53 59 2e 0a 20 20 2a 2f 0a 20 20 61 6c 6c 53 68  SY..  */.  allSh
1acb0 61 72 65 64 20 3d 20 30 3b 0a 20 20 66 6f 72 28  ared = 0;.  for(
1acc0 70 58 3d 70 53 68 6d 4e 6f 64 65 2d 3e 70 46 69  pX=pShmNode->pFi
1acd0 72 73 74 3b 20 70 58 3b 20 70 58 3d 70 58 2d 3e  rst; pX; pX=pX->
1ace0 70 4e 65 78 74 29 7b 0a 20 20 20 20 69 66 28 20  pNext){.    if( 
1acf0 70 58 3d 3d 70 20 29 20 63 6f 6e 74 69 6e 75 65  pX==p ) continue
1ad00 3b 0a 20 20 20 20 69 66 28 20 28 70 58 2d 3e 65  ;.    if( (pX->e
1ad10 78 63 6c 4d 61 73 6b 20 26 20 72 65 61 64 4d 61  xclMask & readMa
1ad20 73 6b 29 21 3d 30 20 29 20 72 65 74 75 72 6e 20  sk)!=0 ) return 
1ad30 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20  SQLITE_BUSY;.   
1ad40 20 61 6c 6c 53 68 61 72 65 64 20 7c 3d 20 70 58   allShared |= pX
1ad50 2d 3e 73 68 61 72 65 64 4d 61 73 6b 3b 0a 20 20  ->sharedMask;.  
1ad60 7d 0a 0a 20 20 2f 2a 20 47 65 74 20 73 68 61 72  }..  /* Get shar
1ad70 65 64 20 6c 6f 63 6b 73 20 61 74 20 74 68 65 20  ed locks at the 
1ad80 73 79 73 74 65 6d 20 6c 65 76 65 6c 2c 20 69 66  system level, if
1ad90 20 6e 65 63 65 73 73 61 72 79 20 2a 2f 0a 20 20   necessary */.  
1ada0 69 66 28 20 28 7e 61 6c 6c 53 68 61 72 65 64 29  if( (~allShared)
1adb0 20 26 20 72 65 61 64 4d 61 73 6b 20 29 7b 0a 20   & readMask ){. 
1adc0 20 20 20 72 63 20 3d 20 75 6e 69 78 53 68 6d 53     rc = unixShmS
1add0 79 73 74 65 6d 4c 6f 63 6b 28 70 53 68 6d 4e 6f  ystemLock(pShmNo
1ade0 64 65 2c 20 46 5f 52 44 4c 43 4b 2c 20 72 65 61  de, F_RDLCK, rea
1adf0 64 4d 61 73 6b 29 3b 0a 20 20 7d 65 6c 73 65 7b  dMask);.  }else{
1ae00 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
1ae10 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 47  _OK;.  }..  /* G
1ae20 65 74 20 74 68 65 20 6c 6f 63 61 6c 20 73 68 61  et the local sha
1ae30 72 65 64 20 6c 6f 63 6b 73 20 2a 2f 0a 20 20 69  red locks */.  i
1ae40 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
1ae50 20 29 7b 0a 20 20 20 20 70 2d 3e 73 68 61 72 65   ){.    p->share
1ae60 64 4d 61 73 6b 20 7c 3d 20 72 65 61 64 4d 61 73  dMask |= readMas
1ae70 6b 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  k;.  }.  return 
1ae80 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 6f 72  rc;.}../*.** For
1ae90 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 70 2c 20 67   connection p, g
1aea0 65 74 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20  et an exclusive 
1aeb0 6c 6f 63 6b 20 6f 6e 20 61 6c 6c 20 6c 6f 63 6b  lock on all lock
1aec0 73 20 69 64 65 6e 74 69 66 69 65 64 20 69 6e 0a  s identified in.
1aed0 2a 2a 20 74 68 65 20 77 72 69 74 65 4d 61 73 6b  ** the writeMask
1aee0 20 70 61 72 61 6d 65 74 65 72 2e 0a 2a 2f 0a 73   parameter..*/.s
1aef0 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 53 68  tatic int unixSh
1af00 6d 45 78 63 6c 75 73 69 76 65 4c 6f 63 6b 28 0a  mExclusiveLock(.
1af10 20 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20 2a 70    unixShmNode *p
1af20 53 68 6d 4e 6f 64 65 2c 20 20 20 20 2f 2a 20 54  ShmNode,    /* T
1af30 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 73 68  he underlying sh
1af40 61 72 65 64 2d 6d 65 6d 6f 72 79 20 66 69 6c 65  ared-memory file
1af50 20 2a 2f 0a 20 20 75 6e 69 78 53 68 6d 20 2a 70   */.  unixShm *p
1af60 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
1af70 2f 2a 20 54 68 65 20 63 6f 6e 6e 65 63 74 69 6f  /* The connectio
1af80 6e 20 74 6f 20 67 65 74 20 74 68 65 20 65 78 63  n to get the exc
1af90 6c 75 73 69 76 65 20 6c 6f 63 6b 73 20 2a 2f 0a  lusive locks */.
1afa0 20 20 75 38 20 77 72 69 74 65 4d 61 73 6b 20 20    u8 writeMask  
1afb0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d              /* M
1afc0 61 73 6b 20 6f 66 20 65 78 63 6c 75 73 69 76 65  ask of exclusive
1afd0 20 6c 6f 63 6b 73 20 74 6f 20 62 65 20 61 63 71   locks to be acq
1afe0 75 69 72 65 64 20 2a 2f 0a 29 7b 0a 20 20 69 6e  uired */.){.  in
1aff0 74 20 72 63 3b 20 20 20 20 20 20 20 20 2f 2a 20  t rc;        /* 
1b000 52 65 73 75 6c 74 20 63 6f 64 65 20 2a 2f 0a 20  Result code */. 
1b010 20 75 6e 69 78 53 68 6d 20 2a 70 58 3b 20 20 20   unixShm *pX;   
1b020 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f  /* For looping o
1b030 76 65 72 20 61 6c 6c 20 73 69 62 6c 69 6e 67 20  ver all sibling 
1b040 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 2a 2f 0a 0a  connections */..
1b050 20 20 2f 2a 20 41 63 63 65 73 73 20 74 6f 20 74    /* Access to t
1b060 68 65 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20 6f  he unixShmNode o
1b070 62 6a 65 63 74 20 69 73 20 73 65 72 69 61 6c 69  bject is seriali
1b080 7a 65 64 20 62 79 20 74 68 65 20 63 61 6c 6c 65  zed by the calle
1b090 72 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 73  r */.  assert( s
1b0a0 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
1b0b0 64 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65  d(pShmNode->mute
1b0c0 78 29 20 29 3b 0a 0a 20 20 2f 2a 20 4d 61 6b 65  x) );..  /* Make
1b0d0 20 73 75 72 65 20 6e 6f 20 73 69 62 6c 69 6e 67   sure no sibling
1b0e0 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 68 6f 6c   connections hol
1b0f0 64 20 6c 6f 63 6b 73 20 74 68 61 74 20 77 69 6c  d locks that wil
1b100 6c 20 62 6c 6f 63 6b 20 74 68 69 73 0a 20 20 2a  l block this.  *
1b110 2a 20 6c 6f 63 6b 2e 20 20 49 66 20 61 6e 79 20  * lock.  If any 
1b120 64 6f 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54  do, return SQLIT
1b130 45 5f 42 55 53 59 20 72 69 67 68 74 20 61 77 61  E_BUSY right awa
1b140 79 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 70 58  y..  */.  for(pX
1b150 3d 70 53 68 6d 4e 6f 64 65 2d 3e 70 46 69 72 73  =pShmNode->pFirs
1b160 74 3b 20 70 58 3b 20 70 58 3d 70 58 2d 3e 70 4e  t; pX; pX=pX->pN
1b170 65 78 74 29 7b 0a 20 20 20 20 69 66 28 20 70 58  ext){.    if( pX
1b180 3d 3d 70 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  ==p ) continue;.
1b190 20 20 20 20 69 66 28 20 28 70 58 2d 3e 65 78 63      if( (pX->exc
1b1a0 6c 4d 61 73 6b 20 26 20 77 72 69 74 65 4d 61 73  lMask & writeMas
1b1b0 6b 29 21 3d 30 20 29 20 72 65 74 75 72 6e 20 53  k)!=0 ) return S
1b1c0 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20  QLITE_BUSY;.    
1b1d0 69 66 28 20 28 70 58 2d 3e 73 68 61 72 65 64 4d  if( (pX->sharedM
1b1e0 61 73 6b 20 26 20 77 72 69 74 65 4d 61 73 6b 29  ask & writeMask)
1b1f0 21 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c  !=0 ) return SQL
1b200 49 54 45 5f 42 55 53 59 3b 0a 20 20 7d 0a 0a 20  ITE_BUSY;.  }.. 
1b210 20 2f 2a 20 47 65 74 20 74 68 65 20 65 78 63 6c   /* Get the excl
1b220 75 73 69 76 65 20 6c 6f 63 6b 73 20 61 74 20 74  usive locks at t
1b230 68 65 20 73 79 73 74 65 6d 20 6c 65 76 65 6c 2e  he system level.
1b240 20 20 54 68 65 6e 20 69 66 20 73 75 63 63 65 73    Then if succes
1b250 73 66 75 6c 0a 20 20 2a 2a 20 61 6c 73 6f 20 6d  sful.  ** also m
1b260 61 72 6b 20 74 68 65 20 6c 6f 63 61 6c 20 63 6f  ark the local co
1b270 6e 6e 65 63 74 69 6f 6e 20 61 73 20 62 65 69 6e  nnection as bein
1b280 67 20 6c 6f 63 6b 65 64 2e 0a 20 20 2a 2f 0a 20  g locked..  */. 
1b290 20 72 63 20 3d 20 75 6e 69 78 53 68 6d 53 79 73   rc = unixShmSys
1b2a0 74 65 6d 4c 6f 63 6b 28 70 53 68 6d 4e 6f 64 65  temLock(pShmNode
1b2b0 2c 20 46 5f 57 52 4c 43 4b 2c 20 77 72 69 74 65  , F_WRLCK, write
1b2c0 4d 61 73 6b 29 3b 0a 20 20 69 66 28 20 72 63 3d  Mask);.  if( rc=
1b2d0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1b2e0 20 20 70 2d 3e 73 68 61 72 65 64 4d 61 73 6b 20    p->sharedMask 
1b2f0 26 3d 20 7e 77 72 69 74 65 4d 61 73 6b 3b 0a 20  &= ~writeMask;. 
1b300 20 20 20 70 2d 3e 65 78 63 6c 4d 61 73 6b 20 7c     p->exclMask |
1b310 3d 20 77 72 69 74 65 4d 61 73 6b 3b 0a 20 20 7d  = writeMask;.  }
1b320 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
1b330 0a 2f 2a 0a 2a 2a 20 50 75 72 67 65 20 74 68 65  ./*.** Purge the
1b340 20 75 6e 69 78 53 68 6d 4e 6f 64 65 4c 69 73 74   unixShmNodeList
1b350 20 6c 69 73 74 20 6f 66 20 61 6c 6c 20 65 6e 74   list of all ent
1b360 72 69 65 73 20 77 69 74 68 20 75 6e 69 78 53 68  ries with unixSh
1b370 6d 4e 6f 64 65 2e 6e 52 65 66 3d 3d 30 2e 0a 2a  mNode.nRef==0..*
1b380 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 6e 6f 74  *.** This is not
1b390 20 61 20 56 46 53 20 73 68 61 72 65 64 2d 6d 65   a VFS shared-me
1b3a0 6d 6f 72 79 20 6d 65 74 68 6f 64 3b 20 69 74 20  mory method; it 
1b3b0 69 73 20 61 20 75 74 69 6c 69 74 79 20 66 75 6e  is a utility fun
1b3c0 63 74 69 6f 6e 20 63 61 6c 6c 65 64 0a 2a 2a 20  ction called.** 
1b3d0 62 79 20 56 46 53 20 73 68 61 72 65 64 2d 6d 65  by VFS shared-me
1b3e0 6d 6f 72 79 20 6d 65 74 68 6f 64 73 2e 0a 2a 2f  mory methods..*/
1b3f0 0a 73 74 61 74 69 63 20 76 6f 69 64 20 75 6e 69  .static void uni
1b400 78 53 68 6d 50 75 72 67 65 28 75 6e 69 78 46 69  xShmPurge(unixFi
1b410 6c 65 20 2a 70 46 64 29 7b 0a 20 20 75 6e 69 78  le *pFd){.  unix
1b420 53 68 6d 4e 6f 64 65 20 2a 70 20 3d 20 70 46 64  ShmNode *p = pFd
1b430 2d 3e 70 49 6e 6f 64 65 2d 3e 70 53 68 6d 4e 6f  ->pInode->pShmNo
1b440 64 65 3b 0a 20 20 61 73 73 65 72 74 28 20 75 6e  de;.  assert( un
1b450 69 78 4d 75 74 65 78 48 65 6c 64 28 29 20 29 3b  ixMutexHeld() );
1b460 0a 20 20 69 66 28 20 70 20 26 26 20 70 2d 3e 6e  .  if( p && p->n
1b470 52 65 66 3d 3d 30 20 29 7b 0a 20 20 20 20 61 73  Ref==0 ){.    as
1b480 73 65 72 74 28 20 70 2d 3e 70 49 6e 6f 64 65 3d  sert( p->pInode=
1b490 3d 70 46 64 2d 3e 70 49 6e 6f 64 65 20 29 3b 0a  =pFd->pInode );.
1b4a0 20 20 20 20 69 66 28 20 70 2d 3e 6d 75 74 65 78      if( p->mutex
1b4b0 20 29 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78   ) sqlite3_mutex
1b4c0 5f 66 72 65 65 28 70 2d 3e 6d 75 74 65 78 29 3b  _free(p->mutex);
1b4d0 0a 20 20 20 20 69 66 28 20 70 2d 3e 6d 75 74 65  .    if( p->mute
1b4e0 78 42 75 66 20 29 20 73 71 6c 69 74 65 33 5f 6d  xBuf ) sqlite3_m
1b4f0 75 74 65 78 5f 66 72 65 65 28 70 2d 3e 6d 75 74  utex_free(p->mut
1b500 65 78 42 75 66 29 3b 0a 20 20 20 20 69 66 28 20  exBuf);.    if( 
1b510 70 2d 3e 68 3e 3d 30 20 29 20 63 6c 6f 73 65 28  p->h>=0 ) close(
1b520 70 2d 3e 68 29 3b 0a 20 20 20 20 70 2d 3e 70 49  p->h);.    p->pI
1b530 6e 6f 64 65 2d 3e 70 53 68 6d 4e 6f 64 65 20 3d  node->pShmNode =
1b540 20 30 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   0;.    sqlite3_
1b550 66 72 65 65 28 70 29 3b 0a 20 20 7d 0a 7d 0a 0a  free(p);.  }.}..
1b560 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20 73 68 61  /*.** Open a sha
1b570 72 65 64 2d 6d 65 6d 6f 72 79 20 61 72 65 61 2e  red-memory area.
1b580 20 20 54 68 69 73 20 70 61 72 74 69 63 75 6c 61    This particula
1b590 72 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  r implementation
1b5a0 20 75 73 65 73 0a 2a 2a 20 6d 6d 61 70 70 65 64   uses.** mmapped
1b5b0 20 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 7a 4e   files..**.** zN
1b5c0 61 6d 65 20 69 73 20 61 20 66 69 6c 65 6e 61 6d  ame is a filenam
1b5d0 65 20 75 73 65 64 20 74 6f 20 69 64 65 6e 74 69  e used to identi
1b5e0 66 79 20 74 68 65 20 73 68 61 72 65 64 2d 6d 65  fy the shared-me
1b5f0 6d 6f 72 79 20 61 72 65 61 2e 20 20 54 68 65 0a  mory area.  The.
1b600 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  ** implementatio
1b610 6e 20 64 6f 65 73 20 6e 6f 74 20 28 61 6e 64 20  n does not (and 
1b620 70 65 72 68 61 70 73 20 73 68 6f 75 6c 64 20 6e  perhaps should n
1b630 6f 74 29 20 75 73 65 20 74 68 69 73 20 6e 61 6d  ot) use this nam
1b640 65 0a 2a 2a 20 64 69 72 65 63 74 6c 79 2c 20 62  e.** directly, b
1b650 75 74 20 72 61 74 68 65 72 20 75 73 65 20 69 74  ut rather use it
1b660 20 61 73 20 61 20 74 65 6d 70 6c 61 74 65 20 66   as a template f
1b670 6f 72 20 66 69 6e 64 69 6e 67 20 61 6e 20 61 70  or finding an ap
1b680 70 72 6f 70 72 69 61 74 65 0a 2a 2a 20 6e 61 6d  propriate.** nam
1b690 65 20 66 6f 72 20 74 68 65 20 73 68 61 72 65 64  e for the shared
1b6a0 2d 6d 65 6d 6f 72 79 20 73 74 6f 72 61 67 65 2e  -memory storage.
1b6b0 20 20 49 6e 20 74 68 69 73 20 69 6d 70 6c 65 6d    In this implem
1b6c0 65 6e 74 61 74 69 6f 6e 2c 20 74 68 65 0a 2a 2a  entation, the.**
1b6d0 20 73 74 72 69 6e 67 20 22 2d 69 6e 64 65 78 22   string "-index"
1b6e0 20 69 73 20 61 70 70 65 6e 64 65 64 20 74 6f 20   is appended to 
1b6f0 7a 4e 61 6d 65 20 61 6e 64 20 75 73 65 64 20 61  zName and used a
1b700 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68  s the name of th
1b710 65 0a 2a 2a 20 6d 6d 61 70 70 65 64 20 66 69 6c  e.** mmapped fil
1b720 65 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 6f 70  e..**.** When op
1b730 65 6e 69 6e 67 20 61 20 6e 65 77 20 73 68 61 72  ening a new shar
1b740 65 64 2d 6d 65 6d 6f 72 79 20 66 69 6c 65 2c 20  ed-memory file, 
1b750 69 66 20 6e 6f 20 6f 74 68 65 72 20 69 6e 73 74  if no other inst
1b760 61 6e 63 65 73 20 6f 66 20 74 68 61 74 0a 2a 2a  ances of that.**
1b770 20 66 69 6c 65 20 61 72 65 20 63 75 72 72 65 6e   file are curren
1b780 74 6c 79 20 6f 70 65 6e 2c 20 69 6e 20 74 68 69  tly open, in thi
1b790 73 20 70 72 6f 63 65 73 73 20 6f 72 20 69 6e 20  s process or in 
1b7a0 6f 74 68 65 72 20 70 72 6f 63 65 73 73 65 73 2c  other processes,
1b7b0 20 74 68 65 6e 0a 2a 2a 20 74 68 65 20 66 69 6c   then.** the fil
1b7c0 65 20 6d 75 73 74 20 62 65 20 74 72 75 6e 63 61  e must be trunca
1b7d0 74 65 64 20 74 6f 20 7a 65 72 6f 20 6c 65 6e 67  ted to zero leng
1b7e0 74 68 20 6f 72 20 68 61 76 65 20 69 74 73 20 68  th or have its h
1b7f0 65 61 64 65 72 20 63 6c 65 61 72 65 64 2e 0a 2a  eader cleared..*
1b800 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69  /.static int uni
1b810 78 53 68 6d 4f 70 65 6e 28 0a 20 20 73 71 6c 69  xShmOpen(.  sqli
1b820 74 65 33 5f 66 69 6c 65 20 2a 66 64 20 20 20 20  te3_file *fd    
1b830 20 20 2f 2a 20 54 68 65 20 66 69 6c 65 20 64 65    /* The file de
1b840 73 63 72 69 70 74 6f 72 20 6f 66 20 74 68 65 20  scriptor of the 
1b850 61 73 73 6f 63 69 61 74 65 64 20 64 61 74 61 62  associated datab
1b860 61 73 65 20 2a 2f 0a 29 7b 0a 20 20 73 74 72 75  ase */.){.  stru
1b870 63 74 20 75 6e 69 78 53 68 6d 20 2a 70 20 3d 20  ct unixShm *p = 
1b880 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  0;             /
1b890 2a 20 54 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  * The connection
1b8a0 20 74 6f 20 62 65 20 6f 70 65 6e 65 64 20 2a 2f   to be opened */
1b8b0 0a 20 20 73 74 72 75 63 74 20 75 6e 69 78 53 68  .  struct unixSh
1b8c0 6d 4e 6f 64 65 20 2a 70 53 68 6d 4e 6f 64 65 20  mNode *pShmNode 
1b8d0 3d 20 30 3b 20 20 2f 2a 20 54 68 65 20 75 6e 64  = 0;  /* The und
1b8e0 65 72 6c 79 69 6e 67 20 6d 6d 61 70 70 65 64 20  erlying mmapped 
1b8f0 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 72 63  file */.  int rc
1b900 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1b910 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1b920 52 65 73 75 6c 74 20 63 6f 64 65 20 2a 2f 0a 20  Result code */. 
1b930 20 73 74 72 75 63 74 20 75 6e 69 78 46 69 6c 65   struct unixFile
1b940 20 2a 70 44 62 46 64 3b 20 20 20 20 20 20 20 20   *pDbFd;        
1b950 20 20 20 20 2f 2a 20 55 6e 64 65 72 6c 79 69 6e      /* Underlyin
1b960 67 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  g database file 
1b970 2a 2f 0a 20 20 69 6e 74 20 6e 50 61 74 68 3b 20  */.  int nPath; 
1b980 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b990 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20          /* Size 
1b9a0 6f 66 20 70 44 62 46 64 2d 3e 7a 50 61 74 68 20  of pDbFd->zPath 
1b9b0 69 6e 20 62 79 74 65 73 20 2a 2f 0a 0a 20 20 2f  in bytes */..  /
1b9c0 2a 20 41 6c 6c 6f 63 61 74 65 20 73 70 61 63 65  * Allocate space
1b9d0 20 66 6f 72 20 74 68 65 20 6e 65 77 20 73 71 6c   for the new sql
1b9e0 69 74 65 33 5f 73 68 6d 20 6f 62 6a 65 63 74 2e  ite3_shm object.
1b9f0 0a 20 20 2a 2f 0a 20 20 70 20 3d 20 73 71 6c 69  .  */.  p = sqli
1ba00 74 65 33 5f 6d 61 6c 6c 6f 63 28 20 73 69 7a 65  te3_malloc( size
1ba10 6f 66 28 2a 70 29 20 29 3b 0a 20 20 69 66 28 20  of(*p) );.  if( 
1ba20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51  p==0 ) return SQ
1ba30 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 6d 65  LITE_NOMEM;.  me
1ba40 6d 73 65 74 28 70 2c 20 30 2c 20 73 69 7a 65 6f  mset(p, 0, sizeo
1ba50 66 28 2a 70 29 29 3b 0a 20 20 70 44 62 46 64 20  f(*p));.  pDbFd 
1ba60 3d 20 28 73 74 72 75 63 74 20 75 6e 69 78 46 69  = (struct unixFi
1ba70 6c 65 2a 29 66 64 3b 0a 20 20 61 73 73 65 72 74  le*)fd;.  assert
1ba80 28 20 70 44 62 46 64 2d 3e 70 53 68 6d 3d 3d 30  ( pDbFd->pShm==0
1ba90 20 29 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20   );..  /* Check 
1baa0 74 6f 20 73 65 65 20 69 66 20 61 20 75 6e 69 78  to see if a unix
1bab0 53 68 6d 4e 6f 64 65 20 6f 62 6a 65 63 74 20 61  ShmNode object a
1bac0 6c 72 65 61 64 79 20 65 78 69 73 74 73 2e 20 20  lready exists.  
1bad0 52 65 75 73 65 20 61 6e 20 65 78 69 73 74 69 6e  Reuse an existin
1bae0 67 0a 20 20 2a 2a 20 6f 6e 65 20 69 66 20 70 72  g.  ** one if pr
1baf0 65 73 65 6e 74 2e 20 20 43 72 65 61 74 65 20 61  esent.  Create a
1bb00 20 6e 65 77 20 6f 6e 65 20 69 66 20 6e 65 63 65   new one if nece
1bb10 73 73 61 72 79 2e 0a 20 20 2a 2f 0a 20 20 75 6e  ssary..  */.  un
1bb20 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a  ixEnterMutex();.
1bb30 20 20 70 53 68 6d 4e 6f 64 65 20 3d 20 70 44 62    pShmNode = pDb
1bb40 46 64 2d 3e 70 49 6e 6f 64 65 2d 3e 70 53 68 6d  Fd->pInode->pShm
1bb50 4e 6f 64 65 3b 0a 20 20 69 66 28 20 70 53 68 6d  Node;.  if( pShm
1bb60 4e 6f 64 65 3d 3d 30 20 29 7b 0a 20 20 20 20 6e  Node==0 ){.    n
1bb70 50 61 74 68 20 3d 20 73 74 72 6c 65 6e 28 70 44  Path = strlen(pD
1bb80 62 46 64 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 20  bFd->zPath);.   
1bb90 20 70 53 68 6d 4e 6f 64 65 20 3d 20 73 71 6c 69   pShmNode = sqli
1bba0 74 65 33 5f 6d 61 6c 6c 6f 63 28 20 73 69 7a 65  te3_malloc( size
1bbb0 6f 66 28 2a 70 53 68 6d 4e 6f 64 65 29 20 2b 20  of(*pShmNode) + 
1bbc0 6e 50 61 74 68 20 2b 20 31 35 20 29 3b 0a 20 20  nPath + 15 );.  
1bbd0 20 20 69 66 28 20 70 53 68 6d 4e 6f 64 65 3d 3d    if( pShmNode==
1bbe0 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  0 ){.      rc = 
1bbf0 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
1bc00 20 20 20 20 67 6f 74 6f 20 73 68 6d 5f 6f 70 65      goto shm_ope
1bc10 6e 5f 65 72 72 3b 0a 20 20 20 20 7d 0a 20 20 20  n_err;.    }.   
1bc20 20 6d 65 6d 73 65 74 28 70 53 68 6d 4e 6f 64 65   memset(pShmNode
1bc30 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a 70 53 68  , 0, sizeof(*pSh
1bc40 6d 4e 6f 64 65 29 29 3b 0a 20 20 20 20 70 53 68  mNode));.    pSh
1bc50 6d 4e 6f 64 65 2d 3e 7a 46 69 6c 65 6e 61 6d 65  mNode->zFilename
1bc60 20 3d 20 28 63 68 61 72 2a 29 26 70 53 68 6d 4e   = (char*)&pShmN
1bc70 6f 64 65 5b 31 5d 3b 0a 20 20 20 20 73 71 6c 69  ode[1];.    sqli
1bc80 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 50 61  te3_snprintf(nPa
1bc90 74 68 2b 31 35 2c 20 70 53 68 6d 4e 6f 64 65 2d  th+15, pShmNode-
1bca0 3e 7a 46 69 6c 65 6e 61 6d 65 2c 0a 20 20 20 20  >zFilename,.    
1bcb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bcc0 20 22 25 73 2d 77 61 6c 2d 69 6e 64 65 78 22 2c   "%s-wal-index",
1bcd0 20 70 44 62 46 64 2d 3e 7a 50 61 74 68 29 3b 0a   pDbFd->zPath);.
1bce0 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 68 20      pShmNode->h 
1bcf0 3d 20 2d 31 3b 0a 20 20 20 20 70 44 62 46 64 2d  = -1;.    pDbFd-
1bd00 3e 70 49 6e 6f 64 65 2d 3e 70 53 68 6d 4e 6f 64  >pInode->pShmNod
1bd10 65 20 3d 20 70 53 68 6d 4e 6f 64 65 3b 0a 20 20  e = pShmNode;.  
1bd20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 70 49 6e 6f    pShmNode->pIno
1bd30 64 65 20 3d 20 70 44 62 46 64 2d 3e 70 49 6e 6f  de = pDbFd->pIno
1bd40 64 65 3b 0a 20 20 20 20 70 53 68 6d 4e 6f 64 65  de;.    pShmNode
1bd50 2d 3e 6d 75 74 65 78 20 3d 20 73 71 6c 69 74 65  ->mutex = sqlite
1bd60 33 5f 6d 75 74 65 78 5f 61 6c 6c 6f 63 28 53 51  3_mutex_alloc(SQ
1bd70 4c 49 54 45 5f 4d 55 54 45 58 5f 46 41 53 54 29  LITE_MUTEX_FAST)
1bd80 3b 0a 20 20 20 20 69 66 28 20 70 53 68 6d 4e 6f  ;.    if( pShmNo
1bd90 64 65 2d 3e 6d 75 74 65 78 3d 3d 30 20 29 7b 0a  de->mutex==0 ){.
1bda0 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
1bdb0 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 67  E_NOMEM;.      g
1bdc0 6f 74 6f 20 73 68 6d 5f 6f 70 65 6e 5f 65 72 72  oto shm_open_err
1bdd0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 53 68 6d  ;.    }.    pShm
1bde0 4e 6f 64 65 2d 3e 6d 75 74 65 78 42 75 66 20 3d  Node->mutexBuf =
1bdf0 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 61   sqlite3_mutex_a
1be00 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45  lloc(SQLITE_MUTE
1be10 58 5f 46 41 53 54 29 3b 0a 20 20 20 20 69 66 28  X_FAST);.    if(
1be20 20 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78   pShmNode->mutex
1be30 42 75 66 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  Buf==0 ){.      
1be40 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  rc = SQLITE_NOME
1be50 4d 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 73 68  M;.      goto sh
1be60 6d 5f 6f 70 65 6e 5f 65 72 72 3b 0a 20 20 20 20  m_open_err;.    
1be70 7d 0a 0a 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d  }..    pShmNode-
1be80 3e 68 20 3d 20 6f 70 65 6e 28 70 53 68 6d 4e 6f  >h = open(pShmNo
1be90 64 65 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c 20 4f  de->zFilename, O
1bea0 5f 52 44 57 52 7c 4f 5f 43 52 45 41 54 2c 20 30  _RDWR|O_CREAT, 0
1beb0 36 36 34 29 3b 0a 20 20 20 20 69 66 28 20 70 53  664);.    if( pS
1bec0 68 6d 4e 6f 64 65 2d 3e 68 3c 30 20 29 7b 0a 20  hmNode->h<0 ){. 
1bed0 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
1bee0 5f 43 41 4e 54 4f 50 45 4e 5f 42 4b 50 54 3b 0a  _CANTOPEN_BKPT;.
1bef0 20 20 20 20 20 20 67 6f 74 6f 20 73 68 6d 5f 6f        goto shm_o
1bf00 70 65 6e 5f 65 72 72 3b 0a 20 20 20 20 7d 0a 0a  pen_err;.    }..
1bf10 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f 20      /* Check to 
1bf20 73 65 65 20 69 66 20 61 6e 6f 74 68 65 72 20 70  see if another p
1bf30 72 6f 63 65 73 73 20 69 73 20 68 6f 6c 64 69 6e  rocess is holdin
1bf40 67 20 74 68 65 20 64 65 61 64 2d 6d 61 6e 20 73  g the dead-man s
1bf50 77 69 74 63 68 2e 0a 20 20 20 20 2a 2a 20 49 66  witch..    ** If
1bf60 20 6e 6f 74 2c 20 74 72 75 6e 63 61 74 65 20 74   not, truncate t
1bf70 68 65 20 66 69 6c 65 20 74 6f 20 7a 65 72 6f 20  he file to zero 
1bf80 6c 65 6e 67 74 68 2e 20 0a 20 20 20 20 2a 2f 0a  length. .    */.
1bf90 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
1bfa0 4f 4b 3b 0a 20 20 20 20 69 66 28 20 75 6e 69 78  OK;.    if( unix
1bfb0 53 68 6d 53 79 73 74 65 6d 4c 6f 63 6b 28 70 53  ShmSystemLock(pS
1bfc0 68 6d 4e 6f 64 65 2c 20 46 5f 57 52 4c 43 4b 2c  hmNode, F_WRLCK,
1bfd0 20 55 4e 49 58 5f 53 48 4d 5f 44 4d 53 29 3d 3d   UNIX_SHM_DMS)==
1bfe0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1bff0 20 20 20 69 66 28 20 66 74 72 75 6e 63 61 74 65     if( ftruncate
1c000 28 70 53 68 6d 4e 6f 64 65 2d 3e 68 2c 20 30 29  (pShmNode->h, 0)
1c010 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
1c020 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 3b 0a 20   SQLITE_IOERR;. 
1c030 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
1c040 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
1c050 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  OK ){.      rc =
1c060 20 75 6e 69 78 53 68 6d 53 79 73 74 65 6d 4c 6f   unixShmSystemLo
1c070 63 6b 28 70 53 68 6d 4e 6f 64 65 2c 20 46 5f 52  ck(pShmNode, F_R
1c080 44 4c 43 4b 2c 20 55 4e 49 58 5f 53 48 4d 5f 44  DLCK, UNIX_SHM_D
1c090 4d 53 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  MS);.    }.    i
1c0a0 66 28 20 72 63 20 29 20 67 6f 74 6f 20 73 68 6d  f( rc ) goto shm
1c0b0 5f 6f 70 65 6e 5f 65 72 72 3b 0a 20 20 7d 0a 0a  _open_err;.  }..
1c0c0 20 20 2f 2a 20 4d 61 6b 65 20 74 68 65 20 6e 65    /* Make the ne
1c0d0 77 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 61 20 63  w connection a c
1c0e0 68 69 6c 64 20 6f 66 20 74 68 65 20 75 6e 69 78  hild of the unix
1c0f0 53 68 6d 4e 6f 64 65 20 2a 2f 0a 20 20 70 2d 3e  ShmNode */.  p->
1c100 70 53 68 6d 4e 6f 64 65 20 3d 20 70 53 68 6d 4e  pShmNode = pShmN
1c110 6f 64 65 3b 0a 20 20 70 2d 3e 70 4e 65 78 74 20  ode;.  p->pNext 
1c120 3d 20 70 53 68 6d 4e 6f 64 65 2d 3e 70 46 69 72  = pShmNode->pFir
1c130 73 74 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54  st;.#ifdef SQLIT
1c140 45 5f 44 45 42 55 47 0a 20 20 70 2d 3e 69 64 20  E_DEBUG.  p->id 
1c150 3d 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 65 78 74  = pShmNode->next
1c160 53 68 6d 49 64 2b 2b 3b 0a 23 65 6e 64 69 66 0a  ShmId++;.#endif.
1c170 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 70 46 69 72    pShmNode->pFir
1c180 73 74 20 3d 20 70 3b 0a 20 20 70 53 68 6d 4e 6f  st = p;.  pShmNo
1c190 64 65 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 70 44  de->nRef++;.  pD
1c1a0 62 46 64 2d 3e 70 53 68 6d 20 3d 20 70 3b 0a 20  bFd->pShm = p;. 
1c1b0 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28   unixLeaveMutex(
1c1c0 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
1c1d0 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 4a 75 6d  TE_OK;..  /* Jum
1c1e0 70 20 68 65 72 65 20 6f 6e 20 61 6e 79 20 65 72  p here on any er
1c1f0 72 6f 72 20 2a 2f 0a 73 68 6d 5f 6f 70 65 6e 5f  ror */.shm_open_
1c200 65 72 72 3a 0a 20 20 75 6e 69 78 53 68 6d 50 75  err:.  unixShmPu
1c210 72 67 65 28 70 44 62 46 64 29 3b 20 20 20 20 20  rge(pDbFd);     
1c220 20 20 2f 2a 20 54 68 69 73 20 63 61 6c 6c 20 66    /* This call f
1c230 72 65 65 73 20 70 53 68 6d 4e 6f 64 65 20 69 66  rees pShmNode if
1c240 20 72 65 71 75 69 72 65 64 20 2a 2f 0a 20 20 73   required */.  s
1c250 71 6c 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0a  qlite3_free(p);.
1c260 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78    unixLeaveMutex
1c270 28 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  ();.  return rc;
1c280 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20  .}../*.** Close 
1c290 61 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20  a connection to 
1c2a0 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 2e 20 20  shared-memory.  
1c2b0 44 65 6c 65 74 65 20 74 68 65 20 75 6e 64 65 72  Delete the under
1c2c0 6c 79 69 6e 67 20 0a 2a 2a 20 73 74 6f 72 61 67  lying .** storag
1c2d0 65 20 69 66 20 64 65 6c 65 74 65 46 6c 61 67 20  e if deleteFlag 
1c2e0 69 73 20 74 72 75 65 2e 0a 2a 2f 0a 73 74 61 74  is true..*/.stat
1c2f0 69 63 20 69 6e 74 20 75 6e 69 78 53 68 6d 43 6c  ic int unixShmCl
1c300 6f 73 65 28 0a 20 20 73 71 6c 69 74 65 33 5f 66  ose(.  sqlite3_f
1c310 69 6c 65 20 2a 66 64 2c 20 20 20 20 20 20 20 20  ile *fd,        
1c320 20 20 2f 2a 20 54 68 65 20 75 6e 64 65 72 6c 79    /* The underly
1c330 69 6e 67 20 64 61 74 61 62 61 73 65 20 66 69 6c  ing database fil
1c340 65 20 2a 2f 0a 20 20 69 6e 74 20 64 65 6c 65 74  e */.  int delet
1c350 65 46 6c 61 67 20 20 20 20 20 20 20 20 20 20 20  eFlag           
1c360 20 20 2f 2a 20 44 65 6c 65 74 65 20 73 68 61 72    /* Delete shar
1c370 65 64 2d 6d 65 6d 6f 72 79 20 69 66 20 74 72 75  ed-memory if tru
1c380 65 20 2a 2f 0a 29 7b 0a 20 20 75 6e 69 78 53 68  e */.){.  unixSh
1c390 6d 20 2a 70 3b 20 20 20 20 20 20 20 20 20 20 20  m *p;           
1c3a0 20 2f 2a 20 54 68 65 20 63 6f 6e 6e 65 63 74 69   /* The connecti
1c3b0 6f 6e 20 74 6f 20 62 65 20 63 6c 6f 73 65 64 20  on to be closed 
1c3c0 2a 2f 0a 20 20 75 6e 69 78 53 68 6d 4e 6f 64 65  */.  unixShmNode
1c3d0 20 2a 70 53 68 6d 4e 6f 64 65 3b 20 2f 2a 20 54   *pShmNode; /* T
1c3e0 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 73 68  he underlying sh
1c3f0 61 72 65 64 2d 6d 65 6d 6f 72 79 20 66 69 6c 65  ared-memory file
1c400 20 2a 2f 0a 20 20 75 6e 69 78 53 68 6d 20 2a 2a   */.  unixShm **
1c410 70 70 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  pp;          /* 
1c420 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72  For looping over
1c430 20 73 69 62 6c 69 6e 67 20 63 6f 6e 6e 65 63 74   sibling connect
1c440 69 6f 6e 73 20 2a 2f 0a 20 20 75 6e 69 78 46 69  ions */.  unixFi
1c450 6c 65 20 2a 70 44 62 46 64 3b 20 20 20 20 20 20  le *pDbFd;      
1c460 20 2f 2a 20 54 68 65 20 75 6e 64 65 72 6c 79 69   /* The underlyi
1c470 6e 67 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  ng database file
1c480 20 2a 2f 0a 0a 20 20 70 44 62 46 64 20 3d 20 28   */..  pDbFd = (
1c490 75 6e 69 78 46 69 6c 65 2a 29 66 64 3b 0a 20 20  unixFile*)fd;.  
1c4a0 70 20 3d 20 70 44 62 46 64 2d 3e 70 53 68 6d 3b  p = pDbFd->pShm;
1c4b0 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65  .  if( p==0 ) re
1c4c0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
1c4d0 20 20 70 53 68 6d 4e 6f 64 65 20 3d 20 70 2d 3e    pShmNode = p->
1c4e0 70 53 68 6d 4e 6f 64 65 3b 0a 0a 20 20 61 73 73  pShmNode;..  ass
1c4f0 65 72 74 28 20 70 53 68 6d 4e 6f 64 65 3d 3d 70  ert( pShmNode==p
1c500 44 62 46 64 2d 3e 70 49 6e 6f 64 65 2d 3e 70 53  DbFd->pInode->pS
1c510 68 6d 4e 6f 64 65 20 29 3b 0a 20 20 61 73 73 65  hmNode );.  asse
1c520 72 74 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 70 49  rt( pShmNode->pI
1c530 6e 6f 64 65 3d 3d 70 44 62 46 64 2d 3e 70 49 6e  node==pDbFd->pIn
1c540 6f 64 65 20 29 3b 0a 0a 20 20 2f 2a 20 56 65 72  ode );..  /* Ver
1c550 69 66 79 20 74 68 61 74 20 74 68 65 20 63 6f 6e  ify that the con
1c560 6e 65 63 74 69 6f 6e 20 62 65 69 6e 67 20 63 6c  nection being cl
1c570 6f 73 65 64 20 68 6f 6c 64 73 20 6e 6f 20 6c 6f  osed holds no lo
1c580 63 6b 73 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  cks */.  assert(
1c590 20 70 2d 3e 65 78 63 6c 4d 61 73 6b 3d 3d 30 20   p->exclMask==0 
1c5a0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  );.  assert( p->
1c5b0 73 68 61 72 65 64 4d 61 73 6b 3d 3d 30 20 29 3b  sharedMask==0 );
1c5c0 0a 0a 20 20 2f 2a 20 52 65 6d 6f 76 65 20 63 6f  ..  /* Remove co
1c5d0 6e 6e 65 63 74 69 6f 6e 20 70 20 66 72 6f 6d 20  nnection p from 
1c5e0 74 68 65 20 73 65 74 20 6f 66 20 63 6f 6e 6e 65  the set of conne
1c5f0 63 74 69 6f 6e 73 20 61 73 73 6f 63 69 61 74 65  ctions associate
1c600 64 0a 20 20 2a 2a 20 77 69 74 68 20 70 53 68 6d  d.  ** with pShm
1c610 4e 6f 64 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65  Node */.  sqlite
1c620 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 70 53  3_mutex_enter(pS
1c630 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 29 3b 0a  hmNode->mutex);.
1c640 20 20 66 6f 72 28 70 70 3d 26 70 53 68 6d 4e 6f    for(pp=&pShmNo
1c650 64 65 2d 3e 70 46 69 72 73 74 3b 20 28 2a 70 70  de->pFirst; (*pp
1c660 29 21 3d 70 3b 20 70 70 20 3d 20 26 28 2a 70 70  )!=p; pp = &(*pp
1c670 29 2d 3e 70 4e 65 78 74 29 7b 7d 0a 20 20 2a 70  )->pNext){}.  *p
1c680 70 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a 0a 20  p = p->pNext;.. 
1c690 20 2f 2a 20 46 72 65 65 20 74 68 65 20 63 6f 6e   /* Free the con
1c6a0 6e 65 63 74 69 6f 6e 20 70 20 2a 2f 0a 20 20 73  nection p */.  s
1c6b0 71 6c 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0a  qlite3_free(p);.
1c6c0 20 20 70 44 62 46 64 2d 3e 70 53 68 6d 20 3d 20    pDbFd->pShm = 
1c6d0 30 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  0;.  sqlite3_mut
1c6e0 65 78 5f 6c 65 61 76 65 28 70 53 68 6d 4e 6f 64  ex_leave(pShmNod
1c6f0 65 2d 3e 6d 75 74 65 78 29 3b 0a 0a 20 20 2f 2a  e->mutex);..  /*
1c700 20 49 66 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52   If pShmNode->nR
1c710 65 66 20 68 61 73 20 72 65 61 63 68 65 64 20 30  ef has reached 0
1c720 2c 20 74 68 65 6e 20 63 6c 6f 73 65 20 74 68 65  , then close the
1c730 20 75 6e 64 65 72 6c 79 69 6e 67 0a 20 20 2a 2a   underlying.  **
1c740 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 66   shared-memory f
1c750 69 6c 65 2c 20 74 6f 6f 20 2a 2f 0a 20 20 75 6e  ile, too */.  un
1c760 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a  ixEnterMutex();.
1c770 20 20 61 73 73 65 72 74 28 20 70 53 68 6d 4e 6f    assert( pShmNo
1c780 64 65 2d 3e 6e 52 65 66 3e 30 20 29 3b 0a 20 20  de->nRef>0 );.  
1c790 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 66 2d 2d  pShmNode->nRef--
1c7a0 3b 0a 20 20 69 66 28 20 70 53 68 6d 4e 6f 64 65  ;.  if( pShmNode
1c7b0 2d 3e 6e 52 65 66 3d 3d 30 20 29 7b 0a 20 20 20  ->nRef==0 ){.   
1c7c0 20 69 66 28 20 64 65 6c 65 74 65 46 6c 61 67 20   if( deleteFlag 
1c7d0 29 20 75 6e 6c 69 6e 6b 28 70 53 68 6d 4e 6f 64  ) unlink(pShmNod
1c7e0 65 2d 3e 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20  e->zFilename);. 
1c7f0 20 20 20 75 6e 69 78 53 68 6d 50 75 72 67 65 28     unixShmPurge(
1c800 70 44 62 46 64 29 3b 0a 20 20 7d 0a 20 20 75 6e  pDbFd);.  }.  un
1c810 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a  ixLeaveMutex();.
1c820 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
1c830 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 51 75  _OK;.}../*.** Qu
1c840 65 72 79 20 61 6e 64 2f 6f 72 20 63 68 61 6e 67  ery and/or chang
1c850 65 73 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74  es the size of t
1c860 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 73 74  he underlying st
1c870 6f 72 61 67 65 20 66 6f 72 0a 2a 2a 20 61 20 73  orage for.** a s
1c880 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 73 65 67  hared-memory seg
1c890 6d 65 6e 74 2e 20 20 54 68 65 20 72 65 71 53 69  ment.  The reqSi
1c8a0 7a 65 20 70 61 72 61 6d 65 74 65 72 20 69 73 20  ze parameter is 
1c8b0 74 68 65 20 6e 65 77 20 73 69 7a 65 0a 2a 2a 20  the new size.** 
1c8c0 6f 66 20 74 68 65 20 75 6e 64 65 72 6c 79 69 6e  of the underlyin
1c8d0 67 20 73 74 6f 72 61 67 65 2c 20 6f 72 20 2d 31  g storage, or -1
1c8e0 20 74 6f 20 64 6f 20 6a 75 73 74 20 61 20 71 75   to do just a qu
1c8f0 65 72 79 2e 20 20 54 68 65 20 73 69 7a 65 0a 2a  ery.  The size.*
1c900 2a 20 6f 66 20 74 68 65 20 75 6e 64 65 72 6c 79  * of the underly
1c910 69 6e 67 20 73 74 6f 72 61 67 65 20 28 61 66 74  ing storage (aft
1c920 65 72 20 72 65 73 69 7a 69 6e 67 20 69 66 20 72  er resizing if r
1c930 65 73 69 7a 69 6e 67 20 6f 63 63 75 72 73 29 20  esizing occurs) 
1c940 69 73 0a 2a 2a 20 77 72 69 74 74 65 6e 20 69 6e  is.** written in
1c950 74 6f 20 70 4e 65 77 53 69 7a 65 2e 0a 2a 2a 0a  to pNewSize..**.
1c960 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
1c970 64 6f 65 73 20 6e 6f 74 20 28 6e 65 63 65 73 73  does not (necess
1c980 61 72 69 6c 79 29 20 63 68 61 6e 67 65 20 74 68  arily) change th
1c990 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 6d 61  e size of the ma
1c9a0 70 70 69 6e 67 20 0a 2a 2a 20 6f 66 20 74 68 65  pping .** of the
1c9b0 20 75 6e 64 65 72 6c 79 69 6e 67 20 73 74 6f 72   underlying stor
1c9c0 61 67 65 20 69 6e 74 6f 20 6d 65 6d 6f 72 79 2e  age into memory.
1c9d0 20 20 55 73 65 20 78 53 68 6d 47 65 74 28 29 20    Use xShmGet() 
1c9e0 74 6f 20 63 68 61 6e 67 65 0a 2a 2a 20 74 68 65  to change.** the
1c9f0 20 6d 61 70 70 69 6e 67 20 73 69 7a 65 2e 0a 2a   mapping size..*
1ca00 2a 0a 2a 2a 20 54 68 65 20 72 65 71 53 69 7a 65  *.** The reqSize
1ca10 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 74 68   parameter is th
1ca20 65 20 6d 69 6e 69 6d 75 6d 20 73 69 7a 65 20 72  e minimum size r
1ca30 65 71 75 65 73 74 65 64 2e 20 20 54 68 65 20 69  equested.  The i
1ca40 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 0a 2a 2a  mplementation.**
1ca50 20 69 73 20 66 72 65 65 20 74 6f 20 65 78 70 61   is free to expa
1ca60 6e 64 20 74 68 65 20 73 74 6f 72 61 67 65 20 74  nd the storage t
1ca70 6f 20 73 6f 6d 65 20 6c 61 72 67 65 72 20 61 6d  o some larger am
1ca80 6f 75 6e 74 20 69 66 20 69 74 20 63 68 6f 6f 73  ount if it choos
1ca90 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  es..*/.static in
1caa0 74 20 75 6e 69 78 53 68 6d 53 69 7a 65 28 0a 20  t unixShmSize(. 
1cab0 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66   sqlite3_file *f
1cac0 64 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  d,         /* Th
1cad0 65 20 6f 70 65 6e 20 64 61 74 61 62 61 73 65 20  e open database 
1cae0 66 69 6c 65 20 68 6f 6c 64 69 6e 67 20 53 48 4d  file holding SHM
1caf0 20 2a 2f 0a 20 20 69 6e 74 20 72 65 71 53 69 7a   */.  int reqSiz
1cb00 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
1cb10 2f 2a 20 52 65 71 75 65 73 74 65 64 20 73 69 7a  /* Requested siz
1cb20 65 2e 20 20 2d 31 20 66 6f 72 20 71 75 65 72 79  e.  -1 for query
1cb30 20 6f 6e 6c 79 20 2a 2f 0a 20 20 69 6e 74 20 2a   only */.  int *
1cb40 70 4e 65 77 53 69 7a 65 20 20 20 20 20 20 20 20  pNewSize        
1cb50 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 6e 65       /* Write ne
1cb60 77 20 73 69 7a 65 20 68 65 72 65 20 2a 2f 0a 29  w size here */.)
1cb70 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 44  {.  unixFile *pD
1cb80 62 46 64 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a  bFd = (unixFile*
1cb90 29 66 64 3b 0a 20 20 75 6e 69 78 53 68 6d 20 2a  )fd;.  unixShm *
1cba0 70 20 3d 20 70 44 62 46 64 2d 3e 70 53 68 6d 3b  p = pDbFd->pShm;
1cbb0 0a 20 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20 2a  .  unixShmNode *
1cbc0 70 53 68 6d 4e 6f 64 65 20 3d 20 70 2d 3e 70 53  pShmNode = p->pS
1cbd0 68 6d 4e 6f 64 65 3b 0a 20 20 69 6e 74 20 72 63  hmNode;.  int rc
1cbe0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
1cbf0 73 74 72 75 63 74 20 73 74 61 74 20 73 53 74 61  struct stat sSta
1cc00 74 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 53  t;..  assert( pS
1cc10 68 6d 4e 6f 64 65 3d 3d 70 44 62 46 64 2d 3e 70  hmNode==pDbFd->p
1cc20 49 6e 6f 64 65 2d 3e 70 53 68 6d 4e 6f 64 65 20  Inode->pShmNode 
1cc30 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53 68  );.  assert( pSh
1cc40 6d 4e 6f 64 65 2d 3e 70 49 6e 6f 64 65 3d 3d 70  mNode->pInode==p
1cc50 44 62 46 64 2d 3e 70 49 6e 6f 64 65 20 29 3b 0a  DbFd->pInode );.
1cc60 0a 20 20 2f 2a 20 4f 6e 20 61 20 71 75 65 72 79  .  /* On a query
1cc70 2c 20 74 68 69 73 20 6c 6f 6f 70 20 72 75 6e 73  , this loop runs
1cc80 20 6f 6e 63 65 2e 20 20 57 68 65 6e 20 72 65 71   once.  When req
1cc90 53 69 7a 65 3e 3d 30 2c 20 74 68 65 20 6c 6f 6f  Size>=0, the loo
1cca0 70 20 70 6f 74 65 6e 74 69 61 6c 6c 79 0a 20 20  p potentially.  
1ccb0 2a 2a 20 72 75 6e 73 20 74 77 69 63 65 2c 20 65  ** runs twice, e
1ccc0 78 63 65 70 74 20 69 66 20 74 68 65 20 61 63 74  xcept if the act
1ccd0 75 61 6c 20 73 69 7a 65 20 69 73 20 61 6c 72 65  ual size is alre
1cce0 61 64 79 20 67 72 65 61 74 65 72 20 74 68 61 6e  ady greater than
1ccf0 20 6f 72 20 65 71 75 61 6c 0a 20 20 2a 2a 20 74   or equal.  ** t
1cd00 6f 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20  o the requested 
1cd10 73 69 7a 65 2c 20 72 65 71 53 69 7a 65 20 69 73  size, reqSize is
1cd20 20 73 65 74 20 74 6f 20 2d 31 20 6f 6e 20 74 68   set to -1 on th
1cd30 65 20 66 69 72 73 74 20 69 74 65 72 61 74 69 6f  e first iteratio
1cd40 6e 20 61 6e 64 0a 20 20 2a 2a 20 74 68 65 20 6c  n and.  ** the l
1cd50 6f 6f 70 20 6f 6e 6c 79 20 72 75 6e 73 20 6f 6e  oop only runs on
1cd60 63 65 2e 0a 20 20 2a 2f 0a 20 20 77 68 69 6c 65  ce..  */.  while
1cd70 28 20 31 20 29 7b 0a 20 20 20 20 69 66 28 20 66  ( 1 ){.    if( f
1cd80 73 74 61 74 28 70 53 68 6d 4e 6f 64 65 2d 3e 68  stat(pShmNode->h
1cd90 2c 20 26 73 53 74 61 74 29 3d 3d 30 20 29 7b 0a  , &sStat)==0 ){.
1cda0 20 20 20 20 20 20 2a 70 4e 65 77 53 69 7a 65 20        *pNewSize 
1cdb0 3d 20 28 69 6e 74 29 73 53 74 61 74 2e 73 74 5f  = (int)sStat.st_
1cdc0 73 69 7a 65 3b 0a 20 20 20 20 20 20 69 66 28 20  size;.      if( 
1cdd0 72 65 71 53 69 7a 65 3e 3d 30 20 26 26 20 72 65  reqSize>=0 && re
1cde0 71 53 69 7a 65 3c 3d 28 69 6e 74 29 73 53 74 61  qSize<=(int)sSta
1cdf0 74 2e 73 74 5f 73 69 7a 65 20 29 20 62 72 65 61  t.st_size ) brea
1ce00 6b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  k;.    }else{.  
1ce10 20 20 20 20 2a 70 4e 65 77 53 69 7a 65 20 3d 20      *pNewSize = 
1ce20 30 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  0;.      rc = SQ
1ce30 4c 49 54 45 5f 49 4f 45 52 52 3b 0a 20 20 20 20  LITE_IOERR;.    
1ce40 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
1ce50 20 20 20 69 66 28 20 72 65 71 53 69 7a 65 3c 30     if( reqSize<0
1ce60 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 72 65   ) break;.    re
1ce70 71 53 69 7a 65 20 3d 20 28 72 65 71 53 69 7a 65  qSize = (reqSize
1ce80 20 2b 20 53 51 4c 49 54 45 5f 55 4e 49 58 5f 53   + SQLITE_UNIX_S
1ce90 48 4d 5f 49 4e 43 52 20 2d 20 31 29 2f 53 51 4c  HM_INCR - 1)/SQL
1cea0 49 54 45 5f 55 4e 49 58 5f 53 48 4d 5f 49 4e 43  ITE_UNIX_SHM_INC
1ceb0 52 3b 0a 20 20 20 20 72 65 71 53 69 7a 65 20 2a  R;.    reqSize *
1cec0 3d 20 53 51 4c 49 54 45 5f 55 4e 49 58 5f 53 48  = SQLITE_UNIX_SH
1ced0 4d 5f 49 4e 43 52 3b 0a 20 20 20 20 72 63 20 3d  M_INCR;.    rc =
1cee0 20 66 74 72 75 6e 63 61 74 65 28 70 53 68 6d 4e   ftruncate(pShmN
1cef0 6f 64 65 2d 3e 68 2c 20 72 65 71 53 69 7a 65 29  ode->h, reqSize)
1cf00 3b 0a 20 20 20 20 72 65 71 53 69 7a 65 20 3d 20  ;.    reqSize = 
1cf10 2d 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  -1;.  }.  return
1cf20 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 4d   rc;.}.../*.** M
1cf30 61 70 20 74 68 65 20 73 68 61 72 65 64 20 73 74  ap the shared st
1cf40 6f 72 61 67 65 20 69 6e 74 6f 20 6d 65 6d 6f 72  orage into memor
1cf50 79 2e 20 20 54 68 65 20 6d 69 6e 69 6d 75 6d 20  y.  The minimum 
1cf60 73 69 7a 65 20 6f 66 20 74 68 65 0a 2a 2a 20 6d  size of the.** m
1cf70 61 70 70 69 6e 67 20 73 68 6f 75 6c 64 20 62 65  apping should be
1cf80 20 72 65 71 4d 61 70 53 69 7a 65 20 69 66 20 72   reqMapSize if r
1cf90 65 71 4d 61 70 53 69 7a 65 20 69 73 20 70 6f 73  eqMapSize is pos
1cfa0 69 74 69 76 65 2e 20 20 49 66 0a 2a 2a 20 72 65  itive.  If.** re
1cfb0 71 4d 61 70 53 69 7a 65 20 69 73 20 7a 65 72 6f  qMapSize is zero
1cfc0 20 6f 72 20 6e 65 67 61 74 69 76 65 2c 20 74 68   or negative, th
1cfd0 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  e implementation
1cfe0 20 63 61 6e 20 63 68 6f 6f 73 65 0a 2a 2a 20 77   can choose.** w
1cff0 68 61 74 65 76 65 72 20 6d 61 70 70 69 6e 67 20  hatever mapping 
1d000 73 69 7a 65 20 69 73 20 63 6f 6e 76 65 6e 69 65  size is convenie
1d010 6e 74 2e 0a 2a 2a 0a 2a 2a 20 2a 70 70 42 75 66  nt..**.** *ppBuf
1d020 20 69 73 20 6d 61 64 65 20 74 6f 20 70 6f 69 6e   is made to poin
1d030 74 20 74 6f 20 74 68 65 20 6d 65 6d 6f 72 79 20  t to the memory 
1d040 77 68 69 63 68 20 69 73 20 61 20 6d 61 70 70 69  which is a mappi
1d050 6e 67 20 6f 66 20 74 68 65 0a 2a 2a 20 75 6e 64  ng of the.** und
1d060 65 72 6c 79 69 6e 67 20 73 74 6f 72 61 67 65 2e  erlying storage.
1d070 20 20 41 20 6d 75 74 65 78 20 69 73 20 61 63 71    A mutex is acq
1d080 75 69 72 65 64 20 74 6f 20 70 72 65 76 65 6e 74  uired to prevent
1d090 20 6f 74 68 65 72 20 74 68 72 65 61 64 73 0a 2a   other threads.*
1d0a0 2a 20 66 72 6f 6d 20 72 75 6e 6e 69 6e 67 20 77  * from running w
1d0b0 68 69 6c 65 20 2a 70 70 42 75 66 20 69 73 20 69  hile *ppBuf is i
1d0c0 6e 20 75 73 65 20 69 6e 20 6f 72 64 65 72 20 74  n use in order t
1d0d0 6f 20 70 72 65 76 65 6e 74 20 6f 74 68 65 72 20  o prevent other 
1d0e0 74 68 72 65 61 64 73 0a 2a 2a 20 72 65 6d 61 70  threads.** remap
1d0f0 70 69 6e 67 20 2a 70 70 42 75 66 20 6f 75 74 20  ping *ppBuf out 
1d100 66 72 6f 6d 20 75 6e 64 65 72 20 74 68 69 73 20  from under this 
1d110 74 68 72 65 61 64 2e 20 20 54 68 65 20 75 6e 69  thread.  The uni
1d120 78 53 68 6d 52 65 6c 65 61 73 65 28 29 0a 2a 2a  xShmRelease().**
1d130 20 63 61 6c 6c 20 77 69 6c 6c 20 72 65 6c 65 61   call will relea
1d140 73 65 20 74 68 65 20 6d 75 74 65 78 2e 20 20 48  se the mutex.  H
1d150 6f 77 65 76 65 72 2c 20 69 66 20 74 68 65 20 6c  owever, if the l
1d160 6f 63 6b 20 73 74 61 74 65 20 69 73 20 43 48 45  ock state is CHE
1d170 43 4b 50 4f 49 4e 54 2c 0a 2a 2a 20 74 68 65 20  CKPOINT,.** the 
1d180 6d 75 74 65 78 20 69 73 20 6e 6f 74 20 61 63 71  mutex is not acq
1d190 75 69 72 65 64 20 62 65 63 61 75 73 65 20 43 48  uired because CH
1d1a0 45 43 4b 50 4f 49 4e 54 20 77 69 6c 6c 20 6e 65  ECKPOINT will ne
1d1b0 76 65 72 20 72 65 6d 61 70 20 74 68 65 0a 2a 2a  ver remap the.**
1d1c0 20 62 75 66 66 65 72 2e 20 20 52 45 43 4f 56 45   buffer.  RECOVE
1d1d0 52 20 6d 69 67 68 74 20 72 65 6d 61 70 2c 20 74  R might remap, t
1d1e0 68 6f 75 67 68 2c 20 73 6f 20 43 48 45 43 4b 50  hough, so CHECKP
1d1f0 4f 49 4e 54 20 77 69 6c 6c 20 61 63 71 75 69 72  OINT will acquir
1d200 65 0a 2a 2a 20 74 68 65 20 6d 75 74 65 78 20 69  e.** the mutex i
1d210 66 20 61 6e 64 20 77 68 65 6e 20 69 74 20 70 72  f and when it pr
1d220 6f 6d 6f 74 65 73 20 74 6f 20 52 45 43 4f 56 45  omotes to RECOVE
1d230 52 2e 0a 2a 2a 0a 2a 2a 20 52 45 43 4f 56 45 52  R..**.** RECOVER
1d240 20 6e 65 65 64 73 20 74 6f 20 62 65 20 61 74 6f   needs to be ato
1d250 6d 69 63 2e 20 20 54 68 65 20 73 61 6d 65 20 6d  mic.  The same m
1d260 75 74 65 78 20 74 68 61 74 20 70 72 65 76 65 6e  utex that preven
1d270 74 73 20 2a 70 70 42 75 66 20 66 72 6f 6d 0a 2a  ts *ppBuf from.*
1d280 2a 20 62 65 69 6e 67 20 72 65 6d 61 70 70 65 64  * being remapped
1d290 20 61 6c 73 6f 20 70 72 65 76 65 6e 74 73 20 6d   also prevents m
1d2a0 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20 74 68 72  ore than one thr
1d2b0 65 61 64 20 66 72 6f 6d 20 62 65 69 6e 67 20 69  ead from being i
1d2c0 6e 0a 2a 2a 20 52 45 43 4f 56 45 52 20 61 74 20  n.** RECOVER at 
1d2d0 61 20 74 69 6d 65 2e 20 20 42 75 74 2c 20 52 45  a time.  But, RE
1d2e0 43 4f 56 45 52 20 73 6f 6d 65 74 69 6d 65 73 20  COVER sometimes 
1d2f0 77 61 6e 74 73 20 74 6f 20 72 65 6d 61 70 20 69  wants to remap i
1d300 74 73 65 6c 66 2e 0a 2a 2a 20 54 6f 20 70 72 65  tself..** To pre
1d310 76 65 6e 74 20 52 45 43 4f 56 45 52 20 66 72 6f  vent RECOVER fro
1d320 6d 20 6c 6f 73 69 6e 67 20 69 74 73 20 6c 6f 63  m losing its loc
1d330 6b 20 77 68 69 6c 65 20 72 65 6d 61 70 70 69 6e  k while remappin
1d340 67 2c 20 74 68 65 0a 2a 2a 20 6d 75 74 65 78 20  g, the.** mutex 
1d350 69 73 20 6e 6f 74 20 72 65 6c 65 61 73 65 64 20  is not released 
1d360 62 79 20 75 6e 69 78 53 68 6d 52 65 6c 65 61 73  by unixShmReleas
1d370 65 28 29 20 77 68 65 6e 20 69 6e 20 52 45 43 4f  e() when in RECO
1d380 56 45 52 2e 0a 2a 2a 0a 2a 2a 20 2a 70 4e 65 77  VER..**.** *pNew
1d390 4d 61 70 53 69 7a 65 20 69 73 20 73 65 74 20 74  MapSize is set t
1d3a0 6f 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68  o the size of th
1d3b0 65 20 6d 61 70 70 69 6e 67 2e 0a 2a 2a 0a 2a 2a  e mapping..**.**
1d3c0 20 2a 70 70 42 75 66 20 61 6e 64 20 2a 70 4e 65   *ppBuf and *pNe
1d3d0 77 4d 61 70 53 69 7a 65 20 6d 69 67 68 74 20 62  wMapSize might b
1d3e0 65 20 4e 55 4c 4c 20 61 6e 64 20 7a 65 72 6f 20  e NULL and zero 
1d3f0 69 66 20 6e 6f 20 73 70 61 63 65 20 68 61 73 0a  if no space has.
1d400 2a 2a 20 79 65 74 20 62 65 65 6e 20 61 6c 6c 6f  ** yet been allo
1d410 63 61 74 65 64 20 74 6f 20 74 68 65 20 75 6e 64  cated to the und
1d420 65 72 6c 79 69 6e 67 20 73 74 6f 72 61 67 65 2e  erlying storage.
1d430 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75  .*/.static int u
1d440 6e 69 78 53 68 6d 47 65 74 28 0a 20 20 73 71 6c  nixShmGet(.  sql
1d450 69 74 65 33 5f 66 69 6c 65 20 2a 66 64 2c 20 20  ite3_file *fd,  
1d460 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73        /* Databas
1d470 65 20 66 69 6c 65 20 68 6f 6c 64 69 6e 67 20 73  e file holding s
1d480 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 2a 2f 0a  hared memory */.
1d490 20 20 69 6e 74 20 72 65 71 4d 61 70 53 69 7a 65    int reqMapSize
1d4a0 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65  ,          /* Re
1d4b0 71 75 65 73 74 65 64 20 73 69 7a 65 20 6f 66 20  quested size of 
1d4c0 6d 61 70 70 69 6e 67 2e 20 2d 31 20 6d 65 61 6e  mapping. -1 mean
1d4d0 73 20 64 6f 6e 27 74 20 63 61 72 65 20 2a 2f 0a  s don't care */.
1d4e0 20 20 69 6e 74 20 2a 70 4e 65 77 4d 61 70 53 69    int *pNewMapSi
1d4f0 7a 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 57 72  ze,        /* Wr
1d500 69 74 65 20 6e 65 77 20 73 69 7a 65 20 6f 66 20  ite new size of 
1d510 6d 61 70 70 69 6e 67 20 68 65 72 65 20 2a 2f 0a  mapping here */.
1d520 20 20 76 6f 69 64 20 2a 2a 70 70 42 75 66 20 20    void **ppBuf  
1d530 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72             /* Wr
1d540 69 74 65 20 6d 61 70 70 69 6e 67 20 62 75 66 66  ite mapping buff
1d550 65 72 20 6f 72 69 67 69 6e 20 68 65 72 65 20 2a  er origin here *
1d560 2f 0a 29 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20  /.){.  unixFile 
1d570 2a 70 44 62 46 64 20 3d 20 28 75 6e 69 78 46 69  *pDbFd = (unixFi
1d580 6c 65 2a 29 66 64 3b 0a 20 20 75 6e 69 78 53 68  le*)fd;.  unixSh
1d590 6d 20 2a 70 20 3d 20 70 44 62 46 64 2d 3e 70 53  m *p = pDbFd->pS
1d5a0 68 6d 3b 0a 20 20 75 6e 69 78 53 68 6d 4e 6f 64  hm;.  unixShmNod
1d5b0 65 20 2a 70 53 68 6d 4e 6f 64 65 20 3d 20 70 2d  e *pShmNode = p-
1d5c0 3e 70 53 68 6d 4e 6f 64 65 3b 0a 20 20 69 6e 74  >pShmNode;.  int
1d5d0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
1d5e0 0a 0a 20 20 61 73 73 65 72 74 28 20 70 53 68 6d  ..  assert( pShm
1d5f0 4e 6f 64 65 3d 3d 70 44 62 46 64 2d 3e 70 49 6e  Node==pDbFd->pIn
1d600 6f 64 65 2d 3e 70 53 68 6d 4e 6f 64 65 20 29 3b  ode->pShmNode );
1d610 0a 20 20 61 73 73 65 72 74 28 20 70 53 68 6d 4e  .  assert( pShmN
1d620 6f 64 65 2d 3e 70 49 6e 6f 64 65 3d 3d 70 44 62  ode->pInode==pDb
1d630 46 64 2d 3e 70 49 6e 6f 64 65 20 29 3b 0a 0a 20  Fd->pInode );.. 
1d640 20 69 66 28 20 70 2d 3e 6c 6f 63 6b 53 74 61 74   if( p->lockStat
1d650 65 21 3d 53 51 4c 49 54 45 5f 53 48 4d 5f 43 48  e!=SQLITE_SHM_CH
1d660 45 43 4b 50 4f 49 4e 54 20 26 26 20 70 2d 3e 68  ECKPOINT && p->h
1d670 61 73 4d 75 74 65 78 42 75 66 3d 3d 30 20 29 7b  asMutexBuf==0 ){
1d680 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c  .    assert( sql
1d690 69 74 65 33 5f 6d 75 74 65 78 5f 6e 6f 74 68 65  ite3_mutex_nothe
1d6a0 6c 64 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74  ld(pShmNode->mut
1d6b0 65 78 29 20 29 3b 0a 20 20 20 20 73 71 6c 69 74  ex) );.    sqlit
1d6c0 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 70  e3_mutex_enter(p
1d6d0 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 42 75  ShmNode->mutexBu
1d6e0 66 29 3b 0a 20 20 20 20 70 2d 3e 68 61 73 4d 75  f);.    p->hasMu
1d6f0 74 65 78 42 75 66 20 3d 20 31 3b 0a 20 20 7d 0a  texBuf = 1;.  }.
1d700 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
1d710 65 6e 74 65 72 28 70 53 68 6d 4e 6f 64 65 2d 3e  enter(pShmNode->
1d720 6d 75 74 65 78 29 3b 0a 20 20 69 66 28 20 70 53  mutex);.  if( pS
1d730 68 6d 4e 6f 64 65 2d 3e 73 7a 4d 61 70 3d 3d 30  hmNode->szMap==0
1d740 20 7c 7c 20 72 65 71 4d 61 70 53 69 7a 65 3e 70   || reqMapSize>p
1d750 53 68 6d 4e 6f 64 65 2d 3e 73 7a 4d 61 70 20 29  ShmNode->szMap )
1d760 7b 0a 20 20 20 20 69 6e 74 20 61 63 74 75 61 6c  {.    int actual
1d770 53 69 7a 65 3b 0a 20 20 20 20 69 66 28 20 75 6e  Size;.    if( un
1d780 69 78 53 68 6d 53 69 7a 65 28 66 64 2c 20 2d 31  ixShmSize(fd, -1
1d790 2c 20 26 61 63 74 75 61 6c 53 69 7a 65 29 3d 3d  , &actualSize)==
1d7a0 53 51 4c 49 54 45 5f 4f 4b 0a 20 20 20 20 20 26  SQLITE_OK.     &
1d7b0 26 20 72 65 71 4d 61 70 53 69 7a 65 3c 61 63 74  & reqMapSize<act
1d7c0 75 61 6c 53 69 7a 65 0a 20 20 20 20 29 7b 0a 20  ualSize.    ){. 
1d7d0 20 20 20 20 20 72 65 71 4d 61 70 53 69 7a 65 20       reqMapSize 
1d7e0 3d 20 61 63 74 75 61 6c 53 69 7a 65 3b 0a 20 20  = actualSize;.  
1d7f0 20 20 7d 0a 20 20 20 20 69 66 28 20 70 53 68 6d    }.    if( pShm
1d800 4e 6f 64 65 2d 3e 70 4d 4d 61 70 42 75 66 20 29  Node->pMMapBuf )
1d810 7b 0a 20 20 20 20 20 20 6d 75 6e 6d 61 70 28 70  {.      munmap(p
1d820 53 68 6d 4e 6f 64 65 2d 3e 70 4d 4d 61 70 42 75  ShmNode->pMMapBu
1d830 66 2c 20 70 53 68 6d 4e 6f 64 65 2d 3e 73 7a 4d  f, pShmNode->szM
1d840 61 70 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  ap);.    }.    p
1d850 53 68 6d 4e 6f 64 65 2d 3e 70 4d 4d 61 70 42 75  ShmNode->pMMapBu
1d860 66 20 3d 20 6d 6d 61 70 28 30 2c 20 72 65 71 4d  f = mmap(0, reqM
1d870 61 70 53 69 7a 65 2c 20 50 52 4f 54 5f 52 45 41  apSize, PROT_REA
1d880 44 7c 50 52 4f 54 5f 57 52 49 54 45 2c 20 4d 41  D|PROT_WRITE, MA
1d890 50 5f 53 48 41 52 45 44 2c 0a 20 20 20 20 20 20  P_SHARED,.      
1d8a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d8b0 20 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 68       pShmNode->h
1d8c0 2c 20 30 29 3b 0a 20 20 20 20 70 53 68 6d 4e 6f  , 0);.    pShmNo
1d8d0 64 65 2d 3e 73 7a 4d 61 70 20 3d 20 70 53 68 6d  de->szMap = pShm
1d8e0 4e 6f 64 65 2d 3e 70 4d 4d 61 70 42 75 66 20 3f  Node->pMMapBuf ?
1d8f0 20 72 65 71 4d 61 70 53 69 7a 65 20 3a 20 30 3b   reqMapSize : 0;
1d900 0a 20 20 7d 0a 20 20 2a 70 4e 65 77 4d 61 70 53  .  }.  *pNewMapS
1d910 69 7a 65 20 3d 20 70 53 68 6d 4e 6f 64 65 2d 3e  ize = pShmNode->
1d920 73 7a 4d 61 70 3b 0a 20 20 2a 70 70 42 75 66 20  szMap;.  *ppBuf 
1d930 3d 20 70 53 68 6d 4e 6f 64 65 2d 3e 70 4d 4d 61  = pShmNode->pMMa
1d940 70 42 75 66 3b 0a 20 20 73 71 6c 69 74 65 33 5f  pBuf;.  sqlite3_
1d950 6d 75 74 65 78 5f 6c 65 61 76 65 28 70 53 68 6d  mutex_leave(pShm
1d960 4e 6f 64 65 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  Node->mutex);.  
1d970 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
1d980 0a 2a 2a 20 52 65 6c 65 61 73 65 20 74 68 65 20  .** Release the 
1d990 6c 6f 63 6b 20 68 65 6c 64 20 6f 6e 20 74 68 65  lock held on the
1d9a0 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 73   shared memory s
1d9b0 65 67 6d 65 6e 74 20 74 6f 20 74 68 61 74 20 6f  egment to that o
1d9c0 74 68 65 72 0a 2a 2a 20 74 68 72 65 61 64 73 20  ther.** threads 
1d9d0 61 72 65 20 66 72 65 65 20 74 6f 20 72 65 73 69  are free to resi
1d9e0 7a 65 20 69 74 20 69 66 20 6e 65 63 65 73 73 61  ze it if necessa
1d9f0 72 79 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ry..**.** If the
1da00 20 6c 6f 63 6b 20 69 73 20 6e 6f 74 20 63 75 72   lock is not cur
1da10 72 65 6e 74 6c 79 20 68 65 6c 64 2c 20 74 68 69  rently held, thi
1da20 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 68  s routine is a h
1da30 61 72 6d 6c 65 73 73 20 6e 6f 2d 6f 70 2e 0a 2a  armless no-op..*
1da40 2a 0a 2a 2a 20 49 66 20 74 68 65 20 73 68 61 72  *.** If the shar
1da50 65 64 2d 6d 65 6d 6f 72 79 20 6f 62 6a 65 63 74  ed-memory object
1da60 20 69 73 20 69 6e 20 6c 6f 63 6b 20 73 74 61 74   is in lock stat
1da70 65 20 52 45 43 4f 56 45 52 2c 20 74 68 65 6e 20  e RECOVER, then 
1da80 77 65 20 64 6f 20 6e 6f 74 0a 2a 2a 20 72 65 61  we do not.** rea
1da90 6c 6c 79 20 77 61 6e 74 20 74 6f 20 72 65 6c 65  lly want to rele
1daa0 61 73 65 20 74 68 65 20 6c 6f 63 6b 2c 20 73 6f  ase the lock, so
1dab0 20 69 6e 20 74 68 61 74 20 63 61 73 65 20 74 6f   in that case to
1dac0 6f 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a  o, this routine.
1dad0 2a 2a 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a  ** is a no-op..*
1dae0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69  /.static int uni
1daf0 78 53 68 6d 52 65 6c 65 61 73 65 28 73 71 6c 69  xShmRelease(sqli
1db00 74 65 33 5f 66 69 6c 65 20 2a 66 64 29 7b 0a 20  te3_file *fd){. 
1db10 20 75 6e 69 78 46 69 6c 65 20 2a 70 44 62 46 64   unixFile *pDbFd
1db20 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 66 64   = (unixFile*)fd
1db30 3b 0a 20 20 75 6e 69 78 53 68 6d 20 2a 70 20 3d  ;.  unixShm *p =
1db40 20 70 44 62 46 64 2d 3e 70 53 68 6d 3b 0a 0a 20   pDbFd->pShm;.. 
1db50 20 69 66 28 20 70 2d 3e 68 61 73 4d 75 74 65 78   if( p->hasMutex
1db60 42 75 66 20 26 26 20 70 2d 3e 6c 6f 63 6b 53 74  Buf && p->lockSt
1db70 61 74 65 21 3d 53 51 4c 49 54 45 5f 53 48 4d 5f  ate!=SQLITE_SHM_
1db80 52 45 43 4f 56 45 52 20 29 7b 0a 20 20 20 20 61  RECOVER ){.    a
1db90 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
1dba0 75 74 65 78 5f 6e 6f 74 68 65 6c 64 28 70 2d 3e  utex_notheld(p->
1dbb0 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 29  pShmNode->mutex)
1dbc0 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   );.    sqlite3_
1dbd0 6d 75 74 65 78 5f 6c 65 61 76 65 28 70 2d 3e 70  mutex_leave(p->p
1dbe0 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 42 75  ShmNode->mutexBu
1dbf0 66 29 3b 0a 20 20 20 20 70 2d 3e 68 61 73 4d 75  f);.    p->hasMu
1dc00 74 65 78 42 75 66 20 3d 20 30 3b 0a 20 20 7d 0a  texBuf = 0;.  }.
1dc10 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1dc20 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 79 6d  OK;.}../*.** Sym
1dc30 62 6f 6c 69 63 20 6e 61 6d 65 73 20 66 6f 72 20  bolic names for 
1dc40 4c 4f 43 4b 20 73 74 61 74 65 73 20 75 73 65 64  LOCK states used
1dc50 20 66 6f 72 20 64 65 62 75 67 67 69 6e 67 2e 0a   for debugging..
1dc60 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  */.#ifdef SQLITE
1dc70 5f 44 45 42 55 47 0a 73 74 61 74 69 63 20 63 6f  _DEBUG.static co
1dc80 6e 73 74 20 63 68 61 72 20 2a 61 7a 4c 6b 4e 61  nst char *azLkNa
1dc90 6d 65 5b 5d 20 3d 20 7b 0a 20 20 22 55 4e 4c 4f  me[] = {.  "UNLO
1dca0 43 4b 22 2c 0a 20 20 22 52 45 41 44 22 2c 0a 20  CK",.  "READ",. 
1dcb0 20 22 52 45 41 44 5f 46 55 4c 4c 22 2c 0a 20 20   "READ_FULL",.  
1dcc0 22 57 52 49 54 45 22 2c 0a 20 20 22 50 45 4e 44  "WRITE",.  "PEND
1dcd0 49 4e 47 22 2c 0a 20 20 22 43 48 45 43 4b 50 4f  ING",.  "CHECKPO
1dce0 49 4e 54 22 2c 0a 20 20 22 52 45 43 4f 56 45 52  INT",.  "RECOVER
1dcf0 22 0a 7d 3b 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a  ".};.#endif.../*
1dd00 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 6c  .** Change the l
1dd10 6f 63 6b 20 73 74 61 74 65 20 66 6f 72 20 61 20  ock state for a 
1dd20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 73 65  shared-memory se
1dd30 67 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63  gment..*/.static
1dd40 20 69 6e 74 20 75 6e 69 78 53 68 6d 4c 6f 63 6b   int unixShmLock
1dd50 28 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65  (.  sqlite3_file
1dd60 20 2a 66 64 2c 20 20 20 20 20 20 20 20 20 20 2f   *fd,          /
1dd70 2a 20 44 61 74 61 62 61 73 65 20 66 69 6c 65 20  * Database file 
1dd80 68 6f 6c 64 69 6e 67 20 74 68 65 20 73 68 61 72  holding the shar
1dd90 65 64 20 6d 65 6d 6f 72 79 20 2a 2f 0a 20 20 69  ed memory */.  i
1dda0 6e 74 20 64 65 73 69 72 65 64 4c 6f 63 6b 2c 20  nt desiredLock, 
1ddb0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65            /* One
1ddc0 20 6f 66 20 53 51 4c 49 54 45 5f 53 48 4d 5f 78   of SQLITE_SHM_x
1ddd0 78 78 78 78 20 6c 6f 63 6b 69 6e 67 20 73 74 61  xxxx locking sta
1dde0 74 65 73 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 47  tes */.  int *pG
1ddf0 6f 74 4c 6f 63 6b 20 20 20 20 20 20 20 20 20 20  otLock          
1de00 20 20 20 20 2f 2a 20 54 68 65 20 6c 6f 63 6b 20      /* The lock 
1de10 79 6f 75 20 61 63 74 75 61 6c 6c 79 20 67 6f 74  you actually got
1de20 20 2a 2f 0a 29 7b 0a 20 20 75 6e 69 78 46 69 6c   */.){.  unixFil
1de30 65 20 2a 70 44 62 46 64 20 3d 20 28 75 6e 69 78  e *pDbFd = (unix
1de40 46 69 6c 65 2a 29 66 64 3b 0a 20 20 75 6e 69 78  File*)fd;.  unix
1de50 53 68 6d 20 2a 70 20 3d 20 70 44 62 46 64 2d 3e  Shm *p = pDbFd->
1de60 70 53 68 6d 3b 0a 20 20 75 6e 69 78 53 68 6d 4e  pShm;.  unixShmN
1de70 6f 64 65 20 2a 70 53 68 6d 4e 6f 64 65 20 3d 20  ode *pShmNode = 
1de80 70 2d 3e 70 53 68 6d 4e 6f 64 65 3b 0a 20 20 69  p->pShmNode;.  i
1de90 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 50  nt rc = SQLITE_P
1dea0 52 4f 54 4f 43 4f 4c 3b 0a 0a 20 20 61 73 73 65  ROTOCOL;..  asse
1deb0 72 74 28 20 70 53 68 6d 4e 6f 64 65 3d 3d 70 44  rt( pShmNode==pD
1dec0 62 46 64 2d 3e 70 49 6e 6f 64 65 2d 3e 70 53 68  bFd->pInode->pSh
1ded0 6d 4e 6f 64 65 20 29 3b 0a 20 20 61 73 73 65 72  mNode );.  asser
1dee0 74 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 70 49 6e  t( pShmNode->pIn
1def0 6f 64 65 3d 3d 70 44 62 46 64 2d 3e 70 49 6e 6f  ode==pDbFd->pIno
1df00 64 65 20 29 3b 0a 0a 20 20 2f 2a 20 4e 6f 74 65  de );..  /* Note
1df10 20 74 68 61 74 20 53 51 4c 49 54 45 5f 53 48 4d   that SQLITE_SHM
1df20 5f 52 45 41 44 5f 46 55 4c 4c 20 61 6e 64 20 53  _READ_FULL and S
1df30 51 4c 49 54 45 5f 53 48 4d 5f 50 45 4e 44 49 4e  QLITE_SHM_PENDIN
1df40 47 20 61 72 65 20 6e 65 76 65 72 0a 20 20 2a 2a  G are never.  **
1df50 20 64 69 72 65 63 74 6c 79 20 72 65 71 75 65 73   directly reques
1df60 74 65 64 3b 20 74 68 65 79 20 61 72 65 20 73 69  ted; they are si
1df70 64 65 20 65 66 66 65 63 74 73 20 66 72 6f 6d 20  de effects from 
1df80 72 65 71 75 65 73 74 69 6e 67 0a 20 20 2a 2a 20  requesting.  ** 
1df90 53 51 4c 49 54 45 5f 53 48 4d 5f 52 45 41 44 20  SQLITE_SHM_READ 
1dfa0 61 6e 64 20 53 51 4c 49 54 45 5f 53 48 4d 5f 43  and SQLITE_SHM_C
1dfb0 48 45 43 4b 50 4f 49 4e 54 2c 20 72 65 73 70 65  HECKPOINT, respe
1dfc0 63 74 69 76 65 6c 79 2e 0a 20 20 2a 2f 0a 20 20  ctively..  */.  
1dfd0 61 73 73 65 72 74 28 20 64 65 73 69 72 65 64 4c  assert( desiredL
1dfe0 6f 63 6b 3d 3d 53 51 4c 49 54 45 5f 53 48 4d 5f  ock==SQLITE_SHM_
1dff0 55 4e 4c 4f 43 4b 0a 20 20 20 20 20 20 20 7c 7c  UNLOCK.       ||
1e000 20 64 65 73 69 72 65 64 4c 6f 63 6b 3d 3d 53 51   desiredLock==SQ
1e010 4c 49 54 45 5f 53 48 4d 5f 52 45 41 44 0a 20 20  LITE_SHM_READ.  
1e020 20 20 20 20 20 7c 7c 20 64 65 73 69 72 65 64 4c       || desiredL
1e030 6f 63 6b 3d 3d 53 51 4c 49 54 45 5f 53 48 4d 5f  ock==SQLITE_SHM_
1e040 57 52 49 54 45 0a 20 20 20 20 20 20 20 7c 7c 20  WRITE.       || 
1e050 64 65 73 69 72 65 64 4c 6f 63 6b 3d 3d 53 51 4c  desiredLock==SQL
1e060 49 54 45 5f 53 48 4d 5f 43 48 45 43 4b 50 4f 49  ITE_SHM_CHECKPOI
1e070 4e 54 0a 20 20 20 20 20 20 20 7c 7c 20 64 65 73  NT.       || des
1e080 69 72 65 64 4c 6f 63 6b 3d 3d 53 51 4c 49 54 45  iredLock==SQLITE
1e090 5f 53 48 4d 5f 52 45 43 4f 56 45 52 20 29 3b 0a  _SHM_RECOVER );.
1e0a0 0a 20 20 2f 2a 20 52 65 74 75 72 6e 20 64 69 72  .  /* Return dir
1e0b0 65 63 74 6c 79 20 69 66 20 74 68 69 73 20 69 73  ectly if this is
1e0c0 20 6a 75 73 74 20 61 20 6c 6f 63 6b 20 73 74 61   just a lock sta
1e0d0 74 65 20 71 75 65 72 79 2c 20 6f 72 20 69 66 0a  te query, or if.
1e0e0 20 20 2a 2a 20 74 68 65 20 63 6f 6e 6e 65 63 74    ** the connect
1e0f0 69 6f 6e 20 69 73 20 61 6c 72 65 61 64 79 20 69  ion is already i
1e100 6e 20 74 68 65 20 64 65 73 69 72 65 64 20 6c 6f  n the desired lo
1e110 63 6b 69 6e 67 20 73 74 61 74 65 2e 0a 20 20 2a  cking state..  *
1e120 2f 0a 20 20 69 66 28 20 64 65 73 69 72 65 64 4c  /.  if( desiredL
1e130 6f 63 6b 3d 3d 70 2d 3e 6c 6f 63 6b 53 74 61 74  ock==p->lockStat
1e140 65 0a 20 20 20 7c 7c 20 28 64 65 73 69 72 65 64  e.   || (desired
1e150 4c 6f 63 6b 3d 3d 53 51 4c 49 54 45 5f 53 48 4d  Lock==SQLITE_SHM
1e160 5f 52 45 41 44 20 26 26 20 70 2d 3e 6c 6f 63 6b  _READ && p->lock
1e170 53 74 61 74 65 3d 3d 53 51 4c 49 54 45 5f 53 48  State==SQLITE_SH
1e180 4d 5f 52 45 41 44 5f 46 55 4c 4c 29 0a 20 20 29  M_READ_FULL).  )
1e190 7b 0a 20 20 20 20 4f 53 54 52 41 43 45 28 28 22  {.    OSTRACE(("
1e1a0 53 48 4d 2d 4c 4f 43 4b 20 73 68 6d 69 64 2d 25  SHM-LOCK shmid-%
1e1b0 64 2c 20 70 69 64 2d 25 64 20 72 65 71 75 65 73  d, pid-%d reques
1e1c0 74 20 25 73 20 61 6e 64 20 67 6f 74 20 25 73 5c  t %s and got %s\
1e1d0 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  n",.            
1e1e0 20 70 2d 3e 69 64 2c 20 67 65 74 70 69 64 28 29   p->id, getpid()
1e1f0 2c 20 61 7a 4c 6b 4e 61 6d 65 5b 64 65 73 69 72  , azLkName[desir
1e200 65 64 4c 6f 63 6b 5d 2c 20 61 7a 4c 6b 4e 61 6d  edLock], azLkNam
1e210 65 5b 70 2d 3e 6c 6f 63 6b 53 74 61 74 65 5d 29  e[p->lockState])
1e220 29 3b 0a 20 20 20 20 69 66 28 20 70 47 6f 74 4c  );.    if( pGotL
1e230 6f 63 6b 20 29 20 2a 70 47 6f 74 4c 6f 63 6b 20  ock ) *pGotLock 
1e240 3d 20 70 2d 3e 6c 6f 63 6b 53 74 61 74 65 3b 0a  = p->lockState;.
1e250 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
1e260 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 4f 53 54  E_OK;.  }..  OST
1e270 52 41 43 45 28 28 22 53 48 4d 2d 4c 4f 43 4b 20  RACE(("SHM-LOCK 
1e280 73 68 6d 69 64 2d 25 64 2c 20 70 69 64 2d 25 64  shmid-%d, pid-%d
1e290 20 72 65 71 75 65 73 74 20 25 73 2d 3e 25 73 5c   request %s->%s\
1e2a0 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  n",.            
1e2b0 70 2d 3e 69 64 2c 20 67 65 74 70 69 64 28 29 2c  p->id, getpid(),
1e2c0 20 61 7a 4c 6b 4e 61 6d 65 5b 70 2d 3e 6c 6f 63   azLkName[p->loc
1e2d0 6b 53 74 61 74 65 5d 2c 20 61 7a 4c 6b 4e 61 6d  kState], azLkNam
1e2e0 65 5b 64 65 73 69 72 65 64 4c 6f 63 6b 5d 29 29  e[desiredLock]))
1e2f0 3b 0a 20 20 0a 20 20 69 66 28 20 64 65 73 69 72  ;.  .  if( desir
1e300 65 64 4c 6f 63 6b 3d 3d 53 51 4c 49 54 45 5f 53  edLock==SQLITE_S
1e310 48 4d 5f 52 45 43 4f 56 45 52 20 26 26 20 21 70  HM_RECOVER && !p
1e320 2d 3e 68 61 73 4d 75 74 65 78 42 75 66 20 29 7b  ->hasMutexBuf ){
1e330 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c  .    assert( sql
1e340 69 74 65 33 5f 6d 75 74 65 78 5f 6e 6f 74 68 65  ite3_mutex_nothe
1e350 6c 64 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74  ld(pShmNode->mut
1e360 65 78 29 20 29 3b 0a 20 20 20 20 73 71 6c 69 74  ex) );.    sqlit
1e370 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 70  e3_mutex_enter(p
1e380 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 42 75  ShmNode->mutexBu
1e390 66 29 3b 0a 20 20 20 20 70 2d 3e 68 61 73 4d 75  f);.    p->hasMu
1e3a0 74 65 78 42 75 66 20 3d 20 31 3b 0a 20 20 7d 0a  texBuf = 1;.  }.
1e3b0 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
1e3c0 65 6e 74 65 72 28 70 53 68 6d 4e 6f 64 65 2d 3e  enter(pShmNode->
1e3d0 6d 75 74 65 78 29 3b 0a 20 20 73 77 69 74 63 68  mutex);.  switch
1e3e0 28 20 64 65 73 69 72 65 64 4c 6f 63 6b 20 29 7b  ( desiredLock ){
1e3f0 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
1e400 5f 53 48 4d 5f 55 4e 4c 4f 43 4b 3a 20 7b 0a 20  _SHM_UNLOCK: {. 
1e410 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e       assert( p->
1e420 6c 6f 63 6b 53 74 61 74 65 21 3d 53 51 4c 49 54  lockState!=SQLIT
1e430 45 5f 53 48 4d 5f 52 45 43 4f 56 45 52 20 29 3b  E_SHM_RECOVER );
1e440 0a 20 20 20 20 20 20 75 6e 69 78 53 68 6d 55 6e  .      unixShmUn
1e450 6c 6f 63 6b 28 70 53 68 6d 4e 6f 64 65 2c 20 70  lock(pShmNode, p
1e460 2c 20 55 4e 49 58 5f 53 48 4d 5f 41 7c 55 4e 49  , UNIX_SHM_A|UNI
1e470 58 5f 53 48 4d 5f 42 7c 55 4e 49 58 5f 53 48 4d  X_SHM_B|UNIX_SHM
1e480 5f 43 7c 55 4e 49 58 5f 53 48 4d 5f 44 29 3b 0a  _C|UNIX_SHM_D);.
1e490 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
1e4a0 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 70 2d 3e 6c  E_OK;.      p->l
1e4b0 6f 63 6b 53 74 61 74 65 20 3d 20 53 51 4c 49 54  ockState = SQLIT
1e4c0 45 5f 53 48 4d 5f 55 4e 4c 4f 43 4b 3b 0a 20 20  E_SHM_UNLOCK;.  
1e4d0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
1e4e0 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
1e4f0 5f 53 48 4d 5f 52 45 41 44 3a 20 7b 0a 20 20 20  _SHM_READ: {.   
1e500 20 20 20 69 66 28 20 70 2d 3e 6c 6f 63 6b 53 74     if( p->lockSt
1e510 61 74 65 3d 3d 53 51 4c 49 54 45 5f 53 48 4d 5f  ate==SQLITE_SHM_
1e520 55 4e 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 20 20  UNLOCK ){.      
1e530 20 20 69 6e 74 20 6e 41 74 74 65 6d 70 74 3b 0a    int nAttempt;.
1e540 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
1e550 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 20 20  ITE_BUSY;.      
1e560 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6c 6f 63    assert( p->loc
1e570 6b 53 74 61 74 65 3d 3d 53 51 4c 49 54 45 5f 53  kState==SQLITE_S
1e580 48 4d 5f 55 4e 4c 4f 43 4b 20 29 3b 0a 20 20 20  HM_UNLOCK );.   
1e590 20 20 20 20 20 66 6f 72 28 6e 41 74 74 65 6d 70       for(nAttemp
1e5a0 74 3d 30 3b 20 6e 41 74 74 65 6d 70 74 3c 35 20  t=0; nAttempt<5 
1e5b0 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 42 55  && rc==SQLITE_BU
1e5c0 53 59 3b 20 6e 41 74 74 65 6d 70 74 2b 2b 29 7b  SY; nAttempt++){
1e5d0 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
1e5e0 75 6e 69 78 53 68 6d 53 68 61 72 65 64 4c 6f 63  unixShmSharedLoc
1e5f0 6b 28 70 53 68 6d 4e 6f 64 65 2c 20 70 2c 20 55  k(pShmNode, p, U
1e600 4e 49 58 5f 53 48 4d 5f 41 7c 55 4e 49 58 5f 53  NIX_SHM_A|UNIX_S
1e610 48 4d 5f 42 29 3b 0a 20 20 20 20 20 20 20 20 20  HM_B);.         
1e620 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
1e630 42 55 53 59 20 29 7b 0a 20 20 20 20 20 20 20 20  BUSY ){.        
1e640 20 20 20 20 72 63 20 3d 20 75 6e 69 78 53 68 6d      rc = unixShm
1e650 53 68 61 72 65 64 4c 6f 63 6b 28 70 53 68 6d 4e  SharedLock(pShmN
1e660 6f 64 65 2c 20 70 2c 20 55 4e 49 58 5f 53 48 4d  ode, p, UNIX_SHM
1e670 5f 44 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  _D);.           
1e680 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
1e690 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
1e6a0 20 20 20 20 70 2d 3e 6c 6f 63 6b 53 74 61 74 65      p->lockState
1e6b0 20 3d 20 53 51 4c 49 54 45 5f 53 48 4d 5f 52 45   = SQLITE_SHM_RE
1e6c0 41 44 5f 46 55 4c 4c 3b 0a 20 20 20 20 20 20 20  AD_FULL;.       
1e6d0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
1e6e0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
1e6f0 20 20 20 20 75 6e 69 78 53 68 6d 55 6e 6c 6f 63      unixShmUnloc
1e700 6b 28 70 53 68 6d 4e 6f 64 65 2c 20 70 2c 20 55  k(pShmNode, p, U
1e710 4e 49 58 5f 53 48 4d 5f 42 29 3b 0a 20 20 20 20  NIX_SHM_B);.    
1e720 20 20 20 20 20 20 20 20 70 2d 3e 6c 6f 63 6b 53          p->lockS
1e730 74 61 74 65 20 3d 20 53 51 4c 49 54 45 5f 53 48  tate = SQLITE_SH
1e740 4d 5f 52 45 41 44 3b 0a 20 20 20 20 20 20 20 20  M_READ;.        
1e750 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20    }.        }.  
1e760 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1e770 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6c 6f 63    assert( p->loc
1e780 6b 53 74 61 74 65 3d 3d 53 51 4c 49 54 45 5f 53  kState==SQLITE_S
1e790 48 4d 5f 57 52 49 54 45 0a 20 20 20 20 20 20 20  HM_WRITE.       
1e7a0 20 20 20 20 20 20 20 20 7c 7c 20 70 2d 3e 6c 6f          || p->lo
1e7b0 63 6b 53 74 61 74 65 3d 3d 53 51 4c 49 54 45 5f  ckState==SQLITE_
1e7c0 53 48 4d 5f 52 45 43 4f 56 45 52 20 29 3b 0a 20  SHM_RECOVER );. 
1e7d0 20 20 20 20 20 20 20 72 63 20 3d 20 75 6e 69 78         rc = unix
1e7e0 53 68 6d 53 68 61 72 65 64 4c 6f 63 6b 28 70 53  ShmSharedLock(pS
1e7f0 68 6d 4e 6f 64 65 2c 20 70 2c 20 55 4e 49 58 5f  hmNode, p, UNIX_
1e800 53 48 4d 5f 41 29 3b 0a 20 20 20 20 20 20 20 20  SHM_A);.        
1e810 75 6e 69 78 53 68 6d 55 6e 6c 6f 63 6b 28 70 53  unixShmUnlock(pS
1e820 68 6d 4e 6f 64 65 2c 20 70 2c 20 55 4e 49 58 5f  hmNode, p, UNIX_
1e830 53 48 4d 5f 43 7c 55 4e 49 58 5f 53 48 4d 5f 44  SHM_C|UNIX_SHM_D
1e840 29 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 6c 6f  );.        p->lo
1e850 63 6b 53 74 61 74 65 20 3d 20 53 51 4c 49 54 45  ckState = SQLITE
1e860 5f 53 48 4d 5f 52 45 41 44 3b 0a 20 20 20 20 20  _SHM_READ;.     
1e870 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a   }.      break;.
1e880 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53      }.    case S
1e890 51 4c 49 54 45 5f 53 48 4d 5f 57 52 49 54 45 3a  QLITE_SHM_WRITE:
1e8a0 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28   {.      assert(
1e8b0 20 70 2d 3e 6c 6f 63 6b 53 74 61 74 65 3d 3d 53   p->lockState==S
1e8c0 51 4c 49 54 45 5f 53 48 4d 5f 52 45 41 44 20 0a  QLITE_SHM_READ .
1e8d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c                ||
1e8e0 20 70 2d 3e 6c 6f 63 6b 53 74 61 74 65 3d 3d 53   p->lockState==S
1e8f0 51 4c 49 54 45 5f 53 48 4d 5f 52 45 41 44 5f 46  QLITE_SHM_READ_F
1e900 55 4c 4c 20 29 3b 0a 20 20 20 20 20 20 72 63 20  ULL );.      rc 
1e910 3d 20 75 6e 69 78 53 68 6d 45 78 63 6c 75 73 69  = unixShmExclusi
1e920 76 65 4c 6f 63 6b 28 70 53 68 6d 4e 6f 64 65 2c  veLock(pShmNode,
1e930 20 70 2c 20 55 4e 49 58 5f 53 48 4d 5f 43 7c 55   p, UNIX_SHM_C|U
1e940 4e 49 58 5f 53 48 4d 5f 44 29 3b 0a 20 20 20 20  NIX_SHM_D);.    
1e950 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
1e960 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 70  _OK ){.        p
1e970 2d 3e 6c 6f 63 6b 53 74 61 74 65 20 3d 20 53 51  ->lockState = SQ
1e980 4c 49 54 45 5f 53 48 4d 5f 57 52 49 54 45 3b 0a  LITE_SHM_WRITE;.
1e990 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72        }.      br
1e9a0 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
1e9b0 61 73 65 20 53 51 4c 49 54 45 5f 53 48 4d 5f 43  ase SQLITE_SHM_C
1e9c0 48 45 43 4b 50 4f 49 4e 54 3a 20 7b 0a 20 20 20  HECKPOINT: {.   
1e9d0 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6c 6f     assert( p->lo
1e9e0 63 6b 53 74 61 74 65 3d 3d 53 51 4c 49 54 45 5f  ckState==SQLITE_
1e9f0 53 48 4d 5f 55 4e 4c 4f 43 4b 0a 20 20 20 20 20  SHM_UNLOCK.     
1ea00 20 20 20 20 20 20 7c 7c 20 70 2d 3e 6c 6f 63 6b        || p->lock
1ea10 53 74 61 74 65 3d 3d 53 51 4c 49 54 45 5f 53 48  State==SQLITE_SH
1ea20 4d 5f 50 45 4e 44 49 4e 47 0a 20 20 20 20 20 20  M_PENDING.      
1ea30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e  );.      if( p->
1ea40 6c 6f 63 6b 53 74 61 74 65 3d 3d 53 51 4c 49 54  lockState==SQLIT
1ea50 45 5f 53 48 4d 5f 55 4e 4c 4f 43 4b 20 29 7b 0a  E_SHM_UNLOCK ){.
1ea60 20 20 20 20 20 20 20 20 72 63 20 3d 20 75 6e 69          rc = uni
1ea70 78 53 68 6d 45 78 63 6c 75 73 69 76 65 4c 6f 63  xShmExclusiveLoc
1ea80 6b 28 70 53 68 6d 4e 6f 64 65 2c 20 70 2c 20 55  k(pShmNode, p, U
1ea90 4e 49 58 5f 53 48 4d 5f 42 7c 55 4e 49 58 5f 53  NIX_SHM_B|UNIX_S
1eaa0 48 4d 5f 43 29 3b 0a 20 20 20 20 20 20 20 20 69  HM_C);.        i
1eab0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
1eac0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 2d   ){.          p-
1ead0 3e 6c 6f 63 6b 53 74 61 74 65 20 3d 20 53 51 4c  >lockState = SQL
1eae0 49 54 45 5f 53 48 4d 5f 50 45 4e 44 49 4e 47 3b  ITE_SHM_PENDING;
1eaf0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
1eb00 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e   }.      if( p->
1eb10 6c 6f 63 6b 53 74 61 74 65 3d 3d 53 51 4c 49 54  lockState==SQLIT
1eb20 45 5f 53 48 4d 5f 50 45 4e 44 49 4e 47 20 29 7b  E_SHM_PENDING ){
1eb30 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 75 6e  .        rc = un
1eb40 69 78 53 68 6d 45 78 63 6c 75 73 69 76 65 4c 6f  ixShmExclusiveLo
1eb50 63 6b 28 70 53 68 6d 4e 6f 64 65 2c 20 70 2c 20  ck(pShmNode, p, 
1eb60 55 4e 49 58 5f 53 48 4d 5f 41 29 3b 0a 20 20 20  UNIX_SHM_A);.   
1eb70 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
1eb80 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
1eb90 20 20 20 20 70 2d 3e 6c 6f 63 6b 53 74 61 74 65      p->lockState
1eba0 20 3d 20 53 51 4c 49 54 45 5f 53 48 4d 5f 43 48   = SQLITE_SHM_CH
1ebb0 45 43 4b 50 4f 49 4e 54 3b 0a 20 20 20 20 20 20  ECKPOINT;.      
1ebc0 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
1ebd0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
1ebe0 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20     default: {.  
1ebf0 20 20 20 20 61 73 73 65 72 74 28 20 64 65 73 69      assert( desi
1ec00 72 65 64 4c 6f 63 6b 3d 3d 53 51 4c 49 54 45 5f  redLock==SQLITE_
1ec10 53 48 4d 5f 52 45 43 4f 56 45 52 20 29 3b 0a 20  SHM_RECOVER );. 
1ec20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e       assert( p->
1ec30 6c 6f 63 6b 53 74 61 74 65 3d 3d 53 51 4c 49 54  lockState==SQLIT
1ec40 45 5f 53 48 4d 5f 52 45 41 44 0a 20 20 20 20 20  E_SHM_READ.     
1ec50 20 20 20 20 20 20 7c 7c 20 70 2d 3e 6c 6f 63 6b        || p->lock
1ec60 53 74 61 74 65 3d 3d 53 51 4c 49 54 45 5f 53 48  State==SQLITE_SH
1ec70 4d 5f 52 45 41 44 5f 46 55 4c 4c 0a 20 20 20 20  M_READ_FULL.    
1ec80 20 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72    );.      asser
1ec90 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
1eca0 5f 68 65 6c 64 28 70 53 68 6d 4e 6f 64 65 2d 3e  _held(pShmNode->
1ecb0 6d 75 74 65 78 42 75 66 29 20 29 3b 0a 20 20 20  mutexBuf) );.   
1ecc0 20 20 20 72 63 20 3d 20 75 6e 69 78 53 68 6d 45     rc = unixShmE
1ecd0 78 63 6c 75 73 69 76 65 4c 6f 63 6b 28 70 53 68  xclusiveLock(pSh
1ece0 6d 4e 6f 64 65 2c 20 70 2c 20 55 4e 49 58 5f 53  mNode, p, UNIX_S
1ecf0 48 4d 5f 43 29 3b 0a 20 20 20 20 20 20 69 66 28  HM_C);.      if(
1ed00 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
1ed10 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 6c 6f 63  {.        p->loc
1ed20 6b 53 74 61 74 65 20 3d 20 53 51 4c 49 54 45 5f  kState = SQLITE_
1ed30 53 48 4d 5f 52 45 43 4f 56 45 52 3b 0a 20 20 20  SHM_RECOVER;.   
1ed40 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b     }.      break
1ed50 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71  ;.    }.  }.  sq
1ed60 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76  lite3_mutex_leav
1ed70 65 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65  e(pShmNode->mute
1ed80 78 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22  x);.  OSTRACE(("
1ed90 53 48 4d 2d 4c 4f 43 4b 20 73 68 6d 69 64 2d 25  SHM-LOCK shmid-%
1eda0 64 2c 20 70 69 64 2d 25 64 20 67 6f 74 20 25 73  d, pid-%d got %s
1edb0 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
1edc0 70 2d 3e 69 64 2c 20 67 65 74 70 69 64 28 29 2c  p->id, getpid(),
1edd0 20 61 7a 4c 6b 4e 61 6d 65 5b 70 2d 3e 6c 6f 63   azLkName[p->loc
1ede0 6b 53 74 61 74 65 5d 29 29 3b 0a 20 20 69 66 28  kState]));.  if(
1edf0 20 70 47 6f 74 4c 6f 63 6b 20 29 20 2a 70 47 6f   pGotLock ) *pGo
1ee00 74 4c 6f 63 6b 20 3d 20 70 2d 3e 6c 6f 63 6b 53  tLock = p->lockS
1ee10 74 61 74 65 3b 0a 20 20 72 65 74 75 72 6e 20 72  tate;.  return r
1ee20 63 3b 0a 7d 0a 0a 23 65 6c 73 65 0a 23 20 64 65  c;.}..#else.# de
1ee30 66 69 6e 65 20 75 6e 69 78 53 68 6d 4f 70 65 6e  fine unixShmOpen
1ee40 20 20 20 20 30 0a 23 20 64 65 66 69 6e 65 20 75      0.# define u
1ee50 6e 69 78 53 68 6d 53 69 7a 65 20 20 20 20 30 0a  nixShmSize    0.
1ee60 23 20 64 65 66 69 6e 65 20 75 6e 69 78 53 68 6d  # define unixShm
1ee70 47 65 74 20 20 20 20 20 30 0a 23 20 64 65 66 69  Get     0.# defi
1ee80 6e 65 20 75 6e 69 78 53 68 6d 52 65 6c 65 61 73  ne unixShmReleas
1ee90 65 20 30 0a 23 20 64 65 66 69 6e 65 20 75 6e 69  e 0.# define uni
1eea0 78 53 68 6d 4c 6f 63 6b 20 20 20 20 30 0a 23 20  xShmLock    0.# 
1eeb0 64 65 66 69 6e 65 20 75 6e 69 78 53 68 6d 43 6c  define unixShmCl
1eec0 6f 73 65 20 20 20 30 0a 23 65 6e 64 69 66 20 2f  ose   0.#endif /
1eed0 2a 20 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  * #ifndef SQLITE
1eee0 5f 4f 4d 49 54 5f 57 41 4c 20 2a 2f 0a 0a 2f 2a  _OMIT_WAL */../*
1eef0 0a 2a 2a 20 48 65 72 65 20 65 6e 64 73 20 74 68  .** Here ends th
1ef00 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  e implementation
1ef10 20 6f 66 20 61 6c 6c 20 73 71 6c 69 74 65 33 5f   of all sqlite3_
1ef20 66 69 6c 65 20 6d 65 74 68 6f 64 73 2e 0a 2a 2a  file methods..**
1ef30 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .***************
1ef40 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64 20 73 71 6c 69  ******* End sqli
1ef50 74 65 33 5f 66 69 6c 65 20 4d 65 74 68 6f 64 73  te3_file Methods
1ef60 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a   ***************
1ef70 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1ef80 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .***************
1ef90 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1efa0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1efb0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1efc0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f  ***************/
1efd0 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 64 69 76  ../*.** This div
1efe0 69 73 69 6f 6e 20 63 6f 6e 74 61 69 6e 73 20 64  ision contains d
1eff0 65 66 69 6e 69 74 69 6f 6e 73 20 6f 66 20 73 71  efinitions of sq
1f000 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73  lite3_io_methods
1f010 20 6f 62 6a 65 63 74 73 20 74 68 61 74 0a 2a 2a   objects that.**
1f020 20 69 6d 70 6c 65 6d 65 6e 74 20 76 61 72 69 6f   implement vario
1f030 75 73 20 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 20  us file locking 
1f040 73 74 72 61 74 65 67 69 65 73 2e 20 20 49 74 20  strategies.  It 
1f050 61 6c 73 6f 20 63 6f 6e 74 61 69 6e 73 20 64 65  also contains de
1f060 66 69 6e 69 74 69 6f 6e 73 0a 2a 2a 20 6f 66 20  finitions.** of 
1f070 22 66 69 6e 64 65 72 22 20 66 75 6e 63 74 69 6f  "finder" functio
1f080 6e 73 2e 20 20 41 20 66 69 6e 64 65 72 2d 66 75  ns.  A finder-fu
1f090 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64 20 74  nction is used t
1f0a0 6f 20 6c 6f 63 61 74 65 20 74 68 65 20 61 70 70  o locate the app
1f0b0 72 6f 70 72 69 61 74 65 0a 2a 2a 20 73 71 6c 69  ropriate.** sqli
1f0c0 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 6f  te3_io_methods o
1f0d0 62 6a 65 63 74 20 66 6f 72 20 61 20 70 61 72 74  bject for a part
1f0e0 69 63 75 6c 61 72 20 64 61 74 61 62 61 73 65 20  icular database 
1f0f0 66 69 6c 65 2e 20 20 54 68 65 20 70 41 70 70 44  file.  The pAppD
1f100 61 74 61 0a 2a 2a 20 66 69 65 6c 64 20 6f 66 20  ata.** field of 
1f110 74 68 65 20 73 71 6c 69 74 65 33 5f 76 66 73 20  the sqlite3_vfs 
1f120 56 46 53 20 6f 62 6a 65 63 74 73 20 61 72 65 20  VFS objects are 
1f130 69 6e 69 74 69 61 6c 69 7a 65 64 20 74 6f 20 62  initialized to b
1f140 65 20 70 6f 69 6e 74 65 72 73 20 74 6f 0a 2a 2a  e pointers to.**
1f150 20 74 68 65 20 63 6f 72 72 65 63 74 20 66 69 6e   the correct fin
1f160 64 65 72 2d 66 75 6e 63 74 69 6f 6e 20 66 6f 72  der-function for
1f170 20 74 68 61 74 20 56 46 53 2e 0a 2a 2a 0a 2a 2a   that VFS..**.**
1f180 20 4d 6f 73 74 20 66 69 6e 64 65 72 20 66 75 6e   Most finder fun
1f190 63 74 69 6f 6e 73 20 72 65 74 75 72 6e 20 61 20  ctions return a 
1f1a0 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 66 69 78  pointer to a fix
1f1b0 65 64 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65  ed sqlite3_io_me
1f1c0 74 68 6f 64 73 0a 2a 2a 20 6f 62 6a 65 63 74 2e  thods.** object.
1f1d0 20 20 54 68 65 20 6f 6e 6c 79 20 69 6e 74 65 72    The only inter
1f1e0 65 73 74 69 6e 67 20 66 69 6e 64 65 72 2d 66 75  esting finder-fu
1f1f0 6e 63 74 69 6f 6e 20 69 73 20 61 75 74 6f 6c 6f  nction is autolo
1f200 63 6b 49 6f 46 69 6e 64 65 72 2c 20 77 68 69 63  ckIoFinder, whic
1f210 68 0a 2a 2a 20 6c 6f 6f 6b 73 20 61 74 20 74 68  h.** looks at th
1f220 65 20 66 69 6c 65 73 79 73 74 65 6d 20 74 79 70  e filesystem typ
1f230 65 20 61 6e 64 20 74 72 69 65 73 20 74 6f 20 67  e and tries to g
1f240 75 65 73 73 20 74 68 65 20 62 65 73 74 20 6c 6f  uess the best lo
1f250 63 6b 69 6e 67 0a 2a 2a 20 73 74 72 61 74 65 67  cking.** strateg
1f260 79 20 66 72 6f 6d 20 74 68 61 74 2e 0a 2a 2a 0a  y from that..**.
1f270 2a 2a 20 46 6f 72 20 66 69 6e 64 65 72 2d 66 75  ** For finder-fu
1f280 6e 74 69 6f 6e 20 46 2c 20 74 77 6f 20 6f 62 6a  ntion F, two obj
1f290 65 63 74 73 20 61 72 65 20 63 72 65 61 74 65 64  ects are created
1f2a0 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 28 31 29 20 54  :.**.**    (1) T
1f2b0 68 65 20 72 65 61 6c 20 66 69 6e 64 65 72 2d 66  he real finder-f
1f2c0 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 64 20 22 46  unction named "F
1f2d0 49 6d 70 74 28 29 22 2e 0a 2a 2a 0a 2a 2a 20 20  Impt()"..**.**  
1f2e0 20 20 28 32 29 20 41 20 63 6f 6e 73 74 61 6e 74    (2) A constant
1f2f0 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 69 73   pointer to this
1f300 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 64 20   function named 
1f310 6a 75 73 74 20 22 46 22 2e 0a 2a 2a 0a 2a 2a 0a  just "F"..**.**.
1f320 2a 2a 20 41 20 70 6f 69 6e 74 65 72 20 74 6f 20  ** A pointer to 
1f330 74 68 65 20 46 20 70 6f 69 6e 74 65 72 20 69 73  the F pointer is
1f340 20 75 73 65 64 20 61 73 20 74 68 65 20 70 41 70   used as the pAp
1f350 70 44 61 74 61 20 76 61 6c 75 65 20 66 6f 72 20  pData value for 
1f360 56 46 53 0a 2a 2a 20 6f 62 6a 65 63 74 73 2e 20  VFS.** objects. 
1f370 20 57 65 20 68 61 76 65 20 74 6f 20 64 6f 20 74   We have to do t
1f380 68 69 73 20 69 6e 73 74 65 61 64 20 6f 66 20 6c  his instead of l
1f390 65 74 74 69 6e 67 20 70 41 70 70 44 61 74 61 20  etting pAppData 
1f3a0 70 6f 69 6e 74 0a 2a 2a 20 64 69 72 65 63 74 6c  point.** directl
1f3b0 79 20 61 74 20 74 68 65 20 66 69 6e 64 65 72 2d  y at the finder-
1f3c0 66 75 6e 63 74 69 6f 6e 20 73 69 6e 63 65 20 43  function since C
1f3d0 39 30 20 72 75 6c 65 73 20 70 72 65 76 65 6e 74  90 rules prevent
1f3e0 20 61 20 76 6f 69 64 2a 0a 2a 2a 20 66 72 6f 6d   a void*.** from
1f3f0 20 62 65 20 63 61 73 74 20 69 6e 74 6f 20 61 20   be cast into a 
1f400 66 75 6e 63 74 69 6f 6e 20 70 6f 69 6e 74 65 72  function pointer
1f410 2e 0a 2a 2a 0a 2a 2a 0a 2a 2a 20 45 61 63 68 20  ..**.**.** Each 
1f420 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 69 73  instance of this
1f430 20 6d 61 63 72 6f 20 67 65 6e 65 72 61 74 65 73   macro generates
1f440 20 74 77 6f 20 6f 62 6a 65 63 74 73 3a 0a 2a 2a   two objects:.**
1f450 0a 2a 2a 20 20 20 2a 20 20 41 20 63 6f 6e 73 74  .**   *  A const
1f460 61 6e 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d  ant sqlite3_io_m
1f470 65 74 68 6f 64 73 20 6f 62 6a 65 63 74 20 63 61  ethods object ca
1f480 6c 6c 20 4d 45 54 48 4f 44 20 74 68 61 74 20 68  ll METHOD that h
1f490 61 73 20 6c 6f 63 6b 69 6e 67 0a 2a 2a 20 20 20  as locking.**   
1f4a0 20 20 20 6d 65 74 68 6f 64 73 20 43 4c 4f 53 45     methods CLOSE
1f4b0 2c 20 4c 4f 43 4b 2c 20 55 4e 4c 4f 43 4b 2c 20  , LOCK, UNLOCK, 
1f4c0 43 4b 52 45 53 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a  CKRESLOCK..**.**
1f4d0 20 20 20 2a 20 20 41 6e 20 49 2f 4f 20 6d 65 74     *  An I/O met
1f4e0 68 6f 64 20 66 69 6e 64 65 72 20 66 75 6e 63 74  hod finder funct
1f4f0 69 6f 6e 20 63 61 6c 6c 65 64 20 46 49 4e 44 45  ion called FINDE
1f500 52 20 74 68 61 74 20 72 65 74 75 72 6e 73 20 61  R that returns a
1f510 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 20 20 20 20   pointer.**     
1f520 20 74 6f 20 74 68 65 20 4d 45 54 48 4f 44 20 6f   to the METHOD o
1f530 62 6a 65 63 74 20 69 6e 20 74 68 65 20 70 72 65  bject in the pre
1f540 76 69 6f 75 73 20 62 75 6c 6c 65 74 2e 0a 2a 2f  vious bullet..*/
1f550 0a 23 64 65 66 69 6e 65 20 49 4f 4d 45 54 48 4f  .#define IOMETHO
1f560 44 53 28 46 49 4e 44 45 52 2c 20 4d 45 54 48 4f  DS(FINDER, METHO
1f570 44 2c 20 56 45 52 53 49 4f 4e 2c 20 43 4c 4f 53  D, VERSION, CLOS
1f580 45 2c 20 4c 4f 43 4b 2c 20 55 4e 4c 4f 43 4b 2c  E, LOCK, UNLOCK,
1f590 20 43 4b 4c 4f 43 4b 29 20 20 20 20 20 20 5c 0a   CKLOCK)      \.
1f5a0 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73 71 6c  static const sql
1f5b0 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20  ite3_io_methods 
1f5c0 4d 45 54 48 4f 44 20 3d 20 7b 20 20 20 20 20 20  METHOD = {      
1f5d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f5e0 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20               \. 
1f5f0 20 20 56 45 52 53 49 4f 4e 2c 20 20 20 20 20 20    VERSION,      
1f600 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1f610 20 69 56 65 72 73 69 6f 6e 20 2a 2f 20 20 20 20   iVersion */    
1f620 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f630 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20              \.  
1f640 20 43 4c 4f 53 45 2c 20 20 20 20 20 20 20 20 20   CLOSE,         
1f650 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1f660 78 43 6c 6f 73 65 20 2a 2f 20 20 20 20 20 20 20  xClose */       
1f670 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f680 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20             \.   
1f690 75 6e 69 78 52 65 61 64 2c 20 20 20 20 20 20 20  unixRead,       
1f6a0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
1f6b0 52 65 61 64 20 2a 2f 20 20 20 20 20 20 20 20 20  Read */         
1f6c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f6d0 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 75            \.   u
1f6e0 6e 69 78 57 72 69 74 65 2c 20 20 20 20 20 20 20  nixWrite,       
1f6f0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 57             /* xW
1f700 72 69 74 65 20 2a 2f 20 20 20 20 20 20 20 20 20  rite */         
1f710 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f720 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 75 6e           \.   un
1f730 69 78 54 72 75 6e 63 61 74 65 2c 20 20 20 20 20  ixTruncate,     
1f740 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 54 72            /* xTr
1f750 75 6e 63 61 74 65 20 2a 2f 20 20 20 20 20 20 20  uncate */       
1f760 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f770 20 20 20 20 20 20 20 20 5c 0a 20 20 20 75 6e 69          \.   uni
1f780 78 53 79 6e 63 2c 20 20 20 20 20 20 20 20 20 20  xSync,          
1f790 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53 79 6e           /* xSyn
1f7a0 63 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20  c */            
1f7b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f7c0 20 20 20 20 20 20 20 5c 0a 20 20 20 75 6e 69 78         \.   unix
1f7d0 46 69 6c 65 53 69 7a 65 2c 20 20 20 20 20 20 20  FileSize,       
1f7e0 20 20 20 20 20 20 20 20 2f 2a 20 78 46 69 6c 65          /* xFile
1f7f0 53 69 7a 65 20 2a 2f 20 20 20 20 20 20 20 20 20  Size */         
1f800 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f810 20 20 20 20 20 20 5c 0a 20 20 20 4c 4f 43 4b 2c        \.   LOCK,
1f820 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f830 20 20 20 20 20 20 20 2f 2a 20 78 4c 6f 63 6b 20         /* xLock 
1f840 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20 20 20  */              
1f850 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f860 20 20 20 20 20 5c 0a 20 20 20 55 4e 4c 4f 43 4b       \.   UNLOCK
1f870 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
1f880 20 20 20 20 20 20 2f 2a 20 78 55 6e 6c 6f 63 6b        /* xUnlock
1f890 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20 20   */             
1f8a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f8b0 20 20 20 20 5c 0a 20 20 20 43 4b 4c 4f 43 4b 2c      \.   CKLOCK,
1f8c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f8d0 20 20 20 20 20 2f 2a 20 78 43 68 65 63 6b 52 65       /* xCheckRe
1f8e0 73 65 72 76 65 64 4c 6f 63 6b 20 2a 2f 20 20 20  servedLock */   
1f8f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f900 20 20 20 5c 0a 20 20 20 75 6e 69 78 46 69 6c 65     \.   unixFile
1f910 43 6f 6e 74 72 6f 6c 2c 20 20 20 20 20 20 20 20  Control,        
1f920 20 20 20 20 2f 2a 20 78 46 69 6c 65 43 6f 6e 74      /* xFileCont
1f930 72 6f 6c 20 2a 2f 20 20 20 20 20 20 20 20 20 20  rol */          
1f940 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f950 20 20 5c 0a 20 20 20 75 6e 69 78 53 65 63 74 6f    \.   unixSecto
1f960 72 53 69 7a 65 2c 20 20 20 20 20 20 20 20 20 20  rSize,          
1f970 20 20 20 2f 2a 20 78 53 65 63 74 6f 72 53 69 7a     /* xSectorSiz
1f980 65 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20  e */            
1f990 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f9a0 20 5c 0a 20 20 20 75 6e 69 78 44 65 76 69 63 65   \.   unixDevice
1f9b0 43 68 61 72 61 63 74 65 72 69 73 74 69 63 73 2c  Characteristics,
1f9c0 20 20 2f 2a 20 78 44 65 76 69 63 65 43 61 70 61    /* xDeviceCapa
1f9d0 62 69 6c 69 74 69 65 73 20 2a 2f 20 20 20 20 20  bilities */     
1f9e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f9f0 5c 0a 20 20 20 75 6e 69 78 53 68 6d 4f 70 65 6e  \.   unixShmOpen
1fa00 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
1fa10 20 2f 2a 20 78 53 68 6d 4f 70 65 6e 20 2a 2f 20   /* xShmOpen */ 
1fa20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fa30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c                 \
1fa40 0a 20 20 20 75 6e 69 78 53 68 6d 53 69 7a 65 2c  .   unixShmSize,
1fa50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fa60 2f 2a 20 78 53 68 6d 53 69 7a 65 20 2a 2f 20 20  /* xShmSize */  
1fa70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fa80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a                \.
1fa90 20 20 20 75 6e 69 78 53 68 6d 47 65 74 2c 20 20     unixShmGet,  
1faa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1fab0 2a 20 78 53 68 6d 47 65 74 20 2a 2f 20 20 20 20  * xShmGet */    
1fac0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fad0 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20               \. 
1fae0 20 20 75 6e 69 78 53 68 6d 52 65 6c 65 61 73 65    unixShmRelease
1faf0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ,             /*
1fb00 20 78 53 68 6d 52 65 6c 65 61 73 65 20 2a 2f 20   xShmRelease */ 
1fb10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fb20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20              \.  
1fb30 20 75 6e 69 78 53 68 6d 4c 6f 63 6b 2c 20 20 20   unixShmLock,   
1fb40 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1fb50 78 53 68 6d 4c 6f 63 6b 20 2a 2f 20 20 20 20 20  xShmLock */     
1fb60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fb70 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20             \.   
1fb80 75 6e 69 78 53 68 6d 43 6c 6f 73 65 20 20 20 20  unixShmClose    
1fb90 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
1fba0 53 68 6d 43 6c 6f 73 65 20 2a 2f 20 20 20 20 20  ShmClose */     
1fbb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fbc0 20 20 20 20 20 20 20 20 20 20 5c 0a 7d 3b 20 20            \.};  
1fbd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fbe0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fbf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fc00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fc10 20 20 20 20 20 20 20 20 20 5c 0a 73 74 61 74 69           \.stati
1fc20 63 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f  c const sqlite3_
1fc30 69 6f 5f 6d 65 74 68 6f 64 73 20 2a 46 49 4e 44  io_methods *FIND
1fc40 45 52 23 23 49 6d 70 6c 28 63 6f 6e 73 74 20 63  ER##Impl(const c
1fc50 68 61 72 20 2a 7a 2c 20 75 6e 69 78 46 69 6c 65  har *z, unixFile
1fc60 20 2a 70 29 7b 20 20 20 5c 0a 20 20 55 4e 55 53   *p){   \.  UNUS
1fc70 45 44 5f 50 41 52 41 4d 45 54 45 52 28 7a 29 3b  ED_PARAMETER(z);
1fc80 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
1fc90 52 28 70 29 3b 20 20 20 20 20 20 20 20 20 20 20  R(p);           
1fca0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fcb0 20 20 20 20 20 20 20 5c 0a 20 20 72 65 74 75 72         \.  retur
1fcc0 6e 20 26 4d 45 54 48 4f 44 3b 20 20 20 20 20 20  n &METHOD;      
1fcd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fce0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fcf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fd00 20 20 20 20 20 20 5c 0a 7d 20 20 20 20 20 20 20        \.}       
1fd10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fd20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fd30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fd40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fd50 20 20 20 20 20 5c 0a 73 74 61 74 69 63 20 63 6f       \.static co
1fd60 6e 73 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d  nst sqlite3_io_m
1fd70 65 74 68 6f 64 73 20 2a 28 2a 63 6f 6e 73 74 20  ethods *(*const 
1fd80 46 49 4e 44 45 52 29 28 63 6f 6e 73 74 20 63 68  FINDER)(const ch
1fd90 61 72 2a 2c 75 6e 69 78 46 69 6c 65 20 2a 70 29  ar*,unixFile *p)
1fda0 20 20 20 20 5c 0a 20 20 20 20 3d 20 46 49 4e 44      \.    = FIND
1fdb0 45 52 23 23 49 6d 70 6c 3b 0a 0a 2f 2a 0a 2a 2a  ER##Impl;../*.**
1fdc0 20 48 65 72 65 20 61 72 65 20 61 6c 6c 20 6f 66   Here are all of
1fdd0 20 74 68 65 20 73 71 6c 69 74 65 33 5f 69 6f 5f   the sqlite3_io_
1fde0 6d 65 74 68 6f 64 73 20 6f 62 6a 65 63 74 73 20  methods objects 
1fdf0 66 6f 72 20 65 61 63 68 20 6f 66 20 74 68 65 0a  for each of the.
1fe00 2a 2a 20 6c 6f 63 6b 69 6e 67 20 73 74 72 61 74  ** locking strat
1fe10 65 67 69 65 73 2e 20 20 46 75 6e 63 74 69 6f 6e  egies.  Function
1fe20 73 20 74 68 61 74 20 72 65 74 75 72 6e 20 70 6f  s that return po
1fe30 69 6e 74 65 72 73 20 74 6f 20 74 68 65 73 65 20  inters to these 
1fe40 6d 65 74 68 6f 64 73 0a 2a 2a 20 61 72 65 20 61  methods.** are a
1fe50 6c 73 6f 20 63 72 65 61 74 65 64 2e 0a 2a 2f 0a  lso created..*/.
1fe60 49 4f 4d 45 54 48 4f 44 53 28 0a 20 20 70 6f 73  IOMETHODS(.  pos
1fe70 69 78 49 6f 46 69 6e 64 65 72 2c 20 20 20 20 20  ixIoFinder,     
1fe80 20 20 20 20 20 20 20 2f 2a 20 46 69 6e 64 65 72         /* Finder
1fe90 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 20 2a   function name *
1fea0 2f 0a 20 20 70 6f 73 69 78 49 6f 4d 65 74 68 6f  /.  posixIoMetho
1feb0 64 73 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ds,           /*
1fec0 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68   sqlite3_io_meth
1fed0 6f 64 73 20 6f 62 6a 65 63 74 20 6e 61 6d 65 20  ods object name 
1fee0 2a 2f 0a 20 20 32 2c 20 20 20 20 20 20 20 20 20  */.  2,         
1fef0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1ff00 2a 20 53 68 6d 4f 70 65 6e 20 69 73 20 65 6e 61  * ShmOpen is ena
1ff10 62 6c 65 64 20 2a 2f 0a 20 20 75 6e 69 78 43 6c  bled */.  unixCl
1ff20 6f 73 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  ose,            
1ff30 20 20 20 20 2f 2a 20 78 43 6c 6f 73 65 20 6d 65      /* xClose me
1ff40 74 68 6f 64 20 2a 2f 0a 20 20 75 6e 69 78 4c 6f  thod */.  unixLo
1ff50 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ck,             
1ff60 20 20 20 20 2f 2a 20 78 4c 6f 63 6b 20 6d 65 74      /* xLock met
1ff70 68 6f 64 20 2a 2f 0a 20 20 75 6e 69 78 55 6e 6c  hod */.  unixUnl
1ff80 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20  ock,            
1ff90 20 20 20 2f 2a 20 78 55 6e 6c 6f 63 6b 20 6d 65     /* xUnlock me
1ffa0 74 68 6f 64 20 2a 2f 0a 20 20 75 6e 69 78 43 68  thod */.  unixCh
1ffb0 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 20  eckReservedLock 
1ffc0 20 20 20 20 2f 2a 20 78 43 68 65 63 6b 52 65 73      /* xCheckRes
1ffd0 65 72 76 65 64 4c 6f 63 6b 20 6d 65 74 68 6f 64  ervedLock method
1ffe0 20 2a 2f 0a 29 0a 49 4f 4d 45 54 48 4f 44 53 28   */.).IOMETHODS(
1fff0 0a 20 20 6e 6f 6c 6f 63 6b 49 6f 46 69 6e 64 65  .  nolockIoFinde
20000 72 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  r,           /* 
20010 46 69 6e 64 65 72 20 66 75 6e 63 74 69 6f 6e 20  Finder function 
20020 6e 61 6d 65 20 2a 2f 0a 20 20 6e 6f 6c 6f 63 6b  name */.  nolock
20030 49 6f 4d 65 74 68 6f 64 73 2c 20 20 20 20 20 20  IoMethods,      
20040 20 20 20 20 2f 2a 20 73 71 6c 69 74 65 33 5f 69      /* sqlite3_i
20050 6f 5f 6d 65 74 68 6f 64 73 20 6f 62 6a 65 63 74  o_methods object
20060 20 6e 61 6d 65 20 2a 2f 0a 20 20 31 2c 20 20 20   name */.  1,   
20070 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20080 20 20 20 20 20 2f 2a 20 53 68 6d 4f 70 65 6e 20       /* ShmOpen 
20090 69 73 20 64 69 73 61 62 6c 65 64 20 2a 2f 0a 20  is disabled */. 
200a0 20 6e 6f 6c 6f 63 6b 43 6c 6f 73 65 2c 20 20 20   nolockClose,   
200b0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 43             /* xC
200c0 6c 6f 73 65 20 6d 65 74 68 6f 64 20 2a 2f 0a 20  lose method */. 
200d0 20 6e 6f 6c 6f 63 6b 4c 6f 63 6b 2c 20 20 20 20   nolockLock,    
200e0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 4c             /* xL
200f0 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20  ock method */.  
20100 6e 6f 6c 6f 63 6b 55 6e 6c 6f 63 6b 2c 20 20 20  nolockUnlock,   
20110 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 55 6e            /* xUn
20120 6c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20  lock method */. 
20130 20 6e 6f 6c 6f 63 6b 43 68 65 63 6b 52 65 73 65   nolockCheckRese
20140 72 76 65 64 4c 6f 63 6b 20 20 20 2f 2a 20 78 43  rvedLock   /* xC
20150 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b  heckReservedLock
20160 20 6d 65 74 68 6f 64 20 2a 2f 0a 29 0a 49 4f 4d   method */.).IOM
20170 45 54 48 4f 44 53 28 0a 20 20 64 6f 74 6c 6f 63  ETHODS(.  dotloc
20180 6b 49 6f 46 69 6e 64 65 72 2c 20 20 20 20 20 20  kIoFinder,      
20190 20 20 20 20 2f 2a 20 46 69 6e 64 65 72 20 66 75      /* Finder fu
201a0 6e 63 74 69 6f 6e 20 6e 61 6d 65 20 2a 2f 0a 20  nction name */. 
201b0 20 64 6f 74 6c 6f 63 6b 49 6f 4d 65 74 68 6f 64   dotlockIoMethod
201c0 73 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 73 71  s,         /* sq
201d0 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73  lite3_io_methods
201e0 20 6f 62 6a 65 63 74 20 6e 61 6d 65 20 2a 2f 0a   object name */.
201f0 20 20 31 2c 20 20 20 20 20 20 20 20 20 20 20 20    1,            
20200 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
20210 68 6d 4f 70 65 6e 20 69 73 20 64 69 73 61 62 6c  hmOpen is disabl
20220 65 64 20 2a 2f 0a 20 20 64 6f 74 6c 6f 63 6b 43  ed */.  dotlockC
20230 6c 6f 73 65 2c 20 20 20 20 20 20 20 20 20 20 20  lose,           
20240 20 20 2f 2a 20 78 43 6c 6f 73 65 20 6d 65 74 68    /* xClose meth
20250 6f 64 20 2a 2f 0a 20 20 64 6f 74 6c 6f 63 6b 4c  od */.  dotlockL
20260 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20  ock,            
20270 20 20 2f 2a 20 78 4c 6f 63 6b 20 6d 65 74 68 6f    /* xLock metho
20280 64 20 2a 2f 0a 20 20 64 6f 74 6c 6f 63 6b 55 6e  d */.  dotlockUn
20290 6c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20  lock,           
202a0 20 2f 2a 20 78 55 6e 6c 6f 63 6b 20 6d 65 74 68   /* xUnlock meth
202b0 6f 64 20 2a 2f 0a 20 20 64 6f 74 6c 6f 63 6b 43  od */.  dotlockC
202c0 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b  heckReservedLock
202d0 20 20 2f 2a 20 78 43 68 65 63 6b 52 65 73 65 72    /* xCheckReser
202e0 76 65 64 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a  vedLock method *
202f0 2f 0a 29 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f  /.)..#if SQLITE_
20300 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53  ENABLE_LOCKING_S
20310 54 59 4c 45 20 26 26 20 21 4f 53 5f 56 58 57 4f  TYLE && !OS_VXWO
20320 52 4b 53 0a 49 4f 4d 45 54 48 4f 44 53 28 0a 20  RKS.IOMETHODS(. 
20330 20 66 6c 6f 63 6b 49 6f 46 69 6e 64 65 72 2c 20   flockIoFinder, 
20340 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69             /* Fi
20350 6e 64 65 72 20 66 75 6e 63 74 69 6f 6e 20 6e 61  nder function na
20360 6d 65 20 2a 2f 0a 20 20 66 6c 6f 63 6b 49 6f 4d  me */.  flockIoM
20370 65 74 68 6f 64 73 2c 20 20 20 20 20 20 20 20 20  ethods,         
20380 20 20 2f 2a 20 73 71 6c 69 74 65 33 5f 69 6f 5f    /* sqlite3_io_
20390 6d 65 74 68 6f 64 73 20 6f 62 6a 65 63 74 20 6e  methods object n
203a0 61 6d 65 20 2a 2f 0a 20 20 31 2c 20 20 20 20 20  ame */.  1,     
203b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
203c0 20 20 20 2f 2a 20 53 68 6d 4f 70 65 6e 20 69 73     /* ShmOpen is
203d0 20 64 69 73 61 62 6c 65 64 20 2a 2f 0a 20 20 66   disabled */.  f
203e0 6c 6f 63 6b 43 6c 6f 73 65 2c 20 20 20 20 20 20  lockClose,      
203f0 20 20 20 20 20 20 20 20 20 2f 2a 20 78 43 6c 6f           /* xClo
20400 73 65 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 66  se method */.  f
20410 6c 6f 63 6b 4c 6f 63 6b 2c 20 20 20 20 20 20 20  lockLock,       
20420 20 20 20 20 20 20 20 20 20 2f 2a 20 78 4c 6f 63           /* xLoc
20430 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 66 6c  k method */.  fl
20440 6f 63 6b 55 6e 6c 6f 63 6b 2c 20 20 20 20 20 20  ockUnlock,      
20450 20 20 20 20 20 20 20 20 2f 2a 20 78 55 6e 6c 6f          /* xUnlo
20460 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 66  ck method */.  f
20470 6c 6f 63 6b 43 68 65 63 6b 52 65 73 65 72 76 65  lockCheckReserve
20480 64 4c 6f 63 6b 20 20 20 20 2f 2a 20 78 43 68 65  dLock    /* xChe
20490 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 20 6d  ckReservedLock m
204a0 65 74 68 6f 64 20 2a 2f 0a 29 0a 23 65 6e 64 69  ethod */.).#endi
204b0 66 0a 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b  f..#if OS_VXWORK
204c0 53 0a 49 4f 4d 45 54 48 4f 44 53 28 0a 20 20 73  S.IOMETHODS(.  s
204d0 65 6d 49 6f 46 69 6e 64 65 72 2c 20 20 20 20 20  emIoFinder,     
204e0 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6e 64           /* Find
204f0 65 72 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65  er function name
20500 20 2a 2f 0a 20 20 73 65 6d 49 6f 4d 65 74 68 6f   */.  semIoMetho
20510 64 73 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ds,             
20520 2f 2a 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65  /* sqlite3_io_me
20530 74 68 6f 64 73 20 6f 62 6a 65 63 74 20 6e 61 6d  thods object nam
20540 65 20 2a 2f 0a 20 20 31 2c 20 20 20 20 20 20 20  e */.  1,       
20550 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20560 20 2f 2a 20 53 68 6d 4f 70 65 6e 20 69 73 20 64   /* ShmOpen is d
20570 69 73 61 62 6c 65 64 20 2a 2f 0a 20 20 73 65 6d  isabled */.  sem
20580 43 6c 6f 73 65 2c 20 20 20 20 20 20 20 20 20 20  Close,          
20590 20 20 20 20 20 20 20 2f 2a 20 78 43 6c 6f 73 65         /* xClose
205a0 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 73 65 6d   method */.  sem
205b0 4c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20  Lock,           
205c0 20 20 20 20 20 20 20 2f 2a 20 78 4c 6f 63 6b 20         /* xLock 
205d0 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 73 65 6d 55  method */.  semU
205e0 6e 6c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20  nlock,          
205f0 20 20 20 20 20 20 2f 2a 20 78 55 6e 6c 6f 63 6b        /* xUnlock
20600 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 73 65 6d   method */.  sem
20610 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63  CheckReservedLoc
20620 6b 20 20 20 20 20 20 2f 2a 20 78 43 68 65 63 6b  k      /* xCheck
20630 52 65 73 65 72 76 65 64 4c 6f 63 6b 20 6d 65 74  ReservedLock met
20640 68 6f 64 20 2a 2f 0a 29 0a 23 65 6e 64 69 66 0a  hod */.).#endif.
20650 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 41  .#if defined(__A
20660 50 50 4c 45 5f 5f 29 20 26 26 20 53 51 4c 49 54  PPLE__) && SQLIT
20670 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47  E_ENABLE_LOCKING
20680 5f 53 54 59 4c 45 0a 49 4f 4d 45 54 48 4f 44 53  _STYLE.IOMETHODS
20690 28 0a 20 20 61 66 70 49 6f 46 69 6e 64 65 72 2c  (.  afpIoFinder,
206a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
206b0 20 46 69 6e 64 65 72 20 66 75 6e 63 74 69 6f 6e   Finder function
206c0 20 6e 61 6d 65 20 2a 2f 0a 20 20 61 66 70 49 6f   name */.  afpIo
206d0 4d 65 74 68 6f 64 73 2c 20 20 20 20 20 20 20 20  Methods,        
206e0 20 20 20 20 20 2f 2a 20 73 71 6c 69 74 65 33 5f       /* sqlite3_
206f0 69 6f 5f 6d 65 74 68 6f 64 73 20 6f 62 6a 65 63  io_methods objec
20700 74 20 6e 61 6d 65 20 2a 2f 0a 20 20 31 2c 20 20  t name */.  1,  
20710 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20720 20 20 20 20 20 20 2f 2a 20 53 68 6d 4f 70 65 6e        /* ShmOpen
20730 20 69 73 20 64 69 73 61 62 6c 65 64 20 2a 2f 0a   is disabled */.
20740 20 20 61 66 70 43 6c 6f 73 65 2c 20 20 20 20 20    afpClose,     
20750 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
20760 43 6c 6f 73 65 20 6d 65 74 68 6f 64 20 2a 2f 0a  Close method */.
20770 20 20 61 66 70 4c 6f 63 6b 2c 20 20 20 20 20 20    afpLock,      
20780 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
20790 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20  Lock method */. 
207a0 20 61 66 70 55 6e 6c 6f 63 6b 2c 20 20 20 20 20   afpUnlock,     
207b0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 55             /* xU
207c0 6e 6c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a  nlock method */.
207d0 20 20 61 66 70 43 68 65 63 6b 52 65 73 65 72 76    afpCheckReserv
207e0 65 64 4c 6f 63 6b 20 20 20 20 20 20 2f 2a 20 78  edLock      /* x
207f0 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63  CheckReservedLoc
20800 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 29 0a 23 65  k method */.).#e
20810 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  ndif../*.** The 
20820 70 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 20 6d 65  proxy locking me
20830 74 68 6f 64 20 69 73 20 61 20 22 73 75 70 65 72  thod is a "super
20840 2d 6d 65 74 68 6f 64 22 20 69 6e 20 74 68 65 20  -method" in the 
20850 73 65 6e 73 65 20 74 68 61 74 20 69 74 0a 2a 2a  sense that it.**
20860 20 6f 70 65 6e 73 20 73 65 63 6f 6e 64 61 72 79   opens secondary
20870 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
20880 73 20 66 6f 72 20 74 68 65 20 63 6f 6e 63 68 20  s for the conch 
20890 61 6e 64 20 6c 6f 63 6b 20 66 69 6c 65 73 20 61  and lock files a
208a0 6e 64 0a 2a 2a 20 69 74 20 75 73 65 73 20 70 72  nd.** it uses pr
208b0 6f 78 79 2c 20 64 6f 74 2d 66 69 6c 65 2c 20 41  oxy, dot-file, A
208c0 46 50 2c 20 61 6e 64 20 66 6c 6f 63 6b 28 29 20  FP, and flock() 
208d0 6c 6f 63 6b 69 6e 67 20 6d 65 74 68 6f 64 73 20  locking methods 
208e0 6f 6e 20 74 68 6f 73 65 0a 2a 2a 20 73 65 63 6f  on those.** seco
208f0 6e 64 61 72 79 20 66 69 6c 65 73 2e 20 20 46 6f  ndary files.  Fo
20900 72 20 74 68 69 73 20 72 65 61 73 6f 6e 2c 20 74  r this reason, t
20910 68 65 20 64 69 76 69 73 69 6f 6e 20 74 68 61 74  he division that
20920 20 69 6d 70 6c 65 6d 65 6e 74 73 0a 2a 2a 20 70   implements.** p
20930 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 20 69 73 20  roxy locking is 
20940 6c 6f 63 61 74 65 64 20 6d 75 63 68 20 66 75 72  located much fur
20950 74 68 65 72 20 64 6f 77 6e 20 69 6e 20 74 68 65  ther down in the
20960 20 66 69 6c 65 2e 20 20 42 75 74 20 77 65 20 6e   file.  But we n
20970 65 65 64 0a 2a 2a 20 74 6f 20 67 6f 20 61 68 65  eed.** to go ahe
20980 61 64 20 61 6e 64 20 64 65 66 69 6e 65 20 74 68  ad and define th
20990 65 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74  e sqlite3_io_met
209a0 68 6f 64 73 20 61 6e 64 20 66 69 6e 64 65 72 20  hods and finder 
209b0 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 66 6f 72 20  function.** for 
209c0 70 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 20 68 65  proxy locking he
209d0 72 65 2e 20 20 53 6f 20 77 65 20 66 6f 72 77 61  re.  So we forwa
209e0 72 64 20 64 65 63 6c 61 72 65 20 74 68 65 20 49  rd declare the I
209f0 2f 4f 20 6d 65 74 68 6f 64 73 2e 0a 2a 2f 0a 23  /O methods..*/.#
20a00 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50  if defined(__APP
20a10 4c 45 5f 5f 29 20 26 26 20 53 51 4c 49 54 45 5f  LE__) && SQLITE_
20a20 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53  ENABLE_LOCKING_S
20a30 54 59 4c 45 0a 73 74 61 74 69 63 20 69 6e 74 20  TYLE.static int 
20a40 70 72 6f 78 79 43 6c 6f 73 65 28 73 71 6c 69 74  proxyClose(sqlit
20a50 65 33 5f 66 69 6c 65 2a 29 3b 0a 73 74 61 74 69  e3_file*);.stati
20a60 63 20 69 6e 74 20 70 72 6f 78 79 4c 6f 63 6b 28  c int proxyLock(
20a70 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 2c 20 69  sqlite3_file*, i
20a80 6e 74 29 3b 0a 73 74 61 74 69 63 20 69 6e 74 20  nt);.static int 
20a90 70 72 6f 78 79 55 6e 6c 6f 63 6b 28 73 71 6c 69  proxyUnlock(sqli
20aa0 74 65 33 5f 66 69 6c 65 2a 2c 20 69 6e 74 29 3b  te3_file*, int);
20ab0 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72 6f 78  .static int prox
20ac0 79 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f  yCheckReservedLo
20ad0 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a  ck(sqlite3_file*
20ae0 2c 20 69 6e 74 2a 29 3b 0a 49 4f 4d 45 54 48 4f  , int*);.IOMETHO
20af0 44 53 28 0a 20 20 70 72 6f 78 79 49 6f 46 69 6e  DS(.  proxyIoFin
20b00 64 65 72 2c 20 20 20 20 20 20 20 20 20 20 20 20  der,            
20b10 2f 2a 20 46 69 6e 64 65 72 20 66 75 6e 63 74 69  /* Finder functi
20b20 6f 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20 70 72 6f  on name */.  pro
20b30 78 79 49 6f 4d 65 74 68 6f 64 73 2c 20 20 20 20  xyIoMethods,    
20b40 20 20 20 20 20 20 20 2f 2a 20 73 71 6c 69 74 65         /* sqlite
20b50 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 6f 62 6a  3_io_methods obj
20b60 65 63 74 20 6e 61 6d 65 20 2a 2f 0a 20 20 31 2c  ect name */.  1,
20b70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20b80 20 20 20 20 20 20 20 20 2f 2a 20 53 68 6d 4f 70          /* ShmOp
20b90 65 6e 20 69 73 20 64 69 73 61 62 6c 65 64 20 2a  en is disabled *
20ba0 2f 0a 20 20 70 72 6f 78 79 43 6c 6f 73 65 2c 20  /.  proxyClose, 
20bb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
20bc0 20 78 43 6c 6f 73 65 20 6d 65 74 68 6f 64 20 2a   xClose method *
20bd0 2f 0a 20 20 70 72 6f 78 79 4c 6f 63 6b 2c 20 20  /.  proxyLock,  
20be0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
20bf0 20 78 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f   xLock method */
20c00 0a 20 20 70 72 6f 78 79 55 6e 6c 6f 63 6b 2c 20  .  proxyUnlock, 
20c10 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
20c20 78 55 6e 6c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a  xUnlock method *
20c30 2f 0a 20 20 70 72 6f 78 79 43 68 65 63 6b 52 65  /.  proxyCheckRe
20c40 73 65 72 76 65 64 4c 6f 63 6b 20 20 20 20 2f 2a  servedLock    /*
20c50 20 78 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c   xCheckReservedL
20c60 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 29 0a  ock method */.).
20c70 23 65 6e 64 69 66 0a 0a 2f 2a 20 6e 66 73 20 6c  #endif../* nfs l
20c80 6f 63 6b 64 20 6f 6e 20 4f 53 58 20 31 30 2e 33  ockd on OSX 10.3
20c90 2b 20 64 6f 65 73 6e 27 74 20 63 6c 65 61 72 20  + doesn't clear 
20ca0 77 72 69 74 65 20 6c 6f 63 6b 73 20 77 68 65 6e  write locks when
20cb0 20 61 20 72 65 61 64 20 6c 6f 63 6b 20 69 73 20   a read lock is 
20cc0 73 65 74 20 2a 2f 0a 23 69 66 20 64 65 66 69 6e  set */.#if defin
20cd0 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 26 26  ed(__APPLE__) &&
20ce0 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c   SQLITE_ENABLE_L
20cf0 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 49 4f 4d  OCKING_STYLE.IOM
20d00 45 54 48 4f 44 53 28 0a 20 20 6e 66 73 49 6f 46  ETHODS(.  nfsIoF
20d10 69 6e 64 65 72 2c 20 20 20 20 20 20 20 20 20 20  inder,          
20d20 20 20 20 20 20 2f 2a 20 46 69 6e 64 65 72 20 66       /* Finder f
20d30 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 20 2a 2f 0a  unction name */.
20d40 20 20 6e 66 73 49 6f 4d 65 74 68 6f 64 73 2c 20    nfsIoMethods, 
20d50 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
20d60 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f  sqlite3_io_metho
20d70 64 73 20 6f 62 6a 65 63 74 20 6e 61 6d 65 20 2a  ds object name *
20d80 2f 0a 20 20 31 2c 20 20 20 20 20 20 20 20 20 20  /.  1,          
20d90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
20da0 2a 20 53 68 6d 4f 70 65 6e 20 69 73 20 64 69 73  * ShmOpen is dis
20db0 61 62 6c 65 64 20 2a 2f 0a 20 20 75 6e 69 78 43  abled */.  unixC
20dc0 6c 6f 73 65 2c 20 20 20 20 20 20 20 20 20 20 20  lose,           
20dd0 20 20 20 20 20 20 2f 2a 20 78 43 6c 6f 73 65 20        /* xClose 
20de0 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 75 6e 69 78  method */.  unix
20df0 4c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20  Lock,           
20e00 20 20 20 20 20 20 20 2f 2a 20 78 4c 6f 63 6b 20         /* xLock 
20e10 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 6e 66 73 55  method */.  nfsU
20e20 6e 6c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20  nlock,          
20e30 20 20 20 20 20 20 20 2f 2a 20 78 55 6e 6c 6f 63         /* xUnloc
20e40 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 75 6e  k method */.  un
20e50 69 78 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c  ixCheckReservedL
20e60 6f 63 6b 20 20 20 20 20 20 2f 2a 20 78 43 68 65  ock      /* xChe
20e70 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 20 6d  ckReservedLock m
20e80 65 74 68 6f 64 20 2a 2f 0a 29 0a 23 65 6e 64 69  ethod */.).#endi
20e90 66 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f  f..#if defined(_
20ea0 5f 41 50 50 4c 45 5f 5f 29 20 26 26 20 53 51 4c  _APPLE__) && SQL
20eb0 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49  ITE_ENABLE_LOCKI
20ec0 4e 47 5f 53 54 59 4c 45 0a 2f 2a 20 0a 2a 2a 20  NG_STYLE./* .** 
20ed0 54 68 69 73 20 22 66 69 6e 64 65 72 22 20 66 75  This "finder" fu
20ee0 6e 63 74 69 6f 6e 20 61 74 74 65 6d 70 74 73 20  nction attempts 
20ef0 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 74 68 65  to determine the
20f00 20 62 65 73 74 20 6c 6f 63 6b 69 6e 67 20 73 74   best locking st
20f10 72 61 74 65 67 79 20 0a 2a 2a 20 66 6f 72 20 74  rategy .** for t
20f20 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
20f30 20 22 66 69 6c 65 50 61 74 68 22 2e 20 20 49 74   "filePath".  It
20f40 20 74 68 65 6e 20 72 65 74 75 72 6e 73 20 74 68   then returns th
20f50 65 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74  e sqlite3_io_met
20f60 68 6f 64 73 0a 2a 2a 20 6f 62 6a 65 63 74 20 74  hods.** object t
20f70 68 61 74 20 69 6d 70 6c 65 6d 65 6e 74 73 20 74  hat implements t
20f80 68 61 74 20 73 74 72 61 74 65 67 79 2e 0a 2a 2a  hat strategy..**
20f90 0a 2a 2a 20 54 68 69 73 20 69 73 20 66 6f 72 20  .** This is for 
20fa0 4d 61 63 4f 53 58 20 6f 6e 6c 79 2e 0a 2a 2f 0a  MacOSX only..*/.
20fb0 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73 71 6c  static const sql
20fc0 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20  ite3_io_methods 
20fd0 2a 61 75 74 6f 6c 6f 63 6b 49 6f 46 69 6e 64 65  *autolockIoFinde
20fe0 72 49 6d 70 6c 28 0a 20 20 63 6f 6e 73 74 20 63  rImpl(.  const c
20ff0 68 61 72 20 2a 66 69 6c 65 50 61 74 68 2c 20 20  har *filePath,  
21000 20 20 2f 2a 20 6e 61 6d 65 20 6f 66 20 74 68 65    /* name of the
21010 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a   database file *
21020 2f 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 4e  /.  unixFile *pN
21030 65 77 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ew           /* 
21040 6f 70 65 6e 20 66 69 6c 65 20 6f 62 6a 65 63 74  open file object
21050 20 66 6f 72 20 74 68 65 20 64 61 74 61 62 61 73   for the databas
21060 65 20 66 69 6c 65 20 2a 2f 0a 29 7b 0a 20 20 73  e file */.){.  s
21070 74 61 74 69 63 20 63 6f 6e 73 74 20 73 74 72 75  tatic const stru
21080 63 74 20 4d 61 70 70 69 6e 67 20 7b 0a 20 20 20  ct Mapping {.   
21090 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69   const char *zFi
210a0 6c 65 73 79 73 74 65 6d 3b 20 20 20 20 20 20 20  lesystem;       
210b0 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 65 73 79         /* Filesy
210c0 73 74 65 6d 20 74 79 70 65 20 6e 61 6d 65 20 2a  stem type name *
210d0 2f 0a 20 20 20 20 63 6f 6e 73 74 20 73 71 6c 69  /.    const sqli
210e0 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 2a  te3_io_methods *
210f0 70 4d 65 74 68 6f 64 73 3b 20 20 20 2f 2a 20 41  pMethods;   /* A
21100 70 70 72 6f 70 72 69 61 74 65 20 6c 6f 63 6b 69  ppropriate locki
21110 6e 67 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 7d  ng method */.  }
21120 20 61 4d 61 70 5b 5d 20 3d 20 7b 0a 20 20 20 20   aMap[] = {.    
21130 7b 20 22 68 66 73 22 2c 20 20 20 20 26 70 6f 73  { "hfs",    &pos
21140 69 78 49 6f 4d 65 74 68 6f 64 73 20 7d 2c 0a 20  ixIoMethods },. 
21150 20 20 20 7b 20 22 75 66 73 22 2c 20 20 20 20 26     { "ufs",    &
21160 70 6f 73 69 78 49 6f 4d 65 74 68 6f 64 73 20 7d  posixIoMethods }
21170 2c 0a 20 20 20 20 7b 20 22 61 66 70 66 73 22 2c  ,.    { "afpfs",
21180 20 20 26 61 66 70 49 6f 4d 65 74 68 6f 64 73 20    &afpIoMethods 
21190 7d 2c 0a 20 20 20 20 7b 20 22 73 6d 62 66 73 22  },.    { "smbfs"
211a0 2c 20 20 26 61 66 70 49 6f 4d 65 74 68 6f 64 73  ,  &afpIoMethods
211b0 20 7d 2c 0a 20 20 20 20 7b 20 22 77 65 62 64 61   },.    { "webda
211c0 76 22 2c 20 26 6e 6f 6c 6f 63 6b 49 6f 4d 65 74  v", &nolockIoMet
211d0 68 6f 64 73 20 7d 2c 0a 20 20 20 20 7b 20 30 2c  hods },.    { 0,
211e0 20 30 20 7d 0a 20 20 7d 3b 0a 20 20 69 6e 74 20   0 }.  };.  int 
211f0 69 3b 0a 20 20 73 74 72 75 63 74 20 73 74 61 74  i;.  struct stat
21200 66 73 20 66 73 49 6e 66 6f 3b 0a 20 20 73 74 72  fs fsInfo;.  str
21210 75 63 74 20 66 6c 6f 63 6b 20 6c 6f 63 6b 49 6e  uct flock lockIn
21220 66 6f 3b 0a 0a 20 20 69 66 28 20 21 66 69 6c 65  fo;..  if( !file
21230 50 61 74 68 20 29 7b 0a 20 20 20 20 2f 2a 20 49  Path ){.    /* I
21240 66 20 66 69 6c 65 50 61 74 68 3d 3d 4e 55 4c 4c  f filePath==NULL
21250 20 74 68 61 74 20 6d 65 61 6e 73 20 77 65 20 61   that means we a
21260 72 65 20 64 65 61 6c 69 6e 67 20 77 69 74 68 20  re dealing with 
21270 61 20 74 72 61 6e 73 69 65 6e 74 20 66 69 6c 65  a transient file
21280 0a 20 20 20 20 2a 2a 20 74 68 61 74 20 64 6f 65  .    ** that doe
21290 73 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20 62 65  s not need to be
212a0 20 6c 6f 63 6b 65 64 2e 20 2a 2f 0a 20 20 20 20   locked. */.    
212b0 72 65 74 75 72 6e 20 26 6e 6f 6c 6f 63 6b 49 6f  return &nolockIo
212c0 4d 65 74 68 6f 64 73 3b 0a 20 20 7d 0a 20 20 69  Methods;.  }.  i
212d0 66 28 20 73 74 61 74 66 73 28 66 69 6c 65 50 61  f( statfs(filePa
212e0 74 68 2c 20 26 66 73 49 6e 66 6f 29 20 21 3d 20  th, &fsInfo) != 
212f0 2d 31 20 29 7b 0a 20 20 20 20 69 66 28 20 66 73  -1 ){.    if( fs
21300 49 6e 66 6f 2e 66 5f 66 6c 61 67 73 20 26 20 4d  Info.f_flags & M
21310 4e 54 5f 52 44 4f 4e 4c 59 20 29 7b 0a 20 20 20  NT_RDONLY ){.   
21320 20 20 20 72 65 74 75 72 6e 20 26 6e 6f 6c 6f 63     return &noloc
21330 6b 49 6f 4d 65 74 68 6f 64 73 3b 0a 20 20 20 20  kIoMethods;.    
21340 7d 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 61  }.    for(i=0; a
21350 4d 61 70 5b 69 5d 2e 7a 46 69 6c 65 73 79 73 74  Map[i].zFilesyst
21360 65 6d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  em; i++){.      
21370 69 66 28 20 73 74 72 63 6d 70 28 66 73 49 6e 66  if( strcmp(fsInf
21380 6f 2e 66 5f 66 73 74 79 70 65 6e 61 6d 65 2c 20  o.f_fstypename, 
21390 61 4d 61 70 5b 69 5d 2e 7a 46 69 6c 65 73 79 73  aMap[i].zFilesys
213a0 74 65 6d 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  tem)==0 ){.     
213b0 20 20 20 72 65 74 75 72 6e 20 61 4d 61 70 5b 69     return aMap[i
213c0 5d 2e 70 4d 65 74 68 6f 64 73 3b 0a 20 20 20 20  ].pMethods;.    
213d0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20    }.    }.  }.. 
213e0 20 2f 2a 20 44 65 66 61 75 6c 74 20 63 61 73 65   /* Default case
213f0 2e 20 48 61 6e 64 6c 65 73 2c 20 61 6d 6f 6e 67  . Handles, among
21400 73 74 20 6f 74 68 65 72 73 2c 20 22 6e 66 73 22  st others, "nfs"
21410 2e 0a 20 20 2a 2a 20 54 65 73 74 20 62 79 74 65  ..  ** Test byte
21420 2d 72 61 6e 67 65 20 6c 6f 63 6b 20 75 73 69 6e  -range lock usin
21430 67 20 66 63 6e 74 6c 28 29 2e 20 49 66 20 74 68  g fcntl(). If th
21440 65 20 63 61 6c 6c 20 73 75 63 63 65 65 64 73 2c  e call succeeds,
21450 20 0a 20 20 2a 2a 20 61 73 73 75 6d 65 20 74 68   .  ** assume th
21460 61 74 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74  at the file-syst
21470 65 6d 20 73 75 70 70 6f 72 74 73 20 50 4f 53 49  em supports POSI
21480 58 20 73 74 79 6c 65 20 6c 6f 63 6b 73 2e 20 0a  X style locks. .
21490 20 20 2a 2f 0a 20 20 6c 6f 63 6b 49 6e 66 6f 2e    */.  lockInfo.
214a0 6c 5f 6c 65 6e 20 3d 20 31 3b 0a 20 20 6c 6f 63  l_len = 1;.  loc
214b0 6b 49 6e 66 6f 2e 6c 5f 73 74 61 72 74 20 3d 20  kInfo.l_start = 
214c0 30 3b 0a 20 20 6c 6f 63 6b 49 6e 66 6f 2e 6c 5f  0;.  lockInfo.l_
214d0 77 68 65 6e 63 65 20 3d 20 53 45 45 4b 5f 53 45  whence = SEEK_SE
214e0 54 3b 0a 20 20 6c 6f 63 6b 49 6e 66 6f 2e 6c 5f  T;.  lockInfo.l_
214f0 74 79 70 65 20 3d 20 46 5f 52 44 4c 43 4b 3b 0a  type = F_RDLCK;.
21500 20 20 69 66 28 20 66 63 6e 74 6c 28 70 4e 65 77    if( fcntl(pNew
21510 2d 3e 68 2c 20 46 5f 47 45 54 4c 4b 2c 20 26 6c  ->h, F_GETLK, &l
21520 6f 63 6b 49 6e 66 6f 29 21 3d 2d 31 20 29 20 7b  ockInfo)!=-1 ) {
21530 0a 20 20 20 20 69 66 28 20 73 74 72 63 6d 70 28  .    if( strcmp(
21540 66 73 49 6e 66 6f 2e 66 5f 66 73 74 79 70 65 6e  fsInfo.f_fstypen
21550 61 6d 65 2c 20 22 6e 66 73 22 29 3d 3d 30 20 29  ame, "nfs")==0 )
21560 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 26  {.      return &
21570 6e 66 73 49 6f 4d 65 74 68 6f 64 73 3b 0a 20 20  nfsIoMethods;.  
21580 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 20    } else {.     
21590 20 72 65 74 75 72 6e 20 26 70 6f 73 69 78 49 6f   return &posixIo
215a0 4d 65 74 68 6f 64 73 3b 0a 20 20 20 20 7d 0a 20  Methods;.    }. 
215b0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 74 75   }else{.    retu
215c0 72 6e 20 26 64 6f 74 6c 6f 63 6b 49 6f 4d 65 74  rn &dotlockIoMet
215d0 68 6f 64 73 3b 0a 20 20 7d 0a 7d 0a 73 74 61 74  hods;.  }.}.stat
215e0 69 63 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33  ic const sqlite3
215f0 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 0a 20 20 2a  _io_methods .  *
21600 28 2a 63 6f 6e 73 74 20 61 75 74 6f 6c 6f 63 6b  (*const autolock
21610 49 6f 46 69 6e 64 65 72 29 28 63 6f 6e 73 74 20  IoFinder)(const 
21620 63 68 61 72 2a 2c 75 6e 69 78 46 69 6c 65 2a 29  char*,unixFile*)
21630 20 3d 20 61 75 74 6f 6c 6f 63 6b 49 6f 46 69 6e   = autolockIoFin
21640 64 65 72 49 6d 70 6c 3b 0a 0a 23 65 6e 64 69 66  derImpl;..#endif
21650 20 2f 2a 20 64 65 66 69 6e 65 64 28 5f 5f 41 50   /* defined(__AP
21660 50 4c 45 5f 5f 29 20 26 26 20 53 51 4c 49 54 45  PLE__) && SQLITE
21670 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f  _ENABLE_LOCKING_
21680 53 54 59 4c 45 20 2a 2f 0a 0a 23 69 66 20 4f 53  STYLE */..#if OS
21690 5f 56 58 57 4f 52 4b 53 20 26 26 20 53 51 4c 49  _VXWORKS && SQLI
216a0 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e  TE_ENABLE_LOCKIN
216b0 47 5f 53 54 59 4c 45 0a 2f 2a 20 0a 2a 2a 20 54  G_STYLE./* .** T
216c0 68 69 73 20 22 66 69 6e 64 65 72 22 20 66 75 6e  his "finder" fun
216d0 63 74 69 6f 6e 20 61 74 74 65 6d 70 74 73 20 74  ction attempts t
216e0 6f 20 64 65 74 65 72 6d 69 6e 65 20 74 68 65 20  o determine the 
216f0 62 65 73 74 20 6c 6f 63 6b 69 6e 67 20 73 74 72  best locking str
21700 61 74 65 67 79 20 0a 2a 2a 20 66 6f 72 20 74 68  ategy .** for th
21710 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
21720 22 66 69 6c 65 50 61 74 68 22 2e 20 20 49 74 20  "filePath".  It 
21730 74 68 65 6e 20 72 65 74 75 72 6e 73 20 74 68 65  then returns the
21740 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68   sqlite3_io_meth
21750 6f 64 73 0a 2a 2a 20 6f 62 6a 65 63 74 20 74 68  ods.** object th
21760 61 74 20 69 6d 70 6c 65 6d 65 6e 74 73 20 74 68  at implements th
21770 61 74 20 73 74 72 61 74 65 67 79 2e 0a 2a 2a 0a  at strategy..**.
21780 2a 2a 20 54 68 69 73 20 69 73 20 66 6f 72 20 56  ** This is for V
21790 58 57 6f 72 6b 73 20 6f 6e 6c 79 2e 0a 2a 2f 0a  XWorks only..*/.
217a0 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73 71 6c  static const sql
217b0 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20  ite3_io_methods 
217c0 2a 61 75 74 6f 6c 6f 63 6b 49 6f 46 69 6e 64 65  *autolockIoFinde
217d0 72 49 6d 70 6c 28 0a 20 20 63 6f 6e 73 74 20 63  rImpl(.  const c
217e0 68 61 72 20 2a 66 69 6c 65 50 61 74 68 2c 20 20  har *filePath,  
217f0 20 20 2f 2a 20 6e 61 6d 65 20 6f 66 20 74 68 65    /* name of the
21800 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a   database file *
21810 2f 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 4e  /.  unixFile *pN
21820 65 77 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ew           /* 
21830 74 68 65 20 6f 70 65 6e 20 66 69 6c 65 20 6f 62  the open file ob
21840 6a 65 63 74 20 2a 2f 0a 29 7b 0a 20 20 73 74 72  ject */.){.  str
21850 75 63 74 20 66 6c 6f 63 6b 20 6c 6f 63 6b 49 6e  uct flock lockIn
21860 66 6f 3b 0a 0a 20 20 69 66 28 20 21 66 69 6c 65  fo;..  if( !file
21870 50 61 74 68 20 29 7b 0a 20 20 20 20 2f 2a 20 49  Path ){.    /* I
21880 66 20 66 69 6c 65 50 61 74 68 3d 3d 4e 55 4c 4c  f filePath==NULL
21890 20 74 68 61 74 20 6d 65 61 6e 73 20 77 65 20 61   that means we a
218a0 72 65 20 64 65 61 6c 69 6e 67 20 77 69 74 68 20  re dealing with 
218b0 61 20 74 72 61 6e 73 69 65 6e 74 20 66 69 6c 65  a transient file
218c0 0a 20 20 20 20 2a 2a 20 74 68 61 74 20 64 6f 65  .    ** that doe
218d0 73 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20 62 65  s not need to be
218e0 20 6c 6f 63 6b 65 64 2e 20 2a 2f 0a 20 20 20 20   locked. */.    
218f0 72 65 74 75 72 6e 20 26 6e 6f 6c 6f 63 6b 49 6f  return &nolockIo
21900 4d 65 74 68 6f 64 73 3b 0a 20 20 7d 0a 0a 20 20  Methods;.  }..  
21910 2f 2a 20 54 65 73 74 20 69 66 20 66 63 6e 74 6c  /* Test if fcntl
21920 28 29 20 69 73 20 73 75 70 70 6f 72 74 65 64 20  () is supported 
21930 61 6e 64 20 75 73 65 20 50 4f 53 49 58 20 73 74  and use POSIX st
21940 79 6c 65 20 6c 6f 63 6b 73 2e 0a 20 20 2a 2a 20  yle locks..  ** 
21950 4f 74 68 65 72 77 69 73 65 20 66 61 6c 6c 20 62  Otherwise fall b
21960 61 63 6b 20 74 6f 20 74 68 65 20 6e 61 6d 65 64  ack to the named
21970 20 73 65 6d 61 70 68 6f 72 65 20 6d 65 74 68 6f   semaphore metho
21980 64 2e 0a 20 20 2a 2f 0a 20 20 6c 6f 63 6b 49 6e  d..  */.  lockIn
21990 66 6f 2e 6c 5f 6c 65 6e 20 3d 20 31 3b 0a 20 20  fo.l_len = 1;.  
219a0 6c 6f 63 6b 49 6e 66 6f 2e 6c 5f 73 74 61 72 74  lockInfo.l_start
219b0 20 3d 20 30 3b 0a 20 20 6c 6f 63 6b 49 6e 66 6f   = 0;.  lockInfo
219c0 2e 6c 5f 77 68 65 6e 63 65 20 3d 20 53 45 45 4b  .l_whence = SEEK
219d0 5f 53 45 54 3b 0a 20 20 6c 6f 63 6b 49 6e 66 6f  _SET;.  lockInfo
219e0 2e 6c 5f 74 79 70 65 20 3d 20 46 5f 52 44 4c 43  .l_type = F_RDLC
219f0 4b 3b 0a 20 20 69 66 28 20 66 63 6e 74 6c 28 70  K;.  if( fcntl(p
21a00 4e 65 77 2d 3e 68 2c 20 46 5f 47 45 54 4c 4b 2c  New->h, F_GETLK,
21a10 20 26 6c 6f 63 6b 49 6e 66 6f 29 21 3d 2d 31 20   &lockInfo)!=-1 
21a20 29 20 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 26  ) {.    return &
21a30 70 6f 73 69 78 49 6f 4d 65 74 68 6f 64 73 3b 0a  posixIoMethods;.
21a40 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 74    }else{.    ret
21a50 75 72 6e 20 26 73 65 6d 49 6f 4d 65 74 68 6f 64  urn &semIoMethod
21a60 73 3b 0a 20 20 7d 0a 7d 0a 73 74 61 74 69 63 20  s;.  }.}.static 
21a70 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 69 6f  const sqlite3_io
21a80 5f 6d 65 74 68 6f 64 73 20 0a 20 20 2a 28 2a 63  _methods .  *(*c
21a90 6f 6e 73 74 20 61 75 74 6f 6c 6f 63 6b 49 6f 46  onst autolockIoF
21aa0 69 6e 64 65 72 29 28 63 6f 6e 73 74 20 63 68 61  inder)(const cha
21ab0 72 2a 2c 75 6e 69 78 46 69 6c 65 2a 29 20 3d 20  r*,unixFile*) = 
21ac0 61 75 74 6f 6c 6f 63 6b 49 6f 46 69 6e 64 65 72  autolockIoFinder
21ad0 49 6d 70 6c 3b 0a 0a 23 65 6e 64 69 66 20 2f 2a  Impl;..#endif /*
21ae0 20 4f 53 5f 56 58 57 4f 52 4b 53 20 26 26 20 53   OS_VXWORKS && S
21af0 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43  QLITE_ENABLE_LOC
21b00 4b 49 4e 47 5f 53 54 59 4c 45 20 2a 2f 0a 0a 2f  KING_STYLE */../
21b10 2a 0a 2a 2a 20 41 6e 20 61 62 73 74 72 61 63 74  *.** An abstract
21b20 20 74 79 70 65 20 66 6f 72 20 61 20 70 6f 69 6e   type for a poin
21b30 74 65 72 20 74 6f 20 61 20 49 4f 20 6d 65 74 68  ter to a IO meth
21b40 6f 64 20 66 69 6e 64 65 72 20 66 75 6e 63 74 69  od finder functi
21b50 6f 6e 3a 0a 2a 2f 0a 74 79 70 65 64 65 66 20 63  on:.*/.typedef c
21b60 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f  onst sqlite3_io_
21b70 6d 65 74 68 6f 64 73 20 2a 28 2a 66 69 6e 64 65  methods *(*finde
21b80 72 5f 74 79 70 65 29 28 63 6f 6e 73 74 20 63 68  r_type)(const ch
21b90 61 72 2a 2c 75 6e 69 78 46 69 6c 65 2a 29 3b 0a  ar*,unixFile*);.
21ba0 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ../*************
21bb0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
21bc0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
21bd0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
21be0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a  ***************.
21bf0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
21c00 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 73 71 6c  ************ sql
21c10 69 74 65 33 5f 76 66 73 20 6d 65 74 68 6f 64 73  ite3_vfs methods
21c20 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a   ***************
21c30 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a  *************.**
21c40 0a 2a 2a 20 54 68 69 73 20 64 69 76 69 73 69 6f  .** This divisio
21c50 6e 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 69  n contains the i
21c60 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66  mplementation of
21c70 20 6d 65 74 68 6f 64 73 20 6f 6e 20 74 68 65 0a   methods on the.
21c80 2a 2a 20 73 71 6c 69 74 65 33 5f 76 66 73 20 6f  ** sqlite3_vfs o
21c90 62 6a 65 63 74 2e 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a  bject..*/../*.**
21ca0 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20   Initialize the 
21cb0 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20  contents of the 
21cc0 75 6e 69 78 46 69 6c 65 20 73 74 72 75 63 74 75  unixFile structu
21cd0 72 65 20 70 6f 69 6e 74 65 64 20 74 6f 20 62 79  re pointed to by
21ce0 20 70 49 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20   pId..*/.static 
21cf0 69 6e 74 20 66 69 6c 6c 49 6e 55 6e 69 78 46 69  int fillInUnixFi
21d00 6c 65 28 0a 20 20 73 71 6c 69 74 65 33 5f 76 66  le(.  sqlite3_vf
21d10 73 20 2a 70 56 66 73 2c 20 20 20 20 20 20 2f 2a  s *pVfs,      /*
21d20 20 50 6f 69 6e 74 65 72 20 74 6f 20 76 66 73 20   Pointer to vfs 
21d30 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 69 6e 74 20  object */.  int 
21d40 68 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  h,              
21d50 20 20 20 20 2f 2a 20 4f 70 65 6e 20 66 69 6c 65      /* Open file
21d60 20 64 65 73 63 72 69 70 74 6f 72 20 6f 66 20 66   descriptor of f
21d70 69 6c 65 20 62 65 69 6e 67 20 6f 70 65 6e 65 64  ile being opened
21d80 20 2a 2f 0a 20 20 69 6e 74 20 64 69 72 66 64 2c   */.  int dirfd,
21d90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
21da0 20 44 69 72 65 63 74 6f 72 79 20 66 69 6c 65 20   Directory file 
21db0 64 65 73 63 72 69 70 74 6f 72 20 2a 2f 0a 20 20  descriptor */.  
21dc0 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 49  sqlite3_file *pI
21dd0 64 2c 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65  d,      /* Write
21de0 20 74 6f 20 74 68 65 20 75 6e 69 78 46 69 6c 65   to the unixFile
21df0 20 73 74 72 75 63 74 75 72 65 20 68 65 72 65 20   structure here 
21e00 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
21e10 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20 20 2f 2a 20  *zFilename,  /* 
21e20 4e 61 6d 65 20 6f 66 20 74 68 65 20 66 69 6c 65  Name of the file
21e30 20 62 65 69 6e 67 20 6f 70 65 6e 65 64 20 2a 2f   being opened */
21e40 0a 20 20 69 6e 74 20 6e 6f 4c 6f 63 6b 2c 20 20  .  int noLock,  
21e50 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 6d             /* Om
21e60 69 74 20 6c 6f 63 6b 69 6e 67 20 69 66 20 74 72  it locking if tr
21e70 75 65 20 2a 2f 0a 20 20 69 6e 74 20 69 73 44 65  ue */.  int isDe
21e80 6c 65 74 65 20 20 20 20 20 20 20 20 20 20 20 20  lete            
21e90 2f 2a 20 44 65 6c 65 74 65 20 6f 6e 20 63 6c 6f  /* Delete on clo
21ea0 73 65 20 69 66 20 74 72 75 65 20 2a 2f 0a 29 7b  se if true */.){
21eb0 0a 20 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33  .  const sqlite3
21ec0 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 2a 70 4c 6f  _io_methods *pLo
21ed0 63 6b 69 6e 67 53 74 79 6c 65 3b 0a 20 20 75 6e  ckingStyle;.  un
21ee0 69 78 46 69 6c 65 20 2a 70 4e 65 77 20 3d 20 28  ixFile *pNew = (
21ef0 75 6e 69 78 46 69 6c 65 20 2a 29 70 49 64 3b 0a  unixFile *)pId;.
21f00 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
21f10 45 5f 4f 4b 3b 0a 0a 20 20 61 73 73 65 72 74 28  E_OK;..  assert(
21f20 20 70 4e 65 77 2d 3e 70 49 6e 6f 64 65 3d 3d 4e   pNew->pInode==N
21f30 55 4c 4c 20 29 3b 0a 0a 20 20 2f 2a 20 50 61 72  ULL );..  /* Par
21f40 61 6d 65 74 65 72 20 69 73 44 65 6c 65 74 65 20  ameter isDelete 
21f50 69 73 20 6f 6e 6c 79 20 75 73 65 64 20 6f 6e 20  is only used on 
21f60 76 78 77 6f 72 6b 73 2e 20 45 78 70 72 65 73 73  vxworks. Express
21f70 20 74 68 69 73 20 65 78 70 6c 69 63 69 74 6c 79   this explicitly
21f80 20 0a 20 20 2a 2a 20 68 65 72 65 20 74 6f 20 70   .  ** here to p
21f90 72 65 76 65 6e 74 20 63 6f 6d 70 69 6c 65 72 20  revent compiler 
21fa0 77 61 72 6e 69 6e 67 73 20 61 62 6f 75 74 20 75  warnings about u
21fb0 6e 75 73 65 64 20 70 61 72 61 6d 65 74 65 72 73  nused parameters
21fc0 2e 0a 20 20 2a 2f 0a 20 20 55 4e 55 53 45 44 5f  ..  */.  UNUSED_
21fd0 50 41 52 41 4d 45 54 45 52 28 69 73 44 65 6c 65  PARAMETER(isDele
21fe0 74 65 29 3b 0a 0a 20 20 4f 53 54 52 41 43 45 28  te);..  OSTRACE(
21ff0 28 22 4f 50 45 4e 20 20 20 20 25 2d 33 64 20 25  ("OPEN    %-3d %
22000 73 5c 6e 22 2c 20 68 2c 20 7a 46 69 6c 65 6e 61  s\n", h, zFilena
22010 6d 65 29 29 3b 0a 20 20 70 4e 65 77 2d 3e 68 20  me));.  pNew->h 
22020 3d 20 68 3b 0a 20 20 70 4e 65 77 2d 3e 64 69 72  = h;.  pNew->dir
22030 66 64 20 3d 20 64 69 72 66 64 3b 0a 20 20 70 4e  fd = dirfd;.  pN
22040 65 77 2d 3e 66 69 6c 65 46 6c 61 67 73 20 3d 20  ew->fileFlags = 
22050 30 3b 0a 20 20 61 73 73 65 72 74 28 20 7a 46 69  0;.  assert( zFi
22060 6c 65 6e 61 6d 65 3d 3d 30 20 7c 7c 20 7a 46 69  lename==0 || zFi
22070 6c 65 6e 61 6d 65 5b 30 5d 3d 3d 27 2f 27 20 29  lename[0]=='/' )
22080 3b 20 20 2f 2a 20 4e 65 76 65 72 20 61 20 72 65  ;  /* Never a re
22090 6c 61 74 69 76 65 20 70 61 74 68 6e 61 6d 65 20  lative pathname 
220a0 2a 2f 0a 20 20 70 4e 65 77 2d 3e 7a 50 61 74 68  */.  pNew->zPath
220b0 20 3d 20 7a 46 69 6c 65 6e 61 6d 65 3b 0a 0a 23   = zFilename;..#
220c0 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20  if OS_VXWORKS.  
220d0 70 4e 65 77 2d 3e 70 49 64 20 3d 20 76 78 77 6f  pNew->pId = vxwo
220e0 72 6b 73 46 69 6e 64 46 69 6c 65 49 64 28 7a 46  rksFindFileId(zF
220f0 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 69 66 28 20  ilename);.  if( 
22100 70 4e 65 77 2d 3e 70 49 64 3d 3d 30 20 29 7b 0a  pNew->pId==0 ){.
22110 20 20 20 20 6e 6f 4c 6f 63 6b 20 3d 20 31 3b 0a      noLock = 1;.
22120 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
22130 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 23 65 6e 64 69  NOMEM;.  }.#endi
22140 66 0a 0a 20 20 69 66 28 20 6e 6f 4c 6f 63 6b 20  f..  if( noLock 
22150 29 7b 0a 20 20 20 20 70 4c 6f 63 6b 69 6e 67 53  ){.    pLockingS
22160 74 79 6c 65 20 3d 20 26 6e 6f 6c 6f 63 6b 49 6f  tyle = &nolockIo
22170 4d 65 74 68 6f 64 73 3b 0a 20 20 7d 65 6c 73 65  Methods;.  }else
22180 7b 0a 20 20 20 20 70 4c 6f 63 6b 69 6e 67 53 74  {.    pLockingSt
22190 79 6c 65 20 3d 20 28 2a 2a 28 66 69 6e 64 65 72  yle = (**(finder
221a0 5f 74 79 70 65 2a 29 70 56 66 73 2d 3e 70 41 70  _type*)pVfs->pAp
221b0 70 44 61 74 61 29 28 7a 46 69 6c 65 6e 61 6d 65  pData)(zFilename
221c0 2c 20 70 4e 65 77 29 3b 0a 23 69 66 20 53 51 4c  , pNew);.#if SQL
221d0 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49  ITE_ENABLE_LOCKI
221e0 4e 47 5f 53 54 59 4c 45 0a 20 20 20 20 2f 2a 20  NG_STYLE.    /* 
221f0 43 61 63 68 65 20 7a 46 69 6c 65 6e 61 6d 65 20  Cache zFilename 
22200 69 6e 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 63  in the locking c
22210 6f 6e 74 65 78 74 20 28 41 46 50 20 61 6e 64 20  ontext (AFP and 
22220 64 6f 74 6c 6f 63 6b 20 6f 76 65 72 72 69 64 65  dotlock override
22230 29 20 66 6f 72 0a 20 20 20 20 2a 2a 20 70 72 6f  ) for.    ** pro
22240 78 79 4c 6f 63 6b 20 61 63 74 69 76 61 74 69 6f  xyLock activatio
22250 6e 20 69 73 20 70 6f 73 73 69 62 6c 65 20 28 72  n is possible (r
22260 65 6d 6f 74 65 20 70 72 6f 78 79 20 69 73 20 62  emote proxy is b
22270 61 73 65 64 20 6f 6e 20 64 62 20 6e 61 6d 65 29  ased on db name)
22280 0a 20 20 20 20 2a 2a 20 7a 46 69 6c 65 6e 61 6d  .    ** zFilenam
22290 65 20 72 65 6d 61 69 6e 73 20 76 61 6c 69 64 20  e remains valid 
222a0 75 6e 74 69 6c 20 66 69 6c 65 20 69 73 20 63 6c  until file is cl
222b0 6f 73 65 64 2c 20 74 6f 20 73 75 70 70 6f 72 74  osed, to support
222c0 20 2a 2f 0a 20 20 20 20 70 4e 65 77 2d 3e 6c 6f   */.    pNew->lo
222d0 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 3d 20 28  ckingContext = (
222e0 76 6f 69 64 2a 29 7a 46 69 6c 65 6e 61 6d 65 3b  void*)zFilename;
222f0 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 0a 20 20 69  .#endif.  }..  i
22300 66 28 20 70 4c 6f 63 6b 69 6e 67 53 74 79 6c 65  f( pLockingStyle
22310 20 3d 3d 20 26 70 6f 73 69 78 49 6f 4d 65 74 68   == &posixIoMeth
22320 6f 64 73 0a 23 69 66 20 64 65 66 69 6e 65 64 28  ods.#if defined(
22330 5f 5f 41 50 50 4c 45 5f 5f 29 20 26 26 20 53 51  __APPLE__) && SQ
22340 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b  LITE_ENABLE_LOCK
22350 49 4e 47 5f 53 54 59 4c 45 0a 20 20 20 20 7c 7c  ING_STYLE.    ||
22360 20 70 4c 6f 63 6b 69 6e 67 53 74 79 6c 65 20 3d   pLockingStyle =
22370 3d 20 26 6e 66 73 49 6f 4d 65 74 68 6f 64 73 0a  = &nfsIoMethods.
22380 23 65 6e 64 69 66 0a 20 20 29 7b 0a 20 20 20 20  #endif.  ){.    
22390 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29  unixEnterMutex()
223a0 3b 0a 20 20 20 20 72 63 20 3d 20 66 69 6e 64 49  ;.    rc = findI
223b0 6e 6f 64 65 49 6e 66 6f 28 70 4e 65 77 2c 20 26  nodeInfo(pNew, &
223c0 70 4e 65 77 2d 3e 70 49 6e 6f 64 65 29 3b 0a 20  pNew->pInode);. 
223d0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
223e0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 2f 2a  E_OK ){.      /*
223f0 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   If an error occ
22400 75 72 65 64 20 69 6e 20 66 69 6e 64 49 6e 6f 64  ured in findInod
22410 65 49 6e 66 6f 28 29 2c 20 63 6c 6f 73 65 20 74  eInfo(), close t
22420 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  he file descript
22430 6f 72 0a 20 20 20 20 20 20 2a 2a 20 69 6d 6d 65  or.      ** imme
22440 64 69 61 74 65 6c 79 2c 20 62 65 66 6f 72 65 20  diately, before 
22450 72 65 6c 65 61 73 69 6e 67 20 74 68 65 20 6d 75  releasing the mu
22460 74 65 78 2e 20 66 69 6e 64 49 6e 6f 64 65 49 6e  tex. findInodeIn
22470 66 6f 28 29 20 6d 61 79 20 66 61 69 6c 0a 20 20  fo() may fail.  
22480 20 20 20 20 2a 2a 20 69 6e 20 74 77 6f 20 73 63      ** in two sc
22490 65 6e 61 72 69 6f 73 3a 0a 20 20 20 20 20 20 2a  enarios:.      *
224a0 2a 0a 20 20 20 20 20 20 2a 2a 20 20 20 28 61 29  *.      **   (a)
224b0 20 41 20 63 61 6c 6c 20 74 6f 20 66 73 74 61 74   A call to fstat
224c0 28 29 20 66 61 69 6c 65 64 2e 0a 20 20 20 20 20  () failed..     
224d0 20 2a 2a 20 20 20 28 62 29 20 41 20 6d 61 6c 6c   **   (b) A mall
224e0 6f 63 20 66 61 69 6c 65 64 2e 0a 20 20 20 20 20  oc failed..     
224f0 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 53 63 65   **.      ** Sce
22500 6e 61 72 69 6f 20 28 62 29 20 6d 61 79 20 6f 6e  nario (b) may on
22510 6c 79 20 6f 63 63 75 72 20 69 66 20 74 68 65 20  ly occur if the 
22520 70 72 6f 63 65 73 73 20 69 73 20 68 6f 6c 64 69  process is holdi
22530 6e 67 20 6e 6f 20 6f 74 68 65 72 0a 20 20 20 20  ng no other.    
22540 20 20 2a 2a 20 66 69 6c 65 20 64 65 73 63 72 69    ** file descri
22550 70 74 6f 72 73 20 6f 70 65 6e 20 6f 6e 20 74 68  ptors open on th
22560 65 20 73 61 6d 65 20 66 69 6c 65 2e 20 49 66 20  e same file. If 
22570 74 68 65 72 65 20 77 65 72 65 20 6f 74 68 65 72  there were other
22580 20 66 69 6c 65 0a 20 20 20 20 20 20 2a 2a 20 64   file.      ** d
22590 65 73 63 72 69 70 74 6f 72 73 20 6f 6e 20 74 68  escriptors on th
225a0 69 73 20 66 69 6c 65 2c 20 74 68 65 6e 20 6e 6f  is file, then no
225b0 20 6d 61 6c 6c 6f 63 20 77 6f 75 6c 64 20 62 65   malloc would be
225c0 20 72 65 71 75 69 72 65 64 20 62 79 0a 20 20 20   required by.   
225d0 20 20 20 2a 2a 20 66 69 6e 64 49 6e 6f 64 65 49     ** findInodeI
225e0 6e 66 6f 28 29 2e 20 49 66 20 74 68 69 73 20 69  nfo(). If this i
225f0 73 20 74 68 65 20 63 61 73 65 2c 20 69 74 20 69  s the case, it i
22600 73 20 71 75 69 74 65 20 73 61 66 65 20 74 6f 20  s quite safe to 
22610 63 6c 6f 73 65 0a 20 20 20 20 20 20 2a 2a 20 68  close.      ** h
22620 61 6e 64 6c 65 20 68 20 2d 20 61 73 20 69 74 20  andle h - as it 
22630 69 73 20 67 75 61 72 61 6e 74 65 65 64 20 74 68  is guaranteed th
22640 61 74 20 6e 6f 20 70 6f 73 69 78 20 6c 6f 63 6b  at no posix lock
22650 73 20 77 69 6c 6c 20 62 65 20 72 65 6c 65 61 73  s will be releas
22660 65 64 0a 20 20 20 20 20 20 2a 2a 20 62 79 20 64  ed.      ** by d
22670 6f 69 6e 67 20 73 6f 2e 0a 20 20 20 20 20 20 2a  oing so..      *
22680 2a 0a 20 20 20 20 20 20 2a 2a 20 49 66 20 73 63  *.      ** If sc
22690 65 6e 61 72 69 6f 20 28 61 29 20 63 61 75 73 65  enario (a) cause
226a0 64 20 74 68 65 20 65 72 72 6f 72 20 74 68 65 6e  d the error then
226b0 20 74 68 69 6e 67 73 20 61 72 65 20 6e 6f 74 20   things are not 
226c0 73 6f 20 73 61 66 65 2e 20 54 68 65 0a 20 20 20  so safe. The.   
226d0 20 20 20 2a 2a 20 69 6d 70 6c 69 63 69 74 20 61     ** implicit a
226e0 73 73 75 6d 70 74 69 6f 6e 20 68 65 72 65 20 69  ssumption here i
226f0 73 20 74 68 61 74 20 69 66 20 66 73 74 61 74 28  s that if fstat(
22700 29 20 66 61 69 6c 73 2c 20 74 68 69 6e 67 73 20  ) fails, things 
22710 61 72 65 20 69 6e 0a 20 20 20 20 20 20 2a 2a 20  are in.      ** 
22720 73 75 63 68 20 62 61 64 20 73 68 61 70 65 20 74  such bad shape t
22730 68 61 74 20 64 72 6f 70 70 69 6e 67 20 61 20 6c  hat dropping a l
22740 6f 63 6b 20 6f 72 20 74 77 6f 20 64 6f 65 73 6e  ock or two doesn
22750 27 74 20 6d 61 74 74 65 72 20 6d 75 63 68 2e 0a  't matter much..
22760 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 63        */.      c
22770 6c 6f 73 65 28 68 29 3b 0a 20 20 20 20 20 20 68  lose(h);.      h
22780 20 3d 20 2d 31 3b 0a 20 20 20 20 7d 0a 20 20 20   = -1;.    }.   
22790 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28   unixLeaveMutex(
227a0 29 3b 0a 20 20 7d 0a 0a 23 69 66 20 53 51 4c 49  );.  }..#if SQLI
227b0 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e  TE_ENABLE_LOCKIN
227c0 47 5f 53 54 59 4c 45 20 26 26 20 64 65 66 69 6e  G_STYLE && defin
227d0 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 0a 20 20  ed(__APPLE__).  
227e0 65 6c 73 65 20 69 66 28 20 70 4c 6f 63 6b 69 6e  else if( pLockin
227f0 67 53 74 79 6c 65 20 3d 3d 20 26 61 66 70 49 6f  gStyle == &afpIo
22800 4d 65 74 68 6f 64 73 20 29 7b 0a 20 20 20 20 2f  Methods ){.    /
22810 2a 20 41 46 50 20 6c 6f 63 6b 69 6e 67 20 75 73  * AFP locking us
22820 65 73 20 74 68 65 20 66 69 6c 65 20 70 61 74 68  es the file path
22830 20 73 6f 20 69 74 20 6e 65 65 64 73 20 74 6f 20   so it needs to 
22840 62 65 20 69 6e 63 6c 75 64 65 64 20 69 6e 0a 20  be included in. 
22850 20 20 20 2a 2a 20 74 68 65 20 61 66 70 4c 6f 63     ** the afpLoc
22860 6b 69 6e 67 43 6f 6e 74 65 78 74 2e 0a 20 20 20  kingContext..   
22870 20 2a 2f 0a 20 20 20 20 61 66 70 4c 6f 63 6b 69   */.    afpLocki
22880 6e 67 43 6f 6e 74 65 78 74 20 2a 70 43 74 78 3b  ngContext *pCtx;
22890 0a 20 20 20 20 70 4e 65 77 2d 3e 6c 6f 63 6b 69  .    pNew->locki
228a0 6e 67 43 6f 6e 74 65 78 74 20 3d 20 70 43 74 78  ngContext = pCtx
228b0 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f   = sqlite3_mallo
228c0 63 28 20 73 69 7a 65 6f 66 28 2a 70 43 74 78 29  c( sizeof(*pCtx)
228d0 20 29 3b 0a 20 20 20 20 69 66 28 20 70 43 74 78   );.    if( pCtx
228e0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20  ==0 ){.      rc 
228f0 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  = SQLITE_NOMEM;.
22900 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
22910 20 2f 2a 20 4e 42 3a 20 7a 46 69 6c 65 6e 61 6d   /* NB: zFilenam
22920 65 20 65 78 69 73 74 73 20 61 6e 64 20 72 65 6d  e exists and rem
22930 61 69 6e 73 20 76 61 6c 69 64 20 75 6e 74 69 6c  ains valid until
22940 20 74 68 65 20 66 69 6c 65 20 69 73 20 63 6c 6f   the file is clo
22950 73 65 64 0a 20 20 20 20 20 20 2a 2a 20 61 63 63  sed.      ** acc
22960 6f 72 64 69 6e 67 20 74 6f 20 72 65 71 75 69 72  ording to requir
22970 65 6d 65 6e 74 20 46 31 31 31 34 31 2e 20 20 53  ement F11141.  S
22980 6f 20 77 65 20 64 6f 20 6e 6f 74 20 6e 65 65 64  o we do not need
22990 20 74 6f 20 6d 61 6b 65 20 61 0a 20 20 20 20 20   to make a.     
229a0 20 2a 2a 20 63 6f 70 79 20 6f 66 20 74 68 65 20   ** copy of the 
229b0 66 69 6c 65 6e 61 6d 65 2e 20 2a 2f 0a 20 20 20  filename. */.   
229c0 20 20 20 70 43 74 78 2d 3e 64 62 50 61 74 68 20     pCtx->dbPath 
229d0 3d 20 7a 46 69 6c 65 6e 61 6d 65 3b 0a 20 20 20  = zFilename;.   
229e0 20 20 20 70 43 74 78 2d 3e 72 65 73 65 72 76 65     pCtx->reserve
229f0 64 20 3d 20 30 3b 0a 20 20 20 20 20 20 73 72 61  d = 0;.      sra
22a00 6e 64 6f 6d 64 65 76 28 29 3b 0a 20 20 20 20 20  ndomdev();.     
22a10 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28   unixEnterMutex(
22a20 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 66 69  );.      rc = fi
22a30 6e 64 49 6e 6f 64 65 49 6e 66 6f 28 70 4e 65 77  ndInodeInfo(pNew
22a40 2c 20 26 70 4e 65 77 2d 3e 70 49 6e 6f 64 65 29  , &pNew->pInode)
22a50 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
22a60 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
22a70 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
22a80 65 28 70 4e 65 77 2d 3e 6c 6f 63 6b 69 6e 67 43  e(pNew->lockingC
22a90 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20 20 20 20  ontext);.       
22aa0 20 63 6c 6f 73 65 28 68 29 3b 0a 20 20 20 20 20   close(h);.     
22ab0 20 20 20 68 20 3d 20 2d 31 3b 0a 20 20 20 20 20     h = -1;.     
22ac0 20 7d 0a 20 20 20 20 20 20 75 6e 69 78 4c 65 61   }.      unixLea
22ad0 76 65 4d 75 74 65 78 28 29 3b 20 20 20 20 20 20  veMutex();      
22ae0 20 20 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e    .    }.  }.#en
22af0 64 69 66 0a 0a 20 20 65 6c 73 65 20 69 66 28 20  dif..  else if( 
22b00 70 4c 6f 63 6b 69 6e 67 53 74 79 6c 65 20 3d 3d  pLockingStyle ==
22b10 20 26 64 6f 74 6c 6f 63 6b 49 6f 4d 65 74 68 6f   &dotlockIoMetho
22b20 64 73 20 29 7b 0a 20 20 20 20 2f 2a 20 44 6f 74  ds ){.    /* Dot
22b30 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 20 75 73 65  file locking use
22b40 73 20 74 68 65 20 66 69 6c 65 20 70 61 74 68 20  s the file path 
22b50 73 6f 20 69 74 20 6e 65 65 64 73 20 74 6f 20 62  so it needs to b
22b60 65 20 69 6e 63 6c 75 64 65 64 20 69 6e 0a 20 20  e included in.  
22b70 20 20 2a 2a 20 74 68 65 20 64 6f 74 6c 6f 63 6b    ** the dotlock
22b80 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 0a  LockingContext .
22b90 20 20 20 20 2a 2f 0a 20 20 20 20 63 68 61 72 20      */.    char 
22ba0 2a 7a 4c 6f 63 6b 46 69 6c 65 3b 0a 20 20 20 20  *zLockFile;.    
22bb0 69 6e 74 20 6e 46 69 6c 65 6e 61 6d 65 3b 0a 20  int nFilename;. 
22bc0 20 20 20 6e 46 69 6c 65 6e 61 6d 65 20 3d 20 28     nFilename = (
22bd0 69 6e 74 29 73 74 72 6c 65 6e 28 7a 46 69 6c 65  int)strlen(zFile
22be0 6e 61 6d 65 29 20 2b 20 36 3b 0a 20 20 20 20 7a  name) + 6;.    z
22bf0 4c 6f 63 6b 46 69 6c 65 20 3d 20 28 63 68 61 72  LockFile = (char
22c00 20 2a 29 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f   *)sqlite3_mallo
22c10 63 28 6e 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20  c(nFilename);.  
22c20 20 20 69 66 28 20 7a 4c 6f 63 6b 46 69 6c 65 3d    if( zLockFile=
22c30 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  =0 ){.      rc =
22c40 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
22c50 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
22c60 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
22c70 28 6e 46 69 6c 65 6e 61 6d 65 2c 20 7a 4c 6f 63  (nFilename, zLoc
22c80 6b 46 69 6c 65 2c 20 22 25 73 22 20 44 4f 54 4c  kFile, "%s" DOTL
22c90 4f 43 4b 5f 53 55 46 46 49 58 2c 20 7a 46 69 6c  OCK_SUFFIX, zFil
22ca0 65 6e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 20 20  ename);.    }.  
22cb0 20 20 70 4e 65 77 2d 3e 6c 6f 63 6b 69 6e 67 43    pNew->lockingC
22cc0 6f 6e 74 65 78 74 20 3d 20 7a 4c 6f 63 6b 46 69  ontext = zLockFi
22cd0 6c 65 3b 0a 20 20 7d 0a 0a 23 69 66 20 4f 53 5f  le;.  }..#if OS_
22ce0 56 58 57 4f 52 4b 53 0a 20 20 65 6c 73 65 20 69  VXWORKS.  else i
22cf0 66 28 20 70 4c 6f 63 6b 69 6e 67 53 74 79 6c 65  f( pLockingStyle
22d00 20 3d 3d 20 26 73 65 6d 49 6f 4d 65 74 68 6f 64   == &semIoMethod
22d10 73 20 29 7b 0a 20 20 20 20 2f 2a 20 4e 61 6d 65  s ){.    /* Name
22d20 64 20 73 65 6d 61 70 68 6f 72 65 20 6c 6f 63 6b  d semaphore lock
22d30 69 6e 67 20 75 73 65 73 20 74 68 65 20 66 69 6c  ing uses the fil
22d40 65 20 70 61 74 68 20 73 6f 20 69 74 20 6e 65 65  e path so it nee
22d50 64 73 20 74 6f 20 62 65 0a 20 20 20 20 2a 2a 20  ds to be.    ** 
22d60 69 6e 63 6c 75 64 65 64 20 69 6e 20 74 68 65 20  included in the 
22d70 73 65 6d 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78  semLockingContex
22d80 74 0a 20 20 20 20 2a 2f 0a 20 20 20 20 75 6e 69  t.    */.    uni
22d90 78 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 20  xEnterMutex();. 
22da0 20 20 20 72 63 20 3d 20 66 69 6e 64 49 6e 6f 64     rc = findInod
22db0 65 49 6e 66 6f 28 70 4e 65 77 2c 20 26 70 4e 65  eInfo(pNew, &pNe
22dc0 77 2d 3e 70 49 6e 6f 64 65 29 3b 0a 20 20 20 20  w->pInode);.    
22dd0 69 66 28 20 28 72 63 3d 3d 53 51 4c 49 54 45 5f  if( (rc==SQLITE_
22de0 4f 4b 29 20 26 26 20 28 70 4e 65 77 2d 3e 70 49  OK) && (pNew->pI
22df0 6e 6f 64 65 2d 3e 70 53 65 6d 3d 3d 4e 55 4c 4c  node->pSem==NULL
22e00 29 20 29 7b 0a 20 20 20 20 20 20 63 68 61 72 20  ) ){.      char 
22e10 2a 7a 53 65 6d 4e 61 6d 65 20 3d 20 70 4e 65 77  *zSemName = pNew
22e20 2d 3e 70 49 6e 6f 64 65 2d 3e 61 53 65 6d 4e 61  ->pInode->aSemNa
22e30 6d 65 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 3b  me;.      int n;
22e40 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73  .      sqlite3_s
22e50 6e 70 72 69 6e 74 66 28 4d 41 58 5f 50 41 54 48  nprintf(MAX_PATH
22e60 4e 41 4d 45 2c 20 7a 53 65 6d 4e 61 6d 65 2c 20  NAME, zSemName, 
22e70 22 2f 25 73 2e 73 65 6d 22 2c 0a 20 20 20 20 20  "/%s.sem",.     
22e80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22e90 20 20 70 4e 65 77 2d 3e 70 49 64 2d 3e 7a 43 61    pNew->pId->zCa
22ea0 6e 6f 6e 69 63 61 6c 4e 61 6d 65 29 3b 0a 20 20  nonicalName);.  
22eb0 20 20 20 20 66 6f 72 28 20 6e 3d 31 3b 20 7a 53      for( n=1; zS
22ec0 65 6d 4e 61 6d 65 5b 6e 5d 3b 20 6e 2b 2b 20 29  emName[n]; n++ )
22ed0 0a 20 20 20 20 20 20 20 20 69 66 28 20 7a 53 65  .        if( zSe
22ee0 6d 4e 61 6d 65 5b 6e 5d 3d 3d 27 2f 27 20 29 20  mName[n]=='/' ) 
22ef0 7a 53 65 6d 4e 61 6d 65 5b 6e 5d 20 3d 20 27 5f  zSemName[n] = '_
22f00 27 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 70  ';.      pNew->p
22f10 49 6e 6f 64 65 2d 3e 70 53 65 6d 20 3d 20 73 65  Inode->pSem = se
22f20 6d 5f 6f 70 65 6e 28 7a 53 65 6d 4e 61 6d 65 2c  m_open(zSemName,
22f30 20 4f 5f 43 52 45 41 54 2c 20 30 36 36 36 2c 20   O_CREAT, 0666, 
22f40 31 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4e  1);.      if( pN
22f50 65 77 2d 3e 70 49 6e 6f 64 65 2d 3e 70 53 65 6d  ew->pInode->pSem
22f60 20 3d 3d 20 53 45 4d 5f 46 41 49 4c 45 44 20 29   == SEM_FAILED )
22f70 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53  {.        rc = S
22f80 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
22f90 20 20 20 20 20 70 4e 65 77 2d 3e 70 49 6e 6f 64       pNew->pInod
22fa0 65 2d 3e 61 53 65 6d 4e 61 6d 65 5b 30 5d 20 3d  e->aSemName[0] =
22fb0 20 27 5c 30 27 3b 0a 20 20 20 20 20 20 7d 0a 20   '\0';.      }. 
22fc0 20 20 20 7d 0a 20 20 20 20 75 6e 69 78 4c 65 61     }.    unixLea
22fd0 76 65 4d 75 74 65 78 28 29 3b 0a 20 20 7d 0a 23  veMutex();.  }.#
22fe0 65 6e 64 69 66 0a 20 20 0a 20 20 70 4e 65 77 2d  endif.  .  pNew-
22ff0 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 30 3b 0a  >lastErrno = 0;.
23000 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 20  #if OS_VXWORKS. 
23010 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
23020 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 68 3e  OK ){.    if( h>
23030 3d 30 20 29 20 63 6c 6f 73 65 28 68 29 3b 0a 20  =0 ) close(h);. 
23040 20 20 20 68 20 3d 20 2d 31 3b 0a 20 20 20 20 75     h = -1;.    u
23050 6e 6c 69 6e 6b 28 7a 46 69 6c 65 6e 61 6d 65 29  nlink(zFilename)
23060 3b 0a 20 20 20 20 69 73 44 65 6c 65 74 65 20 3d  ;.    isDelete =
23070 20 30 3b 0a 20 20 7d 0a 20 20 70 4e 65 77 2d 3e   0;.  }.  pNew->
23080 69 73 44 65 6c 65 74 65 20 3d 20 69 73 44 65 6c  isDelete = isDel
23090 65 74 65 3b 0a 23 65 6e 64 69 66 0a 20 20 69 66  ete;.#endif.  if
230a0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
230b0 29 7b 0a 20 20 20 20 69 66 28 20 64 69 72 66 64  ){.    if( dirfd
230c0 3e 3d 30 20 29 20 63 6c 6f 73 65 28 64 69 72 66  >=0 ) close(dirf
230d0 64 29 3b 20 2f 2a 20 73 69 6c 65 6e 74 20 6c 65  d); /* silent le
230e0 61 6b 20 69 66 20 66 61 69 6c 2c 20 61 6c 72 65  ak if fail, alre
230f0 61 64 79 20 69 6e 20 65 72 72 6f 72 20 2a 2f 0a  ady in error */.
23100 20 20 20 20 69 66 28 20 68 3e 3d 30 20 29 20 63      if( h>=0 ) c
23110 6c 6f 73 65 28 68 29 3b 0a 20 20 7d 65 6c 73 65  lose(h);.  }else
23120 7b 0a 20 20 20 20 70 4e 65 77 2d 3e 70 4d 65 74  {.    pNew->pMet
23130 68 6f 64 20 3d 20 70 4c 6f 63 6b 69 6e 67 53 74  hod = pLockingSt
23140 79 6c 65 3b 0a 20 20 20 20 4f 70 65 6e 43 6f 75  yle;.    OpenCou
23150 6e 74 65 72 28 2b 31 29 3b 0a 20 20 7d 0a 20 20  nter(+1);.  }.  
23160 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
23170 0a 2a 2a 20 4f 70 65 6e 20 61 20 66 69 6c 65 20  .** Open a file 
23180 64 65 73 63 72 69 70 74 6f 72 20 74 6f 20 74 68  descriptor to th
23190 65 20 64 69 72 65 63 74 6f 72 79 20 63 6f 6e 74  e directory cont
231a0 61 69 6e 69 6e 67 20 66 69 6c 65 20 7a 46 69 6c  aining file zFil
231b0 65 6e 61 6d 65 2e 0a 2a 2a 20 49 66 20 73 75 63  ename..** If suc
231c0 63 65 73 73 66 75 6c 2c 20 2a 70 46 64 20 69 73  cessful, *pFd is
231d0 20 73 65 74 20 74 6f 20 74 68 65 20 6f 70 65 6e   set to the open
231e0 65 64 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  ed file descript
231f0 6f 72 20 61 6e 64 0a 2a 2a 20 53 51 4c 49 54 45  or and.** SQLITE
23200 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e  _OK is returned.
23210 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   If an error occ
23220 75 72 73 2c 20 65 69 74 68 65 72 20 53 51 4c 49  urs, either SQLI
23230 54 45 5f 4e 4f 4d 45 4d 0a 2a 2a 20 6f 72 20 53  TE_NOMEM.** or S
23240 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 20 69  QLITE_CANTOPEN i
23250 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20 2a  s returned and *
23260 70 46 64 20 69 73 20 73 65 74 20 74 6f 20 61 6e  pFd is set to an
23270 20 75 6e 64 65 66 69 6e 65 64 0a 2a 2a 20 76 61   undefined.** va
23280 6c 75 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 53 51  lue..**.** If SQ
23290 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72  LITE_OK is retur
232a0 6e 65 64 2c 20 74 68 65 20 63 61 6c 6c 65 72 20  ned, the caller 
232b0 69 73 20 72 65 73 70 6f 6e 73 69 62 6c 65 20 66  is responsible f
232c0 6f 72 20 63 6c 6f 73 69 6e 67 0a 2a 2a 20 74 68  or closing.** th
232d0 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  e file descripto
232e0 72 20 2a 70 46 64 20 75 73 69 6e 67 20 63 6c 6f  r *pFd using clo
232f0 73 65 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  se()..*/.static 
23300 69 6e 74 20 6f 70 65 6e 44 69 72 65 63 74 6f 72  int openDirector
23310 79 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46  y(const char *zF
23320 69 6c 65 6e 61 6d 65 2c 20 69 6e 74 20 2a 70 46  ilename, int *pF
23330 64 29 7b 0a 20 20 69 6e 74 20 69 69 3b 0a 20 20  d){.  int ii;.  
23340 69 6e 74 20 66 64 20 3d 20 2d 31 3b 0a 20 20 63  int fd = -1;.  c
23350 68 61 72 20 7a 44 69 72 6e 61 6d 65 5b 4d 41 58  har zDirname[MAX
23360 5f 50 41 54 48 4e 41 4d 45 2b 31 5d 3b 0a 0a 20  _PATHNAME+1];.. 
23370 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
23380 66 28 4d 41 58 5f 50 41 54 48 4e 41 4d 45 2c 20  f(MAX_PATHNAME, 
23390 7a 44 69 72 6e 61 6d 65 2c 20 22 25 73 22 2c 20  zDirname, "%s", 
233a0 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 66 6f  zFilename);.  fo
233b0 72 28 69 69 3d 28 69 6e 74 29 73 74 72 6c 65 6e  r(ii=(int)strlen
233c0 28 7a 44 69 72 6e 61 6d 65 29 3b 20 69 69 3e 31  (zDirname); ii>1
233d0 20 26 26 20 7a 44 69 72 6e 61 6d 65 5b 69 69 5d   && zDirname[ii]
233e0 21 3d 27 2f 27 3b 20 69 69 2d 2d 29 3b 0a 20 20  !='/'; ii--);.  
233f0 69 66 28 20 69 69 3e 30 20 29 7b 0a 20 20 20 20  if( ii>0 ){.    
23400 7a 44 69 72 6e 61 6d 65 5b 69 69 5d 20 3d 20 27  zDirname[ii] = '
23410 5c 30 27 3b 0a 20 20 20 20 66 64 20 3d 20 6f 70  \0';.    fd = op
23420 65 6e 28 7a 44 69 72 6e 61 6d 65 2c 20 4f 5f 52  en(zDirname, O_R
23430 44 4f 4e 4c 59 7c 4f 5f 42 49 4e 41 52 59 2c 20  DONLY|O_BINARY, 
23440 30 29 3b 0a 20 20 20 20 69 66 28 20 66 64 3e 3d  0);.    if( fd>=
23450 30 20 29 7b 0a 23 69 66 64 65 66 20 46 44 5f 43  0 ){.#ifdef FD_C
23460 4c 4f 45 58 45 43 0a 20 20 20 20 20 20 66 63 6e  LOEXEC.      fcn
23470 74 6c 28 66 64 2c 20 46 5f 53 45 54 46 44 2c 20  tl(fd, F_SETFD, 
23480 66 63 6e 74 6c 28 66 64 2c 20 46 5f 47 45 54 46  fcntl(fd, F_GETF
23490 44 2c 20 30 29 20 7c 20 46 44 5f 43 4c 4f 45 58  D, 0) | FD_CLOEX
234a0 45 43 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  EC);.#endif.    
234b0 20 20 4f 53 54 52 41 43 45 28 28 22 4f 50 45 4e    OSTRACE(("OPEN
234c0 44 49 52 20 25 2d 33 64 20 25 73 5c 6e 22 2c 20  DIR %-3d %s\n", 
234d0 66 64 2c 20 7a 44 69 72 6e 61 6d 65 29 29 3b 0a  fd, zDirname));.
234e0 20 20 20 20 7d 0a 20 20 7d 0a 20 20 2a 70 46 64      }.  }.  *pFd
234f0 20 3d 20 66 64 3b 0a 20 20 72 65 74 75 72 6e 20   = fd;.  return 
23500 28 66 64 3e 3d 30 3f 53 51 4c 49 54 45 5f 4f 4b  (fd>=0?SQLITE_OK
23510 3a 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e  :SQLITE_CANTOPEN
23520 5f 42 4b 50 54 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  _BKPT);.}../*.**
23530 20 43 72 65 61 74 65 20 61 20 74 65 6d 70 6f 72   Create a tempor
23540 61 72 79 20 66 69 6c 65 20 6e 61 6d 65 20 69 6e  ary file name in
23550 20 7a 42 75 66 2e 20 20 7a 42 75 66 20 6d 75 73   zBuf.  zBuf mus
23560 74 20 62 65 20 61 6c 6c 6f 63 61 74 65 64 0a 2a  t be allocated.*
23570 2a 20 62 79 20 74 68 65 20 63 61 6c 6c 69 6e 67  * by the calling
23580 20 70 72 6f 63 65 73 73 20 61 6e 64 20 6d 75 73   process and mus
23590 74 20 62 65 20 62 69 67 20 65 6e 6f 75 67 68 20  t be big enough 
235a0 74 6f 20 68 6f 6c 64 20 61 74 20 6c 65 61 73 74  to hold at least
235b0 0a 2a 2a 20 70 56 66 73 2d 3e 6d 78 50 61 74 68  .** pVfs->mxPath
235c0 6e 61 6d 65 20 62 79 74 65 73 2e 0a 2a 2f 0a 73  name bytes..*/.s
235d0 74 61 74 69 63 20 69 6e 74 20 67 65 74 54 65 6d  tatic int getTem
235e0 70 6e 61 6d 65 28 69 6e 74 20 6e 42 75 66 2c 20  pname(int nBuf, 
235f0 63 68 61 72 20 2a 7a 42 75 66 29 7b 0a 20 20 73  char *zBuf){.  s
23600 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72  tatic const char
23610 20 2a 61 7a 44 69 72 73 5b 5d 20 3d 20 7b 0a 20   *azDirs[] = {. 
23620 20 20 20 20 30 2c 0a 20 20 20 20 20 30 2c 0a 20      0,.     0,. 
23630 20 20 20 20 22 2f 76 61 72 2f 74 6d 70 22 2c 0a      "/var/tmp",.
23640 20 20 20 20 20 22 2f 75 73 72 2f 74 6d 70 22 2c       "/usr/tmp",
23650 0a 20 20 20 20 20 22 2f 74 6d 70 22 2c 0a 20 20  .     "/tmp",.  
23660 20 20 20 22 2e 22 2c 0a 20 20 7d 3b 0a 20 20 73     ".",.  };.  s
23670 74 61 74 69 63 20 63 6f 6e 73 74 20 75 6e 73 69  tatic const unsi
23680 67 6e 65 64 20 63 68 61 72 20 7a 43 68 61 72 73  gned char zChars
23690 5b 5d 20 3d 0a 20 20 20 20 22 61 62 63 64 65 66  [] =.    "abcdef
236a0 67 68 69 6a 6b 6c 6d 6e 6f 70 71 72 73 74 75 76  ghijklmnopqrstuv
236b0 77 78 79 7a 22 0a 20 20 20 20 22 41 42 43 44 45  wxyz".    "ABCDE
236c0 46 47 48 49 4a 4b 4c 4d 4e 4f 50 51 52 53 54 55  FGHIJKLMNOPQRSTU
236d0 56 57 58 59 5a 22 0a 20 20 20 20 22 30 31 32 33  VWXYZ".    "0123
236e0 34 35 36 37 38 39 22 3b 0a 20 20 75 6e 73 69 67  456789";.  unsig
236f0 6e 65 64 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20  ned int i, j;.  
23700 73 74 72 75 63 74 20 73 74 61 74 20 62 75 66 3b  struct stat buf;
23710 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
23720 44 69 72 20 3d 20 22 2e 22 3b 0a 0a 20 20 2f 2a  Dir = ".";..  /*
23730 20 49 74 27 73 20 6f 64 64 20 74 6f 20 73 69 6d   It's odd to sim
23740 75 6c 61 74 65 20 61 6e 20 69 6f 2d 65 72 72 6f  ulate an io-erro
23750 72 20 68 65 72 65 2c 20 62 75 74 20 72 65 61 6c  r here, but real
23760 6c 79 20 74 68 69 73 20 69 73 20 6a 75 73 74 0a  ly this is just.
23770 20 20 2a 2a 20 75 73 69 6e 67 20 74 68 65 20 69    ** using the i
23780 6f 2d 65 72 72 6f 72 20 69 6e 66 72 61 73 74 72  o-error infrastr
23790 75 63 74 75 72 65 20 74 6f 20 74 65 73 74 20 74  ucture to test t
237a0 68 61 74 20 53 51 4c 69 74 65 20 68 61 6e 64 6c  hat SQLite handl
237b0 65 73 20 74 68 69 73 0a 20 20 2a 2a 20 66 75 6e  es this.  ** fun
237c0 63 74 69 6f 6e 20 66 61 69 6c 69 6e 67 2e 20 0a  ction failing. .
237d0 20 20 2a 2f 0a 20 20 53 69 6d 75 6c 61 74 65 49    */.  SimulateI
237e0 4f 45 72 72 6f 72 28 20 72 65 74 75 72 6e 20 53  OError( return S
237f0 51 4c 49 54 45 5f 49 4f 45 52 52 20 29 3b 0a 0a  QLITE_IOERR );..
23800 20 20 61 7a 44 69 72 73 5b 30 5d 20 3d 20 73 71    azDirs[0] = sq
23810 6c 69 74 65 33 5f 74 65 6d 70 5f 64 69 72 65 63  lite3_temp_direc
23820 74 6f 72 79 3b 0a 20 20 69 66 20 28 4e 55 4c 4c  tory;.  if (NULL
23830 20 3d 3d 20 61 7a 44 69 72 73 5b 31 5d 29 20 7b   == azDirs[1]) {
23840 0a 20 20 20 20 61 7a 44 69 72 73 5b 31 5d 20 3d  .    azDirs[1] =
23850 20 67 65 74 65 6e 76 28 22 54 4d 50 44 49 52 22   getenv("TMPDIR"
23860 29 3b 0a 20 20 7d 0a 20 20 0a 20 20 66 6f 72 28  );.  }.  .  for(
23870 69 3d 30 3b 20 69 3c 73 69 7a 65 6f 66 28 61 7a  i=0; i<sizeof(az
23880 44 69 72 73 29 2f 73 69 7a 65 6f 66 28 61 7a 44  Dirs)/sizeof(azD
23890 69 72 73 5b 30 5d 29 3b 20 69 2b 2b 29 7b 0a 20  irs[0]); i++){. 
238a0 20 20 20 69 66 28 20 61 7a 44 69 72 73 5b 69 5d     if( azDirs[i]
238b0 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  ==0 ) continue;.
238c0 20 20 20 20 69 66 28 20 73 74 61 74 28 61 7a 44      if( stat(azD
238d0 69 72 73 5b 69 5d 2c 20 26 62 75 66 29 20 29 20  irs[i], &buf) ) 
238e0 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66  continue;.    if
238f0 28 20 21 53 5f 49 53 44 49 52 28 62 75 66 2e 73  ( !S_ISDIR(buf.s
23900 74 5f 6d 6f 64 65 29 20 29 20 63 6f 6e 74 69 6e  t_mode) ) contin
23910 75 65 3b 0a 20 20 20 20 69 66 28 20 61 63 63 65  ue;.    if( acce
23920 73 73 28 61 7a 44 69 72 73 5b 69 5d 2c 20 30 37  ss(azDirs[i], 07
23930 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  ) ) continue;.  
23940 20 20 7a 44 69 72 20 3d 20 61 7a 44 69 72 73 5b    zDir = azDirs[
23950 69 5d 3b 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20  i];.    break;. 
23960 20 7d 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74   }..  /* Check t
23970 68 61 74 20 74 68 65 20 6f 75 74 70 75 74 20 62  hat the output b
23980 75 66 66 65 72 20 69 73 20 6c 61 72 67 65 20 65  uffer is large e
23990 6e 6f 75 67 68 20 66 6f 72 20 74 68 65 20 74 65  nough for the te
239a0 6d 70 6f 72 61 72 79 20 66 69 6c 65 20 0a 20 20  mporary file .  
239b0 2a 2a 20 6e 61 6d 65 2e 20 49 66 20 69 74 20 69  ** name. If it i
239c0 73 20 6e 6f 74 2c 20 72 65 74 75 72 6e 20 53 51  s not, return SQ
239d0 4c 49 54 45 5f 45 52 52 4f 52 2e 0a 20 20 2a 2f  LITE_ERROR..  */
239e0 0a 20 20 69 66 28 20 28 73 74 72 6c 65 6e 28 7a  .  if( (strlen(z
239f0 44 69 72 29 20 2b 20 73 74 72 6c 65 6e 28 53 51  Dir) + strlen(SQ
23a00 4c 49 54 45 5f 54 45 4d 50 5f 46 49 4c 45 5f 50  LITE_TEMP_FILE_P
23a10 52 45 46 49 58 29 20 2b 20 31 37 29 20 3e 3d 20  REFIX) + 17) >= 
23a20 28 73 69 7a 65 5f 74 29 6e 42 75 66 20 29 7b 0a  (size_t)nBuf ){.
23a30 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
23a40 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20  E_ERROR;.  }..  
23a50 64 6f 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  do{.    sqlite3_
23a60 73 6e 70 72 69 6e 74 66 28 6e 42 75 66 2d 31 37  snprintf(nBuf-17
23a70 2c 20 7a 42 75 66 2c 20 22 25 73 2f 22 53 51 4c  , zBuf, "%s/"SQL
23a80 49 54 45 5f 54 45 4d 50 5f 46 49 4c 45 5f 50 52  ITE_TEMP_FILE_PR
23a90 45 46 49 58 2c 20 7a 44 69 72 29 3b 0a 20 20 20  EFIX, zDir);.   
23aa0 20 6a 20 3d 20 28 69 6e 74 29 73 74 72 6c 65 6e   j = (int)strlen
23ab0 28 7a 42 75 66 29 3b 0a 20 20 20 20 73 71 6c 69  (zBuf);.    sqli
23ac0 74 65 33 5f 72 61 6e 64 6f 6d 6e 65 73 73 28 31  te3_randomness(1
23ad0 35 2c 20 26 7a 42 75 66 5b 6a 5d 29 3b 0a 20 20  5, &zBuf[j]);.  
23ae0 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 31 35 3b    for(i=0; i<15;
23af0 20 69 2b 2b 2c 20 6a 2b 2b 29 7b 0a 20 20 20 20   i++, j++){.    
23b00 20 20 7a 42 75 66 5b 6a 5d 20 3d 20 28 63 68 61    zBuf[j] = (cha
23b10 72 29 7a 43 68 61 72 73 5b 20 28 28 75 6e 73 69  r)zChars[ ((unsi
23b20 67 6e 65 64 20 63 68 61 72 29 7a 42 75 66 5b 6a  gned char)zBuf[j
23b30 5d 29 25 28 73 69 7a 65 6f 66 28 7a 43 68 61 72  ])%(sizeof(zChar
23b40 73 29 2d 31 29 20 5d 3b 0a 20 20 20 20 7d 0a 20  s)-1) ];.    }. 
23b50 20 20 20 7a 42 75 66 5b 6a 5d 20 3d 20 30 3b 0a     zBuf[j] = 0;.
23b60 20 20 7d 77 68 69 6c 65 28 20 61 63 63 65 73 73    }while( access
23b70 28 7a 42 75 66 2c 30 29 3d 3d 30 20 29 3b 0a 20  (zBuf,0)==0 );. 
23b80 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
23b90 4b 3b 0a 7d 0a 0a 23 69 66 20 53 51 4c 49 54 45  K;.}..#if SQLITE
23ba0 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f  _ENABLE_LOCKING_
23bb0 53 54 59 4c 45 20 26 26 20 64 65 66 69 6e 65 64  STYLE && defined
23bc0 28 5f 5f 41 50 50 4c 45 5f 5f 29 0a 2f 2a 0a 2a  (__APPLE__)./*.*
23bd0 2a 20 52 6f 75 74 69 6e 65 20 74 6f 20 74 72 61  * Routine to tra
23be0 6e 73 66 6f 72 6d 20 61 20 75 6e 69 78 46 69 6c  nsform a unixFil
23bf0 65 20 69 6e 74 6f 20 61 20 70 72 6f 78 79 2d 6c  e into a proxy-l
23c00 6f 63 6b 69 6e 67 20 75 6e 69 78 46 69 6c 65 2e  ocking unixFile.
23c10 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 61 74 69  .** Implementati
23c20 6f 6e 20 69 6e 20 74 68 65 20 70 72 6f 78 79 2d  on in the proxy-
23c30 6c 6f 63 6b 20 64 69 76 69 73 69 6f 6e 2c 20 62  lock division, b
23c40 75 74 20 75 73 65 64 20 62 79 20 75 6e 69 78 4f  ut used by unixO
23c50 70 65 6e 28 29 0a 2a 2a 20 69 66 20 53 51 4c 49  pen().** if SQLI
23c60 54 45 5f 50 52 45 46 45 52 5f 50 52 4f 58 59 5f  TE_PREFER_PROXY_
23c70 4c 4f 43 4b 49 4e 47 20 69 73 20 64 65 66 69 6e  LOCKING is defin
23c80 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ed..*/.static in
23c90 74 20 70 72 6f 78 79 54 72 61 6e 73 66 6f 72 6d  t proxyTransform
23ca0 55 6e 69 78 46 69 6c 65 28 75 6e 69 78 46 69 6c  UnixFile(unixFil
23cb0 65 2a 2c 20 63 6f 6e 73 74 20 63 68 61 72 2a 29  e*, const char*)
23cc0 3b 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  ;.#endif../*.** 
23cd0 53 65 61 72 63 68 20 66 6f 72 20 61 6e 20 75 6e  Search for an un
23ce0 75 73 65 64 20 66 69 6c 65 20 64 65 73 63 72 69  used file descri
23cf0 70 74 6f 72 20 74 68 61 74 20 77 61 73 20 6f 70  ptor that was op
23d00 65 6e 65 64 20 6f 6e 20 74 68 65 20 64 61 74 61  ened on the data
23d10 62 61 73 65 20 0a 2a 2a 20 66 69 6c 65 20 28 6e  base .** file (n
23d20 6f 74 20 61 20 6a 6f 75 72 6e 61 6c 20 6f 72 20  ot a journal or 
23d30 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 66  master-journal f
23d40 69 6c 65 29 20 69 64 65 6e 74 69 66 69 65 64 20  ile) identified 
23d50 62 79 20 70 61 74 68 6e 61 6d 65 0a 2a 2a 20 7a  by pathname.** z
23d60 50 61 74 68 20 77 69 74 68 20 53 51 4c 49 54 45  Path with SQLITE
23d70 5f 4f 50 45 4e 5f 58 58 58 20 66 6c 61 67 73 20  _OPEN_XXX flags 
23d80 6d 61 74 63 68 69 6e 67 20 74 68 6f 73 65 20 70  matching those p
23d90 61 73 73 65 64 20 61 73 20 74 68 65 20 73 65 63  assed as the sec
23da0 6f 6e 64 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 20  ond.** argument 
23db0 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  to this function
23dc0 2e 0a 2a 2a 0a 2a 2a 20 53 75 63 68 20 61 20 66  ..**.** Such a f
23dd0 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 6d  ile descriptor m
23de0 61 79 20 65 78 69 73 74 20 69 66 20 61 20 64 61  ay exist if a da
23df0 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
23e00 6e 20 77 61 73 20 63 6c 6f 73 65 64 0a 2a 2a 20  n was closed.** 
23e10 62 75 74 20 74 68 65 20 61 73 73 6f 63 69 61 74  but the associat
23e20 65 64 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  ed file descript
23e30 6f 72 20 63 6f 75 6c 64 20 6e 6f 74 20 62 65 20  or could not be 
23e40 63 6c 6f 73 65 64 20 62 65 63 61 75 73 65 20 73  closed because s
23e50 6f 6d 65 0a 2a 2a 20 6f 74 68 65 72 20 66 69 6c  ome.** other fil
23e60 65 20 64 65 73 63 72 69 70 74 6f 72 20 6f 70 65  e descriptor ope
23e70 6e 20 6f 6e 20 74 68 65 20 73 61 6d 65 20 66 69  n on the same fi
23e80 6c 65 20 69 73 20 68 6f 6c 64 69 6e 67 20 61 20  le is holding a 
23e90 66 69 6c 65 2d 6c 6f 63 6b 2e 0a 2a 2a 20 52 65  file-lock..** Re
23ea0 66 65 72 20 74 6f 20 63 6f 6d 6d 65 6e 74 73 20  fer to comments 
23eb0 69 6e 20 74 68 65 20 75 6e 69 78 43 6c 6f 73 65  in the unixClose
23ec0 28 29 20 66 75 6e 63 74 69 6f 6e 20 61 6e 64 20  () function and 
23ed0 74 68 65 20 6c 65 6e 67 74 68 79 20 63 6f 6d 6d  the lengthy comm
23ee0 65 6e 74 0a 2a 2a 20 64 65 73 63 72 69 62 69 6e  ent.** describin
23ef0 67 20 22 50 6f 73 69 78 20 41 64 76 69 73 6f 72  g "Posix Advisor
23f00 79 20 4c 6f 63 6b 69 6e 67 22 20 61 74 20 74 68  y Locking" at th
23f10 65 20 73 74 61 72 74 20 6f 66 20 74 68 69 73 20  e start of this 
23f20 66 69 6c 65 20 66 6f 72 20 0a 2a 2a 20 66 75 72  file for .** fur
23f30 74 68 65 72 20 64 65 74 61 69 6c 73 2e 20 41 6c  ther details. Al
23f40 73 6f 2c 20 74 69 63 6b 65 74 20 23 34 30 31 38  so, ticket #4018
23f50 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 73 75 69  ..**.** If a sui
23f60 74 61 62 6c 65 20 66 69 6c 65 20 64 65 73 63 72  table file descr
23f70 69 70 74 6f 72 20 69 73 20 66 6f 75 6e 64 2c 20  iptor is found, 
23f80 74 68 65 6e 20 69 74 20 69 73 20 72 65 74 75 72  then it is retur
23f90 6e 65 64 2e 20 49 66 20 6e 6f 0a 2a 2a 20 73 75  ned. If no.** su
23fa0 63 68 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  ch file descript
23fb0 6f 72 20 69 73 20 6c 6f 63 61 74 65 64 2c 20 2d  or is located, -
23fc0 31 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a  1 is returned..*
23fd0 2f 0a 73 74 61 74 69 63 20 55 6e 69 78 55 6e 75  /.static UnixUnu
23fe0 73 65 64 46 64 20 2a 66 69 6e 64 52 65 75 73 61  sedFd *findReusa
23ff0 62 6c 65 46 64 28 63 6f 6e 73 74 20 63 68 61 72  bleFd(const char
24000 20 2a 7a 50 61 74 68 2c 20 69 6e 74 20 66 6c 61   *zPath, int fla
24010 67 73 29 7b 0a 20 20 55 6e 69 78 55 6e 75 73 65  gs){.  UnixUnuse
24020 64 46 64 20 2a 70 55 6e 75 73 65 64 20 3d 20 30  dFd *pUnused = 0
24030 3b 0a 0a 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 73  ;..  /* Do not s
24040 65 61 72 63 68 20 66 6f 72 20 61 6e 20 75 6e 75  earch for an unu
24050 73 65 64 20 66 69 6c 65 20 64 65 73 63 72 69 70  sed file descrip
24060 74 6f 72 20 6f 6e 20 76 78 77 6f 72 6b 73 2e 20  tor on vxworks. 
24070 4e 6f 74 20 62 65 63 61 75 73 65 0a 20 20 2a 2a  Not because.  **
24080 20 76 78 77 6f 72 6b 73 20 77 6f 75 6c 64 20 6e   vxworks would n
24090 6f 74 20 62 65 6e 65 66 69 74 20 66 72 6f 6d 20  ot benefit from 
240a0 74 68 65 20 63 68 61 6e 67 65 20 28 69 74 20 6d  the change (it m
240b0 69 67 68 74 2c 20 77 65 27 72 65 20 6e 6f 74 20  ight, we're not 
240c0 73 75 72 65 29 2c 0a 20 20 2a 2a 20 62 75 74 20  sure),.  ** but 
240d0 62 65 63 61 75 73 65 20 6e 6f 20 77 61 79 20 74  because no way t
240e0 6f 20 74 65 73 74 20 69 74 20 69 73 20 63 75 72  o test it is cur
240f0 72 65 6e 74 6c 79 20 61 76 61 69 6c 61 62 6c 65  rently available
24100 2e 20 49 74 20 69 73 20 62 65 74 74 65 72 20 0a  . It is better .
24110 20 20 2a 2a 20 6e 6f 74 20 74 6f 20 72 69 73 6b    ** not to risk
24120 20 62 72 65 61 6b 69 6e 67 20 76 78 77 6f 72 6b   breaking vxwork
24130 73 20 73 75 70 70 6f 72 74 20 66 6f 72 20 74 68  s support for th
24140 65 20 73 61 6b 65 20 6f 66 20 73 75 63 68 20 61  e sake of such a
24150 6e 20 6f 62 73 63 75 72 65 20 0a 20 20 2a 2a 20  n obscure .  ** 
24160 66 65 61 74 75 72 65 2e 20 20 2a 2f 0a 23 69 66  feature.  */.#if
24170 20 21 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20 73   !OS_VXWORKS.  s
24180 74 72 75 63 74 20 73 74 61 74 20 73 53 74 61 74  truct stat sStat
24190 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
241a0 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 73 20 6f      /* Results o
241b0 66 20 73 74 61 74 28 29 20 63 61 6c 6c 20 2a 2f  f stat() call */
241c0 0a 0a 20 20 2f 2a 20 41 20 73 74 61 74 28 29 20  ..  /* A stat() 
241d0 63 61 6c 6c 20 6d 61 79 20 66 61 69 6c 20 66 6f  call may fail fo
241e0 72 20 76 61 72 69 6f 75 73 20 72 65 61 73 6f 6e  r various reason
241f0 73 2e 20 49 66 20 74 68 69 73 20 68 61 70 70 65  s. If this happe
24200 6e 73 2c 20 69 74 20 69 73 0a 20 20 2a 2a 20 61  ns, it is.  ** a
24210 6c 6d 6f 73 74 20 63 65 72 74 61 69 6e 20 74 68  lmost certain th
24220 61 74 20 61 6e 20 6f 70 65 6e 28 29 20 63 61 6c  at an open() cal
24230 6c 20 6f 6e 20 74 68 65 20 73 61 6d 65 20 70 61  l on the same pa
24240 74 68 20 77 69 6c 6c 20 61 6c 73 6f 20 66 61 69  th will also fai
24250 6c 2e 0a 20 20 2a 2a 20 46 6f 72 20 74 68 69 73  l..  ** For this
24260 20 72 65 61 73 6f 6e 2c 20 69 66 20 61 6e 20 65   reason, if an e
24270 72 72 6f 72 20 6f 63 63 75 72 73 20 69 6e 20 74  rror occurs in t
24280 68 65 20 73 74 61 74 28 29 20 63 61 6c 6c 20 68  he stat() call h
24290 65 72 65 2c 20 69 74 20 69 73 0a 20 20 2a 2a 20  ere, it is.  ** 
242a0 69 67 6e 6f 72 65 64 20 61 6e 64 20 2d 31 20 69  ignored and -1 i
242b0 73 20 72 65 74 75 72 6e 65 64 2e 20 54 68 65 20  s returned. The 
242c0 63 61 6c 6c 65 72 20 77 69 6c 6c 20 74 72 79 20  caller will try 
242d0 74 6f 20 6f 70 65 6e 20 61 20 6e 65 77 20 66 69  to open a new fi
242e0 6c 65 0a 20 20 2a 2a 20 64 65 73 63 72 69 70 74  le.  ** descript
242f0 6f 72 20 6f 6e 20 74 68 65 20 73 61 6d 65 20 70  or on the same p
24300 61 74 68 2c 20 66 61 69 6c 2c 20 61 6e 64 20 72  ath, fail, and r
24310 65 74 75 72 6e 20 61 6e 20 65 72 72 6f 72 20 74  eturn an error t
24320 6f 20 53 51 4c 69 74 65 2e 0a 20 20 2a 2a 0a 20  o SQLite..  **. 
24330 20 2a 2a 20 45 76 65 6e 20 69 66 20 61 20 73 75   ** Even if a su
24340 62 73 65 71 75 65 6e 74 20 6f 70 65 6e 28 29 20  bsequent open() 
24350 63 61 6c 6c 20 64 6f 65 73 20 73 75 63 63 65 65  call does succee
24360 64 2c 20 74 68 65 20 63 6f 6e 73 65 71 75 65 6e  d, the consequen
24370 63 65 73 20 6f 66 0a 20 20 2a 2a 20 6e 6f 74 20  ces of.  ** not 
24380 73 65 61 72 63 68 69 6e 67 20 66 6f 72 20 61 20  searching for a 
24390 72 65 73 75 73 61 62 6c 65 20 66 69 6c 65 20 64  resusable file d
243a0 65 73 63 72 69 70 74 6f 72 20 61 72 65 20 6e 6f  escriptor are no
243b0 74 20 64 69 72 65 2e 20 20 2a 2f 0a 20 20 69 66  t dire.  */.  if
243c0 28 20 30 3d 3d 73 74 61 74 28 7a 50 61 74 68 2c  ( 0==stat(zPath,
243d0 20 26 73 53 74 61 74 29 20 29 7b 0a 20 20 20 20   &sStat) ){.    
243e0 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 2a 70  unixInodeInfo *p
243f0 49 6e 6f 64 65 3b 0a 0a 20 20 20 20 75 6e 69 78  Inode;..    unix
24400 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 20 20  EnterMutex();.  
24410 20 20 70 49 6e 6f 64 65 20 3d 20 69 6e 6f 64 65    pInode = inode
24420 4c 69 73 74 3b 0a 20 20 20 20 77 68 69 6c 65 28  List;.    while(
24430 20 70 49 6e 6f 64 65 20 26 26 20 28 70 49 6e 6f   pInode && (pIno
24440 64 65 2d 3e 66 69 6c 65 49 64 2e 64 65 76 21 3d  de->fileId.dev!=
24450 73 53 74 61 74 2e 73 74 5f 64 65 76 0a 20 20 20  sStat.st_dev.   
24460 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24470 20 20 7c 7c 20 70 49 6e 6f 64 65 2d 3e 66 69 6c    || pInode->fil
24480 65 49 64 2e 69 6e 6f 21 3d 73 53 74 61 74 2e 73  eId.ino!=sStat.s
24490 74 5f 69 6e 6f 29 20 29 7b 0a 20 20 20 20 20 20  t_ino) ){.      
244a0 20 70 49 6e 6f 64 65 20 3d 20 70 49 6e 6f 64 65   pInode = pInode
244b0 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 7d 0a 20  ->pNext;.    }. 
244c0 20 20 20 69 66 28 20 70 49 6e 6f 64 65 20 29 7b     if( pInode ){
244d0 0a 20 20 20 20 20 20 55 6e 69 78 55 6e 75 73 65  .      UnixUnuse
244e0 64 46 64 20 2a 2a 70 70 3b 0a 20 20 20 20 20 20  dFd **pp;.      
244f0 66 6f 72 28 70 70 3d 26 70 49 6e 6f 64 65 2d 3e  for(pp=&pInode->
24500 70 55 6e 75 73 65 64 3b 20 2a 70 70 20 26 26 20  pUnused; *pp && 
24510 28 2a 70 70 29 2d 3e 66 6c 61 67 73 21 3d 66 6c  (*pp)->flags!=fl
24520 61 67 73 3b 20 70 70 3d 26 28 28 2a 70 70 29 2d  ags; pp=&((*pp)-
24530 3e 70 4e 65 78 74 29 29 3b 0a 20 20 20 20 20 20  >pNext));.      
24540 70 55 6e 75 73 65 64 20 3d 20 2a 70 70 3b 0a 20  pUnused = *pp;. 
24550 20 20 20 20 20 69 66 28 20 70 55 6e 75 73 65 64       if( pUnused
24560 20 29 7b 0a 20 20 20 20 20 20 20 20 2a 70 70 20   ){.        *pp 
24570 3d 20 70 55 6e 75 73 65 64 2d 3e 70 4e 65 78 74  = pUnused->pNext
24580 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
24590 20 20 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74      unixLeaveMut
245a0 65 78 28 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  ex();.  }.#endif
245b0 20 20 20 20 2f 2a 20 69 66 20 21 4f 53 5f 56 58      /* if !OS_VX
245c0 57 4f 52 4b 53 20 2a 2f 0a 20 20 72 65 74 75 72  WORKS */.  retur
245d0 6e 20 70 55 6e 75 73 65 64 3b 0a 7d 0a 0a 2f 2a  n pUnused;.}../*
245e0 0a 2a 2a 20 4f 70 65 6e 20 74 68 65 20 66 69 6c  .** Open the fil
245f0 65 20 7a 50 61 74 68 2e 0a 2a 2a 20 0a 2a 2a 20  e zPath..** .** 
24600 50 72 65 76 69 6f 75 73 6c 79 2c 20 74 68 65 20  Previously, the 
24610 53 51 4c 69 74 65 20 4f 53 20 6c 61 79 65 72 20  SQLite OS layer 
24620 75 73 65 64 20 74 68 72 65 65 20 66 75 6e 63 74  used three funct
24630 69 6f 6e 73 20 69 6e 20 70 6c 61 63 65 20 6f 66  ions in place of
24640 20 74 68 69 73 0a 2a 2a 20 6f 6e 65 3a 0a 2a 2a   this.** one:.**
24650 0a 2a 2a 20 20 20 20 20 73 71 6c 69 74 65 33 4f  .**     sqlite3O
24660 73 4f 70 65 6e 52 65 61 64 57 72 69 74 65 28 29  sOpenReadWrite()
24670 3b 0a 2a 2a 20 20 20 20 20 73 71 6c 69 74 65 33  ;.**     sqlite3
24680 4f 73 4f 70 65 6e 52 65 61 64 4f 6e 6c 79 28 29  OsOpenReadOnly()
24690 3b 0a 2a 2a 20 20 20 20 20 73 71 6c 69 74 65 33  ;.**     sqlite3
246a0 4f 73 4f 70 65 6e 45 78 63 6c 75 73 69 76 65 28  OsOpenExclusive(
246b0 29 3b 0a 2a 2a 0a 2a 2a 20 54 68 65 73 65 20 63  );.**.** These c
246c0 61 6c 6c 73 20 63 6f 72 72 65 73 70 6f 6e 64 20  alls correspond 
246d0 74 6f 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  to the following
246e0 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 73 20 6f 66   combinations of
246f0 20 66 6c 61 67 73 3a 0a 2a 2a 0a 2a 2a 20 20 20   flags:.**.**   
24700 20 20 52 65 61 64 57 72 69 74 65 28 29 20 2d 3e    ReadWrite() ->
24710 20 20 20 20 20 28 52 45 41 44 57 52 49 54 45 20       (READWRITE 
24720 7c 20 43 52 45 41 54 45 29 0a 2a 2a 20 20 20 20  | CREATE).**    
24730 20 52 65 61 64 4f 6e 6c 79 28 29 20 20 2d 3e 20   ReadOnly()  -> 
24740 20 20 20 20 28 52 45 41 44 4f 4e 4c 59 29 20 0a      (READONLY) .
24750 2a 2a 20 20 20 20 20 4f 70 65 6e 45 78 63 6c 75  **     OpenExclu
24760 73 69 76 65 28 29 20 2d 3e 20 28 52 45 41 44 57  sive() -> (READW
24770 52 49 54 45 20 7c 20 43 52 45 41 54 45 20 7c 20  RITE | CREATE | 
24780 45 58 43 4c 55 53 49 56 45 29 0a 2a 2a 0a 2a 2a  EXCLUSIVE).**.**
24790 20 54 68 65 20 6f 6c 64 20 4f 70 65 6e 45 78 63   The old OpenExc
247a0 6c 75 73 69 76 65 28 29 20 61 63 63 65 70 74 65  lusive() accepte
247b0 64 20 61 20 62 6f 6f 6c 65 61 6e 20 61 72 67 75  d a boolean argu
247c0 6d 65 6e 74 20 2d 20 22 64 65 6c 46 6c 61 67 22  ment - "delFlag"
247d0 2e 20 49 66 0a 2a 2a 20 74 72 75 65 2c 20 74 68  . If.** true, th
247e0 65 20 66 69 6c 65 20 77 61 73 20 63 6f 6e 66 69  e file was confi
247f0 67 75 72 65 64 20 74 6f 20 62 65 20 61 75 74 6f  gured to be auto
24800 6d 61 74 69 63 61 6c 6c 79 20 64 65 6c 65 74 65  matically delete
24810 64 20 77 68 65 6e 20 74 68 65 0a 2a 2a 20 66 69  d when the.** fi
24820 6c 65 20 68 61 6e 64 6c 65 20 63 6c 6f 73 65 64  le handle closed
24830 2e 20 54 6f 20 61 63 68 69 65 76 65 20 74 68 65  . To achieve the
24840 20 73 61 6d 65 20 65 66 66 65 63 74 20 75 73 69   same effect usi
24850 6e 67 20 74 68 69 73 20 6e 65 77 20 0a 2a 2a 20  ng this new .** 
24860 69 6e 74 65 72 66 61 63 65 2c 20 61 64 64 20 74  interface, add t
24870 68 65 20 44 45 4c 45 54 45 4f 4e 43 4c 4f 53 45  he DELETEONCLOSE
24880 20 66 6c 61 67 20 74 6f 20 74 68 6f 73 65 20 73   flag to those s
24890 70 65 63 69 66 69 65 64 20 61 62 6f 76 65 20 66  pecified above f
248a0 6f 72 20 0a 2a 2a 20 4f 70 65 6e 45 78 63 6c 75  or .** OpenExclu
248b0 73 69 76 65 28 29 2e 0a 2a 2f 0a 73 74 61 74 69  sive()..*/.stati
248c0 63 20 69 6e 74 20 75 6e 69 78 4f 70 65 6e 28 0a  c int unixOpen(.
248d0 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70    sqlite3_vfs *p
248e0 56 66 73 2c 20 20 20 20 20 20 20 20 20 20 20 2f  Vfs,           /
248f0 2a 20 54 68 65 20 56 46 53 20 66 6f 72 20 77 68  * The VFS for wh
24900 69 63 68 20 74 68 69 73 20 69 73 20 74 68 65 20  ich this is the 
24910 78 4f 70 65 6e 20 6d 65 74 68 6f 64 20 2a 2f 0a  xOpen method */.
24920 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50    const char *zP
24930 61 74 68 2c 20 20 20 20 20 20 20 20 20 20 20 2f  ath,           /
24940 2a 20 50 61 74 68 6e 61 6d 65 20 6f 66 20 66 69  * Pathname of fi
24950 6c 65 20 74 6f 20 62 65 20 6f 70 65 6e 65 64 20  le to be opened 
24960 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c  */.  sqlite3_fil
24970 65 20 2a 70 46 69 6c 65 2c 20 20 20 20 20 20 20  e *pFile,       
24980 20 20 2f 2a 20 54 68 65 20 66 69 6c 65 20 64 65    /* The file de
24990 73 63 72 69 70 74 6f 72 20 74 6f 20 62 65 20 66  scriptor to be f
249a0 69 6c 6c 65 64 20 69 6e 20 2a 2f 0a 20 20 69 6e  illed in */.  in
249b0 74 20 66 6c 61 67 73 2c 20 20 20 20 20 20 20 20  t flags,        
249c0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
249d0 70 75 74 20 66 6c 61 67 73 20 74 6f 20 63 6f 6e  put flags to con
249e0 74 72 6f 6c 20 74 68 65 20 6f 70 65 6e 69 6e 67  trol the opening
249f0 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 4f 75 74 46   */.  int *pOutF
24a00 6c 61 67 73 20 20 20 20 20 20 20 20 20 20 20 20  lags            
24a10 20 20 20 2f 2a 20 4f 75 74 70 75 74 20 66 6c 61     /* Output fla
24a20 67 73 20 72 65 74 75 72 6e 65 64 20 74 6f 20 53  gs returned to S
24a30 51 4c 69 74 65 20 63 6f 72 65 20 2a 2f 0a 29 7b  QLite core */.){
24a40 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 20 3d  .  unixFile *p =
24a50 20 28 75 6e 69 78 46 69 6c 65 20 2a 29 70 46 69   (unixFile *)pFi
24a60 6c 65 3b 0a 20 20 69 6e 74 20 66 64 20 3d 20 2d  le;.  int fd = -
24a70 31 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  1;              
24a80 20 20 20 20 20 2f 2a 20 46 69 6c 65 20 64 65 73       /* File des
24a90 63 72 69 70 74 6f 72 20 72 65 74 75 72 6e 65 64  criptor returned
24aa0 20 62 79 20 6f 70 65 6e 28 29 20 2a 2f 0a 20 20   by open() */.  
24ab0 69 6e 74 20 64 69 72 66 64 20 3d 20 2d 31 3b 20  int dirfd = -1; 
24ac0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
24ad0 2a 20 44 69 72 65 63 74 6f 72 79 20 66 69 6c 65  * Directory file
24ae0 20 64 65 73 63 72 69 70 74 6f 72 20 2a 2f 0a 20   descriptor */. 
24af0 20 69 6e 74 20 6f 70 65 6e 46 6c 61 67 73 20 3d   int openFlags =
24b00 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
24b10 2f 2a 20 46 6c 61 67 73 20 74 6f 20 70 61 73 73  /* Flags to pass
24b20 20 74 6f 20 6f 70 65 6e 28 29 20 2a 2f 0a 20 20   to open() */.  
24b30 69 6e 74 20 65 54 79 70 65 20 3d 20 66 6c 61 67  int eType = flag
24b40 73 26 30 78 46 46 46 46 46 46 30 30 3b 20 20 2f  s&0xFFFFFF00;  /
24b50 2a 20 54 79 70 65 20 6f 66 20 66 69 6c 65 20 74  * Type of file t
24b60 6f 20 6f 70 65 6e 20 2a 2f 0a 20 20 69 6e 74 20  o open */.  int 
24b70 6e 6f 4c 6f 63 6b 3b 20 20 20 20 20 20 20 20 20  noLock;         
24b80 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
24b90 75 65 20 74 6f 20 6f 6d 69 74 20 6c 6f 63 6b 69  ue to omit locki
24ba0 6e 67 20 70 72 69 6d 69 74 69 76 65 73 20 2a 2f  ng primitives */
24bb0 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
24bc0 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20  TE_OK;          
24bd0 20 20 2f 2a 20 46 75 6e 63 74 69 6f 6e 20 52 65    /* Function Re
24be0 74 75 72 6e 20 43 6f 64 65 20 2a 2f 0a 0a 20 20  turn Code */..  
24bf0 69 6e 74 20 69 73 45 78 63 6c 75 73 69 76 65 20  int isExclusive 
24c00 20 3d 20 28 66 6c 61 67 73 20 26 20 53 51 4c 49   = (flags & SQLI
24c10 54 45 5f 4f 50 45 4e 5f 45 58 43 4c 55 53 49 56  TE_OPEN_EXCLUSIV
24c20 45 29 3b 0a 20 20 69 6e 74 20 69 73 44 65 6c 65  E);.  int isDele
24c30 74 65 20 20 20 20 20 3d 20 28 66 6c 61 67 73 20  te     = (flags 
24c40 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 44 45  & SQLITE_OPEN_DE
24c50 4c 45 54 45 4f 4e 43 4c 4f 53 45 29 3b 0a 20 20  LETEONCLOSE);.  
24c60 69 6e 74 20 69 73 43 72 65 61 74 65 20 20 20 20  int isCreate    
24c70 20 3d 20 28 66 6c 61 67 73 20 26 20 53 51 4c 49   = (flags & SQLI
24c80 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 29 3b  TE_OPEN_CREATE);
24c90 0a 20 20 69 6e 74 20 69 73 52 65 61 64 6f 6e 6c  .  int isReadonl
24ca0 79 20 20 20 3d 20 28 66 6c 61 67 73 20 26 20 53  y   = (flags & S
24cb0 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f  QLITE_OPEN_READO
24cc0 4e 4c 59 29 3b 0a 20 20 69 6e 74 20 69 73 52 65  NLY);.  int isRe
24cd0 61 64 57 72 69 74 65 20 20 3d 20 28 66 6c 61 67  adWrite  = (flag
24ce0 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  s & SQLITE_OPEN_
24cf0 52 45 41 44 57 52 49 54 45 29 3b 0a 23 69 66 20  READWRITE);.#if 
24d00 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f  SQLITE_ENABLE_LO
24d10 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 20 20 69 6e  CKING_STYLE.  in
24d20 74 20 69 73 41 75 74 6f 50 72 6f 78 79 20 20 3d  t isAutoProxy  =
24d30 20 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45   (flags & SQLITE
24d40 5f 4f 50 45 4e 5f 41 55 54 4f 50 52 4f 58 59 29  _OPEN_AUTOPROXY)
24d50 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 49  ;.#endif..  /* I
24d60 66 20 63 72 65 61 74 69 6e 67 20 61 20 6d 61 73  f creating a mas
24d70 74 65 72 20 6f 72 20 6d 61 69 6e 2d 66 69 6c 65  ter or main-file
24d80 20 6a 6f 75 72 6e 61 6c 2c 20 74 68 69 73 20 66   journal, this f
24d90 75 6e 63 74 69 6f 6e 20 77 69 6c 6c 20 6f 70 65  unction will ope
24da0 6e 0a 20 20 2a 2a 20 61 20 66 69 6c 65 2d 64 65  n.  ** a file-de
24db0 73 63 72 69 70 74 6f 72 20 6f 6e 20 74 68 65 20  scriptor on the 
24dc0 64 69 72 65 63 74 6f 72 79 20 74 6f 6f 2e 20 54  directory too. T
24dd0 68 65 20 66 69 72 73 74 20 74 69 6d 65 20 75 6e  he first time un
24de0 69 78 53 79 6e 63 28 29 0a 20 20 2a 2a 20 69 73  ixSync().  ** is
24df0 20 63 61 6c 6c 65 64 20 74 68 65 20 64 69 72 65   called the dire
24e00 63 74 6f 72 79 20 66 69 6c 65 20 64 65 73 63 72  ctory file descr
24e10 69 70 74 6f 72 20 77 69 6c 6c 20 62 65 20 66 73  iptor will be fs
24e20 79 6e 63 28 29 65 64 20 61 6e 64 20 63 6c 6f 73  ync()ed and clos
24e30 65 28 29 64 2e 0a 20 20 2a 2f 0a 20 20 69 6e 74  e()d..  */.  int
24e40 20 69 73 4f 70 65 6e 44 69 72 65 63 74 6f 72 79   isOpenDirectory
24e50 20 3d 20 28 69 73 43 72 65 61 74 65 20 26 26 20   = (isCreate && 
24e60 0a 20 20 20 20 20 20 28 65 54 79 70 65 3d 3d 53  .      (eType==S
24e70 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 53 54 45  QLITE_OPEN_MASTE
24e80 52 5f 4a 4f 55 52 4e 41 4c 20 7c 7c 20 65 54 79  R_JOURNAL || eTy
24e90 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  pe==SQLITE_OPEN_
24ea0 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 29 0a 20 20  MAIN_JOURNAL).  
24eb0 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 61 72 67 75  );..  /* If argu
24ec0 6d 65 6e 74 20 7a 50 61 74 68 20 69 73 20 61 20  ment zPath is a 
24ed0 4e 55 4c 4c 20 70 6f 69 6e 74 65 72 2c 20 74 68  NULL pointer, th
24ee0 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 72  is function is r
24ef0 65 71 75 69 72 65 64 20 74 6f 20 6f 70 65 6e 0a  equired to open.
24f00 20 20 2a 2a 20 61 20 74 65 6d 70 6f 72 61 72 79    ** a temporary
24f10 20 66 69 6c 65 2e 20 55 73 65 20 74 68 69 73 20   file. Use this 
24f20 62 75 66 66 65 72 20 74 6f 20 73 74 6f 72 65 20  buffer to store 
24f30 74 68 65 20 66 69 6c 65 20 6e 61 6d 65 20 69 6e  the file name in
24f40 2e 0a 20 20 2a 2f 0a 20 20 63 68 61 72 20 7a 54  ..  */.  char zT
24f50 6d 70 6e 61 6d 65 5b 4d 41 58 5f 50 41 54 48 4e  mpname[MAX_PATHN
24f60 41 4d 45 2b 31 5d 3b 0a 20 20 63 6f 6e 73 74 20  AME+1];.  const 
24f70 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 7a 50  char *zName = zP
24f80 61 74 68 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b  ath;..  /* Check
24f90 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73   the following s
24fa0 74 61 74 65 6d 65 6e 74 73 20 61 72 65 20 74 72  tatements are tr
24fb0 75 65 3a 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20  ue: .  **.  **  
24fc0 20 28 61 29 20 45 78 61 63 74 6c 79 20 6f 6e 65   (a) Exactly one
24fd0 20 6f 66 20 74 68 65 20 52 45 41 44 57 52 49 54   of the READWRIT
24fe0 45 20 61 6e 64 20 52 45 41 44 4f 4e 4c 59 20 66  E and READONLY f
24ff0 6c 61 67 73 20 6d 75 73 74 20 62 65 20 73 65 74  lags must be set
25000 2c 20 61 6e 64 20 0a 20 20 2a 2a 20 20 20 28 62  , and .  **   (b
25010 29 20 69 66 20 43 52 45 41 54 45 20 69 73 20 73  ) if CREATE is s
25020 65 74 2c 20 74 68 65 6e 20 52 45 41 44 57 52 49  et, then READWRI
25030 54 45 20 6d 75 73 74 20 61 6c 73 6f 20 62 65 20  TE must also be 
25040 73 65 74 2c 20 61 6e 64 0a 20 20 2a 2a 20 20 20  set, and.  **   
25050 28 63 29 20 69 66 20 45 58 43 4c 55 53 49 56 45  (c) if EXCLUSIVE
25060 20 69 73 20 73 65 74 2c 20 74 68 65 6e 20 43 52   is set, then CR
25070 45 41 54 45 20 6d 75 73 74 20 61 6c 73 6f 20 62  EATE must also b
25080 65 20 73 65 74 2e 0a 20 20 2a 2a 20 20 20 28 64  e set..  **   (d
25090 29 20 69 66 20 44 45 4c 45 54 45 4f 4e 43 4c 4f  ) if DELETEONCLO
250a0 53 45 20 69 73 20 73 65 74 2c 20 74 68 65 6e 20  SE is set, then 
250b0 43 52 45 41 54 45 20 6d 75 73 74 20 61 6c 73 6f  CREATE must also
250c0 20 62 65 20 73 65 74 2e 0a 20 20 2a 2f 0a 20 20   be set..  */.  
250d0 61 73 73 65 72 74 28 28 69 73 52 65 61 64 6f 6e  assert((isReadon
250e0 6c 79 3d 3d 30 20 7c 7c 20 69 73 52 65 61 64 57  ly==0 || isReadW
250f0 72 69 74 65 3d 3d 30 29 20 26 26 20 28 69 73 52  rite==0) && (isR
25100 65 61 64 57 72 69 74 65 20 7c 7c 20 69 73 52 65  eadWrite || isRe
25110 61 64 6f 6e 6c 79 29 29 3b 0a 20 20 61 73 73 65  adonly));.  asse
25120 72 74 28 69 73 43 72 65 61 74 65 3d 3d 30 20 7c  rt(isCreate==0 |
25130 7c 20 69 73 52 65 61 64 57 72 69 74 65 29 3b 0a  | isReadWrite);.
25140 20 20 61 73 73 65 72 74 28 69 73 45 78 63 6c 75    assert(isExclu
25150 73 69 76 65 3d 3d 30 20 7c 7c 20 69 73 43 72 65  sive==0 || isCre
25160 61 74 65 29 3b 0a 20 20 61 73 73 65 72 74 28 69  ate);.  assert(i
25170 73 44 65 6c 65 74 65 3d 3d 30 20 7c 7c 20 69 73  sDelete==0 || is
25180 43 72 65 61 74 65 29 3b 0a 0a 20 20 2f 2a 20 54  Create);..  /* T
25190 68 65 20 6d 61 69 6e 20 44 42 2c 20 6d 61 69 6e  he main DB, main
251a0 20 6a 6f 75 72 6e 61 6c 2c 20 61 6e 64 20 6d 61   journal, and ma
251b0 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 61 72 65  ster journal are
251c0 20 6e 65 76 65 72 20 61 75 74 6f 6d 61 74 69 63   never automatic
251d0 61 6c 6c 79 0a 20 20 2a 2a 20 64 65 6c 65 74 65  ally.  ** delete
251e0 64 2e 20 4e 6f 72 20 61 72 65 20 74 68 65 79 20  d. Nor are they 
251f0 65 76 65 72 20 74 65 6d 70 6f 72 61 72 79 20 66  ever temporary f
25200 69 6c 65 73 2e 20 20 2a 2f 0a 20 20 61 73 73 65  iles.  */.  asse
25210 72 74 28 20 28 21 69 73 44 65 6c 65 74 65 20 26  rt( (!isDelete &
25220 26 20 7a 4e 61 6d 65 29 20 7c 7c 20 65 54 79 70  & zName) || eTyp
25230 65 21 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d  e!=SQLITE_OPEN_M
25240 41 49 4e 5f 44 42 20 29 3b 0a 20 20 61 73 73 65  AIN_DB );.  asse
25250 72 74 28 20 28 21 69 73 44 65 6c 65 74 65 20 26  rt( (!isDelete &
25260 26 20 7a 4e 61 6d 65 29 20 7c 7c 20 65 54 79 70  & zName) || eTyp
25270 65 21 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d  e!=SQLITE_OPEN_M
25280 41 49 4e 5f 4a 4f 55 52 4e 41 4c 20 29 3b 0a 20  AIN_JOURNAL );. 
25290 20 61 73 73 65 72 74 28 20 28 21 69 73 44 65 6c   assert( (!isDel
252a0 65 74 65 20 26 26 20 7a 4e 61 6d 65 29 20 7c 7c  ete && zName) ||
252b0 20 65 54 79 70 65 21 3d 53 51 4c 49 54 45 5f 4f   eType!=SQLITE_O
252c0 50 45 4e 5f 4d 41 53 54 45 52 5f 4a 4f 55 52 4e  PEN_MASTER_JOURN
252d0 41 4c 20 29 3b 0a 0a 20 20 2f 2a 20 41 73 73 65  AL );..  /* Asse
252e0 72 74 20 74 68 61 74 20 74 68 65 20 75 70 70 65  rt that the uppe
252f0 72 20 6c 61 79 65 72 20 68 61 73 20 73 65 74 20  r layer has set 
25300 6f 6e 65 20 6f 66 20 74 68 65 20 22 66 69 6c 65  one of the "file
25310 2d 74 79 70 65 22 20 66 6c 61 67 73 2e 20 2a 2f  -type" flags. */
25320 0a 20 20 61 73 73 65 72 74 28 20 65 54 79 70 65  .  assert( eType
25330 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41  ==SQLITE_OPEN_MA
25340 49 4e 5f 44 42 20 20 20 20 20 20 7c 7c 20 65 54  IN_DB      || eT
25350 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e  ype==SQLITE_OPEN
25360 5f 54 45 4d 50 5f 44 42 20 0a 20 20 20 20 20 20  _TEMP_DB .      
25370 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49 54   || eType==SQLIT
25380 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52  E_OPEN_MAIN_JOUR
25390 4e 41 4c 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51  NAL || eType==SQ
253a0 4c 49 54 45 5f 4f 50 45 4e 5f 54 45 4d 50 5f 4a  LITE_OPEN_TEMP_J
253b0 4f 55 52 4e 41 4c 20 0a 20 20 20 20 20 20 20 7c  OURNAL .       |
253c0 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f  | eType==SQLITE_
253d0 4f 50 45 4e 5f 53 55 42 4a 4f 55 52 4e 41 4c 20  OPEN_SUBJOURNAL 
253e0 20 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49    || eType==SQLI
253f0 54 45 5f 4f 50 45 4e 5f 4d 41 53 54 45 52 5f 4a  TE_OPEN_MASTER_J
25400 4f 55 52 4e 41 4c 20 0a 20 20 20 20 20 20 20 7c  OURNAL .       |
25410 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f  | eType==SQLITE_
25420 4f 50 45 4e 5f 54 52 41 4e 53 49 45 4e 54 5f 44  OPEN_TRANSIENT_D
25430 42 0a 20 20 29 3b 0a 0a 20 20 6d 65 6d 73 65 74  B.  );..  memset
25440 28 70 2c 20 30 2c 20 73 69 7a 65 6f 66 28 75 6e  (p, 0, sizeof(un
25450 69 78 46 69 6c 65 29 29 3b 0a 0a 20 20 69 66 28  ixFile));..  if(
25460 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f   eType==SQLITE_O
25470 50 45 4e 5f 4d 41 49 4e 5f 44 42 20 29 7b 0a 20  PEN_MAIN_DB ){. 
25480 20 20 20 55 6e 69 78 55 6e 75 73 65 64 46 64 20     UnixUnusedFd 
25490 2a 70 55 6e 75 73 65 64 3b 0a 20 20 20 20 70 55  *pUnused;.    pU
254a0 6e 75 73 65 64 20 3d 20 66 69 6e 64 52 65 75 73  nused = findReus
254b0 61 62 6c 65 46 64 28 7a 4e 61 6d 65 2c 20 66 6c  ableFd(zName, fl
254c0 61 67 73 29 3b 0a 20 20 20 20 69 66 28 20 70 55  ags);.    if( pU
254d0 6e 75 73 65 64 20 29 7b 0a 20 20 20 20 20 20 66  nused ){.      f
254e0 64 20 3d 20 70 55 6e 75 73 65 64 2d 3e 66 64 3b  d = pUnused->fd;
254f0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
25500 20 20 70 55 6e 75 73 65 64 20 3d 20 73 71 6c 69    pUnused = sqli
25510 74 65 33 5f 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f  te3_malloc(sizeo
25520 66 28 2a 70 55 6e 75 73 65 64 29 29 3b 0a 20 20  f(*pUnused));.  
25530 20 20 20 20 69 66 28 20 21 70 55 6e 75 73 65 64      if( !pUnused
25540 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75   ){.        retu
25550 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b  rn SQLITE_NOMEM;
25560 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
25570 20 20 20 70 2d 3e 70 55 6e 75 73 65 64 20 3d 20     p->pUnused = 
25580 70 55 6e 75 73 65 64 3b 0a 20 20 7d 65 6c 73 65  pUnused;.  }else
25590 20 69 66 28 20 21 7a 4e 61 6d 65 20 29 7b 0a 20   if( !zName ){. 
255a0 20 20 20 2f 2a 20 49 66 20 7a 4e 61 6d 65 20 69     /* If zName i
255b0 73 20 4e 55 4c 4c 2c 20 74 68 65 20 75 70 70 65  s NULL, the uppe
255c0 72 20 6c 61 79 65 72 20 69 73 20 72 65 71 75 65  r layer is reque
255d0 73 74 69 6e 67 20 61 20 74 65 6d 70 20 66 69 6c  sting a temp fil
255e0 65 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74  e. */.    assert
255f0 28 69 73 44 65 6c 65 74 65 20 26 26 20 21 69 73  (isDelete && !is
25600 4f 70 65 6e 44 69 72 65 63 74 6f 72 79 29 3b 0a  OpenDirectory);.
25610 20 20 20 20 72 63 20 3d 20 67 65 74 54 65 6d 70      rc = getTemp
25620 6e 61 6d 65 28 4d 41 58 5f 50 41 54 48 4e 41 4d  name(MAX_PATHNAM
25630 45 2b 31 2c 20 7a 54 6d 70 6e 61 6d 65 29 3b 0a  E+1, zTmpname);.
25640 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
25650 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72  TE_OK ){.      r
25660 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
25670 20 20 20 20 7a 4e 61 6d 65 20 3d 20 7a 54 6d 70      zName = zTmp
25680 6e 61 6d 65 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  name;.  }..  /* 
25690 44 65 74 65 72 6d 69 6e 65 20 74 68 65 20 76 61  Determine the va
256a0 6c 75 65 20 6f 66 20 74 68 65 20 66 6c 61 67 73  lue of the flags
256b0 20 70 61 72 61 6d 65 74 65 72 20 70 61 73 73 65   parameter passe
256c0 64 20 74 6f 20 50 4f 53 49 58 20 66 75 6e 63 74  d to POSIX funct
256d0 69 6f 6e 0a 20 20 2a 2a 20 6f 70 65 6e 28 29 2e  ion.  ** open().
256e0 20 54 68 65 73 65 20 6d 75 73 74 20 62 65 20 63   These must be c
256f0 61 6c 63 75 6c 61 74 65 64 20 65 76 65 6e 20 69  alculated even i
25700 66 20 6f 70 65 6e 28 29 20 69 73 20 6e 6f 74 20  f open() is not 
25710 63 61 6c 6c 65 64 2c 20 61 73 0a 20 20 2a 2a 20  called, as.  ** 
25720 74 68 65 79 20 6d 61 79 20 62 65 20 73 74 6f 72  they may be stor
25730 65 64 20 61 73 20 70 61 72 74 20 6f 66 20 74 68  ed as part of th
25740 65 20 66 69 6c 65 20 68 61 6e 64 6c 65 20 61 6e  e file handle an
25750 64 20 75 73 65 64 20 62 79 20 74 68 65 20 0a 20  d used by the . 
25760 20 2a 2a 20 27 63 6f 6e 63 68 20 66 69 6c 65 27   ** 'conch file'
25770 20 6c 6f 63 6b 69 6e 67 20 66 75 6e 63 74 69 6f   locking functio
25780 6e 73 20 6c 61 74 65 72 20 6f 6e 2e 20 20 2a 2f  ns later on.  */
25790 0a 20 20 69 66 28 20 69 73 52 65 61 64 6f 6e 6c  .  if( isReadonl
257a0 79 20 29 20 20 6f 70 65 6e 46 6c 61 67 73 20 7c  y )  openFlags |
257b0 3d 20 4f 5f 52 44 4f 4e 4c 59 3b 0a 20 20 69 66  = O_RDONLY;.  if
257c0 28 20 69 73 52 65 61 64 57 72 69 74 65 20 29 20  ( isReadWrite ) 
257d0 6f 70 65 6e 46 6c 61 67 73 20 7c 3d 20 4f 5f 52  openFlags |= O_R
257e0 44 57 52 3b 0a 20 20 69 66 28 20 69 73 43 72 65  DWR;.  if( isCre
257f0 61 74 65 20 29 20 20 20 20 6f 70 65 6e 46 6c 61  ate )    openFla
25800 67 73 20 7c 3d 20 4f 5f 43 52 45 41 54 3b 0a 20  gs |= O_CREAT;. 
25810 20 69 66 28 20 69 73 45 78 63 6c 75 73 69 76 65   if( isExclusive
25820 20 29 20 6f 70 65 6e 46 6c 61 67 73 20 7c 3d 20   ) openFlags |= 
25830 28 4f 5f 45 58 43 4c 7c 4f 5f 4e 4f 46 4f 4c 4c  (O_EXCL|O_NOFOLL
25840 4f 57 29 3b 0a 20 20 6f 70 65 6e 46 6c 61 67 73  OW);.  openFlags
25850 20 7c 3d 20 28 4f 5f 4c 41 52 47 45 46 49 4c 45   |= (O_LARGEFILE
25860 7c 4f 5f 42 49 4e 41 52 59 29 3b 0a 0a 20 20 69  |O_BINARY);..  i
25870 66 28 20 66 64 3c 30 20 29 7b 0a 20 20 20 20 6d  f( fd<0 ){.    m
25880 6f 64 65 5f 74 20 6f 70 65 6e 4d 6f 64 65 20 3d  ode_t openMode =
25890 20 28 69 73 44 65 6c 65 74 65 3f 30 36 30 30 3a   (isDelete?0600:
258a0 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 46  SQLITE_DEFAULT_F
258b0 49 4c 45 5f 50 45 52 4d 49 53 53 49 4f 4e 53 29  ILE_PERMISSIONS)
258c0 3b 0a 20 20 20 20 66 64 20 3d 20 6f 70 65 6e 28  ;.    fd = open(
258d0 7a 4e 61 6d 65 2c 20 6f 70 65 6e 46 6c 61 67 73  zName, openFlags
258e0 2c 20 6f 70 65 6e 4d 6f 64 65 29 3b 0a 20 20 20  , openMode);.   
258f0 20 4f 53 54 52 41 43 45 28 28 22 4f 50 45 4e 58   OSTRACE(("OPENX
25900 20 20 20 25 2d 33 64 20 25 73 20 30 25 6f 5c 6e     %-3d %s 0%o\n
25910 22 2c 20 66 64 2c 20 7a 4e 61 6d 65 2c 20 6f 70  ", fd, zName, op
25920 65 6e 46 6c 61 67 73 29 29 3b 0a 20 20 20 20 69  enFlags));.    i
25930 66 28 20 66 64 3c 30 20 26 26 20 65 72 72 6e 6f  f( fd<0 && errno
25940 21 3d 45 49 53 44 49 52 20 26 26 20 69 73 52 65  !=EISDIR && isRe
25950 61 64 57 72 69 74 65 20 26 26 20 21 69 73 45 78  adWrite && !isEx
25960 63 6c 75 73 69 76 65 20 29 7b 0a 20 20 20 20 20  clusive ){.     
25970 20 2f 2a 20 46 61 69 6c 65 64 20 74 6f 20 6f 70   /* Failed to op
25980 65 6e 20 74 68 65 20 66 69 6c 65 20 66 6f 72 20  en the file for 
25990 72 65 61 64 2f 77 72 69 74 65 20 61 63 63 65 73  read/write acces
259a0 73 2e 20 54 72 79 20 72 65 61 64 2d 6f 6e 6c 79  s. Try read-only
259b0 2e 20 2a 2f 0a 20 20 20 20 20 20 66 6c 61 67 73  . */.      flags
259c0 20 26 3d 20 7e 28 53 51 4c 49 54 45 5f 4f 50 45   &= ~(SQLITE_OPE
259d0 4e 5f 52 45 41 44 57 52 49 54 45 7c 53 51 4c 49  N_READWRITE|SQLI
259e0 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 29 3b  TE_OPEN_CREATE);
259f0 0a 20 20 20 20 20 20 6f 70 65 6e 46 6c 61 67 73  .      openFlags
25a00 20 26 3d 20 7e 28 4f 5f 52 44 57 52 7c 4f 5f 43   &= ~(O_RDWR|O_C
25a10 52 45 41 54 29 3b 0a 20 20 20 20 20 20 66 6c 61  REAT);.      fla
25a20 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f 4f 50 45  gs |= SQLITE_OPE
25a30 4e 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 20 20  N_READONLY;.    
25a40 20 20 6f 70 65 6e 46 6c 61 67 73 20 7c 3d 20 4f    openFlags |= O
25a50 5f 52 44 4f 4e 4c 59 3b 0a 20 20 20 20 20 20 66  _RDONLY;.      f
25a60 64 20 3d 20 6f 70 65 6e 28 7a 4e 61 6d 65 2c 20  d = open(zName, 
25a70 6f 70 65 6e 46 6c 61 67 73 2c 20 6f 70 65 6e 4d  openFlags, openM
25a80 6f 64 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ode);.    }.    
25a90 69 66 28 20 66 64 3c 30 20 29 7b 0a 20 20 20 20  if( fd<0 ){.    
25aa0 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 41    rc = SQLITE_CA
25ab0 4e 54 4f 50 45 4e 5f 42 4b 50 54 3b 0a 20 20 20  NTOPEN_BKPT;.   
25ac0 20 20 20 67 6f 74 6f 20 6f 70 65 6e 5f 66 69 6e     goto open_fin
25ad0 69 73 68 65 64 3b 0a 20 20 20 20 7d 0a 20 20 7d  ished;.    }.  }
25ae0 0a 20 20 61 73 73 65 72 74 28 20 66 64 3e 3d 30  .  assert( fd>=0
25af0 20 29 3b 0a 20 20 69 66 28 20 70 4f 75 74 46 6c   );.  if( pOutFl
25b00 61 67 73 20 29 7b 0a 20 20 20 20 2a 70 4f 75 74  ags ){.    *pOut
25b10 46 6c 61 67 73 20 3d 20 66 6c 61 67 73 3b 0a 20  Flags = flags;. 
25b20 20 7d 0a 0a 20 20 69 66 28 20 70 2d 3e 70 55 6e   }..  if( p->pUn
25b30 75 73 65 64 20 29 7b 0a 20 20 20 20 70 2d 3e 70  used ){.    p->p
25b40 55 6e 75 73 65 64 2d 3e 66 64 20 3d 20 66 64 3b  Unused->fd = fd;
25b50 0a 20 20 20 20 70 2d 3e 70 55 6e 75 73 65 64 2d  .    p->pUnused-
25b60 3e 66 6c 61 67 73 20 3d 20 66 6c 61 67 73 3b 0a  >flags = flags;.
25b70 20 20 7d 0a 0a 20 20 69 66 28 20 69 73 44 65 6c    }..  if( isDel
25b80 65 74 65 20 29 7b 0a 23 69 66 20 4f 53 5f 56 58  ete ){.#if OS_VX
25b90 57 4f 52 4b 53 0a 20 20 20 20 7a 50 61 74 68 20  WORKS.    zPath 
25ba0 3d 20 7a 4e 61 6d 65 3b 0a 23 65 6c 73 65 0a 20  = zName;.#else. 
25bb0 20 20 20 75 6e 6c 69 6e 6b 28 7a 4e 61 6d 65 29     unlink(zName)
25bc0 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 23 69 66  ;.#endif.  }.#if
25bd0 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c   SQLITE_ENABLE_L
25be0 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 20 20 65  OCKING_STYLE.  e
25bf0 6c 73 65 7b 0a 20 20 20 20 70 2d 3e 6f 70 65 6e  lse{.    p->open
25c00 46 6c 61 67 73 20 3d 20 6f 70 65 6e 46 6c 61 67  Flags = openFlag
25c10 73 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  s;.  }.#endif.. 
25c20 20 69 66 28 20 69 73 4f 70 65 6e 44 69 72 65 63   if( isOpenDirec
25c30 74 6f 72 79 20 29 7b 0a 20 20 20 20 72 63 20 3d  tory ){.    rc =
25c40 20 6f 70 65 6e 44 69 72 65 63 74 6f 72 79 28 7a   openDirectory(z
25c50 50 61 74 68 2c 20 26 64 69 72 66 64 29 3b 0a 20  Path, &dirfd);. 
25c60 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
25c70 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 2f 2a  E_OK ){.      /*
25c80 20 49 74 20 69 73 20 73 61 66 65 20 74 6f 20 63   It is safe to c
25c90 6c 6f 73 65 20 66 64 20 61 74 20 74 68 69 73 20  lose fd at this 
25ca0 70 6f 69 6e 74 2c 20 62 65 63 61 75 73 65 20 69  point, because i
25cb0 74 20 69 73 20 67 75 61 72 61 6e 74 65 65 64 20  t is guaranteed 
25cc0 6e 6f 74 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20  not.      ** to 
25cd0 62 65 20 6f 70 65 6e 20 6f 6e 20 61 20 64 61 74  be open on a dat
25ce0 61 62 61 73 65 20 66 69 6c 65 2e 20 49 66 20 69  abase file. If i
25cf0 74 20 77 65 72 65 20 6f 70 65 6e 20 6f 6e 20 61  t were open on a
25d00 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 0a   database file,.
25d10 20 20 20 20 20 20 2a 2a 20 69 74 20 77 6f 75 6c        ** it woul
25d20 64 20 6e 6f 74 20 62 65 20 73 61 66 65 20 74 6f  d not be safe to
25d30 20 63 6c 6f 73 65 20 61 73 20 74 68 69 73 20 77   close as this w
25d40 6f 75 6c 64 20 72 65 6c 65 61 73 65 20 61 6e 79  ould release any
25d50 20 6c 6f 63 6b 73 20 68 65 6c 64 0a 20 20 20 20   locks held.    
25d60 20 20 2a 2a 20 6f 6e 20 74 68 65 20 66 69 6c 65    ** on the file
25d70 20 62 79 20 74 68 69 73 20 70 72 6f 63 65 73 73   by this process
25d80 2e 20 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65  .  */.      asse
25d90 72 74 28 20 65 54 79 70 65 21 3d 53 51 4c 49 54  rt( eType!=SQLIT
25da0 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42 20 29  E_OPEN_MAIN_DB )
25db0 3b 0a 20 20 20 20 20 20 63 6c 6f 73 65 28 66 64  ;.      close(fd
25dc0 29 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  );             /
25dd0 2a 20 73 69 6c 65 6e 74 6c 79 20 6c 65 61 6b 20  * silently leak 
25de0 69 66 20 66 61 69 6c 2c 20 61 6c 72 65 61 64 79  if fail, already
25df0 20 69 6e 20 65 72 72 6f 72 20 2a 2f 0a 20 20 20   in error */.   
25e00 20 20 20 67 6f 74 6f 20 6f 70 65 6e 5f 66 69 6e     goto open_fin
25e10 69 73 68 65 64 3b 0a 20 20 20 20 7d 0a 20 20 7d  ished;.    }.  }
25e20 0a 0a 23 69 66 64 65 66 20 46 44 5f 43 4c 4f 45  ..#ifdef FD_CLOE
25e30 58 45 43 0a 20 20 66 63 6e 74 6c 28 66 64 2c 20  XEC.  fcntl(fd, 
25e40 46 5f 53 45 54 46 44 2c 20 66 63 6e 74 6c 28 66  F_SETFD, fcntl(f
25e50 64 2c 20 46 5f 47 45 54 46 44 2c 20 30 29 20 7c  d, F_GETFD, 0) |
25e60 20 46 44 5f 43 4c 4f 45 58 45 43 29 3b 0a 23 65   FD_CLOEXEC);.#e
25e70 6e 64 69 66 0a 0a 20 20 6e 6f 4c 6f 63 6b 20 3d  ndif..  noLock =
25e80 20 65 54 79 70 65 21 3d 53 51 4c 49 54 45 5f 4f   eType!=SQLITE_O
25e90 50 45 4e 5f 4d 41 49 4e 5f 44 42 3b 0a 0a 20 20  PEN_MAIN_DB;..  
25ea0 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 41  .#if defined(__A
25eb0 50 50 4c 45 5f 5f 29 20 7c 7c 20 53 51 4c 49 54  PPLE__) || SQLIT
25ec0 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47  E_ENABLE_LOCKING
25ed0 5f 53 54 59 4c 45 0a 20 20 73 74 72 75 63 74 20  _STYLE.  struct 
25ee0 73 74 61 74 66 73 20 66 73 49 6e 66 6f 3b 0a 20  statfs fsInfo;. 
25ef0 20 69 66 28 20 66 73 74 61 74 66 73 28 66 64 2c   if( fstatfs(fd,
25f00 20 26 66 73 49 6e 66 6f 29 20 3d 3d 20 2d 31 20   &fsInfo) == -1 
25f10 29 7b 0a 20 20 20 20 28 28 75 6e 69 78 46 69 6c  ){.    ((unixFil
25f20 65 2a 29 70 46 69 6c 65 29 2d 3e 6c 61 73 74 45  e*)pFile)->lastE
25f30 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20  rrno = errno;.  
25f40 20 20 69 66 28 20 64 69 72 66 64 3e 3d 30 20 29    if( dirfd>=0 )
25f50 20 63 6c 6f 73 65 28 64 69 72 66 64 29 3b 20 2f   close(dirfd); /
25f60 2a 20 73 69 6c 65 6e 74 6c 79 20 6c 65 61 6b 20  * silently leak 
25f70 69 66 20 66 61 69 6c 2c 20 69 6e 20 65 72 72 6f  if fail, in erro
25f80 72 20 2a 2f 0a 20 20 20 20 63 6c 6f 73 65 28 66  r */.    close(f
25f90 64 29 3b 20 2f 2a 20 73 69 6c 65 6e 74 6c 79 20  d); /* silently 
25fa0 6c 65 61 6b 20 69 66 20 66 61 69 6c 2c 20 69 6e  leak if fail, in
25fb0 20 65 72 72 6f 72 20 2a 2f 0a 20 20 20 20 72 65   error */.    re
25fc0 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52  turn SQLITE_IOER
25fd0 52 5f 41 43 43 45 53 53 3b 0a 20 20 7d 0a 20 20  R_ACCESS;.  }.  
25fe0 69 66 20 28 30 20 3d 3d 20 73 74 72 6e 63 6d 70  if (0 == strncmp
25ff0 28 22 6d 73 64 6f 73 22 2c 20 66 73 49 6e 66 6f  ("msdos", fsInfo
26000 2e 66 5f 66 73 74 79 70 65 6e 61 6d 65 2c 20 35  .f_fstypename, 5
26010 29 29 20 7b 0a 20 20 20 20 28 28 75 6e 69 78 46  )) {.    ((unixF
26020 69 6c 65 2a 29 70 46 69 6c 65 29 2d 3e 66 73 46  ile*)pFile)->fsF
26030 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f 46  lags |= SQLITE_F
26040 53 46 4c 41 47 53 5f 49 53 5f 4d 53 44 4f 53 3b  SFLAGS_IS_MSDOS;
26050 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 0a 23  .  }.#endif.  .#
26060 69 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  if SQLITE_ENABLE
26070 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 23  _LOCKING_STYLE.#
26080 69 66 20 53 51 4c 49 54 45 5f 50 52 45 46 45 52  if SQLITE_PREFER
26090 5f 50 52 4f 58 59 5f 4c 4f 43 4b 49 4e 47 0a 20  _PROXY_LOCKING. 
260a0 20 69 73 41 75 74 6f 50 72 6f 78 79 20 3d 20 31   isAutoProxy = 1
260b0 3b 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20 69  ;.#endif.  if( i
260c0 73 41 75 74 6f 50 72 6f 78 79 20 26 26 20 28 7a  sAutoProxy && (z
260d0 50 61 74 68 21 3d 4e 55 4c 4c 29 20 26 26 20 28  Path!=NULL) && (
260e0 21 6e 6f 4c 6f 63 6b 29 20 26 26 20 70 56 66 73  !noLock) && pVfs
260f0 2d 3e 78 4f 70 65 6e 20 29 7b 0a 20 20 20 20 63  ->xOpen ){.    c
26100 68 61 72 20 2a 65 6e 76 66 6f 72 63 65 20 3d 20  har *envforce = 
26110 67 65 74 65 6e 76 28 22 53 51 4c 49 54 45 5f 46  getenv("SQLITE_F
26120 4f 52 43 45 5f 50 52 4f 58 59 5f 4c 4f 43 4b 49  ORCE_PROXY_LOCKI
26130 4e 47 22 29 3b 0a 20 20 20 20 69 6e 74 20 75 73  NG");.    int us
26140 65 50 72 6f 78 79 20 3d 20 30 3b 0a 0a 20 20 20  eProxy = 0;..   
26150 20 2f 2a 20 53 51 4c 49 54 45 5f 46 4f 52 43 45   /* SQLITE_FORCE
26160 5f 50 52 4f 58 59 5f 4c 4f 43 4b 49 4e 47 3d 3d  _PROXY_LOCKING==
26170 31 20 6d 65 61 6e 73 20 66 6f 72 63 65 20 61 6c  1 means force al
26180 77 61 79 73 20 75 73 65 20 70 72 6f 78 79 2c 20  ways use proxy, 
26190 30 20 6d 65 61 6e 73 20 0a 20 20 20 20 2a 2a 20  0 means .    ** 
261a0 6e 65 76 65 72 20 75 73 65 20 70 72 6f 78 79 2c  never use proxy,
261b0 20 4e 55 4c 4c 20 6d 65 61 6e 73 20 75 73 65 20   NULL means use 
261c0 70 72 6f 78 79 20 66 6f 72 20 6e 6f 6e 2d 6c 6f  proxy for non-lo
261d0 63 61 6c 20 66 69 6c 65 73 20 6f 6e 6c 79 2e 20  cal files only. 
261e0 20 2a 2f 0a 20 20 20 20 69 66 28 20 65 6e 76 66   */.    if( envf
261f0 6f 72 63 65 21 3d 4e 55 4c 4c 20 29 7b 0a 20 20  orce!=NULL ){.  
26200 20 20 20 20 75 73 65 50 72 6f 78 79 20 3d 20 61      useProxy = a
26210 74 6f 69 28 65 6e 76 66 6f 72 63 65 29 3e 30 3b  toi(envforce)>0;
26220 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
26230 20 20 73 74 72 75 63 74 20 73 74 61 74 66 73 20    struct statfs 
26240 66 73 49 6e 66 6f 3b 0a 20 20 20 20 20 20 69 66  fsInfo;.      if
26250 28 20 73 74 61 74 66 73 28 7a 50 61 74 68 2c 20  ( statfs(zPath, 
26260 26 66 73 49 6e 66 6f 29 20 3d 3d 20 2d 31 20 29  &fsInfo) == -1 )
26270 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 20  {.        /* In 
26280 74 68 65 6f 72 79 2c 20 74 68 65 20 63 6c 6f 73  theory, the clos
26290 65 28 66 64 29 20 63 61 6c 6c 20 69 73 20 73 75  e(fd) call is su
262a0 62 2d 6f 70 74 69 6d 61 6c 2e 20 49 66 20 74 68  b-optimal. If th
262b0 65 20 66 69 6c 65 20 6f 70 65 6e 65 64 0a 20 20  e file opened.  
262c0 20 20 20 20 20 20 2a 2a 20 77 69 74 68 20 66 64        ** with fd
262d0 20 69 73 20 61 20 64 61 74 61 62 61 73 65 20 66   is a database f
262e0 69 6c 65 2c 20 61 6e 64 20 74 68 65 72 65 20 61  ile, and there a
262f0 72 65 20 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74  re other connect
26300 69 6f 6e 73 20 6f 70 65 6e 0a 20 20 20 20 20 20  ions open.      
26310 20 20 2a 2a 20 6f 6e 20 74 68 61 74 20 66 69 6c    ** on that fil
26320 65 20 74 68 61 74 20 61 72 65 20 63 75 72 72 65  e that are curre
26330 6e 74 6c 79 20 68 6f 6c 64 69 6e 67 20 61 64 76  ntly holding adv
26340 69 73 6f 72 79 20 6c 6f 63 6b 73 20 6f 6e 20 69  isory locks on i
26350 74 2c 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68  t,.        ** th
26360 65 6e 20 74 68 65 20 63 61 6c 6c 20 74 6f 20 63  en the call to c
26370 6c 6f 73 65 28 29 20 77 69 6c 6c 20 63 61 6e 63  lose() will canc
26380 65 6c 20 74 68 6f 73 65 20 6c 6f 63 6b 73 2e 20  el those locks. 
26390 49 6e 20 70 72 61 63 74 69 63 65 2c 0a 20 20 20  In practice,.   
263a0 20 20 20 20 20 2a 2a 20 77 65 27 72 65 20 61 73       ** we're as
263b0 73 75 6d 69 6e 67 20 74 68 61 74 20 73 74 61 74  suming that stat
263c0 66 73 28 29 20 64 6f 65 73 6e 27 74 20 66 61 69  fs() doesn't fai
263d0 6c 20 76 65 72 79 20 6f 66 74 65 6e 2e 20 41 74  l very often. At
263e0 20 6c 65 61 73 74 0a 20 20 20 20 20 20 20 20 2a   least.        *
263f0 2a 20 6e 6f 74 20 77 68 69 6c 65 20 6f 74 68 65  * not while othe
26400 72 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  r file descripto
26410 72 73 20 6f 70 65 6e 65 64 20 62 79 20 74 68 65  rs opened by the
26420 20 73 61 6d 65 20 70 72 6f 63 65 73 73 20 6f 6e   same process on
26430 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20  .        ** the 
26440 73 61 6d 65 20 66 69 6c 65 20 61 72 65 20 77 6f  same file are wo
26450 72 6b 69 6e 67 2e 20 20 2a 2f 0a 20 20 20 20 20  rking.  */.     
26460 20 20 20 70 2d 3e 6c 61 73 74 45 72 72 6e 6f 20     p->lastErrno 
26470 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20 20  = errno;.       
26480 20 69 66 28 20 64 69 72 66 64 3e 3d 30 20 29 7b   if( dirfd>=0 ){
26490 0a 20 20 20 20 20 20 20 20 20 20 63 6c 6f 73 65  .          close
264a0 28 64 69 72 66 64 29 3b 20 2f 2a 20 73 69 6c 65  (dirfd); /* sile
264b0 6e 74 6c 79 20 6c 65 61 6b 20 69 66 20 66 61 69  ntly leak if fai
264c0 6c 2c 20 69 6e 20 65 72 72 6f 72 20 2a 2f 0a 20  l, in error */. 
264d0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
264e0 20 63 6c 6f 73 65 28 66 64 29 3b 20 2f 2a 20 73   close(fd); /* s
264f0 69 6c 65 6e 74 6c 79 20 6c 65 61 6b 20 69 66 20  ilently leak if 
26500 66 61 69 6c 2c 20 69 6e 20 65 72 72 6f 72 20 2a  fail, in error *
26510 2f 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53  /.        rc = S
26520 51 4c 49 54 45 5f 49 4f 45 52 52 5f 41 43 43 45  QLITE_IOERR_ACCE
26530 53 53 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f  SS;.        goto
26540 20 6f 70 65 6e 5f 66 69 6e 69 73 68 65 64 3b 0a   open_finished;.
26550 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 75 73        }.      us
26560 65 50 72 6f 78 79 20 3d 20 21 28 66 73 49 6e 66  eProxy = !(fsInf
26570 6f 2e 66 5f 66 6c 61 67 73 26 4d 4e 54 5f 4c 4f  o.f_flags&MNT_LO
26580 43 41 4c 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  CAL);.    }.    
26590 69 66 28 20 75 73 65 50 72 6f 78 79 20 29 7b 0a  if( useProxy ){.
265a0 20 20 20 20 20 20 72 63 20 3d 20 66 69 6c 6c 49        rc = fillI
265b0 6e 55 6e 69 78 46 69 6c 65 28 70 56 66 73 2c 20  nUnixFile(pVfs, 
265c0 66 64 2c 20 64 69 72 66 64 2c 20 70 46 69 6c 65  fd, dirfd, pFile
265d0 2c 20 7a 50 61 74 68 2c 20 6e 6f 4c 6f 63 6b 2c  , zPath, noLock,
265e0 20 69 73 44 65 6c 65 74 65 29 3b 0a 20 20 20 20   isDelete);.    
265f0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
26600 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72  _OK ){.        r
26610 63 20 3d 20 70 72 6f 78 79 54 72 61 6e 73 66 6f  c = proxyTransfo
26620 72 6d 55 6e 69 78 46 69 6c 65 28 28 75 6e 69 78  rmUnixFile((unix
26630 46 69 6c 65 2a 29 70 46 69 6c 65 2c 20 22 3a 61  File*)pFile, ":a
26640 75 74 6f 3a 22 29 3b 0a 20 20 20 20 20 20 20 20  uto:");.        
26650 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
26660 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f  K ){.          /
26670 2a 20 55 73 65 20 75 6e 69 78 43 6c 6f 73 65 20  * Use unixClose 
26680 74 6f 20 63 6c 65 61 6e 20 75 70 20 74 68 65 20  to clean up the 
26690 72 65 73 6f 75 72 63 65 73 20 61 64 64 65 64 20  resources added 
266a0 69 6e 20 66 69 6c 6c 49 6e 55 6e 69 78 46 69 6c  in fillInUnixFil
266b0 65 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  e .          ** 
266c0 61 6e 64 20 63 6c 65 61 72 20 61 6c 6c 20 74 68  and clear all th
266d0 65 20 73 74 72 75 63 74 75 72 65 27 73 20 72 65  e structure's re
266e0 66 65 72 65 6e 63 65 73 2e 20 20 53 70 65 63 69  ferences.  Speci
266f0 66 69 63 61 6c 6c 79 2c 20 0a 20 20 20 20 20 20  fically, .      
26700 20 20 20 20 2a 2a 20 70 46 69 6c 65 2d 3e 70 4d      ** pFile->pM
26710 65 74 68 6f 64 73 20 77 69 6c 6c 20 62 65 20 4e  ethods will be N
26720 55 4c 4c 20 73 6f 20 73 71 6c 69 74 65 33 4f 73  ULL so sqlite3Os
26730 43 6c 6f 73 65 20 77 69 6c 6c 20 62 65 20 61 20  Close will be a 
26740 6e 6f 2d 6f 70 20 0a 20 20 20 20 20 20 20 20 20  no-op .         
26750 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 75 6e   */.          un
26760 69 78 43 6c 6f 73 65 28 70 46 69 6c 65 29 3b 0a  ixClose(pFile);.
26770 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
26780 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20   rc;.        }. 
26790 20 20 20 20 20 7d 0a 20 20 20 20 20 20 67 6f 74       }.      got
267a0 6f 20 6f 70 65 6e 5f 66 69 6e 69 73 68 65 64 3b  o open_finished;
267b0 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69  .    }.  }.#endi
267c0 66 0a 20 20 0a 20 20 72 63 20 3d 20 66 69 6c 6c  f.  .  rc = fill
267d0 49 6e 55 6e 69 78 46 69 6c 65 28 70 56 66 73 2c  InUnixFile(pVfs,
267e0 20 66 64 2c 20 64 69 72 66 64 2c 20 70 46 69 6c   fd, dirfd, pFil
267f0 65 2c 20 7a 50 61 74 68 2c 20 6e 6f 4c 6f 63 6b  e, zPath, noLock
26800 2c 20 69 73 44 65 6c 65 74 65 29 3b 0a 6f 70 65  , isDelete);.ope
26810 6e 5f 66 69 6e 69 73 68 65 64 3a 0a 20 20 69 66  n_finished:.  if
26820 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
26830 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  ){.    sqlite3_f
26840 72 65 65 28 70 2d 3e 70 55 6e 75 73 65 64 29 3b  ree(p->pUnused);
26850 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
26860 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65  ;.}.../*.** Dele
26870 74 65 20 74 68 65 20 66 69 6c 65 20 61 74 20 7a  te the file at z
26880 50 61 74 68 2e 20 49 66 20 74 68 65 20 64 69 72  Path. If the dir
26890 53 79 6e 63 20 61 72 67 75 6d 65 6e 74 20 69 73  Sync argument is
268a0 20 74 72 75 65 2c 20 66 73 79 6e 63 28 29 0a 2a   true, fsync().*
268b0 2a 20 74 68 65 20 64 69 72 65 63 74 6f 72 79 20  * the directory 
268c0 61 66 74 65 72 20 64 65 6c 65 74 69 6e 67 20 74  after deleting t
268d0 68 65 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74  he file..*/.stat
268e0 69 63 20 69 6e 74 20 75 6e 69 78 44 65 6c 65 74  ic int unixDelet
268f0 65 28 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73  e(.  sqlite3_vfs
26900 20 2a 4e 6f 74 55 73 65 64 2c 20 20 20 20 20 2f   *NotUsed,     /
26910 2a 20 56 46 53 20 63 6f 6e 74 61 69 6e 69 6e 67  * VFS containing
26920 20 74 68 69 73 20 61 73 20 74 68 65 20 78 44 65   this as the xDe
26930 6c 65 74 65 20 6d 65 74 68 6f 64 20 2a 2f 0a 20  lete method */. 
26940 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 61   const char *zPa
26950 74 68 2c 20 20 20 20 20 20 20 20 2f 2a 20 4e 61  th,        /* Na
26960 6d 65 20 6f 66 20 66 69 6c 65 20 74 6f 20 62 65  me of file to be
26970 20 64 65 6c 65 74 65 64 20 2a 2f 0a 20 20 69 6e   deleted */.  in
26980 74 20 64 69 72 53 79 6e 63 20 20 20 20 20 20 20  t dirSync       
26990 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74 72          /* If tr
269a0 75 65 2c 20 66 73 79 6e 63 28 29 20 64 69 72 65  ue, fsync() dire
269b0 63 74 6f 72 79 20 61 66 74 65 72 20 64 65 6c 65  ctory after dele
269c0 74 69 6e 67 20 66 69 6c 65 20 2a 2f 0a 29 7b 0a  ting file */.){.
269d0 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
269e0 45 5f 4f 4b 3b 0a 20 20 55 4e 55 53 45 44 5f 50  E_OK;.  UNUSED_P
269f0 41 52 41 4d 45 54 45 52 28 4e 6f 74 55 73 65 64  ARAMETER(NotUsed
26a00 29 3b 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45  );.  SimulateIOE
26a10 72 72 6f 72 28 72 65 74 75 72 6e 20 53 51 4c 49  rror(return SQLI
26a20 54 45 5f 49 4f 45 52 52 5f 44 45 4c 45 54 45 29  TE_IOERR_DELETE)
26a30 3b 0a 20 20 75 6e 6c 69 6e 6b 28 7a 50 61 74 68  ;.  unlink(zPath
26a40 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  );.#ifndef SQLIT
26a50 45 5f 44 49 53 41 42 4c 45 5f 44 49 52 53 59 4e  E_DISABLE_DIRSYN
26a60 43 0a 20 20 69 66 28 20 64 69 72 53 79 6e 63 20  C.  if( dirSync 
26a70 29 7b 0a 20 20 20 20 69 6e 74 20 66 64 3b 0a 20  ){.    int fd;. 
26a80 20 20 20 72 63 20 3d 20 6f 70 65 6e 44 69 72 65     rc = openDire
26a90 63 74 6f 72 79 28 7a 50 61 74 68 2c 20 26 66 64  ctory(zPath, &fd
26aa0 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  );.    if( rc==S
26ab0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 23 69 66 20  QLITE_OK ){.#if 
26ac0 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20 20 20 20  OS_VXWORKS.     
26ad0 20 69 66 28 20 66 73 79 6e 63 28 66 64 29 3d 3d   if( fsync(fd)==
26ae0 2d 31 20 29 0a 23 65 6c 73 65 0a 20 20 20 20 20  -1 ).#else.     
26af0 20 69 66 28 20 66 73 79 6e 63 28 66 64 29 20 29   if( fsync(fd) )
26b00 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 7b 0a  .#endif.      {.
26b10 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
26b20 49 54 45 5f 49 4f 45 52 52 5f 44 49 52 5f 46 53  ITE_IOERR_DIR_FS
26b30 59 4e 43 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  YNC;.      }.   
26b40 20 20 20 69 66 28 20 63 6c 6f 73 65 28 66 64 29     if( close(fd)
26b50 26 26 21 72 63 20 29 7b 0a 20 20 20 20 20 20 20  &&!rc ){.       
26b60 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45   rc = SQLITE_IOE
26b70 52 52 5f 44 49 52 5f 43 4c 4f 53 45 3b 0a 20 20  RR_DIR_CLOSE;.  
26b80 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
26b90 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20  #endif.  return 
26ba0 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 65 73  rc;.}../*.** Tes
26bb0 74 20 74 68 65 20 65 78 69 73 74 61 6e 63 65 20  t the existance 
26bc0 6f 66 20 6f 72 20 61 63 63 65 73 73 20 70 65 72  of or access per
26bd0 6d 69 73 73 69 6f 6e 73 20 6f 66 20 66 69 6c 65  missions of file
26be0 20 7a 50 61 74 68 2e 20 54 68 65 0a 2a 2a 20 74   zPath. The.** t
26bf0 65 73 74 20 70 65 72 66 6f 72 6d 65 64 20 64 65  est performed de
26c00 70 65 6e 64 73 20 6f 6e 20 74 68 65 20 76 61 6c  pends on the val
26c10 75 65 20 6f 66 20 66 6c 61 67 73 3a 0a 2a 2a 0a  ue of flags:.**.
26c20 2a 2a 20 20 20 20 20 53 51 4c 49 54 45 5f 41 43  **     SQLITE_AC
26c30 43 45 53 53 5f 45 58 49 53 54 53 3a 20 52 65 74  CESS_EXISTS: Ret
26c40 75 72 6e 20 31 20 69 66 20 74 68 65 20 66 69 6c  urn 1 if the fil
26c50 65 20 65 78 69 73 74 73 0a 2a 2a 20 20 20 20 20  e exists.**     
26c60 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 52 45  SQLITE_ACCESS_RE
26c70 41 44 57 52 49 54 45 3a 20 52 65 74 75 72 6e 20  ADWRITE: Return 
26c80 31 20 69 66 20 74 68 65 20 66 69 6c 65 20 69 73  1 if the file is
26c90 20 72 65 61 64 20 61 6e 64 20 77 72 69 74 61 62   read and writab
26ca0 6c 65 2e 0a 2a 2a 20 20 20 20 20 53 51 4c 49 54  le..**     SQLIT
26cb0 45 5f 41 43 43 45 53 53 5f 52 45 41 44 4f 4e 4c  E_ACCESS_READONL
26cc0 59 3a 20 52 65 74 75 72 6e 20 31 20 69 66 20 74  Y: Return 1 if t
26cd0 68 65 20 66 69 6c 65 20 69 73 20 72 65 61 64 61  he file is reada
26ce0 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72  ble..**.** Other
26cf0 77 69 73 65 20 72 65 74 75 72 6e 20 30 2e 0a 2a  wise return 0..*
26d00 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69  /.static int uni
26d10 78 41 63 63 65 73 73 28 0a 20 20 73 71 6c 69 74  xAccess(.  sqlit
26d20 65 33 5f 76 66 73 20 2a 4e 6f 74 55 73 65 64 2c  e3_vfs *NotUsed,
26d30 20 20 20 2f 2a 20 54 68 65 20 56 46 53 20 63 6f     /* The VFS co
26d40 6e 74 61 69 6e 69 6e 67 20 74 68 69 73 20 78 41  ntaining this xA
26d50 63 63 65 73 73 20 6d 65 74 68 6f 64 20 2a 2f 0a  ccess method */.
26d60 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50    const char *zP
26d70 61 74 68 2c 20 20 20 20 20 20 2f 2a 20 50 61 74  ath,      /* Pat
26d80 68 20 6f 66 20 74 68 65 20 66 69 6c 65 20 74 6f  h of the file to
26d90 20 65 78 61 6d 69 6e 65 20 2a 2f 0a 20 20 69 6e   examine */.  in
26da0 74 20 66 6c 61 67 73 2c 20 20 20 20 20 20 20 20  t flags,        
26db0 20 20 20 20 20 20 2f 2a 20 57 68 61 74 20 64 6f        /* What do
26dc0 20 77 65 20 77 61 6e 74 20 74 6f 20 6c 65 61 72   we want to lear
26dd0 6e 20 61 62 6f 75 74 20 74 68 65 20 7a 50 61 74  n about the zPat
26de0 68 20 66 69 6c 65 3f 20 2a 2f 0a 20 20 69 6e 74  h file? */.  int
26df0 20 2a 70 52 65 73 4f 75 74 20 20 20 20 20 20 20   *pResOut       
26e00 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 72 65       /* Write re
26e10 73 75 6c 74 20 62 6f 6f 6c 65 61 6e 20 68 65 72  sult boolean her
26e20 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 61 6d  e */.){.  int am
26e30 6f 64 65 20 3d 20 30 3b 0a 20 20 55 4e 55 53 45  ode = 0;.  UNUSE
26e40 44 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f 74 55  D_PARAMETER(NotU
26e50 73 65 64 29 3b 0a 20 20 53 69 6d 75 6c 61 74 65  sed);.  Simulate
26e60 49 4f 45 72 72 6f 72 28 20 72 65 74 75 72 6e 20  IOError( return 
26e70 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 41 43 43  SQLITE_IOERR_ACC
26e80 45 53 53 3b 20 29 3b 0a 20 20 73 77 69 74 63 68  ESS; );.  switch
26e90 28 20 66 6c 61 67 73 20 29 7b 0a 20 20 20 20 63  ( flags ){.    c
26ea0 61 73 65 20 53 51 4c 49 54 45 5f 41 43 43 45 53  ase SQLITE_ACCES
26eb0 53 5f 45 58 49 53 54 53 3a 0a 20 20 20 20 20 20  S_EXISTS:.      
26ec0 61 6d 6f 64 65 20 3d 20 46 5f 4f 4b 3b 0a 20 20  amode = F_OK;.  
26ed0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63      break;.    c
26ee0 61 73 65 20 53 51 4c 49 54 45 5f 41 43 43 45 53  ase SQLITE_ACCES
26ef0 53 5f 52 45 41 44 57 52 49 54 45 3a 0a 20 20 20  S_READWRITE:.   
26f00 20 20 20 61 6d 6f 64 65 20 3d 20 57 5f 4f 4b 7c     amode = W_OK|
26f10 52 5f 4f 4b 3b 0a 20 20 20 20 20 20 62 72 65 61  R_OK;.      brea
26f20 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  k;.    case SQLI
26f30 54 45 5f 41 43 43 45 53 53 5f 52 45 41 44 3a 0a  TE_ACCESS_READ:.
26f40 20 20 20 20 20 20 61 6d 6f 64 65 20 3d 20 52 5f        amode = R_
26f50 4f 4b 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  OK;.      break;
26f60 0a 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 0a 20  ..    default:. 
26f70 20 20 20 20 20 61 73 73 65 72 74 28 21 22 49 6e       assert(!"In
26f80 76 61 6c 69 64 20 66 6c 61 67 73 20 61 72 67 75  valid flags argu
26f90 6d 65 6e 74 22 29 3b 0a 20 20 7d 0a 20 20 2a 70  ment");.  }.  *p
26fa0 52 65 73 4f 75 74 20 3d 20 28 61 63 63 65 73 73  ResOut = (access
26fb0 28 7a 50 61 74 68 2c 20 61 6d 6f 64 65 29 3d 3d  (zPath, amode)==
26fc0 30 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  0);.  return SQL
26fd0 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  ITE_OK;.}.../*.*
26fe0 2a 20 54 75 72 6e 20 61 20 72 65 6c 61 74 69 76  * Turn a relativ
26ff0 65 20 70 61 74 68 6e 61 6d 65 20 69 6e 74 6f 20  e pathname into 
27000 61 20 66 75 6c 6c 20 70 61 74 68 6e 61 6d 65 2e  a full pathname.
27010 20 54 68 65 20 72 65 6c 61 74 69 76 65 20 70 61   The relative pa
27020 74 68 0a 2a 2a 20 69 73 20 73 74 6f 72 65 64 20  th.** is stored 
27030 61 73 20 61 20 6e 75 6c 2d 74 65 72 6d 69 6e 61  as a nul-termina
27040 74 65 64 20 73 74 72 69 6e 67 20 69 6e 20 74 68  ted string in th
27050 65 20 62 75 66 66 65 72 20 70 6f 69 6e 74 65 64  e buffer pointed
27060 20 74 6f 20 62 79 0a 2a 2a 20 7a 50 61 74 68 2e   to by.** zPath.
27070 20 0a 2a 2a 0a 2a 2a 20 7a 4f 75 74 20 70 6f 69   .**.** zOut poi
27080 6e 74 73 20 74 6f 20 61 20 62 75 66 66 65 72 20  nts to a buffer 
27090 6f 66 20 61 74 20 6c 65 61 73 74 20 73 71 6c 69  of at least sqli
270a0 74 65 33 5f 76 66 73 2e 6d 78 50 61 74 68 6e 61  te3_vfs.mxPathna
270b0 6d 65 20 62 79 74 65 73 20 0a 2a 2a 20 28 69 6e  me bytes .** (in
270c0 20 74 68 69 73 20 63 61 73 65 2c 20 4d 41 58 5f   this case, MAX_
270d0 50 41 54 48 4e 41 4d 45 20 62 79 74 65 73 29 2e  PATHNAME bytes).
270e0 20 54 68 65 20 66 75 6c 6c 2d 70 61 74 68 20 69   The full-path i
270f0 73 20 77 72 69 74 74 65 6e 20 74 6f 0a 2a 2a 20  s written to.** 
27100 74 68 69 73 20 62 75 66 66 65 72 20 62 65 66 6f  this buffer befo
27110 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2f  re returning..*/
27120 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78  .static int unix
27130 46 75 6c 6c 50 61 74 68 6e 61 6d 65 28 0a 20 20  FullPathname(.  
27140 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66  sqlite3_vfs *pVf
27150 73 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  s,            /*
27160 20 50 6f 69 6e 74 65 72 20 74 6f 20 76 66 73 20   Pointer to vfs 
27170 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 63 6f 6e 73  object */.  cons
27180 74 20 63 68 61 72 20 2a 7a 50 61 74 68 2c 20 20  t char *zPath,  
27190 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 73            /* Pos
271a0 73 69 62 6c 79 20 72 65 6c 61 74 69 76 65 20 69  sibly relative i
271b0 6e 70 75 74 20 70 61 74 68 20 2a 2f 0a 20 20 69  nput path */.  i
271c0 6e 74 20 6e 4f 75 74 2c 20 20 20 20 20 20 20 20  nt nOut,        
271d0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
271e0 53 69 7a 65 20 6f 66 20 6f 75 74 70 75 74 20 62  Size of output b
271f0 75 66 66 65 72 20 69 6e 20 62 79 74 65 73 20 2a  uffer in bytes *
27200 2f 0a 20 20 63 68 61 72 20 2a 7a 4f 75 74 20 20  /.  char *zOut  
27210 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27220 20 20 2f 2a 20 4f 75 74 70 75 74 20 62 75 66 66    /* Output buff
27230 65 72 20 2a 2f 0a 29 7b 0a 0a 20 20 2f 2a 20 49  er */.){..  /* I
27240 74 27 73 20 6f 64 64 20 74 6f 20 73 69 6d 75 6c  t's odd to simul
27250 61 74 65 20 61 6e 20 69 6f 2d 65 72 72 6f 72 20  ate an io-error 
27260 68 65 72 65 2c 20 62 75 74 20 72 65 61 6c 6c 79  here, but really
27270 20 74 68 69 73 20 69 73 20 6a 75 73 74 0a 20 20   this is just.  
27280 2a 2a 20 75 73 69 6e 67 20 74 68 65 20 69 6f 2d  ** using the io-
27290 65 72 72 6f 72 20 69 6e 66 72 61 73 74 72 75 63  error infrastruc
272a0 74 75 72 65 20 74 6f 20 74 65 73 74 20 74 68 61  ture to test tha
272b0 74 20 53 51 4c 69 74 65 20 68 61 6e 64 6c 65 73  t SQLite handles
272c0 20 74 68 69 73 0a 20 20 2a 2a 20 66 75 6e 63 74   this.  ** funct
272d0 69 6f 6e 20 66 61 69 6c 69 6e 67 2e 20 54 68 69  ion failing. Thi
272e0 73 20 66 75 6e 63 74 69 6f 6e 20 63 6f 75 6c 64  s function could
272f0 20 66 61 69 6c 20 69 66 2c 20 66 6f 72 20 65 78   fail if, for ex
27300 61 6d 70 6c 65 2c 20 74 68 65 0a 20 20 2a 2a 20  ample, the.  ** 
27310 63 75 72 72 65 6e 74 20 77 6f 72 6b 69 6e 67 20  current working 
27320 64 69 72 65 63 74 6f 72 79 20 68 61 73 20 62 65  directory has be
27330 65 6e 20 75 6e 6c 69 6e 6b 65 64 2e 0a 20 20 2a  en unlinked..  *
27340 2f 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72  /.  SimulateIOEr
27350 72 6f 72 28 20 72 65 74 75 72 6e 20 53 51 4c 49  ror( return SQLI
27360 54 45 5f 45 52 52 4f 52 20 29 3b 0a 0a 20 20 61  TE_ERROR );..  a
27370 73 73 65 72 74 28 20 70 56 66 73 2d 3e 6d 78 50  ssert( pVfs->mxP
27380 61 74 68 6e 61 6d 65 3d 3d 4d 41 58 5f 50 41 54  athname==MAX_PAT
27390 48 4e 41 4d 45 20 29 3b 0a 20 20 55 4e 55 53 45  HNAME );.  UNUSE
273a0 44 5f 50 41 52 41 4d 45 54 45 52 28 70 56 66 73  D_PARAMETER(pVfs
273b0 29 3b 0a 0a 20 20 7a 4f 75 74 5b 6e 4f 75 74 2d  );..  zOut[nOut-
273c0 31 5d 20 3d 20 27 5c 30 27 3b 0a 20 20 69 66 28  1] = '\0';.  if(
273d0 20 7a 50 61 74 68 5b 30 5d 3d 3d 27 2f 27 20 29   zPath[0]=='/' )
273e0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e  {.    sqlite3_sn
273f0 70 72 69 6e 74 66 28 6e 4f 75 74 2c 20 7a 4f 75  printf(nOut, zOu
27400 74 2c 20 22 25 73 22 2c 20 7a 50 61 74 68 29 3b  t, "%s", zPath);
27410 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e  .  }else{.    in
27420 74 20 6e 43 77 64 3b 0a 20 20 20 20 69 66 28 20  t nCwd;.    if( 
27430 67 65 74 63 77 64 28 7a 4f 75 74 2c 20 6e 4f 75  getcwd(zOut, nOu
27440 74 2d 31 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  t-1)==0 ){.     
27450 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
27460 41 4e 54 4f 50 45 4e 5f 42 4b 50 54 3b 0a 20 20  ANTOPEN_BKPT;.  
27470 20 20 7d 0a 20 20 20 20 6e 43 77 64 20 3d 20 28    }.    nCwd = (
27480 69 6e 74 29 73 74 72 6c 65 6e 28 7a 4f 75 74 29  int)strlen(zOut)
27490 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e  ;.    sqlite3_sn
274a0 70 72 69 6e 74 66 28 6e 4f 75 74 2d 6e 43 77 64  printf(nOut-nCwd
274b0 2c 20 26 7a 4f 75 74 5b 6e 43 77 64 5d 2c 20 22  , &zOut[nCwd], "
274c0 2f 25 73 22 2c 20 7a 50 61 74 68 29 3b 0a 20 20  /%s", zPath);.  
274d0 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  }.  return SQLIT
274e0 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 23 69 66 6e 64 65  E_OK;.}...#ifnde
274f0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c 4f  f SQLITE_OMIT_LO
27500 41 44 5f 45 58 54 45 4e 53 49 4f 4e 0a 2f 2a 0a  AD_EXTENSION./*.
27510 2a 2a 20 49 6e 74 65 72 66 61 63 65 73 20 66 6f  ** Interfaces fo
27520 72 20 6f 70 65 6e 69 6e 67 20 61 20 73 68 61 72  r opening a shar
27530 65 64 20 6c 69 62 72 61 72 79 2c 20 66 69 6e 64  ed library, find
27540 69 6e 67 20 65 6e 74 72 79 20 70 6f 69 6e 74 73  ing entry points
27550 0a 2a 2a 20 77 69 74 68 69 6e 20 74 68 65 20 73  .** within the s
27560 68 61 72 65 64 20 6c 69 62 72 61 72 79 2c 20 61  hared library, a
27570 6e 64 20 63 6c 6f 73 69 6e 67 20 74 68 65 20 73  nd closing the s
27580 68 61 72 65 64 20 6c 69 62 72 61 72 79 2e 0a 2a  hared library..*
27590 2f 0a 23 69 6e 63 6c 75 64 65 20 3c 64 6c 66 63  /.#include <dlfc
275a0 6e 2e 68 3e 0a 73 74 61 74 69 63 20 76 6f 69 64  n.h>.static void
275b0 20 2a 75 6e 69 78 44 6c 4f 70 65 6e 28 73 71 6c   *unixDlOpen(sql
275c0 69 74 65 33 5f 76 66 73 20 2a 4e 6f 74 55 73 65  ite3_vfs *NotUse
275d0 64 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  d, const char *z
275e0 46 69 6c 65 6e 61 6d 65 29 7b 0a 20 20 55 4e 55  Filename){.  UNU
275f0 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f  SED_PARAMETER(No
27600 74 55 73 65 64 29 3b 0a 20 20 72 65 74 75 72 6e  tUsed);.  return
27610 20 64 6c 6f 70 65 6e 28 7a 46 69 6c 65 6e 61 6d   dlopen(zFilenam
27620 65 2c 20 52 54 4c 44 5f 4e 4f 57 20 7c 20 52 54  e, RTLD_NOW | RT
27630 4c 44 5f 47 4c 4f 42 41 4c 29 3b 0a 7d 0a 0a 2f  LD_GLOBAL);.}../
27640 2a 0a 2a 2a 20 53 51 4c 69 74 65 20 63 61 6c 6c  *.** SQLite call
27650 73 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  s this function 
27660 69 6d 6d 65 64 69 61 74 65 6c 79 20 61 66 74 65  immediately afte
27670 72 20 61 20 63 61 6c 6c 20 74 6f 20 75 6e 69 78  r a call to unix
27680 44 6c 53 79 6d 28 29 20 6f 72 0a 2a 2a 20 75 6e  DlSym() or.** un
27690 69 78 44 6c 4f 70 65 6e 28 29 20 66 61 69 6c 73  ixDlOpen() fails
276a0 20 28 72 65 74 75 72 6e 73 20 61 20 6e 75 6c 6c   (returns a null
276b0 20 70 6f 69 6e 74 65 72 29 2e 20 49 66 20 61 20   pointer). If a 
276c0 6d 6f 72 65 20 64 65 74 61 69 6c 65 64 20 65 72  more detailed er
276d0 72 6f 72 0a 2a 2a 20 6d 65 73 73 61 67 65 20 69  ror.** message i
276e0 73 20 61 76 61 69 6c 61 62 6c 65 2c 20 69 74 20  s available, it 
276f0 69 73 20 77 72 69 74 74 65 6e 20 74 6f 20 7a 42  is written to zB
27700 75 66 4f 75 74 2e 20 49 66 20 6e 6f 20 65 72 72  ufOut. If no err
27710 6f 72 20 6d 65 73 73 61 67 65 0a 2a 2a 20 69 73  or message.** is
27720 20 61 76 61 69 6c 61 62 6c 65 2c 20 7a 42 75 66   available, zBuf
27730 4f 75 74 20 69 73 20 6c 65 66 74 20 75 6e 6d 6f  Out is left unmo
27740 64 69 66 69 65 64 20 61 6e 64 20 53 51 4c 69 74  dified and SQLit
27750 65 20 75 73 65 73 20 61 20 64 65 66 61 75 6c 74  e uses a default
27760 0a 2a 2a 20 65 72 72 6f 72 20 6d 65 73 73 61 67  .** error messag
27770 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  e..*/.static voi
27780 64 20 75 6e 69 78 44 6c 45 72 72 6f 72 28 73 71  d unixDlError(sq
27790 6c 69 74 65 33 5f 76 66 73 20 2a 4e 6f 74 55 73  lite3_vfs *NotUs
277a0 65 64 2c 20 69 6e 74 20 6e 42 75 66 2c 20 63 68  ed, int nBuf, ch
277b0 61 72 20 2a 7a 42 75 66 4f 75 74 29 7b 0a 20 20  ar *zBufOut){.  
277c0 63 68 61 72 20 2a 7a 45 72 72 3b 0a 20 20 55 4e  char *zErr;.  UN
277d0 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 4e  USED_PARAMETER(N
277e0 6f 74 55 73 65 64 29 3b 0a 20 20 75 6e 69 78 45  otUsed);.  unixE
277f0 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 20 20 7a  nterMutex();.  z
27800 45 72 72 20 3d 20 64 6c 65 72 72 6f 72 28 29 3b  Err = dlerror();
27810 0a 20 20 69 66 28 20 7a 45 72 72 20 29 7b 0a 20  .  if( zErr ){. 
27820 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
27830 6e 74 66 28 6e 42 75 66 2c 20 7a 42 75 66 4f 75  ntf(nBuf, zBufOu
27840 74 2c 20 22 25 73 22 2c 20 7a 45 72 72 29 3b 0a  t, "%s", zErr);.
27850 20 20 7d 0a 20 20 75 6e 69 78 4c 65 61 76 65 4d    }.  unixLeaveM
27860 75 74 65 78 28 29 3b 0a 7d 0a 73 74 61 74 69 63  utex();.}.static
27870 20 76 6f 69 64 20 28 2a 75 6e 69 78 44 6c 53 79   void (*unixDlSy
27880 6d 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 4e  m(sqlite3_vfs *N
27890 6f 74 55 73 65 64 2c 20 76 6f 69 64 20 2a 70 2c  otUsed, void *p,
278a0 20 63 6f 6e 73 74 20 63 68 61 72 2a 7a 53 79 6d   const char*zSym
278b0 29 29 28 76 6f 69 64 29 7b 0a 20 20 2f 2a 20 0a  ))(void){.  /* .
278c0 20 20 2a 2a 20 47 43 43 20 77 69 74 68 20 2d 70    ** GCC with -p
278d0 65 64 61 6e 74 69 63 2d 65 72 72 6f 72 73 20 73  edantic-errors s
278e0 61 79 73 20 74 68 61 74 20 43 39 30 20 64 6f 65  ays that C90 doe
278f0 73 20 6e 6f 74 20 61 6c 6c 6f 77 20 61 20 76 6f  s not allow a vo
27900 69 64 2a 20 74 6f 20 62 65 0a 20 20 2a 2a 20 63  id* to be.  ** c
27910 61 73 74 20 69 6e 74 6f 20 61 20 70 6f 69 6e 74  ast into a point
27920 65 72 20 74 6f 20 61 20 66 75 6e 63 74 69 6f 6e  er to a function
27930 2e 20 20 41 6e 64 20 79 65 74 20 74 68 65 20 6c  .  And yet the l
27940 69 62 72 61 72 79 20 64 6c 73 79 6d 28 29 20 72  ibrary dlsym() r
27950 6f 75 74 69 6e 65 0a 20 20 2a 2a 20 72 65 74 75  outine.  ** retu
27960 72 6e 73 20 61 20 76 6f 69 64 2a 20 77 68 69 63  rns a void* whic
27970 68 20 69 73 20 72 65 61 6c 6c 79 20 61 20 70 6f  h is really a po
27980 69 6e 74 65 72 20 74 6f 20 61 20 66 75 6e 63 74  inter to a funct
27990 69 6f 6e 2e 20 20 53 6f 20 68 6f 77 20 64 6f 20  ion.  So how do 
279a0 77 65 0a 20 20 2a 2a 20 75 73 65 20 64 6c 73 79  we.  ** use dlsy
279b0 6d 28 29 20 77 69 74 68 20 2d 70 65 64 61 6e 74  m() with -pedant
279c0 69 63 2d 65 72 72 6f 72 73 3f 0a 20 20 2a 2a 0a  ic-errors?.  **.
279d0 20 20 2a 2a 20 56 61 72 69 61 62 6c 65 20 78 20    ** Variable x 
279e0 62 65 6c 6f 77 20 69 73 20 64 65 66 69 6e 65 64  below is defined
279f0 20 74 6f 20 62 65 20 61 20 70 6f 69 6e 74 65 72   to be a pointer
27a00 20 74 6f 20 61 20 66 75 6e 63 74 69 6f 6e 20 74   to a function t
27a10 61 6b 69 6e 67 0a 20 20 2a 2a 20 70 61 72 61 6d  aking.  ** param
27a20 65 74 65 72 73 20 76 6f 69 64 2a 20 61 6e 64 20  eters void* and 
27a30 63 6f 6e 73 74 20 63 68 61 72 2a 20 61 6e 64 20  const char* and 
27a40 72 65 74 75 72 6e 69 6e 67 20 61 20 70 6f 69 6e  returning a poin
27a50 74 65 72 20 74 6f 20 61 20 66 75 6e 63 74 69 6f  ter to a functio
27a60 6e 2e 0a 20 20 2a 2a 20 57 65 20 69 6e 69 74 69  n..  ** We initi
27a70 61 6c 69 7a 65 20 78 20 62 79 20 61 73 73 69 67  alize x by assig
27a80 6e 69 6e 67 20 69 74 20 61 20 70 6f 69 6e 74 65  ning it a pointe
27a90 72 20 74 6f 20 74 68 65 20 64 6c 73 79 6d 28 29  r to the dlsym()
27aa0 20 66 75 6e 63 74 69 6f 6e 2e 0a 20 20 2a 2a 20   function..  ** 
27ab0 28 54 68 61 74 20 61 73 73 69 67 6e 6d 65 6e 74  (That assignment
27ac0 20 72 65 71 75 69 72 65 73 20 61 20 63 61 73 74   requires a cast
27ad0 2e 29 20 20 54 68 65 6e 20 77 65 20 63 61 6c 6c  .)  Then we call
27ae0 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 74 68   the function th
27af0 61 74 0a 20 20 2a 2a 20 78 20 70 6f 69 6e 74 73  at.  ** x points
27b00 20 74 6f 2e 20 20 0a 20 20 2a 2a 0a 20 20 2a 2a   to.  .  **.  **
27b10 20 54 68 69 73 20 77 6f 72 6b 2d 61 72 6f 75 6e   This work-aroun
27b20 64 20 69 73 20 75 6e 6c 69 6b 65 6c 79 20 74 6f  d is unlikely to
27b30 20 77 6f 72 6b 20 63 6f 72 72 65 63 74 6c 79 20   work correctly 
27b40 6f 6e 20 61 6e 79 20 73 79 73 74 65 6d 20 77 68  on any system wh
27b50 65 72 65 0a 20 20 2a 2a 20 79 6f 75 20 72 65 61  ere.  ** you rea
27b60 6c 6c 79 20 63 61 6e 6e 6f 74 20 63 61 73 74 20  lly cannot cast 
27b70 61 20 66 75 6e 63 74 69 6f 6e 20 70 6f 69 6e 74  a function point
27b80 65 72 20 69 6e 74 6f 20 76 6f 69 64 2a 2e 20 20  er into void*.  
27b90 42 75 74 20 74 68 65 6e 2c 20 6f 6e 20 74 68 65  But then, on the
27ba0 0a 20 20 2a 2a 20 6f 74 68 65 72 20 68 61 6e 64  .  ** other hand
27bb0 2c 20 64 6c 73 79 6d 28 29 20 77 69 6c 6c 20 6e  , dlsym() will n
27bc0 6f 74 20 77 6f 72 6b 20 6f 6e 20 73 75 63 68 20  ot work on such 
27bd0 61 20 73 79 73 74 65 6d 20 65 69 74 68 65 72 2c  a system either,
27be0 20 73 6f 20 77 65 20 68 61 76 65 0a 20 20 2a 2a   so we have.  **
27bf0 20 6e 6f 74 20 72 65 61 6c 6c 79 20 6c 6f 73 74   not really lost
27c00 20 61 6e 79 74 68 69 6e 67 2e 0a 20 20 2a 2f 0a   anything..  */.
27c10 20 20 76 6f 69 64 20 28 2a 28 2a 78 29 28 76 6f    void (*(*x)(vo
27c20 69 64 2a 2c 63 6f 6e 73 74 20 63 68 61 72 2a 29  id*,const char*)
27c30 29 28 76 6f 69 64 29 3b 0a 20 20 55 4e 55 53 45  )(void);.  UNUSE
27c40 44 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f 74 55  D_PARAMETER(NotU
27c50 73 65 64 29 3b 0a 20 20 78 20 3d 20 28 76 6f 69  sed);.  x = (voi
27c60 64 28 2a 28 2a 29 28 76 6f 69 64 2a 2c 63 6f 6e  d(*(*)(void*,con
27c70 73 74 20 63 68 61 72 2a 29 29 28 76 6f 69 64 29  st char*))(void)
27c80 29 64 6c 73 79 6d 3b 0a 20 20 72 65 74 75 72 6e  )dlsym;.  return
27c90 20 28 2a 78 29 28 70 2c 20 7a 53 79 6d 29 3b 0a   (*x)(p, zSym);.
27ca0 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 75 6e  }.static void un
27cb0 69 78 44 6c 43 6c 6f 73 65 28 73 71 6c 69 74 65  ixDlClose(sqlite
27cc0 33 5f 76 66 73 20 2a 4e 6f 74 55 73 65 64 2c 20  3_vfs *NotUsed, 
27cd0 76 6f 69 64 20 2a 70 48 61 6e 64 6c 65 29 7b 0a  void *pHandle){.
27ce0 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
27cf0 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20 64  ER(NotUsed);.  d
27d00 6c 63 6c 6f 73 65 28 70 48 61 6e 64 6c 65 29 3b  lclose(pHandle);
27d10 0a 7d 0a 23 65 6c 73 65 20 2f 2a 20 69 66 20 53  .}.#else /* if S
27d20 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c 4f 41 44 5f  QLITE_OMIT_LOAD_
27d30 45 58 54 45 4e 53 49 4f 4e 20 69 73 20 64 65 66  EXTENSION is def
27d40 69 6e 65 64 3a 20 2a 2f 0a 20 20 23 64 65 66 69  ined: */.  #defi
27d50 6e 65 20 75 6e 69 78 44 6c 4f 70 65 6e 20 20 30  ne unixDlOpen  0
27d60 0a 20 20 23 64 65 66 69 6e 65 20 75 6e 69 78 44  .  #define unixD
27d70 6c 45 72 72 6f 72 20 30 0a 20 20 23 64 65 66 69  lError 0.  #defi
27d80 6e 65 20 75 6e 69 78 44 6c 53 79 6d 20 20 20 30  ne unixDlSym   0
27d90 0a 20 20 23 64 65 66 69 6e 65 20 75 6e 69 78 44  .  #define unixD
27da0 6c 43 6c 6f 73 65 20 30 0a 23 65 6e 64 69 66 0a  lClose 0.#endif.
27db0 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 6e 42 75  ./*.** Write nBu
27dc0 66 20 62 79 74 65 73 20 6f 66 20 72 61 6e 64 6f  f bytes of rando
27dd0 6d 20 64 61 74 61 20 74 6f 20 74 68 65 20 73 75  m data to the su
27de0 70 70 6c 69 65 64 20 62 75 66 66 65 72 20 7a 42  pplied buffer zB
27df0 75 66 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  uf..*/.static in
27e00 74 20 75 6e 69 78 52 61 6e 64 6f 6d 6e 65 73 73  t unixRandomness
27e10 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 4e 6f  (sqlite3_vfs *No
27e20 74 55 73 65 64 2c 20 69 6e 74 20 6e 42 75 66 2c  tUsed, int nBuf,
27e30 20 63 68 61 72 20 2a 7a 42 75 66 29 7b 0a 20 20   char *zBuf){.  
27e40 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
27e50 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20 61 73 73  (NotUsed);.  ass
27e60 65 72 74 28 28 73 69 7a 65 5f 74 29 6e 42 75 66  ert((size_t)nBuf
27e70 3e 3d 28 73 69 7a 65 6f 66 28 74 69 6d 65 5f 74  >=(sizeof(time_t
27e80 29 2b 73 69 7a 65 6f 66 28 69 6e 74 29 29 29 3b  )+sizeof(int)));
27e90 0a 0a 20 20 2f 2a 20 57 65 20 68 61 76 65 20 74  ..  /* We have t
27ea0 6f 20 69 6e 69 74 69 61 6c 69 7a 65 20 7a 42 75  o initialize zBu
27eb0 66 20 74 6f 20 70 72 65 76 65 6e 74 20 76 61 6c  f to prevent val
27ec0 67 72 69 6e 64 20 66 72 6f 6d 20 72 65 70 6f 72  grind from repor
27ed0 74 69 6e 67 0a 20 20 2a 2a 20 65 72 72 6f 72 73  ting.  ** errors
27ee0 2e 20 20 54 68 65 20 72 65 70 6f 72 74 73 20 69  .  The reports i
27ef0 73 73 75 65 64 20 62 79 20 76 61 6c 67 72 69 6e  ssued by valgrin
27f00 64 20 61 72 65 20 69 6e 63 6f 72 72 65 63 74 20  d are incorrect 
27f10 2d 20 77 65 20 77 6f 75 6c 64 0a 20 20 2a 2a 20  - we would.  ** 
27f20 70 72 65 66 65 72 20 74 68 61 74 20 74 68 65 20  prefer that the 
27f30 72 61 6e 64 6f 6d 6e 65 73 73 20 62 65 20 69 6e  randomness be in
27f40 63 72 65 61 73 65 64 20 62 79 20 6d 61 6b 69 6e  creased by makin
27f50 67 20 75 73 65 20 6f 66 20 74 68 65 0a 20 20 2a  g use of the.  *
27f60 2a 20 75 6e 69 6e 69 74 69 61 6c 69 7a 65 64 20  * uninitialized 
27f70 73 70 61 63 65 20 69 6e 20 7a 42 75 66 20 2d 20  space in zBuf - 
27f80 62 75 74 20 76 61 6c 67 72 69 6e 64 20 65 72 72  but valgrind err
27f90 6f 72 73 20 74 65 6e 64 20 74 6f 20 77 6f 72 72  ors tend to worr
27fa0 79 0a 20 20 2a 2a 20 73 6f 6d 65 20 75 73 65 72  y.  ** some user
27fb0 73 2e 20 20 52 61 74 68 65 72 20 74 68 61 6e 20  s.  Rather than 
27fc0 61 72 67 75 65 2c 20 69 74 20 73 65 65 6d 73 20  argue, it seems 
27fd0 65 61 73 69 65 72 20 6a 75 73 74 20 74 6f 20 69  easier just to i
27fe0 6e 69 74 69 61 6c 69 7a 65 0a 20 20 2a 2a 20 74  nitialize.  ** t
27ff0 68 65 20 77 68 6f 6c 65 20 61 72 72 61 79 20 61  he whole array a
28000 6e 64 20 73 69 6c 65 6e 63 65 20 76 61 6c 67 72  nd silence valgr
28010 69 6e 64 2c 20 65 76 65 6e 20 69 66 20 74 68 61  ind, even if tha
28020 74 20 6d 65 61 6e 73 20 6c 65 73 73 20 72 61 6e  t means less ran
28030 64 6f 6d 6e 65 73 73 0a 20 20 2a 2a 20 69 6e 20  domness.  ** in 
28040 74 68 65 20 72 61 6e 64 6f 6d 20 73 65 65 64 2e  the random seed.
28050 0a 20 20 2a 2a 0a 20 20 2a 2a 20 57 68 65 6e 20  .  **.  ** When 
28060 74 65 73 74 69 6e 67 2c 20 69 6e 69 74 69 61 6c  testing, initial
28070 69 7a 69 6e 67 20 7a 42 75 66 5b 5d 20 74 6f 20  izing zBuf[] to 
28080 7a 65 72 6f 20 69 73 20 61 6c 6c 20 77 65 20 64  zero is all we d
28090 6f 2e 20 20 54 68 61 74 20 6d 65 61 6e 73 0a 20  o.  That means. 
280a0 20 2a 2a 20 74 68 61 74 20 77 65 20 61 6c 77 61   ** that we alwa
280b0 79 73 20 75 73 65 20 74 68 65 20 73 61 6d 65 20  ys use the same 
280c0 72 61 6e 64 6f 6d 20 6e 75 6d 62 65 72 20 73 65  random number se
280d0 71 75 65 6e 63 65 2e 20 20 54 68 69 73 20 6d 61  quence.  This ma
280e0 6b 65 73 20 74 68 65 0a 20 20 2a 2a 20 74 65 73  kes the.  ** tes
280f0 74 73 20 72 65 70 65 61 74 61 62 6c 65 2e 0a 20  ts repeatable.. 
28100 20 2a 2f 0a 20 20 6d 65 6d 73 65 74 28 7a 42 75   */.  memset(zBu
28110 66 2c 20 30 2c 20 6e 42 75 66 29 3b 0a 23 69 66  f, 0, nBuf);.#if
28120 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
28130 5f 54 45 53 54 29 0a 20 20 7b 0a 20 20 20 20 69  _TEST).  {.    i
28140 6e 74 20 70 69 64 2c 20 66 64 3b 0a 20 20 20 20  nt pid, fd;.    
28150 66 64 20 3d 20 6f 70 65 6e 28 22 2f 64 65 76 2f  fd = open("/dev/
28160 75 72 61 6e 64 6f 6d 22 2c 20 4f 5f 52 44 4f 4e  urandom", O_RDON
28170 4c 59 29 3b 0a 20 20 20 20 69 66 28 20 66 64 3c  LY);.    if( fd<
28180 30 20 29 7b 0a 20 20 20 20 20 20 74 69 6d 65 5f  0 ){.      time_
28190 74 20 74 3b 0a 20 20 20 20 20 20 74 69 6d 65 28  t t;.      time(
281a0 26 74 29 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70  &t);.      memcp
281b0 79 28 7a 42 75 66 2c 20 26 74 2c 20 73 69 7a 65  y(zBuf, &t, size
281c0 6f 66 28 74 29 29 3b 0a 20 20 20 20 20 20 70 69  of(t));.      pi
281d0 64 20 3d 20 67 65 74 70 69 64 28 29 3b 0a 20 20  d = getpid();.  
281e0 20 20 20 20 6d 65 6d 63 70 79 28 26 7a 42 75 66      memcpy(&zBuf
281f0 5b 73 69 7a 65 6f 66 28 74 29 5d 2c 20 26 70 69  [sizeof(t)], &pi
28200 64 2c 20 73 69 7a 65 6f 66 28 70 69 64 29 29 3b  d, sizeof(pid));
28210 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 73  .      assert( s
28220 69 7a 65 6f 66 28 74 29 2b 73 69 7a 65 6f 66 28  izeof(t)+sizeof(
28230 70 69 64 29 3c 3d 28 73 69 7a 65 5f 74 29 6e 42  pid)<=(size_t)nB
28240 75 66 20 29 3b 0a 20 20 20 20 20 20 6e 42 75 66  uf );.      nBuf
28250 20 3d 20 73 69 7a 65 6f 66 28 74 29 20 2b 20 73   = sizeof(t) + s
28260 69 7a 65 6f 66 28 70 69 64 29 3b 0a 20 20 20 20  izeof(pid);.    
28270 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6e 42 75  }else{.      nBu
28280 66 20 3d 20 72 65 61 64 28 66 64 2c 20 7a 42 75  f = read(fd, zBu
28290 66 2c 20 6e 42 75 66 29 3b 0a 20 20 20 20 20 20  f, nBuf);.      
282a0 63 6c 6f 73 65 28 66 64 29 3b 0a 20 20 20 20 7d  close(fd);.    }
282b0 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 72 65  .  }.#endif.  re
282c0 74 75 72 6e 20 6e 42 75 66 3b 0a 7d 0a 0a 0a 2f  turn nBuf;.}.../
282d0 2a 0a 2a 2a 20 53 6c 65 65 70 20 66 6f 72 20 61  *.** Sleep for a
282e0 20 6c 69 74 74 6c 65 20 77 68 69 6c 65 2e 20 20   little while.  
282f0 52 65 74 75 72 6e 20 74 68 65 20 61 6d 6f 75 6e  Return the amoun
28300 74 20 6f 66 20 74 69 6d 65 20 73 6c 65 70 74 2e  t of time slept.
28310 0a 2a 2a 20 54 68 65 20 61 72 67 75 6d 65 6e 74  .** The argument
28320 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   is the number o
28330 66 20 6d 69 63 72 6f 73 65 63 6f 6e 64 73 20 77  f microseconds w
28340 65 20 77 61 6e 74 20 74 6f 20 73 6c 65 65 70 2e  e want to sleep.
28350 0a 2a 2a 20 54 68 65 20 72 65 74 75 72 6e 20 76  .** The return v
28360 61 6c 75 65 20 69 73 20 74 68 65 20 6e 75 6d 62  alue is the numb
28370 65 72 20 6f 66 20 6d 69 63 72 6f 73 65 63 6f 6e  er of microsecon
28380 64 73 20 6f 66 20 73 6c 65 65 70 20 61 63 74 75  ds of sleep actu
28390 61 6c 6c 79 0a 2a 2a 20 72 65 71 75 65 73 74 65  ally.** requeste
283a0 64 20 66 72 6f 6d 20 74 68 65 20 75 6e 64 65 72  d from the under
283b0 6c 79 69 6e 67 20 6f 70 65 72 61 74 69 6e 67 20  lying operating 
283c0 73 79 73 74 65 6d 2c 20 61 20 6e 75 6d 62 65 72  system, a number
283d0 20 77 68 69 63 68 0a 2a 2a 20 6d 69 67 68 74 20   which.** might 
283e0 62 65 20 67 72 65 61 74 65 72 20 74 68 61 6e 20  be greater than 
283f0 6f 72 20 65 71 75 61 6c 20 74 6f 20 74 68 65 20  or equal to the 
28400 61 72 67 75 6d 65 6e 74 2c 20 62 75 74 20 6e 6f  argument, but no
28410 74 20 6c 65 73 73 0a 2a 2a 20 74 68 61 6e 20 74  t less.** than t
28420 68 65 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a  he argument..*/.
28430 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 53  static int unixS
28440 6c 65 65 70 28 73 71 6c 69 74 65 33 5f 76 66 73  leep(sqlite3_vfs
28450 20 2a 4e 6f 74 55 73 65 64 2c 20 69 6e 74 20 6d   *NotUsed, int m
28460 69 63 72 6f 73 65 63 6f 6e 64 73 29 7b 0a 23 69  icroseconds){.#i
28470 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20 73  f OS_VXWORKS.  s
28480 74 72 75 63 74 20 74 69 6d 65 73 70 65 63 20 73  truct timespec s
28490 70 3b 0a 0a 20 20 73 70 2e 74 76 5f 73 65 63 20  p;..  sp.tv_sec 
284a0 3d 20 6d 69 63 72 6f 73 65 63 6f 6e 64 73 20 2f  = microseconds /
284b0 20 31 30 30 30 30 30 30 3b 0a 20 20 73 70 2e 74   1000000;.  sp.t
284c0 76 5f 6e 73 65 63 20 3d 20 28 6d 69 63 72 6f 73  v_nsec = (micros
284d0 65 63 6f 6e 64 73 20 25 20 31 30 30 30 30 30 30  econds % 1000000
284e0 29 20 2a 20 31 30 30 30 3b 0a 20 20 6e 61 6e 6f  ) * 1000;.  nano
284f0 73 6c 65 65 70 28 26 73 70 2c 20 4e 55 4c 4c 29  sleep(&sp, NULL)
28500 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  ;.  UNUSED_PARAM
28510 45 54 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20  ETER(NotUsed);. 
28520 20 72 65 74 75 72 6e 20 6d 69 63 72 6f 73 65 63   return microsec
28530 6f 6e 64 73 3b 0a 23 65 6c 69 66 20 64 65 66 69  onds;.#elif defi
28540 6e 65 64 28 48 41 56 45 5f 55 53 4c 45 45 50 29  ned(HAVE_USLEEP)
28550 20 26 26 20 48 41 56 45 5f 55 53 4c 45 45 50 0a   && HAVE_USLEEP.
28560 20 20 75 73 6c 65 65 70 28 6d 69 63 72 6f 73 65    usleep(microse
28570 63 6f 6e 64 73 29 3b 0a 20 20 55 4e 55 53 45 44  conds);.  UNUSED
28580 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f 74 55 73  _PARAMETER(NotUs
28590 65 64 29 3b 0a 20 20 72 65 74 75 72 6e 20 6d 69  ed);.  return mi
285a0 63 72 6f 73 65 63 6f 6e 64 73 3b 0a 23 65 6c 73  croseconds;.#els
285b0 65 0a 20 20 69 6e 74 20 73 65 63 6f 6e 64 73 20  e.  int seconds 
285c0 3d 20 28 6d 69 63 72 6f 73 65 63 6f 6e 64 73 2b  = (microseconds+
285d0 39 39 39 39 39 39 29 2f 31 30 30 30 30 30 30 3b  999999)/1000000;
285e0 0a 20 20 73 6c 65 65 70 28 73 65 63 6f 6e 64 73  .  sleep(seconds
285f0 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  );.  UNUSED_PARA
28600 4d 45 54 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a  METER(NotUsed);.
28610 20 20 72 65 74 75 72 6e 20 73 65 63 6f 6e 64 73    return seconds
28620 2a 31 30 30 30 30 30 30 3b 0a 23 65 6e 64 69 66  *1000000;.#endif
28630 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f  .}../*.** The fo
28640 6c 6c 6f 77 69 6e 67 20 76 61 72 69 61 62 6c 65  llowing variable
28650 2c 20 69 66 20 73 65 74 20 74 6f 20 61 20 6e 6f  , if set to a no
28660 6e 2d 7a 65 72 6f 20 76 61 6c 75 65 2c 20 69 73  n-zero value, is
28670 20 69 6e 74 65 72 70 72 65 74 65 64 20 61 73 0a   interpreted as.
28680 2a 2a 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  ** the number of
28690 20 73 65 63 6f 6e 64 73 20 73 69 6e 63 65 20 31   seconds since 1
286a0 39 37 30 20 61 6e 64 20 69 73 20 75 73 65 64 20  970 and is used 
286b0 74 6f 20 73 65 74 20 74 68 65 20 72 65 73 75 6c  to set the resul
286c0 74 20 6f 66 0a 2a 2a 20 73 71 6c 69 74 65 33 4f  t of.** sqlite3O
286d0 73 43 75 72 72 65 6e 74 54 69 6d 65 28 29 20 64  sCurrentTime() d
286e0 75 72 69 6e 67 20 74 65 73 74 69 6e 67 2e 0a 2a  uring testing..*
286f0 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /.#ifdef SQLITE_
28700 54 45 53 54 0a 69 6e 74 20 73 71 6c 69 74 65 33  TEST.int sqlite3
28710 5f 63 75 72 72 65 6e 74 5f 74 69 6d 65 20 3d 20  _current_time = 
28720 30 3b 20 20 2f 2a 20 46 61 6b 65 20 73 79 73 74  0;  /* Fake syst
28730 65 6d 20 74 69 6d 65 20 69 6e 20 73 65 63 6f 6e  em time in secon
28740 64 73 20 73 69 6e 63 65 20 31 39 37 30 2e 20 2a  ds since 1970. *
28750 2f 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  /.#endif../*.** 
28760 46 69 6e 64 20 74 68 65 20 63 75 72 72 65 6e 74  Find the current
28770 20 74 69 6d 65 20 28 69 6e 20 55 6e 69 76 65 72   time (in Univer
28780 73 61 6c 20 43 6f 6f 72 64 69 6e 61 74 65 64 20  sal Coordinated 
28790 54 69 6d 65 29 2e 20 20 57 72 69 74 65 20 69 6e  Time).  Write in
287a0 74 6f 20 2a 70 69 4e 6f 77 0a 2a 2a 20 74 68 65  to *piNow.** the
287b0 20 63 75 72 72 65 6e 74 20 74 69 6d 65 20 61 6e   current time an
287c0 64 20 64 61 74 65 20 61 73 20 61 20 4a 75 6c 69  d date as a Juli
287d0 61 6e 20 44 61 79 20 6e 75 6d 62 65 72 20 74 69  an Day number ti
287e0 6d 65 73 20 38 36 5f 34 30 30 5f 30 30 30 2e 20  mes 86_400_000. 
287f0 20 49 6e 0a 2a 2a 20 6f 74 68 65 72 20 77 6f 72   In.** other wor
28800 64 73 2c 20 77 72 69 74 65 20 69 6e 74 6f 20 2a  ds, write into *
28810 70 69 4e 6f 77 20 74 68 65 20 6e 75 6d 62 65 72  piNow the number
28820 20 6f 66 20 6d 69 6c 6c 69 73 65 63 6f 6e 64 73   of milliseconds
28830 20 73 69 6e 63 65 20 74 68 65 20 4a 75 6c 69 61   since the Julia
28840 6e 0a 2a 2a 20 65 70 6f 63 68 20 6f 66 20 6e 6f  n.** epoch of no
28850 6f 6e 20 69 6e 20 47 72 65 65 6e 77 69 63 68 20  on in Greenwich 
28860 6f 6e 20 4e 6f 76 65 6d 62 65 72 20 32 34 2c 20  on November 24, 
28870 34 37 31 34 20 42 2e 43 20 61 63 63 6f 72 64 69  4714 B.C accordi
28880 6e 67 20 74 6f 20 74 68 65 0a 2a 2a 20 70 72 6f  ng to the.** pro
28890 6c 65 70 74 69 63 20 47 72 65 67 6f 72 69 61 6e  leptic Gregorian
288a0 20 63 61 6c 65 6e 64 61 72 2e 0a 2a 2a 0a 2a 2a   calendar..**.**
288b0 20 4f 6e 20 73 75 63 63 65 73 73 2c 20 72 65 74   On success, ret
288c0 75 72 6e 20 30 2e 20 20 52 65 74 75 72 6e 20 31  urn 0.  Return 1
288d0 20 69 66 20 74 68 65 20 74 69 6d 65 20 61 6e 64   if the time and
288e0 20 64 61 74 65 20 63 61 6e 6e 6f 74 20 62 65 20   date cannot be 
288f0 66 6f 75 6e 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  found..*/.static
28900 20 69 6e 74 20 75 6e 69 78 43 75 72 72 65 6e 74   int unixCurrent
28910 54 69 6d 65 49 6e 74 36 34 28 73 71 6c 69 74 65  TimeInt64(sqlite
28920 33 5f 76 66 73 20 2a 4e 6f 74 55 73 65 64 2c 20  3_vfs *NotUsed, 
28930 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 2a 70  sqlite3_int64 *p
28940 69 4e 6f 77 29 7b 0a 20 20 73 74 61 74 69 63 20  iNow){.  static 
28950 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 69 6e  const sqlite3_in
28960 74 36 34 20 75 6e 69 78 45 70 6f 63 68 20 3d 20  t64 unixEpoch = 
28970 32 34 34 30 35 38 37 35 2a 28 73 71 6c 69 74 65  24405875*(sqlite
28980 33 5f 69 6e 74 36 34 29 38 36 34 30 30 30 30 3b  3_int64)8640000;
28990 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4e 4f 5f  .#if defined(NO_
289a0 47 45 54 54 4f 44 29 0a 20 20 74 69 6d 65 5f 74  GETTOD).  time_t
289b0 20 74 3b 0a 20 20 74 69 6d 65 28 26 74 29 3b 0a   t;.  time(&t);.
289c0 20 20 2a 70 69 4e 6f 77 20 3d 20 28 28 73 71 6c    *piNow = ((sql
289d0 69 74 65 33 5f 69 6e 74 36 34 29 69 29 2a 31 30  ite3_int64)i)*10
289e0 30 30 20 2b 20 75 6e 69 78 45 70 6f 63 68 3b 0a  00 + unixEpoch;.
289f0 23 65 6c 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53  #elif OS_VXWORKS
28a00 0a 20 20 73 74 72 75 63 74 20 74 69 6d 65 73 70  .  struct timesp
28a10 65 63 20 73 4e 6f 77 3b 0a 20 20 63 6c 6f 63 6b  ec sNow;.  clock
28a20 5f 67 65 74 74 69 6d 65 28 43 4c 4f 43 4b 5f 52  _gettime(CLOCK_R
28a30 45 41 4c 54 49 4d 45 2c 20 26 73 4e 6f 77 29 3b  EALTIME, &sNow);
28a40 0a 20 20 2a 70 69 4e 6f 77 20 3d 20 75 6e 69 78  .  *piNow = unix
28a50 45 70 6f 63 68 20 2b 20 31 30 30 30 2a 28 73 71  Epoch + 1000*(sq
28a60 6c 69 74 65 33 5f 69 6e 74 36 34 29 73 4e 6f 77  lite3_int64)sNow
28a70 2e 74 76 5f 73 65 63 20 2b 20 73 4e 6f 77 2e 74  .tv_sec + sNow.t
28a80 76 5f 6e 73 65 63 2f 31 30 30 30 30 30 30 3b 0a  v_nsec/1000000;.
28a90 23 65 6c 73 65 0a 20 20 73 74 72 75 63 74 20 74  #else.  struct t
28aa0 69 6d 65 76 61 6c 20 73 4e 6f 77 3b 0a 20 20 67  imeval sNow;.  g
28ab0 65 74 74 69 6d 65 6f 66 64 61 79 28 26 73 4e 6f  ettimeofday(&sNo
28ac0 77 2c 20 30 29 3b 0a 20 20 2a 70 69 4e 6f 77 20  w, 0);.  *piNow 
28ad0 3d 20 75 6e 69 78 45 70 6f 63 68 20 2b 20 31 30  = unixEpoch + 10
28ae0 30 30 2a 28 73 71 6c 69 74 65 33 5f 69 6e 74 36  00*(sqlite3_int6
28af0 34 29 73 4e 6f 77 2e 74 76 5f 73 65 63 20 2b 20  4)sNow.tv_sec + 
28b00 73 4e 6f 77 2e 74 76 5f 75 73 65 63 2f 31 30 30  sNow.tv_usec/100
28b10 30 3b 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64 65  0;.#endif..#ifde
28b20 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20 20  f SQLITE_TEST.  
28b30 69 66 28 20 73 71 6c 69 74 65 33 5f 63 75 72 72  if( sqlite3_curr
28b40 65 6e 74 5f 74 69 6d 65 20 29 7b 0a 20 20 20 20  ent_time ){.    
28b50 2a 70 69 4e 6f 77 20 3d 20 31 30 30 30 2a 28 73  *piNow = 1000*(s
28b60 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 73 71 6c  qlite3_int64)sql
28b70 69 74 65 33 5f 63 75 72 72 65 6e 74 5f 74 69 6d  ite3_current_tim
28b80 65 20 2b 20 75 6e 69 78 45 70 6f 63 68 3b 0a 20  e + unixEpoch;. 
28b90 20 7d 0a 23 65 6e 64 69 66 0a 20 20 55 4e 55 53   }.#endif.  UNUS
28ba0 45 44 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f 74  ED_PARAMETER(Not
28bb0 55 73 65 64 29 3b 0a 20 20 72 65 74 75 72 6e 20  Used);.  return 
28bc0 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 69 6e 64  0;.}../*.** Find
28bd0 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 69 6d   the current tim
28be0 65 20 28 69 6e 20 55 6e 69 76 65 72 73 61 6c 20  e (in Universal 
28bf0 43 6f 6f 72 64 69 6e 61 74 65 64 20 54 69 6d 65  Coordinated Time
28c00 29 2e 20 20 57 72 69 74 65 20 74 68 65 0a 2a 2a  ).  Write the.**
28c10 20 63 75 72 72 65 6e 74 20 74 69 6d 65 20 61 6e   current time an
28c20 64 20 64 61 74 65 20 61 73 20 61 20 4a 75 6c 69  d date as a Juli
28c30 61 6e 20 44 61 79 20 6e 75 6d 62 65 72 20 69 6e  an Day number in
28c40 74 6f 20 2a 70 72 4e 6f 77 20 61 6e 64 0a 2a 2a  to *prNow and.**
28c50 20 72 65 74 75 72 6e 20 30 2e 20 20 52 65 74 75   return 0.  Retu
28c60 72 6e 20 31 20 69 66 20 74 68 65 20 74 69 6d 65  rn 1 if the time
28c70 20 61 6e 64 20 64 61 74 65 20 63 61 6e 6e 6f 74   and date cannot
28c80 20 62 65 20 66 6f 75 6e 64 2e 0a 2a 2f 0a 73 74   be found..*/.st
28c90 61 74 69 63 20 69 6e 74 20 75 6e 69 78 43 75 72  atic int unixCur
28ca0 72 65 6e 74 54 69 6d 65 28 73 71 6c 69 74 65 33  rentTime(sqlite3
28cb0 5f 76 66 73 20 2a 4e 6f 74 55 73 65 64 2c 20 64  _vfs *NotUsed, d
28cc0 6f 75 62 6c 65 20 2a 70 72 4e 6f 77 29 7b 0a 20  ouble *prNow){. 
28cd0 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 69   sqlite3_int64 i
28ce0 3b 0a 20 20 75 6e 69 78 43 75 72 72 65 6e 74 54  ;.  unixCurrentT
28cf0 69 6d 65 49 6e 74 36 34 28 30 2c 20 26 69 29 3b  imeInt64(0, &i);
28d00 0a 20 20 2a 70 72 4e 6f 77 20 3d 20 69 2f 38 36  .  *prNow = i/86
28d10 34 30 30 30 30 30 2e 30 3b 0a 20 20 72 65 74 75  400000.0;.  retu
28d20 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57  rn 0;.}../*.** W
28d30 65 20 61 64 64 65 64 20 74 68 65 20 78 47 65 74  e added the xGet
28d40 4c 61 73 74 45 72 72 6f 72 28 29 20 6d 65 74 68  LastError() meth
28d50 6f 64 20 77 69 74 68 20 74 68 65 20 69 6e 74 65  od with the inte
28d60 6e 74 69 6f 6e 20 6f 66 20 70 72 6f 76 69 64 69  ntion of providi
28d70 6e 67 0a 2a 2a 20 62 65 74 74 65 72 20 6c 6f 77  ng.** better low
28d80 2d 6c 65 76 65 6c 20 65 72 72 6f 72 20 6d 65 73  -level error mes
28d90 73 61 67 65 73 20 77 68 65 6e 20 6f 70 65 72 61  sages when opera
28da0 74 69 6e 67 2d 73 79 73 74 65 6d 20 70 72 6f 62  ting-system prob
28db0 6c 65 6d 73 20 63 6f 6d 65 20 75 70 0a 2a 2a 20  lems come up.** 
28dc0 64 75 72 69 6e 67 20 53 51 4c 69 74 65 20 6f 70  during SQLite op
28dd0 65 72 61 74 69 6f 6e 2e 20 20 42 75 74 20 73 6f  eration.  But so
28de0 20 66 61 72 2c 20 6e 6f 6e 65 20 6f 66 20 74 68   far, none of th
28df0 61 74 20 68 61 73 20 62 65 65 6e 20 69 6d 70 6c  at has been impl
28e00 65 6d 65 6e 74 65 64 0a 2a 2a 20 69 6e 20 74 68  emented.** in th
28e10 65 20 63 6f 72 65 2e 20 20 53 6f 20 74 68 69 73  e core.  So this
28e20 20 72 6f 75 74 69 6e 65 20 69 73 20 6e 65 76 65   routine is neve
28e30 72 20 63 61 6c 6c 65 64 2e 20 20 46 6f 72 20 6e  r called.  For n
28e40 6f 77 2c 20 69 74 20 69 73 20 6d 65 72 65 6c 79  ow, it is merely
28e50 0a 2a 2a 20 61 20 70 6c 61 63 65 2d 68 6f 6c 64  .** a place-hold
28e60 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  er..*/.static in
28e70 74 20 75 6e 69 78 47 65 74 4c 61 73 74 45 72 72  t unixGetLastErr
28e80 6f 72 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a  or(sqlite3_vfs *
28e90 4e 6f 74 55 73 65 64 2c 20 69 6e 74 20 4e 6f 74  NotUsed, int Not
28ea0 55 73 65 64 32 2c 20 63 68 61 72 20 2a 4e 6f 74  Used2, char *Not
28eb0 55 73 65 64 33 29 7b 0a 20 20 55 4e 55 53 45 44  Used3){.  UNUSED
28ec0 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f 74 55 73  _PARAMETER(NotUs
28ed0 65 64 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41  ed);.  UNUSED_PA
28ee0 52 41 4d 45 54 45 52 28 4e 6f 74 55 73 65 64 32  RAMETER(NotUsed2
28ef0 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  );.  UNUSED_PARA
28f00 4d 45 54 45 52 28 4e 6f 74 55 73 65 64 33 29 3b  METER(NotUsed3);
28f10 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a  .  return 0;.}..
28f20 0a 2f 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ./*.************
28f30 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64  ************ End
28f40 20 6f 66 20 73 71 6c 69 74 65 33 5f 76 66 73 20   of sqlite3_vfs 
28f50 6d 65 74 68 6f 64 73 20 2a 2a 2a 2a 2a 2a 2a 2a  methods ********
28f60 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
28f70 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ***.************
28f80 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
28f90 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
28fa0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
28fb0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
28fc0 2a 2a 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  **/../**********
28fd0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
28fe0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
28ff0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
29000 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
29010 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****.***********
29020 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20  *************** 
29030 42 65 67 69 6e 20 50 72 6f 78 79 20 4c 6f 63 6b  Begin Proxy Lock
29040 69 6e 67 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ing ************
29050 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
29060 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 50 72 6f 78 79  ****.**.** Proxy
29070 20 6c 6f 63 6b 69 6e 67 20 69 73 20 61 20 22 75   locking is a "u
29080 62 65 72 2d 6c 6f 63 6b 69 6e 67 2d 6d 65 74 68  ber-locking-meth
29090 6f 64 22 20 69 6e 20 74 68 69 73 20 73 65 6e 73  od" in this sens
290a0 65 3a 20 20 49 74 20 75 73 65 73 20 74 68 65 0a  e:  It uses the.
290b0 2a 2a 20 6f 74 68 65 72 20 6c 6f 63 6b 69 6e 67  ** other locking
290c0 20 6d 65 74 68 6f 64 73 20 6f 6e 20 73 65 63 6f   methods on seco
290d0 6e 64 61 72 79 20 6c 6f 63 6b 20 66 69 6c 65 73  ndary lock files
290e0 2e 20 20 50 72 6f 78 79 20 6c 6f 63 6b 69 6e 67  .  Proxy locking
290f0 20 69 73 20 61 0a 2a 2a 20 6d 65 74 61 2d 6c 61   is a.** meta-la
29100 79 65 72 20 6f 76 65 72 20 74 6f 70 20 6f 66 20  yer over top of 
29110 74 68 65 20 70 72 69 6d 69 74 69 76 65 20 6c 6f  the primitive lo
29120 63 6b 69 6e 67 20 69 6d 70 6c 65 6d 65 6e 74 65  cking implemente
29130 64 20 61 62 6f 76 65 2e 20 20 46 6f 72 0a 2a 2a  d above.  For.**
29140 20 74 68 69 73 20 72 65 61 73 6f 6e 2c 20 74 68   this reason, th
29150 65 20 64 69 76 69 73 69 6f 6e 20 74 68 61 74 20  e division that 
29160 69 6d 70 6c 65 6d 65 6e 74 73 20 6f 66 20 70 72  implements of pr
29170 6f 78 79 20 6c 6f 63 6b 69 6e 67 20 69 73 20 64  oxy locking is d
29180 65 66 65 72 72 65 64 0a 2a 2a 20 75 6e 74 69 6c  eferred.** until
29190 20 6c 61 74 65 20 69 6e 20 74 68 65 20 66 69 6c   late in the fil
291a0 65 20 28 68 65 72 65 29 20 61 66 74 65 72 20 61  e (here) after a
291b0 6c 6c 20 6f 66 20 74 68 65 20 6f 74 68 65 72 20  ll of the other 
291c0 49 2f 4f 20 6d 65 74 68 6f 64 73 20 68 61 76 65  I/O methods have
291d0 0a 2a 2a 20 62 65 65 6e 20 64 65 66 69 6e 65 64  .** been defined
291e0 20 2d 20 73 6f 20 74 68 61 74 20 74 68 65 20 70   - so that the p
291f0 72 69 6d 69 74 69 76 65 20 6c 6f 63 6b 69 6e 67  rimitive locking
29200 20 6d 65 74 68 6f 64 73 20 61 72 65 20 61 76 61   methods are ava
29210 69 6c 61 62 6c 65 0a 2a 2a 20 61 73 20 73 65 72  ilable.** as ser
29220 76 69 63 65 73 20 74 6f 20 68 65 6c 70 20 77 69  vices to help wi
29230 74 68 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74  th the implement
29240 61 74 69 6f 6e 20 6f 66 20 70 72 6f 78 79 20 6c  ation of proxy l
29250 6f 63 6b 69 6e 67 2e 0a 2a 2a 0a 2a 2a 2a 2a 0a  ocking..**.****.
29260 2a 2a 0a 2a 2a 20 54 68 65 20 64 65 66 61 75 6c  **.** The defaul
29270 74 20 6c 6f 63 6b 69 6e 67 20 73 63 68 65 6d 65  t locking scheme
29280 73 20 69 6e 20 53 51 4c 69 74 65 20 75 73 65 20  s in SQLite use 
29290 62 79 74 65 2d 72 61 6e 67 65 20 6c 6f 63 6b 73  byte-range locks
292a0 20 6f 6e 20 74 68 65 0a 2a 2a 20 64 61 74 61 62   on the.** datab
292b0 61 73 65 20 66 69 6c 65 20 74 6f 20 63 6f 6f 72  ase file to coor
292c0 64 69 6e 61 74 65 20 73 61 66 65 2c 20 63 6f 6e  dinate safe, con
292d0 63 75 72 72 65 6e 74 20 61 63 63 65 73 73 20 62  current access b
292e0 79 20 6d 75 6c 74 69 70 6c 65 20 72 65 61 64 65  y multiple reade
292f0 72 73 0a 2a 2a 20 61 6e 64 20 77 72 69 74 65 72  rs.** and writer
29300 73 20 5b 68 74 74 70 3a 2f 2f 73 71 6c 69 74 65  s [http://sqlite
29310 2e 6f 72 67 2f 6c 6f 63 6b 69 6e 67 76 33 2e 68  .org/lockingv3.h
29320 74 6d 6c 5d 2e 20 20 54 68 65 20 66 69 76 65 20  tml].  The five 
29330 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 0a 2a 2a 20  file locking.** 
29340 73 74 61 74 65 73 20 28 55 4e 4c 4f 43 4b 45 44  states (UNLOCKED
29350 2c 20 50 45 4e 44 49 4e 47 2c 20 53 48 41 52 45  , PENDING, SHARE
29360 44 2c 20 52 45 53 45 52 56 45 44 2c 20 45 58 43  D, RESERVED, EXC
29370 4c 55 53 49 56 45 29 20 61 72 65 20 69 6d 70 6c  LUSIVE) are impl
29380 65 6d 65 6e 74 65 64 0a 2a 2a 20 61 73 20 50 4f  emented.** as PO
29390 53 49 58 20 72 65 61 64 20 26 20 77 72 69 74 65  SIX read & write
293a0 20 6c 6f 63 6b 73 20 6f 76 65 72 20 66 69 78 65   locks over fixe
293b0 64 20 73 65 74 20 6f 66 20 6c 6f 63 61 74 69 6f  d set of locatio
293c0 6e 73 20 28 76 69 61 20 66 73 63 74 6c 29 2c 0a  ns (via fsctl),.
293d0 2a 2a 20 6f 6e 20 41 46 50 20 61 6e 64 20 53 4d  ** on AFP and SM
293e0 42 20 6f 6e 6c 79 20 65 78 63 6c 75 73 69 76 65  B only exclusive
293f0 20 62 79 74 65 2d 72 61 6e 67 65 20 6c 6f 63 6b   byte-range lock
29400 73 20 61 72 65 20 61 76 61 69 6c 61 62 6c 65 20  s are available 
29410 76 69 61 20 66 73 63 74 6c 0a 2a 2a 20 77 69 74  via fsctl.** wit
29420 68 20 5f 49 4f 57 52 28 27 7a 27 2c 20 32 33 2c  h _IOWR('z', 23,
29430 20 73 74 72 75 63 74 20 42 79 74 65 52 61 6e 67   struct ByteRang
29440 65 4c 6f 63 6b 50 42 32 29 20 74 6f 20 74 72 61  eLockPB2) to tra
29450 63 6b 20 74 68 65 20 73 61 6d 65 20 35 20 73 74  ck the same 5 st
29460 61 74 65 73 2e 0a 2a 2a 20 54 6f 20 73 69 6d 75  ates..** To simu
29470 6c 61 74 65 20 61 20 46 5f 52 44 4c 43 4b 20 6f  late a F_RDLCK o
29480 6e 20 74 68 65 20 73 68 61 72 65 64 20 72 61 6e  n the shared ran
29490 67 65 2c 20 6f 6e 20 41 46 50 20 61 20 72 61 6e  ge, on AFP a ran
294a0 64 6f 6d 6c 79 20 73 65 6c 65 63 74 65 64 0a 2a  domly selected.*
294b0 2a 20 61 64 64 72 65 73 73 20 69 6e 20 74 68 65  * address in the
294c0 20 73 68 61 72 65 64 20 72 61 6e 67 65 20 69 73   shared range is
294d0 20 74 61 6b 65 6e 20 66 6f 72 20 61 20 53 48 41   taken for a SHA
294e0 52 45 44 20 6c 6f 63 6b 2c 20 74 68 65 20 65 6e  RED lock, the en
294f0 74 69 72 65 0a 2a 2a 20 73 68 61 72 65 64 20 72  tire.** shared r
29500 61 6e 67 65 20 69 73 20 74 61 6b 65 6e 20 66 6f  ange is taken fo
29510 72 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c  r an EXCLUSIVE l
29520 6f 63 6b 29 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  ock):.**.**     
29530 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 20 20 20   PENDING_BYTE   
29540 20 20 20 20 20 30 78 34 30 30 30 30 30 30 30 09       0x40000000.
29550 09 20 20 20 09 0a 2a 2a 20 20 20 20 20 20 52 45  .   ..**      RE
29560 53 45 52 56 45 44 5f 42 59 54 45 20 20 20 20 20  SERVED_BYTE     
29570 20 20 30 78 34 30 30 30 30 30 30 31 0a 2a 2a 20    0x40000001.** 
29580 20 20 20 20 20 53 48 41 52 45 44 5f 52 41 4e 47       SHARED_RANG
29590 45 20 20 20 20 20 20 20 20 30 78 34 30 30 30 30  E        0x40000
295a0 30 30 32 20 2d 3e 20 30 78 34 30 30 30 30 32 30  002 -> 0x4000020
295b0 30 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 77 6f 72  0.**.** This wor
295c0 6b 73 20 77 65 6c 6c 20 6f 6e 20 74 68 65 20 6c  ks well on the l
295d0 6f 63 61 6c 20 66 69 6c 65 20 73 79 73 74 65 6d  ocal file system
295e0 2c 20 62 75 74 20 73 68 6f 77 73 20 61 20 6e 65  , but shows a ne
295f0 61 72 6c 79 20 31 30 30 78 0a 2a 2a 20 73 6c 6f  arly 100x.** slo
29600 77 64 6f 77 6e 20 69 6e 20 72 65 61 64 20 70 65  wdown in read pe
29610 72 66 6f 72 6d 61 6e 63 65 20 6f 6e 20 41 46 50  rformance on AFP
29620 20 62 65 63 61 75 73 65 20 74 68 65 20 41 46 50   because the AFP
29630 20 63 6c 69 65 6e 74 20 64 69 73 61 62 6c 65 73   client disables
29640 0a 2a 2a 20 74 68 65 20 72 65 61 64 20 63 61 63  .** the read cac
29650 68 65 20 77 68 65 6e 20 62 79 74 65 2d 72 61 6e  he when byte-ran
29660 67 65 20 6c 6f 63 6b 73 20 61 72 65 20 70 72 65  ge locks are pre
29670 73 65 6e 74 2e 20 20 45 6e 61 62 6c 69 6e 67 20  sent.  Enabling 
29680 74 68 65 20 72 65 61 64 0a 2a 2a 20 63 61 63 68  the read.** cach
29690 65 20 65 78 70 6f 73 65 73 20 61 20 63 61 63 68  e exposes a cach
296a0 65 20 63 6f 68 65 72 65 6e 63 79 20 70 72 6f 62  e coherency prob
296b0 6c 65 6d 20 74 68 61 74 20 69 73 20 70 72 65 73  lem that is pres
296c0 65 6e 74 20 6f 6e 20 61 6c 6c 20 4f 53 20 58 0a  ent on all OS X.
296d0 2a 2a 20 73 75 70 70 6f 72 74 65 64 20 6e 65 74  ** supported net
296e0 77 6f 72 6b 20 66 69 6c 65 20 73 79 73 74 65 6d  work file system
296f0 73 2e 20 20 4e 46 53 20 61 6e 64 20 41 46 50 20  s.  NFS and AFP 
29700 62 6f 74 68 20 6f 62 73 65 72 76 65 20 74 68 65  both observe the
29710 0a 2a 2a 20 63 6c 6f 73 65 2d 74 6f 2d 6f 70 65  .** close-to-ope
29720 6e 20 73 65 6d 61 6e 74 69 63 73 20 66 6f 72 20  n semantics for 
29730 65 6e 73 75 72 69 6e 67 20 63 61 63 68 65 20 63  ensuring cache c
29740 6f 68 65 72 65 6e 63 79 0a 2a 2a 20 5b 68 74 74  oherency.** [htt
29750 70 3a 2f 2f 6e 66 73 2e 73 6f 75 72 63 65 66 6f  p://nfs.sourcefo
29760 72 67 65 2e 6e 65 74 2f 23 66 61 71 5f 61 38 5d  rge.net/#faq_a8]
29770 2c 20 77 68 69 63 68 20 64 6f 65 73 20 6e 6f 74  , which does not
29780 20 65 66 66 65 63 74 69 76 65 6c 79 0a 2a 2a 20   effectively.** 
29790 61 64 64 72 65 73 73 20 74 68 65 20 72 65 71 75  address the requ
297a0 69 72 65 6d 65 6e 74 73 20 66 6f 72 20 63 6f 6e  irements for con
297b0 63 75 72 72 65 6e 74 20 64 61 74 61 62 61 73 65  current database
297c0 20 61 63 63 65 73 73 20 62 79 20 6d 75 6c 74 69   access by multi
297d0 70 6c 65 0a 2a 2a 20 72 65 61 64 65 72 73 20 61  ple.** readers a
297e0 6e 64 20 77 72 69 74 65 72 73 0a 2a 2a 20 5b 68  nd writers.** [h
297f0 74 74 70 3a 2f 2f 77 77 77 2e 6e 61 62 62 6c 65  ttp://www.nabble
29800 2e 63 6f 6d 2f 53 51 4c 69 74 65 2d 6f 6e 2d 4e  .com/SQLite-on-N
29810 46 53 2d 63 61 63 68 65 2d 63 6f 68 65 72 65 6e  FS-cache-coheren
29820 63 79 2d 74 64 31 35 36 35 35 37 30 31 2e 68 74  cy-td15655701.ht
29830 6d 6c 5d 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20 61 64  ml]..**.** To ad
29840 64 72 65 73 73 20 74 68 65 20 70 65 72 66 6f 72  dress the perfor
29850 6d 61 6e 63 65 20 61 6e 64 20 63 61 63 68 65 20  mance and cache 
29860 63 6f 68 65 72 65 6e 63 79 20 69 73 73 75 65 73  coherency issues
29870 2c 20 70 72 6f 78 79 20 66 69 6c 65 20 6c 6f 63  , proxy file loc
29880 6b 69 6e 67 0a 2a 2a 20 63 68 61 6e 67 65 73 20  king.** changes 
29890 74 68 65 20 77 61 79 20 64 61 74 61 62 61 73 65  the way database
298a0 20 61 63 63 65 73 73 20 69 73 20 63 6f 6e 74 72   access is contr
298b0 6f 6c 6c 65 64 20 62 79 20 6c 69 6d 69 74 69 6e  olled by limitin
298c0 67 20 61 63 63 65 73 73 20 74 6f 20 61 0a 2a 2a  g access to a.**
298d0 20 73 69 6e 67 6c 65 20 68 6f 73 74 20 61 74 20   single host at 
298e0 61 20 74 69 6d 65 20 61 6e 64 20 6d 6f 76 69 6e  a time and movin
298f0 67 20 66 69 6c 65 20 6c 6f 63 6b 73 20 6f 66 66  g file locks off
29900 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
29910 20 66 69 6c 65 0a 2a 2a 20 61 6e 64 20 6f 6e 74   file.** and ont
29920 6f 20 61 20 70 72 6f 78 79 20 66 69 6c 65 20 6f  o a proxy file o
29930 6e 20 74 68 65 20 6c 6f 63 61 6c 20 66 69 6c 65  n the local file
29940 20 73 79 73 74 65 6d 2e 20 20 0a 2a 2a 0a 2a 2a   system.  .**.**
29950 0a 2a 2a 20 55 73 69 6e 67 20 70 72 6f 78 79 20  .** Using proxy 
29960 6c 6f 63 6b 73 0a 2a 2a 20 2d 2d 2d 2d 2d 2d 2d  locks.** -------
29970 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 0a 2a 2a  ----------.**.**
29980 20 43 20 41 50 49 73 0a 2a 2a 0a 2a 2a 20 20 73   C APIs.**.**  s
29990 71 6c 69 74 65 33 5f 66 69 6c 65 5f 63 6f 6e 74  qlite3_file_cont
299a0 72 6f 6c 28 64 62 2c 20 64 62 6e 61 6d 65 2c 20  rol(db, dbname, 
299b0 53 51 4c 49 54 45 5f 53 45 54 5f 4c 4f 43 4b 50  SQLITE_SET_LOCKP
299c0 52 4f 58 59 46 49 4c 45 2c 0a 2a 2a 20 20 20 20  ROXYFILE,.**    
299d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
299e0 20 20 20 3c 70 72 6f 78 79 5f 70 61 74 68 3e 20     <proxy_path> 
299f0 7c 20 22 3a 61 75 74 6f 3a 22 29 3b 0a 2a 2a 20  | ":auto:");.** 
29a00 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 5f 63 6f   sqlite3_file_co
29a10 6e 74 72 6f 6c 28 64 62 2c 20 64 62 6e 61 6d 65  ntrol(db, dbname
29a20 2c 20 53 51 4c 49 54 45 5f 47 45 54 5f 4c 4f 43  , SQLITE_GET_LOC
29a30 4b 50 52 4f 58 59 46 49 4c 45 2c 20 26 3c 70 72  KPROXYFILE, &<pr
29a40 6f 78 79 5f 70 61 74 68 3e 29 3b 0a 2a 2a 0a 2a  oxy_path>);.**.*
29a50 2a 0a 2a 2a 20 53 51 4c 20 70 72 61 67 6d 61 73  *.** SQL pragmas
29a60 0a 2a 2a 0a 2a 2a 20 20 50 52 41 47 4d 41 20 5b  .**.**  PRAGMA [
29a70 64 61 74 61 62 61 73 65 2e 5d 6c 6f 63 6b 5f 70  database.]lock_p
29a80 72 6f 78 79 5f 66 69 6c 65 3d 3c 70 72 6f 78 79  roxy_file=<proxy
29a90 5f 70 61 74 68 3e 20 7c 20 3a 61 75 74 6f 3a 0a  _path> | :auto:.
29aa0 2a 2a 20 20 50 52 41 47 4d 41 20 5b 64 61 74 61  **  PRAGMA [data
29ab0 62 61 73 65 2e 5d 6c 6f 63 6b 5f 70 72 6f 78 79  base.]lock_proxy
29ac0 5f 66 69 6c 65 0a 2a 2a 0a 2a 2a 20 53 70 65 63  _file.**.** Spec
29ad0 69 66 79 69 6e 67 20 22 3a 61 75 74 6f 3a 22 20  ifying ":auto:" 
29ae0 6d 65 61 6e 73 20 74 68 61 74 20 69 66 20 74 68  means that if th
29af0 65 72 65 20 69 73 20 61 20 63 6f 6e 63 68 20 66  ere is a conch f
29b00 69 6c 65 20 77 69 74 68 20 61 20 6d 61 74 63 68  ile with a match
29b10 69 6e 67 0a 2a 2a 20 68 6f 73 74 20 49 44 20 69  ing.** host ID i
29b20 6e 20 69 74 2c 20 74 68 65 20 70 72 6f 78 79 20  n it, the proxy 
29b30 70 61 74 68 20 69 6e 20 74 68 65 20 63 6f 6e 63  path in the conc
29b40 68 20 66 69 6c 65 20 77 69 6c 6c 20 62 65 20 75  h file will be u
29b50 73 65 64 2c 20 6f 74 68 65 72 77 69 73 65 0a 2a  sed, otherwise.*
29b60 2a 20 61 20 70 72 6f 78 79 20 70 61 74 68 20 62  * a proxy path b
29b70 61 73 65 64 20 6f 6e 20 74 68 65 20 75 73 65 72  ased on the user
29b80 27 73 20 74 65 6d 70 20 64 69 72 0a 2a 2a 20 28  's temp dir.** (
29b90 76 69 61 20 63 6f 6e 66 73 74 72 28 5f 43 53 5f  via confstr(_CS_
29ba0 44 41 52 57 49 4e 5f 55 53 45 52 5f 54 45 4d 50  DARWIN_USER_TEMP
29bb0 5f 44 49 52 2c 2e 2e 2e 29 29 20 77 69 6c 6c 20  _DIR,...)) will 
29bc0 62 65 20 75 73 65 64 20 61 6e 64 20 74 68 65 0a  be used and the.
29bd0 2a 2a 20 61 63 74 75 61 6c 20 70 72 6f 78 79 20  ** actual proxy 
29be0 66 69 6c 65 20 6e 61 6d 65 20 69 73 20 67 65 6e  file name is gen
29bf0 65 72 61 74 65 64 20 66 72 6f 6d 20 74 68 65 20  erated from the 
29c00 6e 61 6d 65 20 61 6e 64 20 70 61 74 68 20 6f 66  name and path of
29c10 20 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65   the.** database
29c20 20 66 69 6c 65 2e 20 20 46 6f 72 20 65 78 61 6d   file.  For exam
29c30 70 6c 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20  ple:.**.**      
29c40 20 46 6f 72 20 64 61 74 61 62 61 73 65 20 70 61   For database pa
29c50 74 68 20 22 2f 55 73 65 72 73 2f 6d 65 2f 66 6f  th "/Users/me/fo
29c60 6f 2e 64 62 22 20 0a 2a 2a 20 20 20 20 20 20 20  o.db" .**       
29c70 54 68 65 20 6c 6f 63 6b 20 70 61 74 68 20 77 69  The lock path wi
29c80 6c 6c 20 62 65 20 22 3c 74 6d 70 64 69 72 3e 2f  ll be "<tmpdir>/
29c90 73 71 6c 69 74 65 70 6c 6f 63 6b 73 2f 5f 55 73  sqliteplocks/_Us
29ca0 65 72 73 5f 6d 65 5f 66 6f 6f 2e 64 62 3a 61 75  ers_me_foo.db:au
29cb0 74 6f 3a 22 29 0a 2a 2a 0a 2a 2a 20 4f 6e 63 65  to:").**.** Once
29cc0 20 61 20 6c 6f 63 6b 20 70 72 6f 78 79 20 69 73   a lock proxy is
29cd0 20 63 6f 6e 66 69 67 75 72 65 64 20 66 6f 72 20   configured for 
29ce0 61 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  a database conne
29cf0 63 74 69 6f 6e 2c 20 69 74 20 63 61 6e 20 6e 6f  ction, it can no
29d00 74 0a 2a 2a 20 62 65 20 72 65 6d 6f 76 65 64 2c  t.** be removed,
29d10 20 68 6f 77 65 76 65 72 20 69 74 20 6d 61 79 20   however it may 
29d20 62 65 20 73 77 69 74 63 68 65 64 20 74 6f 20 61  be switched to a
29d30 20 64 69 66 66 65 72 65 6e 74 20 70 72 6f 78 79   different proxy
29d40 20 70 61 74 68 20 76 69 61 0a 2a 2a 20 74 68 65   path via.** the
29d50 20 61 62 6f 76 65 20 41 50 49 73 20 28 61 73 73   above APIs (ass
29d60 75 6d 69 6e 67 20 74 68 65 20 63 6f 6e 63 68 20  uming the conch 
29d70 66 69 6c 65 20 69 73 20 6e 6f 74 20 62 65 69 6e  file is not bein
29d80 67 20 68 65 6c 64 20 62 79 20 61 6e 6f 74 68 65  g held by anothe
29d90 72 0a 2a 2a 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  r.** connection 
29da0 6f 72 20 70 72 6f 63 65 73 73 29 2e 20 0a 2a 2a  or process). .**
29db0 0a 2a 2a 0a 2a 2a 20 48 6f 77 20 70 72 6f 78 79  .**.** How proxy
29dc0 20 6c 6f 63 6b 69 6e 67 20 77 6f 72 6b 73 0a 2a   locking works.*
29dd0 2a 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  * --------------
29de0 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 0a 2a 2a 20  ---------.**.** 
29df0 50 72 6f 78 79 20 66 69 6c 65 20 6c 6f 63 6b 69  Proxy file locki
29e00 6e 67 20 72 65 6c 69 65 73 20 70 72 69 6d 61 72  ng relies primar
29e10 69 6c 79 20 6f 6e 20 74 77 6f 20 6e 65 77 20 73  ily on two new s
29e20 75 70 70 6f 72 74 69 6e 67 20 66 69 6c 65 73 3a  upporting files:
29e30 20 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 20 63 6f 6e   .**.**   *  con
29e40 63 68 20 66 69 6c 65 20 74 6f 20 6c 69 6d 69 74  ch file to limit
29e50 20 61 63 63 65 73 73 20 74 6f 20 74 68 65 20 64   access to the d
29e60 61 74 61 62 61 73 65 20 66 69 6c 65 20 74 6f 20  atabase file to 
29e70 61 20 73 69 6e 67 6c 65 20 68 6f 73 74 0a 2a 2a  a single host.**
29e80 20 20 20 20 20 20 61 74 20 61 20 74 69 6d 65 0a        at a time.
29e90 2a 2a 0a 2a 2a 20 20 20 2a 20 20 70 72 6f 78 79  **.**   *  proxy
29ea0 20 66 69 6c 65 20 74 6f 20 61 63 74 20 61 73 20   file to act as 
29eb0 61 20 70 72 6f 78 79 20 66 6f 72 20 74 68 65 20  a proxy for the 
29ec0 61 64 76 69 73 6f 72 79 20 6c 6f 63 6b 73 20 6e  advisory locks n
29ed0 6f 72 6d 61 6c 6c 79 0a 2a 2a 20 20 20 20 20 20  ormally.**      
29ee0 74 61 6b 65 6e 20 6f 6e 20 74 68 65 20 64 61 74  taken on the dat
29ef0 61 62 61 73 65 0a 2a 2a 0a 2a 2a 20 54 68 65 20  abase.**.** The 
29f00 63 6f 6e 63 68 20 66 69 6c 65 20 2d 20 74 6f 20  conch file - to 
29f10 75 73 65 20 61 20 70 72 6f 78 79 20 66 69 6c 65  use a proxy file
29f20 2c 20 73 71 6c 69 74 65 20 6d 75 73 74 20 66 69  , sqlite must fi
29f30 72 73 74 20 22 68 6f 6c 64 20 74 68 65 20 63 6f  rst "hold the co
29f40 6e 63 68 22 0a 2a 2a 20 62 79 20 74 61 6b 69 6e  nch".** by takin
29f50 67 20 61 6e 20 73 71 6c 69 74 65 2d 73 74 79 6c  g an sqlite-styl
29f60 65 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 6f 6e  e shared lock on
29f70 20 74 68 65 20 63 6f 6e 63 68 20 66 69 6c 65 2c   the conch file,
29f80 20 72 65 61 64 69 6e 67 20 74 68 65 0a 2a 2a 20   reading the.** 
29f90 63 6f 6e 74 65 6e 74 73 20 61 6e 64 20 63 6f 6d  contents and com
29fa0 70 61 72 69 6e 67 20 74 68 65 20 68 6f 73 74 27  paring the host'
29fb0 73 20 75 6e 69 71 75 65 20 68 6f 73 74 20 49 44  s unique host ID
29fc0 20 28 73 65 65 20 62 65 6c 6f 77 29 20 61 6e 64   (see below) and
29fd0 20 6c 6f 63 6b 0a 2a 2a 20 70 72 6f 78 79 20 70   lock.** proxy p
29fe0 61 74 68 20 61 67 61 69 6e 73 74 20 74 68 65 20  ath against the 
29ff0 76 61 6c 75 65 73 20 73 74 6f 72 65 64 20 69 6e  values stored in
2a000 20 74 68 65 20 63 6f 6e 63 68 2e 20 20 54 68 65   the conch.  The
2a010 20 63 6f 6e 63 68 20 66 69 6c 65 20 69 73 0a 2a   conch file is.*
2a020 2a 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20  * stored in the 
2a030 73 61 6d 65 20 64 69 72 65 63 74 6f 72 79 20 61  same directory a
2a040 73 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  s the database f
2a050 69 6c 65 20 61 6e 64 20 74 68 65 20 66 69 6c 65  ile and the file
2a060 20 6e 61 6d 65 0a 2a 2a 20 69 73 20 70 61 74 74   name.** is patt
2a070 65 72 6e 65 64 20 61 66 74 65 72 20 74 68 65 20  erned after the 
2a080 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 6e 61  database file na
2a090 6d 65 20 61 73 20 22 2e 3c 64 61 74 61 62 61 73  me as ".<databas
2a0a0 65 6e 61 6d 65 3e 2d 63 6f 6e 63 68 22 2e 0a 2a  ename>-conch"..*
2a0b0 2a 20 49 66 20 74 68 65 20 63 6f 6e 63 68 20 66  * If the conch f
2a0c0 69 6c 65 20 64 6f 65 73 20 6e 6f 74 20 65 78 69  ile does not exi
2a0d0 73 74 2c 20 6f 72 20 69 74 27 73 20 63 6f 6e 74  st, or it's cont
2a0e0 65 6e 74 73 20 64 6f 20 6e 6f 74 20 6d 61 74 63  ents do not matc
2a0f0 68 20 74 68 65 0a 2a 2a 20 68 6f 73 74 20 49 44  h the.** host ID
2a100 20 61 6e 64 2f 6f 72 20 70 72 6f 78 79 20 70 61   and/or proxy pa
2a110 74 68 2c 20 74 68 65 6e 20 74 68 65 20 6c 6f 63  th, then the loc
2a120 6b 20 69 73 20 65 73 63 61 6c 61 74 65 64 20 74  k is escalated t
2a130 6f 20 61 6e 20 65 78 63 6c 75 73 69 76 65 0a 2a  o an exclusive.*
2a140 2a 20 6c 6f 63 6b 20 61 6e 64 20 74 68 65 20 63  * lock and the c
2a150 6f 6e 63 68 20 66 69 6c 65 20 63 6f 6e 74 65 6e  onch file conten
2a160 74 73 20 69 73 20 75 70 64 61 74 65 64 20 77 69  ts is updated wi
2a170 74 68 20 74 68 65 20 68 6f 73 74 20 49 44 20 61  th the host ID a
2a180 6e 64 20 70 72 6f 78 79 0a 2a 2a 20 70 61 74 68  nd proxy.** path
2a190 20 61 6e 64 20 74 68 65 20 6c 6f 63 6b 20 69 73   and the lock is
2a1a0 20 64 6f 77 6e 67 72 61 64 65 64 20 74 6f 20 61   downgraded to a
2a1b0 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 61 67 61   shared lock aga
2a1c0 69 6e 2e 20 20 49 66 20 74 68 65 20 63 6f 6e 63  in.  If the conc
2a1d0 68 0a 2a 2a 20 69 73 20 68 65 6c 64 20 62 79 20  h.** is held by 
2a1e0 61 6e 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20  another process 
2a1f0 28 77 69 74 68 20 61 20 73 68 61 72 65 64 20 6c  (with a shared l
2a200 6f 63 6b 29 2c 20 74 68 65 20 65 78 63 6c 75 73  ock), the exclus
2a210 69 76 65 20 6c 6f 63 6b 0a 2a 2a 20 77 69 6c 6c  ive lock.** will
2a220 20 66 61 69 6c 20 61 6e 64 20 53 51 4c 49 54 45   fail and SQLITE
2a230 5f 42 55 53 59 20 69 73 20 72 65 74 75 72 6e 65  _BUSY is returne
2a240 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 72 6f  d..**.** The pro
2a250 78 79 20 66 69 6c 65 20 2d 20 61 20 73 69 6e 67  xy file - a sing
2a260 6c 65 2d 62 79 74 65 20 66 69 6c 65 20 75 73 65  le-byte file use
2a270 64 20 66 6f 72 20 61 6c 6c 20 61 64 76 69 73 6f  d for all adviso
2a280 72 79 20 66 69 6c 65 20 6c 6f 63 6b 73 0a 2a 2a  ry file locks.**
2a290 20 6e 6f 72 6d 61 6c 6c 79 20 74 61 6b 65 6e 20   normally taken 
2a2a0 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  on the database 
2a2b0 66 69 6c 65 2e 20 20 20 54 68 69 73 20 61 6c 6c  file.   This all
2a2c0 6f 77 73 20 66 6f 72 20 73 61 66 65 20 73 68 61  ows for safe sha
2a2d0 72 69 6e 67 0a 2a 2a 20 6f 66 20 74 68 65 20 64  ring.** of the d
2a2e0 61 74 61 62 61 73 65 20 66 69 6c 65 20 66 6f 72  atabase file for
2a2f0 20 6d 75 6c 74 69 70 6c 65 20 72 65 61 64 65 72   multiple reader
2a300 73 20 61 6e 64 20 77 72 69 74 65 72 73 20 6f 6e  s and writers on
2a310 20 74 68 65 20 73 61 6d 65 0a 2a 2a 20 68 6f 73   the same.** hos
2a320 74 20 28 74 68 65 20 63 6f 6e 63 68 20 65 6e 73  t (the conch ens
2a330 75 72 65 73 20 74 68 61 74 20 74 68 65 79 20 61  ures that they a
2a340 6c 6c 20 75 73 65 20 74 68 65 20 73 61 6d 65 20  ll use the same 
2a350 6c 6f 63 61 6c 20 6c 6f 63 6b 20 66 69 6c 65 29  local lock file)
2a360 2e 0a 2a 2a 0a 2a 2a 20 52 65 71 75 65 73 74 69  ..**.** Requesti
2a370 6e 67 20 74 68 65 20 6c 6f 63 6b 20 70 72 6f 78  ng the lock prox
2a380 79 20 64 6f 65 73 20 6e 6f 74 20 69 6d 6d 65 64  y does not immed
2a390 69 61 74 65 6c 79 20 74 61 6b 65 20 74 68 65 20  iately take the 
2a3a0 63 6f 6e 63 68 2c 20 69 74 20 69 73 0a 2a 2a 20  conch, it is.** 
2a3b0 6f 6e 6c 79 20 74 61 6b 65 6e 20 77 68 65 6e 20  only taken when 
2a3c0 74 68 65 20 66 69 72 73 74 20 72 65 71 75 65 73  the first reques
2a3d0 74 20 74 6f 20 6c 6f 63 6b 20 64 61 74 61 62 61  t to lock databa
2a3e0 73 65 20 66 69 6c 65 20 69 73 20 6d 61 64 65 2e  se file is made.
2a3f0 20 20 0a 2a 2a 20 54 68 69 73 20 6d 61 74 63 68    .** This match
2a400 65 73 20 74 68 65 20 73 65 6d 61 6e 74 69 63 73  es the semantics
2a410 20 6f 66 20 74 68 65 20 74 72 61 64 69 74 69 6f   of the traditio
2a420 6e 61 6c 20 6c 6f 63 6b 69 6e 67 20 62 65 68 61  nal locking beha
2a430 76 69 6f 72 2c 20 77 68 65 72 65 0a 2a 2a 20 6f  vior, where.** o
2a440 70 65 6e 69 6e 67 20 61 20 63 6f 6e 6e 65 63 74  pening a connect
2a450 69 6f 6e 20 74 6f 20 61 20 64 61 74 61 62 61 73  ion to a databas
2a460 65 20 66 69 6c 65 20 64 6f 65 73 20 6e 6f 74 20  e file does not 
2a470 74 61 6b 65 20 61 20 6c 6f 63 6b 20 6f 6e 20 69  take a lock on i
2a480 74 2e 0a 2a 2a 20 54 68 65 20 73 68 61 72 65 64  t..** The shared
2a490 20 6c 6f 63 6b 20 61 6e 64 20 61 6e 20 6f 70 65   lock and an ope
2a4a0 6e 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  n file descripto
2a4b0 72 20 61 72 65 20 6d 61 69 6e 74 61 69 6e 65 64  r are maintained
2a4c0 20 75 6e 74 69 6c 20 0a 2a 2a 20 74 68 65 20 63   until .** the c
2a4d0 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 74 68 65  onnection to the
2a4e0 20 64 61 74 61 62 61 73 65 20 69 73 20 63 6c 6f   database is clo
2a4f0 73 65 64 2e 20 0a 2a 2a 0a 2a 2a 20 54 68 65 20  sed. .**.** The 
2a500 70 72 6f 78 79 20 66 69 6c 65 20 61 6e 64 20 74  proxy file and t
2a510 68 65 20 6c 6f 63 6b 20 66 69 6c 65 20 61 72 65  he lock file are
2a520 20 6e 65 76 65 72 20 64 65 6c 65 74 65 64 20 73   never deleted s
2a530 6f 20 74 68 65 79 20 6f 6e 6c 79 20 6e 65 65 64  o they only need
2a540 0a 2a 2a 20 74 6f 20 62 65 20 63 72 65 61 74 65  .** to be create
2a550 64 20 74 68 65 20 66 69 72 73 74 20 74 69 6d 65  d the first time
2a560 20 74 68 65 79 20 61 72 65 20 75 73 65 64 2e 0a   they are used..
2a570 2a 2a 0a 2a 2a 20 43 6f 6e 66 69 67 75 72 61 74  **.** Configurat
2a580 69 6f 6e 20 6f 70 74 69 6f 6e 73 0a 2a 2a 20 2d  ion options.** -
2a590 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2a5a0 2d 2d 2d 2d 0a 2a 2a 0a 2a 2a 20 20 53 51 4c 49  ----.**.**  SQLI
2a5b0 54 45 5f 50 52 45 46 45 52 5f 50 52 4f 58 59 5f  TE_PREFER_PROXY_
2a5c0 4c 4f 43 4b 49 4e 47 0a 2a 2a 0a 2a 2a 20 20 20  LOCKING.**.**   
2a5d0 20 20 20 20 44 61 74 61 62 61 73 65 20 66 69 6c      Database fil
2a5e0 65 73 20 61 63 63 65 73 73 65 64 20 6f 6e 20 6e  es accessed on n
2a5f0 6f 6e 2d 6c 6f 63 61 6c 20 66 69 6c 65 20 73 79  on-local file sy
2a600 73 74 65 6d 73 20 61 72 65 0a 2a 2a 20 20 20 20  stems are.**    
2a610 20 20 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79     automatically
2a620 20 63 6f 6e 66 69 67 75 72 65 64 20 66 6f 72 20   configured for 
2a630 70 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 2c 20 6c  proxy locking, l
2a640 6f 63 6b 20 66 69 6c 65 73 20 61 72 65 0a 2a 2a  ock files are.**
2a650 20 20 20 20 20 20 20 6e 61 6d 65 64 20 61 75 74         named aut
2a660 6f 6d 61 74 69 63 61 6c 6c 79 20 75 73 69 6e 67  omatically using
2a670 20 74 68 65 20 73 61 6d 65 20 6c 6f 67 69 63 20   the same logic 
2a680 61 73 0a 2a 2a 20 20 20 20 20 20 20 50 52 41 47  as.**       PRAG
2a690 4d 41 20 6c 6f 63 6b 5f 70 72 6f 78 79 5f 66 69  MA lock_proxy_fi
2a6a0 6c 65 3d 22 3a 61 75 74 6f 3a 22 0a 2a 2a 20 20  le=":auto:".**  
2a6b0 20 20 0a 2a 2a 20 20 53 51 4c 49 54 45 5f 50 52    .**  SQLITE_PR
2a6c0 4f 58 59 5f 44 45 42 55 47 0a 2a 2a 0a 2a 2a 20  OXY_DEBUG.**.** 
2a6d0 20 20 20 20 20 20 45 6e 61 62 6c 65 73 20 74 68        Enables th
2a6e0 65 20 6c 6f 67 67 69 6e 67 20 6f 66 20 65 72 72  e logging of err
2a6f0 6f 72 20 6d 65 73 73 61 67 65 73 20 64 75 72 69  or messages duri
2a700 6e 67 20 68 6f 73 74 20 69 64 20 66 69 6c 65 0a  ng host id file.
2a710 2a 2a 20 20 20 20 20 20 20 72 65 74 72 69 65 76  **       retriev
2a720 61 6c 20 61 6e 64 20 63 72 65 61 74 69 6f 6e 0a  al and creation.
2a730 2a 2a 0a 2a 2a 20 20 4c 4f 43 4b 50 52 4f 58 59  **.**  LOCKPROXY
2a740 44 49 52 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20  DIR.**.**       
2a750 4f 76 65 72 72 69 64 65 73 20 74 68 65 20 64 65  Overrides the de
2a760 66 61 75 6c 74 20 64 69 72 65 63 74 6f 72 79 20  fault directory 
2a770 75 73 65 64 20 66 6f 72 20 6c 6f 63 6b 20 70 72  used for lock pr
2a780 6f 78 79 20 66 69 6c 65 73 20 74 68 61 74 0a 2a  oxy files that.*
2a790 2a 20 20 20 20 20 20 20 61 72 65 20 6e 61 6d 65  *       are name
2a7a0 64 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20  d automatically 
2a7b0 76 69 61 20 74 68 65 20 22 3a 61 75 74 6f 3a 22  via the ":auto:"
2a7c0 20 73 65 74 74 69 6e 67 0a 2a 2a 0a 2a 2a 20 20   setting.**.**  
2a7d0 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 50  SQLITE_DEFAULT_P
2a7e0 52 4f 58 59 44 49 52 5f 50 45 52 4d 49 53 53 49  ROXYDIR_PERMISSI
2a7f0 4f 4e 53 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20  ONS.**.**       
2a800 50 65 72 6d 69 73 73 69 6f 6e 73 20 74 6f 20 75  Permissions to u
2a810 73 65 20 77 68 65 6e 20 63 72 65 61 74 69 6e 67  se when creating
2a820 20 61 20 64 69 72 65 63 74 6f 72 79 20 66 6f 72   a directory for
2a830 20 73 74 6f 72 69 6e 67 20 74 68 65 0a 2a 2a 20   storing the.** 
2a840 20 20 20 20 20 20 6c 6f 63 6b 20 70 72 6f 78 79        lock proxy
2a850 20 66 69 6c 65 73 2c 20 6f 6e 6c 79 20 75 73 65   files, only use
2a860 64 20 77 68 65 6e 20 4c 4f 43 4b 50 52 4f 58 59  d when LOCKPROXY
2a870 44 49 52 20 69 73 20 6e 6f 74 20 73 65 74 2e 0a  DIR is not set..
2a880 2a 2a 20 20 20 20 0a 2a 2a 20 20 20 20 0a 2a 2a  **    .**    .**
2a890 20 41 73 20 6d 65 6e 74 69 6f 6e 65 64 20 61 62   As mentioned ab
2a8a0 6f 76 65 2c 20 77 68 65 6e 20 63 6f 6d 70 69 6c  ove, when compil
2a8b0 65 64 20 77 69 74 68 20 53 51 4c 49 54 45 5f 50  ed with SQLITE_P
2a8c0 52 45 46 45 52 5f 50 52 4f 58 59 5f 4c 4f 43 4b  REFER_PROXY_LOCK
2a8d0 49 4e 47 2c 0a 2a 2a 20 73 65 74 74 69 6e 67 20  ING,.** setting 
2a8e0 74 68 65 20 65 6e 76 69 72 6f 6e 6d 65 6e 74 20  the environment 
2a8f0 76 61 72 69 61 62 6c 65 20 53 51 4c 49 54 45 5f  variable SQLITE_
2a900 46 4f 52 43 45 5f 50 52 4f 58 59 5f 4c 4f 43 4b  FORCE_PROXY_LOCK
2a910 49 4e 47 20 74 6f 20 31 20 77 69 6c 6c 0a 2a 2a  ING to 1 will.**
2a920 20 66 6f 72 63 65 20 70 72 6f 78 79 20 6c 6f 63   force proxy loc
2a930 6b 69 6e 67 20 74 6f 20 62 65 20 75 73 65 64 20  king to be used 
2a940 66 6f 72 20 65 76 65 72 79 20 64 61 74 61 62 61  for every databa
2a950 73 65 20 66 69 6c 65 20 6f 70 65 6e 65 64 2c 20  se file opened, 
2a960 61 6e 64 20 30 0a 2a 2a 20 77 69 6c 6c 20 66 6f  and 0.** will fo
2a970 72 63 65 20 61 75 74 6f 6d 61 74 69 63 20 70 72  rce automatic pr
2a980 6f 78 79 20 6c 6f 63 6b 69 6e 67 20 74 6f 20 62  oxy locking to b
2a990 65 20 64 69 73 61 62 6c 65 64 20 66 6f 72 20 61  e disabled for a
2a9a0 6c 6c 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 66  ll database.** f
2a9b0 69 6c 65 73 20 28 65 78 70 6c 69 63 69 74 79 20  iles (explicity 
2a9c0 63 61 6c 6c 69 6e 67 20 74 68 65 20 53 51 4c 49  calling the SQLI
2a9d0 54 45 5f 53 45 54 5f 4c 4f 43 4b 50 52 4f 58 59  TE_SET_LOCKPROXY
2a9e0 46 49 4c 45 20 70 72 61 67 6d 61 20 6f 72 0a 2a  FILE pragma or.*
2a9f0 2a 20 73 71 6c 69 74 65 5f 66 69 6c 65 5f 63 6f  * sqlite_file_co
2aa00 6e 74 72 6f 6c 20 41 50 49 20 69 73 20 6e 6f 74  ntrol API is not
2aa10 20 61 66 66 65 63 74 65 64 20 62 79 20 53 51 4c   affected by SQL
2aa20 49 54 45 5f 46 4f 52 43 45 5f 50 52 4f 58 59 5f  ITE_FORCE_PROXY_
2aa30 4c 4f 43 4b 49 4e 47 29 2e 0a 2a 2f 0a 0a 2f 2a  LOCKING)..*/../*
2aa40 0a 2a 2a 20 50 72 6f 78 79 20 6c 6f 63 6b 69 6e  .** Proxy lockin
2aa50 67 20 69 73 20 6f 6e 6c 79 20 61 76 61 69 6c 61  g is only availa
2aa60 62 6c 65 20 6f 6e 20 4d 61 63 4f 53 58 20 0a 2a  ble on MacOSX .*
2aa70 2f 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f 5f  /.#if defined(__
2aa80 41 50 50 4c 45 5f 5f 29 20 26 26 20 53 51 4c 49  APPLE__) && SQLI
2aa90 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e  TE_ENABLE_LOCKIN
2aaa0 47 5f 53 54 59 4c 45 0a 0a 2f 2a 0a 2a 2a 20 54  G_STYLE../*.** T
2aab0 68 65 20 70 72 6f 78 79 4c 6f 63 6b 69 6e 67 43  he proxyLockingC
2aac0 6f 6e 74 65 78 74 20 68 61 73 20 74 68 65 20 70  ontext has the p
2aad0 61 74 68 20 61 6e 64 20 66 69 6c 65 20 73 74 72  ath and file str
2aae0 75 63 74 75 72 65 73 20 66 6f 72 20 74 68 65 20  uctures for the 
2aaf0 72 65 6d 6f 74 65 20 0a 2a 2a 20 61 6e 64 20 6c  remote .** and l
2ab00 6f 63 61 6c 20 70 72 6f 78 79 20 66 69 6c 65 73  ocal proxy files
2ab10 20 69 6e 20 69 74 0a 2a 2f 0a 74 79 70 65 64 65   in it.*/.typede
2ab20 66 20 73 74 72 75 63 74 20 70 72 6f 78 79 4c 6f  f struct proxyLo
2ab30 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 70 72 6f  ckingContext pro
2ab40 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  xyLockingContext
2ab50 3b 0a 73 74 72 75 63 74 20 70 72 6f 78 79 4c 6f  ;.struct proxyLo
2ab60 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 7b 0a 20  ckingContext {. 
2ab70 20 75 6e 69 78 46 69 6c 65 20 2a 63 6f 6e 63 68   unixFile *conch
2ab80 46 69 6c 65 3b 20 20 20 20 20 20 20 20 20 2f 2a  File;         /*
2ab90 20 4f 70 65 6e 20 63 6f 6e 63 68 20 66 69 6c 65   Open conch file
2aba0 20 2a 2f 0a 20 20 63 68 61 72 20 2a 63 6f 6e 63   */.  char *conc
2abb0 68 46 69 6c 65 50 61 74 68 3b 20 20 20 20 20 20  hFilePath;      
2abc0 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68     /* Name of th
2abd0 65 20 63 6f 6e 63 68 20 66 69 6c 65 20 2a 2f 0a  e conch file */.
2abe0 20 20 75 6e 69 78 46 69 6c 65 20 2a 6c 6f 63 6b    unixFile *lock
2abf0 50 72 6f 78 79 3b 20 20 20 20 20 20 20 20 20 2f  Proxy;         /
2ac00 2a 20 4f 70 65 6e 20 70 72 6f 78 79 20 6c 6f 63  * Open proxy loc
2ac10 6b 20 66 69 6c 65 20 2a 2f 0a 20 20 63 68 61 72  k file */.  char
2ac20 20 2a 6c 6f 63 6b 50 72 6f 78 79 50 61 74 68 3b   *lockProxyPath;
2ac30 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65           /* Name
2ac40 20 6f 66 20 74 68 65 20 70 72 6f 78 79 20 6c 6f   of the proxy lo
2ac50 63 6b 20 66 69 6c 65 20 2a 2f 0a 20 20 63 68 61  ck file */.  cha
2ac60 72 20 2a 64 62 50 61 74 68 3b 20 20 20 20 20 20  r *dbPath;      
2ac70 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d            /* Nam
2ac80 65 20 6f 66 20 74 68 65 20 6f 70 65 6e 20 66 69  e of the open fi
2ac90 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 63 6f 6e 63  le */.  int conc
2aca0 68 48 65 6c 64 3b 20 20 20 20 20 20 20 20 20 20  hHeld;          
2acb0 20 20 20 20 20 2f 2a 20 31 20 69 66 20 74 68 65       /* 1 if the
2acc0 20 63 6f 6e 63 68 20 69 73 20 68 65 6c 64 2c 20   conch is held, 
2acd0 2d 31 20 69 66 20 6c 6f 63 6b 6c 65 73 73 20 2a  -1 if lockless *
2ace0 2f 0a 20 20 76 6f 69 64 20 2a 6f 6c 64 4c 6f 63  /.  void *oldLoc
2acf0 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 20 20 20 20  kingContext;    
2ad00 20 2f 2a 20 4f 72 69 67 69 6e 61 6c 20 6c 6f 63   /* Original loc
2ad10 6b 69 6e 67 63 6f 6e 74 65 78 74 20 74 6f 20 72  kingcontext to r
2ad20 65 73 74 6f 72 65 20 6f 6e 20 63 6c 6f 73 65 20  estore on close 
2ad30 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 69 6f 5f  */.  sqlite3_io_
2ad40 6d 65 74 68 6f 64 73 20 63 6f 6e 73 74 20 2a 70  methods const *p
2ad50 4f 6c 64 4d 65 74 68 6f 64 3b 20 20 20 20 20 2f  OldMethod;     /
2ad60 2a 20 4f 72 69 67 69 6e 61 6c 20 49 2f 4f 20 6d  * Original I/O m
2ad70 65 74 68 6f 64 73 20 66 6f 72 20 63 6c 6f 73 65  ethods for close
2ad80 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 20 0a 2a 2a 20 54   */.};../* .** T
2ad90 68 65 20 70 72 6f 78 79 20 6c 6f 63 6b 20 66 69  he proxy lock fi
2ada0 6c 65 20 70 61 74 68 20 66 6f 72 20 74 68 65 20  le path for the 
2adb0 64 61 74 61 62 61 73 65 20 61 74 20 64 62 50 61  database at dbPa
2adc0 74 68 20 69 73 20 77 72 69 74 74 65 6e 20 69 6e  th is written in
2add0 74 6f 20 6c 50 61 74 68 2c 20 0a 2a 2a 20 77 68  to lPath, .** wh
2ade0 69 63 68 20 6d 75 73 74 20 70 6f 69 6e 74 20 74  ich must point t
2adf0 6f 20 76 61 6c 69 64 2c 20 77 72 69 74 61 62 6c  o valid, writabl
2ae00 65 20 6d 65 6d 6f 72 79 20 6c 61 72 67 65 20 65  e memory large e
2ae10 6e 6f 75 67 68 20 66 6f 72 20 61 20 6d 61 78 4c  nough for a maxL
2ae20 65 6e 20 6c 65 6e 67 74 68 0a 2a 2a 20 66 69 6c  en length.** fil
2ae30 65 20 70 61 74 68 2e 20 0a 2a 2f 0a 73 74 61 74  e path. .*/.stat
2ae40 69 63 20 69 6e 74 20 70 72 6f 78 79 47 65 74 4c  ic int proxyGetL
2ae50 6f 63 6b 50 61 74 68 28 63 6f 6e 73 74 20 63 68  ockPath(const ch
2ae60 61 72 20 2a 64 62 50 61 74 68 2c 20 63 68 61 72  ar *dbPath, char
2ae70 20 2a 6c 50 61 74 68 2c 20 73 69 7a 65 5f 74 20   *lPath, size_t 
2ae80 6d 61 78 4c 65 6e 29 7b 0a 20 20 69 6e 74 20 6c  maxLen){.  int l
2ae90 65 6e 3b 0a 20 20 69 6e 74 20 64 62 4c 65 6e 3b  en;.  int dbLen;
2aea0 0a 20 20 69 6e 74 20 69 3b 0a 0a 23 69 66 64 65  .  int i;..#ifde
2aeb0 66 20 4c 4f 43 4b 50 52 4f 58 59 44 49 52 0a 20  f LOCKPROXYDIR. 
2aec0 20 6c 65 6e 20 3d 20 73 74 72 6c 63 70 79 28 6c   len = strlcpy(l
2aed0 50 61 74 68 2c 20 4c 4f 43 4b 50 52 4f 58 59 44  Path, LOCKPROXYD
2aee0 49 52 2c 20 6d 61 78 4c 65 6e 29 3b 0a 23 65 6c  IR, maxLen);.#el
2aef0 73 65 0a 23 20 69 66 64 65 66 20 5f 43 53 5f 44  se.# ifdef _CS_D
2af00 41 52 57 49 4e 5f 55 53 45 52 5f 54 45 4d 50 5f  ARWIN_USER_TEMP_
2af10 44 49 52 0a 20 20 7b 0a 20 20 20 20 69 66 28 20  DIR.  {.    if( 
2af20 21 63 6f 6e 66 73 74 72 28 5f 43 53 5f 44 41 52  !confstr(_CS_DAR
2af30 57 49 4e 5f 55 53 45 52 5f 54 45 4d 50 5f 44 49  WIN_USER_TEMP_DI
2af40 52 2c 20 6c 50 61 74 68 2c 20 6d 61 78 4c 65 6e  R, lPath, maxLen
2af50 29 20 29 7b 0a 20 20 20 20 20 20 4f 53 54 52 41  ) ){.      OSTRA
2af60 43 45 28 28 22 47 45 54 4c 4f 43 4b 50 41 54 48  CE(("GETLOCKPATH
2af70 20 20 66 61 69 6c 65 64 20 25 73 20 65 72 72 6e    failed %s errn
2af80 6f 3d 25 64 20 70 69 64 3d 25 64 5c 6e 22 2c 0a  o=%d pid=%d\n",.
2af90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6c                 l
2afa0 50 61 74 68 2c 20 65 72 72 6e 6f 2c 20 67 65 74  Path, errno, get
2afb0 70 69 64 28 29 29 29 3b 0a 20 20 20 20 20 20 72  pid()));.      r
2afc0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45  eturn SQLITE_IOE
2afd0 52 52 5f 4c 4f 43 4b 3b 0a 20 20 20 20 7d 0a 20  RR_LOCK;.    }. 
2afe0 20 20 20 6c 65 6e 20 3d 20 73 74 72 6c 63 61 74     len = strlcat
2aff0 28 6c 50 61 74 68 2c 20 22 73 71 6c 69 74 65 70  (lPath, "sqlitep
2b000 6c 6f 63 6b 73 22 2c 20 6d 61 78 4c 65 6e 29 3b  locks", maxLen);
2b010 20 20 20 20 0a 20 20 7d 0a 23 20 65 6c 73 65 0a      .  }.# else.
2b020 20 20 6c 65 6e 20 3d 20 73 74 72 6c 63 70 79 28    len = strlcpy(
2b030 6c 50 61 74 68 2c 20 22 2f 74 6d 70 2f 22 2c 20  lPath, "/tmp/", 
2b040 6d 61 78 4c 65 6e 29 3b 0a 23 20 65 6e 64 69 66  maxLen);.# endif
2b050 0a 23 65 6e 64 69 66 0a 0a 20 20 69 66 28 20 6c  .#endif..  if( l
2b060 50 61 74 68 5b 6c 65 6e 2d 31 5d 21 3d 27 2f 27  Path[len-1]!='/'
2b070 20 29 7b 0a 20 20 20 20 6c 65 6e 20 3d 20 73 74   ){.    len = st
2b080 72 6c 63 61 74 28 6c 50 61 74 68 2c 20 22 2f 22  rlcat(lPath, "/"
2b090 2c 20 6d 61 78 4c 65 6e 29 3b 0a 20 20 7d 0a 20  , maxLen);.  }. 
2b0a0 20 0a 20 20 2f 2a 20 74 72 61 6e 73 66 6f 72 6d   .  /* transform
2b0b0 20 74 68 65 20 64 62 20 70 61 74 68 20 74 6f 20   the db path to 
2b0c0 61 20 75 6e 69 71 75 65 20 63 61 63 68 65 20 6e  a unique cache n
2b0d0 61 6d 65 20 2a 2f 0a 20 20 64 62 4c 65 6e 20 3d  ame */.  dbLen =
2b0e0 20 28 69 6e 74 29 73 74 72 6c 65 6e 28 64 62 50   (int)strlen(dbP
2b0f0 61 74 68 29 3b 0a 20 20 66 6f 72 28 20 69 3d 30  ath);.  for( i=0
2b100 3b 20 69 3c 64 62 4c 65 6e 20 26 26 20 28 69 2b  ; i<dbLen && (i+
2b110 6c 65 6e 2b 37 29 3c 6d 61 78 4c 65 6e 3b 20 69  len+7)<maxLen; i
2b120 2b 2b 29 7b 0a 20 20 20 20 63 68 61 72 20 63 20  ++){.    char c 
2b130 3d 20 64 62 50 61 74 68 5b 69 5d 3b 0a 20 20 20  = dbPath[i];.   
2b140 20 6c 50 61 74 68 5b 69 2b 6c 65 6e 5d 20 3d 20   lPath[i+len] = 
2b150 28 63 3d 3d 27 2f 27 29 3f 27 5f 27 3a 63 3b 0a  (c=='/')?'_':c;.
2b160 20 20 7d 0a 20 20 6c 50 61 74 68 5b 69 2b 6c 65    }.  lPath[i+le
2b170 6e 5d 3d 27 5c 30 27 3b 0a 20 20 73 74 72 6c 63  n]='\0';.  strlc
2b180 61 74 28 6c 50 61 74 68 2c 20 22 3a 61 75 74 6f  at(lPath, ":auto
2b190 3a 22 2c 20 6d 61 78 4c 65 6e 29 3b 0a 20 20 4f  :", maxLen);.  O
2b1a0 53 54 52 41 43 45 28 28 22 47 45 54 4c 4f 43 4b  STRACE(("GETLOCK
2b1b0 50 41 54 48 20 20 70 72 6f 78 79 20 6c 6f 63 6b  PATH  proxy lock
2b1c0 20 70 61 74 68 3d 25 73 20 70 69 64 3d 25 64 5c   path=%s pid=%d\
2b1d0 6e 22 2c 20 6c 50 61 74 68 2c 20 67 65 74 70 69  n", lPath, getpi
2b1e0 64 28 29 29 29 3b 0a 20 20 72 65 74 75 72 6e 20  d()));.  return 
2b1f0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
2b200 20 0a 20 2a 2a 20 43 72 65 61 74 65 73 20 74 68   . ** Creates th
2b210 65 20 6c 6f 63 6b 20 66 69 6c 65 20 61 6e 64 20  e lock file and 
2b220 61 6e 79 20 6d 69 73 73 69 6e 67 20 64 69 72 65  any missing dire
2b230 63 74 6f 72 69 65 73 20 69 6e 20 6c 6f 63 6b 50  ctories in lockP
2b240 61 74 68 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69  ath. */.static i
2b250 6e 74 20 70 72 6f 78 79 43 72 65 61 74 65 4c 6f  nt proxyCreateLo
2b260 63 6b 50 61 74 68 28 63 6f 6e 73 74 20 63 68 61  ckPath(const cha
2b270 72 20 2a 6c 6f 63 6b 50 61 74 68 29 7b 0a 20 20  r *lockPath){.  
2b280 69 6e 74 20 69 2c 20 6c 65 6e 3b 0a 20 20 63 68  int i, len;.  ch
2b290 61 72 20 62 75 66 5b 4d 41 58 50 41 54 48 4c 45  ar buf[MAXPATHLE
2b2a0 4e 5d 3b 0a 20 20 69 6e 74 20 73 74 61 72 74 20  N];.  int start 
2b2b0 3d 20 30 3b 0a 20 20 0a 20 20 61 73 73 65 72 74  = 0;.  .  assert
2b2c0 28 6c 6f 63 6b 50 61 74 68 21 3d 4e 55 4c 4c 29  (lockPath!=NULL)
2b2d0 3b 0a 20 20 2f 2a 20 74 72 79 20 74 6f 20 63 72  ;.  /* try to cr
2b2e0 65 61 74 65 20 61 6c 6c 20 74 68 65 20 69 6e 74  eate all the int
2b2f0 65 72 6d 65 64 69 61 74 65 20 64 69 72 65 63 74  ermediate direct
2b300 6f 72 69 65 73 20 2a 2f 0a 20 20 6c 65 6e 20 3d  ories */.  len =
2b310 20 28 69 6e 74 29 73 74 72 6c 65 6e 28 6c 6f 63   (int)strlen(loc
2b320 6b 50 61 74 68 29 3b 0a 20 20 62 75 66 5b 30 5d  kPath);.  buf[0]
2b330 20 3d 20 6c 6f 63 6b 50 61 74 68 5b 30 5d 3b 0a   = lockPath[0];.
2b340 20 20 66 6f 72 28 20 69 3d 31 3b 20 69 3c 6c 65    for( i=1; i<le
2b350 6e 3b 20 69 2b 2b 20 29 7b 0a 20 20 20 20 69 66  n; i++ ){.    if
2b360 28 20 6c 6f 63 6b 50 61 74 68 5b 69 5d 20 3d 3d  ( lockPath[i] ==
2b370 20 27 2f 27 20 26 26 20 28 69 20 2d 20 73 74 61   '/' && (i - sta
2b380 72 74 20 3e 20 30 29 20 29 7b 0a 20 20 20 20 20  rt > 0) ){.     
2b390 20 2f 2a 20 6f 6e 6c 79 20 6d 6b 64 69 72 20 69   /* only mkdir i
2b3a0 66 20 6c 65 61 66 20 64 69 72 20 21 3d 20 22 2e  f leaf dir != ".
2b3b0 22 20 6f 72 20 22 2f 22 20 6f 72 20 22 2e 2e 22  " or "/" or ".."
2b3c0 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 69 2d   */.      if( i-
2b3d0 73 74 61 72 74 3e 32 20 7c 7c 20 28 69 2d 73 74  start>2 || (i-st
2b3e0 61 72 74 3d 3d 31 20 26 26 20 62 75 66 5b 73 74  art==1 && buf[st
2b3f0 61 72 74 5d 20 21 3d 20 27 2e 27 20 26 26 20 62  art] != '.' && b
2b400 75 66 5b 73 74 61 72 74 5d 20 21 3d 20 27 2f 27  uf[start] != '/'
2b410 29 20 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 28  ) .         || (
2b420 69 2d 73 74 61 72 74 3d 3d 32 20 26 26 20 62 75  i-start==2 && bu
2b430 66 5b 73 74 61 72 74 5d 20 21 3d 20 27 2e 27 20  f[start] != '.' 
2b440 26 26 20 62 75 66 5b 73 74 61 72 74 2b 31 5d 20  && buf[start+1] 
2b450 21 3d 20 27 2e 27 29 20 29 7b 0a 20 20 20 20 20  != '.') ){.     
2b460 20 20 20 62 75 66 5b 69 5d 3d 27 5c 30 27 3b 0a     buf[i]='\0';.
2b470 20 20 20 20 20 20 20 20 69 66 28 20 6d 6b 64 69          if( mkdi
2b480 72 28 62 75 66 2c 20 53 51 4c 49 54 45 5f 44 45  r(buf, SQLITE_DE
2b490 46 41 55 4c 54 5f 50 52 4f 58 59 44 49 52 5f 50  FAULT_PROXYDIR_P
2b4a0 45 52 4d 49 53 53 49 4f 4e 53 29 20 29 7b 0a 20  ERMISSIONS) ){. 
2b4b0 20 20 20 20 20 20 20 20 20 69 6e 74 20 65 72 72           int err
2b4c0 3d 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20 20 20  =errno;.        
2b4d0 20 20 69 66 28 20 65 72 72 21 3d 45 45 58 49 53    if( err!=EEXIS
2b4e0 54 20 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20  T ) {.          
2b4f0 20 20 4f 53 54 52 41 43 45 28 28 22 43 52 45 41    OSTRACE(("CREA
2b500 54 45 4c 4f 43 4b 50 41 54 48 20 20 46 41 49 4c  TELOCKPATH  FAIL
2b510 45 44 20 63 72 65 61 74 69 6e 67 20 25 73 2c 20  ED creating %s, 
2b520 22 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ".              
2b530 20 20 20 20 20 20 20 22 27 25 73 27 20 70 72 6f         "'%s' pro
2b540 78 79 20 6c 6f 63 6b 20 70 61 74 68 3d 25 73 20  xy lock path=%s 
2b550 70 69 64 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20  pid=%d\n",.     
2b560 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b570 62 75 66 2c 20 73 74 72 65 72 72 6f 72 28 65 72  buf, strerror(er
2b580 72 29 2c 20 6c 6f 63 6b 50 61 74 68 2c 20 67 65  r), lockPath, ge
2b590 74 70 69 64 28 29 29 29 3b 0a 20 20 20 20 20 20  tpid()));.      
2b5a0 20 20 20 20 20 20 72 65 74 75 72 6e 20 65 72 72        return err
2b5b0 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
2b5c0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
2b5d0 20 20 20 20 20 20 73 74 61 72 74 3d 69 2b 31 3b        start=i+1;
2b5e0 0a 20 20 20 20 7d 0a 20 20 20 20 62 75 66 5b 69  .    }.    buf[i
2b5f0 5d 20 3d 20 6c 6f 63 6b 50 61 74 68 5b 69 5d 3b  ] = lockPath[i];
2b600 0a 20 20 7d 0a 20 20 4f 53 54 52 41 43 45 28 28  .  }.  OSTRACE((
2b610 22 43 52 45 41 54 45 4c 4f 43 4b 50 41 54 48 20  "CREATELOCKPATH 
2b620 20 70 72 6f 78 79 20 6c 6f 63 6b 20 70 61 74 68   proxy lock path
2b630 3d 25 73 20 70 69 64 3d 25 64 5c 6e 22 2c 20 6c  =%s pid=%d\n", l
2b640 6f 63 6b 50 61 74 68 2c 20 67 65 74 70 69 64 28  ockPath, getpid(
2b650 29 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b  )));.  return 0;
2b660 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65  .}../*.** Create
2b670 20 61 20 6e 65 77 20 56 46 53 20 66 69 6c 65 20   a new VFS file 
2b680 64 65 73 63 72 69 70 74 6f 72 20 28 73 74 6f 72  descriptor (stor
2b690 65 64 20 69 6e 20 6d 65 6d 6f 72 79 20 6f 62 74  ed in memory obt
2b6a0 61 69 6e 65 64 20 66 72 6f 6d 0a 2a 2a 20 73 71  ained from.** sq
2b6b0 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 29 20 61 6e  lite3_malloc) an
2b6c0 64 20 6f 70 65 6e 20 74 68 65 20 66 69 6c 65 20  d open the file 
2b6d0 6e 61 6d 65 64 20 22 70 61 74 68 22 20 69 6e 20  named "path" in 
2b6e0 74 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70  the file descrip
2b6f0 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63  tor..**.** The c
2b700 61 6c 6c 65 72 20 69 73 20 72 65 73 70 6f 6e 73  aller is respons
2b710 69 62 6c 65 20 6e 6f 74 20 6f 6e 6c 79 20 66 6f  ible not only fo
2b720 72 20 63 6c 6f 73 69 6e 67 20 74 68 65 20 66 69  r closing the fi
2b730 6c 65 20 64 65 73 63 72 69 70 74 6f 72 0a 2a 2a  le descriptor.**
2b740 20 62 75 74 20 61 6c 73 6f 20 66 6f 72 20 66 72   but also for fr
2b750 65 65 69 6e 67 20 74 68 65 20 6d 65 6d 6f 72 79  eeing the memory
2b760 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
2b770 20 74 68 65 20 66 69 6c 65 20 64 65 73 63 72 69   the file descri
2b780 70 74 6f 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ptor..*/.static 
2b790 69 6e 74 20 70 72 6f 78 79 43 72 65 61 74 65 55  int proxyCreateU
2b7a0 6e 69 78 46 69 6c 65 28 0a 20 20 20 20 63 6f 6e  nixFile(.    con
2b7b0 73 74 20 63 68 61 72 20 2a 70 61 74 68 2c 20 20  st char *path,  
2b7c0 20 20 20 20 20 20 2f 2a 20 70 61 74 68 20 66 6f        /* path fo
2b7d0 72 20 74 68 65 20 6e 65 77 20 75 6e 69 78 46 69  r the new unixFi
2b7e0 6c 65 20 2a 2f 0a 20 20 20 20 75 6e 69 78 46 69  le */.    unixFi
2b7f0 6c 65 20 2a 2a 70 70 46 69 6c 65 2c 20 20 20 20  le **ppFile,    
2b800 20 20 20 2f 2a 20 75 6e 69 78 46 69 6c 65 20 63     /* unixFile c
2b810 72 65 61 74 65 64 20 61 6e 64 20 72 65 74 75 72  reated and retur
2b820 6e 65 64 20 62 79 20 72 65 66 20 2a 2f 0a 20 20  ned by ref */.  
2b830 20 20 69 6e 74 20 69 73 6c 6f 63 6b 66 69 6c 65    int islockfile
2b840 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 69 66             /* if
2b850 20 6e 6f 6e 20 7a 65 72 6f 20 6d 69 73 73 69 6e   non zero missin
2b860 67 20 64 69 72 73 20 77 69 6c 6c 20 62 65 20 63  g dirs will be c
2b870 72 65 61 74 65 64 20 2a 2f 0a 29 20 7b 0a 20 20  reated */.) {.  
2b880 69 6e 74 20 66 64 20 3d 20 2d 31 3b 0a 20 20 69  int fd = -1;.  i
2b890 6e 74 20 64 69 72 66 64 20 3d 20 2d 31 3b 0a 20  nt dirfd = -1;. 
2b8a0 20 75 6e 69 78 46 69 6c 65 20 2a 70 4e 65 77 3b   unixFile *pNew;
2b8b0 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
2b8c0 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 6f 70 65  TE_OK;.  int ope
2b8d0 6e 46 6c 61 67 73 20 3d 20 4f 5f 52 44 57 52 20  nFlags = O_RDWR 
2b8e0 7c 20 4f 5f 43 52 45 41 54 3b 0a 20 20 73 71 6c  | O_CREAT;.  sql
2b8f0 69 74 65 33 5f 76 66 73 20 64 75 6d 6d 79 56 66  ite3_vfs dummyVf
2b900 73 3b 0a 20 20 69 6e 74 20 74 65 72 72 6e 6f 20  s;.  int terrno 
2b910 3d 20 30 3b 0a 20 20 55 6e 69 78 55 6e 75 73 65  = 0;.  UnixUnuse
2b920 64 46 64 20 2a 70 55 6e 75 73 65 64 20 3d 20 4e  dFd *pUnused = N
2b930 55 4c 4c 3b 0a 0a 20 20 2f 2a 20 31 2e 20 66 69  ULL;..  /* 1. fi
2b940 72 73 74 20 74 72 79 20 74 6f 20 6f 70 65 6e 2f  rst try to open/
2b950 63 72 65 61 74 65 20 74 68 65 20 66 69 6c 65 0a  create the file.
2b960 20 20 2a 2a 20 32 2e 20 69 66 20 74 68 61 74 20    ** 2. if that 
2b970 66 61 69 6c 73 2c 20 61 6e 64 20 74 68 69 73 20  fails, and this 
2b980 69 73 20 61 20 6c 6f 63 6b 20 66 69 6c 65 20 28  is a lock file (
2b990 6e 6f 74 2d 63 6f 6e 63 68 29 2c 20 74 72 79 20  not-conch), try 
2b9a0 63 72 65 61 74 69 6e 67 0a 20 20 2a 2a 20 74 68  creating.  ** th
2b9b0 65 20 70 61 72 65 6e 74 20 64 69 72 65 63 74 6f  e parent directo
2b9c0 72 69 65 73 20 61 6e 64 20 74 68 65 6e 20 74 72  ries and then tr
2b9d0 79 20 61 67 61 69 6e 2e 0a 20 20 2a 2a 20 33 2e  y again..  ** 3.
2b9e0 20 69 66 20 74 68 61 74 20 66 61 69 6c 73 2c 20   if that fails, 
2b9f0 74 72 79 20 74 6f 20 6f 70 65 6e 20 74 68 65 20  try to open the 
2ba00 66 69 6c 65 20 72 65 61 64 2d 6f 6e 6c 79 0a 20  file read-only. 
2ba10 20 2a 2a 20 6f 74 68 65 72 77 69 73 65 20 72 65   ** otherwise re
2ba20 74 75 72 6e 20 42 55 53 59 20 28 69 66 20 6c 6f  turn BUSY (if lo
2ba30 63 6b 20 66 69 6c 65 29 20 6f 72 20 43 41 4e 54  ck file) or CANT
2ba40 4f 50 45 4e 20 66 6f 72 20 74 68 65 20 63 6f 6e  OPEN for the con
2ba50 63 68 20 66 69 6c 65 0a 20 20 2a 2f 0a 20 20 70  ch file.  */.  p
2ba60 55 6e 75 73 65 64 20 3d 20 66 69 6e 64 52 65 75  Unused = findReu
2ba70 73 61 62 6c 65 46 64 28 70 61 74 68 2c 20 6f 70  sableFd(path, op
2ba80 65 6e 46 6c 61 67 73 29 3b 0a 20 20 69 66 28 20  enFlags);.  if( 
2ba90 70 55 6e 75 73 65 64 20 29 7b 0a 20 20 20 20 66  pUnused ){.    f
2baa0 64 20 3d 20 70 55 6e 75 73 65 64 2d 3e 66 64 3b  d = pUnused->fd;
2bab0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 55  .  }else{.    pU
2bac0 6e 75 73 65 64 20 3d 20 73 71 6c 69 74 65 33 5f  nused = sqlite3_
2bad0 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 2a 70  malloc(sizeof(*p
2bae0 55 6e 75 73 65 64 29 29 3b 0a 20 20 20 20 69 66  Unused));.    if
2baf0 28 20 21 70 55 6e 75 73 65 64 20 29 7b 0a 20 20  ( !pUnused ){.  
2bb00 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
2bb10 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20  E_NOMEM;.    }. 
2bb20 20 7d 0a 20 20 69 66 28 20 66 64 3c 30 20 29 7b   }.  if( fd<0 ){
2bb30 0a 20 20 20 20 66 64 20 3d 20 6f 70 65 6e 28 70  .    fd = open(p
2bb40 61 74 68 2c 20 6f 70 65 6e 46 6c 61 67 73 2c 20  ath, openFlags, 
2bb50 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 46  SQLITE_DEFAULT_F
2bb60 49 4c 45 5f 50 45 52 4d 49 53 53 49 4f 4e 53 29  ILE_PERMISSIONS)
2bb70 3b 0a 20 20 20 20 74 65 72 72 6e 6f 20 3d 20 65  ;.    terrno = e
2bb80 72 72 6e 6f 3b 0a 20 20 20 20 69 66 28 20 66 64  rrno;.    if( fd
2bb90 3c 30 20 26 26 20 65 72 72 6e 6f 3d 3d 45 4e 4f  <0 && errno==ENO
2bba0 45 4e 54 20 26 26 20 69 73 6c 6f 63 6b 66 69 6c  ENT && islockfil
2bbb0 65 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  e ){.      if( p
2bbc0 72 6f 78 79 43 72 65 61 74 65 4c 6f 63 6b 50 61  roxyCreateLockPa
2bbd0 74 68 28 70 61 74 68 29 20 3d 3d 20 53 51 4c 49  th(path) == SQLI
2bbe0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
2bbf0 20 66 64 20 3d 20 6f 70 65 6e 28 70 61 74 68 2c   fd = open(path,
2bc00 20 6f 70 65 6e 46 6c 61 67 73 2c 20 53 51 4c 49   openFlags, SQLI
2bc10 54 45 5f 44 45 46 41 55 4c 54 5f 46 49 4c 45 5f  TE_DEFAULT_FILE_
2bc20 50 45 52 4d 49 53 53 49 4f 4e 53 29 3b 0a 20 20  PERMISSIONS);.  
2bc30 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
2bc40 20 20 69 66 28 20 66 64 3c 30 20 29 7b 0a 20 20    if( fd<0 ){.  
2bc50 20 20 6f 70 65 6e 46 6c 61 67 73 20 3d 20 4f 5f    openFlags = O_
2bc60 52 44 4f 4e 4c 59 3b 0a 20 20 20 20 66 64 20 3d  RDONLY;.    fd =
2bc70 20 6f 70 65 6e 28 70 61 74 68 2c 20 6f 70 65 6e   open(path, open
2bc80 46 6c 61 67 73 2c 20 53 51 4c 49 54 45 5f 44 45  Flags, SQLITE_DE
2bc90 46 41 55 4c 54 5f 46 49 4c 45 5f 50 45 52 4d 49  FAULT_FILE_PERMI
2bca0 53 53 49 4f 4e 53 29 3b 0a 20 20 20 20 74 65 72  SSIONS);.    ter
2bcb0 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 7d  rno = errno;.  }
2bcc0 0a 20 20 69 66 28 20 66 64 3c 30 20 29 7b 0a 20  .  if( fd<0 ){. 
2bcd0 20 20 20 69 66 28 20 69 73 6c 6f 63 6b 66 69 6c     if( islockfil
2bce0 65 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  e ){.      retur
2bcf0 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20  n SQLITE_BUSY;. 
2bd00 20 20 20 7d 0a 20 20 20 20 73 77 69 74 63 68 20     }.    switch 
2bd10 28 74 65 72 72 6e 6f 29 20 7b 0a 20 20 20 20 20  (terrno) {.     
2bd20 20 63 61 73 65 20 45 41 43 43 45 53 3a 0a 20 20   case EACCES:.  
2bd30 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
2bd40 49 54 45 5f 50 45 52 4d 3b 0a 20 20 20 20 20 20  ITE_PERM;.      
2bd50 63 61 73 65 20 45 49 4f 3a 20 0a 20 20 20 20 20  case EIO: .     
2bd60 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
2bd70 5f 49 4f 45 52 52 5f 4c 4f 43 4b 3b 20 2f 2a 20  _IOERR_LOCK; /* 
2bd80 65 76 65 6e 20 74 68 6f 75 67 68 20 69 74 20 69  even though it i
2bd90 73 20 74 68 65 20 63 6f 6e 63 68 20 2a 2f 0a 20  s the conch */. 
2bda0 20 20 20 20 20 64 65 66 61 75 6c 74 3a 0a 20 20       default:.  
2bdb0 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
2bdc0 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 42 4b 50  ITE_CANTOPEN_BKP
2bdd0 54 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 0a  T;.    }.  }.  .
2bde0 20 20 70 4e 65 77 20 3d 20 28 75 6e 69 78 46 69    pNew = (unixFi
2bdf0 6c 65 20 2a 29 73 71 6c 69 74 65 33 5f 6d 61 6c  le *)sqlite3_mal
2be00 6c 6f 63 28 73 69 7a 65 6f 66 28 2a 70 4e 65 77  loc(sizeof(*pNew
2be10 29 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d  ));.  if( pNew==
2be20 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 72 63 20 3d  NULL ){.    rc =
2be30 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
2be40 20 20 20 67 6f 74 6f 20 65 6e 64 5f 63 72 65 61     goto end_crea
2be50 74 65 5f 70 72 6f 78 79 3b 0a 20 20 7d 0a 20 20  te_proxy;.  }.  
2be60 6d 65 6d 73 65 74 28 70 4e 65 77 2c 20 30 2c 20  memset(pNew, 0, 
2be70 73 69 7a 65 6f 66 28 75 6e 69 78 46 69 6c 65 29  sizeof(unixFile)
2be80 29 3b 0a 20 20 70 4e 65 77 2d 3e 6f 70 65 6e 46  );.  pNew->openF
2be90 6c 61 67 73 20 3d 20 6f 70 65 6e 46 6c 61 67 73  lags = openFlags
2bea0 3b 0a 20 20 64 75 6d 6d 79 56 66 73 2e 70 41 70  ;.  dummyVfs.pAp
2beb0 70 44 61 74 61 20 3d 20 28 76 6f 69 64 2a 29 26  pData = (void*)&
2bec0 61 75 74 6f 6c 6f 63 6b 49 6f 46 69 6e 64 65 72  autolockIoFinder
2bed0 3b 0a 20 20 70 55 6e 75 73 65 64 2d 3e 66 64 20  ;.  pUnused->fd 
2bee0 3d 20 66 64 3b 0a 20 20 70 55 6e 75 73 65 64 2d  = fd;.  pUnused-
2bef0 3e 66 6c 61 67 73 20 3d 20 6f 70 65 6e 46 6c 61  >flags = openFla
2bf00 67 73 3b 0a 20 20 70 4e 65 77 2d 3e 70 55 6e 75  gs;.  pNew->pUnu
2bf10 73 65 64 20 3d 20 70 55 6e 75 73 65 64 3b 0a 20  sed = pUnused;. 
2bf20 20 0a 20 20 72 63 20 3d 20 66 69 6c 6c 49 6e 55   .  rc = fillInU
2bf30 6e 69 78 46 69 6c 65 28 26 64 75 6d 6d 79 56 66  nixFile(&dummyVf
2bf40 73 2c 20 66 64 2c 20 64 69 72 66 64 2c 20 28 73  s, fd, dirfd, (s
2bf50 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29 70 4e 65  qlite3_file*)pNe
2bf60 77 2c 20 70 61 74 68 2c 20 30 2c 20 30 29 3b 0a  w, path, 0, 0);.
2bf70 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
2bf80 5f 4f 4b 20 29 7b 0a 20 20 20 20 2a 70 70 46 69  _OK ){.    *ppFi
2bf90 6c 65 20 3d 20 70 4e 65 77 3b 0a 20 20 20 20 72  le = pNew;.    r
2bfa0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
2bfb0 0a 20 20 7d 0a 65 6e 64 5f 63 72 65 61 74 65 5f  .  }.end_create_
2bfc0 70 72 6f 78 79 3a 20 20 20 20 0a 20 20 63 6c 6f  proxy:    .  clo
2bfd0 73 65 28 66 64 29 3b 20 2f 2a 20 73 69 6c 65 6e  se(fd); /* silen
2bfe0 74 6c 79 20 6c 65 61 6b 20 66 64 20 69 66 20 65  tly leak fd if e
2bff0 72 72 6f 72 2c 20 77 65 27 72 65 20 61 6c 72 65  rror, we're alre
2c000 61 64 79 20 69 6e 20 65 72 72 6f 72 20 2a 2f 0a  ady in error */.
2c010 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
2c020 4e 65 77 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f  New);.  sqlite3_
2c030 66 72 65 65 28 70 55 6e 75 73 65 64 29 3b 0a 20  free(pUnused);. 
2c040 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23   return rc;.}..#
2c050 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53  ifdef SQLITE_TES
2c060 54 0a 2f 2a 20 73 69 6d 75 6c 61 74 65 20 6d 75  T./* simulate mu
2c070 6c 74 69 70 6c 65 20 68 6f 73 74 73 20 62 79 20  ltiple hosts by 
2c080 63 72 65 61 74 69 6e 67 20 75 6e 69 71 75 65 20  creating unique 
2c090 68 6f 73 74 69 64 20 66 69 6c 65 20 70 61 74 68  hostid file path
2c0a0 73 20 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  s */.int sqlite3
2c0b0 5f 68 6f 73 74 69 64 5f 6e 75 6d 20 3d 20 30 3b  _hostid_num = 0;
2c0c0 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65  .#endif..#define
2c0d0 20 50 52 4f 58 59 5f 48 4f 53 54 49 44 4c 45 4e   PROXY_HOSTIDLEN
2c0e0 20 20 20 20 31 36 20 20 2f 2a 20 63 6f 6e 63 68      16  /* conch
2c0f0 20 66 69 6c 65 20 68 6f 73 74 20 69 64 20 6c 65   file host id le
2c100 6e 67 74 68 20 2a 2f 0a 0a 2f 2a 20 67 65 74 20  ngth */../* get 
2c110 74 68 65 20 68 6f 73 74 20 49 44 20 76 69 61 20  the host ID via 
2c120 67 65 74 68 6f 73 74 75 75 69 64 28 29 2c 20 70  gethostuuid(), p
2c130 48 6f 73 74 49 44 20 6d 75 73 74 20 70 6f 69 6e  HostID must poin
2c140 74 20 74 6f 20 50 52 4f 58 59 5f 48 4f 53 54 49  t to PROXY_HOSTI
2c150 44 4c 45 4e 20 0a 2a 2a 20 62 79 74 65 73 20 6f  DLEN .** bytes o
2c160 66 20 77 72 69 74 61 62 6c 65 20 6d 65 6d 6f 72  f writable memor
2c170 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  y..*/.static int
2c180 20 70 72 6f 78 79 47 65 74 48 6f 73 74 49 44 28   proxyGetHostID(
2c190 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70  unsigned char *p
2c1a0 48 6f 73 74 49 44 2c 20 69 6e 74 20 2a 70 45 72  HostID, int *pEr
2c1b0 72 6f 72 29 7b 0a 20 20 73 74 72 75 63 74 20 74  ror){.  struct t
2c1c0 69 6d 65 73 70 65 63 20 74 69 6d 65 6f 75 74 20  imespec timeout 
2c1d0 3d 20 7b 31 2c 20 30 7d 3b 20 2f 2a 20 31 20 73  = {1, 0}; /* 1 s
2c1e0 65 63 20 74 69 6d 65 6f 75 74 20 2a 2f 0a 20 20  ec timeout */.  
2c1f0 0a 20 20 61 73 73 65 72 74 28 50 52 4f 58 59 5f  .  assert(PROXY_
2c200 48 4f 53 54 49 44 4c 45 4e 20 3d 3d 20 73 69 7a  HOSTIDLEN == siz
2c210 65 6f 66 28 75 75 69 64 5f 74 29 29 3b 0a 20 20  eof(uuid_t));.  
2c220 6d 65 6d 73 65 74 28 70 48 6f 73 74 49 44 2c 20  memset(pHostID, 
2c230 30 2c 20 50 52 4f 58 59 5f 48 4f 53 54 49 44 4c  0, PROXY_HOSTIDL
2c240 45 4e 29 3b 0a 20 20 69 66 28 20 67 65 74 68 6f  EN);.  if( getho
2c250 73 74 75 75 69 64 28 70 48 6f 73 74 49 44 2c 20  stuuid(pHostID, 
2c260 26 74 69 6d 65 6f 75 74 29 20 29 7b 0a 20 20 20  &timeout) ){.   
2c270 20 69 6e 74 20 65 72 72 20 3d 20 65 72 72 6e 6f   int err = errno
2c280 3b 0a 20 20 20 20 69 66 28 20 70 45 72 72 6f 72  ;.    if( pError
2c290 20 29 7b 0a 20 20 20 20 20 20 2a 70 45 72 72 6f   ){.      *pErro
2c2a0 72 20 3d 20 65 72 72 3b 0a 20 20 20 20 7d 0a 20  r = err;.    }. 
2c2b0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
2c2c0 5f 49 4f 45 52 52 3b 0a 20 20 7d 0a 23 69 66 64  _IOERR;.  }.#ifd
2c2d0 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20  ef SQLITE_TEST. 
2c2e0 20 2f 2a 20 73 69 6d 75 6c 61 74 65 20 6d 75 6c   /* simulate mul
2c2f0 74 69 70 6c 65 20 68 6f 73 74 73 20 62 79 20 63  tiple hosts by c
2c300 72 65 61 74 69 6e 67 20 75 6e 69 71 75 65 20 68  reating unique h
2c310 6f 73 74 69 64 20 66 69 6c 65 20 70 61 74 68 73  ostid file paths
2c320 20 2a 2f 0a 20 20 69 66 28 20 73 71 6c 69 74 65   */.  if( sqlite
2c330 33 5f 68 6f 73 74 69 64 5f 6e 75 6d 20 21 3d 20  3_hostid_num != 
2c340 30 29 7b 0a 20 20 20 20 70 48 6f 73 74 49 44 5b  0){.    pHostID[
2c350 30 5d 20 3d 20 28 63 68 61 72 29 28 70 48 6f 73  0] = (char)(pHos
2c360 74 49 44 5b 30 5d 20 2b 20 28 63 68 61 72 29 28  tID[0] + (char)(
2c370 73 71 6c 69 74 65 33 5f 68 6f 73 74 69 64 5f 6e  sqlite3_hostid_n
2c380 75 6d 20 26 20 30 78 46 46 29 29 3b 0a 20 20 7d  um & 0xFF));.  }
2c390 0a 23 65 6e 64 69 66 0a 20 20 0a 20 20 72 65 74  .#endif.  .  ret
2c3a0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
2c3b0 0a 0a 2f 2a 20 54 68 65 20 63 6f 6e 63 68 20 66  ../* The conch f
2c3c0 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 74 68 65  ile contains the
2c3d0 20 68 65 61 64 65 72 2c 20 68 6f 73 74 20 69 64   header, host id
2c3e0 20 61 6e 64 20 6c 6f 63 6b 20 66 69 6c 65 20 70   and lock file p
2c3f0 61 74 68 0a 20 2a 2f 0a 23 64 65 66 69 6e 65 20  ath. */.#define 
2c400 50 52 4f 58 59 5f 43 4f 4e 43 48 56 45 52 53 49  PROXY_CONCHVERSI
2c410 4f 4e 20 32 20 20 20 2f 2a 20 31 2d 62 79 74 65  ON 2   /* 1-byte
2c420 20 68 65 61 64 65 72 2c 20 31 36 2d 62 79 74 65   header, 16-byte
2c430 20 68 6f 73 74 20 69 64 2c 20 70 61 74 68 20 2a   host id, path *
2c440 2f 0a 23 64 65 66 69 6e 65 20 50 52 4f 58 59 5f  /.#define PROXY_
2c450 48 45 41 44 45 52 4c 45 4e 20 20 20 20 31 20 20  HEADERLEN    1  
2c460 20 2f 2a 20 63 6f 6e 63 68 20 66 69 6c 65 20 68   /* conch file h
2c470 65 61 64 65 72 20 6c 65 6e 67 74 68 20 2a 2f 0a  eader length */.
2c480 23 64 65 66 69 6e 65 20 50 52 4f 58 59 5f 50 41  #define PROXY_PA
2c490 54 48 49 4e 44 45 58 20 20 20 20 28 50 52 4f 58  THINDEX    (PROX
2c4a0 59 5f 48 45 41 44 45 52 4c 45 4e 2b 50 52 4f 58  Y_HEADERLEN+PROX
2c4b0 59 5f 48 4f 53 54 49 44 4c 45 4e 29 0a 23 64 65  Y_HOSTIDLEN).#de
2c4c0 66 69 6e 65 20 50 52 4f 58 59 5f 4d 41 58 43 4f  fine PROXY_MAXCO
2c4d0 4e 43 48 4c 45 4e 20 20 28 50 52 4f 58 59 5f 48  NCHLEN  (PROXY_H
2c4e0 45 41 44 45 52 4c 45 4e 2b 50 52 4f 58 59 5f 48  EADERLEN+PROXY_H
2c4f0 4f 53 54 49 44 4c 45 4e 2b 4d 41 58 50 41 54 48  OSTIDLEN+MAXPATH
2c500 4c 45 4e 29 0a 0a 2f 2a 20 0a 2a 2a 20 54 61 6b  LEN)../* .** Tak
2c510 65 73 20 61 6e 20 6f 70 65 6e 20 63 6f 6e 63 68  es an open conch
2c520 20 66 69 6c 65 2c 20 63 6f 70 69 65 73 20 74 68   file, copies th
2c530 65 20 63 6f 6e 74 65 6e 74 73 20 74 6f 20 61 20  e contents to a 
2c540 6e 65 77 20 70 61 74 68 20 61 6e 64 20 74 68 65  new path and the
2c550 6e 20 6d 6f 76 65 73 20 0a 2a 2a 20 69 74 20 62  n moves .** it b
2c560 61 63 6b 2e 20 20 54 68 65 20 6e 65 77 6c 79 20  ack.  The newly 
2c570 63 72 65 61 74 65 64 20 66 69 6c 65 27 73 20 66  created file's f
2c580 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 69  ile descriptor i
2c590 73 20 61 73 73 69 67 6e 65 64 20 74 6f 20 74 68  s assigned to th
2c5a0 65 0a 2a 2a 20 63 6f 6e 63 68 20 66 69 6c 65 20  e.** conch file 
2c5b0 73 74 72 75 63 74 75 72 65 20 61 6e 64 20 66 69  structure and fi
2c5c0 6e 61 6c 6c 79 20 74 68 65 20 6f 72 69 67 69 6e  nally the origin
2c5d0 61 6c 20 63 6f 6e 63 68 20 66 69 6c 65 20 64 65  al conch file de
2c5e0 73 63 72 69 70 74 6f 72 20 69 73 20 0a 2a 2a 20  scriptor is .** 
2c5f0 63 6c 6f 73 65 64 2e 20 20 52 65 74 75 72 6e 73  closed.  Returns
2c600 20 7a 65 72 6f 20 69 66 20 73 75 63 63 65 73 73   zero if success
2c610 66 75 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ful..*/.static i
2c620 6e 74 20 70 72 6f 78 79 42 72 65 61 6b 43 6f 6e  nt proxyBreakCon
2c630 63 68 4c 6f 63 6b 28 75 6e 69 78 46 69 6c 65 20  chLock(unixFile 
2c640 2a 70 46 69 6c 65 2c 20 75 75 69 64 5f 74 20 6d  *pFile, uuid_t m
2c650 79 48 6f 73 74 49 44 29 7b 0a 20 20 70 72 6f 78  yHostID){.  prox
2c660 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20  yLockingContext 
2c670 2a 70 43 74 78 20 3d 20 28 70 72 6f 78 79 4c 6f  *pCtx = (proxyLo
2c680 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 29 70  ckingContext *)p
2c690 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e  File->lockingCon
2c6a0 74 65 78 74 3b 20 0a 20 20 75 6e 69 78 46 69 6c  text; .  unixFil
2c6b0 65 20 2a 63 6f 6e 63 68 46 69 6c 65 20 3d 20 70  e *conchFile = p
2c6c0 43 74 78 2d 3e 63 6f 6e 63 68 46 69 6c 65 3b 0a  Ctx->conchFile;.
2c6d0 20 20 63 68 61 72 20 74 50 61 74 68 5b 4d 41 58    char tPath[MAX
2c6e0 50 41 54 48 4c 45 4e 5d 3b 0a 20 20 63 68 61 72  PATHLEN];.  char
2c6f0 20 62 75 66 5b 50 52 4f 58 59 5f 4d 41 58 43 4f   buf[PROXY_MAXCO
2c700 4e 43 48 4c 45 4e 5d 3b 0a 20 20 63 68 61 72 20  NCHLEN];.  char 
2c710 2a 63 50 61 74 68 20 3d 20 70 43 74 78 2d 3e 63  *cPath = pCtx->c
2c720 6f 6e 63 68 46 69 6c 65 50 61 74 68 3b 0a 20 20  onchFilePath;.  
2c730 73 69 7a 65 5f 74 20 72 65 61 64 4c 65 6e 20 3d  size_t readLen =
2c740 20 30 3b 0a 20 20 73 69 7a 65 5f 74 20 70 61 74   0;.  size_t pat
2c750 68 4c 65 6e 20 3d 20 30 3b 0a 20 20 63 68 61 72  hLen = 0;.  char
2c760 20 65 72 72 6d 73 67 5b 36 34 5d 20 3d 20 22 22   errmsg[64] = ""
2c770 3b 0a 20 20 69 6e 74 20 66 64 20 3d 20 2d 31 3b  ;.  int fd = -1;
2c780 0a 20 20 69 6e 74 20 72 63 20 3d 20 2d 31 3b 0a  .  int rc = -1;.
2c790 0a 20 20 2f 2a 20 63 72 65 61 74 65 20 61 20 6e  .  /* create a n
2c7a0 65 77 20 70 61 74 68 20 62 79 20 72 65 70 6c 61  ew path by repla
2c7b0 63 65 20 74 68 65 20 74 72 61 69 6c 69 6e 67 20  ce the trailing 
2c7c0 27 2d 63 6f 6e 63 68 27 20 77 69 74 68 20 27 2d  '-conch' with '-
2c7d0 62 72 65 61 6b 27 20 2a 2f 0a 20 20 70 61 74 68  break' */.  path
2c7e0 4c 65 6e 20 3d 20 73 74 72 6c 63 70 79 28 74 50  Len = strlcpy(tP
2c7f0 61 74 68 2c 20 63 50 61 74 68 2c 20 4d 41 58 50  ath, cPath, MAXP
2c800 41 54 48 4c 45 4e 29 3b 0a 20 20 69 66 28 20 70  ATHLEN);.  if( p
2c810 61 74 68 4c 65 6e 3e 4d 41 58 50 41 54 48 4c 45  athLen>MAXPATHLE
2c820 4e 20 7c 7c 20 70 61 74 68 4c 65 6e 3c 36 20 7c  N || pathLen<6 |
2c830 7c 20 0a 20 20 20 20 20 28 73 74 72 6c 63 70 79  | .     (strlcpy
2c840 28 26 74 50 61 74 68 5b 70 61 74 68 4c 65 6e 2d  (&tPath[pathLen-
2c850 35 5d 2c 20 22 62 72 65 61 6b 22 2c 20 36 29 20  5], "break", 6) 
2c860 21 3d 20 35 29 20 29 7b 0a 20 20 20 20 73 70 72  != 5) ){.    spr
2c870 69 6e 74 66 28 65 72 72 6d 73 67 2c 20 22 70 61  intf(errmsg, "pa
2c880 74 68 20 65 72 72 6f 72 20 28 6c 65 6e 20 25 64  th error (len %d
2c890 29 22 2c 20 28 69 6e 74 29 70 61 74 68 4c 65 6e  )", (int)pathLen
2c8a0 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f  );.    goto end_
2c8b0 62 72 65 61 6b 6c 6f 63 6b 3b 0a 20 20 7d 0a 20  breaklock;.  }. 
2c8c0 20 2f 2a 20 72 65 61 64 20 74 68 65 20 63 6f 6e   /* read the con
2c8d0 63 68 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a 20 20  ch content */.  
2c8e0 72 65 61 64 4c 65 6e 20 3d 20 70 72 65 61 64 28  readLen = pread(
2c8f0 63 6f 6e 63 68 46 69 6c 65 2d 3e 68 2c 20 62 75  conchFile->h, bu
2c900 66 2c 20 50 52 4f 58 59 5f 4d 41 58 43 4f 4e 43  f, PROXY_MAXCONC
2c910 48 4c 45 4e 2c 20 30 29 3b 0a 20 20 69 66 28 20  HLEN, 0);.  if( 
2c920 72 65 61 64 4c 65 6e 3c 50 52 4f 58 59 5f 50 41  readLen<PROXY_PA
2c930 54 48 49 4e 44 45 58 20 29 7b 0a 20 20 20 20 73  THINDEX ){.    s
2c940 70 72 69 6e 74 66 28 65 72 72 6d 73 67 2c 20 22  printf(errmsg, "
2c950 72 65 61 64 20 65 72 72 6f 72 20 28 6c 65 6e 20  read error (len 
2c960 25 64 29 22 2c 20 28 69 6e 74 29 72 65 61 64 4c  %d)", (int)readL
2c970 65 6e 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65 6e  en);.    goto en
2c980 64 5f 62 72 65 61 6b 6c 6f 63 6b 3b 0a 20 20 7d  d_breaklock;.  }
2c990 0a 20 20 2f 2a 20 77 72 69 74 65 20 69 74 20 6f  .  /* write it o
2c9a0 75 74 20 74 6f 20 74 68 65 20 74 65 6d 70 6f 72  ut to the tempor
2c9b0 61 72 79 20 62 72 65 61 6b 20 66 69 6c 65 20 2a  ary break file *
2c9c0 2f 0a 20 20 66 64 20 3d 20 6f 70 65 6e 28 74 50  /.  fd = open(tP
2c9d0 61 74 68 2c 20 28 4f 5f 52 44 57 52 7c 4f 5f 43  ath, (O_RDWR|O_C
2c9e0 52 45 41 54 7c 4f 5f 45 58 43 4c 29 2c 20 53 51  REAT|O_EXCL), SQ
2c9f0 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 46 49 4c  LITE_DEFAULT_FIL
2ca00 45 5f 50 45 52 4d 49 53 53 49 4f 4e 53 29 3b 0a  E_PERMISSIONS);.
2ca10 20 20 69 66 28 20 66 64 3c 30 20 29 7b 0a 20 20    if( fd<0 ){.  
2ca20 20 20 73 70 72 69 6e 74 66 28 65 72 72 6d 73 67    sprintf(errmsg
2ca30 2c 20 22 63 72 65 61 74 65 20 66 61 69 6c 65 64  , "create failed
2ca40 20 28 25 64 29 22 2c 20 65 72 72 6e 6f 29 3b 0a   (%d)", errno);.
2ca50 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 62 72 65      goto end_bre
2ca60 61 6b 6c 6f 63 6b 3b 0a 20 20 7d 0a 20 20 69 66  aklock;.  }.  if
2ca70 28 20 70 77 72 69 74 65 28 66 64 2c 20 62 75 66  ( pwrite(fd, buf
2ca80 2c 20 72 65 61 64 4c 65 6e 2c 20 30 29 20 21 3d  , readLen, 0) !=
2ca90 20 72 65 61 64 4c 65 6e 20 29 7b 0a 20 20 20 20   readLen ){.    
2caa0 73 70 72 69 6e 74 66 28 65 72 72 6d 73 67 2c 20  sprintf(errmsg, 
2cab0 22 77 72 69 74 65 20 66 61 69 6c 65 64 20 28 25  "write failed (%
2cac0 64 29 22 2c 20 65 72 72 6e 6f 29 3b 0a 20 20 20  d)", errno);.   
2cad0 20 67 6f 74 6f 20 65 6e 64 5f 62 72 65 61 6b 6c   goto end_breakl
2cae0 6f 63 6b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72  ock;.  }.  if( r
2caf0 65 6e 61 6d 65 28 74 50 61 74 68 2c 20 63 50 61  ename(tPath, cPa
2cb00 74 68 29 20 29 7b 0a 20 20 20 20 73 70 72 69 6e  th) ){.    sprin
2cb10 74 66 28 65 72 72 6d 73 67 2c 20 22 72 65 6e 61  tf(errmsg, "rena
2cb20 6d 65 20 66 61 69 6c 65 64 20 28 25 64 29 22 2c  me failed (%d)",
2cb30 20 65 72 72 6e 6f 29 3b 0a 20 20 20 20 67 6f 74   errno);.    got
2cb40 6f 20 65 6e 64 5f 62 72 65 61 6b 6c 6f 63 6b 3b  o end_breaklock;
2cb50 0a 20 20 7d 0a 20 20 72 63 20 3d 20 30 3b 0a 20  .  }.  rc = 0;. 
2cb60 20 66 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c   fprintf(stderr,
2cb70 20 22 62 72 6f 6b 65 20 73 74 61 6c 65 20 6c 6f   "broke stale lo
2cb80 63 6b 20 6f 6e 20 25 73 5c 6e 22 2c 20 63 50 61  ck on %s\n", cPa
2cb90 74 68 29 3b 0a 20 20 63 6c 6f 73 65 28 63 6f 6e  th);.  close(con
2cba0 63 68 46 69 6c 65 2d 3e 68 29 3b 0a 20 20 63 6f  chFile->h);.  co
2cbb0 6e 63 68 46 69 6c 65 2d 3e 68 20 3d 20 66 64 3b  nchFile->h = fd;
2cbc0 0a 20 20 63 6f 6e 63 68 46 69 6c 65 2d 3e 6f 70  .  conchFile->op
2cbd0 65 6e 46 6c 61 67 73 20 3d 20 4f 5f 52 44 57 52  enFlags = O_RDWR
2cbe0 20 7c 20 4f 5f 43 52 45 41 54 3b 0a 0a 65 6e 64   | O_CREAT;..end
2cbf0 5f 62 72 65 61 6b 6c 6f 63 6b 3a 0a 20 20 69 66  _breaklock:.  if
2cc00 28 20 72 63 20 29 7b 0a 20 20 20 20 69 66 28 20  ( rc ){.    if( 
2cc10 66 64 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 75  fd>=0 ){.      u
2cc20 6e 6c 69 6e 6b 28 74 50 61 74 68 29 3b 0a 20 20  nlink(tPath);.  
2cc30 20 20 20 20 63 6c 6f 73 65 28 66 64 29 3b 0a 20      close(fd);. 
2cc40 20 20 20 7d 0a 20 20 20 20 66 70 72 69 6e 74 66     }.    fprintf
2cc50 28 73 74 64 65 72 72 2c 20 22 66 61 69 6c 65 64  (stderr, "failed
2cc60 20 74 6f 20 62 72 65 61 6b 20 73 74 61 6c 65 20   to break stale 
2cc70 6c 6f 63 6b 20 6f 6e 20 25 73 2c 20 25 73 5c 6e  lock on %s, %s\n
2cc80 22 2c 20 63 50 61 74 68 2c 20 65 72 72 6d 73 67  ", cPath, errmsg
2cc90 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
2cca0 72 63 3b 0a 7d 0a 0a 2f 2a 20 54 61 6b 65 20 74  rc;.}../* Take t
2ccb0 68 65 20 72 65 71 75 65 73 74 65 64 20 6c 6f 63  he requested loc
2ccc0 6b 20 6f 6e 20 74 68 65 20 63 6f 6e 63 68 20 66  k on the conch f
2ccd0 69 6c 65 20 61 6e 64 20 62 72 65 61 6b 20 61 20  ile and break a 
2cce0 73 74 61 6c 65 20 6c 6f 63 6b 20 69 66 20 74 68  stale lock if th
2ccf0 65 20 0a 2a 2a 20 68 6f 73 74 20 69 64 20 6d 61  e .** host id ma
2cd00 74 63 68 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  tches..*/.static
2cd10 20 69 6e 74 20 70 72 6f 78 79 43 6f 6e 63 68 4c   int proxyConchL
2cd20 6f 63 6b 28 75 6e 69 78 46 69 6c 65 20 2a 70 46  ock(unixFile *pF
2cd30 69 6c 65 2c 20 75 75 69 64 5f 74 20 6d 79 48 6f  ile, uuid_t myHo
2cd40 73 74 49 44 2c 20 69 6e 74 20 6c 6f 63 6b 54 79  stID, int lockTy
2cd50 70 65 29 7b 0a 20 20 70 72 6f 78 79 4c 6f 63 6b  pe){.  proxyLock
2cd60 69 6e 67 43 6f 6e 74 65 78 74 20 2a 70 43 74 78  ingContext *pCtx
2cd70 20 3d 20 28 70 72 6f 78 79 4c 6f 63 6b 69 6e 67   = (proxyLocking
2cd80 43 6f 6e 74 65 78 74 20 2a 29 70 46 69 6c 65 2d  Context *)pFile-
2cd90 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b  >lockingContext;
2cda0 20 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 63 6f   .  unixFile *co
2cdb0 6e 63 68 46 69 6c 65 20 3d 20 70 43 74 78 2d 3e  nchFile = pCtx->
2cdc0 63 6f 6e 63 68 46 69 6c 65 3b 0a 20 20 69 6e 74  conchFile;.  int
2cdd0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
2cde0 0a 20 20 69 6e 74 20 6e 54 72 69 65 73 20 3d 20  .  int nTries = 
2cdf0 30 3b 0a 20 20 73 74 72 75 63 74 20 74 69 6d 65  0;.  struct time
2ce00 73 70 65 63 20 63 6f 6e 63 68 4d 6f 64 54 69 6d  spec conchModTim
2ce10 65 3b 0a 20 20 0a 20 20 64 6f 20 7b 0a 20 20 20  e;.  .  do {.   
2ce20 20 72 63 20 3d 20 63 6f 6e 63 68 46 69 6c 65 2d   rc = conchFile-
2ce30 3e 70 4d 65 74 68 6f 64 2d 3e 78 4c 6f 63 6b 28  >pMethod->xLock(
2ce40 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29 63  (sqlite3_file*)c
2ce50 6f 6e 63 68 46 69 6c 65 2c 20 6c 6f 63 6b 54 79  onchFile, lockTy
2ce60 70 65 29 3b 0a 20 20 20 20 6e 54 72 69 65 73 20  pe);.    nTries 
2ce70 2b 2b 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d  ++;.    if( rc==
2ce80 53 51 4c 49 54 45 5f 42 55 53 59 20 29 7b 0a 20  SQLITE_BUSY ){. 
2ce90 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 6c       /* If the l
2cea0 6f 63 6b 20 66 61 69 6c 65 64 20 28 62 75 73 79  ock failed (busy
2ceb0 29 3a 0a 20 20 20 20 20 20 20 2a 20 31 73 74 20  ):.       * 1st 
2cec0 74 72 79 3a 20 67 65 74 20 74 68 65 20 6d 6f 64  try: get the mod
2ced0 20 74 69 6d 65 20 6f 66 20 74 68 65 20 63 6f 6e   time of the con
2cee0 63 68 2c 20 77 61 69 74 20 30 2e 35 73 20 61 6e  ch, wait 0.5s an
2cef0 64 20 74 72 79 20 61 67 61 69 6e 2e 20 0a 20 20  d try again. .  
2cf00 20 20 20 20 20 2a 20 32 6e 64 20 74 72 79 3a 20       * 2nd try: 
2cf10 66 61 69 6c 20 69 66 20 74 68 65 20 6d 6f 64 20  fail if the mod 
2cf20 74 69 6d 65 20 63 68 61 6e 67 65 64 20 6f 72 20  time changed or 
2cf30 68 6f 73 74 20 69 64 20 69 73 20 64 69 66 66 65  host id is diffe
2cf40 72 65 6e 74 2c 20 77 61 69 74 20 0a 20 20 20 20  rent, wait .    
2cf50 20 20 20 2a 20 20 20 20 20 20 20 20 20 20 20 31     *           1
2cf60 30 20 73 65 63 20 61 6e 64 20 74 72 79 20 61 67  0 sec and try ag
2cf70 61 69 6e 0a 20 20 20 20 20 20 20 2a 20 33 72 64  ain.       * 3rd
2cf80 20 74 72 79 3a 20 62 72 65 61 6b 20 74 68 65 20   try: break the 
2cf90 6c 6f 63 6b 20 75 6e 6c 65 73 73 20 74 68 65 20  lock unless the 
2cfa0 6d 6f 64 20 74 69 6d 65 20 68 61 73 20 63 68 61  mod time has cha
2cfb0 6e 67 65 64 2e 0a 20 20 20 20 20 20 20 2a 2f 0a  nged..       */.
2cfc0 20 20 20 20 20 20 73 74 72 75 63 74 20 73 74 61        struct sta
2cfd0 74 20 62 75 66 3b 0a 20 20 20 20 20 20 69 66 28  t buf;.      if(
2cfe0 20 66 73 74 61 74 28 63 6f 6e 63 68 46 69 6c 65   fstat(conchFile
2cff0 2d 3e 68 2c 20 26 62 75 66 29 20 29 7b 0a 20 20  ->h, &buf) ){.  
2d000 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73        pFile->las
2d010 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a  tErrno = errno;.
2d020 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53          return S
2d030 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b  QLITE_IOERR_LOCK
2d040 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
2d050 0a 20 20 20 20 20 20 69 66 28 20 6e 54 72 69 65  .      if( nTrie
2d060 73 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 20 20  s==1 ){.        
2d070 63 6f 6e 63 68 4d 6f 64 54 69 6d 65 20 3d 20 62  conchModTime = b
2d080 75 66 2e 73 74 5f 6d 74 69 6d 65 73 70 65 63 3b  uf.st_mtimespec;
2d090 0a 20 20 20 20 20 20 20 20 75 73 6c 65 65 70 28  .        usleep(
2d0a0 35 30 30 30 30 30 29 3b 20 2f 2a 20 77 61 69 74  500000); /* wait
2d0b0 20 30 2e 35 20 73 65 63 20 61 6e 64 20 74 72 79   0.5 sec and try
2d0c0 20 74 68 65 20 6c 6f 63 6b 20 61 67 61 69 6e 2a   the lock again*
2d0d0 2f 0a 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e  /.        contin
2d0e0 75 65 3b 20 20 0a 20 20 20 20 20 20 7d 0a 0a 20  ue;  .      }.. 
2d0f0 20 20 20 20 20 61 73 73 65 72 74 28 20 6e 54 72       assert( nTr
2d100 69 65 73 3e 31 20 29 3b 0a 20 20 20 20 20 20 69  ies>1 );.      i
2d110 66 28 20 63 6f 6e 63 68 4d 6f 64 54 69 6d 65 2e  f( conchModTime.
2d120 74 76 5f 73 65 63 20 21 3d 20 62 75 66 2e 73 74  tv_sec != buf.st
2d130 5f 6d 74 69 6d 65 73 70 65 63 2e 74 76 5f 73 65  _mtimespec.tv_se
2d140 63 20 7c 7c 20 0a 20 20 20 20 20 20 20 20 20 63  c || .         c
2d150 6f 6e 63 68 4d 6f 64 54 69 6d 65 2e 74 76 5f 6e  onchModTime.tv_n
2d160 73 65 63 20 21 3d 20 62 75 66 2e 73 74 5f 6d 74  sec != buf.st_mt
2d170 69 6d 65 73 70 65 63 2e 74 76 5f 6e 73 65 63 20  imespec.tv_nsec 
2d180 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  ){.        retur
2d190 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20  n SQLITE_BUSY;. 
2d1a0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 0a 20 20       }.      .  
2d1b0 20 20 20 20 69 66 28 20 6e 54 72 69 65 73 3d 3d      if( nTries==
2d1c0 32 20 29 7b 20 20 0a 20 20 20 20 20 20 20 20 63  2 ){  .        c
2d1d0 68 61 72 20 74 42 75 66 5b 50 52 4f 58 59 5f 4d  har tBuf[PROXY_M
2d1e0 41 58 43 4f 4e 43 48 4c 45 4e 5d 3b 0a 20 20 20  AXCONCHLEN];.   
2d1f0 20 20 20 20 20 69 6e 74 20 6c 65 6e 20 3d 20 70       int len = p
2d200 72 65 61 64 28 63 6f 6e 63 68 46 69 6c 65 2d 3e  read(conchFile->
2d210 68 2c 20 74 42 75 66 2c 20 50 52 4f 58 59 5f 4d  h, tBuf, PROXY_M
2d220 41 58 43 4f 4e 43 48 4c 45 4e 2c 20 30 29 3b 0a  AXCONCHLEN, 0);.
2d230 20 20 20 20 20 20 20 20 69 66 28 20 6c 65 6e 3c          if( len<
2d240 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70  0 ){.          p
2d250 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20  File->lastErrno 
2d260 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20 20  = errno;.       
2d270 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
2d280 5f 49 4f 45 52 52 5f 4c 4f 43 4b 3b 0a 20 20 20  _IOERR_LOCK;.   
2d290 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
2d2a0 66 28 20 6c 65 6e 3e 50 52 4f 58 59 5f 50 41 54  f( len>PROXY_PAT
2d2b0 48 49 4e 44 45 58 20 26 26 20 74 42 75 66 5b 30  HINDEX && tBuf[0
2d2c0 5d 3d 3d 28 63 68 61 72 29 50 52 4f 58 59 5f 43  ]==(char)PROXY_C
2d2d0 4f 4e 43 48 56 45 52 53 49 4f 4e 29 7b 0a 20 20  ONCHVERSION){.  
2d2e0 20 20 20 20 20 20 20 20 2f 2a 20 64 6f 6e 27 74          /* don't
2d2f0 20 62 72 65 61 6b 20 74 68 65 20 6c 6f 63 6b 20   break the lock 
2d300 69 66 20 74 68 65 20 68 6f 73 74 20 69 64 20 64  if the host id d
2d310 6f 65 73 6e 27 74 20 6d 61 74 63 68 20 2a 2f 0a  oesn't match */.
2d320 20 20 20 20 20 20 20 20 20 20 69 66 28 20 30 21            if( 0!
2d330 3d 6d 65 6d 63 6d 70 28 26 74 42 75 66 5b 50 52  =memcmp(&tBuf[PR
2d340 4f 58 59 5f 48 45 41 44 45 52 4c 45 4e 5d 2c 20  OXY_HEADERLEN], 
2d350 6d 79 48 6f 73 74 49 44 2c 20 50 52 4f 58 59 5f  myHostID, PROXY_
2d360 48 4f 53 54 49 44 4c 45 4e 29 20 29 7b 0a 20 20  HOSTIDLEN) ){.  
2d370 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
2d380 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20   SQLITE_BUSY;.  
2d390 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2d3a0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
2d3b0 20 20 20 2f 2a 20 64 6f 6e 27 74 20 62 72 65 61     /* don't brea
2d3c0 6b 20 74 68 65 20 6c 6f 63 6b 20 6f 6e 20 73 68  k the lock on sh
2d3d0 6f 72 74 20 72 65 61 64 20 6f 72 20 61 20 76 65  ort read or a ve
2d3e0 72 73 69 6f 6e 20 6d 69 73 6d 61 74 63 68 20 2a  rsion mismatch *
2d3f0 2f 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75  /.          retu
2d400 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a  rn SQLITE_BUSY;.
2d410 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2d420 20 20 75 73 6c 65 65 70 28 31 30 30 30 30 30 30    usleep(1000000
2d430 30 29 3b 20 2f 2a 20 77 61 69 74 20 31 30 20 73  0); /* wait 10 s
2d440 65 63 20 61 6e 64 20 74 72 79 20 74 68 65 20 6c  ec and try the l
2d450 6f 63 6b 20 61 67 61 69 6e 20 2a 2f 0a 20 20 20  ock again */.   
2d460 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 20 0a       continue; .
2d470 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 0a 20        }.      . 
2d480 20 20 20 20 20 61 73 73 65 72 74 28 20 6e 54 72       assert( nTr
2d490 69 65 73 3d 3d 33 20 29 3b 0a 20 20 20 20 20 20  ies==3 );.      
2d4a0 69 66 28 20 30 3d 3d 70 72 6f 78 79 42 72 65 61  if( 0==proxyBrea
2d4b0 6b 43 6f 6e 63 68 4c 6f 63 6b 28 70 46 69 6c 65  kConchLock(pFile
2d4c0 2c 20 6d 79 48 6f 73 74 49 44 29 20 29 7b 0a 20  , myHostID) ){. 
2d4d0 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
2d4e0 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 69  TE_OK;.        i
2d4f0 66 28 20 6c 6f 63 6b 54 79 70 65 3d 3d 45 58 43  f( lockType==EXC
2d500 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 29 7b 0a 20  LUSIVE_LOCK ){. 
2d510 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 63 6f           rc = co
2d520 6e 63 68 46 69 6c 65 2d 3e 70 4d 65 74 68 6f 64  nchFile->pMethod
2d530 2d 3e 78 4c 6f 63 6b 28 28 73 71 6c 69 74 65 33  ->xLock((sqlite3
2d540 5f 66 69 6c 65 2a 29 63 6f 6e 63 68 46 69 6c 65  _file*)conchFile
2d550 2c 20 53 48 41 52 45 44 5f 4c 4f 43 4b 29 3b 20  , SHARED_LOCK); 
2d560 20 20 20 20 20 20 20 20 20 0a 20 20 20 20 20 20           .      
2d570 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20    }.        if( 
2d580 21 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20  !rc ){.         
2d590 20 72 63 20 3d 20 63 6f 6e 63 68 46 69 6c 65 2d   rc = conchFile-
2d5a0 3e 70 4d 65 74 68 6f 64 2d 3e 78 4c 6f 63 6b 28  >pMethod->xLock(
2d5b0 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29 63  (sqlite3_file*)c
2d5c0 6f 6e 63 68 46 69 6c 65 2c 20 6c 6f 63 6b 54 79  onchFile, lockTy
2d5d0 70 65 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  pe);.        }. 
2d5e0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
2d5f0 20 77 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49   while( rc==SQLI
2d600 54 45 5f 42 55 53 59 20 26 26 20 6e 54 72 69 65  TE_BUSY && nTrie
2d610 73 3c 33 20 29 3b 0a 20 20 0a 20 20 72 65 74 75  s<3 );.  .  retu
2d620 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 54 61 6b  rn rc;.}../* Tak
2d630 65 73 20 74 68 65 20 63 6f 6e 63 68 20 62 79 20  es the conch by 
2d640 74 61 6b 69 6e 67 20 61 20 73 68 61 72 65 64 20  taking a shared 
2d650 6c 6f 63 6b 20 61 6e 64 20 72 65 61 64 20 74 68  lock and read th
2d660 65 20 63 6f 6e 74 65 6e 74 73 20 63 6f 6e 63 68  e contents conch
2d670 2c 20 69 66 20 0a 2a 2a 20 6c 6f 63 6b 50 61 74  , if .** lockPat
2d680 68 20 69 73 20 6e 6f 6e 2d 4e 55 4c 4c 2c 20 74  h is non-NULL, t
2d690 68 65 20 68 6f 73 74 20 49 44 20 61 6e 64 20 6c  he host ID and l
2d6a0 6f 63 6b 20 66 69 6c 65 20 70 61 74 68 20 6d 75  ock file path mu
2d6b0 73 74 20 6d 61 74 63 68 2e 20 20 41 20 4e 55 4c  st match.  A NUL
2d6c0 4c 20 0a 2a 2a 20 6c 6f 63 6b 50 61 74 68 20 6d  L .** lockPath m
2d6d0 65 61 6e 73 20 74 68 61 74 20 74 68 65 20 6c 6f  eans that the lo
2d6e0 63 6b 50 61 74 68 20 69 6e 20 74 68 65 20 63 6f  ckPath in the co
2d6f0 6e 63 68 20 66 69 6c 65 20 77 69 6c 6c 20 62 65  nch file will be
2d700 20 75 73 65 64 20 69 66 20 74 68 65 20 0a 2a 2a   used if the .**
2d710 20 68 6f 73 74 20 49 44 73 20 6d 61 74 63 68 2c   host IDs match,
2d720 20 6f 72 20 61 20 6e 65 77 20 6c 6f 63 6b 20 70   or a new lock p
2d730 61 74 68 20 77 69 6c 6c 20 62 65 20 67 65 6e 65  ath will be gene
2d740 72 61 74 65 64 20 61 75 74 6f 6d 61 74 69 63 61  rated automatica
2d750 6c 6c 79 20 0a 2a 2a 20 61 6e 64 20 77 72 69 74  lly .** and writ
2d760 74 65 6e 20 74 6f 20 74 68 65 20 63 6f 6e 63 68  ten to the conch
2d770 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63   file..*/.static
2d780 20 69 6e 74 20 70 72 6f 78 79 54 61 6b 65 43 6f   int proxyTakeCo
2d790 6e 63 68 28 75 6e 69 78 46 69 6c 65 20 2a 70 46  nch(unixFile *pF
2d7a0 69 6c 65 29 7b 0a 20 20 70 72 6f 78 79 4c 6f 63  ile){.  proxyLoc
2d7b0 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 70 43 74  kingContext *pCt
2d7c0 78 20 3d 20 28 70 72 6f 78 79 4c 6f 63 6b 69 6e  x = (proxyLockin
2d7d0 67 43 6f 6e 74 65 78 74 20 2a 29 70 46 69 6c 65  gContext *)pFile
2d7e0 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  ->lockingContext
2d7f0 3b 20 0a 20 20 0a 20 20 69 66 28 20 70 43 74 78  ; .  .  if( pCtx
2d800 2d 3e 63 6f 6e 63 68 48 65 6c 64 21 3d 30 20 29  ->conchHeld!=0 )
2d810 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
2d820 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65 7b  ITE_OK;.  }else{
2d830 0a 20 20 20 20 75 6e 69 78 46 69 6c 65 20 2a 63  .    unixFile *c
2d840 6f 6e 63 68 46 69 6c 65 20 3d 20 70 43 74 78 2d  onchFile = pCtx-
2d850 3e 63 6f 6e 63 68 46 69 6c 65 3b 0a 20 20 20 20  >conchFile;.    
2d860 75 75 69 64 5f 74 20 6d 79 48 6f 73 74 49 44 3b  uuid_t myHostID;
2d870 0a 20 20 20 20 69 6e 74 20 70 45 72 72 6f 72 20  .    int pError 
2d880 3d 20 30 3b 0a 20 20 20 20 63 68 61 72 20 72 65  = 0;.    char re
2d890 61 64 42 75 66 5b 50 52 4f 58 59 5f 4d 41 58 43  adBuf[PROXY_MAXC
2d8a0 4f 4e 43 48 4c 45 4e 5d 3b 0a 20 20 20 20 63 68  ONCHLEN];.    ch
2d8b0 61 72 20 6c 6f 63 6b 50 61 74 68 5b 4d 41 58 50  ar lockPath[MAXP
2d8c0 41 54 48 4c 45 4e 5d 3b 0a 20 20 20 20 63 68 61  ATHLEN];.    cha
2d8d0 72 20 2a 74 65 6d 70 4c 6f 63 6b 50 61 74 68 20  r *tempLockPath 
2d8e0 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 69 6e 74 20  = NULL;.    int 
2d8f0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
2d900 20 20 20 20 69 6e 74 20 63 72 65 61 74 65 43 6f      int createCo
2d910 6e 63 68 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74  nch = 0;.    int
2d920 20 68 6f 73 74 49 64 4d 61 74 63 68 20 3d 20 30   hostIdMatch = 0
2d930 3b 0a 20 20 20 20 69 6e 74 20 72 65 61 64 4c 65  ;.    int readLe
2d940 6e 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 74  n = 0;.    int t
2d950 72 79 4f 6c 64 4c 6f 63 6b 50 61 74 68 20 3d 20  ryOldLockPath = 
2d960 30 3b 0a 20 20 20 20 69 6e 74 20 66 6f 72 63 65  0;.    int force
2d970 4e 65 77 4c 6f 63 6b 50 61 74 68 20 3d 20 30 3b  NewLockPath = 0;
2d980 0a 20 20 20 20 0a 20 20 20 20 4f 53 54 52 41 43  .    .    OSTRAC
2d990 45 28 28 22 54 41 4b 45 43 4f 4e 43 48 20 20 25  E(("TAKECONCH  %
2d9a0 64 20 66 6f 72 20 25 73 20 70 69 64 3d 25 64 5c  d for %s pid=%d\
2d9b0 6e 22 2c 20 63 6f 6e 63 68 46 69 6c 65 2d 3e 68  n", conchFile->h
2d9c0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 28  ,.             (
2d9d0 70 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 50  pCtx->lockProxyP
2d9e0 61 74 68 20 3f 20 70 43 74 78 2d 3e 6c 6f 63 6b  ath ? pCtx->lock
2d9f0 50 72 6f 78 79 50 61 74 68 20 3a 20 22 3a 61 75  ProxyPath : ":au
2da00 74 6f 3a 22 29 2c 20 67 65 74 70 69 64 28 29 29  to:"), getpid())
2da10 29 3b 0a 0a 20 20 20 20 72 63 20 3d 20 70 72 6f  );..    rc = pro
2da20 78 79 47 65 74 48 6f 73 74 49 44 28 6d 79 48 6f  xyGetHostID(myHo
2da30 73 74 49 44 2c 20 26 70 45 72 72 6f 72 29 3b 0a  stID, &pError);.
2da40 20 20 20 20 69 66 28 20 28 72 63 26 30 78 66 66      if( (rc&0xff
2da50 29 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 20  )==SQLITE_IOERR 
2da60 29 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e  ){.      pFile->
2da70 6c 61 73 74 45 72 72 6e 6f 20 3d 20 70 45 72 72  lastErrno = pErr
2da80 6f 72 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65  or;.      goto e
2da90 6e 64 5f 74 61 6b 65 63 6f 6e 63 68 3b 0a 20 20  nd_takeconch;.  
2daa0 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 70 72 6f    }.    rc = pro
2dab0 78 79 43 6f 6e 63 68 4c 6f 63 6b 28 70 46 69 6c  xyConchLock(pFil
2dac0 65 2c 20 6d 79 48 6f 73 74 49 44 2c 20 53 48 41  e, myHostID, SHA
2dad0 52 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 69  RED_LOCK);.    i
2dae0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
2daf0 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65   ){.      goto e
2db00 6e 64 5f 74 61 6b 65 63 6f 6e 63 68 3b 0a 20 20  nd_takeconch;.  
2db10 20 20 7d 0a 20 20 20 20 2f 2a 20 72 65 61 64 20    }.    /* read 
2db20 74 68 65 20 65 78 69 73 74 69 6e 67 20 63 6f 6e  the existing con
2db30 63 68 20 66 69 6c 65 20 2a 2f 0a 20 20 20 20 72  ch file */.    r
2db40 65 61 64 4c 65 6e 20 3d 20 73 65 65 6b 41 6e 64  eadLen = seekAnd
2db50 52 65 61 64 28 28 75 6e 69 78 46 69 6c 65 2a 29  Read((unixFile*)
2db60 63 6f 6e 63 68 46 69 6c 65 2c 20 30 2c 20 72 65  conchFile, 0, re
2db70 61 64 42 75 66 2c 20 50 52 4f 58 59 5f 4d 41 58  adBuf, PROXY_MAX
2db80 43 4f 4e 43 48 4c 45 4e 29 3b 0a 20 20 20 20 69  CONCHLEN);.    i
2db90 66 28 20 72 65 61 64 4c 65 6e 3c 30 20 29 7b 0a  f( readLen<0 ){.
2dba0 20 20 20 20 20 20 2f 2a 20 49 2f 4f 20 65 72 72        /* I/O err
2dbb0 6f 72 3a 20 6c 61 73 74 45 72 72 6e 6f 20 73 65  or: lastErrno se
2dbc0 74 20 62 79 20 73 65 65 6b 41 6e 64 52 65 61 64  t by seekAndRead
2dbd0 20 2a 2f 0a 20 20 20 20 20 20 70 46 69 6c 65 2d   */.      pFile-
2dbe0 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 63 6f 6e  >lastErrno = con
2dbf0 63 68 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e  chFile->lastErrn
2dc00 6f 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  o;.      rc = SQ
2dc10 4c 49 54 45 5f 49 4f 45 52 52 5f 52 45 41 44 3b  LITE_IOERR_READ;
2dc20 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f  .      goto end_
2dc30 74 61 6b 65 63 6f 6e 63 68 3b 0a 20 20 20 20 7d  takeconch;.    }
2dc40 65 6c 73 65 20 69 66 28 20 72 65 61 64 4c 65 6e  else if( readLen
2dc50 3c 3d 28 50 52 4f 58 59 5f 48 45 41 44 45 52 4c  <=(PROXY_HEADERL
2dc60 45 4e 2b 50 52 4f 58 59 5f 48 4f 53 54 49 44 4c  EN+PROXY_HOSTIDL
2dc70 45 4e 29 20 7c 7c 20 0a 20 20 20 20 20 20 20 20  EN) || .        
2dc80 20 20 20 20 20 72 65 61 64 42 75 66 5b 30 5d 21       readBuf[0]!
2dc90 3d 28 63 68 61 72 29 50 52 4f 58 59 5f 43 4f 4e  =(char)PROXY_CON
2dca0 43 48 56 45 52 53 49 4f 4e 20 29 7b 0a 20 20 20  CHVERSION ){.   
2dcb0 20 20 20 2f 2a 20 61 20 73 68 6f 72 74 20 72 65     /* a short re
2dcc0 61 64 20 6f 72 20 76 65 72 73 69 6f 6e 20 66 6f  ad or version fo
2dcd0 72 6d 61 74 20 6d 69 73 6d 61 74 63 68 20 6d 65  rmat mismatch me
2dce0 61 6e 73 20 77 65 20 6e 65 65 64 20 74 6f 20 63  ans we need to c
2dcf0 72 65 61 74 65 20 61 20 6e 65 77 20 0a 20 20 20  reate a new .   
2dd00 20 20 20 2a 2a 20 63 6f 6e 63 68 20 66 69 6c 65     ** conch file
2dd10 2e 20 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  . .      */.    
2dd20 20 20 63 72 65 61 74 65 43 6f 6e 63 68 20 3d 20    createConch = 
2dd30 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2f 2a 20  1;.    }.    /* 
2dd40 69 66 20 74 68 65 20 68 6f 73 74 20 69 64 20 6d  if the host id m
2dd50 61 74 63 68 65 73 20 61 6e 64 20 74 68 65 20 6c  atches and the l
2dd60 6f 63 6b 20 70 61 74 68 20 61 6c 72 65 61 64 79  ock path already
2dd70 20 65 78 69 73 74 73 20 69 6e 20 74 68 65 20 63   exists in the c
2dd80 6f 6e 63 68 0a 20 20 20 20 2a 2a 20 77 65 27 6c  onch.    ** we'l
2dd90 6c 20 74 72 79 20 74 6f 20 75 73 65 20 74 68 65  l try to use the
2dda0 20 70 61 74 68 20 74 68 65 72 65 2c 20 69 66 20   path there, if 
2ddb0 77 65 20 63 61 6e 27 74 20 6f 70 65 6e 20 74 68  we can't open th
2ddc0 61 74 20 70 61 74 68 2c 20 77 65 27 6c 6c 20 0a  at path, we'll .
2ddd0 20 20 20 20 2a 2a 20 72 65 74 72 79 20 77 69 74      ** retry wit
2dde0 68 20 61 20 6e 65 77 20 61 75 74 6f 2d 67 65 6e  h a new auto-gen
2ddf0 65 72 61 74 65 64 20 70 61 74 68 20 0a 20 20 20  erated path .   
2de00 20 2a 2f 0a 20 20 20 20 64 6f 20 7b 20 2f 2a 20   */.    do { /* 
2de10 69 6e 20 63 61 73 65 20 77 65 20 6e 65 65 64 20  in case we need 
2de20 74 6f 20 74 72 79 20 61 67 61 69 6e 20 66 6f 72  to try again for
2de30 20 61 6e 20 3a 61 75 74 6f 3a 20 6e 61 6d 65 64   an :auto: named
2de40 20 6c 6f 63 6b 20 66 69 6c 65 20 2a 2f 0a 0a 20   lock file */.. 
2de50 20 20 20 20 20 69 66 28 20 21 63 72 65 61 74 65       if( !create
2de60 43 6f 6e 63 68 20 26 26 20 21 66 6f 72 63 65 4e  Conch && !forceN
2de70 65 77 4c 6f 63 6b 50 61 74 68 20 29 7b 0a 20 20  ewLockPath ){.  
2de80 20 20 20 20 20 20 68 6f 73 74 49 64 4d 61 74 63        hostIdMatc
2de90 68 20 3d 20 21 6d 65 6d 63 6d 70 28 26 72 65 61  h = !memcmp(&rea
2dea0 64 42 75 66 5b 50 52 4f 58 59 5f 48 45 41 44 45  dBuf[PROXY_HEADE
2deb0 52 4c 45 4e 5d 2c 20 6d 79 48 6f 73 74 49 44 2c  RLEN], myHostID,
2dec0 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
2ded0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2dee0 20 20 20 20 50 52 4f 58 59 5f 48 4f 53 54 49 44      PROXY_HOSTID
2def0 4c 45 4e 29 3b 0a 20 20 20 20 20 20 20 20 2f 2a  LEN);.        /*
2df00 20 69 66 20 74 68 65 20 63 6f 6e 63 68 20 68 61   if the conch ha
2df10 73 20 64 61 74 61 20 63 6f 6d 70 61 72 65 20 74  s data compare t
2df20 68 65 20 63 6f 6e 74 65 6e 74 73 20 2a 2f 0a 20  he contents */. 
2df30 20 20 20 20 20 20 20 69 66 28 20 21 70 43 74 78         if( !pCtx
2df40 2d 3e 6c 6f 63 6b 50 72 6f 78 79 50 61 74 68 20  ->lockProxyPath 
2df50 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ){.          /* 
2df60 66 6f 72 20 61 75 74 6f 2d 6e 61 6d 65 64 20 6c  for auto-named l
2df70 6f 63 61 6c 20 6c 6f 63 6b 20 66 69 6c 65 2c 20  ocal lock file, 
2df80 6a 75 73 74 20 63 68 65 63 6b 20 74 68 65 20 68  just check the h
2df90 6f 73 74 20 49 44 20 61 6e 64 20 77 65 27 6c 6c  ost ID and we'll
2dfa0 0a 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 75  .           ** u
2dfb0 73 65 20 74 68 65 20 6c 6f 63 61 6c 20 6c 6f 63  se the local loc
2dfc0 6b 20 66 69 6c 65 20 70 61 74 68 20 74 68 61 74  k file path that
2dfd0 27 73 20 61 6c 72 65 61 64 79 20 69 6e 20 74 68  's already in th
2dfe0 65 72 65 0a 20 20 20 20 20 20 20 20 20 20 20 2a  ere.           *
2dff0 2f 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  /.          if( 
2e000 68 6f 73 74 49 64 4d 61 74 63 68 20 29 7b 0a 20  hostIdMatch ){. 
2e010 20 20 20 20 20 20 20 20 20 20 20 73 69 7a 65 5f             size_
2e020 74 20 70 61 74 68 4c 65 6e 20 3d 20 28 72 65 61  t pathLen = (rea
2e030 64 4c 65 6e 20 2d 20 50 52 4f 58 59 5f 50 41 54  dLen - PROXY_PAT
2e040 48 49 4e 44 45 58 29 3b 0a 20 20 20 20 20 20 20  HINDEX);.       
2e050 20 20 20 20 20 0a 20 20 20 20 20 20 20 20 20 20       .          
2e060 20 20 69 66 28 20 70 61 74 68 4c 65 6e 3e 3d 4d    if( pathLen>=M
2e070 41 58 50 41 54 48 4c 45 4e 20 29 7b 0a 20 20 20  AXPATHLEN ){.   
2e080 20 20 20 20 20 20 20 20 20 20 20 70 61 74 68 4c             pathL
2e090 65 6e 3d 4d 41 58 50 41 54 48 4c 45 4e 2d 31 3b  en=MAXPATHLEN-1;
2e0a0 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
2e0b0 20 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70             memcp
2e0c0 79 28 6c 6f 63 6b 50 61 74 68 2c 20 26 72 65 61  y(lockPath, &rea
2e0d0 64 42 75 66 5b 50 52 4f 58 59 5f 50 41 54 48 49  dBuf[PROXY_PATHI
2e0e0 4e 44 45 58 5d 2c 20 70 61 74 68 4c 65 6e 29 3b  NDEX], pathLen);
2e0f0 0a 20 20 20 20 20 20 20 20 20 20 20 20 6c 6f 63  .            loc
2e100 6b 50 61 74 68 5b 70 61 74 68 4c 65 6e 5d 20 3d  kPath[pathLen] =
2e110 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   0;.            
2e120 74 65 6d 70 4c 6f 63 6b 50 61 74 68 20 3d 20 6c  tempLockPath = l
2e130 6f 63 6b 50 61 74 68 3b 0a 20 20 20 20 20 20 20  ockPath;.       
2e140 20 20 20 20 20 74 72 79 4f 6c 64 4c 6f 63 6b 50       tryOldLockP
2e150 61 74 68 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  ath = 1;.       
2e160 20 20 20 20 20 2f 2a 20 63 72 65 61 74 65 20 61       /* create a
2e170 20 63 6f 70 79 20 6f 66 20 74 68 65 20 6c 6f 63   copy of the loc
2e180 6b 20 70 61 74 68 20 69 66 20 74 68 65 20 63 6f  k path if the co
2e190 6e 63 68 20 69 73 20 74 61 6b 65 6e 20 2a 2f 0a  nch is taken */.
2e1a0 20 20 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f              goto
2e1b0 20 65 6e 64 5f 74 61 6b 65 63 6f 6e 63 68 3b 0a   end_takeconch;.
2e1c0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
2e1d0 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 68 6f      }else if( ho
2e1e0 73 74 49 64 4d 61 74 63 68 0a 20 20 20 20 20 20  stIdMatch.      
2e1f0 20 20 20 20 20 20 20 20 20 26 26 20 21 73 74 72           && !str
2e200 6e 63 6d 70 28 70 43 74 78 2d 3e 6c 6f 63 6b 50  ncmp(pCtx->lockP
2e210 72 6f 78 79 50 61 74 68 2c 20 26 72 65 61 64 42  roxyPath, &readB
2e220 75 66 5b 50 52 4f 58 59 5f 50 41 54 48 49 4e 44  uf[PROXY_PATHIND
2e230 45 58 5d 2c 0a 20 20 20 20 20 20 20 20 20 20 20  EX],.           
2e240 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e250 72 65 61 64 4c 65 6e 2d 50 52 4f 58 59 5f 50 41  readLen-PROXY_PA
2e260 54 48 49 4e 44 45 58 29 0a 20 20 20 20 20 20 20  THINDEX).       
2e270 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a   ){.          /*
2e280 20 63 6f 6e 63 68 20 68 6f 73 74 20 61 6e 64 20   conch host and 
2e290 6c 6f 63 6b 20 70 61 74 68 20 6d 61 74 63 68 20  lock path match 
2e2a0 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74  */.          got
2e2b0 6f 20 65 6e 64 5f 74 61 6b 65 63 6f 6e 63 68 3b  o end_takeconch;
2e2c0 20 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20   .        }.    
2e2d0 20 20 7d 0a 20 20 20 20 20 20 0a 20 20 20 20 20    }.      .     
2e2e0 20 2f 2a 20 69 66 20 74 68 65 20 63 6f 6e 63 68   /* if the conch
2e2f0 20 69 73 6e 27 74 20 77 72 69 74 61 62 6c 65 20   isn't writable 
2e300 61 6e 64 20 64 6f 65 73 6e 27 74 20 6d 61 74 63  and doesn't matc
2e310 68 2c 20 77 65 20 63 61 6e 27 74 20 74 61 6b 65  h, we can't take
2e320 20 69 74 20 2a 2f 0a 20 20 20 20 20 20 69 66 28   it */.      if(
2e330 20 28 63 6f 6e 63 68 46 69 6c 65 2d 3e 6f 70 65   (conchFile->ope
2e340 6e 46 6c 61 67 73 26 4f 5f 52 44 57 52 29 20 3d  nFlags&O_RDWR) =
2e350 3d 20 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72  = 0 ){.        r
2e360 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 3b  c = SQLITE_BUSY;
2e370 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e  .        goto en
2e380 64 5f 74 61 6b 65 63 6f 6e 63 68 3b 0a 20 20 20  d_takeconch;.   
2e390 20 20 20 7d 0a 20 20 20 20 20 20 0a 20 20 20 20     }.      .    
2e3a0 20 20 2f 2a 20 65 69 74 68 65 72 20 74 68 65 20    /* either the 
2e3b0 63 6f 6e 63 68 20 64 69 64 6e 27 74 20 6d 61 74  conch didn't mat
2e3c0 63 68 20 6f 72 20 77 65 20 6e 65 65 64 20 74 6f  ch or we need to
2e3d0 20 63 72 65 61 74 65 20 61 20 6e 65 77 20 6f 6e   create a new on
2e3e0 65 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 21  e */.      if( !
2e3f0 70 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 50  pCtx->lockProxyP
2e400 61 74 68 20 29 7b 0a 20 20 20 20 20 20 20 20 70  ath ){.        p
2e410 72 6f 78 79 47 65 74 4c 6f 63 6b 50 61 74 68 28  roxyGetLockPath(
2e420 70 43 74 78 2d 3e 64 62 50 61 74 68 2c 20 6c 6f  pCtx->dbPath, lo
2e430 63 6b 50 61 74 68 2c 20 4d 41 58 50 41 54 48 4c  ckPath, MAXPATHL
2e440 45 4e 29 3b 0a 20 20 20 20 20 20 20 20 74 65 6d  EN);.        tem
2e450 70 4c 6f 63 6b 50 61 74 68 20 3d 20 6c 6f 63 6b  pLockPath = lock
2e460 50 61 74 68 3b 0a 20 20 20 20 20 20 20 20 2f 2a  Path;.        /*
2e470 20 63 72 65 61 74 65 20 61 20 63 6f 70 79 20 6f   create a copy o
2e480 66 20 74 68 65 20 6c 6f 63 6b 20 70 61 74 68 20  f the lock path 
2e490 5f 6f 6e 6c 79 5f 20 69 66 20 74 68 65 20 63 6f  _only_ if the co
2e4a0 6e 63 68 20 69 73 20 74 61 6b 65 6e 20 2a 2f 0a  nch is taken */.
2e4b0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 0a 20        }.      . 
2e4c0 20 20 20 20 20 2f 2a 20 75 70 64 61 74 65 20 63       /* update c
2e4d0 6f 6e 63 68 20 77 69 74 68 20 68 6f 73 74 20 61  onch with host a
2e4e0 6e 64 20 70 61 74 68 20 28 74 68 69 73 20 77 69  nd path (this wi
2e4f0 6c 6c 20 66 61 69 6c 20 69 66 20 6f 74 68 65 72  ll fail if other
2e500 20 70 72 6f 63 65 73 73 0a 20 20 20 20 20 20 2a   process.      *
2e510 2a 20 68 61 73 20 61 20 73 68 61 72 65 64 20 6c  * has a shared l
2e520 6f 63 6b 20 61 6c 72 65 61 64 79 29 2c 20 69 66  ock already), if
2e530 20 74 68 65 20 68 6f 73 74 20 69 64 20 6d 61 74   the host id mat
2e540 63 68 65 73 2c 20 75 73 65 20 74 68 65 20 62 69  ches, use the bi
2e550 67 0a 20 20 20 20 20 20 2a 2a 20 73 74 69 63 6b  g.      ** stick
2e560 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
2e570 20 66 75 74 69 6d 65 73 28 63 6f 6e 63 68 46 69   futimes(conchFi
2e580 6c 65 2d 3e 68 2c 20 4e 55 4c 4c 29 3b 0a 20 20  le->h, NULL);.  
2e590 20 20 20 20 69 66 28 20 68 6f 73 74 49 64 4d 61      if( hostIdMa
2e5a0 74 63 68 20 26 26 20 21 63 72 65 61 74 65 43 6f  tch && !createCo
2e5b0 6e 63 68 20 29 7b 0a 20 20 20 20 20 20 20 20 69  nch ){.        i
2e5c0 66 28 20 63 6f 6e 63 68 46 69 6c 65 2d 3e 70 49  f( conchFile->pI
2e5d0 6e 6f 64 65 20 26 26 20 63 6f 6e 63 68 46 69 6c  node && conchFil
2e5e0 65 2d 3e 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72  e->pInode->nShar
2e5f0 65 64 3e 31 20 29 7b 0a 20 20 20 20 20 20 20 20  ed>1 ){.        
2e600 20 20 2f 2a 20 57 65 20 61 72 65 20 74 72 79 69    /* We are tryi
2e610 6e 67 20 66 6f 72 20 61 6e 20 65 78 63 6c 75 73  ng for an exclus
2e620 69 76 65 20 6c 6f 63 6b 20 62 75 74 20 61 6e 6f  ive lock but ano
2e630 74 68 65 72 20 74 68 72 65 61 64 20 69 6e 20 74  ther thread in t
2e640 68 69 73 0a 20 20 20 20 20 20 20 20 20 20 20 2a  his.           *
2e650 2a 20 73 61 6d 65 20 70 72 6f 63 65 73 73 20 69  * same process i
2e660 73 20 73 74 69 6c 6c 20 68 6f 6c 64 69 6e 67 20  s still holding 
2e670 61 20 73 68 61 72 65 64 20 6c 6f 63 6b 2e 20 2a  a shared lock. *
2e680 2f 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  /.          rc =
2e690 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20   SQLITE_BUSY;.  
2e6a0 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 20 20        } else {  
2e6b0 20 20 20 20 20 20 20 20 0a 20 20 20 20 20 20 20          .       
2e6c0 20 20 20 72 63 20 3d 20 70 72 6f 78 79 43 6f 6e     rc = proxyCon
2e6d0 63 68 4c 6f 63 6b 28 70 46 69 6c 65 2c 20 6d 79  chLock(pFile, my
2e6e0 48 6f 73 74 49 44 2c 20 45 58 43 4c 55 53 49 56  HostID, EXCLUSIV
2e6f0 45 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 20  E_LOCK);.       
2e700 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a   }.      }else{.
2e710 20 20 20 20 20 20 20 20 72 63 20 3d 20 63 6f 6e          rc = con
2e720 63 68 46 69 6c 65 2d 3e 70 4d 65 74 68 6f 64 2d  chFile->pMethod-
2e730 3e 78 4c 6f 63 6b 28 28 73 71 6c 69 74 65 33 5f  >xLock((sqlite3_
2e740 66 69 6c 65 2a 29 63 6f 6e 63 68 46 69 6c 65 2c  file*)conchFile,
2e750 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29   EXCLUSIVE_LOCK)
2e760 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
2e770 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
2e780 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 63 68 61  K ){.        cha
2e790 72 20 77 72 69 74 65 42 75 66 66 65 72 5b 50 52  r writeBuffer[PR
2e7a0 4f 58 59 5f 4d 41 58 43 4f 4e 43 48 4c 45 4e 5d  OXY_MAXCONCHLEN]
2e7b0 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 77 72  ;.        int wr
2e7c0 69 74 65 53 69 7a 65 20 3d 20 30 3b 0a 20 20 20  iteSize = 0;.   
2e7d0 20 20 20 20 20 0a 20 20 20 20 20 20 20 20 77 72       .        wr
2e7e0 69 74 65 42 75 66 66 65 72 5b 30 5d 20 3d 20 28  iteBuffer[0] = (
2e7f0 63 68 61 72 29 50 52 4f 58 59 5f 43 4f 4e 43 48  char)PROXY_CONCH
2e800 56 45 52 53 49 4f 4e 3b 0a 20 20 20 20 20 20 20  VERSION;.       
2e810 20 6d 65 6d 63 70 79 28 26 77 72 69 74 65 42 75   memcpy(&writeBu
2e820 66 66 65 72 5b 50 52 4f 58 59 5f 48 45 41 44 45  ffer[PROXY_HEADE
2e830 52 4c 45 4e 5d 2c 20 6d 79 48 6f 73 74 49 44 2c  RLEN], myHostID,
2e840 20 50 52 4f 58 59 5f 48 4f 53 54 49 44 4c 45 4e   PROXY_HOSTIDLEN
2e850 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  );.        if( p
2e860 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 50 61  Ctx->lockProxyPa
2e870 74 68 21 3d 4e 55 4c 4c 20 29 7b 0a 20 20 20 20  th!=NULL ){.    
2e880 20 20 20 20 20 20 73 74 72 6c 63 70 79 28 26 77        strlcpy(&w
2e890 72 69 74 65 42 75 66 66 65 72 5b 50 52 4f 58 59  riteBuffer[PROXY
2e8a0 5f 50 41 54 48 49 4e 44 45 58 5d 2c 20 70 43 74  _PATHINDEX], pCt
2e8b0 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 50 61 74 68  x->lockProxyPath
2e8c0 2c 20 4d 41 58 50 41 54 48 4c 45 4e 29 3b 0a 20  , MAXPATHLEN);. 
2e8d0 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
2e8e0 20 20 20 20 20 20 20 20 73 74 72 6c 63 70 79 28          strlcpy(
2e8f0 26 77 72 69 74 65 42 75 66 66 65 72 5b 50 52 4f  &writeBuffer[PRO
2e900 58 59 5f 50 41 54 48 49 4e 44 45 58 5d 2c 20 74  XY_PATHINDEX], t
2e910 65 6d 70 4c 6f 63 6b 50 61 74 68 2c 20 4d 41 58  empLockPath, MAX
2e920 50 41 54 48 4c 45 4e 29 3b 0a 20 20 20 20 20 20  PATHLEN);.      
2e930 20 20 7d 0a 20 20 20 20 20 20 20 20 77 72 69 74    }.        writ
2e940 65 53 69 7a 65 20 3d 20 50 52 4f 58 59 5f 50 41  eSize = PROXY_PA
2e950 54 48 49 4e 44 45 58 20 2b 20 73 74 72 6c 65 6e  THINDEX + strlen
2e960 28 26 77 72 69 74 65 42 75 66 66 65 72 5b 50 52  (&writeBuffer[PR
2e970 4f 58 59 5f 50 41 54 48 49 4e 44 45 58 5d 29 3b  OXY_PATHINDEX]);
2e980 0a 20 20 20 20 20 20 20 20 66 74 72 75 6e 63 61  .        ftrunca
2e990 74 65 28 63 6f 6e 63 68 46 69 6c 65 2d 3e 68 2c  te(conchFile->h,
2e9a0 20 77 72 69 74 65 53 69 7a 65 29 3b 0a 20 20 20   writeSize);.   
2e9b0 20 20 20 20 20 72 63 20 3d 20 75 6e 69 78 57 72       rc = unixWr
2e9c0 69 74 65 28 28 73 71 6c 69 74 65 33 5f 66 69 6c  ite((sqlite3_fil
2e9d0 65 20 2a 29 63 6f 6e 63 68 46 69 6c 65 2c 20 77  e *)conchFile, w
2e9e0 72 69 74 65 42 75 66 66 65 72 2c 20 77 72 69 74  riteBuffer, writ
2e9f0 65 53 69 7a 65 2c 20 30 29 3b 0a 20 20 20 20 20  eSize, 0);.     
2ea00 20 20 20 66 73 79 6e 63 28 63 6f 6e 63 68 46 69     fsync(conchFi
2ea10 6c 65 2d 3e 68 29 3b 0a 20 20 20 20 20 20 20 20  le->h);.        
2ea20 2f 2a 20 49 66 20 77 65 20 63 72 65 61 74 65 64  /* If we created
2ea30 20 61 20 6e 65 77 20 63 6f 6e 63 68 20 66 69 6c   a new conch fil
2ea40 65 20 28 6e 6f 74 20 6a 75 73 74 20 75 70 64 61  e (not just upda
2ea50 74 65 64 20 74 68 65 20 63 6f 6e 74 65 6e 74 73  ted the contents
2ea60 20 6f 66 20 61 20 0a 20 20 20 20 20 20 20 20 20   of a .         
2ea70 2a 2a 20 76 61 6c 69 64 20 63 6f 6e 63 68 20 66  ** valid conch f
2ea80 69 6c 65 29 2c 20 74 72 79 20 74 6f 20 6d 61 74  ile), try to mat
2ea90 63 68 20 74 68 65 20 70 65 72 6d 69 73 73 69 6f  ch the permissio
2eaa0 6e 73 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  ns of the databa
2eab0 73 65 20 0a 20 20 20 20 20 20 20 20 20 2a 2f 0a  se .         */.
2eac0 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d          if( rc==
2ead0 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 63 72 65  SQLITE_OK && cre
2eae0 61 74 65 43 6f 6e 63 68 20 29 7b 0a 20 20 20 20  ateConch ){.    
2eaf0 20 20 20 20 20 20 73 74 72 75 63 74 20 73 74 61        struct sta
2eb00 74 20 62 75 66 3b 0a 20 20 20 20 20 20 20 20 20  t buf;.         
2eb10 20 69 6e 74 20 65 72 72 20 3d 20 66 73 74 61 74   int err = fstat
2eb20 28 70 46 69 6c 65 2d 3e 68 2c 20 26 62 75 66 29  (pFile->h, &buf)
2eb30 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
2eb40 65 72 72 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  err==0 ){.      
2eb50 20 20 20 20 20 20 6d 6f 64 65 5f 74 20 63 6d 6f        mode_t cmo
2eb60 64 65 20 3d 20 62 75 66 2e 73 74 5f 6d 6f 64 65  de = buf.st_mode
2eb70 26 28 53 5f 49 52 55 53 52 7c 53 5f 49 57 55 53  &(S_IRUSR|S_IWUS
2eb80 52 20 7c 20 53 5f 49 52 47 52 50 7c 53 5f 49 57  R | S_IRGRP|S_IW
2eb90 47 52 50 20 7c 0a 20 20 20 20 20 20 20 20 20 20  GRP |.          
2eba0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ebb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53 5f                S_
2ebc0 49 52 4f 54 48 7c 53 5f 49 57 4f 54 48 29 3b 0a  IROTH|S_IWOTH);.
2ebd0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 74              /* t
2ebe0 72 79 20 74 6f 20 6d 61 74 63 68 20 74 68 65 20  ry to match the 
2ebf0 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 52 2f  database file R/
2ec00 57 20 70 65 72 6d 69 73 73 69 6f 6e 73 2c 20 69  W permissions, i
2ec10 67 6e 6f 72 65 20 66 61 69 6c 75 72 65 20 2a 2f  gnore failure */
2ec20 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
2ec30 50 52 4f 58 59 5f 44 45 42 55 47 0a 20 20 20 20  PROXY_DEBUG.    
2ec40 20 20 20 20 20 20 20 20 66 63 68 6d 6f 64 28 63          fchmod(c
2ec50 6f 6e 63 68 46 69 6c 65 2d 3e 68 2c 20 63 6d 6f  onchFile->h, cmo
2ec60 64 65 29 3b 0a 23 65 6c 73 65 0a 20 20 20 20 20  de);.#else.     
2ec70 20 20 20 20 20 20 20 69 66 28 20 66 63 68 6d 6f         if( fchmo
2ec80 64 28 63 6f 6e 63 68 46 69 6c 65 2d 3e 68 2c 20  d(conchFile->h, 
2ec90 63 6d 6f 64 65 29 21 3d 30 20 29 7b 0a 20 20 20  cmode)!=0 ){.   
2eca0 20 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 63             int c
2ecb0 6f 64 65 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20  ode = errno;.   
2ecc0 20 20 20 20 20 20 20 20 20 20 20 66 70 72 69 6e             fprin
2ecd0 74 66 28 73 74 64 65 72 72 2c 20 22 66 63 68 6d  tf(stderr, "fchm
2ece0 6f 64 20 25 6f 20 46 41 49 4c 45 44 20 77 69 74  od %o FAILED wit
2ecf0 68 20 25 64 20 25 73 5c 6e 22 2c 0a 20 20 20 20  h %d %s\n",.    
2ed00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ed10 20 20 63 6d 6f 64 65 2c 20 63 6f 64 65 2c 20 73    cmode, code, s
2ed20 74 72 65 72 72 6f 72 28 63 6f 64 65 29 29 3b 0a  trerror(code));.
2ed30 20 20 20 20 20 20 20 20 20 20 20 20 7d 20 65 6c              } el
2ed40 73 65 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20  se {.           
2ed50 20 20 20 66 70 72 69 6e 74 66 28 73 74 64 65 72     fprintf(stder
2ed60 72 2c 20 22 66 63 68 6d 6f 64 20 25 6f 20 53 55  r, "fchmod %o SU
2ed70 43 43 45 44 45 44 5c 6e 22 2c 63 6d 6f 64 65 29  CCEDED\n",cmode)
2ed80 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  ;.            }.
2ed90 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b            }else{
2eda0 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 74  .            int
2edb0 20 63 6f 64 65 20 3d 20 65 72 72 6e 6f 3b 0a 20   code = errno;. 
2edc0 20 20 20 20 20 20 20 20 20 20 20 66 70 72 69 6e             fprin
2edd0 74 66 28 73 74 64 65 72 72 2c 20 22 53 54 41 54  tf(stderr, "STAT
2ede0 20 46 41 49 4c 45 44 5b 25 64 5d 20 77 69 74 68   FAILED[%d] with
2edf0 20 25 64 20 25 73 5c 6e 22 2c 20 0a 20 20 20 20   %d %s\n", .    
2ee00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ee10 65 72 72 2c 20 63 6f 64 65 2c 20 73 74 72 65 72  err, code, strer
2ee20 72 6f 72 28 63 6f 64 65 29 29 3b 0a 23 65 6e 64  ror(code));.#end
2ee30 69 66 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  if.          }. 
2ee40 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
2ee50 0a 20 20 20 20 20 20 63 6f 6e 63 68 46 69 6c 65  .      conchFile
2ee60 2d 3e 70 4d 65 74 68 6f 64 2d 3e 78 55 6e 6c 6f  ->pMethod->xUnlo
2ee70 63 6b 28 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  ck((sqlite3_file
2ee80 2a 29 63 6f 6e 63 68 46 69 6c 65 2c 20 53 48 41  *)conchFile, SHA
2ee90 52 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20  RED_LOCK);.     
2eea0 20 0a 20 20 20 20 65 6e 64 5f 74 61 6b 65 63 6f   .    end_takeco
2eeb0 6e 63 68 3a 0a 20 20 20 20 20 20 4f 53 54 52 41  nch:.      OSTRA
2eec0 43 45 28 28 22 54 52 41 4e 53 50 52 4f 58 59 3a  CE(("TRANSPROXY:
2eed0 20 43 4c 4f 53 45 20 20 25 64 5c 6e 22 2c 20 70   CLOSE  %d\n", p
2eee0 46 69 6c 65 2d 3e 68 29 29 3b 0a 20 20 20 20 20  File->h));.     
2eef0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
2ef00 4f 4b 20 26 26 20 70 46 69 6c 65 2d 3e 6f 70 65  OK && pFile->ope
2ef10 6e 46 6c 61 67 73 20 29 7b 0a 20 20 20 20 20 20  nFlags ){.      
2ef20 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 68 3e 3d    if( pFile->h>=
2ef30 30 20 29 7b 0a 23 69 66 64 65 66 20 53 54 52 49  0 ){.#ifdef STRI
2ef40 43 54 5f 43 4c 4f 53 45 5f 45 52 52 4f 52 0a 20  CT_CLOSE_ERROR. 
2ef50 20 20 20 20 20 20 20 20 20 69 66 28 20 63 6c 6f           if( clo
2ef60 73 65 28 70 46 69 6c 65 2d 3e 68 29 20 29 7b 0a  se(pFile->h) ){.
2ef70 20 20 20 20 20 20 20 20 20 20 20 20 70 46 69 6c              pFil
2ef80 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 65  e->lastErrno = e
2ef90 72 72 6e 6f 3b 0a 20 20 20 20 20 20 20 20 20 20  rrno;.          
2efa0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
2efb0 49 4f 45 52 52 5f 43 4c 4f 53 45 3b 0a 20 20 20  IOERR_CLOSE;.   
2efc0 20 20 20 20 20 20 20 7d 0a 23 65 6c 73 65 0a 20         }.#else. 
2efd0 20 20 20 20 20 20 20 20 20 63 6c 6f 73 65 28 70           close(p
2efe0 46 69 6c 65 2d 3e 68 29 3b 20 2f 2a 20 73 69 6c  File->h); /* sil
2eff0 65 6e 74 6c 79 20 6c 65 61 6b 20 66 64 20 69 66  ently leak fd if
2f000 20 66 61 69 6c 20 2a 2f 0a 23 65 6e 64 69 66 0a   fail */.#endif.
2f010 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2f020 20 20 70 46 69 6c 65 2d 3e 68 20 3d 20 2d 31 3b    pFile->h = -1;
2f030 0a 20 20 20 20 20 20 20 20 69 6e 74 20 66 64 20  .        int fd 
2f040 3d 20 6f 70 65 6e 28 70 43 74 78 2d 3e 64 62 50  = open(pCtx->dbP
2f050 61 74 68 2c 20 70 46 69 6c 65 2d 3e 6f 70 65 6e  ath, pFile->open
2f060 46 6c 61 67 73 2c 0a 20 20 20 20 20 20 20 20 20  Flags,.         
2f070 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c               SQL
2f080 49 54 45 5f 44 45 46 41 55 4c 54 5f 46 49 4c 45  ITE_DEFAULT_FILE
2f090 5f 50 45 52 4d 49 53 53 49 4f 4e 53 29 3b 0a 20  _PERMISSIONS);. 
2f0a0 20 20 20 20 20 20 20 4f 53 54 52 41 43 45 28 28         OSTRACE((
2f0b0 22 54 52 41 4e 53 50 52 4f 58 59 3a 20 4f 50 45  "TRANSPROXY: OPE
2f0c0 4e 20 20 25 64 5c 6e 22 2c 20 66 64 29 29 3b 0a  N  %d\n", fd));.
2f0d0 20 20 20 20 20 20 20 20 69 66 28 20 66 64 3e 3d          if( fd>=
2f0e0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70  0 ){.          p
2f0f0 46 69 6c 65 2d 3e 68 20 3d 20 66 64 3b 0a 20 20  File->h = fd;.  
2f100 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
2f110 20 20 20 20 20 20 20 72 63 3d 53 51 4c 49 54 45         rc=SQLITE
2f120 5f 43 41 4e 54 4f 50 45 4e 5f 42 4b 50 54 3b 20  _CANTOPEN_BKPT; 
2f130 2f 2a 20 53 51 4c 49 54 45 5f 42 55 53 59 3f 20  /* SQLITE_BUSY? 
2f140 70 72 6f 78 79 54 61 6b 65 43 6f 6e 63 68 20 63  proxyTakeConch c
2f150 61 6c 6c 65 64 0a 20 20 20 20 20 20 20 20 20 20  alled.          
2f160 20 64 75 72 69 6e 67 20 6c 6f 63 6b 69 6e 67 20   during locking 
2f170 2a 2f 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  */.        }.   
2f180 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72     }.      if( r
2f190 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
2f1a0 21 70 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79  !pCtx->lockProxy
2f1b0 20 29 7b 0a 20 20 20 20 20 20 20 20 63 68 61 72   ){.        char
2f1c0 20 2a 70 61 74 68 20 3d 20 74 65 6d 70 4c 6f 63   *path = tempLoc
2f1d0 6b 50 61 74 68 20 3f 20 74 65 6d 70 4c 6f 63 6b  kPath ? tempLock
2f1e0 50 61 74 68 20 3a 20 70 43 74 78 2d 3e 6c 6f 63  Path : pCtx->loc
2f1f0 6b 50 72 6f 78 79 50 61 74 68 3b 0a 20 20 20 20  kProxyPath;.    
2f200 20 20 20 20 72 63 20 3d 20 70 72 6f 78 79 43 72      rc = proxyCr
2f210 65 61 74 65 55 6e 69 78 46 69 6c 65 28 70 61 74  eateUnixFile(pat
2f220 68 2c 20 26 70 43 74 78 2d 3e 6c 6f 63 6b 50 72  h, &pCtx->lockPr
2f230 6f 78 79 2c 20 31 29 3b 0a 20 20 20 20 20 20 20  oxy, 1);.       
2f240 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
2f250 4f 4b 20 26 26 20 72 63 21 3d 53 51 4c 49 54 45  OK && rc!=SQLITE
2f260 5f 4e 4f 4d 45 4d 20 26 26 20 74 72 79 4f 6c 64  _NOMEM && tryOld
2f270 4c 6f 63 6b 50 61 74 68 20 29 7b 0a 20 20 20 20  LockPath ){.    
2f280 20 20 20 20 20 20 2f 2a 20 77 65 20 63 6f 75 6c        /* we coul
2f290 64 6e 27 74 20 63 72 65 61 74 65 20 74 68 65 20  dn't create the 
2f2a0 70 72 6f 78 79 20 6c 6f 63 6b 20 66 69 6c 65 20  proxy lock file 
2f2b0 77 69 74 68 20 74 68 65 20 6f 6c 64 20 6c 6f 63  with the old loc
2f2c0 6b 20 66 69 6c 65 20 70 61 74 68 0a 20 20 20 20  k file path.    
2f2d0 20 20 20 20 20 20 20 2a 2a 20 73 6f 20 74 72 79         ** so try
2f2e0 20 61 67 61 69 6e 20 76 69 61 20 61 75 74 6f 2d   again via auto-
2f2f0 6e 61 6d 69 6e 67 20 0a 20 20 20 20 20 20 20 20  naming .        
2f300 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20     */.          
2f310 66 6f 72 63 65 4e 65 77 4c 6f 63 6b 50 61 74 68  forceNewLockPath
2f320 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20   = 1;.          
2f330 74 72 79 4f 6c 64 4c 6f 63 6b 50 61 74 68 20 3d  tryOldLockPath =
2f340 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 63 6f   0;.          co
2f350 6e 74 69 6e 75 65 3b 20 2f 2a 20 67 6f 20 62 61  ntinue; /* go ba
2f360 63 6b 20 74 6f 20 74 68 65 20 64 6f 20 7b 7d 20  ck to the do {} 
2f370 77 68 69 6c 65 20 73 74 61 72 74 20 70 6f 69 6e  while start poin
2f380 74 2c 20 74 72 79 20 61 67 61 69 6e 20 2a 2f 0a  t, try again */.
2f390 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2f3a0 7d 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d  }.      if( rc==
2f3b0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
2f3c0 20 20 20 20 20 2f 2a 20 4e 65 65 64 20 74 6f 20       /* Need to 
2f3d0 6d 61 6b 65 20 61 20 63 6f 70 79 20 6f 66 20 70  make a copy of p
2f3e0 61 74 68 20 69 66 20 77 65 20 65 78 74 72 61 63  ath if we extrac
2f3f0 74 65 64 20 74 68 65 20 76 61 6c 75 65 0a 20 20  ted the value.  
2f400 20 20 20 20 20 20 20 2a 2a 20 66 72 6f 6d 20 74         ** from t
2f410 68 65 20 63 6f 6e 63 68 20 66 69 6c 65 20 6f 72  he conch file or
2f420 20 74 68 65 20 70 61 74 68 20 77 61 73 20 61 6c   the path was al
2f430 6c 6f 63 61 74 65 64 20 6f 6e 20 74 68 65 20 73  located on the s
2f440 74 61 63 6b 0a 20 20 20 20 20 20 20 20 20 2a 2f  tack.         */
2f450 0a 20 20 20 20 20 20 20 20 69 66 28 20 74 65 6d  .        if( tem
2f460 70 4c 6f 63 6b 50 61 74 68 20 29 7b 0a 20 20 20  pLockPath ){.   
2f470 20 20 20 20 20 20 20 70 43 74 78 2d 3e 6c 6f 63         pCtx->loc
2f480 6b 50 72 6f 78 79 50 61 74 68 20 3d 20 73 71 6c  kProxyPath = sql
2f490 69 74 65 33 44 62 53 74 72 44 75 70 28 30 2c 20  ite3DbStrDup(0, 
2f4a0 74 65 6d 70 4c 6f 63 6b 50 61 74 68 29 3b 0a 20  tempLockPath);. 
2f4b0 20 20 20 20 20 20 20 20 20 69 66 28 20 21 70 43           if( !pC
2f4c0 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 50 61 74  tx->lockProxyPat
2f4d0 68 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  h ){.           
2f4e0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d   rc = SQLITE_NOM
2f4f0 45 4d 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  EM;.          }.
2f500 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2f510 7d 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d  }.      if( rc==
2f520 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
2f530 20 20 20 20 20 70 43 74 78 2d 3e 63 6f 6e 63 68       pCtx->conch
2f540 48 65 6c 64 20 3d 20 31 3b 0a 20 20 20 20 20 20  Held = 1;.      
2f550 20 20 0a 20 20 20 20 20 20 20 20 69 66 28 20 70    .        if( p
2f560 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 2d 3e  Ctx->lockProxy->
2f570 70 4d 65 74 68 6f 64 20 3d 3d 20 26 61 66 70 49  pMethod == &afpI
2f580 6f 4d 65 74 68 6f 64 73 20 29 7b 0a 20 20 20 20  oMethods ){.    
2f590 20 20 20 20 20 20 61 66 70 4c 6f 63 6b 69 6e 67        afpLocking
2f5a0 43 6f 6e 74 65 78 74 20 2a 61 66 70 43 74 78 3b  Context *afpCtx;
2f5b0 0a 20 20 20 20 20 20 20 20 20 20 61 66 70 43 74  .          afpCt
2f5c0 78 20 3d 20 28 61 66 70 4c 6f 63 6b 69 6e 67 43  x = (afpLockingC
2f5d0 6f 6e 74 65 78 74 20 2a 29 70 43 74 78 2d 3e 6c  ontext *)pCtx->l
2f5e0 6f 63 6b 50 72 6f 78 79 2d 3e 6c 6f 63 6b 69 6e  ockProxy->lockin
2f5f0 67 43 6f 6e 74 65 78 74 3b 0a 20 20 20 20 20 20  gContext;.      
2f600 20 20 20 20 61 66 70 43 74 78 2d 3e 64 62 50 61      afpCtx->dbPa
2f610 74 68 20 3d 20 70 43 74 78 2d 3e 6c 6f 63 6b 50  th = pCtx->lockP
2f620 72 6f 78 79 50 61 74 68 3b 0a 20 20 20 20 20 20  roxyPath;.      
2f630 20 20 7d 0a 20 20 20 20 20 20 7d 20 65 6c 73 65    }.      } else
2f640 20 7b 0a 20 20 20 20 20 20 20 20 63 6f 6e 63 68   {.        conch
2f650 46 69 6c 65 2d 3e 70 4d 65 74 68 6f 64 2d 3e 78  File->pMethod->x
2f660 55 6e 6c 6f 63 6b 28 28 73 71 6c 69 74 65 33 5f  Unlock((sqlite3_
2f670 66 69 6c 65 2a 29 63 6f 6e 63 68 46 69 6c 65 2c  file*)conchFile,
2f680 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20   NO_LOCK);.     
2f690 20 7d 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45   }.      OSTRACE
2f6a0 28 28 22 54 41 4b 45 43 4f 4e 43 48 20 20 25 64  (("TAKECONCH  %d
2f6b0 20 25 73 5c 6e 22 2c 20 63 6f 6e 63 68 46 69 6c   %s\n", conchFil
2f6c0 65 2d 3e 68 2c 0a 20 20 20 20 20 20 20 20 20 20  e->h,.          
2f6d0 20 20 20 20 20 72 63 3d 3d 53 51 4c 49 54 45 5f       rc==SQLITE_
2f6e0 4f 4b 3f 22 6f 6b 22 3a 22 66 61 69 6c 65 64 22  OK?"ok":"failed"
2f6f0 29 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  ));.      return
2f700 20 72 63 3b 0a 20 20 20 20 7d 20 77 68 69 6c 65   rc;.    } while
2f710 20 28 31 29 3b 20 2f 2a 20 69 6e 20 63 61 73 65   (1); /* in case
2f720 20 77 65 20 6e 65 65 64 20 74 6f 20 72 65 74 72   we need to retr
2f730 79 20 74 68 65 20 3a 61 75 74 6f 3a 20 6c 6f 63  y the :auto: loc
2f740 6b 20 66 69 6c 65 20 2d 20 0a 20 20 20 20 20 20  k file - .      
2f750 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 77 65             ** we
2f760 20 73 68 6f 75 6c 64 20 6e 65 76 65 72 20 67 65   should never ge
2f770 74 20 68 65 72 65 20 65 78 63 65 70 74 20 76 69  t here except vi
2f780 61 20 74 68 65 20 27 63 6f 6e 74 69 6e 75 65 27  a the 'continue'
2f790 20 63 61 6c 6c 2e 20 2a 2f 0a 20 20 7d 0a 7d 0a   call. */.  }.}.
2f7a0 0a 2f 2a 0a 2a 2a 20 49 66 20 70 46 69 6c 65 20  ./*.** If pFile 
2f7b0 68 6f 6c 64 73 20 61 20 6c 6f 63 6b 20 6f 6e 20  holds a lock on 
2f7c0 61 20 63 6f 6e 63 68 20 66 69 6c 65 2c 20 74 68  a conch file, th
2f7d0 65 6e 20 72 65 6c 65 61 73 65 20 74 68 61 74 20  en release that 
2f7e0 6c 6f 63 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  lock..*/.static 
2f7f0 69 6e 74 20 70 72 6f 78 79 52 65 6c 65 61 73 65  int proxyRelease
2f800 43 6f 6e 63 68 28 75 6e 69 78 46 69 6c 65 20 2a  Conch(unixFile *
2f810 70 46 69 6c 65 29 7b 0a 20 20 69 6e 74 20 72 63  pFile){.  int rc
2f820 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20   = SQLITE_OK;   
2f830 20 20 20 20 20 20 2f 2a 20 53 75 62 72 6f 75 74        /* Subrout
2f840 69 6e 65 20 72 65 74 75 72 6e 20 63 6f 64 65 20  ine return code 
2f850 2a 2f 0a 20 20 70 72 6f 78 79 4c 6f 63 6b 69 6e  */.  proxyLockin
2f860 67 43 6f 6e 74 65 78 74 20 2a 70 43 74 78 3b 20  gContext *pCtx; 
2f870 20 2f 2a 20 54 68 65 20 6c 6f 63 6b 69 6e 67 20   /* The locking 
2f880 63 6f 6e 74 65 78 74 20 66 6f 72 20 74 68 65 20  context for the 
2f890 70 72 6f 78 79 20 6c 6f 63 6b 20 2a 2f 0a 20 20  proxy lock */.  
2f8a0 75 6e 69 78 46 69 6c 65 20 2a 63 6f 6e 63 68 46  unixFile *conchF
2f8b0 69 6c 65 3b 20 20 20 20 20 20 20 20 2f 2a 20 4e  ile;        /* N
2f8c0 61 6d 65 20 6f 66 20 74 68 65 20 63 6f 6e 63 68  ame of the conch
2f8d0 20 66 69 6c 65 20 2a 2f 0a 0a 20 20 70 43 74 78   file */..  pCtx
2f8e0 20 3d 20 28 70 72 6f 78 79 4c 6f 63 6b 69 6e 67   = (proxyLocking
2f8f0 43 6f 6e 74 65 78 74 20 2a 29 70 46 69 6c 65 2d  Context *)pFile-
2f900 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b  >lockingContext;
2f910 0a 20 20 63 6f 6e 63 68 46 69 6c 65 20 3d 20 70  .  conchFile = p
2f920 43 74 78 2d 3e 63 6f 6e 63 68 46 69 6c 65 3b 0a  Ctx->conchFile;.
2f930 20 20 4f 53 54 52 41 43 45 28 28 22 52 45 4c 45    OSTRACE(("RELE
2f940 41 53 45 43 4f 4e 43 48 20 20 25 64 20 66 6f 72  ASECONCH  %d for
2f950 20 25 73 20 70 69 64 3d 25 64 5c 6e 22 2c 20 63   %s pid=%d\n", c
2f960 6f 6e 63 68 46 69 6c 65 2d 3e 68 2c 0a 20 20 20  onchFile->h,.   
2f970 20 20 20 20 20 20 20 20 28 70 43 74 78 2d 3e 6c          (pCtx->l
2f980 6f 63 6b 50 72 6f 78 79 50 61 74 68 20 3f 20 70  ockProxyPath ? p
2f990 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 50 61  Ctx->lockProxyPa
2f9a0 74 68 20 3a 20 22 3a 61 75 74 6f 3a 22 29 2c 20  th : ":auto:"), 
2f9b0 0a 20 20 20 20 20 20 20 20 20 20 20 67 65 74 70  .           getp
2f9c0 69 64 28 29 29 29 3b 0a 20 20 69 66 28 20 70 43  id()));.  if( pC
2f9d0 74 78 2d 3e 63 6f 6e 63 68 48 65 6c 64 3e 30 20  tx->conchHeld>0 
2f9e0 29 7b 0a 20 20 20 20 72 63 20 3d 20 63 6f 6e 63  ){.    rc = conc
2f9f0 68 46 69 6c 65 2d 3e 70 4d 65 74 68 6f 64 2d 3e  hFile->pMethod->
2fa00 78 55 6e 6c 6f 63 6b 28 28 73 71 6c 69 74 65 33  xUnlock((sqlite3
2fa10 5f 66 69 6c 65 2a 29 63 6f 6e 63 68 46 69 6c 65  _file*)conchFile
2fa20 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20 20 7d 0a  , NO_LOCK);.  }.
2fa30 20 20 70 43 74 78 2d 3e 63 6f 6e 63 68 48 65 6c    pCtx->conchHel
2fa40 64 20 3d 20 30 3b 0a 20 20 4f 53 54 52 41 43 45  d = 0;.  OSTRACE
2fa50 28 28 22 52 45 4c 45 41 53 45 43 4f 4e 43 48 20  (("RELEASECONCH 
2fa60 20 25 64 20 25 73 5c 6e 22 2c 20 63 6f 6e 63 68   %d %s\n", conch
2fa70 46 69 6c 65 2d 3e 68 2c 0a 20 20 20 20 20 20 20  File->h,.       
2fa80 20 20 20 20 28 72 63 3d 3d 53 51 4c 49 54 45 5f      (rc==SQLITE_
2fa90 4f 4b 20 3f 20 22 6f 6b 22 20 3a 20 22 66 61 69  OK ? "ok" : "fai
2faa0 6c 65 64 22 29 29 29 3b 0a 20 20 72 65 74 75 72  led")));.  retur
2fab0 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47  n rc;.}../*.** G
2fac0 69 76 65 6e 20 74 68 65 20 6e 61 6d 65 20 6f 66  iven the name of
2fad0 20 61 20 64 61 74 61 62 61 73 65 20 66 69 6c 65   a database file
2fae0 2c 20 63 6f 6d 70 75 74 65 20 74 68 65 20 6e 61  , compute the na
2faf0 6d 65 20 6f 66 20 69 74 73 20 63 6f 6e 63 68 20  me of its conch 
2fb00 66 69 6c 65 2e 0a 2a 2a 20 53 74 6f 72 65 20 74  file..** Store t
2fb10 68 65 20 63 6f 6e 63 68 20 66 69 6c 65 6e 61 6d  he conch filenam
2fb20 65 20 69 6e 20 6d 65 6d 6f 72 79 20 6f 62 74 61  e in memory obta
2fb30 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69 74 65  ined from sqlite
2fb40 33 5f 6d 61 6c 6c 6f 63 28 29 2e 0a 2a 2a 20 4d  3_malloc()..** M
2fb50 61 6b 65 20 2a 70 43 6f 6e 63 68 50 61 74 68 20  ake *pConchPath 
2fb60 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 6e 65 77  point to the new
2fb70 20 6e 61 6d 65 2e 20 20 52 65 74 75 72 6e 20 53   name.  Return S
2fb80 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63  QLITE_OK on succ
2fb90 65 73 73 0a 2a 2a 20 6f 72 20 53 51 4c 49 54 45  ess.** or SQLITE
2fba0 5f 4e 4f 4d 45 4d 20 69 66 20 75 6e 61 62 6c 65  _NOMEM if unable
2fbb0 20 74 6f 20 6f 62 74 61 69 6e 20 6d 65 6d 6f 72   to obtain memor
2fbc0 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 61 6c  y..**.** The cal
2fbd0 6c 65 72 20 69 73 20 72 65 73 70 6f 6e 73 69 62  ler is responsib
2fbe0 6c 65 20 66 6f 72 20 65 6e 73 75 72 69 6e 67 20  le for ensuring 
2fbf0 74 68 61 74 20 74 68 65 20 61 6c 6c 6f 63 61 74  that the allocat
2fc00 65 64 20 6d 65 6d 6f 72 79 0a 2a 2a 20 73 70 61  ed memory.** spa
2fc10 63 65 20 69 73 20 65 76 65 6e 74 75 61 6c 6c 79  ce is eventually
2fc20 20 66 72 65 65 64 2e 0a 2a 2a 0a 2a 2a 20 2a 70   freed..**.** *p
2fc30 43 6f 6e 63 68 50 61 74 68 20 69 73 20 73 65 74  ConchPath is set
2fc40 20 74 6f 20 4e 55 4c 4c 20 69 66 20 61 20 6d 65   to NULL if a me
2fc50 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20  mory allocation 
2fc60 65 72 72 6f 72 20 6f 63 63 75 72 73 2e 0a 2a 2f  error occurs..*/
2fc70 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72 6f 78  .static int prox
2fc80 79 43 72 65 61 74 65 43 6f 6e 63 68 50 61 74 68  yCreateConchPath
2fc90 6e 61 6d 65 28 63 68 61 72 20 2a 64 62 50 61 74  name(char *dbPat
2fca0 68 2c 20 63 68 61 72 20 2a 2a 70 43 6f 6e 63 68  h, char **pConch
2fcb0 50 61 74 68 29 7b 0a 20 20 69 6e 74 20 69 3b 20  Path){.  int i; 
2fcc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2fcd0 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63         /* Loop c
2fce0 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20  ounter */.  int 
2fcf0 6c 65 6e 20 3d 20 28 69 6e 74 29 73 74 72 6c 65  len = (int)strle
2fd00 6e 28 64 62 50 61 74 68 29 3b 20 2f 2a 20 4c 65  n(dbPath); /* Le
2fd10 6e 67 74 68 20 6f 66 20 64 61 74 61 62 61 73 65  ngth of database
2fd20 20 66 69 6c 65 6e 61 6d 65 20 2d 20 64 62 50 61   filename - dbPa
2fd30 74 68 20 2a 2f 0a 20 20 63 68 61 72 20 2a 63 6f  th */.  char *co
2fd40 6e 63 68 50 61 74 68 3b 20 20 20 20 20 20 20 20  nchPath;        
2fd50 20 20 20 20 20 20 2f 2a 20 62 75 66 66 65 72 20        /* buffer 
2fd60 69 6e 20 77 68 69 63 68 20 74 6f 20 63 6f 6e 73  in which to cons
2fd70 74 72 75 63 74 20 63 6f 6e 63 68 20 6e 61 6d 65  truct conch name
2fd80 20 2a 2f 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61   */..  /* Alloca
2fd90 74 65 20 73 70 61 63 65 20 66 6f 72 20 74 68 65  te space for the
2fda0 20 63 6f 6e 63 68 20 66 69 6c 65 6e 61 6d 65 20   conch filename 
2fdb0 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a 65 20 74  and initialize t
2fdc0 68 65 20 6e 61 6d 65 20 74 6f 0a 20 20 2a 2a 20  he name to.  ** 
2fdd0 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20  the name of the 
2fde0 6f 72 69 67 69 6e 61 6c 20 64 61 74 61 62 61 73  original databas
2fdf0 65 20 66 69 6c 65 2e 20 2a 2f 20 20 0a 20 20 2a  e file. */  .  *
2fe00 70 43 6f 6e 63 68 50 61 74 68 20 3d 20 63 6f 6e  pConchPath = con
2fe10 63 68 50 61 74 68 20 3d 20 28 63 68 61 72 20 2a  chPath = (char *
2fe20 29 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28  )sqlite3_malloc(
2fe30 6c 65 6e 20 2b 20 38 29 3b 0a 20 20 69 66 28 20  len + 8);.  if( 
2fe40 63 6f 6e 63 68 50 61 74 68 3d 3d 30 20 29 7b 0a  conchPath==0 ){.
2fe50 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
2fe60 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 6d  E_NOMEM;.  }.  m
2fe70 65 6d 63 70 79 28 63 6f 6e 63 68 50 61 74 68 2c  emcpy(conchPath,
2fe80 20 64 62 50 61 74 68 2c 20 6c 65 6e 2b 31 29 3b   dbPath, len+1);
2fe90 0a 20 20 0a 20 20 2f 2a 20 6e 6f 77 20 69 6e 73  .  .  /* now ins
2fea0 65 72 74 20 61 20 22 2e 22 20 62 65 66 6f 72 65  ert a "." before
2feb0 20 74 68 65 20 6c 61 73 74 20 2f 20 63 68 61 72   the last / char
2fec0 61 63 74 65 72 20 2a 2f 0a 20 20 66 6f 72 28 20  acter */.  for( 
2fed0 69 3d 28 6c 65 6e 2d 31 29 3b 20 69 3e 3d 30 3b  i=(len-1); i>=0;
2fee0 20 69 2d 2d 20 29 7b 0a 20 20 20 20 69 66 28 20   i-- ){.    if( 
2fef0 63 6f 6e 63 68 50 61 74 68 5b 69 5d 3d 3d 27 2f  conchPath[i]=='/
2ff00 27 20 29 7b 0a 20 20 20 20 20 20 69 2b 2b 3b 0a  ' ){.      i++;.
2ff10 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
2ff20 20 7d 0a 20 20 7d 0a 20 20 63 6f 6e 63 68 50 61   }.  }.  conchPa
2ff30 74 68 5b 69 5d 3d 27 2e 27 3b 0a 20 20 77 68 69  th[i]='.';.  whi
2ff40 6c 65 20 28 20 69 3c 6c 65 6e 20 29 7b 0a 20 20  le ( i<len ){.  
2ff50 20 20 63 6f 6e 63 68 50 61 74 68 5b 69 2b 31 5d    conchPath[i+1]
2ff60 3d 64 62 50 61 74 68 5b 69 5d 3b 0a 20 20 20 20  =dbPath[i];.    
2ff70 69 2b 2b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 61  i++;.  }..  /* a
2ff80 70 70 65 6e 64 20 74 68 65 20 22 2d 63 6f 6e 63  ppend the "-conc
2ff90 68 22 20 73 75 66 66 69 78 20 74 6f 20 74 68 65  h" suffix to the
2ffa0 20 66 69 6c 65 20 2a 2f 0a 20 20 6d 65 6d 63 70   file */.  memcp
2ffb0 79 28 26 63 6f 6e 63 68 50 61 74 68 5b 69 2b 31  y(&conchPath[i+1
2ffc0 5d 2c 20 22 2d 63 6f 6e 63 68 22 2c 20 37 29 3b  ], "-conch", 7);
2ffd0 0a 20 20 61 73 73 65 72 74 28 20 28 69 6e 74 29  .  assert( (int)
2ffe0 73 74 72 6c 65 6e 28 63 6f 6e 63 68 50 61 74 68  strlen(conchPath
2fff0 29 20 3d 3d 20 6c 65 6e 2b 37 20 29 3b 0a 0a 20  ) == len+7 );.. 
30000 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
30010 4b 3b 0a 7d 0a 0a 0a 2f 2a 20 54 61 6b 65 73 20  K;.}.../* Takes 
30020 61 20 66 75 6c 6c 79 20 63 6f 6e 66 69 67 75 72  a fully configur
30030 65 64 20 70 72 6f 78 79 20 6c 6f 63 6b 69 6e 67  ed proxy locking
30040 2d 73 74 79 6c 65 20 75 6e 69 78 20 66 69 6c 65  -style unix file
30050 20 61 6e 64 20 73 77 69 74 63 68 65 73 0a 2a 2a   and switches.**
30060 20 74 68 65 20 6c 6f 63 61 6c 20 6c 6f 63 6b 20   the local lock 
30070 66 69 6c 65 20 70 61 74 68 20 0a 2a 2f 0a 73 74  file path .*/.st
30080 61 74 69 63 20 69 6e 74 20 73 77 69 74 63 68 4c  atic int switchL
30090 6f 63 6b 50 72 6f 78 79 50 61 74 68 28 75 6e 69  ockProxyPath(uni
300a0 78 46 69 6c 65 20 2a 70 46 69 6c 65 2c 20 63 6f  xFile *pFile, co
300b0 6e 73 74 20 63 68 61 72 20 2a 70 61 74 68 29 20  nst char *path) 
300c0 7b 0a 20 20 70 72 6f 78 79 4c 6f 63 6b 69 6e 67  {.  proxyLocking
300d0 43 6f 6e 74 65 78 74 20 2a 70 43 74 78 20 3d 20  Context *pCtx = 
300e0 28 70 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e  (proxyLockingCon
300f0 74 65 78 74 2a 29 70 46 69 6c 65 2d 3e 6c 6f 63  text*)pFile->loc
30100 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 0a 20 20 63  kingContext;.  c
30110 68 61 72 20 2a 6f 6c 64 50 61 74 68 20 3d 20 70  har *oldPath = p
30120 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 50 61  Ctx->lockProxyPa
30130 74 68 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  th;.  int rc = S
30140 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 69 66 28  QLITE_OK;..  if(
30150 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63   pFile->eFileLoc
30160 6b 21 3d 4e 4f 5f 4c 4f 43 4b 20 29 7b 0a 20 20  k!=NO_LOCK ){.  
30170 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
30180 42 55 53 59 3b 0a 20 20 7d 20 20 0a 0a 20 20 2f  BUSY;.  }  ..  /
30190 2a 20 6e 6f 74 68 69 6e 67 20 74 6f 20 64 6f 20  * nothing to do 
301a0 69 66 20 74 68 65 20 70 61 74 68 20 69 73 20 4e  if the path is N
301b0 55 4c 4c 2c 20 3a 61 75 74 6f 3a 20 6f 72 20 6d  ULL, :auto: or m
301c0 61 74 63 68 65 73 20 74 68 65 20 65 78 69 73 74  atches the exist
301d0 69 6e 67 20 70 61 74 68 20 2a 2f 0a 20 20 69 66  ing path */.  if
301e0 28 20 21 70 61 74 68 20 7c 7c 20 70 61 74 68 5b  ( !path || path[
301f0 30 5d 3d 3d 27 5c 30 27 20 7c 7c 20 21 73 74 72  0]=='\0' || !str
30200 63 6d 70 28 70 61 74 68 2c 20 22 3a 61 75 74 6f  cmp(path, ":auto
30210 3a 22 29 20 7c 7c 0a 20 20 20 20 28 6f 6c 64 50  :") ||.    (oldP
30220 61 74 68 20 26 26 20 21 73 74 72 6e 63 6d 70 28  ath && !strncmp(
30230 6f 6c 64 50 61 74 68 2c 20 70 61 74 68 2c 20 4d  oldPath, path, M
30240 41 58 50 41 54 48 4c 45 4e 29 29 20 29 7b 0a 20  AXPATHLEN)) ){. 
30250 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
30260 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  _OK;.  }else{.  
30270 20 20 75 6e 69 78 46 69 6c 65 20 2a 6c 6f 63 6b    unixFile *lock
30280 50 72 6f 78 79 20 3d 20 70 43 74 78 2d 3e 6c 6f  Proxy = pCtx->lo
30290 63 6b 50 72 6f 78 79 3b 0a 20 20 20 20 70 43 74  ckProxy;.    pCt
302a0 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 3d 4e 55 4c  x->lockProxy=NUL
302b0 4c 3b 0a 20 20 20 20 70 43 74 78 2d 3e 63 6f 6e  L;.    pCtx->con
302c0 63 68 48 65 6c 64 20 3d 20 30 3b 0a 20 20 20 20  chHeld = 0;.    
302d0 69 66 28 20 6c 6f 63 6b 50 72 6f 78 79 21 3d 4e  if( lockProxy!=N
302e0 55 4c 4c 20 29 7b 0a 20 20 20 20 20 20 72 63 3d  ULL ){.      rc=
302f0 6c 6f 63 6b 50 72 6f 78 79 2d 3e 70 4d 65 74 68  lockProxy->pMeth
30300 6f 64 2d 3e 78 43 6c 6f 73 65 28 28 73 71 6c 69  od->xClose((sqli
30310 74 65 33 5f 66 69 6c 65 20 2a 29 6c 6f 63 6b 50  te3_file *)lockP
30320 72 6f 78 79 29 3b 0a 20 20 20 20 20 20 69 66 28  roxy);.      if(
30330 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
30340 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66  .      sqlite3_f
30350 72 65 65 28 6c 6f 63 6b 50 72 6f 78 79 29 3b 0a  ree(lockProxy);.
30360 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
30370 33 5f 66 72 65 65 28 6f 6c 64 50 61 74 68 29 3b  3_free(oldPath);
30380 0a 20 20 20 20 70 43 74 78 2d 3e 6c 6f 63 6b 50  .    pCtx->lockP
30390 72 6f 78 79 50 61 74 68 20 3d 20 73 71 6c 69 74  roxyPath = sqlit
303a0 65 33 44 62 53 74 72 44 75 70 28 30 2c 20 70 61  e3DbStrDup(0, pa
303b0 74 68 29 3b 0a 20 20 7d 0a 20 20 0a 20 20 72 65  th);.  }.  .  re
303c0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
303d0 2a 20 70 46 69 6c 65 20 69 73 20 61 20 66 69 6c  * pFile is a fil
303e0 65 20 74 68 61 74 20 68 61 73 20 62 65 65 6e 20  e that has been 
303f0 6f 70 65 6e 65 64 20 62 79 20 61 20 70 72 69 6f  opened by a prio
30400 72 20 78 4f 70 65 6e 20 63 61 6c 6c 2e 20 20 64  r xOpen call.  d
30410 62 50 61 74 68 0a 2a 2a 20 69 73 20 61 20 73 74  bPath.** is a st
30420 72 69 6e 67 20 62 75 66 66 65 72 20 61 74 20 6c  ring buffer at l
30430 65 61 73 74 20 4d 41 58 50 41 54 48 4c 45 4e 2b  east MAXPATHLEN+
30440 31 20 63 68 61 72 61 63 74 65 72 73 20 69 6e 20  1 characters in 
30450 73 69 7a 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  size..**.** This
30460 20 72 6f 75 74 69 6e 65 20 66 69 6e 64 20 74 68   routine find th
30470 65 20 66 69 6c 65 6e 61 6d 65 20 61 73 73 6f 63  e filename assoc
30480 69 61 74 65 64 20 77 69 74 68 20 70 46 69 6c 65  iated with pFile
30490 20 61 6e 64 20 77 72 69 74 65 73 20 69 74 0a 2a   and writes it.*
304a0 2a 20 69 6e 74 20 64 62 50 61 74 68 2e 0a 2a 2f  * int dbPath..*/
304b0 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72 6f 78  .static int prox
304c0 79 47 65 74 44 62 50 61 74 68 46 6f 72 55 6e 69  yGetDbPathForUni
304d0 78 46 69 6c 65 28 75 6e 69 78 46 69 6c 65 20 2a  xFile(unixFile *
304e0 70 46 69 6c 65 2c 20 63 68 61 72 20 2a 64 62 50  pFile, char *dbP
304f0 61 74 68 29 7b 0a 23 69 66 20 64 65 66 69 6e 65  ath){.#if define
30500 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 0a 20 20 69  d(__APPLE__).  i
30510 66 28 20 70 46 69 6c 65 2d 3e 70 4d 65 74 68 6f  f( pFile->pMetho
30520 64 20 3d 3d 20 26 61 66 70 49 6f 4d 65 74 68 6f  d == &afpIoMetho
30530 64 73 20 29 7b 0a 20 20 20 20 2f 2a 20 61 66 70  ds ){.    /* afp
30540 20 73 74 79 6c 65 20 6b 65 65 70 73 20 61 20 72   style keeps a r
30550 65 66 65 72 65 6e 63 65 20 74 6f 20 74 68 65 20  eference to the 
30560 64 62 20 70 61 74 68 20 69 6e 20 74 68 65 20 66  db path in the f
30570 69 6c 65 50 61 74 68 20 66 69 65 6c 64 20 0a 20  ilePath field . 
30580 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 73 74 72     ** of the str
30590 75 63 74 20 2a 2f 0a 20 20 20 20 61 73 73 65 72  uct */.    asser
305a0 74 28 20 28 69 6e 74 29 73 74 72 6c 65 6e 28 28  t( (int)strlen((
305b0 63 68 61 72 2a 29 70 46 69 6c 65 2d 3e 6c 6f 63  char*)pFile->loc
305c0 6b 69 6e 67 43 6f 6e 74 65 78 74 29 3c 3d 4d 41  kingContext)<=MA
305d0 58 50 41 54 48 4c 45 4e 20 29 3b 0a 20 20 20 20  XPATHLEN );.    
305e0 73 74 72 6c 63 70 79 28 64 62 50 61 74 68 2c 20  strlcpy(dbPath, 
305f0 28 28 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74  ((afpLockingCont
30600 65 78 74 20 2a 29 70 46 69 6c 65 2d 3e 6c 6f 63  ext *)pFile->loc
30610 6b 69 6e 67 43 6f 6e 74 65 78 74 29 2d 3e 64 62  kingContext)->db
30620 50 61 74 68 2c 20 4d 41 58 50 41 54 48 4c 45 4e  Path, MAXPATHLEN
30630 29 3b 0a 20 20 7d 20 65 6c 73 65 0a 23 65 6e 64  );.  } else.#end
30640 69 66 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e  if.  if( pFile->
30650 70 4d 65 74 68 6f 64 20 3d 3d 20 26 64 6f 74 6c  pMethod == &dotl
30660 6f 63 6b 49 6f 4d 65 74 68 6f 64 73 20 29 7b 0a  ockIoMethods ){.
30670 20 20 20 20 2f 2a 20 64 6f 74 20 6c 6f 63 6b 20      /* dot lock 
30680 73 74 79 6c 65 20 75 73 65 73 20 74 68 65 20 6c  style uses the l
30690 6f 63 6b 69 6e 67 20 63 6f 6e 74 65 78 74 20 74  ocking context t
306a0 6f 20 73 74 6f 72 65 20 74 68 65 20 64 6f 74 20  o store the dot 
306b0 6c 6f 63 6b 0a 20 20 20 20 2a 2a 20 66 69 6c 65  lock.    ** file
306c0 20 70 61 74 68 20 2a 2f 0a 20 20 20 20 69 6e 74   path */.    int
306d0 20 6c 65 6e 20 3d 20 73 74 72 6c 65 6e 28 28 63   len = strlen((c
306e0 68 61 72 20 2a 29 70 46 69 6c 65 2d 3e 6c 6f 63  har *)pFile->loc
306f0 6b 69 6e 67 43 6f 6e 74 65 78 74 29 20 2d 20 73  kingContext) - s
30700 74 72 6c 65 6e 28 44 4f 54 4c 4f 43 4b 5f 53 55  trlen(DOTLOCK_SU
30710 46 46 49 58 29 3b 0a 20 20 20 20 6d 65 6d 63 70  FFIX);.    memcp
30720 79 28 64 62 50 61 74 68 2c 20 28 63 68 61 72 20  y(dbPath, (char 
30730 2a 29 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67  *)pFile->locking
30740 43 6f 6e 74 65 78 74 2c 20 6c 65 6e 20 2b 20 31  Context, len + 1
30750 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
30760 2f 2a 20 61 6c 6c 20 6f 74 68 65 72 20 73 74 79  /* all other sty
30770 6c 65 73 20 75 73 65 20 74 68 65 20 6c 6f 63 6b  les use the lock
30780 69 6e 67 20 63 6f 6e 74 65 78 74 20 74 6f 20 73  ing context to s
30790 74 6f 72 65 20 74 68 65 20 64 62 20 66 69 6c 65  tore the db file
307a0 20 70 61 74 68 20 2a 2f 0a 20 20 20 20 61 73 73   path */.    ass
307b0 65 72 74 28 20 73 74 72 6c 65 6e 28 28 63 68 61  ert( strlen((cha
307c0 72 2a 29 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e  r*)pFile->lockin
307d0 67 43 6f 6e 74 65 78 74 29 3c 3d 4d 41 58 50 41  gContext)<=MAXPA
307e0 54 48 4c 45 4e 20 29 3b 0a 20 20 20 20 73 74 72  THLEN );.    str
307f0 6c 63 70 79 28 64 62 50 61 74 68 2c 20 28 63 68  lcpy(dbPath, (ch
30800 61 72 20 2a 29 70 46 69 6c 65 2d 3e 6c 6f 63 6b  ar *)pFile->lock
30810 69 6e 67 43 6f 6e 74 65 78 74 2c 20 4d 41 58 50  ingContext, MAXP
30820 41 54 48 4c 45 4e 29 3b 0a 20 20 7d 0a 20 20 72  ATHLEN);.  }.  r
30830 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
30840 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 61 6b 65 73 20  .}../*.** Takes 
30850 61 6e 20 61 6c 72 65 61 64 79 20 66 69 6c 6c 65  an already fille
30860 64 20 69 6e 20 75 6e 69 78 20 66 69 6c 65 20 61  d in unix file a
30870 6e 64 20 61 6c 74 65 72 73 20 69 74 20 73 6f 20  nd alters it so 
30880 61 6c 6c 20 66 69 6c 65 20 6c 6f 63 6b 69 6e 67  all file locking
30890 20 0a 2a 2a 20 77 69 6c 6c 20 62 65 20 70 65 72   .** will be per
308a0 66 6f 72 6d 65 64 20 6f 6e 20 74 68 65 20 6c 6f  formed on the lo
308b0 63 61 6c 20 70 72 6f 78 79 20 6c 6f 63 6b 20 66  cal proxy lock f
308c0 69 6c 65 2e 20 20 54 68 65 20 66 6f 6c 6c 6f 77  ile.  The follow
308d0 69 6e 67 20 66 69 65 6c 64 73 0a 2a 2a 20 61 72  ing fields.** ar
308e0 65 20 70 72 65 73 65 72 76 65 64 20 69 6e 20 74  e preserved in t
308f0 68 65 20 6c 6f 63 6b 69 6e 67 20 63 6f 6e 74 65  he locking conte
30900 78 74 20 73 6f 20 74 68 61 74 20 74 68 65 79 20  xt so that they 
30910 63 61 6e 20 62 65 20 72 65 73 74 6f 72 65 64 20  can be restored 
30920 61 6e 64 20 0a 2a 2a 20 74 68 65 20 75 6e 69 78  and .** the unix
30930 20 73 74 72 75 63 74 75 72 65 20 70 72 6f 70 65   structure prope
30940 72 6c 79 20 63 6c 65 61 6e 65 64 20 75 70 20 61  rly cleaned up a
30950 74 20 63 6c 6f 73 65 20 74 69 6d 65 3a 0a 2a 2a  t close time:.**
30960 20 20 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65    ->lockingConte
30970 78 74 0a 2a 2a 20 20 2d 3e 70 4d 65 74 68 6f 64  xt.**  ->pMethod
30980 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
30990 72 6f 78 79 54 72 61 6e 73 66 6f 72 6d 55 6e 69  roxyTransformUni
309a0 78 46 69 6c 65 28 75 6e 69 78 46 69 6c 65 20 2a  xFile(unixFile *
309b0 70 46 69 6c 65 2c 20 63 6f 6e 73 74 20 63 68 61  pFile, const cha
309c0 72 20 2a 70 61 74 68 29 20 7b 0a 20 20 70 72 6f  r *path) {.  pro
309d0 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  xyLockingContext
309e0 20 2a 70 43 74 78 3b 0a 20 20 63 68 61 72 20 64   *pCtx;.  char d
309f0 62 50 61 74 68 5b 4d 41 58 50 41 54 48 4c 45 4e  bPath[MAXPATHLEN
30a00 2b 31 5d 3b 20 20 20 20 20 20 20 2f 2a 20 4e 61  +1];       /* Na
30a10 6d 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  me of the databa
30a20 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 63 68 61  se file */.  cha
30a30 72 20 2a 6c 6f 63 6b 50 61 74 68 3d 4e 55 4c 4c  r *lockPath=NULL
30a40 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  ;.  int rc = SQL
30a50 49 54 45 5f 4f 4b 3b 0a 20 20 0a 20 20 69 66 28  ITE_OK;.  .  if(
30a60 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63   pFile->eFileLoc
30a70 6b 21 3d 4e 4f 5f 4c 4f 43 4b 20 29 7b 0a 20 20  k!=NO_LOCK ){.  
30a80 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
30a90 42 55 53 59 3b 0a 20 20 7d 0a 20 20 70 72 6f 78  BUSY;.  }.  prox
30aa0 79 47 65 74 44 62 50 61 74 68 46 6f 72 55 6e 69  yGetDbPathForUni
30ab0 78 46 69 6c 65 28 70 46 69 6c 65 2c 20 64 62 50  xFile(pFile, dbP
30ac0 61 74 68 29 3b 0a 20 20 69 66 28 20 21 70 61 74  ath);.  if( !pat
30ad0 68 20 7c 7c 20 70 61 74 68 5b 30 5d 3d 3d 27 5c  h || path[0]=='\
30ae0 30 27 20 7c 7c 20 21 73 74 72 63 6d 70 28 70 61  0' || !strcmp(pa
30af0 74 68 2c 20 22 3a 61 75 74 6f 3a 22 29 20 29 7b  th, ":auto:") ){
30b00 0a 20 20 20 20 6c 6f 63 6b 50 61 74 68 3d 4e 55  .    lockPath=NU
30b10 4c 4c 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  LL;.  }else{.   
30b20 20 6c 6f 63 6b 50 61 74 68 3d 28 63 68 61 72 20   lockPath=(char 
30b30 2a 29 70 61 74 68 3b 0a 20 20 7d 0a 20 20 0a 20  *)path;.  }.  . 
30b40 20 4f 53 54 52 41 43 45 28 28 22 54 52 41 4e 53   OSTRACE(("TRANS
30b50 50 52 4f 58 59 20 20 25 64 20 66 6f 72 20 25 73  PROXY  %d for %s
30b60 20 70 69 64 3d 25 64 5c 6e 22 2c 20 70 46 69 6c   pid=%d\n", pFil
30b70 65 2d 3e 68 2c 0a 20 20 20 20 20 20 20 20 20 20  e->h,.          
30b80 20 28 6c 6f 63 6b 50 61 74 68 20 3f 20 6c 6f 63   (lockPath ? loc
30b90 6b 50 61 74 68 20 3a 20 22 3a 61 75 74 6f 3a 22  kPath : ":auto:"
30ba0 29 2c 20 67 65 74 70 69 64 28 29 29 29 3b 0a 0a  ), getpid()));..
30bb0 20 20 70 43 74 78 20 3d 20 73 71 6c 69 74 65 33    pCtx = sqlite3
30bc0 5f 6d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28  _malloc( sizeof(
30bd0 2a 70 43 74 78 29 20 29 3b 0a 20 20 69 66 28 20  *pCtx) );.  if( 
30be0 70 43 74 78 3d 3d 30 20 29 7b 0a 20 20 20 20 72  pCtx==0 ){.    r
30bf0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
30c00 45 4d 3b 0a 20 20 7d 0a 20 20 6d 65 6d 73 65 74  EM;.  }.  memset
30c10 28 70 43 74 78 2c 20 30 2c 20 73 69 7a 65 6f 66  (pCtx, 0, sizeof
30c20 28 2a 70 43 74 78 29 29 3b 0a 0a 20 20 72 63 20  (*pCtx));..  rc 
30c30 3d 20 70 72 6f 78 79 43 72 65 61 74 65 43 6f 6e  = proxyCreateCon
30c40 63 68 50 61 74 68 6e 61 6d 65 28 64 62 50 61 74  chPathname(dbPat
30c50 68 2c 20 26 70 43 74 78 2d 3e 63 6f 6e 63 68 46  h, &pCtx->conchF
30c60 69 6c 65 50 61 74 68 29 3b 0a 20 20 69 66 28 20  ilePath);.  if( 
30c70 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
30c80 0a 20 20 20 20 72 63 20 3d 20 70 72 6f 78 79 43  .    rc = proxyC
30c90 72 65 61 74 65 55 6e 69 78 46 69 6c 65 28 70 43  reateUnixFile(pC
30ca0 74 78 2d 3e 63 6f 6e 63 68 46 69 6c 65 50 61 74  tx->conchFilePat
30cb0 68 2c 20 26 70 43 74 78 2d 3e 63 6f 6e 63 68 46  h, &pCtx->conchF
30cc0 69 6c 65 2c 20 30 29 3b 0a 20 20 20 20 69 66 28  ile, 0);.    if(
30cd0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 43 41 4e 54   rc==SQLITE_CANT
30ce0 4f 50 45 4e 20 26 26 20 28 28 70 46 69 6c 65 2d  OPEN && ((pFile-
30cf0 3e 6f 70 65 6e 46 6c 61 67 73 26 4f 5f 52 44 57  >openFlags&O_RDW
30d00 52 29 20 3d 3d 20 30 29 20 29 7b 0a 20 20 20 20  R) == 0) ){.    
30d10 20 20 2f 2a 20 69 66 20 28 61 29 20 74 68 65 20    /* if (a) the 
30d20 6f 70 65 6e 20 66 6c 61 67 73 20 61 72 65 20 6e  open flags are n
30d30 6f 74 20 4f 5f 52 44 57 52 2c 20 28 62 29 20 74  ot O_RDWR, (b) t
30d40 68 65 20 63 6f 6e 63 68 20 69 73 6e 27 74 20 74  he conch isn't t
30d50 68 65 72 65 2c 20 61 6e 64 0a 20 20 20 20 20 20  here, and.      
30d60 2a 2a 20 28 63 29 20 74 68 65 20 66 69 6c 65 20  ** (c) the file 
30d70 73 79 73 74 65 6d 20 69 73 20 72 65 61 64 2d 6f  system is read-o
30d80 6e 6c 79 2c 20 74 68 65 6e 20 65 6e 61 62 6c 65  nly, then enable
30d90 20 6e 6f 2d 6c 6f 63 6b 69 6e 67 20 61 63 63 65   no-locking acce
30da0 73 73 2e 0a 20 20 20 20 20 20 2a 2a 20 55 67 68  ss..      ** Ugh
30db0 2c 20 73 69 6e 63 65 20 4f 5f 52 44 4f 4e 4c 59  , since O_RDONLY
30dc0 3d 3d 30 78 30 30 30 30 20 77 65 20 74 65 73 74  ==0x0000 we test
30dd0 20 66 6f 72 20 21 4f 5f 52 44 57 52 20 73 69 6e   for !O_RDWR sin
30de0 63 65 20 75 6e 69 78 4f 70 65 6e 20 61 73 73 65  ce unixOpen asse
30df0 72 74 73 0a 20 20 20 20 20 20 2a 2a 20 74 68 61  rts.      ** tha
30e00 74 20 6f 70 65 6e 46 6c 61 67 73 20 77 69 6c 6c  t openFlags will
30e10 20 68 61 76 65 20 6f 6e 6c 79 20 6f 6e 65 20 6f   have only one o
30e20 66 20 4f 5f 52 44 4f 4e 4c 59 20 6f 72 20 4f 5f  f O_RDONLY or O_
30e30 52 44 57 52 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  RDWR..      */. 
30e40 20 20 20 20 20 73 74 72 75 63 74 20 73 74 61 74       struct stat
30e50 66 73 20 66 73 49 6e 66 6f 3b 0a 20 20 20 20 20  fs fsInfo;.     
30e60 20 73 74 72 75 63 74 20 73 74 61 74 20 63 6f 6e   struct stat con
30e70 63 68 49 6e 66 6f 3b 0a 20 20 20 20 20 20 69 6e  chInfo;.      in
30e80 74 20 67 6f 4c 6f 63 6b 6c 65 73 73 20 3d 20 30  t goLockless = 0
30e90 3b 0a 0a 20 20 20 20 20 20 69 66 28 20 73 74 61  ;..      if( sta
30ea0 74 28 70 43 74 78 2d 3e 63 6f 6e 63 68 46 69 6c  t(pCtx->conchFil
30eb0 65 50 61 74 68 2c 20 26 63 6f 6e 63 68 49 6e 66  ePath, &conchInf
30ec0 6f 29 20 3d 3d 20 2d 31 20 29 20 7b 0a 20 20 20  o) == -1 ) {.   
30ed0 20 20 20 20 20 69 6e 74 20 65 72 72 20 3d 20 65       int err = e
30ee0 72 72 6e 6f 3b 0a 20 20 20 20 20 20 20 20 69 66  rrno;.        if
30ef0 28 20 28 65 72 72 3d 3d 45 4e 4f 45 4e 54 29 20  ( (err==ENOENT) 
30f00 26 26 20 28 73 74 61 74 66 73 28 64 62 50 61 74  && (statfs(dbPat
30f10 68 2c 20 26 66 73 49 6e 66 6f 29 20 21 3d 20 2d  h, &fsInfo) != -
30f20 31 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  1) ){.          
30f30 67 6f 4c 6f 63 6b 6c 65 73 73 20 3d 20 28 66 73  goLockless = (fs
30f40 49 6e 66 6f 2e 66 5f 66 6c 61 67 73 26 4d 4e 54  Info.f_flags&MNT
30f50 5f 52 44 4f 4e 4c 59 29 20 3d 3d 20 4d 4e 54 5f  _RDONLY) == MNT_
30f60 52 44 4f 4e 4c 59 3b 0a 20 20 20 20 20 20 20 20  RDONLY;.        
30f70 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
30f80 69 66 28 20 67 6f 4c 6f 63 6b 6c 65 73 73 20 29  if( goLockless )
30f90 7b 0a 20 20 20 20 20 20 20 20 70 43 74 78 2d 3e  {.        pCtx->
30fa0 63 6f 6e 63 68 48 65 6c 64 20 3d 20 2d 31 3b 20  conchHeld = -1; 
30fb0 2f 2a 20 72 65 61 64 20 6f 6e 6c 79 20 46 53 2f  /* read only FS/
30fc0 20 6c 6f 63 6b 6c 65 73 73 20 2a 2f 0a 20 20 20   lockless */.   
30fd0 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
30fe0 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  _OK;.      }.   
30ff0 20 7d 0a 20 20 7d 20 20 0a 20 20 69 66 28 20 72   }.  }  .  if( r
31000 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
31010 6c 6f 63 6b 50 61 74 68 20 29 7b 0a 20 20 20 20  lockPath ){.    
31020 70 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 50  pCtx->lockProxyP
31030 61 74 68 20 3d 20 73 71 6c 69 74 65 33 44 62 53  ath = sqlite3DbS
31040 74 72 44 75 70 28 30 2c 20 6c 6f 63 6b 50 61 74  trDup(0, lockPat
31050 68 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72  h);.  }..  if( r
31060 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
31070 20 20 20 20 70 43 74 78 2d 3e 64 62 50 61 74 68      pCtx->dbPath
31080 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72 44   = sqlite3DbStrD
31090 75 70 28 30 2c 20 64 62 50 61 74 68 29 3b 0a 20  up(0, dbPath);. 
310a0 20 20 20 69 66 28 20 70 43 74 78 2d 3e 64 62 50     if( pCtx->dbP
310b0 61 74 68 3d 3d 4e 55 4c 4c 20 29 7b 0a 20 20 20  ath==NULL ){.   
310c0 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e     rc = SQLITE_N
310d0 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  OMEM;.    }.  }.
310e0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
310f0 5f 4f 4b 20 29 7b 0a 20 20 20 20 2f 2a 20 61 6c  _OK ){.    /* al
31100 6c 20 6d 65 6d 6f 72 79 20 69 73 20 61 6c 6c 6f  l memory is allo
31110 63 61 74 65 64 2c 20 70 72 6f 78 79 73 20 61 72  cated, proxys ar
31120 65 20 63 72 65 61 74 65 64 20 61 6e 64 20 61 73  e created and as
31130 73 69 67 6e 65 64 2c 20 0a 20 20 20 20 2a 2a 20  signed, .    ** 
31140 73 77 69 74 63 68 20 74 68 65 20 6c 6f 63 6b 69  switch the locki
31150 6e 67 20 63 6f 6e 74 65 78 74 20 61 6e 64 20 70  ng context and p
31160 4d 65 74 68 6f 64 20 74 68 65 6e 20 72 65 74 75  Method then retu
31170 72 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70  rn..    */.    p
31180 43 74 78 2d 3e 6f 6c 64 4c 6f 63 6b 69 6e 67 43  Ctx->oldLockingC
31190 6f 6e 74 65 78 74 20 3d 20 70 46 69 6c 65 2d 3e  ontext = pFile->
311a0 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 0a  lockingContext;.
311b0 20 20 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69      pFile->locki
311c0 6e 67 43 6f 6e 74 65 78 74 20 3d 20 70 43 74 78  ngContext = pCtx
311d0 3b 0a 20 20 20 20 70 43 74 78 2d 3e 70 4f 6c 64  ;.    pCtx->pOld
311e0 4d 65 74 68 6f 64 20 3d 20 70 46 69 6c 65 2d 3e  Method = pFile->
311f0 70 4d 65 74 68 6f 64 3b 0a 20 20 20 20 70 46 69  pMethod;.    pFi
31200 6c 65 2d 3e 70 4d 65 74 68 6f 64 20 3d 20 26 70  le->pMethod = &p
31210 72 6f 78 79 49 6f 4d 65 74 68 6f 64 73 3b 0a 20  roxyIoMethods;. 
31220 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 66 28 20   }else{.    if( 
31230 70 43 74 78 2d 3e 63 6f 6e 63 68 46 69 6c 65 20  pCtx->conchFile 
31240 29 7b 20 0a 20 20 20 20 20 20 70 43 74 78 2d 3e  ){ .      pCtx->
31250 63 6f 6e 63 68 46 69 6c 65 2d 3e 70 4d 65 74 68  conchFile->pMeth
31260 6f 64 2d 3e 78 43 6c 6f 73 65 28 28 73 71 6c 69  od->xClose((sqli
31270 74 65 33 5f 66 69 6c 65 20 2a 29 70 43 74 78 2d  te3_file *)pCtx-
31280 3e 63 6f 6e 63 68 46 69 6c 65 29 3b 0a 20 20 20  >conchFile);.   
31290 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
312a0 70 43 74 78 2d 3e 63 6f 6e 63 68 46 69 6c 65 29  pCtx->conchFile)
312b0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
312c0 74 65 33 5f 66 72 65 65 28 70 43 74 78 2d 3e 6c  te3_free(pCtx->l
312d0 6f 63 6b 50 72 6f 78 79 50 61 74 68 29 3b 0a 20  ockProxyPath);. 
312e0 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
312f0 70 43 74 78 2d 3e 63 6f 6e 63 68 46 69 6c 65 50  pCtx->conchFileP
31300 61 74 68 29 3b 20 0a 20 20 20 20 73 71 6c 69 74  ath); .    sqlit
31310 65 33 5f 66 72 65 65 28 70 43 74 78 29 3b 0a 20  e3_free(pCtx);. 
31320 20 7d 0a 20 20 4f 53 54 52 41 43 45 28 28 22 54   }.  OSTRACE(("T
31330 52 41 4e 53 50 52 4f 58 59 20 20 25 64 20 25 73  RANSPROXY  %d %s
31340 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 0a 20  \n", pFile->h,. 
31350 20 20 20 20 20 20 20 20 20 20 28 72 63 3d 3d 53            (rc==S
31360 51 4c 49 54 45 5f 4f 4b 20 3f 20 22 6f 6b 22 20  QLITE_OK ? "ok" 
31370 3a 20 22 66 61 69 6c 65 64 22 29 29 29 3b 0a 20  : "failed")));. 
31380 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a   return rc;.}...
31390 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
313a0 6e 65 20 68 61 6e 64 6c 65 73 20 73 71 6c 69 74  ne handles sqlit
313b0 65 33 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 28  e3_file_control(
313c0 29 20 63 61 6c 6c 73 20 74 68 61 74 20 61 72 65  ) calls that are
313d0 20 73 70 65 63 69 66 69 63 0a 2a 2a 20 74 6f 20   specific.** to 
313e0 70 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 2e 0a 2a  proxy locking..*
313f0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72 6f  /.static int pro
31400 78 79 46 69 6c 65 43 6f 6e 74 72 6f 6c 28 73 71  xyFileControl(sq
31410 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20  lite3_file *id, 
31420 69 6e 74 20 6f 70 2c 20 76 6f 69 64 20 2a 70 41  int op, void *pA
31430 72 67 29 7b 0a 20 20 73 77 69 74 63 68 28 20 6f  rg){.  switch( o
31440 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20 53 51  p ){.    case SQ
31450 4c 49 54 45 5f 47 45 54 5f 4c 4f 43 4b 50 52 4f  LITE_GET_LOCKPRO
31460 58 59 46 49 4c 45 3a 20 7b 0a 20 20 20 20 20 20  XYFILE: {.      
31470 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20  unixFile *pFile 
31480 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b  = (unixFile*)id;
31490 0a 20 20 20 20 20 20 69 66 28 20 70 46 69 6c 65  .      if( pFile
314a0 2d 3e 70 4d 65 74 68 6f 64 20 3d 3d 20 26 70 72  ->pMethod == &pr
314b0 6f 78 79 49 6f 4d 65 74 68 6f 64 73 20 29 7b 0a  oxyIoMethods ){.
314c0 20 20 20 20 20 20 20 20 70 72 6f 78 79 4c 6f 63          proxyLoc
314d0 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 70 43 74  kingContext *pCt
314e0 78 20 3d 20 28 70 72 6f 78 79 4c 6f 63 6b 69 6e  x = (proxyLockin
314f0 67 43 6f 6e 74 65 78 74 2a 29 70 46 69 6c 65 2d  gContext*)pFile-
31500 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b  >lockingContext;
31510 0a 20 20 20 20 20 20 20 20 70 72 6f 78 79 54 61  .        proxyTa
31520 6b 65 43 6f 6e 63 68 28 70 46 69 6c 65 29 3b 0a  keConch(pFile);.
31530 20 20 20 20 20 20 20 20 69 66 28 20 70 43 74 78          if( pCtx
31540 2d 3e 6c 6f 63 6b 50 72 6f 78 79 50 61 74 68 20  ->lockProxyPath 
31550 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2a 28 63  ){.          *(c
31560 6f 6e 73 74 20 63 68 61 72 20 2a 2a 29 70 41 72  onst char **)pAr
31570 67 20 3d 20 70 43 74 78 2d 3e 6c 6f 63 6b 50 72  g = pCtx->lockPr
31580 6f 78 79 50 61 74 68 3b 0a 20 20 20 20 20 20 20  oxyPath;.       
31590 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
315a0 20 20 2a 28 63 6f 6e 73 74 20 63 68 61 72 20 2a    *(const char *
315b0 2a 29 70 41 72 67 20 3d 20 22 3a 61 75 74 6f 3a  *)pArg = ":auto:
315c0 20 28 6e 6f 74 20 68 65 6c 64 29 22 3b 0a 20 20   (not held)";.  
315d0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 20        }.      } 
315e0 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 20 20 2a  else {.        *
315f0 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 2a 29 70  (const char **)p
31600 41 72 67 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20  Arg = NULL;.    
31610 20 20 7d 0a 20 20 20 20 20 20 72 65 74 75 72 6e    }.      return
31620 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
31630 7d 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  }.    case SQLIT
31640 45 5f 53 45 54 5f 4c 4f 43 4b 50 52 4f 58 59 46  E_SET_LOCKPROXYF
31650 49 4c 45 3a 20 7b 0a 20 20 20 20 20 20 75 6e 69  ILE: {.      uni
31660 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28  xFile *pFile = (
31670 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20  unixFile*)id;.  
31680 20 20 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c      int rc = SQL
31690 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 69 6e  ITE_OK;.      in
316a0 74 20 69 73 50 72 6f 78 79 53 74 79 6c 65 20 3d  t isProxyStyle =
316b0 20 28 70 46 69 6c 65 2d 3e 70 4d 65 74 68 6f 64   (pFile->pMethod
316c0 20 3d 3d 20 26 70 72 6f 78 79 49 6f 4d 65 74 68   == &proxyIoMeth
316d0 6f 64 73 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ods);.      if( 
316e0 70 41 72 67 3d 3d 4e 55 4c 4c 20 7c 7c 20 28 63  pArg==NULL || (c
316f0 6f 6e 73 74 20 63 68 61 72 20 2a 29 70 41 72 67  onst char *)pArg
31700 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69  ==0 ){.        i
31710 66 28 20 69 73 50 72 6f 78 79 53 74 79 6c 65 20  f( isProxyStyle 
31720 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ){.          /* 
31730 74 75 72 6e 20 6f 66 66 20 70 72 6f 78 79 20 6c  turn off proxy l
31740 6f 63 6b 69 6e 67 20 2d 20 6e 6f 74 20 73 75 70  ocking - not sup
31750 70 6f 72 74 65 64 20 2a 2f 0a 20 20 20 20 20 20  ported */.      
31760 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
31770 45 52 52 4f 52 20 2f 2a 53 51 4c 49 54 45 5f 50  ERROR /*SQLITE_P
31780 52 4f 54 4f 43 4f 4c 3f 20 53 51 4c 49 54 45 5f  ROTOCOL? SQLITE_
31790 4d 49 53 55 53 45 3f 2a 2f 3b 0a 20 20 20 20 20  MISUSE?*/;.     
317a0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
317b0 20 20 20 20 2f 2a 20 74 75 72 6e 20 6f 66 66 20      /* turn off 
317c0 70 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 20 2d 20  proxy locking - 
317d0 61 6c 72 65 61 64 79 20 6f 66 66 20 2d 20 4e 4f  already off - NO
317e0 4f 50 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  OP */.          
317f0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
31800 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
31810 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 63  }else{.        c
31820 6f 6e 73 74 20 63 68 61 72 20 2a 70 72 6f 78 79  onst char *proxy
31830 50 61 74 68 20 3d 20 28 63 6f 6e 73 74 20 63 68  Path = (const ch
31840 61 72 20 2a 29 70 41 72 67 3b 0a 20 20 20 20 20  ar *)pArg;.     
31850 20 20 20 69 66 28 20 69 73 50 72 6f 78 79 53 74     if( isProxySt
31860 79 6c 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20  yle ){.         
31870 20 70 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e   proxyLockingCon
31880 74 65 78 74 20 2a 70 43 74 78 20 3d 20 0a 20 20  text *pCtx = .  
31890 20 20 20 20 20 20 20 20 20 20 28 70 72 6f 78 79            (proxy
318a0 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 2a 29  LockingContext*)
318b0 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f  pFile->lockingCo
318c0 6e 74 65 78 74 3b 0a 20 20 20 20 20 20 20 20 20  ntext;.         
318d0 20 69 66 28 20 21 73 74 72 63 6d 70 28 70 41 72   if( !strcmp(pAr
318e0 67 2c 20 22 3a 61 75 74 6f 3a 22 29 20 0a 20 20  g, ":auto:") .  
318f0 20 20 20 20 20 20 20 20 20 7c 7c 20 28 70 43 74           || (pCt
31900 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 50 61 74 68  x->lockProxyPath
31910 20 26 26 0a 20 20 20 20 20 20 20 20 20 20 20 20   &&.            
31920 20 20 20 21 73 74 72 6e 63 6d 70 28 70 43 74 78     !strncmp(pCtx
31930 2d 3e 6c 6f 63 6b 50 72 6f 78 79 50 61 74 68 2c  ->lockProxyPath,
31940 20 70 72 6f 78 79 50 61 74 68 2c 20 4d 41 58 50   proxyPath, MAXP
31950 41 54 48 4c 45 4e 29 29 0a 20 20 20 20 20 20 20  ATHLEN)).       
31960 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20     ){.          
31970 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b    rc = SQLITE_OK
31980 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73  ;.          }els
31990 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  e{.            r
319a0 63 20 3d 20 73 77 69 74 63 68 4c 6f 63 6b 50 72  c = switchLockPr
319b0 6f 78 79 50 61 74 68 28 70 46 69 6c 65 2c 20 70  oxyPath(pFile, p
319c0 72 6f 78 79 50 61 74 68 29 3b 0a 20 20 20 20 20  roxyPath);.     
319d0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
319e0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
319f0 2f 2a 20 74 75 72 6e 20 6f 6e 20 70 72 6f 78 79  /* turn on proxy
31a00 20 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 20 2a 2f   file locking */
31a10 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
31a20 70 72 6f 78 79 54 72 61 6e 73 66 6f 72 6d 55 6e  proxyTransformUn
31a30 69 78 46 69 6c 65 28 70 46 69 6c 65 2c 20 70 72  ixFile(pFile, pr
31a40 6f 78 79 50 61 74 68 29 3b 0a 20 20 20 20 20 20  oxyPath);.      
31a50 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
31a60 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
31a70 20 7d 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20   }.    default: 
31a80 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
31a90 30 20 29 3b 20 20 2f 2a 20 54 68 65 20 63 61 6c  0 );  /* The cal
31aa0 6c 20 61 73 73 75 72 65 73 20 74 68 61 74 20 6f  l assures that o
31ab0 6e 6c 79 20 76 61 6c 69 64 20 6f 70 63 6f 64 65  nly valid opcode
31ac0 73 20 61 72 65 20 73 65 6e 74 20 2a 2f 0a 20 20  s are sent */.  
31ad0 20 20 7d 0a 20 20 7d 0a 20 20 2f 2a 4e 4f 54 52    }.  }.  /*NOTR
31ae0 45 41 43 48 45 44 2a 2f 0a 20 20 72 65 74 75 72  EACHED*/.  retur
31af0 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  n SQLITE_ERROR;.
31b00 7d 0a 0a 2f 2a 0a 2a 2a 20 57 69 74 68 69 6e 20  }../*.** Within 
31b10 74 68 69 73 20 64 69 76 69 73 69 6f 6e 20 28 74  this division (t
31b20 68 65 20 70 72 6f 78 79 69 6e 67 20 6c 6f 63 6b  he proxying lock
31b30 69 6e 67 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  ing implementati
31b40 6f 6e 29 20 74 68 65 20 70 72 6f 63 65 64 75 72  on) the procedur
31b50 65 73 0a 2a 2a 20 61 62 6f 76 65 20 74 68 69 73  es.** above this
31b60 20 70 6f 69 6e 74 20 61 72 65 20 61 6c 6c 20 75   point are all u
31b70 74 69 6c 69 74 69 65 73 2e 20 20 54 68 65 20 6c  tilities.  The l
31b80 6f 63 6b 2d 72 65 6c 61 74 65 64 20 6d 65 74 68  ock-related meth
31b90 6f 64 73 20 6f 66 20 74 68 65 0a 2a 2a 20 70 72  ods of the.** pr
31ba0 6f 78 79 2d 6c 6f 63 6b 69 6e 67 20 73 71 6c 69  oxy-locking sqli
31bb0 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 20 6f 62  te3_io_method ob
31bc0 6a 65 63 74 20 66 6f 6c 6c 6f 77 2e 0a 2a 2f 0a  ject follow..*/.
31bd0 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
31be0 74 69 6e 65 20 63 68 65 63 6b 73 20 69 66 20 74  tine checks if t
31bf0 68 65 72 65 20 69 73 20 61 20 52 45 53 45 52 56  here is a RESERV
31c00 45 44 20 6c 6f 63 6b 20 68 65 6c 64 20 6f 6e 20  ED lock held on 
31c10 74 68 65 20 73 70 65 63 69 66 69 65 64 0a 2a 2a  the specified.**
31c20 20 66 69 6c 65 20 62 79 20 74 68 69 73 20 6f 72   file by this or
31c30 20 61 6e 79 20 6f 74 68 65 72 20 70 72 6f 63 65   any other proce
31c40 73 73 2e 20 49 66 20 73 75 63 68 20 61 20 6c 6f  ss. If such a lo
31c50 63 6b 20 69 73 20 68 65 6c 64 2c 20 73 65 74 20  ck is held, set 
31c60 2a 70 52 65 73 4f 75 74 0a 2a 2a 20 74 6f 20 61  *pResOut.** to a
31c70 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75 65 20   non-zero value 
31c80 6f 74 68 65 72 77 69 73 65 20 2a 70 52 65 73 4f  otherwise *pResO
31c90 75 74 20 69 73 20 73 65 74 20 74 6f 20 7a 65 72  ut is set to zer
31ca0 6f 2e 20 20 54 68 65 20 72 65 74 75 72 6e 20 76  o.  The return v
31cb0 61 6c 75 65 0a 2a 2a 20 69 73 20 73 65 74 20 74  alue.** is set t
31cc0 6f 20 53 51 4c 49 54 45 5f 4f 4b 20 75 6e 6c 65  o SQLITE_OK unle
31cd0 73 73 20 61 6e 20 49 2f 4f 20 65 72 72 6f 72 20  ss an I/O error 
31ce0 6f 63 63 75 72 73 20 64 75 72 69 6e 67 20 6c 6f  occurs during lo
31cf0 63 6b 20 63 68 65 63 6b 69 6e 67 2e 0a 2a 2f 0a  ck checking..*/.
31d00 73 74 61 74 69 63 20 69 6e 74 20 70 72 6f 78 79  static int proxy
31d10 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63  CheckReservedLoc
31d20 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  k(sqlite3_file *
31d30 69 64 2c 20 69 6e 74 20 2a 70 52 65 73 4f 75 74  id, int *pResOut
31d40 29 20 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a  ) {.  unixFile *
31d50 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c  pFile = (unixFil
31d60 65 2a 29 69 64 3b 0a 20 20 69 6e 74 20 72 63 20  e*)id;.  int rc 
31d70 3d 20 70 72 6f 78 79 54 61 6b 65 43 6f 6e 63 68  = proxyTakeConch
31d80 28 70 46 69 6c 65 29 3b 0a 20 20 69 66 28 20 72  (pFile);.  if( r
31d90 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
31da0 20 20 20 20 70 72 6f 78 79 4c 6f 63 6b 69 6e 67      proxyLocking
31db0 43 6f 6e 74 65 78 74 20 2a 70 43 74 78 20 3d 20  Context *pCtx = 
31dc0 28 70 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e  (proxyLockingCon
31dd0 74 65 78 74 20 2a 29 70 46 69 6c 65 2d 3e 6c 6f  text *)pFile->lo
31de0 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 0a 20 20  ckingContext;.  
31df0 20 20 69 66 28 20 70 43 74 78 2d 3e 63 6f 6e 63    if( pCtx->conc
31e00 68 48 65 6c 64 3e 30 20 29 7b 0a 20 20 20 20 20  hHeld>0 ){.     
31e10 20 75 6e 69 78 46 69 6c 65 20 2a 70 72 6f 78 79   unixFile *proxy
31e20 20 3d 20 70 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f   = pCtx->lockPro
31e30 78 79 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  xy;.      return
31e40 20 70 72 6f 78 79 2d 3e 70 4d 65 74 68 6f 64 2d   proxy->pMethod-
31e50 3e 78 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c  >xCheckReservedL
31e60 6f 63 6b 28 28 73 71 6c 69 74 65 33 5f 66 69 6c  ock((sqlite3_fil
31e70 65 2a 29 70 72 6f 78 79 2c 20 70 52 65 73 4f 75  e*)proxy, pResOu
31e80 74 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 20 2f  t);.    }else{ /
31e90 2a 20 63 6f 6e 63 68 48 65 6c 64 20 3c 20 30 20  * conchHeld < 0 
31ea0 69 73 20 6c 6f 63 6b 6c 65 73 73 20 2a 2f 0a 20  is lockless */. 
31eb0 20 20 20 20 20 70 52 65 73 4f 75 74 3d 30 3b 0a       pResOut=0;.
31ec0 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
31ed0 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
31ee0 4c 6f 63 6b 20 74 68 65 20 66 69 6c 65 20 77 69  Lock the file wi
31ef0 74 68 20 74 68 65 20 6c 6f 63 6b 20 73 70 65 63  th the lock spec
31f00 69 66 69 65 64 20 62 79 20 70 61 72 61 6d 65 74  ified by paramet
31f10 65 72 20 65 46 69 6c 65 4c 6f 63 6b 20 2d 20 6f  er eFileLock - o
31f20 6e 65 0a 2a 2a 20 6f 66 20 74 68 65 20 66 6f 6c  ne.** of the fol
31f30 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20  lowing:.**.**   
31f40 20 20 28 31 29 20 53 48 41 52 45 44 5f 4c 4f 43    (1) SHARED_LOC
31f50 4b 0a 2a 2a 20 20 20 20 20 28 32 29 20 52 45 53  K.**     (2) RES
31f60 45 52 56 45 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20  ERVED_LOCK.**   
31f70 20 20 28 33 29 20 50 45 4e 44 49 4e 47 5f 4c 4f    (3) PENDING_LO
31f80 43 4b 0a 2a 2a 20 20 20 20 20 28 34 29 20 45 58  CK.**     (4) EX
31f90 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 0a 2a 2a 0a  CLUSIVE_LOCK.**.
31fa0 2a 2a 20 53 6f 6d 65 74 69 6d 65 73 20 77 68 65  ** Sometimes whe
31fb0 6e 20 72 65 71 75 65 73 74 69 6e 67 20 6f 6e 65  n requesting one
31fc0 20 6c 6f 63 6b 20 73 74 61 74 65 2c 20 61 64 64   lock state, add
31fd0 69 74 69 6f 6e 61 6c 20 6c 6f 63 6b 20 73 74 61  itional lock sta
31fe0 74 65 73 0a 2a 2a 20 61 72 65 20 69 6e 73 65 72  tes.** are inser
31ff0 74 65 64 20 69 6e 20 62 65 74 77 65 65 6e 2e 20  ted in between. 
32000 20 54 68 65 20 6c 6f 63 6b 69 6e 67 20 6d 69 67   The locking mig
32010 68 74 20 66 61 69 6c 20 6f 6e 20 6f 6e 65 20 6f  ht fail on one o
32020 66 20 74 68 65 20 6c 61 74 65 72 0a 2a 2a 20 74  f the later.** t
32030 72 61 6e 73 69 74 69 6f 6e 73 20 6c 65 61 76 69  ransitions leavi
32040 6e 67 20 74 68 65 20 6c 6f 63 6b 20 73 74 61 74  ng the lock stat
32050 65 20 64 69 66 66 65 72 65 6e 74 20 66 72 6f 6d  e different from
32060 20 77 68 61 74 20 69 74 20 73 74 61 72 74 65 64   what it started
32070 20 62 75 74 0a 2a 2a 20 73 74 69 6c 6c 20 73 68   but.** still sh
32080 6f 72 74 20 6f 66 20 69 74 73 20 67 6f 61 6c 2e  ort of its goal.
32090 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20    The following 
320a0 63 68 61 72 74 20 73 68 6f 77 73 20 74 68 65 20  chart shows the 
320b0 61 6c 6c 6f 77 65 64 0a 2a 2a 20 74 72 61 6e 73  allowed.** trans
320c0 69 74 69 6f 6e 73 20 61 6e 64 20 74 68 65 20 69  itions and the i
320d0 6e 73 65 72 74 65 64 20 69 6e 74 65 72 6d 65 64  nserted intermed
320e0 69 61 74 65 20 73 74 61 74 65 73 3a 0a 2a 2a 0a  iate states:.**.
320f0 2a 2a 20 20 20 20 55 4e 4c 4f 43 4b 45 44 20 2d  **    UNLOCKED -
32100 3e 20 53 48 41 52 45 44 0a 2a 2a 20 20 20 20 53  > SHARED.**    S
32110 48 41 52 45 44 20 2d 3e 20 52 45 53 45 52 56 45  HARED -> RESERVE
32120 44 0a 2a 2a 20 20 20 20 53 48 41 52 45 44 20 2d  D.**    SHARED -
32130 3e 20 28 50 45 4e 44 49 4e 47 29 20 2d 3e 20 45  > (PENDING) -> E
32140 58 43 4c 55 53 49 56 45 0a 2a 2a 20 20 20 20 52  XCLUSIVE.**    R
32150 45 53 45 52 56 45 44 20 2d 3e 20 28 50 45 4e 44  ESERVED -> (PEND
32160 49 4e 47 29 20 2d 3e 20 45 58 43 4c 55 53 49 56  ING) -> EXCLUSIV
32170 45 0a 2a 2a 20 20 20 20 50 45 4e 44 49 4e 47 20  E.**    PENDING 
32180 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 0a  -> EXCLUSIVE.**.
32190 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
321a0 77 69 6c 6c 20 6f 6e 6c 79 20 69 6e 63 72 65 61  will only increa
321b0 73 65 20 61 20 6c 6f 63 6b 2e 20 20 55 73 65 20  se a lock.  Use 
321c0 74 68 65 20 73 71 6c 69 74 65 33 4f 73 55 6e 6c  the sqlite3OsUnl
321d0 6f 63 6b 28 29 0a 2a 2a 20 72 6f 75 74 69 6e 65  ock().** routine
321e0 20 74 6f 20 6c 6f 77 65 72 20 61 20 6c 6f 63 6b   to lower a lock
321f0 69 6e 67 20 6c 65 76 65 6c 2e 0a 2a 2f 0a 73 74  ing level..*/.st
32200 61 74 69 63 20 69 6e 74 20 70 72 6f 78 79 4c 6f  atic int proxyLo
32210 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  ck(sqlite3_file 
32220 2a 69 64 2c 20 69 6e 74 20 65 46 69 6c 65 4c 6f  *id, int eFileLo
32230 63 6b 29 20 7b 0a 20 20 75 6e 69 78 46 69 6c 65  ck) {.  unixFile
32240 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46   *pFile = (unixF
32250 69 6c 65 2a 29 69 64 3b 0a 20 20 69 6e 74 20 72  ile*)id;.  int r
32260 63 20 3d 20 70 72 6f 78 79 54 61 6b 65 43 6f 6e  c = proxyTakeCon
32270 63 68 28 70 46 69 6c 65 29 3b 0a 20 20 69 66 28  ch(pFile);.  if(
32280 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
32290 7b 0a 20 20 20 20 70 72 6f 78 79 4c 6f 63 6b 69  {.    proxyLocki
322a0 6e 67 43 6f 6e 74 65 78 74 20 2a 70 43 74 78 20  ngContext *pCtx 
322b0 3d 20 28 70 72 6f 78 79 4c 6f 63 6b 69 6e 67 43  = (proxyLockingC
322c0 6f 6e 74 65 78 74 20 2a 29 70 46 69 6c 65 2d 3e  ontext *)pFile->
322d0 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 0a  lockingContext;.
322e0 20 20 20 20 69 66 28 20 70 43 74 78 2d 3e 63 6f      if( pCtx->co
322f0 6e 63 68 48 65 6c 64 3e 30 20 29 7b 0a 20 20 20  nchHeld>0 ){.   
32300 20 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 72 6f     unixFile *pro
32310 78 79 20 3d 20 70 43 74 78 2d 3e 6c 6f 63 6b 50  xy = pCtx->lockP
32320 72 6f 78 79 3b 0a 20 20 20 20 20 20 72 63 20 3d  roxy;.      rc =
32330 20 70 72 6f 78 79 2d 3e 70 4d 65 74 68 6f 64 2d   proxy->pMethod-
32340 3e 78 4c 6f 63 6b 28 28 73 71 6c 69 74 65 33 5f  >xLock((sqlite3_
32350 66 69 6c 65 2a 29 70 72 6f 78 79 2c 20 65 46 69  file*)proxy, eFi
32360 6c 65 4c 6f 63 6b 29 3b 0a 20 20 20 20 20 20 70  leLock);.      p
32370 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20  File->eFileLock 
32380 3d 20 70 72 6f 78 79 2d 3e 65 46 69 6c 65 4c 6f  = proxy->eFileLo
32390 63 6b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ck;.    }else{. 
323a0 20 20 20 20 20 2f 2a 20 63 6f 6e 63 68 48 65 6c       /* conchHel
323b0 64 20 3c 20 30 20 69 73 20 6c 6f 63 6b 6c 65 73  d < 0 is lockles
323c0 73 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  s */.    }.  }. 
323d0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a   return rc;.}...
323e0 2f 2a 0a 2a 2a 20 4c 6f 77 65 72 20 74 68 65 20  /*.** Lower the 
323f0 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 6e  locking level on
32400 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
32410 20 70 46 69 6c 65 20 74 6f 20 65 46 69 6c 65 4c   pFile to eFileL
32420 6f 63 6b 2e 20 20 65 46 69 6c 65 4c 6f 63 6b 0a  ock.  eFileLock.
32430 2a 2a 20 6d 75 73 74 20 62 65 20 65 69 74 68 65  ** must be eithe
32440 72 20 4e 4f 5f 4c 4f 43 4b 20 6f 72 20 53 48 41  r NO_LOCK or SHA
32450 52 45 44 5f 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20  RED_LOCK..**.** 
32460 49 66 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c  If the locking l
32470 65 76 65 6c 20 6f 66 20 74 68 65 20 66 69 6c 65  evel of the file
32480 20 64 65 73 63 72 69 70 74 6f 72 20 69 73 20 61   descriptor is a
32490 6c 72 65 61 64 79 20 61 74 20 6f 72 20 62 65 6c  lready at or bel
324a0 6f 77 0a 2a 2a 20 74 68 65 20 72 65 71 75 65 73  ow.** the reques
324b0 74 65 64 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65  ted locking leve
324c0 6c 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  l, this routine 
324d0 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73  is a no-op..*/.s
324e0 74 61 74 69 63 20 69 6e 74 20 70 72 6f 78 79 55  tatic int proxyU
324f0 6e 6c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69  nlock(sqlite3_fi
32500 6c 65 20 2a 69 64 2c 20 69 6e 74 20 65 46 69 6c  le *id, int eFil
32510 65 4c 6f 63 6b 29 20 7b 0a 20 20 75 6e 69 78 46  eLock) {.  unixF
32520 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e  ile *pFile = (un
32530 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 69 6e  ixFile*)id;.  in
32540 74 20 72 63 20 3d 20 70 72 6f 78 79 54 61 6b 65  t rc = proxyTake
32550 43 6f 6e 63 68 28 70 46 69 6c 65 29 3b 0a 20 20  Conch(pFile);.  
32560 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
32570 4b 20 29 7b 0a 20 20 20 20 70 72 6f 78 79 4c 6f  K ){.    proxyLo
32580 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 70 43  ckingContext *pC
32590 74 78 20 3d 20 28 70 72 6f 78 79 4c 6f 63 6b 69  tx = (proxyLocki
325a0 6e 67 43 6f 6e 74 65 78 74 20 2a 29 70 46 69 6c  ngContext *)pFil
325b0 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78  e->lockingContex
325c0 74 3b 0a 20 20 20 20 69 66 28 20 70 43 74 78 2d  t;.    if( pCtx-
325d0 3e 63 6f 6e 63 68 48 65 6c 64 3e 30 20 29 7b 0a  >conchHeld>0 ){.
325e0 20 20 20 20 20 20 75 6e 69 78 46 69 6c 65 20 2a        unixFile *
325f0 70 72 6f 78 79 20 3d 20 70 43 74 78 2d 3e 6c 6f  proxy = pCtx->lo
32600 63 6b 50 72 6f 78 79 3b 0a 20 20 20 20 20 20 72  ckProxy;.      r
32610 63 20 3d 20 70 72 6f 78 79 2d 3e 70 4d 65 74 68  c = proxy->pMeth
32620 6f 64 2d 3e 78 55 6e 6c 6f 63 6b 28 28 73 71 6c  od->xUnlock((sql
32630 69 74 65 33 5f 66 69 6c 65 2a 29 70 72 6f 78 79  ite3_file*)proxy
32640 2c 20 65 46 69 6c 65 4c 6f 63 6b 29 3b 0a 20 20  , eFileLock);.  
32650 20 20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65      pFile->eFile
32660 4c 6f 63 6b 20 3d 20 70 72 6f 78 79 2d 3e 65 46  Lock = proxy->eF
32670 69 6c 65 4c 6f 63 6b 3b 0a 20 20 20 20 7d 65 6c  ileLock;.    }el
32680 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 63 6f 6e  se{.      /* con
32690 63 68 48 65 6c 64 20 3c 20 30 20 69 73 20 6c 6f  chHeld < 0 is lo
326a0 63 6b 6c 65 73 73 20 2a 2f 0a 20 20 20 20 7d 0a  ckless */.    }.
326b0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
326c0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20  .}../*.** Close 
326d0 61 20 66 69 6c 65 20 74 68 61 74 20 75 73 65 73  a file that uses
326e0 20 70 72 6f 78 79 20 6c 6f 63 6b 73 2e 0a 2a 2f   proxy locks..*/
326f0 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72 6f 78  .static int prox
32700 79 43 6c 6f 73 65 28 73 71 6c 69 74 65 33 5f 66  yClose(sqlite3_f
32710 69 6c 65 20 2a 69 64 29 20 7b 0a 20 20 69 66 28  ile *id) {.  if(
32720 20 69 64 20 29 7b 0a 20 20 20 20 75 6e 69 78 46   id ){.    unixF
32730 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e  ile *pFile = (un
32740 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 20 20  ixFile*)id;.    
32750 70 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74  proxyLockingCont
32760 65 78 74 20 2a 70 43 74 78 20 3d 20 28 70 72 6f  ext *pCtx = (pro
32770 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  xyLockingContext
32780 20 2a 29 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e   *)pFile->lockin
32790 67 43 6f 6e 74 65 78 74 3b 0a 20 20 20 20 75 6e  gContext;.    un
327a0 69 78 46 69 6c 65 20 2a 6c 6f 63 6b 50 72 6f 78  ixFile *lockProx
327b0 79 20 3d 20 70 43 74 78 2d 3e 6c 6f 63 6b 50 72  y = pCtx->lockPr
327c0 6f 78 79 3b 0a 20 20 20 20 75 6e 69 78 46 69 6c  oxy;.    unixFil
327d0 65 20 2a 63 6f 6e 63 68 46 69 6c 65 20 3d 20 70  e *conchFile = p
327e0 43 74 78 2d 3e 63 6f 6e 63 68 46 69 6c 65 3b 0a  Ctx->conchFile;.
327f0 20 20 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c      int rc = SQL
32800 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 0a 20 20 20  ITE_OK;.    .   
32810 20 69 66 28 20 6c 6f 63 6b 50 72 6f 78 79 20 29   if( lockProxy )
32820 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 6c 6f 63  {.      rc = loc
32830 6b 50 72 6f 78 79 2d 3e 70 4d 65 74 68 6f 64 2d  kProxy->pMethod-
32840 3e 78 55 6e 6c 6f 63 6b 28 28 73 71 6c 69 74 65  >xUnlock((sqlite
32850 33 5f 66 69 6c 65 2a 29 6c 6f 63 6b 50 72 6f 78  3_file*)lockProx
32860 79 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20 20 20  y, NO_LOCK);.   
32870 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75     if( rc ) retu
32880 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 72 63 20  rn rc;.      rc 
32890 3d 20 6c 6f 63 6b 50 72 6f 78 79 2d 3e 70 4d 65  = lockProxy->pMe
328a0 74 68 6f 64 2d 3e 78 43 6c 6f 73 65 28 28 73 71  thod->xClose((sq
328b0 6c 69 74 65 33 5f 66 69 6c 65 2a 29 6c 6f 63 6b  lite3_file*)lock
328c0 50 72 6f 78 79 29 3b 0a 20 20 20 20 20 20 69 66  Proxy);.      if
328d0 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
328e0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
328f0 66 72 65 65 28 6c 6f 63 6b 50 72 6f 78 79 29 3b  free(lockProxy);
32900 0a 20 20 20 20 20 20 70 43 74 78 2d 3e 6c 6f 63  .      pCtx->loc
32910 6b 50 72 6f 78 79 20 3d 20 30 3b 0a 20 20 20 20  kProxy = 0;.    
32920 7d 0a 20 20 20 20 69 66 28 20 63 6f 6e 63 68 46  }.    if( conchF
32930 69 6c 65 20 29 7b 0a 20 20 20 20 20 20 69 66 28  ile ){.      if(
32940 20 70 43 74 78 2d 3e 63 6f 6e 63 68 48 65 6c 64   pCtx->conchHeld
32950 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
32960 20 70 72 6f 78 79 52 65 6c 65 61 73 65 43 6f 6e   proxyReleaseCon
32970 63 68 28 70 46 69 6c 65 29 3b 0a 20 20 20 20 20  ch(pFile);.     
32980 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75     if( rc ) retu
32990 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20  rn rc;.      }. 
329a0 20 20 20 20 20 72 63 20 3d 20 63 6f 6e 63 68 46       rc = conchF
329b0 69 6c 65 2d 3e 70 4d 65 74 68 6f 64 2d 3e 78 43  ile->pMethod->xC
329c0 6c 6f 73 65 28 28 73 71 6c 69 74 65 33 5f 66 69  lose((sqlite3_fi
329d0 6c 65 2a 29 63 6f 6e 63 68 46 69 6c 65 29 3b 0a  le*)conchFile);.
329e0 20 20 20 20 20 20 69 66 28 20 72 63 20 29 20 72        if( rc ) r
329f0 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
32a00 73 71 6c 69 74 65 33 5f 66 72 65 65 28 63 6f 6e  sqlite3_free(con
32a10 63 68 46 69 6c 65 29 3b 0a 20 20 20 20 7d 0a 20  chFile);.    }. 
32a20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
32a30 70 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 50  pCtx->lockProxyP
32a40 61 74 68 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ath);.    sqlite
32a50 33 5f 66 72 65 65 28 70 43 74 78 2d 3e 63 6f 6e  3_free(pCtx->con
32a60 63 68 46 69 6c 65 50 61 74 68 29 3b 0a 20 20 20  chFilePath);.   
32a70 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 43   sqlite3_free(pC
32a80 74 78 2d 3e 64 62 50 61 74 68 29 3b 0a 20 20 20  tx->dbPath);.   
32a90 20 2f 2a 20 72 65 73 74 6f 72 65 20 74 68 65 20   /* restore the 
32aa0 6f 72 69 67 69 6e 61 6c 20 6c 6f 63 6b 69 6e 67  original locking
32ab0 20 63 6f 6e 74 65 78 74 20 61 6e 64 20 70 4d 65   context and pMe
32ac0 74 68 6f 64 20 74 68 65 6e 20 63 6c 6f 73 65 20  thod then close 
32ad0 69 74 20 2a 2f 0a 20 20 20 20 70 46 69 6c 65 2d  it */.    pFile-
32ae0 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20  >lockingContext 
32af0 3d 20 70 43 74 78 2d 3e 6f 6c 64 4c 6f 63 6b 69  = pCtx->oldLocki
32b00 6e 67 43 6f 6e 74 65 78 74 3b 0a 20 20 20 20 70  ngContext;.    p
32b10 46 69 6c 65 2d 3e 70 4d 65 74 68 6f 64 20 3d 20  File->pMethod = 
32b20 70 43 74 78 2d 3e 70 4f 6c 64 4d 65 74 68 6f 64  pCtx->pOldMethod
32b30 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  ;.    sqlite3_fr
32b40 65 65 28 70 43 74 78 29 3b 0a 20 20 20 20 72 65  ee(pCtx);.    re
32b50 74 75 72 6e 20 70 46 69 6c 65 2d 3e 70 4d 65 74  turn pFile->pMet
32b60 68 6f 64 2d 3e 78 43 6c 6f 73 65 28 69 64 29 3b  hod->xClose(id);
32b70 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51  .  }.  return SQ
32b80 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 0a 23 65  LITE_OK;.}....#e
32b90 6e 64 69 66 20 2f 2a 20 64 65 66 69 6e 65 64 28  ndif /* defined(
32ba0 5f 5f 41 50 50 4c 45 5f 5f 29 20 26 26 20 53 51  __APPLE__) && SQ
32bb0 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b  LITE_ENABLE_LOCK
32bc0 49 4e 47 5f 53 54 59 4c 45 20 2a 2f 0a 2f 2a 0a  ING_STYLE */./*.
32bd0 2a 2a 20 54 68 65 20 70 72 6f 78 79 20 6c 6f 63  ** The proxy loc
32be0 6b 69 6e 67 20 73 74 79 6c 65 20 69 73 20 69 6e  king style is in
32bf0 74 65 6e 64 65 64 20 66 6f 72 20 75 73 65 20 77  tended for use w
32c00 69 74 68 20 41 46 50 20 66 69 6c 65 73 79 73 74  ith AFP filesyst
32c10 65 6d 73 2e 0a 2a 2a 20 41 6e 64 20 73 69 6e 63  ems..** And sinc
32c20 65 20 41 46 50 20 69 73 20 6f 6e 6c 79 20 73 75  e AFP is only su
32c30 70 70 6f 72 74 65 64 20 6f 6e 20 4d 61 63 4f 53  pported on MacOS
32c40 58 2c 20 74 68 65 20 70 72 6f 78 79 20 6c 6f 63  X, the proxy loc
32c50 6b 69 6e 67 20 69 73 20 61 6c 73 6f 0a 2a 2a 20  king is also.** 
32c60 72 65 73 74 72 69 63 74 65 64 20 74 6f 20 4d 61  restricted to Ma
32c70 63 4f 53 58 2e 0a 2a 2a 20 0a 2a 2a 0a 2a 2a 2a  cOSX..** .**.***
32c80 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
32c90 20 45 6e 64 20 6f 66 20 74 68 65 20 70 72 6f 78   End of the prox
32ca0 79 20 6c 6f 63 6b 20 69 6d 70 6c 65 6d 65 6e 74  y lock implement
32cb0 61 74 69 6f 6e 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ation **********
32cc0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a  ************.***
32cd0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
32ce0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
32cf0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
32d00 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
32d10 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a  ***********/../*
32d20 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74  .** Initialize t
32d30 68 65 20 6f 70 65 72 61 74 69 6e 67 20 73 79 73  he operating sys
32d40 74 65 6d 20 69 6e 74 65 72 66 61 63 65 2e 0a 2a  tem interface..*
32d50 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
32d60 65 20 72 65 67 69 73 74 65 72 73 20 61 6c 6c 20  e registers all 
32d70 56 46 53 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  VFS implementati
32d80 6f 6e 73 20 66 6f 72 20 75 6e 69 78 2d 6c 69 6b  ons for unix-lik
32d90 65 20 6f 70 65 72 61 74 69 6e 67 0a 2a 2a 20 73  e operating.** s
32da0 79 73 74 65 6d 73 2e 20 20 54 68 69 73 20 72 6f  ystems.  This ro
32db0 75 74 69 6e 65 2c 20 61 6e 64 20 74 68 65 20 73  utine, and the s
32dc0 71 6c 69 74 65 33 5f 6f 73 5f 65 6e 64 28 29 20  qlite3_os_end() 
32dd0 72 6f 75 74 69 6e 65 20 74 68 61 74 20 66 6f 6c  routine that fol
32de0 6c 6f 77 73 2c 0a 2a 2a 20 73 68 6f 75 6c 64 20  lows,.** should 
32df0 62 65 20 74 68 65 20 6f 6e 6c 79 20 72 6f 75 74  be the only rout
32e00 69 6e 65 73 20 69 6e 20 74 68 69 73 20 66 69 6c  ines in this fil
32e10 65 20 74 68 61 74 20 61 72 65 20 76 69 73 69 62  e that are visib
32e20 6c 65 20 66 72 6f 6d 20 6f 74 68 65 72 0a 2a 2a  le from other.**
32e30 20 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68   files..**.** Th
32e40 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  is routine is ca
32e50 6c 6c 65 64 20 6f 6e 63 65 20 64 75 72 69 6e 67  lled once during
32e60 20 53 51 4c 69 74 65 20 69 6e 69 74 69 61 6c 69   SQLite initiali
32e70 7a 61 74 69 6f 6e 20 61 6e 64 20 62 79 20 61 0a  zation and by a.
32e80 2a 2a 20 73 69 6e 67 6c 65 20 74 68 72 65 61 64  ** single thread
32e90 2e 20 20 54 68 65 20 6d 65 6d 6f 72 79 20 61 6c  .  The memory al
32ea0 6c 6f 63 61 74 69 6f 6e 20 61 6e 64 20 6d 75 74  location and mut
32eb0 65 78 20 73 75 62 73 79 73 74 65 6d 73 20 68 61  ex subsystems ha
32ec0 76 65 20 6e 6f 74 0a 2a 2a 20 6e 65 63 65 73 73  ve not.** necess
32ed0 61 72 69 6c 79 20 62 65 65 6e 20 69 6e 69 74 69  arily been initi
32ee0 61 6c 69 7a 65 64 20 77 68 65 6e 20 74 68 69 73  alized when this
32ef0 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
32f00 65 64 2c 20 61 6e 64 20 73 6f 20 74 68 65 79 0a  ed, and so they.
32f10 2a 2a 20 73 68 6f 75 6c 64 20 6e 6f 74 20 62 65  ** should not be
32f20 20 75 73 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71   used..*/.int sq
32f30 6c 69 74 65 33 5f 6f 73 5f 69 6e 69 74 28 76 6f  lite3_os_init(vo
32f40 69 64 29 7b 20 0a 20 20 2f 2a 20 0a 20 20 2a 2a  id){ .  /* .  **
32f50 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 6d   The following m
32f60 61 63 72 6f 20 64 65 66 69 6e 65 73 20 61 6e 20  acro defines an 
32f70 69 6e 69 74 69 61 6c 69 7a 65 72 20 66 6f 72 20  initializer for 
32f80 61 6e 20 73 71 6c 69 74 65 33 5f 76 66 73 20 6f  an sqlite3_vfs o
32f90 62 6a 65 63 74 2e 0a 20 20 2a 2a 20 54 68 65 20  bject..  ** The 
32fa0 6e 61 6d 65 20 6f 66 20 74 68 65 20 56 46 53 20  name of the VFS 
32fb0 69 73 20 4e 41 4d 45 2e 20 20 54 68 65 20 70 41  is NAME.  The pA
32fc0 70 70 44 61 74 61 20 69 73 20 61 20 70 6f 69 6e  ppData is a poin
32fd0 74 65 72 20 74 6f 20 61 20 70 6f 69 6e 74 65 72  ter to a pointer
32fe0 0a 20 20 2a 2a 20 74 6f 20 74 68 65 20 22 66 69  .  ** to the "fi
32ff0 6e 64 65 72 22 20 66 75 6e 63 74 69 6f 6e 2e 20  nder" function. 
33000 20 28 70 41 70 70 44 61 74 61 20 69 73 20 61 20   (pAppData is a 
33010 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 70 6f 69  pointer to a poi
33020 6e 74 65 72 20 62 65 63 61 75 73 65 0a 20 20 2a  nter because.  *
33030 2a 20 73 69 6c 6c 79 20 43 39 30 20 72 75 6c 65  * silly C90 rule
33040 73 20 70 72 6f 68 69 62 69 74 20 61 20 76 6f 69  s prohibit a voi
33050 64 2a 20 66 72 6f 6d 20 62 65 69 6e 67 20 63 61  d* from being ca
33060 73 74 20 74 6f 20 61 20 66 75 6e 63 74 69 6f 6e  st to a function
33070 20 70 6f 69 6e 74 65 72 0a 20 20 2a 2a 20 61 6e   pointer.  ** an
33080 64 20 73 6f 20 77 65 20 68 61 76 65 20 74 6f 20  d so we have to 
33090 67 6f 20 74 68 72 6f 75 67 68 20 74 68 65 20 69  go through the i
330a0 6e 74 65 72 6d 65 64 69 61 74 65 20 70 6f 69 6e  ntermediate poin
330b0 74 65 72 20 74 6f 20 61 76 6f 69 64 20 70 72 6f  ter to avoid pro
330c0 62 6c 65 6d 73 0a 20 20 2a 2a 20 77 68 65 6e 20  blems.  ** when 
330d0 63 6f 6d 70 69 6c 69 6e 67 20 77 69 74 68 20 2d  compiling with -
330e0 70 65 64 61 6e 74 69 63 2d 65 72 72 6f 72 73 20  pedantic-errors 
330f0 6f 6e 20 47 43 43 2e 29 0a 20 20 2a 2a 0a 20 20  on GCC.).  **.  
33100 2a 2a 20 54 68 65 20 46 49 4e 44 45 52 20 70 61  ** The FINDER pa
33110 72 61 6d 65 74 65 72 20 74 6f 20 74 68 69 73 20  rameter to this 
33120 6d 61 63 72 6f 20 69 73 20 74 68 65 20 6e 61 6d  macro is the nam
33130 65 20 6f 66 20 74 68 65 20 70 6f 69 6e 74 65 72  e of the pointer
33140 20 74 6f 20 74 68 65 0a 20 20 2a 2a 20 66 69 6e   to the.  ** fin
33150 64 65 72 2d 66 75 6e 63 74 69 6f 6e 2e 20 20 54  der-function.  T
33160 68 65 20 66 69 6e 64 65 72 2d 66 75 6e 63 74 69  he finder-functi
33170 6f 6e 20 72 65 74 75 72 6e 73 20 61 20 70 6f 69  on returns a poi
33180 6e 74 65 72 20 74 6f 20 74 68 65 0a 20 20 2a 2a  nter to the.  **
33190 20 73 71 6c 69 74 65 5f 69 6f 5f 6d 65 74 68 6f   sqlite_io_metho
331a0 64 73 20 6f 62 6a 65 63 74 20 74 68 61 74 20 69  ds object that i
331b0 6d 70 6c 65 6d 65 6e 74 73 20 74 68 65 20 64 65  mplements the de
331c0 73 69 72 65 64 20 6c 6f 63 6b 69 6e 67 0a 20 20  sired locking.  
331d0 2a 2a 20 62 65 68 61 76 69 6f 72 73 2e 20 20 53  ** behaviors.  S
331e0 65 65 20 74 68 65 20 64 69 76 69 73 69 6f 6e 20  ee the division 
331f0 61 62 6f 76 65 20 74 68 61 74 20 63 6f 6e 74 61  above that conta
33200 69 6e 73 20 74 68 65 20 49 4f 4d 45 54 48 4f 44  ins the IOMETHOD
33210 53 0a 20 20 2a 2a 20 6d 61 63 72 6f 20 66 6f 72  S.  ** macro for
33220 20 61 64 64 69 74 69 6f 6e 20 69 6e 66 6f 72 6d   addition inform
33230 61 74 69 6f 6e 20 6f 6e 20 66 69 6e 64 65 72 2d  ation on finder-
33240 66 75 6e 63 74 69 6f 6e 73 2e 0a 20 20 2a 2a 0a  functions..  **.
33250 20 20 2a 2a 20 4d 6f 73 74 20 66 69 6e 64 65 72    ** Most finder
33260 73 20 73 69 6d 70 6c 79 20 72 65 74 75 72 6e 20  s simply return 
33270 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 66  a pointer to a f
33280 69 78 65 64 20 73 71 6c 69 74 65 33 5f 69 6f 5f  ixed sqlite3_io_
33290 6d 65 74 68 6f 64 73 0a 20 20 2a 2a 20 6f 62 6a  methods.  ** obj
332a0 65 63 74 2e 20 20 42 75 74 20 74 68 65 20 22 61  ect.  But the "a
332b0 75 74 6f 6c 6f 63 6b 49 6f 46 69 6e 64 65 72 22  utolockIoFinder"
332c0 20 61 76 61 69 6c 61 62 6c 65 20 6f 6e 20 4d 61   available on Ma
332d0 63 4f 53 58 20 64 6f 65 73 20 61 20 6c 69 74 74  cOSX does a litt
332e0 6c 65 0a 20 20 2a 2a 20 6d 6f 72 65 20 74 68 61  le.  ** more tha
332f0 6e 20 74 68 61 74 3b 20 69 74 20 6c 6f 6f 6b 73  n that; it looks
33300 20 61 74 20 74 68 65 20 66 69 6c 65 73 79 73 74   at the filesyst
33310 65 6d 20 74 79 70 65 20 74 68 61 74 20 68 6f 73  em type that hos
33320 74 73 20 74 68 65 20 0a 20 20 2a 2a 20 64 61 74  ts the .  ** dat
33330 61 62 61 73 65 20 66 69 6c 65 20 61 6e 64 20 74  abase file and t
33340 72 69 65 73 20 74 6f 20 63 68 6f 6f 73 65 20 61  ries to choose a
33350 6e 20 6c 6f 63 6b 69 6e 67 20 6d 65 74 68 6f 64  n locking method
33360 20 61 70 70 72 6f 70 72 69 61 74 65 20 66 6f 72   appropriate for
33370 0a 20 20 2a 2a 20 74 68 61 74 20 66 69 6c 65 73  .  ** that files
33380 79 73 74 65 6d 20 74 69 6d 65 2e 0a 20 20 2a 2f  ystem time..  */
33390 0a 20 20 23 64 65 66 69 6e 65 20 55 4e 49 58 56  .  #define UNIXV
333a0 46 53 28 56 46 53 4e 41 4d 45 2c 20 46 49 4e 44  FS(VFSNAME, FIND
333b0 45 52 29 20 7b 20 20 20 20 20 20 20 20 20 20 20  ER) {           
333c0 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20               \. 
333d0 20 20 20 32 2c 20 20 20 20 20 20 20 20 20 20 20     2,           
333e0 20 20 20 20 20 20 20 20 20 2f 2a 20 69 56 65 72           /* iVer
333f0 73 69 6f 6e 20 2a 2f 20 20 20 20 20 20 20 20 20  sion */         
33400 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20             \.   
33410 20 73 69 7a 65 6f 66 28 75 6e 69 78 46 69 6c 65   sizeof(unixFile
33420 29 2c 20 20 20 20 20 2f 2a 20 73 7a 4f 73 46 69  ),     /* szOsFi
33430 6c 65 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20  le */           
33440 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 20 4d           \.    M
33450 41 58 5f 50 41 54 48 4e 41 4d 45 2c 20 20 20 20  AX_PATHNAME,    
33460 20 20 20 20 20 2f 2a 20 6d 78 50 61 74 68 6e 61       /* mxPathna
33470 6d 65 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20  me */           
33480 20 20 20 20 20 20 20 5c 0a 20 20 20 20 30 2c 20         \.    0, 
33490 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
334a0 20 20 20 2f 2a 20 70 4e 65 78 74 20 2a 2f 20 20     /* pNext */  
334b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
334c0 20 20 20 20 20 5c 0a 20 20 20 20 56 46 53 4e 41       \.    VFSNA
334d0 4d 45 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ME,             
334e0 20 2f 2a 20 7a 4e 61 6d 65 20 2a 2f 20 20 20 20   /* zName */    
334f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33500 20 20 20 5c 0a 20 20 20 20 28 76 6f 69 64 2a 29     \.    (void*)
33510 26 46 49 4e 44 45 52 2c 20 20 20 20 20 20 20 2f  &FINDER,       /
33520 2a 20 70 41 70 70 44 61 74 61 20 2a 2f 20 20 20  * pAppData */   
33530 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33540 20 5c 0a 20 20 20 20 75 6e 69 78 4f 70 65 6e 2c   \.    unixOpen,
33550 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
33560 78 4f 70 65 6e 20 2a 2f 20 20 20 20 20 20 20 20  xOpen */        
33570 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c                 \
33580 0a 20 20 20 20 75 6e 69 78 44 65 6c 65 74 65 2c  .    unixDelete,
33590 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 44             /* xD
335a0 65 6c 65 74 65 20 2a 2f 20 20 20 20 20 20 20 20  elete */        
335b0 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20               \. 
335c0 20 20 20 75 6e 69 78 41 63 63 65 73 73 2c 20 20     unixAccess,  
335d0 20 20 20 20 20 20 20 20 20 2f 2a 20 78 41 63 63           /* xAcc
335e0 65 73 73 20 2a 2f 20 20 20 20 20 20 20 20 20 20  ess */          
335f0 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20             \.   
33600 20 75 6e 69 78 46 75 6c 6c 50 61 74 68 6e 61 6d   unixFullPathnam
33610 65 2c 20 20 20 20 20 2f 2a 20 78 46 75 6c 6c 50  e,     /* xFullP
33620 61 74 68 6e 61 6d 65 20 2a 2f 20 20 20 20 20 20  athname */      
33630 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 20 75           \.    u
33640 6e 69 78 44 6c 4f 70 65 6e 2c 20 20 20 20 20 20  nixDlOpen,      
33650 20 20 20 20 20 2f 2a 20 78 44 6c 4f 70 65 6e 20       /* xDlOpen 
33660 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20 20 20  */              
33670 20 20 20 20 20 20 20 5c 0a 20 20 20 20 75 6e 69         \.    uni
33680 78 44 6c 45 72 72 6f 72 2c 20 20 20 20 20 20 20  xDlError,       
33690 20 20 20 2f 2a 20 78 44 6c 45 72 72 6f 72 20 2a     /* xDlError *
336a0 2f 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  /               
336b0 20 20 20 20 20 5c 0a 20 20 20 20 75 6e 69 78 44       \.    unixD
336c0 6c 53 79 6d 2c 20 20 20 20 20 20 20 20 20 20 20  lSym,           
336d0 20 2f 2a 20 78 44 6c 53 79 6d 20 2a 2f 20 20 20   /* xDlSym */   
336e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
336f0 20 20 20 5c 0a 20 20 20 20 75 6e 69 78 44 6c 43     \.    unixDlC
33700 6c 6f 73 65 2c 20 20 20 20 20 20 20 20 20 20 2f  lose,          /
33710 2a 20 78 44 6c 43 6c 6f 73 65 20 2a 2f 20 20 20  * xDlClose */   
33720 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33730 20 5c 0a 20 20 20 20 75 6e 69 78 52 61 6e 64 6f   \.    unixRando
33740 6d 6e 65 73 73 2c 20 20 20 20 20 20 20 2f 2a 20  mness,       /* 
33750 78 52 61 6e 64 6f 6d 6e 65 73 73 20 2a 2f 20 20  xRandomness */  
33760 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c                 \
33770 0a 20 20 20 20 75 6e 69 78 53 6c 65 65 70 2c 20  .    unixSleep, 
33780 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53             /* xS
33790 6c 65 65 70 20 2a 2f 20 20 20 20 20 20 20 20 20  leep */         
337a0 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20               \. 
337b0 20 20 20 75 6e 69 78 43 75 72 72 65 6e 74 54 69     unixCurrentTi
337c0 6d 65 2c 20 20 20 20 20 20 2f 2a 20 78 43 75 72  me,      /* xCur
337d0 72 65 6e 74 54 69 6d 65 20 2a 2f 20 20 20 20 20  rentTime */     
337e0 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20             \.   
337f0 20 75 6e 69 78 47 65 74 4c 61 73 74 45 72 72 6f   unixGetLastErro
33800 72 2c 20 20 20 20 20 2f 2a 20 78 47 65 74 4c 61  r,     /* xGetLa
33810 73 74 45 72 72 6f 72 20 2a 2f 20 20 20 20 20 20  stError */      
33820 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 20 30           \.    0
33830 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
33840 20 20 20 20 20 2f 2a 20 78 52 65 6e 61 6d 65 20       /* xRename 
33850 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20 20 20  */              
33860 20 20 20 20 20 20 20 5c 0a 20 20 20 20 75 6e 69         \.    uni
33870 78 43 75 72 72 65 6e 74 54 69 6d 65 49 6e 74 36  xCurrentTimeInt6
33880 34 2c 20 2f 2a 20 78 43 75 72 72 65 6e 74 54 69  4, /* xCurrentTi
33890 6d 65 49 6e 74 36 34 20 2a 2f 20 20 20 20 20 20  meInt64 */      
338a0 20 20 20 20 20 5c 0a 20 20 7d 0a 0a 20 20 2f 2a       \.  }..  /*
338b0 0a 20 20 2a 2a 20 41 6c 6c 20 64 65 66 61 75 6c  .  ** All defaul
338c0 74 20 56 46 53 65 73 20 66 6f 72 20 75 6e 69 78  t VFSes for unix
338d0 20 61 72 65 20 63 6f 6e 74 61 69 6e 65 64 20 69   are contained i
338e0 6e 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  n the following 
338f0 61 72 72 61 79 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  array..  **.  **
33900 20 4e 6f 74 65 20 74 68 61 74 20 74 68 65 20 73   Note that the s
33910 71 6c 69 74 65 33 5f 76 66 73 2e 70 4e 65 78 74  qlite3_vfs.pNext
33920 20 66 69 65 6c 64 20 6f 66 20 74 68 65 20 56 46   field of the VF
33930 53 20 6f 62 6a 65 63 74 20 69 73 20 6d 6f 64 69  S object is modi
33940 66 69 65 64 0a 20 20 2a 2a 20 62 79 20 74 68 65  fied.  ** by the
33950 20 53 51 4c 69 74 65 20 63 6f 72 65 20 77 68 65   SQLite core whe
33960 6e 20 74 68 65 20 56 46 53 20 69 73 20 72 65 67  n the VFS is reg
33970 69 73 74 65 72 65 64 2e 20 20 53 6f 20 74 68 65  istered.  So the
33980 20 66 6f 6c 6c 6f 77 69 6e 67 0a 20 20 2a 2a 20   following.  ** 
33990 61 72 72 61 79 20 63 61 6e 6e 6f 74 20 62 65 20  array cannot be 
339a0 63 6f 6e 73 74 2e 0a 20 20 2a 2f 0a 20 20 73 74  const..  */.  st
339b0 61 74 69 63 20 73 71 6c 69 74 65 33 5f 76 66 73  atic sqlite3_vfs
339c0 20 61 56 66 73 5b 5d 20 3d 20 7b 0a 23 69 66 20   aVfs[] = {.#if 
339d0 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f  SQLITE_ENABLE_LO
339e0 43 4b 49 4e 47 5f 53 54 59 4c 45 20 26 26 20 28  CKING_STYLE && (
339f0 4f 53 5f 56 58 57 4f 52 4b 53 20 7c 7c 20 64 65  OS_VXWORKS || de
33a00 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29  fined(__APPLE__)
33a10 29 0a 20 20 20 20 55 4e 49 58 56 46 53 28 22 75  ).    UNIXVFS("u
33a20 6e 69 78 22 2c 20 20 20 20 20 20 20 20 20 20 61  nix",          a
33a30 75 74 6f 6c 6f 63 6b 49 6f 46 69 6e 64 65 72 20  utolockIoFinder 
33a40 29 2c 0a 23 65 6c 73 65 0a 20 20 20 20 55 4e 49  ),.#else.    UNI
33a50 58 56 46 53 28 22 75 6e 69 78 22 2c 20 20 20 20  XVFS("unix",    
33a60 20 20 20 20 20 20 70 6f 73 69 78 49 6f 46 69 6e        posixIoFin
33a70 64 65 72 20 29 2c 0a 23 65 6e 64 69 66 0a 20 20  der ),.#endif.  
33a80 20 20 55 4e 49 58 56 46 53 28 22 75 6e 69 78 2d    UNIXVFS("unix-
33a90 6e 6f 6e 65 22 2c 20 20 20 20 20 6e 6f 6c 6f 63  none",     noloc
33aa0 6b 49 6f 46 69 6e 64 65 72 20 29 2c 0a 20 20 20  kIoFinder ),.   
33ab0 20 55 4e 49 58 56 46 53 28 22 75 6e 69 78 2d 64   UNIXVFS("unix-d
33ac0 6f 74 66 69 6c 65 22 2c 20 20 64 6f 74 6c 6f 63  otfile",  dotloc
33ad0 6b 49 6f 46 69 6e 64 65 72 20 29 2c 0a 23 69 66  kIoFinder ),.#if
33ae0 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20 20 20   OS_VXWORKS.    
33af0 55 4e 49 58 56 46 53 28 22 75 6e 69 78 2d 6e 61  UNIXVFS("unix-na
33b00 6d 65 64 73 65 6d 22 2c 20 73 65 6d 49 6f 46 69  medsem", semIoFi
33b10 6e 64 65 72 20 29 2c 0a 23 65 6e 64 69 66 0a 23  nder ),.#endif.#
33b20 69 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  if SQLITE_ENABLE
33b30 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 20  _LOCKING_STYLE. 
33b40 20 20 20 55 4e 49 58 56 46 53 28 22 75 6e 69 78     UNIXVFS("unix
33b50 2d 70 6f 73 69 78 22 2c 20 20 20 20 70 6f 73 69  -posix",    posi
33b60 78 49 6f 46 69 6e 64 65 72 20 29 2c 0a 23 69 66  xIoFinder ),.#if
33b70 20 21 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20 20   !OS_VXWORKS.   
33b80 20 55 4e 49 58 56 46 53 28 22 75 6e 69 78 2d 66   UNIXVFS("unix-f
33b90 6c 6f 63 6b 22 2c 20 20 20 20 66 6c 6f 63 6b 49  lock",    flockI
33ba0 6f 46 69 6e 64 65 72 20 29 2c 0a 23 65 6e 64 69  oFinder ),.#endi
33bb0 66 0a 23 65 6e 64 69 66 0a 23 69 66 20 53 51 4c  f.#endif.#if SQL
33bc0 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49  ITE_ENABLE_LOCKI
33bd0 4e 47 5f 53 54 59 4c 45 20 26 26 20 64 65 66 69  NG_STYLE && defi
33be0 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 0a 20  ned(__APPLE__). 
33bf0 20 20 20 55 4e 49 58 56 46 53 28 22 75 6e 69 78     UNIXVFS("unix
33c00 2d 61 66 70 22 2c 20 20 20 20 20 20 61 66 70 49  -afp",      afpI
33c10 6f 46 69 6e 64 65 72 20 29 2c 0a 20 20 20 20 55  oFinder ),.    U
33c20 4e 49 58 56 46 53 28 22 75 6e 69 78 2d 6e 66 73  NIXVFS("unix-nfs
33c30 22 2c 20 20 20 20 20 20 6e 66 73 49 6f 46 69 6e  ",      nfsIoFin
33c40 64 65 72 20 29 2c 0a 20 20 20 20 55 4e 49 58 56  der ),.    UNIXV
33c50 46 53 28 22 75 6e 69 78 2d 70 72 6f 78 79 22 2c  FS("unix-proxy",
33c60 20 20 20 20 70 72 6f 78 79 49 6f 46 69 6e 64 65      proxyIoFinde
33c70 72 20 29 2c 0a 23 65 6e 64 69 66 0a 20 20 7d 3b  r ),.#endif.  };
33c80 0a 20 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20  .  unsigned int 
33c90 69 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c  i;          /* L
33ca0 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 0a  oop counter */..
33cb0 20 20 2f 2a 20 52 65 67 69 73 74 65 72 20 61 6c    /* Register al
33cc0 6c 20 56 46 53 65 73 20 64 65 66 69 6e 65 64 20  l VFSes defined 
33cd0 69 6e 20 74 68 65 20 61 56 66 73 5b 5d 20 61 72  in the aVfs[] ar
33ce0 72 61 79 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30  ray */.  for(i=0
33cf0 3b 20 69 3c 28 73 69 7a 65 6f 66 28 61 56 66 73  ; i<(sizeof(aVfs
33d00 29 2f 73 69 7a 65 6f 66 28 73 71 6c 69 74 65 33  )/sizeof(sqlite3
33d10 5f 76 66 73 29 29 3b 20 69 2b 2b 29 7b 0a 20 20  _vfs)); i++){.  
33d20 20 20 73 71 6c 69 74 65 33 5f 76 66 73 5f 72 65    sqlite3_vfs_re
33d30 67 69 73 74 65 72 28 26 61 56 66 73 5b 69 5d 2c  gister(&aVfs[i],
33d40 20 69 3d 3d 30 29 3b 0a 20 20 7d 0a 20 20 72 65   i==0);.  }.  re
33d50 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 20  turn SQLITE_OK; 
33d60 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 68 75 74 64 6f  .}../*.** Shutdo
33d70 77 6e 20 74 68 65 20 6f 70 65 72 61 74 69 6e 67  wn the operating
33d80 20 73 79 73 74 65 6d 20 69 6e 74 65 72 66 61 63   system interfac
33d90 65 2e 0a 2a 2a 0a 2a 2a 20 53 6f 6d 65 20 6f 70  e..**.** Some op
33da0 65 72 61 74 69 6e 67 20 73 79 73 74 65 6d 73 20  erating systems 
33db0 6d 69 67 68 74 20 6e 65 65 64 20 74 6f 20 64 6f  might need to do
33dc0 20 73 6f 6d 65 20 63 6c 65 61 6e 75 70 20 69 6e   some cleanup in
33dd0 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2c 0a 2a   this routine,.*
33de0 2a 20 74 6f 20 72 65 6c 65 61 73 65 20 64 79 6e  * to release dyn
33df0 61 6d 69 63 61 6c 6c 79 20 61 6c 6c 6f 63 61 74  amically allocat
33e00 65 64 20 6f 62 6a 65 63 74 73 2e 20 20 42 75 74  ed objects.  But
33e10 20 6e 6f 74 20 6f 6e 20 75 6e 69 78 2e 0a 2a 2a   not on unix..**
33e20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
33e30 20 61 20 6e 6f 2d 6f 70 20 66 6f 72 20 75 6e 69   a no-op for uni
33e40 78 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  x..*/.int sqlite
33e50 33 5f 6f 73 5f 65 6e 64 28 76 6f 69 64 29 7b 20  3_os_end(void){ 
33e60 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
33e70 5f 4f 4b 3b 20 0a 7d 0a 20 0a 23 65 6e 64 69 66  _OK; .}. .#endif
33e80 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 53 5f 55 4e   /* SQLITE_OS_UN
33e90 49 58 20 2a 2f 0a                                IX */.