/ Hex Artifact Content
Login

Artifact 5bf0015cebe2f21635da2af983c348eb88b3b4c1:


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 0a 23 69 66 20 53 51 4c 49 54  no.h>..#if SQLIT
1140: 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47  E_ENABLE_LOCKING
1150: 5f 53 54 59 4c 45 0a 23 20 69 6e 63 6c 75 64 65  _STYLE.# include
1160: 20 3c 73 79 73 2f 69 6f 63 74 6c 2e 68 3e 0a 23   <sys/ioctl.h>.#
1170: 20 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 23   if OS_VXWORKS.#
1180: 20 20 69 6e 63 6c 75 64 65 20 3c 73 65 6d 61 70    include <semap
1190: 68 6f 72 65 2e 68 3e 0a 23 20 20 69 6e 63 6c 75  hore.h>.#  inclu
11a0: 64 65 20 3c 6c 69 6d 69 74 73 2e 68 3e 0a 23 20  de <limits.h>.# 
11b0: 65 6c 73 65 0a 23 20 20 69 6e 63 6c 75 64 65 20  else.#  include 
11c0: 3c 73 79 73 2f 66 69 6c 65 2e 68 3e 0a 23 20 20  <sys/file.h>.#  
11d0: 69 6e 63 6c 75 64 65 20 3c 73 79 73 2f 70 61 72  include <sys/par
11e0: 61 6d 2e 68 3e 0a 23 20 65 6e 64 69 66 0a 23 65  am.h>.# endif.#e
11f0: 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 45  ndif /* SQLITE_E
1200: 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54  NABLE_LOCKING_ST
1210: 59 4c 45 20 2a 2f 0a 0a 23 69 66 20 64 65 66 69  YLE */..#if defi
1220: 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 7c  ned(__APPLE__) |
1230: 7c 20 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  | (SQLITE_ENABLE
1240: 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 26  _LOCKING_STYLE &
1250: 26 20 21 4f 53 5f 56 58 57 4f 52 4b 53 29 0a 23  & !OS_VXWORKS).#
1260: 20 69 6e 63 6c 75 64 65 20 3c 73 79 73 2f 6d 6f   include <sys/mo
1270: 75 6e 74 2e 68 3e 0a 23 65 6e 64 69 66 0a 0a 2f  unt.h>.#endif../
1280: 2a 0a 2a 2a 20 41 6c 6c 6f 77 65 64 20 76 61 6c  *.** Allowed val
1290: 75 65 73 20 6f 66 20 75 6e 69 78 46 69 6c 65 2e  ues of unixFile.
12a0: 66 73 46 6c 61 67 73 0a 2a 2f 0a 23 64 65 66 69  fsFlags.*/.#defi
12b0: 6e 65 20 53 51 4c 49 54 45 5f 46 53 46 4c 41 47  ne SQLITE_FSFLAG
12c0: 53 5f 49 53 5f 4d 53 44 4f 53 20 20 20 20 20 30  S_IS_MSDOS     0
12d0: 78 31 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 77 65 20  x1../*.** If we 
12e0: 61 72 65 20 74 6f 20 62 65 20 74 68 72 65 61 64  are to be thread
12f0: 2d 73 61 66 65 2c 20 69 6e 63 6c 75 64 65 20 74  -safe, include t
1300: 68 65 20 70 74 68 72 65 61 64 73 20 68 65 61 64  he pthreads head
1310: 65 72 20 61 6e 64 20 64 65 66 69 6e 65 0a 2a 2a  er and define.**
1320: 20 74 68 65 20 53 51 4c 49 54 45 5f 55 4e 49 58   the SQLITE_UNIX
1330: 5f 54 48 52 45 41 44 53 20 6d 61 63 72 6f 2e 0a  _THREADS macro..
1340: 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f 54 48  */.#if SQLITE_TH
1350: 52 45 41 44 53 41 46 45 0a 23 20 69 6e 63 6c 75  READSAFE.# inclu
1360: 64 65 20 3c 70 74 68 72 65 61 64 2e 68 3e 0a 23  de <pthread.h>.#
1370: 20 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 55   define SQLITE_U
1380: 4e 49 58 5f 54 48 52 45 41 44 53 20 31 0a 23 65  NIX_THREADS 1.#e
1390: 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 44 65 66 61  ndif../*.** Defa
13a0: 75 6c 74 20 70 65 72 6d 69 73 73 69 6f 6e 73 20  ult permissions 
13b0: 77 68 65 6e 20 63 72 65 61 74 69 6e 67 20 61 20  when creating a 
13c0: 6e 65 77 20 66 69 6c 65 0a 2a 2f 0a 23 69 66 6e  new file.*/.#ifn
13d0: 64 65 66 20 53 51 4c 49 54 45 5f 44 45 46 41 55  def SQLITE_DEFAU
13e0: 4c 54 5f 46 49 4c 45 5f 50 45 52 4d 49 53 53 49  LT_FILE_PERMISSI
13f0: 4f 4e 53 0a 23 20 64 65 66 69 6e 65 20 53 51 4c  ONS.# define SQL
1400: 49 54 45 5f 44 45 46 41 55 4c 54 5f 46 49 4c 45  ITE_DEFAULT_FILE
1410: 5f 50 45 52 4d 49 53 53 49 4f 4e 53 20 30 36 34  _PERMISSIONS 064
1420: 34 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 20 2a 2a  4.#endif../*. **
1430: 20 44 65 66 61 75 6c 74 20 70 65 72 6d 69 73 73   Default permiss
1440: 69 6f 6e 73 20 77 68 65 6e 20 63 72 65 61 74 69  ions when creati
1450: 6e 67 20 61 75 74 6f 20 70 72 6f 78 79 20 64 69  ng auto proxy di
1460: 72 0a 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51  r. */.#ifndef SQ
1470: 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 50 52 4f  LITE_DEFAULT_PRO
1480: 58 59 44 49 52 5f 50 45 52 4d 49 53 53 49 4f 4e  XYDIR_PERMISSION
1490: 53 0a 23 20 64 65 66 69 6e 65 20 53 51 4c 49 54  S.# define SQLIT
14a0: 45 5f 44 45 46 41 55 4c 54 5f 50 52 4f 58 59 44  E_DEFAULT_PROXYD
14b0: 49 52 5f 50 45 52 4d 49 53 53 49 4f 4e 53 20 30  IR_PERMISSIONS 0
14c0: 37 35 35 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  755.#endif../*.*
14d0: 2a 20 4d 61 78 69 6d 75 6d 20 73 75 70 70 6f 72  * Maximum suppor
14e0: 74 65 64 20 70 61 74 68 2d 6c 65 6e 67 74 68 2e  ted path-length.
14f0: 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 4d 41 58 5f  .*/.#define MAX_
1500: 50 41 54 48 4e 41 4d 45 20 35 31 32 0a 0a 2f 2a  PATHNAME 512../*
1510: 0a 2a 2a 20 4f 6e 6c 79 20 73 65 74 20 74 68 65  .** Only set the
1520: 20 6c 61 73 74 45 72 72 6e 6f 20 69 66 20 74 68   lastErrno if th
1530: 65 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20  e error code is 
1540: 61 20 72 65 61 6c 20 65 72 72 6f 72 20 61 6e 64  a real error and
1550: 20 6e 6f 74 20 0a 2a 2a 20 61 20 6e 6f 72 6d 61   not .** a norma
1560: 6c 20 65 78 70 65 63 74 65 64 20 72 65 74 75 72  l expected retur
1570: 6e 20 63 6f 64 65 20 6f 66 20 53 51 4c 49 54 45  n code of SQLITE
1580: 5f 42 55 53 59 20 6f 72 20 53 51 4c 49 54 45 5f  _BUSY or SQLITE_
1590: 4f 4b 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 49 53  OK.*/.#define IS
15a0: 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 78 29 20 20  _LOCK_ERROR(x)  
15b0: 28 28 78 20 21 3d 20 53 51 4c 49 54 45 5f 4f 4b  ((x != SQLITE_OK
15c0: 29 20 26 26 20 28 78 20 21 3d 20 53 51 4c 49 54  ) && (x != SQLIT
15d0: 45 5f 42 55 53 59 29 29 0a 0a 0a 2f 2a 0a 2a 2a  E_BUSY)).../*.**
15e0: 20 53 6f 6d 65 74 69 6d 65 73 2c 20 61 66 74 65   Sometimes, afte
15f0: 72 20 61 20 66 69 6c 65 20 68 61 6e 64 6c 65 20  r a file handle 
1600: 69 73 20 63 6c 6f 73 65 64 20 62 79 20 53 51 4c  is closed by SQL
1610: 69 74 65 2c 20 74 68 65 20 66 69 6c 65 20 64 65  ite, the file de
1620: 73 63 72 69 70 74 6f 72 0a 2a 2a 20 63 61 6e 6e  scriptor.** cann
1630: 6f 74 20 62 65 20 63 6c 6f 73 65 64 20 69 6d 6d  ot be closed imm
1640: 65 64 69 61 74 65 6c 79 2e 20 49 6e 20 74 68 65  ediately. In the
1650: 73 65 20 63 61 73 65 73 2c 20 69 6e 73 74 61 6e  se cases, instan
1660: 63 65 73 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f  ces of the follo
1670: 77 69 6e 67 0a 2a 2a 20 73 74 72 75 63 74 75 72  wing.** structur
1680: 65 20 61 72 65 20 75 73 65 64 20 74 6f 20 73 74  e are used to st
1690: 6f 72 65 20 74 68 65 20 66 69 6c 65 20 64 65 73  ore the file des
16a0: 63 72 69 70 74 6f 72 20 77 68 69 6c 65 20 77 61  criptor while wa
16b0: 69 74 69 6e 67 20 66 6f 72 20 61 6e 0a 2a 2a 20  iting for an.** 
16c0: 6f 70 70 6f 72 74 75 6e 69 74 79 20 74 6f 20 65  opportunity to e
16d0: 69 74 68 65 72 20 63 6c 6f 73 65 20 6f 72 20 72  ither close or r
16e0: 65 75 73 65 20 69 74 2e 0a 2a 2f 0a 74 79 70 65  euse it..*/.type
16f0: 64 65 66 20 73 74 72 75 63 74 20 55 6e 69 78 55  def struct UnixU
1700: 6e 75 73 65 64 46 64 20 55 6e 69 78 55 6e 75 73  nusedFd UnixUnus
1710: 65 64 46 64 3b 0a 73 74 72 75 63 74 20 55 6e 69  edFd;.struct Uni
1720: 78 55 6e 75 73 65 64 46 64 20 7b 0a 20 20 69 6e  xUnusedFd {.  in
1730: 74 20 66 64 3b 20 20 20 20 20 20 20 20 20 20 20  t fd;           
1740: 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 65 20          /* File 
1750: 64 65 73 63 72 69 70 74 6f 72 20 74 6f 20 63 6c  descriptor to cl
1760: 6f 73 65 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61  ose */.  int fla
1770: 67 73 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  gs;             
1780: 20 20 20 2f 2a 20 46 6c 61 67 73 20 74 68 69 73     /* Flags this
1790: 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
17a0: 20 77 61 73 20 6f 70 65 6e 65 64 20 77 69 74 68   was opened with
17b0: 20 2a 2f 0a 20 20 55 6e 69 78 55 6e 75 73 65 64   */.  UnixUnused
17c0: 46 64 20 2a 70 4e 65 78 74 3b 20 20 20 20 20 20  Fd *pNext;      
17d0: 2f 2a 20 4e 65 78 74 20 75 6e 75 73 65 64 20 66  /* Next unused f
17e0: 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 6f  ile descriptor o
17f0: 6e 20 73 61 6d 65 20 66 69 6c 65 20 2a 2f 0a 7d  n same file */.}
1800: 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 75 6e 69  ;../*.** The uni
1810: 78 46 69 6c 65 20 73 74 72 75 63 74 75 72 65 20  xFile structure 
1820: 69 73 20 73 75 62 63 6c 61 73 73 20 6f 66 20 73  is subclass of s
1830: 71 6c 69 74 65 33 5f 66 69 6c 65 20 73 70 65 63  qlite3_file spec
1840: 69 66 69 63 20 74 6f 20 74 68 65 20 75 6e 69 78  ific to the unix
1850: 0a 2a 2a 20 56 46 53 20 69 6d 70 6c 65 6d 65 6e  .** VFS implemen
1860: 74 61 74 69 6f 6e 73 2e 0a 2a 2f 0a 74 79 70 65  tations..*/.type
1870: 64 65 66 20 73 74 72 75 63 74 20 75 6e 69 78 46  def struct unixF
1880: 69 6c 65 20 75 6e 69 78 46 69 6c 65 3b 0a 73 74  ile unixFile;.st
1890: 72 75 63 74 20 75 6e 69 78 46 69 6c 65 20 7b 0a  ruct unixFile {.
18a0: 20 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74    sqlite3_io_met
18b0: 68 6f 64 73 20 63 6f 6e 73 74 20 2a 70 4d 65 74  hods const *pMet
18c0: 68 6f 64 3b 20 20 2f 2a 20 41 6c 77 61 79 73 20  hod;  /* Always 
18d0: 74 68 65 20 66 69 72 73 74 20 65 6e 74 72 79 20  the first entry 
18e0: 2a 2f 0a 20 20 73 74 72 75 63 74 20 75 6e 69 78  */.  struct unix
18f0: 4f 70 65 6e 43 6e 74 20 2a 70 4f 70 65 6e 3b 20  OpenCnt *pOpen; 
1900: 20 20 20 20 20 20 2f 2a 20 49 6e 66 6f 20 61 62        /* Info ab
1910: 6f 75 74 20 61 6c 6c 20 6f 70 65 6e 20 66 64 27  out all open fd'
1920: 73 20 6f 6e 20 74 68 69 73 20 69 6e 6f 64 65 20  s on this inode 
1930: 2a 2f 0a 20 20 73 74 72 75 63 74 20 75 6e 69 78  */.  struct unix
1940: 4c 6f 63 6b 49 6e 66 6f 20 2a 70 4c 6f 63 6b 3b  LockInfo *pLock;
1950: 20 20 20 20 20 20 2f 2a 20 49 6e 66 6f 20 61 62        /* Info ab
1960: 6f 75 74 20 6c 6f 63 6b 73 20 6f 6e 20 74 68 69  out locks on thi
1970: 73 20 69 6e 6f 64 65 20 2a 2f 0a 20 20 69 6e 74  s inode */.  int
1980: 20 68 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   h;             
1990: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
19a0: 20 54 68 65 20 66 69 6c 65 20 64 65 73 63 72 69   The file descri
19b0: 70 74 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 64 69  ptor */.  int di
19c0: 72 66 64 3b 20 20 20 20 20 20 20 20 20 20 20 20  rfd;            
19d0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69             /* Fi
19e0: 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 66 6f  le descriptor fo
19f0: 72 20 74 68 65 20 64 69 72 65 63 74 6f 72 79 20  r the directory 
1a00: 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68  */.  unsigned ch
1a10: 61 72 20 6c 6f 63 6b 74 79 70 65 3b 20 20 20 20  ar locktype;    
1a20: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 74 79 70        /* The typ
1a30: 65 20 6f 66 20 6c 6f 63 6b 20 68 65 6c 64 20 6f  e of lock held o
1a40: 6e 20 74 68 69 73 20 66 64 20 2a 2f 0a 20 20 69  n this fd */.  i
1a50: 6e 74 20 6c 61 73 74 45 72 72 6e 6f 3b 20 20 20  nt lastErrno;   
1a60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a70: 2f 2a 20 54 68 65 20 75 6e 69 78 20 65 72 72 6e  /* The unix errn
1a80: 6f 20 66 72 6f 6d 20 74 68 65 20 6c 61 73 74 20  o from the last 
1a90: 49 2f 4f 20 65 72 72 6f 72 20 2a 2f 0a 20 20 76  I/O error */.  v
1aa0: 6f 69 64 20 2a 6c 6f 63 6b 69 6e 67 43 6f 6e 74  oid *lockingCont
1ab0: 65 78 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  ext;            
1ac0: 2f 2a 20 4c 6f 63 6b 69 6e 67 20 73 74 79 6c 65  /* Locking style
1ad0: 20 73 70 65 63 69 66 69 63 20 73 74 61 74 65 20   specific state 
1ae0: 2a 2f 0a 20 20 55 6e 69 78 55 6e 75 73 65 64 46  */.  UnixUnusedF
1af0: 64 20 2a 70 55 6e 75 73 65 64 3b 20 20 20 20 20  d *pUnused;     
1b00: 20 20 20 20 20 20 2f 2a 20 50 72 65 2d 61 6c 6c        /* Pre-all
1b10: 6f 63 61 74 65 64 20 55 6e 69 78 55 6e 75 73 65  ocated UnixUnuse
1b20: 64 46 64 20 2a 2f 0a 20 20 69 6e 74 20 66 69 6c  dFd */.  int fil
1b30: 65 46 6c 61 67 73 3b 20 20 20 20 20 20 20 20 20  eFlags;         
1b40: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 69 73            /* Mis
1b50: 63 65 6c 6c 61 6e 6f 75 73 20 66 6c 61 67 73 20  cellanous flags 
1b60: 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f 45 4e  */.#if SQLITE_EN
1b70: 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59  ABLE_LOCKING_STY
1b80: 4c 45 0a 20 20 69 6e 74 20 6f 70 65 6e 46 6c 61  LE.  int openFla
1b90: 67 73 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  gs;             
1ba0: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 66 6c 61        /* The fla
1bb0: 67 73 20 73 70 65 63 69 66 69 65 64 20 61 74 20  gs specified at 
1bc0: 6f 70 65 6e 28 29 20 2a 2f 0a 23 65 6e 64 69 66  open() */.#endif
1bd0: 0a 23 69 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  .#if SQLITE_ENAB
1be0: 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45  LE_LOCKING_STYLE
1bf0: 20 7c 7c 20 64 65 66 69 6e 65 64 28 5f 5f 41 50   || defined(__AP
1c00: 50 4c 45 5f 5f 29 0a 20 20 75 6e 73 69 67 6e 65  PLE__).  unsigne
1c10: 64 20 66 73 46 6c 61 67 73 3b 20 20 20 20 20 20  d fsFlags;      
1c20: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 63 61             /* ca
1c30: 63 68 65 64 20 64 65 74 61 69 6c 73 20 66 72 6f  ched details fro
1c40: 6d 20 73 74 61 74 66 73 28 29 20 2a 2f 0a 23 65  m statfs() */.#e
1c50: 6e 64 69 66 0a 23 69 66 20 53 51 4c 49 54 45 5f  ndif.#if SQLITE_
1c60: 54 48 52 45 41 44 53 41 46 45 20 26 26 20 64 65  THREADSAFE && de
1c70: 66 69 6e 65 64 28 5f 5f 6c 69 6e 75 78 5f 5f 29  fined(__linux__)
1c80: 0a 20 20 70 74 68 72 65 61 64 5f 74 20 74 69 64  .  pthread_t tid
1c90: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1ca0: 20 20 20 20 2f 2a 20 54 68 65 20 74 68 72 65 61      /* The threa
1cb0: 64 20 74 68 61 74 20 22 6f 77 6e 73 22 20 74 68  d that "owns" th
1cc0: 69 73 20 75 6e 69 78 46 69 6c 65 20 2a 2f 0a 23  is unixFile */.#
1cd0: 65 6e 64 69 66 0a 23 69 66 20 4f 53 5f 56 58 57  endif.#if OS_VXW
1ce0: 4f 52 4b 53 0a 20 20 69 6e 74 20 69 73 44 65 6c  ORKS.  int isDel
1cf0: 65 74 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ete;            
1d00: 20 20 20 20 20 20 20 20 2f 2a 20 44 65 6c 65 74          /* Delet
1d10: 65 20 6f 6e 20 63 6c 6f 73 65 20 69 66 20 74 72  e on close if tr
1d20: 75 65 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 76  ue */.  struct v
1d30: 78 77 6f 72 6b 73 46 69 6c 65 49 64 20 2a 70 49  xworksFileId *pI
1d40: 64 3b 20 20 20 20 20 20 20 2f 2a 20 55 6e 69 71  d;       /* Uniq
1d50: 75 65 20 66 69 6c 65 20 49 44 20 2a 2f 0a 23 65  ue file ID */.#e
1d60: 6e 64 69 66 0a 23 69 66 6e 64 65 66 20 4e 44 45  ndif.#ifndef NDE
1d70: 42 55 47 0a 20 20 2f 2a 20 54 68 65 20 6e 65 78  BUG.  /* The nex
1d80: 74 20 67 72 6f 75 70 20 6f 66 20 76 61 72 69 61  t group of varia
1d90: 62 6c 65 73 20 61 72 65 20 75 73 65 64 20 74 6f  bles are used to
1da0: 20 74 72 61 63 6b 20 77 68 65 74 68 65 72 20 6f   track whether o
1db0: 72 20 6e 6f 74 20 74 68 65 0a 20 20 2a 2a 20 74  r not the.  ** t
1dc0: 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f 75 6e 74  ransaction count
1dd0: 65 72 20 69 6e 20 62 79 74 65 73 20 32 34 2d 32  er in bytes 24-2
1de0: 37 20 6f 66 20 64 61 74 61 62 61 73 65 20 66 69  7 of database fi
1df0: 6c 65 73 20 61 72 65 20 75 70 64 61 74 65 64 0a  les are updated.
1e00: 20 20 2a 2a 20 77 68 65 6e 65 76 65 72 20 61 6e    ** whenever an
1e10: 79 20 70 61 72 74 20 6f 66 20 74 68 65 20 64 61  y part of the da
1e20: 74 61 62 61 73 65 20 63 68 61 6e 67 65 73 2e 20  tabase changes. 
1e30: 20 41 6e 20 61 73 73 65 72 74 69 6f 6e 20 66 61   An assertion fa
1e40: 75 6c 74 20 77 69 6c 6c 0a 20 20 2a 2a 20 6f 63  ult will.  ** oc
1e50: 63 75 72 20 69 66 20 61 20 66 69 6c 65 20 69 73  cur if a file is
1e60: 20 75 70 64 61 74 65 64 20 77 69 74 68 6f 75 74   updated without
1e70: 20 61 6c 73 6f 20 75 70 64 61 74 69 6e 67 20 74   also updating t
1e80: 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 20  he transaction. 
1e90: 20 2a 2a 20 63 6f 75 6e 74 65 72 2e 20 20 54 68   ** counter.  Th
1ea0: 69 73 20 74 65 73 74 20 69 73 20 6d 61 64 65 20  is test is made 
1eb0: 74 6f 20 61 76 6f 69 64 20 6e 65 77 20 70 72 6f  to avoid new pro
1ec0: 62 6c 65 6d 73 20 73 69 6d 69 6c 61 72 20 74 6f  blems similar to
1ed0: 20 74 68 65 0a 20 20 2a 2a 20 6f 6e 65 20 64 65   the.  ** one de
1ee0: 73 63 72 69 62 65 64 20 62 79 20 74 69 63 6b 65  scribed by ticke
1ef0: 74 20 23 33 35 38 34 2e 20 0a 20 20 2a 2f 0a 20  t #3584. .  */. 
1f00: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 74   unsigned char t
1f10: 72 61 6e 73 43 6e 74 72 43 68 6e 67 3b 20 20 20  ransCntrChng;   
1f20: 2f 2a 20 54 72 75 65 20 69 66 20 74 68 65 20 74  /* True if the t
1f30: 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f 75 6e 74  ransaction count
1f40: 65 72 20 63 68 61 6e 67 65 64 20 2a 2f 0a 20 20  er changed */.  
1f50: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 64 62  unsigned char db
1f60: 55 70 64 61 74 65 3b 20 20 20 20 20 20 20 20 2f  Update;        /
1f70: 2a 20 54 72 75 65 20 69 66 20 61 6e 79 20 70 61  * True if any pa
1f80: 72 74 20 6f 66 20 64 61 74 61 62 61 73 65 20 66  rt of database f
1f90: 69 6c 65 20 63 68 61 6e 67 65 64 20 2a 2f 0a 20  ile changed */. 
1fa0: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 69   unsigned char i
1fb0: 6e 4e 6f 72 6d 61 6c 57 72 69 74 65 3b 20 20 20  nNormalWrite;   
1fc0: 2f 2a 20 54 72 75 65 20 69 66 20 69 6e 20 61 20  /* True if in a 
1fd0: 6e 6f 72 6d 61 6c 20 77 72 69 74 65 20 6f 70 65  normal write ope
1fe0: 72 61 74 69 6f 6e 20 2a 2f 0a 23 65 6e 64 69 66  ration */.#endif
1ff0: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54  .#ifdef SQLITE_T
2000: 45 53 54 0a 20 20 2f 2a 20 49 6e 20 74 65 73 74  EST.  /* In test
2010: 20 6d 6f 64 65 2c 20 69 6e 63 72 65 61 73 65 20   mode, increase 
2020: 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 69 73  the size of this
2030: 20 73 74 72 75 63 74 75 72 65 20 61 20 62 69 74   structure a bit
2040: 20 73 6f 20 74 68 61 74 20 0a 20 20 2a 2a 20 69   so that .  ** i
2050: 74 20 69 73 20 6c 61 72 67 65 72 20 74 68 61 6e  t is larger than
2060: 20 74 68 65 20 73 74 72 75 63 74 20 43 72 61 73   the struct Cras
2070: 68 46 69 6c 65 20 64 65 66 69 6e 65 64 20 69 6e  hFile defined in
2080: 20 74 65 73 74 36 2e 63 2e 0a 20 20 2a 2f 0a 20   test6.c..  */. 
2090: 20 63 68 61 72 20 61 50 61 64 64 69 6e 67 5b 33   char aPadding[3
20a0: 32 5d 3b 0a 23 65 6e 64 69 66 0a 7d 3b 0a 0a 2f  2];.#endif.};../
20b0: 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69  *.** The followi
20c0: 6e 67 20 6d 61 63 72 6f 73 20 64 65 66 69 6e 65  ng macros define
20d0: 20 62 69 74 73 20 69 6e 20 75 6e 69 78 46 69 6c   bits in unixFil
20e0: 65 2e 66 69 6c 65 46 6c 61 67 73 0a 2a 2f 0a 23  e.fileFlags.*/.#
20f0: 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 57 48  define SQLITE_WH
2100: 4f 4c 45 5f 46 49 4c 45 5f 4c 4f 43 4b 49 4e 47  OLE_FILE_LOCKING
2110: 20 20 30 78 30 30 30 31 20 20 20 2f 2a 20 55 73    0x0001   /* Us
2120: 65 20 77 68 6f 6c 65 2d 66 69 6c 65 20 6c 6f 63  e whole-file loc
2130: 6b 69 6e 67 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 49  king */../*.** I
2140: 6e 63 6c 75 64 65 20 63 6f 64 65 20 74 68 61 74  nclude code that
2150: 20 69 73 20 63 6f 6d 6d 6f 6e 20 74 6f 20 61 6c   is common to al
2160: 6c 20 6f 73 5f 2a 2e 63 20 66 69 6c 65 73 0a 2a  l os_*.c files.*
2170: 2f 0a 23 69 6e 63 6c 75 64 65 20 22 6f 73 5f 63  /.#include "os_c
2180: 6f 6d 6d 6f 6e 2e 68 22 0a 0a 2f 2a 0a 2a 2a 20  ommon.h"../*.** 
2190: 44 65 66 69 6e 65 20 76 61 72 69 6f 75 73 20 6d  Define various m
21a0: 61 63 72 6f 73 20 74 68 61 74 20 61 72 65 20 6d  acros that are m
21b0: 69 73 73 69 6e 67 20 66 72 6f 6d 20 73 6f 6d 65  issing from some
21c0: 20 73 79 73 74 65 6d 73 2e 0a 2a 2f 0a 23 69 66   systems..*/.#if
21d0: 6e 64 65 66 20 4f 5f 4c 41 52 47 45 46 49 4c 45  ndef O_LARGEFILE
21e0: 0a 23 20 64 65 66 69 6e 65 20 4f 5f 4c 41 52 47  .# define O_LARG
21f0: 45 46 49 4c 45 20 30 0a 23 65 6e 64 69 66 0a 23  EFILE 0.#endif.#
2200: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 49 53  ifdef SQLITE_DIS
2210: 41 42 4c 45 5f 4c 46 53 0a 23 20 75 6e 64 65 66  ABLE_LFS.# undef
2220: 20 4f 5f 4c 41 52 47 45 46 49 4c 45 0a 23 20 64   O_LARGEFILE.# d
2230: 65 66 69 6e 65 20 4f 5f 4c 41 52 47 45 46 49 4c  efine O_LARGEFIL
2240: 45 20 30 0a 23 65 6e 64 69 66 0a 23 69 66 6e 64  E 0.#endif.#ifnd
2250: 65 66 20 4f 5f 4e 4f 46 4f 4c 4c 4f 57 0a 23 20  ef O_NOFOLLOW.# 
2260: 64 65 66 69 6e 65 20 4f 5f 4e 4f 46 4f 4c 4c 4f  define O_NOFOLLO
2270: 57 20 30 0a 23 65 6e 64 69 66 0a 23 69 66 6e 64  W 0.#endif.#ifnd
2280: 65 66 20 4f 5f 42 49 4e 41 52 59 0a 23 20 64 65  ef O_BINARY.# de
2290: 66 69 6e 65 20 4f 5f 42 49 4e 41 52 59 20 30 0a  fine O_BINARY 0.
22a0: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68  #endif../*.** Th
22b0: 65 20 44 4a 47 50 50 20 63 6f 6d 70 69 6c 65 72  e DJGPP compiler
22c0: 20 65 6e 76 69 72 6f 6e 6d 65 6e 74 20 6c 6f 6f   environment loo
22d0: 6b 73 20 6d 6f 73 74 6c 79 20 6c 69 6b 65 20 55  ks mostly like U
22e0: 6e 69 78 2c 20 62 75 74 20 69 74 0a 2a 2a 20 6c  nix, but it.** l
22f0: 61 63 6b 73 20 74 68 65 20 66 63 6e 74 6c 28 29  acks the fcntl()
2300: 20 73 79 73 74 65 6d 20 63 61 6c 6c 2e 20 20 53   system call.  S
2310: 6f 20 72 65 64 65 66 69 6e 65 20 66 63 6e 74 6c  o redefine fcntl
2320: 28 29 20 74 6f 20 62 65 20 73 6f 6d 65 74 68 69  () to be somethi
2330: 6e 67 0a 2a 2a 20 74 68 61 74 20 61 6c 77 61 79  ng.** that alway
2340: 73 20 73 75 63 63 65 65 64 73 2e 20 20 54 68 69  s succeeds.  Thi
2350: 73 20 6d 65 61 6e 73 20 74 68 61 74 20 6c 6f 63  s means that loc
2360: 6b 69 6e 67 20 64 6f 65 73 20 6e 6f 74 20 6f 63  king does not oc
2370: 63 75 72 20 75 6e 64 65 72 0a 2a 2a 20 44 4a 47  cur under.** DJG
2380: 50 50 2e 20 20 42 75 74 20 69 74 20 69 73 20 44  PP.  But it is D
2390: 4f 53 20 2d 20 77 68 61 74 20 64 69 64 20 79 6f  OS - what did yo
23a0: 75 20 65 78 70 65 63 74 3f 0a 2a 2f 0a 23 69 66  u expect?.*/.#if
23b0: 64 65 66 20 5f 5f 44 4a 47 50 50 5f 5f 0a 23 20  def __DJGPP__.# 
23c0: 64 65 66 69 6e 65 20 66 63 6e 74 6c 28 41 2c 42  define fcntl(A,B
23d0: 2c 43 29 20 30 0a 23 65 6e 64 69 66 0a 0a 2f 2a  ,C) 0.#endif../*
23e0: 0a 2a 2a 20 54 68 65 20 74 68 72 65 61 64 69 64  .** The threadid
23f0: 20 6d 61 63 72 6f 20 72 65 73 6f 6c 76 65 73 20   macro resolves 
2400: 74 6f 20 74 68 65 20 74 68 72 65 61 64 2d 69 64  to the thread-id
2410: 20 6f 72 20 74 6f 20 30 2e 20 20 55 73 65 64 20   or to 0.  Used 
2420: 66 6f 72 0a 2a 2a 20 74 65 73 74 69 6e 67 20 61  for.** testing a
2430: 6e 64 20 64 65 62 75 67 67 69 6e 67 20 6f 6e 6c  nd debugging onl
2440: 79 2e 0a 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45  y..*/.#if SQLITE
2450: 5f 54 48 52 45 41 44 53 41 46 45 0a 23 64 65 66  _THREADSAFE.#def
2460: 69 6e 65 20 74 68 72 65 61 64 69 64 20 70 74 68  ine threadid pth
2470: 72 65 61 64 5f 73 65 6c 66 28 29 0a 23 65 6c 73  read_self().#els
2480: 65 0a 23 64 65 66 69 6e 65 20 74 68 72 65 61 64  e.#define thread
2490: 69 64 20 30 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a  id 0.#endif.../*
24a0: 0a 2a 2a 20 48 65 6c 70 65 72 20 66 75 6e 63 74  .** Helper funct
24b0: 69 6f 6e 73 20 74 6f 20 6f 62 74 61 69 6e 20 61  ions to obtain a
24c0: 6e 64 20 72 65 6c 69 6e 71 75 69 73 68 20 74 68  nd relinquish th
24d0: 65 20 67 6c 6f 62 61 6c 20 6d 75 74 65 78 2e 20  e global mutex. 
24e0: 54 68 65 0a 2a 2a 20 67 6c 6f 62 61 6c 20 6d 75  The.** global mu
24f0: 74 65 78 20 69 73 20 75 73 65 64 20 74 6f 20 70  tex is used to p
2500: 72 6f 74 65 63 74 20 74 68 65 20 75 6e 69 78 4f  rotect the unixO
2510: 70 65 6e 43 6e 74 2c 20 75 6e 69 78 4c 6f 63 6b  penCnt, unixLock
2520: 49 6e 66 6f 20 61 6e 64 0a 2a 2a 20 76 78 77 6f  Info and.** vxwo
2530: 72 6b 73 46 69 6c 65 49 64 20 6f 62 6a 65 63 74  rksFileId object
2540: 73 20 75 73 65 64 20 62 79 20 74 68 69 73 20 66  s used by this f
2550: 69 6c 65 2c 20 61 6c 6c 20 6f 66 20 77 68 69 63  ile, all of whic
2560: 68 20 6d 61 79 20 62 65 20 0a 2a 2a 20 73 68 61  h may be .** sha
2570: 72 65 64 20 62 79 20 6d 75 6c 74 69 70 6c 65 20  red by multiple 
2580: 74 68 72 65 61 64 73 2e 0a 2a 2a 0a 2a 2a 20 46  threads..**.** F
2590: 75 6e 63 74 69 6f 6e 20 75 6e 69 78 4d 75 74 65  unction unixMute
25a0: 78 48 65 6c 64 28 29 20 69 73 20 75 73 65 64 20  xHeld() is used 
25b0: 74 6f 20 61 73 73 65 72 74 28 29 20 74 68 61 74  to assert() that
25c0: 20 74 68 65 20 67 6c 6f 62 61 6c 20 6d 75 74 65   the global mute
25d0: 78 20 0a 2a 2a 20 69 73 20 68 65 6c 64 20 77 68  x .** is held wh
25e0: 65 6e 20 72 65 71 75 69 72 65 64 2e 20 54 68 69  en required. Thi
25f0: 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 6f 6e  s function is on
2600: 6c 79 20 75 73 65 64 20 61 73 20 70 61 72 74 20  ly used as part 
2610: 6f 66 20 61 73 73 65 72 74 28 29 20 0a 2a 2a 20  of assert() .** 
2620: 73 74 61 74 65 6d 65 6e 74 73 2e 20 65 2e 67 2e  statements. e.g.
2630: 0a 2a 2a 0a 2a 2a 20 20 20 75 6e 69 78 45 6e 74  .**.**   unixEnt
2640: 65 72 4d 75 74 65 78 28 29 0a 2a 2a 20 20 20 20  erMutex().**    
2650: 20 61 73 73 65 72 74 28 20 75 6e 69 78 4d 75 74   assert( unixMut
2660: 65 78 48 65 6c 64 28 29 20 29 3b 0a 2a 2a 20 20  exHeld() );.**  
2670: 20 75 6e 69 78 45 6e 74 65 72 4c 65 61 76 65 28   unixEnterLeave(
2680: 29 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ).*/.static void
2690: 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28   unixEnterMutex(
26a0: 76 6f 69 64 29 7b 0a 20 20 73 71 6c 69 74 65 33  void){.  sqlite3
26b0: 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 73 71 6c  _mutex_enter(sql
26c0: 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53  ite3MutexAlloc(S
26d0: 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54 41 54  QLITE_MUTEX_STAT
26e0: 49 43 5f 4d 41 53 54 45 52 29 29 3b 0a 7d 0a 73  IC_MASTER));.}.s
26f0: 74 61 74 69 63 20 76 6f 69 64 20 75 6e 69 78 4c  tatic void unixL
2700: 65 61 76 65 4d 75 74 65 78 28 76 6f 69 64 29 7b  eaveMutex(void){
2710: 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
2720: 5f 6c 65 61 76 65 28 73 71 6c 69 74 65 33 4d 75  _leave(sqlite3Mu
2730: 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49 54 45 5f  texAlloc(SQLITE_
2740: 4d 55 54 45 58 5f 53 54 41 54 49 43 5f 4d 41 53  MUTEX_STATIC_MAS
2750: 54 45 52 29 29 3b 0a 7d 0a 23 69 66 64 65 66 20  TER));.}.#ifdef 
2760: 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 73 74 61  SQLITE_DEBUG.sta
2770: 74 69 63 20 69 6e 74 20 75 6e 69 78 4d 75 74 65  tic int unixMute
2780: 78 48 65 6c 64 28 76 6f 69 64 29 20 7b 0a 20 20  xHeld(void) {.  
2790: 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 5f 6d  return sqlite3_m
27a0: 75 74 65 78 5f 68 65 6c 64 28 73 71 6c 69 74 65  utex_held(sqlite
27b0: 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49  3MutexAlloc(SQLI
27c0: 54 45 5f 4d 55 54 45 58 5f 53 54 41 54 49 43 5f  TE_MUTEX_STATIC_
27d0: 4d 41 53 54 45 52 29 29 3b 0a 7d 0a 23 65 6e 64  MASTER));.}.#end
27e0: 69 66 0a 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  if...#ifdef SQLI
27f0: 54 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20 48  TE_DEBUG./*.** H
2800: 65 6c 70 65 72 20 66 75 6e 63 74 69 6f 6e 20 66  elper function f
2810: 6f 72 20 70 72 69 6e 74 69 6e 67 20 6f 75 74 20  or printing out 
2820: 74 72 61 63 65 20 69 6e 66 6f 72 6d 61 74 69 6f  trace informatio
2830: 6e 20 66 72 6f 6d 20 64 65 62 75 67 67 69 6e 67  n from debugging
2840: 0a 2a 2a 20 62 69 6e 61 72 69 65 73 2e 20 54 68  .** binaries. Th
2850: 69 73 20 72 65 74 75 72 6e 73 20 74 68 65 20 73  is returns the s
2860: 74 72 69 6e 67 20 72 65 70 72 65 73 65 74 61 74  tring represetat
2870: 69 6f 6e 20 6f 66 20 74 68 65 20 73 75 70 70 6c  ion of the suppl
2880: 69 65 64 0a 2a 2a 20 69 6e 74 65 67 65 72 20 6c  ied.** integer l
2890: 6f 63 6b 2d 74 79 70 65 2e 0a 2a 2f 0a 73 74 61  ock-type..*/.sta
28a0: 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  tic const char *
28b0: 6c 6f 63 6b 74 79 70 65 4e 61 6d 65 28 69 6e 74  locktypeName(int
28c0: 20 6c 6f 63 6b 74 79 70 65 29 7b 0a 20 20 73 77   locktype){.  sw
28d0: 69 74 63 68 28 20 6c 6f 63 6b 74 79 70 65 20 29  itch( locktype )
28e0: 7b 0a 20 20 20 20 63 61 73 65 20 4e 4f 5f 4c 4f  {.    case NO_LO
28f0: 43 4b 3a 20 72 65 74 75 72 6e 20 22 4e 4f 4e 45  CK: return "NONE
2900: 22 3b 0a 20 20 20 20 63 61 73 65 20 53 48 41 52  ";.    case SHAR
2910: 45 44 5f 4c 4f 43 4b 3a 20 72 65 74 75 72 6e 20  ED_LOCK: return 
2920: 22 53 48 41 52 45 44 22 3b 0a 20 20 20 20 63 61  "SHARED";.    ca
2930: 73 65 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b  se RESERVED_LOCK
2940: 3a 20 72 65 74 75 72 6e 20 22 52 45 53 45 52 56  : return "RESERV
2950: 45 44 22 3b 0a 20 20 20 20 63 61 73 65 20 50 45  ED";.    case PE
2960: 4e 44 49 4e 47 5f 4c 4f 43 4b 3a 20 72 65 74 75  NDING_LOCK: retu
2970: 72 6e 20 22 50 45 4e 44 49 4e 47 22 3b 0a 20 20  rn "PENDING";.  
2980: 20 20 63 61 73 65 20 45 58 43 4c 55 53 49 56 45    case EXCLUSIVE
2990: 5f 4c 4f 43 4b 3a 20 72 65 74 75 72 6e 20 22 45  _LOCK: return "E
29a0: 58 43 4c 55 53 49 56 45 22 3b 0a 20 20 7d 0a 20  XCLUSIVE";.  }. 
29b0: 20 72 65 74 75 72 6e 20 22 45 52 52 4f 52 22 3b   return "ERROR";
29c0: 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64 65  .}.#endif..#ifde
29d0: 66 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 5f 54 52  f SQLITE_LOCK_TR
29e0: 41 43 45 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20  ACE./*.** Print 
29f0: 6f 75 74 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  out information 
2a00: 61 62 6f 75 74 20 61 6c 6c 20 6c 6f 63 6b 69 6e  about all lockin
2a10: 67 20 6f 70 65 72 61 74 69 6f 6e 73 2e 0a 2a 2a  g operations..**
2a20: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
2a30: 20 69 73 20 75 73 65 64 20 66 6f 72 20 74 72 6f   is used for tro
2a40: 75 62 6c 65 73 68 6f 6f 74 69 6e 67 20 6c 6f 63  ubleshooting loc
2a50: 6b 73 20 6f 6e 20 6d 75 6c 74 69 74 68 72 65 61  ks on multithrea
2a60: 64 65 64 0a 2a 2a 20 70 6c 61 74 66 6f 72 6d 73  ded.** platforms
2a70: 2e 20 20 45 6e 61 62 6c 65 20 62 79 20 63 6f 6d  .  Enable by com
2a80: 70 69 6c 69 6e 67 20 77 69 74 68 20 74 68 65 20  piling with the 
2a90: 2d 44 53 51 4c 49 54 45 5f 4c 4f 43 4b 5f 54 52  -DSQLITE_LOCK_TR
2aa0: 41 43 45 0a 2a 2a 20 63 6f 6d 6d 61 6e 64 2d 6c  ACE.** command-l
2ab0: 69 6e 65 20 6f 70 74 69 6f 6e 20 6f 6e 20 74 68  ine option on th
2ac0: 65 20 63 6f 6d 70 69 6c 65 72 2e 20 20 54 68 69  e compiler.  Thi
2ad0: 73 20 63 6f 64 65 20 69 73 20 6e 6f 72 6d 61 6c  s code is normal
2ae0: 6c 79 0a 2a 2a 20 74 75 72 6e 65 64 20 6f 66 66  ly.** turned off
2af0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
2b00: 6c 6f 63 6b 54 72 61 63 65 28 69 6e 74 20 66 64  lockTrace(int fd
2b10: 2c 20 69 6e 74 20 6f 70 2c 20 73 74 72 75 63 74  , int op, struct
2b20: 20 66 6c 6f 63 6b 20 2a 70 29 7b 0a 20 20 63 68   flock *p){.  ch
2b30: 61 72 20 2a 7a 4f 70 4e 61 6d 65 2c 20 2a 7a 54  ar *zOpName, *zT
2b40: 79 70 65 3b 0a 20 20 69 6e 74 20 73 3b 0a 20 20  ype;.  int s;.  
2b50: 69 6e 74 20 73 61 76 65 64 45 72 72 6e 6f 3b 0a  int savedErrno;.
2b60: 20 20 69 66 28 20 6f 70 3d 3d 46 5f 47 45 54 4c    if( op==F_GETL
2b70: 4b 20 29 7b 0a 20 20 20 20 7a 4f 70 4e 61 6d 65  K ){.    zOpName
2b80: 20 3d 20 22 47 45 54 4c 4b 22 3b 0a 20 20 7d 65   = "GETLK";.  }e
2b90: 6c 73 65 20 69 66 28 20 6f 70 3d 3d 46 5f 53 45  lse if( op==F_SE
2ba0: 54 4c 4b 20 29 7b 0a 20 20 20 20 7a 4f 70 4e 61  TLK ){.    zOpNa
2bb0: 6d 65 20 3d 20 22 53 45 54 4c 4b 22 3b 0a 20 20  me = "SETLK";.  
2bc0: 7d 65 6c 73 65 7b 0a 20 20 20 20 73 20 3d 20 66  }else{.    s = f
2bd0: 63 6e 74 6c 28 66 64 2c 20 6f 70 2c 20 70 29 3b  cntl(fd, op, p);
2be0: 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75  .    sqlite3Debu
2bf0: 67 50 72 69 6e 74 66 28 22 66 63 6e 74 6c 20 75  gPrintf("fcntl u
2c00: 6e 6b 6e 6f 77 6e 20 25 64 20 25 64 20 25 64 5c  nknown %d %d %d\
2c10: 6e 22 2c 20 66 64 2c 20 6f 70 2c 20 73 29 3b 0a  n", fd, op, s);.
2c20: 20 20 20 20 72 65 74 75 72 6e 20 73 3b 0a 20 20      return s;.  
2c30: 7d 0a 20 20 69 66 28 20 70 2d 3e 6c 5f 74 79 70  }.  if( p->l_typ
2c40: 65 3d 3d 46 5f 52 44 4c 43 4b 20 29 7b 0a 20 20  e==F_RDLCK ){.  
2c50: 20 20 7a 54 79 70 65 20 3d 20 22 52 44 4c 43 4b    zType = "RDLCK
2c60: 22 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70  ";.  }else if( p
2c70: 2d 3e 6c 5f 74 79 70 65 3d 3d 46 5f 57 52 4c 43  ->l_type==F_WRLC
2c80: 4b 20 29 7b 0a 20 20 20 20 7a 54 79 70 65 20 3d  K ){.    zType =
2c90: 20 22 57 52 4c 43 4b 22 3b 0a 20 20 7d 65 6c 73   "WRLCK";.  }els
2ca0: 65 20 69 66 28 20 70 2d 3e 6c 5f 74 79 70 65 3d  e if( p->l_type=
2cb0: 3d 46 5f 55 4e 4c 43 4b 20 29 7b 0a 20 20 20 20  =F_UNLCK ){.    
2cc0: 7a 54 79 70 65 20 3d 20 22 55 4e 4c 43 4b 22 3b  zType = "UNLCK";
2cd0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73  .  }else{.    as
2ce0: 73 65 72 74 28 20 30 20 29 3b 0a 20 20 7d 0a 20  sert( 0 );.  }. 
2cf0: 20 61 73 73 65 72 74 28 20 70 2d 3e 6c 5f 77 68   assert( p->l_wh
2d00: 65 6e 63 65 3d 3d 53 45 45 4b 5f 53 45 54 20 29  ence==SEEK_SET )
2d10: 3b 0a 20 20 73 20 3d 20 66 63 6e 74 6c 28 66 64  ;.  s = fcntl(fd
2d20: 2c 20 6f 70 2c 20 70 29 3b 0a 20 20 73 61 76 65  , op, p);.  save
2d30: 64 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a  dErrno = errno;.
2d40: 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72    sqlite3DebugPr
2d50: 69 6e 74 66 28 22 66 63 6e 74 6c 20 25 64 20 25  intf("fcntl %d %
2d60: 64 20 25 73 20 25 73 20 25 64 20 25 64 20 25 64  d %s %s %d %d %d
2d70: 20 25 64 5c 6e 22 2c 0a 20 20 20 20 20 74 68 72   %d\n",.     thr
2d80: 65 61 64 69 64 2c 20 66 64 2c 20 7a 4f 70 4e 61  eadid, fd, zOpNa
2d90: 6d 65 2c 20 7a 54 79 70 65 2c 20 28 69 6e 74 29  me, zType, (int)
2da0: 70 2d 3e 6c 5f 73 74 61 72 74 2c 20 28 69 6e 74  p->l_start, (int
2db0: 29 70 2d 3e 6c 5f 6c 65 6e 2c 0a 20 20 20 20 20  )p->l_len,.     
2dc0: 28 69 6e 74 29 70 2d 3e 6c 5f 70 69 64 2c 20 73  (int)p->l_pid, s
2dd0: 29 3b 0a 20 20 69 66 28 20 73 3d 3d 28 2d 31 29  );.  if( s==(-1)
2de0: 20 26 26 20 6f 70 3d 3d 46 5f 53 45 54 4c 4b 20   && op==F_SETLK 
2df0: 26 26 20 28 70 2d 3e 6c 5f 74 79 70 65 3d 3d 46  && (p->l_type==F
2e00: 5f 52 44 4c 43 4b 20 7c 7c 20 70 2d 3e 6c 5f 74  _RDLCK || p->l_t
2e10: 79 70 65 3d 3d 46 5f 57 52 4c 43 4b 29 20 29 7b  ype==F_WRLCK) ){
2e20: 0a 20 20 20 20 73 74 72 75 63 74 20 66 6c 6f 63  .    struct floc
2e30: 6b 20 6c 32 3b 0a 20 20 20 20 6c 32 20 3d 20 2a  k l2;.    l2 = *
2e40: 70 3b 0a 20 20 20 20 66 63 6e 74 6c 28 66 64 2c  p;.    fcntl(fd,
2e50: 20 46 5f 47 45 54 4c 4b 2c 20 26 6c 32 29 3b 0a   F_GETLK, &l2);.
2e60: 20 20 20 20 69 66 28 20 6c 32 2e 6c 5f 74 79 70      if( l2.l_typ
2e70: 65 3d 3d 46 5f 52 44 4c 43 4b 20 29 7b 0a 20 20  e==F_RDLCK ){.  
2e80: 20 20 20 20 7a 54 79 70 65 20 3d 20 22 52 44 4c      zType = "RDL
2e90: 43 4b 22 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  CK";.    }else i
2ea0: 66 28 20 6c 32 2e 6c 5f 74 79 70 65 3d 3d 46 5f  f( l2.l_type==F_
2eb0: 57 52 4c 43 4b 20 29 7b 0a 20 20 20 20 20 20 7a  WRLCK ){.      z
2ec0: 54 79 70 65 20 3d 20 22 57 52 4c 43 4b 22 3b 0a  Type = "WRLCK";.
2ed0: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6c 32      }else if( l2
2ee0: 2e 6c 5f 74 79 70 65 3d 3d 46 5f 55 4e 4c 43 4b  .l_type==F_UNLCK
2ef0: 20 29 7b 0a 20 20 20 20 20 20 7a 54 79 70 65 20   ){.      zType 
2f00: 3d 20 22 55 4e 4c 43 4b 22 3b 0a 20 20 20 20 7d  = "UNLCK";.    }
2f10: 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65  else{.      asse
2f20: 72 74 28 20 30 20 29 3b 0a 20 20 20 20 7d 0a 20  rt( 0 );.    }. 
2f30: 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50     sqlite3DebugP
2f40: 72 69 6e 74 66 28 22 66 63 6e 74 6c 2d 66 61 69  rintf("fcntl-fai
2f50: 6c 75 72 65 2d 72 65 61 73 6f 6e 3a 20 25 73 20  lure-reason: %s 
2f60: 25 64 20 25 64 20 25 64 5c 6e 22 2c 0a 20 20 20  %d %d %d\n",.   
2f70: 20 20 20 20 7a 54 79 70 65 2c 20 28 69 6e 74 29      zType, (int)
2f80: 6c 32 2e 6c 5f 73 74 61 72 74 2c 20 28 69 6e 74  l2.l_start, (int
2f90: 29 6c 32 2e 6c 5f 6c 65 6e 2c 20 28 69 6e 74 29  )l2.l_len, (int)
2fa0: 6c 32 2e 6c 5f 70 69 64 29 3b 0a 20 20 7d 0a 20  l2.l_pid);.  }. 
2fb0: 20 65 72 72 6e 6f 20 3d 20 73 61 76 65 64 45 72   errno = savedEr
2fc0: 72 6e 6f 3b 0a 20 20 72 65 74 75 72 6e 20 73 3b  rno;.  return s;
2fd0: 0a 7d 0a 23 64 65 66 69 6e 65 20 66 63 6e 74 6c  .}.#define fcntl
2fe0: 20 6c 6f 63 6b 54 72 61 63 65 0a 23 65 6e 64 69   lockTrace.#endi
2ff0: 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4c 4f 43 4b  f /* SQLITE_LOCK
3000: 5f 54 52 41 43 45 20 2a 2f 0a 0a 0a 0a 2f 2a 0a  _TRACE */..../*.
3010: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
3020: 74 72 61 6e 73 6c 61 74 65 73 20 61 20 73 74 61  translates a sta
3030: 6e 64 61 72 64 20 50 4f 53 49 58 20 65 72 72 6e  ndard POSIX errn
3040: 6f 20 63 6f 64 65 20 69 6e 74 6f 20 73 6f 6d 65  o code into some
3050: 74 68 69 6e 67 0a 2a 2a 20 75 73 65 66 75 6c 20  thing.** useful 
3060: 74 6f 20 74 68 65 20 63 6c 69 65 6e 74 73 20 6f  to the clients o
3070: 66 20 74 68 65 20 73 71 6c 69 74 65 33 20 66 75  f the sqlite3 fu
3080: 6e 63 74 69 6f 6e 73 2e 20 20 53 70 65 63 69 66  nctions.  Specif
3090: 69 63 61 6c 6c 79 2c 20 69 74 20 69 73 0a 2a 2a  ically, it is.**
30a0: 20 69 6e 74 65 6e 64 65 64 20 74 6f 20 74 72 61   intended to tra
30b0: 6e 73 6c 61 74 65 20 61 20 76 61 72 69 65 74 79  nslate a variety
30c0: 20 6f 66 20 22 74 72 79 20 61 67 61 69 6e 22 20   of "try again" 
30d0: 65 72 72 6f 72 73 20 69 6e 74 6f 20 53 51 4c 49  errors into SQLI
30e0: 54 45 5f 42 55 53 59 0a 2a 2a 20 61 6e 64 20 61  TE_BUSY.** and a
30f0: 20 76 61 72 69 65 74 79 20 6f 66 20 22 70 6c 65   variety of "ple
3100: 61 73 65 20 63 6c 6f 73 65 20 74 68 65 20 66 69  ase close the fi
3110: 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 4e 4f  le descriptor NO
3120: 57 22 20 65 72 72 6f 72 73 20 69 6e 74 6f 20 0a  W" errors into .
3130: 2a 2a 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 0a  ** SQLITE_IOERR.
3140: 2a 2a 20 0a 2a 2a 20 45 72 72 6f 72 73 20 64 75  ** .** Errors du
3150: 72 69 6e 67 20 69 6e 69 74 69 61 6c 69 7a 61 74  ring initializat
3160: 69 6f 6e 20 6f 66 20 6c 6f 63 6b 73 2c 20 6f 72  ion of locks, or
3170: 20 66 69 6c 65 20 73 79 73 74 65 6d 20 73 75 70   file system sup
3180: 70 6f 72 74 20 66 6f 72 20 6c 6f 63 6b 73 2c 0a  port for locks,.
3190: 2a 2a 20 73 68 6f 75 6c 64 20 68 61 6e 64 6c 65  ** should handle
31a0: 20 45 4e 4f 4c 43 4b 2c 20 45 4e 4f 54 53 55 50   ENOLCK, ENOTSUP
31b0: 2c 20 45 4f 50 4e 4f 54 53 55 50 50 20 73 65 70  , EOPNOTSUPP sep
31c0: 61 72 61 74 65 6c 79 2e 0a 2a 2f 0a 73 74 61 74  arately..*/.stat
31d0: 69 63 20 69 6e 74 20 73 71 6c 69 74 65 45 72 72  ic int sqliteErr
31e0: 6f 72 46 72 6f 6d 50 6f 73 69 78 45 72 72 6f 72  orFromPosixError
31f0: 28 69 6e 74 20 70 6f 73 69 78 45 72 72 6f 72 2c  (int posixError,
3200: 20 69 6e 74 20 73 71 6c 69 74 65 49 4f 45 72 72   int sqliteIOErr
3210: 29 20 7b 0a 20 20 73 77 69 74 63 68 20 28 70 6f  ) {.  switch (po
3220: 73 69 78 45 72 72 6f 72 29 20 7b 0a 20 20 63 61  sixError) {.  ca
3230: 73 65 20 30 3a 20 0a 20 20 20 20 72 65 74 75 72  se 0: .    retur
3240: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  n SQLITE_OK;.   
3250: 20 0a 20 20 63 61 73 65 20 45 41 47 41 49 4e 3a   .  case EAGAIN:
3260: 0a 20 20 63 61 73 65 20 45 54 49 4d 45 44 4f 55  .  case ETIMEDOU
3270: 54 3a 0a 20 20 63 61 73 65 20 45 42 55 53 59 3a  T:.  case EBUSY:
3280: 0a 20 20 63 61 73 65 20 45 49 4e 54 52 3a 0a 20  .  case EINTR:. 
3290: 20 63 61 73 65 20 45 4e 4f 4c 43 4b 3a 20 20 0a   case ENOLCK:  .
32a0: 20 20 20 20 2f 2a 20 72 61 6e 64 6f 6d 20 4e 46      /* random NF
32b0: 53 20 72 65 74 72 79 20 65 72 72 6f 72 2c 20 75  S retry error, u
32c0: 6e 6c 65 73 73 20 64 75 72 69 6e 67 20 66 69 6c  nless during fil
32d0: 65 20 73 79 73 74 65 6d 20 73 75 70 70 6f 72 74  e system support
32e0: 20 0a 20 20 20 20 20 2a 20 69 6e 74 72 6f 73 70   .     * introsp
32f0: 65 63 74 69 6f 6e 2c 20 69 6e 20 77 68 69 63 68  ection, in which
3300: 20 69 74 20 61 63 74 75 61 6c 6c 79 20 6d 65 61   it actually mea
3310: 6e 73 20 77 68 61 74 20 69 74 20 73 61 79 73 20  ns what it says 
3320: 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  */.    return SQ
3330: 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 0a  LITE_BUSY;.    .
3340: 20 20 63 61 73 65 20 45 41 43 43 45 53 3a 20 0a    case EACCES: .
3350: 20 20 20 20 2f 2a 20 45 41 43 43 45 53 20 69 73      /* EACCES is
3360: 20 6c 69 6b 65 20 45 41 47 41 49 4e 20 64 75 72   like EAGAIN dur
3370: 69 6e 67 20 6c 6f 63 6b 69 6e 67 20 6f 70 65 72  ing locking oper
3380: 61 74 69 6f 6e 73 2c 20 62 75 74 20 6e 6f 74 20  ations, but not 
3390: 61 6e 79 20 6f 74 68 65 72 20 74 69 6d 65 2a 2f  any other time*/
33a0: 0a 20 20 20 20 69 66 28 20 28 73 71 6c 69 74 65  .    if( (sqlite
33b0: 49 4f 45 72 72 20 3d 3d 20 53 51 4c 49 54 45 5f  IOErr == SQLITE_
33c0: 49 4f 45 52 52 5f 4c 4f 43 4b 29 20 7c 7c 20 0a  IOERR_LOCK) || .
33d0: 09 28 73 71 6c 69 74 65 49 4f 45 72 72 20 3d 3d  .(sqliteIOErr ==
33e0: 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55 4e   SQLITE_IOERR_UN
33f0: 4c 4f 43 4b 29 20 7c 7c 20 0a 09 28 73 71 6c 69  LOCK) || ..(sqli
3400: 74 65 49 4f 45 72 72 20 3d 3d 20 53 51 4c 49 54  teIOErr == SQLIT
3410: 45 5f 49 4f 45 52 52 5f 52 44 4c 4f 43 4b 29 20  E_IOERR_RDLOCK) 
3420: 7c 7c 0a 09 28 73 71 6c 69 74 65 49 4f 45 72 72  ||..(sqliteIOErr
3430: 20 3d 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52   == SQLITE_IOERR
3440: 5f 43 48 45 43 4b 52 45 53 45 52 56 45 44 4c 4f  _CHECKRESERVEDLO
3450: 43 4b 29 20 29 7b 0a 20 20 20 20 20 20 72 65 74  CK) ){.      ret
3460: 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 3b  urn SQLITE_BUSY;
3470: 0a 20 20 20 20 7d 0a 20 20 20 20 2f 2a 20 65 6c  .    }.    /* el
3480: 73 65 20 66 61 6c 6c 20 74 68 72 6f 75 67 68 20  se fall through 
3490: 2a 2f 0a 20 20 63 61 73 65 20 45 50 45 52 4d 3a  */.  case EPERM:
34a0: 20 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c   .    return SQL
34b0: 49 54 45 5f 50 45 52 4d 3b 0a 20 20 20 20 0a 20  ITE_PERM;.    . 
34c0: 20 63 61 73 65 20 45 44 45 41 44 4c 4b 3a 0a 20   case EDEADLK:. 
34d0: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
34e0: 5f 49 4f 45 52 52 5f 42 4c 4f 43 4b 45 44 3b 0a  _IOERR_BLOCKED;.
34f0: 20 20 20 20 0a 23 69 66 20 45 4f 50 4e 4f 54 53      .#if EOPNOTS
3500: 55 50 50 21 3d 45 4e 4f 54 53 55 50 0a 20 20 63  UPP!=ENOTSUP.  c
3510: 61 73 65 20 45 4f 50 4e 4f 54 53 55 50 50 3a 20  ase EOPNOTSUPP: 
3520: 0a 20 20 20 20 2f 2a 20 73 6f 6d 65 74 68 69 6e  .    /* somethin
3530: 67 20 77 65 6e 74 20 74 65 72 72 69 62 6c 79 20  g went terribly 
3540: 61 77 72 79 2c 20 75 6e 6c 65 73 73 20 64 75 72  awry, unless dur
3550: 69 6e 67 20 66 69 6c 65 20 73 79 73 74 65 6d 20  ing file system 
3560: 73 75 70 70 6f 72 74 20 0a 20 20 20 20 20 2a 20  support .     * 
3570: 69 6e 74 72 6f 73 70 65 63 74 69 6f 6e 2c 20 69  introspection, i
3580: 6e 20 77 68 69 63 68 20 69 74 20 61 63 74 75 61  n which it actua
3590: 6c 6c 79 20 6d 65 61 6e 73 20 77 68 61 74 20 69  lly means what i
35a0: 74 20 73 61 79 73 20 2a 2f 0a 23 65 6e 64 69 66  t says */.#endif
35b0: 0a 23 69 66 64 65 66 20 45 4e 4f 54 53 55 50 0a  .#ifdef ENOTSUP.
35c0: 20 20 63 61 73 65 20 45 4e 4f 54 53 55 50 3a 20    case ENOTSUP: 
35d0: 0a 20 20 20 20 2f 2a 20 69 6e 76 61 6c 69 64 20  .    /* invalid 
35e0: 66 64 2c 20 75 6e 6c 65 73 73 20 64 75 72 69 6e  fd, unless durin
35f0: 67 20 66 69 6c 65 20 73 79 73 74 65 6d 20 73 75  g file system su
3600: 70 70 6f 72 74 20 69 6e 74 72 6f 73 70 65 63 74  pport introspect
3610: 69 6f 6e 2c 20 69 6e 20 77 68 69 63 68 20 0a 20  ion, in which . 
3620: 20 20 20 20 2a 20 69 74 20 61 63 74 75 61 6c 6c      * it actuall
3630: 79 20 6d 65 61 6e 73 20 77 68 61 74 20 69 74 20  y means what it 
3640: 73 61 79 73 20 2a 2f 0a 23 65 6e 64 69 66 0a 20  says */.#endif. 
3650: 20 63 61 73 65 20 45 49 4f 3a 0a 20 20 63 61 73   case EIO:.  cas
3660: 65 20 45 42 41 44 46 3a 0a 20 20 63 61 73 65 20  e EBADF:.  case 
3670: 45 49 4e 56 41 4c 3a 0a 20 20 63 61 73 65 20 45  EINVAL:.  case E
3680: 4e 4f 54 43 4f 4e 4e 3a 0a 20 20 63 61 73 65 20  NOTCONN:.  case 
3690: 45 4e 4f 44 45 56 3a 0a 20 20 63 61 73 65 20 45  ENODEV:.  case E
36a0: 4e 58 49 4f 3a 0a 20 20 63 61 73 65 20 45 4e 4f  NXIO:.  case ENO
36b0: 45 4e 54 3a 0a 20 20 63 61 73 65 20 45 53 54 41  ENT:.  case ESTA
36c0: 4c 45 3a 0a 20 20 63 61 73 65 20 45 4e 4f 53 59  LE:.  case ENOSY
36d0: 53 3a 0a 20 20 20 20 2f 2a 20 74 68 65 73 65 20  S:.    /* these 
36e0: 73 68 6f 75 6c 64 20 66 6f 72 63 65 20 74 68 65  should force the
36f0: 20 63 6c 69 65 6e 74 20 74 6f 20 63 6c 6f 73 65   client to close
3700: 20 74 68 65 20 66 69 6c 65 20 61 6e 64 20 72 65   the file and re
3710: 63 6f 6e 6e 65 63 74 20 2a 2f 0a 20 20 20 20 0a  connect */.    .
3720: 20 20 64 65 66 61 75 6c 74 3a 20 0a 20 20 20 20    default: .    
3730: 72 65 74 75 72 6e 20 73 71 6c 69 74 65 49 4f 45  return sqliteIOE
3740: 72 72 3b 0a 20 20 7d 0a 7d 0a 0a 0a 0a 2f 2a 2a  rr;.  }.}..../**
3750: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
3760: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
3770: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
3780: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
3790: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a  ************.***
37a0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20  *************** 
37b0: 42 65 67 69 6e 20 55 6e 69 71 75 65 20 46 69 6c  Begin Unique Fil
37c0: 65 20 49 44 20 55 74 69 6c 69 74 79 20 55 73 65  e ID Utility Use
37d0: 64 20 42 79 20 56 78 57 6f 72 6b 73 20 2a 2a 2a  d By VxWorks ***
37e0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a  ************.**.
37f0: 2a 2a 20 4f 6e 20 6d 6f 73 74 20 76 65 72 73 69  ** On most versi
3800: 6f 6e 73 20 6f 66 20 75 6e 69 78 2c 20 77 65 20  ons of unix, we 
3810: 63 61 6e 20 67 65 74 20 61 20 75 6e 69 71 75 65  can get a unique
3820: 20 49 44 20 66 6f 72 20 61 20 66 69 6c 65 20 62   ID for a file b
3830: 79 20 63 6f 6e 63 61 74 65 6e 61 74 69 6e 67 0a  y concatenating.
3840: 2a 2a 20 74 68 65 20 64 65 76 69 63 65 20 6e 75  ** the device nu
3850: 6d 62 65 72 20 61 6e 64 20 74 68 65 20 69 6e 6f  mber and the ino
3860: 64 65 20 6e 75 6d 62 65 72 2e 20 20 42 75 74 20  de number.  But 
3870: 74 68 69 73 20 64 6f 65 73 20 6e 6f 74 20 77 6f  this does not wo
3880: 72 6b 20 6f 6e 20 56 78 57 6f 72 6b 73 2e 0a 2a  rk on VxWorks..*
3890: 2a 20 4f 6e 20 56 78 57 6f 72 6b 73 2c 20 61 20  * On VxWorks, a 
38a0: 75 6e 69 71 75 65 20 66 69 6c 65 20 69 64 20 6d  unique file id m
38b0: 75 73 74 20 62 65 20 62 61 73 65 64 20 6f 6e 20  ust be based on 
38c0: 74 68 65 20 63 61 6e 6f 6e 69 63 61 6c 20 66 69  the canonical fi
38d0: 6c 65 6e 61 6d 65 2e 0a 2a 2a 0a 2a 2a 20 41 20  lename..**.** A 
38e0: 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20 69 6e  pointer to an in
38f0: 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20 66 6f  stance of the fo
3900: 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63 74 75 72  llowing structur
3910: 65 20 63 61 6e 20 62 65 20 75 73 65 64 20 61 73  e can be used as
3920: 20 61 0a 2a 2a 20 75 6e 69 71 75 65 20 66 69 6c   a.** unique fil
3930: 65 20 49 44 20 69 6e 20 56 78 57 6f 72 6b 73 2e  e ID in VxWorks.
3940: 20 20 45 61 63 68 20 69 6e 73 74 61 6e 63 65 20    Each instance 
3950: 6f 66 20 74 68 69 73 20 73 74 72 75 63 74 75 72  of this structur
3960: 65 20 63 6f 6e 74 61 69 6e 73 0a 2a 2a 20 61 20  e contains.** a 
3970: 63 6f 70 79 20 6f 66 20 74 68 65 20 63 61 6e 6f  copy of the cano
3980: 6e 69 63 61 6c 20 66 69 6c 65 6e 61 6d 65 2e 20  nical filename. 
3990: 20 54 68 65 72 65 20 69 73 20 61 6c 73 6f 20 61   There is also a
39a0: 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74   reference count
39b0: 2e 20 20 0a 2a 2a 20 54 68 65 20 73 74 72 75 63  .  .** The struc
39c0: 74 75 72 65 20 69 73 20 72 65 63 6c 61 69 6d 65  ture is reclaime
39d0: 64 20 77 68 65 6e 20 74 68 65 20 6e 75 6d 62 65  d when the numbe
39e0: 72 20 6f 66 20 70 6f 69 6e 74 65 72 73 20 74 6f  r of pointers to
39f0: 20 69 74 20 64 72 6f 70 73 20 74 6f 0a 2a 2a 20   it drops to.** 
3a00: 7a 65 72 6f 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 72  zero..**.** Ther
3a10: 65 20 61 72 65 20 6e 65 76 65 72 20 76 65 72 79  e are never very
3a20: 20 6d 61 6e 79 20 66 69 6c 65 73 20 6f 70 65 6e   many files open
3a30: 20 61 74 20 6f 6e 65 20 74 69 6d 65 20 61 6e 64   at one time and
3a40: 20 6c 6f 6f 6b 75 70 73 20 61 72 65 20 6e 6f 74   lookups are not
3a50: 0a 2a 2a 20 61 20 70 65 72 66 6f 72 6d 61 6e 63  .** a performanc
3a60: 65 2d 63 72 69 74 69 63 61 6c 20 70 61 74 68 2c  e-critical path,
3a70: 20 73 6f 20 69 74 20 69 73 20 73 75 66 66 69 63   so it is suffic
3a80: 69 65 6e 74 20 74 6f 20 70 75 74 20 74 68 65 73  ient to put thes
3a90: 65 0a 2a 2a 20 73 74 72 75 63 74 75 72 65 73 20  e.** structures 
3aa0: 6f 6e 20 61 20 6c 69 6e 6b 65 64 20 6c 69 73 74  on a linked list
3ab0: 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 76 78 77 6f  ..*/.struct vxwo
3ac0: 72 6b 73 46 69 6c 65 49 64 20 7b 0a 20 20 73 74  rksFileId {.  st
3ad0: 72 75 63 74 20 76 78 77 6f 72 6b 73 46 69 6c 65  ruct vxworksFile
3ae0: 49 64 20 2a 70 4e 65 78 74 3b 20 20 2f 2a 20 4e  Id *pNext;  /* N
3af0: 65 78 74 20 69 6e 20 61 20 6c 69 73 74 20 6f 66  ext in a list of
3b00: 20 74 68 65 6d 20 61 6c 6c 20 2a 2f 0a 20 20 69   them all */.  i
3b10: 6e 74 20 6e 52 65 66 3b 20 20 20 20 20 20 20 20  nt nRef;        
3b20: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
3b30: 4e 75 6d 62 65 72 20 6f 66 20 72 65 66 65 72 65  Number of refere
3b40: 6e 63 65 73 20 74 6f 20 74 68 69 73 20 6f 6e 65  nces to this one
3b50: 20 2a 2f 0a 20 20 69 6e 74 20 6e 4e 61 6d 65 3b   */.  int nName;
3b60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3b70: 20 20 20 20 2f 2a 20 4c 65 6e 67 74 68 20 6f 66      /* Length of
3b80: 20 74 68 65 20 7a 43 61 6e 6f 6e 69 63 61 6c 4e   the zCanonicalN
3b90: 61 6d 65 5b 5d 20 73 74 72 69 6e 67 20 2a 2f 0a  ame[] string */.
3ba0: 20 20 63 68 61 72 20 2a 7a 43 61 6e 6f 6e 69 63    char *zCanonic
3bb0: 61 6c 4e 61 6d 65 3b 20 20 20 20 20 20 20 20 20  alName;         
3bc0: 2f 2a 20 43 61 6e 6f 6e 69 63 61 6c 20 66 69 6c  /* Canonical fil
3bd0: 65 6e 61 6d 65 20 2a 2f 0a 7d 3b 0a 0a 23 69 66  ename */.};..#if
3be0: 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 2f 2a 20 0a   OS_VXWORKS./* .
3bf0: 2a 2a 20 41 6c 6c 20 75 6e 69 71 75 65 20 66 69  ** All unique fi
3c00: 6c 65 6e 61 6d 65 73 20 61 72 65 20 68 65 6c 64  lenames are held
3c10: 20 6f 6e 20 61 20 6c 69 6e 6b 65 64 20 6c 69 73   on a linked lis
3c20: 74 20 68 65 61 64 65 64 20 62 79 20 74 68 69 73  t headed by this
3c30: 0a 2a 2a 20 76 61 72 69 61 62 6c 65 3a 0a 2a 2f  .** variable:.*/
3c40: 0a 73 74 61 74 69 63 20 73 74 72 75 63 74 20 76  .static struct v
3c50: 78 77 6f 72 6b 73 46 69 6c 65 49 64 20 2a 76 78  xworksFileId *vx
3c60: 77 6f 72 6b 73 46 69 6c 65 4c 69 73 74 20 3d 20  worksFileList = 
3c70: 30 3b 0a 0a 2f 2a 0a 2a 2a 20 53 69 6d 70 6c 69  0;../*.** Simpli
3c80: 66 79 20 61 20 66 69 6c 65 6e 61 6d 65 20 69 6e  fy a filename in
3c90: 74 6f 20 69 74 73 20 63 61 6e 6f 6e 69 63 61 6c  to its canonical
3ca0: 20 66 6f 72 6d 0a 2a 2a 20 62 79 20 6d 61 6b 69   form.** by maki
3cb0: 6e 67 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ng the following
3cc0: 20 63 68 61 6e 67 65 73 3a 0a 2a 2a 0a 2a 2a 20   changes:.**.** 
3cd0: 20 2a 20 72 65 6d 6f 76 69 6e 67 20 61 6e 79 20   * removing any 
3ce0: 74 72 61 69 6c 69 6e 67 20 61 6e 64 20 64 75 70  trailing and dup
3cf0: 6c 69 63 61 74 65 20 2f 0a 2a 2a 20 20 2a 20 63  licate /.**  * c
3d00: 6f 6e 76 65 72 74 20 2f 2e 2f 20 69 6e 74 6f 20  onvert /./ into 
3d10: 6a 75 73 74 20 2f 0a 2a 2a 20 20 2a 20 63 6f 6e  just /.**  * con
3d20: 76 65 72 74 20 2f 41 2f 2e 2e 2f 20 77 68 65 72  vert /A/../ wher
3d30: 65 20 41 20 69 73 20 61 6e 79 20 73 69 6d 70 6c  e A is any simpl
3d40: 65 20 6e 61 6d 65 20 69 6e 74 6f 20 6a 75 73 74  e name into just
3d50: 20 2f 0a 2a 2a 0a 2a 2a 20 43 68 61 6e 67 65 73   /.**.** Changes
3d60: 20 61 72 65 20 6d 61 64 65 20 69 6e 2d 70 6c 61   are made in-pla
3d70: 63 65 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20  ce.  Return the 
3d80: 6e 65 77 20 6e 61 6d 65 20 6c 65 6e 67 74 68 2e  new name length.
3d90: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6f 72 69 67 69  .**.** The origi
3da0: 6e 61 6c 20 66 69 6c 65 6e 61 6d 65 20 69 73 20  nal filename is 
3db0: 69 6e 20 7a 5b 30 2e 2e 6e 2d 31 5d 2e 20 20 52  in z[0..n-1].  R
3dc0: 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72  eturn the number
3dd0: 20 6f 66 0a 2a 2a 20 63 68 61 72 61 63 74 65 72   of.** character
3de0: 73 20 69 6e 20 74 68 65 20 73 69 6d 70 6c 69 66  s in the simplif
3df0: 69 65 64 20 6e 61 6d 65 2e 0a 2a 2f 0a 73 74 61  ied name..*/.sta
3e00: 74 69 63 20 69 6e 74 20 76 78 77 6f 72 6b 73 53  tic int vxworksS
3e10: 69 6d 70 6c 69 66 79 4e 61 6d 65 28 63 68 61 72  implifyName(char
3e20: 20 2a 7a 2c 20 69 6e 74 20 6e 29 7b 0a 20 20 69   *z, int n){.  i
3e30: 6e 74 20 69 2c 20 6a 3b 0a 20 20 77 68 69 6c 65  nt i, j;.  while
3e40: 28 20 6e 3e 31 20 26 26 20 7a 5b 6e 2d 31 5d 3d  ( n>1 && z[n-1]=
3e50: 3d 27 2f 27 20 29 7b 20 6e 2d 2d 3b 20 7d 0a 20  ='/' ){ n--; }. 
3e60: 20 66 6f 72 28 69 3d 6a 3d 30 3b 20 69 3c 6e 3b   for(i=j=0; i<n;
3e70: 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 7a   i++){.    if( z
3e80: 5b 69 5d 3d 3d 27 2f 27 20 29 7b 0a 20 20 20 20  [i]=='/' ){.    
3e90: 20 20 69 66 28 20 7a 5b 69 2b 31 5d 3d 3d 27 2f    if( z[i+1]=='/
3ea0: 27 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  ' ) continue;.  
3eb0: 20 20 20 20 69 66 28 20 7a 5b 69 2b 31 5d 3d 3d      if( z[i+1]==
3ec0: 27 2e 27 20 26 26 20 69 2b 32 3c 6e 20 26 26 20  '.' && i+2<n && 
3ed0: 7a 5b 69 2b 32 5d 3d 3d 27 2f 27 20 29 7b 0a 20  z[i+2]=='/' ){. 
3ee0: 20 20 20 20 20 20 20 69 20 2b 3d 20 31 3b 0a 20         i += 1;. 
3ef0: 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b         continue;
3f00: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
3f10: 66 28 20 7a 5b 69 2b 31 5d 3d 3d 27 2e 27 20 26  f( z[i+1]=='.' &
3f20: 26 20 69 2b 33 3c 6e 20 26 26 20 7a 5b 69 2b 32  & i+3<n && z[i+2
3f30: 5d 3d 3d 27 2e 27 20 26 26 20 7a 5b 69 2b 33 5d  ]=='.' && z[i+3]
3f40: 3d 3d 27 2f 27 20 29 7b 0a 20 20 20 20 20 20 20  =='/' ){.       
3f50: 20 77 68 69 6c 65 28 20 6a 3e 30 20 26 26 20 7a   while( j>0 && z
3f60: 5b 6a 2d 31 5d 21 3d 27 2f 27 20 29 7b 20 6a 2d  [j-1]!='/' ){ j-
3f70: 2d 3b 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28  -; }.        if(
3f80: 20 6a 3e 30 20 29 7b 20 6a 2d 2d 3b 20 7d 0a 20   j>0 ){ j--; }. 
3f90: 20 20 20 20 20 20 20 69 20 2b 3d 20 32 3b 0a 20         i += 2;. 
3fa0: 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b         continue;
3fb0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
3fc0: 20 20 20 7a 5b 6a 2b 2b 5d 20 3d 20 7a 5b 69 5d     z[j++] = z[i]
3fd0: 3b 0a 20 20 7d 0a 20 20 7a 5b 6a 5d 20 3d 20 30  ;.  }.  z[j] = 0
3fe0: 3b 0a 20 20 72 65 74 75 72 6e 20 6a 3b 0a 7d 0a  ;.  return j;.}.
3ff0: 0a 2f 2a 0a 2a 2a 20 46 69 6e 64 20 61 20 75 6e  ./*.** Find a un
4000: 69 71 75 65 20 66 69 6c 65 20 49 44 20 66 6f 72  ique file ID for
4010: 20 74 68 65 20 67 69 76 65 6e 20 61 62 73 6f 6c   the given absol
4020: 75 74 65 20 70 61 74 68 6e 61 6d 65 2e 20 20 52  ute pathname.  R
4030: 65 74 75 72 6e 0a 2a 2a 20 61 20 70 6f 69 6e 74  eturn.** a point
4040: 65 72 20 74 6f 20 74 68 65 20 76 78 77 6f 72 6b  er to the vxwork
4050: 73 46 69 6c 65 49 64 20 6f 62 6a 65 63 74 2e 20  sFileId object. 
4060: 20 54 68 69 73 20 70 6f 69 6e 74 65 72 20 69 73   This pointer is
4070: 20 74 68 65 20 75 6e 69 71 75 65 0a 2a 2a 20 66   the unique.** f
4080: 69 6c 65 20 49 44 2e 0a 2a 2a 0a 2a 2a 20 54 68  ile ID..**.** Th
4090: 65 20 6e 52 65 66 20 66 69 65 6c 64 20 6f 66 20  e nRef field of 
40a0: 74 68 65 20 76 78 77 6f 72 6b 73 46 69 6c 65 49  the vxworksFileI
40b0: 64 20 6f 62 6a 65 63 74 20 69 73 20 69 6e 63 72  d object is incr
40c0: 65 6d 65 6e 74 65 64 20 62 65 66 6f 72 65 0a 2a  emented before.*
40d0: 2a 20 74 68 65 20 6f 62 6a 65 63 74 20 69 73 20  * the object is 
40e0: 72 65 74 75 72 6e 65 64 2e 20 20 41 20 6e 65 77  returned.  A new
40f0: 20 76 78 77 6f 72 6b 73 46 69 6c 65 49 64 20 6f   vxworksFileId o
4100: 62 6a 65 63 74 20 69 73 20 63 72 65 61 74 65 64  bject is created
4110: 0a 2a 2a 20 61 6e 64 20 61 64 64 65 64 20 74 6f  .** and added to
4120: 20 74 68 65 20 67 6c 6f 62 61 6c 20 6c 69 73 74   the global list
4130: 20 69 66 20 6e 65 63 65 73 73 61 72 79 2e 0a 2a   if necessary..*
4140: 2a 0a 2a 2a 20 49 66 20 61 20 6d 65 6d 6f 72 79  *.** If a memory
4150: 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 65 72 72 6f   allocation erro
4160: 72 20 6f 63 63 75 72 73 2c 20 72 65 74 75 72 6e  r occurs, return
4170: 20 4e 55 4c 4c 2e 0a 2a 2f 0a 73 74 61 74 69 63   NULL..*/.static
4180: 20 73 74 72 75 63 74 20 76 78 77 6f 72 6b 73 46   struct vxworksF
4190: 69 6c 65 49 64 20 2a 76 78 77 6f 72 6b 73 46 69  ileId *vxworksFi
41a0: 6e 64 46 69 6c 65 49 64 28 63 6f 6e 73 74 20 63  ndFileId(const c
41b0: 68 61 72 20 2a 7a 41 62 73 6f 6c 75 74 65 4e 61  har *zAbsoluteNa
41c0: 6d 65 29 7b 0a 20 20 73 74 72 75 63 74 20 76 78  me){.  struct vx
41d0: 77 6f 72 6b 73 46 69 6c 65 49 64 20 2a 70 4e 65  worksFileId *pNe
41e0: 77 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 73 65  w;         /* se
41f0: 61 72 63 68 20 6b 65 79 20 61 6e 64 20 6e 65 77  arch key and new
4200: 20 66 69 6c 65 20 49 44 20 2a 2f 0a 20 20 73 74   file ID */.  st
4210: 72 75 63 74 20 76 78 77 6f 72 6b 73 46 69 6c 65  ruct vxworksFile
4220: 49 64 20 2a 70 43 61 6e 64 69 64 61 74 65 3b 20  Id *pCandidate; 
4230: 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67    /* For looping
4240: 20 6f 76 65 72 20 65 78 69 73 74 69 6e 67 20 66   over existing f
4250: 69 6c 65 20 49 44 73 20 2a 2f 0a 20 20 69 6e 74  ile IDs */.  int
4260: 20 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   n;             
4270: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4280: 20 2f 2a 20 4c 65 6e 67 74 68 20 6f 66 20 7a 41   /* Length of zA
4290: 62 73 6f 6c 75 74 65 4e 61 6d 65 20 73 74 72 69  bsoluteName stri
42a0: 6e 67 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  ng */..  assert(
42b0: 20 7a 41 62 73 6f 6c 75 74 65 4e 61 6d 65 5b 30   zAbsoluteName[0
42c0: 5d 3d 3d 27 2f 27 20 29 3b 0a 20 20 6e 20 3d 20  ]=='/' );.  n = 
42d0: 28 69 6e 74 29 73 74 72 6c 65 6e 28 7a 41 62 73  (int)strlen(zAbs
42e0: 6f 6c 75 74 65 4e 61 6d 65 29 3b 0a 20 20 70 4e  oluteName);.  pN
42f0: 65 77 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c  ew = sqlite3_mal
4300: 6c 6f 63 28 20 73 69 7a 65 6f 66 28 2a 70 4e 65  loc( sizeof(*pNe
4310: 77 29 20 2b 20 28 6e 2b 31 29 20 29 3b 0a 20 20  w) + (n+1) );.  
4320: 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 20 72 65  if( pNew==0 ) re
4330: 74 75 72 6e 20 30 3b 0a 20 20 70 4e 65 77 2d 3e  turn 0;.  pNew->
4340: 7a 43 61 6e 6f 6e 69 63 61 6c 4e 61 6d 65 20 3d  zCanonicalName =
4350: 20 28 63 68 61 72 2a 29 26 70 4e 65 77 5b 31 5d   (char*)&pNew[1]
4360: 3b 0a 20 20 6d 65 6d 63 70 79 28 70 4e 65 77 2d  ;.  memcpy(pNew-
4370: 3e 7a 43 61 6e 6f 6e 69 63 61 6c 4e 61 6d 65 2c  >zCanonicalName,
4380: 20 7a 41 62 73 6f 6c 75 74 65 4e 61 6d 65 2c 20   zAbsoluteName, 
4390: 6e 2b 31 29 3b 0a 20 20 6e 20 3d 20 76 78 77 6f  n+1);.  n = vxwo
43a0: 72 6b 73 53 69 6d 70 6c 69 66 79 4e 61 6d 65 28  rksSimplifyName(
43b0: 70 4e 65 77 2d 3e 7a 43 61 6e 6f 6e 69 63 61 6c  pNew->zCanonical
43c0: 4e 61 6d 65 2c 20 6e 29 3b 0a 0a 20 20 2f 2a 20  Name, n);..  /* 
43d0: 53 65 61 72 63 68 20 66 6f 72 20 61 6e 20 65 78  Search for an ex
43e0: 69 73 74 69 6e 67 20 65 6e 74 72 79 20 74 68 61  isting entry tha
43f0: 74 20 6d 61 74 63 68 69 6e 67 20 74 68 65 20 63  t matching the c
4400: 61 6e 6f 6e 69 63 61 6c 20 6e 61 6d 65 2e 0a 20  anonical name.. 
4410: 20 2a 2a 20 49 66 20 66 6f 75 6e 64 2c 20 69 6e   ** If found, in
4420: 63 72 65 6d 65 6e 74 20 74 68 65 20 72 65 66 65  crement the refe
4430: 72 65 6e 63 65 20 63 6f 75 6e 74 20 61 6e 64 20  rence count and 
4440: 72 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72  return a pointer
4450: 20 74 6f 0a 20 20 2a 2a 20 74 68 65 20 65 78 69   to.  ** the exi
4460: 73 74 69 6e 67 20 66 69 6c 65 20 49 44 2e 0a 20  sting file ID.. 
4470: 20 2a 2f 0a 20 20 75 6e 69 78 45 6e 74 65 72 4d   */.  unixEnterM
4480: 75 74 65 78 28 29 3b 0a 20 20 66 6f 72 28 70 43  utex();.  for(pC
4490: 61 6e 64 69 64 61 74 65 3d 76 78 77 6f 72 6b 73  andidate=vxworks
44a0: 46 69 6c 65 4c 69 73 74 3b 20 70 43 61 6e 64 69  FileList; pCandi
44b0: 64 61 74 65 3b 20 70 43 61 6e 64 69 64 61 74 65  date; pCandidate
44c0: 3d 70 43 61 6e 64 69 64 61 74 65 2d 3e 70 4e 65  =pCandidate->pNe
44d0: 78 74 29 7b 0a 20 20 20 20 69 66 28 20 70 43 61  xt){.    if( pCa
44e0: 6e 64 69 64 61 74 65 2d 3e 6e 4e 61 6d 65 3d 3d  ndidate->nName==
44f0: 6e 20 0a 20 20 20 20 20 26 26 20 6d 65 6d 63 6d  n .     && memcm
4500: 70 28 70 43 61 6e 64 69 64 61 74 65 2d 3e 7a 43  p(pCandidate->zC
4510: 61 6e 6f 6e 69 63 61 6c 4e 61 6d 65 2c 20 70 4e  anonicalName, pN
4520: 65 77 2d 3e 7a 43 61 6e 6f 6e 69 63 61 6c 4e 61  ew->zCanonicalNa
4530: 6d 65 2c 20 6e 29 3d 3d 30 0a 20 20 20 20 29 7b  me, n)==0.    ){
4540: 0a 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  .       sqlite3_
4550: 66 72 65 65 28 70 4e 65 77 29 3b 0a 20 20 20 20  free(pNew);.    
4560: 20 20 20 70 43 61 6e 64 69 64 61 74 65 2d 3e 6e     pCandidate->n
4570: 52 65 66 2b 2b 3b 0a 20 20 20 20 20 20 20 75 6e  Ref++;.       un
4580: 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a  ixLeaveMutex();.
4590: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 70 43         return pC
45a0: 61 6e 64 69 64 61 74 65 3b 0a 20 20 20 20 7d 0a  andidate;.    }.
45b0: 20 20 7d 0a 0a 20 20 2f 2a 20 4e 6f 20 6d 61 74    }..  /* No mat
45c0: 63 68 20 77 61 73 20 66 6f 75 6e 64 2e 20 20 57  ch was found.  W
45d0: 65 20 77 69 6c 6c 20 6d 61 6b 65 20 61 20 6e 65  e will make a ne
45e0: 77 20 66 69 6c 65 20 49 44 20 2a 2f 0a 20 20 70  w file ID */.  p
45f0: 4e 65 77 2d 3e 6e 52 65 66 20 3d 20 31 3b 0a 20  New->nRef = 1;. 
4600: 20 70 4e 65 77 2d 3e 6e 4e 61 6d 65 20 3d 20 6e   pNew->nName = n
4610: 3b 0a 20 20 70 4e 65 77 2d 3e 70 4e 65 78 74 20  ;.  pNew->pNext 
4620: 3d 20 76 78 77 6f 72 6b 73 46 69 6c 65 4c 69 73  = vxworksFileLis
4630: 74 3b 0a 20 20 76 78 77 6f 72 6b 73 46 69 6c 65  t;.  vxworksFile
4640: 4c 69 73 74 20 3d 20 70 4e 65 77 3b 0a 20 20 75  List = pNew;.  u
4650: 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b  nixLeaveMutex();
4660: 0a 20 20 72 65 74 75 72 6e 20 70 4e 65 77 3b 0a  .  return pNew;.
4670: 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 63 72 65 6d 65  }../*.** Decreme
4680: 6e 74 20 74 68 65 20 72 65 66 65 72 65 6e 63 65  nt the reference
4690: 20 63 6f 75 6e 74 20 6f 6e 20 61 20 76 78 77 6f   count on a vxwo
46a0: 72 6b 73 46 69 6c 65 49 64 20 6f 62 6a 65 63 74  rksFileId object
46b0: 2e 20 20 46 72 65 65 0a 2a 2a 20 74 68 65 20 6f  .  Free.** the o
46c0: 62 6a 65 63 74 20 77 68 65 6e 20 74 68 65 20 72  bject when the r
46d0: 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 72  eference count r
46e0: 65 61 63 68 65 73 20 7a 65 72 6f 2e 0a 2a 2f 0a  eaches zero..*/.
46f0: 73 74 61 74 69 63 20 76 6f 69 64 20 76 78 77 6f  static void vxwo
4700: 72 6b 73 52 65 6c 65 61 73 65 46 69 6c 65 49 64  rksReleaseFileId
4710: 28 73 74 72 75 63 74 20 76 78 77 6f 72 6b 73 46  (struct vxworksF
4720: 69 6c 65 49 64 20 2a 70 49 64 29 7b 0a 20 20 75  ileId *pId){.  u
4730: 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29 3b  nixEnterMutex();
4740: 0a 20 20 61 73 73 65 72 74 28 20 70 49 64 2d 3e  .  assert( pId->
4750: 6e 52 65 66 3e 30 20 29 3b 0a 20 20 70 49 64 2d  nRef>0 );.  pId-
4760: 3e 6e 52 65 66 2d 2d 3b 0a 20 20 69 66 28 20 70  >nRef--;.  if( p
4770: 49 64 2d 3e 6e 52 65 66 3d 3d 30 20 29 7b 0a 20  Id->nRef==0 ){. 
4780: 20 20 20 73 74 72 75 63 74 20 76 78 77 6f 72 6b     struct vxwork
4790: 73 46 69 6c 65 49 64 20 2a 2a 70 70 3b 0a 20 20  sFileId **pp;.  
47a0: 20 20 66 6f 72 28 70 70 3d 26 76 78 77 6f 72 6b    for(pp=&vxwork
47b0: 73 46 69 6c 65 4c 69 73 74 3b 20 2a 70 70 20 26  sFileList; *pp &
47c0: 26 20 2a 70 70 21 3d 70 49 64 3b 20 70 70 20 3d  & *pp!=pId; pp =
47d0: 20 26 28 28 2a 70 70 29 2d 3e 70 4e 65 78 74 29   &((*pp)->pNext)
47e0: 29 7b 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20  ){}.    assert( 
47f0: 2a 70 70 3d 3d 70 49 64 20 29 3b 0a 20 20 20 20  *pp==pId );.    
4800: 2a 70 70 20 3d 20 70 49 64 2d 3e 70 4e 65 78 74  *pp = pId->pNext
4810: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  ;.    sqlite3_fr
4820: 65 65 28 70 49 64 29 3b 0a 20 20 7d 0a 20 20 75  ee(pId);.  }.  u
4830: 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b  nixLeaveMutex();
4840: 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 4f 53 5f  .}.#endif /* OS_
4850: 56 58 57 4f 52 4b 53 20 2a 2f 0a 2f 2a 2a 2a 2a  VXWORKS */./****
4860: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64 20  *********** End 
4870: 6f 66 20 55 6e 69 71 75 65 20 46 69 6c 65 20 49  of Unique File I
4880: 44 20 55 74 69 6c 69 74 79 20 55 73 65 64 20 42  D Utility Used B
4890: 79 20 56 78 57 6f 72 6b 73 20 2a 2a 2a 2a 2a 2a  y VxWorks ******
48a0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a  **********.*****
48b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
48c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
48d0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
48e0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
48f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 0a 2f 2a 2a  *********/.../**
4900: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4910: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4920: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4930: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4940: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a  ************.***
4950: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4960: 2a 2a 2a 2a 2a 2a 2a 2a 20 50 6f 73 69 78 20 41  ******** Posix A
4970: 64 76 69 73 6f 72 79 20 4c 6f 63 6b 69 6e 67 20  dvisory Locking 
4980: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4990: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a  ************.**.
49a0: 2a 2a 20 50 4f 53 49 58 20 61 64 76 69 73 6f 72  ** POSIX advisor
49b0: 79 20 6c 6f 63 6b 73 20 61 72 65 20 62 72 6f 6b  y locks are brok
49c0: 65 6e 20 62 79 20 64 65 73 69 67 6e 2e 20 20 41  en by design.  A
49d0: 4e 53 49 20 53 54 44 20 31 30 30 33 2e 31 20 28  NSI STD 1003.1 (
49e0: 31 39 39 36 29 0a 2a 2a 20 73 65 63 74 69 6f 6e  1996).** section
49f0: 20 36 2e 35 2e 32 2e 32 20 6c 69 6e 65 73 20 34   6.5.2.2 lines 4
4a00: 38 33 20 74 68 72 6f 75 67 68 20 34 39 30 20 73  83 through 490 s
4a10: 70 65 63 69 66 79 20 74 68 61 74 20 77 68 65 6e  pecify that when
4a20: 20 61 20 70 72 6f 63 65 73 73 0a 2a 2a 20 73 65   a process.** se
4a30: 74 73 20 6f 72 20 63 6c 65 61 72 73 20 61 20 6c  ts or clears a l
4a40: 6f 63 6b 2c 20 74 68 61 74 20 6f 70 65 72 61 74  ock, that operat
4a50: 69 6f 6e 20 6f 76 65 72 72 69 64 65 73 20 61 6e  ion overrides an
4a60: 79 20 70 72 69 6f 72 20 6c 6f 63 6b 73 20 73 65  y prior locks se
4a70: 74 0a 2a 2a 20 62 79 20 74 68 65 20 73 61 6d 65  t.** by the same
4a80: 20 70 72 6f 63 65 73 73 2e 20 20 49 74 20 64 6f   process.  It do
4a90: 65 73 20 6e 6f 74 20 65 78 70 6c 69 63 69 74 6c  es not explicitl
4aa0: 79 20 73 61 79 20 73 6f 2c 20 62 75 74 20 74 68  y say so, but th
4ab0: 69 73 20 69 6d 70 6c 69 65 73 0a 2a 2a 20 74 68  is implies.** th
4ac0: 61 74 20 69 74 20 6f 76 65 72 72 69 64 65 73 20  at it overrides 
4ad0: 6c 6f 63 6b 73 20 73 65 74 20 62 79 20 74 68 65  locks set by the
4ae0: 20 73 61 6d 65 20 70 72 6f 63 65 73 73 20 75 73   same process us
4af0: 69 6e 67 20 61 20 64 69 66 66 65 72 65 6e 74 0a  ing a different.
4b00: 2a 2a 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  ** file descript
4b10: 6f 72 2e 20 20 43 6f 6e 73 69 64 65 72 20 74 68  or.  Consider th
4b20: 69 73 20 74 65 73 74 20 63 61 73 65 3a 0a 2a 2a  is test case:.**
4b30: 0a 2a 2a 20 20 20 20 20 20 20 69 6e 74 20 66 64  .**       int fd
4b40: 31 20 3d 20 6f 70 65 6e 28 22 2e 2f 66 69 6c 65  1 = open("./file
4b50: 31 22 2c 20 4f 5f 52 44 57 52 7c 4f 5f 43 52 45  1", O_RDWR|O_CRE
4b60: 41 54 2c 20 30 36 34 34 29 3b 0a 2a 2a 20 20 20  AT, 0644);.**   
4b70: 20 20 20 20 69 6e 74 20 66 64 32 20 3d 20 6f 70      int fd2 = op
4b80: 65 6e 28 22 2e 2f 66 69 6c 65 32 22 2c 20 4f 5f  en("./file2", O_
4b90: 52 44 57 52 7c 4f 5f 43 52 45 41 54 2c 20 30 36  RDWR|O_CREAT, 06
4ba0: 34 34 29 3b 0a 2a 2a 0a 2a 2a 20 53 75 70 70 6f  44);.**.** Suppo
4bb0: 73 65 20 2e 2f 66 69 6c 65 31 20 61 6e 64 20 2e  se ./file1 and .
4bc0: 2f 66 69 6c 65 32 20 61 72 65 20 72 65 61 6c 6c  /file2 are reall
4bd0: 79 20 74 68 65 20 73 61 6d 65 20 66 69 6c 65 20  y the same file 
4be0: 28 62 65 63 61 75 73 65 0a 2a 2a 20 6f 6e 65 20  (because.** one 
4bf0: 69 73 20 61 20 68 61 72 64 20 6f 72 20 73 79 6d  is a hard or sym
4c00: 62 6f 6c 69 63 20 6c 69 6e 6b 20 74 6f 20 74 68  bolic link to th
4c10: 65 20 6f 74 68 65 72 29 20 74 68 65 6e 20 69 66  e other) then if
4c20: 20 79 6f 75 20 73 65 74 0a 2a 2a 20 61 6e 20 65   you set.** an e
4c30: 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20 6f 6e  xclusive lock on
4c40: 20 66 64 31 2c 20 74 68 65 6e 20 74 72 79 20 74   fd1, then try t
4c50: 6f 20 67 65 74 20 61 6e 20 65 78 63 6c 75 73 69  o get an exclusi
4c60: 76 65 20 6c 6f 63 6b 0a 2a 2a 20 6f 6e 20 66 64  ve lock.** on fd
4c70: 32 2c 20 69 74 20 77 6f 72 6b 73 2e 20 20 49 20  2, it works.  I 
4c80: 77 6f 75 6c 64 20 68 61 76 65 20 65 78 70 65 63  would have expec
4c90: 74 65 64 20 74 68 65 20 73 65 63 6f 6e 64 20 6c  ted the second l
4ca0: 6f 63 6b 20 74 6f 0a 2a 2a 20 66 61 69 6c 20 73  ock to.** fail s
4cb0: 69 6e 63 65 20 74 68 65 72 65 20 77 61 73 20 61  ince there was a
4cc0: 6c 72 65 61 64 79 20 61 20 6c 6f 63 6b 20 6f 6e  lready a lock on
4cd0: 20 74 68 65 20 66 69 6c 65 20 64 75 65 20 74 6f   the file due to
4ce0: 20 66 64 31 2e 0a 2a 2a 20 42 75 74 20 6e 6f 74   fd1..** But not
4cf0: 20 73 6f 2e 20 20 53 69 6e 63 65 20 62 6f 74 68   so.  Since both
4d00: 20 6c 6f 63 6b 73 20 63 61 6d 65 20 66 72 6f 6d   locks came from
4d10: 20 74 68 65 20 73 61 6d 65 20 70 72 6f 63 65 73   the same proces
4d20: 73 2c 20 74 68 65 0a 2a 2a 20 73 65 63 6f 6e 64  s, the.** second
4d30: 20 6f 76 65 72 72 69 64 65 73 20 74 68 65 20 66   overrides the f
4d40: 69 72 73 74 2c 20 65 76 65 6e 20 74 68 6f 75 67  irst, even thoug
4d50: 68 20 74 68 65 79 20 77 65 72 65 20 6f 6e 20 64  h they were on d
4d60: 69 66 66 65 72 65 6e 74 0a 2a 2a 20 66 69 6c 65  ifferent.** file
4d70: 20 64 65 73 63 72 69 70 74 6f 72 73 20 6f 70 65   descriptors ope
4d80: 6e 65 64 20 6f 6e 20 64 69 66 66 65 72 65 6e 74  ned on different
4d90: 20 66 69 6c 65 20 6e 61 6d 65 73 2e 0a 2a 2a 0a   file names..**.
4da0: 2a 2a 20 54 68 69 73 20 6d 65 61 6e 73 20 74 68  ** This means th
4db0: 61 74 20 77 65 20 63 61 6e 6e 6f 74 20 75 73 65  at we cannot use
4dc0: 20 50 4f 53 49 58 20 6c 6f 63 6b 73 20 74 6f 20   POSIX locks to 
4dd0: 73 79 6e 63 68 72 6f 6e 69 7a 65 20 66 69 6c 65  synchronize file
4de0: 20 61 63 63 65 73 73 0a 2a 2a 20 61 6d 6f 6e 67   access.** among
4df0: 20 63 6f 6d 70 65 74 69 6e 67 20 74 68 72 65 61   competing threa
4e00: 64 73 20 6f 66 20 74 68 65 20 73 61 6d 65 20 70  ds of the same p
4e10: 72 6f 63 65 73 73 2e 20 20 50 4f 53 49 58 20 6c  rocess.  POSIX l
4e20: 6f 63 6b 73 20 77 69 6c 6c 20 77 6f 72 6b 20 66  ocks will work f
4e30: 69 6e 65 0a 2a 2a 20 74 6f 20 73 79 6e 63 68 72  ine.** to synchr
4e40: 6f 6e 69 7a 65 20 61 63 63 65 73 73 20 66 6f 72  onize access for
4e50: 20 74 68 72 65 61 64 73 20 69 6e 20 73 65 70 61   threads in sepa
4e60: 72 61 74 65 20 70 72 6f 63 65 73 73 65 73 2c 20  rate processes, 
4e70: 62 75 74 20 6e 6f 74 0a 2a 2a 20 74 68 72 65 61  but not.** threa
4e80: 64 73 20 77 69 74 68 69 6e 20 74 68 65 20 73 61  ds within the sa
4e90: 6d 65 20 70 72 6f 63 65 73 73 2e 0a 2a 2a 0a 2a  me process..**.*
4ea0: 2a 20 54 6f 20 77 6f 72 6b 20 61 72 6f 75 6e 64  * To work around
4eb0: 20 74 68 65 20 70 72 6f 62 6c 65 6d 2c 20 53 51   the problem, SQ
4ec0: 4c 69 74 65 20 68 61 73 20 74 6f 20 6d 61 6e 61  Lite has to mana
4ed0: 67 65 20 66 69 6c 65 20 6c 6f 63 6b 73 20 69 6e  ge file locks in
4ee0: 74 65 72 6e 61 6c 6c 79 0a 2a 2a 20 6f 6e 20 69  ternally.** on i
4ef0: 74 73 20 6f 77 6e 2e 20 20 57 68 65 6e 65 76 65  ts own.  Wheneve
4f00: 72 20 61 20 6e 65 77 20 64 61 74 61 62 61 73 65  r a new database
4f10: 20 69 73 20 6f 70 65 6e 65 64 2c 20 77 65 20 68   is opened, we h
4f20: 61 76 65 20 74 6f 20 66 69 6e 64 20 74 68 65 0a  ave to find the.
4f30: 2a 2a 20 73 70 65 63 69 66 69 63 20 69 6e 6f 64  ** specific inod
4f40: 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  e of the databas
4f50: 65 20 66 69 6c 65 20 28 74 68 65 20 69 6e 6f 64  e file (the inod
4f60: 65 20 69 73 20 64 65 74 65 72 6d 69 6e 65 64 20  e is determined 
4f70: 62 79 20 74 68 65 0a 2a 2a 20 73 74 5f 64 65 76  by the.** st_dev
4f80: 20 61 6e 64 20 73 74 5f 69 6e 6f 20 66 69 65 6c   and st_ino fiel
4f90: 64 73 20 6f 66 20 74 68 65 20 73 74 61 74 20 73  ds of the stat s
4fa0: 74 72 75 63 74 75 72 65 20 74 68 61 74 20 66 73  tructure that fs
4fb0: 74 61 74 28 29 20 66 69 6c 6c 73 20 69 6e 29 0a  tat() fills in).
4fc0: 2a 2a 20 61 6e 64 20 63 68 65 63 6b 20 66 6f 72  ** and check for
4fd0: 20 6c 6f 63 6b 73 20 61 6c 72 65 61 64 79 20 65   locks already e
4fe0: 78 69 73 74 69 6e 67 20 6f 6e 20 74 68 61 74 20  xisting on that 
4ff0: 69 6e 6f 64 65 2e 20 20 57 68 65 6e 20 6c 6f 63  inode.  When loc
5000: 6b 73 20 61 72 65 0a 2a 2a 20 63 72 65 61 74 65  ks are.** create
5010: 64 20 6f 72 20 72 65 6d 6f 76 65 64 2c 20 77 65  d or removed, we
5020: 20 68 61 76 65 20 74 6f 20 6c 6f 6f 6b 20 61 74   have to look at
5030: 20 6f 75 72 20 6f 77 6e 20 69 6e 74 65 72 6e 61   our own interna
5040: 6c 20 72 65 63 6f 72 64 20 6f 66 20 74 68 65 0a  l record of the.
5050: 2a 2a 20 6c 6f 63 6b 73 20 74 6f 20 73 65 65 20  ** locks to see 
5060: 69 66 20 61 6e 6f 74 68 65 72 20 74 68 72 65 61  if another threa
5070: 64 20 68 61 73 20 70 72 65 76 69 6f 75 73 6c 79  d has previously
5080: 20 73 65 74 20 61 20 6c 6f 63 6b 20 6f 6e 20 74   set a lock on t
5090: 68 61 74 20 73 61 6d 65 0a 2a 2a 20 69 6e 6f 64  hat same.** inod
50a0: 65 2e 0a 2a 2a 0a 2a 2a 20 28 41 73 69 64 65 3a  e..**.** (Aside:
50b0: 20 54 68 65 20 75 73 65 20 6f 66 20 69 6e 6f 64   The use of inod
50c0: 65 20 6e 75 6d 62 65 72 73 20 61 73 20 75 6e 69  e numbers as uni
50d0: 71 75 65 20 49 44 73 20 64 6f 65 73 20 6e 6f 74  que IDs does not
50e0: 20 77 6f 72 6b 20 6f 6e 20 56 78 57 6f 72 6b 73   work on VxWorks
50f0: 2e 0a 2a 2a 20 46 6f 72 20 56 78 57 6f 72 6b 73  ..** For VxWorks
5100: 2c 20 77 65 20 68 61 76 65 20 74 6f 20 75 73 65  , we have to use
5110: 20 74 68 65 20 61 6c 74 65 72 6e 61 74 69 76 65   the alternative
5120: 20 75 6e 69 71 75 65 20 49 44 20 73 79 73 74 65   unique ID syste
5130: 6d 20 62 61 73 65 64 20 6f 6e 0a 2a 2a 20 63 61  m based on.** ca
5140: 6e 6f 6e 69 63 61 6c 20 66 69 6c 65 6e 61 6d 65  nonical filename
5150: 20 61 6e 64 20 69 6d 70 6c 65 6d 65 6e 74 65 64   and implemented
5160: 20 69 6e 20 74 68 65 20 70 72 65 76 69 6f 75 73   in the previous
5170: 20 64 69 76 69 73 69 6f 6e 2e 29 0a 2a 2a 0a 2a   division.).**.*
5180: 2a 20 54 68 65 20 73 71 6c 69 74 65 33 5f 66 69  * The sqlite3_fi
5190: 6c 65 20 73 74 72 75 63 74 75 72 65 20 66 6f 72  le structure for
51a0: 20 50 4f 53 49 58 20 69 73 20 6e 6f 20 6c 6f 6e   POSIX is no lon
51b0: 67 65 72 20 6a 75 73 74 20 61 6e 20 69 6e 74 65  ger just an inte
51c0: 67 65 72 20 66 69 6c 65 0a 2a 2a 20 64 65 73 63  ger file.** desc
51d0: 72 69 70 74 6f 72 2e 20 20 49 74 20 69 73 20 6e  riptor.  It is n
51e0: 6f 77 20 61 20 73 74 72 75 63 74 75 72 65 20 74  ow a structure t
51f0: 68 61 74 20 68 6f 6c 64 73 20 74 68 65 20 69 6e  hat holds the in
5200: 74 65 67 65 72 20 66 69 6c 65 0a 2a 2a 20 64 65  teger file.** de
5210: 73 63 72 69 70 74 6f 72 20 61 6e 64 20 61 20 70  scriptor and a p
5220: 6f 69 6e 74 65 72 20 74 6f 20 61 20 73 74 72 75  ointer to a stru
5230: 63 74 75 72 65 20 74 68 61 74 20 64 65 73 63 72  cture that descr
5240: 69 62 65 73 20 74 68 65 20 69 6e 74 65 72 6e 61  ibes the interna
5250: 6c 0a 2a 2a 20 6c 6f 63 6b 73 20 6f 6e 20 74 68  l.** locks on th
5260: 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20  e corresponding 
5270: 69 6e 6f 64 65 2e 20 20 54 68 65 72 65 20 69 73  inode.  There is
5280: 20 6f 6e 65 20 6c 6f 63 6b 69 6e 67 20 73 74 72   one locking str
5290: 75 63 74 75 72 65 0a 2a 2a 20 70 65 72 20 69 6e  ucture.** per in
52a0: 6f 64 65 2c 20 73 6f 20 69 66 20 74 68 65 20 73  ode, so if the s
52b0: 61 6d 65 20 69 6e 6f 64 65 20 69 73 20 6f 70 65  ame inode is ope
52c0: 6e 65 64 20 74 77 69 63 65 2c 20 62 6f 74 68 20  ned twice, both 
52d0: 75 6e 69 78 46 69 6c 65 20 73 74 72 75 63 74 75  unixFile structu
52e0: 72 65 73 0a 2a 2a 20 70 6f 69 6e 74 20 74 6f 20  res.** point to 
52f0: 74 68 65 20 73 61 6d 65 20 6c 6f 63 6b 69 6e 67  the same locking
5300: 20 73 74 72 75 63 74 75 72 65 2e 20 20 54 68 65   structure.  The
5310: 20 6c 6f 63 6b 69 6e 67 20 73 74 72 75 63 74 75   locking structu
5320: 72 65 20 6b 65 65 70 73 0a 2a 2a 20 61 20 72 65  re keeps.** a re
5330: 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 28 73  ference count (s
5340: 6f 20 77 65 20 77 69 6c 6c 20 6b 6e 6f 77 20 77  o we will know w
5350: 68 65 6e 20 74 6f 20 64 65 6c 65 74 65 20 69 74  hen to delete it
5360: 29 20 61 6e 64 20 61 20 22 63 6e 74 22 0a 2a 2a  ) and a "cnt".**
5370: 20 66 69 65 6c 64 20 74 68 61 74 20 74 65 6c 6c   field that tell
5380: 73 20 75 73 20 69 74 73 20 69 6e 74 65 72 6e 61  s us its interna
5390: 6c 20 6c 6f 63 6b 20 73 74 61 74 75 73 2e 20 20  l lock status.  
53a0: 63 6e 74 3d 3d 30 20 6d 65 61 6e 73 20 74 68 65  cnt==0 means the
53b0: 0a 2a 2a 20 66 69 6c 65 20 69 73 20 75 6e 6c 6f  .** file is unlo
53c0: 63 6b 65 64 2e 20 20 63 6e 74 3d 3d 2d 31 20 6d  cked.  cnt==-1 m
53d0: 65 61 6e 73 20 74 68 65 20 66 69 6c 65 20 68 61  eans the file ha
53e0: 73 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c  s an exclusive l
53f0: 6f 63 6b 2e 0a 2a 2a 20 63 6e 74 3e 30 20 6d 65  ock..** cnt>0 me
5400: 61 6e 73 20 74 68 65 72 65 20 61 72 65 20 63 6e  ans there are cn
5410: 74 20 73 68 61 72 65 64 20 6c 6f 63 6b 73 20 6f  t shared locks o
5420: 6e 20 74 68 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a  n the file..**.*
5430: 2a 20 41 6e 79 20 61 74 74 65 6d 70 74 20 74 6f  * Any attempt to
5440: 20 6c 6f 63 6b 20 6f 72 20 75 6e 6c 6f 63 6b 20   lock or unlock 
5450: 61 20 66 69 6c 65 20 66 69 72 73 74 20 63 68 65  a file first che
5460: 63 6b 73 20 74 68 65 20 6c 6f 63 6b 69 6e 67 0a  cks the locking.
5470: 2a 2a 20 73 74 72 75 63 74 75 72 65 2e 20 20 54  ** structure.  T
5480: 68 65 20 66 63 6e 74 6c 28 29 20 73 79 73 74 65  he fcntl() syste
5490: 6d 20 63 61 6c 6c 20 69 73 20 6f 6e 6c 79 20 69  m call is only i
54a0: 6e 76 6f 6b 65 64 20 74 6f 20 73 65 74 20 61 20  nvoked to set a 
54b0: 0a 2a 2a 20 50 4f 53 49 58 20 6c 6f 63 6b 20 69  .** POSIX lock i
54c0: 66 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 20 6c  f the internal l
54d0: 6f 63 6b 20 73 74 72 75 63 74 75 72 65 20 74 72  ock structure tr
54e0: 61 6e 73 69 74 69 6f 6e 73 20 62 65 74 77 65 65  ansitions betwee
54f0: 6e 0a 2a 2a 20 61 20 6c 6f 63 6b 65 64 20 61 6e  n.** a locked an
5500: 64 20 61 6e 20 75 6e 6c 6f 63 6b 65 64 20 73 74  d an unlocked st
5510: 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 42 75 74 20 77  ate..**.** But w
5520: 61 69 74 3a 20 20 74 68 65 72 65 20 61 72 65 20  ait:  there are 
5530: 79 65 74 20 6d 6f 72 65 20 70 72 6f 62 6c 65 6d  yet more problem
5540: 73 20 77 69 74 68 20 50 4f 53 49 58 20 61 64 76  s with POSIX adv
5550: 69 73 6f 72 79 20 6c 6f 63 6b 73 2e 0a 2a 2a 0a  isory locks..**.
5560: 2a 2a 20 49 66 20 79 6f 75 20 63 6c 6f 73 65 20  ** If you close 
5570: 61 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  a file descripto
5580: 72 20 74 68 61 74 20 70 6f 69 6e 74 73 20 74 6f  r that points to
5590: 20 61 20 66 69 6c 65 20 74 68 61 74 20 68 61 73   a file that has
55a0: 20 6c 6f 63 6b 73 2c 0a 2a 2a 20 61 6c 6c 20 6c   locks,.** all l
55b0: 6f 63 6b 73 20 6f 6e 20 74 68 61 74 20 66 69 6c  ocks on that fil
55c0: 65 20 74 68 61 74 20 61 72 65 20 6f 77 6e 65 64  e that are owned
55d0: 20 62 79 20 74 68 65 20 63 75 72 72 65 6e 74 20   by the current 
55e0: 70 72 6f 63 65 73 73 20 61 72 65 0a 2a 2a 20 72  process are.** r
55f0: 65 6c 65 61 73 65 64 2e 20 20 54 6f 20 77 6f 72  eleased.  To wor
5600: 6b 20 61 72 6f 75 6e 64 20 74 68 69 73 20 70 72  k around this pr
5610: 6f 62 6c 65 6d 2c 20 65 61 63 68 20 75 6e 69 78  oblem, each unix
5620: 46 69 6c 65 20 73 74 72 75 63 74 75 72 65 20 63  File structure c
5630: 6f 6e 74 61 69 6e 73 0a 2a 2a 20 61 20 70 6f 69  ontains.** a poi
5640: 6e 74 65 72 20 74 6f 20 61 6e 20 75 6e 69 78 4f  nter to an unixO
5650: 70 65 6e 43 6e 74 20 73 74 72 75 63 74 75 72 65  penCnt structure
5660: 2e 20 20 54 68 65 72 65 20 69 73 20 6f 6e 65 20  .  There is one 
5670: 75 6e 69 78 4f 70 65 6e 43 6e 74 20 73 74 72 75  unixOpenCnt stru
5680: 63 74 75 72 65 0a 2a 2a 20 70 65 72 20 6f 70 65  cture.** per ope
5690: 6e 20 69 6e 6f 64 65 2c 20 77 68 69 63 68 20 6d  n inode, which m
56a0: 65 61 6e 73 20 74 68 61 74 20 6d 75 6c 74 69 70  eans that multip
56b0: 6c 65 20 75 6e 69 78 46 69 6c 65 20 63 61 6e 20  le unixFile can 
56c0: 70 6f 69 6e 74 20 74 6f 20 61 20 73 69 6e 67 6c  point to a singl
56d0: 65 0a 2a 2a 20 75 6e 69 78 4f 70 65 6e 43 6e 74  e.** unixOpenCnt
56e0: 2e 20 20 57 68 65 6e 20 61 6e 20 61 74 74 65 6d  .  When an attem
56f0: 70 74 20 69 73 20 6d 61 64 65 20 74 6f 20 63 6c  pt is made to cl
5700: 6f 73 65 20 61 6e 20 75 6e 69 78 46 69 6c 65 2c  ose an unixFile,
5710: 20 69 66 20 74 68 65 72 65 20 61 72 65 0a 2a 2a   if there are.**
5720: 20 6f 74 68 65 72 20 75 6e 69 78 46 69 6c 65 20   other unixFile 
5730: 6f 70 65 6e 20 6f 6e 20 74 68 65 20 73 61 6d 65  open on the same
5740: 20 69 6e 6f 64 65 20 74 68 61 74 20 61 72 65 20   inode that are 
5750: 68 6f 6c 64 69 6e 67 20 6c 6f 63 6b 73 2c 20 74  holding locks, t
5760: 68 65 20 63 61 6c 6c 0a 2a 2a 20 74 6f 20 63 6c  he call.** to cl
5770: 6f 73 65 28 29 20 74 68 65 20 66 69 6c 65 20 64  ose() the file d
5780: 65 73 63 72 69 70 74 6f 72 20 69 73 20 64 65 66  escriptor is def
5790: 65 72 72 65 64 20 75 6e 74 69 6c 20 61 6c 6c 20  erred until all 
57a0: 6f 66 20 74 68 65 20 6c 6f 63 6b 73 20 63 6c 65  of the locks cle
57b0: 61 72 2e 0a 2a 2a 20 54 68 65 20 75 6e 69 78 4f  ar..** The unixO
57c0: 70 65 6e 43 6e 74 20 73 74 72 75 63 74 75 72 65  penCnt structure
57d0: 20 6b 65 65 70 73 20 61 20 6c 69 73 74 20 6f 66   keeps a list of
57e0: 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
57f0: 73 20 74 68 61 74 20 6e 65 65 64 20 74 6f 0a 2a  s that need to.*
5800: 2a 20 62 65 20 63 6c 6f 73 65 64 20 61 6e 64 20  * be closed and 
5810: 74 68 61 74 20 6c 69 73 74 20 69 73 20 77 61 6c  that list is wal
5820: 6b 65 64 20 28 61 6e 64 20 63 6c 65 61 72 65 64  ked (and cleared
5830: 29 20 77 68 65 6e 20 74 68 65 20 6c 61 73 74 20  ) when the last 
5840: 6c 6f 63 6b 0a 2a 2a 20 63 6c 65 61 72 73 2e 0a  lock.** clears..
5850: 2a 2a 0a 2a 2a 20 59 65 74 20 61 6e 6f 74 68 65  **.** Yet anothe
5860: 72 20 70 72 6f 62 6c 65 6d 3a 20 20 4c 69 6e 75  r problem:  Linu
5870: 78 54 68 72 65 61 64 73 20 64 6f 20 6e 6f 74 20  xThreads do not 
5880: 70 6c 61 79 20 77 65 6c 6c 20 77 69 74 68 20 70  play well with p
5890: 6f 73 69 78 20 6c 6f 63 6b 73 2e 0a 2a 2a 0a 2a  osix locks..**.*
58a0: 2a 20 4d 61 6e 79 20 6f 6c 64 65 72 20 76 65 72  * Many older ver
58b0: 73 69 6f 6e 73 20 6f 66 20 6c 69 6e 75 78 20 75  sions of linux u
58c0: 73 65 20 74 68 65 20 4c 69 6e 75 78 54 68 72 65  se the LinuxThre
58d0: 61 64 73 20 6c 69 62 72 61 72 79 20 77 68 69 63  ads library whic
58e0: 68 20 69 73 0a 2a 2a 20 6e 6f 74 20 70 6f 73 69  h is.** not posi
58f0: 78 20 63 6f 6d 70 6c 69 61 6e 74 2e 20 20 55 6e  x compliant.  Un
5900: 64 65 72 20 4c 69 6e 75 78 54 68 72 65 61 64 73  der LinuxThreads
5910: 2c 20 61 20 6c 6f 63 6b 20 63 72 65 61 74 65 64  , a lock created
5920: 20 62 79 20 74 68 72 65 61 64 0a 2a 2a 20 41 20   by thread.** A 
5930: 63 61 6e 6e 6f 74 20 62 65 20 6d 6f 64 69 66 69  cannot be modifi
5940: 65 64 20 6f 72 20 6f 76 65 72 72 69 64 64 65 6e  ed or overridden
5950: 20 62 79 20 61 20 64 69 66 66 65 72 65 6e 74 20   by a different 
5960: 74 68 72 65 61 64 20 42 2e 0a 2a 2a 20 4f 6e 6c  thread B..** Onl
5970: 79 20 74 68 72 65 61 64 20 41 20 63 61 6e 20 6d  y thread A can m
5980: 6f 64 69 66 79 20 74 68 65 20 6c 6f 63 6b 2e 20  odify the lock. 
5990: 20 4c 6f 63 6b 69 6e 67 20 62 65 68 61 76 69 6f   Locking behavio
59a0: 72 20 69 73 20 63 6f 72 72 65 63 74 0a 2a 2a 20  r is correct.** 
59b0: 69 66 20 74 68 65 20 61 70 70 6c 69 61 74 69 6f  if the appliatio
59c0: 6e 20 75 73 65 73 20 74 68 65 20 6e 65 77 65 72  n uses the newer
59d0: 20 4e 61 74 69 76 65 20 50 6f 73 69 78 20 54 68   Native Posix Th
59e0: 72 65 61 64 20 4c 69 62 72 61 72 79 20 28 4e 50  read Library (NP
59f0: 54 4c 29 0a 2a 2a 20 6f 6e 20 6c 69 6e 75 78 20  TL).** on linux 
5a00: 2d 20 77 69 74 68 20 4e 50 54 4c 20 61 20 6c 6f  - with NPTL a lo
5a10: 63 6b 20 63 72 65 61 74 65 64 20 62 79 20 74 68  ck created by th
5a20: 72 65 61 64 20 41 20 63 61 6e 20 6f 76 65 72 72  read A can overr
5a30: 69 64 65 20 6c 6f 63 6b 73 0a 2a 2a 20 69 6e 20  ide locks.** in 
5a40: 74 68 72 65 61 64 20 42 2e 20 20 42 75 74 20 74  thread B.  But t
5a50: 68 65 72 65 20 69 73 20 6e 6f 20 77 61 79 20 74  here is no way t
5a60: 6f 20 6b 6e 6f 77 20 61 74 20 63 6f 6d 70 69 6c  o know at compil
5a70: 65 2d 74 69 6d 65 20 77 68 69 63 68 0a 2a 2a 20  e-time which.** 
5a80: 74 68 72 65 61 64 69 6e 67 20 6c 69 62 72 61 72  threading librar
5a90: 79 20 69 73 20 62 65 69 6e 67 20 75 73 65 64 2e  y is being used.
5aa0: 20 20 53 6f 20 74 68 65 72 65 20 69 73 20 6e 6f    So there is no
5ab0: 20 77 61 79 20 74 6f 20 6b 6e 6f 77 20 61 74 0a   way to know at.
5ac0: 2a 2a 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20  ** compile-time 
5ad0: 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 74  whether or not t
5ae0: 68 72 65 61 64 20 41 20 63 61 6e 20 6f 76 65 72  hread A can over
5af0: 72 69 64 65 20 6c 6f 63 6b 73 20 6f 6e 20 74 68  ride locks on th
5b00: 72 65 61 64 20 42 2e 0a 2a 2a 20 57 65 20 68 61  read B..** We ha
5b10: 76 65 20 74 6f 20 64 6f 20 61 20 72 75 6e 2d 74  ve to do a run-t
5b20: 69 6d 65 20 63 68 65 63 6b 20 74 6f 20 64 69 73  ime check to dis
5b30: 63 6f 76 65 72 20 74 68 65 20 62 65 68 61 76 69  cover the behavi
5b40: 6f 72 20 6f 66 20 74 68 65 0a 2a 2a 20 63 75 72  or of the.** cur
5b50: 72 65 6e 74 20 70 72 6f 63 65 73 73 2e 0a 2a 2a  rent process..**
5b60: 0a 2a 2a 20 4f 6e 20 73 79 73 74 65 6d 73 20 77  .** On systems w
5b70: 68 65 72 65 20 74 68 72 65 61 64 20 41 20 69 73  here thread A is
5b80: 20 75 6e 61 62 6c 65 20 74 6f 20 6d 6f 64 69 66   unable to modif
5b90: 79 20 6c 6f 63 6b 73 20 63 72 65 61 74 65 64 20  y locks created 
5ba0: 62 79 0a 2a 2a 20 74 68 72 65 61 64 20 42 2c 20  by.** thread B, 
5bb0: 77 65 20 68 61 76 65 20 74 6f 20 6b 65 65 70 20  we have to keep 
5bc0: 74 72 61 63 6b 20 6f 66 20 77 68 69 63 68 20 74  track of which t
5bd0: 68 72 65 61 64 20 63 72 65 61 74 65 64 20 65 61  hread created ea
5be0: 63 68 0a 2a 2a 20 6c 6f 63 6b 2e 20 20 48 65 6e  ch.** lock.  Hen
5bf0: 63 65 20 74 68 65 72 65 20 69 73 20 61 6e 20 65  ce there is an e
5c00: 78 74 72 61 20 66 69 65 6c 64 20 69 6e 20 74 68  xtra field in th
5c10: 65 20 6b 65 79 20 74 6f 20 74 68 65 20 75 6e 69  e key to the uni
5c20: 78 4c 6f 63 6b 49 6e 66 6f 0a 2a 2a 20 73 74 72  xLockInfo.** str
5c30: 75 63 74 75 72 65 20 74 6f 20 72 65 63 6f 72 64  ucture to record
5c40: 20 74 68 69 73 20 69 6e 66 6f 72 6d 61 74 69 6f   this informatio
5c50: 6e 2e 20 20 41 6e 64 20 6f 6e 20 74 68 6f 73 65  n.  And on those
5c60: 20 73 79 73 74 65 6d 73 20 69 74 0a 2a 2a 20 69   systems it.** i
5c70: 73 20 69 6c 6c 65 67 61 6c 20 74 6f 20 62 65 67  s illegal to beg
5c80: 69 6e 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  in a transaction
5c90: 20 69 6e 20 6f 6e 65 20 74 68 72 65 61 64 20 61   in one thread a
5ca0: 6e 64 20 66 69 6e 69 73 68 20 69 74 0a 2a 2a 20  nd finish it.** 
5cb0: 69 6e 20 61 6e 6f 74 68 65 72 2e 20 20 46 6f 72  in another.  For
5cc0: 20 74 68 69 73 20 6c 61 74 74 65 72 20 72 65 73   this latter res
5cd0: 74 72 69 63 74 69 6f 6e 2c 20 74 68 65 72 65 20  triction, there 
5ce0: 69 73 20 6e 6f 20 77 6f 72 6b 2d 61 72 6f 75 6e  is no work-aroun
5cf0: 64 2e 0a 2a 2a 20 49 74 20 69 73 20 61 20 6c 69  d..** It is a li
5d00: 6d 69 74 61 74 69 6f 6e 20 6f 66 20 4c 69 6e 75  mitation of Linu
5d10: 78 54 68 72 65 61 64 73 2e 0a 2a 2f 0a 0a 2f 2a  xThreads..*/../*
5d20: 0a 2a 2a 20 53 65 74 20 6f 72 20 63 68 65 63 6b  .** Set or check
5d30: 20 74 68 65 20 75 6e 69 78 46 69 6c 65 2e 74 69   the unixFile.ti
5d40: 64 20 66 69 65 6c 64 2e 20 20 54 68 69 73 20 66  d field.  This f
5d50: 69 65 6c 64 20 69 73 20 73 65 74 20 77 68 65 6e  ield is set when
5d60: 20 61 6e 20 75 6e 69 78 46 69 6c 65 0a 2a 2a 20   an unixFile.** 
5d70: 69 73 20 66 69 72 73 74 20 6f 70 65 6e 65 64 2e  is first opened.
5d80: 20 20 41 6c 6c 20 73 75 62 73 65 71 75 65 6e 74    All subsequent
5d90: 20 75 73 65 73 20 6f 66 20 74 68 65 20 75 6e 69   uses of the uni
5da0: 78 46 69 6c 65 20 76 65 72 69 66 79 20 74 68 61  xFile verify tha
5db0: 74 20 74 68 65 0a 2a 2a 20 73 61 6d 65 20 74 68  t the.** same th
5dc0: 72 65 61 64 20 69 73 20 6f 70 65 72 61 74 69 6e  read is operatin
5dd0: 67 20 6f 6e 20 74 68 65 20 75 6e 69 78 46 69 6c  g on the unixFil
5de0: 65 2e 20 20 53 6f 6d 65 20 6f 70 65 72 61 74 69  e.  Some operati
5df0: 6e 67 20 73 79 73 74 65 6d 73 20 64 6f 0a 2a 2a  ng systems do.**
5e00: 20 6e 6f 74 20 61 6c 6c 6f 77 20 6c 6f 63 6b 73   not allow locks
5e10: 20 74 6f 20 62 65 20 6f 76 65 72 72 69 64 64 65   to be overridde
5e20: 6e 20 62 79 20 6f 74 68 65 72 20 74 68 72 65 61  n by other threa
5e30: 64 73 20 61 6e 64 20 74 68 61 74 20 72 65 73 74  ds and that rest
5e40: 72 69 63 74 69 6f 6e 0a 2a 2a 20 6d 65 61 6e 73  riction.** means
5e50: 20 74 68 61 74 20 73 71 6c 69 74 65 33 2a 20 64   that sqlite3* d
5e60: 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 73 20  atabase handles 
5e70: 63 61 6e 6e 6f 74 20 62 65 20 6d 6f 76 65 64 20  cannot be moved 
5e80: 66 72 6f 6d 20 6f 6e 65 20 74 68 72 65 61 64 0a  from one thread.
5e90: 2a 2a 20 74 6f 20 61 6e 6f 74 68 65 72 20 77 68  ** to another wh
5ea0: 69 6c 65 20 6c 6f 63 6b 73 20 61 72 65 20 68 65  ile locks are he
5eb0: 6c 64 2e 0a 2a 2a 0a 2a 2a 20 56 65 72 73 69 6f  ld..**.** Versio
5ec0: 6e 20 33 2e 33 2e 31 20 28 32 30 30 36 2d 30 31  n 3.3.1 (2006-01
5ed0: 2d 31 35 29 3a 20 20 75 6e 69 78 46 69 6c 65 20  -15):  unixFile 
5ee0: 63 61 6e 20 62 65 20 6d 6f 76 65 64 20 66 72 6f  can be moved fro
5ef0: 6d 20 6f 6e 65 20 74 68 72 65 61 64 20 74 6f 0a  m one thread to.
5f00: 2a 2a 20 61 6e 6f 74 68 65 72 20 61 73 20 6c 6f  ** another as lo
5f10: 6e 67 20 61 73 20 77 65 20 61 72 65 20 72 75 6e  ng as we are run
5f20: 6e 69 6e 67 20 6f 6e 20 61 20 73 79 73 74 65 6d  ning on a system
5f30: 20 74 68 61 74 20 73 75 70 70 6f 72 74 73 20 74   that supports t
5f40: 68 72 65 61 64 73 0a 2a 2a 20 6f 76 65 72 72 69  hreads.** overri
5f50: 64 69 6e 67 20 65 61 63 68 20 6f 74 68 65 72 73  ding each others
5f60: 20 6c 6f 63 6b 73 20 28 77 68 69 63 68 20 69 73   locks (which is
5f70: 20 6e 6f 77 20 74 68 65 20 6d 6f 73 74 20 63 6f   now the most co
5f80: 6d 6d 6f 6e 20 62 65 68 61 76 69 6f 72 29 0a 2a  mmon behavior).*
5f90: 2a 20 6f 72 20 69 66 20 6e 6f 20 6c 6f 63 6b 73  * or if no locks
5fa0: 20 61 72 65 20 68 65 6c 64 2e 20 20 42 75 74 20   are held.  But 
5fb0: 74 68 65 20 75 6e 69 78 46 69 6c 65 2e 70 4c 6f  the unixFile.pLo
5fc0: 63 6b 20 66 69 65 6c 64 20 6e 65 65 64 73 20 74  ck field needs t
5fd0: 6f 20 62 65 0a 2a 2a 20 72 65 63 6f 6d 70 75 74  o be.** recomput
5fe0: 65 64 20 62 65 63 61 75 73 65 20 69 74 73 20 6b  ed because its k
5ff0: 65 79 20 69 6e 63 6c 75 64 65 73 20 74 68 65 20  ey includes the 
6000: 74 68 72 65 61 64 2d 69 64 2e 20 20 53 65 65 20  thread-id.  See 
6010: 74 68 65 20 0a 2a 2a 20 74 72 61 6e 73 66 65 72  the .** transfer
6020: 4f 77 6e 65 72 73 68 69 70 28 29 20 66 75 6e 63  Ownership() func
6030: 74 69 6f 6e 20 62 65 6c 6f 77 20 66 6f 72 20 61  tion below for a
6040: 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d  dditional inform
6050: 61 74 69 6f 6e 0a 2a 2f 0a 23 69 66 20 53 51 4c  ation.*/.#if SQL
6060: 49 54 45 5f 54 48 52 45 41 44 53 41 46 45 20 26  ITE_THREADSAFE &
6070: 26 20 64 65 66 69 6e 65 64 28 5f 5f 6c 69 6e 75  & defined(__linu
6080: 78 5f 5f 29 0a 23 20 64 65 66 69 6e 65 20 53 45  x__).# define SE
6090: 54 5f 54 48 52 45 41 44 49 44 28 58 29 20 20 20  T_THREADID(X)   
60a0: 28 58 29 2d 3e 74 69 64 20 3d 20 70 74 68 72 65  (X)->tid = pthre
60b0: 61 64 5f 73 65 6c 66 28 29 0a 23 20 64 65 66 69  ad_self().# defi
60c0: 6e 65 20 43 48 45 43 4b 5f 54 48 52 45 41 44 49  ne CHECK_THREADI
60d0: 44 28 58 29 20 28 74 68 72 65 61 64 73 4f 76 65  D(X) (threadsOve
60e0: 72 72 69 64 65 45 61 63 68 4f 74 68 65 72 73 4c  rrideEachOthersL
60f0: 6f 63 6b 73 3d 3d 30 20 26 26 20 5c 0a 20 20 20  ocks==0 && \.   
6100: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6110: 20 20 20 20 20 20 20 20 20 21 70 74 68 72 65 61           !pthrea
6120: 64 5f 65 71 75 61 6c 28 28 58 29 2d 3e 74 69 64  d_equal((X)->tid
6130: 2c 20 70 74 68 72 65 61 64 5f 73 65 6c 66 28 29  , pthread_self()
6140: 29 29 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e  )).#else.# defin
6150: 65 20 53 45 54 5f 54 48 52 45 41 44 49 44 28 58  e SET_THREADID(X
6160: 29 0a 23 20 64 65 66 69 6e 65 20 43 48 45 43 4b  ).# define CHECK
6170: 5f 54 48 52 45 41 44 49 44 28 58 29 20 30 0a 23  _THREADID(X) 0.#
6180: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20  endif../*.** An 
6190: 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20  instance of the 
61a0: 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63 74  following struct
61b0: 75 72 65 20 73 65 72 76 65 73 20 61 73 20 74 68  ure serves as th
61c0: 65 20 6b 65 79 20 75 73 65 64 0a 2a 2a 20 74 6f  e key used.** to
61d0: 20 6c 6f 63 61 74 65 20 61 20 70 61 72 74 69 63   locate a partic
61e0: 75 6c 61 72 20 75 6e 69 78 4f 70 65 6e 43 6e 74  ular unixOpenCnt
61f0: 20 73 74 72 75 63 74 75 72 65 20 67 69 76 65 6e   structure given
6200: 20 69 74 73 20 69 6e 6f 64 65 2e 20 20 54 68 69   its inode.  Thi
6210: 73 0a 2a 2a 20 69 73 20 74 68 65 20 73 61 6d 65  s.** is the same
6220: 20 61 73 20 74 68 65 20 75 6e 69 78 4c 6f 63 6b   as the unixLock
6230: 4b 65 79 20 65 78 63 65 70 74 20 74 68 61 74 20  Key except that 
6240: 74 68 65 20 74 68 72 65 61 64 20 49 44 20 69 73  the thread ID is
6250: 20 6f 6d 69 74 74 65 64 2e 0a 2a 2f 0a 73 74 72   omitted..*/.str
6260: 75 63 74 20 75 6e 69 78 46 69 6c 65 49 64 20 7b  uct unixFileId {
6270: 0a 20 20 64 65 76 5f 74 20 64 65 76 3b 20 20 20  .  dev_t dev;   
6280: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
6290: 2a 20 44 65 76 69 63 65 20 6e 75 6d 62 65 72 20  * Device number 
62a0: 2a 2f 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b  */.#if OS_VXWORK
62b0: 53 0a 20 20 73 74 72 75 63 74 20 76 78 77 6f 72  S.  struct vxwor
62c0: 6b 73 46 69 6c 65 49 64 20 2a 70 49 64 3b 20 20  ksFileId *pId;  
62d0: 2f 2a 20 55 6e 69 71 75 65 20 66 69 6c 65 20 49  /* Unique file I
62e0: 44 20 66 6f 72 20 76 78 77 6f 72 6b 73 2e 20 2a  D for vxworks. *
62f0: 2f 0a 23 65 6c 73 65 0a 20 20 69 6e 6f 5f 74 20  /.#else.  ino_t 
6300: 69 6e 6f 3b 20 20 20 20 20 20 20 20 20 20 20 20  ino;            
6310: 20 20 20 20 20 20 2f 2a 20 49 6e 6f 64 65 20 6e        /* Inode n
6320: 75 6d 62 65 72 20 2a 2f 0a 23 65 6e 64 69 66 0a  umber */.#endif.
6330: 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 69 6e 73  };../*.** An ins
6340: 74 61 6e 63 65 20 6f 66 20 74 68 65 20 66 6f 6c  tance of the fol
6350: 6c 6f 77 69 6e 67 20 73 74 72 75 63 74 75 72 65  lowing structure
6360: 20 73 65 72 76 65 73 20 61 73 20 74 68 65 20 6b   serves as the k
6370: 65 79 20 75 73 65 64 0a 2a 2a 20 74 6f 20 6c 6f  ey used.** to lo
6380: 63 61 74 65 20 61 20 70 61 72 74 69 63 75 6c 61  cate a particula
6390: 72 20 75 6e 69 78 4c 6f 63 6b 49 6e 66 6f 20 73  r unixLockInfo s
63a0: 74 72 75 63 74 75 72 65 20 67 69 76 65 6e 20 69  tructure given i
63b0: 74 73 20 69 6e 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20  ts inode..**.** 
63c0: 49 66 20 74 68 72 65 61 64 73 20 63 61 6e 6e 6f  If threads canno
63d0: 74 20 6f 76 65 72 72 69 64 65 20 65 61 63 68 20  t override each 
63e0: 6f 74 68 65 72 73 20 6c 6f 63 6b 73 20 28 4c 69  others locks (Li
63f0: 6e 75 78 54 68 72 65 61 64 73 29 2c 20 74 68 65  nuxThreads), the
6400: 6e 20 77 65 0a 2a 2a 20 73 65 74 20 74 68 65 20  n we.** set the 
6410: 75 6e 69 78 4c 6f 63 6b 4b 65 79 2e 74 69 64 20  unixLockKey.tid 
6420: 66 69 65 6c 64 20 74 6f 20 74 68 65 20 74 68 72  field to the thr
6430: 65 61 64 20 49 44 2e 20 20 49 66 20 74 68 72 65  ead ID.  If thre
6440: 61 64 73 20 63 61 6e 20 6f 76 65 72 72 69 64 65  ads can override
6450: 0a 2a 2a 20 65 61 63 68 20 6f 74 68 65 72 73 20  .** each others 
6460: 6c 6f 63 6b 73 20 28 50 6f 73 69 78 20 61 6e 64  locks (Posix and
6470: 20 4e 50 54 4c 29 20 74 68 65 6e 20 74 69 64 20   NPTL) then tid 
6480: 69 73 20 61 6c 77 61 79 73 20 73 65 74 20 74 6f  is always set to
6490: 20 7a 65 72 6f 2e 0a 2a 2a 20 74 69 64 20 69 73   zero..** tid is
64a0: 20 6f 6d 69 74 74 65 64 20 69 66 20 77 65 20 63   omitted if we c
64b0: 6f 6d 70 69 6c 65 20 77 69 74 68 6f 75 74 20 74  ompile without t
64c0: 68 72 65 61 64 69 6e 67 20 73 75 70 70 6f 72 74  hreading support
64d0: 20 6f 72 20 6f 6e 20 61 6e 20 4f 53 0a 2a 2a 20   or on an OS.** 
64e0: 6f 74 68 65 72 20 74 68 61 6e 20 6c 69 6e 75 78  other than linux
64f0: 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 75 6e 69 78  ..*/.struct unix
6500: 4c 6f 63 6b 4b 65 79 20 7b 0a 20 20 73 74 72 75  LockKey {.  stru
6510: 63 74 20 75 6e 69 78 46 69 6c 65 49 64 20 66 69  ct unixFileId fi
6520: 64 3b 20 20 2f 2a 20 55 6e 69 71 75 65 20 69 64  d;  /* Unique id
6530: 65 6e 74 69 66 69 65 72 20 66 6f 72 20 74 68 65  entifier for the
6540: 20 66 69 6c 65 20 2a 2f 0a 23 69 66 20 53 51 4c   file */.#if SQL
6550: 49 54 45 5f 54 48 52 45 41 44 53 41 46 45 20 26  ITE_THREADSAFE &
6560: 26 20 64 65 66 69 6e 65 64 28 5f 5f 6c 69 6e 75  & defined(__linu
6570: 78 5f 5f 29 0a 20 20 70 74 68 72 65 61 64 5f 74  x__).  pthread_t
6580: 20 74 69 64 3b 20 20 2f 2a 20 54 68 72 65 61 64   tid;  /* Thread
6590: 20 49 44 20 6f 66 20 6c 6f 63 6b 20 6f 77 6e 65   ID of lock owne
65a0: 72 2e 20 5a 65 72 6f 20 69 66 20 6e 6f 74 20 75  r. Zero if not u
65b0: 73 69 6e 67 20 4c 69 6e 75 78 54 68 72 65 61 64  sing LinuxThread
65c0: 73 20 2a 2f 0a 23 65 6e 64 69 66 0a 7d 3b 0a 0a  s */.#endif.};..
65d0: 2f 2a 0a 2a 2a 20 41 6e 20 69 6e 73 74 61 6e 63  /*.** An instanc
65e0: 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  e of the followi
65f0: 6e 67 20 73 74 72 75 63 74 75 72 65 20 69 73 20  ng structure is 
6600: 61 6c 6c 6f 63 61 74 65 64 20 66 6f 72 20 65 61  allocated for ea
6610: 63 68 20 6f 70 65 6e 0a 2a 2a 20 69 6e 6f 64 65  ch open.** inode
6620: 2e 20 20 4f 72 2c 20 6f 6e 20 4c 69 6e 75 78 54  .  Or, on LinuxT
6630: 68 72 65 61 64 73 2c 20 74 68 65 72 65 20 69 73  hreads, there is
6640: 20 6f 6e 65 20 6f 66 20 74 68 65 73 65 20 73 74   one of these st
6650: 72 75 63 74 75 72 65 73 20 66 6f 72 0a 2a 2a 20  ructures for.** 
6660: 65 61 63 68 20 69 6e 6f 64 65 20 6f 70 65 6e 65  each inode opene
6670: 64 20 62 79 20 65 61 63 68 20 74 68 72 65 61 64  d by each thread
6680: 2e 0a 2a 2a 0a 2a 2a 20 41 20 73 69 6e 67 6c 65  ..**.** A single
6690: 20 69 6e 6f 64 65 20 63 61 6e 20 68 61 76 65 20   inode can have 
66a0: 6d 75 6c 74 69 70 6c 65 20 66 69 6c 65 20 64 65  multiple file de
66b0: 73 63 72 69 70 74 6f 72 73 2c 20 73 6f 20 65 61  scriptors, so ea
66c0: 63 68 20 75 6e 69 78 46 69 6c 65 0a 2a 2a 20 73  ch unixFile.** s
66d0: 74 72 75 63 74 75 72 65 20 63 6f 6e 74 61 69 6e  tructure contain
66e0: 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61  s a pointer to a
66f0: 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68  n instance of th
6700: 69 73 20 6f 62 6a 65 63 74 20 61 6e 64 20 74 68  is object and th
6710: 69 73 0a 2a 2a 20 6f 62 6a 65 63 74 20 6b 65 65  is.** object kee
6720: 70 73 20 61 20 63 6f 75 6e 74 20 6f 66 20 74 68  ps a count of th
6730: 65 20 6e 75 6d 62 65 72 20 6f 66 20 75 6e 69 78  e number of unix
6740: 46 69 6c 65 20 70 6f 69 6e 74 69 6e 67 20 74 6f  File pointing to
6750: 20 69 74 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 75   it..*/.struct u
6760: 6e 69 78 4c 6f 63 6b 49 6e 66 6f 20 7b 0a 20 20  nixLockInfo {.  
6770: 73 74 72 75 63 74 20 75 6e 69 78 4c 6f 63 6b 4b  struct unixLockK
6780: 65 79 20 6c 6f 63 6b 4b 65 79 3b 20 20 20 20 20  ey lockKey;     
6790: 2f 2a 20 54 68 65 20 6c 6f 6f 6b 75 70 20 6b 65  /* The lookup ke
67a0: 79 20 2a 2f 0a 20 20 69 6e 74 20 63 6e 74 3b 20  y */.  int cnt; 
67b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
67c0: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
67d0: 20 6f 66 20 53 48 41 52 45 44 20 6c 6f 63 6b 73   of SHARED locks
67e0: 20 68 65 6c 64 20 2a 2f 0a 20 20 69 6e 74 20 6c   held */.  int l
67f0: 6f 63 6b 74 79 70 65 3b 20 20 20 20 20 20 20 20  ocktype;        
6800: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e             /* On
6810: 65 20 6f 66 20 53 48 41 52 45 44 5f 4c 4f 43 4b  e of SHARED_LOCK
6820: 2c 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20  , RESERVED_LOCK 
6830: 65 74 63 2e 20 2a 2f 0a 20 20 69 6e 74 20 6e 52  etc. */.  int nR
6840: 65 66 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ef;             
6850: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
6860: 62 65 72 20 6f 66 20 70 6f 69 6e 74 65 72 73 20  ber of pointers 
6870: 74 6f 20 74 68 69 73 20 73 74 72 75 63 74 75 72  to this structur
6880: 65 20 2a 2f 0a 23 69 66 20 64 65 66 69 6e 65 64  e */.#if defined
6890: 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c  (SQLITE_ENABLE_L
68a0: 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 29 0a 20 20  OCKING_STYLE).  
68b0: 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6c 6f  unsigned long lo
68c0: 6e 67 20 73 68 61 72 65 64 42 79 74 65 3b 20 20  ng sharedByte;  
68d0: 2f 2a 20 66 6f 72 20 41 46 50 20 73 69 6d 75 6c  /* for AFP simul
68e0: 61 74 65 64 20 73 68 61 72 65 64 20 6c 6f 63 6b  ated shared lock
68f0: 20 2a 2f 0a 23 65 6e 64 69 66 0a 20 20 73 74 72   */.#endif.  str
6900: 75 63 74 20 75 6e 69 78 4c 6f 63 6b 49 6e 66 6f  uct unixLockInfo
6910: 20 2a 70 4e 65 78 74 3b 20 20 20 20 20 2f 2a 20   *pNext;     /* 
6920: 4c 69 73 74 20 6f 66 20 61 6c 6c 20 75 6e 69 78  List of all unix
6930: 4c 6f 63 6b 49 6e 66 6f 20 6f 62 6a 65 63 74 73  LockInfo objects
6940: 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 75 6e 69   */.  struct uni
6950: 78 4c 6f 63 6b 49 6e 66 6f 20 2a 70 50 72 65 76  xLockInfo *pPrev
6960: 3b 20 20 20 20 20 2f 2a 20 20 20 20 2e 2e 2e 2e  ;     /*    ....
6970: 20 64 6f 75 62 6c 79 20 6c 69 6e 6b 65 64 20 2a   doubly linked *
6980: 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 69  /.};../*.** An i
6990: 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20 66  nstance of the f
69a0: 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63 74 75  ollowing structu
69b0: 72 65 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 20  re is allocated 
69c0: 66 6f 72 20 65 61 63 68 20 6f 70 65 6e 0a 2a 2a  for each open.**
69d0: 20 69 6e 6f 64 65 2e 20 20 54 68 69 73 20 73 74   inode.  This st
69e0: 72 75 63 74 75 72 65 20 6b 65 65 70 73 20 74 72  ructure keeps tr
69f0: 61 63 6b 20 6f 66 20 74 68 65 20 6e 75 6d 62 65  ack of the numbe
6a00: 72 20 6f 66 20 6c 6f 63 6b 73 20 6f 6e 20 74 68  r of locks on th
6a10: 61 74 0a 2a 2a 20 69 6e 6f 64 65 2e 20 20 49 66  at.** inode.  If
6a20: 20 61 20 63 6c 6f 73 65 20 69 73 20 61 74 74 65   a close is atte
6a30: 6d 70 74 65 64 20 61 67 61 69 6e 73 74 20 61 6e  mpted against an
6a40: 20 69 6e 6f 64 65 20 74 68 61 74 20 69 73 20 68   inode that is h
6a50: 6f 6c 64 69 6e 67 0a 2a 2a 20 6c 6f 63 6b 73 2c  olding.** locks,
6a60: 20 74 68 65 20 63 6c 6f 73 65 20 69 73 20 64 65   the close is de
6a70: 66 65 72 72 65 64 20 75 6e 74 69 6c 20 61 6c 6c  ferred until all
6a80: 20 6c 6f 63 6b 73 20 63 6c 65 61 72 20 62 79 20   locks clear by 
6a90: 61 64 64 69 6e 67 20 74 68 65 0a 2a 2a 20 66 69  adding the.** fi
6aa0: 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 74 6f  le descriptor to
6ab0: 20 62 65 20 63 6c 6f 73 65 64 20 74 6f 20 74 68   be closed to th
6ac0: 65 20 70 65 6e 64 69 6e 67 20 6c 69 73 74 2e 0a  e pending list..
6ad0: 2a 2a 0a 2a 2a 20 54 4f 44 4f 3a 20 20 43 6f 6e  **.** TODO:  Con
6ae0: 73 69 64 65 72 20 63 68 61 6e 67 69 6e 67 20 74  sider changing t
6af0: 68 69 73 20 73 6f 20 74 68 61 74 20 74 68 65 72  his so that ther
6b00: 65 20 69 73 20 6f 6e 6c 79 20 61 20 73 69 6e 67  e is only a sing
6b10: 6c 65 20 66 69 6c 65 0a 2a 2a 20 64 65 73 63 72  le file.** descr
6b20: 69 70 74 6f 72 20 66 6f 72 20 65 61 63 68 20 6f  iptor for each o
6b30: 70 65 6e 20 66 69 6c 65 2c 20 65 76 65 6e 20 77  pen file, even w
6b40: 68 65 6e 20 69 74 20 69 73 20 6f 70 65 6e 65 64  hen it is opened
6b50: 20 6d 75 6c 74 69 70 6c 65 20 74 69 6d 65 73 2e   multiple times.
6b60: 0a 2a 2a 20 54 68 65 20 63 6c 6f 73 65 28 29 20  .** The close() 
6b70: 73 79 73 74 65 6d 20 63 61 6c 6c 20 77 6f 75 6c  system call woul
6b80: 64 20 6f 6e 6c 79 20 6f 63 63 75 72 20 77 68 65  d only occur whe
6b90: 6e 20 74 68 65 20 6c 61 73 74 20 64 61 74 61 62  n the last datab
6ba0: 61 73 65 0a 2a 2a 20 75 73 69 6e 67 20 74 68 65  ase.** using the
6bb0: 20 66 69 6c 65 20 63 6c 6f 73 65 73 2e 0a 2a 2f   file closes..*/
6bc0: 0a 73 74 72 75 63 74 20 75 6e 69 78 4f 70 65 6e  .struct unixOpen
6bd0: 43 6e 74 20 7b 0a 20 20 73 74 72 75 63 74 20 75  Cnt {.  struct u
6be0: 6e 69 78 46 69 6c 65 49 64 20 66 69 6c 65 49 64  nixFileId fileId
6bf0: 3b 20 20 20 2f 2a 20 54 68 65 20 6c 6f 6f 6b 75  ;   /* The looku
6c00: 70 20 6b 65 79 20 2a 2f 0a 20 20 69 6e 74 20 6e  p key */.  int n
6c10: 52 65 66 3b 20 20 20 20 20 20 20 20 20 20 20 20  Ref;            
6c20: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
6c30: 20 6f 66 20 70 6f 69 6e 74 65 72 73 20 74 6f 20   of pointers to 
6c40: 74 68 69 73 20 73 74 72 75 63 74 75 72 65 20 2a  this structure *
6c50: 2f 0a 20 20 69 6e 74 20 6e 4c 6f 63 6b 3b 20 20  /.  int nLock;  
6c60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6c70: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6f 75 74  /* Number of out
6c80: 73 74 61 6e 64 69 6e 67 20 6c 6f 63 6b 73 20 2a  standing locks *
6c90: 2f 0a 20 20 55 6e 69 78 55 6e 75 73 65 64 46 64  /.  UnixUnusedFd
6ca0: 20 2a 70 55 6e 75 73 65 64 3b 20 20 20 20 20 20   *pUnused;      
6cb0: 2f 2a 20 55 6e 75 73 65 64 20 66 69 6c 65 20 64  /* Unused file d
6cc0: 65 73 63 72 69 70 74 6f 72 73 20 74 6f 20 63 6c  escriptors to cl
6cd0: 6f 73 65 20 2a 2f 0a 23 69 66 20 4f 53 5f 56 58  ose */.#if OS_VX
6ce0: 57 4f 52 4b 53 0a 20 20 73 65 6d 5f 74 20 2a 70  WORKS.  sem_t *p
6cf0: 53 65 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20  Sem;            
6d00: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65           /* Name
6d10: 64 20 50 4f 53 49 58 20 73 65 6d 61 70 68 6f 72  d POSIX semaphor
6d20: 65 20 2a 2f 0a 20 20 63 68 61 72 20 61 53 65 6d  e */.  char aSem
6d30: 4e 61 6d 65 5b 4d 41 58 5f 50 41 54 48 4e 41 4d  Name[MAX_PATHNAM
6d40: 45 2b 32 5d 3b 20 20 20 2f 2a 20 4e 61 6d 65 20  E+2];   /* Name 
6d50: 6f 66 20 74 68 61 74 20 73 65 6d 61 70 68 6f 72  of that semaphor
6d60: 65 20 2a 2f 0a 23 65 6e 64 69 66 0a 20 20 73 74  e */.#endif.  st
6d70: 72 75 63 74 20 75 6e 69 78 4f 70 65 6e 43 6e 74  ruct unixOpenCnt
6d80: 20 2a 70 4e 65 78 74 2c 20 2a 70 50 72 65 76 3b   *pNext, *pPrev;
6d90: 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 61 6c     /* List of al
6da0: 6c 20 75 6e 69 78 4f 70 65 6e 43 6e 74 20 6f 62  l unixOpenCnt ob
6db0: 6a 65 63 74 73 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a  jects */.};../*.
6dc0: 2a 2a 20 4c 69 73 74 73 20 6f 66 20 61 6c 6c 20  ** Lists of all 
6dd0: 75 6e 69 78 4c 6f 63 6b 49 6e 66 6f 20 61 6e 64  unixLockInfo and
6de0: 20 75 6e 69 78 4f 70 65 6e 43 6e 74 20 6f 62 6a   unixOpenCnt obj
6df0: 65 63 74 73 2e 20 20 54 68 65 73 65 20 75 73 65  ects.  These use
6e00: 64 20 74 6f 20 62 65 20 68 61 73 68 0a 2a 2a 20  d to be hash.** 
6e10: 74 61 62 6c 65 73 2e 20 20 42 75 74 20 74 68 65  tables.  But the
6e20: 20 6e 75 6d 62 65 72 20 6f 66 20 6f 62 6a 65 63   number of objec
6e30: 74 73 20 69 73 20 72 61 72 65 6c 79 20 6d 6f 72  ts is rarely mor
6e40: 65 20 74 68 61 6e 20 61 20 64 6f 7a 65 6e 20 61  e than a dozen a
6e50: 6e 64 0a 2a 2a 20 6e 65 76 65 72 20 65 78 63 65  nd.** never exce
6e60: 65 64 73 20 61 20 66 65 77 20 74 68 6f 75 73 61  eds a few thousa
6e70: 6e 64 2e 20 20 41 6e 64 20 6c 6f 6f 6b 75 70 20  nd.  And lookup 
6e80: 69 73 20 6e 6f 74 20 6f 6e 20 61 20 63 72 69 74  is not on a crit
6e90: 69 63 61 6c 0a 2a 2a 20 70 61 74 68 20 73 6f 20  ical.** path so 
6ea0: 61 20 73 69 6d 70 6c 65 20 6c 69 6e 6b 65 64 20  a simple linked 
6eb0: 6c 69 73 74 20 77 69 6c 6c 20 73 75 66 66 69 63  list will suffic
6ec0: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 73 74 72  e..*/.static str
6ed0: 75 63 74 20 75 6e 69 78 4c 6f 63 6b 49 6e 66 6f  uct unixLockInfo
6ee0: 20 2a 6c 6f 63 6b 4c 69 73 74 20 3d 20 30 3b 0a   *lockList = 0;.
6ef0: 73 74 61 74 69 63 20 73 74 72 75 63 74 20 75 6e  static struct un
6f00: 69 78 4f 70 65 6e 43 6e 74 20 2a 6f 70 65 6e 4c  ixOpenCnt *openL
6f10: 69 73 74 20 3d 20 30 3b 0a 0a 2f 2a 0a 2a 2a 20  ist = 0;../*.** 
6f20: 54 68 69 73 20 76 61 72 69 61 62 6c 65 20 72 65  This variable re
6f30: 6d 65 6d 62 65 72 73 20 77 68 65 74 68 65 72 20  members whether 
6f40: 6f 72 20 6e 6f 74 20 74 68 72 65 61 64 73 20 63  or not threads c
6f50: 61 6e 20 6f 76 65 72 72 69 64 65 20 65 61 63 68  an override each
6f60: 20 6f 74 68 65 72 73 0a 2a 2a 20 6c 6f 63 6b 73   others.** locks
6f70: 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 30 3a 20 20 4e  ..**.**    0:  N
6f80: 6f 2e 20 20 54 68 72 65 61 64 73 20 63 61 6e 6e  o.  Threads cann
6f90: 6f 74 20 6f 76 65 72 72 69 64 65 20 65 61 63 68  ot override each
6fa0: 20 6f 74 68 65 72 73 20 6c 6f 63 6b 73 2e 20 20   others locks.  
6fb0: 28 4c 69 6e 75 78 54 68 72 65 61 64 73 29 0a 2a  (LinuxThreads).*
6fc0: 2a 20 20 20 20 31 3a 20 20 59 65 73 2e 20 20 54  *    1:  Yes.  T
6fd0: 68 72 65 61 64 73 20 63 61 6e 20 6f 76 65 72 72  hreads can overr
6fe0: 69 64 65 20 65 61 63 68 20 6f 74 68 65 72 73 20  ide each others 
6ff0: 6c 6f 63 6b 73 2e 20 20 28 50 6f 73 69 78 20 26  locks.  (Posix &
7000: 20 4e 4c 50 54 29 0a 2a 2a 20 20 20 2d 31 3a 20   NLPT).**   -1: 
7010: 20 57 65 20 64 6f 6e 27 74 20 6b 6e 6f 77 20 79   We don't know y
7020: 65 74 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 20 73 6f 6d  et..**.** On som
7030: 65 20 73 79 73 74 65 6d 73 2c 20 77 65 20 6b 6e  e systems, we kn
7040: 6f 77 20 61 74 20 63 6f 6d 70 69 6c 65 2d 74 69  ow at compile-ti
7050: 6d 65 20 69 66 20 74 68 72 65 61 64 73 20 63 61  me if threads ca
7060: 6e 20 6f 76 65 72 72 69 64 65 20 65 61 63 68 0a  n override each.
7070: 2a 2a 20 6f 74 68 65 72 73 20 6c 6f 63 6b 73 2e  ** others locks.
7080: 20 20 4f 6e 20 74 68 6f 73 65 20 73 79 73 74 65    On those syste
7090: 6d 73 2c 20 74 68 65 20 53 51 4c 49 54 45 5f 54  ms, the SQLITE_T
70a0: 48 52 45 41 44 5f 4f 56 45 52 52 49 44 45 5f 4c  HREAD_OVERRIDE_L
70b0: 4f 43 4b 20 6d 61 63 72 6f 0a 2a 2a 20 77 69 6c  OCK macro.** wil
70c0: 6c 20 62 65 20 73 65 74 20 61 70 70 72 6f 70 72  l be set appropr
70d0: 69 61 74 65 6c 79 2e 20 20 4f 6e 20 6f 74 68 65  iately.  On othe
70e0: 72 20 73 79 73 74 65 6d 73 2c 20 77 65 20 68 61  r systems, we ha
70f0: 76 65 20 74 6f 20 63 68 65 63 6b 20 61 74 0a 2a  ve to check at.*
7100: 2a 20 72 75 6e 74 69 6d 65 2e 20 20 4f 6e 20 74  * runtime.  On t
7110: 68 65 73 65 20 6c 61 74 74 65 72 20 73 79 73 74  hese latter syst
7120: 65 6d 73 2c 20 53 51 4c 54 49 45 5f 54 48 52 45  ems, SQLTIE_THRE
7130: 41 44 5f 4f 56 45 52 52 49 44 45 5f 4c 4f 43 4b  AD_OVERRIDE_LOCK
7140: 20 69 73 0a 2a 2a 20 75 6e 64 65 66 69 6e 65 64   is.** undefined
7150: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 76 61 72  ..**.** This var
7160: 69 61 62 6c 65 20 6e 6f 72 6d 61 6c 6c 79 20 68  iable normally h
7170: 61 73 20 66 69 6c 65 20 73 63 6f 70 65 20 6f 6e  as file scope on
7180: 6c 79 2e 20 20 42 75 74 20 64 75 72 69 6e 67 20  ly.  But during 
7190: 74 65 73 74 69 6e 67 2c 20 77 65 20 6d 61 6b 65  testing, we make
71a0: 0a 2a 2a 20 69 74 20 61 20 67 6c 6f 62 61 6c 20  .** it a global 
71b0: 73 6f 20 74 68 61 74 20 74 68 65 20 74 65 73 74  so that the test
71c0: 20 63 6f 64 65 20 63 61 6e 20 63 68 61 6e 67 65   code can change
71d0: 20 69 74 73 20 76 61 6c 75 65 20 69 6e 20 6f 72   its value in or
71e0: 64 65 72 20 74 6f 20 76 65 72 69 66 79 0a 2a 2a  der to verify.**
71f0: 20 74 68 61 74 20 74 68 65 20 72 69 67 68 74 20   that the right 
7200: 73 74 75 66 66 20 68 61 70 70 65 6e 73 20 69 6e  stuff happens in
7210: 20 65 69 74 68 65 72 20 63 61 73 65 2e 0a 2a 2f   either case..*/
7220: 0a 23 69 66 20 53 51 4c 49 54 45 5f 54 48 52 45  .#if SQLITE_THRE
7230: 41 44 53 41 46 45 20 26 26 20 64 65 66 69 6e 65  ADSAFE && define
7240: 64 28 5f 5f 6c 69 6e 75 78 5f 5f 29 0a 23 20 20  d(__linux__).#  
7250: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 54 48  ifndef SQLITE_TH
7260: 52 45 41 44 5f 4f 56 45 52 52 49 44 45 5f 4c 4f  READ_OVERRIDE_LO
7270: 43 4b 0a 23 20 20 20 20 64 65 66 69 6e 65 20 53  CK.#    define S
7280: 51 4c 49 54 45 5f 54 48 52 45 41 44 5f 4f 56 45  QLITE_THREAD_OVE
7290: 52 52 49 44 45 5f 4c 4f 43 4b 20 2d 31 0a 23 20  RRIDE_LOCK -1.# 
72a0: 20 65 6e 64 69 66 0a 23 20 20 69 66 64 65 66 20   endif.#  ifdef 
72b0: 53 51 4c 49 54 45 5f 54 45 53 54 0a 69 6e 74 20  SQLITE_TEST.int 
72c0: 74 68 72 65 61 64 73 4f 76 65 72 72 69 64 65 45  threadsOverrideE
72d0: 61 63 68 4f 74 68 65 72 73 4c 6f 63 6b 73 20 3d  achOthersLocks =
72e0: 20 53 51 4c 49 54 45 5f 54 48 52 45 41 44 5f 4f   SQLITE_THREAD_O
72f0: 56 45 52 52 49 44 45 5f 4c 4f 43 4b 3b 0a 23 20  VERRIDE_LOCK;.# 
7300: 20 65 6c 73 65 0a 73 74 61 74 69 63 20 69 6e 74   else.static int
7310: 20 74 68 72 65 61 64 73 4f 76 65 72 72 69 64 65   threadsOverride
7320: 45 61 63 68 4f 74 68 65 72 73 4c 6f 63 6b 73 20  EachOthersLocks 
7330: 3d 20 53 51 4c 49 54 45 5f 54 48 52 45 41 44 5f  = SQLITE_THREAD_
7340: 4f 56 45 52 52 49 44 45 5f 4c 4f 43 4b 3b 0a 23  OVERRIDE_LOCK;.#
7350: 20 20 65 6e 64 69 66 0a 23 65 6e 64 69 66 0a 0a    endif.#endif..
7360: 2f 2a 0a 2a 2a 20 54 68 69 73 20 73 74 72 75 63  /*.** This struc
7370: 74 75 72 65 20 68 6f 6c 64 73 20 69 6e 66 6f 72  ture holds infor
7380: 6d 61 74 69 6f 6e 20 70 61 73 73 65 64 20 69 6e  mation passed in
7390: 74 6f 20 69 6e 64 69 76 69 64 75 61 6c 20 74 65  to individual te
73a0: 73 74 0a 2a 2a 20 74 68 72 65 61 64 73 20 62 79  st.** threads by
73b0: 20 74 68 65 20 74 65 73 74 54 68 72 65 61 64 4c   the testThreadL
73c0: 6f 63 6b 69 6e 67 42 65 68 61 76 69 6f 72 28 29  ockingBehavior()
73d0: 20 72 6f 75 74 69 6e 65 2e 0a 2a 2f 0a 73 74 72   routine..*/.str
73e0: 75 63 74 20 74 68 72 65 61 64 54 65 73 74 44 61  uct threadTestDa
73f0: 74 61 20 7b 0a 20 20 69 6e 74 20 66 64 3b 20 20  ta {.  int fd;  
7400: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
7410: 20 46 69 6c 65 20 74 6f 20 62 65 20 6c 6f 63 6b   File to be lock
7420: 65 64 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 66  ed */.  struct f
7430: 6c 6f 63 6b 20 6c 6f 63 6b 3b 20 20 20 20 20 2f  lock lock;     /
7440: 2a 20 54 68 65 20 6c 6f 63 6b 69 6e 67 20 6f 70  * The locking op
7450: 65 72 61 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74  eration */.  int
7460: 20 72 65 73 75 6c 74 3b 20 20 20 20 20 20 20 20   result;        
7470: 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 20 6f 66      /* Result of
7480: 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6f 70 65   the locking ope
7490: 72 61 74 69 6f 6e 20 2a 2f 0a 7d 3b 0a 0a 23 69  ration */.};..#i
74a0: 66 20 53 51 4c 49 54 45 5f 54 48 52 45 41 44 53  f SQLITE_THREADS
74b0: 41 46 45 20 26 26 20 64 65 66 69 6e 65 64 28 5f  AFE && defined(_
74c0: 5f 6c 69 6e 75 78 5f 5f 29 0a 2f 2a 0a 2a 2a 20  _linux__)./*.** 
74d0: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
74e0: 20 75 73 65 64 20 61 73 20 74 68 65 20 6d 61 69   used as the mai
74f0: 6e 20 72 6f 75 74 69 6e 65 20 66 6f 72 20 61 20  n routine for a 
7500: 74 68 72 65 61 64 20 6c 61 75 6e 63 68 65 64 20  thread launched 
7510: 62 79 0a 2a 2a 20 74 65 73 74 54 68 72 65 61 64  by.** testThread
7520: 4c 6f 63 6b 69 6e 67 42 65 68 61 76 69 6f 72 28  LockingBehavior(
7530: 29 2e 20 49 74 20 74 65 73 74 73 20 77 68 65 74  ). It tests whet
7540: 68 65 72 20 74 68 65 20 73 68 61 72 65 64 2d 6c  her the shared-l
7550: 6f 63 6b 20 6f 62 74 61 69 6e 65 64 0a 2a 2a 20  ock obtained.** 
7560: 62 79 20 74 68 65 20 6d 61 69 6e 20 74 68 72 65  by the main thre
7570: 61 64 20 69 6e 20 74 65 73 74 54 68 72 65 61 64  ad in testThread
7580: 4c 6f 63 6b 69 6e 67 42 65 68 61 76 69 6f 72 28  LockingBehavior(
7590: 29 20 63 6f 6e 66 6c 69 63 74 73 20 77 69 74 68  ) conflicts with
75a0: 20 61 0a 2a 2a 20 68 79 70 6f 74 68 65 74 69 63   a.** hypothetic
75b0: 61 6c 20 77 72 69 74 65 2d 6c 6f 63 6b 20 6f 62  al write-lock ob
75c0: 74 61 69 6e 65 64 20 62 79 20 74 68 69 73 20 74  tained by this t
75d0: 68 72 65 61 64 20 6f 6e 20 74 68 65 20 73 61 6d  hread on the sam
75e0: 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  e file..**.** Th
75f0: 65 20 77 72 69 74 65 2d 6c 6f 63 6b 20 69 73 20  e write-lock is 
7600: 6e 6f 74 20 61 63 74 75 61 6c 6c 79 20 61 63 71  not actually acq
7610: 75 69 72 65 64 2c 20 61 73 20 74 68 69 73 20 69  uired, as this i
7620: 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 69  s not possible i
7630: 66 20 0a 2a 2a 20 74 68 65 20 66 69 6c 65 20 69  f .** the file i
7640: 73 20 6f 70 65 6e 20 69 6e 20 72 65 61 64 2d 6f  s open in read-o
7650: 6e 6c 79 20 6d 6f 64 65 20 28 73 65 65 20 74 69  nly mode (see ti
7660: 63 6b 65 74 20 23 33 34 37 32 29 2e 0a 2a 2f 20  cket #3472)..*/ 
7670: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 2a 74 68  .static void *th
7680: 72 65 61 64 4c 6f 63 6b 69 6e 67 54 65 73 74 28  readLockingTest(
7690: 76 6f 69 64 20 2a 70 41 72 67 29 7b 0a 20 20 73  void *pArg){.  s
76a0: 74 72 75 63 74 20 74 68 72 65 61 64 54 65 73 74  truct threadTest
76b0: 44 61 74 61 20 2a 70 44 61 74 61 20 3d 20 28 73  Data *pData = (s
76c0: 74 72 75 63 74 20 74 68 72 65 61 64 54 65 73 74  truct threadTest
76d0: 44 61 74 61 2a 29 70 41 72 67 3b 0a 20 20 70 44  Data*)pArg;.  pD
76e0: 61 74 61 2d 3e 72 65 73 75 6c 74 20 3d 20 66 63  ata->result = fc
76f0: 6e 74 6c 28 70 44 61 74 61 2d 3e 66 64 2c 20 46  ntl(pData->fd, F
7700: 5f 47 45 54 4c 4b 2c 20 26 70 44 61 74 61 2d 3e  _GETLK, &pData->
7710: 6c 6f 63 6b 29 3b 0a 20 20 72 65 74 75 72 6e 20  lock);.  return 
7720: 70 41 72 67 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f  pArg;.}.#endif /
7730: 2a 20 53 51 4c 49 54 45 5f 54 48 52 45 41 44 53  * SQLITE_THREADS
7740: 41 46 45 20 26 26 20 64 65 66 69 6e 65 64 28 5f  AFE && defined(_
7750: 5f 6c 69 6e 75 78 5f 5f 29 20 2a 2f 0a 0a 0a 23  _linux__) */...#
7760: 69 66 20 53 51 4c 49 54 45 5f 54 48 52 45 41 44  if SQLITE_THREAD
7770: 53 41 46 45 20 26 26 20 64 65 66 69 6e 65 64 28  SAFE && defined(
7780: 5f 5f 6c 69 6e 75 78 5f 5f 29 0a 2f 2a 0a 2a 2a  __linux__)./*.**
7790: 20 54 68 69 73 20 70 72 6f 63 65 64 75 72 65 20   This procedure 
77a0: 61 74 74 65 6d 70 74 73 20 74 6f 20 64 65 74 65  attempts to dete
77b0: 72 6d 69 6e 65 20 77 68 65 74 68 65 72 20 6f 72  rmine whether or
77c0: 20 6e 6f 74 20 74 68 72 65 61 64 73 0a 2a 2a 20   not threads.** 
77d0: 63 61 6e 20 6f 76 65 72 72 69 64 65 20 65 61 63  can override eac
77e0: 68 20 6f 74 68 65 72 73 20 6c 6f 63 6b 73 20 74  h others locks t
77f0: 68 65 6e 20 73 65 74 73 20 74 68 65 20 0a 2a 2a  hen sets the .**
7800: 20 74 68 72 65 61 64 73 4f 76 65 72 72 69 64 65   threadsOverride
7810: 45 61 63 68 4f 74 68 65 72 73 4c 6f 63 6b 73 20  EachOthersLocks 
7820: 76 61 72 69 61 62 6c 65 20 61 70 70 72 6f 70 72  variable appropr
7830: 69 61 74 65 6c 79 2e 0a 2a 2f 0a 73 74 61 74 69  iately..*/.stati
7840: 63 20 76 6f 69 64 20 74 65 73 74 54 68 72 65 61  c void testThrea
7850: 64 4c 6f 63 6b 69 6e 67 42 65 68 61 76 69 6f 72  dLockingBehavior
7860: 28 69 6e 74 20 66 64 5f 6f 72 69 67 29 7b 0a 20  (int fd_orig){. 
7870: 20 69 6e 74 20 66 64 3b 0a 20 20 69 6e 74 20 72   int fd;.  int r
7880: 63 3b 0a 20 20 73 74 72 75 63 74 20 74 68 72 65  c;.  struct thre
7890: 61 64 54 65 73 74 44 61 74 61 20 64 3b 0a 20 20  adTestData d;.  
78a0: 73 74 72 75 63 74 20 66 6c 6f 63 6b 20 6c 3b 0a  struct flock l;.
78b0: 20 20 70 74 68 72 65 61 64 5f 74 20 74 3b 0a 0a    pthread_t t;..
78c0: 20 20 66 64 20 3d 20 64 75 70 28 66 64 5f 6f 72    fd = dup(fd_or
78d0: 69 67 29 3b 0a 20 20 69 66 28 20 66 64 3c 30 20  ig);.  if( fd<0 
78e0: 29 20 72 65 74 75 72 6e 3b 0a 20 20 6d 65 6d 73  ) return;.  mems
78f0: 65 74 28 26 6c 2c 20 30 2c 20 73 69 7a 65 6f 66  et(&l, 0, sizeof
7900: 28 6c 29 29 3b 0a 20 20 6c 2e 6c 5f 74 79 70 65  (l));.  l.l_type
7910: 20 3d 20 46 5f 52 44 4c 43 4b 3b 0a 20 20 6c 2e   = F_RDLCK;.  l.
7920: 6c 5f 6c 65 6e 20 3d 20 31 3b 0a 20 20 6c 2e 6c  l_len = 1;.  l.l
7930: 5f 73 74 61 72 74 20 3d 20 30 3b 0a 20 20 6c 2e  _start = 0;.  l.
7940: 6c 5f 77 68 65 6e 63 65 20 3d 20 53 45 45 4b 5f  l_whence = SEEK_
7950: 53 45 54 3b 0a 20 20 72 63 20 3d 20 66 63 6e 74  SET;.  rc = fcnt
7960: 6c 28 66 64 5f 6f 72 69 67 2c 20 46 5f 53 45 54  l(fd_orig, F_SET
7970: 4c 4b 2c 20 26 6c 29 3b 0a 20 20 69 66 28 20 72  LK, &l);.  if( r
7980: 63 21 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  c!=0 ) return;. 
7990: 20 6d 65 6d 73 65 74 28 26 64 2c 20 30 2c 20 73   memset(&d, 0, s
79a0: 69 7a 65 6f 66 28 64 29 29 3b 0a 20 20 64 2e 66  izeof(d));.  d.f
79b0: 64 20 3d 20 66 64 3b 0a 20 20 64 2e 6c 6f 63 6b  d = fd;.  d.lock
79c0: 20 3d 20 6c 3b 0a 20 20 64 2e 6c 6f 63 6b 2e 6c   = l;.  d.lock.l
79d0: 5f 74 79 70 65 20 3d 20 46 5f 57 52 4c 43 4b 3b  _type = F_WRLCK;
79e0: 0a 20 20 69 66 28 20 70 74 68 72 65 61 64 5f 63  .  if( pthread_c
79f0: 72 65 61 74 65 28 26 74 2c 20 30 2c 20 74 68 72  reate(&t, 0, thr
7a00: 65 61 64 4c 6f 63 6b 69 6e 67 54 65 73 74 2c 20  eadLockingTest, 
7a10: 26 64 29 3d 3d 30 20 29 7b 0a 20 20 20 20 70 74  &d)==0 ){.    pt
7a20: 68 72 65 61 64 5f 6a 6f 69 6e 28 74 2c 20 30 29  hread_join(t, 0)
7a30: 3b 0a 20 20 7d 0a 20 20 63 6c 6f 73 65 28 66 64  ;.  }.  close(fd
7a40: 29 3b 0a 20 20 69 66 28 20 64 2e 72 65 73 75 6c  );.  if( d.resul
7a50: 74 21 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  t!=0 ) return;. 
7a60: 20 74 68 72 65 61 64 73 4f 76 65 72 72 69 64 65   threadsOverride
7a70: 45 61 63 68 4f 74 68 65 72 73 4c 6f 63 6b 73 20  EachOthersLocks 
7a80: 3d 20 28 64 2e 6c 6f 63 6b 2e 6c 5f 74 79 70 65  = (d.lock.l_type
7a90: 3d 3d 46 5f 55 4e 4c 43 4b 29 3b 0a 7d 0a 23 65  ==F_UNLCK);.}.#e
7aa0: 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 54  ndif /* SQLITE_T
7ab0: 48 52 45 41 44 53 41 46 45 20 26 26 20 64 65 66  HREADSAFE && def
7ac0: 69 6e 65 64 28 5f 5f 6c 69 6e 75 78 5f 5f 29 20  ined(__linux__) 
7ad0: 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73  */../*.** Releas
7ae0: 65 20 61 20 75 6e 69 78 4c 6f 63 6b 49 6e 66 6f  e a unixLockInfo
7af0: 20 73 74 72 75 63 74 75 72 65 20 70 72 65 76 69   structure previ
7b00: 6f 75 73 6c 79 20 61 6c 6c 6f 63 61 74 65 64 20  ously allocated 
7b10: 62 79 20 66 69 6e 64 4c 6f 63 6b 49 6e 66 6f 28  by findLockInfo(
7b20: 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d 75 74  )..**.** The mut
7b30: 65 78 20 65 6e 74 65 72 65 64 20 75 73 69 6e 67  ex entered using
7b40: 20 74 68 65 20 75 6e 69 78 45 6e 74 65 72 4d 75   the unixEnterMu
7b50: 74 65 78 28 29 20 66 75 6e 63 74 69 6f 6e 20 6d  tex() function m
7b60: 75 73 74 20 62 65 20 68 65 6c 64 0a 2a 2a 20 77  ust be held.** w
7b70: 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f  hen this functio
7b80: 6e 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2f 0a  n is called..*/.
7b90: 73 74 61 74 69 63 20 76 6f 69 64 20 72 65 6c 65  static void rele
7ba0: 61 73 65 4c 6f 63 6b 49 6e 66 6f 28 73 74 72 75  aseLockInfo(stru
7bb0: 63 74 20 75 6e 69 78 4c 6f 63 6b 49 6e 66 6f 20  ct unixLockInfo 
7bc0: 2a 70 4c 6f 63 6b 29 7b 0a 20 20 61 73 73 65 72  *pLock){.  asser
7bd0: 74 28 20 75 6e 69 78 4d 75 74 65 78 48 65 6c 64  t( unixMutexHeld
7be0: 28 29 20 29 3b 0a 20 20 69 66 28 20 70 4c 6f 63  () );.  if( pLoc
7bf0: 6b 20 29 7b 0a 20 20 20 20 70 4c 6f 63 6b 2d 3e  k ){.    pLock->
7c00: 6e 52 65 66 2d 2d 3b 0a 20 20 20 20 69 66 28 20  nRef--;.    if( 
7c10: 70 4c 6f 63 6b 2d 3e 6e 52 65 66 3d 3d 30 20 29  pLock->nRef==0 )
7c20: 7b 0a 20 20 20 20 20 20 69 66 28 20 70 4c 6f 63  {.      if( pLoc
7c30: 6b 2d 3e 70 50 72 65 76 20 29 7b 0a 20 20 20 20  k->pPrev ){.    
7c40: 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 6f 63      assert( pLoc
7c50: 6b 2d 3e 70 50 72 65 76 2d 3e 70 4e 65 78 74 3d  k->pPrev->pNext=
7c60: 3d 70 4c 6f 63 6b 20 29 3b 0a 20 20 20 20 20 20  =pLock );.      
7c70: 20 20 70 4c 6f 63 6b 2d 3e 70 50 72 65 76 2d 3e    pLock->pPrev->
7c80: 70 4e 65 78 74 20 3d 20 70 4c 6f 63 6b 2d 3e 70  pNext = pLock->p
7c90: 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d 65 6c 73  Next;.      }els
7ca0: 65 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  e{.        asser
7cb0: 74 28 20 6c 6f 63 6b 4c 69 73 74 3d 3d 70 4c 6f  t( lockList==pLo
7cc0: 63 6b 20 29 3b 0a 20 20 20 20 20 20 20 20 6c 6f  ck );.        lo
7cd0: 63 6b 4c 69 73 74 20 3d 20 70 4c 6f 63 6b 2d 3e  ckList = pLock->
7ce0: 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d 0a 20  pNext;.      }. 
7cf0: 20 20 20 20 20 69 66 28 20 70 4c 6f 63 6b 2d 3e       if( pLock->
7d00: 70 4e 65 78 74 20 29 7b 0a 20 20 20 20 20 20 20  pNext ){.       
7d10: 20 61 73 73 65 72 74 28 20 70 4c 6f 63 6b 2d 3e   assert( pLock->
7d20: 70 4e 65 78 74 2d 3e 70 50 72 65 76 3d 3d 70 4c  pNext->pPrev==pL
7d30: 6f 63 6b 20 29 3b 0a 20 20 20 20 20 20 20 20 70  ock );.        p
7d40: 4c 6f 63 6b 2d 3e 70 4e 65 78 74 2d 3e 70 50 72  Lock->pNext->pPr
7d50: 65 76 20 3d 20 70 4c 6f 63 6b 2d 3e 70 50 72 65  ev = pLock->pPre
7d60: 76 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  v;.      }.     
7d70: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 4c   sqlite3_free(pL
7d80: 6f 63 6b 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ock);.    }.  }.
7d90: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73 65  }../*.** Release
7da0: 20 61 20 75 6e 69 78 4f 70 65 6e 43 6e 74 20 73   a unixOpenCnt s
7db0: 74 72 75 63 74 75 72 65 20 70 72 65 76 69 6f 75  tructure previou
7dc0: 73 6c 79 20 61 6c 6c 6f 63 61 74 65 64 20 62 79  sly allocated by
7dd0: 20 66 69 6e 64 4c 6f 63 6b 49 6e 66 6f 28 29 2e   findLockInfo().
7de0: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d 75 74 65 78  .**.** The mutex
7df0: 20 65 6e 74 65 72 65 64 20 75 73 69 6e 67 20 74   entered using t
7e00: 68 65 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65  he unixEnterMute
7e10: 78 28 29 20 66 75 6e 63 74 69 6f 6e 20 6d 75 73  x() function mus
7e20: 74 20 62 65 20 68 65 6c 64 0a 2a 2a 20 77 68 65  t be held.** whe
7e30: 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  n this function 
7e40: 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2f 0a 73 74  is called..*/.st
7e50: 61 74 69 63 20 76 6f 69 64 20 72 65 6c 65 61 73  atic void releas
7e60: 65 4f 70 65 6e 43 6e 74 28 73 74 72 75 63 74 20  eOpenCnt(struct 
7e70: 75 6e 69 78 4f 70 65 6e 43 6e 74 20 2a 70 4f 70  unixOpenCnt *pOp
7e80: 65 6e 29 7b 0a 20 20 61 73 73 65 72 74 28 20 75  en){.  assert( u
7e90: 6e 69 78 4d 75 74 65 78 48 65 6c 64 28 29 20 29  nixMutexHeld() )
7ea0: 3b 0a 20 20 69 66 28 20 70 4f 70 65 6e 20 29 7b  ;.  if( pOpen ){
7eb0: 0a 20 20 20 20 70 4f 70 65 6e 2d 3e 6e 52 65 66  .    pOpen->nRef
7ec0: 2d 2d 3b 0a 20 20 20 20 69 66 28 20 70 4f 70 65  --;.    if( pOpe
7ed0: 6e 2d 3e 6e 52 65 66 3d 3d 30 20 29 7b 0a 20 20  n->nRef==0 ){.  
7ee0: 20 20 20 20 69 66 28 20 70 4f 70 65 6e 2d 3e 70      if( pOpen->p
7ef0: 50 72 65 76 20 29 7b 0a 20 20 20 20 20 20 20 20  Prev ){.        
7f00: 61 73 73 65 72 74 28 20 70 4f 70 65 6e 2d 3e 70  assert( pOpen->p
7f10: 50 72 65 76 2d 3e 70 4e 65 78 74 3d 3d 70 4f 70  Prev->pNext==pOp
7f20: 65 6e 20 29 3b 0a 20 20 20 20 20 20 20 20 70 4f  en );.        pO
7f30: 70 65 6e 2d 3e 70 50 72 65 76 2d 3e 70 4e 65 78  pen->pPrev->pNex
7f40: 74 20 3d 20 70 4f 70 65 6e 2d 3e 70 4e 65 78 74  t = pOpen->pNext
7f50: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
7f60: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6f         assert( o
7f70: 70 65 6e 4c 69 73 74 3d 3d 70 4f 70 65 6e 20 29  penList==pOpen )
7f80: 3b 0a 20 20 20 20 20 20 20 20 6f 70 65 6e 4c 69  ;.        openLi
7f90: 73 74 20 3d 20 70 4f 70 65 6e 2d 3e 70 4e 65 78  st = pOpen->pNex
7fa0: 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  t;.      }.     
7fb0: 20 69 66 28 20 70 4f 70 65 6e 2d 3e 70 4e 65 78   if( pOpen->pNex
7fc0: 74 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73  t ){.        ass
7fd0: 65 72 74 28 20 70 4f 70 65 6e 2d 3e 70 4e 65 78  ert( pOpen->pNex
7fe0: 74 2d 3e 70 50 72 65 76 3d 3d 70 4f 70 65 6e 20  t->pPrev==pOpen 
7ff0: 29 3b 0a 20 20 20 20 20 20 20 20 70 4f 70 65 6e  );.        pOpen
8000: 2d 3e 70 4e 65 78 74 2d 3e 70 50 72 65 76 20 3d  ->pNext->pPrev =
8010: 20 70 4f 70 65 6e 2d 3e 70 50 72 65 76 3b 0a 20   pOpen->pPrev;. 
8020: 20 20 20 20 20 7d 0a 23 69 66 20 53 51 4c 49 54       }.#if SQLIT
8030: 45 5f 54 48 52 45 41 44 53 41 46 45 20 26 26 20  E_THREADSAFE && 
8040: 64 65 66 69 6e 65 64 28 5f 5f 6c 69 6e 75 78 5f  defined(__linux_
8050: 5f 29 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  _).      assert(
8060: 20 21 70 4f 70 65 6e 2d 3e 70 55 6e 75 73 65 64   !pOpen->pUnused
8070: 20 7c 7c 20 74 68 72 65 61 64 73 4f 76 65 72 72   || threadsOverr
8080: 69 64 65 45 61 63 68 4f 74 68 65 72 73 4c 6f 63  ideEachOthersLoc
8090: 6b 73 3d 3d 30 20 29 3b 0a 23 65 6e 64 69 66 0a  ks==0 );.#endif.
80a0: 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 70 4f 70  .      /* If pOp
80b0: 65 6e 2d 3e 70 55 6e 75 73 65 64 20 69 73 20 6e  en->pUnused is n
80c0: 6f 74 20 6e 75 6c 6c 2c 20 74 68 65 6e 20 6d 65  ot null, then me
80d0: 6d 6f 72 79 20 61 6e 64 20 66 69 6c 65 2d 64 65  mory and file-de
80e0: 73 63 72 69 70 74 6f 72 73 0a 20 20 20 20 20 20  scriptors.      
80f0: 2a 2a 20 61 72 65 20 6c 65 61 6b 65 64 2e 0a 20  ** are leaked.. 
8100: 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a       **.      **
8110: 20 54 68 69 73 20 77 69 6c 6c 20 6f 6e 6c 79 20   This will only 
8120: 68 61 70 70 65 6e 20 69 66 2c 20 75 6e 64 65 72  happen if, under
8130: 20 4c 69 6e 75 78 74 68 72 65 61 64 73 2c 20 74   Linuxthreads, t
8140: 68 65 20 75 73 65 72 20 68 61 73 20 6f 70 65 6e  he user has open
8150: 65 64 0a 20 20 20 20 20 20 2a 2a 20 61 20 74 72  ed.      ** a tr
8160: 61 6e 73 61 63 74 69 6f 6e 20 69 6e 20 6f 6e 65  ansaction in one
8170: 20 74 68 72 65 61 64 2c 20 74 68 65 6e 20 61 74   thread, then at
8180: 74 65 6d 70 74 73 20 74 6f 20 63 6c 6f 73 65 20  tempts to close 
8190: 74 68 65 20 64 61 74 61 62 61 73 65 0a 20 20 20  the database.   
81a0: 20 20 20 2a 2a 20 68 61 6e 64 6c 65 20 66 72 6f     ** handle fro
81b0: 6d 20 61 6e 6f 74 68 65 72 20 74 68 72 65 61 64  m another thread
81c0: 20 28 77 69 74 68 6f 75 74 20 66 69 72 73 74 20   (without first 
81d0: 75 6e 6c 6f 63 6b 69 6e 67 20 74 68 65 20 64 62  unlocking the db
81e0: 20 66 69 6c 65 29 2e 0a 20 20 20 20 20 20 2a 2a   file)..      **
81f0: 20 54 68 69 73 20 69 73 20 61 20 6d 69 73 75 73   This is a misus
8200: 65 2e 20 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c  e.  */.      sql
8210: 69 74 65 33 5f 66 72 65 65 28 70 4f 70 65 6e 29  ite3_free(pOpen)
8220: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f  ;.    }.  }.}../
8230: 2a 0a 2a 2a 20 47 69 76 65 6e 20 61 20 66 69 6c  *.** Given a fil
8240: 65 20 64 65 73 63 72 69 70 74 6f 72 2c 20 6c 6f  e descriptor, lo
8250: 63 61 74 65 20 75 6e 69 78 4c 6f 63 6b 49 6e 66  cate unixLockInf
8260: 6f 20 61 6e 64 20 75 6e 69 78 4f 70 65 6e 43 6e  o and unixOpenCn
8270: 74 20 73 74 72 75 63 74 75 72 65 73 20 74 68 61  t structures tha
8280: 74 0a 2a 2a 20 64 65 73 63 72 69 62 65 73 20 74  t.** describes t
8290: 68 61 74 20 66 69 6c 65 20 64 65 73 63 72 69 70  hat file descrip
82a0: 74 6f 72 2e 20 20 43 72 65 61 74 65 20 6e 65 77  tor.  Create new
82b0: 20 6f 6e 65 73 20 69 66 20 6e 65 63 65 73 73 61   ones if necessa
82c0: 72 79 2e 20 20 54 68 65 0a 2a 2a 20 72 65 74 75  ry.  The.** retu
82d0: 72 6e 20 76 61 6c 75 65 73 20 6d 69 67 68 74 20  rn values might 
82e0: 62 65 20 75 6e 69 6e 69 74 69 61 6c 69 7a 65 64  be uninitialized
82f0: 20 69 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   if an error occ
8300: 75 72 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d  urs..**.** The m
8310: 75 74 65 78 20 65 6e 74 65 72 65 64 20 75 73 69  utex entered usi
8320: 6e 67 20 74 68 65 20 75 6e 69 78 45 6e 74 65 72  ng the unixEnter
8330: 4d 75 74 65 78 28 29 20 66 75 6e 63 74 69 6f 6e  Mutex() function
8340: 20 6d 75 73 74 20 62 65 20 68 65 6c 64 0a 2a 2a   must be held.**
8350: 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74   when this funct
8360: 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a  ion is called..*
8370: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 6e 20 61  *.** Return an a
8380: 70 70 72 6f 70 72 69 61 74 65 20 65 72 72 6f 72  ppropriate error
8390: 20 63 6f 64 65 2e 0a 2a 2f 0a 73 74 61 74 69 63   code..*/.static
83a0: 20 69 6e 74 20 66 69 6e 64 4c 6f 63 6b 49 6e 66   int findLockInf
83b0: 6f 28 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70  o(.  unixFile *p
83c0: 46 69 6c 65 2c 20 20 20 20 20 20 20 20 20 20 20  File,           
83d0: 20 20 20 20 2f 2a 20 55 6e 69 78 20 66 69 6c 65      /* Unix file
83e0: 20 77 69 74 68 20 66 69 6c 65 20 64 65 73 63 20   with file desc 
83f0: 75 73 65 64 20 69 6e 20 74 68 65 20 6b 65 79 20  used in the key 
8400: 2a 2f 0a 20 20 73 74 72 75 63 74 20 75 6e 69 78  */.  struct unix
8410: 4c 6f 63 6b 49 6e 66 6f 20 2a 2a 70 70 4c 6f 63  LockInfo **ppLoc
8420: 6b 2c 20 20 2f 2a 20 52 65 74 75 72 6e 20 74 68  k,  /* Return th
8430: 65 20 75 6e 69 78 4c 6f 63 6b 49 6e 66 6f 20 73  e unixLockInfo s
8440: 74 72 75 63 74 75 72 65 20 68 65 72 65 20 2a 2f  tructure here */
8450: 0a 20 20 73 74 72 75 63 74 20 75 6e 69 78 4f 70  .  struct unixOp
8460: 65 6e 43 6e 74 20 2a 2a 70 70 4f 70 65 6e 20 20  enCnt **ppOpen  
8470: 20 20 2f 2a 20 52 65 74 75 72 6e 20 74 68 65 20    /* Return the 
8480: 75 6e 69 78 4f 70 65 6e 43 6e 74 20 73 74 72 75  unixOpenCnt stru
8490: 63 74 75 72 65 20 68 65 72 65 20 2a 2f 0a 29 7b  cture here */.){
84a0: 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20  .  int rc;      
84b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
84c0: 20 20 2f 2a 20 53 79 73 74 65 6d 20 63 61 6c 6c    /* System call
84d0: 20 72 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a   return code */.
84e0: 20 20 69 6e 74 20 66 64 3b 20 20 20 20 20 20 20    int fd;       
84f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8500: 20 2f 2a 20 54 68 65 20 66 69 6c 65 20 64 65 73   /* The file des
8510: 63 72 69 70 74 6f 72 20 66 6f 72 20 70 46 69 6c  criptor for pFil
8520: 65 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 75 6e  e */.  struct un
8530: 69 78 4c 6f 63 6b 4b 65 79 20 6c 6f 63 6b 4b 65  ixLockKey lockKe
8540: 79 3b 20 20 20 20 2f 2a 20 4c 6f 6f 6b 75 70 20  y;    /* Lookup 
8550: 6b 65 79 20 66 6f 72 20 74 68 65 20 75 6e 69 78  key for the unix
8560: 4c 6f 63 6b 49 6e 66 6f 20 73 74 72 75 63 74 75  LockInfo structu
8570: 72 65 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 75  re */.  struct u
8580: 6e 69 78 46 69 6c 65 49 64 20 66 69 6c 65 49 64  nixFileId fileId
8590: 3b 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 6b 75 70  ;      /* Lookup
85a0: 20 6b 65 79 20 66 6f 72 20 74 68 65 20 75 6e 69   key for the uni
85b0: 78 4f 70 65 6e 43 6e 74 20 73 74 72 75 63 74 20  xOpenCnt struct 
85c0: 2a 2f 0a 20 20 73 74 72 75 63 74 20 73 74 61 74  */.  struct stat
85d0: 20 73 74 61 74 62 75 66 3b 20 20 20 20 20 20 20   statbuf;       
85e0: 20 20 20 20 2f 2a 20 4c 6f 77 2d 6c 65 76 65 6c      /* Low-level
85f0: 20 66 69 6c 65 20 69 6e 66 6f 72 6d 61 74 69 6f   file informatio
8600: 6e 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 75 6e  n */.  struct un
8610: 69 78 4c 6f 63 6b 49 6e 66 6f 20 2a 70 4c 6f 63  ixLockInfo *pLoc
8620: 6b 20 3d 20 30 3b 2f 2a 20 43 61 6e 64 69 64 61  k = 0;/* Candida
8630: 74 65 20 75 6e 69 78 4c 6f 63 6b 49 6e 66 6f 20  te unixLockInfo 
8640: 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 73 74 72 75  object */.  stru
8650: 63 74 20 75 6e 69 78 4f 70 65 6e 43 6e 74 20 2a  ct unixOpenCnt *
8660: 70 4f 70 65 6e 3b 20 20 20 20 20 2f 2a 20 43 61  pOpen;     /* Ca
8670: 6e 64 69 64 61 74 65 20 75 6e 69 78 4f 70 65 6e  ndidate unixOpen
8680: 43 6e 74 20 6f 62 6a 65 63 74 20 2a 2f 0a 0a 20  Cnt object */.. 
8690: 20 61 73 73 65 72 74 28 20 75 6e 69 78 4d 75 74   assert( unixMut
86a0: 65 78 48 65 6c 64 28 29 20 29 3b 0a 0a 20 20 2f  exHeld() );..  /
86b0: 2a 20 47 65 74 20 6c 6f 77 2d 6c 65 76 65 6c 20  * Get low-level 
86c0: 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75  information abou
86d0: 74 20 74 68 65 20 66 69 6c 65 20 74 68 61 74 20  t the file that 
86e0: 77 65 20 63 61 6e 20 75 73 65 64 20 74 6f 0a 20  we can used to. 
86f0: 20 2a 2a 20 63 72 65 61 74 65 20 61 20 75 6e 69   ** create a uni
8700: 71 75 65 20 6e 61 6d 65 20 66 6f 72 20 74 68 65  que name for the
8710: 20 66 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20 66 64   file..  */.  fd
8720: 20 3d 20 70 46 69 6c 65 2d 3e 68 3b 0a 20 20 72   = pFile->h;.  r
8730: 63 20 3d 20 66 73 74 61 74 28 66 64 2c 20 26 73  c = fstat(fd, &s
8740: 74 61 74 62 75 66 29 3b 0a 20 20 69 66 28 20 72  tatbuf);.  if( r
8750: 63 21 3d 30 20 29 7b 0a 20 20 20 20 70 46 69 6c  c!=0 ){.    pFil
8760: 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 65  e->lastErrno = e
8770: 72 72 6e 6f 3b 0a 23 69 66 64 65 66 20 45 4f 56  rrno;.#ifdef EOV
8780: 45 52 46 4c 4f 57 0a 20 20 20 20 69 66 28 20 70  ERFLOW.    if( p
8790: 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 3d  File->lastErrno=
87a0: 3d 45 4f 56 45 52 46 4c 4f 57 20 29 20 72 65 74  =EOVERFLOW ) ret
87b0: 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4c 46 53  urn SQLITE_NOLFS
87c0: 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 72 65 74  ;.#endif.    ret
87d0: 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  urn SQLITE_IOERR
87e0: 3b 0a 20 20 7d 0a 0a 23 69 66 64 65 66 20 5f 5f  ;.  }..#ifdef __
87f0: 41 50 50 4c 45 5f 5f 0a 20 20 2f 2a 20 4f 6e 20  APPLE__.  /* On 
8800: 4f 53 20 58 20 6f 6e 20 61 6e 20 6d 73 64 6f 73  OS X on an msdos
8810: 20 66 69 6c 65 73 79 73 74 65 6d 2c 20 74 68 65   filesystem, the
8820: 20 69 6e 6f 64 65 20 6e 75 6d 62 65 72 20 69 73   inode number is
8830: 20 72 65 70 6f 72 74 65 64 0a 20 20 2a 2a 20 69   reported.  ** i
8840: 6e 63 6f 72 72 65 63 74 6c 79 20 66 6f 72 20 7a  ncorrectly for z
8850: 65 72 6f 2d 73 69 7a 65 20 66 69 6c 65 73 2e 20  ero-size files. 
8860: 20 53 65 65 20 74 69 63 6b 65 74 20 23 33 32 36   See ticket #326
8870: 30 2e 20 20 54 6f 20 77 6f 72 6b 0a 20 20 2a 2a  0.  To work.  **
8880: 20 61 72 6f 75 6e 64 20 74 68 69 73 20 70 72 6f   around this pro
8890: 62 6c 65 6d 20 28 77 65 20 63 6f 6e 73 69 64 65  blem (we conside
88a0: 72 20 69 74 20 61 20 62 75 67 20 69 6e 20 4f 53  r it a bug in OS
88b0: 20 58 2c 20 6e 6f 74 20 53 51 4c 69 74 65 29 0a   X, not SQLite).
88c0: 20 20 2a 2a 20 77 65 20 61 6c 77 61 79 73 20 69    ** we always i
88d0: 6e 63 72 65 61 73 65 20 74 68 65 20 66 69 6c 65  ncrease the file
88e0: 20 73 69 7a 65 20 74 6f 20 31 20 62 79 20 77 72   size to 1 by wr
88f0: 69 74 69 6e 67 20 61 20 73 69 6e 67 6c 65 20 62  iting a single b
8900: 79 74 65 0a 20 20 2a 2a 20 70 72 69 6f 72 20 74  yte.  ** prior t
8910: 6f 20 61 63 63 65 73 73 69 6e 67 20 74 68 65 20  o accessing the 
8920: 69 6e 6f 64 65 20 6e 75 6d 62 65 72 2e 20 20 54  inode number.  T
8930: 68 65 20 6f 6e 65 20 62 79 74 65 20 77 72 69 74  he one byte writ
8940: 74 65 6e 20 69 73 0a 20 20 2a 2a 20 61 6e 20 41  ten is.  ** an A
8950: 53 43 49 49 20 27 53 27 20 63 68 61 72 61 63 74  SCII 'S' charact
8960: 65 72 20 77 68 69 63 68 20 61 6c 73 6f 20 68 61  er which also ha
8970: 70 70 65 6e 73 20 74 6f 20 62 65 20 74 68 65 20  ppens to be the 
8980: 66 69 72 73 74 20 62 79 74 65 0a 20 20 2a 2a 20  first byte.  ** 
8990: 69 6e 20 74 68 65 20 68 65 61 64 65 72 20 6f 66  in the header of
89a0: 20 65 76 65 72 79 20 53 51 4c 69 74 65 20 64 61   every SQLite da
89b0: 74 61 62 61 73 65 2e 20 20 49 6e 20 74 68 69 73  tabase.  In this
89c0: 20 77 61 79 2c 20 69 66 20 74 68 65 72 65 0a 20   way, if there. 
89d0: 20 2a 2a 20 69 73 20 61 20 72 61 63 65 20 63 6f   ** is a race co
89e0: 6e 64 69 74 69 6f 6e 20 73 75 63 68 20 74 68 61  ndition such tha
89f0: 74 20 61 6e 6f 74 68 65 72 20 74 68 72 65 61 64  t another thread
8a00: 20 68 61 73 20 61 6c 72 65 61 64 79 20 70 6f 70   has already pop
8a10: 75 6c 61 74 65 64 0a 20 20 2a 2a 20 74 68 65 20  ulated.  ** the 
8a20: 66 69 72 73 74 20 70 61 67 65 20 6f 66 20 74 68  first page of th
8a30: 65 20 64 61 74 61 62 61 73 65 2c 20 6e 6f 20 64  e database, no d
8a40: 61 6d 61 67 65 20 69 73 20 64 6f 6e 65 2e 0a 20  amage is done.. 
8a50: 20 2a 2f 0a 20 20 69 66 28 20 73 74 61 74 62 75   */.  if( statbu
8a60: 66 2e 73 74 5f 73 69 7a 65 3d 3d 30 20 26 26 20  f.st_size==0 && 
8a70: 28 70 46 69 6c 65 2d 3e 66 73 46 6c 61 67 73 20  (pFile->fsFlags 
8a80: 26 20 53 51 4c 49 54 45 5f 46 53 46 4c 41 47 53  & SQLITE_FSFLAGS
8a90: 5f 49 53 5f 4d 53 44 4f 53 29 21 3d 30 20 29 7b  _IS_MSDOS)!=0 ){
8aa0: 0a 20 20 20 20 72 63 20 3d 20 77 72 69 74 65 28  .    rc = write(
8ab0: 66 64 2c 20 22 53 22 2c 20 31 29 3b 0a 20 20 20  fd, "S", 1);.   
8ac0: 20 69 66 28 20 72 63 21 3d 31 20 29 7b 0a 20 20   if( rc!=1 ){.  
8ad0: 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45      pFile->lastE
8ae0: 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20  rrno = errno;.  
8af0: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
8b00: 45 5f 49 4f 45 52 52 3b 0a 20 20 20 20 7d 0a 20  E_IOERR;.    }. 
8b10: 20 20 20 72 63 20 3d 20 66 73 74 61 74 28 66 64     rc = fstat(fd
8b20: 2c 20 26 73 74 61 74 62 75 66 29 3b 0a 20 20 20  , &statbuf);.   
8b30: 20 69 66 28 20 72 63 21 3d 30 20 29 7b 0a 20 20   if( rc!=0 ){.  
8b40: 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45      pFile->lastE
8b50: 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20  rrno = errno;.  
8b60: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
8b70: 45 5f 49 4f 45 52 52 3b 0a 20 20 20 20 7d 0a 20  E_IOERR;.    }. 
8b80: 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 6d 65 6d   }.#endif..  mem
8b90: 73 65 74 28 26 6c 6f 63 6b 4b 65 79 2c 20 30 2c  set(&lockKey, 0,
8ba0: 20 73 69 7a 65 6f 66 28 6c 6f 63 6b 4b 65 79 29   sizeof(lockKey)
8bb0: 29 3b 0a 20 20 6c 6f 63 6b 4b 65 79 2e 66 69 64  );.  lockKey.fid
8bc0: 2e 64 65 76 20 3d 20 73 74 61 74 62 75 66 2e 73  .dev = statbuf.s
8bd0: 74 5f 64 65 76 3b 0a 23 69 66 20 4f 53 5f 56 58  t_dev;.#if OS_VX
8be0: 57 4f 52 4b 53 0a 20 20 6c 6f 63 6b 4b 65 79 2e  WORKS.  lockKey.
8bf0: 66 69 64 2e 70 49 64 20 3d 20 70 46 69 6c 65 2d  fid.pId = pFile-
8c00: 3e 70 49 64 3b 0a 23 65 6c 73 65 0a 20 20 6c 6f  >pId;.#else.  lo
8c10: 63 6b 4b 65 79 2e 66 69 64 2e 69 6e 6f 20 3d 20  ckKey.fid.ino = 
8c20: 73 74 61 74 62 75 66 2e 73 74 5f 69 6e 6f 3b 0a  statbuf.st_ino;.
8c30: 23 65 6e 64 69 66 0a 23 69 66 20 53 51 4c 49 54  #endif.#if SQLIT
8c40: 45 5f 54 48 52 45 41 44 53 41 46 45 20 26 26 20  E_THREADSAFE && 
8c50: 64 65 66 69 6e 65 64 28 5f 5f 6c 69 6e 75 78 5f  defined(__linux_
8c60: 5f 29 0a 20 20 69 66 28 20 74 68 72 65 61 64 73  _).  if( threads
8c70: 4f 76 65 72 72 69 64 65 45 61 63 68 4f 74 68 65  OverrideEachOthe
8c80: 72 73 4c 6f 63 6b 73 3c 30 20 29 7b 0a 20 20 20  rsLocks<0 ){.   
8c90: 20 74 65 73 74 54 68 72 65 61 64 4c 6f 63 6b 69   testThreadLocki
8ca0: 6e 67 42 65 68 61 76 69 6f 72 28 66 64 29 3b 0a  ngBehavior(fd);.
8cb0: 20 20 7d 0a 20 20 6c 6f 63 6b 4b 65 79 2e 74 69    }.  lockKey.ti
8cc0: 64 20 3d 20 74 68 72 65 61 64 73 4f 76 65 72 72  d = threadsOverr
8cd0: 69 64 65 45 61 63 68 4f 74 68 65 72 73 4c 6f 63  ideEachOthersLoc
8ce0: 6b 73 20 3f 20 30 20 3a 20 70 74 68 72 65 61 64  ks ? 0 : pthread
8cf0: 5f 73 65 6c 66 28 29 3b 0a 23 65 6e 64 69 66 0a  _self();.#endif.
8d00: 20 20 66 69 6c 65 49 64 20 3d 20 6c 6f 63 6b 4b    fileId = lockK
8d10: 65 79 2e 66 69 64 3b 0a 20 20 69 66 28 20 70 70  ey.fid;.  if( pp
8d20: 4c 6f 63 6b 21 3d 30 20 29 7b 0a 20 20 20 20 70  Lock!=0 ){.    p
8d30: 4c 6f 63 6b 20 3d 20 6c 6f 63 6b 4c 69 73 74 3b  Lock = lockList;
8d40: 0a 20 20 20 20 77 68 69 6c 65 28 20 70 4c 6f 63  .    while( pLoc
8d50: 6b 20 26 26 20 6d 65 6d 63 6d 70 28 26 6c 6f 63  k && memcmp(&loc
8d60: 6b 4b 65 79 2c 20 26 70 4c 6f 63 6b 2d 3e 6c 6f  kKey, &pLock->lo
8d70: 63 6b 4b 65 79 2c 20 73 69 7a 65 6f 66 28 6c 6f  ckKey, sizeof(lo
8d80: 63 6b 4b 65 79 29 29 20 29 7b 0a 20 20 20 20 20  ckKey)) ){.     
8d90: 20 70 4c 6f 63 6b 20 3d 20 70 4c 6f 63 6b 2d 3e   pLock = pLock->
8da0: 70 4e 65 78 74 3b 0a 20 20 20 20 7d 0a 20 20 20  pNext;.    }.   
8db0: 20 69 66 28 20 70 4c 6f 63 6b 3d 3d 30 20 29 7b   if( pLock==0 ){
8dc0: 0a 20 20 20 20 20 20 70 4c 6f 63 6b 20 3d 20 73  .      pLock = s
8dd0: 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 20 73  qlite3_malloc( s
8de0: 69 7a 65 6f 66 28 2a 70 4c 6f 63 6b 29 20 29 3b  izeof(*pLock) );
8df0: 0a 20 20 20 20 20 20 69 66 28 20 70 4c 6f 63 6b  .      if( pLock
8e00: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72  ==0 ){.        r
8e10: 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  c = SQLITE_NOMEM
8e20: 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65  ;.        goto e
8e30: 78 69 74 5f 66 69 6e 64 6c 6f 63 6b 69 6e 66 6f  xit_findlockinfo
8e40: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
8e50: 6d 65 6d 63 70 79 28 26 70 4c 6f 63 6b 2d 3e 6c  memcpy(&pLock->l
8e60: 6f 63 6b 4b 65 79 2c 26 6c 6f 63 6b 4b 65 79 2c  ockKey,&lockKey,
8e70: 73 69 7a 65 6f 66 28 6c 6f 63 6b 4b 65 79 29 29  sizeof(lockKey))
8e80: 3b 0a 20 20 20 20 20 20 70 4c 6f 63 6b 2d 3e 6e  ;.      pLock->n
8e90: 52 65 66 20 3d 20 31 3b 0a 20 20 20 20 20 20 70  Ref = 1;.      p
8ea0: 4c 6f 63 6b 2d 3e 63 6e 74 20 3d 20 30 3b 0a 20  Lock->cnt = 0;. 
8eb0: 20 20 20 20 20 70 4c 6f 63 6b 2d 3e 6c 6f 63 6b       pLock->lock
8ec0: 74 79 70 65 20 3d 20 30 3b 0a 23 69 66 20 64 65  type = 0;.#if de
8ed0: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41  fined(SQLITE_ENA
8ee0: 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c  BLE_LOCKING_STYL
8ef0: 45 29 0a 20 20 20 20 20 20 70 4c 6f 63 6b 2d 3e  E).      pLock->
8f00: 73 68 61 72 65 64 42 79 74 65 20 3d 20 30 3b 0a  sharedByte = 0;.
8f10: 23 65 6e 64 69 66 0a 20 20 20 20 20 20 70 4c 6f  #endif.      pLo
8f20: 63 6b 2d 3e 70 4e 65 78 74 20 3d 20 6c 6f 63 6b  ck->pNext = lock
8f30: 4c 69 73 74 3b 0a 20 20 20 20 20 20 70 4c 6f 63  List;.      pLoc
8f40: 6b 2d 3e 70 50 72 65 76 20 3d 20 30 3b 0a 20 20  k->pPrev = 0;.  
8f50: 20 20 20 20 69 66 28 20 6c 6f 63 6b 4c 69 73 74      if( lockList
8f60: 20 29 20 6c 6f 63 6b 4c 69 73 74 2d 3e 70 50 72   ) lockList->pPr
8f70: 65 76 20 3d 20 70 4c 6f 63 6b 3b 0a 20 20 20 20  ev = pLock;.    
8f80: 20 20 6c 6f 63 6b 4c 69 73 74 20 3d 20 70 4c 6f    lockList = pLo
8f90: 63 6b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ck;.    }else{. 
8fa0: 20 20 20 20 20 70 4c 6f 63 6b 2d 3e 6e 52 65 66       pLock->nRef
8fb0: 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2a 70  ++;.    }.    *p
8fc0: 70 4c 6f 63 6b 20 3d 20 70 4c 6f 63 6b 3b 0a 20  pLock = pLock;. 
8fd0: 20 7d 0a 20 20 69 66 28 20 70 70 4f 70 65 6e 21   }.  if( ppOpen!
8fe0: 3d 30 20 29 7b 0a 20 20 20 20 70 4f 70 65 6e 20  =0 ){.    pOpen 
8ff0: 3d 20 6f 70 65 6e 4c 69 73 74 3b 0a 20 20 20 20  = openList;.    
9000: 77 68 69 6c 65 28 20 70 4f 70 65 6e 20 26 26 20  while( pOpen && 
9010: 6d 65 6d 63 6d 70 28 26 66 69 6c 65 49 64 2c 20  memcmp(&fileId, 
9020: 26 70 4f 70 65 6e 2d 3e 66 69 6c 65 49 64 2c 20  &pOpen->fileId, 
9030: 73 69 7a 65 6f 66 28 66 69 6c 65 49 64 29 29 20  sizeof(fileId)) 
9040: 29 7b 0a 20 20 20 20 20 20 70 4f 70 65 6e 20 3d  ){.      pOpen =
9050: 20 70 4f 70 65 6e 2d 3e 70 4e 65 78 74 3b 0a 20   pOpen->pNext;. 
9060: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 4f 70     }.    if( pOp
9070: 65 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70  en==0 ){.      p
9080: 4f 70 65 6e 20 3d 20 73 71 6c 69 74 65 33 5f 6d  Open = sqlite3_m
9090: 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 2a 70  alloc( sizeof(*p
90a0: 4f 70 65 6e 29 20 29 3b 0a 20 20 20 20 20 20 69  Open) );.      i
90b0: 66 28 20 70 4f 70 65 6e 3d 3d 30 20 29 7b 0a 20  f( pOpen==0 ){. 
90c0: 20 20 20 20 20 20 20 72 65 6c 65 61 73 65 4c 6f         releaseLo
90d0: 63 6b 49 6e 66 6f 28 70 4c 6f 63 6b 29 3b 0a 20  ckInfo(pLock);. 
90e0: 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
90f0: 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20  TE_NOMEM;.      
9100: 20 20 67 6f 74 6f 20 65 78 69 74 5f 66 69 6e 64    goto exit_find
9110: 6c 6f 63 6b 69 6e 66 6f 3b 0a 20 20 20 20 20 20  lockinfo;.      
9120: 7d 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28 70  }.      memset(p
9130: 4f 70 65 6e 2c 20 30 2c 20 73 69 7a 65 6f 66 28  Open, 0, sizeof(
9140: 2a 70 4f 70 65 6e 29 29 3b 0a 20 20 20 20 20 20  *pOpen));.      
9150: 70 4f 70 65 6e 2d 3e 66 69 6c 65 49 64 20 3d 20  pOpen->fileId = 
9160: 66 69 6c 65 49 64 3b 0a 20 20 20 20 20 20 70 4f  fileId;.      pO
9170: 70 65 6e 2d 3e 6e 52 65 66 20 3d 20 31 3b 0a 20  pen->nRef = 1;. 
9180: 20 20 20 20 20 70 4f 70 65 6e 2d 3e 70 4e 65 78       pOpen->pNex
9190: 74 20 3d 20 6f 70 65 6e 4c 69 73 74 3b 0a 20 20  t = openList;.  
91a0: 20 20 20 20 69 66 28 20 6f 70 65 6e 4c 69 73 74      if( openList
91b0: 20 29 20 6f 70 65 6e 4c 69 73 74 2d 3e 70 50 72   ) openList->pPr
91c0: 65 76 20 3d 20 70 4f 70 65 6e 3b 0a 20 20 20 20  ev = pOpen;.    
91d0: 20 20 6f 70 65 6e 4c 69 73 74 20 3d 20 70 4f 70    openList = pOp
91e0: 65 6e 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  en;.    }else{. 
91f0: 20 20 20 20 20 70 4f 70 65 6e 2d 3e 6e 52 65 66       pOpen->nRef
9200: 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2a 70  ++;.    }.    *p
9210: 70 4f 70 65 6e 20 3d 20 70 4f 70 65 6e 3b 0a 20  pOpen = pOpen;. 
9220: 20 7d 0a 0a 65 78 69 74 5f 66 69 6e 64 6c 6f 63   }..exit_findloc
9230: 6b 69 6e 66 6f 3a 0a 20 20 72 65 74 75 72 6e 20  kinfo:.  return 
9240: 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20  rc;.}../*.** If 
9250: 77 65 20 61 72 65 20 63 75 72 72 65 6e 74 6c 79  we are currently
9260: 20 69 6e 20 61 20 64 69 66 66 65 72 65 6e 74 20   in a different 
9270: 74 68 72 65 61 64 20 74 68 61 6e 20 74 68 65 20  thread than the 
9280: 74 68 72 65 61 64 20 74 68 61 74 20 74 68 65 0a  thread that the.
9290: 2a 2a 20 75 6e 69 78 46 69 6c 65 20 61 72 67 75  ** unixFile argu
92a0: 6d 65 6e 74 20 62 65 6c 6f 6e 67 73 20 74 6f 2c  ment belongs to,
92b0: 20 74 68 65 6e 20 74 72 61 6e 73 66 65 72 20 6f   then transfer o
92c0: 77 6e 65 72 73 68 69 70 20 6f 66 20 74 68 65 20  wnership of the 
92d0: 75 6e 69 78 46 69 6c 65 0a 2a 2a 20 6f 76 65 72  unixFile.** over
92e0: 20 74 6f 20 74 68 65 20 63 75 72 72 65 6e 74 20   to the current 
92f0: 74 68 72 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 41 20  thread..**.** A 
9300: 75 6e 69 78 46 69 6c 65 20 69 73 20 6f 6e 6c 79  unixFile is only
9310: 20 6f 77 6e 65 64 20 62 79 20 61 20 74 68 72 65   owned by a thre
9320: 61 64 20 6f 6e 20 73 79 73 74 65 6d 73 20 74 68  ad on systems th
9330: 61 74 20 75 73 65 20 4c 69 6e 75 78 54 68 72 65  at use LinuxThre
9340: 61 64 73 2e 0a 2a 2a 0a 2a 2a 20 4f 77 6e 65 72  ads..**.** Owner
9350: 73 68 69 70 20 74 72 61 6e 73 66 65 72 20 69 73  ship transfer is
9360: 20 6f 6e 6c 79 20 61 6c 6c 6f 77 65 64 20 69 66   only allowed if
9370: 20 74 68 65 20 75 6e 69 78 46 69 6c 65 20 69 73   the unixFile is
9380: 20 63 75 72 72 65 6e 74 6c 79 20 75 6e 6c 6f 63   currently unloc
9390: 6b 65 64 2e 0a 2a 2a 20 49 66 20 74 68 65 20 75  ked..** If the u
93a0: 6e 69 78 46 69 6c 65 20 69 73 20 6c 6f 63 6b 65  nixFile is locke
93b0: 64 20 61 6e 64 20 61 6e 20 6f 77 6e 65 72 73 68  d and an ownersh
93c0: 69 70 20 69 73 20 77 72 6f 6e 67 2c 20 74 68 65  ip is wrong, the
93d0: 6e 20 72 65 74 75 72 6e 0a 2a 2a 20 53 51 4c 49  n return.** SQLI
93e0: 54 45 5f 4d 49 53 55 53 45 2e 20 20 53 51 4c 49  TE_MISUSE.  SQLI
93f0: 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65  TE_OK is returne
9400: 64 20 69 66 20 65 76 65 72 79 74 68 69 6e 67 20  d if everything 
9410: 77 6f 72 6b 73 2e 0a 2a 2f 0a 23 69 66 20 53 51  works..*/.#if SQ
9420: 4c 49 54 45 5f 54 48 52 45 41 44 53 41 46 45 20  LITE_THREADSAFE 
9430: 26 26 20 64 65 66 69 6e 65 64 28 5f 5f 6c 69 6e  && defined(__lin
9440: 75 78 5f 5f 29 0a 73 74 61 74 69 63 20 69 6e 74  ux__).static int
9450: 20 74 72 61 6e 73 66 65 72 4f 77 6e 65 72 73 68   transferOwnersh
9460: 69 70 28 75 6e 69 78 46 69 6c 65 20 2a 70 46 69  ip(unixFile *pFi
9470: 6c 65 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  le){.  int rc;. 
9480: 20 70 74 68 72 65 61 64 5f 74 20 68 53 65 6c 66   pthread_t hSelf
9490: 3b 0a 20 20 69 66 28 20 74 68 72 65 61 64 73 4f  ;.  if( threadsO
94a0: 76 65 72 72 69 64 65 45 61 63 68 4f 74 68 65 72  verrideEachOther
94b0: 73 4c 6f 63 6b 73 20 29 7b 0a 20 20 20 20 2f 2a  sLocks ){.    /*
94c0: 20 4f 77 6e 65 72 73 68 69 70 20 74 72 61 6e 73   Ownership trans
94d0: 66 65 72 73 20 6e 6f 74 20 6e 65 65 64 65 64 20  fers not needed 
94e0: 6f 6e 20 74 68 69 73 20 73 79 73 74 65 6d 20 2a  on this system *
94f0: 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  /.    return SQL
9500: 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 68 53  ITE_OK;.  }.  hS
9510: 65 6c 66 20 3d 20 70 74 68 72 65 61 64 5f 73 65  elf = pthread_se
9520: 6c 66 28 29 3b 0a 20 20 69 66 28 20 70 74 68 72  lf();.  if( pthr
9530: 65 61 64 5f 65 71 75 61 6c 28 70 46 69 6c 65 2d  ead_equal(pFile-
9540: 3e 74 69 64 2c 20 68 53 65 6c 66 29 20 29 7b 0a  >tid, hSelf) ){.
9550: 20 20 20 20 2f 2a 20 57 65 20 61 72 65 20 73 74      /* We are st
9560: 69 6c 6c 20 69 6e 20 74 68 65 20 73 61 6d 65 20  ill in the same 
9570: 74 68 72 65 61 64 20 2a 2f 0a 20 20 20 20 4f 53  thread */.    OS
9580: 54 52 41 43 45 31 28 22 4e 6f 2d 74 72 61 6e 73  TRACE1("No-trans
9590: 66 65 72 2c 20 73 61 6d 65 20 74 68 72 65 61 64  fer, same thread
95a0: 5c 6e 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  \n");.    return
95b0: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
95c0: 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 6c 6f 63    if( pFile->loc
95d0: 6b 74 79 70 65 21 3d 4e 4f 5f 4c 4f 43 4b 20 29  ktype!=NO_LOCK )
95e0: 7b 0a 20 20 20 20 2f 2a 20 57 65 20 63 61 6e 6e  {.    /* We cann
95f0: 6f 74 20 63 68 61 6e 67 65 20 6f 77 6e 65 72 73  ot change owners
9600: 68 69 70 20 77 68 69 6c 65 20 77 65 20 61 72 65  hip while we are
9610: 20 68 6f 6c 64 69 6e 67 20 61 20 6c 6f 63 6b 21   holding a lock!
9620: 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 53   */.    return S
9630: 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50  QLITE_MISUSE_BKP
9640: 54 3b 0a 20 20 7d 0a 20 20 4f 53 54 52 41 43 45  T;.  }.  OSTRACE
9650: 34 28 22 54 72 61 6e 73 66 65 72 20 6f 77 6e 65  4("Transfer owne
9660: 72 73 68 69 70 20 6f 66 20 25 64 20 66 72 6f 6d  rship of %d from
9670: 20 25 64 20 74 6f 20 25 64 5c 6e 22 2c 0a 20 20   %d to %d\n",.  
9680: 20 20 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d            pFile-
9690: 3e 68 2c 20 70 46 69 6c 65 2d 3e 74 69 64 2c 20  >h, pFile->tid, 
96a0: 68 53 65 6c 66 29 3b 0a 20 20 70 46 69 6c 65 2d  hSelf);.  pFile-
96b0: 3e 74 69 64 20 3d 20 68 53 65 6c 66 3b 0a 20 20  >tid = hSelf;.  
96c0: 69 66 20 28 70 46 69 6c 65 2d 3e 70 4c 6f 63 6b  if (pFile->pLock
96d0: 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 20 20 20 20   != NULL) {.    
96e0: 72 65 6c 65 61 73 65 4c 6f 63 6b 49 6e 66 6f 28  releaseLockInfo(
96f0: 70 46 69 6c 65 2d 3e 70 4c 6f 63 6b 29 3b 0a 20  pFile->pLock);. 
9700: 20 20 20 72 63 20 3d 20 66 69 6e 64 4c 6f 63 6b     rc = findLock
9710: 49 6e 66 6f 28 70 46 69 6c 65 2c 20 26 70 46 69  Info(pFile, &pFi
9720: 6c 65 2d 3e 70 4c 6f 63 6b 2c 20 30 29 3b 0a 20  le->pLock, 0);. 
9730: 20 20 20 4f 53 54 52 41 43 45 35 28 22 4c 4f 43     OSTRACE5("LOC
9740: 4b 20 20 20 20 25 64 20 69 73 20 6e 6f 77 20 25  K    %d is now %
9750: 73 28 25 73 2c 25 64 29 5c 6e 22 2c 20 70 46 69  s(%s,%d)\n", pFi
9760: 6c 65 2d 3e 68 2c 0a 20 20 20 20 20 20 20 20 20  le->h,.         
9770: 20 20 6c 6f 63 6b 74 79 70 65 4e 61 6d 65 28 70    locktypeName(p
9780: 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 29 2c  File->locktype),
9790: 0a 20 20 20 20 20 20 20 20 20 20 20 6c 6f 63 6b  .           lock
97a0: 74 79 70 65 4e 61 6d 65 28 70 46 69 6c 65 2d 3e  typeName(pFile->
97b0: 70 4c 6f 63 6b 2d 3e 6c 6f 63 6b 74 79 70 65 29  pLock->locktype)
97c0: 2c 20 70 46 69 6c 65 2d 3e 70 4c 6f 63 6b 2d 3e  , pFile->pLock->
97d0: 63 6e 74 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  cnt);.    return
97e0: 20 72 63 3b 0a 20 20 7d 20 65 6c 73 65 20 7b 0a   rc;.  } else {.
97f0: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
9800: 45 5f 4f 4b 3b 0a 20 20 7d 0a 7d 0a 23 65 6c 73  E_OK;.  }.}.#els
9810: 65 20 20 2f 2a 20 69 66 20 6e 6f 74 20 53 51 4c  e  /* if not SQL
9820: 49 54 45 5f 54 48 52 45 41 44 53 41 46 45 20 2a  ITE_THREADSAFE *
9830: 2f 0a 20 20 2f 2a 20 4f 6e 20 73 69 6e 67 6c 65  /.  /* On single
9840: 2d 74 68 72 65 61 64 65 64 20 62 75 69 6c 64 73  -threaded builds
9850: 2c 20 6f 77 6e 65 72 73 68 69 70 20 74 72 61 6e  , ownership tran
9860: 73 66 65 72 20 69 73 20 61 20 6e 6f 2d 6f 70 20  sfer is a no-op 
9870: 2a 2f 0a 23 20 64 65 66 69 6e 65 20 74 72 61 6e  */.# define tran
9880: 73 66 65 72 4f 77 6e 65 72 73 68 69 70 28 58 29  sferOwnership(X)
9890: 20 53 51 4c 49 54 45 5f 4f 4b 0a 23 65 6e 64 69   SQLITE_OK.#endi
98a0: 66 20 2f 2a 20 53 51 4c 49 54 45 5f 54 48 52 45  f /* SQLITE_THRE
98b0: 41 44 53 41 46 45 20 2a 2f 0a 0a 0a 2f 2a 0a 2a  ADSAFE */.../*.*
98c0: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63  * This routine c
98d0: 68 65 63 6b 73 20 69 66 20 74 68 65 72 65 20 69  hecks if there i
98e0: 73 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63  s a RESERVED loc
98f0: 6b 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 73 70  k held on the sp
9900: 65 63 69 66 69 65 64 0a 2a 2a 20 66 69 6c 65 20  ecified.** file 
9910: 62 79 20 74 68 69 73 20 6f 72 20 61 6e 79 20 6f  by this or any o
9920: 74 68 65 72 20 70 72 6f 63 65 73 73 2e 20 49 66  ther process. If
9930: 20 73 75 63 68 20 61 20 6c 6f 63 6b 20 69 73 20   such a lock is 
9940: 68 65 6c 64 2c 20 73 65 74 20 2a 70 52 65 73 4f  held, set *pResO
9950: 75 74 0a 2a 2a 20 74 6f 20 61 20 6e 6f 6e 2d 7a  ut.** to a non-z
9960: 65 72 6f 20 76 61 6c 75 65 20 6f 74 68 65 72 77  ero value otherw
9970: 69 73 65 20 2a 70 52 65 73 4f 75 74 20 69 73 20  ise *pResOut is 
9980: 73 65 74 20 74 6f 20 7a 65 72 6f 2e 20 20 54 68  set to zero.  Th
9990: 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 0a 2a  e return value.*
99a0: 2a 20 69 73 20 73 65 74 20 74 6f 20 53 51 4c 49  * is set to SQLI
99b0: 54 45 5f 4f 4b 20 75 6e 6c 65 73 73 20 61 6e 20  TE_OK unless an 
99c0: 49 2f 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73  I/O error occurs
99d0: 20 64 75 72 69 6e 67 20 6c 6f 63 6b 20 63 68 65   during lock che
99e0: 63 6b 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63  cking..*/.static
99f0: 20 69 6e 74 20 75 6e 69 78 43 68 65 63 6b 52 65   int unixCheckRe
9a00: 73 65 72 76 65 64 4c 6f 63 6b 28 73 71 6c 69 74  servedLock(sqlit
9a10: 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74  e3_file *id, int
9a20: 20 2a 70 52 65 73 4f 75 74 29 7b 0a 20 20 69 6e   *pResOut){.  in
9a30: 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
9a40: 3b 0a 20 20 69 6e 74 20 72 65 73 65 72 76 65 64  ;.  int reserved
9a50: 20 3d 20 30 3b 0a 20 20 75 6e 69 78 46 69 6c 65   = 0;.  unixFile
9a60: 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46   *pFile = (unixF
9a70: 69 6c 65 2a 29 69 64 3b 0a 0a 20 20 53 69 6d 75  ile*)id;..  Simu
9a80: 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 72 65 74  lateIOError( ret
9a90: 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  urn SQLITE_IOERR
9aa0: 5f 43 48 45 43 4b 52 45 53 45 52 56 45 44 4c 4f  _CHECKRESERVEDLO
9ab0: 43 4b 3b 20 29 3b 0a 0a 20 20 61 73 73 65 72 74  CK; );..  assert
9ac0: 28 20 70 46 69 6c 65 20 29 3b 0a 20 20 75 6e 69  ( pFile );.  uni
9ad0: 78 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 20 2f  xEnterMutex(); /
9ae0: 2a 20 42 65 63 61 75 73 65 20 70 46 69 6c 65 2d  * Because pFile-
9af0: 3e 70 4c 6f 63 6b 20 69 73 20 73 68 61 72 65 64  >pLock is shared
9b00: 20 61 63 72 6f 73 73 20 74 68 72 65 61 64 73 20   across threads 
9b10: 2a 2f 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 69  */..  /* Check i
9b20: 66 20 61 20 74 68 72 65 61 64 20 69 6e 20 74 68  f a thread in th
9b30: 69 73 20 70 72 6f 63 65 73 73 20 68 6f 6c 64 73  is process holds
9b40: 20 73 75 63 68 20 61 20 6c 6f 63 6b 20 2a 2f 0a   such a lock */.
9b50: 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 70 4c 6f    if( pFile->pLo
9b60: 63 6b 2d 3e 6c 6f 63 6b 74 79 70 65 3e 53 48 41  ck->locktype>SHA
9b70: 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20  RED_LOCK ){.    
9b80: 72 65 73 65 72 76 65 64 20 3d 20 31 3b 0a 20 20  reserved = 1;.  
9b90: 7d 0a 0a 20 20 2f 2a 20 4f 74 68 65 72 77 69 73  }..  /* Otherwis
9ba0: 65 20 73 65 65 20 69 66 20 73 6f 6d 65 20 6f 74  e see if some ot
9bb0: 68 65 72 20 70 72 6f 63 65 73 73 20 68 6f 6c 64  her process hold
9bc0: 73 20 69 74 2e 0a 20 20 2a 2f 0a 23 69 66 6e 64  s it..  */.#ifnd
9bd0: 65 66 20 5f 5f 44 4a 47 50 50 5f 5f 0a 20 20 69  ef __DJGPP__.  i
9be0: 66 28 20 21 72 65 73 65 72 76 65 64 20 29 7b 0a  f( !reserved ){.
9bf0: 20 20 20 20 73 74 72 75 63 74 20 66 6c 6f 63 6b      struct flock
9c00: 20 6c 6f 63 6b 3b 0a 20 20 20 20 6c 6f 63 6b 2e   lock;.    lock.
9c10: 6c 5f 77 68 65 6e 63 65 20 3d 20 53 45 45 4b 5f  l_whence = SEEK_
9c20: 53 45 54 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f  SET;.    lock.l_
9c30: 73 74 61 72 74 20 3d 20 52 45 53 45 52 56 45 44  start = RESERVED
9c40: 5f 42 59 54 45 3b 0a 20 20 20 20 6c 6f 63 6b 2e  _BYTE;.    lock.
9c50: 6c 5f 6c 65 6e 20 3d 20 31 3b 0a 20 20 20 20 6c  l_len = 1;.    l
9c60: 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d 20 46 5f 57  ock.l_type = F_W
9c70: 52 4c 43 4b 3b 0a 20 20 20 20 69 66 20 28 2d 31  RLCK;.    if (-1
9c80: 20 3d 3d 20 66 63 6e 74 6c 28 70 46 69 6c 65 2d   == fcntl(pFile-
9c90: 3e 68 2c 20 46 5f 47 45 54 4c 4b 2c 20 26 6c 6f  >h, F_GETLK, &lo
9ca0: 63 6b 29 29 20 7b 0a 20 20 20 20 20 20 69 6e 74  ck)) {.      int
9cb0: 20 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b   tErrno = errno;
9cc0: 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
9cd0: 74 65 45 72 72 6f 72 46 72 6f 6d 50 6f 73 69 78  teErrorFromPosix
9ce0: 45 72 72 6f 72 28 74 45 72 72 6e 6f 2c 20 53 51  Error(tErrno, SQ
9cf0: 4c 49 54 45 5f 49 4f 45 52 52 5f 43 48 45 43 4b  LITE_IOERR_CHECK
9d00: 52 45 53 45 52 56 45 44 4c 4f 43 4b 29 3b 0a 20  RESERVEDLOCK);. 
9d10: 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74       pFile->last
9d20: 45 72 72 6e 6f 20 3d 20 74 45 72 72 6e 6f 3b 0a  Errno = tErrno;.
9d30: 20 20 20 20 7d 20 65 6c 73 65 20 69 66 28 20 6c      } else if( l
9d40: 6f 63 6b 2e 6c 5f 74 79 70 65 21 3d 46 5f 55 4e  ock.l_type!=F_UN
9d50: 4c 43 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 73  LCK ){.      res
9d60: 65 72 76 65 64 20 3d 20 31 3b 0a 20 20 20 20 7d  erved = 1;.    }
9d70: 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 0a 20  .  }.#endif.  . 
9d80: 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28   unixLeaveMutex(
9d90: 29 3b 0a 20 20 4f 53 54 52 41 43 45 34 28 22 54  );.  OSTRACE4("T
9da0: 45 53 54 20 57 52 2d 4c 4f 43 4b 20 25 64 20 25  EST WR-LOCK %d %
9db0: 64 20 25 64 20 28 75 6e 69 78 29 5c 6e 22 2c 20  d %d (unix)\n", 
9dc0: 70 46 69 6c 65 2d 3e 68 2c 20 72 63 2c 20 72 65  pFile->h, rc, re
9dd0: 73 65 72 76 65 64 29 3b 0a 0a 20 20 2a 70 52 65  served);..  *pRe
9de0: 73 4f 75 74 20 3d 20 72 65 73 65 72 76 65 64 3b  sOut = reserved;
9df0: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
9e00: 0a 2f 2a 0a 2a 2a 20 4c 6f 63 6b 20 74 68 65 20  ./*.** Lock the 
9e10: 66 69 6c 65 20 77 69 74 68 20 74 68 65 20 6c 6f  file with the lo
9e20: 63 6b 20 73 70 65 63 69 66 69 65 64 20 62 79 20  ck specified by 
9e30: 70 61 72 61 6d 65 74 65 72 20 6c 6f 63 6b 74 79  parameter lockty
9e40: 70 65 20 2d 20 6f 6e 65 0a 2a 2a 20 6f 66 20 74  pe - one.** of t
9e50: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a  he following:.**
9e60: 0a 2a 2a 20 20 20 20 20 28 31 29 20 53 48 41 52  .**     (1) SHAR
9e70: 45 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28  ED_LOCK.**     (
9e80: 32 29 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b  2) RESERVED_LOCK
9e90: 0a 2a 2a 20 20 20 20 20 28 33 29 20 50 45 4e 44  .**     (3) PEND
9ea0: 49 4e 47 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20  ING_LOCK.**     
9eb0: 28 34 29 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f  (4) EXCLUSIVE_LO
9ec0: 43 4b 0a 2a 2a 0a 2a 2a 20 53 6f 6d 65 74 69 6d  CK.**.** Sometim
9ed0: 65 73 20 77 68 65 6e 20 72 65 71 75 65 73 74 69  es when requesti
9ee0: 6e 67 20 6f 6e 65 20 6c 6f 63 6b 20 73 74 61 74  ng one lock stat
9ef0: 65 2c 20 61 64 64 69 74 69 6f 6e 61 6c 20 6c 6f  e, additional lo
9f00: 63 6b 20 73 74 61 74 65 73 0a 2a 2a 20 61 72 65  ck states.** are
9f10: 20 69 6e 73 65 72 74 65 64 20 69 6e 20 62 65 74   inserted in bet
9f20: 77 65 65 6e 2e 20 20 54 68 65 20 6c 6f 63 6b 69  ween.  The locki
9f30: 6e 67 20 6d 69 67 68 74 20 66 61 69 6c 20 6f 6e  ng might fail on
9f40: 20 6f 6e 65 20 6f 66 20 74 68 65 20 6c 61 74 65   one of the late
9f50: 72 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e 73  r.** transitions
9f60: 20 6c 65 61 76 69 6e 67 20 74 68 65 20 6c 6f 63   leaving the loc
9f70: 6b 20 73 74 61 74 65 20 64 69 66 66 65 72 65 6e  k state differen
9f80: 74 20 66 72 6f 6d 20 77 68 61 74 20 69 74 20 73  t from what it s
9f90: 74 61 72 74 65 64 20 62 75 74 0a 2a 2a 20 73 74  tarted but.** st
9fa0: 69 6c 6c 20 73 68 6f 72 74 20 6f 66 20 69 74 73  ill short of its
9fb0: 20 67 6f 61 6c 2e 20 20 54 68 65 20 66 6f 6c 6c   goal.  The foll
9fc0: 6f 77 69 6e 67 20 63 68 61 72 74 20 73 68 6f 77  owing chart show
9fd0: 73 20 74 68 65 20 61 6c 6c 6f 77 65 64 0a 2a 2a  s the allowed.**
9fe0: 20 74 72 61 6e 73 69 74 69 6f 6e 73 20 61 6e 64   transitions and
9ff0: 20 74 68 65 20 69 6e 73 65 72 74 65 64 20 69 6e   the inserted in
a000: 74 65 72 6d 65 64 69 61 74 65 20 73 74 61 74 65  termediate state
a010: 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 55 4e 4c 4f  s:.**.**    UNLO
a020: 43 4b 45 44 20 2d 3e 20 53 48 41 52 45 44 0a 2a  CKED -> SHARED.*
a030: 2a 20 20 20 20 53 48 41 52 45 44 20 2d 3e 20 52  *    SHARED -> R
a040: 45 53 45 52 56 45 44 0a 2a 2a 20 20 20 20 53 48  ESERVED.**    SH
a050: 41 52 45 44 20 2d 3e 20 28 50 45 4e 44 49 4e 47  ARED -> (PENDING
a060: 29 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a  ) -> EXCLUSIVE.*
a070: 2a 20 20 20 20 52 45 53 45 52 56 45 44 20 2d 3e  *    RESERVED ->
a080: 20 28 50 45 4e 44 49 4e 47 29 20 2d 3e 20 45 58   (PENDING) -> EX
a090: 43 4c 55 53 49 56 45 0a 2a 2a 20 20 20 20 50 45  CLUSIVE.**    PE
a0a0: 4e 44 49 4e 47 20 2d 3e 20 45 58 43 4c 55 53 49  NDING -> EXCLUSI
a0b0: 56 45 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  VE.**.** This ro
a0c0: 75 74 69 6e 65 20 77 69 6c 6c 20 6f 6e 6c 79 20  utine will only 
a0d0: 69 6e 63 72 65 61 73 65 20 61 20 6c 6f 63 6b 2e  increase a lock.
a0e0: 20 20 55 73 65 20 74 68 65 20 73 71 6c 69 74 65    Use the sqlite
a0f0: 33 4f 73 55 6e 6c 6f 63 6b 28 29 0a 2a 2a 20 72  3OsUnlock().** r
a100: 6f 75 74 69 6e 65 20 74 6f 20 6c 6f 77 65 72 20  outine to lower 
a110: 61 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 2e  a locking level.
a120: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75  .*/.static int u
a130: 6e 69 78 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f  nixLock(sqlite3_
a140: 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 6c 6f  file *id, int lo
a150: 63 6b 74 79 70 65 29 7b 0a 20 20 2f 2a 20 54 68  cktype){.  /* Th
a160: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 64 65 73 63  e following desc
a170: 72 69 62 65 73 20 74 68 65 20 69 6d 70 6c 65 6d  ribes the implem
a180: 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20  entation of the 
a190: 76 61 72 69 6f 75 73 20 6c 6f 63 6b 73 20 61 6e  various locks an
a1a0: 64 0a 20 20 2a 2a 20 6c 6f 63 6b 20 74 72 61 6e  d.  ** lock tran
a1b0: 73 69 74 69 6f 6e 73 20 69 6e 20 74 65 72 6d 73  sitions in terms
a1c0: 20 6f 66 20 74 68 65 20 50 4f 53 49 58 20 61 64   of the POSIX ad
a1d0: 76 69 73 6f 72 79 20 73 68 61 72 65 64 20 61 6e  visory shared an
a1e0: 64 20 65 78 63 6c 75 73 69 76 65 0a 20 20 2a 2a  d exclusive.  **
a1f0: 20 6c 6f 63 6b 20 70 72 69 6d 69 74 69 76 65 73   lock primitives
a200: 20 28 63 61 6c 6c 65 64 20 72 65 61 64 2d 6c 6f   (called read-lo
a210: 63 6b 73 20 61 6e 64 20 77 72 69 74 65 2d 6c 6f  cks and write-lo
a220: 63 6b 73 20 62 65 6c 6f 77 2c 20 74 6f 20 61 76  cks below, to av
a230: 6f 69 64 0a 20 20 2a 2a 20 63 6f 6e 66 75 73 69  oid.  ** confusi
a240: 6f 6e 20 77 69 74 68 20 53 51 4c 69 74 65 20 6c  on with SQLite l
a250: 6f 63 6b 20 6e 61 6d 65 73 29 2e 20 54 68 65 20  ock names). The 
a260: 61 6c 67 6f 72 69 74 68 6d 73 20 61 72 65 20 63  algorithms are c
a270: 6f 6d 70 6c 69 63 61 74 65 64 0a 20 20 2a 2a 20  omplicated.  ** 
a280: 73 6c 69 67 68 74 6c 79 20 69 6e 20 6f 72 64 65  slightly in orde
a290: 72 20 74 6f 20 62 65 20 63 6f 6d 70 61 74 69 62  r to be compatib
a2a0: 6c 65 20 77 69 74 68 20 77 69 6e 64 6f 77 73 20  le with windows 
a2b0: 73 79 73 74 65 6d 73 20 73 69 6d 75 6c 74 61 6e  systems simultan
a2c0: 65 6f 75 73 6c 79 0a 20 20 2a 2a 20 61 63 63 65  eously.  ** acce
a2d0: 73 73 69 6e 67 20 74 68 65 20 73 61 6d 65 20 64  ssing the same d
a2e0: 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 69 6e  atabase file, in
a2f0: 20 63 61 73 65 20 74 68 61 74 20 69 73 20 65 76   case that is ev
a300: 65 72 20 72 65 71 75 69 72 65 64 2e 0a 20 20 2a  er required..  *
a310: 2a 0a 20 20 2a 2a 20 53 79 6d 62 6f 6c 73 20 64  *.  ** Symbols d
a320: 65 66 69 6e 65 64 20 69 6e 20 6f 73 2e 68 20 69  efined in os.h i
a330: 6e 64 65 6e 74 69 66 79 20 74 68 65 20 27 70 65  ndentify the 'pe
a340: 6e 64 69 6e 67 20 62 79 74 65 27 20 61 6e 64 20  nding byte' and 
a350: 74 68 65 20 27 72 65 73 65 72 76 65 64 0a 20 20  the 'reserved.  
a360: 2a 2a 20 62 79 74 65 27 2c 20 65 61 63 68 20 73  ** byte', each s
a370: 69 6e 67 6c 65 20 62 79 74 65 73 20 61 74 20 77  ingle bytes at w
a380: 65 6c 6c 20 6b 6e 6f 77 6e 20 6f 66 66 73 65 74  ell known offset
a390: 73 2c 20 61 6e 64 20 74 68 65 20 27 73 68 61 72  s, and the 'shar
a3a0: 65 64 20 62 79 74 65 0a 20 20 2a 2a 20 72 61 6e  ed byte.  ** ran
a3b0: 67 65 27 2c 20 61 20 72 61 6e 67 65 20 6f 66 20  ge', a range of 
a3c0: 35 31 30 20 62 79 74 65 73 20 61 74 20 61 20 77  510 bytes at a w
a3d0: 65 6c 6c 20 6b 6e 6f 77 6e 20 6f 66 66 73 65 74  ell known offset
a3e0: 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 6f 20 6f  ..  **.  ** To o
a3f0: 62 74 61 69 6e 20 61 20 53 48 41 52 45 44 20 6c  btain a SHARED l
a400: 6f 63 6b 2c 20 61 20 72 65 61 64 2d 6c 6f 63 6b  ock, a read-lock
a410: 20 69 73 20 6f 62 74 61 69 6e 65 64 20 6f 6e 20   is obtained on 
a420: 74 68 65 20 27 70 65 6e 64 69 6e 67 0a 20 20 2a  the 'pending.  *
a430: 2a 20 62 79 74 65 27 2e 20 20 49 66 20 74 68 69  * byte'.  If thi
a440: 73 20 69 73 20 73 75 63 63 65 73 73 66 75 6c 2c  s is successful,
a450: 20 61 20 72 61 6e 64 6f 6d 20 62 79 74 65 20 66   a random byte f
a460: 72 6f 6d 20 74 68 65 20 27 73 68 61 72 65 64 20  rom the 'shared 
a470: 62 79 74 65 0a 20 20 2a 2a 20 72 61 6e 67 65 27  byte.  ** range'
a480: 20 69 73 20 72 65 61 64 2d 6c 6f 63 6b 65 64 20   is read-locked 
a490: 61 6e 64 20 74 68 65 20 6c 6f 63 6b 20 6f 6e 20  and the lock on 
a4a0: 74 68 65 20 27 70 65 6e 64 69 6e 67 20 62 79 74  the 'pending byt
a4b0: 65 27 20 72 65 6c 65 61 73 65 64 2e 0a 20 20 2a  e' released..  *
a4c0: 2a 0a 20 20 2a 2a 20 41 20 70 72 6f 63 65 73 73  *.  ** A process
a4d0: 20 6d 61 79 20 6f 6e 6c 79 20 6f 62 74 61 69 6e   may only obtain
a4e0: 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b   a RESERVED lock
a4f0: 20 61 66 74 65 72 20 69 74 20 68 61 73 20 61 20   after it has a 
a500: 53 48 41 52 45 44 20 6c 6f 63 6b 2e 0a 20 20 2a  SHARED lock..  *
a510: 2a 20 41 20 52 45 53 45 52 56 45 44 20 6c 6f 63  * A RESERVED loc
a520: 6b 20 69 73 20 69 6d 70 6c 65 6d 65 6e 74 65 64  k is implemented
a530: 20 62 79 20 67 72 61 62 62 69 6e 67 20 61 20 77   by grabbing a w
a540: 72 69 74 65 2d 6c 6f 63 6b 20 6f 6e 20 74 68 65  rite-lock on the
a550: 0a 20 20 2a 2a 20 27 72 65 73 65 72 76 65 64 20  .  ** 'reserved 
a560: 62 79 74 65 27 2e 20 0a 20 20 2a 2a 0a 20 20 2a  byte'. .  **.  *
a570: 2a 20 41 20 70 72 6f 63 65 73 73 20 6d 61 79 20  * A process may 
a580: 6f 6e 6c 79 20 6f 62 74 61 69 6e 20 61 20 50 45  only obtain a PE
a590: 4e 44 49 4e 47 20 6c 6f 63 6b 20 61 66 74 65 72  NDING lock after
a5a0: 20 69 74 20 68 61 73 20 6f 62 74 61 69 6e 65 64   it has obtained
a5b0: 20 61 0a 20 20 2a 2a 20 53 48 41 52 45 44 20 6c   a.  ** SHARED l
a5c0: 6f 63 6b 2e 20 41 20 50 45 4e 44 49 4e 47 20 6c  ock. A PENDING l
a5d0: 6f 63 6b 20 69 73 20 69 6d 70 6c 65 6d 65 6e 74  ock is implement
a5e0: 65 64 20 62 79 20 6f 62 74 61 69 6e 69 6e 67 20  ed by obtaining 
a5f0: 61 20 77 72 69 74 65 2d 6c 6f 63 6b 0a 20 20 2a  a write-lock.  *
a600: 2a 20 6f 6e 20 74 68 65 20 27 70 65 6e 64 69 6e  * on the 'pendin
a610: 67 20 62 79 74 65 27 2e 20 54 68 69 73 20 65 6e  g byte'. This en
a620: 73 75 72 65 73 20 74 68 61 74 20 6e 6f 20 6e 65  sures that no ne
a630: 77 20 53 48 41 52 45 44 20 6c 6f 63 6b 73 20 63  w SHARED locks c
a640: 61 6e 20 62 65 0a 20 20 2a 2a 20 6f 62 74 61 69  an be.  ** obtai
a650: 6e 65 64 2c 20 62 75 74 20 65 78 69 73 74 69 6e  ned, but existin
a660: 67 20 53 48 41 52 45 44 20 6c 6f 63 6b 73 20 61  g SHARED locks a
a670: 72 65 20 61 6c 6c 6f 77 65 64 20 74 6f 20 70 65  re allowed to pe
a680: 72 73 69 73 74 2e 20 41 20 70 72 6f 63 65 73 73  rsist. A process
a690: 0a 20 20 2a 2a 20 64 6f 65 73 20 6e 6f 74 20 68  .  ** does not h
a6a0: 61 76 65 20 74 6f 20 6f 62 74 61 69 6e 20 61 20  ave to obtain a 
a6b0: 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 6f 6e  RESERVED lock on
a6c0: 20 74 68 65 20 77 61 79 20 74 6f 20 61 20 50 45   the way to a PE
a6d0: 4e 44 49 4e 47 20 6c 6f 63 6b 2e 0a 20 20 2a 2a  NDING lock..  **
a6e0: 20 54 68 69 73 20 70 72 6f 70 65 72 74 79 20 69   This property i
a6f0: 73 20 75 73 65 64 20 62 79 20 74 68 65 20 61 6c  s used by the al
a700: 67 6f 72 69 74 68 6d 20 66 6f 72 20 72 6f 6c 6c  gorithm for roll
a710: 69 6e 67 20 62 61 63 6b 20 61 20 6a 6f 75 72 6e  ing back a journ
a720: 61 6c 20 66 69 6c 65 0a 20 20 2a 2a 20 61 66 74  al file.  ** aft
a730: 65 72 20 61 20 63 72 61 73 68 2e 0a 20 20 2a 2a  er a crash..  **
a740: 0a 20 20 2a 2a 20 41 6e 20 45 58 43 4c 55 53 49  .  ** An EXCLUSI
a750: 56 45 20 6c 6f 63 6b 2c 20 6f 62 74 61 69 6e 65  VE lock, obtaine
a760: 64 20 61 66 74 65 72 20 61 20 50 45 4e 44 49 4e  d after a PENDIN
a770: 47 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64 2c 20  G lock is held, 
a780: 69 73 0a 20 20 2a 2a 20 69 6d 70 6c 65 6d 65 6e  is.  ** implemen
a790: 74 65 64 20 62 79 20 6f 62 74 61 69 6e 69 6e 67  ted by obtaining
a7a0: 20 61 20 77 72 69 74 65 2d 6c 6f 63 6b 20 6f 6e   a write-lock on
a7b0: 20 74 68 65 20 65 6e 74 69 72 65 20 27 73 68 61   the entire 'sha
a7c0: 72 65 64 20 62 79 74 65 0a 20 20 2a 2a 20 72 61  red byte.  ** ra
a7d0: 6e 67 65 27 2e 20 53 69 6e 63 65 20 61 6c 6c 20  nge'. Since all 
a7e0: 6f 74 68 65 72 20 6c 6f 63 6b 73 20 72 65 71 75  other locks requ
a7f0: 69 72 65 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20  ire a read-lock 
a800: 6f 6e 20 6f 6e 65 20 6f 66 20 74 68 65 20 62 79  on one of the by
a810: 74 65 73 0a 20 20 2a 2a 20 77 69 74 68 69 6e 20  tes.  ** within 
a820: 74 68 69 73 20 72 61 6e 67 65 2c 20 74 68 69 73  this range, this
a830: 20 65 6e 73 75 72 65 73 20 74 68 61 74 20 6e 6f   ensures that no
a840: 20 6f 74 68 65 72 20 6c 6f 63 6b 73 20 61 72 65   other locks are
a850: 20 68 65 6c 64 20 6f 6e 20 74 68 65 0a 20 20 2a   held on the.  *
a860: 2a 20 64 61 74 61 62 61 73 65 2e 20 0a 20 20 2a  * database. .  *
a870: 2a 0a 20 20 2a 2a 20 54 68 65 20 72 65 61 73 6f  *.  ** The reaso
a880: 6e 20 61 20 73 69 6e 67 6c 65 20 62 79 74 65 20  n a single byte 
a890: 63 61 6e 6e 6f 74 20 62 65 20 75 73 65 64 20 69  cannot be used i
a8a0: 6e 73 74 65 61 64 20 6f 66 20 74 68 65 20 27 73  nstead of the 's
a8b0: 68 61 72 65 64 20 62 79 74 65 0a 20 20 2a 2a 20  hared byte.  ** 
a8c0: 72 61 6e 67 65 27 20 69 73 20 74 68 61 74 20 73  range' is that s
a8d0: 6f 6d 65 20 76 65 72 73 69 6f 6e 73 20 6f 66 20  ome versions of 
a8e0: 77 69 6e 64 6f 77 73 20 64 6f 20 6e 6f 74 20 73  windows do not s
a8f0: 75 70 70 6f 72 74 20 72 65 61 64 2d 6c 6f 63 6b  upport read-lock
a900: 73 2e 20 42 79 0a 20 20 2a 2a 20 6c 6f 63 6b 69  s. By.  ** locki
a910: 6e 67 20 61 20 72 61 6e 64 6f 6d 20 62 79 74 65  ng a random byte
a920: 20 66 72 6f 6d 20 61 20 72 61 6e 67 65 2c 20 63   from a range, c
a930: 6f 6e 63 75 72 72 65 6e 74 20 53 48 41 52 45 44  oncurrent SHARED
a940: 20 6c 6f 63 6b 73 20 6d 61 79 20 65 78 69 73 74   locks may exist
a950: 0a 20 20 2a 2a 20 65 76 65 6e 20 69 66 20 74 68  .  ** even if th
a960: 65 20 6c 6f 63 6b 69 6e 67 20 70 72 69 6d 69 74  e locking primit
a970: 69 76 65 20 75 73 65 64 20 69 73 20 61 6c 77 61  ive used is alwa
a980: 79 73 20 61 20 77 72 69 74 65 2d 6c 6f 63 6b 2e  ys a write-lock.
a990: 0a 20 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d  .  */.  int rc =
a9a0: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 75 6e   SQLITE_OK;.  un
a9b0: 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20  ixFile *pFile = 
a9c0: 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20  (unixFile*)id;. 
a9d0: 20 73 74 72 75 63 74 20 75 6e 69 78 4c 6f 63 6b   struct unixLock
a9e0: 49 6e 66 6f 20 2a 70 4c 6f 63 6b 20 3d 20 70 46  Info *pLock = pF
a9f0: 69 6c 65 2d 3e 70 4c 6f 63 6b 3b 0a 20 20 73 74  ile->pLock;.  st
aa00: 72 75 63 74 20 66 6c 6f 63 6b 20 6c 6f 63 6b 3b  ruct flock lock;
aa10: 0a 20 20 69 6e 74 20 73 20 3d 20 30 3b 0a 20 20  .  int s = 0;.  
aa20: 69 6e 74 20 74 45 72 72 6e 6f 20 3d 20 30 3b 0a  int tErrno = 0;.
aa30: 0a 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65  .  assert( pFile
aa40: 20 29 3b 0a 20 20 4f 53 54 52 41 43 45 37 28 22   );.  OSTRACE7("
aa50: 4c 4f 43 4b 20 20 20 20 25 64 20 25 73 20 77 61  LOCK    %d %s wa
aa60: 73 20 25 73 28 25 73 2c 25 64 29 20 70 69 64 3d  s %s(%s,%d) pid=
aa70: 25 64 20 28 75 6e 69 78 29 5c 6e 22 2c 20 70 46  %d (unix)\n", pF
aa80: 69 6c 65 2d 3e 68 2c 0a 20 20 20 20 20 20 6c 6f  ile->h,.      lo
aa90: 63 6b 74 79 70 65 4e 61 6d 65 28 6c 6f 63 6b 74  cktypeName(lockt
aaa0: 79 70 65 29 2c 20 6c 6f 63 6b 74 79 70 65 4e 61  ype), locktypeNa
aab0: 6d 65 28 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79  me(pFile->lockty
aac0: 70 65 29 2c 0a 20 20 20 20 20 20 6c 6f 63 6b 74  pe),.      lockt
aad0: 79 70 65 4e 61 6d 65 28 70 4c 6f 63 6b 2d 3e 6c  ypeName(pLock->l
aae0: 6f 63 6b 74 79 70 65 29 2c 20 70 4c 6f 63 6b 2d  ocktype), pLock-
aaf0: 3e 63 6e 74 20 2c 20 67 65 74 70 69 64 28 29 29  >cnt , getpid())
ab00: 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65  ;..  /* If there
ab10: 20 69 73 20 61 6c 72 65 61 64 79 20 61 20 6c 6f   is already a lo
ab20: 63 6b 20 6f 66 20 74 68 69 73 20 74 79 70 65 20  ck of this type 
ab30: 6f 72 20 6d 6f 72 65 20 72 65 73 74 72 69 63 74  or more restrict
ab40: 69 76 65 20 6f 6e 20 74 68 65 0a 20 20 2a 2a 20  ive on the.  ** 
ab50: 75 6e 69 78 46 69 6c 65 2c 20 64 6f 20 6e 6f 74  unixFile, do not
ab60: 68 69 6e 67 2e 20 44 6f 6e 27 74 20 75 73 65 20  hing. Don't use 
ab70: 74 68 65 20 65 6e 64 5f 6c 6f 63 6b 3a 20 65 78  the end_lock: ex
ab80: 69 74 20 70 61 74 68 2c 20 61 73 0a 20 20 2a 2a  it path, as.  **
ab90: 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28   unixEnterMutex(
aba0: 29 20 68 61 73 6e 27 74 20 62 65 65 6e 20 63 61  ) hasn't been ca
abb0: 6c 6c 65 64 20 79 65 74 2e 0a 20 20 2a 2f 0a 20  lled yet..  */. 
abc0: 20 69 66 28 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b   if( pFile->lock
abd0: 74 79 70 65 3e 3d 6c 6f 63 6b 74 79 70 65 20 29  type>=locktype )
abe0: 7b 0a 20 20 20 20 4f 53 54 52 41 43 45 33 28 22  {.    OSTRACE3("
abf0: 4c 4f 43 4b 20 20 20 20 25 64 20 25 73 20 6f 6b  LOCK    %d %s ok
ac00: 20 28 61 6c 72 65 61 64 79 20 68 65 6c 64 29 20   (already held) 
ac10: 28 75 6e 69 78 29 5c 6e 22 2c 20 70 46 69 6c 65  (unix)\n", pFile
ac20: 2d 3e 68 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ->h,.           
ac30: 20 6c 6f 63 6b 74 79 70 65 4e 61 6d 65 28 6c 6f   locktypeName(lo
ac40: 63 6b 74 79 70 65 29 29 3b 0a 20 20 20 20 72 65  cktype));.    re
ac50: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
ac60: 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73    }..  /* Make s
ac70: 75 72 65 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20  ure the locking 
ac80: 73 65 71 75 65 6e 63 65 20 69 73 20 63 6f 72 72  sequence is corr
ac90: 65 63 74 2e 0a 20 20 2a 2a 20 20 28 31 29 20 57  ect..  **  (1) W
aca0: 65 20 6e 65 76 65 72 20 6d 6f 76 65 20 66 72 6f  e never move fro
acb0: 6d 20 75 6e 6c 6f 63 6b 65 64 20 74 6f 20 61 6e  m unlocked to an
acc0: 79 74 68 69 6e 67 20 68 69 67 68 65 72 20 74 68  ything higher th
acd0: 61 6e 20 73 68 61 72 65 64 20 6c 6f 63 6b 2e 0a  an shared lock..
ace0: 20 20 2a 2a 20 20 28 32 29 20 53 51 4c 69 74 65    **  (2) SQLite
acf0: 20 6e 65 76 65 72 20 65 78 70 6c 69 63 69 74 6c   never explicitl
ad00: 79 20 72 65 71 75 65 73 74 73 20 61 20 70 65 6e  y requests a pen
ad10: 64 69 67 20 6c 6f 63 6b 2e 0a 20 20 2a 2a 20 20  dig lock..  **  
ad20: 28 33 29 20 41 20 73 68 61 72 65 64 20 6c 6f 63  (3) A shared loc
ad30: 6b 20 69 73 20 61 6c 77 61 79 73 20 68 65 6c 64  k is always held
ad40: 20 77 68 65 6e 20 61 20 72 65 73 65 72 76 65 20   when a reserve 
ad50: 6c 6f 63 6b 20 69 73 20 72 65 71 75 65 73 74 65  lock is requeste
ad60: 64 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  d..  */.  assert
ad70: 28 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70  ( pFile->locktyp
ad80: 65 21 3d 4e 4f 5f 4c 4f 43 4b 20 7c 7c 20 6c 6f  e!=NO_LOCK || lo
ad90: 63 6b 74 79 70 65 3d 3d 53 48 41 52 45 44 5f 4c  cktype==SHARED_L
ada0: 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28  OCK );.  assert(
adb0: 20 6c 6f 63 6b 74 79 70 65 21 3d 50 45 4e 44 49   locktype!=PENDI
adc0: 4e 47 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73  NG_LOCK );.  ass
add0: 65 72 74 28 20 6c 6f 63 6b 74 79 70 65 21 3d 52  ert( locktype!=R
ade0: 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 7c 7c 20  ESERVED_LOCK || 
adf0: 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3d  pFile->locktype=
ae00: 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a  =SHARED_LOCK );.
ae10: 0a 20 20 2f 2a 20 54 68 69 73 20 6d 75 74 65 78  .  /* This mutex
ae20: 20 69 73 20 6e 65 65 64 65 64 20 62 65 63 61 75   is needed becau
ae30: 73 65 20 70 46 69 6c 65 2d 3e 70 4c 6f 63 6b 20  se pFile->pLock 
ae40: 69 73 20 73 68 61 72 65 64 20 61 63 72 6f 73 73  is shared across
ae50: 20 74 68 72 65 61 64 73 0a 20 20 2a 2f 0a 20 20   threads.  */.  
ae60: 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29  unixEnterMutex()
ae70: 3b 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72  ;..  /* Make sur
ae80: 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 68  e the current th
ae90: 72 65 61 64 20 6f 77 6e 73 20 74 68 65 20 70 46  read owns the pF
aea0: 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d  ile..  */.  rc =
aeb0: 20 74 72 61 6e 73 66 65 72 4f 77 6e 65 72 73 68   transferOwnersh
aec0: 69 70 28 70 46 69 6c 65 29 3b 0a 20 20 69 66 28  ip(pFile);.  if(
aed0: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
aee0: 7b 0a 20 20 20 20 75 6e 69 78 4c 65 61 76 65 4d  {.    unixLeaveM
aef0: 75 74 65 78 28 29 3b 0a 20 20 20 20 72 65 74 75  utex();.    retu
af00: 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 70 4c 6f  rn rc;.  }.  pLo
af10: 63 6b 20 3d 20 70 46 69 6c 65 2d 3e 70 4c 6f 63  ck = pFile->pLoc
af20: 6b 3b 0a 0a 20 20 2f 2a 20 49 66 20 73 6f 6d 65  k;..  /* If some
af30: 20 74 68 72 65 61 64 20 75 73 69 6e 67 20 74 68   thread using th
af40: 69 73 20 50 49 44 20 68 61 73 20 61 20 6c 6f 63  is PID has a loc
af50: 6b 20 76 69 61 20 61 20 64 69 66 66 65 72 65 6e  k via a differen
af60: 74 20 75 6e 69 78 46 69 6c 65 2a 0a 20 20 2a 2a  t unixFile*.  **
af70: 20 68 61 6e 64 6c 65 20 74 68 61 74 20 70 72 65   handle that pre
af80: 63 6c 75 64 65 73 20 74 68 65 20 72 65 71 75 65  cludes the reque
af90: 73 74 65 64 20 6c 6f 63 6b 2c 20 72 65 74 75 72  sted lock, retur
afa0: 6e 20 42 55 53 59 2e 0a 20 20 2a 2f 0a 20 20 69  n BUSY..  */.  i
afb0: 66 28 20 28 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74  f( (pFile->lockt
afc0: 79 70 65 21 3d 70 4c 6f 63 6b 2d 3e 6c 6f 63 6b  ype!=pLock->lock
afd0: 74 79 70 65 20 26 26 20 0a 20 20 20 20 20 20 20  type && .       
afe0: 20 20 20 28 70 4c 6f 63 6b 2d 3e 6c 6f 63 6b 74     (pLock->lockt
aff0: 79 70 65 3e 3d 50 45 4e 44 49 4e 47 5f 4c 4f 43  ype>=PENDING_LOC
b000: 4b 20 7c 7c 20 6c 6f 63 6b 74 79 70 65 3e 53 48  K || locktype>SH
b010: 41 52 45 44 5f 4c 4f 43 4b 29 29 0a 20 20 29 7b  ARED_LOCK)).  ){
b020: 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
b030: 5f 42 55 53 59 3b 0a 20 20 20 20 67 6f 74 6f 20  _BUSY;.    goto 
b040: 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 7d 0a 0a 20  end_lock;.  }.. 
b050: 20 2f 2a 20 49 66 20 61 20 53 48 41 52 45 44 20   /* If a SHARED 
b060: 6c 6f 63 6b 20 69 73 20 72 65 71 75 65 73 74 65  lock is requeste
b070: 64 2c 20 61 6e 64 20 73 6f 6d 65 20 74 68 72 65  d, and some thre
b080: 61 64 20 75 73 69 6e 67 20 74 68 69 73 20 50 49  ad using this PI
b090: 44 20 61 6c 72 65 61 64 79 0a 20 20 2a 2a 20 68  D already.  ** h
b0a0: 61 73 20 61 20 53 48 41 52 45 44 20 6f 72 20 52  as a SHARED or R
b0b0: 45 53 45 52 56 45 44 20 6c 6f 63 6b 2c 20 74 68  ESERVED lock, th
b0c0: 65 6e 20 69 6e 63 72 65 6d 65 6e 74 20 72 65 66  en increment ref
b0d0: 65 72 65 6e 63 65 20 63 6f 75 6e 74 73 20 61 6e  erence counts an
b0e0: 64 0a 20 20 2a 2a 20 72 65 74 75 72 6e 20 53 51  d.  ** return SQ
b0f0: 4c 49 54 45 5f 4f 4b 2e 0a 20 20 2a 2f 0a 20 20  LITE_OK..  */.  
b100: 69 66 28 20 6c 6f 63 6b 74 79 70 65 3d 3d 53 48  if( locktype==SH
b110: 41 52 45 44 5f 4c 4f 43 4b 20 26 26 20 0a 20 20  ARED_LOCK && .  
b120: 20 20 20 20 28 70 4c 6f 63 6b 2d 3e 6c 6f 63 6b      (pLock->lock
b130: 74 79 70 65 3d 3d 53 48 41 52 45 44 5f 4c 4f 43  type==SHARED_LOC
b140: 4b 20 7c 7c 20 70 4c 6f 63 6b 2d 3e 6c 6f 63 6b  K || pLock->lock
b150: 74 79 70 65 3d 3d 52 45 53 45 52 56 45 44 5f 4c  type==RESERVED_L
b160: 4f 43 4b 29 20 29 7b 0a 20 20 20 20 61 73 73 65  OCK) ){.    asse
b170: 72 74 28 20 6c 6f 63 6b 74 79 70 65 3d 3d 53 48  rt( locktype==SH
b180: 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20  ARED_LOCK );.   
b190: 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 2d 3e   assert( pFile->
b1a0: 6c 6f 63 6b 74 79 70 65 3d 3d 30 20 29 3b 0a 20  locktype==0 );. 
b1b0: 20 20 20 61 73 73 65 72 74 28 20 70 4c 6f 63 6b     assert( pLock
b1c0: 2d 3e 63 6e 74 3e 30 20 29 3b 0a 20 20 20 20 70  ->cnt>0 );.    p
b1d0: 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 20 3d  File->locktype =
b1e0: 20 53 48 41 52 45 44 5f 4c 4f 43 4b 3b 0a 20 20   SHARED_LOCK;.  
b1f0: 20 20 70 4c 6f 63 6b 2d 3e 63 6e 74 2b 2b 3b 0a    pLock->cnt++;.
b200: 20 20 20 20 70 46 69 6c 65 2d 3e 70 4f 70 65 6e      pFile->pOpen
b210: 2d 3e 6e 4c 6f 63 6b 2b 2b 3b 0a 20 20 20 20 67  ->nLock++;.    g
b220: 6f 74 6f 20 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20  oto end_lock;.  
b230: 7d 0a 0a 0a 20 20 2f 2a 20 41 20 50 45 4e 44 49  }...  /* A PENDI
b240: 4e 47 20 6c 6f 63 6b 20 69 73 20 6e 65 65 64 65  NG lock is neede
b250: 64 20 62 65 66 6f 72 65 20 61 63 71 75 69 72 69  d before acquiri
b260: 6e 67 20 61 20 53 48 41 52 45 44 20 6c 6f 63 6b  ng a SHARED lock
b270: 20 61 6e 64 20 62 65 66 6f 72 65 0a 20 20 2a 2a   and before.  **
b280: 20 61 63 71 75 69 72 69 6e 67 20 61 6e 20 45 58   acquiring an EX
b290: 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 20 20 46  CLUSIVE lock.  F
b2a0: 6f 72 20 74 68 65 20 53 48 41 52 45 44 20 6c 6f  or the SHARED lo
b2b0: 63 6b 2c 20 74 68 65 20 50 45 4e 44 49 4e 47 20  ck, the PENDING 
b2c0: 77 69 6c 6c 0a 20 20 2a 2a 20 62 65 20 72 65 6c  will.  ** be rel
b2d0: 65 61 73 65 64 2e 0a 20 20 2a 2f 0a 20 20 6c 6f  eased..  */.  lo
b2e0: 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 31 4c 3b 0a 20  ck.l_len = 1L;. 
b2f0: 20 6c 6f 63 6b 2e 6c 5f 77 68 65 6e 63 65 20 3d   lock.l_whence =
b300: 20 53 45 45 4b 5f 53 45 54 3b 0a 20 20 69 66 28   SEEK_SET;.  if(
b310: 20 6c 6f 63 6b 74 79 70 65 3d 3d 53 48 41 52 45   locktype==SHARE
b320: 44 5f 4c 4f 43 4b 20 0a 20 20 20 20 20 20 7c 7c  D_LOCK .      ||
b330: 20 28 6c 6f 63 6b 74 79 70 65 3d 3d 45 58 43 4c   (locktype==EXCL
b340: 55 53 49 56 45 5f 4c 4f 43 4b 20 26 26 20 70 46  USIVE_LOCK && pF
b350: 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3c 50 45  ile->locktype<PE
b360: 4e 44 49 4e 47 5f 4c 4f 43 4b 29 0a 20 20 29 7b  NDING_LOCK).  ){
b370: 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65  .    lock.l_type
b380: 20 3d 20 28 6c 6f 63 6b 74 79 70 65 3d 3d 53 48   = (locktype==SH
b390: 41 52 45 44 5f 4c 4f 43 4b 3f 46 5f 52 44 4c 43  ARED_LOCK?F_RDLC
b3a0: 4b 3a 46 5f 57 52 4c 43 4b 29 3b 0a 20 20 20 20  K:F_WRLCK);.    
b3b0: 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 50  lock.l_start = P
b3c0: 45 4e 44 49 4e 47 5f 42 59 54 45 3b 0a 20 20 20  ENDING_BYTE;.   
b3d0: 20 73 20 3d 20 66 63 6e 74 6c 28 70 46 69 6c 65   s = fcntl(pFile
b3e0: 2d 3e 68 2c 20 46 5f 53 45 54 4c 4b 2c 20 26 6c  ->h, F_SETLK, &l
b3f0: 6f 63 6b 29 3b 0a 20 20 20 20 69 66 28 20 73 3d  ock);.    if( s=
b400: 3d 28 2d 31 29 20 29 7b 0a 20 20 20 20 20 20 74  =(-1) ){.      t
b410: 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20  Errno = errno;. 
b420: 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
b430: 45 72 72 6f 72 46 72 6f 6d 50 6f 73 69 78 45 72  ErrorFromPosixEr
b440: 72 6f 72 28 74 45 72 72 6e 6f 2c 20 53 51 4c 49  ror(tErrno, SQLI
b450: 54 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b 29 3b 0a  TE_IOERR_LOCK);.
b460: 20 20 20 20 20 20 69 66 28 20 49 53 5f 4c 4f 43        if( IS_LOC
b470: 4b 5f 45 52 52 4f 52 28 72 63 29 20 29 7b 0a 20  K_ERROR(rc) ){. 
b480: 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61         pFile->la
b490: 73 74 45 72 72 6e 6f 20 3d 20 74 45 72 72 6e 6f  stErrno = tErrno
b4a0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
b4b0: 67 6f 74 6f 20 65 6e 64 5f 6c 6f 63 6b 3b 0a 20  goto end_lock;. 
b4c0: 20 20 20 7d 0a 20 20 7d 0a 0a 0a 20 20 2f 2a 20     }.  }...  /* 
b4d0: 49 66 20 63 6f 6e 74 72 6f 6c 20 67 65 74 73 20  If control gets 
b4e0: 74 6f 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 74  to this point, t
b4f0: 68 65 6e 20 61 63 74 75 61 6c 6c 79 20 67 6f 20  hen actually go 
b500: 61 68 65 61 64 20 61 6e 64 20 6d 61 6b 65 0a 20  ahead and make. 
b510: 20 2a 2a 20 6f 70 65 72 61 74 69 6e 67 20 73 79   ** operating sy
b520: 73 74 65 6d 20 63 61 6c 6c 73 20 66 6f 72 20 74  stem calls for t
b530: 68 65 20 73 70 65 63 69 66 69 65 64 20 6c 6f 63  he specified loc
b540: 6b 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6c 6f  k..  */.  if( lo
b550: 63 6b 74 79 70 65 3d 3d 53 48 41 52 45 44 5f 4c  cktype==SHARED_L
b560: 4f 43 4b 20 29 7b 0a 20 20 20 20 61 73 73 65 72  OCK ){.    asser
b570: 74 28 20 70 4c 6f 63 6b 2d 3e 63 6e 74 3d 3d 30  t( pLock->cnt==0
b580: 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
b590: 70 4c 6f 63 6b 2d 3e 6c 6f 63 6b 74 79 70 65 3d  pLock->locktype=
b5a0: 3d 30 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 4e 6f  =0 );..    /* No
b5b0: 77 20 67 65 74 20 74 68 65 20 72 65 61 64 2d 6c  w get the read-l
b5c0: 6f 63 6b 20 2a 2f 0a 20 20 20 20 6c 6f 63 6b 2e  ock */.    lock.
b5d0: 6c 5f 73 74 61 72 74 20 3d 20 53 48 41 52 45 44  l_start = SHARED
b5e0: 5f 46 49 52 53 54 3b 0a 20 20 20 20 6c 6f 63 6b  _FIRST;.    lock
b5f0: 2e 6c 5f 6c 65 6e 20 3d 20 53 48 41 52 45 44 5f  .l_len = SHARED_
b600: 53 49 5a 45 3b 0a 20 20 20 20 69 66 28 20 28 73  SIZE;.    if( (s
b610: 20 3d 20 66 63 6e 74 6c 28 70 46 69 6c 65 2d 3e   = fcntl(pFile->
b620: 68 2c 20 46 5f 53 45 54 4c 4b 2c 20 26 6c 6f 63  h, F_SETLK, &loc
b630: 6b 29 29 3d 3d 28 2d 31 29 20 29 7b 0a 20 20 20  k))==(-1) ){.   
b640: 20 20 20 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e     tErrno = errn
b650: 6f 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2f 2a 20  o;.    }.    /* 
b660: 44 72 6f 70 20 74 68 65 20 74 65 6d 70 6f 72 61  Drop the tempora
b670: 72 79 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 20  ry PENDING lock 
b680: 2a 2f 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74  */.    lock.l_st
b690: 61 72 74 20 3d 20 50 45 4e 44 49 4e 47 5f 42 59  art = PENDING_BY
b6a0: 54 45 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 6c  TE;.    lock.l_l
b6b0: 65 6e 20 3d 20 31 4c 3b 0a 20 20 20 20 6c 6f 63  en = 1L;.    loc
b6c0: 6b 2e 6c 5f 74 79 70 65 20 3d 20 46 5f 55 4e 4c  k.l_type = F_UNL
b6d0: 43 4b 3b 0a 20 20 20 20 69 66 28 20 66 63 6e 74  CK;.    if( fcnt
b6e0: 6c 28 70 46 69 6c 65 2d 3e 68 2c 20 46 5f 53 45  l(pFile->h, F_SE
b6f0: 54 4c 4b 2c 20 26 6c 6f 63 6b 29 21 3d 30 20 29  TLK, &lock)!=0 )
b700: 7b 0a 20 20 20 20 20 20 69 66 28 20 73 20 21 3d  {.      if( s !=
b710: 20 2d 31 20 29 7b 0a 20 20 20 20 20 20 20 20 2f   -1 ){.        /
b720: 2a 20 54 68 69 73 20 63 6f 75 6c 64 20 68 61 70  * This could hap
b730: 70 65 6e 20 77 69 74 68 20 61 20 6e 65 74 77 6f  pen with a netwo
b740: 72 6b 20 6d 6f 75 6e 74 20 2a 2f 0a 20 20 20 20  rk mount */.    
b750: 20 20 20 20 74 45 72 72 6e 6f 20 3d 20 65 72 72      tErrno = err
b760: 6e 6f 3b 20 0a 20 20 20 20 20 20 20 20 72 63 20  no; .        rc 
b770: 3d 20 73 71 6c 69 74 65 45 72 72 6f 72 46 72 6f  = sqliteErrorFro
b780: 6d 50 6f 73 69 78 45 72 72 6f 72 28 74 45 72 72  mPosixError(tErr
b790: 6e 6f 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  no, SQLITE_IOERR
b7a0: 5f 55 4e 4c 4f 43 4b 29 3b 20 0a 20 20 20 20 20  _UNLOCK); .     
b7b0: 20 20 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45     if( IS_LOCK_E
b7c0: 52 52 4f 52 28 72 63 29 20 29 7b 0a 20 20 20 20  RROR(rc) ){.    
b7d0: 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73        pFile->las
b7e0: 74 45 72 72 6e 6f 20 3d 20 74 45 72 72 6e 6f 3b  tErrno = tErrno;
b7f0: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
b800: 20 20 20 67 6f 74 6f 20 65 6e 64 5f 6c 6f 63 6b     goto end_lock
b810: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
b820: 20 20 20 20 69 66 28 20 73 3d 3d 28 2d 31 29 20      if( s==(-1) 
b830: 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  ){.      rc = sq
b840: 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d 50 6f 73  liteErrorFromPos
b850: 69 78 45 72 72 6f 72 28 74 45 72 72 6e 6f 2c 20  ixError(tErrno, 
b860: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4c 4f 43  SQLITE_IOERR_LOC
b870: 4b 29 3b 0a 20 20 20 20 20 20 69 66 28 20 49 53  K);.      if( IS
b880: 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 72 63 29 20  _LOCK_ERROR(rc) 
b890: 29 7b 0a 20 20 20 20 20 20 20 20 70 46 69 6c 65  ){.        pFile
b8a0: 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 74 45  ->lastErrno = tE
b8b0: 72 72 6e 6f 3b 0a 20 20 20 20 20 20 7d 0a 20 20  rrno;.      }.  
b8c0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70    }else{.      p
b8d0: 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 20 3d  File->locktype =
b8e0: 20 53 48 41 52 45 44 5f 4c 4f 43 4b 3b 0a 20 20   SHARED_LOCK;.  
b8f0: 20 20 20 20 70 46 69 6c 65 2d 3e 70 4f 70 65 6e      pFile->pOpen
b900: 2d 3e 6e 4c 6f 63 6b 2b 2b 3b 0a 20 20 20 20 20  ->nLock++;.     
b910: 20 70 4c 6f 63 6b 2d 3e 63 6e 74 20 3d 20 31 3b   pLock->cnt = 1;
b920: 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69  .    }.  }else i
b930: 66 28 20 6c 6f 63 6b 74 79 70 65 3d 3d 45 58 43  f( locktype==EXC
b940: 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 26 26 20 70  LUSIVE_LOCK && p
b950: 4c 6f 63 6b 2d 3e 63 6e 74 3e 31 20 29 7b 0a 20  Lock->cnt>1 ){. 
b960: 20 20 20 2f 2a 20 57 65 20 61 72 65 20 74 72 79     /* We are try
b970: 69 6e 67 20 66 6f 72 20 61 6e 20 65 78 63 6c 75  ing for an exclu
b980: 73 69 76 65 20 6c 6f 63 6b 20 62 75 74 20 61 6e  sive lock but an
b990: 6f 74 68 65 72 20 74 68 72 65 61 64 20 69 6e 20  other thread in 
b9a0: 74 68 69 73 0a 20 20 20 20 2a 2a 20 73 61 6d 65  this.    ** same
b9b0: 20 70 72 6f 63 65 73 73 20 69 73 20 73 74 69 6c   process is stil
b9c0: 6c 20 68 6f 6c 64 69 6e 67 20 61 20 73 68 61 72  l holding a shar
b9d0: 65 64 20 6c 6f 63 6b 2e 20 2a 2f 0a 20 20 20 20  ed lock. */.    
b9e0: 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59  rc = SQLITE_BUSY
b9f0: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f  ;.  }else{.    /
ba00: 2a 20 54 68 65 20 72 65 71 75 65 73 74 20 77 61  * The request wa
ba10: 73 20 66 6f 72 20 61 20 52 45 53 45 52 56 45 44  s for a RESERVED
ba20: 20 6f 72 20 45 58 43 4c 55 53 49 56 45 20 6c 6f   or EXCLUSIVE lo
ba30: 63 6b 2e 20 20 49 74 20 69 73 0a 20 20 20 20 2a  ck.  It is.    *
ba40: 2a 20 61 73 73 75 6d 65 64 20 74 68 61 74 20 74  * assumed that t
ba50: 68 65 72 65 20 69 73 20 61 20 53 48 41 52 45 44  here is a SHARED
ba60: 20 6f 72 20 67 72 65 61 74 65 72 20 6c 6f 63 6b   or greater lock
ba70: 20 6f 6e 20 74 68 65 20 66 69 6c 65 0a 20 20 20   on the file.   
ba80: 20 2a 2a 20 61 6c 72 65 61 64 79 2e 0a 20 20 20   ** already..   
ba90: 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20   */.    assert( 
baa0: 30 21 3d 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79  0!=pFile->lockty
bab0: 70 65 20 29 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c  pe );.    lock.l
bac0: 5f 74 79 70 65 20 3d 20 46 5f 57 52 4c 43 4b 3b  _type = F_WRLCK;
bad0: 0a 20 20 20 20 73 77 69 74 63 68 28 20 6c 6f 63  .    switch( loc
bae0: 6b 74 79 70 65 20 29 7b 0a 20 20 20 20 20 20 63  ktype ){.      c
baf0: 61 73 65 20 52 45 53 45 52 56 45 44 5f 4c 4f 43  ase RESERVED_LOC
bb00: 4b 3a 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e  K:.        lock.
bb10: 6c 5f 73 74 61 72 74 20 3d 20 52 45 53 45 52 56  l_start = RESERV
bb20: 45 44 5f 42 59 54 45 3b 0a 20 20 20 20 20 20 20  ED_BYTE;.       
bb30: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61   break;.      ca
bb40: 73 65 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43  se EXCLUSIVE_LOC
bb50: 4b 3a 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e  K:.        lock.
bb60: 6c 5f 73 74 61 72 74 20 3d 20 53 48 41 52 45 44  l_start = SHARED
bb70: 5f 46 49 52 53 54 3b 0a 20 20 20 20 20 20 20 20  _FIRST;.        
bb80: 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 53 48 41  lock.l_len = SHA
bb90: 52 45 44 5f 53 49 5a 45 3b 0a 20 20 20 20 20 20  RED_SIZE;.      
bba0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 64    break;.      d
bbb0: 65 66 61 75 6c 74 3a 0a 20 20 20 20 20 20 20 20  efault:.        
bbc0: 61 73 73 65 72 74 28 30 29 3b 0a 20 20 20 20 7d  assert(0);.    }
bbd0: 0a 20 20 20 20 73 20 3d 20 66 63 6e 74 6c 28 70  .    s = fcntl(p
bbe0: 46 69 6c 65 2d 3e 68 2c 20 46 5f 53 45 54 4c 4b  File->h, F_SETLK
bbf0: 2c 20 26 6c 6f 63 6b 29 3b 0a 20 20 20 20 69 66  , &lock);.    if
bc00: 28 20 73 3d 3d 28 2d 31 29 20 29 7b 0a 20 20 20  ( s==(-1) ){.   
bc10: 20 20 20 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e     tErrno = errn
bc20: 6f 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  o;.      rc = sq
bc30: 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d 50 6f 73  liteErrorFromPos
bc40: 69 78 45 72 72 6f 72 28 74 45 72 72 6e 6f 2c 20  ixError(tErrno, 
bc50: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4c 4f 43  SQLITE_IOERR_LOC
bc60: 4b 29 3b 0a 20 20 20 20 20 20 69 66 28 20 49 53  K);.      if( IS
bc70: 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 72 63 29 20  _LOCK_ERROR(rc) 
bc80: 29 7b 0a 20 20 20 20 20 20 20 20 70 46 69 6c 65  ){.        pFile
bc90: 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 74 45  ->lastErrno = tE
bca0: 72 72 6e 6f 3b 0a 20 20 20 20 20 20 7d 0a 20 20  rrno;.      }.  
bcb0: 20 20 7d 0a 20 20 7d 0a 20 20 0a 0a 23 69 66 6e    }.  }.  ..#ifn
bcc0: 64 65 66 20 4e 44 45 42 55 47 0a 20 20 2f 2a 20  def NDEBUG.  /* 
bcd0: 53 65 74 20 75 70 20 74 68 65 20 74 72 61 6e 73  Set up the trans
bce0: 61 63 74 69 6f 6e 2d 63 6f 75 6e 74 65 72 20 63  action-counter c
bcf0: 68 61 6e 67 65 20 63 68 65 63 6b 69 6e 67 20 66  hange checking f
bd00: 6c 61 67 73 20 77 68 65 6e 0a 20 20 2a 2a 20 74  lags when.  ** t
bd10: 72 61 6e 73 69 74 69 6f 6e 69 6e 67 20 66 72 6f  ransitioning fro
bd20: 6d 20 61 20 53 48 41 52 45 44 20 74 6f 20 61 20  m a SHARED to a 
bd30: 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 2e 20 20  RESERVED lock.  
bd40: 54 68 65 20 63 68 61 6e 67 65 0a 20 20 2a 2a 20  The change.  ** 
bd50: 66 72 6f 6d 20 53 48 41 52 45 44 20 74 6f 20 52  from SHARED to R
bd60: 45 53 45 52 56 45 44 20 6d 61 72 6b 73 20 74 68  ESERVED marks th
bd70: 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 61  e beginning of a
bd80: 20 6e 6f 72 6d 61 6c 0a 20 20 2a 2a 20 77 72 69   normal.  ** wri
bd90: 74 65 20 6f 70 65 72 61 74 69 6f 6e 20 28 6e 6f  te operation (no
bda0: 74 20 61 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 20  t a hot journal 
bdb0: 72 6f 6c 6c 62 61 63 6b 29 2e 0a 20 20 2a 2f 0a  rollback)..  */.
bdc0: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
bdd0: 5f 4f 4b 0a 20 20 20 26 26 20 70 46 69 6c 65 2d  _OK.   && pFile-
bde0: 3e 6c 6f 63 6b 74 79 70 65 3c 3d 53 48 41 52 45  >locktype<=SHARE
bdf0: 44 5f 4c 4f 43 4b 0a 20 20 20 26 26 20 6c 6f 63  D_LOCK.   && loc
be00: 6b 74 79 70 65 3d 3d 52 45 53 45 52 56 45 44 5f  ktype==RESERVED_
be10: 4c 4f 43 4b 0a 20 20 29 7b 0a 20 20 20 20 70 46  LOCK.  ){.    pF
be20: 69 6c 65 2d 3e 74 72 61 6e 73 43 6e 74 72 43 68  ile->transCntrCh
be30: 6e 67 20 3d 20 30 3b 0a 20 20 20 20 70 46 69 6c  ng = 0;.    pFil
be40: 65 2d 3e 64 62 55 70 64 61 74 65 20 3d 20 30 3b  e->dbUpdate = 0;
be50: 0a 20 20 20 20 70 46 69 6c 65 2d 3e 69 6e 4e 6f  .    pFile->inNo
be60: 72 6d 61 6c 57 72 69 74 65 20 3d 20 31 3b 0a 20  rmalWrite = 1;. 
be70: 20 7d 0a 23 65 6e 64 69 66 0a 0a 0a 20 20 69 66   }.#endif...  if
be80: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
be90: 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c 6f  ){.    pFile->lo
bea0: 63 6b 74 79 70 65 20 3d 20 6c 6f 63 6b 74 79 70  cktype = locktyp
beb0: 65 3b 0a 20 20 20 20 70 4c 6f 63 6b 2d 3e 6c 6f  e;.    pLock->lo
bec0: 63 6b 74 79 70 65 20 3d 20 6c 6f 63 6b 74 79 70  cktype = locktyp
bed0: 65 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 6c  e;.  }else if( l
bee0: 6f 63 6b 74 79 70 65 3d 3d 45 58 43 4c 55 53 49  ocktype==EXCLUSI
bef0: 56 45 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 70  VE_LOCK ){.    p
bf00: 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 20 3d  File->locktype =
bf10: 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 3b 0a 20   PENDING_LOCK;. 
bf20: 20 20 20 70 4c 6f 63 6b 2d 3e 6c 6f 63 6b 74 79     pLock->lockty
bf30: 70 65 20 3d 20 50 45 4e 44 49 4e 47 5f 4c 4f 43  pe = PENDING_LOC
bf40: 4b 3b 0a 20 20 7d 0a 0a 65 6e 64 5f 6c 6f 63 6b  K;.  }..end_lock
bf50: 3a 0a 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74  :.  unixLeaveMut
bf60: 65 78 28 29 3b 0a 20 20 4f 53 54 52 41 43 45 34  ex();.  OSTRACE4
bf70: 28 22 4c 4f 43 4b 20 20 20 20 25 64 20 25 73 20  ("LOCK    %d %s 
bf80: 25 73 20 28 75 6e 69 78 29 5c 6e 22 2c 20 70 46  %s (unix)\n", pF
bf90: 69 6c 65 2d 3e 68 2c 20 6c 6f 63 6b 74 79 70 65  ile->h, locktype
bfa0: 4e 61 6d 65 28 6c 6f 63 6b 74 79 70 65 29 2c 20  Name(locktype), 
bfb0: 0a 20 20 20 20 20 20 72 63 3d 3d 53 51 4c 49 54  .      rc==SQLIT
bfc0: 45 5f 4f 4b 20 3f 20 22 6f 6b 22 20 3a 20 22 66  E_OK ? "ok" : "f
bfd0: 61 69 6c 65 64 22 29 3b 0a 20 20 72 65 74 75 72  ailed");.  retur
bfe0: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  n rc;.}../*.** C
bff0: 6c 6f 73 65 20 61 6c 6c 20 66 69 6c 65 20 64 65  lose all file de
c000: 73 63 72 69 70 74 6f 72 73 20 61 63 63 75 6d 75  scriptors accumu
c010: 61 74 65 64 20 69 6e 20 74 68 65 20 75 6e 69 78  ated in the unix
c020: 4f 70 65 6e 43 6e 74 2d 3e 70 55 6e 75 73 65 64  OpenCnt->pUnused
c030: 20 6c 69 73 74 2e 0a 2a 2a 20 49 66 20 61 6c 6c   list..** If all
c040: 20 73 75 63 68 20 66 69 6c 65 20 64 65 73 63 72   such file descr
c050: 69 70 74 6f 72 73 20 61 72 65 20 63 6c 6f 73 65  iptors are close
c060: 64 20 77 69 74 68 6f 75 74 20 65 72 72 6f 72 2c  d without error,
c070: 20 74 68 65 20 6c 69 73 74 20 69 73 0a 2a 2a 20   the list is.** 
c080: 63 6c 65 61 72 65 64 20 61 6e 64 20 53 51 4c 49  cleared and SQLI
c090: 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e 0a  TE_OK returned..
c0a0: 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c  **.** Otherwise,
c0b0: 20 69 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   if an error occ
c0c0: 75 72 73 2c 20 74 68 65 6e 20 73 75 63 63 65 73  urs, then succes
c0d0: 73 66 75 6c 6c 79 20 63 6c 6f 73 65 64 20 66 69  sfully closed fi
c0e0: 6c 65 20 64 65 73 63 72 69 70 74 6f 72 0a 2a 2a  le descriptor.**
c0f0: 20 65 6e 74 72 69 65 73 20 61 72 65 20 72 65 6d   entries are rem
c100: 6f 76 65 64 20 66 72 6f 6d 20 74 68 65 20 6c 69  oved from the li
c110: 73 74 2c 20 61 6e 64 20 53 51 4c 49 54 45 5f 49  st, and SQLITE_I
c120: 4f 45 52 52 5f 43 4c 4f 53 45 20 72 65 74 75 72  OERR_CLOSE retur
c130: 6e 65 64 2e 20 0a 2a 2a 20 6e 6f 74 20 64 65 6c  ned. .** not del
c140: 65 74 65 64 20 61 6e 64 20 53 51 4c 49 54 45 5f  eted and SQLITE_
c150: 49 4f 45 52 52 5f 43 4c 4f 53 45 20 72 65 74 75  IOERR_CLOSE retu
c160: 72 6e 65 64 2e 0a 2a 2f 20 0a 73 74 61 74 69 63  rned..*/ .static
c170: 20 69 6e 74 20 63 6c 6f 73 65 50 65 6e 64 69 6e   int closePendin
c180: 67 46 64 73 28 75 6e 69 78 46 69 6c 65 20 2a 70  gFds(unixFile *p
c190: 46 69 6c 65 29 7b 0a 20 20 69 6e 74 20 72 63 20  File){.  int rc 
c1a0: 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 73  = SQLITE_OK;.  s
c1b0: 74 72 75 63 74 20 75 6e 69 78 4f 70 65 6e 43 6e  truct unixOpenCn
c1c0: 74 20 2a 70 4f 70 65 6e 20 3d 20 70 46 69 6c 65  t *pOpen = pFile
c1d0: 2d 3e 70 4f 70 65 6e 3b 0a 20 20 55 6e 69 78 55  ->pOpen;.  UnixU
c1e0: 6e 75 73 65 64 46 64 20 2a 70 45 72 72 6f 72 20  nusedFd *pError 
c1f0: 3d 20 30 3b 0a 20 20 55 6e 69 78 55 6e 75 73 65  = 0;.  UnixUnuse
c200: 64 46 64 20 2a 70 3b 0a 20 20 55 6e 69 78 55 6e  dFd *p;.  UnixUn
c210: 75 73 65 64 46 64 20 2a 70 4e 65 78 74 3b 0a 20  usedFd *pNext;. 
c220: 20 66 6f 72 28 70 3d 70 4f 70 65 6e 2d 3e 70 55   for(p=pOpen->pU
c230: 6e 75 73 65 64 3b 20 70 3b 20 70 3d 70 4e 65 78  nused; p; p=pNex
c240: 74 29 7b 0a 20 20 20 20 70 4e 65 78 74 20 3d 20  t){.    pNext = 
c250: 70 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 69 66  p->pNext;.    if
c260: 28 20 63 6c 6f 73 65 28 70 2d 3e 66 64 29 20 29  ( close(p->fd) )
c270: 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c  {.      pFile->l
c280: 61 73 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f  astErrno = errno
c290: 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  ;.      rc = SQL
c2a0: 49 54 45 5f 49 4f 45 52 52 5f 43 4c 4f 53 45 3b  ITE_IOERR_CLOSE;
c2b0: 0a 20 20 20 20 20 20 70 2d 3e 70 4e 65 78 74 20  .      p->pNext 
c2c0: 3d 20 70 45 72 72 6f 72 3b 0a 20 20 20 20 20 20  = pError;.      
c2d0: 70 45 72 72 6f 72 20 3d 20 70 3b 0a 20 20 20 20  pError = p;.    
c2e0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c  }else{.      sql
c2f0: 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 20 20  ite3_free(p);.  
c300: 20 20 7d 0a 20 20 7d 0a 20 20 70 4f 70 65 6e 2d    }.  }.  pOpen-
c310: 3e 70 55 6e 75 73 65 64 20 3d 20 70 45 72 72 6f  >pUnused = pErro
c320: 72 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  r;.  return rc;.
c330: 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 74 68 65  }../*.** Add the
c340: 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
c350: 20 75 73 65 64 20 62 79 20 66 69 6c 65 20 68 61   used by file ha
c360: 6e 64 6c 65 20 70 46 69 6c 65 20 74 6f 20 74 68  ndle pFile to th
c370: 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 0a  e corresponding.
c380: 2a 2a 20 70 55 6e 75 73 65 64 20 6c 69 73 74 2e  ** pUnused list.
c390: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
c3a0: 73 65 74 50 65 6e 64 69 6e 67 46 64 28 75 6e 69  setPendingFd(uni
c3b0: 78 46 69 6c 65 20 2a 70 46 69 6c 65 29 7b 0a 20  xFile *pFile){. 
c3c0: 20 73 74 72 75 63 74 20 75 6e 69 78 4f 70 65 6e   struct unixOpen
c3d0: 43 6e 74 20 2a 70 4f 70 65 6e 20 3d 20 70 46 69  Cnt *pOpen = pFi
c3e0: 6c 65 2d 3e 70 4f 70 65 6e 3b 0a 20 20 55 6e 69  le->pOpen;.  Uni
c3f0: 78 55 6e 75 73 65 64 46 64 20 2a 70 20 3d 20 70  xUnusedFd *p = p
c400: 46 69 6c 65 2d 3e 70 55 6e 75 73 65 64 3b 0a 20  File->pUnused;. 
c410: 20 70 2d 3e 70 4e 65 78 74 20 3d 20 70 4f 70 65   p->pNext = pOpe
c420: 6e 2d 3e 70 55 6e 75 73 65 64 3b 0a 20 20 70 4f  n->pUnused;.  pO
c430: 70 65 6e 2d 3e 70 55 6e 75 73 65 64 20 3d 20 70  pen->pUnused = p
c440: 3b 0a 20 20 70 46 69 6c 65 2d 3e 68 20 3d 20 2d  ;.  pFile->h = -
c450: 31 3b 0a 20 20 70 46 69 6c 65 2d 3e 70 55 6e 75  1;.  pFile->pUnu
c460: 73 65 64 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  sed = 0;.}../*.*
c470: 2a 20 4c 6f 77 65 72 20 74 68 65 20 6c 6f 63 6b  * Lower the lock
c480: 69 6e 67 20 6c 65 76 65 6c 20 6f 6e 20 66 69 6c  ing level on fil
c490: 65 20 64 65 73 63 72 69 70 74 6f 72 20 70 46 69  e descriptor pFi
c4a0: 6c 65 20 74 6f 20 6c 6f 63 6b 74 79 70 65 2e 20  le to locktype. 
c4b0: 20 6c 6f 63 6b 74 79 70 65 0a 2a 2a 20 6d 75 73   locktype.** mus
c4c0: 74 20 62 65 20 65 69 74 68 65 72 20 4e 4f 5f 4c  t be either NO_L
c4d0: 4f 43 4b 20 6f 72 20 53 48 41 52 45 44 5f 4c 4f  OCK or SHARED_LO
c4e0: 43 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  CK..**.** If the
c4f0: 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f   locking level o
c500: 66 20 74 68 65 20 66 69 6c 65 20 64 65 73 63 72  f the file descr
c510: 69 70 74 6f 72 20 69 73 20 61 6c 72 65 61 64 79  iptor is already
c520: 20 61 74 20 6f 72 20 62 65 6c 6f 77 0a 2a 2a 20   at or below.** 
c530: 74 68 65 20 72 65 71 75 65 73 74 65 64 20 6c 6f  the requested lo
c540: 63 6b 69 6e 67 20 6c 65 76 65 6c 2c 20 74 68 69  cking level, thi
c550: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e  s routine is a n
c560: 6f 2d 6f 70 2e 0a 2a 2a 20 0a 2a 2a 20 49 66 20  o-op..** .** If 
c570: 68 61 6e 64 6c 65 4e 46 53 55 6e 6c 6f 63 6b 20  handleNFSUnlock 
c580: 69 73 20 74 72 75 65 2c 20 74 68 65 6e 20 6f 6e  is true, then on
c590: 20 64 6f 77 6e 67 72 61 64 69 6e 67 20 61 6e 20   downgrading an 
c5a0: 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 74  EXCLUSIVE_LOCK t
c5b0: 6f 20 53 48 41 52 45 44 0a 2a 2a 20 74 68 65 20  o SHARED.** the 
c5c0: 62 79 74 65 20 72 61 6e 67 65 20 69 73 20 64 69  byte range is di
c5d0: 76 69 64 65 64 20 69 6e 74 6f 20 32 20 70 61 72  vided into 2 par
c5e0: 74 73 20 61 6e 64 20 74 68 65 20 66 69 72 73 74  ts and the first
c5f0: 20 70 61 72 74 20 69 73 20 75 6e 6c 6f 63 6b 65   part is unlocke
c600: 64 20 74 68 65 6e 0a 2a 2a 20 73 65 74 20 74 6f  d then.** set to
c610: 20 61 20 72 65 61 64 20 6c 6f 63 6b 2c 20 74 68   a read lock, th
c620: 65 6e 20 74 68 65 20 6f 74 68 65 72 20 70 61 72  en the other par
c630: 74 20 69 73 20 73 69 6d 70 6c 79 20 75 6e 6c 6f  t is simply unlo
c640: 63 6b 65 64 2e 20 20 54 68 69 73 20 77 6f 72 6b  cked.  This work
c650: 73 20 0a 2a 2a 20 61 72 6f 75 6e 64 20 61 20 62  s .** around a b
c660: 75 67 20 69 6e 20 42 53 44 20 4e 46 53 20 6c 6f  ug in BSD NFS lo
c670: 63 6b 64 20 28 61 6c 73 6f 20 73 65 65 6e 20 6f  ckd (also seen o
c680: 6e 20 4d 61 63 4f 53 58 20 31 30 2e 33 2b 29 20  n MacOSX 10.3+) 
c690: 74 68 61 74 20 66 61 69 6c 73 20 74 6f 20 0a 2a  that fails to .*
c6a0: 2a 20 72 65 6d 6f 76 65 20 74 68 65 20 77 72 69  * remove the wri
c6b0: 74 65 20 6c 6f 63 6b 20 6f 6e 20 61 20 72 65 67  te lock on a reg
c6c0: 69 6f 6e 20 77 68 65 6e 20 61 20 72 65 61 64 20  ion when a read 
c6d0: 6c 6f 63 6b 20 69 73 20 73 65 74 2e 0a 2a 2f 0a  lock is set..*/.
c6e0: 73 74 61 74 69 63 20 69 6e 74 20 5f 70 6f 73 69  static int _posi
c6f0: 78 55 6e 6c 6f 63 6b 28 73 71 6c 69 74 65 33 5f  xUnlock(sqlite3_
c700: 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 6c 6f  file *id, int lo
c710: 63 6b 74 79 70 65 2c 20 69 6e 74 20 68 61 6e 64  cktype, int hand
c720: 6c 65 4e 46 53 55 6e 6c 6f 63 6b 29 7b 0a 20 20  leNFSUnlock){.  
c730: 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20  unixFile *pFile 
c740: 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b  = (unixFile*)id;
c750: 0a 20 20 73 74 72 75 63 74 20 75 6e 69 78 4c 6f  .  struct unixLo
c760: 63 6b 49 6e 66 6f 20 2a 70 4c 6f 63 6b 3b 0a 20  ckInfo *pLock;. 
c770: 20 73 74 72 75 63 74 20 66 6c 6f 63 6b 20 6c 6f   struct flock lo
c780: 63 6b 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  ck;.  int rc = S
c790: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20  QLITE_OK;.  int 
c7a0: 68 3b 0a 20 20 69 6e 74 20 74 45 72 72 6e 6f 3b  h;.  int tErrno;
c7b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c7c0: 20 20 20 20 20 20 2f 2a 20 45 72 72 6f 72 20 63        /* Error c
c7d0: 6f 64 65 20 66 72 6f 6d 20 73 79 73 74 65 6d 20  ode from system 
c7e0: 63 61 6c 6c 20 65 72 72 6f 72 73 20 2a 2f 0a 0a  call errors */..
c7f0: 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 20    assert( pFile 
c800: 29 3b 0a 20 20 4f 53 54 52 41 43 45 37 28 22 55  );.  OSTRACE7("U
c810: 4e 4c 4f 43 4b 20 20 25 64 20 25 64 20 77 61 73  NLOCK  %d %d was
c820: 20 25 64 28 25 64 2c 25 64 29 20 70 69 64 3d 25   %d(%d,%d) pid=%
c830: 64 20 28 75 6e 69 78 29 5c 6e 22 2c 20 70 46 69  d (unix)\n", pFi
c840: 6c 65 2d 3e 68 2c 20 6c 6f 63 6b 74 79 70 65 2c  le->h, locktype,
c850: 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 6f  .      pFile->lo
c860: 63 6b 74 79 70 65 2c 20 70 46 69 6c 65 2d 3e 70  cktype, pFile->p
c870: 4c 6f 63 6b 2d 3e 6c 6f 63 6b 74 79 70 65 2c 20  Lock->locktype, 
c880: 70 46 69 6c 65 2d 3e 70 4c 6f 63 6b 2d 3e 63 6e  pFile->pLock->cn
c890: 74 2c 20 67 65 74 70 69 64 28 29 29 3b 0a 0a 20  t, getpid());.. 
c8a0: 20 61 73 73 65 72 74 28 20 6c 6f 63 6b 74 79 70   assert( locktyp
c8b0: 65 3c 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29  e<=SHARED_LOCK )
c8c0: 3b 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 6c  ;.  if( pFile->l
c8d0: 6f 63 6b 74 79 70 65 3c 3d 6c 6f 63 6b 74 79 70  ocktype<=locktyp
c8e0: 65 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  e ){.    return 
c8f0: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20  SQLITE_OK;.  }. 
c900: 20 69 66 28 20 43 48 45 43 4b 5f 54 48 52 45 41   if( CHECK_THREA
c910: 44 49 44 28 70 46 69 6c 65 29 20 29 7b 0a 20 20  DID(pFile) ){.  
c920: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
c930: 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a 20 20 7d  MISUSE_BKPT;.  }
c940: 0a 20 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65  .  unixEnterMute
c950: 78 28 29 3b 0a 20 20 68 20 3d 20 70 46 69 6c 65  x();.  h = pFile
c960: 2d 3e 68 3b 0a 20 20 70 4c 6f 63 6b 20 3d 20 70  ->h;.  pLock = p
c970: 46 69 6c 65 2d 3e 70 4c 6f 63 6b 3b 0a 20 20 61  File->pLock;.  a
c980: 73 73 65 72 74 28 20 70 4c 6f 63 6b 2d 3e 63 6e  ssert( pLock->cn
c990: 74 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 46  t!=0 );.  if( pF
c9a0: 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3e 53 48  ile->locktype>SH
c9b0: 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20  ARED_LOCK ){.   
c9c0: 20 61 73 73 65 72 74 28 20 70 4c 6f 63 6b 2d 3e   assert( pLock->
c9d0: 6c 6f 63 6b 74 79 70 65 3d 3d 70 46 69 6c 65 2d  locktype==pFile-
c9e0: 3e 6c 6f 63 6b 74 79 70 65 20 29 3b 0a 20 20 20  >locktype );.   
c9f0: 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72   SimulateIOError
ca00: 42 65 6e 69 67 6e 28 31 29 3b 0a 20 20 20 20 53  Benign(1);.    S
ca10: 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20  imulateIOError( 
ca20: 68 3d 28 2d 31 29 20 29 0a 20 20 20 20 53 69 6d  h=(-1) ).    Sim
ca30: 75 6c 61 74 65 49 4f 45 72 72 6f 72 42 65 6e 69  ulateIOErrorBeni
ca40: 67 6e 28 30 29 3b 0a 0a 23 69 66 6e 64 65 66 20  gn(0);..#ifndef 
ca50: 4e 44 45 42 55 47 0a 20 20 20 20 2f 2a 20 57 68  NDEBUG.    /* Wh
ca60: 65 6e 20 72 65 64 75 63 69 6e 67 20 61 20 6c 6f  en reducing a lo
ca70: 63 6b 20 73 75 63 68 20 74 68 61 74 20 6f 74 68  ck such that oth
ca80: 65 72 20 70 72 6f 63 65 73 73 65 73 20 63 61 6e  er processes can
ca90: 20 73 74 61 72 74 0a 20 20 20 20 2a 2a 20 72 65   start.    ** re
caa0: 61 64 69 6e 67 20 74 68 65 20 64 61 74 61 62 61  ading the databa
cab0: 73 65 20 66 69 6c 65 20 61 67 61 69 6e 2c 20 6d  se file again, m
cac0: 61 6b 65 20 73 75 72 65 20 74 68 61 74 20 74 68  ake sure that th
cad0: 65 0a 20 20 20 20 2a 2a 20 74 72 61 6e 73 61 63  e.    ** transac
cae0: 74 69 6f 6e 20 63 6f 75 6e 74 65 72 20 77 61 73  tion counter was
caf0: 20 75 70 64 61 74 65 64 20 69 66 20 61 6e 79 20   updated if any 
cb00: 70 61 72 74 20 6f 66 20 74 68 65 20 64 61 74 61  part of the data
cb10: 62 61 73 65 0a 20 20 20 20 2a 2a 20 66 69 6c 65  base.    ** file
cb20: 20 63 68 61 6e 67 65 64 2e 20 20 49 66 20 74 68   changed.  If th
cb30: 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f  e transaction co
cb40: 75 6e 74 65 72 20 69 73 20 6e 6f 74 20 75 70 64  unter is not upd
cb50: 61 74 65 64 2c 0a 20 20 20 20 2a 2a 20 6f 74 68  ated,.    ** oth
cb60: 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 74  er connections t
cb70: 6f 20 74 68 65 20 73 61 6d 65 20 66 69 6c 65 20  o the same file 
cb80: 6d 69 67 68 74 20 6e 6f 74 20 72 65 61 6c 69 7a  might not realiz
cb90: 65 20 74 68 61 74 0a 20 20 20 20 2a 2a 20 74 68  e that.    ** th
cba0: 65 20 66 69 6c 65 20 68 61 73 20 63 68 61 6e 67  e file has chang
cbb0: 65 64 20 61 6e 64 20 68 65 6e 63 65 20 6d 69 67  ed and hence mig
cbc0: 68 74 20 6e 6f 74 20 6b 6e 6f 77 20 74 6f 20 66  ht not know to f
cbd0: 6c 75 73 68 20 74 68 65 69 72 0a 20 20 20 20 2a  lush their.    *
cbe0: 2a 20 63 61 63 68 65 2e 20 20 54 68 65 20 75 73  * cache.  The us
cbf0: 65 20 6f 66 20 61 20 73 74 61 6c 65 20 63 61 63  e of a stale cac
cc00: 68 65 20 63 61 6e 20 6c 65 61 64 20 74 6f 20 64  he can lead to d
cc10: 61 74 61 62 61 73 65 20 63 6f 72 72 75 70 74 69  atabase corrupti
cc20: 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 23 69 66 20 30  on..    */.#if 0
cc30: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 46 69  .    assert( pFi
cc40: 6c 65 2d 3e 69 6e 4e 6f 72 6d 61 6c 57 72 69 74  le->inNormalWrit
cc50: 65 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 7c 7c  e==0.         ||
cc60: 20 70 46 69 6c 65 2d 3e 64 62 55 70 64 61 74 65   pFile->dbUpdate
cc70: 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 7c 7c 20  ==0.         || 
cc80: 70 46 69 6c 65 2d 3e 74 72 61 6e 73 43 6e 74 72  pFile->transCntr
cc90: 43 68 6e 67 3d 3d 31 20 29 3b 0a 23 65 6e 64 69  Chng==1 );.#endi
cca0: 66 0a 20 20 20 20 70 46 69 6c 65 2d 3e 69 6e 4e  f.    pFile->inN
ccb0: 6f 72 6d 61 6c 57 72 69 74 65 20 3d 20 30 3b 0a  ormalWrite = 0;.
ccc0: 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 64  #endif..    /* d
ccd0: 6f 77 6e 67 72 61 64 69 6e 67 20 74 6f 20 61 20  owngrading to a 
cce0: 73 68 61 72 65 64 20 6c 6f 63 6b 20 6f 6e 20 4e  shared lock on N
ccf0: 46 53 20 69 6e 76 6f 6c 76 65 73 20 63 6c 65 61  FS involves clea
cd00: 72 69 6e 67 20 74 68 65 20 77 72 69 74 65 20 6c  ring the write l
cd10: 6f 63 6b 0a 20 20 20 20 2a 2a 20 62 65 66 6f 72  ock.    ** befor
cd20: 65 20 65 73 74 61 62 6c 69 73 68 69 6e 67 20 74  e establishing t
cd30: 68 65 20 72 65 61 64 6c 6f 63 6b 20 2d 20 74 6f  he readlock - to
cd40: 20 61 76 6f 69 64 20 61 20 72 61 63 65 20 63 6f   avoid a race co
cd50: 6e 64 69 74 69 6f 6e 20 77 65 20 64 6f 77 6e 67  ndition we downg
cd60: 72 61 64 65 0a 20 20 20 20 2a 2a 20 74 68 65 20  rade.    ** the 
cd70: 6c 6f 63 6b 20 69 6e 20 32 20 62 6c 6f 63 6b 73  lock in 2 blocks
cd80: 2c 20 73 6f 20 74 68 61 74 20 70 61 72 74 20 6f  , so that part o
cd90: 66 20 74 68 65 20 72 61 6e 67 65 20 77 69 6c 6c  f the range will
cda0: 20 62 65 20 63 6f 76 65 72 65 64 20 62 79 20 61   be covered by a
cdb0: 20 0a 20 20 20 20 2a 2a 20 77 72 69 74 65 20 6c   .    ** write l
cdc0: 6f 63 6b 20 75 6e 74 69 6c 20 74 68 65 20 72 65  ock until the re
cdd0: 73 74 20 69 73 20 63 6f 76 65 72 65 64 20 62 79  st is covered by
cde0: 20 61 20 72 65 61 64 20 6c 6f 63 6b 3a 0a 20 20   a read lock:.  
cdf0: 20 20 2a 2a 20 20 31 3a 20 20 20 5b 57 57 57 57    **  1:   [WWWW
ce00: 57 5d 0a 20 20 20 20 2a 2a 20 20 32 3a 20 20 20  W].    **  2:   
ce10: 5b 2e 2e 2e 2e 57 5d 0a 20 20 20 20 2a 2a 20 20  [....W].    **  
ce20: 33 3a 20 20 20 5b 52 52 52 52 57 5d 0a 20 20 20  3:   [RRRRW].   
ce30: 20 2a 2a 20 20 34 3a 20 20 20 5b 52 52 52 52 2e   **  4:   [RRRR.
ce40: 5d 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ].    */.    if(
ce50: 20 6c 6f 63 6b 74 79 70 65 3d 3d 53 48 41 52 45   locktype==SHARE
ce60: 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 20 20  D_LOCK ){.      
ce70: 69 66 28 20 68 61 6e 64 6c 65 4e 46 53 55 6e 6c  if( handleNFSUnl
ce80: 6f 63 6b 20 29 7b 0a 20 20 20 20 20 20 20 20 6f  ock ){.        o
ce90: 66 66 5f 74 20 64 69 76 53 69 7a 65 20 3d 20 53  ff_t divSize = S
cea0: 48 41 52 45 44 5f 53 49 5a 45 20 2d 20 31 3b 0a  HARED_SIZE - 1;.
ceb0: 20 20 20 20 20 20 20 20 0a 20 20 20 20 20 20 20          .       
cec0: 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d 20 46   lock.l_type = F
ced0: 5f 55 4e 4c 43 4b 3b 0a 20 20 20 20 20 20 20 20  _UNLCK;.        
cee0: 6c 6f 63 6b 2e 6c 5f 77 68 65 6e 63 65 20 3d 20  lock.l_whence = 
cef0: 53 45 45 4b 5f 53 45 54 3b 0a 20 20 20 20 20 20  SEEK_SET;.      
cf00: 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d    lock.l_start =
cf10: 20 53 48 41 52 45 44 5f 46 49 52 53 54 3b 0a 20   SHARED_FIRST;. 
cf20: 20 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 6c 65         lock.l_le
cf30: 6e 20 3d 20 64 69 76 53 69 7a 65 3b 0a 20 20 20  n = divSize;.   
cf40: 20 20 20 20 20 69 66 28 20 66 63 6e 74 6c 28 68       if( fcntl(h
cf50: 2c 20 46 5f 53 45 54 4c 4b 2c 20 26 6c 6f 63 6b  , F_SETLK, &lock
cf60: 29 3d 3d 28 2d 31 29 20 29 7b 0a 20 20 20 20 20  )==(-1) ){.     
cf70: 20 20 20 20 20 74 45 72 72 6e 6f 20 3d 20 65 72       tErrno = er
cf80: 72 6e 6f 3b 0a 20 20 20 20 20 20 20 20 20 20 72  rno;.          r
cf90: 63 20 3d 20 73 71 6c 69 74 65 45 72 72 6f 72 46  c = sqliteErrorF
cfa0: 72 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28 74 45  romPosixError(tE
cfb0: 72 72 6e 6f 2c 20 53 51 4c 49 54 45 5f 49 4f 45  rrno, SQLITE_IOE
cfc0: 52 52 5f 55 4e 4c 4f 43 4b 29 3b 0a 20 20 20 20  RR_UNLOCK);.    
cfd0: 20 20 20 20 20 20 69 66 28 20 49 53 5f 4c 4f 43        if( IS_LOC
cfe0: 4b 5f 45 52 52 4f 52 28 72 63 29 20 29 7b 0a 20  K_ERROR(rc) ){. 
cff0: 20 20 20 20 20 20 20 20 20 20 20 70 46 69 6c 65             pFile
d000: 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 74 45  ->lastErrno = tE
d010: 72 72 6e 6f 3b 0a 20 20 20 20 20 20 20 20 20 20  rrno;.          
d020: 7d 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f  }.          goto
d030: 20 65 6e 64 5f 75 6e 6c 6f 63 6b 3b 0a 20 20 20   end_unlock;.   
d040: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 6c       }.        l
d050: 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d 20 46 5f 52  ock.l_type = F_R
d060: 44 4c 43 4b 3b 0a 20 20 20 20 20 20 20 20 6c 6f  DLCK;.        lo
d070: 63 6b 2e 6c 5f 77 68 65 6e 63 65 20 3d 20 53 45  ck.l_whence = SE
d080: 45 4b 5f 53 45 54 3b 0a 20 20 20 20 20 20 20 20  EK_SET;.        
d090: 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 53  lock.l_start = S
d0a0: 48 41 52 45 44 5f 46 49 52 53 54 3b 0a 20 20 20  HARED_FIRST;.   
d0b0: 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20       lock.l_len 
d0c0: 3d 20 64 69 76 53 69 7a 65 3b 0a 20 20 20 20 20  = divSize;.     
d0d0: 20 20 20 69 66 28 20 66 63 6e 74 6c 28 68 2c 20     if( fcntl(h, 
d0e0: 46 5f 53 45 54 4c 4b 2c 20 26 6c 6f 63 6b 29 3d  F_SETLK, &lock)=
d0f0: 3d 28 2d 31 29 20 29 7b 0a 20 20 20 20 20 20 20  =(-1) ){.       
d100: 20 20 20 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e     tErrno = errn
d110: 6f 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  o;.          rc 
d120: 3d 20 73 71 6c 69 74 65 45 72 72 6f 72 46 72 6f  = sqliteErrorFro
d130: 6d 50 6f 73 69 78 45 72 72 6f 72 28 74 45 72 72  mPosixError(tErr
d140: 6e 6f 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  no, SQLITE_IOERR
d150: 5f 52 44 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20  _RDLOCK);.      
d160: 20 20 20 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f      if( IS_LOCK_
d170: 45 52 52 4f 52 28 72 63 29 20 29 7b 0a 20 20 20  ERROR(rc) ){.   
d180: 20 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e           pFile->
d190: 6c 61 73 74 45 72 72 6e 6f 20 3d 20 74 45 72 72  lastErrno = tErr
d1a0: 6e 6f 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  no;.          }.
d1b0: 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65            goto e
d1c0: 6e 64 5f 75 6e 6c 6f 63 6b 3b 0a 20 20 20 20 20  nd_unlock;.     
d1d0: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 6c 6f 63     }.        loc
d1e0: 6b 2e 6c 5f 74 79 70 65 20 3d 20 46 5f 55 4e 4c  k.l_type = F_UNL
d1f0: 43 4b 3b 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b  CK;.        lock
d200: 2e 6c 5f 77 68 65 6e 63 65 20 3d 20 53 45 45 4b  .l_whence = SEEK
d210: 5f 53 45 54 3b 0a 20 20 20 20 20 20 20 20 6c 6f  _SET;.        lo
d220: 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 53 48 41  ck.l_start = SHA
d230: 52 45 44 5f 46 49 52 53 54 2b 64 69 76 53 69 7a  RED_FIRST+divSiz
d240: 65 3b 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e  e;.        lock.
d250: 6c 5f 6c 65 6e 20 3d 20 53 48 41 52 45 44 5f 53  l_len = SHARED_S
d260: 49 5a 45 2d 64 69 76 53 69 7a 65 3b 0a 20 20 20  IZE-divSize;.   
d270: 20 20 20 20 20 69 66 28 20 66 63 6e 74 6c 28 68       if( fcntl(h
d280: 2c 20 46 5f 53 45 54 4c 4b 2c 20 26 6c 6f 63 6b  , F_SETLK, &lock
d290: 29 3d 3d 28 2d 31 29 20 29 7b 0a 20 20 20 20 20  )==(-1) ){.     
d2a0: 20 20 20 20 20 74 45 72 72 6e 6f 20 3d 20 65 72       tErrno = er
d2b0: 72 6e 6f 3b 0a 20 20 20 20 20 20 20 20 20 20 72  rno;.          r
d2c0: 63 20 3d 20 73 71 6c 69 74 65 45 72 72 6f 72 46  c = sqliteErrorF
d2d0: 72 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28 74 45  romPosixError(tE
d2e0: 72 72 6e 6f 2c 20 53 51 4c 49 54 45 5f 49 4f 45  rrno, SQLITE_IOE
d2f0: 52 52 5f 55 4e 4c 4f 43 4b 29 3b 0a 20 20 20 20  RR_UNLOCK);.    
d300: 20 20 20 20 20 20 69 66 28 20 49 53 5f 4c 4f 43        if( IS_LOC
d310: 4b 5f 45 52 52 4f 52 28 72 63 29 20 29 7b 0a 20  K_ERROR(rc) ){. 
d320: 20 20 20 20 20 20 20 20 20 20 20 70 46 69 6c 65             pFile
d330: 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 74 45  ->lastErrno = tE
d340: 72 72 6e 6f 3b 0a 20 20 20 20 20 20 20 20 20 20  rrno;.          
d350: 7d 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f  }.          goto
d360: 20 65 6e 64 5f 75 6e 6c 6f 63 6b 3b 0a 20 20 20   end_unlock;.   
d370: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c       }.      }el
d380: 73 65 7b 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b  se{.        lock
d390: 2e 6c 5f 74 79 70 65 20 3d 20 46 5f 52 44 4c 43  .l_type = F_RDLC
d3a0: 4b 3b 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e  K;.        lock.
d3b0: 6c 5f 77 68 65 6e 63 65 20 3d 20 53 45 45 4b 5f  l_whence = SEEK_
d3c0: 53 45 54 3b 0a 20 20 20 20 20 20 20 20 6c 6f 63  SET;.        loc
d3d0: 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 53 48 41 52  k.l_start = SHAR
d3e0: 45 44 5f 46 49 52 53 54 3b 0a 20 20 20 20 20 20  ED_FIRST;.      
d3f0: 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 53    lock.l_len = S
d400: 48 41 52 45 44 5f 53 49 5a 45 3b 0a 20 20 20 20  HARED_SIZE;.    
d410: 20 20 20 20 69 66 28 20 66 63 6e 74 6c 28 68 2c      if( fcntl(h,
d420: 20 46 5f 53 45 54 4c 4b 2c 20 26 6c 6f 63 6b 29   F_SETLK, &lock)
d430: 3d 3d 28 2d 31 29 20 29 7b 0a 20 20 20 20 20 20  ==(-1) ){.      
d440: 20 20 20 20 74 45 72 72 6e 6f 20 3d 20 65 72 72      tErrno = err
d450: 6e 6f 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63  no;.          rc
d460: 20 3d 20 73 71 6c 69 74 65 45 72 72 6f 72 46 72   = sqliteErrorFr
d470: 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28 74 45 72  omPosixError(tEr
d480: 72 6e 6f 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52  rno, SQLITE_IOER
d490: 52 5f 52 44 4c 4f 43 4b 29 3b 0a 20 20 20 20 20  R_RDLOCK);.     
d4a0: 20 20 20 20 20 69 66 28 20 49 53 5f 4c 4f 43 4b       if( IS_LOCK
d4b0: 5f 45 52 52 4f 52 28 72 63 29 20 29 7b 0a 20 20  _ERROR(rc) ){.  
d4c0: 20 20 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d            pFile-
d4d0: 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 74 45 72  >lastErrno = tEr
d4e0: 72 6e 6f 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  rno;.          }
d4f0: 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20  .          goto 
d500: 65 6e 64 5f 75 6e 6c 6f 63 6b 3b 0a 20 20 20 20  end_unlock;.    
d510: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
d520: 20 20 7d 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74    }.    lock.l_t
d530: 79 70 65 20 3d 20 46 5f 55 4e 4c 43 4b 3b 0a 20  ype = F_UNLCK;. 
d540: 20 20 20 6c 6f 63 6b 2e 6c 5f 77 68 65 6e 63 65     lock.l_whence
d550: 20 3d 20 53 45 45 4b 5f 53 45 54 3b 0a 20 20 20   = SEEK_SET;.   
d560: 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20   lock.l_start = 
d570: 50 45 4e 44 49 4e 47 5f 42 59 54 45 3b 0a 20 20  PENDING_BYTE;.  
d580: 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 32    lock.l_len = 2
d590: 4c 3b 20 20 61 73 73 65 72 74 28 20 50 45 4e 44  L;  assert( PEND
d5a0: 49 4e 47 5f 42 59 54 45 2b 31 3d 3d 52 45 53 45  ING_BYTE+1==RESE
d5b0: 52 56 45 44 5f 42 59 54 45 20 29 3b 0a 20 20 20  RVED_BYTE );.   
d5c0: 20 69 66 28 20 66 63 6e 74 6c 28 68 2c 20 46 5f   if( fcntl(h, F_
d5d0: 53 45 54 4c 4b 2c 20 26 6c 6f 63 6b 29 21 3d 28  SETLK, &lock)!=(
d5e0: 2d 31 29 20 29 7b 0a 20 20 20 20 20 20 70 4c 6f  -1) ){.      pLo
d5f0: 63 6b 2d 3e 6c 6f 63 6b 74 79 70 65 20 3d 20 53  ck->locktype = S
d600: 48 41 52 45 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20  HARED_LOCK;.    
d610: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 74 45 72  }else{.      tEr
d620: 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20  rno = errno;.   
d630: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 45 72     rc = sqliteEr
d640: 72 6f 72 46 72 6f 6d 50 6f 73 69 78 45 72 72 6f  rorFromPosixErro
d650: 72 28 74 45 72 72 6e 6f 2c 20 53 51 4c 49 54 45  r(tErrno, SQLITE
d660: 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 29 3b 0a  _IOERR_UNLOCK);.
d670: 20 20 20 20 20 20 69 66 28 20 49 53 5f 4c 4f 43        if( IS_LOC
d680: 4b 5f 45 52 52 4f 52 28 72 63 29 20 29 7b 0a 20  K_ERROR(rc) ){. 
d690: 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61         pFile->la
d6a0: 73 74 45 72 72 6e 6f 20 3d 20 74 45 72 72 6e 6f  stErrno = tErrno
d6b0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
d6c0: 67 6f 74 6f 20 65 6e 64 5f 75 6e 6c 6f 63 6b 3b  goto end_unlock;
d6d0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
d6e0: 20 6c 6f 63 6b 74 79 70 65 3d 3d 4e 4f 5f 4c 4f   locktype==NO_LO
d6f0: 43 4b 20 29 7b 0a 20 20 20 20 73 74 72 75 63 74  CK ){.    struct
d700: 20 75 6e 69 78 4f 70 65 6e 43 6e 74 20 2a 70 4f   unixOpenCnt *pO
d710: 70 65 6e 3b 0a 0a 20 20 20 20 2f 2a 20 44 65 63  pen;..    /* Dec
d720: 72 65 6d 65 6e 74 20 74 68 65 20 73 68 61 72 65  rement the share
d730: 64 20 6c 6f 63 6b 20 63 6f 75 6e 74 65 72 2e 20  d lock counter. 
d740: 20 52 65 6c 65 61 73 65 20 74 68 65 20 6c 6f 63   Release the loc
d750: 6b 20 75 73 69 6e 67 20 61 6e 0a 20 20 20 20 2a  k using an.    *
d760: 2a 20 4f 53 20 63 61 6c 6c 20 6f 6e 6c 79 20 77  * OS call only w
d770: 68 65 6e 20 61 6c 6c 20 74 68 72 65 61 64 73 20  hen all threads 
d780: 69 6e 20 74 68 69 73 20 73 61 6d 65 20 70 72 6f  in this same pro
d790: 63 65 73 73 20 68 61 76 65 20 72 65 6c 65 61 73  cess have releas
d7a0: 65 64 0a 20 20 20 20 2a 2a 20 74 68 65 20 6c 6f  ed.    ** the lo
d7b0: 63 6b 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70  ck..    */.    p
d7c0: 4c 6f 63 6b 2d 3e 63 6e 74 2d 2d 3b 0a 20 20 20  Lock->cnt--;.   
d7d0: 20 69 66 28 20 70 4c 6f 63 6b 2d 3e 63 6e 74 3d   if( pLock->cnt=
d7e0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 6c 6f 63 6b  =0 ){.      lock
d7f0: 2e 6c 5f 74 79 70 65 20 3d 20 46 5f 55 4e 4c 43  .l_type = F_UNLC
d800: 4b 3b 0a 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f  K;.      lock.l_
d810: 77 68 65 6e 63 65 20 3d 20 53 45 45 4b 5f 53 45  whence = SEEK_SE
d820: 54 3b 0a 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f  T;.      lock.l_
d830: 73 74 61 72 74 20 3d 20 6c 6f 63 6b 2e 6c 5f 6c  start = lock.l_l
d840: 65 6e 20 3d 20 30 4c 3b 0a 20 20 20 20 20 20 53  en = 0L;.      S
d850: 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 42 65  imulateIOErrorBe
d860: 6e 69 67 6e 28 31 29 3b 0a 20 20 20 20 20 20 53  nign(1);.      S
d870: 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20  imulateIOError( 
d880: 68 3d 28 2d 31 29 20 29 0a 20 20 20 20 20 20 53  h=(-1) ).      S
d890: 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 42 65  imulateIOErrorBe
d8a0: 6e 69 67 6e 28 30 29 3b 0a 20 20 20 20 20 20 69  nign(0);.      i
d8b0: 66 28 20 66 63 6e 74 6c 28 68 2c 20 46 5f 53 45  f( fcntl(h, F_SE
d8c0: 54 4c 4b 2c 20 26 6c 6f 63 6b 29 21 3d 28 2d 31  TLK, &lock)!=(-1
d8d0: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 70 4c 6f  ) ){.        pLo
d8e0: 63 6b 2d 3e 6c 6f 63 6b 74 79 70 65 20 3d 20 4e  ck->locktype = N
d8f0: 4f 5f 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 7d 65  O_LOCK;.      }e
d900: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 74 45 72  lse{.        tEr
d910: 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20  rno = errno;.   
d920: 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
d930: 45 72 72 6f 72 46 72 6f 6d 50 6f 73 69 78 45 72  ErrorFromPosixEr
d940: 72 6f 72 28 74 45 72 72 6e 6f 2c 20 53 51 4c 49  ror(tErrno, SQLI
d950: 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 29  TE_IOERR_UNLOCK)
d960: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 49 53  ;.        if( IS
d970: 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 72 63 29 20  _LOCK_ERROR(rc) 
d980: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 46 69  ){.          pFi
d990: 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20  le->lastErrno = 
d9a0: 74 45 72 72 6e 6f 3b 0a 20 20 20 20 20 20 20 20  tErrno;.        
d9b0: 7d 0a 20 20 20 20 20 20 20 20 70 4c 6f 63 6b 2d  }.        pLock-
d9c0: 3e 6c 6f 63 6b 74 79 70 65 20 3d 20 4e 4f 5f 4c  >locktype = NO_L
d9d0: 4f 43 4b 3b 0a 20 20 20 20 20 20 20 20 70 46 69  OCK;.        pFi
d9e0: 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 20 3d 20 4e  le->locktype = N
d9f0: 4f 5f 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 7d 0a  O_LOCK;.      }.
da00: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 44 65      }..    /* De
da10: 63 72 65 6d 65 6e 74 20 74 68 65 20 63 6f 75 6e  crement the coun
da20: 74 20 6f 66 20 6c 6f 63 6b 73 20 61 67 61 69 6e  t of locks again
da30: 73 74 20 74 68 69 73 20 73 61 6d 65 20 66 69 6c  st this same fil
da40: 65 2e 20 20 57 68 65 6e 20 74 68 65 0a 20 20 20  e.  When the.   
da50: 20 2a 2a 20 63 6f 75 6e 74 20 72 65 61 63 68 65   ** count reache
da60: 73 20 7a 65 72 6f 2c 20 63 6c 6f 73 65 20 61 6e  s zero, close an
da70: 79 20 6f 74 68 65 72 20 66 69 6c 65 20 64 65 73  y other file des
da80: 63 72 69 70 74 6f 72 73 20 77 68 6f 73 65 20 63  criptors whose c
da90: 6c 6f 73 65 0a 20 20 20 20 2a 2a 20 77 61 73 20  lose.    ** was 
daa0: 64 65 66 65 72 72 65 64 20 62 65 63 61 75 73 65  deferred because
dab0: 20 6f 66 20 6f 75 74 73 74 61 6e 64 69 6e 67 20   of outstanding 
dac0: 6c 6f 63 6b 73 2e 0a 20 20 20 20 2a 2f 0a 20 20  locks..    */.  
dad0: 20 20 70 4f 70 65 6e 20 3d 20 70 46 69 6c 65 2d    pOpen = pFile-
dae0: 3e 70 4f 70 65 6e 3b 0a 20 20 20 20 70 4f 70 65  >pOpen;.    pOpe
daf0: 6e 2d 3e 6e 4c 6f 63 6b 2d 2d 3b 0a 20 20 20 20  n->nLock--;.    
db00: 61 73 73 65 72 74 28 20 70 4f 70 65 6e 2d 3e 6e  assert( pOpen->n
db10: 4c 6f 63 6b 3e 3d 30 20 29 3b 0a 20 20 20 20 69  Lock>=0 );.    i
db20: 66 28 20 70 4f 70 65 6e 2d 3e 6e 4c 6f 63 6b 3d  f( pOpen->nLock=
db30: 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  =0 ){.      int 
db40: 72 63 32 20 3d 20 63 6c 6f 73 65 50 65 6e 64 69  rc2 = closePendi
db50: 6e 67 46 64 73 28 70 46 69 6c 65 29 3b 0a 20 20  ngFds(pFile);.  
db60: 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
db70: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
db80: 20 72 63 20 3d 20 72 63 32 3b 0a 20 20 20 20 20   rc = rc2;.     
db90: 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 09 0a 65   }.    }.  }...e
dba0: 6e 64 5f 75 6e 6c 6f 63 6b 3a 0a 20 20 75 6e 69  nd_unlock:.  uni
dbb0: 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 20  xLeaveMutex();. 
dbc0: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
dbd0: 4f 4b 20 29 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b  OK ) pFile->lock
dbe0: 74 79 70 65 20 3d 20 6c 6f 63 6b 74 79 70 65 3b  type = locktype;
dbf0: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
dc00: 0a 2f 2a 0a 2a 2a 20 4c 6f 77 65 72 20 74 68 65  ./*.** Lower the
dc10: 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f   locking level o
dc20: 6e 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  n file descripto
dc30: 72 20 70 46 69 6c 65 20 74 6f 20 6c 6f 63 6b 74  r pFile to lockt
dc40: 79 70 65 2e 20 20 6c 6f 63 6b 74 79 70 65 0a 2a  ype.  locktype.*
dc50: 2a 20 6d 75 73 74 20 62 65 20 65 69 74 68 65 72  * must be either
dc60: 20 4e 4f 5f 4c 4f 43 4b 20 6f 72 20 53 48 41 52   NO_LOCK or SHAR
dc70: 45 44 5f 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 49  ED_LOCK..**.** I
dc80: 66 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65  f the locking le
dc90: 76 65 6c 20 6f 66 20 74 68 65 20 66 69 6c 65 20  vel of the file 
dca0: 64 65 73 63 72 69 70 74 6f 72 20 69 73 20 61 6c  descriptor is al
dcb0: 72 65 61 64 79 20 61 74 20 6f 72 20 62 65 6c 6f  ready at or belo
dcc0: 77 0a 2a 2a 20 74 68 65 20 72 65 71 75 65 73 74  w.** the request
dcd0: 65 64 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c  ed locking level
dce0: 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  , this routine i
dcf0: 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74  s a no-op..*/.st
dd00: 61 74 69 63 20 69 6e 74 20 75 6e 69 78 55 6e 6c  atic int unixUnl
dd10: 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  ock(sqlite3_file
dd20: 20 2a 69 64 2c 20 69 6e 74 20 6c 6f 63 6b 74 79   *id, int lockty
dd30: 70 65 29 7b 0a 20 20 72 65 74 75 72 6e 20 5f 70  pe){.  return _p
dd40: 6f 73 69 78 55 6e 6c 6f 63 6b 28 69 64 2c 20 6c  osixUnlock(id, l
dd50: 6f 63 6b 74 79 70 65 2c 20 30 29 3b 0a 7d 0a 0a  ocktype, 0);.}..
dd60: 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
dd70: 69 6f 6e 20 70 65 72 66 6f 72 6d 73 20 74 68 65  ion performs the
dd80: 20 70 61 72 74 73 20 6f 66 20 74 68 65 20 22 63   parts of the "c
dd90: 6c 6f 73 65 20 66 69 6c 65 22 20 6f 70 65 72 61  lose file" opera
dda0: 74 69 6f 6e 20 0a 2a 2a 20 63 6f 6d 6d 6f 6e 20  tion .** common 
ddb0: 74 6f 20 61 6c 6c 20 6c 6f 63 6b 69 6e 67 20 73  to all locking s
ddc0: 63 68 65 6d 65 73 2e 20 49 74 20 63 6c 6f 73 65  chemes. It close
ddd0: 73 20 74 68 65 20 64 69 72 65 63 74 6f 72 79 20  s the directory 
dde0: 61 6e 64 20 66 69 6c 65 0a 2a 2a 20 68 61 6e 64  and file.** hand
ddf0: 6c 65 73 2c 20 69 66 20 74 68 65 79 20 61 72 65  les, if they are
de00: 20 76 61 6c 69 64 2c 20 61 6e 64 20 73 65 74 73   valid, and sets
de10: 20 61 6c 6c 20 66 69 65 6c 64 73 20 6f 66 20 74   all fields of t
de20: 68 65 20 75 6e 69 78 46 69 6c 65 0a 2a 2a 20 73  he unixFile.** s
de30: 74 72 75 63 74 75 72 65 20 74 6f 20 30 2e 0a 2a  tructure to 0..*
de40: 2a 0a 2a 2a 20 49 74 20 69 73 20 2a 6e 6f 74 2a  *.** It is *not*
de50: 20 6e 65 63 65 73 73 61 72 79 20 74 6f 20 68 6f   necessary to ho
de60: 6c 64 20 74 68 65 20 6d 75 74 65 78 20 77 68 65  ld the mutex whe
de70: 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  n this routine i
de80: 73 20 63 61 6c 6c 65 64 2c 0a 2a 2a 20 65 76 65  s called,.** eve
de90: 6e 20 6f 6e 20 56 78 57 6f 72 6b 73 2e 20 20 41  n on VxWorks.  A
dea0: 20 6d 75 74 65 78 20 77 69 6c 6c 20 62 65 20 61   mutex will be a
deb0: 63 71 75 69 72 65 64 20 6f 6e 20 56 78 57 6f 72  cquired on VxWor
dec0: 6b 73 20 62 79 20 74 68 65 0a 2a 2a 20 76 78 77  ks by the.** vxw
ded0: 6f 72 6b 73 52 65 6c 65 61 73 65 46 69 6c 65 49  orksReleaseFileI
dee0: 64 28 29 20 72 6f 75 74 69 6e 65 2e 0a 2a 2f 0a  d() routine..*/.
def0: 73 74 61 74 69 63 20 69 6e 74 20 63 6c 6f 73 65  static int close
df00: 55 6e 69 78 46 69 6c 65 28 73 71 6c 69 74 65 33  UnixFile(sqlite3
df10: 5f 66 69 6c 65 20 2a 69 64 29 7b 0a 20 20 75 6e  _file *id){.  un
df20: 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20  ixFile *pFile = 
df30: 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20  (unixFile*)id;. 
df40: 20 69 66 28 20 70 46 69 6c 65 20 29 7b 0a 20 20   if( pFile ){.  
df50: 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 64 69 72    if( pFile->dir
df60: 66 64 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 69  fd>=0 ){.      i
df70: 6e 74 20 65 72 72 20 3d 20 63 6c 6f 73 65 28 70  nt err = close(p
df80: 46 69 6c 65 2d 3e 64 69 72 66 64 29 3b 0a 20 20  File->dirfd);.  
df90: 20 20 20 20 69 66 28 20 65 72 72 20 29 7b 0a 20      if( err ){. 
dfa0: 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61         pFile->la
dfb0: 73 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b  stErrno = errno;
dfc0: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
dfd0: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 44 49 52  SQLITE_IOERR_DIR
dfe0: 5f 43 4c 4f 53 45 3b 0a 20 20 20 20 20 20 7d 65  _CLOSE;.      }e
dff0: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70 46 69  lse{.        pFi
e000: 6c 65 2d 3e 64 69 72 66 64 3d 2d 31 3b 0a 20 20  le->dirfd=-1;.  
e010: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
e020: 69 66 28 20 70 46 69 6c 65 2d 3e 68 3e 3d 30 20  if( pFile->h>=0 
e030: 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 65 72 72  ){.      int err
e040: 20 3d 20 63 6c 6f 73 65 28 70 46 69 6c 65 2d 3e   = close(pFile->
e050: 68 29 3b 0a 20 20 20 20 20 20 69 66 28 20 65 72  h);.      if( er
e060: 72 20 29 7b 0a 20 20 20 20 20 20 20 20 70 46 69  r ){.        pFi
e070: 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20  le->lastErrno = 
e080: 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20 20 20 72  errno;.        r
e090: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45  eturn SQLITE_IOE
e0a0: 52 52 5f 43 4c 4f 53 45 3b 0a 20 20 20 20 20 20  RR_CLOSE;.      
e0b0: 7d 0a 20 20 20 20 7d 0a 23 69 66 20 4f 53 5f 56  }.    }.#if OS_V
e0c0: 58 57 4f 52 4b 53 0a 20 20 20 20 69 66 28 20 70  XWORKS.    if( p
e0d0: 46 69 6c 65 2d 3e 70 49 64 20 29 7b 0a 20 20 20  File->pId ){.   
e0e0: 20 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 69 73     if( pFile->is
e0f0: 44 65 6c 65 74 65 20 29 7b 0a 20 20 20 20 20 20  Delete ){.      
e100: 20 20 75 6e 6c 69 6e 6b 28 70 46 69 6c 65 2d 3e    unlink(pFile->
e110: 70 49 64 2d 3e 7a 43 61 6e 6f 6e 69 63 61 6c 4e  pId->zCanonicalN
e120: 61 6d 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ame);.      }.  
e130: 20 20 20 20 76 78 77 6f 72 6b 73 52 65 6c 65 61      vxworksRelea
e140: 73 65 46 69 6c 65 49 64 28 70 46 69 6c 65 2d 3e  seFileId(pFile->
e150: 70 49 64 29 3b 0a 20 20 20 20 20 20 70 46 69 6c  pId);.      pFil
e160: 65 2d 3e 70 49 64 20 3d 20 30 3b 0a 20 20 20 20  e->pId = 0;.    
e170: 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 4f 53 54  }.#endif.    OST
e180: 52 41 43 45 32 28 22 43 4c 4f 53 45 20 20 20 25  RACE2("CLOSE   %
e190: 2d 33 64 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68  -3d\n", pFile->h
e1a0: 29 3b 0a 20 20 20 20 4f 70 65 6e 43 6f 75 6e 74  );.    OpenCount
e1b0: 65 72 28 2d 31 29 3b 0a 20 20 20 20 73 71 6c 69  er(-1);.    sqli
e1c0: 74 65 33 5f 66 72 65 65 28 70 46 69 6c 65 2d 3e  te3_free(pFile->
e1d0: 70 55 6e 75 73 65 64 29 3b 0a 20 20 20 20 6d 65  pUnused);.    me
e1e0: 6d 73 65 74 28 70 46 69 6c 65 2c 20 30 2c 20 73  mset(pFile, 0, s
e1f0: 69 7a 65 6f 66 28 75 6e 69 78 46 69 6c 65 29 29  izeof(unixFile))
e200: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53  ;.  }.  return S
e210: 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
e220: 2a 2a 20 43 6c 6f 73 65 20 61 20 66 69 6c 65 2e  ** Close a file.
e230: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75  .*/.static int u
e240: 6e 69 78 43 6c 6f 73 65 28 73 71 6c 69 74 65 33  nixClose(sqlite3
e250: 5f 66 69 6c 65 20 2a 69 64 29 7b 0a 20 20 69 6e  _file *id){.  in
e260: 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
e270: 3b 0a 20 20 69 66 28 20 69 64 20 29 7b 0a 20 20  ;.  if( id ){.  
e280: 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c    unixFile *pFil
e290: 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 20 2a 29  e = (unixFile *)
e2a0: 69 64 3b 0a 20 20 20 20 75 6e 69 78 55 6e 6c 6f  id;.    unixUnlo
e2b0: 63 6b 28 69 64 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b  ck(id, NO_LOCK);
e2c0: 0a 20 20 20 20 75 6e 69 78 45 6e 74 65 72 4d 75  .    unixEnterMu
e2d0: 74 65 78 28 29 3b 0a 20 20 20 20 69 66 28 20 70  tex();.    if( p
e2e0: 46 69 6c 65 2d 3e 70 4f 70 65 6e 20 26 26 20 70  File->pOpen && p
e2f0: 46 69 6c 65 2d 3e 70 4f 70 65 6e 2d 3e 6e 4c 6f  File->pOpen->nLo
e300: 63 6b 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49  ck ){.      /* I
e310: 66 20 74 68 65 72 65 20 61 72 65 20 6f 75 74 73  f there are outs
e320: 74 61 6e 64 69 6e 67 20 6c 6f 63 6b 73 2c 20 64  tanding locks, d
e330: 6f 20 6e 6f 74 20 61 63 74 75 61 6c 6c 79 20 63  o not actually c
e340: 6c 6f 73 65 20 74 68 65 20 66 69 6c 65 20 6a 75  lose the file ju
e350: 73 74 0a 20 20 20 20 20 20 2a 2a 20 79 65 74 20  st.      ** yet 
e360: 62 65 63 61 75 73 65 20 74 68 61 74 20 77 6f 75  because that wou
e370: 6c 64 20 63 6c 65 61 72 20 74 68 6f 73 65 20 6c  ld clear those l
e380: 6f 63 6b 73 2e 20 20 49 6e 73 74 65 61 64 2c 20  ocks.  Instead, 
e390: 61 64 64 20 74 68 65 20 66 69 6c 65 0a 20 20 20  add the file.   
e3a0: 20 20 20 2a 2a 20 64 65 73 63 72 69 70 74 6f 72     ** descriptor
e3b0: 20 74 6f 20 70 4f 70 65 6e 2d 3e 70 55 6e 75 73   to pOpen->pUnus
e3c0: 65 64 20 6c 69 73 74 2e 20 20 49 74 20 77 69 6c  ed list.  It wil
e3d0: 6c 20 62 65 20 61 75 74 6f 6d 61 74 69 63 61 6c  l be automatical
e3e0: 6c 79 20 63 6c 6f 73 65 64 20 0a 20 20 20 20 20  ly closed .     
e3f0: 20 2a 2a 20 77 68 65 6e 20 74 68 65 20 6c 61 73   ** when the las
e400: 74 20 6c 6f 63 6b 20 69 73 20 63 6c 65 61 72 65  t lock is cleare
e410: 64 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  d..      */.    
e420: 20 20 73 65 74 50 65 6e 64 69 6e 67 46 64 28 70    setPendingFd(p
e430: 46 69 6c 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20  File);.    }.   
e440: 20 72 65 6c 65 61 73 65 4c 6f 63 6b 49 6e 66 6f   releaseLockInfo
e450: 28 70 46 69 6c 65 2d 3e 70 4c 6f 63 6b 29 3b 0a  (pFile->pLock);.
e460: 20 20 20 20 72 65 6c 65 61 73 65 4f 70 65 6e 43      releaseOpenC
e470: 6e 74 28 70 46 69 6c 65 2d 3e 70 4f 70 65 6e 29  nt(pFile->pOpen)
e480: 3b 0a 20 20 20 20 72 63 20 3d 20 63 6c 6f 73 65  ;.    rc = close
e490: 55 6e 69 78 46 69 6c 65 28 69 64 29 3b 0a 20 20  UnixFile(id);.  
e4a0: 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78    unixLeaveMutex
e4b0: 28 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  ();.  }.  return
e4c0: 20 72 63 3b 0a 7d 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a   rc;.}../*******
e4d0: 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64 20 6f 66 20 74  ******* End of t
e4e0: 68 65 20 70 6f 73 69 78 20 61 64 76 69 73 6f 72  he posix advisor
e4f0: 79 20 6c 6f 63 6b 20 69 6d 70 6c 65 6d 65 6e 74  y lock implement
e500: 61 74 69 6f 6e 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ation **********
e510: 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a  *******.********
e520: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
e530: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
e540: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
e550: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
e560: 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a  ******/../******
e570: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
e580: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
e590: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
e5a0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
e5b0: 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a  ********.*******
e5c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
e5d0: 2a 2a 2a 2a 2a 2a 2a 20 4e 6f 2d 6f 70 20 4c 6f  ******* No-op Lo
e5e0: 63 6b 69 6e 67 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  cking **********
e5f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
e600: 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 4f  ********.**.** O
e610: 66 20 74 68 65 20 76 61 72 69 6f 75 73 20 6c 6f  f the various lo
e620: 63 6b 69 6e 67 20 69 6d 70 6c 65 6d 65 6e 74 61  cking implementa
e630: 74 69 6f 6e 73 20 61 76 61 69 6c 61 62 6c 65 2c  tions available,
e640: 20 74 68 69 73 20 69 73 20 62 79 20 66 61 72 20   this is by far 
e650: 74 68 65 0a 2a 2a 20 73 69 6d 70 6c 65 73 74 3a  the.** simplest:
e660: 20 20 6c 6f 63 6b 69 6e 67 20 69 73 20 69 67 6e    locking is ign
e670: 6f 72 65 64 2e 20 20 4e 6f 20 61 74 74 65 6d 70  ored.  No attemp
e680: 74 20 69 73 20 6d 61 64 65 20 74 6f 20 6c 6f 63  t is made to loc
e690: 6b 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 2a  k the database.*
e6a0: 2a 20 66 69 6c 65 20 66 6f 72 20 72 65 61 64 69  * file for readi
e6b0: 6e 67 20 6f 72 20 77 72 69 74 69 6e 67 2e 0a 2a  ng or writing..*
e6c0: 2a 0a 2a 2a 20 54 68 69 73 20 6c 6f 63 6b 69 6e  *.** This lockin
e6d0: 67 20 6d 6f 64 65 20 69 73 20 61 70 70 72 6f 70  g mode is approp
e6e0: 72 69 61 74 65 20 66 6f 72 20 75 73 65 20 6f 6e  riate for use on
e6f0: 20 72 65 61 64 2d 6f 6e 6c 79 20 64 61 74 61 62   read-only datab
e700: 61 73 65 73 0a 2a 2a 20 28 65 78 3a 20 64 61 74  ases.** (ex: dat
e710: 61 62 61 73 65 73 20 74 68 61 74 20 61 72 65 20  abases that are 
e720: 62 75 72 6e 65 64 20 69 6e 74 6f 20 43 44 2d 52  burned into CD-R
e730: 4f 4d 2c 20 66 6f 72 20 65 78 61 6d 70 6c 65 2e  OM, for example.
e740: 29 20 20 49 74 20 63 61 6e 0a 2a 2a 20 61 6c 73  )  It can.** als
e750: 6f 20 62 65 20 75 73 65 64 20 69 66 20 74 68 65  o be used if the
e760: 20 61 70 70 6c 69 63 61 74 69 6f 6e 20 65 6d 70   application emp
e770: 6c 6f 79 73 20 73 6f 6d 65 20 65 78 74 65 72 6e  loys some extern
e780: 61 6c 20 6d 65 63 68 61 6e 69 73 6d 20 74 6f 0a  al mechanism to.
e790: 2a 2a 20 70 72 65 76 65 6e 74 20 73 69 6d 75 6c  ** prevent simul
e7a0: 74 61 6e 65 6f 75 73 20 61 63 63 65 73 73 20 6f  taneous access o
e7b0: 66 20 74 68 65 20 73 61 6d 65 20 64 61 74 61 62  f the same datab
e7c0: 61 73 65 20 62 79 20 74 77 6f 20 6f 72 20 6d 6f  ase by two or mo
e7d0: 72 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 63  re.** database c
e7e0: 6f 6e 6e 65 63 74 69 6f 6e 73 2e 20 20 42 75 74  onnections.  But
e7f0: 20 74 68 65 72 65 20 69 73 20 61 20 73 65 72 69   there is a seri
e800: 6f 75 73 20 72 69 73 6b 20 6f 66 20 64 61 74 61  ous risk of data
e810: 62 61 73 65 0a 2a 2a 20 63 6f 72 72 75 70 74 69  base.** corrupti
e820: 6f 6e 20 69 66 20 74 68 69 73 20 6c 6f 63 6b 69  on if this locki
e830: 6e 67 20 6d 6f 64 65 20 69 73 20 75 73 65 64 20  ng mode is used 
e840: 69 6e 20 73 69 74 75 61 74 69 6f 6e 73 20 77 68  in situations wh
e850: 65 72 65 20 6d 75 6c 74 69 70 6c 65 0a 2a 2a 20  ere multiple.** 
e860: 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
e870: 69 6f 6e 73 20 61 72 65 20 61 63 63 65 73 73 69  ions are accessi
e880: 6e 67 20 74 68 65 20 73 61 6d 65 20 64 61 74 61  ng the same data
e890: 62 61 73 65 20 66 69 6c 65 20 61 74 20 74 68 65  base file at the
e8a0: 20 73 61 6d 65 0a 2a 2a 20 74 69 6d 65 20 61 6e   same.** time an
e8b0: 64 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 6f 66  d one or more of
e8c0: 20 74 68 6f 73 65 20 63 6f 6e 6e 65 63 74 69 6f   those connectio
e8d0: 6e 73 20 61 72 65 20 77 72 69 74 69 6e 67 2e 0a  ns are writing..
e8e0: 2a 2f 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 6e  */..static int n
e8f0: 6f 6c 6f 63 6b 43 68 65 63 6b 52 65 73 65 72 76  olockCheckReserv
e900: 65 64 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66  edLock(sqlite3_f
e910: 69 6c 65 20 2a 4e 6f 74 55 73 65 64 2c 20 69 6e  ile *NotUsed, in
e920: 74 20 2a 70 52 65 73 4f 75 74 29 7b 0a 20 20 55  t *pResOut){.  U
e930: 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
e940: 4e 6f 74 55 73 65 64 29 3b 0a 20 20 2a 70 52 65  NotUsed);.  *pRe
e950: 73 4f 75 74 20 3d 20 30 3b 0a 20 20 72 65 74 75  sOut = 0;.  retu
e960: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
e970: 73 74 61 74 69 63 20 69 6e 74 20 6e 6f 6c 6f 63  static int noloc
e980: 6b 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69  kLock(sqlite3_fi
e990: 6c 65 20 2a 4e 6f 74 55 73 65 64 2c 20 69 6e 74  le *NotUsed, int
e9a0: 20 4e 6f 74 55 73 65 64 32 29 7b 0a 20 20 55 4e   NotUsed2){.  UN
e9b0: 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 32 28  USED_PARAMETER2(
e9c0: 4e 6f 74 55 73 65 64 2c 20 4e 6f 74 55 73 65 64  NotUsed, NotUsed
e9d0: 32 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  2);.  return SQL
e9e0: 49 54 45 5f 4f 4b 3b 0a 7d 0a 73 74 61 74 69 63  ITE_OK;.}.static
e9f0: 20 69 6e 74 20 6e 6f 6c 6f 63 6b 55 6e 6c 6f 63   int nolockUnloc
ea00: 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  k(sqlite3_file *
ea10: 4e 6f 74 55 73 65 64 2c 20 69 6e 74 20 4e 6f 74  NotUsed, int Not
ea20: 55 73 65 64 32 29 7b 0a 20 20 55 4e 55 53 45 44  Used2){.  UNUSED
ea30: 5f 50 41 52 41 4d 45 54 45 52 32 28 4e 6f 74 55  _PARAMETER2(NotU
ea40: 73 65 64 2c 20 4e 6f 74 55 73 65 64 32 29 3b 0a  sed, NotUsed2);.
ea50: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
ea60: 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f  OK;.}../*.** Clo
ea70: 73 65 20 74 68 65 20 66 69 6c 65 2e 0a 2a 2f 0a  se the file..*/.
ea80: 73 74 61 74 69 63 20 69 6e 74 20 6e 6f 6c 6f 63  static int noloc
ea90: 6b 43 6c 6f 73 65 28 73 71 6c 69 74 65 33 5f 66  kClose(sqlite3_f
eaa0: 69 6c 65 20 2a 69 64 29 20 7b 0a 20 20 72 65 74  ile *id) {.  ret
eab0: 75 72 6e 20 63 6c 6f 73 65 55 6e 69 78 46 69 6c  urn closeUnixFil
eac0: 65 28 69 64 29 3b 0a 7d 0a 0a 2f 2a 2a 2a 2a 2a  e(id);.}../*****
ead0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45  ************** E
eae0: 6e 64 20 6f 66 20 74 68 65 20 6e 6f 2d 6f 70 20  nd of the no-op 
eaf0: 6c 6f 63 6b 20 69 6d 70 6c 65 6d 65 6e 74 61 74  lock implementat
eb00: 69 6f 6e 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ion ************
eb10: 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a  *********.******
eb20: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
eb30: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
eb40: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
eb50: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
eb60: 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 2a 2a 2a  ********/../****
eb70: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
eb80: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
eb90: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
eba0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
ebb0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a  **********.*****
ebc0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
ebd0: 2a 2a 2a 2a 20 42 65 67 69 6e 20 64 6f 74 2d 66  **** Begin dot-f
ebe0: 69 6c 65 20 4c 6f 63 6b 69 6e 67 20 2a 2a 2a 2a  ile Locking ****
ebf0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
ec00: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a  **********.**.**
ec10: 20 54 68 65 20 64 6f 74 66 69 6c 65 20 6c 6f 63   The dotfile loc
ec20: 6b 69 6e 67 20 69 6d 70 6c 65 6d 65 6e 74 61 74  king implementat
ec30: 69 6f 6e 20 75 73 65 73 20 74 68 65 20 65 78 69  ion uses the exi
ec40: 73 74 61 6e 63 65 20 6f 66 20 73 65 70 61 72 61  stance of separa
ec50: 74 65 20 6c 6f 63 6b 0a 2a 2a 20 66 69 6c 65 73  te lock.** files
ec60: 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 63 6f 6e   in order to con
ec70: 74 72 6f 6c 20 61 63 63 65 73 73 20 74 6f 20 74  trol access to t
ec80: 68 65 20 64 61 74 61 62 61 73 65 2e 20 20 54 68  he database.  Th
ec90: 69 73 20 77 6f 72 6b 73 20 6f 6e 20 6a 75 73 74  is works on just
eca0: 0a 2a 2a 20 61 62 6f 75 74 20 65 76 65 72 79 20  .** about every 
ecb0: 66 69 6c 65 73 79 73 74 65 6d 20 69 6d 61 67 69  filesystem imagi
ecc0: 6e 61 62 6c 65 2e 20 20 42 75 74 20 74 68 65 72  nable.  But ther
ecd0: 65 20 61 72 65 20 73 65 72 69 6f 75 73 20 64 6f  e are serious do
ece0: 77 6e 73 69 64 65 73 3a 0a 2a 2a 0a 2a 2a 20 20  wnsides:.**.**  
ecf0: 20 20 28 31 29 20 20 54 68 65 72 65 20 69 73 20    (1)  There is 
ed00: 7a 65 72 6f 20 63 6f 6e 63 75 72 72 65 6e 63 79  zero concurrency
ed10: 2e 20 20 41 20 73 69 6e 67 6c 65 20 72 65 61 64  .  A single read
ed20: 65 72 20 62 6c 6f 63 6b 73 20 61 6c 6c 20 6f 74  er blocks all ot
ed30: 68 65 72 0a 2a 2a 20 20 20 20 20 20 20 20 20 63  her.**         c
ed40: 6f 6e 6e 65 63 74 69 6f 6e 73 20 66 72 6f 6d 20  onnections from 
ed50: 72 65 61 64 69 6e 67 20 6f 72 20 77 72 69 74 69  reading or writi
ed60: 6e 67 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  ng the database.
ed70: 0a 2a 2a 0a 2a 2a 20 20 20 20 28 32 29 20 20 41  .**.**    (2)  A
ed80: 6e 20 61 70 70 6c 69 63 61 74 69 6f 6e 20 63 72  n application cr
ed90: 61 73 68 20 6f 72 20 70 6f 77 65 72 20 6c 6f 73  ash or power los
eda0: 73 20 63 61 6e 20 6c 65 61 76 65 20 73 74 61 6c  s can leave stal
edb0: 65 20 6c 6f 63 6b 20 66 69 6c 65 73 0a 2a 2a 20  e lock files.** 
edc0: 20 20 20 20 20 20 20 20 73 69 74 74 69 6e 67 20          sitting 
edd0: 61 72 6f 75 6e 64 20 74 68 61 74 20 6e 65 65 64  around that need
ede0: 20 74 6f 20 62 65 20 63 6c 65 61 72 65 64 20 6d   to be cleared m
edf0: 61 6e 75 61 6c 6c 79 2e 0a 2a 2a 0a 2a 2a 20 4e  anually..**.** N
ee00: 65 76 65 72 74 68 65 6c 65 73 73 2c 20 61 20 64  evertheless, a d
ee10: 6f 74 6c 6f 63 6b 20 69 73 20 61 6e 20 61 70 70  otlock is an app
ee20: 72 6f 70 72 69 61 74 65 20 6c 6f 63 6b 69 6e 67  ropriate locking
ee30: 20 6d 6f 64 65 20 66 6f 72 20 75 73 65 20 69 66   mode for use if
ee40: 20 6e 6f 0a 2a 2a 20 6f 74 68 65 72 20 6c 6f 63   no.** other loc
ee50: 6b 69 6e 67 20 73 74 72 61 74 65 67 79 20 69 73  king strategy is
ee60: 20 61 76 61 69 6c 61 62 6c 65 2e 0a 2a 2a 0a 2a   available..**.*
ee70: 2a 20 44 6f 74 66 69 6c 65 20 6c 6f 63 6b 69 6e  * Dotfile lockin
ee80: 67 20 77 6f 72 6b 73 20 62 79 20 63 72 65 61 74  g works by creat
ee90: 69 6e 67 20 61 20 66 69 6c 65 20 69 6e 20 74 68  ing a file in th
eea0: 65 20 73 61 6d 65 20 64 69 72 65 63 74 6f 72 79  e same directory
eeb0: 20 61 73 20 74 68 65 0a 2a 2a 20 64 61 74 61 62   as the.** datab
eec0: 61 73 65 20 61 6e 64 20 77 69 74 68 20 74 68 65  ase and with the
eed0: 20 73 61 6d 65 20 6e 61 6d 65 20 62 75 74 20 77   same name but w
eee0: 69 74 68 20 61 20 22 2e 6c 6f 63 6b 22 20 65 78  ith a ".lock" ex
eef0: 74 65 6e 73 69 6f 6e 20 61 64 64 65 64 2e 0a 2a  tension added..*
ef00: 2a 20 54 68 65 20 65 78 69 73 74 61 6e 63 65 20  * The existance 
ef10: 6f 66 20 61 20 6c 6f 63 6b 20 66 69 6c 65 20 69  of a lock file i
ef20: 6d 70 6c 69 65 73 20 61 6e 20 45 58 43 4c 55 53  mplies an EXCLUS
ef30: 49 56 45 20 6c 6f 63 6b 2e 20 20 41 6c 6c 20 6f  IVE lock.  All o
ef40: 74 68 65 72 20 6c 6f 63 6b 0a 2a 2a 20 74 79 70  ther lock.** typ
ef50: 65 73 20 28 53 48 41 52 45 44 2c 20 52 45 53 45  es (SHARED, RESE
ef60: 52 56 45 44 2c 20 50 45 4e 44 49 4e 47 29 20 61  RVED, PENDING) a
ef70: 72 65 20 6d 61 70 70 65 64 20 69 6e 74 6f 20 45  re mapped into E
ef80: 58 43 4c 55 53 49 56 45 2e 0a 2a 2f 0a 0a 2f 2a  XCLUSIVE..*/../*
ef90: 0a 2a 2a 20 54 68 65 20 66 69 6c 65 20 73 75 66  .** The file suf
efa0: 66 69 78 20 61 64 64 65 64 20 74 6f 20 74 68 65  fix added to the
efb0: 20 64 61 74 61 20 62 61 73 65 20 66 69 6c 65 6e   data base filen
efc0: 61 6d 65 20 69 6e 20 6f 72 64 65 72 20 74 6f 20  ame in order to 
efd0: 63 72 65 61 74 65 20 74 68 65 0a 2a 2a 20 6c 6f  create the.** lo
efe0: 63 6b 20 66 69 6c 65 2e 0a 2a 2f 0a 23 64 65 66  ck file..*/.#def
eff0: 69 6e 65 20 44 4f 54 4c 4f 43 4b 5f 53 55 46 46  ine DOTLOCK_SUFF
f000: 49 58 20 22 2e 6c 6f 63 6b 22 0a 0a 2f 2a 0a 2a  IX ".lock"../*.*
f010: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63  * This routine c
f020: 68 65 63 6b 73 20 69 66 20 74 68 65 72 65 20 69  hecks if there i
f030: 73 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63  s a RESERVED loc
f040: 6b 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 73 70  k held on the sp
f050: 65 63 69 66 69 65 64 0a 2a 2a 20 66 69 6c 65 20  ecified.** file 
f060: 62 79 20 74 68 69 73 20 6f 72 20 61 6e 79 20 6f  by this or any o
f070: 74 68 65 72 20 70 72 6f 63 65 73 73 2e 20 49 66  ther process. If
f080: 20 73 75 63 68 20 61 20 6c 6f 63 6b 20 69 73 20   such a lock is 
f090: 68 65 6c 64 2c 20 73 65 74 20 2a 70 52 65 73 4f  held, set *pResO
f0a0: 75 74 0a 2a 2a 20 74 6f 20 61 20 6e 6f 6e 2d 7a  ut.** to a non-z
f0b0: 65 72 6f 20 76 61 6c 75 65 20 6f 74 68 65 72 77  ero value otherw
f0c0: 69 73 65 20 2a 70 52 65 73 4f 75 74 20 69 73 20  ise *pResOut is 
f0d0: 73 65 74 20 74 6f 20 7a 65 72 6f 2e 20 20 54 68  set to zero.  Th
f0e0: 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 0a 2a  e return value.*
f0f0: 2a 20 69 73 20 73 65 74 20 74 6f 20 53 51 4c 49  * is set to SQLI
f100: 54 45 5f 4f 4b 20 75 6e 6c 65 73 73 20 61 6e 20  TE_OK unless an 
f110: 49 2f 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73  I/O error occurs
f120: 20 64 75 72 69 6e 67 20 6c 6f 63 6b 20 63 68 65   during lock che
f130: 63 6b 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20  cking..**.** In 
f140: 64 6f 74 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 2c  dotfile locking,
f150: 20 65 69 74 68 65 72 20 61 20 6c 6f 63 6b 20 65   either a lock e
f160: 78 69 73 74 73 20 6f 72 20 69 74 20 64 6f 65 73  xists or it does
f170: 20 6e 6f 74 2e 20 20 53 6f 20 69 6e 20 74 68 69   not.  So in thi
f180: 73 0a 2a 2a 20 76 61 72 69 61 74 69 6f 6e 20 6f  s.** variation o
f190: 66 20 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c  f CheckReservedL
f1a0: 6f 63 6b 28 29 2c 20 2a 70 52 65 73 4f 75 74 20  ock(), *pResOut 
f1b0: 69 73 20 73 65 74 20 74 6f 20 74 72 75 65 20 69  is set to true i
f1c0: 66 20 61 6e 79 20 6c 6f 63 6b 0a 2a 2a 20 69 73  f any lock.** is
f1d0: 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 66 69 6c   held on the fil
f1e0: 65 20 61 6e 64 20 66 61 6c 73 65 20 69 66 20 74  e and false if t
f1f0: 68 65 20 66 69 6c 65 20 69 73 20 75 6e 6c 6f 63  he file is unloc
f200: 6b 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ked..*/.static i
f210: 6e 74 20 64 6f 74 6c 6f 63 6b 43 68 65 63 6b 52  nt dotlockCheckR
f220: 65 73 65 72 76 65 64 4c 6f 63 6b 28 73 71 6c 69  eservedLock(sqli
f230: 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e  te3_file *id, in
f240: 74 20 2a 70 52 65 73 4f 75 74 29 20 7b 0a 20 20  t *pResOut) {.  
f250: 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
f260: 4f 4b 3b 0a 20 20 69 6e 74 20 72 65 73 65 72 76  OK;.  int reserv
f270: 65 64 20 3d 20 30 3b 0a 20 20 75 6e 69 78 46 69  ed = 0;.  unixFi
f280: 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69  le *pFile = (uni
f290: 78 46 69 6c 65 2a 29 69 64 3b 0a 0a 20 20 53 69  xFile*)id;..  Si
f2a0: 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 72  mulateIOError( r
f2b0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45  eturn SQLITE_IOE
f2c0: 52 52 5f 43 48 45 43 4b 52 45 53 45 52 56 45 44  RR_CHECKRESERVED
f2d0: 4c 4f 43 4b 3b 20 29 3b 0a 20 20 0a 20 20 61 73  LOCK; );.  .  as
f2e0: 73 65 72 74 28 20 70 46 69 6c 65 20 29 3b 0a 0a  sert( pFile );..
f2f0: 20 20 2f 2a 20 43 68 65 63 6b 20 69 66 20 61 20    /* Check if a 
f300: 74 68 72 65 61 64 20 69 6e 20 74 68 69 73 20 70  thread in this p
f310: 72 6f 63 65 73 73 20 68 6f 6c 64 73 20 73 75 63  rocess holds suc
f320: 68 20 61 20 6c 6f 63 6b 20 2a 2f 0a 20 20 69 66  h a lock */.  if
f330: 28 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70  ( pFile->locktyp
f340: 65 3e 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 7b  e>SHARED_LOCK ){
f350: 0a 20 20 20 20 2f 2a 20 45 69 74 68 65 72 20 74  .    /* Either t
f360: 68 69 73 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 6f  his connection o
f370: 72 20 73 6f 6d 65 20 6f 74 68 65 72 20 63 6f 6e  r some other con
f380: 6e 65 63 74 69 6f 6e 20 69 6e 20 74 68 65 20 73  nection in the s
f390: 61 6d 65 20 70 72 6f 63 65 73 73 0a 20 20 20 20  ame process.    
f3a0: 2a 2a 20 68 6f 6c 64 73 20 61 20 6c 6f 63 6b 20  ** holds a lock 
f3b0: 6f 6e 20 74 68 65 20 66 69 6c 65 2e 20 20 4e 6f  on the file.  No
f3c0: 20 6e 65 65 64 20 74 6f 20 63 68 65 63 6b 20 66   need to check f
f3d0: 75 72 74 68 65 72 2e 20 2a 2f 0a 20 20 20 20 72  urther. */.    r
f3e0: 65 73 65 72 76 65 64 20 3d 20 31 3b 0a 20 20 7d  eserved = 1;.  }
f3f0: 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54 68 65  else{.    /* The
f400: 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64 20 69 66   lock is held if
f410: 20 61 6e 64 20 6f 6e 6c 79 20 69 66 20 74 68 65   and only if the
f420: 20 6c 6f 63 6b 66 69 6c 65 20 65 78 69 73 74 73   lockfile exists
f430: 20 2a 2f 0a 20 20 20 20 63 6f 6e 73 74 20 63 68   */.    const ch
f440: 61 72 20 2a 7a 4c 6f 63 6b 46 69 6c 65 20 3d 20  ar *zLockFile = 
f450: 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 70 46 69  (const char*)pFi
f460: 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65  le->lockingConte
f470: 78 74 3b 0a 20 20 20 20 72 65 73 65 72 76 65 64  xt;.    reserved
f480: 20 3d 20 61 63 63 65 73 73 28 7a 4c 6f 63 6b 46   = access(zLockF
f490: 69 6c 65 2c 20 30 29 3d 3d 30 3b 0a 20 20 7d 0a  ile, 0)==0;.  }.
f4a0: 20 20 4f 53 54 52 41 43 45 34 28 22 54 45 53 54    OSTRACE4("TEST
f4b0: 20 57 52 2d 4c 4f 43 4b 20 25 64 20 25 64 20 25   WR-LOCK %d %d %
f4c0: 64 20 28 64 6f 74 6c 6f 63 6b 29 5c 6e 22 2c 20  d (dotlock)\n", 
f4d0: 70 46 69 6c 65 2d 3e 68 2c 20 72 63 2c 20 72 65  pFile->h, rc, re
f4e0: 73 65 72 76 65 64 29 3b 0a 20 20 2a 70 52 65 73  served);.  *pRes
f4f0: 4f 75 74 20 3d 20 72 65 73 65 72 76 65 64 3b 0a  Out = reserved;.
f500: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
f510: 2f 2a 0a 2a 2a 20 4c 6f 63 6b 20 74 68 65 20 66  /*.** Lock the f
f520: 69 6c 65 20 77 69 74 68 20 74 68 65 20 6c 6f 63  ile with the loc
f530: 6b 20 73 70 65 63 69 66 69 65 64 20 62 79 20 70  k specified by p
f540: 61 72 61 6d 65 74 65 72 20 6c 6f 63 6b 74 79 70  arameter locktyp
f550: 65 20 2d 20 6f 6e 65 0a 2a 2a 20 6f 66 20 74 68  e - one.** of th
f560: 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a  e following:.**.
f570: 2a 2a 20 20 20 20 20 28 31 29 20 53 48 41 52 45  **     (1) SHARE
f580: 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 32  D_LOCK.**     (2
f590: 29 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 0a  ) RESERVED_LOCK.
f5a0: 2a 2a 20 20 20 20 20 28 33 29 20 50 45 4e 44 49  **     (3) PENDI
f5b0: 4e 47 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28  NG_LOCK.**     (
f5c0: 34 29 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43  4) EXCLUSIVE_LOC
f5d0: 4b 0a 2a 2a 0a 2a 2a 20 53 6f 6d 65 74 69 6d 65  K.**.** Sometime
f5e0: 73 20 77 68 65 6e 20 72 65 71 75 65 73 74 69 6e  s when requestin
f5f0: 67 20 6f 6e 65 20 6c 6f 63 6b 20 73 74 61 74 65  g one lock state
f600: 2c 20 61 64 64 69 74 69 6f 6e 61 6c 20 6c 6f 63  , additional loc
f610: 6b 20 73 74 61 74 65 73 0a 2a 2a 20 61 72 65 20  k states.** are 
f620: 69 6e 73 65 72 74 65 64 20 69 6e 20 62 65 74 77  inserted in betw
f630: 65 65 6e 2e 20 20 54 68 65 20 6c 6f 63 6b 69 6e  een.  The lockin
f640: 67 20 6d 69 67 68 74 20 66 61 69 6c 20 6f 6e 20  g might fail on 
f650: 6f 6e 65 20 6f 66 20 74 68 65 20 6c 61 74 65 72  one of the later
f660: 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e 73 20  .** transitions 
f670: 6c 65 61 76 69 6e 67 20 74 68 65 20 6c 6f 63 6b  leaving the lock
f680: 20 73 74 61 74 65 20 64 69 66 66 65 72 65 6e 74   state different
f690: 20 66 72 6f 6d 20 77 68 61 74 20 69 74 20 73 74   from what it st
f6a0: 61 72 74 65 64 20 62 75 74 0a 2a 2a 20 73 74 69  arted but.** sti
f6b0: 6c 6c 20 73 68 6f 72 74 20 6f 66 20 69 74 73 20  ll short of its 
f6c0: 67 6f 61 6c 2e 20 20 54 68 65 20 66 6f 6c 6c 6f  goal.  The follo
f6d0: 77 69 6e 67 20 63 68 61 72 74 20 73 68 6f 77 73  wing chart shows
f6e0: 20 74 68 65 20 61 6c 6c 6f 77 65 64 0a 2a 2a 20   the allowed.** 
f6f0: 74 72 61 6e 73 69 74 69 6f 6e 73 20 61 6e 64 20  transitions and 
f700: 74 68 65 20 69 6e 73 65 72 74 65 64 20 69 6e 74  the inserted int
f710: 65 72 6d 65 64 69 61 74 65 20 73 74 61 74 65 73  ermediate states
f720: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 55 4e 4c 4f 43  :.**.**    UNLOC
f730: 4b 45 44 20 2d 3e 20 53 48 41 52 45 44 0a 2a 2a  KED -> SHARED.**
f740: 20 20 20 20 53 48 41 52 45 44 20 2d 3e 20 52 45      SHARED -> RE
f750: 53 45 52 56 45 44 0a 2a 2a 20 20 20 20 53 48 41  SERVED.**    SHA
f760: 52 45 44 20 2d 3e 20 28 50 45 4e 44 49 4e 47 29  RED -> (PENDING)
f770: 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a   -> EXCLUSIVE.**
f780: 20 20 20 20 52 45 53 45 52 56 45 44 20 2d 3e 20      RESERVED -> 
f790: 28 50 45 4e 44 49 4e 47 29 20 2d 3e 20 45 58 43  (PENDING) -> EXC
f7a0: 4c 55 53 49 56 45 0a 2a 2a 20 20 20 20 50 45 4e  LUSIVE.**    PEN
f7b0: 44 49 4e 47 20 2d 3e 20 45 58 43 4c 55 53 49 56  DING -> EXCLUSIV
f7c0: 45 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  E.**.** This rou
f7d0: 74 69 6e 65 20 77 69 6c 6c 20 6f 6e 6c 79 20 69  tine will only i
f7e0: 6e 63 72 65 61 73 65 20 61 20 6c 6f 63 6b 2e 20  ncrease a lock. 
f7f0: 20 55 73 65 20 74 68 65 20 73 71 6c 69 74 65 33   Use the sqlite3
f800: 4f 73 55 6e 6c 6f 63 6b 28 29 0a 2a 2a 20 72 6f  OsUnlock().** ro
f810: 75 74 69 6e 65 20 74 6f 20 6c 6f 77 65 72 20 61  utine to lower a
f820: 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 2e 0a   locking level..
f830: 2a 2a 0a 2a 2a 20 57 69 74 68 20 64 6f 74 66 69  **.** With dotfi
f840: 6c 65 20 6c 6f 63 6b 69 6e 67 2c 20 77 65 20 72  le locking, we r
f850: 65 61 6c 6c 79 20 6f 6e 6c 79 20 73 75 70 70 6f  eally only suppo
f860: 72 74 20 73 74 61 74 65 20 28 34 29 3a 20 45 58  rt state (4): EX
f870: 43 4c 55 53 49 56 45 2e 0a 2a 2a 20 42 75 74 20  CLUSIVE..** But 
f880: 77 65 20 74 72 61 63 6b 20 74 68 65 20 6f 74 68  we track the oth
f890: 65 72 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c  er locking level
f8a0: 73 20 69 6e 74 65 72 6e 61 6c 6c 79 2e 0a 2a 2f  s internally..*/
f8b0: 0a 73 74 61 74 69 63 20 69 6e 74 20 64 6f 74 6c  .static int dotl
f8c0: 6f 63 6b 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f  ockLock(sqlite3_
f8d0: 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 6c 6f  file *id, int lo
f8e0: 63 6b 74 79 70 65 29 20 7b 0a 20 20 75 6e 69 78  cktype) {.  unix
f8f0: 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75  File *pFile = (u
f900: 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 69  nixFile*)id;.  i
f910: 6e 74 20 66 64 3b 0a 20 20 63 68 61 72 20 2a 7a  nt fd;.  char *z
f920: 4c 6f 63 6b 46 69 6c 65 20 3d 20 28 63 68 61 72  LockFile = (char
f930: 20 2a 29 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e   *)pFile->lockin
f940: 67 43 6f 6e 74 65 78 74 3b 0a 20 20 69 6e 74 20  gContext;.  int 
f950: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
f960: 0a 0a 20 20 2f 2a 20 49 66 20 77 65 20 68 61 76  ..  /* If we hav
f970: 65 20 61 6e 79 20 6c 6f 63 6b 2c 20 74 68 65 6e  e any lock, then
f980: 20 74 68 65 20 6c 6f 63 6b 20 66 69 6c 65 20 61   the lock file a
f990: 6c 72 65 61 64 79 20 65 78 69 73 74 73 2e 20 20  lready exists.  
f9a0: 41 6c 6c 20 77 65 20 68 61 76 65 0a 20 20 2a 2a  All we have.  **
f9b0: 20 74 6f 20 64 6f 20 69 73 20 61 64 6a 75 73 74   to do is adjust
f9c0: 20 6f 75 72 20 69 6e 74 65 72 6e 61 6c 20 72 65   our internal re
f9d0: 63 6f 72 64 20 6f 66 20 74 68 65 20 6c 6f 63 6b  cord of the lock
f9e0: 20 6c 65 76 65 6c 2e 0a 20 20 2a 2f 0a 20 20 69   level..  */.  i
f9f0: 66 28 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79  f( pFile->lockty
fa00: 70 65 20 3e 20 4e 4f 5f 4c 4f 43 4b 20 29 7b 0a  pe > NO_LOCK ){.
fa10: 20 20 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74      pFile->lockt
fa20: 79 70 65 20 3d 20 6c 6f 63 6b 74 79 70 65 3b 0a  ype = locktype;.
fa30: 23 69 66 20 21 4f 53 5f 56 58 57 4f 52 4b 53 0a  #if !OS_VXWORKS.
fa40: 20 20 20 20 2f 2a 20 41 6c 77 61 79 73 20 75 70      /* Always up
fa50: 64 61 74 65 20 74 68 65 20 74 69 6d 65 73 74 61  date the timesta
fa60: 6d 70 20 6f 6e 20 74 68 65 20 6f 6c 64 20 66 69  mp on the old fi
fa70: 6c 65 20 2a 2f 0a 20 20 20 20 75 74 69 6d 65 73  le */.    utimes
fa80: 28 7a 4c 6f 63 6b 46 69 6c 65 2c 20 4e 55 4c 4c  (zLockFile, NULL
fa90: 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 72 65  );.#endif.    re
faa0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
fab0: 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 67 72 61 62    }.  .  /* grab
fac0: 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f   an exclusive lo
fad0: 63 6b 20 2a 2f 0a 20 20 66 64 20 3d 20 6f 70 65  ck */.  fd = ope
fae0: 6e 28 7a 4c 6f 63 6b 46 69 6c 65 2c 4f 5f 52 44  n(zLockFile,O_RD
faf0: 4f 4e 4c 59 7c 4f 5f 43 52 45 41 54 7c 4f 5f 45  ONLY|O_CREAT|O_E
fb00: 58 43 4c 2c 30 36 30 30 29 3b 0a 20 20 69 66 28  XCL,0600);.  if(
fb10: 20 66 64 3c 30 20 29 7b 0a 20 20 20 20 2f 2a 20   fd<0 ){.    /* 
fb20: 66 61 69 6c 65 64 20 74 6f 20 6f 70 65 6e 2f 63  failed to open/c
fb30: 72 65 61 74 65 20 74 68 65 20 66 69 6c 65 2c 20  reate the file, 
fb40: 73 6f 6d 65 6f 6e 65 20 65 6c 73 65 20 6d 61 79  someone else may
fb50: 20 68 61 76 65 20 73 74 6f 6c 65 6e 20 74 68 65   have stolen the
fb60: 20 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20 69 6e 74   lock */.    int
fb70: 20 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b   tErrno = errno;
fb80: 0a 20 20 20 20 69 66 28 20 45 45 58 49 53 54 20  .    if( EEXIST 
fb90: 3d 3d 20 74 45 72 72 6e 6f 20 29 7b 0a 20 20 20  == tErrno ){.   
fba0: 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42     rc = SQLITE_B
fbb0: 55 53 59 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20  USY;.    } else 
fbc0: 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  {.      rc = sql
fbd0: 69 74 65 45 72 72 6f 72 46 72 6f 6d 50 6f 73 69  iteErrorFromPosi
fbe0: 78 45 72 72 6f 72 28 74 45 72 72 6e 6f 2c 20 53  xError(tErrno, S
fbf0: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b  QLITE_IOERR_LOCK
fc00: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 49 53 5f  );.      if( IS_
fc10: 4c 4f 43 4b 5f 45 52 52 4f 52 28 72 63 29 20 29  LOCK_ERROR(rc) )
fc20: 7b 0a 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d  {.        pFile-
fc30: 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 74 45 72  >lastErrno = tEr
fc40: 72 6e 6f 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  rno;.      }.   
fc50: 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63   }.    return rc
fc60: 3b 0a 20 20 7d 20 0a 20 20 69 66 28 20 63 6c 6f  ;.  } .  if( clo
fc70: 73 65 28 66 64 29 20 29 7b 0a 20 20 20 20 70 46  se(fd) ){.    pF
fc80: 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d  ile->lastErrno =
fc90: 20 65 72 72 6e 6f 3b 0a 20 20 20 20 72 63 20 3d   errno;.    rc =
fca0: 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43 4c   SQLITE_IOERR_CL
fcb0: 4f 53 45 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a  OSE;.  }.  .  /*
fcc0: 20 67 6f 74 20 69 74 2c 20 73 65 74 20 74 68 65   got it, set the
fcd0: 20 74 79 70 65 20 61 6e 64 20 72 65 74 75 72 6e   type and return
fce0: 20 6f 6b 20 2a 2f 0a 20 20 70 46 69 6c 65 2d 3e   ok */.  pFile->
fcf0: 6c 6f 63 6b 74 79 70 65 20 3d 20 6c 6f 63 6b 74  locktype = lockt
fd00: 79 70 65 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  ype;.  return rc
fd10: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 77 65 72  ;.}../*.** Lower
fd20: 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76   the locking lev
fd30: 65 6c 20 6f 6e 20 66 69 6c 65 20 64 65 73 63 72  el on file descr
fd40: 69 70 74 6f 72 20 70 46 69 6c 65 20 74 6f 20 6c  iptor pFile to l
fd50: 6f 63 6b 74 79 70 65 2e 20 20 6c 6f 63 6b 74 79  ocktype.  lockty
fd60: 70 65 0a 2a 2a 20 6d 75 73 74 20 62 65 20 65 69  pe.** must be ei
fd70: 74 68 65 72 20 4e 4f 5f 4c 4f 43 4b 20 6f 72 20  ther NO_LOCK or 
fd80: 53 48 41 52 45 44 5f 4c 4f 43 4b 2e 0a 2a 2a 0a  SHARED_LOCK..**.
fd90: 2a 2a 20 49 66 20 74 68 65 20 6c 6f 63 6b 69 6e  ** If the lockin
fda0: 67 20 6c 65 76 65 6c 20 6f 66 20 74 68 65 20 66  g level of the f
fdb0: 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 69  ile descriptor i
fdc0: 73 20 61 6c 72 65 61 64 79 20 61 74 20 6f 72 20  s already at or 
fdd0: 62 65 6c 6f 77 0a 2a 2a 20 74 68 65 20 72 65 71  below.** the req
fde0: 75 65 73 74 65 64 20 6c 6f 63 6b 69 6e 67 20 6c  uested locking l
fdf0: 65 76 65 6c 2c 20 74 68 69 73 20 72 6f 75 74 69  evel, this routi
fe00: 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a  ne is a no-op..*
fe10: 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 65 20 6c 6f  *.** When the lo
fe20: 63 6b 69 6e 67 20 6c 65 76 65 6c 20 72 65 61 63  cking level reac
fe30: 68 65 73 20 4e 4f 5f 4c 4f 43 4b 2c 20 64 65 6c  hes NO_LOCK, del
fe40: 65 74 65 20 74 68 65 20 6c 6f 63 6b 20 66 69 6c  ete the lock fil
fe50: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
fe60: 20 64 6f 74 6c 6f 63 6b 55 6e 6c 6f 63 6b 28 73   dotlockUnlock(s
fe70: 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c  qlite3_file *id,
fe80: 20 69 6e 74 20 6c 6f 63 6b 74 79 70 65 29 20 7b   int locktype) {
fe90: 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69  .  unixFile *pFi
fea0: 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29  le = (unixFile*)
feb0: 69 64 3b 0a 20 20 63 68 61 72 20 2a 7a 4c 6f 63  id;.  char *zLoc
fec0: 6b 46 69 6c 65 20 3d 20 28 63 68 61 72 20 2a 29  kFile = (char *)
fed0: 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f  pFile->lockingCo
fee0: 6e 74 65 78 74 3b 0a 0a 20 20 61 73 73 65 72 74  ntext;..  assert
fef0: 28 20 70 46 69 6c 65 20 29 3b 0a 20 20 4f 53 54  ( pFile );.  OST
ff00: 52 41 43 45 35 28 22 55 4e 4c 4f 43 4b 20 20 25  RACE5("UNLOCK  %
ff10: 64 20 25 64 20 77 61 73 20 25 64 20 70 69 64 3d  d %d was %d pid=
ff20: 25 64 20 28 64 6f 74 6c 6f 63 6b 29 5c 6e 22 2c  %d (dotlock)\n",
ff30: 20 70 46 69 6c 65 2d 3e 68 2c 20 6c 6f 63 6b 74   pFile->h, lockt
ff40: 79 70 65 2c 0a 09 20 20 20 70 46 69 6c 65 2d 3e  ype,..   pFile->
ff50: 6c 6f 63 6b 74 79 70 65 2c 20 67 65 74 70 69 64  locktype, getpid
ff60: 28 29 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6c  ());.  assert( l
ff70: 6f 63 6b 74 79 70 65 3c 3d 53 48 41 52 45 44 5f  ocktype<=SHARED_
ff80: 4c 4f 43 4b 20 29 3b 0a 20 20 0a 20 20 2f 2a 20  LOCK );.  .  /* 
ff90: 6e 6f 2d 6f 70 20 69 66 20 70 6f 73 73 69 62 6c  no-op if possibl
ffa0: 65 20 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c 65  e */.  if( pFile
ffb0: 2d 3e 6c 6f 63 6b 74 79 70 65 3d 3d 6c 6f 63 6b  ->locktype==lock
ffc0: 74 79 70 65 20 29 7b 0a 20 20 20 20 72 65 74 75  type ){.    retu
ffd0: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
ffe0: 7d 0a 0a 20 20 2f 2a 20 54 6f 20 64 6f 77 6e 67  }..  /* To downg
fff0: 72 61 64 65 20 74 6f 20 73 68 61 72 65 64 2c 20  rade to shared, 
10000 73 69 6d 70 6c 79 20 75 70 64 61 74 65 20 6f 75  simply update ou
10010 72 20 69 6e 74 65 72 6e 61 6c 20 6e 6f 74 69 6f  r internal notio
10020 6e 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20 6c 6f  n of the.  ** lo
10030 63 6b 20 73 74 61 74 65 2e 20 20 4e 6f 20 6e 65  ck state.  No ne
10040 65 64 20 74 6f 20 6d 65 73 73 20 77 69 74 68 20  ed to mess with 
10050 74 68 65 20 66 69 6c 65 20 6f 6e 20 64 69 73 6b  the file on disk
10060 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6c 6f 63  ..  */.  if( loc
10070 6b 74 79 70 65 3d 3d 53 48 41 52 45 44 5f 4c 4f  ktype==SHARED_LO
10080 43 4b 20 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d  CK ){.    pFile-
10090 3e 6c 6f 63 6b 74 79 70 65 20 3d 20 53 48 41 52  >locktype = SHAR
100a0 45 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20 72 65 74  ED_LOCK;.    ret
100b0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
100c0 20 7d 0a 20 20 0a 20 20 2f 2a 20 54 6f 20 66 75   }.  .  /* To fu
100d0 6c 6c 79 20 75 6e 6c 6f 63 6b 20 74 68 65 20 64  lly unlock the d
100e0 61 74 61 62 61 73 65 2c 20 64 65 6c 65 74 65 20  atabase, delete 
100f0 74 68 65 20 6c 6f 63 6b 20 66 69 6c 65 20 2a 2f  the lock file */
10100 0a 20 20 61 73 73 65 72 74 28 20 6c 6f 63 6b 74  .  assert( lockt
10110 79 70 65 3d 3d 4e 4f 5f 4c 4f 43 4b 20 29 3b 0a  ype==NO_LOCK );.
10120 20 20 69 66 28 20 75 6e 6c 69 6e 6b 28 7a 4c 6f    if( unlink(zLo
10130 63 6b 46 69 6c 65 29 20 29 7b 0a 20 20 20 20 69  ckFile) ){.    i
10140 6e 74 20 72 63 20 3d 20 30 3b 0a 20 20 20 20 69  nt rc = 0;.    i
10150 6e 74 20 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e  nt tErrno = errn
10160 6f 3b 0a 20 20 20 20 69 66 28 20 45 4e 4f 45 4e  o;.    if( ENOEN
10170 54 20 21 3d 20 74 45 72 72 6e 6f 20 29 7b 0a 20  T != tErrno ){. 
10180 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
10190 45 72 72 6f 72 46 72 6f 6d 50 6f 73 69 78 45 72  ErrorFromPosixEr
101a0 72 6f 72 28 74 45 72 72 6e 6f 2c 20 53 51 4c 49  ror(tErrno, SQLI
101b0 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 29  TE_IOERR_UNLOCK)
101c0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
101d0 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 72 63  IS_LOCK_ERROR(rc
101e0 29 20 29 7b 0a 20 20 20 20 20 20 70 46 69 6c 65  ) ){.      pFile
101f0 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 74 45  ->lastErrno = tE
10200 72 72 6e 6f 3b 0a 20 20 20 20 7d 0a 20 20 20 20  rrno;.    }.    
10210 72 65 74 75 72 6e 20 72 63 3b 20 0a 20 20 7d 0a  return rc; .  }.
10220 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70    pFile->locktyp
10230 65 20 3d 20 4e 4f 5f 4c 4f 43 4b 3b 0a 20 20 72  e = NO_LOCK;.  r
10240 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
10250 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20  .}../*.** Close 
10260 61 20 66 69 6c 65 2e 20 20 4d 61 6b 65 20 73 75  a file.  Make su
10270 72 65 20 74 68 65 20 6c 6f 63 6b 20 68 61 73 20  re the lock has 
10280 62 65 65 6e 20 72 65 6c 65 61 73 65 64 20 62 65  been released be
10290 66 6f 72 65 20 63 6c 6f 73 69 6e 67 2e 0a 2a 2f  fore closing..*/
102a0 0a 73 74 61 74 69 63 20 69 6e 74 20 64 6f 74 6c  .static int dotl
102b0 6f 63 6b 43 6c 6f 73 65 28 73 71 6c 69 74 65 33  ockClose(sqlite3
102c0 5f 66 69 6c 65 20 2a 69 64 29 20 7b 0a 20 20 69  _file *id) {.  i
102d0 6e 74 20 72 63 3b 0a 20 20 69 66 28 20 69 64 20  nt rc;.  if( id 
102e0 29 7b 0a 20 20 20 20 75 6e 69 78 46 69 6c 65 20  ){.    unixFile 
102f0 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69  *pFile = (unixFi
10300 6c 65 2a 29 69 64 3b 0a 20 20 20 20 64 6f 74 6c  le*)id;.    dotl
10310 6f 63 6b 55 6e 6c 6f 63 6b 28 69 64 2c 20 4e 4f  ockUnlock(id, NO
10320 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 73 71 6c 69  _LOCK);.    sqli
10330 74 65 33 5f 66 72 65 65 28 70 46 69 6c 65 2d 3e  te3_free(pFile->
10340 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 29 3b  lockingContext);
10350 0a 20 20 7d 0a 20 20 72 63 20 3d 20 63 6c 6f 73  .  }.  rc = clos
10360 65 55 6e 69 78 46 69 6c 65 28 69 64 29 3b 0a 20  eUnixFile(id);. 
10370 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 2f 2a   return rc;.}./*
10380 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10390 2a 20 45 6e 64 20 6f 66 20 74 68 65 20 64 6f 74  * End of the dot
103a0 2d 66 69 6c 65 20 6c 6f 63 6b 20 69 6d 70 6c 65  -file lock imple
103b0 6d 65 6e 74 61 74 69 6f 6e 20 2a 2a 2a 2a 2a 2a  mentation ******
103c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a  *************.**
103d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
103e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
103f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10400 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10410 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f  ************/../
10420 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10430 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10440 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10450 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10460 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a  **************.*
10470 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10480 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 42 65 67 69 6e 20  ********* Begin 
10490 66 6c 6f 63 6b 20 4c 6f 63 6b 69 6e 67 20 2a 2a  flock Locking **
104a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
104b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a  **************.*
104c0 2a 0a 2a 2a 20 55 73 65 20 74 68 65 20 66 6c 6f  *.** Use the flo
104d0 63 6b 28 29 20 73 79 73 74 65 6d 20 63 61 6c 6c  ck() system call
104e0 20 74 6f 20 64 6f 20 66 69 6c 65 20 6c 6f 63 6b   to do file lock
104f0 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 66 6c 6f 63 6b  ing..**.** flock
10500 28 29 20 6c 6f 63 6b 69 6e 67 20 69 73 20 6c 69  () locking is li
10510 6b 65 20 64 6f 74 2d 66 69 6c 65 20 6c 6f 63 6b  ke dot-file lock
10520 69 6e 67 20 69 6e 20 74 68 61 74 20 74 68 65 20  ing in that the 
10530 76 61 72 69 6f 75 73 0a 2a 2a 20 66 69 6e 65 2d  various.** fine-
10540 67 72 61 69 6e 20 6c 6f 63 6b 69 6e 67 20 6c 65  grain locking le
10550 76 65 6c 73 20 73 75 70 70 6f 72 74 65 64 20 62  vels supported b
10560 79 20 53 51 4c 69 74 65 20 61 72 65 20 63 6f 6c  y SQLite are col
10570 6c 61 70 73 65 64 20 69 6e 74 6f 0a 2a 2a 20 61  lapsed into.** a
10580 20 73 69 6e 67 6c 65 20 65 78 63 6c 75 73 69 76   single exclusiv
10590 65 20 6c 6f 63 6b 2e 20 20 49 6e 20 6f 74 68 65  e lock.  In othe
105a0 72 20 77 6f 72 64 73 2c 20 53 48 41 52 45 44 2c  r words, SHARED,
105b0 20 52 45 53 45 52 56 45 44 2c 20 61 6e 64 0a 2a   RESERVED, and.*
105c0 2a 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 73 20  * PENDING locks 
105d0 61 72 65 20 74 68 65 20 73 61 6d 65 20 74 68 69  are the same thi
105e0 6e 67 20 61 73 20 61 6e 20 45 58 43 4c 55 53 49  ng as an EXCLUSI
105f0 56 45 20 6c 6f 63 6b 2e 20 20 53 51 4c 69 74 65  VE lock.  SQLite
10600 0a 2a 2a 20 73 74 69 6c 6c 20 77 6f 72 6b 73 20  .** still works 
10610 77 68 65 6e 20 79 6f 75 20 64 6f 20 74 68 69 73  when you do this
10620 2c 20 62 75 74 20 63 6f 6e 63 75 72 72 65 6e 63  , but concurrenc
10630 79 20 69 73 20 72 65 64 75 63 65 64 20 73 69 6e  y is reduced sin
10640 63 65 0a 2a 2a 20 6f 6e 6c 79 20 61 20 73 69 6e  ce.** only a sin
10650 67 6c 65 20 70 72 6f 63 65 73 73 20 63 61 6e 20  gle process can 
10660 62 65 20 72 65 61 64 69 6e 67 20 74 68 65 20 64  be reading the d
10670 61 74 61 62 61 73 65 20 61 74 20 61 20 74 69 6d  atabase at a tim
10680 65 2e 0a 2a 2a 0a 2a 2a 20 4f 6d 69 74 20 74 68  e..**.** Omit th
10690 69 73 20 73 65 63 74 69 6f 6e 20 69 66 20 53 51  is section if SQ
106a0 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b  LITE_ENABLE_LOCK
106b0 49 4e 47 5f 53 54 59 4c 45 20 69 73 20 74 75 72  ING_STYLE is tur
106c0 6e 65 64 20 6f 66 66 20 6f 72 20 69 66 0a 2a 2a  ned off or if.**
106d0 20 63 6f 6d 70 69 6c 69 6e 67 20 66 6f 72 20 56   compiling for V
106e0 58 57 4f 52 4b 53 2e 0a 2a 2f 0a 23 69 66 20 53  XWORKS..*/.#if S
106f0 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43  QLITE_ENABLE_LOC
10700 4b 49 4e 47 5f 53 54 59 4c 45 20 26 26 20 21 4f  KING_STYLE && !O
10710 53 5f 56 58 57 4f 52 4b 53 0a 0a 2f 2a 0a 2a 2a  S_VXWORKS../*.**
10720 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63 68   This routine ch
10730 65 63 6b 73 20 69 66 20 74 68 65 72 65 20 69 73  ecks if there is
10740 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b   a RESERVED lock
10750 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 73 70 65   held on the spe
10760 63 69 66 69 65 64 0a 2a 2a 20 66 69 6c 65 20 62  cified.** file b
10770 79 20 74 68 69 73 20 6f 72 20 61 6e 79 20 6f 74  y this or any ot
10780 68 65 72 20 70 72 6f 63 65 73 73 2e 20 49 66 20  her process. If 
10790 73 75 63 68 20 61 20 6c 6f 63 6b 20 69 73 20 68  such a lock is h
107a0 65 6c 64 2c 20 73 65 74 20 2a 70 52 65 73 4f 75  eld, set *pResOu
107b0 74 0a 2a 2a 20 74 6f 20 61 20 6e 6f 6e 2d 7a 65  t.** to a non-ze
107c0 72 6f 20 76 61 6c 75 65 20 6f 74 68 65 72 77 69  ro value otherwi
107d0 73 65 20 2a 70 52 65 73 4f 75 74 20 69 73 20 73  se *pResOut is s
107e0 65 74 20 74 6f 20 7a 65 72 6f 2e 20 20 54 68 65  et to zero.  The
107f0 20 72 65 74 75 72 6e 20 76 61 6c 75 65 0a 2a 2a   return value.**
10800 20 69 73 20 73 65 74 20 74 6f 20 53 51 4c 49 54   is set to SQLIT
10810 45 5f 4f 4b 20 75 6e 6c 65 73 73 20 61 6e 20 49  E_OK unless an I
10820 2f 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20  /O error occurs 
10830 64 75 72 69 6e 67 20 6c 6f 63 6b 20 63 68 65 63  during lock chec
10840 6b 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  king..*/.static 
10850 69 6e 74 20 66 6c 6f 63 6b 43 68 65 63 6b 52 65  int flockCheckRe
10860 73 65 72 76 65 64 4c 6f 63 6b 28 73 71 6c 69 74  servedLock(sqlit
10870 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74  e3_file *id, int
10880 20 2a 70 52 65 73 4f 75 74 29 7b 0a 20 20 69 6e   *pResOut){.  in
10890 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
108a0 3b 0a 20 20 69 6e 74 20 72 65 73 65 72 76 65 64  ;.  int reserved
108b0 20 3d 20 30 3b 0a 20 20 75 6e 69 78 46 69 6c 65   = 0;.  unixFile
108c0 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46   *pFile = (unixF
108d0 69 6c 65 2a 29 69 64 3b 0a 20 20 0a 20 20 53 69  ile*)id;.  .  Si
108e0 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 72  mulateIOError( r
108f0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45  eturn SQLITE_IOE
10900 52 52 5f 43 48 45 43 4b 52 45 53 45 52 56 45 44  RR_CHECKRESERVED
10910 4c 4f 43 4b 3b 20 29 3b 0a 20 20 0a 20 20 61 73  LOCK; );.  .  as
10920 73 65 72 74 28 20 70 46 69 6c 65 20 29 3b 0a 20  sert( pFile );. 
10930 20 0a 20 20 2f 2a 20 43 68 65 63 6b 20 69 66 20   .  /* Check if 
10940 61 20 74 68 72 65 61 64 20 69 6e 20 74 68 69 73  a thread in this
10950 20 70 72 6f 63 65 73 73 20 68 6f 6c 64 73 20 73   process holds s
10960 75 63 68 20 61 20 6c 6f 63 6b 20 2a 2f 0a 20 20  uch a lock */.  
10970 69 66 28 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74  if( pFile->lockt
10980 79 70 65 3e 53 48 41 52 45 44 5f 4c 4f 43 4b 20  ype>SHARED_LOCK 
10990 29 7b 0a 20 20 20 20 72 65 73 65 72 76 65 64 20  ){.    reserved 
109a0 3d 20 31 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a  = 1;.  }.  .  /*
109b0 20 4f 74 68 65 72 77 69 73 65 20 73 65 65 20 69   Otherwise see i
109c0 66 20 73 6f 6d 65 20 6f 74 68 65 72 20 70 72 6f  f some other pro
109d0 63 65 73 73 20 68 6f 6c 64 73 20 69 74 2e 20 2a  cess holds it. *
109e0 2f 0a 20 20 69 66 28 20 21 72 65 73 65 72 76 65  /.  if( !reserve
109f0 64 20 29 7b 0a 20 20 20 20 2f 2a 20 61 74 74 65  d ){.    /* atte
10a00 6d 70 74 20 74 6f 20 67 65 74 20 74 68 65 20 6c  mpt to get the l
10a10 6f 63 6b 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6c  ock */.    int l
10a20 72 63 20 3d 20 66 6c 6f 63 6b 28 70 46 69 6c 65  rc = flock(pFile
10a30 2d 3e 68 2c 20 4c 4f 43 4b 5f 45 58 20 7c 20 4c  ->h, LOCK_EX | L
10a40 4f 43 4b 5f 4e 42 29 3b 0a 20 20 20 20 69 66 28  OCK_NB);.    if(
10a50 20 21 6c 72 63 20 29 7b 0a 20 20 20 20 20 20 2f   !lrc ){.      /
10a60 2a 20 67 6f 74 20 74 68 65 20 6c 6f 63 6b 2c 20  * got the lock, 
10a70 75 6e 6c 6f 63 6b 20 69 74 20 2a 2f 0a 20 20 20  unlock it */.   
10a80 20 20 20 6c 72 63 20 3d 20 66 6c 6f 63 6b 28 70     lrc = flock(p
10a90 46 69 6c 65 2d 3e 68 2c 20 4c 4f 43 4b 5f 55 4e  File->h, LOCK_UN
10aa0 29 3b 0a 20 20 20 20 20 20 69 66 20 28 20 6c 72  );.      if ( lr
10ab0 63 20 29 20 7b 0a 20 20 20 20 20 20 20 20 69 6e  c ) {.        in
10ac0 74 20 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f  t tErrno = errno
10ad0 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20 75 6e 6c  ;.        /* unl
10ae0 6f 63 6b 20 66 61 69 6c 65 64 20 77 69 74 68 20  ock failed with 
10af0 61 6e 20 65 72 72 6f 72 20 2a 2f 0a 20 20 20 20  an error */.    
10b00 20 20 20 20 6c 72 63 20 3d 20 73 71 6c 69 74 65      lrc = sqlite
10b10 45 72 72 6f 72 46 72 6f 6d 50 6f 73 69 78 45 72  ErrorFromPosixEr
10b20 72 6f 72 28 74 45 72 72 6e 6f 2c 20 53 51 4c 49  ror(tErrno, SQLI
10b30 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 29  TE_IOERR_UNLOCK)
10b40 3b 20 0a 20 20 20 20 20 20 20 20 69 66 28 20 49  ; .        if( I
10b50 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 6c 72 63  S_LOCK_ERROR(lrc
10b60 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70  ) ){.          p
10b70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20  File->lastErrno 
10b80 3d 20 74 45 72 72 6e 6f 3b 0a 20 20 20 20 20 20  = tErrno;.      
10b90 20 20 20 20 72 63 20 3d 20 6c 72 63 3b 0a 20 20      rc = lrc;.  
10ba0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
10bb0 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20      } else {.   
10bc0 20 20 20 69 6e 74 20 74 45 72 72 6e 6f 20 3d 20     int tErrno = 
10bd0 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20 72 65 73  errno;.      res
10be0 65 72 76 65 64 20 3d 20 31 3b 0a 20 20 20 20 20  erved = 1;.     
10bf0 20 2f 2a 20 73 6f 6d 65 6f 6e 65 20 65 6c 73 65   /* someone else
10c00 20 6d 69 67 68 74 20 68 61 76 65 20 69 74 20 72   might have it r
10c10 65 73 65 72 76 65 64 20 2a 2f 0a 20 20 20 20 20  eserved */.     
10c20 20 6c 72 63 20 3d 20 73 71 6c 69 74 65 45 72 72   lrc = sqliteErr
10c30 6f 72 46 72 6f 6d 50 6f 73 69 78 45 72 72 6f 72  orFromPosixError
10c40 28 74 45 72 72 6e 6f 2c 20 53 51 4c 49 54 45 5f  (tErrno, SQLITE_
10c50 49 4f 45 52 52 5f 4c 4f 43 4b 29 3b 20 0a 20 20  IOERR_LOCK); .  
10c60 20 20 20 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f      if( IS_LOCK_
10c70 45 52 52 4f 52 28 6c 72 63 29 20 29 7b 0a 20 20  ERROR(lrc) ){.  
10c80 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73        pFile->las
10c90 74 45 72 72 6e 6f 20 3d 20 74 45 72 72 6e 6f 3b  tErrno = tErrno;
10ca0 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 6c 72  .        rc = lr
10cb0 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  c;.      }.    }
10cc0 0a 20 20 7d 0a 20 20 4f 53 54 52 41 43 45 34 28  .  }.  OSTRACE4(
10cd0 22 54 45 53 54 20 57 52 2d 4c 4f 43 4b 20 25 64  "TEST WR-LOCK %d
10ce0 20 25 64 20 25 64 20 28 66 6c 6f 63 6b 29 5c 6e   %d %d (flock)\n
10cf0 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 72 63 2c  ", pFile->h, rc,
10d00 20 72 65 73 65 72 76 65 64 29 3b 0a 0a 23 69 66   reserved);..#if
10d10 64 65 66 20 53 51 4c 49 54 45 5f 49 47 4e 4f 52  def SQLITE_IGNOR
10d20 45 5f 46 4c 4f 43 4b 5f 4c 4f 43 4b 5f 45 52 52  E_FLOCK_LOCK_ERR
10d30 4f 52 53 0a 20 20 69 66 28 20 28 72 63 20 26 20  ORS.  if( (rc & 
10d40 53 51 4c 49 54 45 5f 49 4f 45 52 52 29 20 3d 3d  SQLITE_IOERR) ==
10d50 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 20 29 7b   SQLITE_IOERR ){
10d60 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
10d70 5f 4f 4b 3b 0a 20 20 20 20 72 65 73 65 72 76 65  _OK;.    reserve
10d80 64 3d 31 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 20  d=1;.  }.#endif 
10d90 2f 2a 20 53 51 4c 49 54 45 5f 49 47 4e 4f 52 45  /* SQLITE_IGNORE
10da0 5f 46 4c 4f 43 4b 5f 4c 4f 43 4b 5f 45 52 52 4f  _FLOCK_LOCK_ERRO
10db0 52 53 20 2a 2f 0a 20 20 2a 70 52 65 73 4f 75 74  RS */.  *pResOut
10dc0 20 3d 20 72 65 73 65 72 76 65 64 3b 0a 20 20 72   = reserved;.  r
10dd0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
10de0 2a 2a 20 4c 6f 63 6b 20 74 68 65 20 66 69 6c 65  ** Lock the file
10df0 20 77 69 74 68 20 74 68 65 20 6c 6f 63 6b 20 73   with the lock s
10e00 70 65 63 69 66 69 65 64 20 62 79 20 70 61 72 61  pecified by para
10e10 6d 65 74 65 72 20 6c 6f 63 6b 74 79 70 65 20 2d  meter locktype -
10e20 20 6f 6e 65 0a 2a 2a 20 6f 66 20 74 68 65 20 66   one.** of the f
10e30 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20  ollowing:.**.** 
10e40 20 20 20 20 28 31 29 20 53 48 41 52 45 44 5f 4c      (1) SHARED_L
10e50 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 32 29 20 52  OCK.**     (2) R
10e60 45 53 45 52 56 45 44 5f 4c 4f 43 4b 0a 2a 2a 20  ESERVED_LOCK.** 
10e70 20 20 20 20 28 33 29 20 50 45 4e 44 49 4e 47 5f      (3) PENDING_
10e80 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 34 29 20  LOCK.**     (4) 
10e90 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 0a 2a  EXCLUSIVE_LOCK.*
10ea0 2a 0a 2a 2a 20 53 6f 6d 65 74 69 6d 65 73 20 77  *.** Sometimes w
10eb0 68 65 6e 20 72 65 71 75 65 73 74 69 6e 67 20 6f  hen requesting o
10ec0 6e 65 20 6c 6f 63 6b 20 73 74 61 74 65 2c 20 61  ne lock state, a
10ed0 64 64 69 74 69 6f 6e 61 6c 20 6c 6f 63 6b 20 73  dditional lock s
10ee0 74 61 74 65 73 0a 2a 2a 20 61 72 65 20 69 6e 73  tates.** are ins
10ef0 65 72 74 65 64 20 69 6e 20 62 65 74 77 65 65 6e  erted in between
10f00 2e 20 20 54 68 65 20 6c 6f 63 6b 69 6e 67 20 6d  .  The locking m
10f10 69 67 68 74 20 66 61 69 6c 20 6f 6e 20 6f 6e 65  ight fail on one
10f20 20 6f 66 20 74 68 65 20 6c 61 74 65 72 0a 2a 2a   of the later.**
10f30 20 74 72 61 6e 73 69 74 69 6f 6e 73 20 6c 65 61   transitions lea
10f40 76 69 6e 67 20 74 68 65 20 6c 6f 63 6b 20 73 74  ving the lock st
10f50 61 74 65 20 64 69 66 66 65 72 65 6e 74 20 66 72  ate different fr
10f60 6f 6d 20 77 68 61 74 20 69 74 20 73 74 61 72 74  om what it start
10f70 65 64 20 62 75 74 0a 2a 2a 20 73 74 69 6c 6c 20  ed but.** still 
10f80 73 68 6f 72 74 20 6f 66 20 69 74 73 20 67 6f 61  short of its goa
10f90 6c 2e 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  l.  The followin
10fa0 67 20 63 68 61 72 74 20 73 68 6f 77 73 20 74 68  g chart shows th
10fb0 65 20 61 6c 6c 6f 77 65 64 0a 2a 2a 20 74 72 61  e allowed.** tra
10fc0 6e 73 69 74 69 6f 6e 73 20 61 6e 64 20 74 68 65  nsitions and the
10fd0 20 69 6e 73 65 72 74 65 64 20 69 6e 74 65 72 6d   inserted interm
10fe0 65 64 69 61 74 65 20 73 74 61 74 65 73 3a 0a 2a  ediate states:.*
10ff0 2a 0a 2a 2a 20 20 20 20 55 4e 4c 4f 43 4b 45 44  *.**    UNLOCKED
11000 20 2d 3e 20 53 48 41 52 45 44 0a 2a 2a 20 20 20   -> SHARED.**   
11010 20 53 48 41 52 45 44 20 2d 3e 20 52 45 53 45 52   SHARED -> RESER
11020 56 45 44 0a 2a 2a 20 20 20 20 53 48 41 52 45 44  VED.**    SHARED
11030 20 2d 3e 20 28 50 45 4e 44 49 4e 47 29 20 2d 3e   -> (PENDING) ->
11040 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20 20 20   EXCLUSIVE.**   
11050 20 52 45 53 45 52 56 45 44 20 2d 3e 20 28 50 45   RESERVED -> (PE
11060 4e 44 49 4e 47 29 20 2d 3e 20 45 58 43 4c 55 53  NDING) -> EXCLUS
11070 49 56 45 0a 2a 2a 20 20 20 20 50 45 4e 44 49 4e  IVE.**    PENDIN
11080 47 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a  G -> EXCLUSIVE.*
11090 2a 0a 2a 2a 20 66 6c 6f 63 6b 28 29 20 6f 6e 6c  *.** flock() onl
110a0 79 20 72 65 61 6c 6c 79 20 73 75 70 70 6f 72 74  y really support
110b0 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 73   EXCLUSIVE locks
110c0 2e 20 20 57 65 20 74 72 61 63 6b 20 69 6e 74 65  .  We track inte
110d0 72 6d 65 64 69 61 74 65 0a 2a 2a 20 6c 6f 63 6b  rmediate.** lock
110e0 20 73 74 61 74 65 73 20 69 6e 20 74 68 65 20 73   states in the s
110f0 71 6c 69 74 65 33 5f 66 69 6c 65 20 73 74 72 75  qlite3_file stru
11100 63 74 75 72 65 2c 20 62 75 74 20 61 6c 6c 20 6c  cture, but all l
11110 6f 63 6b 73 20 53 48 41 52 45 44 20 6f 72 0a 2a  ocks SHARED or.*
11120 2a 20 61 62 6f 76 65 20 61 72 65 20 72 65 61 6c  * above are real
11130 6c 79 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63  ly EXCLUSIVE loc
11140 6b 73 20 61 6e 64 20 65 78 63 6c 75 64 65 20 61  ks and exclude a
11150 6c 6c 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73  ll other process
11160 65 73 20 66 72 6f 6d 0a 2a 2a 20 61 63 63 65 73  es from.** acces
11170 73 20 74 68 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a  s the file..**.*
11180 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77  * This routine w
11190 69 6c 6c 20 6f 6e 6c 79 20 69 6e 63 72 65 61 73  ill only increas
111a0 65 20 61 20 6c 6f 63 6b 2e 20 20 55 73 65 20 74  e a lock.  Use t
111b0 68 65 20 73 71 6c 69 74 65 33 4f 73 55 6e 6c 6f  he sqlite3OsUnlo
111c0 63 6b 28 29 0a 2a 2a 20 72 6f 75 74 69 6e 65 20  ck().** routine 
111d0 74 6f 20 6c 6f 77 65 72 20 61 20 6c 6f 63 6b 69  to lower a locki
111e0 6e 67 20 6c 65 76 65 6c 2e 0a 2a 2f 0a 73 74 61  ng level..*/.sta
111f0 74 69 63 20 69 6e 74 20 66 6c 6f 63 6b 4c 6f 63  tic int flockLoc
11200 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  k(sqlite3_file *
11210 69 64 2c 20 69 6e 74 20 6c 6f 63 6b 74 79 70 65  id, int locktype
11220 29 20 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  ) {.  int rc = S
11230 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 75 6e 69 78  QLITE_OK;.  unix
11240 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75  File *pFile = (u
11250 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 0a 20 20  nixFile*)id;..  
11260 61 73 73 65 72 74 28 20 70 46 69 6c 65 20 29 3b  assert( pFile );
11270 0a 0a 20 20 2f 2a 20 69 66 20 77 65 20 61 6c 72  ..  /* if we alr
11280 65 61 64 79 20 68 61 76 65 20 61 20 6c 6f 63 6b  eady have a lock
11290 2c 20 69 74 20 69 73 20 65 78 63 6c 75 73 69 76  , it is exclusiv
112a0 65 2e 20 20 0a 20 20 2a 2a 20 4a 75 73 74 20 61  e.  .  ** Just a
112b0 64 6a 75 73 74 20 6c 65 76 65 6c 20 61 6e 64 20  djust level and 
112c0 70 75 6e 74 20 6f 6e 20 6f 75 74 74 61 20 68 65  punt on outta he
112d0 72 65 2e 20 2a 2f 0a 20 20 69 66 20 28 70 46 69  re. */.  if (pFi
112e0 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 20 3e 20 4e  le->locktype > N
112f0 4f 5f 4c 4f 43 4b 29 20 7b 0a 20 20 20 20 70 46  O_LOCK) {.    pF
11300 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 20 3d 20  ile->locktype = 
11310 6c 6f 63 6b 74 79 70 65 3b 0a 20 20 20 20 72 65  locktype;.    re
11320 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
11330 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 67 72 61 62    }.  .  /* grab
11340 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f   an exclusive lo
11350 63 6b 20 2a 2f 0a 20 20 0a 20 20 69 66 20 28 66  ck */.  .  if (f
11360 6c 6f 63 6b 28 70 46 69 6c 65 2d 3e 68 2c 20 4c  lock(pFile->h, L
11370 4f 43 4b 5f 45 58 20 7c 20 4c 4f 43 4b 5f 4e 42  OCK_EX | LOCK_NB
11380 29 29 20 7b 0a 20 20 20 20 69 6e 74 20 74 45 72  )) {.    int tEr
11390 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20  rno = errno;.   
113a0 20 2f 2a 20 64 69 64 6e 27 74 20 67 65 74 2c 20   /* didn't get, 
113b0 6d 75 73 74 20 62 65 20 62 75 73 79 20 2a 2f 0a  must be busy */.
113c0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 45      rc = sqliteE
113d0 72 72 6f 72 46 72 6f 6d 50 6f 73 69 78 45 72 72  rrorFromPosixErr
113e0 6f 72 28 74 45 72 72 6e 6f 2c 20 53 51 4c 49 54  or(tErrno, SQLIT
113f0 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b 29 3b 0a 20  E_IOERR_LOCK);. 
11400 20 20 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45     if( IS_LOCK_E
11410 52 52 4f 52 28 72 63 29 20 29 7b 0a 20 20 20 20  RROR(rc) ){.    
11420 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72    pFile->lastErr
11430 6e 6f 20 3d 20 74 45 72 72 6e 6f 3b 0a 20 20 20  no = tErrno;.   
11440 20 7d 0a 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20   }.  } else {.  
11450 20 20 2f 2a 20 67 6f 74 20 69 74 2c 20 73 65 74    /* got it, set
11460 20 74 68 65 20 74 79 70 65 20 61 6e 64 20 72 65   the type and re
11470 74 75 72 6e 20 6f 6b 20 2a 2f 0a 20 20 20 20 70  turn ok */.    p
11480 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 20 3d  File->locktype =
11490 20 6c 6f 63 6b 74 79 70 65 3b 0a 20 20 7d 0a 20   locktype;.  }. 
114a0 20 4f 53 54 52 41 43 45 34 28 22 4c 4f 43 4b 20   OSTRACE4("LOCK 
114b0 20 20 20 25 64 20 25 73 20 25 73 20 28 66 6c 6f     %d %s %s (flo
114c0 63 6b 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68  ck)\n", pFile->h
114d0 2c 20 6c 6f 63 6b 74 79 70 65 4e 61 6d 65 28 6c  , locktypeName(l
114e0 6f 63 6b 74 79 70 65 29 2c 20 0a 20 20 20 20 20  ocktype), .     
114f0 20 20 20 20 20 20 72 63 3d 3d 53 51 4c 49 54 45        rc==SQLITE
11500 5f 4f 4b 20 3f 20 22 6f 6b 22 20 3a 20 22 66 61  _OK ? "ok" : "fa
11510 69 6c 65 64 22 29 3b 0a 23 69 66 64 65 66 20 53  iled");.#ifdef S
11520 51 4c 49 54 45 5f 49 47 4e 4f 52 45 5f 46 4c 4f  QLITE_IGNORE_FLO
11530 43 4b 5f 4c 4f 43 4b 5f 45 52 52 4f 52 53 0a 20  CK_LOCK_ERRORS. 
11540 20 69 66 28 20 28 72 63 20 26 20 53 51 4c 49 54   if( (rc & SQLIT
11550 45 5f 49 4f 45 52 52 29 20 3d 3d 20 53 51 4c 49  E_IOERR) == SQLI
11560 54 45 5f 49 4f 45 52 52 20 29 7b 0a 20 20 20 20  TE_IOERR ){.    
11570 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59  rc = SQLITE_BUSY
11580 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  ;.  }.#endif /* 
11590 53 51 4c 49 54 45 5f 49 47 4e 4f 52 45 5f 46 4c  SQLITE_IGNORE_FL
115a0 4f 43 4b 5f 4c 4f 43 4b 5f 45 52 52 4f 52 53 20  OCK_LOCK_ERRORS 
115b0 2a 2f 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  */.  return rc;.
115c0 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 77 65 72 20  }.../*.** Lower 
115d0 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65  the locking leve
115e0 6c 20 6f 6e 20 66 69 6c 65 20 64 65 73 63 72 69  l on file descri
115f0 70 74 6f 72 20 70 46 69 6c 65 20 74 6f 20 6c 6f  ptor pFile to lo
11600 63 6b 74 79 70 65 2e 20 20 6c 6f 63 6b 74 79 70  cktype.  locktyp
11610 65 0a 2a 2a 20 6d 75 73 74 20 62 65 20 65 69 74  e.** must be eit
11620 68 65 72 20 4e 4f 5f 4c 4f 43 4b 20 6f 72 20 53  her NO_LOCK or S
11630 48 41 52 45 44 5f 4c 4f 43 4b 2e 0a 2a 2a 0a 2a  HARED_LOCK..**.*
11640 2a 20 49 66 20 74 68 65 20 6c 6f 63 6b 69 6e 67  * If the locking
11650 20 6c 65 76 65 6c 20 6f 66 20 74 68 65 20 66 69   level of the fi
11660 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 69 73  le descriptor is
11670 20 61 6c 72 65 61 64 79 20 61 74 20 6f 72 20 62   already at or b
11680 65 6c 6f 77 0a 2a 2a 20 74 68 65 20 72 65 71 75  elow.** the requ
11690 65 73 74 65 64 20 6c 6f 63 6b 69 6e 67 20 6c 65  ested locking le
116a0 76 65 6c 2c 20 74 68 69 73 20 72 6f 75 74 69 6e  vel, this routin
116b0 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f  e is a no-op..*/
116c0 0a 73 74 61 74 69 63 20 69 6e 74 20 66 6c 6f 63  .static int floc
116d0 6b 55 6e 6c 6f 63 6b 28 73 71 6c 69 74 65 33 5f  kUnlock(sqlite3_
116e0 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 6c 6f  file *id, int lo
116f0 63 6b 74 79 70 65 29 20 7b 0a 20 20 75 6e 69 78  cktype) {.  unix
11700 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75  File *pFile = (u
11710 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 0a  nixFile*)id;.  .
11720 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 20    assert( pFile 
11730 29 3b 0a 20 20 4f 53 54 52 41 43 45 35 28 22 55  );.  OSTRACE5("U
11740 4e 4c 4f 43 4b 20 20 25 64 20 25 64 20 77 61 73  NLOCK  %d %d was
11750 20 25 64 20 70 69 64 3d 25 64 20 28 66 6c 6f 63   %d pid=%d (floc
11760 6b 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c  k)\n", pFile->h,
11770 20 6c 6f 63 6b 74 79 70 65 2c 0a 20 20 20 20 20   locktype,.     
11780 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 6f 63        pFile->loc
11790 6b 74 79 70 65 2c 20 67 65 74 70 69 64 28 29 29  ktype, getpid())
117a0 3b 0a 20 20 61 73 73 65 72 74 28 20 6c 6f 63 6b  ;.  assert( lock
117b0 74 79 70 65 3c 3d 53 48 41 52 45 44 5f 4c 4f 43  type<=SHARED_LOC
117c0 4b 20 29 3b 0a 20 20 0a 20 20 2f 2a 20 6e 6f 2d  K );.  .  /* no-
117d0 6f 70 20 69 66 20 70 6f 73 73 69 62 6c 65 20 2a  op if possible *
117e0 2f 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 6c  /.  if( pFile->l
117f0 6f 63 6b 74 79 70 65 3d 3d 6c 6f 63 6b 74 79 70  ocktype==locktyp
11800 65 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  e ){.    return 
11810 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20  SQLITE_OK;.  }. 
11820 20 0a 20 20 2f 2a 20 73 68 61 72 65 64 20 63 61   .  /* shared ca
11830 6e 20 6a 75 73 74 20 62 65 20 73 65 74 20 62 65  n just be set be
11840 63 61 75 73 65 20 77 65 20 61 6c 77 61 79 73 20  cause we always 
11850 68 61 76 65 20 61 6e 20 65 78 63 6c 75 73 69 76  have an exclusiv
11860 65 20 2a 2f 0a 20 20 69 66 20 28 6c 6f 63 6b 74  e */.  if (lockt
11870 79 70 65 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b  ype==SHARED_LOCK
11880 29 20 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c  ) {.    pFile->l
11890 6f 63 6b 74 79 70 65 20 3d 20 6c 6f 63 6b 74 79  ocktype = lockty
118a0 70 65 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53  pe;.    return S
118b0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20  QLITE_OK;.  }.  
118c0 0a 20 20 2f 2a 20 6e 6f 2c 20 72 65 61 6c 6c 79  .  /* no, really
118d0 2c 20 75 6e 6c 6f 63 6b 2e 20 2a 2f 0a 20 20 69  , unlock. */.  i
118e0 6e 74 20 72 63 20 3d 20 66 6c 6f 63 6b 28 70 46  nt rc = flock(pF
118f0 69 6c 65 2d 3e 68 2c 20 4c 4f 43 4b 5f 55 4e 29  ile->h, LOCK_UN)
11900 3b 0a 20 20 69 66 20 28 72 63 29 20 7b 0a 20 20  ;.  if (rc) {.  
11910 20 20 69 6e 74 20 72 2c 20 74 45 72 72 6e 6f 20    int r, tErrno 
11920 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 72 20 3d  = errno;.    r =
11930 20 73 71 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d   sqliteErrorFrom
11940 50 6f 73 69 78 45 72 72 6f 72 28 74 45 72 72 6e  PosixError(tErrn
11950 6f 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  o, SQLITE_IOERR_
11960 55 4e 4c 4f 43 4b 29 3b 0a 20 20 20 20 69 66 28  UNLOCK);.    if(
11970 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 72   IS_LOCK_ERROR(r
11980 29 20 29 7b 0a 20 20 20 20 20 20 70 46 69 6c 65  ) ){.      pFile
11990 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 74 45  ->lastErrno = tE
119a0 72 72 6e 6f 3b 0a 20 20 20 20 7d 0a 23 69 66 64  rrno;.    }.#ifd
119b0 65 66 20 53 51 4c 49 54 45 5f 49 47 4e 4f 52 45  ef SQLITE_IGNORE
119c0 5f 46 4c 4f 43 4b 5f 4c 4f 43 4b 5f 45 52 52 4f  _FLOCK_LOCK_ERRO
119d0 52 53 0a 20 20 20 20 69 66 28 20 28 72 20 26 20  RS.    if( (r & 
119e0 53 51 4c 49 54 45 5f 49 4f 45 52 52 29 20 3d 3d  SQLITE_IOERR) ==
119f0 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 20 29 7b   SQLITE_IOERR ){
11a00 0a 20 20 20 20 20 20 72 20 3d 20 53 51 4c 49 54  .      r = SQLIT
11a10 45 5f 42 55 53 59 3b 0a 20 20 20 20 7d 0a 23 65  E_BUSY;.    }.#e
11a20 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 49  ndif /* SQLITE_I
11a30 47 4e 4f 52 45 5f 46 4c 4f 43 4b 5f 4c 4f 43 4b  GNORE_FLOCK_LOCK
11a40 5f 45 52 52 4f 52 53 20 2a 2f 0a 20 20 20 20 0a  _ERRORS */.    .
11a50 20 20 20 20 72 65 74 75 72 6e 20 72 3b 0a 20 20      return r;.  
11a60 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 70 46 69  } else {.    pFi
11a70 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 20 3d 20 4e  le->locktype = N
11a80 4f 5f 4c 4f 43 4b 3b 0a 20 20 20 20 72 65 74 75  O_LOCK;.    retu
11a90 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
11aa0 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65  }.}../*.** Close
11ab0 20 61 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74   a file..*/.stat
11ac0 69 63 20 69 6e 74 20 66 6c 6f 63 6b 43 6c 6f 73  ic int flockClos
11ad0 65 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  e(sqlite3_file *
11ae0 69 64 29 20 7b 0a 20 20 69 66 28 20 69 64 20 29  id) {.  if( id )
11af0 7b 0a 20 20 20 20 66 6c 6f 63 6b 55 6e 6c 6f 63  {.    flockUnloc
11b00 6b 28 69 64 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a  k(id, NO_LOCK);.
11b10 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 63 6c 6f    }.  return clo
11b20 73 65 55 6e 69 78 46 69 6c 65 28 69 64 29 3b 0a  seUnixFile(id);.
11b30 7d 0a 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  }..#endif /* SQL
11b40 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49  ITE_ENABLE_LOCKI
11b50 4e 47 5f 53 54 59 4c 45 20 26 26 20 21 4f 53 5f  NG_STYLE && !OS_
11b60 56 58 57 4f 52 4b 20 2a 2f 0a 0a 2f 2a 2a 2a 2a  VXWORK */../****
11b70 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20  *************** 
11b80 45 6e 64 20 6f 66 20 74 68 65 20 66 6c 6f 63 6b  End of the flock
11b90 20 6c 6f 63 6b 20 69 6d 70 6c 65 6d 65 6e 74 61   lock implementa
11ba0 74 69 6f 6e 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  tion ***********
11bb0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a  **********.*****
11bc0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11bd0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11be0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11bf0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11c00 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 2a 2a  *********/../***
11c10 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11c20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11c30 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11c40 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11c50 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a  ***********.****
11c60 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11c70 2a 2a 2a 2a 20 42 65 67 69 6e 20 4e 61 6d 65 64  **** Begin Named
11c80 20 53 65 6d 61 70 68 6f 72 65 20 4c 6f 63 6b 69   Semaphore Locki
11c90 6e 67 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ng *************
11ca0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a  ***********.**.*
11cb0 2a 20 4e 61 6d 65 64 20 73 65 6d 61 70 68 6f 72  * Named semaphor
11cc0 65 20 6c 6f 63 6b 69 6e 67 20 69 73 20 6f 6e 6c  e locking is onl
11cd0 79 20 73 75 70 70 6f 72 74 65 64 20 6f 6e 20 56  y supported on V
11ce0 78 57 6f 72 6b 73 2e 0a 2a 2a 0a 2a 2a 20 53 65  xWorks..**.** Se
11cf0 6d 61 70 68 6f 72 65 20 6c 6f 63 6b 69 6e 67 20  maphore locking 
11d00 69 73 20 6c 69 6b 65 20 64 6f 74 2d 6c 6f 63 6b  is like dot-lock
11d10 20 61 6e 64 20 66 6c 6f 63 6b 20 69 6e 20 74 68   and flock in th
11d20 61 74 20 69 74 20 72 65 61 6c 6c 79 20 6f 6e 6c  at it really onl
11d30 79 0a 2a 2a 20 73 75 70 70 6f 72 74 73 20 45 58  y.** supports EX
11d40 43 4c 55 53 49 56 45 20 6c 6f 63 6b 69 6e 67 2e  CLUSIVE locking.
11d50 20 20 4f 6e 6c 79 20 61 20 73 69 6e 67 6c 65 20    Only a single 
11d60 70 72 6f 63 65 73 73 20 63 61 6e 20 72 65 61 64  process can read
11d70 20 6f 72 20 77 72 69 74 65 0a 2a 2a 20 74 68 65   or write.** the
11d80 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 61   database file a
11d90 74 20 61 20 74 69 6d 65 2e 20 20 54 68 69 73 20  t a time.  This 
11da0 72 65 64 75 63 65 73 20 70 6f 74 65 6e 74 69 61  reduces potentia
11db0 6c 20 63 6f 6e 63 75 72 72 65 6e 63 79 2c 20 62  l concurrency, b
11dc0 75 74 0a 2a 2a 20 6d 61 6b 65 73 20 74 68 65 20  ut.** makes the 
11dd0 6c 6f 63 6b 20 69 6d 70 6c 65 6d 65 6e 74 61 74  lock implementat
11de0 69 6f 6e 20 6d 75 63 68 20 65 61 73 69 65 72 2e  ion much easier.
11df0 0a 2a 2f 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52  .*/.#if OS_VXWOR
11e00 4b 53 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  KS../*.** This r
11e10 6f 75 74 69 6e 65 20 63 68 65 63 6b 73 20 69 66  outine checks if
11e20 20 74 68 65 72 65 20 69 73 20 61 20 52 45 53 45   there is a RESE
11e30 52 56 45 44 20 6c 6f 63 6b 20 68 65 6c 64 20 6f  RVED lock held o
11e40 6e 20 74 68 65 20 73 70 65 63 69 66 69 65 64 0a  n the specified.
11e50 2a 2a 20 66 69 6c 65 20 62 79 20 74 68 69 73 20  ** file by this 
11e60 6f 72 20 61 6e 79 20 6f 74 68 65 72 20 70 72 6f  or any other pro
11e70 63 65 73 73 2e 20 49 66 20 73 75 63 68 20 61 20  cess. If such a 
11e80 6c 6f 63 6b 20 69 73 20 68 65 6c 64 2c 20 73 65  lock is held, se
11e90 74 20 2a 70 52 65 73 4f 75 74 0a 2a 2a 20 74 6f  t *pResOut.** to
11ea0 20 61 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75   a non-zero valu
11eb0 65 20 6f 74 68 65 72 77 69 73 65 20 2a 70 52 65  e otherwise *pRe
11ec0 73 4f 75 74 20 69 73 20 73 65 74 20 74 6f 20 7a  sOut is set to z
11ed0 65 72 6f 2e 20 20 54 68 65 20 72 65 74 75 72 6e  ero.  The return
11ee0 20 76 61 6c 75 65 0a 2a 2a 20 69 73 20 73 65 74   value.** is set
11ef0 20 74 6f 20 53 51 4c 49 54 45 5f 4f 4b 20 75 6e   to SQLITE_OK un
11f00 6c 65 73 73 20 61 6e 20 49 2f 4f 20 65 72 72 6f  less an I/O erro
11f10 72 20 6f 63 63 75 72 73 20 64 75 72 69 6e 67 20  r occurs during 
11f20 6c 6f 63 6b 20 63 68 65 63 6b 69 6e 67 2e 0a 2a  lock checking..*
11f30 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 65 6d  /.static int sem
11f40 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63  CheckReservedLoc
11f50 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  k(sqlite3_file *
11f60 69 64 2c 20 69 6e 74 20 2a 70 52 65 73 4f 75 74  id, int *pResOut
11f70 29 20 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  ) {.  int rc = S
11f80 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20  QLITE_OK;.  int 
11f90 72 65 73 65 72 76 65 64 20 3d 20 30 3b 0a 20 20  reserved = 0;.  
11fa0 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20  unixFile *pFile 
11fb0 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b  = (unixFile*)id;
11fc0 0a 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72  ..  SimulateIOEr
11fd0 72 6f 72 28 20 72 65 74 75 72 6e 20 53 51 4c 49  ror( return SQLI
11fe0 54 45 5f 49 4f 45 52 52 5f 43 48 45 43 4b 52 45  TE_IOERR_CHECKRE
11ff0 53 45 52 56 45 44 4c 4f 43 4b 3b 20 29 3b 0a 20  SERVEDLOCK; );. 
12000 20 0a 20 20 61 73 73 65 72 74 28 20 70 46 69 6c   .  assert( pFil
12010 65 20 29 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b  e );..  /* Check
12020 20 69 66 20 61 20 74 68 72 65 61 64 20 69 6e 20   if a thread in 
12030 74 68 69 73 20 70 72 6f 63 65 73 73 20 68 6f 6c  this process hol
12040 64 73 20 73 75 63 68 20 61 20 6c 6f 63 6b 20 2a  ds such a lock *
12050 2f 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 6c  /.  if( pFile->l
12060 6f 63 6b 74 79 70 65 3e 53 48 41 52 45 44 5f 4c  ocktype>SHARED_L
12070 4f 43 4b 20 29 7b 0a 20 20 20 20 72 65 73 65 72  OCK ){.    reser
12080 76 65 64 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 0a  ved = 1;.  }.  .
12090 20 20 2f 2a 20 4f 74 68 65 72 77 69 73 65 20 73    /* Otherwise s
120a0 65 65 20 69 66 20 73 6f 6d 65 20 6f 74 68 65 72  ee if some other
120b0 20 70 72 6f 63 65 73 73 20 68 6f 6c 64 73 20 69   process holds i
120c0 74 2e 20 2a 2f 0a 20 20 69 66 28 20 21 72 65 73  t. */.  if( !res
120d0 65 72 76 65 64 20 29 7b 0a 20 20 20 20 73 65 6d  erved ){.    sem
120e0 5f 74 20 2a 70 53 65 6d 20 3d 20 70 46 69 6c 65  _t *pSem = pFile
120f0 2d 3e 70 4f 70 65 6e 2d 3e 70 53 65 6d 3b 0a 20  ->pOpen->pSem;. 
12100 20 20 20 73 74 72 75 63 74 20 73 74 61 74 20 73     struct stat s
12110 74 61 74 42 75 66 3b 0a 0a 20 20 20 20 69 66 28  tatBuf;..    if(
12120 20 73 65 6d 5f 74 72 79 77 61 69 74 28 70 53 65   sem_trywait(pSe
12130 6d 29 3d 3d 2d 31 20 29 7b 0a 20 20 20 20 20 20  m)==-1 ){.      
12140 69 6e 74 20 74 45 72 72 6e 6f 20 3d 20 65 72 72  int tErrno = err
12150 6e 6f 3b 0a 20 20 20 20 20 20 69 66 28 20 45 41  no;.      if( EA
12160 47 41 49 4e 20 21 3d 20 74 45 72 72 6e 6f 20 29  GAIN != tErrno )
12170 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  {.        rc = s
12180 71 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d 50 6f  qliteErrorFromPo
12190 73 69 78 45 72 72 6f 72 28 74 45 72 72 6e 6f 2c  sixError(tErrno,
121a0 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43 48   SQLITE_IOERR_CH
121b0 45 43 4b 52 45 53 45 52 56 45 44 4c 4f 43 4b 29  ECKRESERVEDLOCK)
121c0 3b 0a 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d  ;.        pFile-
121d0 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 74 45 72  >lastErrno = tEr
121e0 72 6e 6f 3b 0a 20 20 20 20 20 20 7d 20 65 6c 73  rno;.      } els
121f0 65 20 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 73  e {.        /* s
12200 6f 6d 65 6f 6e 65 20 65 6c 73 65 20 68 61 73 20  omeone else has 
12210 74 68 65 20 6c 6f 63 6b 20 77 68 65 6e 20 77 65  the lock when we
12220 20 61 72 65 20 69 6e 20 4e 4f 5f 4c 4f 43 4b 20   are in NO_LOCK 
12230 2a 2f 0a 20 20 20 20 20 20 20 20 72 65 73 65 72  */.        reser
12240 76 65 64 20 3d 20 28 70 46 69 6c 65 2d 3e 6c 6f  ved = (pFile->lo
12250 63 6b 74 79 70 65 20 3c 20 53 48 41 52 45 44 5f  cktype < SHARED_
12260 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 7d 0a 20  LOCK);.      }. 
12270 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
12280 2f 2a 20 77 65 20 63 6f 75 6c 64 20 68 61 76 65  /* we could have
12290 20 69 74 20 69 66 20 77 65 20 77 61 6e 74 20 69   it if we want i
122a0 74 20 2a 2f 0a 20 20 20 20 20 20 73 65 6d 5f 70  t */.      sem_p
122b0 6f 73 74 28 70 53 65 6d 29 3b 0a 20 20 20 20 7d  ost(pSem);.    }
122c0 0a 20 20 7d 0a 20 20 4f 53 54 52 41 43 45 34 28  .  }.  OSTRACE4(
122d0 22 54 45 53 54 20 57 52 2d 4c 4f 43 4b 20 25 64  "TEST WR-LOCK %d
122e0 20 25 64 20 25 64 20 28 73 65 6d 29 5c 6e 22 2c   %d %d (sem)\n",
122f0 20 70 46 69 6c 65 2d 3e 68 2c 20 72 63 2c 20 72   pFile->h, rc, r
12300 65 73 65 72 76 65 64 29 3b 0a 0a 20 20 2a 70 52  eserved);..  *pR
12310 65 73 4f 75 74 20 3d 20 72 65 73 65 72 76 65 64  esOut = reserved
12320 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
12330 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 6b 20 74 68 65  ../*.** Lock the
12340 20 66 69 6c 65 20 77 69 74 68 20 74 68 65 20 6c   file with the l
12350 6f 63 6b 20 73 70 65 63 69 66 69 65 64 20 62 79  ock specified by
12360 20 70 61 72 61 6d 65 74 65 72 20 6c 6f 63 6b 74   parameter lockt
12370 79 70 65 20 2d 20 6f 6e 65 0a 2a 2a 20 6f 66 20  ype - one.** of 
12380 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a  the following:.*
12390 2a 0a 2a 2a 20 20 20 20 20 28 31 29 20 53 48 41  *.**     (1) SHA
123a0 52 45 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20  RED_LOCK.**     
123b0 28 32 29 20 52 45 53 45 52 56 45 44 5f 4c 4f 43  (2) RESERVED_LOC
123c0 4b 0a 2a 2a 20 20 20 20 20 28 33 29 20 50 45 4e  K.**     (3) PEN
123d0 44 49 4e 47 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20  DING_LOCK.**    
123e0 20 28 34 29 20 45 58 43 4c 55 53 49 56 45 5f 4c   (4) EXCLUSIVE_L
123f0 4f 43 4b 0a 2a 2a 0a 2a 2a 20 53 6f 6d 65 74 69  OCK.**.** Someti
12400 6d 65 73 20 77 68 65 6e 20 72 65 71 75 65 73 74  mes when request
12410 69 6e 67 20 6f 6e 65 20 6c 6f 63 6b 20 73 74 61  ing one lock sta
12420 74 65 2c 20 61 64 64 69 74 69 6f 6e 61 6c 20 6c  te, additional l
12430 6f 63 6b 20 73 74 61 74 65 73 0a 2a 2a 20 61 72  ock states.** ar
12440 65 20 69 6e 73 65 72 74 65 64 20 69 6e 20 62 65  e inserted in be
12450 74 77 65 65 6e 2e 20 20 54 68 65 20 6c 6f 63 6b  tween.  The lock
12460 69 6e 67 20 6d 69 67 68 74 20 66 61 69 6c 20 6f  ing might fail o
12470 6e 20 6f 6e 65 20 6f 66 20 74 68 65 20 6c 61 74  n one of the lat
12480 65 72 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e  er.** transition
12490 73 20 6c 65 61 76 69 6e 67 20 74 68 65 20 6c 6f  s leaving the lo
124a0 63 6b 20 73 74 61 74 65 20 64 69 66 66 65 72 65  ck state differe
124b0 6e 74 20 66 72 6f 6d 20 77 68 61 74 20 69 74 20  nt from what it 
124c0 73 74 61 72 74 65 64 20 62 75 74 0a 2a 2a 20 73  started but.** s
124d0 74 69 6c 6c 20 73 68 6f 72 74 20 6f 66 20 69 74  till short of it
124e0 73 20 67 6f 61 6c 2e 20 20 54 68 65 20 66 6f 6c  s goal.  The fol
124f0 6c 6f 77 69 6e 67 20 63 68 61 72 74 20 73 68 6f  lowing chart sho
12500 77 73 20 74 68 65 20 61 6c 6c 6f 77 65 64 0a 2a  ws the allowed.*
12510 2a 20 74 72 61 6e 73 69 74 69 6f 6e 73 20 61 6e  * transitions an
12520 64 20 74 68 65 20 69 6e 73 65 72 74 65 64 20 69  d the inserted i
12530 6e 74 65 72 6d 65 64 69 61 74 65 20 73 74 61 74  ntermediate stat
12540 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 55 4e 4c  es:.**.**    UNL
12550 4f 43 4b 45 44 20 2d 3e 20 53 48 41 52 45 44 0a  OCKED -> SHARED.
12560 2a 2a 20 20 20 20 53 48 41 52 45 44 20 2d 3e 20  **    SHARED -> 
12570 52 45 53 45 52 56 45 44 0a 2a 2a 20 20 20 20 53  RESERVED.**    S
12580 48 41 52 45 44 20 2d 3e 20 28 50 45 4e 44 49 4e  HARED -> (PENDIN
12590 47 29 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a  G) -> EXCLUSIVE.
125a0 2a 2a 20 20 20 20 52 45 53 45 52 56 45 44 20 2d  **    RESERVED -
125b0 3e 20 28 50 45 4e 44 49 4e 47 29 20 2d 3e 20 45  > (PENDING) -> E
125c0 58 43 4c 55 53 49 56 45 0a 2a 2a 20 20 20 20 50  XCLUSIVE.**    P
125d0 45 4e 44 49 4e 47 20 2d 3e 20 45 58 43 4c 55 53  ENDING -> EXCLUS
125e0 49 56 45 0a 2a 2a 0a 2a 2a 20 53 65 6d 61 70 68  IVE.**.** Semaph
125f0 6f 72 65 20 6c 6f 63 6b 73 20 6f 6e 6c 79 20 72  ore locks only r
12600 65 61 6c 6c 79 20 73 75 70 70 6f 72 74 20 45 58  eally support EX
12610 43 4c 55 53 49 56 45 20 6c 6f 63 6b 73 2e 20 20  CLUSIVE locks.  
12620 57 65 20 74 72 61 63 6b 20 69 6e 74 65 72 6d 65  We track interme
12630 64 69 61 74 65 0a 2a 2a 20 6c 6f 63 6b 20 73 74  diate.** lock st
12640 61 74 65 73 20 69 6e 20 74 68 65 20 73 71 6c 69  ates in the sqli
12650 74 65 33 5f 66 69 6c 65 20 73 74 72 75 63 74 75  te3_file structu
12660 72 65 2c 20 62 75 74 20 61 6c 6c 20 6c 6f 63 6b  re, but all lock
12670 73 20 53 48 41 52 45 44 20 6f 72 0a 2a 2a 20 61  s SHARED or.** a
12680 62 6f 76 65 20 61 72 65 20 72 65 61 6c 6c 79 20  bove are really 
12690 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 73 20  EXCLUSIVE locks 
126a0 61 6e 64 20 65 78 63 6c 75 64 65 20 61 6c 6c 20  and exclude all 
126b0 6f 74 68 65 72 20 70 72 6f 63 65 73 73 65 73 20  other processes 
126c0 66 72 6f 6d 0a 2a 2a 20 61 63 63 65 73 73 20 74  from.** access t
126d0 68 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54  he file..**.** T
126e0 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c  his routine will
126f0 20 6f 6e 6c 79 20 69 6e 63 72 65 61 73 65 20 61   only increase a
12700 20 6c 6f 63 6b 2e 20 20 55 73 65 20 74 68 65 20   lock.  Use the 
12710 73 71 6c 69 74 65 33 4f 73 55 6e 6c 6f 63 6b 28  sqlite3OsUnlock(
12720 29 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 74 6f 20  ).** routine to 
12730 6c 6f 77 65 72 20 61 20 6c 6f 63 6b 69 6e 67 20  lower a locking 
12740 6c 65 76 65 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63  level..*/.static
12750 20 69 6e 74 20 73 65 6d 4c 6f 63 6b 28 73 71 6c   int semLock(sql
12760 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69  ite3_file *id, i
12770 6e 74 20 6c 6f 63 6b 74 79 70 65 29 20 7b 0a 20  nt locktype) {. 
12780 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65   unixFile *pFile
12790 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64   = (unixFile*)id
127a0 3b 0a 20 20 69 6e 74 20 66 64 3b 0a 20 20 73 65  ;.  int fd;.  se
127b0 6d 5f 74 20 2a 70 53 65 6d 20 3d 20 70 46 69 6c  m_t *pSem = pFil
127c0 65 2d 3e 70 4f 70 65 6e 2d 3e 70 53 65 6d 3b 0a  e->pOpen->pSem;.
127d0 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
127e0 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 69 66 20 77  E_OK;..  /* if w
127f0 65 20 61 6c 72 65 61 64 79 20 68 61 76 65 20 61  e already have a
12800 20 6c 6f 63 6b 2c 20 69 74 20 69 73 20 65 78 63   lock, it is exc
12810 6c 75 73 69 76 65 2e 20 20 0a 20 20 2a 2a 20 4a  lusive.  .  ** J
12820 75 73 74 20 61 64 6a 75 73 74 20 6c 65 76 65 6c  ust adjust level
12830 20 61 6e 64 20 70 75 6e 74 20 6f 6e 20 6f 75 74   and punt on out
12840 74 61 20 68 65 72 65 2e 20 2a 2f 0a 20 20 69 66  ta here. */.  if
12850 20 28 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70   (pFile->locktyp
12860 65 20 3e 20 4e 4f 5f 4c 4f 43 4b 29 20 7b 0a 20  e > NO_LOCK) {. 
12870 20 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79     pFile->lockty
12880 70 65 20 3d 20 6c 6f 63 6b 74 79 70 65 3b 0a 20  pe = locktype;. 
12890 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f     rc = SQLITE_O
128a0 4b 3b 0a 20 20 20 20 67 6f 74 6f 20 73 65 6d 5f  K;.    goto sem_
128b0 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 7d 0a 20 20  end_lock;.  }.  
128c0 0a 20 20 2f 2a 20 6c 6f 63 6b 20 73 65 6d 61 70  .  /* lock semap
128d0 68 6f 72 65 20 6e 6f 77 20 62 75 74 20 62 61 69  hore now but bai
128e0 6c 20 6f 75 74 20 77 68 65 6e 20 61 6c 72 65 61  l out when alrea
128f0 64 79 20 6c 6f 63 6b 65 64 2e 20 2a 2f 0a 20 20  dy locked. */.  
12900 69 66 28 20 73 65 6d 5f 74 72 79 77 61 69 74 28  if( sem_trywait(
12910 70 53 65 6d 29 3d 3d 2d 31 20 29 7b 0a 20 20 20  pSem)==-1 ){.   
12920 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53   rc = SQLITE_BUS
12930 59 3b 0a 20 20 20 20 67 6f 74 6f 20 73 65 6d 5f  Y;.    goto sem_
12940 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 7d 0a 0a 20  end_lock;.  }.. 
12950 20 2f 2a 20 67 6f 74 20 69 74 2c 20 73 65 74 20   /* got it, set 
12960 74 68 65 20 74 79 70 65 20 61 6e 64 20 72 65 74  the type and ret
12970 75 72 6e 20 6f 6b 20 2a 2f 0a 20 20 70 46 69 6c  urn ok */.  pFil
12980 65 2d 3e 6c 6f 63 6b 74 79 70 65 20 3d 20 6c 6f  e->locktype = lo
12990 63 6b 74 79 70 65 3b 0a 0a 20 73 65 6d 5f 65 6e  cktype;.. sem_en
129a0 64 5f 6c 6f 63 6b 3a 0a 20 20 72 65 74 75 72 6e  d_lock:.  return
129b0 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f   rc;.}../*.** Lo
129c0 77 65 72 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20  wer the locking 
129d0 6c 65 76 65 6c 20 6f 6e 20 66 69 6c 65 20 64 65  level on file de
129e0 73 63 72 69 70 74 6f 72 20 70 46 69 6c 65 20 74  scriptor pFile t
129f0 6f 20 6c 6f 63 6b 74 79 70 65 2e 20 20 6c 6f 63  o locktype.  loc
12a00 6b 74 79 70 65 0a 2a 2a 20 6d 75 73 74 20 62 65  ktype.** must be
12a10 20 65 69 74 68 65 72 20 4e 4f 5f 4c 4f 43 4b 20   either NO_LOCK 
12a20 6f 72 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2e 0a  or SHARED_LOCK..
12a30 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6c 6f 63  **.** If the loc
12a40 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 66 20 74 68  king level of th
12a50 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  e file descripto
12a60 72 20 69 73 20 61 6c 72 65 61 64 79 20 61 74 20  r is already at 
12a70 6f 72 20 62 65 6c 6f 77 0a 2a 2a 20 74 68 65 20  or below.** the 
12a80 72 65 71 75 65 73 74 65 64 20 6c 6f 63 6b 69 6e  requested lockin
12a90 67 20 6c 65 76 65 6c 2c 20 74 68 69 73 20 72 6f  g level, this ro
12aa0 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70  utine is a no-op
12ab0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
12ac0 73 65 6d 55 6e 6c 6f 63 6b 28 73 71 6c 69 74 65  semUnlock(sqlite
12ad0 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20  3_file *id, int 
12ae0 6c 6f 63 6b 74 79 70 65 29 20 7b 0a 20 20 75 6e  locktype) {.  un
12af0 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20  ixFile *pFile = 
12b00 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20  (unixFile*)id;. 
12b10 20 73 65 6d 5f 74 20 2a 70 53 65 6d 20 3d 20 70   sem_t *pSem = p
12b20 46 69 6c 65 2d 3e 70 4f 70 65 6e 2d 3e 70 53 65  File->pOpen->pSe
12b30 6d 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 46  m;..  assert( pF
12b40 69 6c 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ile );.  assert(
12b50 20 70 53 65 6d 20 29 3b 0a 20 20 4f 53 54 52 41   pSem );.  OSTRA
12b60 43 45 35 28 22 55 4e 4c 4f 43 4b 20 20 25 64 20  CE5("UNLOCK  %d 
12b70 25 64 20 77 61 73 20 25 64 20 70 69 64 3d 25 64  %d was %d pid=%d
12b80 20 28 73 65 6d 29 5c 6e 22 2c 20 70 46 69 6c 65   (sem)\n", pFile
12b90 2d 3e 68 2c 20 6c 6f 63 6b 74 79 70 65 2c 0a 09  ->h, locktype,..
12ba0 20 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79     pFile->lockty
12bb0 70 65 2c 20 67 65 74 70 69 64 28 29 29 3b 0a 20  pe, getpid());. 
12bc0 20 61 73 73 65 72 74 28 20 6c 6f 63 6b 74 79 70   assert( locktyp
12bd0 65 3c 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29  e<=SHARED_LOCK )
12be0 3b 0a 20 20 0a 20 20 2f 2a 20 6e 6f 2d 6f 70 20  ;.  .  /* no-op 
12bf0 69 66 20 70 6f 73 73 69 62 6c 65 20 2a 2f 0a 20  if possible */. 
12c00 20 69 66 28 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b   if( pFile->lock
12c10 74 79 70 65 3d 3d 6c 6f 63 6b 74 79 70 65 20 29  type==locktype )
12c20 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
12c30 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 0a 20  ITE_OK;.  }.  . 
12c40 20 2f 2a 20 73 68 61 72 65 64 20 63 61 6e 20 6a   /* shared can j
12c50 75 73 74 20 62 65 20 73 65 74 20 62 65 63 61 75  ust be set becau
12c60 73 65 20 77 65 20 61 6c 77 61 79 73 20 68 61 76  se we always hav
12c70 65 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20 2a  e an exclusive *
12c80 2f 0a 20 20 69 66 20 28 6c 6f 63 6b 74 79 70 65  /.  if (locktype
12c90 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 29 20 7b  ==SHARED_LOCK) {
12ca0 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b  .    pFile->lock
12cb0 74 79 70 65 20 3d 20 6c 6f 63 6b 74 79 70 65 3b  type = locktype;
12cc0 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
12cd0 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 0a 20 20  TE_OK;.  }.  .  
12ce0 2f 2a 20 6e 6f 2c 20 72 65 61 6c 6c 79 20 75 6e  /* no, really un
12cf0 6c 6f 63 6b 2e 20 2a 2f 0a 20 20 69 66 20 28 20  lock. */.  if ( 
12d00 73 65 6d 5f 70 6f 73 74 28 70 53 65 6d 29 3d 3d  sem_post(pSem)==
12d10 2d 31 20 29 20 7b 0a 20 20 20 20 69 6e 74 20 72  -1 ) {.    int r
12d20 63 2c 20 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e  c, tErrno = errn
12d30 6f 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  o;.    rc = sqli
12d40 74 65 45 72 72 6f 72 46 72 6f 6d 50 6f 73 69 78  teErrorFromPosix
12d50 45 72 72 6f 72 28 74 45 72 72 6e 6f 2c 20 53 51  Error(tErrno, SQ
12d60 4c 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43  LITE_IOERR_UNLOC
12d70 4b 29 3b 0a 20 20 20 20 69 66 28 20 49 53 5f 4c  K);.    if( IS_L
12d80 4f 43 4b 5f 45 52 52 4f 52 28 72 63 29 20 29 7b  OCK_ERROR(rc) ){
12d90 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61  .      pFile->la
12da0 73 74 45 72 72 6e 6f 20 3d 20 74 45 72 72 6e 6f  stErrno = tErrno
12db0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75  ;.    }.    retu
12dc0 72 6e 20 72 63 3b 20 0a 20 20 7d 0a 20 20 70 46  rn rc; .  }.  pF
12dd0 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 20 3d 20  ile->locktype = 
12de0 4e 4f 5f 4c 4f 43 4b 3b 0a 20 20 72 65 74 75 72  NO_LOCK;.  retur
12df0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
12e00 2f 2a 0a 20 2a 2a 20 43 6c 6f 73 65 20 61 20 66  /*. ** Close a f
12e10 69 6c 65 2e 0a 20 2a 2f 0a 73 74 61 74 69 63 20  ile.. */.static 
12e20 69 6e 74 20 73 65 6d 43 6c 6f 73 65 28 73 71 6c  int semClose(sql
12e30 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 29 20 7b  ite3_file *id) {
12e40 0a 20 20 69 66 28 20 69 64 20 29 7b 0a 20 20 20  .  if( id ){.   
12e50 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65   unixFile *pFile
12e60 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64   = (unixFile*)id
12e70 3b 0a 20 20 20 20 73 65 6d 55 6e 6c 6f 63 6b 28  ;.    semUnlock(
12e80 69 64 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20 20  id, NO_LOCK);.  
12e90 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 20    assert( pFile 
12ea0 29 3b 0a 20 20 20 20 75 6e 69 78 45 6e 74 65 72  );.    unixEnter
12eb0 4d 75 74 65 78 28 29 3b 0a 20 20 20 20 72 65 6c  Mutex();.    rel
12ec0 65 61 73 65 4c 6f 63 6b 49 6e 66 6f 28 70 46 69  easeLockInfo(pFi
12ed0 6c 65 2d 3e 70 4c 6f 63 6b 29 3b 0a 20 20 20 20  le->pLock);.    
12ee0 72 65 6c 65 61 73 65 4f 70 65 6e 43 6e 74 28 70  releaseOpenCnt(p
12ef0 46 69 6c 65 2d 3e 70 4f 70 65 6e 29 3b 0a 20 20  File->pOpen);.  
12f00 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78    unixLeaveMutex
12f10 28 29 3b 0a 20 20 20 20 63 6c 6f 73 65 55 6e 69  ();.    closeUni
12f20 78 46 69 6c 65 28 69 64 29 3b 0a 20 20 7d 0a 20  xFile(id);.  }. 
12f30 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
12f40 4b 3b 0a 7d 0a 0a 23 65 6e 64 69 66 20 2f 2a 20  K;.}..#endif /* 
12f50 4f 53 5f 56 58 57 4f 52 4b 53 20 2a 2f 0a 2f 2a  OS_VXWORKS */./*
12f60 0a 2a 2a 20 4e 61 6d 65 64 20 73 65 6d 61 70 68  .** Named semaph
12f70 6f 72 65 20 6c 6f 63 6b 69 6e 67 20 69 73 20 6f  ore locking is o
12f80 6e 6c 79 20 61 76 61 69 6c 61 62 6c 65 20 6f 6e  nly available on
12f90 20 56 78 57 6f 72 6b 73 2e 0a 2a 2a 0a 2a 2a 2a   VxWorks..**.***
12fa0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64  ************ End
12fb0 20 6f 66 20 74 68 65 20 6e 61 6d 65 64 20 73 65   of the named se
12fc0 6d 61 70 68 6f 72 65 20 6c 6f 63 6b 20 69 6d 70  maphore lock imp
12fd0 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 2a 2a 2a 2a  lementation ****
12fe0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a  ************.***
12ff0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13000 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13010 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13020 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13030 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 0a 2f  ***********/.../
13040 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13050 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13060 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13070 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13080 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a  **************.*
13090 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
130a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 42 65 67 69 6e  ********** Begin
130b0 20 41 46 50 20 4c 6f 63 6b 69 6e 67 20 2a 2a 2a   AFP Locking ***
130c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
130d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a  **************.*
130e0 2a 0a 2a 2a 20 41 46 50 20 69 73 20 74 68 65 20  *.** AFP is the 
130f0 41 70 70 6c 65 20 46 69 6c 69 6e 67 20 50 72 6f  Apple Filing Pro
13100 74 6f 63 6f 6c 2e 20 20 41 46 50 20 69 73 20 61  tocol.  AFP is a
13110 20 6e 65 74 77 6f 72 6b 20 66 69 6c 65 73 79 73   network filesys
13120 74 65 6d 20 66 6f 75 6e 64 0a 2a 2a 20 6f 6e 20  tem found.** on 
13130 41 70 70 6c 65 20 4d 61 63 69 6e 74 6f 73 68 20  Apple Macintosh 
13140 63 6f 6d 70 75 74 65 72 73 20 2d 20 62 6f 74 68  computers - both
13150 20 4f 53 39 20 61 6e 64 20 4f 53 58 2e 0a 2a 2a   OS9 and OSX..**
13160 0a 2a 2a 20 54 68 69 72 64 2d 70 61 72 74 79 20  .** Third-party 
13170 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 73 20  implementations 
13180 6f 66 20 41 46 50 20 61 72 65 20 61 76 61 69 6c  of AFP are avail
13190 61 62 6c 65 2e 20 20 42 75 74 20 74 68 69 73 20  able.  But this 
131a0 63 6f 64 65 20 68 65 72 65 0a 2a 2a 20 6f 6e 6c  code here.** onl
131b0 79 20 77 6f 72 6b 73 20 6f 6e 20 4f 53 58 2e 0a  y works on OSX..
131c0 2a 2f 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28  */..#if defined(
131d0 5f 5f 41 50 50 4c 45 5f 5f 29 20 26 26 20 53 51  __APPLE__) && SQ
131e0 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b  LITE_ENABLE_LOCK
131f0 49 4e 47 5f 53 54 59 4c 45 0a 2f 2a 0a 2a 2a 20  ING_STYLE./*.** 
13200 54 68 65 20 61 66 70 4c 6f 63 6b 69 6e 67 43 6f  The afpLockingCo
13210 6e 74 65 78 74 20 73 74 72 75 63 74 75 72 65 20  ntext structure 
13220 63 6f 6e 74 61 69 6e 73 20 61 6c 6c 20 61 66 70  contains all afp
13230 20 6c 6f 63 6b 20 73 70 65 63 69 66 69 63 20 73   lock specific s
13240 74 61 74 65 0a 2a 2f 0a 74 79 70 65 64 65 66 20  tate.*/.typedef 
13250 73 74 72 75 63 74 20 61 66 70 4c 6f 63 6b 69 6e  struct afpLockin
13260 67 43 6f 6e 74 65 78 74 20 61 66 70 4c 6f 63 6b  gContext afpLock
13270 69 6e 67 43 6f 6e 74 65 78 74 3b 0a 73 74 72 75  ingContext;.stru
13280 63 74 20 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e  ct afpLockingCon
13290 74 65 78 74 20 7b 0a 20 20 69 6e 74 20 72 65 73  text {.  int res
132a0 65 72 76 65 64 3b 0a 20 20 63 6f 6e 73 74 20 63  erved;.  const c
132b0 68 61 72 20 2a 64 62 50 61 74 68 3b 20 20 20 20  har *dbPath;    
132c0 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65           /* Name
132d0 20 6f 66 20 74 68 65 20 6f 70 65 6e 20 66 69 6c   of the open fil
132e0 65 20 2a 2f 0a 7d 3b 0a 0a 73 74 72 75 63 74 20  e */.};..struct 
132f0 42 79 74 65 52 61 6e 67 65 4c 6f 63 6b 50 42 32  ByteRangeLockPB2
13300 0a 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 6c 6f  .{.  unsigned lo
13310 6e 67 20 6c 6f 6e 67 20 6f 66 66 73 65 74 3b 20  ng long offset; 
13320 20 20 20 20 20 20 20 2f 2a 20 6f 66 66 73 65 74         /* offset
13330 20 74 6f 20 66 69 72 73 74 20 62 79 74 65 20 74   to first byte t
13340 6f 20 6c 6f 63 6b 20 2a 2f 0a 20 20 75 6e 73 69  o lock */.  unsi
13350 67 6e 65 64 20 6c 6f 6e 67 20 6c 6f 6e 67 20 6c  gned long long l
13360 65 6e 67 74 68 3b 20 20 20 20 20 20 20 20 2f 2a  ength;        /*
13370 20 6e 62 72 20 6f 66 20 62 79 74 65 73 20 74 6f   nbr of bytes to
13380 20 6c 6f 63 6b 20 2a 2f 0a 20 20 75 6e 73 69 67   lock */.  unsig
13390 6e 65 64 20 6c 6f 6e 67 20 6c 6f 6e 67 20 72 65  ned long long re
133a0 74 52 61 6e 67 65 53 74 61 72 74 3b 20 2f 2a 20  tRangeStart; /* 
133b0 6e 62 72 20 6f 66 20 31 73 74 20 62 79 74 65 20  nbr of 1st byte 
133c0 6c 6f 63 6b 65 64 20 69 66 20 73 75 63 63 65 73  locked if succes
133d0 73 66 75 6c 20 2a 2f 0a 20 20 75 6e 73 69 67 6e  sful */.  unsign
133e0 65 64 20 63 68 61 72 20 75 6e 4c 6f 63 6b 46 6c  ed char unLockFl
133f0 61 67 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 31  ag;         /* 1
13400 20 3d 20 75 6e 6c 6f 63 6b 2c 20 30 20 3d 20 6c   = unlock, 0 = l
13410 6f 63 6b 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65  ock */.  unsigne
13420 64 20 63 68 61 72 20 73 74 61 72 74 45 6e 64 46  d char startEndF
13430 6c 61 67 3b 20 20 20 20 20 20 20 2f 2a 20 31 3d  lag;       /* 1=
13440 72 65 6c 20 74 6f 20 65 6e 64 20 6f 66 20 66 6f  rel to end of fo
13450 72 6b 2c 20 30 3d 72 65 6c 20 74 6f 20 73 74 61  rk, 0=rel to sta
13460 72 74 20 2a 2f 0a 20 20 69 6e 74 20 66 64 3b 20  rt */.  int fd; 
13470 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13480 20 20 20 20 20 20 20 20 20 20 2f 2a 20 66 69 6c            /* fil
13490 65 20 64 65 73 63 20 74 6f 20 61 73 73 6f 63 20  e desc to assoc 
134a0 74 68 69 73 20 6c 6f 63 6b 20 77 69 74 68 20 2a  this lock with *
134b0 2f 0a 7d 3b 0a 0a 23 64 65 66 69 6e 65 20 61 66  /.};..#define af
134c0 70 66 73 42 79 74 65 52 61 6e 67 65 4c 6f 63 6b  pfsByteRangeLock
134d0 32 46 53 43 54 4c 20 20 20 20 20 20 20 20 5f 49  2FSCTL        _I
134e0 4f 57 52 28 27 7a 27 2c 20 32 33 2c 20 73 74 72  OWR('z', 23, str
134f0 75 63 74 20 42 79 74 65 52 61 6e 67 65 4c 6f 63  uct ByteRangeLoc
13500 6b 50 42 32 29 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  kPB2)../*.** Thi
13510 73 20 69 73 20 61 20 75 74 69 6c 69 74 79 20 66  s is a utility f
13520 6f 72 20 73 65 74 74 69 6e 67 20 6f 72 20 63 6c  or setting or cl
13530 65 61 72 69 6e 67 20 61 20 62 69 74 2d 72 61 6e  earing a bit-ran
13540 67 65 20 6c 6f 63 6b 20 6f 6e 20 61 6e 0a 2a 2a  ge lock on an.**
13550 20 41 46 50 20 66 69 6c 65 73 79 73 74 65 6d 2e   AFP filesystem.
13560 0a 2a 2a 20 0a 2a 2a 20 52 65 74 75 72 6e 20 53  .** .** Return S
13570 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63  QLITE_OK on succ
13580 65 73 73 2c 20 53 51 4c 49 54 45 5f 42 55 53 59  ess, SQLITE_BUSY
13590 20 6f 6e 20 66 61 69 6c 75 72 65 2e 0a 2a 2f 0a   on failure..*/.
135a0 73 74 61 74 69 63 20 69 6e 74 20 61 66 70 53 65  static int afpSe
135b0 74 4c 6f 63 6b 28 0a 20 20 63 6f 6e 73 74 20 63  tLock(.  const c
135c0 68 61 72 20 2a 70 61 74 68 2c 20 20 20 20 20 20  har *path,      
135d0 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20          /* Name 
135e0 6f 66 20 74 68 65 20 66 69 6c 65 20 74 6f 20 62  of the file to b
135f0 65 20 6c 6f 63 6b 65 64 20 6f 72 20 75 6e 6c 6f  e locked or unlo
13600 63 6b 65 64 20 2a 2f 0a 20 20 75 6e 69 78 46 69  cked */.  unixFi
13610 6c 65 20 2a 70 46 69 6c 65 2c 20 20 20 20 20 20  le *pFile,      
13620 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 70 65 6e           /* Open
13630 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
13640 20 6f 6e 20 70 61 74 68 20 2a 2f 0a 20 20 75 6e   on path */.  un
13650 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6c 6f 6e 67  signed long long
13660 20 6f 66 66 73 65 74 2c 20 20 20 20 20 2f 2a 20   offset,     /* 
13670 46 69 72 73 74 20 62 79 74 65 20 74 6f 20 62 65  First byte to be
13680 20 6c 6f 63 6b 65 64 20 2a 2f 0a 20 20 75 6e 73   locked */.  uns
13690 69 67 6e 65 64 20 6c 6f 6e 67 20 6c 6f 6e 67 20  igned long long 
136a0 6c 65 6e 67 74 68 2c 20 20 20 20 20 2f 2a 20 4e  length,     /* N
136b0 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 74  umber of bytes t
136c0 6f 20 6c 6f 63 6b 20 2a 2f 0a 20 20 69 6e 74 20  o lock */.  int 
136d0 73 65 74 4c 6f 63 6b 46 6c 61 67 20 20 20 20 20  setLockFlag     
136e0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
136f0 75 65 20 74 6f 20 73 65 74 20 6c 6f 63 6b 2e 20  ue to set lock. 
13700 20 46 61 6c 73 65 20 74 6f 20 63 6c 65 61 72 20   False to clear 
13710 6c 6f 63 6b 20 2a 2f 0a 29 7b 0a 20 20 73 74 72  lock */.){.  str
13720 75 63 74 20 42 79 74 65 52 61 6e 67 65 4c 6f 63  uct ByteRangeLoc
13730 6b 50 42 32 20 70 62 3b 0a 20 20 69 6e 74 20 65  kPB2 pb;.  int e
13740 72 72 3b 0a 20 20 0a 20 20 70 62 2e 75 6e 4c 6f  rr;.  .  pb.unLo
13750 63 6b 46 6c 61 67 20 3d 20 73 65 74 4c 6f 63 6b  ckFlag = setLock
13760 46 6c 61 67 20 3f 20 30 20 3a 20 31 3b 0a 20 20  Flag ? 0 : 1;.  
13770 70 62 2e 73 74 61 72 74 45 6e 64 46 6c 61 67 20  pb.startEndFlag 
13780 3d 20 30 3b 0a 20 20 70 62 2e 6f 66 66 73 65 74  = 0;.  pb.offset
13790 20 3d 20 6f 66 66 73 65 74 3b 0a 20 20 70 62 2e   = offset;.  pb.
137a0 6c 65 6e 67 74 68 20 3d 20 6c 65 6e 67 74 68 3b  length = length;
137b0 20 0a 20 20 70 62 2e 66 64 20 3d 20 70 46 69 6c   .  pb.fd = pFil
137c0 65 2d 3e 68 3b 0a 20 20 0a 20 20 4f 53 54 52 41  e->h;.  .  OSTRA
137d0 43 45 36 28 22 41 46 50 53 45 54 4c 4f 43 4b 20  CE6("AFPSETLOCK 
137e0 5b 25 73 5d 20 66 6f 72 20 25 64 25 73 20 69 6e  [%s] for %d%s in
137f0 20 72 61 6e 67 65 20 25 6c 6c 78 3a 25 6c 6c 78   range %llx:%llx
13800 5c 6e 22 2c 20 0a 20 20 20 20 28 73 65 74 4c 6f  \n", .    (setLo
13810 63 6b 46 6c 61 67 3f 22 4f 4e 22 3a 22 4f 46 46  ckFlag?"ON":"OFF
13820 22 29 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 28 70  "), pFile->h, (p
13830 62 2e 66 64 3d 3d 2d 31 3f 22 5b 74 65 73 74 76  b.fd==-1?"[testv
13840 61 6c 2d 31 5d 22 3a 22 22 29 2c 0a 20 20 20 20  al-1]":""),.    
13850 6f 66 66 73 65 74 2c 20 6c 65 6e 67 74 68 29 3b  offset, length);
13860 0a 20 20 65 72 72 20 3d 20 66 73 63 74 6c 28 70  .  err = fsctl(p
13870 61 74 68 2c 20 61 66 70 66 73 42 79 74 65 52 61  ath, afpfsByteRa
13880 6e 67 65 4c 6f 63 6b 32 46 53 43 54 4c 2c 20 26  ngeLock2FSCTL, &
13890 70 62 2c 20 30 29 3b 0a 20 20 69 66 20 28 20 65  pb, 0);.  if ( e
138a0 72 72 3d 3d 2d 31 20 29 20 7b 0a 20 20 20 20 69  rr==-1 ) {.    i
138b0 6e 74 20 72 63 3b 0a 20 20 20 20 69 6e 74 20 74  nt rc;.    int t
138c0 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20  Errno = errno;. 
138d0 20 20 20 4f 53 54 52 41 43 45 34 28 22 41 46 50     OSTRACE4("AFP
138e0 53 45 54 4c 4f 43 4b 20 66 61 69 6c 65 64 20 74  SETLOCK failed t
138f0 6f 20 66 73 63 74 6c 28 29 20 27 25 73 27 20 25  o fsctl() '%s' %
13900 64 20 25 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20  d %s\n",.       
13910 20 20 20 20 20 20 70 61 74 68 2c 20 74 45 72 72        path, tErr
13920 6e 6f 2c 20 73 74 72 65 72 72 6f 72 28 74 45 72  no, strerror(tEr
13930 72 6e 6f 29 29 3b 0a 23 69 66 64 65 66 20 53 51  rno));.#ifdef SQ
13940 4c 49 54 45 5f 49 47 4e 4f 52 45 5f 41 46 50 5f  LITE_IGNORE_AFP_
13950 4c 4f 43 4b 5f 45 52 52 4f 52 53 0a 20 20 20 20  LOCK_ERRORS.    
13960 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59  rc = SQLITE_BUSY
13970 3b 0a 23 65 6c 73 65 0a 20 20 20 20 72 63 20 3d  ;.#else.    rc =
13980 20 73 71 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d   sqliteErrorFrom
13990 50 6f 73 69 78 45 72 72 6f 72 28 74 45 72 72 6e  PosixError(tErrn
139a0 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  o,.             
139b0 20 20 20 20 20 20 20 73 65 74 4c 6f 63 6b 46 6c         setLockFl
139c0 61 67 20 3f 20 53 51 4c 49 54 45 5f 49 4f 45 52  ag ? SQLITE_IOER
139d0 52 5f 4c 4f 43 4b 20 3a 20 53 51 4c 49 54 45 5f  R_LOCK : SQLITE_
139e0 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 29 3b 0a 23  IOERR_UNLOCK);.#
139f0 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
13a00 49 47 4e 4f 52 45 5f 41 46 50 5f 4c 4f 43 4b 5f  IGNORE_AFP_LOCK_
13a10 45 52 52 4f 52 53 20 2a 2f 0a 20 20 20 20 69 66  ERRORS */.    if
13a20 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28  ( IS_LOCK_ERROR(
13a30 72 63 29 20 29 7b 0a 20 20 20 20 20 20 70 46 69  rc) ){.      pFi
13a40 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20  le->lastErrno = 
13a50 74 45 72 72 6e 6f 3b 0a 20 20 20 20 7d 0a 20 20  tErrno;.    }.  
13a60 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d    return rc;.  }
13a70 20 65 6c 73 65 20 7b 0a 20 20 20 20 72 65 74 75   else {.    retu
13a80 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
13a90 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  }.}../*.** This 
13aa0 72 6f 75 74 69 6e 65 20 63 68 65 63 6b 73 20 69  routine checks i
13ab0 66 20 74 68 65 72 65 20 69 73 20 61 20 52 45 53  f there is a RES
13ac0 45 52 56 45 44 20 6c 6f 63 6b 20 68 65 6c 64 20  ERVED lock held 
13ad0 6f 6e 20 74 68 65 20 73 70 65 63 69 66 69 65 64  on the specified
13ae0 0a 2a 2a 20 66 69 6c 65 20 62 79 20 74 68 69 73  .** file by this
13af0 20 6f 72 20 61 6e 79 20 6f 74 68 65 72 20 70 72   or any other pr
13b00 6f 63 65 73 73 2e 20 49 66 20 73 75 63 68 20 61  ocess. If such a
13b10 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64 2c 20 73   lock is held, s
13b20 65 74 20 2a 70 52 65 73 4f 75 74 0a 2a 2a 20 74  et *pResOut.** t
13b30 6f 20 61 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c  o a non-zero val
13b40 75 65 20 6f 74 68 65 72 77 69 73 65 20 2a 70 52  ue otherwise *pR
13b50 65 73 4f 75 74 20 69 73 20 73 65 74 20 74 6f 20  esOut is set to 
13b60 7a 65 72 6f 2e 20 20 54 68 65 20 72 65 74 75 72  zero.  The retur
13b70 6e 20 76 61 6c 75 65 0a 2a 2a 20 69 73 20 73 65  n value.** is se
13b80 74 20 74 6f 20 53 51 4c 49 54 45 5f 4f 4b 20 75  t to SQLITE_OK u
13b90 6e 6c 65 73 73 20 61 6e 20 49 2f 4f 20 65 72 72  nless an I/O err
13ba0 6f 72 20 6f 63 63 75 72 73 20 64 75 72 69 6e 67  or occurs during
13bb0 20 6c 6f 63 6b 20 63 68 65 63 6b 69 6e 67 2e 0a   lock checking..
13bc0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 66  */.static int af
13bd0 70 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f  pCheckReservedLo
13be0 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  ck(sqlite3_file 
13bf0 2a 69 64 2c 20 69 6e 74 20 2a 70 52 65 73 4f 75  *id, int *pResOu
13c00 74 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  t){.  int rc = S
13c10 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20  QLITE_OK;.  int 
13c20 72 65 73 65 72 76 65 64 20 3d 20 30 3b 0a 20 20  reserved = 0;.  
13c30 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20  unixFile *pFile 
13c40 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b  = (unixFile*)id;
13c50 0a 20 20 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f  .  .  SimulateIO
13c60 45 72 72 6f 72 28 20 72 65 74 75 72 6e 20 53 51  Error( return SQ
13c70 4c 49 54 45 5f 49 4f 45 52 52 5f 43 48 45 43 4b  LITE_IOERR_CHECK
13c80 52 45 53 45 52 56 45 44 4c 4f 43 4b 3b 20 29 3b  RESERVEDLOCK; );
13c90 0a 20 20 0a 20 20 61 73 73 65 72 74 28 20 70 46  .  .  assert( pF
13ca0 69 6c 65 20 29 3b 0a 20 20 61 66 70 4c 6f 63 6b  ile );.  afpLock
13cb0 69 6e 67 43 6f 6e 74 65 78 74 20 2a 63 6f 6e 74  ingContext *cont
13cc0 65 78 74 20 3d 20 28 61 66 70 4c 6f 63 6b 69 6e  ext = (afpLockin
13cd0 67 43 6f 6e 74 65 78 74 20 2a 29 20 70 46 69 6c  gContext *) pFil
13ce0 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78  e->lockingContex
13cf0 74 3b 0a 20 20 69 66 28 20 63 6f 6e 74 65 78 74  t;.  if( context
13d00 2d 3e 72 65 73 65 72 76 65 64 20 29 7b 0a 20 20  ->reserved ){.  
13d10 20 20 2a 70 52 65 73 4f 75 74 20 3d 20 31 3b 0a    *pResOut = 1;.
13d20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
13d30 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 75 6e 69 78  E_OK;.  }.  unix
13d40 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 20 2f 2a  EnterMutex(); /*
13d50 20 42 65 63 61 75 73 65 20 70 46 69 6c 65 2d 3e   Because pFile->
13d60 70 4c 6f 63 6b 20 69 73 20 73 68 61 72 65 64 20  pLock is shared 
13d70 61 63 72 6f 73 73 20 74 68 72 65 61 64 73 20 2a  across threads *
13d80 2f 0a 20 20 0a 20 20 2f 2a 20 43 68 65 63 6b 20  /.  .  /* Check 
13d90 69 66 20 61 20 74 68 72 65 61 64 20 69 6e 20 74  if a thread in t
13da0 68 69 73 20 70 72 6f 63 65 73 73 20 68 6f 6c 64  his process hold
13db0 73 20 73 75 63 68 20 61 20 6c 6f 63 6b 20 2a 2f  s such a lock */
13dc0 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 70 4c  .  if( pFile->pL
13dd0 6f 63 6b 2d 3e 6c 6f 63 6b 74 79 70 65 3e 53 48  ock->locktype>SH
13de0 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20  ARED_LOCK ){.   
13df0 20 72 65 73 65 72 76 65 64 20 3d 20 31 3b 0a 20   reserved = 1;. 
13e00 20 7d 0a 20 20 0a 20 20 2f 2a 20 4f 74 68 65 72   }.  .  /* Other
13e10 77 69 73 65 20 73 65 65 20 69 66 20 73 6f 6d 65  wise see if some
13e20 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20 68   other process h
13e30 6f 6c 64 73 20 69 74 2e 0a 20 20 20 2a 2f 0a 20  olds it..   */. 
13e40 20 69 66 28 20 21 72 65 73 65 72 76 65 64 20 29   if( !reserved )
13e50 7b 0a 20 20 20 20 2f 2a 20 6c 6f 63 6b 20 74 68  {.    /* lock th
13e60 65 20 52 45 53 45 52 56 45 44 20 62 79 74 65 20  e RESERVED byte 
13e70 2a 2f 0a 20 20 20 20 69 6e 74 20 6c 72 63 20 3d  */.    int lrc =
13e80 20 61 66 70 53 65 74 4c 6f 63 6b 28 63 6f 6e 74   afpSetLock(cont
13e90 65 78 74 2d 3e 64 62 50 61 74 68 2c 20 70 46 69  ext->dbPath, pFi
13ea0 6c 65 2c 20 52 45 53 45 52 56 45 44 5f 42 59 54  le, RESERVED_BYT
13eb0 45 2c 20 31 2c 31 29 3b 20 20 0a 20 20 20 20 69  E, 1,1);  .    i
13ec0 66 28 20 53 51 4c 49 54 45 5f 4f 4b 3d 3d 6c 72  f( SQLITE_OK==lr
13ed0 63 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 69 66  c ){.      /* if
13ee0 20 77 65 20 73 75 63 63 65 65 64 65 64 20 69 6e   we succeeded in
13ef0 20 74 61 6b 69 6e 67 20 74 68 65 20 72 65 73 65   taking the rese
13f00 72 76 65 64 20 6c 6f 63 6b 2c 20 75 6e 6c 6f 63  rved lock, unloc
13f10 6b 20 69 74 20 74 6f 20 72 65 73 74 6f 72 65 0a  k it to restore.
13f20 20 20 20 20 20 20 2a 2a 20 74 68 65 20 6f 72 69        ** the ori
13f30 67 69 6e 61 6c 20 73 74 61 74 65 20 2a 2f 0a 20  ginal state */. 
13f40 20 20 20 20 20 6c 72 63 20 3d 20 61 66 70 53 65       lrc = afpSe
13f50 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 64  tLock(context->d
13f60 62 50 61 74 68 2c 20 70 46 69 6c 65 2c 20 52 45  bPath, pFile, RE
13f70 53 45 52 56 45 44 5f 42 59 54 45 2c 20 31 2c 20  SERVED_BYTE, 1, 
13f80 30 29 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b  0);.    } else {
13f90 0a 20 20 20 20 20 20 2f 2a 20 69 66 20 77 65 20  .      /* if we 
13fa0 66 61 69 6c 65 64 20 74 6f 20 67 65 74 20 74 68  failed to get th
13fb0 65 20 6c 6f 63 6b 20 74 68 65 6e 20 73 6f 6d 65  e lock then some
13fc0 6f 6e 65 20 65 6c 73 65 20 6d 75 73 74 20 68 61  one else must ha
13fd0 76 65 20 69 74 20 2a 2f 0a 20 20 20 20 20 20 72  ve it */.      r
13fe0 65 73 65 72 76 65 64 20 3d 20 31 3b 0a 20 20 20  eserved = 1;.   
13ff0 20 7d 0a 20 20 20 20 69 66 28 20 49 53 5f 4c 4f   }.    if( IS_LO
14000 43 4b 5f 45 52 52 4f 52 28 6c 72 63 29 20 29 7b  CK_ERROR(lrc) ){
14010 0a 20 20 20 20 20 20 72 63 3d 6c 72 63 3b 0a 20  .      rc=lrc;. 
14020 20 20 20 7d 0a 20 20 7d 0a 20 20 0a 20 20 75 6e     }.  }.  .  un
14030 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a  ixLeaveMutex();.
14040 20 20 4f 53 54 52 41 43 45 34 28 22 54 45 53 54    OSTRACE4("TEST
14050 20 57 52 2d 4c 4f 43 4b 20 25 64 20 25 64 20 25   WR-LOCK %d %d %
14060 64 20 28 61 66 70 29 5c 6e 22 2c 20 70 46 69 6c  d (afp)\n", pFil
14070 65 2d 3e 68 2c 20 72 63 2c 20 72 65 73 65 72 76  e->h, rc, reserv
14080 65 64 29 3b 0a 20 20 0a 20 20 2a 70 52 65 73 4f  ed);.  .  *pResO
14090 75 74 20 3d 20 72 65 73 65 72 76 65 64 3b 0a 20  ut = reserved;. 
140a0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
140b0 2a 0a 2a 2a 20 4c 6f 63 6b 20 74 68 65 20 66 69  *.** Lock the fi
140c0 6c 65 20 77 69 74 68 20 74 68 65 20 6c 6f 63 6b  le with the lock
140d0 20 73 70 65 63 69 66 69 65 64 20 62 79 20 70 61   specified by pa
140e0 72 61 6d 65 74 65 72 20 6c 6f 63 6b 74 79 70 65  rameter locktype
140f0 20 2d 20 6f 6e 65 0a 2a 2a 20 6f 66 20 74 68 65   - one.** of the
14100 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a   following:.**.*
14110 2a 20 20 20 20 20 28 31 29 20 53 48 41 52 45 44  *     (1) SHARED
14120 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 32 29  _LOCK.**     (2)
14130 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 0a 2a   RESERVED_LOCK.*
14140 2a 20 20 20 20 20 28 33 29 20 50 45 4e 44 49 4e  *     (3) PENDIN
14150 47 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 34  G_LOCK.**     (4
14160 29 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b  ) EXCLUSIVE_LOCK
14170 0a 2a 2a 0a 2a 2a 20 53 6f 6d 65 74 69 6d 65 73  .**.** Sometimes
14180 20 77 68 65 6e 20 72 65 71 75 65 73 74 69 6e 67   when requesting
14190 20 6f 6e 65 20 6c 6f 63 6b 20 73 74 61 74 65 2c   one lock state,
141a0 20 61 64 64 69 74 69 6f 6e 61 6c 20 6c 6f 63 6b   additional lock
141b0 20 73 74 61 74 65 73 0a 2a 2a 20 61 72 65 20 69   states.** are i
141c0 6e 73 65 72 74 65 64 20 69 6e 20 62 65 74 77 65  nserted in betwe
141d0 65 6e 2e 20 20 54 68 65 20 6c 6f 63 6b 69 6e 67  en.  The locking
141e0 20 6d 69 67 68 74 20 66 61 69 6c 20 6f 6e 20 6f   might fail on o
141f0 6e 65 20 6f 66 20 74 68 65 20 6c 61 74 65 72 0a  ne of the later.
14200 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e 73 20 6c  ** transitions l
14210 65 61 76 69 6e 67 20 74 68 65 20 6c 6f 63 6b 20  eaving the lock 
14220 73 74 61 74 65 20 64 69 66 66 65 72 65 6e 74 20  state different 
14230 66 72 6f 6d 20 77 68 61 74 20 69 74 20 73 74 61  from what it sta
14240 72 74 65 64 20 62 75 74 0a 2a 2a 20 73 74 69 6c  rted but.** stil
14250 6c 20 73 68 6f 72 74 20 6f 66 20 69 74 73 20 67  l short of its g
14260 6f 61 6c 2e 20 20 54 68 65 20 66 6f 6c 6c 6f 77  oal.  The follow
14270 69 6e 67 20 63 68 61 72 74 20 73 68 6f 77 73 20  ing chart shows 
14280 74 68 65 20 61 6c 6c 6f 77 65 64 0a 2a 2a 20 74  the allowed.** t
14290 72 61 6e 73 69 74 69 6f 6e 73 20 61 6e 64 20 74  ransitions and t
142a0 68 65 20 69 6e 73 65 72 74 65 64 20 69 6e 74 65  he inserted inte
142b0 72 6d 65 64 69 61 74 65 20 73 74 61 74 65 73 3a  rmediate states:
142c0 0a 2a 2a 0a 2a 2a 20 20 20 20 55 4e 4c 4f 43 4b  .**.**    UNLOCK
142d0 45 44 20 2d 3e 20 53 48 41 52 45 44 0a 2a 2a 20  ED -> SHARED.** 
142e0 20 20 20 53 48 41 52 45 44 20 2d 3e 20 52 45 53     SHARED -> RES
142f0 45 52 56 45 44 0a 2a 2a 20 20 20 20 53 48 41 52  ERVED.**    SHAR
14300 45 44 20 2d 3e 20 28 50 45 4e 44 49 4e 47 29 20  ED -> (PENDING) 
14310 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20  -> EXCLUSIVE.** 
14320 20 20 20 52 45 53 45 52 56 45 44 20 2d 3e 20 28     RESERVED -> (
14330 50 45 4e 44 49 4e 47 29 20 2d 3e 20 45 58 43 4c  PENDING) -> EXCL
14340 55 53 49 56 45 0a 2a 2a 20 20 20 20 50 45 4e 44  USIVE.**    PEND
14350 49 4e 47 20 2d 3e 20 45 58 43 4c 55 53 49 56 45  ING -> EXCLUSIVE
14360 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
14370 69 6e 65 20 77 69 6c 6c 20 6f 6e 6c 79 20 69 6e  ine will only in
14380 63 72 65 61 73 65 20 61 20 6c 6f 63 6b 2e 20 20  crease a lock.  
14390 55 73 65 20 74 68 65 20 73 71 6c 69 74 65 33 4f  Use the sqlite3O
143a0 73 55 6e 6c 6f 63 6b 28 29 0a 2a 2a 20 72 6f 75  sUnlock().** rou
143b0 74 69 6e 65 20 74 6f 20 6c 6f 77 65 72 20 61 20  tine to lower a 
143c0 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 2e 0a 2a  locking level..*
143d0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 66 70  /.static int afp
143e0 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c  Lock(sqlite3_fil
143f0 65 20 2a 69 64 2c 20 69 6e 74 20 6c 6f 63 6b 74  e *id, int lockt
14400 79 70 65 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  ype){.  int rc =
14410 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 75 6e   SQLITE_OK;.  un
14420 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20  ixFile *pFile = 
14430 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20  (unixFile*)id;. 
14440 20 73 74 72 75 63 74 20 75 6e 69 78 4c 6f 63 6b   struct unixLock
14450 49 6e 66 6f 20 2a 70 4c 6f 63 6b 20 3d 20 70 46  Info *pLock = pF
14460 69 6c 65 2d 3e 70 4c 6f 63 6b 3b 0a 20 20 61 66  ile->pLock;.  af
14470 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20  pLockingContext 
14480 2a 63 6f 6e 74 65 78 74 20 3d 20 28 61 66 70 4c  *context = (afpL
14490 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 29  ockingContext *)
144a0 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43   pFile->lockingC
144b0 6f 6e 74 65 78 74 3b 0a 20 20 0a 20 20 61 73 73  ontext;.  .  ass
144c0 65 72 74 28 20 70 46 69 6c 65 20 29 3b 0a 20 20  ert( pFile );.  
144d0 4f 53 54 52 41 43 45 37 28 22 4c 4f 43 4b 20 20  OSTRACE7("LOCK  
144e0 20 20 25 64 20 25 73 20 77 61 73 20 25 73 28 25    %d %s was %s(%
144f0 73 2c 25 64 29 20 70 69 64 3d 25 64 20 28 61 66  s,%d) pid=%d (af
14500 70 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c  p)\n", pFile->h,
14510 0a 20 20 20 20 20 20 20 20 20 20 20 6c 6f 63 6b  .           lock
14520 74 79 70 65 4e 61 6d 65 28 6c 6f 63 6b 74 79 70  typeName(locktyp
14530 65 29 2c 20 6c 6f 63 6b 74 79 70 65 4e 61 6d 65  e), locktypeName
14540 28 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65  (pFile->locktype
14550 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 6c 6f  ),.           lo
14560 63 6b 74 79 70 65 4e 61 6d 65 28 70 4c 6f 63 6b  cktypeName(pLock
14570 2d 3e 6c 6f 63 6b 74 79 70 65 29 2c 20 70 4c 6f  ->locktype), pLo
14580 63 6b 2d 3e 63 6e 74 20 2c 20 67 65 74 70 69 64  ck->cnt , getpid
14590 28 29 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68  ());..  /* If th
145a0 65 72 65 20 69 73 20 61 6c 72 65 61 64 79 20 61  ere is already a
145b0 20 6c 6f 63 6b 20 6f 66 20 74 68 69 73 20 74 79   lock of this ty
145c0 70 65 20 6f 72 20 6d 6f 72 65 20 72 65 73 74 72  pe or more restr
145d0 69 63 74 69 76 65 20 6f 6e 20 74 68 65 0a 20 20  ictive on the.  
145e0 2a 2a 20 75 6e 69 78 46 69 6c 65 2c 20 64 6f 20  ** unixFile, do 
145f0 6e 6f 74 68 69 6e 67 2e 20 44 6f 6e 27 74 20 75  nothing. Don't u
14600 73 65 20 74 68 65 20 61 66 70 5f 65 6e 64 5f 6c  se the afp_end_l
14610 6f 63 6b 3a 20 65 78 69 74 20 70 61 74 68 2c 20  ock: exit path, 
14620 61 73 0a 20 20 2a 2a 20 75 6e 69 78 45 6e 74 65  as.  ** unixEnte
14630 72 4d 75 74 65 78 28 29 20 68 61 73 6e 27 74 20  rMutex() hasn't 
14640 62 65 65 6e 20 63 61 6c 6c 65 64 20 79 65 74 2e  been called yet.
14650 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c  .  */.  if( pFil
14660 65 2d 3e 6c 6f 63 6b 74 79 70 65 3e 3d 6c 6f 63  e->locktype>=loc
14670 6b 74 79 70 65 20 29 7b 0a 20 20 20 20 4f 53 54  ktype ){.    OST
14680 52 41 43 45 33 28 22 4c 4f 43 4b 20 20 20 20 25  RACE3("LOCK    %
14690 64 20 25 73 20 6f 6b 20 28 61 6c 72 65 61 64 79  d %s ok (already
146a0 20 68 65 6c 64 29 20 28 61 66 70 29 5c 6e 22 2c   held) (afp)\n",
146b0 20 70 46 69 6c 65 2d 3e 68 2c 0a 20 20 20 20 20   pFile->h,.     
146c0 20 20 20 20 20 20 6c 6f 63 6b 74 79 70 65 4e 61        locktypeNa
146d0 6d 65 28 6c 6f 63 6b 74 79 70 65 29 29 3b 0a 20  me(locktype));. 
146e0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
146f0 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d  _OK;.  }..  /* M
14700 61 6b 65 20 73 75 72 65 20 74 68 65 20 6c 6f 63  ake sure the loc
14710 6b 69 6e 67 20 73 65 71 75 65 6e 63 65 20 69 73  king sequence is
14720 20 63 6f 72 72 65 63 74 0a 20 20 2a 2a 20 20 28   correct.  **  (
14730 31 29 20 57 65 20 6e 65 76 65 72 20 6d 6f 76 65  1) We never move
14740 20 66 72 6f 6d 20 75 6e 6c 6f 63 6b 65 64 20 74   from unlocked t
14750 6f 20 61 6e 79 74 68 69 6e 67 20 68 69 67 68 65  o anything highe
14760 72 20 74 68 61 6e 20 73 68 61 72 65 64 20 6c 6f  r than shared lo
14770 63 6b 2e 0a 20 20 2a 2a 20 20 28 32 29 20 53 51  ck..  **  (2) SQ
14780 4c 69 74 65 20 6e 65 76 65 72 20 65 78 70 6c 69  Lite never expli
14790 63 69 74 6c 79 20 72 65 71 75 65 73 74 73 20 61  citly requests a
147a0 20 70 65 6e 64 69 67 20 6c 6f 63 6b 2e 0a 20 20   pendig lock..  
147b0 2a 2a 20 20 28 33 29 20 41 20 73 68 61 72 65 64  **  (3) A shared
147c0 20 6c 6f 63 6b 20 69 73 20 61 6c 77 61 79 73 20   lock is always 
147d0 68 65 6c 64 20 77 68 65 6e 20 61 20 72 65 73 65  held when a rese
147e0 72 76 65 20 6c 6f 63 6b 20 69 73 20 72 65 71 75  rve lock is requ
147f0 65 73 74 65 64 2e 0a 20 20 2a 2f 0a 20 20 61 73  ested..  */.  as
14800 73 65 72 74 28 20 70 46 69 6c 65 2d 3e 6c 6f 63  sert( pFile->loc
14810 6b 74 79 70 65 21 3d 4e 4f 5f 4c 4f 43 4b 20 7c  ktype!=NO_LOCK |
14820 7c 20 6c 6f 63 6b 74 79 70 65 3d 3d 53 48 41 52  | locktype==SHAR
14830 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73  ED_LOCK );.  ass
14840 65 72 74 28 20 6c 6f 63 6b 74 79 70 65 21 3d 50  ert( locktype!=P
14850 45 4e 44 49 4e 47 5f 4c 4f 43 4b 20 29 3b 0a 20  ENDING_LOCK );. 
14860 20 61 73 73 65 72 74 28 20 6c 6f 63 6b 74 79 70   assert( locktyp
14870 65 21 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b  e!=RESERVED_LOCK
14880 20 7c 7c 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74   || pFile->lockt
14890 79 70 65 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b  ype==SHARED_LOCK
148a0 20 29 3b 0a 20 20 0a 20 20 2f 2a 20 54 68 69 73   );.  .  /* This
148b0 20 6d 75 74 65 78 20 69 73 20 6e 65 65 64 65 64   mutex is needed
148c0 20 62 65 63 61 75 73 65 20 70 46 69 6c 65 2d 3e   because pFile->
148d0 70 4c 6f 63 6b 20 69 73 20 73 68 61 72 65 64 20  pLock is shared 
148e0 61 63 72 6f 73 73 20 74 68 72 65 61 64 73 0a 20  across threads. 
148f0 20 2a 2f 0a 20 20 75 6e 69 78 45 6e 74 65 72 4d   */.  unixEnterM
14900 75 74 65 78 28 29 3b 0a 0a 20 20 2f 2a 20 4d 61  utex();..  /* Ma
14910 6b 65 20 73 75 72 65 20 74 68 65 20 63 75 72 72  ke sure the curr
14920 65 6e 74 20 74 68 72 65 61 64 20 6f 77 6e 73 20  ent thread owns 
14930 74 68 65 20 70 46 69 6c 65 2e 0a 20 20 2a 2f 0a  the pFile..  */.
14940 20 20 72 63 20 3d 20 74 72 61 6e 73 66 65 72 4f    rc = transferO
14950 77 6e 65 72 73 68 69 70 28 70 46 69 6c 65 29 3b  wnership(pFile);
14960 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
14970 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 75 6e 69 78  E_OK ){.    unix
14980 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 20 20  LeaveMutex();.  
14990 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d    return rc;.  }
149a0 0a 20 20 70 4c 6f 63 6b 20 3d 20 70 46 69 6c 65  .  pLock = pFile
149b0 2d 3e 70 4c 6f 63 6b 3b 0a 0a 20 20 2f 2a 20 49  ->pLock;..  /* I
149c0 66 20 73 6f 6d 65 20 74 68 72 65 61 64 20 75 73  f some thread us
149d0 69 6e 67 20 74 68 69 73 20 50 49 44 20 68 61 73  ing this PID has
149e0 20 61 20 6c 6f 63 6b 20 76 69 61 20 61 20 64 69   a lock via a di
149f0 66 66 65 72 65 6e 74 20 75 6e 69 78 46 69 6c 65  fferent unixFile
14a00 2a 0a 20 20 2a 2a 20 68 61 6e 64 6c 65 20 74 68  *.  ** handle th
14a10 61 74 20 70 72 65 63 6c 75 64 65 73 20 74 68 65  at precludes the
14a20 20 72 65 71 75 65 73 74 65 64 20 6c 6f 63 6b 2c   requested lock,
14a30 20 72 65 74 75 72 6e 20 42 55 53 59 2e 0a 20 20   return BUSY..  
14a40 2a 2f 0a 20 20 69 66 28 20 28 70 46 69 6c 65 2d  */.  if( (pFile-
14a50 3e 6c 6f 63 6b 74 79 70 65 21 3d 70 4c 6f 63 6b  >locktype!=pLock
14a60 2d 3e 6c 6f 63 6b 74 79 70 65 20 26 26 20 0a 20  ->locktype && . 
14a70 20 20 20 20 20 20 28 70 4c 6f 63 6b 2d 3e 6c 6f        (pLock->lo
14a80 63 6b 74 79 70 65 3e 3d 50 45 4e 44 49 4e 47 5f  cktype>=PENDING_
14a90 4c 4f 43 4b 20 7c 7c 20 6c 6f 63 6b 74 79 70 65  LOCK || locktype
14aa0 3e 53 48 41 52 45 44 5f 4c 4f 43 4b 29 29 0a 20  >SHARED_LOCK)). 
14ab0 20 20 20 20 29 7b 0a 20 20 20 20 72 63 20 3d 20      ){.    rc = 
14ac0 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20  SQLITE_BUSY;.   
14ad0 20 67 6f 74 6f 20 61 66 70 5f 65 6e 64 5f 6c 6f   goto afp_end_lo
14ae0 63 6b 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20  ck;.  }.  .  /* 
14af0 49 66 20 61 20 53 48 41 52 45 44 20 6c 6f 63 6b  If a SHARED lock
14b00 20 69 73 20 72 65 71 75 65 73 74 65 64 2c 20 61   is requested, a
14b10 6e 64 20 73 6f 6d 65 20 74 68 72 65 61 64 20 75  nd some thread u
14b20 73 69 6e 67 20 74 68 69 73 20 50 49 44 20 61 6c  sing this PID al
14b30 72 65 61 64 79 0a 20 20 2a 2a 20 68 61 73 20 61  ready.  ** has a
14b40 20 53 48 41 52 45 44 20 6f 72 20 52 45 53 45 52   SHARED or RESER
14b50 56 45 44 20 6c 6f 63 6b 2c 20 74 68 65 6e 20 69  VED lock, then i
14b60 6e 63 72 65 6d 65 6e 74 20 72 65 66 65 72 65 6e  ncrement referen
14b70 63 65 20 63 6f 75 6e 74 73 20 61 6e 64 0a 20 20  ce counts and.  
14b80 2a 2a 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  ** return SQLITE
14b90 5f 4f 4b 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  _OK..  */.  if( 
14ba0 6c 6f 63 6b 74 79 70 65 3d 3d 53 48 41 52 45 44  locktype==SHARED
14bb0 5f 4c 4f 43 4b 20 26 26 20 0a 20 20 20 20 20 28  _LOCK && .     (
14bc0 70 4c 6f 63 6b 2d 3e 6c 6f 63 6b 74 79 70 65 3d  pLock->locktype=
14bd0 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 7c 7c 20  =SHARED_LOCK || 
14be0 70 4c 6f 63 6b 2d 3e 6c 6f 63 6b 74 79 70 65 3d  pLock->locktype=
14bf0 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 29 20  =RESERVED_LOCK) 
14c00 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 6c  ){.    assert( l
14c10 6f 63 6b 74 79 70 65 3d 3d 53 48 41 52 45 44 5f  ocktype==SHARED_
14c20 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 61 73 73 65  LOCK );.    asse
14c30 72 74 28 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74  rt( pFile->lockt
14c40 79 70 65 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73  ype==0 );.    as
14c50 73 65 72 74 28 20 70 4c 6f 63 6b 2d 3e 63 6e 74  sert( pLock->cnt
14c60 3e 30 20 29 3b 0a 20 20 20 20 70 46 69 6c 65 2d  >0 );.    pFile-
14c70 3e 6c 6f 63 6b 74 79 70 65 20 3d 20 53 48 41 52  >locktype = SHAR
14c80 45 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20 70 4c 6f  ED_LOCK;.    pLo
14c90 63 6b 2d 3e 63 6e 74 2b 2b 3b 0a 20 20 20 20 70  ck->cnt++;.    p
14ca0 46 69 6c 65 2d 3e 70 4f 70 65 6e 2d 3e 6e 4c 6f  File->pOpen->nLo
14cb0 63 6b 2b 2b 3b 0a 20 20 20 20 67 6f 74 6f 20 61  ck++;.    goto a
14cc0 66 70 5f 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 7d  fp_end_lock;.  }
14cd0 0a 20 20 20 20 0a 20 20 2f 2a 20 41 20 50 45 4e  .    .  /* A PEN
14ce0 44 49 4e 47 20 6c 6f 63 6b 20 69 73 20 6e 65 65  DING lock is nee
14cf0 64 65 64 20 62 65 66 6f 72 65 20 61 63 71 75 69  ded before acqui
14d00 72 69 6e 67 20 61 20 53 48 41 52 45 44 20 6c 6f  ring a SHARED lo
14d10 63 6b 20 61 6e 64 20 62 65 66 6f 72 65 0a 20 20  ck and before.  
14d20 2a 2a 20 61 63 71 75 69 72 69 6e 67 20 61 6e 20  ** acquiring an 
14d30 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 20  EXCLUSIVE lock. 
14d40 20 46 6f 72 20 74 68 65 20 53 48 41 52 45 44 20   For the SHARED 
14d50 6c 6f 63 6b 2c 20 74 68 65 20 50 45 4e 44 49 4e  lock, the PENDIN
14d60 47 20 77 69 6c 6c 0a 20 20 2a 2a 20 62 65 20 72  G will.  ** be r
14d70 65 6c 65 61 73 65 64 2e 0a 20 20 2a 2f 0a 20 20  eleased..  */.  
14d80 69 66 28 20 6c 6f 63 6b 74 79 70 65 3d 3d 53 48  if( locktype==SH
14d90 41 52 45 44 5f 4c 4f 43 4b 20 0a 20 20 20 20 20  ARED_LOCK .     
14da0 20 7c 7c 20 28 6c 6f 63 6b 74 79 70 65 3d 3d 45   || (locktype==E
14db0 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 26 26  XCLUSIVE_LOCK &&
14dc0 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65   pFile->locktype
14dd0 3c 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 29 0a 20  <PENDING_LOCK). 
14de0 20 29 7b 0a 20 20 20 20 69 6e 74 20 66 61 69 6c   ){.    int fail
14df0 65 64 3b 0a 20 20 20 20 66 61 69 6c 65 64 20 3d  ed;.    failed =
14e00 20 61 66 70 53 65 74 4c 6f 63 6b 28 63 6f 6e 74   afpSetLock(cont
14e10 65 78 74 2d 3e 64 62 50 61 74 68 2c 20 70 46 69  ext->dbPath, pFi
14e20 6c 65 2c 20 50 45 4e 44 49 4e 47 5f 42 59 54 45  le, PENDING_BYTE
14e30 2c 20 31 2c 20 31 29 3b 0a 20 20 20 20 69 66 20  , 1, 1);.    if 
14e40 28 66 61 69 6c 65 64 29 20 7b 0a 20 20 20 20 20  (failed) {.     
14e50 20 72 63 20 3d 20 66 61 69 6c 65 64 3b 0a 20 20   rc = failed;.  
14e60 20 20 20 20 67 6f 74 6f 20 61 66 70 5f 65 6e 64      goto afp_end
14e70 5f 6c 6f 63 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d  _lock;.    }.  }
14e80 0a 20 20 0a 20 20 2f 2a 20 49 66 20 63 6f 6e 74  .  .  /* If cont
14e90 72 6f 6c 20 67 65 74 73 20 74 6f 20 74 68 69 73  rol gets to this
14ea0 20 70 6f 69 6e 74 2c 20 74 68 65 6e 20 61 63 74   point, then act
14eb0 75 61 6c 6c 79 20 67 6f 20 61 68 65 61 64 20 61  ually go ahead a
14ec0 6e 64 20 6d 61 6b 65 0a 20 20 2a 2a 20 6f 70 65  nd make.  ** ope
14ed0 72 61 74 69 6e 67 20 73 79 73 74 65 6d 20 63 61  rating system ca
14ee0 6c 6c 73 20 66 6f 72 20 74 68 65 20 73 70 65 63  lls for the spec
14ef0 69 66 69 65 64 20 6c 6f 63 6b 2e 0a 20 20 2a 2f  ified lock..  */
14f00 0a 20 20 69 66 28 20 6c 6f 63 6b 74 79 70 65 3d  .  if( locktype=
14f10 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a  =SHARED_LOCK ){.
14f20 20 20 20 20 69 6e 74 20 6c 72 63 31 2c 20 6c 72      int lrc1, lr
14f30 63 32 2c 20 6c 72 63 31 45 72 72 6e 6f 3b 0a 20  c2, lrc1Errno;. 
14f40 20 20 20 6c 6f 6e 67 20 6c 6b 2c 20 6d 61 73 6b     long lk, mask
14f50 3b 0a 20 20 20 20 0a 20 20 20 20 61 73 73 65 72  ;.    .    asser
14f60 74 28 20 70 4c 6f 63 6b 2d 3e 63 6e 74 3d 3d 30  t( pLock->cnt==0
14f70 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
14f80 70 4c 6f 63 6b 2d 3e 6c 6f 63 6b 74 79 70 65 3d  pLock->locktype=
14f90 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 0a 20  =0 );.        . 
14fa0 20 20 20 6d 61 73 6b 20 3d 20 28 73 69 7a 65 6f     mask = (sizeo
14fb0 66 28 6c 6f 6e 67 29 3d 3d 38 29 20 3f 20 4c 41  f(long)==8) ? LA
14fc0 52 47 45 53 54 5f 49 4e 54 36 34 20 3a 20 30 78  RGEST_INT64 : 0x
14fd0 37 66 66 66 66 66 66 66 3b 0a 20 20 20 20 2f 2a  7fffffff;.    /*
14fe0 20 4e 6f 77 20 67 65 74 20 74 68 65 20 72 65 61   Now get the rea
14ff0 64 2d 6c 6f 63 6b 20 53 48 41 52 45 44 5f 4c 4f  d-lock SHARED_LO
15000 43 4b 20 2a 2f 0a 20 20 20 20 2f 2a 20 6e 6f 74  CK */.    /* not
15010 65 20 74 68 61 74 20 74 68 65 20 71 75 61 6c 69  e that the quali
15020 74 79 20 6f 66 20 74 68 65 20 72 61 6e 64 6f 6d  ty of the random
15030 6e 65 73 73 20 64 6f 65 73 6e 27 74 20 6d 61 74  ness doesn't mat
15040 74 65 72 20 74 68 61 74 20 6d 75 63 68 20 2a 2f  ter that much */
15050 0a 20 20 20 20 6c 6b 20 3d 20 72 61 6e 64 6f 6d  .    lk = random
15060 28 29 3b 20 0a 20 20 20 20 70 4c 6f 63 6b 2d 3e  (); .    pLock->
15070 73 68 61 72 65 64 42 79 74 65 20 3d 20 28 6c 6b  sharedByte = (lk
15080 20 26 20 6d 61 73 6b 29 25 28 53 48 41 52 45 44   & mask)%(SHARED
15090 5f 53 49 5a 45 20 2d 20 31 29 3b 0a 20 20 20 20  _SIZE - 1);.    
150a0 6c 72 63 31 20 3d 20 61 66 70 53 65 74 4c 6f 63  lrc1 = afpSetLoc
150b0 6b 28 63 6f 6e 74 65 78 74 2d 3e 64 62 50 61 74  k(context->dbPat
150c0 68 2c 20 70 46 69 6c 65 2c 20 0a 20 20 20 20 20  h, pFile, .     
150d0 20 20 20 20 20 53 48 41 52 45 44 5f 46 49 52 53       SHARED_FIRS
150e0 54 2b 70 4c 6f 63 6b 2d 3e 73 68 61 72 65 64 42  T+pLock->sharedB
150f0 79 74 65 2c 20 31 2c 20 31 29 3b 0a 20 20 20 20  yte, 1, 1);.    
15100 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f  if( IS_LOCK_ERRO
15110 52 28 6c 72 63 31 29 20 29 7b 0a 20 20 20 20 20  R(lrc1) ){.     
15120 20 6c 72 63 31 45 72 72 6e 6f 20 3d 20 70 46 69   lrc1Errno = pFi
15130 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 3b 0a 20  le->lastErrno;. 
15140 20 20 20 7d 0a 20 20 20 20 2f 2a 20 44 72 6f 70     }.    /* Drop
15150 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20 50   the temporary P
15160 45 4e 44 49 4e 47 20 6c 6f 63 6b 20 2a 2f 0a 20  ENDING lock */. 
15170 20 20 20 6c 72 63 32 20 3d 20 61 66 70 53 65 74     lrc2 = afpSet
15180 4c 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 64 62  Lock(context->db
15190 50 61 74 68 2c 20 70 46 69 6c 65 2c 20 50 45 4e  Path, pFile, PEN
151a0 44 49 4e 47 5f 42 59 54 45 2c 20 31 2c 20 30 29  DING_BYTE, 1, 0)
151b0 3b 0a 20 20 20 20 0a 20 20 20 20 69 66 28 20 49  ;.    .    if( I
151c0 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 6c 72 63  S_LOCK_ERROR(lrc
151d0 31 29 20 29 20 7b 0a 20 20 20 20 20 20 70 46 69  1) ) {.      pFi
151e0 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20  le->lastErrno = 
151f0 6c 72 63 31 45 72 72 6e 6f 3b 0a 20 20 20 20 20  lrc1Errno;.     
15200 20 72 63 20 3d 20 6c 72 63 31 3b 0a 20 20 20 20   rc = lrc1;.    
15210 20 20 67 6f 74 6f 20 61 66 70 5f 65 6e 64 5f 6c    goto afp_end_l
15220 6f 63 6b 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20  ock;.    } else 
15230 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f  if( IS_LOCK_ERRO
15240 52 28 6c 72 63 32 29 20 29 7b 0a 20 20 20 20 20  R(lrc2) ){.     
15250 20 72 63 20 3d 20 6c 72 63 32 3b 0a 20 20 20 20   rc = lrc2;.    
15260 20 20 67 6f 74 6f 20 61 66 70 5f 65 6e 64 5f 6c    goto afp_end_l
15270 6f 63 6b 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20  ock;.    } else 
15280 69 66 28 20 6c 72 63 31 20 21 3d 20 53 51 4c 49  if( lrc1 != SQLI
15290 54 45 5f 4f 4b 20 29 20 7b 0a 20 20 20 20 20 20  TE_OK ) {.      
152a0 72 63 20 3d 20 6c 72 63 31 3b 0a 20 20 20 20 7d  rc = lrc1;.    }
152b0 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 70 46   else {.      pF
152c0 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 20 3d 20  ile->locktype = 
152d0 53 48 41 52 45 44 5f 4c 4f 43 4b 3b 0a 20 20 20  SHARED_LOCK;.   
152e0 20 20 20 70 46 69 6c 65 2d 3e 70 4f 70 65 6e 2d     pFile->pOpen-
152f0 3e 6e 4c 6f 63 6b 2b 2b 3b 0a 20 20 20 20 20 20  >nLock++;.      
15300 70 4c 6f 63 6b 2d 3e 63 6e 74 20 3d 20 31 3b 0a  pLock->cnt = 1;.
15310 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66      }.  }else if
15320 28 20 6c 6f 63 6b 74 79 70 65 3d 3d 45 58 43 4c  ( locktype==EXCL
15330 55 53 49 56 45 5f 4c 4f 43 4b 20 26 26 20 70 4c  USIVE_LOCK && pL
15340 6f 63 6b 2d 3e 63 6e 74 3e 31 20 29 7b 0a 20 20  ock->cnt>1 ){.  
15350 20 20 2f 2a 20 57 65 20 61 72 65 20 74 72 79 69    /* We are tryi
15360 6e 67 20 66 6f 72 20 61 6e 20 65 78 63 6c 75 73  ng for an exclus
15370 69 76 65 20 6c 6f 63 6b 20 62 75 74 20 61 6e 6f  ive lock but ano
15380 74 68 65 72 20 74 68 72 65 61 64 20 69 6e 20 74  ther thread in t
15390 68 69 73 0a 20 20 20 20 20 2a 2a 20 73 61 6d 65  his.     ** same
153a0 20 70 72 6f 63 65 73 73 20 69 73 20 73 74 69 6c   process is stil
153b0 6c 20 68 6f 6c 64 69 6e 67 20 61 20 73 68 61 72  l holding a shar
153c0 65 64 20 6c 6f 63 6b 2e 20 2a 2f 0a 20 20 20 20  ed lock. */.    
153d0 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59  rc = SQLITE_BUSY
153e0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f  ;.  }else{.    /
153f0 2a 20 54 68 65 20 72 65 71 75 65 73 74 20 77 61  * The request wa
15400 73 20 66 6f 72 20 61 20 52 45 53 45 52 56 45 44  s for a RESERVED
15410 20 6f 72 20 45 58 43 4c 55 53 49 56 45 20 6c 6f   or EXCLUSIVE lo
15420 63 6b 2e 20 20 49 74 20 69 73 0a 20 20 20 20 2a  ck.  It is.    *
15430 2a 20 61 73 73 75 6d 65 64 20 74 68 61 74 20 74  * assumed that t
15440 68 65 72 65 20 69 73 20 61 20 53 48 41 52 45 44  here is a SHARED
15450 20 6f 72 20 67 72 65 61 74 65 72 20 6c 6f 63 6b   or greater lock
15460 20 6f 6e 20 74 68 65 20 66 69 6c 65 0a 20 20 20   on the file.   
15470 20 2a 2a 20 61 6c 72 65 61 64 79 2e 0a 20 20 20   ** already..   
15480 20 2a 2f 0a 20 20 20 20 69 6e 74 20 66 61 69 6c   */.    int fail
15490 65 64 20 3d 20 30 3b 0a 20 20 20 20 61 73 73 65  ed = 0;.    asse
154a0 72 74 28 20 30 21 3d 70 46 69 6c 65 2d 3e 6c 6f  rt( 0!=pFile->lo
154b0 63 6b 74 79 70 65 20 29 3b 0a 20 20 20 20 69 66  cktype );.    if
154c0 20 28 6c 6f 63 6b 74 79 70 65 20 3e 3d 20 52 45   (locktype >= RE
154d0 53 45 52 56 45 44 5f 4c 4f 43 4b 20 26 26 20 70  SERVED_LOCK && p
154e0 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 20 3c  File->locktype <
154f0 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 29 20   RESERVED_LOCK) 
15500 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 41 63 71  {.        /* Acq
15510 75 69 72 65 20 61 20 52 45 53 45 52 56 45 44 20  uire a RESERVED 
15520 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20 20 20 20 20  lock */.        
15530 66 61 69 6c 65 64 20 3d 20 61 66 70 53 65 74 4c  failed = afpSetL
15540 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 64 62 50  ock(context->dbP
15550 61 74 68 2c 20 70 46 69 6c 65 2c 20 52 45 53 45  ath, pFile, RESE
15560 52 56 45 44 5f 42 59 54 45 2c 20 31 2c 31 29 3b  RVED_BYTE, 1,1);
15570 0a 20 20 20 20 20 20 69 66 28 20 21 66 61 69 6c  .      if( !fail
15580 65 64 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6f  ed ){.        co
15590 6e 74 65 78 74 2d 3e 72 65 73 65 72 76 65 64 20  ntext->reserved 
155a0 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = 1;.      }.   
155b0 20 7d 0a 20 20 20 20 69 66 20 28 21 66 61 69 6c   }.    if (!fail
155c0 65 64 20 26 26 20 6c 6f 63 6b 74 79 70 65 20 3d  ed && locktype =
155d0 3d 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b  = EXCLUSIVE_LOCK
155e0 29 20 7b 0a 20 20 20 20 20 20 2f 2a 20 41 63 71  ) {.      /* Acq
155f0 75 69 72 65 20 61 6e 20 45 58 43 4c 55 53 49 56  uire an EXCLUSIV
15600 45 20 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20 20 20  E lock */.      
15610 20 20 0a 20 20 20 20 20 20 2f 2a 20 52 65 6d 6f    .      /* Remo
15620 76 65 20 74 68 65 20 73 68 61 72 65 64 20 6c 6f  ve the shared lo
15630 63 6b 20 62 65 66 6f 72 65 20 74 72 79 69 6e 67  ck before trying
15640 20 74 68 65 20 72 61 6e 67 65 2e 20 20 77 65 27   the range.  we'
15650 6c 6c 20 6e 65 65 64 20 74 6f 20 0a 20 20 20 20  ll need to .    
15660 20 20 2a 2a 20 72 65 65 73 74 61 62 6c 69 73 68    ** reestablish
15670 20 74 68 65 20 73 68 61 72 65 64 20 6c 6f 63 6b   the shared lock
15680 20 69 66 20 77 65 20 63 61 6e 27 74 20 67 65 74   if we can't get
15690 20 74 68 65 20 20 61 66 70 55 6e 6c 6f 63 6b 0a   the  afpUnlock.
156a0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69        */.      i
156b0 66 28 20 21 28 66 61 69 6c 65 64 20 3d 20 61 66  f( !(failed = af
156c0 70 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74  pSetLock(context
156d0 2d 3e 64 62 50 61 74 68 2c 20 70 46 69 6c 65 2c  ->dbPath, pFile,
156e0 20 53 48 41 52 45 44 5f 46 49 52 53 54 20 2b 0a   SHARED_FIRST +.
156f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15700 20 20 20 20 20 20 20 20 20 70 4c 6f 63 6b 2d 3e           pLock->
15710 73 68 61 72 65 64 42 79 74 65 2c 20 31 2c 20 30  sharedByte, 1, 0
15720 29 29 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e  )) ){.        in
15730 74 20 66 61 69 6c 65 64 32 20 3d 20 53 51 4c 49  t failed2 = SQLI
15740 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 2f  TE_OK;.        /
15750 2a 20 6e 6f 77 20 61 74 74 65 6d 6d 70 74 20 74  * now attemmpt t
15760 6f 20 67 65 74 20 74 68 65 20 65 78 63 6c 75 73  o get the exclus
15770 69 76 65 20 6c 6f 63 6b 20 72 61 6e 67 65 20 2a  ive lock range *
15780 2f 0a 20 20 20 20 20 20 20 20 66 61 69 6c 65 64  /.        failed
15790 20 3d 20 61 66 70 53 65 74 4c 6f 63 6b 28 63 6f   = afpSetLock(co
157a0 6e 74 65 78 74 2d 3e 64 62 50 61 74 68 2c 20 70  ntext->dbPath, p
157b0 46 69 6c 65 2c 20 53 48 41 52 45 44 5f 46 49 52  File, SHARED_FIR
157c0 53 54 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20  ST, .           
157d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
157e0 20 20 20 20 53 48 41 52 45 44 5f 53 49 5a 45 2c      SHARED_SIZE,
157f0 20 31 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28   1);.        if(
15800 20 66 61 69 6c 65 64 20 26 26 20 28 66 61 69 6c   failed && (fail
15810 65 64 32 20 3d 20 61 66 70 53 65 74 4c 6f 63 6b  ed2 = afpSetLock
15820 28 63 6f 6e 74 65 78 74 2d 3e 64 62 50 61 74 68  (context->dbPath
15830 2c 20 70 46 69 6c 65 2c 20 0a 20 20 20 20 20 20  , pFile, .      
15840 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15850 20 53 48 41 52 45 44 5f 46 49 52 53 54 20 2b 20   SHARED_FIRST + 
15860 70 4c 6f 63 6b 2d 3e 73 68 61 72 65 64 42 79 74  pLock->sharedByt
15870 65 2c 20 31 2c 20 31 29 29 20 29 7b 0a 20 20 20  e, 1, 1)) ){.   
15880 20 20 20 20 20 20 20 2f 2a 20 43 61 6e 27 74 20         /* Can't 
15890 72 65 65 73 74 61 62 6c 69 73 68 20 74 68 65 20  reestablish the 
158a0 73 68 61 72 65 64 20 6c 6f 63 6b 2e 20 20 53 71  shared lock.  Sq
158b0 6c 69 74 65 20 63 61 6e 27 74 20 64 65 61 6c 2c  lite can't deal,
158c0 20 74 68 69 73 20 69 73 0a 20 20 20 20 20 20 20   this is.       
158d0 20 20 20 2a 2a 20 61 20 63 72 69 74 69 63 61 6c     ** a critical
158e0 20 49 2f 4f 20 65 72 72 6f 72 0a 20 20 20 20 20   I/O error.     
158f0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
15900 20 20 72 63 20 3d 20 28 28 66 61 69 6c 65 64 20    rc = ((failed 
15910 26 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 29 20  & SQLITE_IOERR) 
15920 3d 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 29  == SQLITE_IOERR)
15930 20 3f 20 66 61 69 6c 65 64 32 20 3a 20 0a 20 20   ? failed2 : .  
15940 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c               SQL
15950 49 54 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b 3b 0a  ITE_IOERR_LOCK;.
15960 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 61            goto a
15970 66 70 5f 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 20  fp_end_lock;.   
15980 20 20 20 20 20 7d 20 0a 20 20 20 20 20 20 7d 65       } .      }e
15990 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72 63 20  lse{.        rc 
159a0 3d 20 66 61 69 6c 65 64 3b 20 0a 20 20 20 20 20  = failed; .     
159b0 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28   }.    }.    if(
159c0 20 66 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 20   failed ){.     
159d0 20 72 63 20 3d 20 66 61 69 6c 65 64 3b 0a 20 20   rc = failed;.  
159e0 20 20 7d 0a 20 20 7d 0a 20 20 0a 20 20 69 66 28    }.  }.  .  if(
159f0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
15a00 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c 6f 63  {.    pFile->loc
15a10 6b 74 79 70 65 20 3d 20 6c 6f 63 6b 74 79 70 65  ktype = locktype
15a20 3b 0a 20 20 20 20 70 4c 6f 63 6b 2d 3e 6c 6f 63  ;.    pLock->loc
15a30 6b 74 79 70 65 20 3d 20 6c 6f 63 6b 74 79 70 65  ktype = locktype
15a40 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 6c 6f  ;.  }else if( lo
15a50 63 6b 74 79 70 65 3d 3d 45 58 43 4c 55 53 49 56  cktype==EXCLUSIV
15a60 45 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 70 46  E_LOCK ){.    pF
15a70 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 20 3d 20  ile->locktype = 
15a80 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 3b 0a 20 20  PENDING_LOCK;.  
15a90 20 20 70 4c 6f 63 6b 2d 3e 6c 6f 63 6b 74 79 70    pLock->locktyp
15aa0 65 20 3d 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b  e = PENDING_LOCK
15ab0 3b 0a 20 20 7d 0a 20 20 0a 61 66 70 5f 65 6e 64  ;.  }.  .afp_end
15ac0 5f 6c 6f 63 6b 3a 0a 20 20 75 6e 69 78 4c 65 61  _lock:.  unixLea
15ad0 76 65 4d 75 74 65 78 28 29 3b 0a 20 20 4f 53 54  veMutex();.  OST
15ae0 52 41 43 45 34 28 22 4c 4f 43 4b 20 20 20 20 25  RACE4("LOCK    %
15af0 64 20 25 73 20 25 73 20 28 61 66 70 29 5c 6e 22  d %s %s (afp)\n"
15b00 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 6c 6f 63 6b  , pFile->h, lock
15b10 74 79 70 65 4e 61 6d 65 28 6c 6f 63 6b 74 79 70  typeName(locktyp
15b20 65 29 2c 20 0a 20 20 20 20 20 20 20 20 20 72 63  e), .         rc
15b30 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 3f 20 22 6f  ==SQLITE_OK ? "o
15b40 6b 22 20 3a 20 22 66 61 69 6c 65 64 22 29 3b 0a  k" : "failed");.
15b50 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
15b60 2f 2a 0a 2a 2a 20 4c 6f 77 65 72 20 74 68 65 20  /*.** Lower the 
15b70 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 6e  locking level on
15b80 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
15b90 20 70 46 69 6c 65 20 74 6f 20 6c 6f 63 6b 74 79   pFile to lockty
15ba0 70 65 2e 20 20 6c 6f 63 6b 74 79 70 65 0a 2a 2a  pe.  locktype.**
15bb0 20 6d 75 73 74 20 62 65 20 65 69 74 68 65 72 20   must be either 
15bc0 4e 4f 5f 4c 4f 43 4b 20 6f 72 20 53 48 41 52 45  NO_LOCK or SHARE
15bd0 44 5f 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66  D_LOCK..**.** If
15be0 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76   the locking lev
15bf0 65 6c 20 6f 66 20 74 68 65 20 66 69 6c 65 20 64  el of the file d
15c00 65 73 63 72 69 70 74 6f 72 20 69 73 20 61 6c 72  escriptor is alr
15c10 65 61 64 79 20 61 74 20 6f 72 20 62 65 6c 6f 77  eady at or below
15c20 0a 2a 2a 20 74 68 65 20 72 65 71 75 65 73 74 65  .** the requeste
15c30 64 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 2c  d locking level,
15c40 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
15c50 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61   a no-op..*/.sta
15c60 74 69 63 20 69 6e 74 20 61 66 70 55 6e 6c 6f 63  tic int afpUnloc
15c70 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  k(sqlite3_file *
15c80 69 64 2c 20 69 6e 74 20 6c 6f 63 6b 74 79 70 65  id, int locktype
15c90 29 20 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  ) {.  int rc = S
15ca0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 75 6e 69 78  QLITE_OK;.  unix
15cb0 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75  File *pFile = (u
15cc0 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 73  nixFile*)id;.  s
15cd0 74 72 75 63 74 20 75 6e 69 78 4c 6f 63 6b 49 6e  truct unixLockIn
15ce0 66 6f 20 2a 70 4c 6f 63 6b 3b 0a 20 20 61 66 70  fo *pLock;.  afp
15cf0 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a  LockingContext *
15d00 63 6f 6e 74 65 78 74 20 3d 20 28 61 66 70 4c 6f  context = (afpLo
15d10 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 29 20  ckingContext *) 
15d20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f  pFile->lockingCo
15d30 6e 74 65 78 74 3b 0a 20 20 69 6e 74 20 73 6b 69  ntext;.  int ski
15d40 70 53 68 61 72 65 64 20 3d 20 30 3b 0a 23 69 66  pShared = 0;.#if
15d50 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a  def SQLITE_TEST.
15d60 20 20 69 6e 74 20 68 20 3d 20 70 46 69 6c 65 2d    int h = pFile-
15d70 3e 68 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 61 73  >h;.#endif..  as
15d80 73 65 72 74 28 20 70 46 69 6c 65 20 29 3b 0a 20  sert( pFile );. 
15d90 20 4f 53 54 52 41 43 45 37 28 22 55 4e 4c 4f 43   OSTRACE7("UNLOC
15da0 4b 20 20 25 64 20 25 64 20 77 61 73 20 25 64 28  K  %d %d was %d(
15db0 25 64 2c 25 64 29 20 70 69 64 3d 25 64 20 28 61  %d,%d) pid=%d (a
15dc0 66 70 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68  fp)\n", pFile->h
15dd0 2c 20 6c 6f 63 6b 74 79 70 65 2c 0a 20 20 20 20  , locktype,.    
15de0 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 6f         pFile->lo
15df0 63 6b 74 79 70 65 2c 20 70 46 69 6c 65 2d 3e 70  cktype, pFile->p
15e00 4c 6f 63 6b 2d 3e 6c 6f 63 6b 74 79 70 65 2c 20  Lock->locktype, 
15e10 70 46 69 6c 65 2d 3e 70 4c 6f 63 6b 2d 3e 63 6e  pFile->pLock->cn
15e20 74 2c 20 67 65 74 70 69 64 28 29 29 3b 0a 0a 20  t, getpid());.. 
15e30 20 61 73 73 65 72 74 28 20 6c 6f 63 6b 74 79 70   assert( locktyp
15e40 65 3c 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29  e<=SHARED_LOCK )
15e50 3b 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 6c  ;.  if( pFile->l
15e60 6f 63 6b 74 79 70 65 3c 3d 6c 6f 63 6b 74 79 70  ocktype<=locktyp
15e70 65 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  e ){.    return 
15e80 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20  SQLITE_OK;.  }. 
15e90 20 69 66 28 20 43 48 45 43 4b 5f 54 48 52 45 41   if( CHECK_THREA
15ea0 44 49 44 28 70 46 69 6c 65 29 20 29 7b 0a 20 20  DID(pFile) ){.  
15eb0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
15ec0 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a 20 20 7d  MISUSE_BKPT;.  }
15ed0 0a 20 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65  .  unixEnterMute
15ee0 78 28 29 3b 0a 20 20 70 4c 6f 63 6b 20 3d 20 70  x();.  pLock = p
15ef0 46 69 6c 65 2d 3e 70 4c 6f 63 6b 3b 0a 20 20 61  File->pLock;.  a
15f00 73 73 65 72 74 28 20 70 4c 6f 63 6b 2d 3e 63 6e  ssert( pLock->cn
15f10 74 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 46  t!=0 );.  if( pF
15f20 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3e 53 48  ile->locktype>SH
15f30 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20  ARED_LOCK ){.   
15f40 20 61 73 73 65 72 74 28 20 70 4c 6f 63 6b 2d 3e   assert( pLock->
15f50 6c 6f 63 6b 74 79 70 65 3d 3d 70 46 69 6c 65 2d  locktype==pFile-
15f60 3e 6c 6f 63 6b 74 79 70 65 20 29 3b 0a 20 20 20  >locktype );.   
15f70 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72   SimulateIOError
15f80 42 65 6e 69 67 6e 28 31 29 3b 0a 20 20 20 20 53  Benign(1);.    S
15f90 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20  imulateIOError( 
15fa0 68 3d 28 2d 31 29 20 29 0a 20 20 20 20 53 69 6d  h=(-1) ).    Sim
15fb0 75 6c 61 74 65 49 4f 45 72 72 6f 72 42 65 6e 69  ulateIOErrorBeni
15fc0 67 6e 28 30 29 3b 0a 20 20 20 20 0a 23 69 66 6e  gn(0);.    .#ifn
15fd0 64 65 66 20 4e 44 45 42 55 47 0a 20 20 20 20 2f  def NDEBUG.    /
15fe0 2a 20 57 68 65 6e 20 72 65 64 75 63 69 6e 67 20  * When reducing 
15ff0 61 20 6c 6f 63 6b 20 73 75 63 68 20 74 68 61 74  a lock such that
16000 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 65 73   other processes
16010 20 63 61 6e 20 73 74 61 72 74 0a 20 20 20 20 2a   can start.    *
16020 2a 20 72 65 61 64 69 6e 67 20 74 68 65 20 64 61  * reading the da
16030 74 61 62 61 73 65 20 66 69 6c 65 20 61 67 61 69  tabase file agai
16040 6e 2c 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61  n, make sure tha
16050 74 20 74 68 65 0a 20 20 20 20 2a 2a 20 74 72 61  t the.    ** tra
16060 6e 73 61 63 74 69 6f 6e 20 63 6f 75 6e 74 65 72  nsaction counter
16070 20 77 61 73 20 75 70 64 61 74 65 64 20 69 66 20   was updated if 
16080 61 6e 79 20 70 61 72 74 20 6f 66 20 74 68 65 20  any part of the 
16090 64 61 74 61 62 61 73 65 0a 20 20 20 20 2a 2a 20  database.    ** 
160a0 66 69 6c 65 20 63 68 61 6e 67 65 64 2e 20 20 49  file changed.  I
160b0 66 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  f the transactio
160c0 6e 20 63 6f 75 6e 74 65 72 20 69 73 20 6e 6f 74  n counter is not
160d0 20 75 70 64 61 74 65 64 2c 0a 20 20 20 20 2a 2a   updated,.    **
160e0 20 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f   other connectio
160f0 6e 73 20 74 6f 20 74 68 65 20 73 61 6d 65 20 66  ns to the same f
16100 69 6c 65 20 6d 69 67 68 74 20 6e 6f 74 20 72 65  ile might not re
16110 61 6c 69 7a 65 20 74 68 61 74 0a 20 20 20 20 2a  alize that.    *
16120 2a 20 74 68 65 20 66 69 6c 65 20 68 61 73 20 63  * the file has c
16130 68 61 6e 67 65 64 20 61 6e 64 20 68 65 6e 63 65  hanged and hence
16140 20 6d 69 67 68 74 20 6e 6f 74 20 6b 6e 6f 77 20   might not know 
16150 74 6f 20 66 6c 75 73 68 20 74 68 65 69 72 0a 20  to flush their. 
16160 20 20 20 2a 2a 20 63 61 63 68 65 2e 20 20 54 68     ** cache.  Th
16170 65 20 75 73 65 20 6f 66 20 61 20 73 74 61 6c 65  e use of a stale
16180 20 63 61 63 68 65 20 63 61 6e 20 6c 65 61 64 20   cache can lead 
16190 74 6f 20 64 61 74 61 62 61 73 65 20 63 6f 72 72  to database corr
161a0 75 70 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20  uption..    */. 
161b0 20 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65     assert( pFile
161c0 2d 3e 69 6e 4e 6f 72 6d 61 6c 57 72 69 74 65 3d  ->inNormalWrite=
161d0 3d 30 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c  =0.           ||
161e0 20 70 46 69 6c 65 2d 3e 64 62 55 70 64 61 74 65   pFile->dbUpdate
161f0 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 20 20 7c  ==0.           |
16200 7c 20 70 46 69 6c 65 2d 3e 74 72 61 6e 73 43 6e  | pFile->transCn
16210 74 72 43 68 6e 67 3d 3d 31 20 29 3b 0a 20 20 20  trChng==1 );.   
16220 20 70 46 69 6c 65 2d 3e 69 6e 4e 6f 72 6d 61 6c   pFile->inNormal
16230 57 72 69 74 65 20 3d 20 30 3b 0a 23 65 6e 64 69  Write = 0;.#endi
16240 66 0a 20 20 20 20 0a 20 20 20 20 69 66 28 20 70  f.    .    if( p
16250 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3d 3d  File->locktype==
16260 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 29  EXCLUSIVE_LOCK )
16270 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 61 66 70  {.      rc = afp
16280 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74 2d  SetLock(context-
16290 3e 64 62 50 61 74 68 2c 20 70 46 69 6c 65 2c 20  >dbPath, pFile, 
162a0 53 48 41 52 45 44 5f 46 49 52 53 54 2c 20 53 48  SHARED_FIRST, SH
162b0 41 52 45 44 5f 53 49 5a 45 2c 20 30 29 3b 0a 20  ARED_SIZE, 0);. 
162c0 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
162d0 49 54 45 5f 4f 4b 20 26 26 20 28 6c 6f 63 6b 74  ITE_OK && (lockt
162e0 79 70 65 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b  ype==SHARED_LOCK
162f0 20 7c 7c 20 70 4c 6f 63 6b 2d 3e 63 6e 74 3e 31   || pLock->cnt>1
16300 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  ) ){.        /* 
16310 6f 6e 6c 79 20 72 65 2d 65 73 74 61 62 6c 69 73  only re-establis
16320 68 20 74 68 65 20 73 68 61 72 65 64 20 6c 6f 63  h the shared loc
16330 6b 20 69 66 20 6e 65 63 65 73 73 61 72 79 20 2a  k if necessary *
16340 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20 73 68  /.        int sh
16350 61 72 65 64 4c 6f 63 6b 42 79 74 65 20 3d 20 53  aredLockByte = S
16360 48 41 52 45 44 5f 46 49 52 53 54 2b 70 4c 6f 63  HARED_FIRST+pLoc
16370 6b 2d 3e 73 68 61 72 65 64 42 79 74 65 3b 0a 20  k->sharedByte;. 
16380 20 20 20 20 20 20 20 72 63 20 3d 20 61 66 70 53         rc = afpS
16390 65 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e  etLock(context->
163a0 64 62 50 61 74 68 2c 20 70 46 69 6c 65 2c 20 73  dbPath, pFile, s
163b0 68 61 72 65 64 4c 6f 63 6b 42 79 74 65 2c 20 31  haredLockByte, 1
163c0 2c 20 31 29 3b 0a 20 20 20 20 20 20 7d 20 65 6c  , 1);.      } el
163d0 73 65 20 7b 0a 20 20 20 20 20 20 20 20 73 6b 69  se {.        ski
163e0 70 53 68 61 72 65 64 20 3d 20 31 3b 0a 20 20 20  pShared = 1;.   
163f0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69     }.    }.    i
16400 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
16410 20 26 26 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74   && pFile->lockt
16420 79 70 65 3e 3d 50 45 4e 44 49 4e 47 5f 4c 4f 43  ype>=PENDING_LOC
16430 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  K ){.      rc = 
16440 61 66 70 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65  afpSetLock(conte
16450 78 74 2d 3e 64 62 50 61 74 68 2c 20 70 46 69 6c  xt->dbPath, pFil
16460 65 2c 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 2c  e, PENDING_BYTE,
16470 20 31 2c 20 30 29 3b 0a 20 20 20 20 7d 20 0a 20   1, 0);.    } . 
16480 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
16490 45 5f 4f 4b 20 26 26 20 70 46 69 6c 65 2d 3e 6c  E_OK && pFile->l
164a0 6f 63 6b 74 79 70 65 3e 3d 52 45 53 45 52 56 45  ocktype>=RESERVE
164b0 44 5f 4c 4f 43 4b 20 26 26 20 63 6f 6e 74 65 78  D_LOCK && contex
164c0 74 2d 3e 72 65 73 65 72 76 65 64 20 29 7b 0a 20  t->reserved ){. 
164d0 20 20 20 20 20 72 63 20 3d 20 61 66 70 53 65 74       rc = afpSet
164e0 4c 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 64 62  Lock(context->db
164f0 50 61 74 68 2c 20 70 46 69 6c 65 2c 20 52 45 53  Path, pFile, RES
16500 45 52 56 45 44 5f 42 59 54 45 2c 20 31 2c 20 30  ERVED_BYTE, 1, 0
16510 29 3b 0a 20 20 20 20 20 20 69 66 28 20 21 72 63  );.      if( !rc
16520 20 29 7b 20 0a 20 20 20 20 20 20 20 20 63 6f 6e   ){ .        con
16530 74 65 78 74 2d 3e 72 65 73 65 72 76 65 64 20 3d  text->reserved =
16540 20 30 3b 20 0a 20 20 20 20 20 20 7d 0a 20 20 20   0; .      }.   
16550 20 7d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53   }.    if( rc==S
16560 51 4c 49 54 45 5f 4f 4b 20 26 26 20 28 6c 6f 63  QLITE_OK && (loc
16570 6b 74 79 70 65 3d 3d 53 48 41 52 45 44 5f 4c 4f  ktype==SHARED_LO
16580 43 4b 20 7c 7c 20 70 4c 6f 63 6b 2d 3e 63 6e 74  CK || pLock->cnt
16590 3e 31 29 29 7b 0a 20 20 20 20 20 20 70 4c 6f 63  >1)){.      pLoc
165a0 6b 2d 3e 6c 6f 63 6b 74 79 70 65 20 3d 20 53 48  k->locktype = SH
165b0 41 52 45 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20 7d  ARED_LOCK;.    }
165c0 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53  .  }.  if( rc==S
165d0 51 4c 49 54 45 5f 4f 4b 20 26 26 20 6c 6f 63 6b  QLITE_OK && lock
165e0 74 79 70 65 3d 3d 4e 4f 5f 4c 4f 43 4b 20 29 7b  type==NO_LOCK ){
165f0 0a 0a 20 20 20 20 2f 2a 20 44 65 63 72 65 6d 65  ..    /* Decreme
16600 6e 74 20 74 68 65 20 73 68 61 72 65 64 20 6c 6f  nt the shared lo
16610 63 6b 20 63 6f 75 6e 74 65 72 2e 20 20 52 65 6c  ck counter.  Rel
16620 65 61 73 65 20 74 68 65 20 6c 6f 63 6b 20 75 73  ease the lock us
16630 69 6e 67 20 61 6e 0a 20 20 20 20 2a 2a 20 4f 53  ing an.    ** OS
16640 20 63 61 6c 6c 20 6f 6e 6c 79 20 77 68 65 6e 20   call only when 
16650 61 6c 6c 20 74 68 72 65 61 64 73 20 69 6e 20 74  all threads in t
16660 68 69 73 20 73 61 6d 65 20 70 72 6f 63 65 73 73  his same process
16670 20 68 61 76 65 20 72 65 6c 65 61 73 65 64 0a 20   have released. 
16680 20 20 20 2a 2a 20 74 68 65 20 6c 6f 63 6b 2e 0a     ** the lock..
16690 20 20 20 20 2a 2f 0a 20 20 20 20 75 6e 73 69 67      */.    unsig
166a0 6e 65 64 20 6c 6f 6e 67 20 6c 6f 6e 67 20 73 68  ned long long sh
166b0 61 72 65 64 4c 6f 63 6b 42 79 74 65 20 3d 20 53  aredLockByte = S
166c0 48 41 52 45 44 5f 46 49 52 53 54 2b 70 4c 6f 63  HARED_FIRST+pLoc
166d0 6b 2d 3e 73 68 61 72 65 64 42 79 74 65 3b 0a 20  k->sharedByte;. 
166e0 20 20 20 70 4c 6f 63 6b 2d 3e 63 6e 74 2d 2d 3b     pLock->cnt--;
166f0 0a 20 20 20 20 69 66 28 20 70 4c 6f 63 6b 2d 3e  .    if( pLock->
16700 63 6e 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  cnt==0 ){.      
16710 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 42  SimulateIOErrorB
16720 65 6e 69 67 6e 28 31 29 3b 0a 20 20 20 20 20 20  enign(1);.      
16730 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28  SimulateIOError(
16740 20 68 3d 28 2d 31 29 20 29 0a 20 20 20 20 20 20   h=(-1) ).      
16750 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 42  SimulateIOErrorB
16760 65 6e 69 67 6e 28 30 29 3b 0a 20 20 20 20 20 20  enign(0);.      
16770 69 66 28 20 21 73 6b 69 70 53 68 61 72 65 64 20  if( !skipShared 
16780 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
16790 61 66 70 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65  afpSetLock(conte
167a0 78 74 2d 3e 64 62 50 61 74 68 2c 20 70 46 69 6c  xt->dbPath, pFil
167b0 65 2c 20 73 68 61 72 65 64 4c 6f 63 6b 42 79 74  e, sharedLockByt
167c0 65 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 20 20  e, 1, 0);.      
167d0 7d 0a 20 20 20 20 20 20 69 66 28 20 21 72 63 20  }.      if( !rc 
167e0 29 7b 0a 20 20 20 20 20 20 20 20 70 4c 6f 63 6b  ){.        pLock
167f0 2d 3e 6c 6f 63 6b 74 79 70 65 20 3d 20 4e 4f 5f  ->locktype = NO_
16800 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 20 20 70 46  LOCK;.        pF
16810 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 20 3d 20  ile->locktype = 
16820 4e 4f 5f 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 7d  NO_LOCK;.      }
16830 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72  .    }.    if( r
16840 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
16850 20 20 20 20 20 20 73 74 72 75 63 74 20 75 6e 69        struct uni
16860 78 4f 70 65 6e 43 6e 74 20 2a 70 4f 70 65 6e 20  xOpenCnt *pOpen 
16870 3d 20 70 46 69 6c 65 2d 3e 70 4f 70 65 6e 3b 0a  = pFile->pOpen;.
16880 20 20 20 20 20 20 20 20 0a 20 20 20 20 20 20 70          .      p
16890 4f 70 65 6e 2d 3e 6e 4c 6f 63 6b 2d 2d 3b 0a 20  Open->nLock--;. 
168a0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4f 70       assert( pOp
168b0 65 6e 2d 3e 6e 4c 6f 63 6b 3e 3d 30 20 29 3b 0a  en->nLock>=0 );.
168c0 20 20 20 20 20 20 69 66 28 20 70 4f 70 65 6e 2d        if( pOpen-
168d0 3e 6e 4c 6f 63 6b 3d 3d 30 20 29 7b 0a 20 20 20  >nLock==0 ){.   
168e0 20 20 20 20 20 72 63 20 3d 20 63 6c 6f 73 65 50       rc = closeP
168f0 65 6e 64 69 6e 67 46 64 73 28 70 46 69 6c 65 29  endingFds(pFile)
16900 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
16910 20 20 7d 0a 20 20 0a 20 20 75 6e 69 78 4c 65 61    }.  .  unixLea
16920 76 65 4d 75 74 65 78 28 29 3b 0a 20 20 69 66 28  veMutex();.  if(
16930 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
16940 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65   pFile->locktype
16950 20 3d 20 6c 6f 63 6b 74 79 70 65 3b 0a 20 20 72   = locktype;.  r
16960 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
16970 2a 2a 20 43 6c 6f 73 65 20 61 20 66 69 6c 65 20  ** Close a file 
16980 26 20 63 6c 65 61 6e 75 70 20 41 46 50 20 73 70  & cleanup AFP sp
16990 65 63 69 66 69 63 20 6c 6f 63 6b 69 6e 67 20 63  ecific locking c
169a0 6f 6e 74 65 78 74 20 0a 2a 2f 0a 73 74 61 74 69  ontext .*/.stati
169b0 63 20 69 6e 74 20 61 66 70 43 6c 6f 73 65 28 73  c int afpClose(s
169c0 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 29  qlite3_file *id)
169d0 20 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51   {.  int rc = SQ
169e0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 69  LITE_OK;.  if( i
169f0 64 20 29 7b 0a 20 20 20 20 75 6e 69 78 46 69 6c  d ){.    unixFil
16a00 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78  e *pFile = (unix
16a10 46 69 6c 65 2a 29 69 64 3b 0a 20 20 20 20 61 66  File*)id;.    af
16a20 70 55 6e 6c 6f 63 6b 28 69 64 2c 20 4e 4f 5f 4c  pUnlock(id, NO_L
16a30 4f 43 4b 29 3b 0a 20 20 20 20 75 6e 69 78 45 6e  OCK);.    unixEn
16a40 74 65 72 4d 75 74 65 78 28 29 3b 0a 20 20 20 20  terMutex();.    
16a50 69 66 28 20 70 46 69 6c 65 2d 3e 70 4f 70 65 6e  if( pFile->pOpen
16a60 20 26 26 20 70 46 69 6c 65 2d 3e 70 4f 70 65 6e   && pFile->pOpen
16a70 2d 3e 6e 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 20  ->nLock ){.     
16a80 20 2f 2a 20 49 66 20 74 68 65 72 65 20 61 72 65   /* If there are
16a90 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 6c 6f 63   outstanding loc
16aa0 6b 73 2c 20 64 6f 20 6e 6f 74 20 61 63 74 75 61  ks, do not actua
16ab0 6c 6c 79 20 63 6c 6f 73 65 20 74 68 65 20 66 69  lly close the fi
16ac0 6c 65 20 6a 75 73 74 0a 20 20 20 20 20 20 2a 2a  le just.      **
16ad0 20 79 65 74 20 62 65 63 61 75 73 65 20 74 68 61   yet because tha
16ae0 74 20 77 6f 75 6c 64 20 63 6c 65 61 72 20 74 68  t would clear th
16af0 6f 73 65 20 6c 6f 63 6b 73 2e 20 20 49 6e 73 74  ose locks.  Inst
16b00 65 61 64 2c 20 61 64 64 20 74 68 65 20 66 69 6c  ead, add the fil
16b10 65 0a 20 20 20 20 20 20 2a 2a 20 64 65 73 63 72  e.      ** descr
16b20 69 70 74 6f 72 20 74 6f 20 70 4f 70 65 6e 2d 3e  iptor to pOpen->
16b30 61 50 65 6e 64 69 6e 67 2e 20 20 49 74 20 77 69  aPending.  It wi
16b40 6c 6c 20 62 65 20 61 75 74 6f 6d 61 74 69 63 61  ll be automatica
16b50 6c 6c 79 20 63 6c 6f 73 65 64 20 77 68 65 6e 0a  lly closed when.
16b60 20 20 20 20 20 20 2a 2a 20 74 68 65 20 6c 61 73        ** the las
16b70 74 20 6c 6f 63 6b 20 69 73 20 63 6c 65 61 72 65  t lock is cleare
16b80 64 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  d..      */.    
16b90 20 20 73 65 74 50 65 6e 64 69 6e 67 46 64 28 70    setPendingFd(p
16ba0 46 69 6c 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20  File);.    }.   
16bb0 20 72 65 6c 65 61 73 65 4c 6f 63 6b 49 6e 66 6f   releaseLockInfo
16bc0 28 70 46 69 6c 65 2d 3e 70 4c 6f 63 6b 29 3b 0a  (pFile->pLock);.
16bd0 20 20 20 20 72 65 6c 65 61 73 65 4f 70 65 6e 43      releaseOpenC
16be0 6e 74 28 70 46 69 6c 65 2d 3e 70 4f 70 65 6e 29  nt(pFile->pOpen)
16bf0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  ;.    sqlite3_fr
16c00 65 65 28 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e  ee(pFile->lockin
16c10 67 43 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20 72  gContext);.    r
16c20 63 20 3d 20 63 6c 6f 73 65 55 6e 69 78 46 69 6c  c = closeUnixFil
16c30 65 28 69 64 29 3b 0a 20 20 20 20 75 6e 69 78 4c  e(id);.    unixL
16c40 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 20 20 7d  eaveMutex();.  }
16c50 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
16c60 0a 23 65 6e 64 69 66 20 2f 2a 20 64 65 66 69 6e  .#endif /* defin
16c70 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 26 26  ed(__APPLE__) &&
16c80 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c   SQLITE_ENABLE_L
16c90 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 2a 2f 0a  OCKING_STYLE */.
16ca0 2f 2a 0a 2a 2a 20 54 68 65 20 63 6f 64 65 20 61  /*.** The code a
16cb0 62 6f 76 65 20 69 73 20 74 68 65 20 41 46 50 20  bove is the AFP 
16cc0 6c 6f 63 6b 20 69 6d 70 6c 65 6d 65 6e 74 61 74  lock implementat
16cd0 69 6f 6e 2e 20 20 54 68 65 20 63 6f 64 65 20 69  ion.  The code i
16ce0 73 20 73 70 65 63 69 66 69 63 0a 2a 2a 20 74 6f  s specific.** to
16cf0 20 4d 61 63 4f 53 58 20 61 6e 64 20 64 6f 65 73   MacOSX and does
16d00 20 6e 6f 74 20 77 6f 72 6b 20 6f 6e 20 6f 74 68   not work on oth
16d10 65 72 20 75 6e 69 78 20 70 6c 61 74 66 6f 72 6d  er unix platform
16d20 73 2e 20 20 4e 6f 20 61 6c 74 65 72 6e 61 74 69  s.  No alternati
16d30 76 65 0a 2a 2a 20 69 73 20 61 76 61 69 6c 61 62  ve.** is availab
16d40 6c 65 2e 20 20 49 66 20 79 6f 75 20 64 6f 6e 27  le.  If you don'
16d50 74 20 63 6f 6d 70 69 6c 65 20 66 6f 72 20 61 20  t compile for a 
16d60 6d 61 63 2c 20 74 68 65 6e 20 74 68 65 20 22 75  mac, then the "u
16d70 6e 69 78 2d 61 66 70 22 0a 2a 2a 20 56 46 53 20  nix-afp".** VFS 
16d80 69 73 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65  is not available
16d90 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ..**.***********
16da0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64 20 6f  ********** End o
16db0 66 20 74 68 65 20 41 46 50 20 6c 6f 63 6b 20 69  f the AFP lock i
16dc0 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 2a 2a  mplementation **
16dd0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
16de0 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****.***********
16df0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
16e00 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
16e10 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
16e20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
16e30 2a 2a 2a 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a  ***/../*********
16e40 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
16e50 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
16e60 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
16e70 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
16e80 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  *****.**********
16e90 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
16ea0 2a 20 42 65 67 69 6e 20 4e 46 53 20 4c 6f 63 6b  * Begin NFS Lock
16eb0 69 6e 67 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ing ************
16ec0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
16ed0 2a 2a 2a 2a 2f 0a 0a 23 69 66 20 64 65 66 69 6e  ****/..#if defin
16ee0 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 26 26  ed(__APPLE__) &&
16ef0 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c   SQLITE_ENABLE_L
16f00 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 2f 2a 0a  OCKING_STYLE./*.
16f10 20 2a 2a 20 4c 6f 77 65 72 20 74 68 65 20 6c 6f   ** Lower the lo
16f20 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 6e 20 66  cking level on f
16f30 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 70  ile descriptor p
16f40 46 69 6c 65 20 74 6f 20 6c 6f 63 6b 74 79 70 65  File to locktype
16f50 2e 20 20 6c 6f 63 6b 74 79 70 65 0a 20 2a 2a 20  .  locktype. ** 
16f60 6d 75 73 74 20 62 65 20 65 69 74 68 65 72 20 4e  must be either N
16f70 4f 5f 4c 4f 43 4b 20 6f 72 20 53 48 41 52 45 44  O_LOCK or SHARED
16f80 5f 4c 4f 43 4b 2e 0a 20 2a 2a 0a 20 2a 2a 20 49  _LOCK.. **. ** I
16f90 66 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65  f the locking le
16fa0 76 65 6c 20 6f 66 20 74 68 65 20 66 69 6c 65 20  vel of the file 
16fb0 64 65 73 63 72 69 70 74 6f 72 20 69 73 20 61 6c  descriptor is al
16fc0 72 65 61 64 79 20 61 74 20 6f 72 20 62 65 6c 6f  ready at or belo
16fd0 77 0a 20 2a 2a 20 74 68 65 20 72 65 71 75 65 73  w. ** the reques
16fe0 74 65 64 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65  ted locking leve
16ff0 6c 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  l, this routine 
17000 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 20 2a 2f 0a  is a no-op.. */.
17010 73 74 61 74 69 63 20 69 6e 74 20 6e 66 73 55 6e  static int nfsUn
17020 6c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c  lock(sqlite3_fil
17030 65 20 2a 69 64 2c 20 69 6e 74 20 6c 6f 63 6b 74  e *id, int lockt
17040 79 70 65 29 7b 0a 20 20 72 65 74 75 72 6e 20 5f  ype){.  return _
17050 70 6f 73 69 78 55 6e 6c 6f 63 6b 28 69 64 2c 20  posixUnlock(id, 
17060 6c 6f 63 6b 74 79 70 65 2c 20 31 29 3b 0a 7d 0a  locktype, 1);.}.
17070 0a 23 65 6e 64 69 66 20 2f 2a 20 64 65 66 69 6e  .#endif /* defin
17080 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 26 26  ed(__APPLE__) &&
17090 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c   SQLITE_ENABLE_L
170a0 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 2a 2f 0a  OCKING_STYLE */.
170b0 2f 2a 0a 2a 2a 20 54 68 65 20 63 6f 64 65 20 61  /*.** The code a
170c0 62 6f 76 65 20 69 73 20 74 68 65 20 4e 46 53 20  bove is the NFS 
170d0 6c 6f 63 6b 20 69 6d 70 6c 65 6d 65 6e 74 61 74  lock implementat
170e0 69 6f 6e 2e 20 20 54 68 65 20 63 6f 64 65 20 69  ion.  The code i
170f0 73 20 73 70 65 63 69 66 69 63 0a 2a 2a 20 74 6f  s specific.** to
17100 20 4d 61 63 4f 53 58 20 61 6e 64 20 64 6f 65 73   MacOSX and does
17110 20 6e 6f 74 20 77 6f 72 6b 20 6f 6e 20 6f 74 68   not work on oth
17120 65 72 20 75 6e 69 78 20 70 6c 61 74 66 6f 72 6d  er unix platform
17130 73 2e 20 20 4e 6f 20 61 6c 74 65 72 6e 61 74 69  s.  No alternati
17140 76 65 0a 2a 2a 20 69 73 20 61 76 61 69 6c 61 62  ve.** is availab
17150 6c 65 2e 20 20 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a  le.  .**.*******
17160 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45  ************** E
17170 6e 64 20 6f 66 20 74 68 65 20 4e 46 53 20 6c 6f  nd of the NFS lo
17180 63 6b 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  ck implementatio
17190 6e 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  n **************
171a0 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a  ********.*******
171b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
171c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
171d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
171e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
171f0 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 2a 2a 2a 2a  *******/../*****
17200 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
17210 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
17220 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
17230 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
17240 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a  *********.******
17250 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 4e 6f 6e 2d 6c  ********** Non-l
17260 6f 63 6b 69 6e 67 20 73 71 6c 69 74 65 33 5f 66  ocking sqlite3_f
17270 69 6c 65 20 6d 65 74 68 6f 64 73 20 2a 2a 2a 2a  ile methods ****
17280 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
17290 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20  *********.**.** 
172a0 54 68 65 20 6e 65 78 74 20 64 69 76 69 73 69 6f  The next divisio
172b0 6e 20 63 6f 6e 74 61 69 6e 73 20 69 6d 70 6c 65  n contains imple
172c0 6d 65 6e 74 61 74 69 6f 6e 73 20 66 6f 72 20 61  mentations for a
172d0 6c 6c 20 6d 65 74 68 6f 64 73 20 6f 66 20 74 68  ll methods of th
172e0 65 20 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 66 69  e .** sqlite3_fi
172f0 6c 65 20 6f 62 6a 65 63 74 20 6f 74 68 65 72 20  le object other 
17300 74 68 61 6e 20 74 68 65 20 6c 6f 63 6b 69 6e 67  than the locking
17310 20 6d 65 74 68 6f 64 73 2e 20 20 54 68 65 20 6c   methods.  The l
17320 6f 63 6b 69 6e 67 0a 2a 2a 20 6d 65 74 68 6f 64  ocking.** method
17330 73 20 77 65 72 65 20 64 65 66 69 6e 65 64 20 69  s were defined i
17340 6e 20 64 69 76 69 73 69 6f 6e 73 20 61 62 6f 76  n divisions abov
17350 65 20 28 6f 6e 65 20 6c 6f 63 6b 69 6e 67 20 6d  e (one locking m
17360 65 74 68 6f 64 20 70 65 72 0a 2a 2a 20 64 69 76  ethod per.** div
17370 69 73 69 6f 6e 29 2e 20 20 54 68 6f 73 65 20 6d  ision).  Those m
17380 65 74 68 6f 64 73 20 74 68 61 74 20 61 72 65 20  ethods that are 
17390 63 6f 6d 6d 6f 6e 20 74 6f 20 61 6c 6c 20 6c 6f  common to all lo
173a0 63 6b 69 6e 67 20 6d 6f 64 65 73 0a 2a 2a 20 61  cking modes.** a
173b0 72 65 20 67 61 74 68 65 72 20 74 6f 67 65 74 68  re gather togeth
173c0 65 72 20 69 6e 74 6f 20 74 68 69 73 20 64 69 76  er into this div
173d0 69 73 69 6f 6e 2e 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a  ision..*/../*.**
173e0 20 53 65 65 6b 20 74 6f 20 74 68 65 20 6f 66 66   Seek to the off
173f0 73 65 74 20 70 61 73 73 65 64 20 61 73 20 74 68  set passed as th
17400 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e  e second argumen
17410 74 2c 20 74 68 65 6e 20 72 65 61 64 20 63 6e 74  t, then read cnt
17420 20 0a 2a 2a 20 62 79 74 65 73 20 69 6e 74 6f 20   .** bytes into 
17430 70 42 75 66 2e 20 52 65 74 75 72 6e 20 74 68 65  pBuf. Return the
17440 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   number of bytes
17450 20 61 63 74 75 61 6c 6c 79 20 72 65 61 64 2e 0a   actually read..
17460 2a 2a 0a 2a 2a 20 4e 42 3a 20 20 49 66 20 79 6f  **.** NB:  If yo
17470 75 20 64 65 66 69 6e 65 20 55 53 45 5f 50 52 45  u define USE_PRE
17480 41 44 20 6f 72 20 55 53 45 5f 50 52 45 41 44 36  AD or USE_PREAD6
17490 34 2c 20 74 68 65 6e 20 69 74 20 6d 69 67 68 74  4, then it might
174a0 20 61 6c 73 6f 0a 2a 2a 20 62 65 20 6e 65 63 65   also.** be nece
174b0 73 73 61 72 79 20 74 6f 20 64 65 66 69 6e 65 20  ssary to define 
174c0 5f 58 4f 50 45 4e 5f 53 4f 55 52 43 45 20 74 6f  _XOPEN_SOURCE to
174d0 20 62 65 20 35 30 30 2e 20 20 54 68 69 73 20 76   be 500.  This v
174e0 61 72 69 65 73 20 66 72 6f 6d 0a 2a 2a 20 6f 6e  aries from.** on
174f0 65 20 73 79 73 74 65 6d 20 74 6f 20 61 6e 6f 74  e system to anot
17500 68 65 72 2e 20 20 53 69 6e 63 65 20 53 51 4c 69  her.  Since SQLi
17510 74 65 20 64 6f 65 73 20 6e 6f 74 20 64 65 66 69  te does not defi
17520 6e 65 20 55 53 45 5f 50 52 45 41 44 0a 2a 2a 20  ne USE_PREAD.** 
17530 61 6e 79 20 61 6e 79 20 66 6f 72 6d 20 62 79 20  any any form by 
17540 64 65 66 61 75 6c 74 2c 20 77 65 20 77 69 6c 6c  default, we will
17550 20 6e 6f 74 20 61 74 74 65 6d 70 74 20 74 6f 20   not attempt to 
17560 64 65 66 69 6e 65 20 5f 58 4f 50 45 4e 5f 53 4f  define _XOPEN_SO
17570 55 52 43 45 2e 0a 2a 2a 20 53 65 65 20 74 69 63  URCE..** See tic
17580 6b 65 74 73 20 23 32 37 34 31 20 61 6e 64 20 23  kets #2741 and #
17590 32 36 38 31 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20 61  2681..**.** To a
175a0 76 6f 69 64 20 73 74 6f 6d 70 69 6e 67 20 74 68  void stomping th
175b0 65 20 65 72 72 6e 6f 20 76 61 6c 75 65 20 6f 6e  e errno value on
175c0 20 61 20 66 61 69 6c 65 64 20 72 65 61 64 20 74   a failed read t
175d0 68 65 20 6c 61 73 74 45 72 72 6e 6f 20 76 61 6c  he lastErrno val
175e0 75 65 0a 2a 2a 20 69 73 20 73 65 74 20 62 65 66  ue.** is set bef
175f0 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a  ore returning..*
17600 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 65 65  /.static int see
17610 6b 41 6e 64 52 65 61 64 28 75 6e 69 78 46 69 6c  kAndRead(unixFil
17620 65 20 2a 69 64 2c 20 73 71 6c 69 74 65 33 5f 69  e *id, sqlite3_i
17630 6e 74 36 34 20 6f 66 66 73 65 74 2c 20 76 6f 69  nt64 offset, voi
17640 64 20 2a 70 42 75 66 2c 20 69 6e 74 20 63 6e 74  d *pBuf, int cnt
17650 29 7b 0a 20 20 69 6e 74 20 67 6f 74 3b 0a 23 69  ){.  int got;.#i
17660 66 20 28 21 64 65 66 69 6e 65 64 28 55 53 45 5f  f (!defined(USE_
17670 50 52 45 41 44 29 20 26 26 20 21 64 65 66 69 6e  PREAD) && !defin
17680 65 64 28 55 53 45 5f 50 52 45 41 44 36 34 29 29  ed(USE_PREAD64))
17690 0a 20 20 69 36 34 20 6e 65 77 4f 66 66 73 65 74  .  i64 newOffset
176a0 3b 0a 23 65 6e 64 69 66 0a 20 20 54 49 4d 45 52  ;.#endif.  TIMER
176b0 5f 53 54 41 52 54 3b 0a 23 69 66 20 64 65 66 69  _START;.#if defi
176c0 6e 65 64 28 55 53 45 5f 50 52 45 41 44 29 0a 20  ned(USE_PREAD). 
176d0 20 67 6f 74 20 3d 20 70 72 65 61 64 28 69 64 2d   got = pread(id-
176e0 3e 68 2c 20 70 42 75 66 2c 20 63 6e 74 2c 20 6f  >h, pBuf, cnt, o
176f0 66 66 73 65 74 29 3b 0a 20 20 53 69 6d 75 6c 61  ffset);.  Simula
17700 74 65 49 4f 45 72 72 6f 72 28 20 67 6f 74 20 3d  teIOError( got =
17710 20 2d 31 20 29 3b 0a 23 65 6c 69 66 20 64 65 66   -1 );.#elif def
17720 69 6e 65 64 28 55 53 45 5f 50 52 45 41 44 36 34  ined(USE_PREAD64
17730 29 0a 20 20 67 6f 74 20 3d 20 70 72 65 61 64 36  ).  got = pread6
17740 34 28 69 64 2d 3e 68 2c 20 70 42 75 66 2c 20 63  4(id->h, pBuf, c
17750 6e 74 2c 20 6f 66 66 73 65 74 29 3b 0a 20 20 53  nt, offset);.  S
17760 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20  imulateIOError( 
17770 67 6f 74 20 3d 20 2d 31 20 29 3b 0a 23 65 6c 73  got = -1 );.#els
17780 65 0a 20 20 6e 65 77 4f 66 66 73 65 74 20 3d 20  e.  newOffset = 
17790 6c 73 65 65 6b 28 69 64 2d 3e 68 2c 20 6f 66 66  lseek(id->h, off
177a0 73 65 74 2c 20 53 45 45 4b 5f 53 45 54 29 3b 0a  set, SEEK_SET);.
177b0 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f    SimulateIOErro
177c0 72 28 20 6e 65 77 4f 66 66 73 65 74 2d 2d 20 29  r( newOffset-- )
177d0 3b 0a 20 20 69 66 28 20 6e 65 77 4f 66 66 73 65  ;.  if( newOffse
177e0 74 21 3d 6f 66 66 73 65 74 20 29 7b 0a 20 20 20  t!=offset ){.   
177f0 20 69 66 28 20 6e 65 77 4f 66 66 73 65 74 20 3d   if( newOffset =
17800 3d 20 2d 31 20 29 7b 0a 20 20 20 20 20 20 28 28  = -1 ){.      ((
17810 75 6e 69 78 46 69 6c 65 2a 29 69 64 29 2d 3e 6c  unixFile*)id)->l
17820 61 73 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f  astErrno = errno
17830 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
17840 20 20 20 28 28 75 6e 69 78 46 69 6c 65 2a 29 69     ((unixFile*)i
17850 64 29 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20  d)->lastErrno = 
17860 30 3b 09 09 09 0a 20 20 20 20 7d 0a 20 20 20 20  0;....    }.    
17870 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 7d 0a 20  return -1;.  }. 
17880 20 67 6f 74 20 3d 20 72 65 61 64 28 69 64 2d 3e   got = read(id->
17890 68 2c 20 70 42 75 66 2c 20 63 6e 74 29 3b 0a 23  h, pBuf, cnt);.#
178a0 65 6e 64 69 66 0a 20 20 54 49 4d 45 52 5f 45 4e  endif.  TIMER_EN
178b0 44 3b 0a 20 20 69 66 28 20 67 6f 74 3c 30 20 29  D;.  if( got<0 )
178c0 7b 0a 20 20 20 20 28 28 75 6e 69 78 46 69 6c 65  {.    ((unixFile
178d0 2a 29 69 64 29 2d 3e 6c 61 73 74 45 72 72 6e 6f  *)id)->lastErrno
178e0 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 7d 0a 20 20   = errno;.  }.  
178f0 4f 53 54 52 41 43 45 35 28 22 52 45 41 44 20 20  OSTRACE5("READ  
17900 20 20 25 2d 33 64 20 25 35 64 20 25 37 6c 6c 64    %-3d %5d %7lld
17910 20 25 6c 6c 75 5c 6e 22 2c 20 69 64 2d 3e 68 2c   %llu\n", id->h,
17920 20 67 6f 74 2c 20 6f 66 66 73 65 74 2c 20 54 49   got, offset, TI
17930 4d 45 52 5f 45 4c 41 50 53 45 44 29 3b 0a 20 20  MER_ELAPSED);.  
17940 72 65 74 75 72 6e 20 67 6f 74 3b 0a 7d 0a 0a 2f  return got;.}../
17950 2a 0a 2a 2a 20 52 65 61 64 20 64 61 74 61 20 66  *.** Read data f
17960 72 6f 6d 20 61 20 66 69 6c 65 20 69 6e 74 6f 20  rom a file into 
17970 61 20 62 75 66 66 65 72 2e 20 20 52 65 74 75 72  a buffer.  Retur
17980 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 61  n SQLITE_OK if a
17990 6c 6c 0a 2a 2a 20 62 79 74 65 73 20 77 65 72 65  ll.** bytes were
179a0 20 72 65 61 64 20 73 75 63 63 65 73 73 66 75 6c   read successful
179b0 6c 79 20 61 6e 64 20 53 51 4c 49 54 45 5f 49 4f  ly and SQLITE_IO
179c0 45 52 52 20 69 66 20 61 6e 79 74 68 69 6e 67 20  ERR if anything 
179d0 67 6f 65 73 0a 2a 2a 20 77 72 6f 6e 67 2e 0a 2a  goes.** wrong..*
179e0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69  /.static int uni
179f0 78 52 65 61 64 28 0a 20 20 73 71 6c 69 74 65 33  xRead(.  sqlite3
17a00 5f 66 69 6c 65 20 2a 69 64 2c 20 0a 20 20 76 6f  _file *id, .  vo
17a10 69 64 20 2a 70 42 75 66 2c 20 0a 20 20 69 6e 74  id *pBuf, .  int
17a20 20 61 6d 74 2c 0a 20 20 73 71 6c 69 74 65 33 5f   amt,.  sqlite3_
17a30 69 6e 74 36 34 20 6f 66 66 73 65 74 0a 29 7b 0a  int64 offset.){.
17a40 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c    unixFile *pFil
17a50 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 20 2a 29  e = (unixFile *)
17a60 69 64 3b 0a 20 20 69 6e 74 20 67 6f 74 3b 0a 20  id;.  int got;. 
17a70 20 61 73 73 65 72 74 28 20 69 64 20 29 3b 0a 0a   assert( id );..
17a80 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20    /* If this is 
17a90 61 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  a database file 
17aa0 28 6e 6f 74 20 61 20 6a 6f 75 72 6e 61 6c 2c 20  (not a journal, 
17ab0 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 6f  master-journal o
17ac0 72 20 74 65 6d 70 0a 20 20 2a 2a 20 66 69 6c 65  r temp.  ** file
17ad0 29 2c 20 74 68 65 20 62 79 74 65 73 20 69 6e 20  ), the bytes in 
17ae0 74 68 65 20 6c 6f 63 6b 69 6e 67 20 72 61 6e 67  the locking rang
17af0 65 20 73 68 6f 75 6c 64 20 6e 65 76 65 72 20 62  e should never b
17b00 65 20 72 65 61 64 20 6f 72 20 77 72 69 74 74 65  e read or writte
17b10 6e 2e 20 2a 2f 0a 23 69 66 20 30 0a 20 20 61 73  n. */.#if 0.  as
17b20 73 65 72 74 28 20 70 46 69 6c 65 2d 3e 70 55 6e  sert( pFile->pUn
17b30 75 73 65 64 3d 3d 30 0a 20 20 20 20 20 20 20 7c  used==0.       |
17b40 7c 20 6f 66 66 73 65 74 3e 3d 50 45 4e 44 49 4e  | offset>=PENDIN
17b50 47 5f 42 59 54 45 2b 35 31 32 0a 20 20 20 20 20  G_BYTE+512.     
17b60 20 20 7c 7c 20 6f 66 66 73 65 74 2b 61 6d 74 3c    || offset+amt<
17b70 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 20 0a 20  =PENDING_BYTE . 
17b80 20 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 67 6f   );.#endif..  go
17b90 74 20 3d 20 73 65 65 6b 41 6e 64 52 65 61 64 28  t = seekAndRead(
17ba0 70 46 69 6c 65 2c 20 6f 66 66 73 65 74 2c 20 70  pFile, offset, p
17bb0 42 75 66 2c 20 61 6d 74 29 3b 0a 20 20 69 66 28  Buf, amt);.  if(
17bc0 20 67 6f 74 3d 3d 61 6d 74 20 29 7b 0a 20 20 20   got==amt ){.   
17bd0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
17be0 4b 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 67  K;.  }else if( g
17bf0 6f 74 3c 30 20 29 7b 0a 20 20 20 20 2f 2a 20 6c  ot<0 ){.    /* l
17c00 61 73 74 45 72 72 6e 6f 20 73 65 74 20 62 79 20  astErrno set by 
17c10 73 65 65 6b 41 6e 64 52 65 61 64 20 2a 2f 0a 20  seekAndRead */. 
17c20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
17c30 5f 49 4f 45 52 52 5f 52 45 41 44 3b 0a 20 20 7d  _IOERR_READ;.  }
17c40 65 6c 73 65 7b 0a 20 20 20 20 70 46 69 6c 65 2d  else{.    pFile-
17c50 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 30 3b 20  >lastErrno = 0; 
17c60 2f 2a 20 6e 6f 74 20 61 20 73 79 73 74 65 6d 20  /* not a system 
17c70 65 72 72 6f 72 20 2a 2f 0a 20 20 20 20 2f 2a 20  error */.    /* 
17c80 55 6e 72 65 61 64 20 70 61 72 74 73 20 6f 66 20  Unread parts of 
17c90 74 68 65 20 62 75 66 66 65 72 20 6d 75 73 74 20  the buffer must 
17ca0 62 65 20 7a 65 72 6f 2d 66 69 6c 6c 65 64 20 2a  be zero-filled *
17cb0 2f 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 28 28  /.    memset(&((
17cc0 63 68 61 72 2a 29 70 42 75 66 29 5b 67 6f 74 5d  char*)pBuf)[got]
17cd0 2c 20 30 2c 20 61 6d 74 2d 67 6f 74 29 3b 0a 20  , 0, amt-got);. 
17ce0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
17cf0 5f 49 4f 45 52 52 5f 53 48 4f 52 54 5f 52 45 41  _IOERR_SHORT_REA
17d00 44 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  D;.  }.}../*.** 
17d10 53 65 65 6b 20 74 6f 20 74 68 65 20 6f 66 66 73  Seek to the offs
17d20 65 74 20 69 6e 20 69 64 2d 3e 6f 66 66 73 65 74  et in id->offset
17d30 20 74 68 65 6e 20 72 65 61 64 20 63 6e 74 20 62   then read cnt b
17d40 79 74 65 73 20 69 6e 74 6f 20 70 42 75 66 2e 0a  ytes into pBuf..
17d50 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75  ** Return the nu
17d60 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 61 63  mber of bytes ac
17d70 74 75 61 6c 6c 79 20 72 65 61 64 2e 20 20 55 70  tually read.  Up
17d80 64 61 74 65 20 74 68 65 20 6f 66 66 73 65 74 2e  date the offset.
17d90 0a 2a 2a 0a 2a 2a 20 54 6f 20 61 76 6f 69 64 20  .**.** To avoid 
17da0 73 74 6f 6d 70 69 6e 67 20 74 68 65 20 65 72 72  stomping the err
17db0 6e 6f 20 76 61 6c 75 65 20 6f 6e 20 61 20 66 61  no value on a fa
17dc0 69 6c 65 64 20 77 72 69 74 65 20 74 68 65 20 6c  iled write the l
17dd0 61 73 74 45 72 72 6e 6f 20 76 61 6c 75 65 0a 2a  astErrno value.*
17de0 2a 20 69 73 20 73 65 74 20 62 65 66 6f 72 65 20  * is set before 
17df0 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2f 0a 73 74  returning..*/.st
17e00 61 74 69 63 20 69 6e 74 20 73 65 65 6b 41 6e 64  atic int seekAnd
17e10 57 72 69 74 65 28 75 6e 69 78 46 69 6c 65 20 2a  Write(unixFile *
17e20 69 64 2c 20 69 36 34 20 6f 66 66 73 65 74 2c 20  id, i64 offset, 
17e30 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 42 75 66  const void *pBuf
17e40 2c 20 69 6e 74 20 63 6e 74 29 7b 0a 20 20 69 6e  , int cnt){.  in
17e50 74 20 67 6f 74 3b 0a 23 69 66 20 28 21 64 65 66  t got;.#if (!def
17e60 69 6e 65 64 28 55 53 45 5f 50 52 45 41 44 29 20  ined(USE_PREAD) 
17e70 26 26 20 21 64 65 66 69 6e 65 64 28 55 53 45 5f  && !defined(USE_
17e80 50 52 45 41 44 36 34 29 29 0a 20 20 69 36 34 20  PREAD64)).  i64 
17e90 6e 65 77 4f 66 66 73 65 74 3b 0a 23 65 6e 64 69  newOffset;.#endi
17ea0 66 0a 20 20 54 49 4d 45 52 5f 53 54 41 52 54 3b  f.  TIMER_START;
17eb0 0a 23 69 66 20 64 65 66 69 6e 65 64 28 55 53 45  .#if defined(USE
17ec0 5f 50 52 45 41 44 29 0a 20 20 67 6f 74 20 3d 20  _PREAD).  got = 
17ed0 70 77 72 69 74 65 28 69 64 2d 3e 68 2c 20 70 42  pwrite(id->h, pB
17ee0 75 66 2c 20 63 6e 74 2c 20 6f 66 66 73 65 74 29  uf, cnt, offset)
17ef0 3b 0a 23 65 6c 69 66 20 64 65 66 69 6e 65 64 28  ;.#elif defined(
17f00 55 53 45 5f 50 52 45 41 44 36 34 29 0a 20 20 67  USE_PREAD64).  g
17f10 6f 74 20 3d 20 70 77 72 69 74 65 36 34 28 69 64  ot = pwrite64(id
17f20 2d 3e 68 2c 20 70 42 75 66 2c 20 63 6e 74 2c 20  ->h, pBuf, cnt, 
17f30 6f 66 66 73 65 74 29 3b 0a 23 65 6c 73 65 0a 20  offset);.#else. 
17f40 20 6e 65 77 4f 66 66 73 65 74 20 3d 20 6c 73 65   newOffset = lse
17f50 65 6b 28 69 64 2d 3e 68 2c 20 6f 66 66 73 65 74  ek(id->h, offset
17f60 2c 20 53 45 45 4b 5f 53 45 54 29 3b 0a 20 20 69  , SEEK_SET);.  i
17f70 66 28 20 6e 65 77 4f 66 66 73 65 74 21 3d 6f 66  f( newOffset!=of
17f80 66 73 65 74 20 29 7b 0a 20 20 20 20 69 66 28 20  fset ){.    if( 
17f90 6e 65 77 4f 66 66 73 65 74 20 3d 3d 20 2d 31 20  newOffset == -1 
17fa0 29 7b 0a 20 20 20 20 20 20 28 28 75 6e 69 78 46  ){.      ((unixF
17fb0 69 6c 65 2a 29 69 64 29 2d 3e 6c 61 73 74 45 72  ile*)id)->lastEr
17fc0 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20  rno = errno;.   
17fd0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 28 28   }else{.      ((
17fe0 75 6e 69 78 46 69 6c 65 2a 29 69 64 29 2d 3e 6c  unixFile*)id)->l
17ff0 61 73 74 45 72 72 6e 6f 20 3d 20 30 3b 09 09 09  astErrno = 0;...
18000 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72  .    }.    retur
18010 6e 20 2d 31 3b 0a 20 20 7d 0a 20 20 67 6f 74 20  n -1;.  }.  got 
18020 3d 20 77 72 69 74 65 28 69 64 2d 3e 68 2c 20 70  = write(id->h, p
18030 42 75 66 2c 20 63 6e 74 29 3b 0a 23 65 6e 64 69  Buf, cnt);.#endi
18040 66 0a 20 20 54 49 4d 45 52 5f 45 4e 44 3b 0a 20  f.  TIMER_END;. 
18050 20 69 66 28 20 67 6f 74 3c 30 20 29 7b 0a 20 20   if( got<0 ){.  
18060 20 20 28 28 75 6e 69 78 46 69 6c 65 2a 29 69 64    ((unixFile*)id
18070 29 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 65  )->lastErrno = e
18080 72 72 6e 6f 3b 0a 20 20 7d 0a 0a 20 20 4f 53 54  rrno;.  }..  OST
18090 52 41 43 45 35 28 22 57 52 49 54 45 20 20 20 25  RACE5("WRITE   %
180a0 2d 33 64 20 25 35 64 20 25 37 6c 6c 64 20 25 6c  -3d %5d %7lld %l
180b0 6c 75 5c 6e 22 2c 20 69 64 2d 3e 68 2c 20 67 6f  lu\n", id->h, go
180c0 74 2c 20 6f 66 66 73 65 74 2c 20 54 49 4d 45 52  t, offset, TIMER
180d0 5f 45 4c 41 50 53 45 44 29 3b 0a 20 20 72 65 74  _ELAPSED);.  ret
180e0 75 72 6e 20 67 6f 74 3b 0a 7d 0a 0a 0a 2f 2a 0a  urn got;.}.../*.
180f0 2a 2a 20 57 72 69 74 65 20 64 61 74 61 20 66 72  ** Write data fr
18100 6f 6d 20 61 20 62 75 66 66 65 72 20 69 6e 74 6f  om a buffer into
18110 20 61 20 66 69 6c 65 2e 20 20 52 65 74 75 72 6e   a file.  Return
18120 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75   SQLITE_OK on su
18130 63 63 65 73 73 0a 2a 2a 20 6f 72 20 73 6f 6d 65  ccess.** or some
18140 20 6f 74 68 65 72 20 65 72 72 6f 72 20 63 6f 64   other error cod
18150 65 20 6f 6e 20 66 61 69 6c 75 72 65 2e 0a 2a 2f  e on failure..*/
18160 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78  .static int unix
18170 57 72 69 74 65 28 0a 20 20 73 71 6c 69 74 65 33  Write(.  sqlite3
18180 5f 66 69 6c 65 20 2a 69 64 2c 20 0a 20 20 63 6f  _file *id, .  co
18190 6e 73 74 20 76 6f 69 64 20 2a 70 42 75 66 2c 20  nst void *pBuf, 
181a0 0a 20 20 69 6e 74 20 61 6d 74 2c 0a 20 20 73 71  .  int amt,.  sq
181b0 6c 69 74 65 33 5f 69 6e 74 36 34 20 6f 66 66 73  lite3_int64 offs
181c0 65 74 20 0a 29 7b 0a 20 20 75 6e 69 78 46 69 6c  et .){.  unixFil
181d0 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78  e *pFile = (unix
181e0 46 69 6c 65 2a 29 69 64 3b 0a 20 20 69 6e 74 20  File*)id;.  int 
181f0 77 72 6f 74 65 20 3d 20 30 3b 0a 20 20 61 73 73  wrote = 0;.  ass
18200 65 72 74 28 20 69 64 20 29 3b 0a 20 20 61 73 73  ert( id );.  ass
18210 65 72 74 28 20 61 6d 74 3e 30 20 29 3b 0a 0a 20  ert( amt>0 );.. 
18220 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20 61   /* If this is a
18230 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 28   database file (
18240 6e 6f 74 20 61 20 6a 6f 75 72 6e 61 6c 2c 20 6d  not a journal, m
18250 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 6f 72  aster-journal or
18260 20 74 65 6d 70 0a 20 20 2a 2a 20 66 69 6c 65 29   temp.  ** file)
18270 2c 20 74 68 65 20 62 79 74 65 73 20 69 6e 20 74  , the bytes in t
18280 68 65 20 6c 6f 63 6b 69 6e 67 20 72 61 6e 67 65  he locking range
18290 20 73 68 6f 75 6c 64 20 6e 65 76 65 72 20 62 65   should never be
182a0 20 72 65 61 64 20 6f 72 20 77 72 69 74 74 65 6e   read or written
182b0 2e 20 2a 2f 0a 23 69 66 20 30 0a 20 20 61 73 73  . */.#if 0.  ass
182c0 65 72 74 28 20 70 46 69 6c 65 2d 3e 70 55 6e 75  ert( pFile->pUnu
182d0 73 65 64 3d 3d 30 0a 20 20 20 20 20 20 20 7c 7c  sed==0.       ||
182e0 20 6f 66 66 73 65 74 3e 3d 50 45 4e 44 49 4e 47   offset>=PENDING
182f0 5f 42 59 54 45 2b 35 31 32 0a 20 20 20 20 20 20  _BYTE+512.      
18300 20 7c 7c 20 6f 66 66 73 65 74 2b 61 6d 74 3c 3d   || offset+amt<=
18310 50 45 4e 44 49 4e 47 5f 42 59 54 45 20 0a 20 20  PENDING_BYTE .  
18320 29 3b 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64  );.#endif..#ifnd
18330 65 66 20 4e 44 45 42 55 47 0a 20 20 2f 2a 20 49  ef NDEBUG.  /* I
18340 66 20 77 65 20 61 72 65 20 64 6f 69 6e 67 20 61  f we are doing a
18350 20 6e 6f 72 6d 61 6c 20 77 72 69 74 65 20 74 6f   normal write to
18360 20 61 20 64 61 74 61 62 61 73 65 20 66 69 6c 65   a database file
18370 20 28 61 73 20 6f 70 70 6f 73 65 64 20 74 6f 0a   (as opposed to.
18380 20 20 2a 2a 20 64 6f 69 6e 67 20 61 20 68 6f 74    ** doing a hot
18390 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61 63  -journal rollbac
183a0 6b 20 6f 72 20 61 20 77 72 69 74 65 20 74 6f 20  k or a write to 
183b0 73 6f 6d 65 20 66 69 6c 65 20 6f 74 68 65 72 20  some file other 
183c0 74 68 61 6e 20 61 0a 20 20 2a 2a 20 6e 6f 72 6d  than a.  ** norm
183d0 61 6c 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  al database file
183e0 29 20 74 68 65 6e 20 72 65 63 6f 72 64 20 74 68  ) then record th
183f0 65 20 66 61 63 74 20 74 68 61 74 20 74 68 65 20  e fact that the 
18400 64 61 74 61 62 61 73 65 0a 20 20 2a 2a 20 68 61  database.  ** ha
18410 73 20 63 68 61 6e 67 65 64 2e 20 20 49 66 20 74  s changed.  If t
18420 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63  he transaction c
18430 6f 75 6e 74 65 72 20 69 73 20 6d 6f 64 69 66 69  ounter is modifi
18440 65 64 2c 20 72 65 63 6f 72 64 20 74 68 61 74 0a  ed, record that.
18450 20 20 2a 2a 20 66 61 63 74 20 74 6f 6f 2e 0a 20    ** fact too.. 
18460 20 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c 65 2d   */.  if( pFile-
18470 3e 69 6e 4e 6f 72 6d 61 6c 57 72 69 74 65 20 29  >inNormalWrite )
18480 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 64 62 55  {.    pFile->dbU
18490 70 64 61 74 65 20 3d 20 31 3b 20 20 2f 2a 20 54  pdate = 1;  /* T
184a0 68 65 20 64 61 74 61 62 61 73 65 20 68 61 73 20  he database has 
184b0 62 65 65 6e 20 6d 6f 64 69 66 69 65 64 20 2a 2f  been modified */
184c0 0a 20 20 20 20 69 66 28 20 6f 66 66 73 65 74 3c  .    if( offset<
184d0 3d 32 34 20 26 26 20 6f 66 66 73 65 74 2b 61 6d  =24 && offset+am
184e0 74 3e 3d 32 37 20 29 7b 0a 20 20 20 20 20 20 69  t>=27 ){.      i
184f0 6e 74 20 72 63 3b 0a 20 20 20 20 20 20 63 68 61  nt rc;.      cha
18500 72 20 6f 6c 64 43 6e 74 72 5b 34 5d 3b 0a 20 20  r oldCntr[4];.  
18510 20 20 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72      SimulateIOEr
18520 72 6f 72 42 65 6e 69 67 6e 28 31 29 3b 0a 20 20  rorBenign(1);.  
18530 20 20 20 20 72 63 20 3d 20 73 65 65 6b 41 6e 64      rc = seekAnd
18540 52 65 61 64 28 70 46 69 6c 65 2c 20 32 34 2c 20  Read(pFile, 24, 
18550 6f 6c 64 43 6e 74 72 2c 20 34 29 3b 0a 20 20 20  oldCntr, 4);.   
18560 20 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72     SimulateIOErr
18570 6f 72 42 65 6e 69 67 6e 28 30 29 3b 0a 20 20 20  orBenign(0);.   
18580 20 20 20 69 66 28 20 72 63 21 3d 34 20 7c 7c 20     if( rc!=4 || 
18590 6d 65 6d 63 6d 70 28 6f 6c 64 43 6e 74 72 2c 20  memcmp(oldCntr, 
185a0 26 28 28 63 68 61 72 2a 29 70 42 75 66 29 5b 32  &((char*)pBuf)[2
185b0 34 2d 6f 66 66 73 65 74 5d 2c 20 34 29 21 3d 30  4-offset], 4)!=0
185c0 20 29 7b 0a 20 20 20 20 20 20 20 20 70 46 69 6c   ){.        pFil
185d0 65 2d 3e 74 72 61 6e 73 43 6e 74 72 43 68 6e 67  e->transCntrChng
185e0 20 3d 20 31 3b 20 20 2f 2a 20 54 68 65 20 74 72   = 1;  /* The tr
185f0 61 6e 73 61 63 74 69 6f 6e 20 63 6f 75 6e 74 65  ansaction counte
18600 72 20 68 61 73 20 63 68 61 6e 67 65 64 20 2a 2f  r has changed */
18610 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
18620 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 77 68 69   }.#endif..  whi
18630 6c 65 28 20 61 6d 74 3e 30 20 26 26 20 28 77 72  le( amt>0 && (wr
18640 6f 74 65 20 3d 20 73 65 65 6b 41 6e 64 57 72 69  ote = seekAndWri
18650 74 65 28 70 46 69 6c 65 2c 20 6f 66 66 73 65 74  te(pFile, offset
18660 2c 20 70 42 75 66 2c 20 61 6d 74 29 29 3e 30 20  , pBuf, amt))>0 
18670 29 7b 0a 20 20 20 20 61 6d 74 20 2d 3d 20 77 72  ){.    amt -= wr
18680 6f 74 65 3b 0a 20 20 20 20 6f 66 66 73 65 74 20  ote;.    offset 
18690 2b 3d 20 77 72 6f 74 65 3b 0a 20 20 20 20 70 42  += wrote;.    pB
186a0 75 66 20 3d 20 26 28 28 63 68 61 72 2a 29 70 42  uf = &((char*)pB
186b0 75 66 29 5b 77 72 6f 74 65 5d 3b 0a 20 20 7d 0a  uf)[wrote];.  }.
186c0 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f    SimulateIOErro
186d0 72 28 28 20 77 72 6f 74 65 3d 28 2d 31 29 2c 20  r(( wrote=(-1), 
186e0 61 6d 74 3d 31 20 29 29 3b 0a 20 20 53 69 6d 75  amt=1 ));.  Simu
186f0 6c 61 74 65 44 69 73 6b 66 75 6c 6c 45 72 72 6f  lateDiskfullErro
18700 72 28 28 20 77 72 6f 74 65 3d 30 2c 20 61 6d 74  r(( wrote=0, amt
18710 3d 31 20 29 29 3b 0a 20 20 69 66 28 20 61 6d 74  =1 ));.  if( amt
18720 3e 30 20 29 7b 0a 20 20 20 20 69 66 28 20 77 72  >0 ){.    if( wr
18730 6f 74 65 3c 30 20 29 7b 0a 20 20 20 20 20 20 2f  ote<0 ){.      /
18740 2a 20 6c 61 73 74 45 72 72 6e 6f 20 73 65 74 20  * lastErrno set 
18750 62 79 20 73 65 65 6b 41 6e 64 57 72 69 74 65 20  by seekAndWrite 
18760 2a 2f 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  */.      return 
18770 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 57 52 49  SQLITE_IOERR_WRI
18780 54 45 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  TE;.    }else{. 
18790 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74       pFile->last
187a0 45 72 72 6e 6f 20 3d 20 30 3b 20 2f 2a 20 6e 6f  Errno = 0; /* no
187b0 74 20 61 20 73 79 73 74 65 6d 20 65 72 72 6f 72  t a system error
187c0 20 2a 2f 0a 20 20 20 20 20 20 72 65 74 75 72 6e   */.      return
187d0 20 53 51 4c 49 54 45 5f 46 55 4c 4c 3b 0a 20 20   SQLITE_FULL;.  
187e0 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
187f0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23   SQLITE_OK;.}..#
18800 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53  ifdef SQLITE_TES
18810 54 0a 2f 2a 0a 2a 2a 20 43 6f 75 6e 74 20 74 68  T./*.** Count th
18820 65 20 6e 75 6d 62 65 72 20 6f 66 20 66 75 6c 6c  e number of full
18830 73 79 6e 63 73 20 61 6e 64 20 6e 6f 72 6d 61 6c  syncs and normal
18840 20 73 79 6e 63 73 2e 20 20 54 68 69 73 20 69 73   syncs.  This is
18850 20 75 73 65 64 20 74 6f 20 74 65 73 74 0a 2a 2a   used to test.**
18860 20 74 68 61 74 20 73 79 6e 63 73 20 61 6e 64 20   that syncs and 
18870 66 75 6c 6c 73 79 6e 63 73 20 61 72 65 20 6f 63  fullsyncs are oc
18880 63 75 72 72 69 6e 67 20 61 74 20 74 68 65 20 72  curring at the r
18890 69 67 68 74 20 74 69 6d 65 73 2e 0a 2a 2f 0a 69  ight times..*/.i
188a0 6e 74 20 73 71 6c 69 74 65 33 5f 73 79 6e 63 5f  nt sqlite3_sync_
188b0 63 6f 75 6e 74 20 3d 20 30 3b 0a 69 6e 74 20 73  count = 0;.int s
188c0 71 6c 69 74 65 33 5f 66 75 6c 6c 73 79 6e 63 5f  qlite3_fullsync_
188d0 63 6f 75 6e 74 20 3d 20 30 3b 0a 23 65 6e 64 69  count = 0;.#endi
188e0 66 0a 0a 2f 2a 0a 2a 2a 20 57 65 20 64 6f 20 6e  f../*.** We do n
188f0 6f 74 20 74 72 75 73 74 20 73 79 73 74 65 6d 73  ot trust systems
18900 20 74 6f 20 70 72 6f 76 69 64 65 20 61 20 77 6f   to provide a wo
18910 72 6b 69 6e 67 20 66 64 61 74 61 73 79 6e 63 28  rking fdatasync(
18920 29 2e 20 20 53 6f 6d 65 20 64 6f 2e 0a 2a 2a 20  ).  Some do..** 
18930 4f 74 68 65 72 73 20 64 6f 20 6e 6f 2e 20 20 54  Others do no.  T
18940 6f 20 62 65 20 73 61 66 65 2c 20 77 65 20 77 69  o be safe, we wi
18950 6c 6c 20 73 74 69 63 6b 20 77 69 74 68 20 74 68  ll stick with th
18960 65 20 28 73 6c 6f 77 65 72 29 20 66 73 79 6e 63  e (slower) fsync
18970 28 29 2e 0a 2a 2a 20 49 66 20 79 6f 75 20 6b 6e  ()..** If you kn
18980 6f 77 20 74 68 61 74 20 79 6f 75 72 20 73 79 73  ow that your sys
18990 74 65 6d 20 64 6f 65 73 20 73 75 70 70 6f 72 74  tem does support
189a0 20 66 64 61 74 61 73 79 6e 63 28 29 20 63 6f 72   fdatasync() cor
189b0 72 65 63 74 6c 79 2c 0a 2a 2a 20 74 68 65 6e 20  rectly,.** then 
189c0 73 69 6d 70 6c 79 20 63 6f 6d 70 69 6c 65 20 77  simply compile w
189d0 69 74 68 20 2d 44 66 64 61 74 61 73 79 6e 63 3d  ith -Dfdatasync=
189e0 66 64 61 74 61 73 79 6e 63 0a 2a 2f 0a 23 69 66  fdatasync.*/.#if
189f0 20 21 64 65 66 69 6e 65 64 28 66 64 61 74 61 73   !defined(fdatas
18a00 79 6e 63 29 20 26 26 20 21 64 65 66 69 6e 65 64  ync) && !defined
18a10 28 5f 5f 6c 69 6e 75 78 5f 5f 29 0a 23 20 64 65  (__linux__).# de
18a20 66 69 6e 65 20 66 64 61 74 61 73 79 6e 63 20 66  fine fdatasync f
18a30 73 79 6e 63 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  sync.#endif../*.
18a40 2a 2a 20 44 65 66 69 6e 65 20 48 41 56 45 5f 46  ** Define HAVE_F
18a50 55 4c 4c 46 53 59 4e 43 20 74 6f 20 30 20 6f 72  ULLFSYNC to 0 or
18a60 20 31 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e 20   1 depending on 
18a70 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 0a 2a  whether or not.*
18a80 2a 20 74 68 65 20 46 5f 46 55 4c 4c 46 53 59 4e  * the F_FULLFSYN
18a90 43 20 6d 61 63 72 6f 20 69 73 20 64 65 66 69 6e  C macro is defin
18aa0 65 64 2e 20 20 46 5f 46 55 4c 4c 46 53 59 4e 43  ed.  F_FULLFSYNC
18ab0 20 69 73 20 63 75 72 72 65 6e 74 6c 79 0a 2a 2a   is currently.**
18ac0 20 6f 6e 6c 79 20 61 76 61 69 6c 61 62 6c 65 20   only available 
18ad0 6f 6e 20 4d 61 63 20 4f 53 20 58 2e 20 20 42 75  on Mac OS X.  Bu
18ae0 74 20 74 68 61 74 20 63 6f 75 6c 64 20 63 68 61  t that could cha
18af0 6e 67 65 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 46  nge..*/.#ifdef F
18b00 5f 46 55 4c 4c 46 53 59 4e 43 0a 23 20 64 65 66  _FULLFSYNC.# def
18b10 69 6e 65 20 48 41 56 45 5f 46 55 4c 4c 46 53 59  ine HAVE_FULLFSY
18b20 4e 43 20 31 0a 23 65 6c 73 65 0a 23 20 64 65 66  NC 1.#else.# def
18b30 69 6e 65 20 48 41 56 45 5f 46 55 4c 4c 46 53 59  ine HAVE_FULLFSY
18b40 4e 43 20 30 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a  NC 0.#endif.../*
18b50 0a 2a 2a 20 54 68 65 20 66 73 79 6e 63 28 29 20  .** The fsync() 
18b60 73 79 73 74 65 6d 20 63 61 6c 6c 20 64 6f 65 73  system call does
18b70 20 6e 6f 74 20 77 6f 72 6b 20 61 73 20 61 64 76   not work as adv
18b80 65 72 74 69 73 65 64 20 6f 6e 20 6d 61 6e 79 0a  ertised on many.
18b90 2a 2a 20 75 6e 69 78 20 73 79 73 74 65 6d 73 2e  ** unix systems.
18ba0 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20    The following 
18bb0 70 72 6f 63 65 64 75 72 65 20 69 73 20 61 6e 20  procedure is an 
18bc0 61 74 74 65 6d 70 74 20 74 6f 20 6d 61 6b 65 0a  attempt to make.
18bd0 2a 2a 20 69 74 20 77 6f 72 6b 20 62 65 74 74 65  ** it work bette
18be0 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 53 51 4c  r..**.** The SQL
18bf0 49 54 45 5f 4e 4f 5f 53 59 4e 43 20 6d 61 63 72  ITE_NO_SYNC macr
18c00 6f 20 64 69 73 61 62 6c 65 73 20 61 6c 6c 20 66  o disables all f
18c10 73 79 6e 63 28 29 73 2e 20 20 54 68 69 73 20 69  sync()s.  This i
18c20 73 20 75 73 65 66 75 6c 0a 2a 2a 20 66 6f 72 20  s useful.** for 
18c30 74 65 73 74 69 6e 67 20 77 68 65 6e 20 77 65 20  testing when we 
18c40 77 61 6e 74 20 74 6f 20 72 75 6e 20 74 68 72 6f  want to run thro
18c50 75 67 68 20 74 68 65 20 74 65 73 74 20 73 75 69  ugh the test sui
18c60 74 65 20 71 75 69 63 6b 6c 79 2e 0a 2a 2a 20 59  te quickly..** Y
18c70 6f 75 20 61 72 65 20 73 74 72 6f 6e 67 6c 79 20  ou are strongly 
18c80 61 64 76 69 73 65 64 20 2a 6e 6f 74 2a 20 74 6f  advised *not* to
18c90 20 64 65 70 6c 6f 79 20 77 69 74 68 20 53 51 4c   deploy with SQL
18ca0 49 54 45 5f 4e 4f 5f 53 59 4e 43 0a 2a 2a 20 65  ITE_NO_SYNC.** e
18cb0 6e 61 62 6c 65 64 2c 20 68 6f 77 65 76 65 72 2c  nabled, however,
18cc0 20 73 69 6e 63 65 20 77 69 74 68 20 53 51 4c 49   since with SQLI
18cd0 54 45 5f 4e 4f 5f 53 59 4e 43 20 65 6e 61 62 6c  TE_NO_SYNC enabl
18ce0 65 64 2c 20 61 6e 20 4f 53 20 63 72 61 73 68 0a  ed, an OS crash.
18cf0 2a 2a 20 6f 72 20 70 6f 77 65 72 20 66 61 69 6c  ** or power fail
18d00 75 72 65 20 77 69 6c 6c 20 6c 69 6b 65 6c 79 20  ure will likely 
18d10 63 6f 72 72 75 70 74 20 74 68 65 20 64 61 74 61  corrupt the data
18d20 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a  base file..**.**
18d30 20 53 51 4c 69 74 65 20 73 65 74 73 20 74 68 65   SQLite sets the
18d40 20 64 61 74 61 4f 6e 6c 79 20 66 6c 61 67 20 69   dataOnly flag i
18d50 66 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68  f the size of th
18d60 65 20 66 69 6c 65 20 69 73 20 75 6e 63 68 61 6e  e file is unchan
18d70 67 65 64 2e 0a 2a 2a 20 54 68 65 20 69 64 65 61  ged..** The idea
18d80 20 62 65 68 69 6e 64 20 64 61 74 61 4f 6e 6c 79   behind dataOnly
18d90 20 69 73 20 74 68 61 74 20 69 74 20 73 68 6f 75   is that it shou
18da0 6c 64 20 6f 6e 6c 79 20 77 72 69 74 65 20 74 68  ld only write th
18db0 65 20 66 69 6c 65 20 63 6f 6e 74 65 6e 74 0a 2a  e file content.*
18dc0 2a 20 74 6f 20 64 69 73 6b 2c 20 6e 6f 74 20 74  * to disk, not t
18dd0 68 65 20 69 6e 6f 64 65 2e 20 20 57 65 20 6f 6e  he inode.  We on
18de0 6c 79 20 73 65 74 20 64 61 74 61 4f 6e 6c 79 20  ly set dataOnly 
18df0 69 66 20 74 68 65 20 66 69 6c 65 20 73 69 7a 65  if the file size
18e00 20 69 73 20 0a 2a 2a 20 75 6e 63 68 61 6e 67 65   is .** unchange
18e10 64 20 73 69 6e 63 65 20 74 68 65 20 66 69 6c 65  d since the file
18e20 20 73 69 7a 65 20 69 73 20 70 61 72 74 20 6f 66   size is part of
18e30 20 74 68 65 20 69 6e 6f 64 65 2e 20 20 48 6f 77   the inode.  How
18e40 65 76 65 72 2c 20 0a 2a 2a 20 54 65 64 20 54 73  ever, .** Ted Ts
18e50 27 6f 20 74 65 6c 6c 73 20 75 73 20 74 68 61 74  'o tells us that
18e60 20 66 64 61 74 61 73 79 6e 63 28 29 20 77 69 6c   fdatasync() wil
18e70 6c 20 61 6c 73 6f 20 77 72 69 74 65 20 74 68 65  l also write the
18e80 20 69 6e 6f 64 65 20 69 66 20 74 68 65 0a 2a 2a   inode if the.**
18e90 20 66 69 6c 65 20 73 69 7a 65 20 68 61 73 20 63   file size has c
18ea0 68 61 6e 67 65 64 2e 20 20 54 68 65 20 6f 6e 6c  hanged.  The onl
18eb0 79 20 72 65 61 6c 20 64 69 66 66 65 72 65 6e 63  y real differenc
18ec0 65 20 62 65 74 77 65 65 6e 20 66 64 61 74 61 73  e between fdatas
18ed0 79 6e 63 28 29 0a 2a 2a 20 61 6e 64 20 66 73 79  ync().** and fsy
18ee0 6e 63 28 29 2c 20 54 65 64 20 74 65 6c 6c 73 20  nc(), Ted tells 
18ef0 75 73 2c 20 69 73 20 74 68 61 74 20 66 64 61 74  us, is that fdat
18f00 61 73 79 6e 63 28 29 20 77 69 6c 6c 20 6e 6f 74  async() will not
18f10 20 66 6c 75 73 68 20 74 68 65 0a 2a 2a 20 69 6e   flush the.** in
18f20 6f 64 65 20 69 66 20 74 68 65 20 6d 74 69 6d 65  ode if the mtime
18f30 20 6f 72 20 6f 77 6e 65 72 20 6f 72 20 6f 74 68   or owner or oth
18f40 65 72 20 69 6e 6f 64 65 20 61 74 74 72 69 62 75  er inode attribu
18f50 74 65 73 20 68 61 76 65 20 63 68 61 6e 67 65 64  tes have changed
18f60 2e 0a 2a 2a 20 57 65 20 6f 6e 6c 79 20 63 61 72  ..** We only car
18f70 65 20 61 62 6f 75 74 20 74 68 65 20 66 69 6c 65  e about the file
18f80 20 73 69 7a 65 2c 20 6e 6f 74 20 74 68 65 20 6f   size, not the o
18f90 74 68 65 72 20 66 69 6c 65 20 61 74 74 72 69 62  ther file attrib
18fa0 75 74 65 73 2c 20 73 6f 0a 2a 2a 20 61 73 20 66  utes, so.** as f
18fb0 61 72 20 61 73 20 53 51 4c 69 74 65 20 69 73 20  ar as SQLite is 
18fc0 63 6f 6e 63 65 72 6e 65 64 2c 20 61 6e 20 66 64  concerned, an fd
18fd0 61 74 61 73 79 6e 63 28 29 20 69 73 20 61 6c 77  atasync() is alw
18fe0 61 79 73 20 61 64 65 71 75 61 74 65 2e 0a 2a 2a  ays adequate..**
18ff0 20 53 6f 2c 20 77 65 20 61 6c 77 61 79 73 20 75   So, we always u
19000 73 65 20 66 64 61 74 61 73 79 6e 63 28 29 20 69  se fdatasync() i
19010 66 20 69 74 20 69 73 20 61 76 61 69 6c 61 62 6c  f it is availabl
19020 65 2c 20 72 65 67 61 72 64 6c 65 73 73 20 6f 66  e, regardless of
19030 0a 2a 2a 20 74 68 65 20 76 61 6c 75 65 20 6f 66  .** the value of
19040 20 74 68 65 20 64 61 74 61 4f 6e 6c 79 20 66 6c   the dataOnly fl
19050 61 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ag..*/.static in
19060 74 20 66 75 6c 6c 5f 66 73 79 6e 63 28 69 6e 74  t full_fsync(int
19070 20 66 64 2c 20 69 6e 74 20 66 75 6c 6c 53 79 6e   fd, int fullSyn
19080 63 2c 20 69 6e 74 20 64 61 74 61 4f 6e 6c 79 29  c, int dataOnly)
19090 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 2f  {.  int rc;..  /
190a0 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * The following 
190b0 22 69 66 64 65 66 2f 65 6c 69 66 2f 65 6c 73 65  "ifdef/elif/else
190c0 2f 22 20 62 6c 6f 63 6b 20 68 61 73 20 74 68 65  /" block has the
190d0 20 73 61 6d 65 20 73 74 72 75 63 74 75 72 65 20   same structure 
190e0 61 73 0a 20 20 2a 2a 20 74 68 65 20 6f 6e 65 20  as.  ** the one 
190f0 62 65 6c 6f 77 2e 20 49 74 20 69 73 20 72 65 70  below. It is rep
19100 6c 69 63 61 74 65 64 20 68 65 72 65 20 73 6f 6c  licated here sol
19110 65 6c 79 20 74 6f 20 61 76 6f 69 64 20 63 6c 75  ely to avoid clu
19120 74 74 65 72 69 6e 67 20 0a 20 20 2a 2a 20 75 70  ttering .  ** up
19130 20 74 68 65 20 72 65 61 6c 20 63 6f 64 65 20 77   the real code w
19140 69 74 68 20 74 68 65 20 55 4e 55 53 45 44 5f 50  ith the UNUSED_P
19150 41 52 41 4d 45 54 45 52 28 29 20 6d 61 63 72 6f  ARAMETER() macro
19160 73 2e 0a 20 20 2a 2f 0a 23 69 66 64 65 66 20 53  s..  */.#ifdef S
19170 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e 43 0a 20 20  QLITE_NO_SYNC.  
19180 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
19190 28 66 64 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50  (fd);.  UNUSED_P
191a0 41 52 41 4d 45 54 45 52 28 66 75 6c 6c 53 79 6e  ARAMETER(fullSyn
191b0 63 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  c);.  UNUSED_PAR
191c0 41 4d 45 54 45 52 28 64 61 74 61 4f 6e 6c 79 29  AMETER(dataOnly)
191d0 3b 0a 23 65 6c 69 66 20 48 41 56 45 5f 46 55 4c  ;.#elif HAVE_FUL
191e0 4c 46 53 59 4e 43 0a 20 20 55 4e 55 53 45 44 5f  LFSYNC.  UNUSED_
191f0 50 41 52 41 4d 45 54 45 52 28 64 61 74 61 4f 6e  PARAMETER(dataOn
19200 6c 79 29 3b 0a 23 65 6c 73 65 0a 20 20 55 4e 55  ly);.#else.  UNU
19210 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 66 75  SED_PARAMETER(fu
19220 6c 6c 53 79 6e 63 29 3b 0a 20 20 55 4e 55 53 45  llSync);.  UNUSE
19230 44 5f 50 41 52 41 4d 45 54 45 52 28 64 61 74 61  D_PARAMETER(data
19240 4f 6e 6c 79 29 3b 0a 23 65 6e 64 69 66 0a 0a 20  Only);.#endif.. 
19250 20 2f 2a 20 52 65 63 6f 72 64 20 74 68 65 20 6e   /* Record the n
19260 75 6d 62 65 72 20 6f 66 20 74 69 6d 65 73 20 74  umber of times t
19270 68 61 74 20 77 65 20 64 6f 20 61 20 6e 6f 72 6d  hat we do a norm
19280 61 6c 20 66 73 79 6e 63 28 29 20 61 6e 64 20 0a  al fsync() and .
19290 20 20 2a 2a 20 46 55 4c 4c 53 59 4e 43 2e 20 20    ** FULLSYNC.  
192a0 54 68 69 73 20 69 73 20 75 73 65 64 20 64 75 72  This is used dur
192b0 69 6e 67 20 74 65 73 74 69 6e 67 20 74 6f 20 76  ing testing to v
192c0 65 72 69 66 79 20 74 68 61 74 20 74 68 69 73 20  erify that this 
192d0 70 72 6f 63 65 64 75 72 65 0a 20 20 2a 2a 20 67  procedure.  ** g
192e0 65 74 73 20 63 61 6c 6c 65 64 20 77 69 74 68 20  ets called with 
192f0 74 68 65 20 63 6f 72 72 65 63 74 20 61 72 67 75  the correct argu
19300 6d 65 6e 74 73 2e 0a 20 20 2a 2f 0a 23 69 66 64  ments..  */.#ifd
19310 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20  ef SQLITE_TEST. 
19320 20 69 66 28 20 66 75 6c 6c 53 79 6e 63 20 29 20   if( fullSync ) 
19330 73 71 6c 69 74 65 33 5f 66 75 6c 6c 73 79 6e 63  sqlite3_fullsync
19340 5f 63 6f 75 6e 74 2b 2b 3b 0a 20 20 73 71 6c 69  _count++;.  sqli
19350 74 65 33 5f 73 79 6e 63 5f 63 6f 75 6e 74 2b 2b  te3_sync_count++
19360 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 49  ;.#endif..  /* I
19370 66 20 77 65 20 63 6f 6d 70 69 6c 65 64 20 77 69  f we compiled wi
19380 74 68 20 74 68 65 20 53 51 4c 49 54 45 5f 4e 4f  th the SQLITE_NO
19390 5f 53 59 4e 43 20 66 6c 61 67 2c 20 74 68 65 6e  _SYNC flag, then
193a0 20 73 79 6e 63 69 6e 67 20 69 73 20 61 0a 20 20   syncing is a.  
193b0 2a 2a 20 6e 6f 2d 6f 70 0a 20 20 2a 2f 0a 23 69  ** no-op.  */.#i
193c0 66 64 65 66 20 53 51 4c 49 54 45 5f 4e 4f 5f 53  fdef SQLITE_NO_S
193d0 59 4e 43 0a 20 20 72 63 20 3d 20 53 51 4c 49 54  YNC.  rc = SQLIT
193e0 45 5f 4f 4b 3b 0a 23 65 6c 69 66 20 48 41 56 45  E_OK;.#elif HAVE
193f0 5f 46 55 4c 4c 46 53 59 4e 43 0a 20 20 69 66 28  _FULLFSYNC.  if(
19400 20 66 75 6c 6c 53 79 6e 63 20 29 7b 0a 20 20 20   fullSync ){.   
19410 20 72 63 20 3d 20 66 63 6e 74 6c 28 66 64 2c 20   rc = fcntl(fd, 
19420 46 5f 46 55 4c 4c 46 53 59 4e 43 2c 20 30 29 3b  F_FULLFSYNC, 0);
19430 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63  .  }else{.    rc
19440 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 2f 2a 20 49   = 1;.  }.  /* I
19450 66 20 74 68 65 20 46 55 4c 4c 46 53 59 4e 43 20  f the FULLFSYNC 
19460 66 61 69 6c 65 64 2c 20 66 61 6c 6c 20 62 61 63  failed, fall bac
19470 6b 20 74 6f 20 61 74 74 65 6d 70 74 69 6e 67 20  k to attempting 
19480 61 6e 20 66 73 79 6e 63 28 29 2e 0a 20 20 2a 2a  an fsync()..  **
19490 20 49 74 20 73 68 6f 75 6c 64 6e 27 74 20 62 65   It shouldn't be
194a0 20 70 6f 73 73 69 62 6c 65 20 66 6f 72 20 66 75   possible for fu
194b0 6c 6c 66 73 79 6e 63 20 74 6f 20 66 61 69 6c 20  llfsync to fail 
194c0 6f 6e 20 74 68 65 20 6c 6f 63 61 6c 20 0a 20 20  on the local .  
194d0 2a 2a 20 66 69 6c 65 20 73 79 73 74 65 6d 20 28  ** file system (
194e0 6f 6e 20 4f 53 58 29 2c 20 73 6f 20 66 61 69 6c  on OSX), so fail
194f0 75 72 65 20 69 6e 64 69 63 61 74 65 73 20 74 68  ure indicates th
19500 61 74 20 46 55 4c 4c 46 53 59 4e 43 0a 20 20 2a  at FULLFSYNC.  *
19510 2a 20 69 73 6e 27 74 20 73 75 70 70 6f 72 74 65  * isn't supporte
19520 64 20 66 6f 72 20 74 68 69 73 20 66 69 6c 65 20  d for this file 
19530 73 79 73 74 65 6d 2e 20 53 6f 2c 20 61 74 74 65  system. So, atte
19540 6d 70 74 20 61 6e 20 66 73 79 6e 63 20 0a 20 20  mpt an fsync .  
19550 2a 2a 20 61 6e 64 20 28 66 6f 72 20 6e 6f 77 29  ** and (for now)
19560 20 69 67 6e 6f 72 65 20 74 68 65 20 6f 76 65 72   ignore the over
19570 68 65 61 64 20 6f 66 20 61 20 73 75 70 65 72 66  head of a superf
19580 6c 75 6f 75 73 20 66 63 6e 74 6c 20 63 61 6c 6c  luous fcntl call
19590 2e 20 20 0a 20 20 2a 2a 20 49 74 27 64 20 62 65  .  .  ** It'd be
195a0 20 62 65 74 74 65 72 20 74 6f 20 64 65 74 65 63   better to detec
195b0 74 20 66 75 6c 6c 66 73 79 6e 63 20 73 75 70 70  t fullfsync supp
195c0 6f 72 74 20 6f 6e 63 65 20 61 6e 64 20 61 76 6f  ort once and avo
195d0 69 64 20 0a 20 20 2a 2a 20 74 68 65 20 66 63 6e  id .  ** the fcn
195e0 74 6c 20 63 61 6c 6c 20 65 76 65 72 79 20 74 69  tl call every ti
195f0 6d 65 20 73 79 6e 63 20 69 73 20 63 61 6c 6c 65  me sync is calle
19600 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 72 63  d..  */.  if( rc
19610 20 29 20 72 63 20 3d 20 66 73 79 6e 63 28 66 64   ) rc = fsync(fd
19620 29 3b 0a 0a 23 65 6c 69 66 20 64 65 66 69 6e 65  );..#elif define
19630 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 0a 20 20 2f  d(__APPLE__).  /
19640 2a 20 66 64 61 74 61 73 79 6e 63 28 29 20 6f 6e  * fdatasync() on
19650 20 48 46 53 2b 20 64 6f 65 73 6e 27 74 20 79 65   HFS+ doesn't ye
19660 74 20 66 6c 75 73 68 20 74 68 65 20 66 69 6c 65  t flush the file
19670 20 73 69 7a 65 20 69 66 20 69 74 20 63 68 61 6e   size if it chan
19680 67 65 64 20 63 6f 72 72 65 63 74 6c 79 0a 20 20  ged correctly.  
19690 2a 2a 20 73 6f 20 63 75 72 72 65 6e 74 6c 79 20  ** so currently 
196a0 77 65 20 64 65 66 61 75 6c 74 20 74 6f 20 74 68  we default to th
196b0 65 20 6d 61 63 72 6f 20 74 68 61 74 20 72 65 64  e macro that red
196c0 65 66 69 6e 65 73 20 66 64 61 74 61 73 79 6e 63  efines fdatasync
196d0 20 74 6f 20 66 73 79 6e 63 0a 20 20 2a 2f 0a 20   to fsync.  */. 
196e0 20 72 63 20 3d 20 66 73 79 6e 63 28 66 64 29 3b   rc = fsync(fd);
196f0 0a 23 65 6c 73 65 20 0a 20 20 72 63 20 3d 20 66  .#else .  rc = f
19700 64 61 74 61 73 79 6e 63 28 66 64 29 3b 0a 23 69  datasync(fd);.#i
19710 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20 69  f OS_VXWORKS.  i
19720 66 28 20 72 63 3d 3d 2d 31 20 26 26 20 65 72 72  f( rc==-1 && err
19730 6e 6f 3d 3d 45 4e 4f 54 53 55 50 20 29 7b 0a 20  no==ENOTSUP ){. 
19740 20 20 20 72 63 20 3d 20 66 73 79 6e 63 28 66 64     rc = fsync(fd
19750 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a  );.  }.#endif /*
19760 20 4f 53 5f 56 58 57 4f 52 4b 53 20 2a 2f 0a 23   OS_VXWORKS */.#
19770 65 6e 64 69 66 20 2f 2a 20 69 66 64 65 66 20 53  endif /* ifdef S
19780 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e 43 20 65 6c  QLITE_NO_SYNC el
19790 69 66 20 48 41 56 45 5f 46 55 4c 4c 46 53 59 4e  if HAVE_FULLFSYN
197a0 43 20 2a 2f 0a 0a 20 20 69 66 28 20 4f 53 5f 56  C */..  if( OS_V
197b0 58 57 4f 52 4b 53 20 26 26 20 72 63 21 3d 20 2d  XWORKS && rc!= -
197c0 31 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 30 3b  1 ){.    rc = 0;
197d0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
197e0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20  ;.}../*.** Make 
197f0 73 75 72 65 20 61 6c 6c 20 77 72 69 74 65 73 20  sure all writes 
19800 74 6f 20 61 20 70 61 72 74 69 63 75 6c 61 72 20  to a particular 
19810 66 69 6c 65 20 61 72 65 20 63 6f 6d 6d 69 74 74  file are committ
19820 65 64 20 74 6f 20 64 69 73 6b 2e 0a 2a 2a 0a 2a  ed to disk..**.*
19830 2a 20 49 66 20 64 61 74 61 4f 6e 6c 79 3d 3d 30  * If dataOnly==0
19840 20 74 68 65 6e 20 62 6f 74 68 20 74 68 65 20 66   then both the f
19850 69 6c 65 20 69 74 73 65 6c 66 20 61 6e 64 20 69  ile itself and i
19860 74 73 20 6d 65 74 61 64 61 74 61 20 28 66 69 6c  ts metadata (fil
19870 65 0a 2a 2a 20 73 69 7a 65 2c 20 61 63 63 65 73  e.** size, acces
19880 73 20 74 69 6d 65 2c 20 65 74 63 29 20 61 72 65  s time, etc) are
19890 20 73 79 6e 63 65 64 2e 20 20 49 66 20 64 61 74   synced.  If dat
198a0 61 4f 6e 6c 79 21 3d 30 20 74 68 65 6e 20 6f 6e  aOnly!=0 then on
198b0 6c 79 20 74 68 65 0a 2a 2a 20 66 69 6c 65 20 64  ly the.** file d
198c0 61 74 61 20 69 73 20 73 79 6e 63 65 64 2e 0a 2a  ata is synced..*
198d0 2a 0a 2a 2a 20 55 6e 64 65 72 20 55 6e 69 78 2c  *.** Under Unix,
198e0 20 61 6c 73 6f 20 6d 61 6b 65 20 73 75 72 65 20   also make sure 
198f0 74 68 61 74 20 74 68 65 20 64 69 72 65 63 74 6f  that the directo
19900 72 79 20 65 6e 74 72 79 20 66 6f 72 20 74 68 65  ry entry for the
19910 20 66 69 6c 65 0a 2a 2a 20 68 61 73 20 62 65 65   file.** has bee
19920 6e 20 63 72 65 61 74 65 64 20 62 79 20 66 73 79  n created by fsy
19930 6e 63 2d 69 6e 67 20 74 68 65 20 64 69 72 65 63  nc-ing the direc
19940 74 6f 72 79 20 74 68 61 74 20 63 6f 6e 74 61 69  tory that contai
19950 6e 73 20 74 68 65 20 66 69 6c 65 2e 0a 2a 2a 20  ns the file..** 
19960 49 66 20 77 65 20 64 6f 20 6e 6f 74 20 64 6f 20  If we do not do 
19970 74 68 69 73 20 61 6e 64 20 77 65 20 65 6e 63 6f  this and we enco
19980 75 6e 74 65 72 20 61 20 70 6f 77 65 72 20 66 61  unter a power fa
19990 69 6c 75 72 65 2c 20 74 68 65 20 64 69 72 65 63  ilure, the direc
199a0 74 6f 72 79 0a 2a 2a 20 65 6e 74 72 79 20 66 6f  tory.** entry fo
199b0 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 6d 69  r the journal mi
199c0 67 68 74 20 6e 6f 74 20 65 78 69 73 74 20 61 66  ght not exist af
199d0 74 65 72 20 77 65 20 72 65 62 6f 6f 74 2e 20 20  ter we reboot.  
199e0 54 68 65 20 6e 65 78 74 0a 2a 2a 20 53 51 4c 69  The next.** SQLi
199f0 74 65 20 74 6f 20 61 63 63 65 73 73 20 74 68 65  te to access the
19a00 20 66 69 6c 65 20 77 69 6c 6c 20 6e 6f 74 20 6b   file will not k
19a10 6e 6f 77 20 74 68 61 74 20 74 68 65 20 6a 6f 75  now that the jou
19a20 72 6e 61 6c 20 65 78 69 73 74 73 20 28 62 65 63  rnal exists (bec
19a30 61 75 73 65 0a 2a 2a 20 74 68 65 20 64 69 72 65  ause.** the dire
19a40 63 74 6f 72 79 20 65 6e 74 72 79 20 66 6f 72 20  ctory entry for 
19a50 74 68 65 20 6a 6f 75 72 6e 61 6c 20 77 61 73 20  the journal was 
19a60 6e 65 76 65 72 20 63 72 65 61 74 65 64 29 20 61  never created) a
19a70 6e 64 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  nd the transacti
19a80 6f 6e 0a 2a 2a 20 77 69 6c 6c 20 6e 6f 74 20 72  on.** will not r
19a90 6f 6c 6c 20 62 61 63 6b 20 2d 20 70 6f 73 73 69  oll back - possi
19aa0 62 6c 79 20 6c 65 61 64 69 6e 67 20 74 6f 20 64  bly leading to d
19ab0 61 74 61 62 61 73 65 20 63 6f 72 72 75 70 74 69  atabase corrupti
19ac0 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  on..*/.static in
19ad0 74 20 75 6e 69 78 53 79 6e 63 28 73 71 6c 69 74  t unixSync(sqlit
19ae0 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74  e3_file *id, int
19af0 20 66 6c 61 67 73 29 7b 0a 20 20 69 6e 74 20 72   flags){.  int r
19b00 63 3b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70  c;.  unixFile *p
19b10 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65  File = (unixFile
19b20 2a 29 69 64 3b 0a 0a 20 20 69 6e 74 20 69 73 44  *)id;..  int isD
19b30 61 74 61 4f 6e 6c 79 20 3d 20 28 66 6c 61 67 73  ataOnly = (flags
19b40 26 53 51 4c 49 54 45 5f 53 59 4e 43 5f 44 41 54  &SQLITE_SYNC_DAT
19b50 41 4f 4e 4c 59 29 3b 0a 20 20 69 6e 74 20 69 73  AONLY);.  int is
19b60 46 75 6c 6c 73 79 6e 63 20 3d 20 28 66 6c 61 67  Fullsync = (flag
19b70 73 26 30 78 30 46 29 3d 3d 53 51 4c 49 54 45 5f  s&0x0F)==SQLITE_
19b80 53 59 4e 43 5f 46 55 4c 4c 3b 0a 0a 20 20 2f 2a  SYNC_FULL;..  /*
19b90 20 43 68 65 63 6b 20 74 68 61 74 20 6f 6e 65 20   Check that one 
19ba0 6f 66 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f 4e  of SQLITE_SYNC_N
19bb0 4f 52 4d 41 4c 20 6f 72 20 46 55 4c 4c 20 77 61  ORMAL or FULL wa
19bc0 73 20 70 61 73 73 65 64 20 2a 2f 0a 20 20 61 73  s passed */.  as
19bd0 73 65 72 74 28 28 66 6c 61 67 73 26 30 78 30 46  sert((flags&0x0F
19be0 29 3d 3d 53 51 4c 49 54 45 5f 53 59 4e 43 5f 4e  )==SQLITE_SYNC_N
19bf0 4f 52 4d 41 4c 0a 20 20 20 20 20 20 7c 7c 20 28  ORMAL.      || (
19c00 66 6c 61 67 73 26 30 78 30 46 29 3d 3d 53 51 4c  flags&0x0F)==SQL
19c10 49 54 45 5f 53 59 4e 43 5f 46 55 4c 4c 0a 20 20  ITE_SYNC_FULL.  
19c20 29 3b 0a 0a 20 20 2f 2a 20 55 6e 69 78 20 63 61  );..  /* Unix ca
19c30 6e 6e 6f 74 2c 20 62 75 74 20 73 6f 6d 65 20 73  nnot, but some s
19c40 79 73 74 65 6d 73 20 6d 61 79 20 72 65 74 75 72  ystems may retur
19c50 6e 20 53 51 4c 49 54 45 5f 46 55 4c 4c 20 66 72  n SQLITE_FULL fr
19c60 6f 6d 20 68 65 72 65 2e 20 54 68 69 73 0a 20 20  om here. This.  
19c70 2a 2a 20 6c 69 6e 65 20 69 73 20 74 6f 20 74 65  ** line is to te
19c80 73 74 20 74 68 61 74 20 64 6f 69 6e 67 20 73 6f  st that doing so
19c90 20 64 6f 65 73 20 6e 6f 74 20 63 61 75 73 65 20   does not cause 
19ca0 61 6e 79 20 70 72 6f 62 6c 65 6d 73 2e 0a 20 20  any problems..  
19cb0 2a 2f 0a 20 20 53 69 6d 75 6c 61 74 65 44 69 73  */.  SimulateDis
19cc0 6b 66 75 6c 6c 45 72 72 6f 72 28 20 72 65 74 75  kfullError( retu
19cd0 72 6e 20 53 51 4c 49 54 45 5f 46 55 4c 4c 20 29  rn SQLITE_FULL )
19ce0 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 46 69  ;..  assert( pFi
19cf0 6c 65 20 29 3b 0a 20 20 4f 53 54 52 41 43 45 32  le );.  OSTRACE2
19d00 28 22 53 59 4e 43 20 20 20 20 25 2d 33 64 5c 6e  ("SYNC    %-3d\n
19d10 22 2c 20 70 46 69 6c 65 2d 3e 68 29 3b 0a 20 20  ", pFile->h);.  
19d20 72 63 20 3d 20 66 75 6c 6c 5f 66 73 79 6e 63 28  rc = full_fsync(
19d30 70 46 69 6c 65 2d 3e 68 2c 20 69 73 46 75 6c 6c  pFile->h, isFull
19d40 73 79 6e 63 2c 20 69 73 44 61 74 61 4f 6e 6c 79  sync, isDataOnly
19d50 29 3b 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45  );.  SimulateIOE
19d60 72 72 6f 72 28 20 72 63 3d 31 20 29 3b 0a 20 20  rror( rc=1 );.  
19d70 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 70 46  if( rc ){.    pF
19d80 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d  ile->lastErrno =
19d90 20 65 72 72 6e 6f 3b 0a 20 20 20 20 72 65 74 75   errno;.    retu
19da0 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  rn SQLITE_IOERR_
19db0 46 53 59 4e 43 3b 0a 20 20 7d 0a 20 20 69 66 28  FSYNC;.  }.  if(
19dc0 20 70 46 69 6c 65 2d 3e 64 69 72 66 64 3e 3d 30   pFile->dirfd>=0
19dd0 20 29 7b 0a 20 20 20 20 69 6e 74 20 65 72 72 3b   ){.    int err;
19de0 0a 20 20 20 20 4f 53 54 52 41 43 45 34 28 22 44  .    OSTRACE4("D
19df0 49 52 53 59 4e 43 20 25 2d 33 64 20 28 68 61 76  IRSYNC %-3d (hav
19e00 65 5f 66 75 6c 6c 66 73 79 6e 63 3d 25 64 20 66  e_fullfsync=%d f
19e10 75 6c 6c 73 79 6e 63 3d 25 64 29 5c 6e 22 2c 20  ullsync=%d)\n", 
19e20 70 46 69 6c 65 2d 3e 64 69 72 66 64 2c 0a 20 20  pFile->dirfd,.  
19e30 20 20 20 20 20 20 20 20 20 20 48 41 56 45 5f 46            HAVE_F
19e40 55 4c 4c 46 53 59 4e 43 2c 20 69 73 46 75 6c 6c  ULLFSYNC, isFull
19e50 73 79 6e 63 29 3b 0a 23 69 66 6e 64 65 66 20 53  sync);.#ifndef S
19e60 51 4c 49 54 45 5f 44 49 53 41 42 4c 45 5f 44 49  QLITE_DISABLE_DI
19e70 52 53 59 4e 43 0a 20 20 20 20 2f 2a 20 54 68 65  RSYNC.    /* The
19e80 20 64 69 72 65 63 74 6f 72 79 20 73 79 6e 63 20   directory sync 
19e90 69 73 20 6f 6e 6c 79 20 61 74 74 65 6d 70 74 65  is only attempte
19ea0 64 20 69 66 20 66 75 6c 6c 5f 66 73 79 6e 63 20  d if full_fsync 
19eb0 69 73 0a 20 20 20 20 2a 2a 20 74 75 72 6e 65 64  is.    ** turned
19ec0 20 6f 66 66 20 6f 72 20 75 6e 61 76 61 69 6c 61   off or unavaila
19ed0 62 6c 65 2e 20 20 49 66 20 61 20 66 75 6c 6c 5f  ble.  If a full_
19ee0 66 73 79 6e 63 20 6f 63 63 75 72 72 65 64 20 61  fsync occurred a
19ef0 62 6f 76 65 2c 0a 20 20 20 20 2a 2a 20 74 68 65  bove,.    ** the
19f00 6e 20 74 68 65 20 64 69 72 65 63 74 6f 72 79 20  n the directory 
19f10 73 79 6e 63 20 69 73 20 73 75 70 65 72 66 6c 75  sync is superflu
19f20 6f 75 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ous..    */.    
19f30 69 66 28 20 28 21 48 41 56 45 5f 46 55 4c 4c 46  if( (!HAVE_FULLF
19f40 53 59 4e 43 20 7c 7c 20 21 69 73 46 75 6c 6c 73  SYNC || !isFulls
19f50 79 6e 63 29 20 26 26 20 66 75 6c 6c 5f 66 73 79  ync) && full_fsy
19f60 6e 63 28 70 46 69 6c 65 2d 3e 64 69 72 66 64 2c  nc(pFile->dirfd,
19f70 30 2c 30 29 20 29 7b 0a 20 20 20 20 20 20 20 2f  0,0) ){.       /
19f80 2a 0a 20 20 20 20 20 20 20 2a 2a 20 57 65 20 68  *.       ** We h
19f90 61 76 65 20 72 65 63 65 69 76 65 64 20 6d 75 6c  ave received mul
19fa0 74 69 70 6c 65 20 72 65 70 6f 72 74 73 20 6f 66  tiple reports of
19fb0 20 66 73 79 6e 63 28 29 20 72 65 74 75 72 6e 69   fsync() returni
19fc0 6e 67 0a 20 20 20 20 20 20 20 2a 2a 20 65 72 72  ng.       ** err
19fd0 6f 72 73 20 77 68 65 6e 20 61 70 70 6c 69 65 64  ors when applied
19fe0 20 74 6f 20 64 69 72 65 63 74 6f 72 69 65 73 20   to directories 
19ff0 6f 6e 20 63 65 72 74 61 69 6e 20 66 69 6c 65 20  on certain file 
1a000 73 79 73 74 65 6d 73 2e 0a 20 20 20 20 20 20 20  systems..       
1a010 2a 2a 20 41 20 66 61 69 6c 65 64 20 64 69 72 65  ** A failed dire
1a020 63 74 6f 72 79 20 73 79 6e 63 20 69 73 20 6e 6f  ctory sync is no
1a030 74 20 61 20 62 69 67 20 64 65 61 6c 2e 20 20 53  t a big deal.  S
1a040 6f 20 69 74 20 73 65 65 6d 73 0a 20 20 20 20 20  o it seems.     
1a050 20 20 2a 2a 20 62 65 74 74 65 72 20 74 6f 20 69    ** better to i
1a060 67 6e 6f 72 65 20 74 68 65 20 65 72 72 6f 72 2e  gnore the error.
1a070 20 20 54 69 63 6b 65 74 20 23 31 36 35 37 0a 20    Ticket #1657. 
1a080 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
1a090 2f 2a 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72  /* pFile->lastEr
1a0a0 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 20 2a 2f 0a  rno = errno; */.
1a0b0 20 20 20 20 20 20 20 2f 2a 20 72 65 74 75 72 6e         /* return
1a0c0 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 3b 20 2a   SQLITE_IOERR; *
1a0d0 2f 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20  /.    }.#endif. 
1a0e0 20 20 20 65 72 72 20 3d 20 63 6c 6f 73 65 28 70     err = close(p
1a0f0 46 69 6c 65 2d 3e 64 69 72 66 64 29 3b 20 2f 2a  File->dirfd); /*
1a100 20 4f 6e 6c 79 20 6e 65 65 64 20 74 6f 20 73 79   Only need to sy
1a110 6e 63 20 6f 6e 63 65 2c 20 73 6f 20 63 6c 6f 73  nc once, so clos
1a120 65 20 74 68 65 20 2a 2f 0a 20 20 20 20 69 66 28  e the */.    if(
1a130 20 65 72 72 3d 3d 30 20 29 7b 20 20 20 20 20 20   err==0 ){      
1a140 20 20 20 20 20 20 20 20 2f 2a 20 64 69 72 65 63          /* direc
1a150 74 6f 72 79 20 77 68 65 6e 20 77 65 20 61 72 65  tory when we are
1a160 20 64 6f 6e 65 20 2a 2f 0a 20 20 20 20 20 20 70   done */.      p
1a170 46 69 6c 65 2d 3e 64 69 72 66 64 20 3d 20 2d 31  File->dirfd = -1
1a180 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
1a190 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72     pFile->lastEr
1a1a0 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20  rno = errno;.   
1a1b0 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49     rc = SQLITE_I
1a1c0 4f 45 52 52 5f 44 49 52 5f 43 4c 4f 53 45 3b 0a  OERR_DIR_CLOSE;.
1a1d0 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
1a1e0 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
1a1f0 54 72 75 6e 63 61 74 65 20 61 6e 20 6f 70 65 6e  Truncate an open
1a200 20 66 69 6c 65 20 74 6f 20 61 20 73 70 65 63 69   file to a speci
1a210 66 69 65 64 20 73 69 7a 65 0a 2a 2f 0a 73 74 61  fied size.*/.sta
1a220 74 69 63 20 69 6e 74 20 75 6e 69 78 54 72 75 6e  tic int unixTrun
1a230 63 61 74 65 28 73 71 6c 69 74 65 33 5f 66 69 6c  cate(sqlite3_fil
1a240 65 20 2a 69 64 2c 20 69 36 34 20 6e 42 79 74 65  e *id, i64 nByte
1a250 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 61  ){.  int rc;.  a
1a260 73 73 65 72 74 28 20 69 64 20 29 3b 0a 20 20 53  ssert( id );.  S
1a270 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20  imulateIOError( 
1a280 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f  return SQLITE_IO
1a290 45 52 52 5f 54 52 55 4e 43 41 54 45 20 29 3b 0a  ERR_TRUNCATE );.
1a2a0 20 20 72 63 20 3d 20 66 74 72 75 6e 63 61 74 65    rc = ftruncate
1a2b0 28 28 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 29  (((unixFile*)id)
1a2c0 2d 3e 68 2c 20 28 6f 66 66 5f 74 29 6e 42 79 74  ->h, (off_t)nByt
1a2d0 65 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a  e);.  if( rc ){.
1a2e0 20 20 20 20 28 28 75 6e 69 78 46 69 6c 65 2a 29      ((unixFile*)
1a2f0 69 64 29 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d  id)->lastErrno =
1a300 20 65 72 72 6e 6f 3b 0a 20 20 20 20 72 65 74 75   errno;.    retu
1a310 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  rn SQLITE_IOERR_
1a320 54 52 55 4e 43 41 54 45 3b 0a 20 20 7d 65 6c 73  TRUNCATE;.  }els
1a330 65 7b 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55  e{.#ifndef NDEBU
1a340 47 0a 20 20 20 20 2f 2a 20 49 66 20 77 65 20 61  G.    /* If we a
1a350 72 65 20 64 6f 69 6e 67 20 61 20 6e 6f 72 6d 61  re doing a norma
1a360 6c 20 77 72 69 74 65 20 74 6f 20 61 20 64 61 74  l write to a dat
1a370 61 62 61 73 65 20 66 69 6c 65 20 28 61 73 20 6f  abase file (as o
1a380 70 70 6f 73 65 64 20 74 6f 0a 20 20 20 20 2a 2a  pposed to.    **
1a390 20 64 6f 69 6e 67 20 61 20 68 6f 74 2d 6a 6f 75   doing a hot-jou
1a3a0 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 20 6f 72  rnal rollback or
1a3b0 20 61 20 77 72 69 74 65 20 74 6f 20 73 6f 6d 65   a write to some
1a3c0 20 66 69 6c 65 20 6f 74 68 65 72 20 74 68 61 6e   file other than
1a3d0 20 61 0a 20 20 20 20 2a 2a 20 6e 6f 72 6d 61 6c   a.    ** normal
1a3e0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 29 20   database file) 
1a3f0 61 6e 64 20 77 65 20 74 72 75 6e 63 61 74 65 20  and we truncate 
1a400 74 68 65 20 66 69 6c 65 20 74 6f 20 7a 65 72 6f  the file to zero
1a410 20 6c 65 6e 67 74 68 2c 0a 20 20 20 20 2a 2a 20   length,.    ** 
1a420 74 68 61 74 20 65 66 66 65 63 74 69 76 65 6c 79  that effectively
1a430 20 75 70 64 61 74 65 73 20 74 68 65 20 63 68 61   updates the cha
1a440 6e 67 65 20 63 6f 75 6e 74 65 72 2e 20 20 54 68  nge counter.  Th
1a450 69 73 20 6d 69 67 68 74 20 68 61 70 70 65 6e 0a  is might happen.
1a460 20 20 20 20 2a 2a 20 77 68 65 6e 20 72 65 73 74      ** when rest
1a470 6f 72 69 6e 67 20 61 20 64 61 74 61 62 61 73 65  oring a database
1a480 20 75 73 69 6e 67 20 74 68 65 20 62 61 63 6b 75   using the backu
1a490 70 20 41 50 49 20 66 72 6f 6d 20 61 20 7a 65 72  p API from a zer
1a4a0 6f 2d 6c 65 6e 67 74 68 0a 20 20 20 20 2a 2a 20  o-length.    ** 
1a4b0 73 6f 75 72 63 65 2e 0a 20 20 20 20 2a 2f 0a 20  source..    */. 
1a4c0 20 20 20 69 66 28 20 28 28 75 6e 69 78 46 69 6c     if( ((unixFil
1a4d0 65 2a 29 69 64 29 2d 3e 69 6e 4e 6f 72 6d 61 6c  e*)id)->inNormal
1a4e0 57 72 69 74 65 20 26 26 20 6e 42 79 74 65 3d 3d  Write && nByte==
1a4f0 30 20 29 7b 0a 20 20 20 20 20 20 28 28 75 6e 69  0 ){.      ((uni
1a500 78 46 69 6c 65 2a 29 69 64 29 2d 3e 74 72 61 6e  xFile*)id)->tran
1a510 73 43 6e 74 72 43 68 6e 67 20 3d 20 31 3b 0a 20  sCntrChng = 1;. 
1a520 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20     }.#endif..   
1a530 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
1a540 4b 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  K;.  }.}../*.** 
1a550 44 65 74 65 72 6d 69 6e 65 20 74 68 65 20 63 75  Determine the cu
1a560 72 72 65 6e 74 20 73 69 7a 65 20 6f 66 20 61 20  rrent size of a 
1a570 66 69 6c 65 20 69 6e 20 62 79 74 65 73 0a 2a 2f  file in bytes.*/
1a580 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78  .static int unix
1a590 46 69 6c 65 53 69 7a 65 28 73 71 6c 69 74 65 33  FileSize(sqlite3
1a5a0 5f 66 69 6c 65 20 2a 69 64 2c 20 69 36 34 20 2a  _file *id, i64 *
1a5b0 70 53 69 7a 65 29 7b 0a 20 20 69 6e 74 20 72 63  pSize){.  int rc
1a5c0 3b 0a 20 20 73 74 72 75 63 74 20 73 74 61 74 20  ;.  struct stat 
1a5d0 62 75 66 3b 0a 20 20 61 73 73 65 72 74 28 20 69  buf;.  assert( i
1a5e0 64 20 29 3b 0a 20 20 72 63 20 3d 20 66 73 74 61  d );.  rc = fsta
1a5f0 74 28 28 28 75 6e 69 78 46 69 6c 65 2a 29 69 64  t(((unixFile*)id
1a600 29 2d 3e 68 2c 20 26 62 75 66 29 3b 0a 20 20 53  )->h, &buf);.  S
1a610 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20  imulateIOError( 
1a620 72 63 3d 31 20 29 3b 0a 20 20 69 66 28 20 72 63  rc=1 );.  if( rc
1a630 21 3d 30 20 29 7b 0a 20 20 20 20 28 28 75 6e 69  !=0 ){.    ((uni
1a640 78 46 69 6c 65 2a 29 69 64 29 2d 3e 6c 61 73 74  xFile*)id)->last
1a650 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20  Errno = errno;. 
1a660 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
1a670 5f 49 4f 45 52 52 5f 46 53 54 41 54 3b 0a 20 20  _IOERR_FSTAT;.  
1a680 7d 0a 20 20 2a 70 53 69 7a 65 20 3d 20 62 75 66  }.  *pSize = buf
1a690 2e 73 74 5f 73 69 7a 65 3b 0a 0a 20 20 2f 2a 20  .st_size;..  /* 
1a6a0 57 68 65 6e 20 6f 70 65 6e 69 6e 67 20 61 20 7a  When opening a z
1a6b0 65 72 6f 2d 73 69 7a 65 20 64 61 74 61 62 61 73  ero-size databas
1a6c0 65 2c 20 74 68 65 20 66 69 6e 64 4c 6f 63 6b 49  e, the findLockI
1a6d0 6e 66 6f 28 29 20 70 72 6f 63 65 64 75 72 65 0a  nfo() procedure.
1a6e0 20 20 2a 2a 20 77 72 69 74 65 73 20 61 20 73 69    ** writes a si
1a6f0 6e 67 6c 65 20 62 79 74 65 20 69 6e 74 6f 20 74  ngle byte into t
1a700 68 61 74 20 66 69 6c 65 20 69 6e 20 6f 72 64 65  hat file in orde
1a710 72 20 74 6f 20 77 6f 72 6b 20 61 72 6f 75 6e 64  r to work around
1a720 20 61 20 62 75 67 0a 20 20 2a 2a 20 69 6e 20 74   a bug.  ** in t
1a730 68 65 20 4f 53 2d 58 20 6d 73 64 6f 73 20 66 69  he OS-X msdos fi
1a740 6c 65 73 79 73 74 65 6d 2e 20 20 49 6e 20 6f 72  lesystem.  In or
1a750 64 65 72 20 74 6f 20 61 76 6f 69 64 20 70 72 6f  der to avoid pro
1a760 62 6c 65 6d 73 20 77 69 74 68 20 75 70 70 65 72  blems with upper
1a770 0a 20 20 2a 2a 20 6c 61 79 65 72 73 2c 20 77 65  .  ** layers, we
1a780 20 6e 65 65 64 20 74 6f 20 72 65 70 6f 72 74 20   need to report 
1a790 74 68 69 73 20 66 69 6c 65 20 73 69 7a 65 20 61  this file size a
1a7a0 73 20 7a 65 72 6f 20 65 76 65 6e 20 74 68 6f 75  s zero even thou
1a7b0 67 68 20 69 74 20 69 73 0a 20 20 2a 2a 20 72 65  gh it is.  ** re
1a7c0 61 6c 6c 79 20 31 2e 20 20 20 54 69 63 6b 65 74  ally 1.   Ticket
1a7d0 20 23 33 32 36 30 2e 0a 20 20 2a 2f 0a 20 20 69   #3260..  */.  i
1a7e0 66 28 20 2a 70 53 69 7a 65 3d 3d 31 20 29 20 2a  f( *pSize==1 ) *
1a7f0 70 53 69 7a 65 20 3d 20 30 3b 0a 0a 0a 20 20 72  pSize = 0;...  r
1a800 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
1a810 0a 7d 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 45  .}..#if SQLITE_E
1a820 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54  NABLE_LOCKING_ST
1a830 59 4c 45 20 26 26 20 64 65 66 69 6e 65 64 28 5f  YLE && defined(_
1a840 5f 41 50 50 4c 45 5f 5f 29 0a 2f 2a 0a 2a 2a 20  _APPLE__)./*.** 
1a850 48 61 6e 64 6c 65 72 20 66 6f 72 20 70 72 6f 78  Handler for prox
1a860 79 2d 6c 6f 63 6b 69 6e 67 20 66 69 6c 65 2d 63  y-locking file-c
1a870 6f 6e 74 72 6f 6c 20 76 65 72 62 73 2e 20 20 44  ontrol verbs.  D
1a880 65 66 69 6e 65 64 20 62 65 6c 6f 77 20 69 6e 20  efined below in 
1a890 74 68 65 0a 2a 2a 20 70 72 6f 78 79 69 6e 67 20  the.** proxying 
1a8a0 6c 6f 63 6b 69 6e 67 20 64 69 76 69 73 69 6f 6e  locking division
1a8b0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1a8c0 70 72 6f 78 79 46 69 6c 65 43 6f 6e 74 72 6f 6c  proxyFileControl
1a8d0 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 2c 69  (sqlite3_file*,i
1a8e0 6e 74 2c 76 6f 69 64 2a 29 3b 0a 23 65 6e 64 69  nt,void*);.#endi
1a8f0 66 0a 0a 0a 2f 2a 0a 2a 2a 20 49 6e 66 6f 72 6d  f.../*.** Inform
1a900 61 74 69 6f 6e 20 61 6e 64 20 63 6f 6e 74 72 6f  ation and contro
1a910 6c 20 6f 66 20 61 6e 20 6f 70 65 6e 20 66 69 6c  l of an open fil
1a920 65 20 68 61 6e 64 6c 65 2e 0a 2a 2f 0a 73 74 61  e handle..*/.sta
1a930 74 69 63 20 69 6e 74 20 75 6e 69 78 46 69 6c 65  tic int unixFile
1a940 43 6f 6e 74 72 6f 6c 28 73 71 6c 69 74 65 33 5f  Control(sqlite3_
1a950 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 6f 70  file *id, int op
1a960 2c 20 76 6f 69 64 20 2a 70 41 72 67 29 7b 0a 20  , void *pArg){. 
1a970 20 73 77 69 74 63 68 28 20 6f 70 20 29 7b 0a 20   switch( op ){. 
1a980 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46     case SQLITE_F
1a990 43 4e 54 4c 5f 4c 4f 43 4b 53 54 41 54 45 3a 20  CNTL_LOCKSTATE: 
1a9a0 7b 0a 20 20 20 20 20 20 2a 28 69 6e 74 2a 29 70  {.      *(int*)p
1a9b0 41 72 67 20 3d 20 28 28 75 6e 69 78 46 69 6c 65  Arg = ((unixFile
1a9c0 2a 29 69 64 29 2d 3e 6c 6f 63 6b 74 79 70 65 3b  *)id)->locktype;
1a9d0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
1a9e0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20  LITE_OK;.    }. 
1a9f0 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 4c     case SQLITE_L
1aa00 41 53 54 5f 45 52 52 4e 4f 3a 20 7b 0a 20 20 20  AST_ERRNO: {.   
1aa10 20 20 20 2a 28 69 6e 74 2a 29 70 41 72 67 20 3d     *(int*)pArg =
1aa20 20 28 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 29   ((unixFile*)id)
1aa30 2d 3e 6c 61 73 74 45 72 72 6e 6f 3b 0a 20 20 20  ->lastErrno;.   
1aa40 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
1aa50 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64  _OK;.    }.#ifnd
1aa60 65 66 20 4e 44 45 42 55 47 0a 20 20 20 20 2f 2a  ef NDEBUG.    /*
1aa70 20 54 68 65 20 70 61 67 65 72 20 63 61 6c 6c 73   The pager calls
1aa80 20 74 68 69 73 20 6d 65 74 68 6f 64 20 74 6f 20   this method to 
1aa90 73 69 67 6e 61 6c 20 74 68 61 74 20 69 74 20 68  signal that it h
1aaa0 61 73 20 64 6f 6e 65 0a 20 20 20 20 2a 2a 20 61  as done.    ** a
1aab0 20 72 6f 6c 6c 62 61 63 6b 20 61 6e 64 20 74 68   rollback and th
1aac0 61 74 20 74 68 65 20 64 61 74 61 62 61 73 65 20  at the database 
1aad0 69 73 20 74 68 65 72 65 66 6f 72 65 20 75 6e 63  is therefore unc
1aae0 68 61 6e 67 65 64 20 61 6e 64 0a 20 20 20 20 2a  hanged and.    *
1aaf0 2a 20 69 74 20 68 65 6e 63 65 20 69 74 20 69 73  * it hence it is
1ab00 20 4f 4b 20 66 6f 72 20 74 68 65 20 74 72 61 6e   OK for the tran
1ab10 73 61 63 74 69 6f 6e 20 63 68 61 6e 67 65 20 63  saction change c
1ab20 6f 75 6e 74 65 72 20 74 6f 20 62 65 0a 20 20 20  ounter to be.   
1ab30 20 2a 2a 20 75 6e 63 68 61 6e 67 65 64 2e 0a 20   ** unchanged.. 
1ab40 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53     */.    case S
1ab50 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 44 42 5f 55  QLITE_FCNTL_DB_U
1ab60 4e 43 48 41 4e 47 45 44 3a 20 7b 0a 20 20 20 20  NCHANGED: {.    
1ab70 20 20 28 28 75 6e 69 78 46 69 6c 65 2a 29 69 64    ((unixFile*)id
1ab80 29 2d 3e 64 62 55 70 64 61 74 65 20 3d 20 30 3b  )->dbUpdate = 0;
1ab90 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
1aba0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 23  LITE_OK;.    }.#
1abb0 65 6e 64 69 66 0a 23 69 66 20 53 51 4c 49 54 45  endif.#if SQLITE
1abc0 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f  _ENABLE_LOCKING_
1abd0 53 54 59 4c 45 20 26 26 20 64 65 66 69 6e 65 64  STYLE && defined
1abe0 28 5f 5f 41 50 50 4c 45 5f 5f 29 0a 20 20 20 20  (__APPLE__).    
1abf0 63 61 73 65 20 53 51 4c 49 54 45 5f 53 45 54 5f  case SQLITE_SET_
1ac00 4c 4f 43 4b 50 52 4f 58 59 46 49 4c 45 3a 0a 20  LOCKPROXYFILE:. 
1ac10 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 47     case SQLITE_G
1ac20 45 54 5f 4c 4f 43 4b 50 52 4f 58 59 46 49 4c 45  ET_LOCKPROXYFILE
1ac30 3a 20 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  : {.      return
1ac40 20 70 72 6f 78 79 46 69 6c 65 43 6f 6e 74 72 6f   proxyFileContro
1ac50 6c 28 69 64 2c 6f 70 2c 70 41 72 67 29 3b 0a 20  l(id,op,pArg);. 
1ac60 20 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53     }.#endif /* S
1ac70 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43  QLITE_ENABLE_LOC
1ac80 4b 49 4e 47 5f 53 54 59 4c 45 20 26 26 20 64 65  KING_STYLE && de
1ac90 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29  fined(__APPLE__)
1aca0 20 2a 2f 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e   */.  }.  return
1acb0 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 7d   SQLITE_ERROR;.}
1acc0 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
1acd0 68 65 20 73 65 63 74 6f 72 20 73 69 7a 65 20 69  he sector size i
1ace0 6e 20 62 79 74 65 73 20 6f 66 20 74 68 65 20 75  n bytes of the u
1acf0 6e 64 65 72 6c 79 69 6e 67 20 62 6c 6f 63 6b 20  nderlying block 
1ad00 64 65 76 69 63 65 20 66 6f 72 0a 2a 2a 20 74 68  device for.** th
1ad10 65 20 73 70 65 63 69 66 69 65 64 20 66 69 6c 65  e specified file
1ad20 2e 20 54 68 69 73 20 69 73 20 61 6c 6d 6f 73 74  . This is almost
1ad30 20 61 6c 77 61 79 73 20 35 31 32 20 62 79 74 65   always 512 byte
1ad40 73 2c 20 62 75 74 20 6d 61 79 20 62 65 0a 2a 2a  s, but may be.**
1ad50 20 6c 61 72 67 65 72 20 66 6f 72 20 73 6f 6d 65   larger for some
1ad60 20 64 65 76 69 63 65 73 2e 0a 2a 2a 0a 2a 2a 20   devices..**.** 
1ad70 53 51 4c 69 74 65 20 63 6f 64 65 20 61 73 73 75  SQLite code assu
1ad80 6d 65 73 20 74 68 69 73 20 66 75 6e 63 74 69 6f  mes this functio
1ad90 6e 20 63 61 6e 6e 6f 74 20 66 61 69 6c 2e 20 49  n cannot fail. I
1ada0 74 20 61 6c 73 6f 20 61 73 73 75 6d 65 73 20 74  t also assumes t
1adb0 68 61 74 0a 2a 2a 20 69 66 20 74 77 6f 20 66 69  hat.** if two fi
1adc0 6c 65 73 20 61 72 65 20 63 72 65 61 74 65 64 20  les are created 
1add0 69 6e 20 74 68 65 20 73 61 6d 65 20 66 69 6c 65  in the same file
1ade0 2d 73 79 73 74 65 6d 20 64 69 72 65 63 74 6f 72  -system director
1adf0 79 20 28 69 2e 65 2e 0a 2a 2a 20 61 20 64 61 74  y (i.e..** a dat
1ae00 61 62 61 73 65 20 61 6e 64 20 69 74 73 20 6a 6f  abase and its jo
1ae10 75 72 6e 61 6c 20 66 69 6c 65 29 20 74 68 61 74  urnal file) that
1ae20 20 74 68 65 20 73 65 63 74 6f 72 20 73 69 7a 65   the sector size
1ae30 20 77 69 6c 6c 20 62 65 20 74 68 65 0a 2a 2a 20   will be the.** 
1ae40 73 61 6d 65 20 66 6f 72 20 62 6f 74 68 2e 0a 2a  same for both..*
1ae50 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69  /.static int uni
1ae60 78 53 65 63 74 6f 72 53 69 7a 65 28 73 71 6c 69  xSectorSize(sqli
1ae70 74 65 33 5f 66 69 6c 65 20 2a 4e 6f 74 55 73 65  te3_file *NotUse
1ae80 64 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  d){.  UNUSED_PAR
1ae90 41 4d 45 54 45 52 28 4e 6f 74 55 73 65 64 29 3b  AMETER(NotUsed);
1aea0 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
1aeb0 5f 44 45 46 41 55 4c 54 5f 53 45 43 54 4f 52 5f  _DEFAULT_SECTOR_
1aec0 53 49 5a 45 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  SIZE;.}../*.** R
1aed0 65 74 75 72 6e 20 74 68 65 20 64 65 76 69 63 65  eturn the device
1aee0 20 63 68 61 72 61 63 74 65 72 69 73 74 69 63 73   characteristics
1aef0 20 66 6f 72 20 74 68 65 20 66 69 6c 65 2e 20 54   for the file. T
1af00 68 69 73 20 69 73 20 61 6c 77 61 79 73 20 30 20  his is always 0 
1af10 66 6f 72 20 75 6e 69 78 2e 0a 2a 2f 0a 73 74 61  for unix..*/.sta
1af20 74 69 63 20 69 6e 74 20 75 6e 69 78 44 65 76 69  tic int unixDevi
1af30 63 65 43 68 61 72 61 63 74 65 72 69 73 74 69 63  ceCharacteristic
1af40 73 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  s(sqlite3_file *
1af50 4e 6f 74 55 73 65 64 29 7b 0a 20 20 55 4e 55 53  NotUsed){.  UNUS
1af60 45 44 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f 74  ED_PARAMETER(Not
1af70 55 73 65 64 29 3b 0a 20 20 72 65 74 75 72 6e 20  Used);.  return 
1af80 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 48 65 72 65  0;.}../*.** Here
1af90 20 65 6e 64 73 20 74 68 65 20 69 6d 70 6c 65 6d   ends the implem
1afa0 65 6e 74 61 74 69 6f 6e 20 6f 66 20 61 6c 6c 20  entation of all 
1afb0 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 6d 65 74  sqlite3_file met
1afc0 68 6f 64 73 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a  hods..**.*******
1afd0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20  *************** 
1afe0 45 6e 64 20 73 71 6c 69 74 65 33 5f 66 69 6c 65  End sqlite3_file
1aff0 20 4d 65 74 68 6f 64 73 20 2a 2a 2a 2a 2a 2a 2a   Methods *******
1b000 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1b010 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a  ********.*******
1b020 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1b030 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1b040 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1b050 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1b060 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  *******/../*.** 
1b070 54 68 69 73 20 64 69 76 69 73 69 6f 6e 20 63 6f  This division co
1b080 6e 74 61 69 6e 73 20 64 65 66 69 6e 69 74 69 6f  ntains definitio
1b090 6e 73 20 6f 66 20 73 71 6c 69 74 65 33 5f 69 6f  ns of sqlite3_io
1b0a0 5f 6d 65 74 68 6f 64 73 20 6f 62 6a 65 63 74 73  _methods objects
1b0b0 20 74 68 61 74 0a 2a 2a 20 69 6d 70 6c 65 6d 65   that.** impleme
1b0c0 6e 74 20 76 61 72 69 6f 75 73 20 66 69 6c 65 20  nt various file 
1b0d0 6c 6f 63 6b 69 6e 67 20 73 74 72 61 74 65 67 69  locking strategi
1b0e0 65 73 2e 20 20 49 74 20 61 6c 73 6f 20 63 6f 6e  es.  It also con
1b0f0 74 61 69 6e 73 20 64 65 66 69 6e 69 74 69 6f 6e  tains definition
1b100 73 0a 2a 2a 20 6f 66 20 22 66 69 6e 64 65 72 22  s.** of "finder"
1b110 20 66 75 6e 63 74 69 6f 6e 73 2e 20 20 41 20 66   functions.  A f
1b120 69 6e 64 65 72 2d 66 75 6e 63 74 69 6f 6e 20 69  inder-function i
1b130 73 20 75 73 65 64 20 74 6f 20 6c 6f 63 61 74 65  s used to locate
1b140 20 74 68 65 20 61 70 70 72 6f 70 72 69 61 74 65   the appropriate
1b150 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d  .** sqlite3_io_m
1b160 65 74 68 6f 64 73 20 6f 62 6a 65 63 74 20 66 6f  ethods object fo
1b170 72 20 61 20 70 61 72 74 69 63 75 6c 61 72 20 64  r a particular d
1b180 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20 54  atabase file.  T
1b190 68 65 20 70 41 70 70 44 61 74 61 0a 2a 2a 20 66  he pAppData.** f
1b1a0 69 65 6c 64 20 6f 66 20 74 68 65 20 73 71 6c 69  ield of the sqli
1b1b0 74 65 33 5f 76 66 73 20 56 46 53 20 6f 62 6a 65  te3_vfs VFS obje
1b1c0 63 74 73 20 61 72 65 20 69 6e 69 74 69 61 6c 69  cts are initiali
1b1d0 7a 65 64 20 74 6f 20 62 65 20 70 6f 69 6e 74 65  zed to be pointe
1b1e0 72 73 20 74 6f 0a 2a 2a 20 74 68 65 20 63 6f 72  rs to.** the cor
1b1f0 72 65 63 74 20 66 69 6e 64 65 72 2d 66 75 6e 63  rect finder-func
1b200 74 69 6f 6e 20 66 6f 72 20 74 68 61 74 20 56 46  tion for that VF
1b210 53 2e 0a 2a 2a 0a 2a 2a 20 4d 6f 73 74 20 66 69  S..**.** Most fi
1b220 6e 64 65 72 20 66 75 6e 63 74 69 6f 6e 73 20 72  nder functions r
1b230 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20  eturn a pointer 
1b240 74 6f 20 61 20 66 69 78 65 64 20 73 71 6c 69 74  to a fixed sqlit
1b250 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 0a 2a 2a  e3_io_methods.**
1b260 20 6f 62 6a 65 63 74 2e 20 20 54 68 65 20 6f 6e   object.  The on
1b270 6c 79 20 69 6e 74 65 72 65 73 74 69 6e 67 20 66  ly interesting f
1b280 69 6e 64 65 72 2d 66 75 6e 63 74 69 6f 6e 20 69  inder-function i
1b290 73 20 61 75 74 6f 6c 6f 63 6b 49 6f 46 69 6e 64  s autolockIoFind
1b2a0 65 72 2c 20 77 68 69 63 68 0a 2a 2a 20 6c 6f 6f  er, which.** loo
1b2b0 6b 73 20 61 74 20 74 68 65 20 66 69 6c 65 73 79  ks at the filesy
1b2c0 73 74 65 6d 20 74 79 70 65 20 61 6e 64 20 74 72  stem type and tr
1b2d0 69 65 73 20 74 6f 20 67 75 65 73 73 20 74 68 65  ies to guess the
1b2e0 20 62 65 73 74 20 6c 6f 63 6b 69 6e 67 0a 2a 2a   best locking.**
1b2f0 20 73 74 72 61 74 65 67 79 20 66 72 6f 6d 20 74   strategy from t
1b300 68 61 74 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 66  hat..**.** For f
1b310 69 6e 64 65 72 2d 66 75 6e 74 69 6f 6e 20 46 2c  inder-funtion F,
1b320 20 74 77 6f 20 6f 62 6a 65 63 74 73 20 61 72 65   two objects are
1b330 20 63 72 65 61 74 65 64 3a 0a 2a 2a 0a 2a 2a 20   created:.**.** 
1b340 20 20 20 28 31 29 20 54 68 65 20 72 65 61 6c 20     (1) The real 
1b350 66 69 6e 64 65 72 2d 66 75 6e 63 74 69 6f 6e 20  finder-function 
1b360 6e 61 6d 65 64 20 22 46 49 6d 70 74 28 29 22 2e  named "FImpt()".
1b370 0a 2a 2a 0a 2a 2a 20 20 20 20 28 32 29 20 41 20  .**.**    (2) A 
1b380 63 6f 6e 73 74 61 6e 74 20 70 6f 69 6e 74 65 72  constant pointer
1b390 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f   to this functio
1b3a0 6e 20 6e 61 6d 65 64 20 6a 75 73 74 20 22 46 22  n named just "F"
1b3b0 2e 0a 2a 2a 0a 2a 2a 0a 2a 2a 20 41 20 70 6f 69  ..**.**.** A poi
1b3c0 6e 74 65 72 20 74 6f 20 74 68 65 20 46 20 70 6f  nter to the F po
1b3d0 69 6e 74 65 72 20 69 73 20 75 73 65 64 20 61 73  inter is used as
1b3e0 20 74 68 65 20 70 41 70 70 44 61 74 61 20 76 61   the pAppData va
1b3f0 6c 75 65 20 66 6f 72 20 56 46 53 0a 2a 2a 20 6f  lue for VFS.** o
1b400 62 6a 65 63 74 73 2e 20 20 57 65 20 68 61 76 65  bjects.  We have
1b410 20 74 6f 20 64 6f 20 74 68 69 73 20 69 6e 73 74   to do this inst
1b420 65 61 64 20 6f 66 20 6c 65 74 74 69 6e 67 20 70  ead of letting p
1b430 41 70 70 44 61 74 61 20 70 6f 69 6e 74 0a 2a 2a  AppData point.**
1b440 20 64 69 72 65 63 74 6c 79 20 61 74 20 74 68 65   directly at the
1b450 20 66 69 6e 64 65 72 2d 66 75 6e 63 74 69 6f 6e   finder-function
1b460 20 73 69 6e 63 65 20 43 39 30 20 72 75 6c 65 73   since C90 rules
1b470 20 70 72 65 76 65 6e 74 20 61 20 76 6f 69 64 2a   prevent a void*
1b480 0a 2a 2a 20 66 72 6f 6d 20 62 65 20 63 61 73 74  .** from be cast
1b490 20 69 6e 74 6f 20 61 20 66 75 6e 63 74 69 6f 6e   into a function
1b4a0 20 70 6f 69 6e 74 65 72 2e 0a 2a 2a 0a 2a 2a 0a   pointer..**.**.
1b4b0 2a 2a 20 45 61 63 68 20 69 6e 73 74 61 6e 63 65  ** Each instance
1b4c0 20 6f 66 20 74 68 69 73 20 6d 61 63 72 6f 20 67   of this macro g
1b4d0 65 6e 65 72 61 74 65 73 20 74 77 6f 20 6f 62 6a  enerates two obj
1b4e0 65 63 74 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20  ects:.**.**   * 
1b4f0 20 41 20 63 6f 6e 73 74 61 6e 74 20 73 71 6c 69   A constant sqli
1b500 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 6f  te3_io_methods o
1b510 62 6a 65 63 74 20 63 61 6c 6c 20 4d 45 54 48 4f  bject call METHO
1b520 44 20 74 68 61 74 20 68 61 73 20 6c 6f 63 6b 69  D that has locki
1b530 6e 67 0a 2a 2a 20 20 20 20 20 20 6d 65 74 68 6f  ng.**      metho
1b540 64 73 20 43 4c 4f 53 45 2c 20 4c 4f 43 4b 2c 20  ds CLOSE, LOCK, 
1b550 55 4e 4c 4f 43 4b 2c 20 43 4b 52 45 53 4c 4f 43  UNLOCK, CKRESLOC
1b560 4b 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 20 41 6e  K..**.**   *  An
1b570 20 49 2f 4f 20 6d 65 74 68 6f 64 20 66 69 6e 64   I/O method find
1b580 65 72 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c  er function call
1b590 65 64 20 46 49 4e 44 45 52 20 74 68 61 74 20 72  ed FINDER that r
1b5a0 65 74 75 72 6e 73 20 61 20 70 6f 69 6e 74 65 72  eturns a pointer
1b5b0 0a 2a 2a 20 20 20 20 20 20 74 6f 20 74 68 65 20  .**      to the 
1b5c0 4d 45 54 48 4f 44 20 6f 62 6a 65 63 74 20 69 6e  METHOD object in
1b5d0 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 62 75   the previous bu
1b5e0 6c 6c 65 74 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65  llet..*/.#define
1b5f0 20 49 4f 4d 45 54 48 4f 44 53 28 46 49 4e 44 45   IOMETHODS(FINDE
1b600 52 2c 20 4d 45 54 48 4f 44 2c 20 43 4c 4f 53 45  R, METHOD, CLOSE
1b610 2c 20 4c 4f 43 4b 2c 20 55 4e 4c 4f 43 4b 2c 20  , LOCK, UNLOCK, 
1b620 43 4b 4c 4f 43 4b 29 20 20 20 20 20 20 20 20 20  CKLOCK)         
1b630 20 20 20 20 20 20 5c 0a 73 74 61 74 69 63 20 63        \.static c
1b640 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f  onst sqlite3_io_
1b650 6d 65 74 68 6f 64 73 20 4d 45 54 48 4f 44 20 3d  methods METHOD =
1b660 20 7b 20 20 20 20 20 20 20 20 20 20 20 20 20 20   {              
1b670 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b680 20 20 20 20 20 5c 0a 20 20 20 31 2c 20 20 20 20       \.   1,    
1b690 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b6a0 20 20 20 20 20 20 2f 2a 20 69 56 65 72 73 69 6f        /* iVersio
1b6b0 6e 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20  n */            
1b6c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b6d0 20 20 20 20 5c 0a 20 20 20 43 4c 4f 53 45 2c 20      \.   CLOSE, 
1b6e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b6f0 20 20 20 20 20 2f 2a 20 78 43 6c 6f 73 65 20 2a       /* xClose *
1b700 2f 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  /               
1b710 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b720 20 20 20 5c 0a 20 20 20 75 6e 69 78 52 65 61 64     \.   unixRead
1b730 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
1b740 20 20 20 20 2f 2a 20 78 52 65 61 64 20 2a 2f 20      /* xRead */ 
1b750 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b760 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b770 20 20 5c 0a 20 20 20 75 6e 69 78 57 72 69 74 65    \.   unixWrite
1b780 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
1b790 20 20 20 2f 2a 20 78 57 72 69 74 65 20 2a 2f 20     /* xWrite */ 
1b7a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b7b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b7c0 20 5c 0a 20 20 20 75 6e 69 78 54 72 75 6e 63 61   \.   unixTrunca
1b7d0 74 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  te,             
1b7e0 20 20 2f 2a 20 78 54 72 75 6e 63 61 74 65 20 2a    /* xTruncate *
1b7f0 2f 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  /               
1b800 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b810 5c 0a 20 20 20 75 6e 69 78 53 79 6e 63 2c 20 20  \.   unixSync,  
1b820 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b830 20 2f 2a 20 78 53 79 6e 63 20 2a 2f 20 20 20 20   /* xSync */    
1b840 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b850 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c                 \
1b860 0a 20 20 20 75 6e 69 78 46 69 6c 65 53 69 7a 65  .   unixFileSize
1b870 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
1b880 2f 2a 20 78 46 69 6c 65 53 69 7a 65 20 2a 2f 20  /* xFileSize */ 
1b890 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b8a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a                \.
1b8b0 20 20 20 4c 4f 43 4b 2c 20 20 20 20 20 20 20 20     LOCK,        
1b8c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1b8d0 2a 20 78 4c 6f 63 6b 20 2a 2f 20 20 20 20 20 20  * xLock */      
1b8e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b8f0 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20               \. 
1b900 20 20 55 4e 4c 4f 43 4b 2c 20 20 20 20 20 20 20    UNLOCK,       
1b910 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1b920 20 78 55 6e 6c 6f 63 6b 20 2a 2f 20 20 20 20 20   xUnlock */     
1b930 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b940 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20              \.  
1b950 20 43 4b 4c 4f 43 4b 2c 20 20 20 20 20 20 20 20   CKLOCK,        
1b960 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1b970 78 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f  xCheckReservedLo
1b980 63 6b 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20  ck */           
1b990 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20             \.   
1b9a0 75 6e 69 78 46 69 6c 65 43 6f 6e 74 72 6f 6c 2c  unixFileControl,
1b9b0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
1b9c0 46 69 6c 65 43 6f 6e 74 72 6f 6c 20 2a 2f 20 20  FileControl */  
1b9d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b9e0 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 75            \.   u
1b9f0 6e 69 78 53 65 63 74 6f 72 53 69 7a 65 2c 20 20  nixSectorSize,  
1ba00 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53             /* xS
1ba10 65 63 74 6f 72 53 69 7a 65 20 2a 2f 20 20 20 20  ectorSize */    
1ba20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ba30 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 75 6e           \.   un
1ba40 69 78 44 65 76 69 63 65 43 68 61 72 61 63 74 65  ixDeviceCharacte
1ba50 72 69 73 74 69 63 73 20 20 20 2f 2a 20 78 44 65  ristics   /* xDe
1ba60 76 69 63 65 43 61 70 61 62 69 6c 69 74 69 65 73  viceCapabilities
1ba70 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20 20   */             
1ba80 20 20 20 20 20 20 20 20 5c 0a 7d 3b 20 20 20 20          \.};    
1ba90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1baa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bab0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bac0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bad0 20 20 20 20 20 20 20 5c 0a 73 74 61 74 69 63 20         \.static 
1bae0 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 69 6f  const sqlite3_io
1baf0 5f 6d 65 74 68 6f 64 73 20 2a 46 49 4e 44 45 52  _methods *FINDER
1bb00 23 23 49 6d 70 6c 28 63 6f 6e 73 74 20 63 68 61  ##Impl(const cha
1bb10 72 20 2a 7a 2c 20 75 6e 69 78 46 69 6c 65 20 2a  r *z, unixFile *
1bb20 70 29 7b 20 20 20 5c 0a 20 20 55 4e 55 53 45 44  p){   \.  UNUSED
1bb30 5f 50 41 52 41 4d 45 54 45 52 28 7a 29 3b 20 55  _PARAMETER(z); U
1bb40 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
1bb50 70 29 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  p);             
1bb60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bb70 20 20 20 20 20 5c 0a 20 20 72 65 74 75 72 6e 20       \.  return 
1bb80 26 4d 45 54 48 4f 44 3b 20 20 20 20 20 20 20 20  &METHOD;        
1bb90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bba0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bbb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bbc0 20 20 20 20 5c 0a 7d 20 20 20 20 20 20 20 20 20      \.}         
1bbd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bbe0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bbf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bc00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bc10 20 20 20 5c 0a 73 74 61 74 69 63 20 63 6f 6e 73     \.static cons
1bc20 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74  t sqlite3_io_met
1bc30 68 6f 64 73 20 2a 28 2a 63 6f 6e 73 74 20 46 49  hods *(*const FI
1bc40 4e 44 45 52 29 28 63 6f 6e 73 74 20 63 68 61 72  NDER)(const char
1bc50 2a 2c 75 6e 69 78 46 69 6c 65 20 2a 70 29 20 20  *,unixFile *p)  
1bc60 20 20 5c 0a 20 20 20 20 3d 20 46 49 4e 44 45 52    \.    = FINDER
1bc70 23 23 49 6d 70 6c 3b 0a 0a 2f 2a 0a 2a 2a 20 48  ##Impl;../*.** H
1bc80 65 72 65 20 61 72 65 20 61 6c 6c 20 6f 66 20 74  ere are all of t
1bc90 68 65 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65  he sqlite3_io_me
1bca0 74 68 6f 64 73 20 6f 62 6a 65 63 74 73 20 66 6f  thods objects fo
1bcb0 72 20 65 61 63 68 20 6f 66 20 74 68 65 0a 2a 2a  r each of the.**
1bcc0 20 6c 6f 63 6b 69 6e 67 20 73 74 72 61 74 65 67   locking strateg
1bcd0 69 65 73 2e 20 20 46 75 6e 63 74 69 6f 6e 73 20  ies.  Functions 
1bce0 74 68 61 74 20 72 65 74 75 72 6e 20 70 6f 69 6e  that return poin
1bcf0 74 65 72 73 20 74 6f 20 74 68 65 73 65 20 6d 65  ters to these me
1bd00 74 68 6f 64 73 0a 2a 2a 20 61 72 65 20 61 6c 73  thods.** are als
1bd10 6f 20 63 72 65 61 74 65 64 2e 0a 2a 2f 0a 49 4f  o created..*/.IO
1bd20 4d 45 54 48 4f 44 53 28 0a 20 20 70 6f 73 69 78  METHODS(.  posix
1bd30 49 6f 46 69 6e 64 65 72 2c 20 20 20 20 20 20 20  IoFinder,       
1bd40 20 20 20 20 20 2f 2a 20 46 69 6e 64 65 72 20 66       /* Finder f
1bd50 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 20 2a 2f 0a  unction name */.
1bd60 20 20 70 6f 73 69 78 49 6f 4d 65 74 68 6f 64 73    posixIoMethods
1bd70 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73  ,           /* s
1bd80 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64  qlite3_io_method
1bd90 73 20 6f 62 6a 65 63 74 20 6e 61 6d 65 20 2a 2f  s object name */
1bda0 0a 20 20 75 6e 69 78 43 6c 6f 73 65 2c 20 20 20  .  unixClose,   
1bdb0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1bdc0 78 43 6c 6f 73 65 20 6d 65 74 68 6f 64 20 2a 2f  xClose method */
1bdd0 0a 20 20 75 6e 69 78 4c 6f 63 6b 2c 20 20 20 20  .  unixLock,    
1bde0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1bdf0 78 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a  xLock method */.
1be00 20 20 75 6e 69 78 55 6e 6c 6f 63 6b 2c 20 20 20    unixUnlock,   
1be10 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
1be20 55 6e 6c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f  Unlock method */
1be30 0a 20 20 75 6e 69 78 43 68 65 63 6b 52 65 73 65  .  unixCheckRese
1be40 72 76 65 64 4c 6f 63 6b 20 20 20 20 20 2f 2a 20  rvedLock     /* 
1be50 78 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f  xCheckReservedLo
1be60 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 29 0a 49  ck method */.).I
1be70 4f 4d 45 54 48 4f 44 53 28 0a 20 20 6e 6f 6c 6f  OMETHODS(.  nolo
1be80 63 6b 49 6f 46 69 6e 64 65 72 2c 20 20 20 20 20  ckIoFinder,     
1be90 20 20 20 20 20 20 2f 2a 20 46 69 6e 64 65 72 20        /* Finder 
1bea0 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 20 2a 2f  function name */
1beb0 0a 20 20 6e 6f 6c 6f 63 6b 49 6f 4d 65 74 68 6f  .  nolockIoMetho
1bec0 64 73 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ds,          /* 
1bed0 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f  sqlite3_io_metho
1bee0 64 73 20 6f 62 6a 65 63 74 20 6e 61 6d 65 20 2a  ds object name *
1bef0 2f 0a 20 20 6e 6f 6c 6f 63 6b 43 6c 6f 73 65 2c  /.  nolockClose,
1bf00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1bf10 20 78 43 6c 6f 73 65 20 6d 65 74 68 6f 64 20 2a   xClose method *
1bf20 2f 0a 20 20 6e 6f 6c 6f 63 6b 4c 6f 63 6b 2c 20  /.  nolockLock, 
1bf30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1bf40 20 78 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f   xLock method */
1bf50 0a 20 20 6e 6f 6c 6f 63 6b 55 6e 6c 6f 63 6b 2c  .  nolockUnlock,
1bf60 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1bf70 78 55 6e 6c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a  xUnlock method *
1bf80 2f 0a 20 20 6e 6f 6c 6f 63 6b 43 68 65 63 6b 52  /.  nolockCheckR
1bf90 65 73 65 72 76 65 64 4c 6f 63 6b 20 20 20 2f 2a  eservedLock   /*
1bfa0 20 78 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c   xCheckReservedL
1bfb0 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 29 0a  ock method */.).
1bfc0 49 4f 4d 45 54 48 4f 44 53 28 0a 20 20 64 6f 74  IOMETHODS(.  dot
1bfd0 6c 6f 63 6b 49 6f 46 69 6e 64 65 72 2c 20 20 20  lockIoFinder,   
1bfe0 20 20 20 20 20 20 20 2f 2a 20 46 69 6e 64 65 72         /* Finder
1bff0 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 20 2a   function name *
1c000 2f 0a 20 20 64 6f 74 6c 6f 63 6b 49 6f 4d 65 74  /.  dotlockIoMet
1c010 68 6f 64 73 2c 20 20 20 20 20 20 20 20 20 2f 2a  hods,         /*
1c020 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68   sqlite3_io_meth
1c030 6f 64 73 20 6f 62 6a 65 63 74 20 6e 61 6d 65 20  ods object name 
1c040 2a 2f 0a 20 20 64 6f 74 6c 6f 63 6b 43 6c 6f 73  */.  dotlockClos
1c050 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  e,             /
1c060 2a 20 78 43 6c 6f 73 65 20 6d 65 74 68 6f 64 20  * xClose method 
1c070 2a 2f 0a 20 20 64 6f 74 6c 6f 63 6b 4c 6f 63 6b  */.  dotlockLock
1c080 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
1c090 2a 20 78 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a  * xLock method *
1c0a0 2f 0a 20 20 64 6f 74 6c 6f 63 6b 55 6e 6c 6f 63  /.  dotlockUnloc
1c0b0 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  k,            /*
1c0c0 20 78 55 6e 6c 6f 63 6b 20 6d 65 74 68 6f 64 20   xUnlock method 
1c0d0 2a 2f 0a 20 20 64 6f 74 6c 6f 63 6b 43 68 65 63  */.  dotlockChec
1c0e0 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 20 20 2f  kReservedLock  /
1c0f0 2a 20 78 43 68 65 63 6b 52 65 73 65 72 76 65 64  * xCheckReserved
1c100 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 29  Lock method */.)
1c110 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 45 4e 41  ..#if SQLITE_ENA
1c120 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c  BLE_LOCKING_STYL
1c130 45 20 26 26 20 21 4f 53 5f 56 58 57 4f 52 4b 53  E && !OS_VXWORKS
1c140 0a 49 4f 4d 45 54 48 4f 44 53 28 0a 20 20 66 6c  .IOMETHODS(.  fl
1c150 6f 63 6b 49 6f 46 69 6e 64 65 72 2c 20 20 20 20  ockIoFinder,    
1c160 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6e 64 65          /* Finde
1c170 72 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 20  r function name 
1c180 2a 2f 0a 20 20 66 6c 6f 63 6b 49 6f 4d 65 74 68  */.  flockIoMeth
1c190 6f 64 73 2c 20 20 20 20 20 20 20 20 20 20 20 2f  ods,           /
1c1a0 2a 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74  * sqlite3_io_met
1c1b0 68 6f 64 73 20 6f 62 6a 65 63 74 20 6e 61 6d 65  hods object name
1c1c0 20 2a 2f 0a 20 20 66 6c 6f 63 6b 43 6c 6f 73 65   */.  flockClose
1c1d0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
1c1e0 2f 2a 20 78 43 6c 6f 73 65 20 6d 65 74 68 6f 64  /* xClose method
1c1f0 20 2a 2f 0a 20 20 66 6c 6f 63 6b 4c 6f 63 6b 2c   */.  flockLock,
1c200 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c210 2f 2a 20 78 4c 6f 63 6b 20 6d 65 74 68 6f 64 20  /* xLock method 
1c220 2a 2f 0a 20 20 66 6c 6f 63 6b 55 6e 6c 6f 63 6b  */.  flockUnlock
1c230 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
1c240 2a 20 78 55 6e 6c 6f 63 6b 20 6d 65 74 68 6f 64  * xUnlock method
1c250 20 2a 2f 0a 20 20 66 6c 6f 63 6b 43 68 65 63 6b   */.  flockCheck
1c260 52 65 73 65 72 76 65 64 4c 6f 63 6b 20 20 20 20  ReservedLock    
1c270 2f 2a 20 78 43 68 65 63 6b 52 65 73 65 72 76 65  /* xCheckReserve
1c280 64 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a  dLock method */.
1c290 29 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 4f 53  ).#endif..#if OS
1c2a0 5f 56 58 57 4f 52 4b 53 0a 49 4f 4d 45 54 48 4f  _VXWORKS.IOMETHO
1c2b0 44 53 28 0a 20 20 73 65 6d 49 6f 46 69 6e 64 65  DS(.  semIoFinde
1c2c0 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r,              
1c2d0 2f 2a 20 46 69 6e 64 65 72 20 66 75 6e 63 74 69  /* Finder functi
1c2e0 6f 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20 73 65 6d  on name */.  sem
1c2f0 49 6f 4d 65 74 68 6f 64 73 2c 20 20 20 20 20 20  IoMethods,      
1c300 20 20 20 20 20 20 20 2f 2a 20 73 71 6c 69 74 65         /* sqlite
1c310 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 6f 62 6a  3_io_methods obj
1c320 65 63 74 20 6e 61 6d 65 20 2a 2f 0a 20 20 73 65  ect name */.  se
1c330 6d 43 6c 6f 73 65 2c 20 20 20 20 20 20 20 20 20  mClose,         
1c340 20 20 20 20 20 20 20 20 2f 2a 20 78 43 6c 6f 73          /* xClos
1c350 65 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 73 65  e method */.  se
1c360 6d 4c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20  mLock,          
1c370 20 20 20 20 20 20 20 20 2f 2a 20 78 4c 6f 63 6b          /* xLock
1c380 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 73 65 6d   method */.  sem
1c390 55 6e 6c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20  Unlock,         
1c3a0 20 20 20 20 20 20 20 2f 2a 20 78 55 6e 6c 6f 63         /* xUnloc
1c3b0 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 73 65  k method */.  se
1c3c0 6d 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f  mCheckReservedLo
1c3d0 63 6b 20 20 20 20 20 20 2f 2a 20 78 43 68 65 63  ck      /* xChec
1c3e0 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 20 6d 65  kReservedLock me
1c3f0 74 68 6f 64 20 2a 2f 0a 29 0a 23 65 6e 64 69 66  thod */.).#endif
1c400 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f 5f  ..#if defined(__
1c410 41 50 50 4c 45 5f 5f 29 20 26 26 20 53 51 4c 49  APPLE__) && SQLI
1c420 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e  TE_ENABLE_LOCKIN
1c430 47 5f 53 54 59 4c 45 0a 49 4f 4d 45 54 48 4f 44  G_STYLE.IOMETHOD
1c440 53 28 0a 20 20 61 66 70 49 6f 46 69 6e 64 65 72  S(.  afpIoFinder
1c450 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
1c460 2a 20 46 69 6e 64 65 72 20 66 75 6e 63 74 69 6f  * Finder functio
1c470 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20 61 66 70 49  n name */.  afpI
1c480 6f 4d 65 74 68 6f 64 73 2c 20 20 20 20 20 20 20  oMethods,       
1c490 20 20 20 20 20 20 2f 2a 20 73 71 6c 69 74 65 33        /* sqlite3
1c4a0 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 6f 62 6a 65  _io_methods obje
1c4b0 63 74 20 6e 61 6d 65 20 2a 2f 0a 20 20 61 66 70  ct name */.  afp
1c4c0 43 6c 6f 73 65 2c 20 20 20 20 20 20 20 20 20 20  Close,          
1c4d0 20 20 20 20 20 20 20 2f 2a 20 78 43 6c 6f 73 65         /* xClose
1c4e0 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 61 66 70   method */.  afp
1c4f0 4c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20  Lock,           
1c500 20 20 20 20 20 20 20 2f 2a 20 78 4c 6f 63 6b 20         /* xLock 
1c510 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 61 66 70 55  method */.  afpU
1c520 6e 6c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20  nlock,          
1c530 20 20 20 20 20 20 2f 2a 20 78 55 6e 6c 6f 63 6b        /* xUnlock
1c540 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 61 66 70   method */.  afp
1c550 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63  CheckReservedLoc
1c560 6b 20 20 20 20 20 20 2f 2a 20 78 43 68 65 63 6b  k      /* xCheck
1c570 52 65 73 65 72 76 65 64 4c 6f 63 6b 20 6d 65 74  ReservedLock met
1c580 68 6f 64 20 2a 2f 0a 29 0a 23 65 6e 64 69 66 0a  hod */.).#endif.
1c590 0a 2f 2a 0a 2a 2a 20 54 68 65 20 70 72 6f 78 79  ./*.** The proxy
1c5a0 20 6c 6f 63 6b 69 6e 67 20 6d 65 74 68 6f 64 20   locking method 
1c5b0 69 73 20 61 20 22 73 75 70 65 72 2d 6d 65 74 68  is a "super-meth
1c5c0 6f 64 22 20 69 6e 20 74 68 65 20 73 65 6e 73 65  od" in the sense
1c5d0 20 74 68 61 74 20 69 74 0a 2a 2a 20 6f 70 65 6e   that it.** open
1c5e0 73 20 73 65 63 6f 6e 64 61 72 79 20 66 69 6c 65  s secondary file
1c5f0 20 64 65 73 63 72 69 70 74 6f 72 73 20 66 6f 72   descriptors for
1c600 20 74 68 65 20 63 6f 6e 63 68 20 61 6e 64 20 6c   the conch and l
1c610 6f 63 6b 20 66 69 6c 65 73 20 61 6e 64 0a 2a 2a  ock files and.**
1c620 20 69 74 20 75 73 65 73 20 70 72 6f 78 79 2c 20   it uses proxy, 
1c630 64 6f 74 2d 66 69 6c 65 2c 20 41 46 50 2c 20 61  dot-file, AFP, a
1c640 6e 64 20 66 6c 6f 63 6b 28 29 20 6c 6f 63 6b 69  nd flock() locki
1c650 6e 67 20 6d 65 74 68 6f 64 73 20 6f 6e 20 74 68  ng methods on th
1c660 6f 73 65 0a 2a 2a 20 73 65 63 6f 6e 64 61 72 79  ose.** secondary
1c670 20 66 69 6c 65 73 2e 20 20 46 6f 72 20 74 68 69   files.  For thi
1c680 73 20 72 65 61 73 6f 6e 2c 20 74 68 65 20 64 69  s reason, the di
1c690 76 69 73 69 6f 6e 20 74 68 61 74 20 69 6d 70 6c  vision that impl
1c6a0 65 6d 65 6e 74 73 0a 2a 2a 20 70 72 6f 78 79 20  ements.** proxy 
1c6b0 6c 6f 63 6b 69 6e 67 20 69 73 20 6c 6f 63 61 74  locking is locat
1c6c0 65 64 20 6d 75 63 68 20 66 75 72 74 68 65 72 20  ed much further 
1c6d0 64 6f 77 6e 20 69 6e 20 74 68 65 20 66 69 6c 65  down in the file
1c6e0 2e 20 20 42 75 74 20 77 65 20 6e 65 65 64 0a 2a  .  But we need.*
1c6f0 2a 20 74 6f 20 67 6f 20 61 68 65 61 64 20 61 6e  * to go ahead an
1c700 64 20 64 65 66 69 6e 65 20 74 68 65 20 73 71 6c  d define the sql
1c710 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20  ite3_io_methods 
1c720 61 6e 64 20 66 69 6e 64 65 72 20 66 75 6e 63 74  and finder funct
1c730 69 6f 6e 0a 2a 2a 20 66 6f 72 20 70 72 6f 78 79  ion.** for proxy
1c740 20 6c 6f 63 6b 69 6e 67 20 68 65 72 65 2e 20 20   locking here.  
1c750 53 6f 20 77 65 20 66 6f 72 77 61 72 64 20 64 65  So we forward de
1c760 63 6c 61 72 65 20 74 68 65 20 49 2f 4f 20 6d 65  clare the I/O me
1c770 74 68 6f 64 73 2e 0a 2a 2f 0a 23 69 66 20 64 65  thods..*/.#if de
1c780 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29  fined(__APPLE__)
1c790 20 26 26 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c   && SQLITE_ENABL
1c7a0 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a  E_LOCKING_STYLE.
1c7b0 73 74 61 74 69 63 20 69 6e 74 20 70 72 6f 78 79  static int proxy
1c7c0 43 6c 6f 73 65 28 73 71 6c 69 74 65 33 5f 66 69  Close(sqlite3_fi
1c7d0 6c 65 2a 29 3b 0a 73 74 61 74 69 63 20 69 6e 74  le*);.static int
1c7e0 20 70 72 6f 78 79 4c 6f 63 6b 28 73 71 6c 69 74   proxyLock(sqlit
1c7f0 65 33 5f 66 69 6c 65 2a 2c 20 69 6e 74 29 3b 0a  e3_file*, int);.
1c800 73 74 61 74 69 63 20 69 6e 74 20 70 72 6f 78 79  static int proxy
1c810 55 6e 6c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66  Unlock(sqlite3_f
1c820 69 6c 65 2a 2c 20 69 6e 74 29 3b 0a 73 74 61 74  ile*, int);.stat
1c830 69 63 20 69 6e 74 20 70 72 6f 78 79 43 68 65 63  ic int proxyChec
1c840 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 28 73 71  kReservedLock(sq
1c850 6c 69 74 65 33 5f 66 69 6c 65 2a 2c 20 69 6e 74  lite3_file*, int
1c860 2a 29 3b 0a 49 4f 4d 45 54 48 4f 44 53 28 0a 20  *);.IOMETHODS(. 
1c870 20 70 72 6f 78 79 49 6f 46 69 6e 64 65 72 2c 20   proxyIoFinder, 
1c880 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69             /* Fi
1c890 6e 64 65 72 20 66 75 6e 63 74 69 6f 6e 20 6e 61  nder function na
1c8a0 6d 65 20 2a 2f 0a 20 20 70 72 6f 78 79 49 6f 4d  me */.  proxyIoM
1c8b0 65 74 68 6f 64 73 2c 20 20 20 20 20 20 20 20 20  ethods,         
1c8c0 20 20 2f 2a 20 73 71 6c 69 74 65 33 5f 69 6f 5f    /* sqlite3_io_
1c8d0 6d 65 74 68 6f 64 73 20 6f 62 6a 65 63 74 20 6e  methods object n
1c8e0 61 6d 65 20 2a 2f 0a 20 20 70 72 6f 78 79 43 6c  ame */.  proxyCl
1c8f0 6f 73 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  ose,            
1c900 20 20 20 2f 2a 20 78 43 6c 6f 73 65 20 6d 65 74     /* xClose met
1c910 68 6f 64 20 2a 2f 0a 20 20 70 72 6f 78 79 4c 6f  hod */.  proxyLo
1c920 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ck,             
1c930 20 20 20 2f 2a 20 78 4c 6f 63 6b 20 6d 65 74 68     /* xLock meth
1c940 6f 64 20 2a 2f 0a 20 20 70 72 6f 78 79 55 6e 6c  od */.  proxyUnl
1c950 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20  ock,            
1c960 20 20 2f 2a 20 78 55 6e 6c 6f 63 6b 20 6d 65 74    /* xUnlock met
1c970 68 6f 64 20 2a 2f 0a 20 20 70 72 6f 78 79 43 68  hod */.  proxyCh
1c980 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 20  eckReservedLock 
1c990 20 20 20 2f 2a 20 78 43 68 65 63 6b 52 65 73 65     /* xCheckRese
1c9a0 72 76 65 64 4c 6f 63 6b 20 6d 65 74 68 6f 64 20  rvedLock method 
1c9b0 2a 2f 0a 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 20  */.).#endif../* 
1c9c0 6e 66 73 20 6c 6f 63 6b 64 20 6f 6e 20 4f 53 58  nfs lockd on OSX
1c9d0 20 31 30 2e 33 2b 20 64 6f 65 73 6e 27 74 20 63   10.3+ doesn't c
1c9e0 6c 65 61 72 20 77 72 69 74 65 20 6c 6f 63 6b 73  lear write locks
1c9f0 20 77 68 65 6e 20 61 20 72 65 61 64 20 6c 6f 63   when a read loc
1ca00 6b 20 69 73 20 73 65 74 20 2a 2f 0a 23 69 66 20  k is set */.#if 
1ca10 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f  defined(__APPLE_
1ca20 5f 29 20 26 26 20 53 51 4c 49 54 45 5f 45 4e 41  _) && SQLITE_ENA
1ca30 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c  BLE_LOCKING_STYL
1ca40 45 0a 49 4f 4d 45 54 48 4f 44 53 28 0a 20 20 6e  E.IOMETHODS(.  n
1ca50 66 73 49 6f 46 69 6e 64 65 72 2c 20 20 20 20 20  fsIoFinder,     
1ca60 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6e            /* Fin
1ca70 64 65 72 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d  der function nam
1ca80 65 20 2a 2f 0a 20 20 6e 66 73 49 6f 4d 65 74 68  e */.  nfsIoMeth
1ca90 6f 64 73 2c 20 20 20 20 20 20 20 20 20 20 20 20  ods,            
1caa0 20 20 2f 2a 20 73 71 6c 69 74 65 33 5f 69 6f 5f    /* sqlite3_io_
1cab0 6d 65 74 68 6f 64 73 20 6f 62 6a 65 63 74 20 6e  methods object n
1cac0 61 6d 65 20 2a 2f 0a 20 20 75 6e 69 78 43 6c 6f  ame */.  unixClo
1cad0 73 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  se,             
1cae0 20 20 20 20 2f 2a 20 78 43 6c 6f 73 65 20 6d 65      /* xClose me
1caf0 74 68 6f 64 20 2a 2f 0a 20 20 75 6e 69 78 4c 6f  thod */.  unixLo
1cb00 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ck,             
1cb10 20 20 20 20 20 2f 2a 20 78 4c 6f 63 6b 20 6d 65       /* xLock me
1cb20 74 68 6f 64 20 2a 2f 0a 20 20 6e 66 73 55 6e 6c  thod */.  nfsUnl
1cb30 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20  ock,            
1cb40 20 20 20 20 20 2f 2a 20 78 55 6e 6c 6f 63 6b 20       /* xUnlock 
1cb50 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 75 6e 69 78  method */.  unix
1cb60 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63  CheckReservedLoc
1cb70 6b 20 20 20 20 20 20 2f 2a 20 78 43 68 65 63 6b  k      /* xCheck
1cb80 52 65 73 65 72 76 65 64 4c 6f 63 6b 20 6d 65 74  ReservedLock met
1cb90 68 6f 64 20 2a 2f 0a 29 0a 23 65 6e 64 69 66 0a  hod */.).#endif.
1cba0 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 41  .#if defined(__A
1cbb0 50 50 4c 45 5f 5f 29 20 26 26 20 53 51 4c 49 54  PPLE__) && SQLIT
1cbc0 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47  E_ENABLE_LOCKING
1cbd0 5f 53 54 59 4c 45 0a 2f 2a 20 0a 2a 2a 20 54 68  _STYLE./* .** Th
1cbe0 69 73 20 22 66 69 6e 64 65 72 22 20 66 75 6e 63  is "finder" func
1cbf0 74 69 6f 6e 20 61 74 74 65 6d 70 74 73 20 74 6f  tion attempts to
1cc00 20 64 65 74 65 72 6d 69 6e 65 20 74 68 65 20 62   determine the b
1cc10 65 73 74 20 6c 6f 63 6b 69 6e 67 20 73 74 72 61  est locking stra
1cc20 74 65 67 79 20 0a 2a 2a 20 66 6f 72 20 74 68 65  tegy .** for the
1cc30 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 22   database file "
1cc40 66 69 6c 65 50 61 74 68 22 2e 20 20 49 74 20 74  filePath".  It t
1cc50 68 65 6e 20 72 65 74 75 72 6e 73 20 74 68 65 20  hen returns the 
1cc60 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f  sqlite3_io_metho
1cc70 64 73 0a 2a 2a 20 6f 62 6a 65 63 74 20 74 68 61  ds.** object tha
1cc80 74 20 69 6d 70 6c 65 6d 65 6e 74 73 20 74 68 61  t implements tha
1cc90 74 20 73 74 72 61 74 65 67 79 2e 0a 2a 2a 0a 2a  t strategy..**.*
1cca0 2a 20 54 68 69 73 20 69 73 20 66 6f 72 20 4d 61  * This is for Ma
1ccb0 63 4f 53 58 20 6f 6e 6c 79 2e 0a 2a 2f 0a 73 74  cOSX only..*/.st
1ccc0 61 74 69 63 20 63 6f 6e 73 74 20 73 71 6c 69 74  atic const sqlit
1ccd0 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 2a 61  e3_io_methods *a
1cce0 75 74 6f 6c 6f 63 6b 49 6f 46 69 6e 64 65 72 49  utolockIoFinderI
1ccf0 6d 70 6c 28 0a 20 20 63 6f 6e 73 74 20 63 68 61  mpl(.  const cha
1cd00 72 20 2a 66 69 6c 65 50 61 74 68 2c 20 20 20 20  r *filePath,    
1cd10 2f 2a 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 64  /* name of the d
1cd20 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a  atabase file */.
1cd30 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 4e 65 77    unixFile *pNew
1cd40 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 6f 70             /* op
1cd50 65 6e 20 66 69 6c 65 20 6f 62 6a 65 63 74 20 66  en file object f
1cd60 6f 72 20 74 68 65 20 64 61 74 61 62 61 73 65 20  or the database 
1cd70 66 69 6c 65 20 2a 2f 0a 29 7b 0a 20 20 73 74 61  file */.){.  sta
1cd80 74 69 63 20 63 6f 6e 73 74 20 73 74 72 75 63 74  tic const struct
1cd90 20 4d 61 70 70 69 6e 67 20 7b 0a 20 20 20 20 63   Mapping {.    c
1cda0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65  onst char *zFile
1cdb0 73 79 73 74 65 6d 3b 20 20 20 20 20 20 20 20 20  system;         
1cdc0 20 20 20 20 20 2f 2a 20 46 69 6c 65 73 79 73 74       /* Filesyst
1cdd0 65 6d 20 74 79 70 65 20 6e 61 6d 65 20 2a 2f 0a  em type name */.
1cde0 20 20 20 20 63 6f 6e 73 74 20 73 71 6c 69 74 65      const sqlite
1cdf0 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 2a 70 4d  3_io_methods *pM
1ce00 65 74 68 6f 64 73 3b 20 20 20 2f 2a 20 41 70 70  ethods;   /* App
1ce10 72 6f 70 72 69 61 74 65 20 6c 6f 63 6b 69 6e 67  ropriate locking
1ce20 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 7d 20 61   method */.  } a
1ce30 4d 61 70 5b 5d 20 3d 20 7b 0a 20 20 20 20 7b 20  Map[] = {.    { 
1ce40 22 68 66 73 22 2c 20 20 20 20 26 70 6f 73 69 78  "hfs",    &posix
1ce50 49 6f 4d 65 74 68 6f 64 73 20 7d 2c 0a 20 20 20  IoMethods },.   
1ce60 20 7b 20 22 75 66 73 22 2c 20 20 20 20 26 70 6f   { "ufs",    &po
1ce70 73 69 78 49 6f 4d 65 74 68 6f 64 73 20 7d 2c 0a  sixIoMethods },.
1ce80 20 20 20 20 7b 20 22 61 66 70 66 73 22 2c 20 20      { "afpfs",  
1ce90 26 61 66 70 49 6f 4d 65 74 68 6f 64 73 20 7d 2c  &afpIoMethods },
1cea0 0a 20 20 20 20 7b 20 22 73 6d 62 66 73 22 2c 20  .    { "smbfs", 
1ceb0 20 26 61 66 70 49 6f 4d 65 74 68 6f 64 73 20 7d   &afpIoMethods }
1cec0 2c 0a 20 20 20 20 7b 20 22 77 65 62 64 61 76 22  ,.    { "webdav"
1ced0 2c 20 26 6e 6f 6c 6f 63 6b 49 6f 4d 65 74 68 6f  , &nolockIoMetho
1cee0 64 73 20 7d 2c 0a 20 20 20 20 7b 20 30 2c 20 30  ds },.    { 0, 0
1cef0 20 7d 0a 20 20 7d 3b 0a 20 20 69 6e 74 20 69 3b   }.  };.  int i;
1cf00 0a 20 20 73 74 72 75 63 74 20 73 74 61 74 66 73  .  struct statfs
1cf10 20 66 73 49 6e 66 6f 3b 0a 20 20 73 74 72 75 63   fsInfo;.  struc
1cf20 74 20 66 6c 6f 63 6b 20 6c 6f 63 6b 49 6e 66 6f  t flock lockInfo
1cf30 3b 0a 0a 20 20 69 66 28 20 21 66 69 6c 65 50 61  ;..  if( !filePa
1cf40 74 68 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20  th ){.    /* If 
1cf50 66 69 6c 65 50 61 74 68 3d 3d 4e 55 4c 4c 20 74  filePath==NULL t
1cf60 68 61 74 20 6d 65 61 6e 73 20 77 65 20 61 72 65  hat means we are
1cf70 20 64 65 61 6c 69 6e 67 20 77 69 74 68 20 61 20   dealing with a 
1cf80 74 72 61 6e 73 69 65 6e 74 20 66 69 6c 65 0a 20  transient file. 
1cf90 20 20 20 2a 2a 20 74 68 61 74 20 64 6f 65 73 20     ** that does 
1cfa0 6e 6f 74 20 6e 65 65 64 20 74 6f 20 62 65 20 6c  not need to be l
1cfb0 6f 63 6b 65 64 2e 20 2a 2f 0a 20 20 20 20 72 65  ocked. */.    re
1cfc0 74 75 72 6e 20 26 6e 6f 6c 6f 63 6b 49 6f 4d 65  turn &nolockIoMe
1cfd0 74 68 6f 64 73 3b 0a 20 20 7d 0a 20 20 69 66 28  thods;.  }.  if(
1cfe0 20 73 74 61 74 66 73 28 66 69 6c 65 50 61 74 68   statfs(filePath
1cff0 2c 20 26 66 73 49 6e 66 6f 29 20 21 3d 20 2d 31  , &fsInfo) != -1
1d000 20 29 7b 0a 20 20 20 20 69 66 28 20 66 73 49 6e   ){.    if( fsIn
1d010 66 6f 2e 66 5f 66 6c 61 67 73 20 26 20 4d 4e 54  fo.f_flags & MNT
1d020 5f 52 44 4f 4e 4c 59 20 29 7b 0a 20 20 20 20 20  _RDONLY ){.     
1d030 20 72 65 74 75 72 6e 20 26 6e 6f 6c 6f 63 6b 49   return &nolockI
1d040 6f 4d 65 74 68 6f 64 73 3b 0a 20 20 20 20 7d 0a  oMethods;.    }.
1d050 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 61 4d 61      for(i=0; aMa
1d060 70 5b 69 5d 2e 7a 46 69 6c 65 73 79 73 74 65 6d  p[i].zFilesystem
1d070 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66  ; i++){.      if
1d080 28 20 73 74 72 63 6d 70 28 66 73 49 6e 66 6f 2e  ( strcmp(fsInfo.
1d090 66 5f 66 73 74 79 70 65 6e 61 6d 65 2c 20 61 4d  f_fstypename, aM
1d0a0 61 70 5b 69 5d 2e 7a 46 69 6c 65 73 79 73 74 65  ap[i].zFilesyste
1d0b0 6d 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  m)==0 ){.       
1d0c0 20 72 65 74 75 72 6e 20 61 4d 61 70 5b 69 5d 2e   return aMap[i].
1d0d0 70 4d 65 74 68 6f 64 73 3b 0a 20 20 20 20 20 20  pMethods;.      
1d0e0 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  }.    }.  }..  /
1d0f0 2a 20 44 65 66 61 75 6c 74 20 63 61 73 65 2e 20  * Default case. 
1d100 48 61 6e 64 6c 65 73 2c 20 61 6d 6f 6e 67 73 74  Handles, amongst
1d110 20 6f 74 68 65 72 73 2c 20 22 6e 66 73 22 2e 0a   others, "nfs"..
1d120 20 20 2a 2a 20 54 65 73 74 20 62 79 74 65 2d 72    ** Test byte-r
1d130 61 6e 67 65 20 6c 6f 63 6b 20 75 73 69 6e 67 20  ange lock using 
1d140 66 63 6e 74 6c 28 29 2e 20 49 66 20 74 68 65 20  fcntl(). If the 
1d150 63 61 6c 6c 20 73 75 63 63 65 65 64 73 2c 20 0a  call succeeds, .
1d160 20 20 2a 2a 20 61 73 73 75 6d 65 20 74 68 61 74    ** assume that
1d170 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d   the file-system
1d180 20 73 75 70 70 6f 72 74 73 20 50 4f 53 49 58 20   supports POSIX 
1d190 73 74 79 6c 65 20 6c 6f 63 6b 73 2e 20 0a 20 20  style locks. .  
1d1a0 2a 2f 0a 20 20 6c 6f 63 6b 49 6e 66 6f 2e 6c 5f  */.  lockInfo.l_
1d1b0 6c 65 6e 20 3d 20 31 3b 0a 20 20 6c 6f 63 6b 49  len = 1;.  lockI
1d1c0 6e 66 6f 2e 6c 5f 73 74 61 72 74 20 3d 20 30 3b  nfo.l_start = 0;
1d1d0 0a 20 20 6c 6f 63 6b 49 6e 66 6f 2e 6c 5f 77 68  .  lockInfo.l_wh
1d1e0 65 6e 63 65 20 3d 20 53 45 45 4b 5f 53 45 54 3b  ence = SEEK_SET;
1d1f0 0a 20 20 6c 6f 63 6b 49 6e 66 6f 2e 6c 5f 74 79  .  lockInfo.l_ty
1d200 70 65 20 3d 20 46 5f 52 44 4c 43 4b 3b 0a 20 20  pe = F_RDLCK;.  
1d210 69 66 28 20 66 63 6e 74 6c 28 70 4e 65 77 2d 3e  if( fcntl(pNew->
1d220 68 2c 20 46 5f 47 45 54 4c 4b 2c 20 26 6c 6f 63  h, F_GETLK, &loc
1d230 6b 49 6e 66 6f 29 21 3d 2d 31 20 29 20 7b 0a 20  kInfo)!=-1 ) {. 
1d240 20 20 20 69 66 28 20 73 74 72 63 6d 70 28 66 73     if( strcmp(fs
1d250 49 6e 66 6f 2e 66 5f 66 73 74 79 70 65 6e 61 6d  Info.f_fstypenam
1d260 65 2c 20 22 6e 66 73 22 29 3d 3d 30 20 29 7b 0a  e, "nfs")==0 ){.
1d270 20 20 20 20 20 20 72 65 74 75 72 6e 20 26 6e 66        return &nf
1d280 73 49 6f 4d 65 74 68 6f 64 73 3b 0a 20 20 20 20  sIoMethods;.    
1d290 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 72  } else {.      r
1d2a0 65 74 75 72 6e 20 26 70 6f 73 69 78 49 6f 4d 65  eturn &posixIoMe
1d2b0 74 68 6f 64 73 3b 0a 20 20 20 20 7d 0a 20 20 7d  thods;.    }.  }
1d2c0 65 6c 73 65 7b 0a 20 20 20 20 72 65 74 75 72 6e  else{.    return
1d2d0 20 26 64 6f 74 6c 6f 63 6b 49 6f 4d 65 74 68 6f   &dotlockIoMetho
1d2e0 64 73 3b 0a 20 20 7d 0a 7d 0a 73 74 61 74 69 63  ds;.  }.}.static
1d2f0 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 69   const sqlite3_i
1d300 6f 5f 6d 65 74 68 6f 64 73 20 0a 20 20 2a 28 2a  o_methods .  *(*
1d310 63 6f 6e 73 74 20 61 75 74 6f 6c 6f 63 6b 49 6f  const autolockIo
1d320 46 69 6e 64 65 72 29 28 63 6f 6e 73 74 20 63 68  Finder)(const ch
1d330 61 72 2a 2c 75 6e 69 78 46 69 6c 65 2a 29 20 3d  ar*,unixFile*) =
1d340 20 61 75 74 6f 6c 6f 63 6b 49 6f 46 69 6e 64 65   autolockIoFinde
1d350 72 49 6d 70 6c 3b 0a 0a 23 65 6e 64 69 66 20 2f  rImpl;..#endif /
1d360 2a 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c  * defined(__APPL
1d370 45 5f 5f 29 20 26 26 20 53 51 4c 49 54 45 5f 45  E__) && SQLITE_E
1d380 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54  NABLE_LOCKING_ST
1d390 59 4c 45 20 2a 2f 0a 0a 23 69 66 20 4f 53 5f 56  YLE */..#if OS_V
1d3a0 58 57 4f 52 4b 53 20 26 26 20 53 51 4c 49 54 45  XWORKS && SQLITE
1d3b0 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f  _ENABLE_LOCKING_
1d3c0 53 54 59 4c 45 0a 2f 2a 20 0a 2a 2a 20 54 68 69  STYLE./* .** Thi
1d3d0 73 20 22 66 69 6e 64 65 72 22 20 66 75 6e 63 74  s "finder" funct
1d3e0 69 6f 6e 20 61 74 74 65 6d 70 74 73 20 74 6f 20  ion attempts to 
1d3f0 64 65 74 65 72 6d 69 6e 65 20 74 68 65 20 62 65  determine the be
1d400 73 74 20 6c 6f 63 6b 69 6e 67 20 73 74 72 61 74  st locking strat
1d410 65 67 79 20 0a 2a 2a 20 66 6f 72 20 74 68 65 20  egy .** for the 
1d420 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 22 66  database file "f
1d430 69 6c 65 50 61 74 68 22 2e 20 20 49 74 20 74 68  ilePath".  It th
1d440 65 6e 20 72 65 74 75 72 6e 73 20 74 68 65 20 73  en returns the s
1d450 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64  qlite3_io_method
1d460 73 0a 2a 2a 20 6f 62 6a 65 63 74 20 74 68 61 74  s.** object that
1d470 20 69 6d 70 6c 65 6d 65 6e 74 73 20 74 68 61 74   implements that
1d480 20 73 74 72 61 74 65 67 79 2e 0a 2a 2a 0a 2a 2a   strategy..**.**
1d490 20 54 68 69 73 20 69 73 20 66 6f 72 20 56 58 57   This is for VXW
1d4a0 6f 72 6b 73 20 6f 6e 6c 79 2e 0a 2a 2f 0a 73 74  orks only..*/.st
1d4b0 61 74 69 63 20 63 6f 6e 73 74 20 73 71 6c 69 74  atic const sqlit
1d4c0 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 2a 61  e3_io_methods *a
1d4d0 75 74 6f 6c 6f 63 6b 49 6f 46 69 6e 64 65 72 49  utolockIoFinderI
1d4e0 6d 70 6c 28 0a 20 20 63 6f 6e 73 74 20 63 68 61  mpl(.  const cha
1d4f0 72 20 2a 66 69 6c 65 50 61 74 68 2c 20 20 20 20  r *filePath,    
1d500 2f 2a 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 64  /* name of the d
1d510 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a  atabase file */.
1d520 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 4e 65 77    unixFile *pNew
1d530 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 74 68             /* th
1d540 65 20 6f 70 65 6e 20 66 69 6c 65 20 6f 62 6a 65  e open file obje
1d550 63 74 20 2a 2f 0a 29 7b 0a 20 20 73 74 72 75 63  ct */.){.  struc
1d560 74 20 66 6c 6f 63 6b 20 6c 6f 63 6b 49 6e 66 6f  t flock lockInfo
1d570 3b 0a 0a 20 20 69 66 28 20 21 66 69 6c 65 50 61  ;..  if( !filePa
1d580 74 68 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20  th ){.    /* If 
1d590 66 69 6c 65 50 61 74 68 3d 3d 4e 55 4c 4c 20 74  filePath==NULL t
1d5a0 68 61 74 20 6d 65 61 6e 73 20 77 65 20 61 72 65  hat means we are
1d5b0 20 64 65 61 6c 69 6e 67 20 77 69 74 68 20 61 20   dealing with a 
1d5c0 74 72 61 6e 73 69 65 6e 74 20 66 69 6c 65 0a 20  transient file. 
1d5d0 20 20 20 2a 2a 20 74 68 61 74 20 64 6f 65 73 20     ** that does 
1d5e0 6e 6f 74 20 6e 65 65 64 20 74 6f 20 62 65 20 6c  not need to be l
1d5f0 6f 63 6b 65 64 2e 20 2a 2f 0a 20 20 20 20 72 65  ocked. */.    re
1d600 74 75 72 6e 20 26 6e 6f 6c 6f 63 6b 49 6f 4d 65  turn &nolockIoMe
1d610 74 68 6f 64 73 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  thods;.  }..  /*
1d620 20 54 65 73 74 20 69 66 20 66 63 6e 74 6c 28 29   Test if fcntl()
1d630 20 69 73 20 73 75 70 70 6f 72 74 65 64 20 61 6e   is supported an
1d640 64 20 75 73 65 20 50 4f 53 49 58 20 73 74 79 6c  d use POSIX styl
1d650 65 20 6c 6f 63 6b 73 2e 0a 20 20 2a 2a 20 4f 74  e locks..  ** Ot
1d660 68 65 72 77 69 73 65 20 66 61 6c 6c 20 62 61 63  herwise fall bac
1d670 6b 20 74 6f 20 74 68 65 20 6e 61 6d 65 64 20 73  k to the named s
1d680 65 6d 61 70 68 6f 72 65 20 6d 65 74 68 6f 64 2e  emaphore method.
1d690 0a 20 20 2a 2f 0a 20 20 6c 6f 63 6b 49 6e 66 6f  .  */.  lockInfo
1d6a0 2e 6c 5f 6c 65 6e 20 3d 20 31 3b 0a 20 20 6c 6f  .l_len = 1;.  lo
1d6b0 63 6b 49 6e 66 6f 2e 6c 5f 73 74 61 72 74 20 3d  ckInfo.l_start =
1d6c0 20 30 3b 0a 20 20 6c 6f 63 6b 49 6e 66 6f 2e 6c   0;.  lockInfo.l
1d6d0 5f 77 68 65 6e 63 65 20 3d 20 53 45 45 4b 5f 53  _whence = SEEK_S
1d6e0 45 54 3b 0a 20 20 6c 6f 63 6b 49 6e 66 6f 2e 6c  ET;.  lockInfo.l
1d6f0 5f 74 79 70 65 20 3d 20 46 5f 52 44 4c 43 4b 3b  _type = F_RDLCK;
1d700 0a 20 20 69 66 28 20 66 63 6e 74 6c 28 70 4e 65  .  if( fcntl(pNe
1d710 77 2d 3e 68 2c 20 46 5f 47 45 54 4c 4b 2c 20 26  w->h, F_GETLK, &
1d720 6c 6f 63 6b 49 6e 66 6f 29 21 3d 2d 31 20 29 20  lockInfo)!=-1 ) 
1d730 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 26 70 6f  {.    return &po
1d740 73 69 78 49 6f 4d 65 74 68 6f 64 73 3b 0a 20 20  sixIoMethods;.  
1d750 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 74 75 72  }else{.    retur
1d760 6e 20 26 73 65 6d 49 6f 4d 65 74 68 6f 64 73 3b  n &semIoMethods;
1d770 0a 20 20 7d 0a 7d 0a 73 74 61 74 69 63 20 63 6f  .  }.}.static co
1d780 6e 73 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d  nst sqlite3_io_m
1d790 65 74 68 6f 64 73 20 0a 20 20 2a 28 2a 63 6f 6e  ethods .  *(*con
1d7a0 73 74 20 61 75 74 6f 6c 6f 63 6b 49 6f 46 69 6e  st autolockIoFin
1d7b0 64 65 72 29 28 63 6f 6e 73 74 20 63 68 61 72 2a  der)(const char*
1d7c0 2c 75 6e 69 78 46 69 6c 65 2a 29 20 3d 20 61 75  ,unixFile*) = au
1d7d0 74 6f 6c 6f 63 6b 49 6f 46 69 6e 64 65 72 49 6d  tolockIoFinderIm
1d7e0 70 6c 3b 0a 0a 23 65 6e 64 69 66 20 2f 2a 20 4f  pl;..#endif /* O
1d7f0 53 5f 56 58 57 4f 52 4b 53 20 26 26 20 53 51 4c  S_VXWORKS && SQL
1d800 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49  ITE_ENABLE_LOCKI
1d810 4e 47 5f 53 54 59 4c 45 20 2a 2f 0a 0a 2f 2a 0a  NG_STYLE */../*.
1d820 2a 2a 20 41 6e 20 61 62 73 74 72 61 63 74 20 74  ** An abstract t
1d830 79 70 65 20 66 6f 72 20 61 20 70 6f 69 6e 74 65  ype for a pointe
1d840 72 20 74 6f 20 61 20 49 4f 20 6d 65 74 68 6f 64  r to a IO method
1d850 20 66 69 6e 64 65 72 20 66 75 6e 63 74 69 6f 6e   finder function
1d860 3a 0a 2a 2f 0a 74 79 70 65 64 65 66 20 63 6f 6e  :.*/.typedef con
1d870 73 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65  st sqlite3_io_me
1d880 74 68 6f 64 73 20 2a 28 2a 66 69 6e 64 65 72 5f  thods *(*finder_
1d890 74 79 70 65 29 28 63 6f 6e 73 74 20 63 68 61 72  type)(const char
1d8a0 2a 2c 75 6e 69 78 46 69 6c 65 2a 29 3b 0a 0a 0a  *,unixFile*);...
1d8b0 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  /***************
1d8c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1d8d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1d8e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1d8f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a  *************.**
1d900 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1d910 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 73 71 6c 69 74  ********** sqlit
1d920 65 33 5f 76 66 73 20 6d 65 74 68 6f 64 73 20 2a  e3_vfs methods *
1d930 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1d940 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a  ***********.**.*
1d950 2a 20 54 68 69 73 20 64 69 76 69 73 69 6f 6e 20  * This division 
1d960 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 69 6d 70  contains the imp
1d970 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 6d  lementation of m
1d980 65 74 68 6f 64 73 20 6f 6e 20 74 68 65 0a 2a 2a  ethods on the.**
1d990 20 73 71 6c 69 74 65 33 5f 76 66 73 20 6f 62 6a   sqlite3_vfs obj
1d9a0 65 63 74 2e 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 49  ect..*/../*.** I
1d9b0 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 63 6f  nitialize the co
1d9c0 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 75 6e  ntents of the un
1d9d0 69 78 46 69 6c 65 20 73 74 72 75 63 74 75 72 65  ixFile structure
1d9e0 20 70 6f 69 6e 74 65 64 20 74 6f 20 62 79 20 70   pointed to by p
1d9f0 49 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  Id..*/.static in
1da00 74 20 66 69 6c 6c 49 6e 55 6e 69 78 46 69 6c 65  t fillInUnixFile
1da10 28 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20  (.  sqlite3_vfs 
1da20 2a 70 56 66 73 2c 20 20 20 20 20 20 2f 2a 20 50  *pVfs,      /* P
1da30 6f 69 6e 74 65 72 20 74 6f 20 76 66 73 20 6f 62  ointer to vfs ob
1da40 6a 65 63 74 20 2a 2f 0a 20 20 69 6e 74 20 68 2c  ject */.  int h,
1da50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1da60 20 20 2f 2a 20 4f 70 65 6e 20 66 69 6c 65 20 64    /* Open file d
1da70 65 73 63 72 69 70 74 6f 72 20 6f 66 20 66 69 6c  escriptor of fil
1da80 65 20 62 65 69 6e 67 20 6f 70 65 6e 65 64 20 2a  e being opened *
1da90 2f 0a 20 20 69 6e 74 20 64 69 72 66 64 2c 20 20  /.  int dirfd,  
1daa0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44              /* D
1dab0 69 72 65 63 74 6f 72 79 20 66 69 6c 65 20 64 65  irectory file de
1dac0 73 63 72 69 70 74 6f 72 20 2a 2f 0a 20 20 73 71  scriptor */.  sq
1dad0 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 49 64 2c  lite3_file *pId,
1dae0 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74        /* Write t
1daf0 6f 20 74 68 65 20 75 6e 69 78 46 69 6c 65 20 73  o the unixFile s
1db00 74 72 75 63 74 75 72 65 20 68 65 72 65 20 2a 2f  tructure here */
1db10 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
1db20 46 69 6c 65 6e 61 6d 65 2c 20 20 2f 2a 20 4e 61  Filename,  /* Na
1db30 6d 65 20 6f 66 20 74 68 65 20 66 69 6c 65 20 62  me of the file b
1db40 65 69 6e 67 20 6f 70 65 6e 65 64 20 2a 2f 0a 20  eing opened */. 
1db50 20 69 6e 74 20 6e 6f 4c 6f 63 6b 2c 20 20 20 20   int noLock,    
1db60 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 6d 69 74           /* Omit
1db70 20 6c 6f 63 6b 69 6e 67 20 69 66 20 74 72 75 65   locking if true
1db80 20 2a 2f 0a 20 20 69 6e 74 20 69 73 44 65 6c 65   */.  int isDele
1db90 74 65 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  te            /*
1dba0 20 44 65 6c 65 74 65 20 6f 6e 20 63 6c 6f 73 65   Delete on close
1dbb0 20 69 66 20 74 72 75 65 20 2a 2f 0a 29 7b 0a 20   if true */.){. 
1dbc0 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 69   const sqlite3_i
1dbd0 6f 5f 6d 65 74 68 6f 64 73 20 2a 70 4c 6f 63 6b  o_methods *pLock
1dbe0 69 6e 67 53 74 79 6c 65 3b 0a 20 20 75 6e 69 78  ingStyle;.  unix
1dbf0 46 69 6c 65 20 2a 70 4e 65 77 20 3d 20 28 75 6e  File *pNew = (un
1dc00 69 78 46 69 6c 65 20 2a 29 70 49 64 3b 0a 20 20  ixFile *)pId;.  
1dc10 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
1dc20 4f 4b 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70  OK;..  assert( p
1dc30 4e 65 77 2d 3e 70 4c 6f 63 6b 3d 3d 4e 55 4c 4c  New->pLock==NULL
1dc40 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4e   );.  assert( pN
1dc50 65 77 2d 3e 70 4f 70 65 6e 3d 3d 4e 55 4c 4c 20  ew->pOpen==NULL 
1dc60 29 3b 0a 0a 20 20 2f 2a 20 50 61 72 61 6d 65 74  );..  /* Paramet
1dc70 65 72 20 69 73 44 65 6c 65 74 65 20 69 73 20 6f  er isDelete is o
1dc80 6e 6c 79 20 75 73 65 64 20 6f 6e 20 76 78 77 6f  nly used on vxwo
1dc90 72 6b 73 2e 20 45 78 70 72 65 73 73 20 74 68 69  rks. Express thi
1dca0 73 20 65 78 70 6c 69 63 69 74 6c 79 20 0a 20 20  s explicitly .  
1dcb0 2a 2a 20 68 65 72 65 20 74 6f 20 70 72 65 76 65  ** here to preve
1dcc0 6e 74 20 63 6f 6d 70 69 6c 65 72 20 77 61 72 6e  nt compiler warn
1dcd0 69 6e 67 73 20 61 62 6f 75 74 20 75 6e 75 73 65  ings about unuse
1dce0 64 20 70 61 72 61 6d 65 74 65 72 73 2e 0a 20 20  d parameters..  
1dcf0 2a 2f 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  */.  UNUSED_PARA
1dd00 4d 45 54 45 52 28 69 73 44 65 6c 65 74 65 29 3b  METER(isDelete);
1dd10 0a 0a 20 20 4f 53 54 52 41 43 45 33 28 22 4f 50  ..  OSTRACE3("OP
1dd20 45 4e 20 20 20 20 25 2d 33 64 20 25 73 5c 6e 22  EN    %-3d %s\n"
1dd30 2c 20 68 2c 20 7a 46 69 6c 65 6e 61 6d 65 29 3b  , h, zFilename);
1dd40 20 20 20 20 0a 20 20 70 4e 65 77 2d 3e 68 20 3d      .  pNew->h =
1dd50 20 68 3b 0a 20 20 70 4e 65 77 2d 3e 64 69 72 66   h;.  pNew->dirf
1dd60 64 20 3d 20 64 69 72 66 64 3b 0a 20 20 53 45 54  d = dirfd;.  SET
1dd70 5f 54 48 52 45 41 44 49 44 28 70 4e 65 77 29 3b  _THREADID(pNew);
1dd80 0a 20 20 70 4e 65 77 2d 3e 66 69 6c 65 46 6c 61  .  pNew->fileFla
1dd90 67 73 20 3d 20 30 3b 0a 0a 23 69 66 20 4f 53 5f  gs = 0;..#if OS_
1dda0 56 58 57 4f 52 4b 53 0a 20 20 70 4e 65 77 2d 3e  VXWORKS.  pNew->
1ddb0 70 49 64 20 3d 20 76 78 77 6f 72 6b 73 46 69 6e  pId = vxworksFin
1ddc0 64 46 69 6c 65 49 64 28 7a 46 69 6c 65 6e 61 6d  dFileId(zFilenam
1ddd0 65 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 2d 3e  e);.  if( pNew->
1dde0 70 49 64 3d 3d 30 20 29 7b 0a 20 20 20 20 6e 6f  pId==0 ){.    no
1ddf0 4c 6f 63 6b 20 3d 20 31 3b 0a 20 20 20 20 72 63  Lock = 1;.    rc
1de00 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b   = SQLITE_NOMEM;
1de10 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 69  .  }.#endif..  i
1de20 66 28 20 6e 6f 4c 6f 63 6b 20 29 7b 0a 20 20 20  f( noLock ){.   
1de30 20 70 4c 6f 63 6b 69 6e 67 53 74 79 6c 65 20 3d   pLockingStyle =
1de40 20 26 6e 6f 6c 6f 63 6b 49 6f 4d 65 74 68 6f 64   &nolockIoMethod
1de50 73 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  s;.  }else{.    
1de60 70 4c 6f 63 6b 69 6e 67 53 74 79 6c 65 20 3d 20  pLockingStyle = 
1de70 28 2a 2a 28 66 69 6e 64 65 72 5f 74 79 70 65 2a  (**(finder_type*
1de80 29 70 56 66 73 2d 3e 70 41 70 70 44 61 74 61 29  )pVfs->pAppData)
1de90 28 7a 46 69 6c 65 6e 61 6d 65 2c 20 70 4e 65 77  (zFilename, pNew
1dea0 29 3b 0a 23 69 66 20 53 51 4c 49 54 45 5f 45 4e  );.#if SQLITE_EN
1deb0 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59  ABLE_LOCKING_STY
1dec0 4c 45 0a 20 20 20 20 2f 2a 20 43 61 63 68 65 20  LE.    /* Cache 
1ded0 7a 46 69 6c 65 6e 61 6d 65 20 69 6e 20 74 68 65  zFilename in the
1dee0 20 6c 6f 63 6b 69 6e 67 20 63 6f 6e 74 65 78 74   locking context
1def0 20 28 41 46 50 20 61 6e 64 20 64 6f 74 6c 6f 63   (AFP and dotloc
1df00 6b 20 6f 76 65 72 72 69 64 65 29 20 66 6f 72 0a  k override) for.
1df10 20 20 20 20 2a 2a 20 70 72 6f 78 79 4c 6f 63 6b      ** proxyLock
1df20 20 61 63 74 69 76 61 74 69 6f 6e 20 69 73 20 70   activation is p
1df30 6f 73 73 69 62 6c 65 20 28 72 65 6d 6f 74 65 20  ossible (remote 
1df40 70 72 6f 78 79 20 69 73 20 62 61 73 65 64 20 6f  proxy is based o
1df50 6e 20 64 62 20 6e 61 6d 65 29 0a 20 20 20 20 2a  n db name).    *
1df60 2a 20 7a 46 69 6c 65 6e 61 6d 65 20 72 65 6d 61  * zFilename rema
1df70 69 6e 73 20 76 61 6c 69 64 20 75 6e 74 69 6c 20  ins valid until 
1df80 66 69 6c 65 20 69 73 20 63 6c 6f 73 65 64 2c 20  file is closed, 
1df90 74 6f 20 73 75 70 70 6f 72 74 20 2a 2f 0a 20 20  to support */.  
1dfa0 20 20 70 4e 65 77 2d 3e 6c 6f 63 6b 69 6e 67 43    pNew->lockingC
1dfb0 6f 6e 74 65 78 74 20 3d 20 28 76 6f 69 64 2a 29  ontext = (void*)
1dfc0 7a 46 69 6c 65 6e 61 6d 65 3b 0a 23 65 6e 64 69  zFilename;.#endi
1dfd0 66 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 4c 6f  f.  }..  if( pLo
1dfe0 63 6b 69 6e 67 53 74 79 6c 65 20 3d 3d 20 26 70  ckingStyle == &p
1dff0 6f 73 69 78 49 6f 4d 65 74 68 6f 64 73 0a 23 69  osixIoMethods.#i
1e000 66 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c  f defined(__APPL
1e010 45 5f 5f 29 20 26 26 20 53 51 4c 49 54 45 5f 45  E__) && SQLITE_E
1e020 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54  NABLE_LOCKING_ST
1e030 59 4c 45 0a 20 20 20 20 7c 7c 20 70 4c 6f 63 6b  YLE.    || pLock
1e040 69 6e 67 53 74 79 6c 65 20 3d 3d 20 26 6e 66 73  ingStyle == &nfs
1e050 49 6f 4d 65 74 68 6f 64 73 0a 23 65 6e 64 69 66  IoMethods.#endif
1e060 0a 20 20 29 7b 0a 20 20 20 20 75 6e 69 78 45 6e  .  ){.    unixEn
1e070 74 65 72 4d 75 74 65 78 28 29 3b 0a 20 20 20 20  terMutex();.    
1e080 72 63 20 3d 20 66 69 6e 64 4c 6f 63 6b 49 6e 66  rc = findLockInf
1e090 6f 28 70 4e 65 77 2c 20 26 70 4e 65 77 2d 3e 70  o(pNew, &pNew->p
1e0a0 4c 6f 63 6b 2c 20 26 70 4e 65 77 2d 3e 70 4f 70  Lock, &pNew->pOp
1e0b0 65 6e 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  en);.    if( rc!
1e0c0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1e0d0 20 20 20 20 2f 2a 20 49 66 20 61 6e 20 65 72 72      /* If an err
1e0e0 6f 72 20 6f 63 63 75 72 65 64 20 69 6e 20 66 69  or occured in fi
1e0f0 6e 64 4c 6f 63 6b 49 6e 66 6f 28 29 2c 20 63 6c  ndLockInfo(), cl
1e100 6f 73 65 20 74 68 65 20 66 69 6c 65 20 64 65 73  ose the file des
1e110 63 72 69 70 74 6f 72 0a 20 20 20 20 20 20 2a 2a  criptor.      **
1e120 20 69 6d 6d 65 64 69 61 74 65 6c 79 2c 20 62 65   immediately, be
1e130 66 6f 72 65 20 72 65 6c 65 61 73 69 6e 67 20 74  fore releasing t
1e140 68 65 20 6d 75 74 65 78 2e 20 66 69 6e 64 4c 6f  he mutex. findLo
1e150 63 6b 49 6e 66 6f 28 29 20 6d 61 79 20 66 61 69  ckInfo() may fai
1e160 6c 0a 20 20 20 20 20 20 2a 2a 20 69 6e 20 74 77  l.      ** in tw
1e170 6f 20 73 63 65 6e 61 72 69 6f 73 3a 0a 20 20 20  o scenarios:.   
1e180 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 20     **.      **  
1e190 20 28 61 29 20 41 20 63 61 6c 6c 20 74 6f 20 66   (a) A call to f
1e1a0 73 74 61 74 28 29 20 66 61 69 6c 65 64 2e 0a 20  stat() failed.. 
1e1b0 20 20 20 20 20 2a 2a 20 20 20 28 62 29 20 41 20       **   (b) A 
1e1c0 6d 61 6c 6c 6f 63 20 66 61 69 6c 65 64 2e 0a 20  malloc failed.. 
1e1d0 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a       **.      **
1e1e0 20 53 63 65 6e 61 72 69 6f 20 28 62 29 20 6d 61   Scenario (b) ma
1e1f0 79 20 6f 6e 6c 79 20 6f 63 63 75 72 20 69 66 20  y only occur if 
1e200 74 68 65 20 70 72 6f 63 65 73 73 20 69 73 20 68  the process is h
1e210 6f 6c 64 69 6e 67 20 6e 6f 20 6f 74 68 65 72 0a  olding no other.
1e220 20 20 20 20 20 20 2a 2a 20 66 69 6c 65 20 64 65        ** file de
1e230 73 63 72 69 70 74 6f 72 73 20 6f 70 65 6e 20 6f  scriptors open o
1e240 6e 20 74 68 65 20 73 61 6d 65 20 66 69 6c 65 2e  n the same file.
1e250 20 49 66 20 74 68 65 72 65 20 77 65 72 65 20 6f   If there were o
1e260 74 68 65 72 20 66 69 6c 65 0a 20 20 20 20 20 20  ther file.      
1e270 2a 2a 20 64 65 73 63 72 69 70 74 6f 72 73 20 6f  ** descriptors o
1e280 6e 20 74 68 69 73 20 66 69 6c 65 2c 20 74 68 65  n this file, the
1e290 6e 20 6e 6f 20 6d 61 6c 6c 6f 63 20 77 6f 75 6c  n no malloc woul
1e2a0 64 20 62 65 20 72 65 71 75 69 72 65 64 20 62 79  d be required by
1e2b0 0a 20 20 20 20 20 20 2a 2a 20 66 69 6e 64 4c 6f  .      ** findLo
1e2c0 63 6b 49 6e 66 6f 28 29 2e 20 49 66 20 74 68 69  ckInfo(). If thi
1e2d0 73 20 69 73 20 74 68 65 20 63 61 73 65 2c 20 69  s is the case, i
1e2e0 74 20 69 73 20 71 75 69 74 65 20 73 61 66 65 20  t is quite safe 
1e2f0 74 6f 20 63 6c 6f 73 65 0a 20 20 20 20 20 20 2a  to close.      *
1e300 2a 20 68 61 6e 64 6c 65 20 68 20 2d 20 61 73 20  * handle h - as 
1e310 69 74 20 69 73 20 67 75 61 72 61 6e 74 65 65 64  it is guaranteed
1e320 20 74 68 61 74 20 6e 6f 20 70 6f 73 69 78 20 6c   that no posix l
1e330 6f 63 6b 73 20 77 69 6c 6c 20 62 65 20 72 65 6c  ocks will be rel
1e340 65 61 73 65 64 0a 20 20 20 20 20 20 2a 2a 20 62  eased.      ** b
1e350 79 20 64 6f 69 6e 67 20 73 6f 2e 0a 20 20 20 20  y doing so..    
1e360 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 49 66    **.      ** If
1e370 20 73 63 65 6e 61 72 69 6f 20 28 61 29 20 63 61   scenario (a) ca
1e380 75 73 65 64 20 74 68 65 20 65 72 72 6f 72 20 74  used the error t
1e390 68 65 6e 20 74 68 69 6e 67 73 20 61 72 65 20 6e  hen things are n
1e3a0 6f 74 20 73 6f 20 73 61 66 65 2e 20 54 68 65 0a  ot so safe. The.
1e3b0 20 20 20 20 20 20 2a 2a 20 69 6d 70 6c 69 63 69        ** implici
1e3c0 74 20 61 73 73 75 6d 70 74 69 6f 6e 20 68 65 72  t assumption her
1e3d0 65 20 69 73 20 74 68 61 74 20 69 66 20 66 73 74  e is that if fst
1e3e0 61 74 28 29 20 66 61 69 6c 73 2c 20 74 68 69 6e  at() fails, thin
1e3f0 67 73 20 61 72 65 20 69 6e 0a 20 20 20 20 20 20  gs are in.      
1e400 2a 2a 20 73 75 63 68 20 62 61 64 20 73 68 61 70  ** such bad shap
1e410 65 20 74 68 61 74 20 64 72 6f 70 70 69 6e 67 20  e that dropping 
1e420 61 20 6c 6f 63 6b 20 6f 72 20 74 77 6f 20 64 6f  a lock or two do
1e430 65 73 6e 27 74 20 6d 61 74 74 65 72 20 6d 75 63  esn't matter muc
1e440 68 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  h..      */.    
1e450 20 20 63 6c 6f 73 65 28 68 29 3b 0a 20 20 20 20    close(h);.    
1e460 20 20 68 20 3d 20 2d 31 3b 0a 20 20 20 20 7d 0a    h = -1;.    }.
1e470 20 20 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74      unixLeaveMut
1e480 65 78 28 29 3b 0a 20 20 7d 0a 0a 23 69 66 20 53  ex();.  }..#if S
1e490 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43  QLITE_ENABLE_LOC
1e4a0 4b 49 4e 47 5f 53 54 59 4c 45 20 26 26 20 64 65  KING_STYLE && de
1e4b0 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29  fined(__APPLE__)
1e4c0 0a 20 20 65 6c 73 65 20 69 66 28 20 70 4c 6f 63  .  else if( pLoc
1e4d0 6b 69 6e 67 53 74 79 6c 65 20 3d 3d 20 26 61 66  kingStyle == &af
1e4e0 70 49 6f 4d 65 74 68 6f 64 73 20 29 7b 0a 20 20  pIoMethods ){.  
1e4f0 20 20 2f 2a 20 41 46 50 20 6c 6f 63 6b 69 6e 67    /* AFP locking
1e500 20 75 73 65 73 20 74 68 65 20 66 69 6c 65 20 70   uses the file p
1e510 61 74 68 20 73 6f 20 69 74 20 6e 65 65 64 73 20  ath so it needs 
1e520 74 6f 20 62 65 20 69 6e 63 6c 75 64 65 64 20 69  to be included i
1e530 6e 0a 20 20 20 20 2a 2a 20 74 68 65 20 61 66 70  n.    ** the afp
1e540 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 2e 0a  LockingContext..
1e550 20 20 20 20 2a 2f 0a 20 20 20 20 61 66 70 4c 6f      */.    afpLo
1e560 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 70 43  ckingContext *pC
1e570 74 78 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 6c 6f  tx;.    pNew->lo
1e580 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 3d 20 70  ckingContext = p
1e590 43 74 78 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61  Ctx = sqlite3_ma
1e5a0 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 2a 70 43  lloc( sizeof(*pC
1e5b0 74 78 29 20 29 3b 0a 20 20 20 20 69 66 28 20 70  tx) );.    if( p
1e5c0 43 74 78 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  Ctx==0 ){.      
1e5d0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  rc = SQLITE_NOME
1e5e0 4d 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  M;.    }else{.  
1e5f0 20 20 20 20 2f 2a 20 4e 42 3a 20 7a 46 69 6c 65      /* NB: zFile
1e600 6e 61 6d 65 20 65 78 69 73 74 73 20 61 6e 64 20  name exists and 
1e610 72 65 6d 61 69 6e 73 20 76 61 6c 69 64 20 75 6e  remains valid un
1e620 74 69 6c 20 74 68 65 20 66 69 6c 65 20 69 73 20  til the file is 
1e630 63 6c 6f 73 65 64 0a 20 20 20 20 20 20 2a 2a 20  closed.      ** 
1e640 61 63 63 6f 72 64 69 6e 67 20 74 6f 20 72 65 71  according to req
1e650 75 69 72 65 6d 65 6e 74 20 46 31 31 31 34 31 2e  uirement F11141.
1e660 20 20 53 6f 20 77 65 20 64 6f 20 6e 6f 74 20 6e    So we do not n
1e670 65 65 64 20 74 6f 20 6d 61 6b 65 20 61 0a 20 20  eed to make a.  
1e680 20 20 20 20 2a 2a 20 63 6f 70 79 20 6f 66 20 74      ** copy of t
1e690 68 65 20 66 69 6c 65 6e 61 6d 65 2e 20 2a 2f 0a  he filename. */.
1e6a0 20 20 20 20 20 20 70 43 74 78 2d 3e 64 62 50 61        pCtx->dbPa
1e6b0 74 68 20 3d 20 7a 46 69 6c 65 6e 61 6d 65 3b 0a  th = zFilename;.
1e6c0 20 20 20 20 20 20 70 43 74 78 2d 3e 72 65 73 65        pCtx->rese
1e6d0 72 76 65 64 20 3d 20 30 3b 0a 20 20 20 20 20 20  rved = 0;.      
1e6e0 73 72 61 6e 64 6f 6d 64 65 76 28 29 3b 0a 20 20  srandomdev();.  
1e6f0 20 20 20 20 75 6e 69 78 45 6e 74 65 72 4d 75 74      unixEnterMut
1e700 65 78 28 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  ex();.      rc =
1e710 20 66 69 6e 64 4c 6f 63 6b 49 6e 66 6f 28 70 4e   findLockInfo(pN
1e720 65 77 2c 20 26 70 4e 65 77 2d 3e 70 4c 6f 63 6b  ew, &pNew->pLock
1e730 2c 20 26 70 4e 65 77 2d 3e 70 4f 70 65 6e 29 3b  , &pNew->pOpen);
1e740 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53  .      if( rc!=S
1e750 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1e760 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
1e770 28 70 4e 65 77 2d 3e 6c 6f 63 6b 69 6e 67 43 6f  (pNew->lockingCo
1e780 6e 74 65 78 74 29 3b 0a 20 20 20 20 20 20 20 20  ntext);.        
1e790 63 6c 6f 73 65 28 68 29 3b 0a 20 20 20 20 20 20  close(h);.      
1e7a0 20 20 68 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20    h = -1;.      
1e7b0 7d 0a 20 20 20 20 20 20 75 6e 69 78 4c 65 61 76  }.      unixLeav
1e7c0 65 4d 75 74 65 78 28 29 3b 20 20 20 20 20 20 20  eMutex();       
1e7d0 20 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64   .    }.  }.#end
1e7e0 69 66 0a 0a 20 20 65 6c 73 65 20 69 66 28 20 70  if..  else if( p
1e7f0 4c 6f 63 6b 69 6e 67 53 74 79 6c 65 20 3d 3d 20  LockingStyle == 
1e800 26 64 6f 74 6c 6f 63 6b 49 6f 4d 65 74 68 6f 64  &dotlockIoMethod
1e810 73 20 29 7b 0a 20 20 20 20 2f 2a 20 44 6f 74 66  s ){.    /* Dotf
1e820 69 6c 65 20 6c 6f 63 6b 69 6e 67 20 75 73 65 73  ile locking uses
1e830 20 74 68 65 20 66 69 6c 65 20 70 61 74 68 20 73   the file path s
1e840 6f 20 69 74 20 6e 65 65 64 73 20 74 6f 20 62 65  o it needs to be
1e850 20 69 6e 63 6c 75 64 65 64 20 69 6e 0a 20 20 20   included in.   
1e860 20 2a 2a 20 74 68 65 20 64 6f 74 6c 6f 63 6b 4c   ** the dotlockL
1e870 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 0a 20  ockingContext . 
1e880 20 20 20 2a 2f 0a 20 20 20 20 63 68 61 72 20 2a     */.    char *
1e890 7a 4c 6f 63 6b 46 69 6c 65 3b 0a 20 20 20 20 69  zLockFile;.    i
1e8a0 6e 74 20 6e 46 69 6c 65 6e 61 6d 65 3b 0a 20 20  nt nFilename;.  
1e8b0 20 20 6e 46 69 6c 65 6e 61 6d 65 20 3d 20 28 69    nFilename = (i
1e8c0 6e 74 29 73 74 72 6c 65 6e 28 7a 46 69 6c 65 6e  nt)strlen(zFilen
1e8d0 61 6d 65 29 20 2b 20 36 3b 0a 20 20 20 20 7a 4c  ame) + 6;.    zL
1e8e0 6f 63 6b 46 69 6c 65 20 3d 20 28 63 68 61 72 20  ockFile = (char 
1e8f0 2a 29 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63  *)sqlite3_malloc
1e900 28 6e 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20  (nFilename);.   
1e910 20 69 66 28 20 7a 4c 6f 63 6b 46 69 6c 65 3d 3d   if( zLockFile==
1e920 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  0 ){.      rc = 
1e930 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
1e940 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73    }else{.      s
1e950 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
1e960 6e 46 69 6c 65 6e 61 6d 65 2c 20 7a 4c 6f 63 6b  nFilename, zLock
1e970 46 69 6c 65 2c 20 22 25 73 22 20 44 4f 54 4c 4f  File, "%s" DOTLO
1e980 43 4b 5f 53 55 46 46 49 58 2c 20 7a 46 69 6c 65  CK_SUFFIX, zFile
1e990 6e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20  name);.    }.   
1e9a0 20 70 4e 65 77 2d 3e 6c 6f 63 6b 69 6e 67 43 6f   pNew->lockingCo
1e9b0 6e 74 65 78 74 20 3d 20 7a 4c 6f 63 6b 46 69 6c  ntext = zLockFil
1e9c0 65 3b 0a 20 20 7d 0a 0a 23 69 66 20 4f 53 5f 56  e;.  }..#if OS_V
1e9d0 58 57 4f 52 4b 53 0a 20 20 65 6c 73 65 20 69 66  XWORKS.  else if
1e9e0 28 20 70 4c 6f 63 6b 69 6e 67 53 74 79 6c 65 20  ( pLockingStyle 
1e9f0 3d 3d 20 26 73 65 6d 49 6f 4d 65 74 68 6f 64 73  == &semIoMethods
1ea00 20 29 7b 0a 20 20 20 20 2f 2a 20 4e 61 6d 65 64   ){.    /* Named
1ea10 20 73 65 6d 61 70 68 6f 72 65 20 6c 6f 63 6b 69   semaphore locki
1ea20 6e 67 20 75 73 65 73 20 74 68 65 20 66 69 6c 65  ng uses the file
1ea30 20 70 61 74 68 20 73 6f 20 69 74 20 6e 65 65 64   path so it need
1ea40 73 20 74 6f 20 62 65 0a 20 20 20 20 2a 2a 20 69  s to be.    ** i
1ea50 6e 63 6c 75 64 65 64 20 69 6e 20 74 68 65 20 73  ncluded in the s
1ea60 65 6d 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  emLockingContext
1ea70 0a 20 20 20 20 2a 2f 0a 20 20 20 20 75 6e 69 78  .    */.    unix
1ea80 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 20 20  EnterMutex();.  
1ea90 20 20 72 63 20 3d 20 66 69 6e 64 4c 6f 63 6b 49    rc = findLockI
1eaa0 6e 66 6f 28 70 4e 65 77 2c 20 26 70 4e 65 77 2d  nfo(pNew, &pNew-
1eab0 3e 70 4c 6f 63 6b 2c 20 26 70 4e 65 77 2d 3e 70  >pLock, &pNew->p
1eac0 4f 70 65 6e 29 3b 0a 20 20 20 20 69 66 28 20 28  Open);.    if( (
1ead0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 29 20 26  rc==SQLITE_OK) &
1eae0 26 20 28 70 4e 65 77 2d 3e 70 4f 70 65 6e 2d 3e  & (pNew->pOpen->
1eaf0 70 53 65 6d 3d 3d 4e 55 4c 4c 29 20 29 7b 0a 20  pSem==NULL) ){. 
1eb00 20 20 20 20 20 63 68 61 72 20 2a 7a 53 65 6d 4e       char *zSemN
1eb10 61 6d 65 20 3d 20 70 4e 65 77 2d 3e 70 4f 70 65  ame = pNew->pOpe
1eb20 6e 2d 3e 61 53 65 6d 4e 61 6d 65 3b 0a 20 20 20  n->aSemName;.   
1eb30 20 20 20 69 6e 74 20 6e 3b 0a 20 20 20 20 20 20     int n;.      
1eb40 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
1eb50 28 4d 41 58 5f 50 41 54 48 4e 41 4d 45 2c 20 7a  (MAX_PATHNAME, z
1eb60 53 65 6d 4e 61 6d 65 2c 20 22 2f 25 73 2e 73 65  SemName, "/%s.se
1eb70 6d 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  m",.            
1eb80 20 20 20 20 20 20 20 20 20 20 20 70 4e 65 77 2d             pNew-
1eb90 3e 70 49 64 2d 3e 7a 43 61 6e 6f 6e 69 63 61 6c  >pId->zCanonical
1eba0 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 66 6f 72  Name);.      for
1ebb0 28 20 6e 3d 31 3b 20 7a 53 65 6d 4e 61 6d 65 5b  ( n=1; zSemName[
1ebc0 6e 5d 3b 20 6e 2b 2b 20 29 0a 20 20 20 20 20 20  n]; n++ ).      
1ebd0 20 20 69 66 28 20 7a 53 65 6d 4e 61 6d 65 5b 6e    if( zSemName[n
1ebe0 5d 3d 3d 27 2f 27 20 29 20 7a 53 65 6d 4e 61 6d  ]=='/' ) zSemNam
1ebf0 65 5b 6e 5d 20 3d 20 27 5f 27 3b 0a 20 20 20 20  e[n] = '_';.    
1ec00 20 20 70 4e 65 77 2d 3e 70 4f 70 65 6e 2d 3e 70    pNew->pOpen->p
1ec10 53 65 6d 20 3d 20 73 65 6d 5f 6f 70 65 6e 28 7a  Sem = sem_open(z
1ec20 53 65 6d 4e 61 6d 65 2c 20 4f 5f 43 52 45 41 54  SemName, O_CREAT
1ec30 2c 20 30 36 36 36 2c 20 31 29 3b 0a 20 20 20 20  , 0666, 1);.    
1ec40 20 20 69 66 28 20 70 4e 65 77 2d 3e 70 4f 70 65    if( pNew->pOpe
1ec50 6e 2d 3e 70 53 65 6d 20 3d 3d 20 53 45 4d 5f 46  n->pSem == SEM_F
1ec60 41 49 4c 45 44 20 29 7b 0a 20 20 20 20 20 20 20  AILED ){.       
1ec70 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d   rc = SQLITE_NOM
1ec80 45 4d 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77  EM;.        pNew
1ec90 2d 3e 70 4f 70 65 6e 2d 3e 61 53 65 6d 4e 61 6d  ->pOpen->aSemNam
1eca0 65 5b 30 5d 20 3d 20 27 5c 30 27 3b 0a 20 20 20  e[0] = '\0';.   
1ecb0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 75     }.    }.    u
1ecc0 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b  nixLeaveMutex();
1ecd0 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 0a 20  .  }.#endif.  . 
1ece0 20 70 4e 65 77 2d 3e 6c 61 73 74 45 72 72 6e 6f   pNew->lastErrno
1ecf0 20 3d 20 30 3b 0a 23 69 66 20 4f 53 5f 56 58 57   = 0;.#if OS_VXW
1ed00 4f 52 4b 53 0a 20 20 69 66 28 20 72 63 21 3d 53  ORKS.  if( rc!=S
1ed10 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1ed20 69 66 28 20 68 3e 3d 30 20 29 20 63 6c 6f 73 65  if( h>=0 ) close
1ed30 28 68 29 3b 0a 20 20 20 20 68 20 3d 20 2d 31 3b  (h);.    h = -1;
1ed40 0a 20 20 20 20 75 6e 6c 69 6e 6b 28 7a 46 69 6c  .    unlink(zFil
1ed50 65 6e 61 6d 65 29 3b 0a 20 20 20 20 69 73 44 65  ename);.    isDe
1ed60 6c 65 74 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  lete = 0;.  }.  
1ed70 70 4e 65 77 2d 3e 69 73 44 65 6c 65 74 65 20 3d  pNew->isDelete =
1ed80 20 69 73 44 65 6c 65 74 65 3b 0a 23 65 6e 64 69   isDelete;.#endi
1ed90 66 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  f.  if( rc!=SQLI
1eda0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28  TE_OK ){.    if(
1edb0 20 64 69 72 66 64 3e 3d 30 20 29 20 63 6c 6f 73   dirfd>=0 ) clos
1edc0 65 28 64 69 72 66 64 29 3b 20 2f 2a 20 73 69 6c  e(dirfd); /* sil
1edd0 65 6e 74 20 6c 65 61 6b 20 69 66 20 66 61 69 6c  ent leak if fail
1ede0 2c 20 61 6c 72 65 61 64 79 20 69 6e 20 65 72 72  , already in err
1edf0 6f 72 20 2a 2f 0a 20 20 20 20 69 66 28 20 68 3e  or */.    if( h>
1ee00 3d 30 20 29 20 63 6c 6f 73 65 28 68 29 3b 0a 20  =0 ) close(h);. 
1ee10 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 4e 65 77   }else{.    pNew
1ee20 2d 3e 70 4d 65 74 68 6f 64 20 3d 20 70 4c 6f 63  ->pMethod = pLoc
1ee30 6b 69 6e 67 53 74 79 6c 65 3b 0a 20 20 20 20 4f  kingStyle;.    O
1ee40 70 65 6e 43 6f 75 6e 74 65 72 28 2b 31 29 3b 0a  penCounter(+1);.
1ee50 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
1ee60 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 61  .}../*.** Open a
1ee70 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
1ee80 20 74 6f 20 74 68 65 20 64 69 72 65 63 74 6f 72   to the director
1ee90 79 20 63 6f 6e 74 61 69 6e 69 6e 67 20 66 69 6c  y containing fil
1eea0 65 20 7a 46 69 6c 65 6e 61 6d 65 2e 0a 2a 2a 20  e zFilename..** 
1eeb0 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20 2a  If successful, *
1eec0 70 46 64 20 69 73 20 73 65 74 20 74 6f 20 74 68  pFd is set to th
1eed0 65 20 6f 70 65 6e 65 64 20 66 69 6c 65 20 64 65  e opened file de
1eee0 73 63 72 69 70 74 6f 72 20 61 6e 64 0a 2a 2a 20  scriptor and.** 
1eef0 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74  SQLITE_OK is ret
1ef00 75 72 6e 65 64 2e 20 49 66 20 61 6e 20 65 72 72  urned. If an err
1ef10 6f 72 20 6f 63 63 75 72 73 2c 20 65 69 74 68 65  or occurs, eithe
1ef20 72 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 0a 2a  r SQLITE_NOMEM.*
1ef30 2a 20 6f 72 20 53 51 4c 49 54 45 5f 43 41 4e 54  * or SQLITE_CANT
1ef40 4f 50 45 4e 20 69 73 20 72 65 74 75 72 6e 65 64  OPEN is returned
1ef50 20 61 6e 64 20 2a 70 46 64 20 69 73 20 73 65 74   and *pFd is set
1ef60 20 74 6f 20 61 6e 20 75 6e 64 65 66 69 6e 65 64   to an undefined
1ef70 0a 2a 2a 20 76 61 6c 75 65 2e 0a 2a 2a 0a 2a 2a  .** value..**.**
1ef80 20 49 66 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73   If SQLITE_OK is
1ef90 20 72 65 74 75 72 6e 65 64 2c 20 74 68 65 20 63   returned, the c
1efa0 61 6c 6c 65 72 20 69 73 20 72 65 73 70 6f 6e 73  aller is respons
1efb0 69 62 6c 65 20 66 6f 72 20 63 6c 6f 73 69 6e 67  ible for closing
1efc0 0a 2a 2a 20 74 68 65 20 66 69 6c 65 20 64 65 73  .** the file des
1efd0 63 72 69 70 74 6f 72 20 2a 70 46 64 20 75 73 69  criptor *pFd usi
1efe0 6e 67 20 63 6c 6f 73 65 28 29 2e 0a 2a 2f 0a 73  ng close()..*/.s
1eff0 74 61 74 69 63 20 69 6e 74 20 6f 70 65 6e 44 69  tatic int openDi
1f000 72 65 63 74 6f 72 79 28 63 6f 6e 73 74 20 63 68  rectory(const ch
1f010 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20 69  ar *zFilename, i
1f020 6e 74 20 2a 70 46 64 29 7b 0a 20 20 69 6e 74 20  nt *pFd){.  int 
1f030 69 69 3b 0a 20 20 69 6e 74 20 66 64 20 3d 20 2d  ii;.  int fd = -
1f040 31 3b 0a 20 20 63 68 61 72 20 7a 44 69 72 6e 61  1;.  char zDirna
1f050 6d 65 5b 4d 41 58 5f 50 41 54 48 4e 41 4d 45 2b  me[MAX_PATHNAME+
1f060 31 5d 3b 0a 0a 20 20 73 71 6c 69 74 65 33 5f 73  1];..  sqlite3_s
1f070 6e 70 72 69 6e 74 66 28 4d 41 58 5f 50 41 54 48  nprintf(MAX_PATH
1f080 4e 41 4d 45 2c 20 7a 44 69 72 6e 61 6d 65 2c 20  NAME, zDirname, 
1f090 22 25 73 22 2c 20 7a 46 69 6c 65 6e 61 6d 65 29  "%s", zFilename)
1f0a0 3b 0a 20 20 66 6f 72 28 69 69 3d 28 69 6e 74 29  ;.  for(ii=(int)
1f0b0 73 74 72 6c 65 6e 28 7a 44 69 72 6e 61 6d 65 29  strlen(zDirname)
1f0c0 3b 20 69 69 3e 31 20 26 26 20 7a 44 69 72 6e 61  ; ii>1 && zDirna
1f0d0 6d 65 5b 69 69 5d 21 3d 27 2f 27 3b 20 69 69 2d  me[ii]!='/'; ii-
1f0e0 2d 29 3b 0a 20 20 69 66 28 20 69 69 3e 30 20 29  -);.  if( ii>0 )
1f0f0 7b 0a 20 20 20 20 7a 44 69 72 6e 61 6d 65 5b 69  {.    zDirname[i
1f100 69 5d 20 3d 20 27 5c 30 27 3b 0a 20 20 20 20 66  i] = '\0';.    f
1f110 64 20 3d 20 6f 70 65 6e 28 7a 44 69 72 6e 61 6d  d = open(zDirnam
1f120 65 2c 20 4f 5f 52 44 4f 4e 4c 59 7c 4f 5f 42 49  e, O_RDONLY|O_BI
1f130 4e 41 52 59 2c 20 30 29 3b 0a 20 20 20 20 69 66  NARY, 0);.    if
1f140 28 20 66 64 3e 3d 30 20 29 7b 0a 23 69 66 64 65  ( fd>=0 ){.#ifde
1f150 66 20 46 44 5f 43 4c 4f 45 58 45 43 0a 20 20 20  f FD_CLOEXEC.   
1f160 20 20 20 66 63 6e 74 6c 28 66 64 2c 20 46 5f 53     fcntl(fd, F_S
1f170 45 54 46 44 2c 20 66 63 6e 74 6c 28 66 64 2c 20  ETFD, fcntl(fd, 
1f180 46 5f 47 45 54 46 44 2c 20 30 29 20 7c 20 46 44  F_GETFD, 0) | FD
1f190 5f 43 4c 4f 45 58 45 43 29 3b 0a 23 65 6e 64 69  _CLOEXEC);.#endi
1f1a0 66 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45 33  f.      OSTRACE3
1f1b0 28 22 4f 50 45 4e 44 49 52 20 25 2d 33 64 20 25  ("OPENDIR %-3d %
1f1c0 73 5c 6e 22 2c 20 66 64 2c 20 7a 44 69 72 6e 61  s\n", fd, zDirna
1f1d0 6d 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  me);.    }.  }. 
1f1e0 20 2a 70 46 64 20 3d 20 66 64 3b 0a 20 20 72 65   *pFd = fd;.  re
1f1f0 74 75 72 6e 20 28 66 64 3e 3d 30 3f 53 51 4c 49  turn (fd>=0?SQLI
1f200 54 45 5f 4f 4b 3a 53 51 4c 49 54 45 5f 43 41 4e  TE_OK:SQLITE_CAN
1f210 54 4f 50 45 4e 5f 42 4b 50 54 29 3b 0a 7d 0a 0a  TOPEN_BKPT);.}..
1f220 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61 20 74  /*.** Create a t
1f230 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 20 6e 61  emporary file na
1f240 6d 65 20 69 6e 20 7a 42 75 66 2e 20 20 7a 42 75  me in zBuf.  zBu
1f250 66 20 6d 75 73 74 20 62 65 20 61 6c 6c 6f 63 61  f must be alloca
1f260 74 65 64 0a 2a 2a 20 62 79 20 74 68 65 20 63 61  ted.** by the ca
1f270 6c 6c 69 6e 67 20 70 72 6f 63 65 73 73 20 61 6e  lling process an
1f280 64 20 6d 75 73 74 20 62 65 20 62 69 67 20 65 6e  d must be big en
1f290 6f 75 67 68 20 74 6f 20 68 6f 6c 64 20 61 74 20  ough to hold at 
1f2a0 6c 65 61 73 74 0a 2a 2a 20 70 56 66 73 2d 3e 6d  least.** pVfs->m
1f2b0 78 50 61 74 68 6e 61 6d 65 20 62 79 74 65 73 2e  xPathname bytes.
1f2c0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 67  .*/.static int g
1f2d0 65 74 54 65 6d 70 6e 61 6d 65 28 69 6e 74 20 6e  etTempname(int n
1f2e0 42 75 66 2c 20 63 68 61 72 20 2a 7a 42 75 66 29  Buf, char *zBuf)
1f2f0 7b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74  {.  static const
1f300 20 63 68 61 72 20 2a 61 7a 44 69 72 73 5b 5d 20   char *azDirs[] 
1f310 3d 20 7b 0a 20 20 20 20 20 30 2c 0a 20 20 20 20  = {.     0,.    
1f320 20 30 2c 0a 20 20 20 20 20 22 2f 76 61 72 2f 74   0,.     "/var/t
1f330 6d 70 22 2c 0a 20 20 20 20 20 22 2f 75 73 72 2f  mp",.     "/usr/
1f340 74 6d 70 22 2c 0a 20 20 20 20 20 22 2f 74 6d 70  tmp",.     "/tmp
1f350 22 2c 0a 20 20 20 20 20 22 2e 22 2c 0a 20 20 7d  ",.     ".",.  }
1f360 3b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74  ;.  static const
1f370 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 7a   unsigned char z
1f380 43 68 61 72 73 5b 5d 20 3d 0a 20 20 20 20 22 61  Chars[] =.    "a
1f390 62 63 64 65 66 67 68 69 6a 6b 6c 6d 6e 6f 70 71  bcdefghijklmnopq
1f3a0 72 73 74 75 76 77 78 79 7a 22 0a 20 20 20 20 22  rstuvwxyz".    "
1f3b0 41 42 43 44 45 46 47 48 49 4a 4b 4c 4d 4e 4f 50  ABCDEFGHIJKLMNOP
1f3c0 51 52 53 54 55 56 57 58 59 5a 22 0a 20 20 20 20  QRSTUVWXYZ".    
1f3d0 22 30 31 32 33 34 35 36 37 38 39 22 3b 0a 20 20  "0123456789";.  
1f3e0 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 69 2c 20  unsigned int i, 
1f3f0 6a 3b 0a 20 20 73 74 72 75 63 74 20 73 74 61 74  j;.  struct stat
1f400 20 62 75 66 3b 0a 20 20 63 6f 6e 73 74 20 63 68   buf;.  const ch
1f410 61 72 20 2a 7a 44 69 72 20 3d 20 22 2e 22 3b 0a  ar *zDir = ".";.
1f420 0a 20 20 2f 2a 20 49 74 27 73 20 6f 64 64 20 74  .  /* It's odd t
1f430 6f 20 73 69 6d 75 6c 61 74 65 20 61 6e 20 69 6f  o simulate an io
1f440 2d 65 72 72 6f 72 20 68 65 72 65 2c 20 62 75 74  -error here, but
1f450 20 72 65 61 6c 6c 79 20 74 68 69 73 20 69 73 20   really this is 
1f460 6a 75 73 74 0a 20 20 2a 2a 20 75 73 69 6e 67 20  just.  ** using 
1f470 74 68 65 20 69 6f 2d 65 72 72 6f 72 20 69 6e 66  the io-error inf
1f480 72 61 73 74 72 75 63 74 75 72 65 20 74 6f 20 74  rastructure to t
1f490 65 73 74 20 74 68 61 74 20 53 51 4c 69 74 65 20  est that SQLite 
1f4a0 68 61 6e 64 6c 65 73 20 74 68 69 73 0a 20 20 2a  handles this.  *
1f4b0 2a 20 66 75 6e 63 74 69 6f 6e 20 66 61 69 6c 69  * function faili
1f4c0 6e 67 2e 20 0a 20 20 2a 2f 0a 20 20 53 69 6d 75  ng. .  */.  Simu
1f4d0 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 72 65 74  lateIOError( ret
1f4e0 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  urn SQLITE_IOERR
1f4f0 20 29 3b 0a 0a 20 20 61 7a 44 69 72 73 5b 30 5d   );..  azDirs[0]
1f500 20 3d 20 73 71 6c 69 74 65 33 5f 74 65 6d 70 5f   = sqlite3_temp_
1f510 64 69 72 65 63 74 6f 72 79 3b 0a 20 20 69 66 20  directory;.  if 
1f520 28 4e 55 4c 4c 20 3d 3d 20 61 7a 44 69 72 73 5b  (NULL == azDirs[
1f530 31 5d 29 20 7b 0a 20 20 20 20 61 7a 44 69 72 73  1]) {.    azDirs
1f540 5b 31 5d 20 3d 20 67 65 74 65 6e 76 28 22 54 4d  [1] = getenv("TM
1f550 50 44 49 52 22 29 3b 0a 20 20 7d 0a 20 20 0a 20  PDIR");.  }.  . 
1f560 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 69 7a 65   for(i=0; i<size
1f570 6f 66 28 61 7a 44 69 72 73 29 2f 73 69 7a 65 6f  of(azDirs)/sizeo
1f580 66 28 61 7a 44 69 72 73 5b 30 5d 29 3b 20 69 2b  f(azDirs[0]); i+
1f590 2b 29 7b 0a 20 20 20 20 69 66 28 20 61 7a 44 69  +){.    if( azDi
1f5a0 72 73 5b 69 5d 3d 3d 30 20 29 20 63 6f 6e 74 69  rs[i]==0 ) conti
1f5b0 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 73 74 61  nue;.    if( sta
1f5c0 74 28 61 7a 44 69 72 73 5b 69 5d 2c 20 26 62 75  t(azDirs[i], &bu
1f5d0 66 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  f) ) continue;. 
1f5e0 20 20 20 69 66 28 20 21 53 5f 49 53 44 49 52 28     if( !S_ISDIR(
1f5f0 62 75 66 2e 73 74 5f 6d 6f 64 65 29 20 29 20 63  buf.st_mode) ) c
1f600 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28  ontinue;.    if(
1f610 20 61 63 63 65 73 73 28 61 7a 44 69 72 73 5b 69   access(azDirs[i
1f620 5d 2c 20 30 37 29 20 29 20 63 6f 6e 74 69 6e 75  ], 07) ) continu
1f630 65 3b 0a 20 20 20 20 7a 44 69 72 20 3d 20 61 7a  e;.    zDir = az
1f640 44 69 72 73 5b 69 5d 3b 0a 20 20 20 20 62 72 65  Dirs[i];.    bre
1f650 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 68  ak;.  }..  /* Ch
1f660 65 63 6b 20 74 68 61 74 20 74 68 65 20 6f 75 74  eck that the out
1f670 70 75 74 20 62 75 66 66 65 72 20 69 73 20 6c 61  put buffer is la
1f680 72 67 65 20 65 6e 6f 75 67 68 20 66 6f 72 20 74  rge enough for t
1f690 68 65 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c  he temporary fil
1f6a0 65 20 0a 20 20 2a 2a 20 6e 61 6d 65 2e 20 49 66  e .  ** name. If
1f6b0 20 69 74 20 69 73 20 6e 6f 74 2c 20 72 65 74 75   it is not, retu
1f6c0 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 2e  rn SQLITE_ERROR.
1f6d0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 28 73 74 72  .  */.  if( (str
1f6e0 6c 65 6e 28 7a 44 69 72 29 20 2b 20 73 74 72 6c  len(zDir) + strl
1f6f0 65 6e 28 53 51 4c 49 54 45 5f 54 45 4d 50 5f 46  en(SQLITE_TEMP_F
1f700 49 4c 45 5f 50 52 45 46 49 58 29 20 2b 20 31 37  ILE_PREFIX) + 17
1f710 29 20 3e 3d 20 28 73 69 7a 65 5f 74 29 6e 42 75  ) >= (size_t)nBu
1f720 66 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  f ){.    return 
1f730 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20  SQLITE_ERROR;.  
1f740 7d 0a 0a 20 20 64 6f 7b 0a 20 20 20 20 73 71 6c  }..  do{.    sql
1f750 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 42  ite3_snprintf(nB
1f760 75 66 2d 31 37 2c 20 7a 42 75 66 2c 20 22 25 73  uf-17, zBuf, "%s
1f770 2f 22 53 51 4c 49 54 45 5f 54 45 4d 50 5f 46 49  /"SQLITE_TEMP_FI
1f780 4c 45 5f 50 52 45 46 49 58 2c 20 7a 44 69 72 29  LE_PREFIX, zDir)
1f790 3b 0a 20 20 20 20 6a 20 3d 20 28 69 6e 74 29 73  ;.    j = (int)s
1f7a0 74 72 6c 65 6e 28 7a 42 75 66 29 3b 0a 20 20 20  trlen(zBuf);.   
1f7b0 20 73 71 6c 69 74 65 33 5f 72 61 6e 64 6f 6d 6e   sqlite3_randomn
1f7c0 65 73 73 28 31 35 2c 20 26 7a 42 75 66 5b 6a 5d  ess(15, &zBuf[j]
1f7d0 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  );.    for(i=0; 
1f7e0 69 3c 31 35 3b 20 69 2b 2b 2c 20 6a 2b 2b 29 7b  i<15; i++, j++){
1f7f0 0a 20 20 20 20 20 20 7a 42 75 66 5b 6a 5d 20 3d  .      zBuf[j] =
1f800 20 28 63 68 61 72 29 7a 43 68 61 72 73 5b 20 28   (char)zChars[ (
1f810 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 29 7a  (unsigned char)z
1f820 42 75 66 5b 6a 5d 29 25 28 73 69 7a 65 6f 66 28  Buf[j])%(sizeof(
1f830 7a 43 68 61 72 73 29 2d 31 29 20 5d 3b 0a 20 20  zChars)-1) ];.  
1f840 20 20 7d 0a 20 20 20 20 7a 42 75 66 5b 6a 5d 20    }.    zBuf[j] 
1f850 3d 20 30 3b 0a 20 20 7d 77 68 69 6c 65 28 20 61  = 0;.  }while( a
1f860 63 63 65 73 73 28 7a 42 75 66 2c 30 29 3d 3d 30  ccess(zBuf,0)==0
1f870 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c   );.  return SQL
1f880 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 20 53  ITE_OK;.}..#if S
1f890 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43  QLITE_ENABLE_LOC
1f8a0 4b 49 4e 47 5f 53 54 59 4c 45 20 26 26 20 64 65  KING_STYLE && de
1f8b0 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29  fined(__APPLE__)
1f8c0 0a 2f 2a 0a 2a 2a 20 52 6f 75 74 69 6e 65 20 74  ./*.** Routine t
1f8d0 6f 20 74 72 61 6e 73 66 6f 72 6d 20 61 20 75 6e  o transform a un
1f8e0 69 78 46 69 6c 65 20 69 6e 74 6f 20 61 20 70 72  ixFile into a pr
1f8f0 6f 78 79 2d 6c 6f 63 6b 69 6e 67 20 75 6e 69 78  oxy-locking unix
1f900 46 69 6c 65 2e 0a 2a 2a 20 49 6d 70 6c 65 6d 65  File..** Impleme
1f910 6e 74 61 74 69 6f 6e 20 69 6e 20 74 68 65 20 70  ntation in the p
1f920 72 6f 78 79 2d 6c 6f 63 6b 20 64 69 76 69 73 69  roxy-lock divisi
1f930 6f 6e 2c 20 62 75 74 20 75 73 65 64 20 62 79 20  on, but used by 
1f940 75 6e 69 78 4f 70 65 6e 28 29 0a 2a 2a 20 69 66  unixOpen().** if
1f950 20 53 51 4c 49 54 45 5f 50 52 45 46 45 52 5f 50   SQLITE_PREFER_P
1f960 52 4f 58 59 5f 4c 4f 43 4b 49 4e 47 20 69 73 20  ROXY_LOCKING is 
1f970 64 65 66 69 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74  defined..*/.stat
1f980 69 63 20 69 6e 74 20 70 72 6f 78 79 54 72 61 6e  ic int proxyTran
1f990 73 66 6f 72 6d 55 6e 69 78 46 69 6c 65 28 75 6e  sformUnixFile(un
1f9a0 69 78 46 69 6c 65 2a 2c 20 63 6f 6e 73 74 20 63  ixFile*, const c
1f9b0 68 61 72 2a 29 3b 0a 23 65 6e 64 69 66 0a 0a 2f  har*);.#endif../
1f9c0 2a 0a 2a 2a 20 53 65 61 72 63 68 20 66 6f 72 20  *.** Search for 
1f9d0 61 6e 20 75 6e 75 73 65 64 20 66 69 6c 65 20 64  an unused file d
1f9e0 65 73 63 72 69 70 74 6f 72 20 74 68 61 74 20 77  escriptor that w
1f9f0 61 73 20 6f 70 65 6e 65 64 20 6f 6e 20 74 68 65  as opened on the
1fa00 20 64 61 74 61 62 61 73 65 20 0a 2a 2a 20 66 69   database .** fi
1fa10 6c 65 20 28 6e 6f 74 20 61 20 6a 6f 75 72 6e 61  le (not a journa
1fa20 6c 20 6f 72 20 6d 61 73 74 65 72 2d 6a 6f 75 72  l or master-jour
1fa30 6e 61 6c 20 66 69 6c 65 29 20 69 64 65 6e 74 69  nal file) identi
1fa40 66 69 65 64 20 62 79 20 70 61 74 68 6e 61 6d 65  fied by pathname
1fa50 0a 2a 2a 20 7a 50 61 74 68 20 77 69 74 68 20 53  .** zPath with S
1fa60 51 4c 49 54 45 5f 4f 50 45 4e 5f 58 58 58 20 66  QLITE_OPEN_XXX f
1fa70 6c 61 67 73 20 6d 61 74 63 68 69 6e 67 20 74 68  lags matching th
1fa80 6f 73 65 20 70 61 73 73 65 64 20 61 73 20 74 68  ose passed as th
1fa90 65 20 73 65 63 6f 6e 64 0a 2a 2a 20 61 72 67 75  e second.** argu
1faa0 6d 65 6e 74 20 74 6f 20 74 68 69 73 20 66 75 6e  ment to this fun
1fab0 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 53 75 63  ction..**.** Suc
1fac0 68 20 61 20 66 69 6c 65 20 64 65 73 63 72 69 70  h a file descrip
1fad0 74 6f 72 20 6d 61 79 20 65 78 69 73 74 20 69 66  tor may exist if
1fae0 20 61 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e   a database conn
1faf0 65 63 74 69 6f 6e 20 77 61 73 20 63 6c 6f 73 65  ection was close
1fb00 64 0a 2a 2a 20 62 75 74 20 74 68 65 20 61 73 73  d.** but the ass
1fb10 6f 63 69 61 74 65 64 20 66 69 6c 65 20 64 65 73  ociated file des
1fb20 63 72 69 70 74 6f 72 20 63 6f 75 6c 64 20 6e 6f  criptor could no
1fb30 74 20 62 65 20 63 6c 6f 73 65 64 20 62 65 63 61  t be closed beca
1fb40 75 73 65 20 73 6f 6d 65 0a 2a 2a 20 6f 74 68 65  use some.** othe
1fb50 72 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  r file descripto
1fb60 72 20 6f 70 65 6e 20 6f 6e 20 74 68 65 20 73 61  r open on the sa
1fb70 6d 65 20 66 69 6c 65 20 69 73 20 68 6f 6c 64 69  me file is holdi
1fb80 6e 67 20 61 20 66 69 6c 65 2d 6c 6f 63 6b 2e 0a  ng a file-lock..
1fb90 2a 2a 20 52 65 66 65 72 20 74 6f 20 63 6f 6d 6d  ** Refer to comm
1fba0 65 6e 74 73 20 69 6e 20 74 68 65 20 75 6e 69 78  ents in the unix
1fbb0 43 6c 6f 73 65 28 29 20 66 75 6e 63 74 69 6f 6e  Close() function
1fbc0 20 61 6e 64 20 74 68 65 20 6c 65 6e 67 74 68 79   and the lengthy
1fbd0 20 63 6f 6d 6d 65 6e 74 0a 2a 2a 20 64 65 73 63   comment.** desc
1fbe0 72 69 62 69 6e 67 20 22 50 6f 73 69 78 20 41 64  ribing "Posix Ad
1fbf0 76 69 73 6f 72 79 20 4c 6f 63 6b 69 6e 67 22 20  visory Locking" 
1fc00 61 74 20 74 68 65 20 73 74 61 72 74 20 6f 66 20  at the start of 
1fc10 74 68 69 73 20 66 69 6c 65 20 66 6f 72 20 0a 2a  this file for .*
1fc20 2a 20 66 75 72 74 68 65 72 20 64 65 74 61 69 6c  * further detail
1fc30 73 2e 20 41 6c 73 6f 2c 20 74 69 63 6b 65 74 20  s. Also, ticket 
1fc40 23 34 30 31 38 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  #4018..**.** If 
1fc50 61 20 73 75 69 74 61 62 6c 65 20 66 69 6c 65 20  a suitable file 
1fc60 64 65 73 63 72 69 70 74 6f 72 20 69 73 20 66 6f  descriptor is fo
1fc70 75 6e 64 2c 20 74 68 65 6e 20 69 74 20 69 73 20  und, then it is 
1fc80 72 65 74 75 72 6e 65 64 2e 20 49 66 20 6e 6f 0a  returned. If no.
1fc90 2a 2a 20 73 75 63 68 20 66 69 6c 65 20 64 65 73  ** such file des
1fca0 63 72 69 70 74 6f 72 20 69 73 20 6c 6f 63 61 74  criptor is locat
1fcb0 65 64 2c 20 2d 31 20 69 73 20 72 65 74 75 72 6e  ed, -1 is return
1fcc0 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 55 6e  ed..*/.static Un
1fcd0 69 78 55 6e 75 73 65 64 46 64 20 2a 66 69 6e 64  ixUnusedFd *find
1fce0 52 65 75 73 61 62 6c 65 46 64 28 63 6f 6e 73 74  ReusableFd(const
1fcf0 20 63 68 61 72 20 2a 7a 50 61 74 68 2c 20 69 6e   char *zPath, in
1fd00 74 20 66 6c 61 67 73 29 7b 0a 20 20 55 6e 69 78  t flags){.  Unix
1fd10 55 6e 75 73 65 64 46 64 20 2a 70 55 6e 75 73 65  UnusedFd *pUnuse
1fd20 64 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 44 6f 20  d = 0;..  /* Do 
1fd30 6e 6f 74 20 73 65 61 72 63 68 20 66 6f 72 20 61  not search for a
1fd40 6e 20 75 6e 75 73 65 64 20 66 69 6c 65 20 64 65  n unused file de
1fd50 73 63 72 69 70 74 6f 72 20 6f 6e 20 76 78 77 6f  scriptor on vxwo
1fd60 72 6b 73 2e 20 4e 6f 74 20 62 65 63 61 75 73 65  rks. Not because
1fd70 0a 20 20 2a 2a 20 76 78 77 6f 72 6b 73 20 77 6f  .  ** vxworks wo
1fd80 75 6c 64 20 6e 6f 74 20 62 65 6e 65 66 69 74 20  uld not benefit 
1fd90 66 72 6f 6d 20 74 68 65 20 63 68 61 6e 67 65 20  from the change 
1fda0 28 69 74 20 6d 69 67 68 74 2c 20 77 65 27 72 65  (it might, we're
1fdb0 20 6e 6f 74 20 73 75 72 65 29 2c 0a 20 20 2a 2a   not sure),.  **
1fdc0 20 62 75 74 20 62 65 63 61 75 73 65 20 6e 6f 20   but because no 
1fdd0 77 61 79 20 74 6f 20 74 65 73 74 20 69 74 20 69  way to test it i
1fde0 73 20 63 75 72 72 65 6e 74 6c 79 20 61 76 61 69  s currently avai
1fdf0 6c 61 62 6c 65 2e 20 49 74 20 69 73 20 62 65 74  lable. It is bet
1fe00 74 65 72 20 0a 20 20 2a 2a 20 6e 6f 74 20 74 6f  ter .  ** not to
1fe10 20 72 69 73 6b 20 62 72 65 61 6b 69 6e 67 20 76   risk breaking v
1fe20 78 77 6f 72 6b 73 20 73 75 70 70 6f 72 74 20 66  xworks support f
1fe30 6f 72 20 74 68 65 20 73 61 6b 65 20 6f 66 20 73  or the sake of s
1fe40 75 63 68 20 61 6e 20 6f 62 73 63 75 72 65 20 0a  uch an obscure .
1fe50 20 20 2a 2a 20 66 65 61 74 75 72 65 2e 20 20 2a    ** feature.  *
1fe60 2f 0a 23 69 66 20 21 4f 53 5f 56 58 57 4f 52 4b  /.#if !OS_VXWORK
1fe70 53 0a 20 20 73 74 72 75 63 74 20 73 74 61 74 20  S.  struct stat 
1fe80 73 53 74 61 74 3b 20 20 20 20 20 20 20 20 20 20  sStat;          
1fe90 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75           /* Resu
1fea0 6c 74 73 20 6f 66 20 73 74 61 74 28 29 20 63 61  lts of stat() ca
1feb0 6c 6c 20 2a 2f 0a 0a 20 20 2f 2a 20 41 20 73 74  ll */..  /* A st
1fec0 61 74 28 29 20 63 61 6c 6c 20 6d 61 79 20 66 61  at() call may fa
1fed0 69 6c 20 66 6f 72 20 76 61 72 69 6f 75 73 20 72  il for various r
1fee0 65 61 73 6f 6e 73 2e 20 49 66 20 74 68 69 73 20  easons. If this 
1fef0 68 61 70 70 65 6e 73 2c 20 69 74 20 69 73 0a 20  happens, it is. 
1ff00 20 2a 2a 20 61 6c 6d 6f 73 74 20 63 65 72 74 61   ** almost certa
1ff10 69 6e 20 74 68 61 74 20 61 6e 20 6f 70 65 6e 28  in that an open(
1ff20 29 20 63 61 6c 6c 20 6f 6e 20 74 68 65 20 73 61  ) call on the sa
1ff30 6d 65 20 70 61 74 68 20 77 69 6c 6c 20 61 6c 73  me path will als
1ff40 6f 20 66 61 69 6c 2e 0a 20 20 2a 2a 20 46 6f 72  o fail..  ** For
1ff50 20 74 68 69 73 20 72 65 61 73 6f 6e 2c 20 69 66   this reason, if
1ff60 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   an error occurs
1ff70 20 69 6e 20 74 68 65 20 73 74 61 74 28 29 20 63   in the stat() c
1ff80 61 6c 6c 20 68 65 72 65 2c 20 69 74 20 69 73 0a  all here, it is.
1ff90 20 20 2a 2a 20 69 67 6e 6f 72 65 64 20 61 6e 64    ** ignored and
1ffa0 20 2d 31 20 69 73 20 72 65 74 75 72 6e 65 64 2e   -1 is returned.
1ffb0 20 54 68 65 20 63 61 6c 6c 65 72 20 77 69 6c 6c   The caller will
1ffc0 20 74 72 79 20 74 6f 20 6f 70 65 6e 20 61 20 6e   try to open a n
1ffd0 65 77 20 66 69 6c 65 0a 20 20 2a 2a 20 64 65 73  ew file.  ** des
1ffe0 63 72 69 70 74 6f 72 20 6f 6e 20 74 68 65 20 73  criptor on the s
1fff0 61 6d 65 20 70 61 74 68 2c 20 66 61 69 6c 2c 20  ame path, fail, 
20000 61 6e 64 20 72 65 74 75 72 6e 20 61 6e 20 65 72  and return an er
20010 72 6f 72 20 74 6f 20 53 51 4c 69 74 65 2e 0a 20  ror to SQLite.. 
20020 20 2a 2a 0a 20 20 2a 2a 20 45 76 65 6e 20 69 66   **.  ** Even if
20030 20 61 20 73 75 62 73 65 71 75 65 6e 74 20 6f 70   a subsequent op
20040 65 6e 28 29 20 63 61 6c 6c 20 64 6f 65 73 20 73  en() call does s
20050 75 63 63 65 65 64 2c 20 74 68 65 20 63 6f 6e 73  ucceed, the cons
20060 65 71 75 65 6e 63 65 73 20 6f 66 0a 20 20 2a 2a  equences of.  **
20070 20 6e 6f 74 20 73 65 61 72 63 68 69 6e 67 20 66   not searching f
20080 6f 72 20 61 20 72 65 73 75 73 61 62 6c 65 20 66  or a resusable f
20090 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 61  ile descriptor a
200a0 72 65 20 6e 6f 74 20 64 69 72 65 2e 20 20 2a 2f  re not dire.  */
200b0 0a 20 20 69 66 28 20 30 3d 3d 73 74 61 74 28 7a  .  if( 0==stat(z
200c0 50 61 74 68 2c 20 26 73 53 74 61 74 29 20 29 7b  Path, &sStat) ){
200d0 0a 20 20 20 20 73 74 72 75 63 74 20 75 6e 69 78  .    struct unix
200e0 4f 70 65 6e 43 6e 74 20 2a 70 4f 70 65 6e 3b 0a  OpenCnt *pOpen;.
200f0 0a 20 20 20 20 75 6e 69 78 45 6e 74 65 72 4d 75  .    unixEnterMu
20100 74 65 78 28 29 3b 0a 20 20 20 20 70 4f 70 65 6e  tex();.    pOpen
20110 20 3d 20 6f 70 65 6e 4c 69 73 74 3b 0a 20 20 20   = openList;.   
20120 20 77 68 69 6c 65 28 20 70 4f 70 65 6e 20 26 26   while( pOpen &&
20130 20 28 70 4f 70 65 6e 2d 3e 66 69 6c 65 49 64 2e   (pOpen->fileId.
20140 64 65 76 21 3d 73 53 74 61 74 2e 73 74 5f 64 65  dev!=sStat.st_de
20150 76 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  v.              
20160 20 20 20 20 20 20 20 7c 7c 20 70 4f 70 65 6e 2d         || pOpen-
20170 3e 66 69 6c 65 49 64 2e 69 6e 6f 21 3d 73 53 74  >fileId.ino!=sSt
20180 61 74 2e 73 74 5f 69 6e 6f 29 20 29 7b 0a 20 20  at.st_ino) ){.  
20190 20 20 20 20 20 70 4f 70 65 6e 20 3d 20 70 4f 70       pOpen = pOp
201a0 65 6e 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 7d  en->pNext;.    }
201b0 0a 20 20 20 20 69 66 28 20 70 4f 70 65 6e 20 29  .    if( pOpen )
201c0 7b 0a 20 20 20 20 20 20 55 6e 69 78 55 6e 75 73  {.      UnixUnus
201d0 65 64 46 64 20 2a 2a 70 70 3b 0a 20 20 20 20 20  edFd **pp;.     
201e0 20 66 6f 72 28 70 70 3d 26 70 4f 70 65 6e 2d 3e   for(pp=&pOpen->
201f0 70 55 6e 75 73 65 64 3b 20 2a 70 70 20 26 26 20  pUnused; *pp && 
20200 28 2a 70 70 29 2d 3e 66 6c 61 67 73 21 3d 66 6c  (*pp)->flags!=fl
20210 61 67 73 3b 20 70 70 3d 26 28 28 2a 70 70 29 2d  ags; pp=&((*pp)-
20220 3e 70 4e 65 78 74 29 29 3b 0a 20 20 20 20 20 20  >pNext));.      
20230 70 55 6e 75 73 65 64 20 3d 20 2a 70 70 3b 0a 20  pUnused = *pp;. 
20240 20 20 20 20 20 69 66 28 20 70 55 6e 75 73 65 64       if( pUnused
20250 20 29 7b 0a 20 20 20 20 20 20 20 20 2a 70 70 20   ){.        *pp 
20260 3d 20 70 55 6e 75 73 65 64 2d 3e 70 4e 65 78 74  = pUnused->pNext
20270 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
20280 20 20 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74      unixLeaveMut
20290 65 78 28 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  ex();.  }.#endif
202a0 20 20 20 20 2f 2a 20 69 66 20 21 4f 53 5f 56 58      /* if !OS_VX
202b0 57 4f 52 4b 53 20 2a 2f 0a 20 20 72 65 74 75 72  WORKS */.  retur
202c0 6e 20 70 55 6e 75 73 65 64 3b 0a 7d 0a 0a 2f 2a  n pUnused;.}../*
202d0 0a 2a 2a 20 4f 70 65 6e 20 74 68 65 20 66 69 6c  .** Open the fil
202e0 65 20 7a 50 61 74 68 2e 0a 2a 2a 20 0a 2a 2a 20  e zPath..** .** 
202f0 50 72 65 76 69 6f 75 73 6c 79 2c 20 74 68 65 20  Previously, the 
20300 53 51 4c 69 74 65 20 4f 53 20 6c 61 79 65 72 20  SQLite OS layer 
20310 75 73 65 64 20 74 68 72 65 65 20 66 75 6e 63 74  used three funct
20320 69 6f 6e 73 20 69 6e 20 70 6c 61 63 65 20 6f 66  ions in place of
20330 20 74 68 69 73 0a 2a 2a 20 6f 6e 65 3a 0a 2a 2a   this.** one:.**
20340 0a 2a 2a 20 20 20 20 20 73 71 6c 69 74 65 33 4f  .**     sqlite3O
20350 73 4f 70 65 6e 52 65 61 64 57 72 69 74 65 28 29  sOpenReadWrite()
20360 3b 0a 2a 2a 20 20 20 20 20 73 71 6c 69 74 65 33  ;.**     sqlite3
20370 4f 73 4f 70 65 6e 52 65 61 64 4f 6e 6c 79 28 29  OsOpenReadOnly()
20380 3b 0a 2a 2a 20 20 20 20 20 73 71 6c 69 74 65 33  ;.**     sqlite3
20390 4f 73 4f 70 65 6e 45 78 63 6c 75 73 69 76 65 28  OsOpenExclusive(
203a0 29 3b 0a 2a 2a 0a 2a 2a 20 54 68 65 73 65 20 63  );.**.** These c
203b0 61 6c 6c 73 20 63 6f 72 72 65 73 70 6f 6e 64 20  alls correspond 
203c0 74 6f 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  to the following
203d0 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 73 20 6f 66   combinations of
203e0 20 66 6c 61 67 73 3a 0a 2a 2a 0a 2a 2a 20 20 20   flags:.**.**   
203f0 20 20 52 65 61 64 57 72 69 74 65 28 29 20 2d 3e    ReadWrite() ->
20400 20 20 20 20 20 28 52 45 41 44 57 52 49 54 45 20       (READWRITE 
20410 7c 20 43 52 45 41 54 45 29 0a 2a 2a 20 20 20 20  | CREATE).**    
20420 20 52 65 61 64 4f 6e 6c 79 28 29 20 20 2d 3e 20   ReadOnly()  -> 
20430 20 20 20 20 28 52 45 41 44 4f 4e 4c 59 29 20 0a      (READONLY) .
20440 2a 2a 20 20 20 20 20 4f 70 65 6e 45 78 63 6c 75  **     OpenExclu
20450 73 69 76 65 28 29 20 2d 3e 20 28 52 45 41 44 57  sive() -> (READW
20460 52 49 54 45 20 7c 20 43 52 45 41 54 45 20 7c 20  RITE | CREATE | 
20470 45 58 43 4c 55 53 49 56 45 29 0a 2a 2a 0a 2a 2a  EXCLUSIVE).**.**
20480 20 54 68 65 20 6f 6c 64 20 4f 70 65 6e 45 78 63   The old OpenExc
20490 6c 75 73 69 76 65 28 29 20 61 63 63 65 70 74 65  lusive() accepte
204a0 64 20 61 20 62 6f 6f 6c 65 61 6e 20 61 72 67 75  d a boolean argu
204b0 6d 65 6e 74 20 2d 20 22 64 65 6c 46 6c 61 67 22  ment - "delFlag"
204c0 2e 20 49 66 0a 2a 2a 20 74 72 75 65 2c 20 74 68  . If.** true, th
204d0 65 20 66 69 6c 65 20 77 61 73 20 63 6f 6e 66 69  e file was confi
204e0 67 75 72 65 64 20 74 6f 20 62 65 20 61 75 74 6f  gured to be auto
204f0 6d 61 74 69 63 61 6c 6c 79 20 64 65 6c 65 74 65  matically delete
20500 64 20 77 68 65 6e 20 74 68 65 0a 2a 2a 20 66 69  d when the.** fi
20510 6c 65 20 68 61 6e 64 6c 65 20 63 6c 6f 73 65 64  le handle closed
20520 2e 20 54 6f 20 61 63 68 69 65 76 65 20 74 68 65  . To achieve the
20530 20 73 61 6d 65 20 65 66 66 65 63 74 20 75 73 69   same effect usi
20540 6e 67 20 74 68 69 73 20 6e 65 77 20 0a 2a 2a 20  ng this new .** 
20550 69 6e 74 65 72 66 61 63 65 2c 20 61 64 64 20 74  interface, add t
20560 68 65 20 44 45 4c 45 54 45 4f 4e 43 4c 4f 53 45  he DELETEONCLOSE
20570 20 66 6c 61 67 20 74 6f 20 74 68 6f 73 65 20 73   flag to those s
20580 70 65 63 69 66 69 65 64 20 61 62 6f 76 65 20 66  pecified above f
20590 6f 72 20 0a 2a 2a 20 4f 70 65 6e 45 78 63 6c 75  or .** OpenExclu
205a0 73 69 76 65 28 29 2e 0a 2a 2f 0a 73 74 61 74 69  sive()..*/.stati
205b0 63 20 69 6e 74 20 75 6e 69 78 4f 70 65 6e 28 0a  c int unixOpen(.
205c0 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70    sqlite3_vfs *p
205d0 56 66 73 2c 20 20 20 20 20 20 20 20 20 20 20 2f  Vfs,           /
205e0 2a 20 54 68 65 20 56 46 53 20 66 6f 72 20 77 68  * The VFS for wh
205f0 69 63 68 20 74 68 69 73 20 69 73 20 74 68 65 20  ich this is the 
20600 78 4f 70 65 6e 20 6d 65 74 68 6f 64 20 2a 2f 0a  xOpen method */.
20610 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50    const char *zP
20620 61 74 68 2c 20 20 20 20 20 20 20 20 20 20 20 2f  ath,           /
20630 2a 20 50 61 74 68 6e 61 6d 65 20 6f 66 20 66 69  * Pathname of fi
20640 6c 65 20 74 6f 20 62 65 20 6f 70 65 6e 65 64 20  le to be opened 
20650 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c  */.  sqlite3_fil
20660 65 20 2a 70 46 69 6c 65 2c 20 20 20 20 20 20 20  e *pFile,       
20670 20 20 2f 2a 20 54 68 65 20 66 69 6c 65 20 64 65    /* The file de
20680 73 63 72 69 70 74 6f 72 20 74 6f 20 62 65 20 66  scriptor to be f
20690 69 6c 6c 65 64 20 69 6e 20 2a 2f 0a 20 20 69 6e  illed in */.  in
206a0 74 20 66 6c 61 67 73 2c 20 20 20 20 20 20 20 20  t flags,        
206b0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
206c0 70 75 74 20 66 6c 61 67 73 20 74 6f 20 63 6f 6e  put flags to con
206d0 74 72 6f 6c 20 74 68 65 20 6f 70 65 6e 69 6e 67  trol the opening
206e0 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 4f 75 74 46   */.  int *pOutF
206f0 6c 61 67 73 20 20 20 20 20 20 20 20 20 20 20 20  lags            
20700 20 20 20 2f 2a 20 4f 75 74 70 75 74 20 66 6c 61     /* Output fla
20710 67 73 20 72 65 74 75 72 6e 65 64 20 74 6f 20 53  gs returned to S
20720 51 4c 69 74 65 20 63 6f 72 65 20 2a 2f 0a 29 7b  QLite core */.){
20730 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 20 3d  .  unixFile *p =
20740 20 28 75 6e 69 78 46 69 6c 65 20 2a 29 70 46 69   (unixFile *)pFi
20750 6c 65 3b 0a 20 20 69 6e 74 20 66 64 20 3d 20 2d  le;.  int fd = -
20760 31 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  1;              
20770 20 20 20 20 20 2f 2a 20 46 69 6c 65 20 64 65 73       /* File des
20780 63 72 69 70 74 6f 72 20 72 65 74 75 72 6e 65 64  criptor returned
20790 20 62 79 20 6f 70 65 6e 28 29 20 2a 2f 0a 20 20   by open() */.  
207a0 69 6e 74 20 64 69 72 66 64 20 3d 20 2d 31 3b 20  int dirfd = -1; 
207b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
207c0 2a 20 44 69 72 65 63 74 6f 72 79 20 66 69 6c 65  * Directory file
207d0 20 64 65 73 63 72 69 70 74 6f 72 20 2a 2f 0a 20   descriptor */. 
207e0 20 69 6e 74 20 6f 70 65 6e 46 6c 61 67 73 20 3d   int openFlags =
207f0 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
20800 2f 2a 20 46 6c 61 67 73 20 74 6f 20 70 61 73 73  /* Flags to pass
20810 20 74 6f 20 6f 70 65 6e 28 29 20 2a 2f 0a 20 20   to open() */.  
20820 69 6e 74 20 65 54 79 70 65 20 3d 20 66 6c 61 67  int eType = flag
20830 73 26 30 78 46 46 46 46 46 46 30 30 3b 20 20 2f  s&0xFFFFFF00;  /
20840 2a 20 54 79 70 65 20 6f 66 20 66 69 6c 65 20 74  * Type of file t
20850 6f 20 6f 70 65 6e 20 2a 2f 0a 20 20 69 6e 74 20  o open */.  int 
20860 6e 6f 4c 6f 63 6b 3b 20 20 20 20 20 20 20 20 20  noLock;         
20870 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
20880 75 65 20 74 6f 20 6f 6d 69 74 20 6c 6f 63 6b 69  ue to omit locki
20890 6e 67 20 70 72 69 6d 69 74 69 76 65 73 20 2a 2f  ng primitives */
208a0 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
208b0 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20  TE_OK;          
208c0 20 20 2f 2a 20 46 75 6e 63 74 69 6f 6e 20 52 65    /* Function Re
208d0 74 75 72 6e 20 43 6f 64 65 20 2a 2f 0a 0a 20 20  turn Code */..  
208e0 69 6e 74 20 69 73 45 78 63 6c 75 73 69 76 65 20  int isExclusive 
208f0 20 3d 20 28 66 6c 61 67 73 20 26 20 53 51 4c 49   = (flags & SQLI
20900 54 45 5f 4f 50 45 4e 5f 45 58 43 4c 55 53 49 56  TE_OPEN_EXCLUSIV
20910 45 29 3b 0a 20 20 69 6e 74 20 69 73 44 65 6c 65  E);.  int isDele
20920 74 65 20 20 20 20 20 3d 20 28 66 6c 61 67 73 20  te     = (flags 
20930 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 44 45  & SQLITE_OPEN_DE
20940 4c 45 54 45 4f 4e 43 4c 4f 53 45 29 3b 0a 20 20  LETEONCLOSE);.  
20950 69 6e 74 20 69 73 43 72 65 61 74 65 20 20 20 20  int isCreate    
20960 20 3d 20 28 66 6c 61 67 73 20 26 20 53 51 4c 49   = (flags & SQLI
20970 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 29 3b  TE_OPEN_CREATE);
20980 0a 20 20 69 6e 74 20 69 73 52 65 61 64 6f 6e 6c  .  int isReadonl
20990 79 20 20 20 3d 20 28 66 6c 61 67 73 20 26 20 53  y   = (flags & S
209a0 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f  QLITE_OPEN_READO
209b0 4e 4c 59 29 3b 0a 20 20 69 6e 74 20 69 73 52 65  NLY);.  int isRe
209c0 61 64 57 72 69 74 65 20 20 3d 20 28 66 6c 61 67  adWrite  = (flag
209d0 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  s & SQLITE_OPEN_
209e0 52 45 41 44 57 52 49 54 45 29 3b 0a 23 69 66 20  READWRITE);.#if 
209f0 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f  SQLITE_ENABLE_LO
20a00 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 20 20 69 6e  CKING_STYLE.  in
20a10 74 20 69 73 41 75 74 6f 50 72 6f 78 79 20 20 3d  t isAutoProxy  =
20a20 20 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45   (flags & SQLITE
20a30 5f 4f 50 45 4e 5f 41 55 54 4f 50 52 4f 58 59 29  _OPEN_AUTOPROXY)
20a40 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 49  ;.#endif..  /* I
20a50 66 20 63 72 65 61 74 69 6e 67 20 61 20 6d 61 73  f creating a mas
20a60 74 65 72 20 6f 72 20 6d 61 69 6e 2d 66 69 6c 65  ter or main-file
20a70 20 6a 6f 75 72 6e 61 6c 2c 20 74 68 69 73 20 66   journal, this f
20a80 75 6e 63 74 69 6f 6e 20 77 69 6c 6c 20 6f 70 65  unction will ope
20a90 6e 0a 20 20 2a 2a 20 61 20 66 69 6c 65 2d 64 65  n.  ** a file-de
20aa0 73 63 72 69 70 74 6f 72 20 6f 6e 20 74 68 65 20  scriptor on the 
20ab0 64 69 72 65 63 74 6f 72 79 20 74 6f 6f 2e 20 54  directory too. T
20ac0 68 65 20 66 69 72 73 74 20 74 69 6d 65 20 75 6e  he first time un
20ad0 69 78 53 79 6e 63 28 29 0a 20 20 2a 2a 20 69 73  ixSync().  ** is
20ae0 20 63 61 6c 6c 65 64 20 74 68 65 20 64 69 72 65   called the dire
20af0 63 74 6f 72 79 20 66 69 6c 65 20 64 65 73 63 72  ctory file descr
20b00 69 70 74 6f 72 20 77 69 6c 6c 20 62 65 20 66 73  iptor will be fs
20b10 79 6e 63 28 29 65 64 20 61 6e 64 20 63 6c 6f 73  ync()ed and clos
20b20 65 28 29 64 2e 0a 20 20 2a 2f 0a 20 20 69 6e 74  e()d..  */.  int
20b30 20 69 73 4f 70 65 6e 44 69 72 65 63 74 6f 72 79   isOpenDirectory
20b40 20 3d 20 28 69 73 43 72 65 61 74 65 20 26 26 20   = (isCreate && 
20b50 0a 20 20 20 20 20 20 28 65 54 79 70 65 3d 3d 53  .      (eType==S
20b60 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 53 54 45  QLITE_OPEN_MASTE
20b70 52 5f 4a 4f 55 52 4e 41 4c 20 7c 7c 20 65 54 79  R_JOURNAL || eTy
20b80 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  pe==SQLITE_OPEN_
20b90 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 29 0a 20 20  MAIN_JOURNAL).  
20ba0 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 61 72 67 75  );..  /* If argu
20bb0 6d 65 6e 74 20 7a 50 61 74 68 20 69 73 20 61 20  ment zPath is a 
20bc0 4e 55 4c 4c 20 70 6f 69 6e 74 65 72 2c 20 74 68  NULL pointer, th
20bd0 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 72  is function is r
20be0 65 71 75 69 72 65 64 20 74 6f 20 6f 70 65 6e 0a  equired to open.
20bf0 20 20 2a 2a 20 61 20 74 65 6d 70 6f 72 61 72 79    ** a temporary
20c00 20 66 69 6c 65 2e 20 55 73 65 20 74 68 69 73 20   file. Use this 
20c10 62 75 66 66 65 72 20 74 6f 20 73 74 6f 72 65 20  buffer to store 
20c20 74 68 65 20 66 69 6c 65 20 6e 61 6d 65 20 69 6e  the file name in
20c30 2e 0a 20 20 2a 2f 0a 20 20 63 68 61 72 20 7a 54  ..  */.  char zT
20c40 6d 70 6e 61 6d 65 5b 4d 41 58 5f 50 41 54 48 4e  mpname[MAX_PATHN
20c50 41 4d 45 2b 31 5d 3b 0a 20 20 63 6f 6e 73 74 20  AME+1];.  const 
20c60 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 7a 50  char *zName = zP
20c70 61 74 68 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b  ath;..  /* Check
20c80 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73   the following s
20c90 74 61 74 65 6d 65 6e 74 73 20 61 72 65 20 74 72  tatements are tr
20ca0 75 65 3a 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20  ue: .  **.  **  
20cb0 20 28 61 29 20 45 78 61 63 74 6c 79 20 6f 6e 65   (a) Exactly one
20cc0 20 6f 66 20 74 68 65 20 52 45 41 44 57 52 49 54   of the READWRIT
20cd0 45 20 61 6e 64 20 52 45 41 44 4f 4e 4c 59 20 66  E and READONLY f
20ce0 6c 61 67 73 20 6d 75 73 74 20 62 65 20 73 65 74  lags must be set
20cf0 2c 20 61 6e 64 20 0a 20 20 2a 2a 20 20 20 28 62  , and .  **   (b
20d00 29 20 69 66 20 43 52 45 41 54 45 20 69 73 20 73  ) if CREATE is s
20d10 65 74 2c 20 74 68 65 6e 20 52 45 41 44 57 52 49  et, then READWRI
20d20 54 45 20 6d 75 73 74 20 61 6c 73 6f 20 62 65 20  TE must also be 
20d30 73 65 74 2c 20 61 6e 64 0a 20 20 2a 2a 20 20 20  set, and.  **   
20d40 28 63 29 20 69 66 20 45 58 43 4c 55 53 49 56 45  (c) if EXCLUSIVE
20d50 20 69 73 20 73 65 74 2c 20 74 68 65 6e 20 43 52   is set, then CR
20d60 45 41 54 45 20 6d 75 73 74 20 61 6c 73 6f 20 62  EATE must also b
20d70 65 20 73 65 74 2e 0a 20 20 2a 2a 20 20 20 28 64  e set..  **   (d
20d80 29 20 69 66 20 44 45 4c 45 54 45 4f 4e 43 4c 4f  ) if DELETEONCLO
20d90 53 45 20 69 73 20 73 65 74 2c 20 74 68 65 6e 20  SE is set, then 
20da0 43 52 45 41 54 45 20 6d 75 73 74 20 61 6c 73 6f  CREATE must also
20db0 20 62 65 20 73 65 74 2e 0a 20 20 2a 2f 0a 20 20   be set..  */.  
20dc0 61 73 73 65 72 74 28 28 69 73 52 65 61 64 6f 6e  assert((isReadon
20dd0 6c 79 3d 3d 30 20 7c 7c 20 69 73 52 65 61 64 57  ly==0 || isReadW
20de0 72 69 74 65 3d 3d 30 29 20 26 26 20 28 69 73 52  rite==0) && (isR
20df0 65 61 64 57 72 69 74 65 20 7c 7c 20 69 73 52 65  eadWrite || isRe
20e00 61 64 6f 6e 6c 79 29 29 3b 0a 20 20 61 73 73 65  adonly));.  asse
20e10 72 74 28 69 73 43 72 65 61 74 65 3d 3d 30 20 7c  rt(isCreate==0 |
20e20 7c 20 69 73 52 65 61 64 57 72 69 74 65 29 3b 0a  | isReadWrite);.
20e30 20 20 61 73 73 65 72 74 28 69 73 45 78 63 6c 75    assert(isExclu
20e40 73 69 76 65 3d 3d 30 20 7c 7c 20 69 73 43 72 65  sive==0 || isCre
20e50 61 74 65 29 3b 0a 20 20 61 73 73 65 72 74 28 69  ate);.  assert(i
20e60 73 44 65 6c 65 74 65 3d 3d 30 20 7c 7c 20 69 73  sDelete==0 || is
20e70 43 72 65 61 74 65 29 3b 0a 0a 20 20 2f 2a 20 54  Create);..  /* T
20e80 68 65 20 6d 61 69 6e 20 44 42 2c 20 6d 61 69 6e  he main DB, main
20e90 20 6a 6f 75 72 6e 61 6c 2c 20 61 6e 64 20 6d 61   journal, and ma
20ea0 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 61 72 65  ster journal are
20eb0 20 6e 65 76 65 72 20 61 75 74 6f 6d 61 74 69 63   never automatic
20ec0 61 6c 6c 79 0a 20 20 2a 2a 20 64 65 6c 65 74 65  ally.  ** delete
20ed0 64 2e 20 4e 6f 72 20 61 72 65 20 74 68 65 79 20  d. Nor are they 
20ee0 65 76 65 72 20 74 65 6d 70 6f 72 61 72 79 20 66  ever temporary f
20ef0 69 6c 65 73 2e 20 20 2a 2f 0a 20 20 61 73 73 65  iles.  */.  asse
20f00 72 74 28 20 28 21 69 73 44 65 6c 65 74 65 20 26  rt( (!isDelete &
20f10 26 20 7a 4e 61 6d 65 29 20 7c 7c 20 65 54 79 70  & zName) || eTyp
20f20 65 21 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d  e!=SQLITE_OPEN_M
20f30 41 49 4e 5f 44 42 20 29 3b 0a 20 20 61 73 73 65  AIN_DB );.  asse
20f40 72 74 28 20 28 21 69 73 44 65 6c 65 74 65 20 26  rt( (!isDelete &
20f50 26 20 7a 4e 61 6d 65 29 20 7c 7c 20 65 54 79 70  & zName) || eTyp
20f60 65 21 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d  e!=SQLITE_OPEN_M
20f70 41 49 4e 5f 4a 4f 55 52 4e 41 4c 20 29 3b 0a 20  AIN_JOURNAL );. 
20f80 20 61 73 73 65 72 74 28 20 28 21 69 73 44 65 6c   assert( (!isDel
20f90 65 74 65 20 26 26 20 7a 4e 61 6d 65 29 20 7c 7c  ete && zName) ||
20fa0 20 65 54 79 70 65 21 3d 53 51 4c 49 54 45 5f 4f   eType!=SQLITE_O
20fb0 50 45 4e 5f 4d 41 53 54 45 52 5f 4a 4f 55 52 4e  PEN_MASTER_JOURN
20fc0 41 4c 20 29 3b 0a 0a 20 20 2f 2a 20 41 73 73 65  AL );..  /* Asse
20fd0 72 74 20 74 68 61 74 20 74 68 65 20 75 70 70 65  rt that the uppe
20fe0 72 20 6c 61 79 65 72 20 68 61 73 20 73 65 74 20  r layer has set 
20ff0 6f 6e 65 20 6f 66 20 74 68 65 20 22 66 69 6c 65  one of the "file
21000 2d 74 79 70 65 22 20 66 6c 61 67 73 2e 20 2a 2f  -type" flags. */
21010 0a 20 20 61 73 73 65 72 74 28 20 65 54 79 70 65  .  assert( eType
21020 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41  ==SQLITE_OPEN_MA
21030 49 4e 5f 44 42 20 20 20 20 20 20 7c 7c 20 65 54  IN_DB      || eT
21040 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e  ype==SQLITE_OPEN
21050 5f 54 45 4d 50 5f 44 42 20 0a 20 20 20 20 20 20  _TEMP_DB .      
21060 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49 54   || eType==SQLIT
21070 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52  E_OPEN_MAIN_JOUR
21080 4e 41 4c 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51  NAL || eType==SQ
21090 4c 49 54 45 5f 4f 50 45 4e 5f 54 45 4d 50 5f 4a  LITE_OPEN_TEMP_J
210a0 4f 55 52 4e 41 4c 20 0a 20 20 20 20 20 20 20 7c  OURNAL .       |
210b0 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f  | eType==SQLITE_
210c0 4f 50 45 4e 5f 53 55 42 4a 4f 55 52 4e 41 4c 20  OPEN_SUBJOURNAL 
210d0 20 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49    || eType==SQLI
210e0 54 45 5f 4f 50 45 4e 5f 4d 41 53 54 45 52 5f 4a  TE_OPEN_MASTER_J
210f0 4f 55 52 4e 41 4c 20 0a 20 20 20 20 20 20 20 7c  OURNAL .       |
21100 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f  | eType==SQLITE_
21110 4f 50 45 4e 5f 54 52 41 4e 53 49 45 4e 54 5f 44  OPEN_TRANSIENT_D
21120 42 0a 20 20 29 3b 0a 0a 20 20 6d 65 6d 73 65 74  B.  );..  memset
21130 28 70 2c 20 30 2c 20 73 69 7a 65 6f 66 28 75 6e  (p, 0, sizeof(un
21140 69 78 46 69 6c 65 29 29 3b 0a 0a 20 20 69 66 28  ixFile));..  if(
21150 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f   eType==SQLITE_O
21160 50 45 4e 5f 4d 41 49 4e 5f 44 42 20 29 7b 0a 20  PEN_MAIN_DB ){. 
21170 20 20 20 55 6e 69 78 55 6e 75 73 65 64 46 64 20     UnixUnusedFd 
21180 2a 70 55 6e 75 73 65 64 3b 0a 20 20 20 20 70 55  *pUnused;.    pU
21190 6e 75 73 65 64 20 3d 20 66 69 6e 64 52 65 75 73  nused = findReus
211a0 61 62 6c 65 46 64 28 7a 4e 61 6d 65 2c 20 66 6c  ableFd(zName, fl
211b0 61 67 73 29 3b 0a 20 20 20 20 69 66 28 20 70 55  ags);.    if( pU
211c0 6e 75 73 65 64 20 29 7b 0a 20 20 20 20 20 20 66  nused ){.      f
211d0 64 20 3d 20 70 55 6e 75 73 65 64 2d 3e 66 64 3b  d = pUnused->fd;
211e0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
211f0 20 20 70 55 6e 75 73 65 64 20 3d 20 73 71 6c 69    pUnused = sqli
21200 74 65 33 5f 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f  te3_malloc(sizeo
21210 66 28 2a 70 55 6e 75 73 65 64 29 29 3b 0a 20 20  f(*pUnused));.  
21220 20 20 20 20 69 66 28 20 21 70 55 6e 75 73 65 64      if( !pUnused
21230 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75   ){.        retu
21240 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b  rn SQLITE_NOMEM;
21250 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
21260 20 20 20 70 2d 3e 70 55 6e 75 73 65 64 20 3d 20     p->pUnused = 
21270 70 55 6e 75 73 65 64 3b 0a 20 20 7d 65 6c 73 65  pUnused;.  }else
21280 20 69 66 28 20 21 7a 4e 61 6d 65 20 29 7b 0a 20   if( !zName ){. 
21290 20 20 20 2f 2a 20 49 66 20 7a 4e 61 6d 65 20 69     /* If zName i
212a0 73 20 4e 55 4c 4c 2c 20 74 68 65 20 75 70 70 65  s NULL, the uppe
212b0 72 20 6c 61 79 65 72 20 69 73 20 72 65 71 75 65  r layer is reque
212c0 73 74 69 6e 67 20 61 20 74 65 6d 70 20 66 69 6c  sting a temp fil
212d0 65 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74  e. */.    assert
212e0 28 69 73 44 65 6c 65 74 65 20 26 26 20 21 69 73  (isDelete && !is
212f0 4f 70 65 6e 44 69 72 65 63 74 6f 72 79 29 3b 0a  OpenDirectory);.
21300 20 20 20 20 72 63 20 3d 20 67 65 74 54 65 6d 70      rc = getTemp
21310 6e 61 6d 65 28 4d 41 58 5f 50 41 54 48 4e 41 4d  name(MAX_PATHNAM
21320 45 2b 31 2c 20 7a 54 6d 70 6e 61 6d 65 29 3b 0a  E+1, zTmpname);.
21330 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
21340 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72  TE_OK ){.      r
21350 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
21360 20 20 20 20 7a 4e 61 6d 65 20 3d 20 7a 54 6d 70      zName = zTmp
21370 6e 61 6d 65 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  name;.  }..  /* 
21380 44 65 74 65 72 6d 69 6e 65 20 74 68 65 20 76 61  Determine the va
21390 6c 75 65 20 6f 66 20 74 68 65 20 66 6c 61 67 73  lue of the flags
213a0 20 70 61 72 61 6d 65 74 65 72 20 70 61 73 73 65   parameter passe
213b0 64 20 74 6f 20 50 4f 53 49 58 20 66 75 6e 63 74  d to POSIX funct
213c0 69 6f 6e 0a 20 20 2a 2a 20 6f 70 65 6e 28 29 2e  ion.  ** open().
213d0 20 54 68 65 73 65 20 6d 75 73 74 20 62 65 20 63   These must be c
213e0 61 6c 63 75 6c 61 74 65 64 20 65 76 65 6e 20 69  alculated even i
213f0 66 20 6f 70 65 6e 28 29 20 69 73 20 6e 6f 74 20  f open() is not 
21400 63 61 6c 6c 65 64 2c 20 61 73 0a 20 20 2a 2a 20  called, as.  ** 
21410 74 68 65 79 20 6d 61 79 20 62 65 20 73 74 6f 72  they may be stor
21420 65 64 20 61 73 20 70 61 72 74 20 6f 66 20 74 68  ed as part of th
21430 65 20 66 69 6c 65 20 68 61 6e 64 6c 65 20 61 6e  e file handle an
21440 64 20 75 73 65 64 20 62 79 20 74 68 65 20 0a 20  d used by the . 
21450 20 2a 2a 20 27 63 6f 6e 63 68 20 66 69 6c 65 27   ** 'conch file'
21460 20 6c 6f 63 6b 69 6e 67 20 66 75 6e 63 74 69 6f   locking functio
21470 6e 73 20 6c 61 74 65 72 20 6f 6e 2e 20 20 2a 2f  ns later on.  */
21480 0a 20 20 69 66 28 20 69 73 52 65 61 64 6f 6e 6c  .  if( isReadonl
21490 79 20 29 20 20 6f 70 65 6e 46 6c 61 67 73 20 7c  y )  openFlags |
214a0 3d 20 4f 5f 52 44 4f 4e 4c 59 3b 0a 20 20 69 66  = O_RDONLY;.  if
214b0 28 20 69 73 52 65 61 64 57 72 69 74 65 20 29 20  ( isReadWrite ) 
214c0 6f 70 65 6e 46 6c 61 67 73 20 7c 3d 20 4f 5f 52  openFlags |= O_R
214d0 44 57 52 3b 0a 20 20 69 66 28 20 69 73 43 72 65  DWR;.  if( isCre
214e0 61 74 65 20 29 20 20 20 20 6f 70 65 6e 46 6c 61  ate )    openFla
214f0 67 73 20 7c 3d 20 4f 5f 43 52 45 41 54 3b 0a 20  gs |= O_CREAT;. 
21500 20 69 66 28 20 69 73 45 78 63 6c 75 73 69 76 65   if( isExclusive
21510 20 29 20 6f 70 65 6e 46 6c 61 67 73 20 7c 3d 20   ) openFlags |= 
21520 28 4f 5f 45 58 43 4c 7c 4f 5f 4e 4f 46 4f 4c 4c  (O_EXCL|O_NOFOLL
21530 4f 57 29 3b 0a 20 20 6f 70 65 6e 46 6c 61 67 73  OW);.  openFlags
21540 20 7c 3d 20 28 4f 5f 4c 41 52 47 45 46 49 4c 45   |= (O_LARGEFILE
21550 7c 4f 5f 42 49 4e 41 52 59 29 3b 0a 0a 20 20 69  |O_BINARY);..  i
21560 66 28 20 66 64 3c 30 20 29 7b 0a 20 20 20 20 6d  f( fd<0 ){.    m
21570 6f 64 65 5f 74 20 6f 70 65 6e 4d 6f 64 65 20 3d  ode_t openMode =
21580 20 28 69 73 44 65 6c 65 74 65 3f 30 36 30 30 3a   (isDelete?0600:
21590 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 46  SQLITE_DEFAULT_F
215a0 49 4c 45 5f 50 45 52 4d 49 53 53 49 4f 4e 53 29  ILE_PERMISSIONS)
215b0 3b 0a 20 20 20 20 66 64 20 3d 20 6f 70 65 6e 28  ;.    fd = open(
215c0 7a 4e 61 6d 65 2c 20 6f 70 65 6e 46 6c 61 67 73  zName, openFlags
215d0 2c 20 6f 70 65 6e 4d 6f 64 65 29 3b 0a 20 20 20  , openMode);.   
215e0 20 4f 53 54 52 41 43 45 34 28 22 4f 50 45 4e 58   OSTRACE4("OPENX
215f0 20 20 20 25 2d 33 64 20 25 73 20 30 25 6f 5c 6e     %-3d %s 0%o\n
21600 22 2c 20 66 64 2c 20 7a 4e 61 6d 65 2c 20 6f 70  ", fd, zName, op
21610 65 6e 46 6c 61 67 73 29 3b 0a 20 20 20 20 69 66  enFlags);.    if
21620 28 20 66 64 3c 30 20 26 26 20 65 72 72 6e 6f 21  ( fd<0 && errno!
21630 3d 45 49 53 44 49 52 20 26 26 20 69 73 52 65 61  =EISDIR && isRea
21640 64 57 72 69 74 65 20 26 26 20 21 69 73 45 78 63  dWrite && !isExc
21650 6c 75 73 69 76 65 20 29 7b 0a 20 20 20 20 20 20  lusive ){.      
21660 2f 2a 20 46 61 69 6c 65 64 20 74 6f 20 6f 70 65  /* Failed to ope
21670 6e 20 74 68 65 20 66 69 6c 65 20 66 6f 72 20 72  n the file for r
21680 65 61 64 2f 77 72 69 74 65 20 61 63 63 65 73 73  ead/write access
21690 2e 20 54 72 79 20 72 65 61 64 2d 6f 6e 6c 79 2e  . Try read-only.
216a0 20 2a 2f 0a 20 20 20 20 20 20 66 6c 61 67 73 20   */.      flags 
216b0 26 3d 20 7e 28 53 51 4c 49 54 45 5f 4f 50 45 4e  &= ~(SQLITE_OPEN
216c0 5f 52 45 41 44 57 52 49 54 45 7c 53 51 4c 49 54  _READWRITE|SQLIT
216d0 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 29 3b 0a  E_OPEN_CREATE);.
216e0 20 20 20 20 20 20 6f 70 65 6e 46 6c 61 67 73 20        openFlags 
216f0 26 3d 20 7e 28 4f 5f 52 44 57 52 7c 4f 5f 43 52  &= ~(O_RDWR|O_CR
21700 45 41 54 29 3b 0a 20 20 20 20 20 20 66 6c 61 67  EAT);.      flag
21710 73 20 7c 3d 20 53 51 4c 49 54 45 5f 4f 50 45 4e  s |= SQLITE_OPEN
21720 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 20 20 20  _READONLY;.     
21730 20 6f 70 65 6e 46 6c 61 67 73 20 7c 3d 20 4f 5f   openFlags |= O_
21740 52 44 4f 4e 4c 59 3b 0a 20 20 20 20 20 20 66 64  RDONLY;.      fd
21750 20 3d 20 6f 70 65 6e 28 7a 4e 61 6d 65 2c 20 6f   = open(zName, o
21760 70 65 6e 46 6c 61 67 73 2c 20 6f 70 65 6e 4d 6f  penFlags, openMo
21770 64 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  de);.    }.    i
21780 66 28 20 66 64 3c 30 20 29 7b 0a 20 20 20 20 20  f( fd<0 ){.     
21790 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 41 4e   rc = SQLITE_CAN
217a0 54 4f 50 45 4e 5f 42 4b 50 54 3b 0a 20 20 20 20  TOPEN_BKPT;.    
217b0 20 20 67 6f 74 6f 20 6f 70 65 6e 5f 66 69 6e 69    goto open_fini
217c0 73 68 65 64 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  shed;.    }.  }.
217d0 20 20 61 73 73 65 72 74 28 20 66 64 3e 3d 30 20    assert( fd>=0 
217e0 29 3b 0a 20 20 69 66 28 20 70 4f 75 74 46 6c 61  );.  if( pOutFla
217f0 67 73 20 29 7b 0a 20 20 20 20 2a 70 4f 75 74 46  gs ){.    *pOutF
21800 6c 61 67 73 20 3d 20 66 6c 61 67 73 3b 0a 20 20  lags = flags;.  
21810 7d 0a 0a 20 20 69 66 28 20 70 2d 3e 70 55 6e 75  }..  if( p->pUnu
21820 73 65 64 20 29 7b 0a 20 20 20 20 70 2d 3e 70 55  sed ){.    p->pU
21830 6e 75 73 65 64 2d 3e 66 64 20 3d 20 66 64 3b 0a  nused->fd = fd;.
21840 20 20 20 20 70 2d 3e 70 55 6e 75 73 65 64 2d 3e      p->pUnused->
21850 66 6c 61 67 73 20 3d 20 66 6c 61 67 73 3b 0a 20  flags = flags;. 
21860 20 7d 0a 0a 20 20 69 66 28 20 69 73 44 65 6c 65   }..  if( isDele
21870 74 65 20 29 7b 0a 23 69 66 20 4f 53 5f 56 58 57  te ){.#if OS_VXW
21880 4f 52 4b 53 0a 20 20 20 20 7a 50 61 74 68 20 3d  ORKS.    zPath =
21890 20 7a 4e 61 6d 65 3b 0a 23 65 6c 73 65 0a 20 20   zName;.#else.  
218a0 20 20 75 6e 6c 69 6e 6b 28 7a 4e 61 6d 65 29 3b    unlink(zName);
218b0 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 23 69 66 20  .#endif.  }.#if 
218c0 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f  SQLITE_ENABLE_LO
218d0 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 20 20 65 6c  CKING_STYLE.  el
218e0 73 65 7b 0a 20 20 20 20 70 2d 3e 6f 70 65 6e 46  se{.    p->openF
218f0 6c 61 67 73 20 3d 20 6f 70 65 6e 46 6c 61 67 73  lags = openFlags
21900 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20  ;.  }.#endif..  
21910 69 66 28 20 69 73 4f 70 65 6e 44 69 72 65 63 74  if( isOpenDirect
21920 6f 72 79 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  ory ){.    rc = 
21930 6f 70 65 6e 44 69 72 65 63 74 6f 72 79 28 7a 50  openDirectory(zP
21940 61 74 68 2c 20 26 64 69 72 66 64 29 3b 0a 20 20  ath, &dirfd);.  
21950 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
21960 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  _OK ){.      /* 
21970 49 74 20 69 73 20 73 61 66 65 20 74 6f 20 63 6c  It is safe to cl
21980 6f 73 65 20 66 64 20 61 74 20 74 68 69 73 20 70  ose fd at this p
21990 6f 69 6e 74 2c 20 62 65 63 61 75 73 65 20 69 74  oint, because it
219a0 20 69 73 20 67 75 61 72 61 6e 74 65 65 64 20 6e   is guaranteed n
219b0 6f 74 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20 62  ot.      ** to b
219c0 65 20 6f 70 65 6e 20 6f 6e 20 61 20 64 61 74 61  e open on a data
219d0 62 61 73 65 20 66 69 6c 65 2e 20 49 66 20 69 74  base file. If it
219e0 20 77 65 72 65 20 6f 70 65 6e 20 6f 6e 20 61 20   were open on a 
219f0 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 0a 20  database file,. 
21a00 20 20 20 20 20 2a 2a 20 69 74 20 77 6f 75 6c 64       ** it would
21a10 20 6e 6f 74 20 62 65 20 73 61 66 65 20 74 6f 20   not be safe to 
21a20 63 6c 6f 73 65 20 61 73 20 74 68 69 73 20 77 6f  close as this wo
21a30 75 6c 64 20 72 65 6c 65 61 73 65 20 61 6e 79 20  uld release any 
21a40 6c 6f 63 6b 73 20 68 65 6c 64 0a 20 20 20 20 20  locks held.     
21a50 20 2a 2a 20 6f 6e 20 74 68 65 20 66 69 6c 65 20   ** on the file 
21a60 62 79 20 74 68 69 73 20 70 72 6f 63 65 73 73 2e  by this process.
21a70 20 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72    */.      asser
21a80 74 28 20 65 54 79 70 65 21 3d 53 51 4c 49 54 45  t( eType!=SQLITE
21a90 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42 20 29 3b  _OPEN_MAIN_DB );
21aa0 0a 20 20 20 20 20 20 63 6c 6f 73 65 28 66 64 29  .      close(fd)
21ab0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
21ac0 20 73 69 6c 65 6e 74 6c 79 20 6c 65 61 6b 20 69   silently leak i
21ad0 66 20 66 61 69 6c 2c 20 61 6c 72 65 61 64 79 20  f fail, already 
21ae0 69 6e 20 65 72 72 6f 72 20 2a 2f 0a 20 20 20 20  in error */.    
21af0 20 20 67 6f 74 6f 20 6f 70 65 6e 5f 66 69 6e 69    goto open_fini
21b00 73 68 65 64 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  shed;.    }.  }.
21b10 0a 23 69 66 64 65 66 20 46 44 5f 43 4c 4f 45 58  .#ifdef FD_CLOEX
21b20 45 43 0a 20 20 66 63 6e 74 6c 28 66 64 2c 20 46  EC.  fcntl(fd, F
21b30 5f 53 45 54 46 44 2c 20 66 63 6e 74 6c 28 66 64  _SETFD, fcntl(fd
21b40 2c 20 46 5f 47 45 54 46 44 2c 20 30 29 20 7c 20  , F_GETFD, 0) | 
21b50 46 44 5f 43 4c 4f 45 58 45 43 29 3b 0a 23 65 6e  FD_CLOEXEC);.#en
21b60 64 69 66 0a 0a 20 20 6e 6f 4c 6f 63 6b 20 3d 20  dif..  noLock = 
21b70 65 54 79 70 65 21 3d 53 51 4c 49 54 45 5f 4f 50  eType!=SQLITE_OP
21b80 45 4e 5f 4d 41 49 4e 5f 44 42 3b 0a 0a 20 20 0a  EN_MAIN_DB;..  .
21b90 23 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 41 50  #if defined(__AP
21ba0 50 4c 45 5f 5f 29 20 7c 7c 20 53 51 4c 49 54 45  PLE__) || SQLITE
21bb0 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f  _ENABLE_LOCKING_
21bc0 53 54 59 4c 45 0a 20 20 73 74 72 75 63 74 20 73  STYLE.  struct s
21bd0 74 61 74 66 73 20 66 73 49 6e 66 6f 3b 0a 20 20  tatfs fsInfo;.  
21be0 69 66 28 20 66 73 74 61 74 66 73 28 66 64 2c 20  if( fstatfs(fd, 
21bf0 26 66 73 49 6e 66 6f 29 20 3d 3d 20 2d 31 20 29  &fsInfo) == -1 )
21c00 7b 0a 20 20 20 20 28 28 75 6e 69 78 46 69 6c 65  {.    ((unixFile
21c10 2a 29 70 46 69 6c 65 29 2d 3e 6c 61 73 74 45 72  *)pFile)->lastEr
21c20 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20  rno = errno;.   
21c30 20 69 66 28 20 64 69 72 66 64 3e 3d 30 20 29 20   if( dirfd>=0 ) 
21c40 63 6c 6f 73 65 28 64 69 72 66 64 29 3b 20 2f 2a  close(dirfd); /*
21c50 20 73 69 6c 65 6e 74 6c 79 20 6c 65 61 6b 20 69   silently leak i
21c60 66 20 66 61 69 6c 2c 20 69 6e 20 65 72 72 6f 72  f fail, in error
21c70 20 2a 2f 0a 20 20 20 20 63 6c 6f 73 65 28 66 64   */.    close(fd
21c80 29 3b 20 2f 2a 20 73 69 6c 65 6e 74 6c 79 20 6c  ); /* silently l
21c90 65 61 6b 20 69 66 20 66 61 69 6c 2c 20 69 6e 20  eak if fail, in 
21ca0 65 72 72 6f 72 20 2a 2f 0a 20 20 20 20 72 65 74  error */.    ret
21cb0 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  urn SQLITE_IOERR
21cc0 5f 41 43 43 45 53 53 3b 0a 20 20 7d 0a 20 20 69  _ACCESS;.  }.  i
21cd0 66 20 28 30 20 3d 3d 20 73 74 72 6e 63 6d 70 28  f (0 == strncmp(
21ce0 22 6d 73 64 6f 73 22 2c 20 66 73 49 6e 66 6f 2e  "msdos", fsInfo.
21cf0 66 5f 66 73 74 79 70 65 6e 61 6d 65 2c 20 35 29  f_fstypename, 5)
21d00 29 20 7b 0a 20 20 20 20 28 28 75 6e 69 78 46 69  ) {.    ((unixFi
21d10 6c 65 2a 29 70 46 69 6c 65 29 2d 3e 66 73 46 6c  le*)pFile)->fsFl
21d20 61 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f 46 53  ags |= SQLITE_FS
21d30 46 4c 41 47 53 5f 49 53 5f 4d 53 44 4f 53 3b 0a  FLAGS_IS_MSDOS;.
21d40 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 0a 23 69    }.#endif.  .#i
21d50 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
21d60 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 23 69  LOCKING_STYLE.#i
21d70 66 20 53 51 4c 49 54 45 5f 50 52 45 46 45 52 5f  f SQLITE_PREFER_
21d80 50 52 4f 58 59 5f 4c 4f 43 4b 49 4e 47 0a 20 20  PROXY_LOCKING.  
21d90 69 73 41 75 74 6f 50 72 6f 78 79 20 3d 20 31 3b  isAutoProxy = 1;
21da0 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20 69 73  .#endif.  if( is
21db0 41 75 74 6f 50 72 6f 78 79 20 26 26 20 28 7a 50  AutoProxy && (zP
21dc0 61 74 68 21 3d 4e 55 4c 4c 29 20 26 26 20 28 21  ath!=NULL) && (!
21dd0 6e 6f 4c 6f 63 6b 29 20 26 26 20 70 56 66 73 2d  noLock) && pVfs-
21de0 3e 78 4f 70 65 6e 20 29 7b 0a 20 20 20 20 63 68  >xOpen ){.    ch
21df0 61 72 20 2a 65 6e 76 66 6f 72 63 65 20 3d 20 67  ar *envforce = g
21e00 65 74 65 6e 76 28 22 53 51 4c 49 54 45 5f 46 4f  etenv("SQLITE_FO
21e10 52 43 45 5f 50 52 4f 58 59 5f 4c 4f 43 4b 49 4e  RCE_PROXY_LOCKIN
21e20 47 22 29 3b 0a 20 20 20 20 69 6e 74 20 75 73 65  G");.    int use
21e30 50 72 6f 78 79 20 3d 20 30 3b 0a 0a 20 20 20 20  Proxy = 0;..    
21e40 2f 2a 20 53 51 4c 49 54 45 5f 46 4f 52 43 45 5f  /* SQLITE_FORCE_
21e50 50 52 4f 58 59 5f 4c 4f 43 4b 49 4e 47 3d 3d 31  PROXY_LOCKING==1
21e60 20 6d 65 61 6e 73 20 66 6f 72 63 65 20 61 6c 77   means force alw
21e70 61 79 73 20 75 73 65 20 70 72 6f 78 79 2c 20 30  ays use proxy, 0
21e80 20 6d 65 61 6e 73 20 0a 20 20 20 20 2a 2a 20 6e   means .    ** n
21e90 65 76 65 72 20 75 73 65 20 70 72 6f 78 79 2c 20  ever use proxy, 
21ea0 4e 55 4c 4c 20 6d 65 61 6e 73 20 75 73 65 20 70  NULL means use p
21eb0 72 6f 78 79 20 66 6f 72 20 6e 6f 6e 2d 6c 6f 63  roxy for non-loc
21ec0 61 6c 20 66 69 6c 65 73 20 6f 6e 6c 79 2e 20 20  al files only.  
21ed0 2a 2f 0a 20 20 20 20 69 66 28 20 65 6e 76 66 6f  */.    if( envfo
21ee0 72 63 65 21 3d 4e 55 4c 4c 20 29 7b 0a 20 20 20  rce!=NULL ){.   
21ef0 20 20 20 75 73 65 50 72 6f 78 79 20 3d 20 61 74     useProxy = at
21f00 6f 69 28 65 6e 76 66 6f 72 63 65 29 3e 30 3b 0a  oi(envforce)>0;.
21f10 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
21f20 20 73 74 72 75 63 74 20 73 74 61 74 66 73 20 66   struct statfs f
21f30 73 49 6e 66 6f 3b 0a 20 20 20 20 20 20 69 66 28  sInfo;.      if(
21f40 20 73 74 61 74 66 73 28 7a 50 61 74 68 2c 20 26   statfs(zPath, &
21f50 66 73 49 6e 66 6f 29 20 3d 3d 20 2d 31 20 29 7b  fsInfo) == -1 ){
21f60 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 20 74  .        /* In t
21f70 68 65 6f 72 79 2c 20 74 68 65 20 63 6c 6f 73 65  heory, the close
21f80 28 66 64 29 20 63 61 6c 6c 20 69 73 20 73 75 62  (fd) call is sub
21f90 2d 6f 70 74 69 6d 61 6c 2e 20 49 66 20 74 68 65  -optimal. If the
21fa0 20 66 69 6c 65 20 6f 70 65 6e 65 64 0a 20 20 20   file opened.   
21fb0 20 20 20 20 20 2a 2a 20 77 69 74 68 20 66 64 20       ** with fd 
21fc0 69 73 20 61 20 64 61 74 61 62 61 73 65 20 66 69  is a database fi
21fd0 6c 65 2c 20 61 6e 64 20 74 68 65 72 65 20 61 72  le, and there ar
21fe0 65 20 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74 69  e other connecti
21ff0 6f 6e 73 20 6f 70 65 6e 0a 20 20 20 20 20 20 20  ons open.       
22000 20 2a 2a 20 6f 6e 20 74 68 61 74 20 66 69 6c 65   ** on that file
22010 20 74 68 61 74 20 61 72 65 20 63 75 72 72 65 6e   that are curren
22020 74 6c 79 20 68 6f 6c 64 69 6e 67 20 61 64 76 69  tly holding advi
22030 73 6f 72 79 20 6c 6f 63 6b 73 20 6f 6e 20 69 74  sory locks on it
22040 2c 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65  ,.        ** the
22050 6e 20 74 68 65 20 63 61 6c 6c 20 74 6f 20 63 6c  n the call to cl
22060 6f 73 65 28 29 20 77 69 6c 6c 20 63 61 6e 63 65  ose() will cance
22070 6c 20 74 68 6f 73 65 20 6c 6f 63 6b 73 2e 20 49  l those locks. I
22080 6e 20 70 72 61 63 74 69 63 65 2c 0a 20 20 20 20  n practice,.    
22090 20 20 20 20 2a 2a 20 77 65 27 72 65 20 61 73 73      ** we're ass
220a0 75 6d 69 6e 67 20 74 68 61 74 20 73 74 61 74 66  uming that statf
220b0 73 28 29 20 64 6f 65 73 6e 27 74 20 66 61 69 6c  s() doesn't fail
220c0 20 76 65 72 79 20 6f 66 74 65 6e 2e 20 41 74 20   very often. At 
220d0 6c 65 61 73 74 0a 20 20 20 20 20 20 20 20 2a 2a  least.        **
220e0 20 6e 6f 74 20 77 68 69 6c 65 20 6f 74 68 65 72   not while other
220f0 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
22100 73 20 6f 70 65 6e 65 64 20 62 79 20 74 68 65 20  s opened by the 
22110 73 61 6d 65 20 70 72 6f 63 65 73 73 20 6f 6e 0a  same process on.
22120 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20 73          ** the s
22130 61 6d 65 20 66 69 6c 65 20 61 72 65 20 77 6f 72  ame file are wor
22140 6b 69 6e 67 2e 20 20 2a 2f 0a 20 20 20 20 20 20  king.  */.      
22150 20 20 70 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d    p->lastErrno =
22160 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20 20 20   errno;.        
22170 69 66 28 20 64 69 72 66 64 3e 3d 30 20 29 7b 0a  if( dirfd>=0 ){.
22180 20 20 20 20 20 20 20 20 20 20 63 6c 6f 73 65 28            close(
22190 64 69 72 66 64 29 3b 20 2f 2a 20 73 69 6c 65 6e  dirfd); /* silen
221a0 74 6c 79 20 6c 65 61 6b 20 69 66 20 66 61 69 6c  tly leak if fail
221b0 2c 20 69 6e 20 65 72 72 6f 72 20 2a 2f 0a 20 20  , in error */.  
221c0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
221d0 63 6c 6f 73 65 28 66 64 29 3b 20 2f 2a 20 73 69  close(fd); /* si
221e0 6c 65 6e 74 6c 79 20 6c 65 61 6b 20 69 66 20 66  lently leak if f
221f0 61 69 6c 2c 20 69 6e 20 65 72 72 6f 72 20 2a 2f  ail, in error */
22200 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51  .        rc = SQ
22210 4c 49 54 45 5f 49 4f 45 52 52 5f 41 43 43 45 53  LITE_IOERR_ACCES
22220 53 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20  S;.        goto 
22230 6f 70 65 6e 5f 66 69 6e 69 73 68 65 64 3b 0a 20  open_finished;. 
22240 20 20 20 20 20 7d 0a 20 20 20 20 20 20 75 73 65       }.      use
22250 50 72 6f 78 79 20 3d 20 21 28 66 73 49 6e 66 6f  Proxy = !(fsInfo
22260 2e 66 5f 66 6c 61 67 73 26 4d 4e 54 5f 4c 4f 43  .f_flags&MNT_LOC
22270 41 4c 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  AL);.    }.    i
22280 66 28 20 75 73 65 50 72 6f 78 79 20 29 7b 0a 20  f( useProxy ){. 
22290 20 20 20 20 20 72 63 20 3d 20 66 69 6c 6c 49 6e       rc = fillIn
222a0 55 6e 69 78 46 69 6c 65 28 70 56 66 73 2c 20 66  UnixFile(pVfs, f
222b0 64 2c 20 64 69 72 66 64 2c 20 70 46 69 6c 65 2c  d, dirfd, pFile,
222c0 20 7a 50 61 74 68 2c 20 6e 6f 4c 6f 63 6b 2c 20   zPath, noLock, 
222d0 69 73 44 65 6c 65 74 65 29 3b 0a 20 20 20 20 20  isDelete);.     
222e0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
222f0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  OK ){.        rc
22300 20 3d 20 70 72 6f 78 79 54 72 61 6e 73 66 6f 72   = proxyTransfor
22310 6d 55 6e 69 78 46 69 6c 65 28 28 75 6e 69 78 46  mUnixFile((unixF
22320 69 6c 65 2a 29 70 46 69 6c 65 2c 20 22 3a 61 75  ile*)pFile, ":au
22330 74 6f 3a 22 29 3b 0a 20 20 20 20 20 20 20 20 69  to:");.        i
22340 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
22350 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a   ){.          /*
22360 20 55 73 65 20 75 6e 69 78 43 6c 6f 73 65 20 74   Use unixClose t
22370 6f 20 63 6c 65 61 6e 20 75 70 20 74 68 65 20 72  o clean up the r
22380 65 73 6f 75 72 63 65 73 20 61 64 64 65 64 20 69  esources added i
22390 6e 20 66 69 6c 6c 49 6e 55 6e 69 78 46 69 6c 65  n fillInUnixFile
223a0 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 61   .          ** a
223b0 6e 64 20 63 6c 65 61 72 20 61 6c 6c 20 74 68 65  nd clear all the
223c0 20 73 74 72 75 63 74 75 72 65 27 73 20 72 65 66   structure's ref
223d0 65 72 65 6e 63 65 73 2e 20 20 53 70 65 63 69 66  erences.  Specif
223e0 69 63 61 6c 6c 79 2c 20 0a 20 20 20 20 20 20 20  ically, .       
223f0 20 20 20 2a 2a 20 70 46 69 6c 65 2d 3e 70 4d 65     ** pFile->pMe
22400 74 68 6f 64 73 20 77 69 6c 6c 20 62 65 20 4e 55  thods will be NU
22410 4c 4c 20 73 6f 20 73 71 6c 69 74 65 33 4f 73 43  LL so sqlite3OsC
22420 6c 6f 73 65 20 77 69 6c 6c 20 62 65 20 61 20 6e  lose will be a n
22430 6f 2d 6f 70 20 0a 20 20 20 20 20 20 20 20 20 20  o-op .          
22440 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 75 6e 69  */.          uni
22450 78 43 6c 6f 73 65 28 70 46 69 6c 65 29 3b 0a 20  xClose(pFile);. 
22460 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
22470 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  rc;.        }.  
22480 20 20 20 20 7d 0a 20 20 20 20 20 20 67 6f 74 6f      }.      goto
22490 20 6f 70 65 6e 5f 66 69 6e 69 73 68 65 64 3b 0a   open_finished;.
224a0 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66      }.  }.#endif
224b0 0a 20 20 0a 20 20 72 63 20 3d 20 66 69 6c 6c 49  .  .  rc = fillI
224c0 6e 55 6e 69 78 46 69 6c 65 28 70 56 66 73 2c 20  nUnixFile(pVfs, 
224d0 66 64 2c 20 64 69 72 66 64 2c 20 70 46 69 6c 65  fd, dirfd, pFile
224e0 2c 20 7a 50 61 74 68 2c 20 6e 6f 4c 6f 63 6b 2c  , zPath, noLock,
224f0 20 69 73 44 65 6c 65 74 65 29 3b 0a 6f 70 65 6e   isDelete);.open
22500 5f 66 69 6e 69 73 68 65 64 3a 0a 20 20 69 66 28  _finished:.  if(
22510 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
22520 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  {.    sqlite3_fr
22530 65 65 28 70 2d 3e 70 55 6e 75 73 65 64 29 3b 0a  ee(p->pUnused);.
22540 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
22550 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74  .}.../*.** Delet
22560 65 20 74 68 65 20 66 69 6c 65 20 61 74 20 7a 50  e the file at zP
22570 61 74 68 2e 20 49 66 20 74 68 65 20 64 69 72 53  ath. If the dirS
22580 79 6e 63 20 61 72 67 75 6d 65 6e 74 20 69 73 20  ync argument is 
22590 74 72 75 65 2c 20 66 73 79 6e 63 28 29 0a 2a 2a  true, fsync().**
225a0 20 74 68 65 20 64 69 72 65 63 74 6f 72 79 20 61   the directory a
225b0 66 74 65 72 20 64 65 6c 65 74 69 6e 67 20 74 68  fter deleting th
225c0 65 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69  e file..*/.stati
225d0 63 20 69 6e 74 20 75 6e 69 78 44 65 6c 65 74 65  c int unixDelete
225e0 28 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20  (.  sqlite3_vfs 
225f0 2a 4e 6f 74 55 73 65 64 2c 20 20 20 20 20 2f 2a  *NotUsed,     /*
22600 20 56 46 53 20 63 6f 6e 74 61 69 6e 69 6e 67 20   VFS containing 
22610 74 68 69 73 20 61 73 20 74 68 65 20 78 44 65 6c  this as the xDel
22620 65 74 65 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20  ete method */.  
22630 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 61 74  const char *zPat
22640 68 2c 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d  h,        /* Nam
22650 65 20 6f 66 20 66 69 6c 65 20 74 6f 20 62 65 20  e of file to be 
22660 64 65 6c 65 74 65 64 20 2a 2f 0a 20 20 69 6e 74  deleted */.  int
22670 20 64 69 72 53 79 6e 63 20 20 20 20 20 20 20 20   dirSync        
22680 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74 72 75         /* If tru
22690 65 2c 20 66 73 79 6e 63 28 29 20 64 69 72 65 63  e, fsync() direc
226a0 74 6f 72 79 20 61 66 74 65 72 20 64 65 6c 65 74  tory after delet
226b0 69 6e 67 20 66 69 6c 65 20 2a 2f 0a 29 7b 0a 20  ing file */.){. 
226c0 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
226d0 5f 4f 4b 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41  _OK;.  UNUSED_PA
226e0 52 41 4d 45 54 45 52 28 4e 6f 74 55 73 65 64 29  RAMETER(NotUsed)
226f0 3b 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72  ;.  SimulateIOEr
22700 72 6f 72 28 72 65 74 75 72 6e 20 53 51 4c 49 54  ror(return SQLIT
22710 45 5f 49 4f 45 52 52 5f 44 45 4c 45 54 45 29 3b  E_IOERR_DELETE);
22720 0a 20 20 75 6e 6c 69 6e 6b 28 7a 50 61 74 68 29  .  unlink(zPath)
22730 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
22740 5f 44 49 53 41 42 4c 45 5f 44 49 52 53 59 4e 43  _DISABLE_DIRSYNC
22750 0a 20 20 69 66 28 20 64 69 72 53 79 6e 63 20 29  .  if( dirSync )
22760 7b 0a 20 20 20 20 69 6e 74 20 66 64 3b 0a 20 20  {.    int fd;.  
22770 20 20 72 63 20 3d 20 6f 70 65 6e 44 69 72 65 63    rc = openDirec
22780 74 6f 72 79 28 7a 50 61 74 68 2c 20 26 66 64 29  tory(zPath, &fd)
22790 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  ;.    if( rc==SQ
227a0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 23 69 66 20 4f  LITE_OK ){.#if O
227b0 53 5f 56 58 57 4f 52 4b 53 0a 20 20 20 20 20 20  S_VXWORKS.      
227c0 69 66 28 20 66 73 79 6e 63 28 66 64 29 3d 3d 2d  if( fsync(fd)==-
227d0 31 20 29 0a 23 65 6c 73 65 0a 20 20 20 20 20 20  1 ).#else.      
227e0 69 66 28 20 66 73 79 6e 63 28 66 64 29 20 29 0a  if( fsync(fd) ).
227f0 23 65 6e 64 69 66 0a 20 20 20 20 20 20 7b 0a 20  #endif.      {. 
22800 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
22810 54 45 5f 49 4f 45 52 52 5f 44 49 52 5f 46 53 59  TE_IOERR_DIR_FSY
22820 4e 43 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  NC;.      }.    
22830 20 20 69 66 28 20 63 6c 6f 73 65 28 66 64 29 26    if( close(fd)&
22840 26 21 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20  &!rc ){.        
22850 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52  rc = SQLITE_IOER
22860 52 5f 44 49 52 5f 43 4c 4f 53 45 3b 0a 20 20 20  R_DIR_CLOSE;.   
22870 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 23     }.    }.  }.#
22880 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20 72  endif.  return r
22890 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 65 73 74  c;.}../*.** Test
228a0 20 74 68 65 20 65 78 69 73 74 61 6e 63 65 20 6f   the existance o
228b0 66 20 6f 72 20 61 63 63 65 73 73 20 70 65 72 6d  f or access perm
228c0 69 73 73 69 6f 6e 73 20 6f 66 20 66 69 6c 65 20  issions of file 
228d0 7a 50 61 74 68 2e 20 54 68 65 0a 2a 2a 20 74 65  zPath. The.** te
228e0 73 74 20 70 65 72 66 6f 72 6d 65 64 20 64 65 70  st performed dep
228f0 65 6e 64 73 20 6f 6e 20 74 68 65 20 76 61 6c 75  ends on the valu
22900 65 20 6f 66 20 66 6c 61 67 73 3a 0a 2a 2a 0a 2a  e of flags:.**.*
22910 2a 20 20 20 20 20 53 51 4c 49 54 45 5f 41 43 43  *     SQLITE_ACC
22920 45 53 53 5f 45 58 49 53 54 53 3a 20 52 65 74 75  ESS_EXISTS: Retu
22930 72 6e 20 31 20 69 66 20 74 68 65 20 66 69 6c 65  rn 1 if the file
22940 20 65 78 69 73 74 73 0a 2a 2a 20 20 20 20 20 53   exists.**     S
22950 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 52 45 41  QLITE_ACCESS_REA
22960 44 57 52 49 54 45 3a 20 52 65 74 75 72 6e 20 31  DWRITE: Return 1
22970 20 69 66 20 74 68 65 20 66 69 6c 65 20 69 73 20   if the file is 
22980 72 65 61 64 20 61 6e 64 20 77 72 69 74 61 62 6c  read and writabl
22990 65 2e 0a 2a 2a 20 20 20 20 20 53 51 4c 49 54 45  e..**     SQLITE
229a0 5f 41 43 43 45 53 53 5f 52 45 41 44 4f 4e 4c 59  _ACCESS_READONLY
229b0 3a 20 52 65 74 75 72 6e 20 31 20 69 66 20 74 68  : Return 1 if th
229c0 65 20 66 69 6c 65 20 69 73 20 72 65 61 64 61 62  e file is readab
229d0 6c 65 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77  le..**.** Otherw
229e0 69 73 65 20 72 65 74 75 72 6e 20 30 2e 0a 2a 2f  ise return 0..*/
229f0 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78  .static int unix
22a00 41 63 63 65 73 73 28 0a 20 20 73 71 6c 69 74 65  Access(.  sqlite
22a10 33 5f 76 66 73 20 2a 4e 6f 74 55 73 65 64 2c 20  3_vfs *NotUsed, 
22a20 20 20 2f 2a 20 54 68 65 20 56 46 53 20 63 6f 6e    /* The VFS con
22a30 74 61 69 6e 69 6e 67 20 74 68 69 73 20 78 41 63  taining this xAc
22a40 63 65 73 73 20 6d 65 74 68 6f 64 20 2a 2f 0a 20  cess method */. 
22a50 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 61   const char *zPa
22a60 74 68 2c 20 20 20 20 20 20 2f 2a 20 50 61 74 68  th,      /* Path
22a70 20 6f 66 20 74 68 65 20 66 69 6c 65 20 74 6f 20   of the file to 
22a80 65 78 61 6d 69 6e 65 20 2a 2f 0a 20 20 69 6e 74  examine */.  int
22a90 20 66 6c 61 67 73 2c 20 20 20 20 20 20 20 20 20   flags,         
22aa0 20 20 20 20 20 2f 2a 20 57 68 61 74 20 64 6f 20       /* What do 
22ab0 77 65 20 77 61 6e 74 20 74 6f 20 6c 65 61 72 6e  we want to learn
22ac0 20 61 62 6f 75 74 20 74 68 65 20 7a 50 61 74 68   about the zPath
22ad0 20 66 69 6c 65 3f 20 2a 2f 0a 20 20 69 6e 74 20   file? */.  int 
22ae0 2a 70 52 65 73 4f 75 74 20 20 20 20 20 20 20 20  *pResOut        
22af0 20 20 20 20 2f 2a 20 57 72 69 74 65 20 72 65 73      /* Write res
22b00 75 6c 74 20 62 6f 6f 6c 65 61 6e 20 68 65 72 65  ult boolean here
22b10 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 61 6d 6f   */.){.  int amo
22b20 64 65 20 3d 20 30 3b 0a 20 20 55 4e 55 53 45 44  de = 0;.  UNUSED
22b30 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f 74 55 73  _PARAMETER(NotUs
22b40 65 64 29 3b 0a 20 20 53 69 6d 75 6c 61 74 65 49  ed);.  SimulateI
22b50 4f 45 72 72 6f 72 28 20 72 65 74 75 72 6e 20 53  OError( return S
22b60 51 4c 49 54 45 5f 49 4f 45 52 52 5f 41 43 43 45  QLITE_IOERR_ACCE
22b70 53 53 3b 20 29 3b 0a 20 20 73 77 69 74 63 68 28  SS; );.  switch(
22b80 20 66 6c 61 67 73 20 29 7b 0a 20 20 20 20 63 61   flags ){.    ca
22b90 73 65 20 53 51 4c 49 54 45 5f 41 43 43 45 53 53  se SQLITE_ACCESS
22ba0 5f 45 58 49 53 54 53 3a 0a 20 20 20 20 20 20 61  _EXISTS:.      a
22bb0 6d 6f 64 65 20 3d 20 46 5f 4f 4b 3b 0a 20 20 20  mode = F_OK;.   
22bc0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61     break;.    ca
22bd0 73 65 20 53 51 4c 49 54 45 5f 41 43 43 45 53 53  se SQLITE_ACCESS
22be0 5f 52 45 41 44 57 52 49 54 45 3a 0a 20 20 20 20  _READWRITE:.    
22bf0 20 20 61 6d 6f 64 65 20 3d 20 57 5f 4f 4b 7c 52    amode = W_OK|R
22c00 5f 4f 4b 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  _OK;.      break
22c10 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  ;.    case SQLIT
22c20 45 5f 41 43 43 45 53 53 5f 52 45 41 44 3a 0a 20  E_ACCESS_READ:. 
22c30 20 20 20 20 20 61 6d 6f 64 65 20 3d 20 52 5f 4f       amode = R_O
22c40 4b 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  K;.      break;.
22c50 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 0a 20 20  .    default:.  
22c60 20 20 20 20 61 73 73 65 72 74 28 21 22 49 6e 76      assert(!"Inv
22c70 61 6c 69 64 20 66 6c 61 67 73 20 61 72 67 75 6d  alid flags argum
22c80 65 6e 74 22 29 3b 0a 20 20 7d 0a 20 20 2a 70 52  ent");.  }.  *pR
22c90 65 73 4f 75 74 20 3d 20 28 61 63 63 65 73 73 28  esOut = (access(
22ca0 7a 50 61 74 68 2c 20 61 6d 6f 64 65 29 3d 3d 30  zPath, amode)==0
22cb0 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
22cc0 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  TE_OK;.}.../*.**
22cd0 20 54 75 72 6e 20 61 20 72 65 6c 61 74 69 76 65   Turn a relative
22ce0 20 70 61 74 68 6e 61 6d 65 20 69 6e 74 6f 20 61   pathname into a
22cf0 20 66 75 6c 6c 20 70 61 74 68 6e 61 6d 65 2e 20   full pathname. 
22d00 54 68 65 20 72 65 6c 61 74 69 76 65 20 70 61 74  The relative pat
22d10 68 0a 2a 2a 20 69 73 20 73 74 6f 72 65 64 20 61  h.** is stored a
22d20 73 20 61 20 6e 75 6c 2d 74 65 72 6d 69 6e 61 74  s a nul-terminat
22d30 65 64 20 73 74 72 69 6e 67 20 69 6e 20 74 68 65  ed string in the
22d40 20 62 75 66 66 65 72 20 70 6f 69 6e 74 65 64 20   buffer pointed 
22d50 74 6f 20 62 79 0a 2a 2a 20 7a 50 61 74 68 2e 20  to by.** zPath. 
22d60 0a 2a 2a 0a 2a 2a 20 7a 4f 75 74 20 70 6f 69 6e  .**.** zOut poin
22d70 74 73 20 74 6f 20 61 20 62 75 66 66 65 72 20 6f  ts to a buffer o
22d80 66 20 61 74 20 6c 65 61 73 74 20 73 71 6c 69 74  f at least sqlit
22d90 65 33 5f 76 66 73 2e 6d 78 50 61 74 68 6e 61 6d  e3_vfs.mxPathnam
22da0 65 20 62 79 74 65 73 20 0a 2a 2a 20 28 69 6e 20  e bytes .** (in 
22db0 74 68 69 73 20 63 61 73 65 2c 20 4d 41 58 5f 50  this case, MAX_P
22dc0 41 54 48 4e 41 4d 45 20 62 79 74 65 73 29 2e 20  ATHNAME bytes). 
22dd0 54 68 65 20 66 75 6c 6c 2d 70 61 74 68 20 69 73  The full-path is
22de0 20 77 72 69 74 74 65 6e 20 74 6f 0a 2a 2a 20 74   written to.** t
22df0 68 69 73 20 62 75 66 66 65 72 20 62 65 66 6f 72  his buffer befor
22e00 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2f 0a  e returning..*/.
22e10 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 46  static int unixF
22e20 75 6c 6c 50 61 74 68 6e 61 6d 65 28 0a 20 20 73  ullPathname(.  s
22e30 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73  qlite3_vfs *pVfs
22e40 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
22e50 50 6f 69 6e 74 65 72 20 74 6f 20 76 66 73 20 6f  Pointer to vfs o
22e60 62 6a 65 63 74 20 2a 2f 0a 20 20 63 6f 6e 73 74  bject */.  const
22e70 20 63 68 61 72 20 2a 7a 50 61 74 68 2c 20 20 20   char *zPath,   
22e80 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 73 73           /* Poss
22e90 69 62 6c 79 20 72 65 6c 61 74 69 76 65 20 69 6e  ibly relative in
22ea0 70 75 74 20 70 61 74 68 20 2a 2f 0a 20 20 69 6e  put path */.  in
22eb0 74 20 6e 4f 75 74 2c 20 20 20 20 20 20 20 20 20  t nOut,         
22ec0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
22ed0 69 7a 65 20 6f 66 20 6f 75 74 70 75 74 20 62 75  ize of output bu
22ee0 66 66 65 72 20 69 6e 20 62 79 74 65 73 20 2a 2f  ffer in bytes */
22ef0 0a 20 20 63 68 61 72 20 2a 7a 4f 75 74 20 20 20  .  char *zOut   
22f00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22f10 20 2f 2a 20 4f 75 74 70 75 74 20 62 75 66 66 65   /* Output buffe
22f20 72 20 2a 2f 0a 29 7b 0a 0a 20 20 2f 2a 20 49 74  r */.){..  /* It
22f30 27 73 20 6f 64 64 20 74 6f 20 73 69 6d 75 6c 61  's odd to simula
22f40 74 65 20 61 6e 20 69 6f 2d 65 72 72 6f 72 20 68  te an io-error h
22f50 65 72 65 2c 20 62 75 74 20 72 65 61 6c 6c 79 20  ere, but really 
22f60 74 68 69 73 20 69 73 20 6a 75 73 74 0a 20 20 2a  this is just.  *
22f70 2a 20 75 73 69 6e 67 20 74 68 65 20 69 6f 2d 65  * using the io-e
22f80 72 72 6f 72 20 69 6e 66 72 61 73 74 72 75 63 74  rror infrastruct
22f90 75 72 65 20 74 6f 20 74 65 73 74 20 74 68 61 74  ure to test that
22fa0 20 53 51 4c 69 74 65 20 68 61 6e 64 6c 65 73 20   SQLite handles 
22fb0 74 68 69 73 0a 20 20 2a 2a 20 66 75 6e 63 74 69  this.  ** functi
22fc0 6f 6e 20 66 61 69 6c 69 6e 67 2e 20 54 68 69 73  on failing. This
22fd0 20 66 75 6e 63 74 69 6f 6e 20 63 6f 75 6c 64 20   function could 
22fe0 66 61 69 6c 20 69 66 2c 20 66 6f 72 20 65 78 61  fail if, for exa
22ff0 6d 70 6c 65 2c 20 74 68 65 0a 20 20 2a 2a 20 63  mple, the.  ** c
23000 75 72 72 65 6e 74 20 77 6f 72 6b 69 6e 67 20 64  urrent working d
23010 69 72 65 63 74 6f 72 79 20 68 61 73 20 62 65 65  irectory has bee
23020 6e 20 75 6e 6c 69 6e 6b 65 64 2e 0a 20 20 2a 2f  n unlinked..  */
23030 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72  .  SimulateIOErr
23040 6f 72 28 20 72 65 74 75 72 6e 20 53 51 4c 49 54  or( return SQLIT
23050 45 5f 45 52 52 4f 52 20 29 3b 0a 0a 20 20 61 73  E_ERROR );..  as
23060 73 65 72 74 28 20 70 56 66 73 2d 3e 6d 78 50 61  sert( pVfs->mxPa
23070 74 68 6e 61 6d 65 3d 3d 4d 41 58 5f 50 41 54 48  thname==MAX_PATH
23080 4e 41 4d 45 20 29 3b 0a 20 20 55 4e 55 53 45 44  NAME );.  UNUSED
23090 5f 50 41 52 41 4d 45 54 45 52 28 70 56 66 73 29  _PARAMETER(pVfs)
230a0 3b 0a 0a 20 20 7a 4f 75 74 5b 6e 4f 75 74 2d 31  ;..  zOut[nOut-1
230b0 5d 20 3d 20 27 5c 30 27 3b 0a 20 20 69 66 28 20  ] = '\0';.  if( 
230c0 7a 50 61 74 68 5b 30 5d 3d 3d 27 2f 27 20 29 7b  zPath[0]=='/' ){
230d0 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70  .    sqlite3_snp
230e0 72 69 6e 74 66 28 6e 4f 75 74 2c 20 7a 4f 75 74  rintf(nOut, zOut
230f0 2c 20 22 25 73 22 2c 20 7a 50 61 74 68 29 3b 0a  , "%s", zPath);.
23100 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74    }else{.    int
23110 20 6e 43 77 64 3b 0a 20 20 20 20 69 66 28 20 67   nCwd;.    if( g
23120 65 74 63 77 64 28 7a 4f 75 74 2c 20 6e 4f 75 74  etcwd(zOut, nOut
23130 2d 31 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  -1)==0 ){.      
23140 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 41  return SQLITE_CA
23150 4e 54 4f 50 45 4e 5f 42 4b 50 54 3b 0a 20 20 20  NTOPEN_BKPT;.   
23160 20 7d 0a 20 20 20 20 6e 43 77 64 20 3d 20 28 69   }.    nCwd = (i
23170 6e 74 29 73 74 72 6c 65 6e 28 7a 4f 75 74 29 3b  nt)strlen(zOut);
23180 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70  .    sqlite3_snp
23190 72 69 6e 74 66 28 6e 4f 75 74 2d 6e 43 77 64 2c  rintf(nOut-nCwd,
231a0 20 26 7a 4f 75 74 5b 6e 43 77 64 5d 2c 20 22 2f   &zOut[nCwd], "/
231b0 25 73 22 2c 20 7a 50 61 74 68 29 3b 0a 20 20 7d  %s", zPath);.  }
231c0 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
231d0 5f 4f 4b 3b 0a 7d 0a 0a 0a 23 69 66 6e 64 65 66  _OK;.}...#ifndef
231e0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c 4f 41   SQLITE_OMIT_LOA
231f0 44 5f 45 58 54 45 4e 53 49 4f 4e 0a 2f 2a 0a 2a  D_EXTENSION./*.*
23200 2a 20 49 6e 74 65 72 66 61 63 65 73 20 66 6f 72  * Interfaces for
23210 20 6f 70 65 6e 69 6e 67 20 61 20 73 68 61 72 65   opening a share
23220 64 20 6c 69 62 72 61 72 79 2c 20 66 69 6e 64 69  d library, findi
23230 6e 67 20 65 6e 74 72 79 20 70 6f 69 6e 74 73 0a  ng entry points.
23240 2a 2a 20 77 69 74 68 69 6e 20 74 68 65 20 73 68  ** within the sh
23250 61 72 65 64 20 6c 69 62 72 61 72 79 2c 20 61 6e  ared library, an
23260 64 20 63 6c 6f 73 69 6e 67 20 74 68 65 20 73 68  d closing the sh
23270 61 72 65 64 20 6c 69 62 72 61 72 79 2e 0a 2a 2f  ared library..*/
23280 0a 23 69 6e 63 6c 75 64 65 20 3c 64 6c 66 63 6e  .#include <dlfcn
23290 2e 68 3e 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .h>.static void 
232a0 2a 75 6e 69 78 44 6c 4f 70 65 6e 28 73 71 6c 69  *unixDlOpen(sqli
232b0 74 65 33 5f 76 66 73 20 2a 4e 6f 74 55 73 65 64  te3_vfs *NotUsed
232c0 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46  , const char *zF
232d0 69 6c 65 6e 61 6d 65 29 7b 0a 20 20 55 4e 55 53  ilename){.  UNUS
232e0 45 44 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f 74  ED_PARAMETER(Not
232f0 55 73 65 64 29 3b 0a 20 20 72 65 74 75 72 6e 20  Used);.  return 
23300 64 6c 6f 70 65 6e 28 7a 46 69 6c 65 6e 61 6d 65  dlopen(zFilename
23310 2c 20 52 54 4c 44 5f 4e 4f 57 20 7c 20 52 54 4c  , RTLD_NOW | RTL
23320 44 5f 47 4c 4f 42 41 4c 29 3b 0a 7d 0a 0a 2f 2a  D_GLOBAL);.}../*
23330 0a 2a 2a 20 53 51 4c 69 74 65 20 63 61 6c 6c 73  .** SQLite calls
23340 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   this function i
23350 6d 6d 65 64 69 61 74 65 6c 79 20 61 66 74 65 72  mmediately after
23360 20 61 20 63 61 6c 6c 20 74 6f 20 75 6e 69 78 44   a call to unixD
23370 6c 53 79 6d 28 29 20 6f 72 0a 2a 2a 20 75 6e 69  lSym() or.** uni
23380 78 44 6c 4f 70 65 6e 28 29 20 66 61 69 6c 73 20  xDlOpen() fails 
23390 28 72 65 74 75 72 6e 73 20 61 20 6e 75 6c 6c 20  (returns a null 
233a0 70 6f 69 6e 74 65 72 29 2e 20 49 66 20 61 20 6d  pointer). If a m
233b0 6f 72 65 20 64 65 74 61 69 6c 65 64 20 65 72 72  ore detailed err
233c0 6f 72 0a 2a 2a 20 6d 65 73 73 61 67 65 20 69 73  or.** message is
233d0 20 61 76 61 69 6c 61 62 6c 65 2c 20 69 74 20 69   available, it i
233e0 73 20 77 72 69 74 74 65 6e 20 74 6f 20 7a 42 75  s written to zBu
233f0 66 4f 75 74 2e 20 49 66 20 6e 6f 20 65 72 72 6f  fOut. If no erro
23400 72 20 6d 65 73 73 61 67 65 0a 2a 2a 20 69 73 20  r message.** is 
23410 61 76 61 69 6c 61 62 6c 65 2c 20 7a 42 75 66 4f  available, zBufO
23420 75 74 20 69 73 20 6c 65 66 74 20 75 6e 6d 6f 64  ut is left unmod
23430 69 66 69 65 64 20 61 6e 64 20 53 51 4c 69 74 65  ified and SQLite
23440 20 75 73 65 73 20 61 20 64 65 66 61 75 6c 74 0a   uses a default.
23450 2a 2a 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  ** error message
23460 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
23470 20 75 6e 69 78 44 6c 45 72 72 6f 72 28 73 71 6c   unixDlError(sql
23480 69 74 65 33 5f 76 66 73 20 2a 4e 6f 74 55 73 65  ite3_vfs *NotUse
23490 64 2c 20 69 6e 74 20 6e 42 75 66 2c 20 63 68 61  d, int nBuf, cha
234a0 72 20 2a 7a 42 75 66 4f 75 74 29 7b 0a 20 20 63  r *zBufOut){.  c
234b0 68 61 72 20 2a 7a 45 72 72 3b 0a 20 20 55 4e 55  har *zErr;.  UNU
234c0 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f  SED_PARAMETER(No
234d0 74 55 73 65 64 29 3b 0a 20 20 75 6e 69 78 45 6e  tUsed);.  unixEn
234e0 74 65 72 4d 75 74 65 78 28 29 3b 0a 20 20 7a 45  terMutex();.  zE
234f0 72 72 20 3d 20 64 6c 65 72 72 6f 72 28 29 3b 0a  rr = dlerror();.
23500 20 20 69 66 28 20 7a 45 72 72 20 29 7b 0a 20 20    if( zErr ){.  
23510 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
23520 74 66 28 6e 42 75 66 2c 20 7a 42 75 66 4f 75 74  tf(nBuf, zBufOut
23530 2c 20 22 25 73 22 2c 20 7a 45 72 72 29 3b 0a 20  , "%s", zErr);. 
23540 20 7d 0a 20 20 75 6e 69 78 4c 65 61 76 65 4d 75   }.  unixLeaveMu
23550 74 65 78 28 29 3b 0a 7d 0a 73 74 61 74 69 63 20  tex();.}.static 
23560 76 6f 69 64 20 28 2a 75 6e 69 78 44 6c 53 79 6d  void (*unixDlSym
23570 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 4e 6f  (sqlite3_vfs *No
23580 74 55 73 65 64 2c 20 76 6f 69 64 20 2a 70 2c 20  tUsed, void *p, 
23590 63 6f 6e 73 74 20 63 68 61 72 2a 7a 53 79 6d 29  const char*zSym)
235a0 29 28 76 6f 69 64 29 7b 0a 20 20 2f 2a 20 0a 20  )(void){.  /* . 
235b0 20 2a 2a 20 47 43 43 20 77 69 74 68 20 2d 70 65   ** GCC with -pe
235c0 64 61 6e 74 69 63 2d 65 72 72 6f 72 73 20 73 61  dantic-errors sa
235d0 79 73 20 74 68 61 74 20 43 39 30 20 64 6f 65 73  ys that C90 does
235e0 20 6e 6f 74 20 61 6c 6c 6f 77 20 61 20 76 6f 69   not allow a voi
235f0 64 2a 20 74 6f 20 62 65 0a 20 20 2a 2a 20 63 61  d* to be.  ** ca
23600 73 74 20 69 6e 74 6f 20 61 20 70 6f 69 6e 74 65  st into a pointe
23610 72 20 74 6f 20 61 20 66 75 6e 63 74 69 6f 6e 2e  r to a function.
23620 20 20 41 6e 64 20 79 65 74 20 74 68 65 20 6c 69    And yet the li
23630 62 72 61 72 79 20 64 6c 73 79 6d 28 29 20 72 6f  brary dlsym() ro
23640 75 74 69 6e 65 0a 20 20 2a 2a 20 72 65 74 75 72  utine.  ** retur
23650 6e 73 20 61 20 76 6f 69 64 2a 20 77 68 69 63 68  ns a void* which
23660 20 69 73 20 72 65 61 6c 6c 79 20 61 20 70 6f 69   is really a poi
23670 6e 74 65 72 20 74 6f 20 61 20 66 75 6e 63 74 69  nter to a functi
23680 6f 6e 2e 20 20 53 6f 20 68 6f 77 20 64 6f 20 77  on.  So how do w
23690 65 0a 20 20 2a 2a 20 75 73 65 20 64 6c 73 79 6d  e.  ** use dlsym
236a0 28 29 20 77 69 74 68 20 2d 70 65 64 61 6e 74 69  () with -pedanti
236b0 63 2d 65 72 72 6f 72 73 3f 0a 20 20 2a 2a 0a 20  c-errors?.  **. 
236c0 20 2a 2a 20 56 61 72 69 61 62 6c 65 20 78 20 62   ** Variable x b
236d0 65 6c 6f 77 20 69 73 20 64 65 66 69 6e 65 64 20  elow is defined 
236e0 74 6f 20 62 65 20 61 20 70 6f 69 6e 74 65 72 20  to be a pointer 
236f0 74 6f 20 61 20 66 75 6e 63 74 69 6f 6e 20 74 61  to a function ta
23700 6b 69 6e 67 0a 20 20 2a 2a 20 70 61 72 61 6d 65  king.  ** parame
23710 74 65 72 73 20 76 6f 69 64 2a 20 61 6e 64 20 63  ters void* and c
23720 6f 6e 73 74 20 63 68 61 72 2a 20 61 6e 64 20 72  onst char* and r
23730 65 74 75 72 6e 69 6e 67 20 61 20 70 6f 69 6e 74  eturning a point
23740 65 72 20 74 6f 20 61 20 66 75 6e 63 74 69 6f 6e  er to a function
23750 2e 0a 20 20 2a 2a 20 57 65 20 69 6e 69 74 69 61  ..  ** We initia
23760 6c 69 7a 65 20 78 20 62 79 20 61 73 73 69 67 6e  lize x by assign
23770 69 6e 67 20 69 74 20 61 20 70 6f 69 6e 74 65 72  ing it a pointer
23780 20 74 6f 20 74 68 65 20 64 6c 73 79 6d 28 29 20   to the dlsym() 
23790 66 75 6e 63 74 69 6f 6e 2e 0a 20 20 2a 2a 20 28  function..  ** (
237a0 54 68 61 74 20 61 73 73 69 67 6e 6d 65 6e 74 20  That assignment 
237b0 72 65 71 75 69 72 65 73 20 61 20 63 61 73 74 2e  requires a cast.
237c0 29 20 20 54 68 65 6e 20 77 65 20 63 61 6c 6c 20  )  Then we call 
237d0 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 74 68 61  the function tha
237e0 74 0a 20 20 2a 2a 20 78 20 70 6f 69 6e 74 73 20  t.  ** x points 
237f0 74 6f 2e 20 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20  to.  .  **.  ** 
23800 54 68 69 73 20 77 6f 72 6b 2d 61 72 6f 75 6e 64  This work-around
23810 20 69 73 20 75 6e 6c 69 6b 65 6c 79 20 74 6f 20   is unlikely to 
23820 77 6f 72 6b 20 63 6f 72 72 65 63 74 6c 79 20 6f  work correctly o
23830 6e 20 61 6e 79 20 73 79 73 74 65 6d 20 77 68 65  n any system whe
23840 72 65 0a 20 20 2a 2a 20 79 6f 75 20 72 65 61 6c  re.  ** you real
23850 6c 79 20 63 61 6e 6e 6f 74 20 63 61 73 74 20 61  ly cannot cast a
23860 20 66 75 6e 63 74 69 6f 6e 20 70 6f 69 6e 74 65   function pointe
23870 72 20 69 6e 74 6f 20 76 6f 69 64 2a 2e 20 20 42  r into void*.  B
23880 75 74 20 74 68 65 6e 2c 20 6f 6e 20 74 68 65 0a  ut then, on the.
23890 20 20 2a 2a 20 6f 74 68 65 72 20 68 61 6e 64 2c    ** other hand,
238a0 20 64 6c 73 79 6d 28 29 20 77 69 6c 6c 20 6e 6f   dlsym() will no
238b0 74 20 77 6f 72 6b 20 6f 6e 20 73 75 63 68 20 61  t work on such a
238c0 20 73 79 73 74 65 6d 20 65 69 74 68 65 72 2c 20   system either, 
238d0 73 6f 20 77 65 20 68 61 76 65 0a 20 20 2a 2a 20  so we have.  ** 
238e0 6e 6f 74 20 72 65 61 6c 6c 79 20 6c 6f 73 74 20  not really lost 
238f0 61 6e 79 74 68 69 6e 67 2e 0a 20 20 2a 2f 0a 20  anything..  */. 
23900 20 76 6f 69 64 20 28 2a 28 2a 78 29 28 76 6f 69   void (*(*x)(voi
23910 64 2a 2c 63 6f 6e 73 74 20 63 68 61 72 2a 29 29  d*,const char*))
23920 28 76 6f 69 64 29 3b 0a 20 20 55 4e 55 53 45 44  (void);.  UNUSED
23930 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f 74 55 73  _PARAMETER(NotUs
23940 65 64 29 3b 0a 20 20 78 20 3d 20 28 76 6f 69 64  ed);.  x = (void
23950 28 2a 28 2a 29 28 76 6f 69 64 2a 2c 63 6f 6e 73  (*(*)(void*,cons
23960 74 20 63 68 61 72 2a 29 29 28 76 6f 69 64 29 29  t char*))(void))
23970 64 6c 73 79 6d 3b 0a 20 20 72 65 74 75 72 6e 20  dlsym;.  return 
23980 28 2a 78 29 28 70 2c 20 7a 53 79 6d 29 3b 0a 7d  (*x)(p, zSym);.}
23990 0a 73 74 61 74 69 63 20 76 6f 69 64 20 75 6e 69  .static void uni
239a0 78 44 6c 43 6c 6f 73 65 28 73 71 6c 69 74 65 33  xDlClose(sqlite3
239b0 5f 76 66 73 20 2a 4e 6f 74 55 73 65 64 2c 20 76  _vfs *NotUsed, v
239c0 6f 69 64 20 2a 70 48 61 6e 64 6c 65 29 7b 0a 20  oid *pHandle){. 
239d0 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
239e0 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20 64 6c  R(NotUsed);.  dl
239f0 63 6c 6f 73 65 28 70 48 61 6e 64 6c 65 29 3b 0a  close(pHandle);.
23a00 7d 0a 23 65 6c 73 65 20 2f 2a 20 69 66 20 53 51  }.#else /* if SQ
23a10 4c 49 54 45 5f 4f 4d 49 54 5f 4c 4f 41 44 5f 45  LITE_OMIT_LOAD_E
23a20 58 54 45 4e 53 49 4f 4e 20 69 73 20 64 65 66 69  XTENSION is defi
23a30 6e 65 64 3a 20 2a 2f 0a 20 20 23 64 65 66 69 6e  ned: */.  #defin
23a40 65 20 75 6e 69 78 44 6c 4f 70 65 6e 20 20 30 0a  e unixDlOpen  0.
23a50 20 20 23 64 65 66 69 6e 65 20 75 6e 69 78 44 6c    #define unixDl
23a60 45 72 72 6f 72 20 30 0a 20 20 23 64 65 66 69 6e  Error 0.  #defin
23a70 65 20 75 6e 69 78 44 6c 53 79 6d 20 20 20 30 0a  e unixDlSym   0.
23a80 20 20 23 64 65 66 69 6e 65 20 75 6e 69 78 44 6c    #define unixDl
23a90 43 6c 6f 73 65 20 30 0a 23 65 6e 64 69 66 0a 0a  Close 0.#endif..
23aa0 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 6e 42 75 66  /*.** Write nBuf
23ab0 20 62 79 74 65 73 20 6f 66 20 72 61 6e 64 6f 6d   bytes of random
23ac0 20 64 61 74 61 20 74 6f 20 74 68 65 20 73 75 70   data to the sup
23ad0 70 6c 69 65 64 20 62 75 66 66 65 72 20 7a 42 75  plied buffer zBu
23ae0 66 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  f..*/.static int
23af0 20 75 6e 69 78 52 61 6e 64 6f 6d 6e 65 73 73 28   unixRandomness(
23b00 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 4e 6f 74  sqlite3_vfs *Not
23b10 55 73 65 64 2c 20 69 6e 74 20 6e 42 75 66 2c 20  Used, int nBuf, 
23b20 63 68 61 72 20 2a 7a 42 75 66 29 7b 0a 20 20 55  char *zBuf){.  U
23b30 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
23b40 4e 6f 74 55 73 65 64 29 3b 0a 20 20 61 73 73 65  NotUsed);.  asse
23b50 72 74 28 28 73 69 7a 65 5f 74 29 6e 42 75 66 3e  rt((size_t)nBuf>
23b60 3d 28 73 69 7a 65 6f 66 28 74 69 6d 65 5f 74 29  =(sizeof(time_t)
23b70 2b 73 69 7a 65 6f 66 28 69 6e 74 29 29 29 3b 0a  +sizeof(int)));.
23b80 0a 20 20 2f 2a 20 57 65 20 68 61 76 65 20 74 6f  .  /* We have to
23b90 20 69 6e 69 74 69 61 6c 69 7a 65 20 7a 42 75 66   initialize zBuf
23ba0 20 74 6f 20 70 72 65 76 65 6e 74 20 76 61 6c 67   to prevent valg
23bb0 72 69 6e 64 20 66 72 6f 6d 20 72 65 70 6f 72 74  rind from report
23bc0 69 6e 67 0a 20 20 2a 2a 20 65 72 72 6f 72 73 2e  ing.  ** errors.
23bd0 20 20 54 68 65 20 72 65 70 6f 72 74 73 20 69 73    The reports is
23be0 73 75 65 64 20 62 79 20 76 61 6c 67 72 69 6e 64  sued by valgrind
23bf0 20 61 72 65 20 69 6e 63 6f 72 72 65 63 74 20 2d   are incorrect -
23c00 20 77 65 20 77 6f 75 6c 64 0a 20 20 2a 2a 20 70   we would.  ** p
23c10 72 65 66 65 72 20 74 68 61 74 20 74 68 65 20 72  refer that the r
23c20 61 6e 64 6f 6d 6e 65 73 73 20 62 65 20 69 6e 63  andomness be inc
23c30 72 65 61 73 65 64 20 62 79 20 6d 61 6b 69 6e 67  reased by making
23c40 20 75 73 65 20 6f 66 20 74 68 65 0a 20 20 2a 2a   use of the.  **
23c50 20 75 6e 69 6e 69 74 69 61 6c 69 7a 65 64 20 73   uninitialized s
23c60 70 61 63 65 20 69 6e 20 7a 42 75 66 20 2d 20 62  pace in zBuf - b
23c70 75 74 20 76 61 6c 67 72 69 6e 64 20 65 72 72 6f  ut valgrind erro
23c80 72 73 20 74 65 6e 64 20 74 6f 20 77 6f 72 72 79  rs tend to worry
23c90 0a 20 20 2a 2a 20 73 6f 6d 65 20 75 73 65 72 73  .  ** some users
23ca0 2e 20 20 52 61 74 68 65 72 20 74 68 61 6e 20 61  .  Rather than a
23cb0 72 67 75 65 2c 20 69 74 20 73 65 65 6d 73 20 65  rgue, it seems e
23cc0 61 73 69 65 72 20 6a 75 73 74 20 74 6f 20 69 6e  asier just to in
23cd0 69 74 69 61 6c 69 7a 65 0a 20 20 2a 2a 20 74 68  itialize.  ** th
23ce0 65 20 77 68 6f 6c 65 20 61 72 72 61 79 20 61 6e  e whole array an
23cf0 64 20 73 69 6c 65 6e 63 65 20 76 61 6c 67 72 69  d silence valgri
23d00 6e 64 2c 20 65 76 65 6e 20 69 66 20 74 68 61 74  nd, even if that
23d10 20 6d 65 61 6e 73 20 6c 65 73 73 20 72 61 6e 64   means less rand
23d20 6f 6d 6e 65 73 73 0a 20 20 2a 2a 20 69 6e 20 74  omness.  ** in t
23d30 68 65 20 72 61 6e 64 6f 6d 20 73 65 65 64 2e 0a  he random seed..
23d40 20 20 2a 2a 0a 20 20 2a 2a 20 57 68 65 6e 20 74    **.  ** When t
23d50 65 73 74 69 6e 67 2c 20 69 6e 69 74 69 61 6c 69  esting, initiali
23d60 7a 69 6e 67 20 7a 42 75 66 5b 5d 20 74 6f 20 7a  zing zBuf[] to z
23d70 65 72 6f 20 69 73 20 61 6c 6c 20 77 65 20 64 6f  ero is all we do
23d80 2e 20 20 54 68 61 74 20 6d 65 61 6e 73 0a 20 20  .  That means.  
23d90 2a 2a 20 74 68 61 74 20 77 65 20 61 6c 77 61 79  ** that we alway
23da0 73 20 75 73 65 20 74 68 65 20 73 61 6d 65 20 72  s use the same r
23db0 61 6e 64 6f 6d 20 6e 75 6d 62 65 72 20 73 65 71  andom number seq
23dc0 75 65 6e 63 65 2e 20 20 54 68 69 73 20 6d 61 6b  uence.  This mak
23dd0 65 73 20 74 68 65 0a 20 20 2a 2a 20 74 65 73 74  es the.  ** test
23de0 73 20 72 65 70 65 61 74 61 62 6c 65 2e 0a 20 20  s repeatable..  
23df0 2a 2f 0a 20 20 6d 65 6d 73 65 74 28 7a 42 75 66  */.  memset(zBuf
23e00 2c 20 30 2c 20 6e 42 75 66 29 3b 0a 23 69 66 20  , 0, nBuf);.#if 
23e10 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
23e20 54 45 53 54 29 0a 20 20 7b 0a 20 20 20 20 69 6e  TEST).  {.    in
23e30 74 20 70 69 64 2c 20 66 64 3b 0a 20 20 20 20 66  t pid, fd;.    f
23e40 64 20 3d 20 6f 70 65 6e 28 22 2f 64 65 76 2f 75  d = open("/dev/u
23e50 72 61 6e 64 6f 6d 22 2c 20 4f 5f 52 44 4f 4e 4c  random", O_RDONL
23e60 59 29 3b 0a 20 20 20 20 69 66 28 20 66 64 3c 30  Y);.    if( fd<0
23e70 20 29 7b 0a 20 20 20 20 20 20 74 69 6d 65 5f 74   ){.      time_t
23e80 20 74 3b 0a 20 20 20 20 20 20 74 69 6d 65 28 26   t;.      time(&
23e90 74 29 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79  t);.      memcpy
23ea0 28 7a 42 75 66 2c 20 26 74 2c 20 73 69 7a 65 6f  (zBuf, &t, sizeo
23eb0 66 28 74 29 29 3b 0a 20 20 20 20 20 20 70 69 64  f(t));.      pid
23ec0 20 3d 20 67 65 74 70 69 64 28 29 3b 0a 20 20 20   = getpid();.   
23ed0 20 20 20 6d 65 6d 63 70 79 28 26 7a 42 75 66 5b     memcpy(&zBuf[
23ee0 73 69 7a 65 6f 66 28 74 29 5d 2c 20 26 70 69 64  sizeof(t)], &pid
23ef0 2c 20 73 69 7a 65 6f 66 28 70 69 64 29 29 3b 0a  , sizeof(pid));.
23f00 20 20 20 20 20 20 61 73 73 65 72 74 28 20 73 69        assert( si
23f10 7a 65 6f 66 28 74 29 2b 73 69 7a 65 6f 66 28 70  zeof(t)+sizeof(p
23f20 69 64 29 3c 3d 28 73 69 7a 65 5f 74 29 6e 42 75  id)<=(size_t)nBu
23f30 66 20 29 3b 0a 20 20 20 20 20 20 6e 42 75 66 20  f );.      nBuf 
23f40 3d 20 73 69 7a 65 6f 66 28 74 29 20 2b 20 73 69  = sizeof(t) + si
23f50 7a 65 6f 66 28 70 69 64 29 3b 0a 20 20 20 20 7d  zeof(pid);.    }
23f60 65 6c 73 65 7b 0a 20 20 20 20 20 20 6e 42 75 66  else{.      nBuf
23f70 20 3d 20 72 65 61 64 28 66 64 2c 20 7a 42 75 66   = read(fd, zBuf
23f80 2c 20 6e 42 75 66 29 3b 0a 20 20 20 20 20 20 63  , nBuf);.      c
23f90 6c 6f 73 65 28 66 64 29 3b 0a 20 20 20 20 7d 0a  lose(fd);.    }.
23fa0 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 72 65 74    }.#endif.  ret
23fb0 75 72 6e 20 6e 42 75 66 3b 0a 7d 0a 0a 0a 2f 2a  urn nBuf;.}.../*
23fc0 0a 2a 2a 20 53 6c 65 65 70 20 66 6f 72 20 61 20  .** Sleep for a 
23fd0 6c 69 74 74 6c 65 20 77 68 69 6c 65 2e 20 20 52  little while.  R
23fe0 65 74 75 72 6e 20 74 68 65 20 61 6d 6f 75 6e 74  eturn the amount
23ff0 20 6f 66 20 74 69 6d 65 20 73 6c 65 70 74 2e 0a   of time slept..
24000 2a 2a 20 54 68 65 20 61 72 67 75 6d 65 6e 74 20  ** The argument 
24010 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  is the number of
24020 20 6d 69 63 72 6f 73 65 63 6f 6e 64 73 20 77 65   microseconds we
24030 20 77 61 6e 74 20 74 6f 20 73 6c 65 65 70 2e 0a   want to sleep..
24040 2a 2a 20 54 68 65 20 72 65 74 75 72 6e 20 76 61  ** The return va
24050 6c 75 65 20 69 73 20 74 68 65 20 6e 75 6d 62 65  lue is the numbe
24060 72 20 6f 66 20 6d 69 63 72 6f 73 65 63 6f 6e 64  r of microsecond
24070 73 20 6f 66 20 73 6c 65 65 70 20 61 63 74 75 61  s of sleep actua
24080 6c 6c 79 0a 2a 2a 20 72 65 71 75 65 73 74 65 64  lly.** requested
24090 20 66 72 6f 6d 20 74 68 65 20 75 6e 64 65 72 6c   from the underl
240a0 79 69 6e 67 20 6f 70 65 72 61 74 69 6e 67 20 73  ying operating s
240b0 79 73 74 65 6d 2c 20 61 20 6e 75 6d 62 65 72 20  ystem, a number 
240c0 77 68 69 63 68 0a 2a 2a 20 6d 69 67 68 74 20 62  which.** might b
240d0 65 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 6f  e greater than o
240e0 72 20 65 71 75 61 6c 20 74 6f 20 74 68 65 20 61  r equal to the a
240f0 72 67 75 6d 65 6e 74 2c 20 62 75 74 20 6e 6f 74  rgument, but not
24100 20 6c 65 73 73 0a 2a 2a 20 74 68 61 6e 20 74 68   less.** than th
24110 65 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 73  e argument..*/.s
24120 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 53 6c  tatic int unixSl
24130 65 65 70 28 73 71 6c 69 74 65 33 5f 76 66 73 20  eep(sqlite3_vfs 
24140 2a 4e 6f 74 55 73 65 64 2c 20 69 6e 74 20 6d 69  *NotUsed, int mi
24150 63 72 6f 73 65 63 6f 6e 64 73 29 7b 0a 23 69 66  croseconds){.#if
24160 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20 73 74   OS_VXWORKS.  st
24170 72 75 63 74 20 74 69 6d 65 73 70 65 63 20 73 70  ruct timespec sp
24180 3b 0a 0a 20 20 73 70 2e 74 76 5f 73 65 63 20 3d  ;..  sp.tv_sec =
24190 20 6d 69 63 72 6f 73 65 63 6f 6e 64 73 20 2f 20   microseconds / 
241a0 31 30 30 30 30 30 30 3b 0a 20 20 73 70 2e 74 76  1000000;.  sp.tv
241b0 5f 6e 73 65 63 20 3d 20 28 6d 69 63 72 6f 73 65  _nsec = (microse
241c0 63 6f 6e 64 73 20 25 20 31 30 30 30 30 30 30 29  conds % 1000000)
241d0 20 2a 20 31 30 30 30 3b 0a 20 20 6e 61 6e 6f 73   * 1000;.  nanos
241e0 6c 65 65 70 28 26 73 70 2c 20 4e 55 4c 4c 29 3b  leep(&sp, NULL);
241f0 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
24200 54 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20  TER(NotUsed);.  
24210 72 65 74 75 72 6e 20 6d 69 63 72 6f 73 65 63 6f  return microseco
24220 6e 64 73 3b 0a 23 65 6c 69 66 20 64 65 66 69 6e  nds;.#elif defin
24230 65 64 28 48 41 56 45 5f 55 53 4c 45 45 50 29 20  ed(HAVE_USLEEP) 
24240 26 26 20 48 41 56 45 5f 55 53 4c 45 45 50 0a 20  && HAVE_USLEEP. 
24250 20 75 73 6c 65 65 70 28 6d 69 63 72 6f 73 65 63   usleep(microsec
24260 6f 6e 64 73 29 3b 0a 20 20 55 4e 55 53 45 44 5f  onds);.  UNUSED_
24270 50 41 52 41 4d 45 54 45 52 28 4e 6f 74 55 73 65  PARAMETER(NotUse
24280 64 29 3b 0a 20 20 72 65 74 75 72 6e 20 6d 69 63  d);.  return mic
24290 72 6f 73 65 63 6f 6e 64 73 3b 0a 23 65 6c 73 65  roseconds;.#else
242a0 0a 20 20 69 6e 74 20 73 65 63 6f 6e 64 73 20 3d  .  int seconds =
242b0 20 28 6d 69 63 72 6f 73 65 63 6f 6e 64 73 2b 39   (microseconds+9
242c0 39 39 39 39 39 29 2f 31 30 30 30 30 30 30 3b 0a  99999)/1000000;.
242d0 20 20 73 6c 65 65 70 28 73 65 63 6f 6e 64 73 29    sleep(seconds)
242e0 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  ;.  UNUSED_PARAM
242f0 45 54 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20  ETER(NotUsed);. 
24300 20 72 65 74 75 72 6e 20 73 65 63 6f 6e 64 73 2a   return seconds*
24310 31 30 30 30 30 30 30 3b 0a 23 65 6e 64 69 66 0a  1000000;.#endif.
24320 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c  }../*.** The fol
24330 6c 6f 77 69 6e 67 20 76 61 72 69 61 62 6c 65 2c  lowing variable,
24340 20 69 66 20 73 65 74 20 74 6f 20 61 20 6e 6f 6e   if set to a non
24350 2d 7a 65 72 6f 20 76 61 6c 75 65 2c 20 69 73 20  -zero value, is 
24360 69 6e 74 65 72 70 72 65 74 65 64 20 61 73 0a 2a  interpreted as.*
24370 2a 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  * the number of 
24380 73 65 63 6f 6e 64 73 20 73 69 6e 63 65 20 31 39  seconds since 19
24390 37 30 20 61 6e 64 20 69 73 20 75 73 65 64 20 74  70 and is used t
243a0 6f 20 73 65 74 20 74 68 65 20 72 65 73 75 6c 74  o set the result
243b0 20 6f 66 0a 2a 2a 20 73 71 6c 69 74 65 33 4f 73   of.** sqlite3Os
243c0 43 75 72 72 65 6e 74 54 69 6d 65 28 29 20 64 75  CurrentTime() du
243d0 72 69 6e 67 20 74 65 73 74 69 6e 67 2e 0a 2a 2f  ring testing..*/
243e0 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54  .#ifdef SQLITE_T
243f0 45 53 54 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f  EST.int sqlite3_
24400 63 75 72 72 65 6e 74 5f 74 69 6d 65 20 3d 20 30  current_time = 0
24410 3b 20 20 2f 2a 20 46 61 6b 65 20 73 79 73 74 65  ;  /* Fake syste
24420 6d 20 74 69 6d 65 20 69 6e 20 73 65 63 6f 6e 64  m time in second
24430 73 20 73 69 6e 63 65 20 31 39 37 30 2e 20 2a 2f  s since 1970. */
24440 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 46  .#endif../*.** F
24450 69 6e 64 20 74 68 65 20 63 75 72 72 65 6e 74 20  ind the current 
24460 74 69 6d 65 20 28 69 6e 20 55 6e 69 76 65 72 73  time (in Univers
24470 61 6c 20 43 6f 6f 72 64 69 6e 61 74 65 64 20 54  al Coordinated T
24480 69 6d 65 29 2e 20 20 57 72 69 74 65 20 74 68 65  ime).  Write the
24490 0a 2a 2a 20 63 75 72 72 65 6e 74 20 74 69 6d 65  .** current time
244a0 20 61 6e 64 20 64 61 74 65 20 61 73 20 61 20 4a   and date as a J
244b0 75 6c 69 61 6e 20 44 61 79 20 6e 75 6d 62 65 72  ulian Day number
244c0 20 69 6e 74 6f 20 2a 70 72 4e 6f 77 20 61 6e 64   into *prNow and
244d0 0a 2a 2a 20 72 65 74 75 72 6e 20 30 2e 20 20 52  .** return 0.  R
244e0 65 74 75 72 6e 20 31 20 69 66 20 74 68 65 20 74  eturn 1 if the t
244f0 69 6d 65 20 61 6e 64 20 64 61 74 65 20 63 61 6e  ime and date can
24500 6e 6f 74 20 62 65 20 66 6f 75 6e 64 2e 0a 2a 2f  not be found..*/
24510 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78  .static int unix
24520 43 75 72 72 65 6e 74 54 69 6d 65 28 73 71 6c 69  CurrentTime(sqli
24530 74 65 33 5f 76 66 73 20 2a 4e 6f 74 55 73 65 64  te3_vfs *NotUsed
24540 2c 20 64 6f 75 62 6c 65 20 2a 70 72 4e 6f 77 29  , double *prNow)
24550 7b 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51  {.#if defined(SQ
24560 4c 49 54 45 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49  LITE_OMIT_FLOATI
24570 4e 47 5f 50 4f 49 4e 54 29 0a 20 20 74 69 6d 65  NG_POINT).  time
24580 5f 74 20 74 3b 0a 20 20 74 69 6d 65 28 26 74 29  _t t;.  time(&t)
24590 3b 0a 20 20 2a 70 72 4e 6f 77 20 3d 20 28 28 28  ;.  *prNow = (((
245a0 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 74 29  sqlite3_int64)t)
245b0 2f 38 36 34 30 20 2b 20 32 34 34 30 35 38 37 35  /8640 + 24405875
245c0 29 2f 31 30 3b 0a 23 65 6c 69 66 20 64 65 66 69  )/10;.#elif defi
245d0 6e 65 64 28 4e 4f 5f 47 45 54 54 4f 44 29 0a 20  ned(NO_GETTOD). 
245e0 20 74 69 6d 65 5f 74 20 74 3b 0a 20 20 74 69 6d   time_t t;.  tim
245f0 65 28 26 74 29 3b 0a 20 20 2a 70 72 4e 6f 77 20  e(&t);.  *prNow 
24600 3d 20 74 2f 38 36 34 30 30 2e 30 20 2b 20 32 34  = t/86400.0 + 24
24610 34 30 35 38 37 2e 35 3b 0a 23 65 6c 69 66 20 4f  40587.5;.#elif O
24620 53 5f 56 58 57 4f 52 4b 53 0a 20 20 73 74 72 75  S_VXWORKS.  stru
24630 63 74 20 74 69 6d 65 73 70 65 63 20 73 4e 6f 77  ct timespec sNow
24640 3b 0a 20 20 63 6c 6f 63 6b 5f 67 65 74 74 69 6d  ;.  clock_gettim
24650 65 28 43 4c 4f 43 4b 5f 52 45 41 4c 54 49 4d 45  e(CLOCK_REALTIME
24660 2c 20 26 73 4e 6f 77 29 3b 0a 20 20 2a 70 72 4e  , &sNow);.  *prN
24670 6f 77 20 3d 20 32 34 34 30 35 38 37 2e 35 20 2b  ow = 2440587.5 +
24680 20 73 4e 6f 77 2e 74 76 5f 73 65 63 2f 38 36 34   sNow.tv_sec/864
24690 30 30 2e 30 20 2b 20 73 4e 6f 77 2e 74 76 5f 6e  00.0 + sNow.tv_n
246a0 73 65 63 2f 38 36 34 30 30 30 30 30 30 30 30 30  sec/864000000000
246b0 30 30 2e 30 3b 0a 23 65 6c 73 65 0a 20 20 73 74  00.0;.#else.  st
246c0 72 75 63 74 20 74 69 6d 65 76 61 6c 20 73 4e 6f  ruct timeval sNo
246d0 77 3b 0a 20 20 67 65 74 74 69 6d 65 6f 66 64 61  w;.  gettimeofda
246e0 79 28 26 73 4e 6f 77 2c 20 30 29 3b 0a 20 20 2a  y(&sNow, 0);.  *
246f0 70 72 4e 6f 77 20 3d 20 32 34 34 30 35 38 37 2e  prNow = 2440587.
24700 35 20 2b 20 73 4e 6f 77 2e 74 76 5f 73 65 63 2f  5 + sNow.tv_sec/
24710 38 36 34 30 30 2e 30 20 2b 20 73 4e 6f 77 2e 74  86400.0 + sNow.t
24720 76 5f 75 73 65 63 2f 38 36 34 30 30 30 30 30 30  v_usec/864000000
24730 30 30 2e 30 3b 0a 23 65 6e 64 69 66 0a 0a 23 69  00.0;.#endif..#i
24740 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54  fdef SQLITE_TEST
24750 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 63  .  if( sqlite3_c
24760 75 72 72 65 6e 74 5f 74 69 6d 65 20 29 7b 0a 20  urrent_time ){. 
24770 20 20 20 2a 70 72 4e 6f 77 20 3d 20 73 71 6c 69     *prNow = sqli
24780 74 65 33 5f 63 75 72 72 65 6e 74 5f 74 69 6d 65  te3_current_time
24790 2f 38 36 34 30 30 2e 30 20 2b 20 32 34 34 30 35  /86400.0 + 24405
247a0 38 37 2e 35 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  87.5;.  }.#endif
247b0 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
247c0 54 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20  TER(NotUsed);.  
247d0 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a  return 0;.}../*.
247e0 2a 2a 20 57 65 20 61 64 64 65 64 20 74 68 65 20  ** We added the 
247f0 78 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 20  xGetLastError() 
24800 6d 65 74 68 6f 64 20 77 69 74 68 20 74 68 65 20  method with the 
24810 69 6e 74 65 6e 74 69 6f 6e 20 6f 66 20 70 72 6f  intention of pro
24820 76 69 64 69 6e 67 0a 2a 2a 20 62 65 74 74 65 72  viding.** better
24830 20 6c 6f 77 2d 6c 65 76 65 6c 20 65 72 72 6f 72   low-level error
24840 20 6d 65 73 73 61 67 65 73 20 77 68 65 6e 20 6f   messages when o
24850 70 65 72 61 74 69 6e 67 2d 73 79 73 74 65 6d 20  perating-system 
24860 70 72 6f 62 6c 65 6d 73 20 63 6f 6d 65 20 75 70  problems come up
24870 0a 2a 2a 20 64 75 72 69 6e 67 20 53 51 4c 69 74  .** during SQLit
24880 65 20 6f 70 65 72 61 74 69 6f 6e 2e 20 20 42 75  e operation.  Bu
24890 74 20 73 6f 20 66 61 72 2c 20 6e 6f 6e 65 20 6f  t so far, none o
248a0 66 20 74 68 61 74 20 68 61 73 20 62 65 65 6e 20  f that has been 
248b0 69 6d 70 6c 65 6d 65 6e 74 65 64 0a 2a 2a 20 69  implemented.** i
248c0 6e 20 74 68 65 20 63 6f 72 65 2e 20 20 53 6f 20  n the core.  So 
248d0 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
248e0 6e 65 76 65 72 20 63 61 6c 6c 65 64 2e 20 20 46  never called.  F
248f0 6f 72 20 6e 6f 77 2c 20 69 74 20 69 73 20 6d 65  or now, it is me
24900 72 65 6c 79 0a 2a 2a 20 61 20 70 6c 61 63 65 2d  rely.** a place-
24910 68 6f 6c 64 65 72 2e 0a 2a 2f 0a 73 74 61 74 69  holder..*/.stati
24920 63 20 69 6e 74 20 75 6e 69 78 47 65 74 4c 61 73  c int unixGetLas
24930 74 45 72 72 6f 72 28 73 71 6c 69 74 65 33 5f 76  tError(sqlite3_v
24940 66 73 20 2a 4e 6f 74 55 73 65 64 2c 20 69 6e 74  fs *NotUsed, int
24950 20 4e 6f 74 55 73 65 64 32 2c 20 63 68 61 72 20   NotUsed2, char 
24960 2a 4e 6f 74 55 73 65 64 33 29 7b 0a 20 20 55 4e  *NotUsed3){.  UN
24970 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 4e  USED_PARAMETER(N
24980 6f 74 55 73 65 64 29 3b 0a 20 20 55 4e 55 53 45  otUsed);.  UNUSE
24990 44 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f 74 55  D_PARAMETER(NotU
249a0 73 65 64 32 29 3b 0a 20 20 55 4e 55 53 45 44 5f  sed2);.  UNUSED_
249b0 50 41 52 41 4d 45 54 45 52 28 4e 6f 74 55 73 65  PARAMETER(NotUse
249c0 64 33 29 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b  d3);.  return 0;
249d0 0a 7d 0a 0a 2f 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .}../*.*********
249e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20  *************** 
249f0 45 6e 64 20 6f 66 20 73 71 6c 69 74 65 33 5f 76  End of sqlite3_v
24a00 66 73 20 6d 65 74 68 6f 64 73 20 2a 2a 2a 2a 2a  fs methods *****
24a10 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
24a20 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ******.*********
24a30 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
24a40 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
24a50 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
24a60 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
24a70 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a  *****/../*******
24a80 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
24a90 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
24aa0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
24ab0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
24ac0 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a  *******.********
24ad0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
24ae0 2a 2a 20 42 65 67 69 6e 20 50 72 6f 78 79 20 4c  ** Begin Proxy L
24af0 6f 63 6b 69 6e 67 20 2a 2a 2a 2a 2a 2a 2a 2a 2a  ocking *********
24b00 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
24b10 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 50 72  *******.**.** Pr
24b20 6f 78 79 20 6c 6f 63 6b 69 6e 67 20 69 73 20 61  oxy locking is a
24b30 20 22 75 62 65 72 2d 6c 6f 63 6b 69 6e 67 2d 6d   "uber-locking-m
24b40 65 74 68 6f 64 22 20 69 6e 20 74 68 69 73 20 73  ethod" in this s
24b50 65 6e 73 65 3a 20 20 49 74 20 75 73 65 73 20 74  ense:  It uses t
24b60 68 65 0a 2a 2a 20 6f 74 68 65 72 20 6c 6f 63 6b  he.** other lock
24b70 69 6e 67 20 6d 65 74 68 6f 64 73 20 6f 6e 20 73  ing methods on s
24b80 65 63 6f 6e 64 61 72 79 20 6c 6f 63 6b 20 66 69  econdary lock fi
24b90 6c 65 73 2e 20 20 50 72 6f 78 79 20 6c 6f 63 6b  les.  Proxy lock
24ba0 69 6e 67 20 69 73 20 61 0a 2a 2a 20 6d 65 74 61  ing is a.** meta
24bb0 2d 6c 61 79 65 72 20 6f 76 65 72 20 74 6f 70 20  -layer over top 
24bc0 6f 66 20 74 68 65 20 70 72 69 6d 69 74 69 76 65  of the primitive
24bd0 20 6c 6f 63 6b 69 6e 67 20 69 6d 70 6c 65 6d 65   locking impleme
24be0 6e 74 65 64 20 61 62 6f 76 65 2e 20 20 46 6f 72  nted above.  For
24bf0 0a 2a 2a 20 74 68 69 73 20 72 65 61 73 6f 6e 2c  .** this reason,
24c00 20 74 68 65 20 64 69 76 69 73 69 6f 6e 20 74 68   the division th
24c10 61 74 20 69 6d 70 6c 65 6d 65 6e 74 73 20 6f 66  at implements of
24c20 20 70 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 20 69   proxy locking i
24c30 73 20 64 65 66 65 72 72 65 64 0a 2a 2a 20 75 6e  s deferred.** un
24c40 74 69 6c 20 6c 61 74 65 20 69 6e 20 74 68 65 20  til late in the 
24c50 66 69 6c 65 20 28 68 65 72 65 29 20 61 66 74 65  file (here) afte
24c60 72 20 61 6c 6c 20 6f 66 20 74 68 65 20 6f 74 68  r all of the oth
24c70 65 72 20 49 2f 4f 20 6d 65 74 68 6f 64 73 20 68  er I/O methods h
24c80 61 76 65 0a 2a 2a 20 62 65 65 6e 20 64 65 66 69  ave.** been defi
24c90 6e 65 64 20 2d 20 73 6f 20 74 68 61 74 20 74 68  ned - so that th
24ca0 65 20 70 72 69 6d 69 74 69 76 65 20 6c 6f 63 6b  e primitive lock
24cb0 69 6e 67 20 6d 65 74 68 6f 64 73 20 61 72 65 20  ing methods are 
24cc0 61 76 61 69 6c 61 62 6c 65 0a 2a 2a 20 61 73 20  available.** as 
24cd0 73 65 72 76 69 63 65 73 20 74 6f 20 68 65 6c 70  services to help
24ce0 20 77 69 74 68 20 74 68 65 20 69 6d 70 6c 65 6d   with the implem
24cf0 65 6e 74 61 74 69 6f 6e 20 6f 66 20 70 72 6f 78  entation of prox
24d00 79 20 6c 6f 63 6b 69 6e 67 2e 0a 2a 2a 0a 2a 2a  y locking..**.**
24d10 2a 2a 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64 65 66  **.**.** The def
24d20 61 75 6c 74 20 6c 6f 63 6b 69 6e 67 20 73 63 68  ault locking sch
24d30 65 6d 65 73 20 69 6e 20 53 51 4c 69 74 65 20 75  emes in SQLite u
24d40 73 65 20 62 79 74 65 2d 72 61 6e 67 65 20 6c 6f  se byte-range lo
24d50 63 6b 73 20 6f 6e 20 74 68 65 0a 2a 2a 20 64 61  cks on the.** da
24d60 74 61 62 61 73 65 20 66 69 6c 65 20 74 6f 20 63  tabase file to c
24d70 6f 6f 72 64 69 6e 61 74 65 20 73 61 66 65 2c 20  oordinate safe, 
24d80 63 6f 6e 63 75 72 72 65 6e 74 20 61 63 63 65 73  concurrent acces
24d90 73 20 62 79 20 6d 75 6c 74 69 70 6c 65 20 72 65  s by multiple re
24da0 61 64 65 72 73 0a 2a 2a 20 61 6e 64 20 77 72 69  aders.** and wri
24db0 74 65 72 73 20 5b 68 74 74 70 3a 2f 2f 73 71 6c  ters [http://sql
24dc0 69 74 65 2e 6f 72 67 2f 6c 6f 63 6b 69 6e 67 76  ite.org/lockingv
24dd0 33 2e 68 74 6d 6c 5d 2e 20 20 54 68 65 20 66 69  3.html].  The fi
24de0 76 65 20 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 0a  ve file locking.
24df0 2a 2a 20 73 74 61 74 65 73 20 28 55 4e 4c 4f 43  ** states (UNLOC
24e00 4b 45 44 2c 20 50 45 4e 44 49 4e 47 2c 20 53 48  KED, PENDING, SH
24e10 41 52 45 44 2c 20 52 45 53 45 52 56 45 44 2c 20  ARED, RESERVED, 
24e20 45 58 43 4c 55 53 49 56 45 29 20 61 72 65 20 69  EXCLUSIVE) are i
24e30 6d 70 6c 65 6d 65 6e 74 65 64 0a 2a 2a 20 61 73  mplemented.** as
24e40 20 50 4f 53 49 58 20 72 65 61 64 20 26 20 77 72   POSIX read & wr
24e50 69 74 65 20 6c 6f 63 6b 73 20 6f 76 65 72 20 66  ite locks over f
24e60 69 78 65 64 20 73 65 74 20 6f 66 20 6c 6f 63 61  ixed set of loca
24e70 74 69 6f 6e 73 20 28 76 69 61 20 66 73 63 74 6c  tions (via fsctl
24e80 29 2c 0a 2a 2a 20 6f 6e 20 41 46 50 20 61 6e 64  ),.** on AFP and
24e90 20 53 4d 42 20 6f 6e 6c 79 20 65 78 63 6c 75 73   SMB only exclus
24ea0 69 76 65 20 62 79 74 65 2d 72 61 6e 67 65 20 6c  ive byte-range l
24eb0 6f 63 6b 73 20 61 72 65 20 61 76 61 69 6c 61 62  ocks are availab
24ec0 6c 65 20 76 69 61 20 66 73 63 74 6c 0a 2a 2a 20  le via fsctl.** 
24ed0 77 69 74 68 20 5f 49 4f 57 52 28 27 7a 27 2c 20  with _IOWR('z', 
24ee0 32 33 2c 20 73 74 72 75 63 74 20 42 79 74 65 52  23, struct ByteR
24ef0 61 6e 67 65 4c 6f 63 6b 50 42 32 29 20 74 6f 20  angeLockPB2) to 
24f00 74 72 61 63 6b 20 74 68 65 20 73 61 6d 65 20 35  track the same 5
24f10 20 73 74 61 74 65 73 2e 0a 2a 2a 20 54 6f 20 73   states..** To s
24f20 69 6d 75 6c 61 74 65 20 61 20 46 5f 52 44 4c 43  imulate a F_RDLC
24f30 4b 20 6f 6e 20 74 68 65 20 73 68 61 72 65 64 20  K on the shared 
24f40 72 61 6e 67 65 2c 20 6f 6e 20 41 46 50 20 61 20  range, on AFP a 
24f50 72 61 6e 64 6f 6d 6c 79 20 73 65 6c 65 63 74 65  randomly selecte
24f60 64 0a 2a 2a 20 61 64 64 72 65 73 73 20 69 6e 20  d.** address in 
24f70 74 68 65 20 73 68 61 72 65 64 20 72 61 6e 67 65  the shared range
24f80 20 69 73 20 74 61 6b 65 6e 20 66 6f 72 20 61 20   is taken for a 
24f90 53 48 41 52 45 44 20 6c 6f 63 6b 2c 20 74 68 65  SHARED lock, the
24fa0 20 65 6e 74 69 72 65 0a 2a 2a 20 73 68 61 72 65   entire.** share
24fb0 64 20 72 61 6e 67 65 20 69 73 20 74 61 6b 65 6e  d range is taken
24fc0 20 66 6f 72 20 61 6e 20 45 58 43 4c 55 53 49 56   for an EXCLUSIV
24fd0 45 20 6c 6f 63 6b 29 3a 0a 2a 2a 0a 2a 2a 20 20  E lock):.**.**  
24fe0 20 20 20 20 50 45 4e 44 49 4e 47 5f 42 59 54 45      PENDING_BYTE
24ff0 20 20 20 20 20 20 20 20 30 78 34 30 30 30 30 30          0x400000
25000 30 30 09 09 20 20 20 09 0a 2a 2a 20 20 20 20 20  00..   ..**     
25010 20 52 45 53 45 52 56 45 44 5f 42 59 54 45 20 20   RESERVED_BYTE  
25020 20 20 20 20 20 30 78 34 30 30 30 30 30 30 31 0a       0x40000001.
25030 2a 2a 20 20 20 20 20 20 53 48 41 52 45 44 5f 52  **      SHARED_R
25040 41 4e 47 45 20 20 20 20 20 20 20 20 30 78 34 30  ANGE        0x40
25050 30 30 30 30 30 32 20 2d 3e 20 30 78 34 30 30 30  000002 -> 0x4000
25060 30 32 30 30 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  0200.**.** This 
25070 77 6f 72 6b 73 20 77 65 6c 6c 20 6f 6e 20 74 68  works well on th
25080 65 20 6c 6f 63 61 6c 20 66 69 6c 65 20 73 79 73  e local file sys
25090 74 65 6d 2c 20 62 75 74 20 73 68 6f 77 73 20 61  tem, but shows a
250a0 20 6e 65 61 72 6c 79 20 31 30 30 78 0a 2a 2a 20   nearly 100x.** 
250b0 73 6c 6f 77 64 6f 77 6e 20 69 6e 20 72 65 61 64  slowdown in read
250c0 20 70 65 72 66 6f 72 6d 61 6e 63 65 20 6f 6e 20   performance on 
250d0 41 46 50 20 62 65 63 61 75 73 65 20 74 68 65 20  AFP because the 
250e0 41 46 50 20 63 6c 69 65 6e 74 20 64 69 73 61 62  AFP client disab
250f0 6c 65 73 0a 2a 2a 20 74 68 65 20 72 65 61 64 20  les.** the read 
25100 63 61 63 68 65 20 77 68 65 6e 20 62 79 74 65 2d  cache when byte-
25110 72 61 6e 67 65 20 6c 6f 63 6b 73 20 61 72 65 20  range locks are 
25120 70 72 65 73 65 6e 74 2e 20 20 45 6e 61 62 6c 69  present.  Enabli
25130 6e 67 20 74 68 65 20 72 65 61 64 0a 2a 2a 20 63  ng the read.** c
25140 61 63 68 65 20 65 78 70 6f 73 65 73 20 61 20 63  ache exposes a c
25150 61 63 68 65 20 63 6f 68 65 72 65 6e 63 79 20 70  ache coherency p
25160 72 6f 62 6c 65 6d 20 74 68 61 74 20 69 73 20 70  roblem that is p
25170 72 65 73 65 6e 74 20 6f 6e 20 61 6c 6c 20 4f 53  resent on all OS
25180 20 58 0a 2a 2a 20 73 75 70 70 6f 72 74 65 64 20   X.** supported 
25190 6e 65 74 77 6f 72 6b 20 66 69 6c 65 20 73 79 73  network file sys
251a0 74 65 6d 73 2e 20 20 4e 46 53 20 61 6e 64 20 41  tems.  NFS and A
251b0 46 50 20 62 6f 74 68 20 6f 62 73 65 72 76 65 20  FP both observe 
251c0 74 68 65 0a 2a 2a 20 63 6c 6f 73 65 2d 74 6f 2d  the.** close-to-
251d0 6f 70 65 6e 20 73 65 6d 61 6e 74 69 63 73 20 66  open semantics f
251e0 6f 72 20 65 6e 73 75 72 69 6e 67 20 63 61 63 68  or ensuring cach
251f0 65 20 63 6f 68 65 72 65 6e 63 79 0a 2a 2a 20 5b  e coherency.** [
25200 68 74 74 70 3a 2f 2f 6e 66 73 2e 73 6f 75 72 63  http://nfs.sourc
25210 65 66 6f 72 67 65 2e 6e 65 74 2f 23 66 61 71 5f  eforge.net/#faq_
25220 61 38 5d 2c 20 77 68 69 63 68 20 64 6f 65 73 20  a8], which does 
25230 6e 6f 74 20 65 66 66 65 63 74 69 76 65 6c 79 0a  not effectively.
25240 2a 2a 20 61 64 64 72 65 73 73 20 74 68 65 20 72  ** address the r
25250 65 71 75 69 72 65 6d 65 6e 74 73 20 66 6f 72 20  equirements for 
25260 63 6f 6e 63 75 72 72 65 6e 74 20 64 61 74 61 62  concurrent datab
25270 61 73 65 20 61 63 63 65 73 73 20 62 79 20 6d 75  ase access by mu
25280 6c 74 69 70 6c 65 0a 2a 2a 20 72 65 61 64 65 72  ltiple.** reader
25290 73 20 61 6e 64 20 77 72 69 74 65 72 73 0a 2a 2a  s and writers.**
252a0 20 5b 68 74 74 70 3a 2f 2f 77 77 77 2e 6e 61 62   [http://www.nab
252b0 62 6c 65 2e 63 6f 6d 2f 53 51 4c 69 74 65 2d 6f  ble.com/SQLite-o
252c0 6e 2d 4e 46 53 2d 63 61 63 68 65 2d 63 6f 68 65  n-NFS-cache-cohe
252d0 72 65 6e 63 79 2d 74 64 31 35 36 35 35 37 30 31  rency-td15655701
252e0 2e 68 74 6d 6c 5d 2e 0a 2a 2a 0a 2a 2a 20 54 6f  .html]..**.** To
252f0 20 61 64 64 72 65 73 73 20 74 68 65 20 70 65 72   address the per
25300 66 6f 72 6d 61 6e 63 65 20 61 6e 64 20 63 61 63  formance and cac
25310 68 65 20 63 6f 68 65 72 65 6e 63 79 20 69 73 73  he coherency iss
25320 75 65 73 2c 20 70 72 6f 78 79 20 66 69 6c 65 20  ues, proxy file 
25330 6c 6f 63 6b 69 6e 67 0a 2a 2a 20 63 68 61 6e 67  locking.** chang
25340 65 73 20 74 68 65 20 77 61 79 20 64 61 74 61 62  es the way datab
25350 61 73 65 20 61 63 63 65 73 73 20 69 73 20 63 6f  ase access is co
25360 6e 74 72 6f 6c 6c 65 64 20 62 79 20 6c 69 6d 69  ntrolled by limi
25370 74 69 6e 67 20 61 63 63 65 73 73 20 74 6f 20 61  ting access to a
25380 0a 2a 2a 20 73 69 6e 67 6c 65 20 68 6f 73 74 20  .** single host 
25390 61 74 20 61 20 74 69 6d 65 20 61 6e 64 20 6d 6f  at a time and mo
253a0 76 69 6e 67 20 66 69 6c 65 20 6c 6f 63 6b 73 20  ving file locks 
253b0 6f 66 66 20 6f 66 20 74 68 65 20 64 61 74 61 62  off of the datab
253c0 61 73 65 20 66 69 6c 65 0a 2a 2a 20 61 6e 64 20  ase file.** and 
253d0 6f 6e 74 6f 20 61 20 70 72 6f 78 79 20 66 69 6c  onto a proxy fil
253e0 65 20 6f 6e 20 74 68 65 20 6c 6f 63 61 6c 20 66  e on the local f
253f0 69 6c 65 20 73 79 73 74 65 6d 2e 20 20 0a 2a 2a  ile system.  .**
25400 0a 2a 2a 0a 2a 2a 20 55 73 69 6e 67 20 70 72 6f  .**.** Using pro
25410 78 79 20 6c 6f 63 6b 73 0a 2a 2a 20 2d 2d 2d 2d  xy locks.** ----
25420 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a  -------------.**
25430 0a 2a 2a 20 43 20 41 50 49 73 0a 2a 2a 0a 2a 2a  .** C APIs.**.**
25440 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 5f 63    sqlite3_file_c
25450 6f 6e 74 72 6f 6c 28 64 62 2c 20 64 62 6e 61 6d  ontrol(db, dbnam
25460 65 2c 20 53 51 4c 49 54 45 5f 53 45 54 5f 4c 4f  e, SQLITE_SET_LO
25470 43 4b 50 52 4f 58 59 46 49 4c 45 2c 0a 2a 2a 20  CKPROXYFILE,.** 
25480 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25490 20 20 20 20 20 20 3c 70 72 6f 78 79 5f 70 61 74        <proxy_pat
254a0 68 3e 20 7c 20 22 3a 61 75 74 6f 3a 22 29 3b 0a  h> | ":auto:");.
254b0 2a 2a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65  **  sqlite3_file
254c0 5f 63 6f 6e 74 72 6f 6c 28 64 62 2c 20 64 62 6e  _control(db, dbn
254d0 61 6d 65 2c 20 53 51 4c 49 54 45 5f 47 45 54 5f  ame, SQLITE_GET_
254e0 4c 4f 43 4b 50 52 4f 58 59 46 49 4c 45 2c 20 26  LOCKPROXYFILE, &
254f0 3c 70 72 6f 78 79 5f 70 61 74 68 3e 29 3b 0a 2a  <proxy_path>);.*
25500 2a 0a 2a 2a 0a 2a 2a 20 53 51 4c 20 70 72 61 67  *.**.** SQL prag
25510 6d 61 73 0a 2a 2a 0a 2a 2a 20 20 50 52 41 47 4d  mas.**.**  PRAGM
25520 41 20 5b 64 61 74 61 62 61 73 65 2e 5d 6c 6f 63  A [database.]loc
25530 6b 5f 70 72 6f 78 79 5f 66 69 6c 65 3d 3c 70 72  k_proxy_file=<pr
25540 6f 78 79 5f 70 61 74 68 3e 20 7c 20 3a 61 75 74  oxy_path> | :aut
25550 6f 3a 0a 2a 2a 20 20 50 52 41 47 4d 41 20 5b 64  o:.**  PRAGMA [d
25560 61 74 61 62 61 73 65 2e 5d 6c 6f 63 6b 5f 70 72  atabase.]lock_pr
25570 6f 78 79 5f 66 69 6c 65 0a 2a 2a 0a 2a 2a 20 53  oxy_file.**.** S
25580 70 65 63 69 66 79 69 6e 67 20 22 3a 61 75 74 6f  pecifying ":auto
25590 3a 22 20 6d 65 61 6e 73 20 74 68 61 74 20 69 66  :" means that if
255a0 20 74 68 65 72 65 20 69 73 20 61 20 63 6f 6e 63   there is a conc
255b0 68 20 66 69 6c 65 20 77 69 74 68 20 61 20 6d 61  h file with a ma
255c0 74 63 68 69 6e 67 0a 2a 2a 20 68 6f 73 74 20 49  tching.** host I
255d0 44 20 69 6e 20 69 74 2c 20 74 68 65 20 70 72 6f  D in it, the pro
255e0 78 79 20 70 61 74 68 20 69 6e 20 74 68 65 20 63  xy path in the c
255f0 6f 6e 63 68 20 66 69 6c 65 20 77 69 6c 6c 20 62  onch file will b
25600 65 20 75 73 65 64 2c 20 6f 74 68 65 72 77 69 73  e used, otherwis
25610 65 0a 2a 2a 20 61 20 70 72 6f 78 79 20 70 61 74  e.** a proxy pat
25620 68 20 62 61 73 65 64 20 6f 6e 20 74 68 65 20 75  h based on the u
25630 73 65 72 27 73 20 74 65 6d 70 20 64 69 72 0a 2a  ser's temp dir.*
25640 2a 20 28 76 69 61 20 63 6f 6e 66 73 74 72 28 5f  * (via confstr(_
25650 43 53 5f 44 41 52 57 49 4e 5f 55 53 45 52 5f 54  CS_DARWIN_USER_T
25660 45 4d 50 5f 44 49 52 2c 2e 2e 2e 29 29 20 77 69  EMP_DIR,...)) wi
25670 6c 6c 20 62 65 20 75 73 65 64 20 61 6e 64 20 74  ll be used and t
25680 68 65 0a 2a 2a 20 61 63 74 75 61 6c 20 70 72 6f  he.** actual pro
25690 78 79 20 66 69 6c 65 20 6e 61 6d 65 20 69 73 20  xy file name is 
256a0 67 65 6e 65 72 61 74 65 64 20 66 72 6f 6d 20 74  generated from t
256b0 68 65 20 6e 61 6d 65 20 61 6e 64 20 70 61 74 68  he name and path
256c0 20 6f 66 20 74 68 65 0a 2a 2a 20 64 61 74 61 62   of the.** datab
256d0 61 73 65 20 66 69 6c 65 2e 20 20 46 6f 72 20 65  ase file.  For e
256e0 78 61 6d 70 6c 65 3a 0a 2a 2a 0a 2a 2a 20 20 20  xample:.**.**   
256f0 20 20 20 20 46 6f 72 20 64 61 74 61 62 61 73 65      For database
25700 20 70 61 74 68 20 22 2f 55 73 65 72 73 2f 6d 65   path "/Users/me
25710 2f 66 6f 6f 2e 64 62 22 20 0a 2a 2a 20 20 20 20  /foo.db" .**    
25720 20 20 20 54 68 65 20 6c 6f 63 6b 20 70 61 74 68     The lock path
25730 20 77 69 6c 6c 20 62 65 20 22 3c 74 6d 70 64 69   will be "<tmpdi
25740 72 3e 2f 73 71 6c 69 74 65 70 6c 6f 63 6b 73 2f  r>/sqliteplocks/
25750 5f 55 73 65 72 73 5f 6d 65 5f 66 6f 6f 2e 64 62  _Users_me_foo.db
25760 3a 61 75 74 6f 3a 22 29 0a 2a 2a 0a 2a 2a 20 4f  :auto:").**.** O
25770 6e 63 65 20 61 20 6c 6f 63 6b 20 70 72 6f 78 79  nce a lock proxy
25780 20 69 73 20 63 6f 6e 66 69 67 75 72 65 64 20 66   is configured f
25790 6f 72 20 61 20 64 61 74 61 62 61 73 65 20 63 6f  or a database co
257a0 6e 6e 65 63 74 69 6f 6e 2c 20 69 74 20 63 61 6e  nnection, it can
257b0 20 6e 6f 74 0a 2a 2a 20 62 65 20 72 65 6d 6f 76   not.** be remov
257c0 65 64 2c 20 68 6f 77 65 76 65 72 20 69 74 20 6d  ed, however it m
257d0 61 79 20 62 65 20 73 77 69 74 63 68 65 64 20 74  ay be switched t
257e0 6f 20 61 20 64 69 66 66 65 72 65 6e 74 20 70 72  o a different pr
257f0 6f 78 79 20 70 61 74 68 20 76 69 61 0a 2a 2a 20  oxy path via.** 
25800 74 68 65 20 61 62 6f 76 65 20 41 50 49 73 20 28  the above APIs (
25810 61 73 73 75 6d 69 6e 67 20 74 68 65 20 63 6f 6e  assuming the con
25820 63 68 20 66 69 6c 65 20 69 73 20 6e 6f 74 20 62  ch file is not b
25830 65 69 6e 67 20 68 65 6c 64 20 62 79 20 61 6e 6f  eing held by ano
25840 74 68 65 72 0a 2a 2a 20 63 6f 6e 6e 65 63 74 69  ther.** connecti
25850 6f 6e 20 6f 72 20 70 72 6f 63 65 73 73 29 2e 20  on or process). 
25860 0a 2a 2a 0a 2a 2a 0a 2a 2a 20 48 6f 77 20 70 72  .**.**.** How pr
25870 6f 78 79 20 6c 6f 63 6b 69 6e 67 20 77 6f 72 6b  oxy locking work
25880 73 0a 2a 2a 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  s.** -----------
25890 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 0a  ------------.**.
258a0 2a 2a 20 50 72 6f 78 79 20 66 69 6c 65 20 6c 6f  ** Proxy file lo
258b0 63 6b 69 6e 67 20 72 65 6c 69 65 73 20 70 72 69  cking relies pri
258c0 6d 61 72 69 6c 79 20 6f 6e 20 74 77 6f 20 6e 65  marily on two ne
258d0 77 20 73 75 70 70 6f 72 74 69 6e 67 20 66 69 6c  w supporting fil
258e0 65 73 3a 20 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 20  es: .**.**   *  
258f0 63 6f 6e 63 68 20 66 69 6c 65 20 74 6f 20 6c 69  conch file to li
25900 6d 69 74 20 61 63 63 65 73 73 20 74 6f 20 74 68  mit access to th
25910 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
25920 74 6f 20 61 20 73 69 6e 67 6c 65 20 68 6f 73 74  to a single host
25930 0a 2a 2a 20 20 20 20 20 20 61 74 20 61 20 74 69  .**      at a ti
25940 6d 65 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 20 70 72  me.**.**   *  pr
25950 6f 78 79 20 66 69 6c 65 20 74 6f 20 61 63 74 20  oxy file to act 
25960 61 73 20 61 20 70 72 6f 78 79 20 66 6f 72 20 74  as a proxy for t
25970 68 65 20 61 64 76 69 73 6f 72 79 20 6c 6f 63 6b  he advisory lock
25980 73 20 6e 6f 72 6d 61 6c 6c 79 0a 2a 2a 20 20 20  s normally.**   
25990 20 20 20 74 61 6b 65 6e 20 6f 6e 20 74 68 65 20     taken on the 
259a0 64 61 74 61 62 61 73 65 0a 2a 2a 0a 2a 2a 20 54  database.**.** T
259b0 68 65 20 63 6f 6e 63 68 20 66 69 6c 65 20 2d 20  he conch file - 
259c0 74 6f 20 75 73 65 20 61 20 70 72 6f 78 79 20 66  to use a proxy f
259d0 69 6c 65 2c 20 73 71 6c 69 74 65 20 6d 75 73 74  ile, sqlite must
259e0 20 66 69 72 73 74 20 22 68 6f 6c 64 20 74 68 65   first "hold the
259f0 20 63 6f 6e 63 68 22 0a 2a 2a 20 62 79 20 74 61   conch".** by ta
25a00 6b 69 6e 67 20 61 6e 20 73 71 6c 69 74 65 2d 73  king an sqlite-s
25a10 74 79 6c 65 20 73 68 61 72 65 64 20 6c 6f 63 6b  tyle shared lock
25a20 20 6f 6e 20 74 68 65 20 63 6f 6e 63 68 20 66 69   on the conch fi
25a30 6c 65 2c 20 72 65 61 64 69 6e 67 20 74 68 65 0a  le, reading the.
25a40 2a 2a 20 63 6f 6e 74 65 6e 74 73 20 61 6e 64 20  ** contents and 
25a50 63 6f 6d 70 61 72 69 6e 67 20 74 68 65 20 68 6f  comparing the ho
25a60 73 74 27 73 20 75 6e 69 71 75 65 20 68 6f 73 74  st's unique host
25a70 20 49 44 20 28 73 65 65 20 62 65 6c 6f 77 29 20   ID (see below) 
25a80 61 6e 64 20 6c 6f 63 6b 0a 2a 2a 20 70 72 6f 78  and lock.** prox
25a90 79 20 70 61 74 68 20 61 67 61 69 6e 73 74 20 74  y path against t
25aa0 68 65 20 76 61 6c 75 65 73 20 73 74 6f 72 65 64  he values stored
25ab0 20 69 6e 20 74 68 65 20 63 6f 6e 63 68 2e 20 20   in the conch.  
25ac0 54 68 65 20 63 6f 6e 63 68 20 66 69 6c 65 20 69  The conch file i
25ad0 73 0a 2a 2a 20 73 74 6f 72 65 64 20 69 6e 20 74  s.** stored in t
25ae0 68 65 20 73 61 6d 65 20 64 69 72 65 63 74 6f 72  he same director
25af0 79 20 61 73 20 74 68 65 20 64 61 74 61 62 61 73  y as the databas
25b00 65 20 66 69 6c 65 20 61 6e 64 20 74 68 65 20 66  e file and the f
25b10 69 6c 65 20 6e 61 6d 65 0a 2a 2a 20 69 73 20 70  ile name.** is p
25b20 61 74 74 65 72 6e 65 64 20 61 66 74 65 72 20 74  atterned after t
25b30 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
25b40 20 6e 61 6d 65 20 61 73 20 22 2e 3c 64 61 74 61   name as ".<data
25b50 62 61 73 65 6e 61 6d 65 3e 2d 63 6f 6e 63 68 22  basename>-conch"
25b60 2e 0a 2a 2a 20 49 66 20 74 68 65 20 63 6f 6e 63  ..** If the conc
25b70 68 20 66 69 6c 65 20 64 6f 65 73 20 6e 6f 74 20  h file does not 
25b80 65 78 69 73 74 2c 20 6f 72 20 69 74 27 73 20 63  exist, or it's c
25b90 6f 6e 74 65 6e 74 73 20 64 6f 20 6e 6f 74 20 6d  ontents do not m
25ba0 61 74 63 68 20 74 68 65 0a 2a 2a 20 68 6f 73 74  atch the.** host
25bb0 20 49 44 20 61 6e 64 2f 6f 72 20 70 72 6f 78 79   ID and/or proxy
25bc0 20 70 61 74 68 2c 20 74 68 65 6e 20 74 68 65 20   path, then the 
25bd0 6c 6f 63 6b 20 69 73 20 65 73 63 61 6c 61 74 65  lock is escalate
25be0 64 20 74 6f 20 61 6e 20 65 78 63 6c 75 73 69 76  d to an exclusiv
25bf0 65 0a 2a 2a 20 6c 6f 63 6b 20 61 6e 64 20 74 68  e.** lock and th
25c00 65 20 63 6f 6e 63 68 20 66 69 6c 65 20 63 6f 6e  e conch file con
25c10 74 65 6e 74 73 20 69 73 20 75 70 64 61 74 65 64  tents is updated
25c20 20 77 69 74 68 20 74 68 65 20 68 6f 73 74 20 49   with the host I
25c30 44 20 61 6e 64 20 70 72 6f 78 79 0a 2a 2a 20 70  D and proxy.** p
25c40 61 74 68 20 61 6e 64 20 74 68 65 20 6c 6f 63 6b  ath and the lock
25c50 20 69 73 20 64 6f 77 6e 67 72 61 64 65 64 20 74   is downgraded t
25c60 6f 20 61 20 73 68 61 72 65 64 20 6c 6f 63 6b 20  o a shared lock 
25c70 61 67 61 69 6e 2e 20 20 49 66 20 74 68 65 20 63  again.  If the c
25c80 6f 6e 63 68 0a 2a 2a 20 69 73 20 68 65 6c 64 20  onch.** is held 
25c90 62 79 20 61 6e 6f 74 68 65 72 20 70 72 6f 63 65  by another proce
25ca0 73 73 20 28 77 69 74 68 20 61 20 73 68 61 72 65  ss (with a share
25cb0 64 20 6c 6f 63 6b 29 2c 20 74 68 65 20 65 78 63  d lock), the exc
25cc0 6c 75 73 69 76 65 20 6c 6f 63 6b 0a 2a 2a 20 77  lusive lock.** w
25cd0 69 6c 6c 20 66 61 69 6c 20 61 6e 64 20 53 51 4c  ill fail and SQL
25ce0 49 54 45 5f 42 55 53 59 20 69 73 20 72 65 74 75  ITE_BUSY is retu
25cf0 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  rned..**.** The 
25d00 70 72 6f 78 79 20 66 69 6c 65 20 2d 20 61 20 73  proxy file - a s
25d10 69 6e 67 6c 65 2d 62 79 74 65 20 66 69 6c 65 20  ingle-byte file 
25d20 75 73 65 64 20 66 6f 72 20 61 6c 6c 20 61 64 76  used for all adv
25d30 69 73 6f 72 79 20 66 69 6c 65 20 6c 6f 63 6b 73  isory file locks
25d40 0a 2a 2a 20 6e 6f 72 6d 61 6c 6c 79 20 74 61 6b  .** normally tak
25d50 65 6e 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  en on the databa
25d60 73 65 20 66 69 6c 65 2e 20 20 20 54 68 69 73 20  se file.   This 
25d70 61 6c 6c 6f 77 73 20 66 6f 72 20 73 61 66 65 20  allows for safe 
25d80 73 68 61 72 69 6e 67 0a 2a 2a 20 6f 66 20 74 68  sharing.** of th
25d90 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
25da0 66 6f 72 20 6d 75 6c 74 69 70 6c 65 20 72 65 61  for multiple rea
25db0 64 65 72 73 20 61 6e 64 20 77 72 69 74 65 72 73  ders and writers
25dc0 20 6f 6e 20 74 68 65 20 73 61 6d 65 0a 2a 2a 20   on the same.** 
25dd0 68 6f 73 74 20 28 74 68 65 20 63 6f 6e 63 68 20  host (the conch 
25de0 65 6e 73 75 72 65 73 20 74 68 61 74 20 74 68 65  ensures that the
25df0 79 20 61 6c 6c 20 75 73 65 20 74 68 65 20 73 61  y all use the sa
25e00 6d 65 20 6c 6f 63 61 6c 20 6c 6f 63 6b 20 66 69  me local lock fi
25e10 6c 65 29 2e 0a 2a 2a 0a 2a 2a 20 52 65 71 75 65  le)..**.** Reque
25e20 73 74 69 6e 67 20 74 68 65 20 6c 6f 63 6b 20 70  sting the lock p
25e30 72 6f 78 79 20 64 6f 65 73 20 6e 6f 74 20 69 6d  roxy does not im
25e40 6d 65 64 69 61 74 65 6c 79 20 74 61 6b 65 20 74  mediately take t
25e50 68 65 20 63 6f 6e 63 68 2c 20 69 74 20 69 73 0a  he conch, it is.
25e60 2a 2a 20 6f 6e 6c 79 20 74 61 6b 65 6e 20 77 68  ** only taken wh
25e70 65 6e 20 74 68 65 20 66 69 72 73 74 20 72 65 71  en the first req
25e80 75 65 73 74 20 74 6f 20 6c 6f 63 6b 20 64 61 74  uest to lock dat
25e90 61 62 61 73 65 20 66 69 6c 65 20 69 73 20 6d 61  abase file is ma
25ea0 64 65 2e 20 20 0a 2a 2a 20 54 68 69 73 20 6d 61  de.  .** This ma
25eb0 74 63 68 65 73 20 74 68 65 20 73 65 6d 61 6e 74  tches the semant
25ec0 69 63 73 20 6f 66 20 74 68 65 20 74 72 61 64 69  ics of the tradi
25ed0 74 69 6f 6e 61 6c 20 6c 6f 63 6b 69 6e 67 20 62  tional locking b
25ee0 65 68 61 76 69 6f 72 2c 20 77 68 65 72 65 0a 2a  ehavior, where.*
25ef0 2a 20 6f 70 65 6e 69 6e 67 20 61 20 63 6f 6e 6e  * opening a conn
25f00 65 63 74 69 6f 6e 20 74 6f 20 61 20 64 61 74 61  ection to a data
25f10 62 61 73 65 20 66 69 6c 65 20 64 6f 65 73 20 6e  base file does n
25f20 6f 74 20 74 61 6b 65 20 61 20 6c 6f 63 6b 20 6f  ot take a lock o
25f30 6e 20 69 74 2e 0a 2a 2a 20 54 68 65 20 73 68 61  n it..** The sha
25f40 72 65 64 20 6c 6f 63 6b 20 61 6e 64 20 61 6e 20  red lock and an 
25f50 6f 70 65 6e 20 66 69 6c 65 20 64 65 73 63 72 69  open file descri
25f60 70 74 6f 72 20 61 72 65 20 6d 61 69 6e 74 61 69  ptor are maintai
25f70 6e 65 64 20 75 6e 74 69 6c 20 0a 2a 2a 20 74 68  ned until .** th
25f80 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20  e connection to 
25f90 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20  the database is 
25fa0 63 6c 6f 73 65 64 2e 20 0a 2a 2a 0a 2a 2a 20 54  closed. .**.** T
25fb0 68 65 20 70 72 6f 78 79 20 66 69 6c 65 20 61 6e  he proxy file an
25fc0 64 20 74 68 65 20 6c 6f 63 6b 20 66 69 6c 65 20  d the lock file 
25fd0 61 72 65 20 6e 65 76 65 72 20 64 65 6c 65 74 65  are never delete
25fe0 64 20 73 6f 20 74 68 65 79 20 6f 6e 6c 79 20 6e  d so they only n
25ff0 65 65 64 0a 2a 2a 20 74 6f 20 62 65 20 63 72 65  eed.** to be cre
26000 61 74 65 64 20 74 68 65 20 66 69 72 73 74 20 74  ated the first t
26010 69 6d 65 20 74 68 65 79 20 61 72 65 20 75 73 65  ime they are use
26020 64 2e 0a 2a 2a 0a 2a 2a 20 43 6f 6e 66 69 67 75  d..**.** Configu
26030 72 61 74 69 6f 6e 20 6f 70 74 69 6f 6e 73 0a 2a  ration options.*
26040 2a 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  * --------------
26050 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 0a 2a 2a 20 20 53  -------.**.**  S
26060 51 4c 49 54 45 5f 50 52 45 46 45 52 5f 50 52 4f  QLITE_PREFER_PRO
26070 58 59 5f 4c 4f 43 4b 49 4e 47 0a 2a 2a 0a 2a 2a  XY_LOCKING.**.**
26080 20 20 20 20 20 20 20 44 61 74 61 62 61 73 65 20         Database 
26090 66 69 6c 65 73 20 61 63 63 65 73 73 65 64 20 6f  files accessed o
260a0 6e 20 6e 6f 6e 2d 6c 6f 63 61 6c 20 66 69 6c 65  n non-local file
260b0 20 73 79 73 74 65 6d 73 20 61 72 65 0a 2a 2a 20   systems are.** 
260c0 20 20 20 20 20 20 61 75 74 6f 6d 61 74 69 63 61        automatica
260d0 6c 6c 79 20 63 6f 6e 66 69 67 75 72 65 64 20 66  lly configured f
260e0 6f 72 20 70 72 6f 78 79 20 6c 6f 63 6b 69 6e 67  or proxy locking
260f0 2c 20 6c 6f 63 6b 20 66 69 6c 65 73 20 61 72 65  , lock files are
26100 0a 2a 2a 20 20 20 20 20 20 20 6e 61 6d 65 64 20  .**       named 
26110 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 75 73  automatically us
26120 69 6e 67 20 74 68 65 20 73 61 6d 65 20 6c 6f 67  ing the same log
26130 69 63 20 61 73 0a 2a 2a 20 20 20 20 20 20 20 50  ic as.**       P
26140 52 41 47 4d 41 20 6c 6f 63 6b 5f 70 72 6f 78 79  RAGMA lock_proxy
26150 5f 66 69 6c 65 3d 22 3a 61 75 74 6f 3a 22 0a 2a  _file=":auto:".*
26160 2a 20 20 20 20 0a 2a 2a 20 20 53 51 4c 49 54 45  *    .**  SQLITE
26170 5f 50 52 4f 58 59 5f 44 45 42 55 47 0a 2a 2a 0a  _PROXY_DEBUG.**.
26180 2a 2a 20 20 20 20 20 20 20 45 6e 61 62 6c 65 73  **       Enables
26190 20 74 68 65 20 6c 6f 67 67 69 6e 67 20 6f 66 20   the logging of 
261a0 65 72 72 6f 72 20 6d 65 73 73 61 67 65 73 20 64  error messages d
261b0 75 72 69 6e 67 20 68 6f 73 74 20 69 64 20 66 69  uring host id fi
261c0 6c 65 0a 2a 2a 20 20 20 20 20 20 20 72 65 74 72  le.**       retr
261d0 69 65 76 61 6c 20 61 6e 64 20 63 72 65 61 74 69  ieval and creati
261e0 6f 6e 0a 2a 2a 0a 2a 2a 20 20 4c 4f 43 4b 50 52  on.**.**  LOCKPR
261f0 4f 58 59 44 49 52 0a 2a 2a 0a 2a 2a 20 20 20 20  OXYDIR.**.**    
26200 20 20 20 4f 76 65 72 72 69 64 65 73 20 74 68 65     Overrides the
26210 20 64 65 66 61 75 6c 74 20 64 69 72 65 63 74 6f   default directo
26220 72 79 20 75 73 65 64 20 66 6f 72 20 6c 6f 63 6b  ry used for lock
26230 20 70 72 6f 78 79 20 66 69 6c 65 73 20 74 68 61   proxy files tha
26240 74 0a 2a 2a 20 20 20 20 20 20 20 61 72 65 20 6e  t.**       are n
26250 61 6d 65 64 20 61 75 74 6f 6d 61 74 69 63 61 6c  amed automatical
26260 6c 79 20 76 69 61 20 74 68 65 20 22 3a 61 75 74  ly via the ":aut
26270 6f 3a 22 20 73 65 74 74 69 6e 67 0a 2a 2a 0a 2a  o:" setting.**.*
26280 2a 20 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c  *  SQLITE_DEFAUL
26290 54 5f 50 52 4f 58 59 44 49 52 5f 50 45 52 4d 49  T_PROXYDIR_PERMI
262a0 53 53 49 4f 4e 53 0a 2a 2a 0a 2a 2a 20 20 20 20  SSIONS.**.**    
262b0 20 20 20 50 65 72 6d 69 73 73 69 6f 6e 73 20 74     Permissions t
262c0 6f 20 75 73 65 20 77 68 65 6e 20 63 72 65 61 74  o use when creat
262d0 69 6e 67 20 61 20 64 69 72 65 63 74 6f 72 79 20  ing a directory 
262e0 66 6f 72 20 73 74 6f 72 69 6e 67 20 74 68 65 0a  for storing the.
262f0 2a 2a 20 20 20 20 20 20 20 6c 6f 63 6b 20 70 72  **       lock pr
26300 6f 78 79 20 66 69 6c 65 73 2c 20 6f 6e 6c 79 20  oxy files, only 
26310 75 73 65 64 20 77 68 65 6e 20 4c 4f 43 4b 50 52  used when LOCKPR
26320 4f 58 59 44 49 52 20 69 73 20 6e 6f 74 20 73 65  OXYDIR is not se
26330 74 2e 0a 2a 2a 20 20 20 20 0a 2a 2a 20 20 20 20  t..**    .**    
26340 0a 2a 2a 20 41 73 20 6d 65 6e 74 69 6f 6e 65 64  .** As mentioned
26350 20 61 62 6f 76 65 2c 20 77 68 65 6e 20 63 6f 6d   above, when com
26360 70 69 6c 65 64 20 77 69 74 68 20 53 51 4c 49 54  piled with SQLIT
26370 45 5f 50 52 45 46 45 52 5f 50 52 4f 58 59 5f 4c  E_PREFER_PROXY_L
26380 4f 43 4b 49 4e 47 2c 0a 2a 2a 20 73 65 74 74 69  OCKING,.** setti
26390 6e 67 20 74 68 65 20 65 6e 76 69 72 6f 6e 6d 65  ng the environme
263a0 6e 74 20 76 61 72 69 61 62 6c 65 20 53 51 4c 49  nt variable SQLI
263b0 54 45 5f 46 4f 52 43 45 5f 50 52 4f 58 59 5f 4c  TE_FORCE_PROXY_L
263c0 4f 43 4b 49 4e 47 20 74 6f 20 31 20 77 69 6c 6c  OCKING to 1 will
263d0 0a 2a 2a 20 66 6f 72 63 65 20 70 72 6f 78 79 20  .** force proxy 
263e0 6c 6f 63 6b 69 6e 67 20 74 6f 20 62 65 20 75 73  locking to be us
263f0 65 64 20 66 6f 72 20 65 76 65 72 79 20 64 61 74  ed for every dat
26400 61 62 61 73 65 20 66 69 6c 65 20 6f 70 65 6e 65  abase file opene
26410 64 2c 20 61 6e 64 20 30 0a 2a 2a 20 77 69 6c 6c  d, and 0.** will
26420 20 66 6f 72 63 65 20 61 75 74 6f 6d 61 74 69 63   force automatic
26430 20 70 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 20 74   proxy locking t
26440 6f 20 62 65 20 64 69 73 61 62 6c 65 64 20 66 6f  o be disabled fo
26450 72 20 61 6c 6c 20 64 61 74 61 62 61 73 65 0a 2a  r all database.*
26460 2a 20 66 69 6c 65 73 20 28 65 78 70 6c 69 63 69  * files (explici
26470 74 79 20 63 61 6c 6c 69 6e 67 20 74 68 65 20 53  ty calling the S
26480 51 4c 49 54 45 5f 53 45 54 5f 4c 4f 43 4b 50 52  QLITE_SET_LOCKPR
26490 4f 58 59 46 49 4c 45 20 70 72 61 67 6d 61 20 6f  OXYFILE pragma o
264a0 72 0a 2a 2a 20 73 71 6c 69 74 65 5f 66 69 6c 65  r.** sqlite_file
264b0 5f 63 6f 6e 74 72 6f 6c 20 41 50 49 20 69 73 20  _control API is 
264c0 6e 6f 74 20 61 66 66 65 63 74 65 64 20 62 79 20  not affected by 
264d0 53 51 4c 49 54 45 5f 46 4f 52 43 45 5f 50 52 4f  SQLITE_FORCE_PRO
264e0 58 59 5f 4c 4f 43 4b 49 4e 47 29 2e 0a 2a 2f 0a  XY_LOCKING)..*/.
264f0 0a 2f 2a 0a 2a 2a 20 50 72 6f 78 79 20 6c 6f 63  ./*.** Proxy loc
26500 6b 69 6e 67 20 69 73 20 6f 6e 6c 79 20 61 76 61  king is only ava
26510 69 6c 61 62 6c 65 20 6f 6e 20 4d 61 63 4f 53 58  ilable on MacOSX
26520 20 0a 2a 2f 0a 23 69 66 20 64 65 66 69 6e 65 64   .*/.#if defined
26530 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 26 26 20 53  (__APPLE__) && S
26540 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43  QLITE_ENABLE_LOC
26550 4b 49 4e 47 5f 53 54 59 4c 45 0a 0a 2f 2a 0a 2a  KING_STYLE../*.*
26560 2a 20 54 68 65 20 70 72 6f 78 79 4c 6f 63 6b 69  * The proxyLocki
26570 6e 67 43 6f 6e 74 65 78 74 20 68 61 73 20 74 68  ngContext has th
26580 65 20 70 61 74 68 20 61 6e 64 20 66 69 6c 65 20  e path and file 
26590 73 74 72 75 63 74 75 72 65 73 20 66 6f 72 20 74  structures for t
265a0 68 65 20 72 65 6d 6f 74 65 20 0a 2a 2a 20 61 6e  he remote .** an
265b0 64 20 6c 6f 63 61 6c 20 70 72 6f 78 79 20 66 69  d local proxy fi
265c0 6c 65 73 20 69 6e 20 69 74 0a 2a 2f 0a 74 79 70  les in it.*/.typ
265d0 65 64 65 66 20 73 74 72 75 63 74 20 70 72 6f 78  edef struct prox
265e0 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20  yLockingContext 
265f0 70 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74  proxyLockingCont
26600 65 78 74 3b 0a 73 74 72 75 63 74 20 70 72 6f 78  ext;.struct prox
26610 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20  yLockingContext 
26620 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 63 6f  {.  unixFile *co
26630 6e 63 68 46 69 6c 65 3b 20 20 20 20 20 20 20 20  nchFile;        
26640 20 2f 2a 20 4f 70 65 6e 20 63 6f 6e 63 68 20 66   /* Open conch f
26650 69 6c 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 63  ile */.  char *c
26660 6f 6e 63 68 46 69 6c 65 50 61 74 68 3b 20 20 20  onchFilePath;   
26670 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66        /* Name of
26680 20 74 68 65 20 63 6f 6e 63 68 20 66 69 6c 65 20   the conch file 
26690 2a 2f 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 6c  */.  unixFile *l
266a0 6f 63 6b 50 72 6f 78 79 3b 20 20 20 20 20 20 20  ockProxy;       
266b0 20 20 2f 2a 20 4f 70 65 6e 20 70 72 6f 78 79 20    /* Open proxy 
266c0 6c 6f 63 6b 20 66 69 6c 65 20 2a 2f 0a 20 20 63  lock file */.  c
266d0 68 61 72 20 2a 6c 6f 63 6b 50 72 6f 78 79 50 61  har *lockProxyPa
266e0 74 68 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4e  th;         /* N
266f0 61 6d 65 20 6f 66 20 74 68 65 20 70 72 6f 78 79  ame of the proxy
26700 20 6c 6f 63 6b 20 66 69 6c 65 20 2a 2f 0a 20 20   lock file */.  
26710 63 68 61 72 20 2a 64 62 50 61 74 68 3b 20 20 20  char *dbPath;   
26720 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
26730 4e 61 6d 65 20 6f 66 20 74 68 65 20 6f 70 65 6e  Name of the open
26740 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 63   file */.  int c
26750 6f 6e 63 68 48 65 6c 64 3b 20 20 20 20 20 20 20  onchHeld;       
26760 20 20 20 20 20 20 20 20 2f 2a 20 31 20 69 66 20          /* 1 if 
26770 74 68 65 20 63 6f 6e 63 68 20 69 73 20 68 65 6c  the conch is hel
26780 64 2c 20 2d 31 20 69 66 20 6c 6f 63 6b 6c 65 73  d, -1 if lockles
26790 73 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 6f 6c 64  s */.  void *old
267a0 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 20  LockingContext; 
267b0 20 20 20 20 2f 2a 20 4f 72 69 67 69 6e 61 6c 20      /* Original 
267c0 6c 6f 63 6b 69 6e 67 63 6f 6e 74 65 78 74 20 74  lockingcontext t
267d0 6f 20 72 65 73 74 6f 72 65 20 6f 6e 20 63 6c 6f  o restore on clo
267e0 73 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  se */.  sqlite3_
267f0 69 6f 5f 6d 65 74 68 6f 64 73 20 63 6f 6e 73 74  io_methods const
26800 20 2a 70 4f 6c 64 4d 65 74 68 6f 64 3b 20 20 20   *pOldMethod;   
26810 20 20 2f 2a 20 4f 72 69 67 69 6e 61 6c 20 49 2f    /* Original I/
26820 4f 20 6d 65 74 68 6f 64 73 20 66 6f 72 20 63 6c  O methods for cl
26830 6f 73 65 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 20 0a 2a  ose */.};../* .*
26840 2a 20 54 68 65 20 70 72 6f 78 79 20 6c 6f 63 6b  * The proxy lock
26850 20 66 69 6c 65 20 70 61 74 68 20 66 6f 72 20 74   file path for t
26860 68 65 20 64 61 74 61 62 61 73 65 20 61 74 20 64  he database at d
26870 62 50 61 74 68 20 69 73 20 77 72 69 74 74 65 6e  bPath is written
26880 20 69 6e 74 6f 20 6c 50 61 74 68 2c 20 0a 2a 2a   into lPath, .**
26890 20 77 68 69 63 68 20 6d 75 73 74 20 70 6f 69 6e   which must poin
268a0 74 20 74 6f 20 76 61 6c 69 64 2c 20 77 72 69 74  t to valid, writ
268b0 61 62 6c 65 20 6d 65 6d 6f 72 79 20 6c 61 72 67  able memory larg
268c0 65 20 65 6e 6f 75 67 68 20 66 6f 72 20 61 20 6d  e enough for a m
268d0 61 78 4c 65 6e 20 6c 65 6e 67 74 68 0a 2a 2a 20  axLen length.** 
268e0 66 69 6c 65 20 70 61 74 68 2e 20 0a 2a 2f 0a 73  file path. .*/.s
268f0 74 61 74 69 63 20 69 6e 74 20 70 72 6f 78 79 47  tatic int proxyG
26900 65 74 4c 6f 63 6b 50 61 74 68 28 63 6f 6e 73 74  etLockPath(const
26910 20 63 68 61 72 20 2a 64 62 50 61 74 68 2c 20 63   char *dbPath, c
26920 68 61 72 20 2a 6c 50 61 74 68 2c 20 73 69 7a 65  har *lPath, size
26930 5f 74 20 6d 61 78 4c 65 6e 29 7b 0a 20 20 69 6e  _t maxLen){.  in
26940 74 20 6c 65 6e 3b 0a 20 20 69 6e 74 20 64 62 4c  t len;.  int dbL
26950 65 6e 3b 0a 20 20 69 6e 74 20 69 3b 0a 0a 23 69  en;.  int i;..#i
26960 66 64 65 66 20 4c 4f 43 4b 50 52 4f 58 59 44 49  fdef LOCKPROXYDI
26970 52 0a 20 20 6c 65 6e 20 3d 20 73 74 72 6c 63 70  R.  len = strlcp
26980 79 28 6c 50 61 74 68 2c 20 4c 4f 43 4b 50 52 4f  y(lPath, LOCKPRO
26990 58 59 44 49 52 2c 20 6d 61 78 4c 65 6e 29 3b 0a  XYDIR, maxLen);.
269a0 23 65 6c 73 65 0a 23 20 69 66 64 65 66 20 5f 43  #else.# ifdef _C
269b0 53 5f 44 41 52 57 49 4e 5f 55 53 45 52 5f 54 45  S_DARWIN_USER_TE
269c0 4d 50 5f 44 49 52 0a 20 20 7b 0a 20 20 20 20 69  MP_DIR.  {.    i
269d0 66 28 20 21 63 6f 6e 66 73 74 72 28 5f 43 53 5f  f( !confstr(_CS_
269e0 44 41 52 57 49 4e 5f 55 53 45 52 5f 54 45 4d 50  DARWIN_USER_TEMP
269f0 5f 44 49 52 2c 20 6c 50 61 74 68 2c 20 6d 61 78  _DIR, lPath, max
26a00 4c 65 6e 29 20 29 7b 0a 20 20 20 20 20 20 4f 53  Len) ){.      OS
26a10 54 52 41 43 45 34 28 22 47 45 54 4c 4f 43 4b 50  TRACE4("GETLOCKP
26a20 41 54 48 20 20 66 61 69 6c 65 64 20 25 73 20 65  ATH  failed %s e
26a30 72 72 6e 6f 3d 25 64 20 70 69 64 3d 25 64 5c 6e  rrno=%d pid=%d\n
26a40 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
26a50 20 20 6c 50 61 74 68 2c 20 65 72 72 6e 6f 2c 20    lPath, errno, 
26a60 67 65 74 70 69 64 28 29 29 3b 0a 20 20 20 20 20  getpid());.     
26a70 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49   return SQLITE_I
26a80 4f 45 52 52 5f 4c 4f 43 4b 3b 0a 20 20 20 20 7d  OERR_LOCK;.    }
26a90 0a 20 20 20 20 6c 65 6e 20 3d 20 73 74 72 6c 63  .    len = strlc
26aa0 61 74 28 6c 50 61 74 68 2c 20 22 73 71 6c 69 74  at(lPath, "sqlit
26ab0 65 70 6c 6f 63 6b 73 22 2c 20 6d 61 78 4c 65 6e  eplocks", maxLen
26ac0 29 3b 20 20 20 20 0a 20 20 7d 0a 23 20 65 6c 73  );    .  }.# els
26ad0 65 0a 20 20 6c 65 6e 20 3d 20 73 74 72 6c 63 70  e.  len = strlcp
26ae0 79 28 6c 50 61 74 68 2c 20 22 2f 74 6d 70 2f 22  y(lPath, "/tmp/"
26af0 2c 20 6d 61 78 4c 65 6e 29 3b 0a 23 20 65 6e 64  , maxLen);.# end
26b00 69 66 0a 23 65 6e 64 69 66 0a 0a 20 20 69 66 28  if.#endif..  if(
26b10 20 6c 50 61 74 68 5b 6c 65 6e 2d 31 5d 21 3d 27   lPath[len-1]!='
26b20 2f 27 20 29 7b 0a 20 20 20 20 6c 65 6e 20 3d 20  /' ){.    len = 
26b30 73 74 72 6c 63 61 74 28 6c 50 61 74 68 2c 20 22  strlcat(lPath, "
26b40 2f 22 2c 20 6d 61 78 4c 65 6e 29 3b 0a 20 20 7d  /", maxLen);.  }
26b50 0a 20 20 0a 20 20 2f 2a 20 74 72 61 6e 73 66 6f  .  .  /* transfo
26b60 72 6d 20 74 68 65 20 64 62 20 70 61 74 68 20 74  rm the db path t
26b70 6f 20 61 20 75 6e 69 71 75 65 20 63 61 63 68 65  o a unique cache
26b80 20 6e 61 6d 65 20 2a 2f 0a 20 20 64 62 4c 65 6e   name */.  dbLen
26b90 20 3d 20 28 69 6e 74 29 73 74 72 6c 65 6e 28 64   = (int)strlen(d
26ba0 62 50 61 74 68 29 3b 0a 20 20 66 6f 72 28 20 69  bPath);.  for( i
26bb0 3d 30 3b 20 69 3c 64 62 4c 65 6e 20 26 26 20 28  =0; i<dbLen && (
26bc0 69 2b 6c 65 6e 2b 37 29 3c 6d 61 78 4c 65 6e 3b  i+len+7)<maxLen;
26bd0 20 69 2b 2b 29 7b 0a 20 20 20 20 63 68 61 72 20   i++){.    char 
26be0 63 20 3d 20 64 62 50 61 74 68 5b 69 5d 3b 0a 20  c = dbPath[i];. 
26bf0 20 20 20 6c 50 61 74 68 5b 69 2b 6c 65 6e 5d 20     lPath[i+len] 
26c00 3d 20 28 63 3d 3d 27 2f 27 29 3f 27 5f 27 3a 63  = (c=='/')?'_':c
26c10 3b 0a 20 20 7d 0a 20 20 6c 50 61 74 68 5b 69 2b  ;.  }.  lPath[i+
26c20 6c 65 6e 5d 3d 27 5c 30 27 3b 0a 20 20 73 74 72  len]='\0';.  str
26c30 6c 63 61 74 28 6c 50 61 74 68 2c 20 22 3a 61 75  lcat(lPath, ":au
26c40 74 6f 3a 22 2c 20 6d 61 78 4c 65 6e 29 3b 0a 20  to:", maxLen);. 
26c50 20 4f 53 54 52 41 43 45 33 28 22 47 45 54 4c 4f   OSTRACE3("GETLO
26c60 43 4b 50 41 54 48 20 20 70 72 6f 78 79 20 6c 6f  CKPATH  proxy lo
26c70 63 6b 20 70 61 74 68 3d 25 73 20 70 69 64 3d 25  ck path=%s pid=%
26c80 64 5c 6e 22 2c 20 6c 50 61 74 68 2c 20 67 65 74  d\n", lPath, get
26c90 70 69 64 28 29 29 3b 0a 20 20 72 65 74 75 72 6e  pid());.  return
26ca0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
26cb0 2a 20 0a 20 2a 2a 20 43 72 65 61 74 65 73 20 74  * . ** Creates t
26cc0 68 65 20 6c 6f 63 6b 20 66 69 6c 65 20 61 6e 64  he lock file and
26cd0 20 61 6e 79 20 6d 69 73 73 69 6e 67 20 64 69 72   any missing dir
26ce0 65 63 74 6f 72 69 65 73 20 69 6e 20 6c 6f 63 6b  ectories in lock
26cf0 50 61 74 68 0a 20 2a 2f 0a 73 74 61 74 69 63 20  Path. */.static 
26d00 69 6e 74 20 70 72 6f 78 79 43 72 65 61 74 65 4c  int proxyCreateL
26d10 6f 63 6b 50 61 74 68 28 63 6f 6e 73 74 20 63 68  ockPath(const ch
26d20 61 72 20 2a 6c 6f 63 6b 50 61 74 68 29 7b 0a 20  ar *lockPath){. 
26d30 20 69 6e 74 20 69 2c 20 6c 65 6e 3b 0a 20 20 63   int i, len;.  c
26d40 68 61 72 20 62 75 66 5b 4d 41 58 50 41 54 48 4c  har buf[MAXPATHL
26d50 45 4e 5d 3b 0a 20 20 69 6e 74 20 73 74 61 72 74  EN];.  int start
26d60 20 3d 20 30 3b 0a 20 20 0a 20 20 61 73 73 65 72   = 0;.  .  asser
26d70 74 28 6c 6f 63 6b 50 61 74 68 21 3d 4e 55 4c 4c  t(lockPath!=NULL
26d80 29 3b 0a 20 20 2f 2a 20 74 72 79 20 74 6f 20 63  );.  /* try to c
26d90 72 65 61 74 65 20 61 6c 6c 20 74 68 65 20 69 6e  reate all the in
26da0 74 65 72 6d 65 64 69 61 74 65 20 64 69 72 65 63  termediate direc
26db0 74 6f 72 69 65 73 20 2a 2f 0a 20 20 6c 65 6e 20  tories */.  len 
26dc0 3d 20 28 69 6e 74 29 73 74 72 6c 65 6e 28 6c 6f  = (int)strlen(lo
26dd0 63 6b 50 61 74 68 29 3b 0a 20 20 62 75 66 5b 30  ckPath);.  buf[0
26de0 5d 20 3d 20 6c 6f 63 6b 50 61 74 68 5b 30 5d 3b  ] = lockPath[0];
26df0 0a 20 20 66 6f 72 28 20 69 3d 31 3b 20 69 3c 6c  .  for( i=1; i<l
26e00 65 6e 3b 20 69 2b 2b 20 29 7b 0a 20 20 20 20 69  en; i++ ){.    i
26e10 66 28 20 6c 6f 63 6b 50 61 74 68 5b 69 5d 20 3d  f( lockPath[i] =
26e20 3d 20 27 2f 27 20 26 26 20 28 69 20 2d 20 73 74  = '/' && (i - st
26e30 61 72 74 20 3e 20 30 29 20 29 7b 0a 20 20 20 20  art > 0) ){.    
26e40 20 20 2f 2a 20 6f 6e 6c 79 20 6d 6b 64 69 72 20    /* only mkdir 
26e50 69 66 20 6c 65 61 66 20 64 69 72 20 21 3d 20 22  if leaf dir != "
26e60 2e 22 20 6f 72 20 22 2f 22 20 6f 72 20 22 2e 2e  ." or "/" or "..
26e70 22 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 69  " */.      if( i
26e80 2d 73 74 61 72 74 3e 32 20 7c 7c 20 28 69 2d 73  -start>2 || (i-s
26e90 74 61 72 74 3d 3d 31 20 26 26 20 62 75 66 5b 73  tart==1 && buf[s
26ea0 74 61 72 74 5d 20 21 3d 20 27 2e 27 20 26 26 20  tart] != '.' && 
26eb0 62 75 66 5b 73 74 61 72 74 5d 20 21 3d 20 27 2f  buf[start] != '/
26ec0 27 29 20 0a 20 20 20 20 20 20 20 20 20 7c 7c 20  ') .         || 
26ed0 28 69 2d 73 74 61 72 74 3d 3d 32 20 26 26 20 62  (i-start==2 && b
26ee0 75 66 5b 73 74 61 72 74 5d 20 21 3d 20 27 2e 27  uf[start] != '.'
26ef0 20 26 26 20 62 75 66 5b 73 74 61 72 74 2b 31 5d   && buf[start+1]
26f00 20 21 3d 20 27 2e 27 29 20 29 7b 0a 20 20 20 20   != '.') ){.    
26f10 20 20 20 20 62 75 66 5b 69 5d 3d 27 5c 30 27 3b      buf[i]='\0';
26f20 0a 20 20 20 20 20 20 20 20 69 66 28 20 6d 6b 64  .        if( mkd
26f30 69 72 28 62 75 66 2c 20 53 51 4c 49 54 45 5f 44  ir(buf, SQLITE_D
26f40 45 46 41 55 4c 54 5f 50 52 4f 58 59 44 49 52 5f  EFAULT_PROXYDIR_
26f50 50 45 52 4d 49 53 53 49 4f 4e 53 29 20 29 7b 0a  PERMISSIONS) ){.
26f60 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 65 72            int er
26f70 72 3d 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20 20  r=errno;.       
26f80 20 20 20 69 66 28 20 65 72 72 21 3d 45 45 58 49     if( err!=EEXI
26f90 53 54 20 29 20 7b 0a 20 20 20 20 20 20 20 20 20  ST ) {.         
26fa0 20 20 20 4f 53 54 52 41 43 45 35 28 22 43 52 45     OSTRACE5("CRE
26fb0 41 54 45 4c 4f 43 4b 50 41 54 48 20 20 46 41 49  ATELOCKPATH  FAI
26fc0 4c 45 44 20 63 72 65 61 74 69 6e 67 20 25 73 2c  LED creating %s,
26fd0 20 22 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   ".             
26fe0 20 20 20 20 20 20 20 20 22 27 25 73 27 20 70 72          "'%s' pr
26ff0 6f 78 79 20 6c 6f 63 6b 20 70 61 74 68 3d 25 73  oxy lock path=%s
27000 20 70 69 64 3d 25 64 5c 6e 22 2c 0a 20 20 20 20   pid=%d\n",.    
27010 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27020 20 62 75 66 2c 20 73 74 72 65 72 72 6f 72 28 65   buf, strerror(e
27030 72 72 29 2c 20 6c 6f 63 6b 50 61 74 68 2c 20 67  rr), lockPath, g
27040 65 74 70 69 64 28 29 29 3b 0a 20 20 20 20 20 20  etpid());.      
27050 20 20 20 20 20 20 72 65 74 75 72 6e 20 65 72 72        return err
27060 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
27070 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
27080 20 20 20 20 20 20 73 74 61 72 74 3d 69 2b 31 3b        start=i+1;
27090 0a 20 20 20 20 7d 0a 20 20 20 20 62 75 66 5b 69  .    }.    buf[i
270a0 5d 20 3d 20 6c 6f 63 6b 50 61 74 68 5b 69 5d 3b  ] = lockPath[i];
270b0 0a 20 20 7d 0a 20 20 4f 53 54 52 41 43 45 33 28  .  }.  OSTRACE3(
270c0 22 43 52 45 41 54 45 4c 4f 43 4b 50 41 54 48 20  "CREATELOCKPATH 
270d0 20 70 72 6f 78 79 20 6c 6f 63 6b 20 70 61 74 68   proxy lock path
270e0 3d 25 73 20 70 69 64 3d 25 64 5c 6e 22 2c 20 6c  =%s pid=%d\n", l
270f0 6f 63 6b 50 61 74 68 2c 20 67 65 74 70 69 64 28  ockPath, getpid(
27100 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a  ));.  return 0;.
27110 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20  }../*.** Create 
27120 61 20 6e 65 77 20 56 46 53 20 66 69 6c 65 20 64  a new VFS file d
27130 65 73 63 72 69 70 74 6f 72 20 28 73 74 6f 72 65  escriptor (store
27140 64 20 69 6e 20 6d 65 6d 6f 72 79 20 6f 62 74 61  d in memory obta
27150 69 6e 65 64 20 66 72 6f 6d 0a 2a 2a 20 73 71 6c  ined from.** sql
27160 69 74 65 33 5f 6d 61 6c 6c 6f 63 29 20 61 6e 64  ite3_malloc) and
27170 20 6f 70 65 6e 20 74 68 65 20 66 69 6c 65 20 6e   open the file n
27180 61 6d 65 64 20 22 70 61 74 68 22 20 69 6e 20 74  amed "path" in t
27190 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  he file descript
271a0 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 61  or..**.** The ca
271b0 6c 6c 65 72 20 69 73 20 72 65 73 70 6f 6e 73 69  ller is responsi
271c0 62 6c 65 20 6e 6f 74 20 6f 6e 6c 79 20 66 6f 72  ble not only for
271d0 20 63 6c 6f 73 69 6e 67 20 74 68 65 20 66 69 6c   closing the fil
271e0 65 20 64 65 73 63 72 69 70 74 6f 72 0a 2a 2a 20  e descriptor.** 
271f0 62 75 74 20 61 6c 73 6f 20 66 6f 72 20 66 72 65  but also for fre
27200 65 69 6e 67 20 74 68 65 20 6d 65 6d 6f 72 79 20  eing the memory 
27210 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
27220 74 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70  the file descrip
27230 74 6f 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  tor..*/.static i
27240 6e 74 20 70 72 6f 78 79 43 72 65 61 74 65 55 6e  nt proxyCreateUn
27250 69 78 46 69 6c 65 28 0a 20 20 20 20 63 6f 6e 73  ixFile(.    cons
27260 74 20 63 68 61 72 20 2a 70 61 74 68 2c 20 20 20  t char *path,   
27270 20 20 20 20 20 2f 2a 20 70 61 74 68 20 66 6f 72       /* path for
27280 20 74 68 65 20 6e 65 77 20 75 6e 69 78 46 69 6c   the new unixFil
27290 65 20 2a 2f 0a 20 20 20 20 75 6e 69 78 46 69 6c  e */.    unixFil
272a0 65 20 2a 2a 70 70 46 69 6c 65 2c 20 20 20 20 20  e **ppFile,     
272b0 20 20 2f 2a 20 75 6e 69 78 46 69 6c 65 20 63 72    /* unixFile cr
272c0 65 61 74 65 64 20 61 6e 64 20 72 65 74 75 72 6e  eated and return
272d0 65 64 20 62 79 20 72 65 66 20 2a 2f 0a 20 20 20  ed by ref */.   
272e0 20 69 6e 74 20 69 73 6c 6f 63 6b 66 69 6c 65 20   int islockfile 
272f0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 69 66 20            /* if 
27300 6e 6f 6e 20 7a 65 72 6f 20 6d 69 73 73 69 6e 67  non zero missing
27310 20 64 69 72 73 20 77 69 6c 6c 20 62 65 20 63 72   dirs will be cr
27320 65 61 74 65 64 20 2a 2f 0a 29 20 7b 0a 20 20 69  eated */.) {.  i
27330 6e 74 20 66 64 20 3d 20 2d 31 3b 0a 20 20 69 6e  nt fd = -1;.  in
27340 74 20 64 69 72 66 64 20 3d 20 2d 31 3b 0a 20 20  t dirfd = -1;.  
27350 75 6e 69 78 46 69 6c 65 20 2a 70 4e 65 77 3b 0a  unixFile *pNew;.
27360 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
27370 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 6f 70 65 6e  E_OK;.  int open
27380 46 6c 61 67 73 20 3d 20 4f 5f 52 44 57 52 20 7c  Flags = O_RDWR |
27390 20 4f 5f 43 52 45 41 54 3b 0a 20 20 73 71 6c 69   O_CREAT;.  sqli
273a0 74 65 33 5f 76 66 73 20 64 75 6d 6d 79 56 66 73  te3_vfs dummyVfs
273b0 3b 0a 20 20 69 6e 74 20 74 65 72 72 6e 6f 20 3d  ;.  int terrno =
273c0 20 30 3b 0a 20 20 55 6e 69 78 55 6e 75 73 65 64   0;.  UnixUnused
273d0 46 64 20 2a 70 55 6e 75 73 65 64 20 3d 20 4e 55  Fd *pUnused = NU
273e0 4c 4c 3b 0a 0a 20 20 2f 2a 20 31 2e 20 66 69 72  LL;..  /* 1. fir
273f0 73 74 20 74 72 79 20 74 6f 20 6f 70 65 6e 2f 63  st try to open/c
27400 72 65 61 74 65 20 74 68 65 20 66 69 6c 65 0a 20  reate the file. 
27410 20 2a 2a 20 32 2e 20 69 66 20 74 68 61 74 20 66   ** 2. if that f
27420 61 69 6c 73 2c 20 61 6e 64 20 74 68 69 73 20 69  ails, and this i
27430 73 20 61 20 6c 6f 63 6b 20 66 69 6c 65 20 28 6e  s a lock file (n
27440 6f 74 2d 63 6f 6e 63 68 29 2c 20 74 72 79 20 63  ot-conch), try c
27450 72 65 61 74 69 6e 67 0a 20 20 2a 2a 20 74 68 65  reating.  ** the
27460 20 70 61 72 65 6e 74 20 64 69 72 65 63 74 6f 72   parent director
27470 69 65 73 20 61 6e 64 20 74 68 65 6e 20 74 72 79  ies and then try
27480 20 61 67 61 69 6e 2e 0a 20 20 2a 2a 20 33 2e 20   again..  ** 3. 
27490 69 66 20 74 68 61 74 20 66 61 69 6c 73 2c 20 74  if that fails, t
274a0 72 79 20 74 6f 20 6f 70 65 6e 20 74 68 65 20 66  ry to open the f
274b0 69 6c 65 20 72 65 61 64 2d 6f 6e 6c 79 0a 20 20  ile read-only.  
274c0 2a 2a 20 6f 74 68 65 72 77 69 73 65 20 72 65 74  ** otherwise ret
274d0 75 72 6e 20 42 55 53 59 20 28 69 66 20 6c 6f 63  urn BUSY (if loc
274e0 6b 20 66 69 6c 65 29 20 6f 72 20 43 41 4e 54 4f  k file) or CANTO
274f0 50 45 4e 20 66 6f 72 20 74 68 65 20 63 6f 6e 63  PEN for the conc
27500 68 20 66 69 6c 65 0a 20 20 2a 2f 0a 20 20 70 55  h file.  */.  pU
27510 6e 75 73 65 64 20 3d 20 66 69 6e 64 52 65 75 73  nused = findReus
27520 61 62 6c 65 46 64 28 70 61 74 68 2c 20 6f 70 65  ableFd(path, ope
27530 6e 46 6c 61 67 73 29 3b 0a 20 20 69 66 28 20 70  nFlags);.  if( p
27540 55 6e 75 73 65 64 20 29 7b 0a 20 20 20 20 66 64  Unused ){.    fd
27550 20 3d 20 70 55 6e 75 73 65 64 2d 3e 66 64 3b 0a   = pUnused->fd;.
27560 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 55 6e    }else{.    pUn
27570 75 73 65 64 20 3d 20 73 71 6c 69 74 65 33 5f 6d  used = sqlite3_m
27580 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 2a 70 55  alloc(sizeof(*pU
27590 6e 75 73 65 64 29 29 3b 0a 20 20 20 20 69 66 28  nused));.    if(
275a0 20 21 70 55 6e 75 73 65 64 20 29 7b 0a 20 20 20   !pUnused ){.   
275b0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
275c0 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20  _NOMEM;.    }.  
275d0 7d 0a 20 20 69 66 28 20 66 64 3c 30 20 29 7b 0a  }.  if( fd<0 ){.
275e0 20 20 20 20 66 64 20 3d 20 6f 70 65 6e 28 70 61      fd = open(pa
275f0 74 68 2c 20 6f 70 65 6e 46 6c 61 67 73 2c 20 53  th, openFlags, S
27600 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 46 49  QLITE_DEFAULT_FI
27610 4c 45 5f 50 45 52 4d 49 53 53 49 4f 4e 53 29 3b  LE_PERMISSIONS);
27620 0a 20 20 20 20 74 65 72 72 6e 6f 20 3d 20 65 72  .    terrno = er
27630 72 6e 6f 3b 0a 20 20 20 20 69 66 28 20 66 64 3c  rno;.    if( fd<
27640 30 20 26 26 20 65 72 72 6e 6f 3d 3d 45 4e 4f 45  0 && errno==ENOE
27650 4e 54 20 26 26 20 69 73 6c 6f 63 6b 66 69 6c 65  NT && islockfile
27660 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 72   ){.      if( pr
27670 6f 78 79 43 72 65 61 74 65 4c 6f 63 6b 50 61 74  oxyCreateLockPat
27680 68 28 70 61 74 68 29 20 3d 3d 20 53 51 4c 49 54  h(path) == SQLIT
27690 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
276a0 66 64 20 3d 20 6f 70 65 6e 28 70 61 74 68 2c 20  fd = open(path, 
276b0 6f 70 65 6e 46 6c 61 67 73 2c 20 53 51 4c 49 54  openFlags, SQLIT
276c0 45 5f 44 45 46 41 55 4c 54 5f 46 49 4c 45 5f 50  E_DEFAULT_FILE_P
276d0 45 52 4d 49 53 53 49 4f 4e 53 29 3b 0a 20 20 20  ERMISSIONS);.   
276e0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20     }.    }.  }. 
276f0 20 69 66 28 20 66 64 3c 30 20 29 7b 0a 20 20 20   if( fd<0 ){.   
27700 20 6f 70 65 6e 46 6c 61 67 73 20 3d 20 4f 5f 52   openFlags = O_R
27710 44 4f 4e 4c 59 3b 0a 20 20 20 20 66 64 20 3d 20  DONLY;.    fd = 
27720 6f 70 65 6e 28 70 61 74 68 2c 20 6f 70 65 6e 46  open(path, openF
27730 6c 61 67 73 2c 20 53 51 4c 49 54 45 5f 44 45 46  lags, SQLITE_DEF
27740 41 55 4c 54 5f 46 49 4c 45 5f 50 45 52 4d 49 53  AULT_FILE_PERMIS
27750 53 49 4f 4e 53 29 3b 0a 20 20 20 20 74 65 72 72  SIONS);.    terr
27760 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 7d 0a  no = errno;.  }.
27770 20 20 69 66 28 20 66 64 3c 30 20 29 7b 0a 20 20    if( fd<0 ){.  
27780 20 20 69 66 28 20 69 73 6c 6f 63 6b 66 69 6c 65    if( islockfile
27790 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
277a0 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20   SQLITE_BUSY;.  
277b0 20 20 7d 0a 20 20 20 20 73 77 69 74 63 68 20 28    }.    switch (
277c0 74 65 72 72 6e 6f 29 20 7b 0a 20 20 20 20 20 20  terrno) {.      
277d0 63 61 73 65 20 45 41 43 43 45 53 3a 0a 20 20 20  case EACCES:.   
277e0 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
277f0 54 45 5f 50 45 52 4d 3b 0a 20 20 20 20 20 20 63  TE_PERM;.      c
27800 61 73 65 20 45 49 4f 3a 20 0a 20 20 20 20 20 20  ase EIO: .      
27810 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
27820 49 4f 45 52 52 5f 4c 4f 43 4b 3b 20 2f 2a 20 65  IOERR_LOCK; /* e
27830 76 65 6e 20 74 68 6f 75 67 68 20 69 74 20 69 73  ven though it is
27840 20 74 68 65 20 63 6f 6e 63 68 20 2a 2f 0a 20 20   the conch */.  
27850 20 20 20 20 64 65 66 61 75 6c 74 3a 0a 20 20 20      default:.   
27860 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
27870 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 42 4b 50 54  TE_CANTOPEN_BKPT
27880 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 0a 20  ;.    }.  }.  . 
27890 20 70 4e 65 77 20 3d 20 28 75 6e 69 78 46 69 6c   pNew = (unixFil
278a0 65 20 2a 29 73 71 6c 69 74 65 33 5f 6d 61 6c 6c  e *)sqlite3_mall
278b0 6f 63 28 73 69 7a 65 6f 66 28 2a 70 4e 65 77 29  oc(sizeof(*pNew)
278c0 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d 4e  );.  if( pNew==N
278d0 55 4c 4c 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  ULL ){.    rc = 
278e0 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
278f0 20 20 67 6f 74 6f 20 65 6e 64 5f 63 72 65 61 74    goto end_creat
27900 65 5f 70 72 6f 78 79 3b 0a 20 20 7d 0a 20 20 6d  e_proxy;.  }.  m
27910 65 6d 73 65 74 28 70 4e 65 77 2c 20 30 2c 20 73  emset(pNew, 0, s
27920 69 7a 65 6f 66 28 75 6e 69 78 46 69 6c 65 29 29  izeof(unixFile))
27930 3b 0a 20 20 70 4e 65 77 2d 3e 6f 70 65 6e 46 6c  ;.  pNew->openFl
27940 61 67 73 20 3d 20 6f 70 65 6e 46 6c 61 67 73 3b  ags = openFlags;
27950 0a 20 20 64 75 6d 6d 79 56 66 73 2e 70 41 70 70  .  dummyVfs.pApp
27960 44 61 74 61 20 3d 20 28 76 6f 69 64 2a 29 26 61  Data = (void*)&a
27970 75 74 6f 6c 6f 63 6b 49 6f 46 69 6e 64 65 72 3b  utolockIoFinder;
27980 0a 20 20 70 55 6e 75 73 65 64 2d 3e 66 64 20 3d  .  pUnused->fd =
27990 20 66 64 3b 0a 20 20 70 55 6e 75 73 65 64 2d 3e   fd;.  pUnused->
279a0 66 6c 61 67 73 20 3d 20 6f 70 65 6e 46 6c 61 67  flags = openFlag
279b0 73 3b 0a 20 20 70 4e 65 77 2d 3e 70 55 6e 75 73  s;.  pNew->pUnus
279c0 65 64 20 3d 20 70 55 6e 75 73 65 64 3b 0a 20 20  ed = pUnused;.  
279d0 0a 20 20 72 63 20 3d 20 66 69 6c 6c 49 6e 55 6e  .  rc = fillInUn
279e0 69 78 46 69 6c 65 28 26 64 75 6d 6d 79 56 66 73  ixFile(&dummyVfs
279f0 2c 20 66 64 2c 20 64 69 72 66 64 2c 20 28 73 71  , fd, dirfd, (sq
27a00 6c 69 74 65 33 5f 66 69 6c 65 2a 29 70 4e 65 77  lite3_file*)pNew
27a10 2c 20 70 61 74 68 2c 20 30 2c 20 30 29 3b 0a 20  , path, 0, 0);. 
27a20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
27a30 4f 4b 20 29 7b 0a 20 20 20 20 2a 70 70 46 69 6c  OK ){.    *ppFil
27a40 65 20 3d 20 70 4e 65 77 3b 0a 20 20 20 20 72 65  e = pNew;.    re
27a50 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
27a60 20 20 7d 0a 65 6e 64 5f 63 72 65 61 74 65 5f 70    }.end_create_p
27a70 72 6f 78 79 3a 20 20 20 20 0a 20 20 63 6c 6f 73  roxy:    .  clos
27a80 65 28 66 64 29 3b 20 2f 2a 20 73 69 6c 65 6e 74  e(fd); /* silent
27a90 6c 79 20 6c 65 61 6b 20 66 64 20 69 66 20 65 72  ly leak fd if er
27aa0 72 6f 72 2c 20 77 65 27 72 65 20 61 6c 72 65 61  ror, we're alrea
27ab0 64 79 20 69 6e 20 65 72 72 6f 72 20 2a 2f 0a 20  dy in error */. 
27ac0 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 4e   sqlite3_free(pN
27ad0 65 77 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66  ew);.  sqlite3_f
27ae0 72 65 65 28 70 55 6e 75 73 65 64 29 3b 0a 20 20  ree(pUnused);.  
27af0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69  return rc;.}..#i
27b00 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54  fdef SQLITE_TEST
27b10 0a 2f 2a 20 73 69 6d 75 6c 61 74 65 20 6d 75 6c  ./* simulate mul
27b20 74 69 70 6c 65 20 68 6f 73 74 73 20 62 79 20 63  tiple hosts by c
27b30 72 65 61 74 69 6e 67 20 75 6e 69 71 75 65 20 68  reating unique h
27b40 6f 73 74 69 64 20 66 69 6c 65 20 70 61 74 68 73  ostid file paths
27b50 20 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f   */.int sqlite3_
27b60 68 6f 73 74 69 64 5f 6e 75 6d 20 3d 20 30 3b 0a  hostid_num = 0;.
27b70 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20  #endif..#define 
27b80 50 52 4f 58 59 5f 48 4f 53 54 49 44 4c 45 4e 20  PROXY_HOSTIDLEN 
27b90 20 20 20 31 36 20 20 2f 2a 20 63 6f 6e 63 68 20     16  /* conch 
27ba0 66 69 6c 65 20 68 6f 73 74 20 69 64 20 6c 65 6e  file host id len
27bb0 67 74 68 20 2a 2f 0a 0a 2f 2a 20 67 65 74 20 74  gth */../* get t
27bc0 68 65 20 68 6f 73 74 20 49 44 20 76 69 61 20 67  he host ID via g
27bd0 65 74 68 6f 73 74 75 75 69 64 28 29 2c 20 70 48  ethostuuid(), pH
27be0 6f 73 74 49 44 20 6d 75 73 74 20 70 6f 69 6e 74  ostID must point
27bf0 20 74 6f 20 50 52 4f 58 59 5f 48 4f 53 54 49 44   to PROXY_HOSTID
27c00 4c 45 4e 20 0a 2a 2a 20 62 79 74 65 73 20 6f 66  LEN .** bytes of
27c10 20 77 72 69 74 61 62 6c 65 20 6d 65 6d 6f 72 79   writable memory
27c20 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
27c30 70 72 6f 78 79 47 65 74 48 6f 73 74 49 44 28 75  proxyGetHostID(u
27c40 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 48  nsigned char *pH
27c50 6f 73 74 49 44 2c 20 69 6e 74 20 2a 70 45 72 72  ostID, int *pErr
27c60 6f 72 29 7b 0a 20 20 73 74 72 75 63 74 20 74 69  or){.  struct ti
27c70 6d 65 73 70 65 63 20 74 69 6d 65 6f 75 74 20 3d  mespec timeout =
27c80 20 7b 31 2c 20 30 7d 3b 20 2f 2a 20 31 20 73 65   {1, 0}; /* 1 se
27c90 63 20 74 69 6d 65 6f 75 74 20 2a 2f 0a 20 20 0a  c timeout */.  .
27ca0 20 20 61 73 73 65 72 74 28 50 52 4f 58 59 5f 48    assert(PROXY_H
27cb0 4f 53 54 49 44 4c 45 4e 20 3d 3d 20 73 69 7a 65  OSTIDLEN == size
27cc0 6f 66 28 75 75 69 64 5f 74 29 29 3b 0a 20 20 6d  of(uuid_t));.  m
27cd0 65 6d 73 65 74 28 70 48 6f 73 74 49 44 2c 20 30  emset(pHostID, 0
27ce0 2c 20 50 52 4f 58 59 5f 48 4f 53 54 49 44 4c 45  , PROXY_HOSTIDLE
27cf0 4e 29 3b 0a 20 20 69 66 28 20 67 65 74 68 6f 73  N);.  if( gethos
27d00 74 75 75 69 64 28 70 48 6f 73 74 49 44 2c 20 26  tuuid(pHostID, &
27d10 74 69 6d 65 6f 75 74 29 20 29 7b 0a 20 20 20 20  timeout) ){.    
27d20 69 6e 74 20 65 72 72 20 3d 20 65 72 72 6e 6f 3b  int err = errno;
27d30 0a 20 20 20 20 69 66 28 20 70 45 72 72 6f 72 20  .    if( pError 
27d40 29 7b 0a 20 20 20 20 20 20 2a 70 45 72 72 6f 72  ){.      *pError
27d50 20 3d 20 65 72 72 3b 0a 20 20 20 20 7d 0a 20 20   = err;.    }.  
27d60 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
27d70 49 4f 45 52 52 3b 0a 20 20 7d 0a 23 69 66 64 65  IOERR;.  }.#ifde
27d80 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20 20  f SQLITE_TEST.  
27d90 2f 2a 20 73 69 6d 75 6c 61 74 65 20 6d 75 6c 74  /* simulate mult
27da0 69 70 6c 65 20 68 6f 73 74 73 20 62 79 20 63 72  iple hosts by cr
27db0 65 61 74 69 6e 67 20 75 6e 69 71 75 65 20 68 6f  eating unique ho
27dc0 73 74 69 64 20 66 69 6c 65 20 70 61 74 68 73 20  stid file paths 
27dd0 2a 2f 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  */.  if( sqlite3
27de0 5f 68 6f 73 74 69 64 5f 6e 75 6d 20 21 3d 20 30  _hostid_num != 0
27df0 29 7b 0a 20 20 20 20 70 48 6f 73 74 49 44 5b 30  ){.    pHostID[0
27e00 5d 20 3d 20 28 63 68 61 72 29 28 70 48 6f 73 74  ] = (char)(pHost
27e10 49 44 5b 30 5d 20 2b 20 28 63 68 61 72 29 28 73  ID[0] + (char)(s
27e20 71 6c 69 74 65 33 5f 68 6f 73 74 69 64 5f 6e 75  qlite3_hostid_nu
27e30 6d 20 26 20 30 78 46 46 29 29 3b 0a 20 20 7d 0a  m & 0xFF));.  }.
27e40 23 65 6e 64 69 66 0a 20 20 0a 20 20 72 65 74 75  #endif.  .  retu
27e50 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
27e60 0a 2f 2a 20 54 68 65 20 63 6f 6e 63 68 20 66 69  ./* The conch fi
27e70 6c 65 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20  le contains the 
27e80 68 65 61 64 65 72 2c 20 68 6f 73 74 20 69 64 20  header, host id 
27e90 61 6e 64 20 6c 6f 63 6b 20 66 69 6c 65 20 70 61  and lock file pa
27ea0 74 68 0a 20 2a 2f 0a 23 64 65 66 69 6e 65 20 50  th. */.#define P
27eb0 52 4f 58 59 5f 43 4f 4e 43 48 56 45 52 53 49 4f  ROXY_CONCHVERSIO
27ec0 4e 20 32 20 20 20 2f 2a 20 31 2d 62 79 74 65 20  N 2   /* 1-byte 
27ed0 68 65 61 64 65 72 2c 20 31 36 2d 62 79 74 65 20  header, 16-byte 
27ee0 68 6f 73 74 20 69 64 2c 20 70 61 74 68 20 2a 2f  host id, path */
27ef0 0a 23 64 65 66 69 6e 65 20 50 52 4f 58 59 5f 48  .#define PROXY_H
27f00 45 41 44 45 52 4c 45 4e 20 20 20 20 31 20 20 20  EADERLEN    1   
27f10 2f 2a 20 63 6f 6e 63 68 20 66 69 6c 65 20 68 65  /* conch file he
27f20 61 64 65 72 20 6c 65 6e 67 74 68 20 2a 2f 0a 23  ader length */.#
27f30 64 65 66 69 6e 65 20 50 52 4f 58 59 5f 50 41 54  define PROXY_PAT
27f40 48 49 4e 44 45 58 20 20 20 20 28 50 52 4f 58 59  HINDEX    (PROXY
27f50 5f 48 45 41 44 45 52 4c 45 4e 2b 50 52 4f 58 59  _HEADERLEN+PROXY
27f60 5f 48 4f 53 54 49 44 4c 45 4e 29 0a 23 64 65 66  _HOSTIDLEN).#def
27f70 69 6e 65 20 50 52 4f 58 59 5f 4d 41 58 43 4f 4e  ine PROXY_MAXCON
27f80 43 48 4c 45 4e 20 20 28 50 52 4f 58 59 5f 48 45  CHLEN  (PROXY_HE
27f90 41 44 45 52 4c 45 4e 2b 50 52 4f 58 59 5f 48 4f  ADERLEN+PROXY_HO
27fa0 53 54 49 44 4c 45 4e 2b 4d 41 58 50 41 54 48 4c  STIDLEN+MAXPATHL
27fb0 45 4e 29 0a 0a 2f 2a 20 0a 2a 2a 20 54 61 6b 65  EN)../* .** Take
27fc0 73 20 61 6e 20 6f 70 65 6e 20 63 6f 6e 63 68 20  s an open conch 
27fd0 66 69 6c 65 2c 20 63 6f 70 69 65 73 20 74 68 65  file, copies the
27fe0 20 63 6f 6e 74 65 6e 74 73 20 74 6f 20 61 20 6e   contents to a n
27ff0 65 77 20 70 61 74 68 20 61 6e 64 20 74 68 65 6e  ew path and then
28000 20 6d 6f 76 65 73 20 0a 2a 2a 20 69 74 20 62 61   moves .** it ba
28010 63 6b 2e 20 20 54 68 65 20 6e 65 77 6c 79 20 63  ck.  The newly c
28020 72 65 61 74 65 64 20 66 69 6c 65 27 73 20 66 69  reated file's fi
28030 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 69 73  le descriptor is
28040 20 61 73 73 69 67 6e 65 64 20 74 6f 20 74 68 65   assigned to the
28050 0a 2a 2a 20 63 6f 6e 63 68 20 66 69 6c 65 20 73  .** conch file s
28060 74 72 75 63 74 75 72 65 20 61 6e 64 20 66 69 6e  tructure and fin
28070 61 6c 6c 79 20 74 68 65 20 6f 72 69 67 69 6e 61  ally the origina
28080 6c 20 63 6f 6e 63 68 20 66 69 6c 65 20 64 65 73  l conch file des
28090 63 72 69 70 74 6f 72 20 69 73 20 0a 2a 2a 20 63  criptor is .** c
280a0 6c 6f 73 65 64 2e 20 20 52 65 74 75 72 6e 73 20  losed.  Returns 
280b0 7a 65 72 6f 20 69 66 20 73 75 63 63 65 73 73 66  zero if successf
280c0 75 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ul..*/.static in
280d0 74 20 70 72 6f 78 79 42 72 65 61 6b 43 6f 6e 63  t proxyBreakConc
280e0 68 4c 6f 63 6b 28 75 6e 69 78 46 69 6c 65 20 2a  hLock(unixFile *
280f0 70 46 69 6c 65 2c 20 75 75 69 64 5f 74 20 6d 79  pFile, uuid_t my
28100 48 6f 73 74 49 44 29 7b 0a 20 20 70 72 6f 78 79  HostID){.  proxy
28110 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a  LockingContext *
28120 70 43 74 78 20 3d 20 28 70 72 6f 78 79 4c 6f 63  pCtx = (proxyLoc
28130 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 29 70 46  kingContext *)pF
28140 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74  ile->lockingCont
28150 65 78 74 3b 20 0a 20 20 75 6e 69 78 46 69 6c 65  ext; .  unixFile
28160 20 2a 63 6f 6e 63 68 46 69 6c 65 20 3d 20 70 43   *conchFile = pC
28170 74 78 2d 3e 63 6f 6e 63 68 46 69 6c 65 3b 0a 20  tx->conchFile;. 
28180 20 63 68 61 72 20 74 50 61 74 68 5b 4d 41 58 50   char tPath[MAXP
28190 41 54 48 4c 45 4e 5d 3b 0a 20 20 63 68 61 72 20  ATHLEN];.  char 
281a0 62 75 66 5b 50 52 4f 58 59 5f 4d 41 58 43 4f 4e  buf[PROXY_MAXCON
281b0 43 48 4c 45 4e 5d 3b 0a 20 20 63 68 61 72 20 2a  CHLEN];.  char *
281c0 63 50 61 74 68 20 3d 20 70 43 74 78 2d 3e 63 6f  cPath = pCtx->co
281d0 6e 63 68 46 69 6c 65 50 61 74 68 3b 0a 20 20 73  nchFilePath;.  s
281e0 69 7a 65 5f 74 20 72 65 61 64 4c 65 6e 20 3d 20  ize_t readLen = 
281f0 30 3b 0a 20 20 73 69 7a 65 5f 74 20 70 61 74 68  0;.  size_t path
28200 4c 65 6e 20 3d 20 30 3b 0a 20 20 63 68 61 72 20  Len = 0;.  char 
28210 65 72 72 6d 73 67 5b 36 34 5d 20 3d 20 22 22 3b  errmsg[64] = "";
28220 0a 20 20 69 6e 74 20 66 64 20 3d 20 2d 31 3b 0a  .  int fd = -1;.
28230 20 20 69 6e 74 20 72 63 20 3d 20 2d 31 3b 0a 0a    int rc = -1;..
28240 20 20 2f 2a 20 63 72 65 61 74 65 20 61 20 6e 65    /* create a ne
28250 77 20 70 61 74 68 20 62 79 20 72 65 70 6c 61 63  w path by replac
28260 65 20 74 68 65 20 74 72 61 69 6c 69 6e 67 20 27  e the trailing '
28270 2d 63 6f 6e 63 68 27 20 77 69 74 68 20 27 2d 62  -conch' with '-b
28280 72 65 61 6b 27 20 2a 2f 0a 20 20 70 61 74 68 4c  reak' */.  pathL
28290 65 6e 20 3d 20 73 74 72 6c 63 70 79 28 74 50 61  en = strlcpy(tPa
282a0 74 68 2c 20 63 50 61 74 68 2c 20 4d 41 58 50 41  th, cPath, MAXPA
282b0 54 48 4c 45 4e 29 3b 0a 20 20 69 66 28 20 70 61  THLEN);.  if( pa
282c0 74 68 4c 65 6e 3e 4d 41 58 50 41 54 48 4c 45 4e  thLen>MAXPATHLEN
282d0 20 7c 7c 20 70 61 74 68 4c 65 6e 3c 36 20 7c 7c   || pathLen<6 ||
282e0 20 0a 20 20 20 20 20 28 73 74 72 6c 63 70 79 28   .     (strlcpy(
282f0 26 74 50 61 74 68 5b 70 61 74 68 4c 65 6e 2d 35  &tPath[pathLen-5
28300 5d 2c 20 22 62 72 65 61 6b 22 2c 20 36 29 20 21  ], "break", 6) !
28310 3d 20 35 29 20 29 7b 0a 20 20 20 20 73 70 72 69  = 5) ){.    spri
28320 6e 74 66 28 65 72 72 6d 73 67 2c 20 22 70 61 74  ntf(errmsg, "pat
28330 68 20 65 72 72 6f 72 20 28 6c 65 6e 20 25 64 29  h error (len %d)
28340 22 2c 20 28 69 6e 74 29 70 61 74 68 4c 65 6e 29  ", (int)pathLen)
28350 3b 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 62  ;.    goto end_b
28360 72 65 61 6b 6c 6f 63 6b 3b 0a 20 20 7d 0a 20 20  reaklock;.  }.  
28370 2f 2a 20 72 65 61 64 20 74 68 65 20 63 6f 6e 63  /* read the conc
28380 68 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a 20 20 72  h content */.  r
28390 65 61 64 4c 65 6e 20 3d 20 70 72 65 61 64 28 63  eadLen = pread(c
283a0 6f 6e 63 68 46 69 6c 65 2d 3e 68 2c 20 62 75 66  onchFile->h, buf
283b0 2c 20 50 52 4f 58 59 5f 4d 41 58 43 4f 4e 43 48  , PROXY_MAXCONCH
283c0 4c 45 4e 2c 20 30 29 3b 0a 20 20 69 66 28 20 72  LEN, 0);.  if( r
283d0 65 61 64 4c 65 6e 3c 50 52 4f 58 59 5f 50 41 54  eadLen<PROXY_PAT
283e0 48 49 4e 44 45 58 20 29 7b 0a 20 20 20 20 73 70  HINDEX ){.    sp
283f0 72 69 6e 74 66 28 65 72 72 6d 73 67 2c 20 22 72  rintf(errmsg, "r
28400 65 61 64 20 65 72 72 6f 72 20 28 6c 65 6e 20 25  ead error (len %
28410 64 29 22 2c 20 28 69 6e 74 29 72 65 61 64 4c 65  d)", (int)readLe
28420 6e 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64  n);.    goto end
28430 5f 62 72 65 61 6b 6c 6f 63 6b 3b 0a 20 20 7d 0a  _breaklock;.  }.
28440 20 20 2f 2a 20 77 72 69 74 65 20 69 74 20 6f 75    /* write it ou
28450 74 20 74 6f 20 74 68 65 20 74 65 6d 70 6f 72 61  t to the tempora
28460 72 79 20 62 72 65 61 6b 20 66 69 6c 65 20 2a 2f  ry break file */
28470 0a 20 20 66 64 20 3d 20 6f 70 65 6e 28 74 50 61  .  fd = open(tPa
28480 74 68 2c 20 28 4f 5f 52 44 57 52 7c 4f 5f 43 52  th, (O_RDWR|O_CR
28490 45 41 54 7c 4f 5f 45 58 43 4c 29 2c 20 53 51 4c  EAT|O_EXCL), SQL
284a0 49 54 45 5f 44 45 46 41 55 4c 54 5f 46 49 4c 45  ITE_DEFAULT_FILE
284b0 5f 50 45 52 4d 49 53 53 49 4f 4e 53 29 3b 0a 20  _PERMISSIONS);. 
284c0 20 69 66 28 20 66 64 3c 30 20 29 7b 0a 20 20 20   if( fd<0 ){.   
284d0 20 73 70 72 69 6e 74 66 28 65 72 72 6d 73 67 2c   sprintf(errmsg,
284e0 20 22 63 72 65 61 74 65 20 66 61 69 6c 65 64 20   "create failed 
284f0 28 25 64 29 22 2c 20 65 72 72 6e 6f 29 3b 0a 20  (%d)", errno);. 
28500 20 20 20 67 6f 74 6f 20 65 6e 64 5f 62 72 65 61     goto end_brea
28510 6b 6c 6f 63 6b 3b 0a 20 20 7d 0a 20 20 69 66 28  klock;.  }.  if(
28520 20 70 77 72 69 74 65 28 66 64 2c 20 62 75 66 2c   pwrite(fd, buf,
28530 20 72 65 61 64 4c 65 6e 2c 20 30 29 20 21 3d 20   readLen, 0) != 
28540 72 65 61 64 4c 65 6e 20 29 7b 0a 20 20 20 20 73  readLen ){.    s
28550 70 72 69 6e 74 66 28 65 72 72 6d 73 67 2c 20 22  printf(errmsg, "
28560 77 72 69 74 65 20 66 61 69 6c 65 64 20 28 25 64  write failed (%d
28570 29 22 2c 20 65 72 72 6e 6f 29 3b 0a 20 20 20 20  )", errno);.    
28580 67 6f 74 6f 20 65 6e 64 5f 62 72 65 61 6b 6c 6f  goto end_breaklo
28590 63 6b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 65  ck;.  }.  if( re
285a0 6e 61 6d 65 28 74 50 61 74 68 2c 20 63 50 61 74  name(tPath, cPat
285b0 68 29 20 29 7b 0a 20 20 20 20 73 70 72 69 6e 74  h) ){.    sprint
285c0 66 28 65 72 72 6d 73 67 2c 20 22 72 65 6e 61 6d  f(errmsg, "renam
285d0 65 20 66 61 69 6c 65 64 20 28 25 64 29 22 2c 20  e failed (%d)", 
285e0 65 72 72 6e 6f 29 3b 0a 20 20 20 20 67 6f 74 6f  errno);.    goto
285f0 20 65 6e 64 5f 62 72 65 61 6b 6c 6f 63 6b 3b 0a   end_breaklock;.
28600 20 20 7d 0a 20 20 72 63 20 3d 20 30 3b 0a 20 20    }.  rc = 0;.  
28610 66 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20  fprintf(stderr, 
28620 22 62 72 6f 6b 65 20 73 74 61 6c 65 20 6c 6f 63  "broke stale loc
28630 6b 20 6f 6e 20 25 73 5c 6e 22 2c 20 63 50 61 74  k on %s\n", cPat
28640 68 29 3b 0a 20 20 63 6c 6f 73 65 28 63 6f 6e 63  h);.  close(conc
28650 68 46 69 6c 65 2d 3e 68 29 3b 0a 20 20 63 6f 6e  hFile->h);.  con
28660 63 68 46 69 6c 65 2d 3e 68 20 3d 20 66 64 3b 0a  chFile->h = fd;.
28670 20 20 63 6f 6e 63 68 46 69 6c 65 2d 3e 6f 70 65    conchFile->ope
28680 6e 46 6c 61 67 73 20 3d 20 4f 5f 52 44 57 52 20  nFlags = O_RDWR 
28690 7c 20 4f 5f 43 52 45 41 54 3b 0a 0a 65 6e 64 5f  | O_CREAT;..end_
286a0 62 72 65 61 6b 6c 6f 63 6b 3a 0a 20 20 69 66 28  breaklock:.  if(
286b0 20 72 63 20 29 7b 0a 20 20 20 20 69 66 28 20 66   rc ){.    if( f
286c0 64 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 75 6e  d>=0 ){.      un
286d0 6c 69 6e 6b 28 74 50 61 74 68 29 3b 0a 20 20 20  link(tPath);.   
286e0 20 20 20 63 6c 6f 73 65 28 66 64 29 3b 0a 20 20     close(fd);.  
286f0 20 20 7d 0a 20 20 20 20 66 70 72 69 6e 74 66 28    }.    fprintf(
28700 73 74 64 65 72 72 2c 20 22 66 61 69 6c 65 64 20  stderr, "failed 
28710 74 6f 20 62 72 65 61 6b 20 73 74 61 6c 65 20 6c  to break stale l
28720 6f 63 6b 20 6f 6e 20 25 73 2c 20 25 73 5c 6e 22  ock on %s, %s\n"
28730 2c 20 63 50 61 74 68 2c 20 65 72 72 6d 73 67 29  , cPath, errmsg)
28740 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
28750 63 3b 0a 7d 0a 0a 2f 2a 20 54 61 6b 65 20 74 68  c;.}../* Take th
28760 65 20 72 65 71 75 65 73 74 65 64 20 6c 6f 63 6b  e requested lock
28770 20 6f 6e 20 74 68 65 20 63 6f 6e 63 68 20 66 69   on the conch fi
28780 6c 65 20 61 6e 64 20 62 72 65 61 6b 20 61 20 73  le and break a s
28790 74 61 6c 65 20 6c 6f 63 6b 20 69 66 20 74 68 65  tale lock if the
287a0 20 0a 2a 2a 20 68 6f 73 74 20 69 64 20 6d 61 74   .** host id mat
287b0 63 68 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ches..*/.static 
287c0 69 6e 74 20 70 72 6f 78 79 43 6f 6e 63 68 4c 6f  int proxyConchLo
287d0 63 6b 28 75 6e 69 78 46 69 6c 65 20 2a 70 46 69  ck(unixFile *pFi
287e0 6c 65 2c 20 75 75 69 64 5f 74 20 6d 79 48 6f 73  le, uuid_t myHos
287f0 74 49 44 2c 20 69 6e 74 20 6c 6f 63 6b 54 79 70  tID, int lockTyp
28800 65 29 7b 0a 20 20 70 72 6f 78 79 4c 6f 63 6b 69  e){.  proxyLocki
28810 6e 67 43 6f 6e 74 65 78 74 20 2a 70 43 74 78 20  ngContext *pCtx 
28820 3d 20 28 70 72 6f 78 79 4c 6f 63 6b 69 6e 67 43  = (proxyLockingC
28830 6f 6e 74 65 78 74 20 2a 29 70 46 69 6c 65 2d 3e  ontext *)pFile->
28840 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 20  lockingContext; 
28850 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 63 6f 6e  .  unixFile *con
28860 63 68 46 69 6c 65 20 3d 20 70 43 74 78 2d 3e 63  chFile = pCtx->c
28870 6f 6e 63 68 46 69 6c 65 3b 0a 20 20 69 6e 74 20  onchFile;.  int 
28880 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
28890 20 20 69 6e 74 20 6e 54 72 69 65 73 20 3d 20 30    int nTries = 0
288a0 3b 0a 20 20 73 74 72 75 63 74 20 74 69 6d 65 73  ;.  struct times
288b0 70 65 63 20 63 6f 6e 63 68 4d 6f 64 54 69 6d 65  pec conchModTime
288c0 3b 0a 20 20 0a 20 20 64 6f 20 7b 0a 20 20 20 20  ;.  .  do {.    
288d0 72 63 20 3d 20 63 6f 6e 63 68 46 69 6c 65 2d 3e  rc = conchFile->
288e0 70 4d 65 74 68 6f 64 2d 3e 78 4c 6f 63 6b 28 28  pMethod->xLock((
288f0 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29 63 6f  sqlite3_file*)co
28900 6e 63 68 46 69 6c 65 2c 20 6c 6f 63 6b 54 79 70  nchFile, lockTyp
28910 65 29 3b 0a 20 20 20 20 6e 54 72 69 65 73 20 2b  e);.    nTries +
28920 2b 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  +;.    if( rc==S
28930 51 4c 49 54 45 5f 42 55 53 59 20 29 7b 0a 20 20  QLITE_BUSY ){.  
28940 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 6c 6f      /* If the lo
28950 63 6b 20 66 61 69 6c 65 64 20 28 62 75 73 79 29  ck failed (busy)
28960 3a 0a 20 20 20 20 20 20 20 2a 20 31 73 74 20 74  :.       * 1st t
28970 72 79 3a 20 67 65 74 20 74 68 65 20 6d 6f 64 20  ry: get the mod 
28980 74 69 6d 65 20 6f 66 20 74 68 65 20 63 6f 6e 63  time of the conc
28990 68 2c 20 77 61 69 74 20 30 2e 35 73 20 61 6e 64  h, wait 0.5s and
289a0 20 74 72 79 20 61 67 61 69 6e 2e 20 0a 20 20 20   try again. .   
289b0 20 20 20 20 2a 20 32 6e 64 20 74 72 79 3a 20 66      * 2nd try: f
289c0 61 69 6c 20 69 66 20 74 68 65 20 6d 6f 64 20 74  ail if the mod t
289d0 69 6d 65 20 63 68 61 6e 67 65 64 20 6f 72 20 68  ime changed or h
289e0 6f 73 74 20 69 64 20 69 73 20 64 69 66 66 65 72  ost id is differ
289f0 65 6e 74 2c 20 77 61 69 74 20 0a 20 20 20 20 20  ent, wait .     
28a00 20 20 2a 20 20 20 20 20 20 20 20 20 20 20 31 30    *           10
28a10 20 73 65 63 20 61 6e 64 20 74 72 79 20 61 67 61   sec and try aga
28a20 69 6e 0a 20 20 20 20 20 20 20 2a 20 33 72 64 20  in.       * 3rd 
28a30 74 72 79 3a 20 62 72 65 61 6b 20 74 68 65 20 6c  try: break the l
28a40 6f 63 6b 20 75 6e 6c 65 73 73 20 74 68 65 20 6d  ock unless the m
28a50 6f 64 20 74 69 6d 65 20 68 61 73 20 63 68 61 6e  od time has chan
28a60 67 65 64 2e 0a 20 20 20 20 20 20 20 2a 2f 0a 20  ged..       */. 
28a70 20 20 20 20 20 73 74 72 75 63 74 20 73 74 61 74       struct stat
28a80 20 62 75 66 3b 0a 20 20 20 20 20 20 69 66 28 20   buf;.      if( 
28a90 66 73 74 61 74 28 63 6f 6e 63 68 46 69 6c 65 2d  fstat(conchFile-
28aa0 3e 68 2c 20 26 62 75 66 29 20 29 7b 0a 20 20 20  >h, &buf) ){.   
28ab0 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74       pFile->last
28ac0 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20  Errno = errno;. 
28ad0 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51         return SQ
28ae0 4c 49 54 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b 3b  LITE_IOERR_LOCK;
28af0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 0a  .      }.      .
28b00 20 20 20 20 20 20 69 66 28 20 6e 54 72 69 65 73        if( nTries
28b10 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 20 20 63  ==1 ){.        c
28b20 6f 6e 63 68 4d 6f 64 54 69 6d 65 20 3d 20 62 75  onchModTime = bu
28b30 66 2e 73 74 5f 6d 74 69 6d 65 73 70 65 63 3b 0a  f.st_mtimespec;.
28b40 20 20 20 20 20 20 20 20 75 73 6c 65 65 70 28 35          usleep(5
28b50 30 30 30 30 30 29 3b 20 2f 2a 20 77 61 69 74 20  00000); /* wait 
28b60 30 2e 35 20 73 65 63 20 61 6e 64 20 74 72 79 20  0.5 sec and try 
28b70 74 68 65 20 6c 6f 63 6b 20 61 67 61 69 6e 2a 2f  the lock again*/
28b80 0a 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75  .        continu
28b90 65 3b 20 20 0a 20 20 20 20 20 20 7d 0a 0a 20 20  e;  .      }..  
28ba0 20 20 20 20 61 73 73 65 72 74 28 20 6e 54 72 69      assert( nTri
28bb0 65 73 3e 31 20 29 3b 0a 20 20 20 20 20 20 69 66  es>1 );.      if
28bc0 28 20 63 6f 6e 63 68 4d 6f 64 54 69 6d 65 2e 74  ( conchModTime.t
28bd0 76 5f 73 65 63 20 21 3d 20 62 75 66 2e 73 74 5f  v_sec != buf.st_
28be0 6d 74 69 6d 65 73 70 65 63 2e 74 76 5f 73 65 63  mtimespec.tv_sec
28bf0 20 7c 7c 20 0a 20 20 20 20 20 20 20 20 20 63 6f   || .         co
28c00 6e 63 68 4d 6f 64 54 69 6d 65 2e 74 76 5f 6e 73  nchModTime.tv_ns
28c10 65 63 20 21 3d 20 62 75 66 2e 73 74 5f 6d 74 69  ec != buf.st_mti
28c20 6d 65 73 70 65 63 2e 74 76 5f 6e 73 65 63 20 29  mespec.tv_nsec )
28c30 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  {.        return
28c40 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20   SQLITE_BUSY;.  
28c50 20 20 20 20 7d 0a 20 20 20 20 20 20 0a 20 20 20      }.      .   
28c60 20 20 20 69 66 28 20 6e 54 72 69 65 73 3d 3d 32     if( nTries==2
28c70 20 29 7b 20 20 0a 20 20 20 20 20 20 20 20 63 68   ){  .        ch
28c80 61 72 20 74 42 75 66 5b 50 52 4f 58 59 5f 4d 41  ar tBuf[PROXY_MA
28c90 58 43 4f 4e 43 48 4c 45 4e 5d 3b 0a 20 20 20 20  XCONCHLEN];.    
28ca0 20 20 20 20 69 6e 74 20 6c 65 6e 20 3d 20 70 72      int len = pr
28cb0 65 61 64 28 63 6f 6e 63 68 46 69 6c 65 2d 3e 68  ead(conchFile->h
28cc0 2c 20 74 42 75 66 2c 20 50 52 4f 58 59 5f 4d 41  , tBuf, PROXY_MA
28cd0 58 43 4f 4e 43 48 4c 45 4e 2c 20 30 29 3b 0a 20  XCONCHLEN, 0);. 
28ce0 20 20 20 20 20 20 20 69 66 28 20 6c 65 6e 3c 30         if( len<0
28cf0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 46   ){.          pF
28d00 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d  ile->lastErrno =
28d10 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20 20 20   errno;.        
28d20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
28d30 49 4f 45 52 52 5f 4c 4f 43 4b 3b 0a 20 20 20 20  IOERR_LOCK;.    
28d40 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66      }.        if
28d50 28 20 6c 65 6e 3e 50 52 4f 58 59 5f 50 41 54 48  ( len>PROXY_PATH
28d60 49 4e 44 45 58 20 26 26 20 74 42 75 66 5b 30 5d  INDEX && tBuf[0]
28d70 3d 3d 28 63 68 61 72 29 50 52 4f 58 59 5f 43 4f  ==(char)PROXY_CO
28d80 4e 43 48 56 45 52 53 49 4f 4e 29 7b 0a 20 20 20  NCHVERSION){.   
28d90 20 20 20 20 20 20 20 2f 2a 20 64 6f 6e 27 74 20         /* don't 
28da0 62 72 65 61 6b 20 74 68 65 20 6c 6f 63 6b 20 69  break the lock i
28db0 66 20 74 68 65 20 68 6f 73 74 20 69 64 20 64 6f  f the host id do
28dc0 65 73 6e 27 74 20 6d 61 74 63 68 20 2a 2f 0a 20  esn't match */. 
28dd0 20 20 20 20 20 20 20 20 20 69 66 28 20 30 21 3d           if( 0!=
28de0 6d 65 6d 63 6d 70 28 26 74 42 75 66 5b 50 52 4f  memcmp(&tBuf[PRO
28df0 58 59 5f 48 45 41 44 45 52 4c 45 4e 5d 2c 20 6d  XY_HEADERLEN], m
28e00 79 48 6f 73 74 49 44 2c 20 50 52 4f 58 59 5f 48  yHostID, PROXY_H
28e10 4f 53 54 49 44 4c 45 4e 29 20 29 7b 0a 20 20 20  OSTIDLEN) ){.   
28e20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
28e30 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20  SQLITE_BUSY;.   
28e40 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
28e50 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
28e60 20 20 2f 2a 20 64 6f 6e 27 74 20 62 72 65 61 6b    /* don't break
28e70 20 74 68 65 20 6c 6f 63 6b 20 6f 6e 20 73 68 6f   the lock on sho
28e80 72 74 20 72 65 61 64 20 6f 72 20 61 20 76 65 72  rt read or a ver
28e90 73 69 6f 6e 20 6d 69 73 6d 61 74 63 68 20 2a 2f  sion mismatch */
28ea0 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72  .          retur
28eb0 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20  n SQLITE_BUSY;. 
28ec0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
28ed0 20 75 73 6c 65 65 70 28 31 30 30 30 30 30 30 30   usleep(10000000
28ee0 29 3b 20 2f 2a 20 77 61 69 74 20 31 30 20 73 65  ); /* wait 10 se
28ef0 63 20 61 6e 64 20 74 72 79 20 74 68 65 20 6c 6f  c and try the lo
28f00 63 6b 20 61 67 61 69 6e 20 2a 2f 0a 20 20 20 20  ck again */.    
28f10 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 20 0a 20      continue; . 
28f20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 0a 20 20       }.      .  
28f30 20 20 20 20 61 73 73 65 72 74 28 20 6e 54 72 69      assert( nTri
28f40 65 73 3d 3d 33 20 29 3b 0a 20 20 20 20 20 20 69  es==3 );.      i
28f50 66 28 20 30 3d 3d 70 72 6f 78 79 42 72 65 61 6b  f( 0==proxyBreak
28f60 43 6f 6e 63 68 4c 6f 63 6b 28 70 46 69 6c 65 2c  ConchLock(pFile,
28f70 20 6d 79 48 6f 73 74 49 44 29 20 29 7b 0a 20 20   myHostID) ){.  
28f80 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
28f90 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 69 66  E_OK;.        if
28fa0 28 20 6c 6f 63 6b 54 79 70 65 3d 3d 45 58 43 4c  ( lockType==EXCL
28fb0 55 53 49 56 45 5f 4c 4f 43 4b 20 29 7b 0a 20 20  USIVE_LOCK ){.  
28fc0 20 20 20 20 20 20 20 20 72 63 20 3d 20 63 6f 6e          rc = con
28fd0 63 68 46 69 6c 65 2d 3e 70 4d 65 74 68 6f 64 2d  chFile->pMethod-
28fe0 3e 78 4c 6f 63 6b 28 28 73 71 6c 69 74 65 33 5f  >xLock((sqlite3_
28ff0 66 69 6c 65 2a 29 63 6f 6e 63 68 46 69 6c 65 2c  file*)conchFile,
29000 20 53 48 41 52 45 44 5f 4c 4f 43 4b 29 3b 20 20   SHARED_LOCK);  
29010 20 20 20 20 20 20 20 20 0a 20 20 20 20 20 20 20          .       
29020 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 21   }.        if( !
29030 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  rc ){.          
29040 72 63 20 3d 20 63 6f 6e 63 68 46 69 6c 65 2d 3e  rc = conchFile->
29050 70 4d 65 74 68 6f 64 2d 3e 78 4c 6f 63 6b 28 28  pMethod->xLock((
29060 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29 63 6f  sqlite3_file*)co
29070 6e 63 68 46 69 6c 65 2c 20 6c 6f 63 6b 54 79 70  nchFile, lockTyp
29080 65 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  e);.        }.  
29090 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 20      }.    }.  } 
290a0 77 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54  while( rc==SQLIT
290b0 45 5f 42 55 53 59 20 26 26 20 6e 54 72 69 65 73  E_BUSY && nTries
290c0 3c 33 20 29 3b 0a 20 20 0a 20 20 72 65 74 75 72  <3 );.  .  retur
290d0 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 54 61 6b 65  n rc;.}../* Take
290e0 73 20 74 68 65 20 63 6f 6e 63 68 20 62 79 20 74  s the conch by t
290f0 61 6b 69 6e 67 20 61 20 73 68 61 72 65 64 20 6c  aking a shared l
29100 6f 63 6b 20 61 6e 64 20 72 65 61 64 20 74 68 65  ock and read the
29110 20 63 6f 6e 74 65 6e 74 73 20 63 6f 6e 63 68 2c   contents conch,
29120 20 69 66 20 0a 2a 2a 20 6c 6f 63 6b 50 61 74 68   if .** lockPath
29130 20 69 73 20 6e 6f 6e 2d 4e 55 4c 4c 2c 20 74 68   is non-NULL, th
29140 65 20 68 6f 73 74 20 49 44 20 61 6e 64 20 6c 6f  e host ID and lo
29150 63 6b 20 66 69 6c 65 20 70 61 74 68 20 6d 75 73  ck file path mus
29160 74 20 6d 61 74 63 68 2e 20 20 41 20 4e 55 4c 4c  t match.  A NULL
29170 20 0a 2a 2a 20 6c 6f 63 6b 50 61 74 68 20 6d 65   .** lockPath me
29180 61 6e 73 20 74 68 61 74 20 74 68 65 20 6c 6f 63  ans that the loc
29190 6b 50 61 74 68 20 69 6e 20 74 68 65 20 63 6f 6e  kPath in the con
291a0 63 68 20 66 69 6c 65 20 77 69 6c 6c 20 62 65 20  ch file will be 
291b0 75 73 65 64 20 69 66 20 74 68 65 20 0a 2a 2a 20  used if the .** 
291c0 68 6f 73 74 20 49 44 73 20 6d 61 74 63 68 2c 20  host IDs match, 
291d0 6f 72 20 61 20 6e 65 77 20 6c 6f 63 6b 20 70 61  or a new lock pa
291e0 74 68 20 77 69 6c 6c 20 62 65 20 67 65 6e 65 72  th will be gener
291f0 61 74 65 64 20 61 75 74 6f 6d 61 74 69 63 61 6c  ated automatical
29200 6c 79 20 0a 2a 2a 20 61 6e 64 20 77 72 69 74 74  ly .** and writt
29210 65 6e 20 74 6f 20 74 68 65 20 63 6f 6e 63 68 20  en to the conch 
29220 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  file..*/.static 
29230 69 6e 74 20 70 72 6f 78 79 54 61 6b 65 43 6f 6e  int proxyTakeCon
29240 63 68 28 75 6e 69 78 46 69 6c 65 20 2a 70 46 69  ch(unixFile *pFi
29250 6c 65 29 7b 0a 20 20 70 72 6f 78 79 4c 6f 63 6b  le){.  proxyLock
29260 69 6e 67 43 6f 6e 74 65 78 74 20 2a 70 43 74 78  ingContext *pCtx
29270 20 3d 20 28 70 72 6f 78 79 4c 6f 63 6b 69 6e 67   = (proxyLocking
29280 43 6f 6e 74 65 78 74 20 2a 29 70 46 69 6c 65 2d  Context *)pFile-
29290 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b  >lockingContext;
292a0 20 0a 20 20 0a 20 20 69 66 28 20 70 43 74 78 2d   .  .  if( pCtx-
292b0 3e 63 6f 6e 63 68 48 65 6c 64 21 3d 30 20 29 7b  >conchHeld!=0 ){
292c0 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
292d0 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a  TE_OK;.  }else{.
292e0 20 20 20 20 75 6e 69 78 46 69 6c 65 20 2a 63 6f      unixFile *co
292f0 6e 63 68 46 69 6c 65 20 3d 20 70 43 74 78 2d 3e  nchFile = pCtx->
29300 63 6f 6e 63 68 46 69 6c 65 3b 0a 20 20 20 20 75  conchFile;.    u
29310 75 69 64 5f 74 20 6d 79 48 6f 73 74 49 44 3b 0a  uid_t myHostID;.
29320 20 20 20 20 69 6e 74 20 70 45 72 72 6f 72 20 3d      int pError =
29330 20 30 3b 0a 20 20 20 20 63 68 61 72 20 72 65 61   0;.    char rea
29340 64 42 75 66 5b 50 52 4f 58 59 5f 4d 41 58 43 4f  dBuf[PROXY_MAXCO
29350 4e 43 48 4c 45 4e 5d 3b 0a 20 20 20 20 63 68 61  NCHLEN];.    cha
29360 72 20 6c 6f 63 6b 50 61 74 68 5b 4d 41 58 50 41  r lockPath[MAXPA
29370 54 48 4c 45 4e 5d 3b 0a 20 20 20 20 63 68 61 72  THLEN];.    char
29380 20 2a 74 65 6d 70 4c 6f 63 6b 50 61 74 68 20 3d   *tempLockPath =
29390 20 4e 55 4c 4c 3b 0a 20 20 20 20 69 6e 74 20 72   NULL;.    int r
293a0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
293b0 20 20 20 69 6e 74 20 63 72 65 61 74 65 43 6f 6e     int createCon
293c0 63 68 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20  ch = 0;.    int 
293d0 68 6f 73 74 49 64 4d 61 74 63 68 20 3d 20 30 3b  hostIdMatch = 0;
293e0 0a 20 20 20 20 69 6e 74 20 72 65 61 64 4c 65 6e  .    int readLen
293f0 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 74 72   = 0;.    int tr
29400 79 4f 6c 64 4c 6f 63 6b 50 61 74 68 20 3d 20 30  yOldLockPath = 0
29410 3b 0a 20 20 20 20 69 6e 74 20 66 6f 72 63 65 4e  ;.    int forceN
29420 65 77 4c 6f 63 6b 50 61 74 68 20 3d 20 30 3b 0a  ewLockPath = 0;.
29430 20 20 20 20 0a 20 20 20 20 4f 53 54 52 41 43 45      .    OSTRACE
29440 34 28 22 54 41 4b 45 43 4f 4e 43 48 20 20 25 64  4("TAKECONCH  %d
29450 20 66 6f 72 20 25 73 20 70 69 64 3d 25 64 5c 6e   for %s pid=%d\n
29460 22 2c 20 63 6f 6e 63 68 46 69 6c 65 2d 3e 68 2c  ", conchFile->h,
29470 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 28 70  .             (p
29480 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 50 61  Ctx->lockProxyPa
29490 74 68 20 3f 20 70 43 74 78 2d 3e 6c 6f 63 6b 50  th ? pCtx->lockP
294a0 72 6f 78 79 50 61 74 68 20 3a 20 22 3a 61 75 74  roxyPath : ":aut
294b0 6f 3a 22 29 2c 20 67 65 74 70 69 64 28 29 29 3b  o:"), getpid());
294c0 0a 0a 20 20 20 20 72 63 20 3d 20 70 72 6f 78 79  ..    rc = proxy
294d0 47 65 74 48 6f 73 74 49 44 28 6d 79 48 6f 73 74  GetHostID(myHost
294e0 49 44 2c 20 26 70 45 72 72 6f 72 29 3b 0a 20 20  ID, &pError);.  
294f0 20 20 69 66 28 20 28 72 63 26 30 78 66 66 29 3d    if( (rc&0xff)=
29500 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 20 29 7b  =SQLITE_IOERR ){
29510 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61  .      pFile->la
29520 73 74 45 72 72 6e 6f 20 3d 20 70 45 72 72 6f 72  stErrno = pError
29530 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64  ;.      goto end
29540 5f 74 61 6b 65 63 6f 6e 63 68 3b 0a 20 20 20 20  _takeconch;.    
29550 7d 0a 20 20 20 20 72 63 20 3d 20 70 72 6f 78 79  }.    rc = proxy
29560 43 6f 6e 63 68 4c 6f 63 6b 28 70 46 69 6c 65 2c  ConchLock(pFile,
29570 20 6d 79 48 6f 73 74 49 44 2c 20 53 48 41 52 45   myHostID, SHARE
29580 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 69 66 28  D_LOCK);.    if(
29590 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
295a0 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64  {.      goto end
295b0 5f 74 61 6b 65 63 6f 6e 63 68 3b 0a 20 20 20 20  _takeconch;.    
295c0 7d 0a 20 20 20 20 2f 2a 20 72 65 61 64 20 74 68  }.    /* read th
295d0 65 20 65 78 69 73 74 69 6e 67 20 63 6f 6e 63 68  e existing conch
295e0 20 66 69 6c 65 20 2a 2f 0a 20 20 20 20 72 65 61   file */.    rea
295f0 64 4c 65 6e 20 3d 20 73 65 65 6b 41 6e 64 52 65  dLen = seekAndRe
29600 61 64 28 28 75 6e 69 78 46 69 6c 65 2a 29 63 6f  ad((unixFile*)co
29610 6e 63 68 46 69 6c 65 2c 20 30 2c 20 72 65 61 64  nchFile, 0, read
29620 42 75 66 2c 20 50 52 4f 58 59 5f 4d 41 58 43 4f  Buf, PROXY_MAXCO
29630 4e 43 48 4c 45 4e 29 3b 0a 20 20 20 20 69 66 28  NCHLEN);.    if(
29640 20 72 65 61 64 4c 65 6e 3c 30 20 29 7b 0a 20 20   readLen<0 ){.  
29650 20 20 20 20 2f 2a 20 49 2f 4f 20 65 72 72 6f 72      /* I/O error
29660 3a 20 6c 61 73 74 45 72 72 6e 6f 20 73 65 74 20  : lastErrno set 
29670 62 79 20 73 65 65 6b 41 6e 64 52 65 61 64 20 2a  by seekAndRead *
29680 2f 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c  /.      pFile->l
29690 61 73 74 45 72 72 6e 6f 20 3d 20 63 6f 6e 63 68  astErrno = conch
296a0 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 3b  File->lastErrno;
296b0 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
296c0 54 45 5f 49 4f 45 52 52 5f 52 45 41 44 3b 0a 20  TE_IOERR_READ;. 
296d0 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 74 61       goto end_ta
296e0 6b 65 63 6f 6e 63 68 3b 0a 20 20 20 20 7d 65 6c  keconch;.    }el
296f0 73 65 20 69 66 28 20 72 65 61 64 4c 65 6e 3c 3d  se if( readLen<=
29700 28 50 52 4f 58 59 5f 48 45 41 44 45 52 4c 45 4e  (PROXY_HEADERLEN
29710 2b 50 52 4f 58 59 5f 48 4f 53 54 49 44 4c 45 4e  +PROXY_HOSTIDLEN
29720 29 20 7c 7c 20 0a 20 20 20 20 20 20 20 20 20 20  ) || .          
29730 20 20 20 72 65 61 64 42 75 66 5b 30 5d 21 3d 28     readBuf[0]!=(
29740 63 68 61 72 29 50 52 4f 58 59 5f 43 4f 4e 43 48  char)PROXY_CONCH
29750 56 45 52 53 49 4f 4e 20 29 7b 0a 20 20 20 20 20  VERSION ){.     
29760 20 2f 2a 20 61 20 73 68 6f 72 74 20 72 65 61 64   /* a short read
29770 20 6f 72 20 76 65 72 73 69 6f 6e 20 66 6f 72 6d   or version form
29780 61 74 20 6d 69 73 6d 61 74 63 68 20 6d 65 61 6e  at mismatch mean
29790 73 20 77 65 20 6e 65 65 64 20 74 6f 20 63 72 65  s we need to cre
297a0 61 74 65 20 61 20 6e 65 77 20 0a 20 20 20 20 20  ate a new .     
297b0 20 2a 2a 20 63 6f 6e 63 68 20 66 69 6c 65 2e 20   ** conch file. 
297c0 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
297d0 63 72 65 61 74 65 43 6f 6e 63 68 20 3d 20 31 3b  createConch = 1;
297e0 0a 20 20 20 20 7d 0a 20 20 20 20 2f 2a 20 69 66  .    }.    /* if
297f0 20 74 68 65 20 68 6f 73 74 20 69 64 20 6d 61 74   the host id mat
29800 63 68 65 73 20 61 6e 64 20 74 68 65 20 6c 6f 63  ches and the loc
29810 6b 20 70 61 74 68 20 61 6c 72 65 61 64 79 20 65  k path already e
29820 78 69 73 74 73 20 69 6e 20 74 68 65 20 63 6f 6e  xists in the con
29830 63 68 0a 20 20 20 20 2a 2a 20 77 65 27 6c 6c 20  ch.    ** we'll 
29840 74 72 79 20 74 6f 20 75 73 65 20 74 68 65 20 70  try to use the p
29850 61 74 68 20 74 68 65 72 65 2c 20 69 66 20 77 65  ath there, if we
29860 20 63 61 6e 27 74 20 6f 70 65 6e 20 74 68 61 74   can't open that
29870 20 70 61 74 68 2c 20 77 65 27 6c 6c 20 0a 20 20   path, we'll .  
29880 20 20 2a 2a 20 72 65 74 72 79 20 77 69 74 68 20    ** retry with 
29890 61 20 6e 65 77 20 61 75 74 6f 2d 67 65 6e 65 72  a new auto-gener
298a0 61 74 65 64 20 70 61 74 68 20 0a 20 20 20 20 2a  ated path .    *
298b0 2f 0a 20 20 20 20 64 6f 20 7b 20 2f 2a 20 69 6e  /.    do { /* in
298c0 20 63 61 73 65 20 77 65 20 6e 65 65 64 20 74 6f   case we need to
298d0 20 74 72 79 20 61 67 61 69 6e 20 66 6f 72 20 61   try again for a
298e0 6e 20 3a 61 75 74 6f 3a 20 6e 61 6d 65 64 20 6c  n :auto: named l
298f0 6f 63 6b 20 66 69 6c 65 20 2a 2f 0a 0a 20 20 20  ock file */..   
29900 20 20 20 69 66 28 20 21 63 72 65 61 74 65 43 6f     if( !createCo
29910 6e 63 68 20 26 26 20 21 66 6f 72 63 65 4e 65 77  nch && !forceNew
29920 4c 6f 63 6b 50 61 74 68 20 29 7b 0a 20 20 20 20  LockPath ){.    
29930 20 20 20 20 68 6f 73 74 49 64 4d 61 74 63 68 20      hostIdMatch 
29940 3d 20 21 6d 65 6d 63 6d 70 28 26 72 65 61 64 42  = !memcmp(&readB
29950 75 66 5b 50 52 4f 58 59 5f 48 45 41 44 45 52 4c  uf[PROXY_HEADERL
29960 45 4e 5d 2c 20 6d 79 48 6f 73 74 49 44 2c 20 0a  EN], myHostID, .
29970 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29980 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29990 20 20 50 52 4f 58 59 5f 48 4f 53 54 49 44 4c 45    PROXY_HOSTIDLE
299a0 4e 29 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20 69  N);.        /* i
299b0 66 20 74 68 65 20 63 6f 6e 63 68 20 68 61 73 20  f the conch has 
299c0 64 61 74 61 20 63 6f 6d 70 61 72 65 20 74 68 65  data compare the
299d0 20 63 6f 6e 74 65 6e 74 73 20 2a 2f 0a 20 20 20   contents */.   
299e0 20 20 20 20 20 69 66 28 20 21 70 43 74 78 2d 3e       if( !pCtx->
299f0 6c 6f 63 6b 50 72 6f 78 79 50 61 74 68 20 29 7b  lockProxyPath ){
29a00 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 66 6f  .          /* fo
29a10 72 20 61 75 74 6f 2d 6e 61 6d 65 64 20 6c 6f 63  r auto-named loc
29a20 61 6c 20 6c 6f 63 6b 20 66 69 6c 65 2c 20 6a 75  al lock file, ju
29a30 73 74 20 63 68 65 63 6b 20 74 68 65 20 68 6f 73  st check the hos
29a40 74 20 49 44 20 61 6e 64 20 77 65 27 6c 6c 0a 20  t ID and we'll. 
29a50 20 20 20 20 20 20 20 20 20 20 2a 2a 20 75 73 65            ** use
29a60 20 74 68 65 20 6c 6f 63 61 6c 20 6c 6f 63 6b 20   the local lock 
29a70 66 69 6c 65 20 70 61 74 68 20 74 68 61 74 27 73  file path that's
29a80 20 61 6c 72 65 61 64 79 20 69 6e 20 74 68 65 72   already in ther
29a90 65 0a 20 20 20 20 20 20 20 20 20 20 20 2a 2f 0a  e.           */.
29aa0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 68 6f            if( ho
29ab0 73 74 49 64 4d 61 74 63 68 20 29 7b 0a 20 20 20  stIdMatch ){.   
29ac0 20 20 20 20 20 20 20 20 20 73 69 7a 65 5f 74 20           size_t 
29ad0 70 61 74 68 4c 65 6e 20 3d 20 28 72 65 61 64 4c  pathLen = (readL
29ae0 65 6e 20 2d 20 50 52 4f 58 59 5f 50 41 54 48 49  en - PROXY_PATHI
29af0 4e 44 45 58 29 3b 0a 20 20 20 20 20 20 20 20 20  NDEX);.         
29b00 20 20 20 0a 20 20 20 20 20 20 20 20 20 20 20 20     .            
29b10 69 66 28 20 70 61 74 68 4c 65 6e 3e 3d 4d 41 58  if( pathLen>=MAX
29b20 50 41 54 48 4c 45 4e 20 29 7b 0a 20 20 20 20 20  PATHLEN ){.     
29b30 20 20 20 20 20 20 20 20 20 70 61 74 68 4c 65 6e           pathLen
29b40 3d 4d 41 58 50 41 54 48 4c 45 4e 2d 31 3b 0a 20  =MAXPATHLEN-1;. 
29b50 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
29b60 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28           memcpy(
29b70 6c 6f 63 6b 50 61 74 68 2c 20 26 72 65 61 64 42  lockPath, &readB
29b80 75 66 5b 50 52 4f 58 59 5f 50 41 54 48 49 4e 44  uf[PROXY_PATHIND
29b90 45 58 5d 2c 20 70 61 74 68 4c 65 6e 29 3b 0a 20  EX], pathLen);. 
29ba0 20 20 20 20 20 20 20 20 20 20 20 6c 6f 63 6b 50             lockP
29bb0 61 74 68 5b 70 61 74 68 4c 65 6e 5d 20 3d 20 30  ath[pathLen] = 0
29bc0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 65  ;.            te
29bd0 6d 70 4c 6f 63 6b 50 61 74 68 20 3d 20 6c 6f 63  mpLockPath = loc
29be0 6b 50 61 74 68 3b 0a 20 20 20 20 20 20 20 20 20  kPath;.         
29bf0 20 20 20 74 72 79 4f 6c 64 4c 6f 63 6b 50 61 74     tryOldLockPat
29c00 68 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20  h = 1;.         
29c10 20 20 20 2f 2a 20 63 72 65 61 74 65 20 61 20 63     /* create a c
29c20 6f 70 79 20 6f 66 20 74 68 65 20 6c 6f 63 6b 20  opy of the lock 
29c30 70 61 74 68 20 69 66 20 74 68 65 20 63 6f 6e 63  path if the conc
29c40 68 20 69 73 20 74 61 6b 65 6e 20 2a 2f 0a 20 20  h is taken */.  
29c50 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65            goto e
29c60 6e 64 5f 74 61 6b 65 63 6f 6e 63 68 3b 0a 20 20  nd_takeconch;.  
29c70 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
29c80 20 20 7d 65 6c 73 65 20 69 66 28 20 68 6f 73 74    }else if( host
29c90 49 64 4d 61 74 63 68 0a 20 20 20 20 20 20 20 20  IdMatch.        
29ca0 20 20 20 20 20 20 20 26 26 20 21 73 74 72 6e 63         && !strnc
29cb0 6d 70 28 70 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f  mp(pCtx->lockPro
29cc0 78 79 50 61 74 68 2c 20 26 72 65 61 64 42 75 66  xyPath, &readBuf
29cd0 5b 50 52 4f 58 59 5f 50 41 54 48 49 4e 44 45 58  [PROXY_PATHINDEX
29ce0 5d 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ],.             
29cf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65                re
29d00 61 64 4c 65 6e 2d 50 52 4f 58 59 5f 50 41 54 48  adLen-PROXY_PATH
29d10 49 4e 44 45 58 29 0a 20 20 20 20 20 20 20 20 29  INDEX).        )
29d20 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 63  {.          /* c
29d30 6f 6e 63 68 20 68 6f 73 74 20 61 6e 64 20 6c 6f  onch host and lo
29d40 63 6b 20 70 61 74 68 20 6d 61 74 63 68 20 2a 2f  ck path match */
29d50 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20  .          goto 
29d60 65 6e 64 5f 74 61 6b 65 63 6f 6e 63 68 3b 20 0a  end_takeconch; .
29d70 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
29d80 7d 0a 20 20 20 20 20 20 0a 20 20 20 20 20 20 2f  }.      .      /
29d90 2a 20 69 66 20 74 68 65 20 63 6f 6e 63 68 20 69  * if the conch i
29da0 73 6e 27 74 20 77 72 69 74 61 62 6c 65 20 61 6e  sn't writable an
29db0 64 20 64 6f 65 73 6e 27 74 20 6d 61 74 63 68 2c  d doesn't match,
29dc0 20 77 65 20 63 61 6e 27 74 20 74 61 6b 65 20 69   we can't take i
29dd0 74 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 28  t */.      if( (
29de0 63 6f 6e 63 68 46 69 6c 65 2d 3e 6f 70 65 6e 46  conchFile->openF
29df0 6c 61 67 73 26 4f 5f 52 44 57 52 29 20 3d 3d 20  lags&O_RDWR) == 
29e00 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  0 ){.        rc 
29e10 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20  = SQLITE_BUSY;. 
29e20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f         goto end_
29e30 74 61 6b 65 63 6f 6e 63 68 3b 0a 20 20 20 20 20  takeconch;.     
29e40 20 7d 0a 20 20 20 20 20 20 0a 20 20 20 20 20 20   }.      .      
29e50 2f 2a 20 65 69 74 68 65 72 20 74 68 65 20 63 6f  /* either the co
29e60 6e 63 68 20 64 69 64 6e 27 74 20 6d 61 74 63 68  nch didn't match
29e70 20 6f 72 20 77 65 20 6e 65 65 64 20 74 6f 20 63   or we need to c
29e80 72 65 61 74 65 20 61 20 6e 65 77 20 6f 6e 65 20  reate a new one 
29e90 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 21 70 43  */.      if( !pC
29ea0 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 50 61 74  tx->lockProxyPat
29eb0 68 20 29 7b 0a 20 20 20 20 20 20 20 20 70 72 6f  h ){.        pro
29ec0 78 79 47 65 74 4c 6f 63 6b 50 61 74 68 28 70 43  xyGetLockPath(pC
29ed0 74 78 2d 3e 64 62 50 61 74 68 2c 20 6c 6f 63 6b  tx->dbPath, lock
29ee0 50 61 74 68 2c 20 4d 41 58 50 41 54 48 4c 45 4e  Path, MAXPATHLEN
29ef0 29 3b 0a 20 20 20 20 20 20 20 20 74 65 6d 70 4c  );.        tempL
29f00 6f 63 6b 50 61 74 68 20 3d 20 6c 6f 63 6b 50 61  ockPath = lockPa
29f10 74 68 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20 63  th;.        /* c
29f20 72 65 61 74 65 20 61 20 63 6f 70 79 20 6f 66 20  reate a copy of 
29f30 74 68 65 20 6c 6f 63 6b 20 70 61 74 68 20 5f 6f  the lock path _o
29f40 6e 6c 79 5f 20 69 66 20 74 68 65 20 63 6f 6e 63  nly_ if the conc
29f50 68 20 69 73 20 74 61 6b 65 6e 20 2a 2f 0a 20 20  h is taken */.  
29f60 20 20 20 20 7d 0a 20 20 20 20 20 20 0a 20 20 20      }.      .   
29f70 20 20 20 2f 2a 20 75 70 64 61 74 65 20 63 6f 6e     /* update con
29f80 63 68 20 77 69 74 68 20 68 6f 73 74 20 61 6e 64  ch with host and
29f90 20 70 61 74 68 20 28 74 68 69 73 20 77 69 6c 6c   path (this will
29fa0 20 66 61 69 6c 20 69 66 20 6f 74 68 65 72 20 70   fail if other p
29fb0 72 6f 63 65 73 73 0a 20 20 20 20 20 20 2a 2a 20  rocess.      ** 
29fc0 68 61 73 20 61 20 73 68 61 72 65 64 20 6c 6f 63  has a shared loc
29fd0 6b 20 61 6c 72 65 61 64 79 29 2c 20 69 66 20 74  k already), if t
29fe0 68 65 20 68 6f 73 74 20 69 64 20 6d 61 74 63 68  he host id match
29ff0 65 73 2c 20 75 73 65 20 74 68 65 20 62 69 67 0a  es, use the big.
2a000 20 20 20 20 20 20 2a 2a 20 73 74 69 63 6b 2e 0a        ** stick..
2a010 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 66        */.      f
2a020 75 74 69 6d 65 73 28 63 6f 6e 63 68 46 69 6c 65  utimes(conchFile
2a030 2d 3e 68 2c 20 4e 55 4c 4c 29 3b 0a 20 20 20 20  ->h, NULL);.    
2a040 20 20 69 66 28 20 68 6f 73 74 49 64 4d 61 74 63    if( hostIdMatc
2a050 68 20 26 26 20 21 63 72 65 61 74 65 43 6f 6e 63  h && !createConc
2a060 68 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  h ){.        if(
2a070 20 63 6f 6e 63 68 46 69 6c 65 2d 3e 70 4c 6f 63   conchFile->pLoc
2a080 6b 20 26 26 20 63 6f 6e 63 68 46 69 6c 65 2d 3e  k && conchFile->
2a090 70 4c 6f 63 6b 2d 3e 63 6e 74 3e 31 20 29 7b 0a  pLock->cnt>1 ){.
2a0a0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 65 20            /* We 
2a0b0 61 72 65 20 74 72 79 69 6e 67 20 66 6f 72 20 61  are trying for a
2a0c0 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b  n exclusive lock
2a0d0 20 62 75 74 20 61 6e 6f 74 68 65 72 20 74 68 72   but another thr
2a0e0 65 61 64 20 69 6e 20 74 68 69 73 0a 20 20 20 20  ead in this.    
2a0f0 20 20 20 20 20 20 20 2a 2a 20 73 61 6d 65 20 70         ** same p
2a100 72 6f 63 65 73 73 20 69 73 20 73 74 69 6c 6c 20  rocess is still 
2a110 68 6f 6c 64 69 6e 67 20 61 20 73 68 61 72 65 64  holding a shared
2a120 20 6c 6f 63 6b 2e 20 2a 2f 0a 20 20 20 20 20 20   lock. */.      
2a130 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
2a140 42 55 53 59 3b 0a 20 20 20 20 20 20 20 20 7d 20  BUSY;.        } 
2a150 65 6c 73 65 20 7b 20 20 20 20 20 20 20 20 20 20  else {          
2a160 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
2a170 70 72 6f 78 79 43 6f 6e 63 68 4c 6f 63 6b 28 70  proxyConchLock(p
2a180 46 69 6c 65 2c 20 6d 79 48 6f 73 74 49 44 2c 20  File, myHostID, 
2a190 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 3b  EXCLUSIVE_LOCK);
2a1a0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
2a1b0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
2a1c0 72 63 20 3d 20 63 6f 6e 63 68 46 69 6c 65 2d 3e  rc = conchFile->
2a1d0 70 4d 65 74 68 6f 64 2d 3e 78 4c 6f 63 6b 28 28  pMethod->xLock((
2a1e0 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29 63 6f  sqlite3_file*)co
2a1f0 6e 63 68 46 69 6c 65 2c 20 45 58 43 4c 55 53 49  nchFile, EXCLUSI
2a200 56 45 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20  VE_LOCK);.      
2a210 7d 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d  }.      if( rc==
2a220 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
2a230 20 20 20 20 20 63 68 61 72 20 77 72 69 74 65 42       char writeB
2a240 75 66 66 65 72 5b 50 52 4f 58 59 5f 4d 41 58 43  uffer[PROXY_MAXC
2a250 4f 4e 43 48 4c 45 4e 5d 3b 0a 20 20 20 20 20 20  ONCHLEN];.      
2a260 20 20 69 6e 74 20 77 72 69 74 65 53 69 7a 65 20    int writeSize 
2a270 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 0a 20 20  = 0;.        .  
2a280 20 20 20 20 20 20 77 72 69 74 65 42 75 66 66 65        writeBuffe
2a290 72 5b 30 5d 20 3d 20 28 63 68 61 72 29 50 52 4f  r[0] = (char)PRO
2a2a0 58 59 5f 43 4f 4e 43 48 56 45 52 53 49 4f 4e 3b  XY_CONCHVERSION;
2a2b0 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28  .        memcpy(
2a2c0 26 77 72 69 74 65 42 75 66 66 65 72 5b 50 52 4f  &writeBuffer[PRO
2a2d0 58 59 5f 48 45 41 44 45 52 4c 45 4e 5d 2c 20 6d  XY_HEADERLEN], m
2a2e0 79 48 6f 73 74 49 44 2c 20 50 52 4f 58 59 5f 48  yHostID, PROXY_H
2a2f0 4f 53 54 49 44 4c 45 4e 29 3b 0a 20 20 20 20 20  OSTIDLEN);.     
2a300 20 20 20 69 66 28 20 70 43 74 78 2d 3e 6c 6f 63     if( pCtx->loc
2a310 6b 50 72 6f 78 79 50 61 74 68 21 3d 4e 55 4c 4c  kProxyPath!=NULL
2a320 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 74   ){.          st
2a330 72 6c 63 70 79 28 26 77 72 69 74 65 42 75 66 66  rlcpy(&writeBuff
2a340 65 72 5b 50 52 4f 58 59 5f 50 41 54 48 49 4e 44  er[PROXY_PATHIND
2a350 45 58 5d 2c 20 70 43 74 78 2d 3e 6c 6f 63 6b 50  EX], pCtx->lockP
2a360 72 6f 78 79 50 61 74 68 2c 20 4d 41 58 50 41 54  roxyPath, MAXPAT
2a370 48 4c 45 4e 29 3b 0a 20 20 20 20 20 20 20 20 7d  HLEN);.        }
2a380 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
2a390 73 74 72 6c 63 70 79 28 26 77 72 69 74 65 42 75  strlcpy(&writeBu
2a3a0 66 66 65 72 5b 50 52 4f 58 59 5f 50 41 54 48 49  ffer[PROXY_PATHI
2a3b0 4e 44 45 58 5d 2c 20 74 65 6d 70 4c 6f 63 6b 50  NDEX], tempLockP
2a3c0 61 74 68 2c 20 4d 41 58 50 41 54 48 4c 45 4e 29  ath, MAXPATHLEN)
2a3d0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
2a3e0 20 20 20 20 77 72 69 74 65 53 69 7a 65 20 3d 20      writeSize = 
2a3f0 50 52 4f 58 59 5f 50 41 54 48 49 4e 44 45 58 20  PROXY_PATHINDEX 
2a400 2b 20 73 74 72 6c 65 6e 28 26 77 72 69 74 65 42  + strlen(&writeB
2a410 75 66 66 65 72 5b 50 52 4f 58 59 5f 50 41 54 48  uffer[PROXY_PATH
2a420 49 4e 44 45 58 5d 29 3b 0a 20 20 20 20 20 20 20  INDEX]);.       
2a430 20 66 74 72 75 6e 63 61 74 65 28 63 6f 6e 63 68   ftruncate(conch
2a440 46 69 6c 65 2d 3e 68 2c 20 77 72 69 74 65 53 69  File->h, writeSi
2a450 7a 65 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20  ze);.        rc 
2a460 3d 20 75 6e 69 78 57 72 69 74 65 28 28 73 71 6c  = unixWrite((sql
2a470 69 74 65 33 5f 66 69 6c 65 20 2a 29 63 6f 6e 63  ite3_file *)conc
2a480 68 46 69 6c 65 2c 20 77 72 69 74 65 42 75 66 66  hFile, writeBuff
2a490 65 72 2c 20 77 72 69 74 65 53 69 7a 65 2c 20 30  er, writeSize, 0
2a4a0 29 3b 0a 20 20 20 20 20 20 20 20 66 73 79 6e 63  );.        fsync
2a4b0 28 63 6f 6e 63 68 46 69 6c 65 2d 3e 68 29 3b 0a  (conchFile->h);.
2a4c0 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 77 65          /* If we
2a4d0 20 63 72 65 61 74 65 64 20 61 20 6e 65 77 20 63   created a new c
2a4e0 6f 6e 63 68 20 66 69 6c 65 20 28 6e 6f 74 20 6a  onch file (not j
2a4f0 75 73 74 20 75 70 64 61 74 65 64 20 74 68 65 20  ust updated the 
2a500 63 6f 6e 74 65 6e 74 73 20 6f 66 20 61 20 0a 20  contents of a . 
2a510 20 20 20 20 20 20 20 20 2a 2a 20 76 61 6c 69 64          ** valid
2a520 20 63 6f 6e 63 68 20 66 69 6c 65 29 2c 20 74 72   conch file), tr
2a530 79 20 74 6f 20 6d 61 74 63 68 20 74 68 65 20 70  y to match the p
2a540 65 72 6d 69 73 73 69 6f 6e 73 20 6f 66 20 74 68  ermissions of th
2a550 65 20 64 61 74 61 62 61 73 65 20 0a 20 20 20 20  e database .    
2a560 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
2a570 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
2a580 4b 20 26 26 20 63 72 65 61 74 65 43 6f 6e 63 68  K && createConch
2a590 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 74   ){.          st
2a5a0 72 75 63 74 20 73 74 61 74 20 62 75 66 3b 0a 20  ruct stat buf;. 
2a5b0 20 20 20 20 20 20 20 20 20 69 6e 74 20 65 72 72           int err
2a5c0 20 3d 20 66 73 74 61 74 28 70 46 69 6c 65 2d 3e   = fstat(pFile->
2a5d0 68 2c 20 26 62 75 66 29 3b 0a 20 20 20 20 20 20  h, &buf);.      
2a5e0 20 20 20 20 69 66 28 20 65 72 72 3d 3d 30 20 29      if( err==0 )
2a5f0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6d 6f  {.            mo
2a600 64 65 5f 74 20 63 6d 6f 64 65 20 3d 20 62 75 66  de_t cmode = buf
2a610 2e 73 74 5f 6d 6f 64 65 26 28 53 5f 49 52 55 53  .st_mode&(S_IRUS
2a620 52 7c 53 5f 49 57 55 53 52 20 7c 20 53 5f 49 52  R|S_IWUSR | S_IR
2a630 47 52 50 7c 53 5f 49 57 47 52 50 20 7c 0a 20 20  GRP|S_IWGRP |.  
2a640 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a650 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a660 20 20 20 20 20 20 53 5f 49 52 4f 54 48 7c 53 5f        S_IROTH|S_
2a670 49 57 4f 54 48 29 3b 0a 20 20 20 20 20 20 20 20  IWOTH);.        
2a680 20 20 20 20 2f 2a 20 74 72 79 20 74 6f 20 6d 61      /* try to ma
2a690 74 63 68 20 74 68 65 20 64 61 74 61 62 61 73 65  tch the database
2a6a0 20 66 69 6c 65 20 52 2f 57 20 70 65 72 6d 69 73   file R/W permis
2a6b0 73 69 6f 6e 73 2c 20 69 67 6e 6f 72 65 20 66 61  sions, ignore fa
2a6c0 69 6c 75 72 65 20 2a 2f 0a 23 69 66 6e 64 65 66  ilure */.#ifndef
2a6d0 20 53 51 4c 49 54 45 5f 50 52 4f 58 59 5f 44 45   SQLITE_PROXY_DE
2a6e0 42 55 47 0a 20 20 20 20 20 20 20 20 20 20 20 20  BUG.            
2a6f0 66 63 68 6d 6f 64 28 63 6f 6e 63 68 46 69 6c 65  fchmod(conchFile
2a700 2d 3e 68 2c 20 63 6d 6f 64 65 29 3b 0a 23 65 6c  ->h, cmode);.#el
2a710 73 65 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  se.            i
2a720 66 28 20 66 63 68 6d 6f 64 28 63 6f 6e 63 68 46  f( fchmod(conchF
2a730 69 6c 65 2d 3e 68 2c 20 63 6d 6f 64 65 29 21 3d  ile->h, cmode)!=
2a740 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  0 ){.           
2a750 20 20 20 69 6e 74 20 63 6f 64 65 20 3d 20 65 72     int code = er
2a760 72 6e 6f 3b 0a 20 20 20 20 20 20 20 20 20 20 20  rno;.           
2a770 20 20 20 66 70 72 69 6e 74 66 28 73 74 64 65 72     fprintf(stder
2a780 72 2c 20 22 66 63 68 6d 6f 64 20 25 6f 20 46 41  r, "fchmod %o FA
2a790 49 4c 45 44 20 77 69 74 68 20 25 64 20 25 73 5c  ILED with %d %s\
2a7a0 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  n",.            
2a7b0 20 20 20 20 20 20 20 20 20 20 63 6d 6f 64 65 2c            cmode,
2a7c0 20 63 6f 64 65 2c 20 73 74 72 65 72 72 6f 72 28   code, strerror(
2a7d0 63 6f 64 65 29 29 3b 0a 20 20 20 20 20 20 20 20  code));.        
2a7e0 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20      } else {.   
2a7f0 20 20 20 20 20 20 20 20 20 20 20 66 70 72 69 6e             fprin
2a800 74 66 28 73 74 64 65 72 72 2c 20 22 66 63 68 6d  tf(stderr, "fchm
2a810 6f 64 20 25 6f 20 53 55 43 43 45 44 45 44 5c 6e  od %o SUCCEDED\n
2a820 22 2c 63 6d 6f 64 65 29 3b 0a 20 20 20 20 20 20  ",cmode);.      
2a830 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
2a840 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
2a850 20 20 20 20 20 69 6e 74 20 63 6f 64 65 20 3d 20       int code = 
2a860 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20 20 20 20  errno;.         
2a870 20 20 20 66 70 72 69 6e 74 66 28 73 74 64 65 72     fprintf(stder
2a880 72 2c 20 22 53 54 41 54 20 46 41 49 4c 45 44 5b  r, "STAT FAILED[
2a890 25 64 5d 20 77 69 74 68 20 25 64 20 25 73 5c 6e  %d] with %d %s\n
2a8a0 22 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  ", .            
2a8b0 20 20 20 20 20 20 20 20 65 72 72 2c 20 63 6f 64          err, cod
2a8c0 65 2c 20 73 74 72 65 72 72 6f 72 28 63 6f 64 65  e, strerror(code
2a8d0 29 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20  ));.#endif.     
2a8e0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
2a8f0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 63  .      }.      c
2a900 6f 6e 63 68 46 69 6c 65 2d 3e 70 4d 65 74 68 6f  onchFile->pMetho
2a910 64 2d 3e 78 55 6e 6c 6f 63 6b 28 28 73 71 6c 69  d->xUnlock((sqli
2a920 74 65 33 5f 66 69 6c 65 2a 29 63 6f 6e 63 68 46  te3_file*)conchF
2a930 69 6c 65 2c 20 53 48 41 52 45 44 5f 4c 4f 43 4b  ile, SHARED_LOCK
2a940 29 3b 0a 20 20 20 20 20 20 0a 20 20 20 20 65 6e  );.      .    en
2a950 64 5f 74 61 6b 65 63 6f 6e 63 68 3a 0a 20 20 20  d_takeconch:.   
2a960 20 20 20 4f 53 54 52 41 43 45 32 28 22 54 52 41     OSTRACE2("TRA
2a970 4e 53 50 52 4f 58 59 3a 20 43 4c 4f 53 45 20 20  NSPROXY: CLOSE  
2a980 25 64 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 29  %d\n", pFile->h)
2a990 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d  ;.      if( rc==
2a9a0 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 46 69  SQLITE_OK && pFi
2a9b0 6c 65 2d 3e 6f 70 65 6e 46 6c 61 67 73 20 29 7b  le->openFlags ){
2a9c0 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 46 69  .        if( pFi
2a9d0 6c 65 2d 3e 68 3e 3d 30 20 29 7b 0a 23 69 66 64  le->h>=0 ){.#ifd
2a9e0 65 66 20 53 54 52 49 43 54 5f 43 4c 4f 53 45 5f  ef STRICT_CLOSE_
2a9f0 45 52 52 4f 52 0a 20 20 20 20 20 20 20 20 20 20  ERROR.          
2aa00 69 66 28 20 63 6c 6f 73 65 28 70 46 69 6c 65 2d  if( close(pFile-
2aa10 3e 68 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  >h) ){.         
2aa20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72     pFile->lastEr
2aa30 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20  rno = errno;.   
2aa40 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
2aa50 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43 4c 4f  SQLITE_IOERR_CLO
2aa60 53 45 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  SE;.          }.
2aa70 23 65 6c 73 65 0a 20 20 20 20 20 20 20 20 20 20  #else.          
2aa80 63 6c 6f 73 65 28 70 46 69 6c 65 2d 3e 68 29 3b  close(pFile->h);
2aa90 20 2f 2a 20 73 69 6c 65 6e 74 6c 79 20 6c 65 61   /* silently lea
2aaa0 6b 20 66 64 20 69 66 20 66 61 69 6c 20 2a 2f 0a  k fd if fail */.
2aab0 23 65 6e 64 69 66 0a 20 20 20 20 20 20 20 20 7d  #endif.        }
2aac0 0a 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e  .        pFile->
2aad0 68 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 20 20  h = -1;.        
2aae0 69 6e 74 20 66 64 20 3d 20 6f 70 65 6e 28 70 43  int fd = open(pC
2aaf0 74 78 2d 3e 64 62 50 61 74 68 2c 20 70 46 69 6c  tx->dbPath, pFil
2ab00 65 2d 3e 6f 70 65 6e 46 6c 61 67 73 2c 0a 20 20  e->openFlags,.  
2ab10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ab20 20 20 20 20 53 51 4c 49 54 45 5f 44 45 46 41 55      SQLITE_DEFAU
2ab30 4c 54 5f 46 49 4c 45 5f 50 45 52 4d 49 53 53 49  LT_FILE_PERMISSI
2ab40 4f 4e 53 29 3b 0a 20 20 20 20 20 20 20 20 4f 53  ONS);.        OS
2ab50 54 52 41 43 45 32 28 22 54 52 41 4e 53 50 52 4f  TRACE2("TRANSPRO
2ab60 58 59 3a 20 4f 50 45 4e 20 20 25 64 5c 6e 22 2c  XY: OPEN  %d\n",
2ab70 20 66 64 29 3b 0a 20 20 20 20 20 20 20 20 69 66   fd);.        if
2ab80 28 20 66 64 3e 3d 30 20 29 7b 0a 20 20 20 20 20  ( fd>=0 ){.     
2ab90 20 20 20 20 20 70 46 69 6c 65 2d 3e 68 20 3d 20       pFile->h = 
2aba0 66 64 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  fd;.        }els
2abb0 65 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 3d  e{.          rc=
2abc0 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f  SQLITE_CANTOPEN_
2abd0 42 4b 50 54 3b 20 2f 2a 20 53 51 4c 49 54 45 5f  BKPT; /* SQLITE_
2abe0 42 55 53 59 3f 20 70 72 6f 78 79 54 61 6b 65 43  BUSY? proxyTakeC
2abf0 6f 6e 63 68 20 63 61 6c 6c 65 64 0a 20 20 20 20  onch called.    
2ac00 20 20 20 20 20 20 20 64 75 72 69 6e 67 20 6c 6f         during lo
2ac10 63 6b 69 6e 67 20 2a 2f 0a 20 20 20 20 20 20 20  cking */.       
2ac20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
2ac30 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
2ac40 4f 4b 20 26 26 20 21 70 43 74 78 2d 3e 6c 6f 63  OK && !pCtx->loc
2ac50 6b 50 72 6f 78 79 20 29 7b 0a 20 20 20 20 20 20  kProxy ){.      
2ac60 20 20 63 68 61 72 20 2a 70 61 74 68 20 3d 20 74    char *path = t
2ac70 65 6d 70 4c 6f 63 6b 50 61 74 68 20 3f 20 74 65  empLockPath ? te
2ac80 6d 70 4c 6f 63 6b 50 61 74 68 20 3a 20 70 43 74  mpLockPath : pCt
2ac90 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 50 61 74 68  x->lockProxyPath
2aca0 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 70  ;.        rc = p
2acb0 72 6f 78 79 43 72 65 61 74 65 55 6e 69 78 46 69  roxyCreateUnixFi
2acc0 6c 65 28 70 61 74 68 2c 20 26 70 43 74 78 2d 3e  le(path, &pCtx->
2acd0 6c 6f 63 6b 50 72 6f 78 79 2c 20 31 29 3b 0a 20  lockProxy, 1);. 
2ace0 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53         if( rc!=S
2acf0 51 4c 49 54 45 5f 4f 4b 20 26 26 20 72 63 21 3d  QLITE_OK && rc!=
2ad00 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 26 26 20  SQLITE_NOMEM && 
2ad10 74 72 79 4f 6c 64 4c 6f 63 6b 50 61 74 68 20 29  tryOldLockPath )
2ad20 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 77  {.          /* w
2ad30 65 20 63 6f 75 6c 64 6e 27 74 20 63 72 65 61 74  e couldn't creat
2ad40 65 20 74 68 65 20 70 72 6f 78 79 20 6c 6f 63 6b  e the proxy lock
2ad50 20 66 69 6c 65 20 77 69 74 68 20 74 68 65 20 6f   file with the o
2ad60 6c 64 20 6c 6f 63 6b 20 66 69 6c 65 20 70 61 74  ld lock file pat
2ad70 68 0a 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20  h.           ** 
2ad80 73 6f 20 74 72 79 20 61 67 61 69 6e 20 76 69 61  so try again via
2ad90 20 61 75 74 6f 2d 6e 61 6d 69 6e 67 20 0a 20 20   auto-naming .  
2ada0 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20           */.    
2adb0 20 20 20 20 20 20 66 6f 72 63 65 4e 65 77 4c 6f        forceNewLo
2adc0 63 6b 50 61 74 68 20 3d 20 31 3b 0a 20 20 20 20  ckPath = 1;.    
2add0 20 20 20 20 20 20 74 72 79 4f 6c 64 4c 6f 63 6b        tryOldLock
2ade0 50 61 74 68 20 3d 20 30 3b 0a 20 20 20 20 20 20  Path = 0;.      
2adf0 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 20 2f 2a      continue; /*
2ae00 20 67 6f 20 62 61 63 6b 20 74 6f 20 74 68 65 20   go back to the 
2ae10 64 6f 20 7b 7d 20 77 68 69 6c 65 20 73 74 61 72  do {} while star
2ae20 74 20 70 6f 69 6e 74 2c 20 74 72 79 20 61 67 61  t point, try aga
2ae30 69 6e 20 2a 2f 0a 20 20 20 20 20 20 20 20 7d 0a  in */.        }.
2ae40 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
2ae50 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
2ae60 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 4e 65  ){.        /* Ne
2ae70 65 64 20 74 6f 20 6d 61 6b 65 20 61 20 63 6f 70  ed to make a cop
2ae80 79 20 6f 66 20 70 61 74 68 20 69 66 20 77 65 20  y of path if we 
2ae90 65 78 74 72 61 63 74 65 64 20 74 68 65 20 76 61  extracted the va
2aea0 6c 75 65 0a 20 20 20 20 20 20 20 20 20 2a 2a 20  lue.         ** 
2aeb0 66 72 6f 6d 20 74 68 65 20 63 6f 6e 63 68 20 66  from the conch f
2aec0 69 6c 65 20 6f 72 20 74 68 65 20 70 61 74 68 20  ile or the path 
2aed0 77 61 73 20 61 6c 6c 6f 63 61 74 65 64 20 6f 6e  was allocated on
2aee0 20 74 68 65 20 73 74 61 63 6b 0a 20 20 20 20 20   the stack.     
2aef0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69      */.        i
2af00 66 28 20 74 65 6d 70 4c 6f 63 6b 50 61 74 68 20  f( tempLockPath 
2af10 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 43 74  ){.          pCt
2af20 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 50 61 74 68  x->lockProxyPath
2af30 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72 44   = sqlite3DbStrD
2af40 75 70 28 30 2c 20 74 65 6d 70 4c 6f 63 6b 50 61  up(0, tempLockPa
2af50 74 68 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  th);.          i
2af60 66 28 20 21 70 43 74 78 2d 3e 6c 6f 63 6b 50 72  f( !pCtx->lockPr
2af70 6f 78 79 50 61 74 68 20 29 7b 0a 20 20 20 20 20  oxyPath ){.     
2af80 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
2af90 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20  TE_NOMEM;.      
2afa0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
2afb0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
2afc0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
2afd0 29 7b 0a 20 20 20 20 20 20 20 20 70 43 74 78 2d  ){.        pCtx-
2afe0 3e 63 6f 6e 63 68 48 65 6c 64 20 3d 20 31 3b 0a  >conchHeld = 1;.
2aff0 20 20 20 20 20 20 20 20 0a 20 20 20 20 20 20 20          .       
2b000 20 69 66 28 20 70 43 74 78 2d 3e 6c 6f 63 6b 50   if( pCtx->lockP
2b010 72 6f 78 79 2d 3e 70 4d 65 74 68 6f 64 20 3d 3d  roxy->pMethod ==
2b020 20 26 61 66 70 49 6f 4d 65 74 68 6f 64 73 20 29   &afpIoMethods )
2b030 7b 0a 20 20 20 20 20 20 20 20 20 20 61 66 70 4c  {.          afpL
2b040 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 61  ockingContext *a
2b050 66 70 43 74 78 3b 0a 20 20 20 20 20 20 20 20 20  fpCtx;.         
2b060 20 61 66 70 43 74 78 20 3d 20 28 61 66 70 4c 6f   afpCtx = (afpLo
2b070 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 29 70  ckingContext *)p
2b080 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 2d 3e  Ctx->lockProxy->
2b090 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 0a  lockingContext;.
2b0a0 20 20 20 20 20 20 20 20 20 20 61 66 70 43 74 78            afpCtx
2b0b0 2d 3e 64 62 50 61 74 68 20 3d 20 70 43 74 78 2d  ->dbPath = pCtx-
2b0c0 3e 6c 6f 63 6b 50 72 6f 78 79 50 61 74 68 3b 0a  >lockProxyPath;.
2b0d0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2b0e0 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 20  } else {.       
2b0f0 20 63 6f 6e 63 68 46 69 6c 65 2d 3e 70 4d 65 74   conchFile->pMet
2b100 68 6f 64 2d 3e 78 55 6e 6c 6f 63 6b 28 28 73 71  hod->xUnlock((sq
2b110 6c 69 74 65 33 5f 66 69 6c 65 2a 29 63 6f 6e 63  lite3_file*)conc
2b120 68 46 69 6c 65 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b  hFile, NO_LOCK);
2b130 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 4f  .      }.      O
2b140 53 54 52 41 43 45 33 28 22 54 41 4b 45 43 4f 4e  STRACE3("TAKECON
2b150 43 48 20 20 25 64 20 25 73 5c 6e 22 2c 20 63 6f  CH  %d %s\n", co
2b160 6e 63 68 46 69 6c 65 2d 3e 68 2c 20 72 63 3d 3d  nchFile->h, rc==
2b170 53 51 4c 49 54 45 5f 4f 4b 3f 22 6f 6b 22 3a 22  SQLITE_OK?"ok":"
2b180 66 61 69 6c 65 64 22 29 3b 0a 20 20 20 20 20 20  failed");.      
2b190 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
2b1a0 20 77 68 69 6c 65 20 28 31 29 3b 20 2f 2a 20 69   while (1); /* i
2b1b0 6e 20 63 61 73 65 20 77 65 20 6e 65 65 64 20 74  n case we need t
2b1c0 6f 20 72 65 74 72 79 20 74 68 65 20 3a 61 75 74  o retry the :aut
2b1d0 6f 3a 20 6c 6f 63 6b 20 66 69 6c 65 20 2d 20 77  o: lock file - w
2b1e0 65 20 73 68 6f 75 6c 64 20 6e 65 76 65 72 20 67  e should never g
2b1f0 65 74 20 68 65 72 65 20 65 78 63 65 70 74 20 76  et here except v
2b200 69 61 20 74 68 65 20 27 63 6f 6e 74 69 6e 75 65  ia the 'continue
2b210 27 20 63 61 6c 6c 2e 20 2a 2f 0a 20 20 7d 0a 7d  ' call. */.  }.}
2b220 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 70 46 69 6c 65  ../*.** If pFile
2b230 20 68 6f 6c 64 73 20 61 20 6c 6f 63 6b 20 6f 6e   holds a lock on
2b240 20 61 20 63 6f 6e 63 68 20 66 69 6c 65 2c 20 74   a conch file, t
2b250 68 65 6e 20 72 65 6c 65 61 73 65 20 74 68 61 74  hen release that
2b260 20 6c 6f 63 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63   lock..*/.static
2b270 20 69 6e 74 20 70 72 6f 78 79 52 65 6c 65 61 73   int proxyReleas
2b280 65 43 6f 6e 63 68 28 75 6e 69 78 46 69 6c 65 20  eConch(unixFile 
2b290 2a 70 46 69 6c 65 29 7b 0a 20 20 69 6e 74 20 72  *pFile){.  int r
2b2a0 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
2b2b0 20 20 20 20 20 20 20 2f 2a 20 53 75 62 72 6f 75         /* Subrou
2b2c0 74 69 6e 65 20 72 65 74 75 72 6e 20 63 6f 64 65  tine return code
2b2d0 20 2a 2f 0a 20 20 70 72 6f 78 79 4c 6f 63 6b 69   */.  proxyLocki
2b2e0 6e 67 43 6f 6e 74 65 78 74 20 2a 70 43 74 78 3b  ngContext *pCtx;
2b2f0 20 20 2f 2a 20 54 68 65 20 6c 6f 63 6b 69 6e 67    /* The locking
2b300 20 63 6f 6e 74 65 78 74 20 66 6f 72 20 74 68 65   context for the
2b310 20 70 72 6f 78 79 20 6c 6f 63 6b 20 2a 2f 0a 20   proxy lock */. 
2b320 20 75 6e 69 78 46 69 6c 65 20 2a 63 6f 6e 63 68   unixFile *conch
2b330 46 69 6c 65 3b 20 20 20 20 20 20 20 20 2f 2a 20  File;        /* 
2b340 4e 61 6d 65 20 6f 66 20 74 68 65 20 63 6f 6e 63  Name of the conc
2b350 68 20 66 69 6c 65 20 2a 2f 0a 0a 20 20 70 43 74  h file */..  pCt
2b360 78 20 3d 20 28 70 72 6f 78 79 4c 6f 63 6b 69 6e  x = (proxyLockin
2b370 67 43 6f 6e 74 65 78 74 20 2a 29 70 46 69 6c 65  gContext *)pFile
2b380 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  ->lockingContext
2b390 3b 0a 20 20 63 6f 6e 63 68 46 69 6c 65 20 3d 20  ;.  conchFile = 
2b3a0 70 43 74 78 2d 3e 63 6f 6e 63 68 46 69 6c 65 3b  pCtx->conchFile;
2b3b0 0a 20 20 4f 53 54 52 41 43 45 34 28 22 52 45 4c  .  OSTRACE4("REL
2b3c0 45 41 53 45 43 4f 4e 43 48 20 20 25 64 20 66 6f  EASECONCH  %d fo
2b3d0 72 20 25 73 20 70 69 64 3d 25 64 5c 6e 22 2c 20  r %s pid=%d\n", 
2b3e0 63 6f 6e 63 68 46 69 6c 65 2d 3e 68 2c 0a 20 20  conchFile->h,.  
2b3f0 20 20 20 20 20 20 20 20 20 28 70 43 74 78 2d 3e           (pCtx->
2b400 6c 6f 63 6b 50 72 6f 78 79 50 61 74 68 20 3f 20  lockProxyPath ? 
2b410 70 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 50  pCtx->lockProxyP
2b420 61 74 68 20 3a 20 22 3a 61 75 74 6f 3a 22 29 2c  ath : ":auto:"),
2b430 20 0a 20 20 20 20 20 20 20 20 20 20 20 67 65 74   .           get
2b440 70 69 64 28 29 29 3b 0a 20 20 69 66 28 20 70 43  pid());.  if( pC
2b450 74 78 2d 3e 63 6f 6e 63 68 48 65 6c 64 3e 30 20  tx->conchHeld>0 
2b460 29 7b 0a 20 20 20 20 72 63 20 3d 20 63 6f 6e 63  ){.    rc = conc
2b470 68 46 69 6c 65 2d 3e 70 4d 65 74 68 6f 64 2d 3e  hFile->pMethod->
2b480 78 55 6e 6c 6f 63 6b 28 28 73 71 6c 69 74 65 33  xUnlock((sqlite3
2b490 5f 66 69 6c 65 2a 29 63 6f 6e 63 68 46 69 6c 65  _file*)conchFile
2b4a0 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20 20 7d 0a  , NO_LOCK);.  }.
2b4b0 20 20 70 43 74 78 2d 3e 63 6f 6e 63 68 48 65 6c    pCtx->conchHel
2b4c0 64 20 3d 20 30 3b 0a 20 20 4f 53 54 52 41 43 45  d = 0;.  OSTRACE
2b4d0 33 28 22 52 45 4c 45 41 53 45 43 4f 4e 43 48 20  3("RELEASECONCH 
2b4e0 20 25 64 20 25 73 5c 6e 22 2c 20 63 6f 6e 63 68   %d %s\n", conch
2b4f0 46 69 6c 65 2d 3e 68 2c 0a 20 20 20 20 20 20 20  File->h,.       
2b500 20 20 20 20 28 72 63 3d 3d 53 51 4c 49 54 45 5f      (rc==SQLITE_
2b510 4f 4b 20 3f 20 22 6f 6b 22 20 3a 20 22 66 61 69  OK ? "ok" : "fai
2b520 6c 65 64 22 29 29 3b 0a 20 20 72 65 74 75 72 6e  led"));.  return
2b530 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69   rc;.}../*.** Gi
2b540 76 65 6e 20 74 68 65 20 6e 61 6d 65 20 6f 66 20  ven the name of 
2b550 61 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c  a database file,
2b560 20 63 6f 6d 70 75 74 65 20 74 68 65 20 6e 61 6d   compute the nam
2b570 65 20 6f 66 20 69 74 73 20 63 6f 6e 63 68 20 66  e of its conch f
2b580 69 6c 65 2e 0a 2a 2a 20 53 74 6f 72 65 20 74 68  ile..** Store th
2b590 65 20 63 6f 6e 63 68 20 66 69 6c 65 6e 61 6d 65  e conch filename
2b5a0 20 69 6e 20 6d 65 6d 6f 72 79 20 6f 62 74 61 69   in memory obtai
2b5b0 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69 74 65 33  ned from sqlite3
2b5c0 5f 6d 61 6c 6c 6f 63 28 29 2e 0a 2a 2a 20 4d 61  _malloc()..** Ma
2b5d0 6b 65 20 2a 70 43 6f 6e 63 68 50 61 74 68 20 70  ke *pConchPath p
2b5e0 6f 69 6e 74 20 74 6f 20 74 68 65 20 6e 65 77 20  oint to the new 
2b5f0 6e 61 6d 65 2e 20 20 52 65 74 75 72 6e 20 53 51  name.  Return SQ
2b600 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65  LITE_OK on succe
2b610 73 73 0a 2a 2a 20 6f 72 20 53 51 4c 49 54 45 5f  ss.** or SQLITE_
2b620 4e 4f 4d 45 4d 20 69 66 20 75 6e 61 62 6c 65 20  NOMEM if unable 
2b630 74 6f 20 6f 62 74 61 69 6e 20 6d 65 6d 6f 72 79  to obtain memory
2b640 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 61 6c 6c  ..**.** The call
2b650 65 72 20 69 73 20 72 65 73 70 6f 6e 73 69 62 6c  er is responsibl
2b660 65 20 66 6f 72 20 65 6e 73 75 72 69 6e 67 20 74  e for ensuring t
2b670 68 61 74 20 74 68 65 20 61 6c 6c 6f 63 61 74 65  hat the allocate
2b680 64 20 6d 65 6d 6f 72 79 0a 2a 2a 20 73 70 61 63  d memory.** spac
2b690 65 20 69 73 20 65 76 65 6e 74 75 61 6c 6c 79 20  e is eventually 
2b6a0 66 72 65 65 64 2e 0a 2a 2a 0a 2a 2a 20 2a 70 43  freed..**.** *pC
2b6b0 6f 6e 63 68 50 61 74 68 20 69 73 20 73 65 74 20  onchPath is set 
2b6c0 74 6f 20 4e 55 4c 4c 20 69 66 20 61 20 6d 65 6d  to NULL if a mem
2b6d0 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 65  ory allocation e
2b6e0 72 72 6f 72 20 6f 63 63 75 72 73 2e 0a 2a 2f 0a  rror occurs..*/.
2b6f0 73 74 61 74 69 63 20 69 6e 74 20 70 72 6f 78 79  static int proxy
2b700 43 72 65 61 74 65 43 6f 6e 63 68 50 61 74 68 6e  CreateConchPathn
2b710 61 6d 65 28 63 68 61 72 20 2a 64 62 50 61 74 68  ame(char *dbPath
2b720 2c 20 63 68 61 72 20 2a 2a 70 43 6f 6e 63 68 50  , char **pConchP
2b730 61 74 68 29 7b 0a 20 20 69 6e 74 20 69 3b 20 20  ath){.  int i;  
2b740 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b750 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f        /* Loop co
2b760 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 6c  unter */.  int l
2b770 65 6e 20 3d 20 28 69 6e 74 29 73 74 72 6c 65 6e  en = (int)strlen
2b780 28 64 62 50 61 74 68 29 3b 20 2f 2a 20 4c 65 6e  (dbPath); /* Len
2b790 67 74 68 20 6f 66 20 64 61 74 61 62 61 73 65 20  gth of database 
2b7a0 66 69 6c 65 6e 61 6d 65 20 2d 20 64 62 50 61 74  filename - dbPat
2b7b0 68 20 2a 2f 0a 20 20 63 68 61 72 20 2a 63 6f 6e  h */.  char *con
2b7c0 63 68 50 61 74 68 3b 20 20 20 20 20 20 20 20 20  chPath;         
2b7d0 20 20 20 20 20 2f 2a 20 62 75 66 66 65 72 20 69       /* buffer i
2b7e0 6e 20 77 68 69 63 68 20 74 6f 20 63 6f 6e 73 74  n which to const
2b7f0 72 75 63 74 20 63 6f 6e 63 68 20 6e 61 6d 65 20  ruct conch name 
2b800 2a 2f 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74  */..  /* Allocat
2b810 65 20 73 70 61 63 65 20 66 6f 72 20 74 68 65 20  e space for the 
2b820 63 6f 6e 63 68 20 66 69 6c 65 6e 61 6d 65 20 61  conch filename a
2b830 6e 64 20 69 6e 69 74 69 61 6c 69 7a 65 20 74 68  nd initialize th
2b840 65 20 6e 61 6d 65 20 74 6f 0a 20 20 2a 2a 20 74  e name to.  ** t
2b850 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 6f  he name of the o
2b860 72 69 67 69 6e 61 6c 20 64 61 74 61 62 61 73 65  riginal database
2b870 20 66 69 6c 65 2e 20 2a 2f 20 20 0a 20 20 2a 70   file. */  .  *p
2b880 43 6f 6e 63 68 50 61 74 68 20 3d 20 63 6f 6e 63  ConchPath = conc
2b890 68 50 61 74 68 20 3d 20 28 63 68 61 72 20 2a 29  hPath = (char *)
2b8a0 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 6c  sqlite3_malloc(l
2b8b0 65 6e 20 2b 20 38 29 3b 0a 20 20 69 66 28 20 63  en + 8);.  if( c
2b8c0 6f 6e 63 68 50 61 74 68 3d 3d 30 20 29 7b 0a 20  onchPath==0 ){. 
2b8d0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
2b8e0 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 6d 65  _NOMEM;.  }.  me
2b8f0 6d 63 70 79 28 63 6f 6e 63 68 50 61 74 68 2c 20  mcpy(conchPath, 
2b900 64 62 50 61 74 68 2c 20 6c 65 6e 2b 31 29 3b 0a  dbPath, len+1);.
2b910 20 20 0a 20 20 2f 2a 20 6e 6f 77 20 69 6e 73 65    .  /* now inse
2b920 72 74 20 61 20 22 2e 22 20 62 65 66 6f 72 65 20  rt a "." before 
2b930 74 68 65 20 6c 61 73 74 20 2f 20 63 68 61 72 61  the last / chara
2b940 63 74 65 72 20 2a 2f 0a 20 20 66 6f 72 28 20 69  cter */.  for( i
2b950 3d 28 6c 65 6e 2d 31 29 3b 20 69 3e 3d 30 3b 20  =(len-1); i>=0; 
2b960 69 2d 2d 20 29 7b 0a 20 20 20 20 69 66 28 20 63  i-- ){.    if( c
2b970 6f 6e 63 68 50 61 74 68 5b 69 5d 3d 3d 27 2f 27  onchPath[i]=='/'
2b980 20 29 7b 0a 20 20 20 20 20 20 69 2b 2b 3b 0a 20   ){.      i++;. 
2b990 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
2b9a0 7d 0a 20 20 7d 0a 20 20 63 6f 6e 63 68 50 61 74  }.  }.  conchPat
2b9b0 68 5b 69 5d 3d 27 2e 27 3b 0a 20 20 77 68 69 6c  h[i]='.';.  whil
2b9c0 65 20 28 20 69 3c 6c 65 6e 20 29 7b 0a 20 20 20  e ( i<len ){.   
2b9d0 20 63 6f 6e 63 68 50 61 74 68 5b 69 2b 31 5d 3d   conchPath[i+1]=
2b9e0 64 62 50 61 74 68 5b 69 5d 3b 0a 20 20 20 20 69  dbPath[i];.    i
2b9f0 2b 2b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 61 70  ++;.  }..  /* ap
2ba00 70 65 6e 64 20 74 68 65 20 22 2d 63 6f 6e 63 68  pend the "-conch
2ba10 22 20 73 75 66 66 69 78 20 74 6f 20 74 68 65 20  " suffix to the 
2ba20 66 69 6c 65 20 2a 2f 0a 20 20 6d 65 6d 63 70 79  file */.  memcpy
2ba30 28 26 63 6f 6e 63 68 50 61 74 68 5b 69 2b 31 5d  (&conchPath[i+1]
2ba40 2c 20 22 2d 63 6f 6e 63 68 22 2c 20 37 29 3b 0a  , "-conch", 7);.
2ba50 20 20 61 73 73 65 72 74 28 20 28 69 6e 74 29 73    assert( (int)s
2ba60 74 72 6c 65 6e 28 63 6f 6e 63 68 50 61 74 68 29  trlen(conchPath)
2ba70 20 3d 3d 20 6c 65 6e 2b 37 20 29 3b 0a 0a 20 20   == len+7 );..  
2ba80 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
2ba90 3b 0a 7d 0a 0a 0a 2f 2a 20 54 61 6b 65 73 20 61  ;.}.../* Takes a
2baa0 20 66 75 6c 6c 79 20 63 6f 6e 66 69 67 75 72 65   fully configure
2bab0 64 20 70 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 2d  d proxy locking-
2bac0 73 74 79 6c 65 20 75 6e 69 78 20 66 69 6c 65 20  style unix file 
2bad0 61 6e 64 20 73 77 69 74 63 68 65 73 0a 2a 2a 20  and switches.** 
2bae0 74 68 65 20 6c 6f 63 61 6c 20 6c 6f 63 6b 20 66  the local lock f
2baf0 69 6c 65 20 70 61 74 68 20 0a 2a 2f 0a 73 74 61  ile path .*/.sta
2bb00 74 69 63 20 69 6e 74 20 73 77 69 74 63 68 4c 6f  tic int switchLo
2bb10 63 6b 50 72 6f 78 79 50 61 74 68 28 75 6e 69 78  ckProxyPath(unix
2bb20 46 69 6c 65 20 2a 70 46 69 6c 65 2c 20 63 6f 6e  File *pFile, con
2bb30 73 74 20 63 68 61 72 20 2a 70 61 74 68 29 20 7b  st char *path) {
2bb40 0a 20 20 70 72 6f 78 79 4c 6f 63 6b 69 6e 67 43  .  proxyLockingC
2bb50 6f 6e 74 65 78 74 20 2a 70 43 74 78 20 3d 20 28  ontext *pCtx = (
2bb60 70 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74  proxyLockingCont
2bb70 65 78 74 2a 29 70 46 69 6c 65 2d 3e 6c 6f 63 6b  ext*)pFile->lock
2bb80 69 6e 67 43 6f 6e 74 65 78 74 3b 0a 20 20 63 68  ingContext;.  ch
2bb90 61 72 20 2a 6f 6c 64 50 61 74 68 20 3d 20 70 43  ar *oldPath = pC
2bba0 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 50 61 74  tx->lockProxyPat
2bbb0 68 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  h;.  int rc = SQ
2bbc0 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 69 66 28 20  LITE_OK;..  if( 
2bbd0 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 21  pFile->locktype!
2bbe0 3d 4e 4f 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20  =NO_LOCK ){.    
2bbf0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55  return SQLITE_BU
2bc00 53 59 3b 0a 20 20 7d 20 20 0a 0a 20 20 2f 2a 20  SY;.  }  ..  /* 
2bc10 6e 6f 74 68 69 6e 67 20 74 6f 20 64 6f 20 69 66  nothing to do if
2bc20 20 74 68 65 20 70 61 74 68 20 69 73 20 4e 55 4c   the path is NUL
2bc30 4c 2c 20 3a 61 75 74 6f 3a 20 6f 72 20 6d 61 74  L, :auto: or mat
2bc40 63 68 65 73 20 74 68 65 20 65 78 69 73 74 69 6e  ches the existin
2bc50 67 20 70 61 74 68 20 2a 2f 0a 20 20 69 66 28 20  g path */.  if( 
2bc60 21 70 61 74 68 20 7c 7c 20 70 61 74 68 5b 30 5d  !path || path[0]
2bc70 3d 3d 27 5c 30 27 20 7c 7c 20 21 73 74 72 63 6d  =='\0' || !strcm
2bc80 70 28 70 61 74 68 2c 20 22 3a 61 75 74 6f 3a 22  p(path, ":auto:"
2bc90 29 20 7c 7c 0a 20 20 20 20 28 6f 6c 64 50 61 74  ) ||.    (oldPat
2bca0 68 20 26 26 20 21 73 74 72 6e 63 6d 70 28 6f 6c  h && !strncmp(ol
2bcb0 64 50 61 74 68 2c 20 70 61 74 68 2c 20 4d 41 58  dPath, path, MAX
2bcc0 50 41 54 48 4c 45 4e 29 29 20 29 7b 0a 20 20 20  PATHLEN)) ){.   
2bcd0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
2bce0 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  K;.  }else{.    
2bcf0 75 6e 69 78 46 69 6c 65 20 2a 6c 6f 63 6b 50 72  unixFile *lockPr
2bd00 6f 78 79 20 3d 20 70 43 74 78 2d 3e 6c 6f 63 6b  oxy = pCtx->lock
2bd10 50 72 6f 78 79 3b 0a 20 20 20 20 70 43 74 78 2d  Proxy;.    pCtx-
2bd20 3e 6c 6f 63 6b 50 72 6f 78 79 3d 4e 55 4c 4c 3b  >lockProxy=NULL;
2bd30 0a 20 20 20 20 70 43 74 78 2d 3e 63 6f 6e 63 68  .    pCtx->conch
2bd40 48 65 6c 64 20 3d 20 30 3b 0a 20 20 20 20 69 66  Held = 0;.    if
2bd50 28 20 6c 6f 63 6b 50 72 6f 78 79 21 3d 4e 55 4c  ( lockProxy!=NUL
2bd60 4c 20 29 7b 0a 20 20 20 20 20 20 72 63 3d 6c 6f  L ){.      rc=lo
2bd70 63 6b 50 72 6f 78 79 2d 3e 70 4d 65 74 68 6f 64  ckProxy->pMethod
2bd80 2d 3e 78 43 6c 6f 73 65 28 28 73 71 6c 69 74 65  ->xClose((sqlite
2bd90 33 5f 66 69 6c 65 20 2a 29 6c 6f 63 6b 50 72 6f  3_file *)lockPro
2bda0 78 79 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  xy);.      if( r
2bdb0 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  c ) return rc;. 
2bdc0 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
2bdd0 65 28 6c 6f 63 6b 50 72 6f 78 79 29 3b 0a 20 20  e(lockProxy);.  
2bde0 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f    }.    sqlite3_
2bdf0 66 72 65 65 28 6f 6c 64 50 61 74 68 29 3b 0a 20  free(oldPath);. 
2be00 20 20 20 70 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f     pCtx->lockPro
2be10 78 79 50 61 74 68 20 3d 20 73 71 6c 69 74 65 33  xyPath = sqlite3
2be20 44 62 53 74 72 44 75 70 28 30 2c 20 70 61 74 68  DbStrDup(0, path
2be30 29 3b 0a 20 20 7d 0a 20 20 0a 20 20 72 65 74 75  );.  }.  .  retu
2be40 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
2be50 70 46 69 6c 65 20 69 73 20 61 20 66 69 6c 65 20  pFile is a file 
2be60 74 68 61 74 20 68 61 73 20 62 65 65 6e 20 6f 70  that has been op
2be70 65 6e 65 64 20 62 79 20 61 20 70 72 69 6f 72 20  ened by a prior 
2be80 78 4f 70 65 6e 20 63 61 6c 6c 2e 20 20 64 62 50  xOpen call.  dbP
2be90 61 74 68 0a 2a 2a 20 69 73 20 61 20 73 74 72 69  ath.** is a stri
2bea0 6e 67 20 62 75 66 66 65 72 20 61 74 20 6c 65 61  ng buffer at lea
2beb0 73 74 20 4d 41 58 50 41 54 48 4c 45 4e 2b 31 20  st MAXPATHLEN+1 
2bec0 63 68 61 72 61 63 74 65 72 73 20 69 6e 20 73 69  characters in si
2bed0 7a 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  ze..**.** This r
2bee0 6f 75 74 69 6e 65 20 66 69 6e 64 20 74 68 65 20  outine find the 
2bef0 66 69 6c 65 6e 61 6d 65 20 61 73 73 6f 63 69 61  filename associa
2bf00 74 65 64 20 77 69 74 68 20 70 46 69 6c 65 20 61  ted with pFile a
2bf10 6e 64 20 77 72 69 74 65 73 20 69 74 0a 2a 2a 20  nd writes it.** 
2bf20 69 6e 74 20 64 62 50 61 74 68 2e 0a 2a 2f 0a 73  int dbPath..*/.s
2bf30 74 61 74 69 63 20 69 6e 74 20 70 72 6f 78 79 47  tatic int proxyG
2bf40 65 74 44 62 50 61 74 68 46 6f 72 55 6e 69 78 46  etDbPathForUnixF
2bf50 69 6c 65 28 75 6e 69 78 46 69 6c 65 20 2a 70 46  ile(unixFile *pF
2bf60 69 6c 65 2c 20 63 68 61 72 20 2a 64 62 50 61 74  ile, char *dbPat
2bf70 68 29 7b 0a 23 69 66 20 64 65 66 69 6e 65 64 28  h){.#if defined(
2bf80 5f 5f 41 50 50 4c 45 5f 5f 29 0a 20 20 69 66 28  __APPLE__).  if(
2bf90 20 70 46 69 6c 65 2d 3e 70 4d 65 74 68 6f 64 20   pFile->pMethod 
2bfa0 3d 3d 20 26 61 66 70 49 6f 4d 65 74 68 6f 64 73  == &afpIoMethods
2bfb0 20 29 7b 0a 20 20 20 20 2f 2a 20 61 66 70 20 73   ){.    /* afp s
2bfc0 74 79 6c 65 20 6b 65 65 70 73 20 61 20 72 65 66  tyle keeps a ref
2bfd0 65 72 65 6e 63 65 20 74 6f 20 74 68 65 20 64 62  erence to the db
2bfe0 20 70 61 74 68 20 69 6e 20 74 68 65 20 66 69 6c   path in the fil
2bff0 65 50 61 74 68 20 66 69 65 6c 64 20 0a 20 20 20  ePath field .   
2c000 20 2a 2a 20 6f 66 20 74 68 65 20 73 74 72 75 63   ** of the struc
2c010 74 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28  t */.    assert(
2c020 20 28 69 6e 74 29 73 74 72 6c 65 6e 28 28 63 68   (int)strlen((ch
2c030 61 72 2a 29 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69  ar*)pFile->locki
2c040 6e 67 43 6f 6e 74 65 78 74 29 3c 3d 4d 41 58 50  ngContext)<=MAXP
2c050 41 54 48 4c 45 4e 20 29 3b 0a 20 20 20 20 73 74  ATHLEN );.    st
2c060 72 6c 63 70 79 28 64 62 50 61 74 68 2c 20 28 28  rlcpy(dbPath, ((
2c070 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78  afpLockingContex
2c080 74 20 2a 29 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69  t *)pFile->locki
2c090 6e 67 43 6f 6e 74 65 78 74 29 2d 3e 64 62 50 61  ngContext)->dbPa
2c0a0 74 68 2c 20 4d 41 58 50 41 54 48 4c 45 4e 29 3b  th, MAXPATHLEN);
2c0b0 0a 20 20 7d 20 65 6c 73 65 0a 23 65 6e 64 69 66  .  } else.#endif
2c0c0 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 70 4d  .  if( pFile->pM
2c0d0 65 74 68 6f 64 20 3d 3d 20 26 64 6f 74 6c 6f 63  ethod == &dotloc
2c0e0 6b 49 6f 4d 65 74 68 6f 64 73 20 29 7b 0a 20 20  kIoMethods ){.  
2c0f0 20 20 2f 2a 20 64 6f 74 20 6c 6f 63 6b 20 73 74    /* dot lock st
2c100 79 6c 65 20 75 73 65 73 20 74 68 65 20 6c 6f 63  yle uses the loc
2c110 6b 69 6e 67 20 63 6f 6e 74 65 78 74 20 74 6f 20  king context to 
2c120 73 74 6f 72 65 20 74 68 65 20 64 6f 74 20 6c 6f  store the dot lo
2c130 63 6b 0a 20 20 20 20 2a 2a 20 66 69 6c 65 20 70  ck.    ** file p
2c140 61 74 68 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6c  ath */.    int l
2c150 65 6e 20 3d 20 73 74 72 6c 65 6e 28 28 63 68 61  en = strlen((cha
2c160 72 20 2a 29 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69  r *)pFile->locki
2c170 6e 67 43 6f 6e 74 65 78 74 29 20 2d 20 73 74 72  ngContext) - str
2c180 6c 65 6e 28 44 4f 54 4c 4f 43 4b 5f 53 55 46 46  len(DOTLOCK_SUFF
2c190 49 58 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28  IX);.    memcpy(
2c1a0 64 62 50 61 74 68 2c 20 28 63 68 61 72 20 2a 29  dbPath, (char *)
2c1b0 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f  pFile->lockingCo
2c1c0 6e 74 65 78 74 2c 20 6c 65 6e 20 2b 20 31 29 3b  ntext, len + 1);
2c1d0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a  .  }else{.    /*
2c1e0 20 61 6c 6c 20 6f 74 68 65 72 20 73 74 79 6c 65   all other style
2c1f0 73 20 75 73 65 20 74 68 65 20 6c 6f 63 6b 69 6e  s use the lockin
2c200 67 20 63 6f 6e 74 65 78 74 20 74 6f 20 73 74 6f  g context to sto
2c210 72 65 20 74 68 65 20 64 62 20 66 69 6c 65 20 70  re the db file p
2c220 61 74 68 20 2a 2f 0a 20 20 20 20 61 73 73 65 72  ath */.    asser
2c230 74 28 20 73 74 72 6c 65 6e 28 28 63 68 61 72 2a  t( strlen((char*
2c240 29 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43  )pFile->lockingC
2c250 6f 6e 74 65 78 74 29 3c 3d 4d 41 58 50 41 54 48  ontext)<=MAXPATH
2c260 4c 45 4e 20 29 3b 0a 20 20 20 20 73 74 72 6c 63  LEN );.    strlc
2c270 70 79 28 64 62 50 61 74 68 2c 20 28 63 68 61 72  py(dbPath, (char
2c280 20 2a 29 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e   *)pFile->lockin
2c290 67 43 6f 6e 74 65 78 74 2c 20 4d 41 58 50 41 54  gContext, MAXPAT
2c2a0 48 4c 45 4e 29 3b 0a 20 20 7d 0a 20 20 72 65 74  HLEN);.  }.  ret
2c2b0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
2c2c0 0a 0a 2f 2a 0a 2a 2a 20 54 61 6b 65 73 20 61 6e  ../*.** Takes an
2c2d0 20 61 6c 72 65 61 64 79 20 66 69 6c 6c 65 64 20   already filled 
2c2e0 69 6e 20 75 6e 69 78 20 66 69 6c 65 20 61 6e 64  in unix file and
2c2f0 20 61 6c 74 65 72 73 20 69 74 20 73 6f 20 61 6c   alters it so al
2c300 6c 20 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 20 0a  l file locking .
2c310 2a 2a 20 77 69 6c 6c 20 62 65 20 70 65 72 66 6f  ** will be perfo
2c320 72 6d 65 64 20 6f 6e 20 74 68 65 20 6c 6f 63 61  rmed on the loca
2c330 6c 20 70 72 6f 78 79 20 6c 6f 63 6b 20 66 69 6c  l proxy lock fil
2c340 65 2e 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  e.  The followin
2c350 67 20 66 69 65 6c 64 73 0a 2a 2a 20 61 72 65 20  g fields.** are 
2c360 70 72 65 73 65 72 76 65 64 20 69 6e 20 74 68 65  preserved in the
2c370 20 6c 6f 63 6b 69 6e 67 20 63 6f 6e 74 65 78 74   locking context
2c380 20 73 6f 20 74 68 61 74 20 74 68 65 79 20 63 61   so that they ca
2c390 6e 20 62 65 20 72 65 73 74 6f 72 65 64 20 61 6e  n be restored an
2c3a0 64 20 0a 2a 2a 20 74 68 65 20 75 6e 69 78 20 73  d .** the unix s
2c3b0 74 72 75 63 74 75 72 65 20 70 72 6f 70 65 72 6c  tructure properl
2c3c0 79 20 63 6c 65 61 6e 65 64 20 75 70 20 61 74 20  y cleaned up at 
2c3d0 63 6c 6f 73 65 20 74 69 6d 65 3a 0a 2a 2a 20 20  close time:.**  
2c3e0 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  ->lockingContext
2c3f0 0a 2a 2a 20 20 2d 3e 70 4d 65 74 68 6f 64 0a 2a  .**  ->pMethod.*
2c400 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72 6f  /.static int pro
2c410 78 79 54 72 61 6e 73 66 6f 72 6d 55 6e 69 78 46  xyTransformUnixF
2c420 69 6c 65 28 75 6e 69 78 46 69 6c 65 20 2a 70 46  ile(unixFile *pF
2c430 69 6c 65 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  ile, const char 
2c440 2a 70 61 74 68 29 20 7b 0a 20 20 70 72 6f 78 79  *path) {.  proxy
2c450 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a  LockingContext *
2c460 70 43 74 78 3b 0a 20 20 63 68 61 72 20 64 62 50  pCtx;.  char dbP
2c470 61 74 68 5b 4d 41 58 50 41 54 48 4c 45 4e 2b 31  ath[MAXPATHLEN+1
2c480 5d 3b 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65  ];       /* Name
2c490 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
2c4a0 20 66 69 6c 65 20 2a 2f 0a 20 20 63 68 61 72 20   file */.  char 
2c4b0 2a 6c 6f 63 6b 50 61 74 68 3d 4e 55 4c 4c 3b 0a  *lockPath=NULL;.
2c4c0 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
2c4d0 45 5f 4f 4b 3b 0a 20 20 0a 20 20 69 66 28 20 70  E_OK;.  .  if( p
2c4e0 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 21 3d  File->locktype!=
2c4f0 4e 4f 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 72  NO_LOCK ){.    r
2c500 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53  eturn SQLITE_BUS
2c510 59 3b 0a 20 20 7d 0a 20 20 70 72 6f 78 79 47 65  Y;.  }.  proxyGe
2c520 74 44 62 50 61 74 68 46 6f 72 55 6e 69 78 46 69  tDbPathForUnixFi
2c530 6c 65 28 70 46 69 6c 65 2c 20 64 62 50 61 74 68  le(pFile, dbPath
2c540 29 3b 0a 20 20 69 66 28 20 21 70 61 74 68 20 7c  );.  if( !path |
2c550 7c 20 70 61 74 68 5b 30 5d 3d 3d 27 5c 30 27 20  | path[0]=='\0' 
2c560 7c 7c 20 21 73 74 72 63 6d 70 28 70 61 74 68 2c  || !strcmp(path,
2c570 20 22 3a 61 75 74 6f 3a 22 29 20 29 7b 0a 20 20   ":auto:") ){.  
2c580 20 20 6c 6f 63 6b 50 61 74 68 3d 4e 55 4c 4c 3b    lockPath=NULL;
2c590 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6c 6f  .  }else{.    lo
2c5a0 63 6b 50 61 74 68 3d 28 63 68 61 72 20 2a 29 70  ckPath=(char *)p
2c5b0 61 74 68 3b 0a 20 20 7d 0a 20 20 0a 20 20 4f 53  ath;.  }.  .  OS
2c5c0 54 52 41 43 45 34 28 22 54 52 41 4e 53 50 52 4f  TRACE4("TRANSPRO
2c5d0 58 59 20 20 25 64 20 66 6f 72 20 25 73 20 70 69  XY  %d for %s pi
2c5e0 64 3d 25 64 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e  d=%d\n", pFile->
2c5f0 68 2c 0a 20 20 20 20 20 20 20 20 20 20 20 28 6c  h,.           (l
2c600 6f 63 6b 50 61 74 68 20 3f 20 6c 6f 63 6b 50 61  ockPath ? lockPa
2c610 74 68 20 3a 20 22 3a 61 75 74 6f 3a 22 29 2c 20  th : ":auto:"), 
2c620 67 65 74 70 69 64 28 29 29 3b 0a 0a 20 20 70 43  getpid());..  pC
2c630 74 78 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c  tx = sqlite3_mal
2c640 6c 6f 63 28 20 73 69 7a 65 6f 66 28 2a 70 43 74  loc( sizeof(*pCt
2c650 78 29 20 29 3b 0a 20 20 69 66 28 20 70 43 74 78  x) );.  if( pCtx
2c660 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ==0 ){.    retur
2c670 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  n SQLITE_NOMEM;.
2c680 20 20 7d 0a 20 20 6d 65 6d 73 65 74 28 70 43 74    }.  memset(pCt
2c690 78 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a 70 43  x, 0, sizeof(*pC
2c6a0 74 78 29 29 3b 0a 0a 20 20 72 63 20 3d 20 70 72  tx));..  rc = pr
2c6b0 6f 78 79 43 72 65 61 74 65 43 6f 6e 63 68 50 61  oxyCreateConchPa
2c6c0 74 68 6e 61 6d 65 28 64 62 50 61 74 68 2c 20 26  thname(dbPath, &
2c6d0 70 43 74 78 2d 3e 63 6f 6e 63 68 46 69 6c 65 50  pCtx->conchFileP
2c6e0 61 74 68 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d  ath);.  if( rc==
2c6f0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
2c700 20 72 63 20 3d 20 70 72 6f 78 79 43 72 65 61 74   rc = proxyCreat
2c710 65 55 6e 69 78 46 69 6c 65 28 70 43 74 78 2d 3e  eUnixFile(pCtx->
2c720 63 6f 6e 63 68 46 69 6c 65 50 61 74 68 2c 20 26  conchFilePath, &
2c730 70 43 74 78 2d 3e 63 6f 6e 63 68 46 69 6c 65 2c  pCtx->conchFile,
2c740 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d   0);.    if( rc=
2c750 3d 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e  =SQLITE_CANTOPEN
2c760 20 26 26 20 28 28 70 46 69 6c 65 2d 3e 6f 70 65   && ((pFile->ope
2c770 6e 46 6c 61 67 73 26 4f 5f 52 44 57 52 29 20 3d  nFlags&O_RDWR) =
2c780 3d 20 30 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a  = 0) ){.      /*
2c790 20 69 66 20 28 61 29 20 74 68 65 20 6f 70 65 6e   if (a) the open
2c7a0 20 66 6c 61 67 73 20 61 72 65 20 6e 6f 74 20 4f   flags are not O
2c7b0 5f 52 44 57 52 2c 20 28 62 29 20 74 68 65 20 63  _RDWR, (b) the c
2c7c0 6f 6e 63 68 20 69 73 6e 27 74 20 74 68 65 72 65  onch isn't there
2c7d0 2c 20 61 6e 64 0a 20 20 20 20 20 20 2a 2a 20 28  , and.      ** (
2c7e0 63 29 20 74 68 65 20 66 69 6c 65 20 73 79 73 74  c) the file syst
2c7f0 65 6d 20 69 73 20 72 65 61 64 2d 6f 6e 6c 79 2c  em is read-only,
2c800 20 74 68 65 6e 20 65 6e 61 62 6c 65 20 6e 6f 2d   then enable no-
2c810 6c 6f 63 6b 69 6e 67 20 61 63 63 65 73 73 2e 0a  locking access..
2c820 20 20 20 20 20 20 2a 2a 20 55 67 68 2c 20 73 69        ** Ugh, si
2c830 6e 63 65 20 4f 5f 52 44 4f 4e 4c 59 3d 3d 30 78  nce O_RDONLY==0x
2c840 30 30 30 30 20 77 65 20 74 65 73 74 20 66 6f 72  0000 we test for
2c850 20 21 4f 5f 52 44 57 52 20 73 69 6e 63 65 20 75   !O_RDWR since u
2c860 6e 69 78 4f 70 65 6e 20 61 73 73 65 72 74 73 0a  nixOpen asserts.
2c870 20 20 20 20 20 20 2a 2a 20 74 68 61 74 20 6f 70        ** that op
2c880 65 6e 46 6c 61 67 73 20 77 69 6c 6c 20 68 61 76  enFlags will hav
2c890 65 20 6f 6e 6c 79 20 6f 6e 65 20 6f 66 20 4f 5f  e only one of O_
2c8a0 52 44 4f 4e 4c 59 20 6f 72 20 4f 5f 52 44 57 52  RDONLY or O_RDWR
2c8b0 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
2c8c0 20 73 74 72 75 63 74 20 73 74 61 74 66 73 20 66   struct statfs f
2c8d0 73 49 6e 66 6f 3b 0a 20 20 20 20 20 20 73 74 72  sInfo;.      str
2c8e0 75 63 74 20 73 74 61 74 20 63 6f 6e 63 68 49 6e  uct stat conchIn
2c8f0 66 6f 3b 0a 20 20 20 20 20 20 69 6e 74 20 67 6f  fo;.      int go
2c900 4c 6f 63 6b 6c 65 73 73 20 3d 20 30 3b 0a 0a 20  Lockless = 0;.. 
2c910 20 20 20 20 20 69 66 28 20 73 74 61 74 28 70 43       if( stat(pC
2c920 74 78 2d 3e 63 6f 6e 63 68 46 69 6c 65 50 61 74  tx->conchFilePat
2c930 68 2c 20 26 63 6f 6e 63 68 49 6e 66 6f 29 20 3d  h, &conchInfo) =
2c940 3d 20 2d 31 20 29 20 7b 0a 20 20 20 20 20 20 20  = -1 ) {.       
2c950 20 69 6e 74 20 65 72 72 20 3d 20 65 72 72 6e 6f   int err = errno
2c960 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 28 65  ;.        if( (e
2c970 72 72 3d 3d 45 4e 4f 45 4e 54 29 20 26 26 20 28  rr==ENOENT) && (
2c980 73 74 61 74 66 73 28 64 62 50 61 74 68 2c 20 26  statfs(dbPath, &
2c990 66 73 49 6e 66 6f 29 20 21 3d 20 2d 31 29 20 29  fsInfo) != -1) )
2c9a0 7b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 4c 6f  {.          goLo
2c9b0 63 6b 6c 65 73 73 20 3d 20 28 66 73 49 6e 66 6f  ckless = (fsInfo
2c9c0 2e 66 5f 66 6c 61 67 73 26 4d 4e 54 5f 52 44 4f  .f_flags&MNT_RDO
2c9d0 4e 4c 59 29 20 3d 3d 20 4d 4e 54 5f 52 44 4f 4e  NLY) == MNT_RDON
2c9e0 4c 59 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  LY;.        }.  
2c9f0 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
2ca00 67 6f 4c 6f 63 6b 6c 65 73 73 20 29 7b 0a 20 20  goLockless ){.  
2ca10 20 20 20 20 20 20 70 43 74 78 2d 3e 63 6f 6e 63        pCtx->conc
2ca20 68 48 65 6c 64 20 3d 20 2d 31 3b 20 2f 2a 20 72  hHeld = -1; /* r
2ca30 65 61 64 20 6f 6e 6c 79 20 46 53 2f 20 6c 6f 63  ead only FS/ loc
2ca40 6b 6c 65 73 73 20 2a 2f 0a 20 20 20 20 20 20 20  kless */.       
2ca50 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
2ca60 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
2ca70 20 7d 20 20 0a 20 20 69 66 28 20 72 63 3d 3d 53   }  .  if( rc==S
2ca80 51 4c 49 54 45 5f 4f 4b 20 26 26 20 6c 6f 63 6b  QLITE_OK && lock
2ca90 50 61 74 68 20 29 7b 0a 20 20 20 20 70 43 74 78  Path ){.    pCtx
2caa0 2d 3e 6c 6f 63 6b 50 72 6f 78 79 50 61 74 68 20  ->lockProxyPath 
2cab0 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72 44 75  = sqlite3DbStrDu
2cac0 70 28 30 2c 20 6c 6f 63 6b 50 61 74 68 29 3b 0a  p(0, lockPath);.
2cad0 20 20 7d 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53    }..  if( rc==S
2cae0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
2caf0 70 43 74 78 2d 3e 64 62 50 61 74 68 20 3d 20 73  pCtx->dbPath = s
2cb00 71 6c 69 74 65 33 44 62 53 74 72 44 75 70 28 30  qlite3DbStrDup(0
2cb10 2c 20 64 62 50 61 74 68 29 3b 0a 20 20 20 20 69  , dbPath);.    i
2cb20 66 28 20 70 43 74 78 2d 3e 64 62 50 61 74 68 3d  f( pCtx->dbPath=
2cb30 3d 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 20 20 72  =NULL ){.      r
2cb40 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  c = SQLITE_NOMEM
2cb50 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66  ;.    }.  }.  if
2cb60 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
2cb70 29 7b 0a 20 20 20 20 2f 2a 20 61 6c 6c 20 6d 65  ){.    /* all me
2cb80 6d 6f 72 79 20 69 73 20 61 6c 6c 6f 63 61 74 65  mory is allocate
2cb90 64 2c 20 70 72 6f 78 79 73 20 61 72 65 20 63 72  d, proxys are cr
2cba0 65 61 74 65 64 20 61 6e 64 20 61 73 73 69 67 6e  eated and assign
2cbb0 65 64 2c 20 0a 20 20 20 20 2a 2a 20 73 77 69 74  ed, .    ** swit
2cbc0 63 68 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 63  ch the locking c
2cbd0 6f 6e 74 65 78 74 20 61 6e 64 20 70 4d 65 74 68  ontext and pMeth
2cbe0 6f 64 20 74 68 65 6e 20 72 65 74 75 72 6e 2e 0a  od then return..
2cbf0 20 20 20 20 2a 2f 0a 20 20 20 20 70 43 74 78 2d      */.    pCtx-
2cc00 3e 6f 6c 64 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65  >oldLockingConte
2cc10 78 74 20 3d 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b  xt = pFile->lock
2cc20 69 6e 67 43 6f 6e 74 65 78 74 3b 0a 20 20 20 20  ingContext;.    
2cc30 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f  pFile->lockingCo
2cc40 6e 74 65 78 74 20 3d 20 70 43 74 78 3b 0a 20 20  ntext = pCtx;.  
2cc50 20 20 70 43 74 78 2d 3e 70 4f 6c 64 4d 65 74 68    pCtx->pOldMeth
2cc60 6f 64 20 3d 20 70 46 69 6c 65 2d 3e 70 4d 65 74  od = pFile->pMet
2cc70 68 6f 64 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e  hod;.    pFile->
2cc80 70 4d 65 74 68 6f 64 20 3d 20 26 70 72 6f 78 79  pMethod = &proxy
2cc90 49 6f 4d 65 74 68 6f 64 73 3b 0a 20 20 7d 65 6c  IoMethods;.  }el
2cca0 73 65 7b 0a 20 20 20 20 69 66 28 20 70 43 74 78  se{.    if( pCtx
2ccb0 2d 3e 63 6f 6e 63 68 46 69 6c 65 20 29 7b 20 0a  ->conchFile ){ .
2ccc0 20 20 20 20 20 20 70 43 74 78 2d 3e 63 6f 6e 63        pCtx->conc
2ccd0 68 46 69 6c 65 2d 3e 70 4d 65 74 68 6f 64 2d 3e  hFile->pMethod->
2cce0 78 43 6c 6f 73 65 28 28 73 71 6c 69 74 65 33 5f  xClose((sqlite3_
2ccf0 66 69 6c 65 20 2a 29 70 43 74 78 2d 3e 63 6f 6e  file *)pCtx->con
2cd00 63 68 46 69 6c 65 29 3b 0a 20 20 20 20 20 20 73  chFile);.      s
2cd10 71 6c 69 74 65 33 5f 66 72 65 65 28 70 43 74 78  qlite3_free(pCtx
2cd20 2d 3e 63 6f 6e 63 68 46 69 6c 65 29 3b 0a 20 20  ->conchFile);.  
2cd30 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f    }.    sqlite3_
2cd40 66 72 65 65 28 70 43 74 78 2d 3e 6c 6f 63 6b 50  free(pCtx->lockP
2cd50 72 6f 78 79 50 61 74 68 29 3b 0a 20 20 20 20 73  roxyPath);.    s
2cd60 71 6c 69 74 65 33 5f 66 72 65 65 28 70 43 74 78  qlite3_free(pCtx
2cd70 2d 3e 63 6f 6e 63 68 46 69 6c 65 50 61 74 68 29  ->conchFilePath)
2cd80 3b 20 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  ; .    sqlite3_f
2cd90 72 65 65 28 70 43 74 78 29 3b 0a 20 20 7d 0a 20  ree(pCtx);.  }. 
2cda0 20 4f 53 54 52 41 43 45 33 28 22 54 52 41 4e 53   OSTRACE3("TRANS
2cdb0 50 52 4f 58 59 20 20 25 64 20 25 73 5c 6e 22 2c  PROXY  %d %s\n",
2cdc0 20 70 46 69 6c 65 2d 3e 68 2c 0a 20 20 20 20 20   pFile->h,.     
2cdd0 20 20 20 20 20 20 28 72 63 3d 3d 53 51 4c 49 54        (rc==SQLIT
2cde0 45 5f 4f 4b 20 3f 20 22 6f 6b 22 20 3a 20 22 66  E_OK ? "ok" : "f
2cdf0 61 69 6c 65 64 22 29 29 3b 0a 20 20 72 65 74 75  ailed"));.  retu
2ce00 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  rn rc;.}.../*.**
2ce10 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 68 61   This routine ha
2ce20 6e 64 6c 65 73 20 73 71 6c 69 74 65 33 5f 66 69  ndles sqlite3_fi
2ce30 6c 65 5f 63 6f 6e 74 72 6f 6c 28 29 20 63 61 6c  le_control() cal
2ce40 6c 73 20 74 68 61 74 20 61 72 65 20 73 70 65 63  ls that are spec
2ce50 69 66 69 63 0a 2a 2a 20 74 6f 20 70 72 6f 78 79  ific.** to proxy
2ce60 20 6c 6f 63 6b 69 6e 67 2e 0a 2a 2f 0a 73 74 61   locking..*/.sta
2ce70 74 69 63 20 69 6e 74 20 70 72 6f 78 79 46 69 6c  tic int proxyFil
2ce80 65 43 6f 6e 74 72 6f 6c 28 73 71 6c 69 74 65 33  eControl(sqlite3
2ce90 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 6f  _file *id, int o
2cea0 70 2c 20 76 6f 69 64 20 2a 70 41 72 67 29 7b 0a  p, void *pArg){.
2ceb0 20 20 73 77 69 74 63 68 28 20 6f 70 20 29 7b 0a    switch( op ){.
2cec0 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
2ced0 47 45 54 5f 4c 4f 43 4b 50 52 4f 58 59 46 49 4c  GET_LOCKPROXYFIL
2cee0 45 3a 20 7b 0a 20 20 20 20 20 20 75 6e 69 78 46  E: {.      unixF
2cef0 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e  ile *pFile = (un
2cf00 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 20 20  ixFile*)id;.    
2cf10 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 70 4d 65    if( pFile->pMe
2cf20 74 68 6f 64 20 3d 3d 20 26 70 72 6f 78 79 49 6f  thod == &proxyIo
2cf30 4d 65 74 68 6f 64 73 20 29 7b 0a 20 20 20 20 20  Methods ){.     
2cf40 20 20 20 70 72 6f 78 79 4c 6f 63 6b 69 6e 67 43     proxyLockingC
2cf50 6f 6e 74 65 78 74 20 2a 70 43 74 78 20 3d 20 28  ontext *pCtx = (
2cf60 70 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74  proxyLockingCont
2cf70 65 78 74 2a 29 70 46 69 6c 65 2d 3e 6c 6f 63 6b  ext*)pFile->lock
2cf80 69 6e 67 43 6f 6e 74 65 78 74 3b 0a 20 20 20 20  ingContext;.    
2cf90 20 20 20 20 70 72 6f 78 79 54 61 6b 65 43 6f 6e      proxyTakeCon
2cfa0 63 68 28 70 46 69 6c 65 29 3b 0a 20 20 20 20 20  ch(pFile);.     
2cfb0 20 20 20 69 66 28 20 70 43 74 78 2d 3e 6c 6f 63     if( pCtx->loc
2cfc0 6b 50 72 6f 78 79 50 61 74 68 20 29 7b 0a 20 20  kProxyPath ){.  
2cfd0 20 20 20 20 20 20 20 20 2a 28 63 6f 6e 73 74 20          *(const 
2cfe0 63 68 61 72 20 2a 2a 29 70 41 72 67 20 3d 20 70  char **)pArg = p
2cff0 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 50 61  Ctx->lockProxyPa
2d000 74 68 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  th;.        }els
2d010 65 7b 0a 20 20 20 20 20 20 20 20 20 20 2a 28 63  e{.          *(c
2d020 6f 6e 73 74 20 63 68 61 72 20 2a 2a 29 70 41 72  onst char **)pAr
2d030 67 20 3d 20 22 3a 61 75 74 6f 3a 20 28 6e 6f 74  g = ":auto: (not
2d040 20 68 65 6c 64 29 22 3b 0a 20 20 20 20 20 20 20   held)";.       
2d050 20 7d 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 20   }.      } else 
2d060 7b 0a 20 20 20 20 20 20 20 20 2a 28 63 6f 6e 73  {.        *(cons
2d070 74 20 63 68 61 72 20 2a 2a 29 70 41 72 67 20 3d  t char **)pArg =
2d080 20 4e 55 4c 4c 3b 0a 20 20 20 20 20 20 7d 0a 20   NULL;.      }. 
2d090 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
2d0a0 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20  TE_OK;.    }.   
2d0b0 20 63 61 73 65 20 53 51 4c 49 54 45 5f 53 45 54   case SQLITE_SET
2d0c0 5f 4c 4f 43 4b 50 52 4f 58 59 46 49 4c 45 3a 20  _LOCKPROXYFILE: 
2d0d0 7b 0a 20 20 20 20 20 20 75 6e 69 78 46 69 6c 65  {.      unixFile
2d0e0 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46   *pFile = (unixF
2d0f0 69 6c 65 2a 29 69 64 3b 0a 20 20 20 20 20 20 69  ile*)id;.      i
2d100 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
2d110 4b 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 73 50  K;.      int isP
2d120 72 6f 78 79 53 74 79 6c 65 20 3d 20 28 70 46 69  roxyStyle = (pFi
2d130 6c 65 2d 3e 70 4d 65 74 68 6f 64 20 3d 3d 20 26  le->pMethod == &
2d140 70 72 6f 78 79 49 6f 4d 65 74 68 6f 64 73 29 3b  proxyIoMethods);
2d150 0a 20 20 20 20 20 20 69 66 28 20 70 41 72 67 3d  .      if( pArg=
2d160 3d 4e 55 4c 4c 20 7c 7c 20 28 63 6f 6e 73 74 20  =NULL || (const 
2d170 63 68 61 72 20 2a 29 70 41 72 67 3d 3d 30 20 29  char *)pArg==0 )
2d180 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 73  {.        if( is
2d190 50 72 6f 78 79 53 74 79 6c 65 20 29 7b 0a 20 20  ProxyStyle ){.  
2d1a0 20 20 20 20 20 20 20 20 2f 2a 20 74 75 72 6e 20          /* turn 
2d1b0 6f 66 66 20 70 72 6f 78 79 20 6c 6f 63 6b 69 6e  off proxy lockin
2d1c0 67 20 2d 20 6e 6f 74 20 73 75 70 70 6f 72 74 65  g - not supporte
2d1d0 64 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 72  d */.          r
2d1e0 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  c = SQLITE_ERROR
2d1f0 20 2f 2a 53 51 4c 49 54 45 5f 50 52 4f 54 4f 43   /*SQLITE_PROTOC
2d200 4f 4c 3f 20 53 51 4c 49 54 45 5f 4d 49 53 55 53  OL? SQLITE_MISUS
2d210 45 3f 2a 2f 3b 0a 20 20 20 20 20 20 20 20 7d 65  E?*/;.        }e
2d220 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 2f  lse{.          /
2d230 2a 20 74 75 72 6e 20 6f 66 66 20 70 72 6f 78 79  * turn off proxy
2d240 20 6c 6f 63 6b 69 6e 67 20 2d 20 61 6c 72 65 61   locking - alrea
2d250 64 79 20 6f 66 66 20 2d 20 4e 4f 4f 50 20 2a 2f  dy off - NOOP */
2d260 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
2d270 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20  SQLITE_OK;.     
2d280 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65     }.      }else
2d290 7b 0a 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20  {.        const 
2d2a0 63 68 61 72 20 2a 70 72 6f 78 79 50 61 74 68 20  char *proxyPath 
2d2b0 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 29  = (const char *)
2d2c0 70 41 72 67 3b 0a 20 20 20 20 20 20 20 20 69 66  pArg;.        if
2d2d0 28 20 69 73 50 72 6f 78 79 53 74 79 6c 65 20 29  ( isProxyStyle )
2d2e0 7b 0a 20 20 20 20 20 20 20 20 20 20 70 72 6f 78  {.          prox
2d2f0 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20  yLockingContext 
2d300 2a 70 43 74 78 20 3d 20 0a 20 20 20 20 20 20 20  *pCtx = .       
2d310 20 20 20 20 20 28 70 72 6f 78 79 4c 6f 63 6b 69       (proxyLocki
2d320 6e 67 43 6f 6e 74 65 78 74 2a 29 70 46 69 6c 65  ngContext*)pFile
2d330 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  ->lockingContext
2d340 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
2d350 21 73 74 72 63 6d 70 28 70 41 72 67 2c 20 22 3a  !strcmp(pArg, ":
2d360 61 75 74 6f 3a 22 29 20 0a 20 20 20 20 20 20 20  auto:") .       
2d370 20 20 20 20 7c 7c 20 28 70 43 74 78 2d 3e 6c 6f      || (pCtx->lo
2d380 63 6b 50 72 6f 78 79 50 61 74 68 20 26 26 0a 20  ckProxyPath &&. 
2d390 20 20 20 20 20 20 20 20 20 20 20 20 20 20 21 73                !s
2d3a0 74 72 6e 63 6d 70 28 70 43 74 78 2d 3e 6c 6f 63  trncmp(pCtx->loc
2d3b0 6b 50 72 6f 78 79 50 61 74 68 2c 20 70 72 6f 78  kProxyPath, prox
2d3c0 79 50 61 74 68 2c 20 4d 41 58 50 41 54 48 4c 45  yPath, MAXPATHLE
2d3d0 4e 29 29 0a 20 20 20 20 20 20 20 20 20 20 29 7b  N)).          ){
2d3e0 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20  .            rc 
2d3f0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  = SQLITE_OK;.   
2d400 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
2d410 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73            rc = s
2d420 77 69 74 63 68 4c 6f 63 6b 50 72 6f 78 79 50 61  witchLockProxyPa
2d430 74 68 28 70 46 69 6c 65 2c 20 70 72 6f 78 79 50  th(pFile, proxyP
2d440 61 74 68 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ath);.          
2d450 7d 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  }.        }else{
2d460 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 74 75  .          /* tu
2d470 72 6e 20 6f 6e 20 70 72 6f 78 79 20 66 69 6c 65  rn on proxy file
2d480 20 6c 6f 63 6b 69 6e 67 20 2a 2f 0a 20 20 20 20   locking */.    
2d490 20 20 20 20 20 20 72 63 20 3d 20 70 72 6f 78 79        rc = proxy
2d4a0 54 72 61 6e 73 66 6f 72 6d 55 6e 69 78 46 69 6c  TransformUnixFil
2d4b0 65 28 70 46 69 6c 65 2c 20 70 72 6f 78 79 50 61  e(pFile, proxyPa
2d4c0 74 68 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  th);.        }. 
2d4d0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65 74       }.      ret
2d4e0 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20  urn rc;.    }.  
2d4f0 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20    default: {.   
2d500 20 20 20 61 73 73 65 72 74 28 20 30 20 29 3b 20     assert( 0 ); 
2d510 20 2f 2a 20 54 68 65 20 63 61 6c 6c 20 61 73 73   /* The call ass
2d520 75 72 65 73 20 74 68 61 74 20 6f 6e 6c 79 20 76  ures that only v
2d530 61 6c 69 64 20 6f 70 63 6f 64 65 73 20 61 72 65  alid opcodes are
2d540 20 73 65 6e 74 20 2a 2f 0a 20 20 20 20 7d 0a 20   sent */.    }. 
2d550 20 7d 0a 20 20 2f 2a 4e 4f 54 52 45 41 43 48 45   }.  /*NOTREACHE
2d560 44 2a 2f 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  D*/.  return SQL
2d570 49 54 45 5f 45 52 52 4f 52 3b 0a 7d 0a 0a 2f 2a  ITE_ERROR;.}../*
2d580 0a 2a 2a 20 57 69 74 68 69 6e 20 74 68 69 73 20  .** Within this 
2d590 64 69 76 69 73 69 6f 6e 20 28 74 68 65 20 70 72  division (the pr
2d5a0 6f 78 79 69 6e 67 20 6c 6f 63 6b 69 6e 67 20 69  oxying locking i
2d5b0 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 29 20 74  mplementation) t
2d5c0 68 65 20 70 72 6f 63 65 64 75 72 65 73 0a 2a 2a  he procedures.**
2d5d0 20 61 62 6f 76 65 20 74 68 69 73 20 70 6f 69 6e   above this poin
2d5e0 74 20 61 72 65 20 61 6c 6c 20 75 74 69 6c 69 74  t are all utilit
2d5f0 69 65 73 2e 20 20 54 68 65 20 6c 6f 63 6b 2d 72  ies.  The lock-r
2d600 65 6c 61 74 65 64 20 6d 65 74 68 6f 64 73 20 6f  elated methods o
2d610 66 20 74 68 65 0a 2a 2a 20 70 72 6f 78 79 2d 6c  f the.** proxy-l
2d620 6f 63 6b 69 6e 67 20 73 71 6c 69 74 65 33 5f 69  ocking sqlite3_i
2d630 6f 5f 6d 65 74 68 6f 64 20 6f 62 6a 65 63 74 20  o_method object 
2d640 66 6f 6c 6c 6f 77 2e 0a 2a 2f 0a 0a 0a 2f 2a 0a  follow..*/.../*.
2d650 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
2d660 63 68 65 63 6b 73 20 69 66 20 74 68 65 72 65 20  checks if there 
2d670 69 73 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f  is a RESERVED lo
2d680 63 6b 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 73  ck held on the s
2d690 70 65 63 69 66 69 65 64 0a 2a 2a 20 66 69 6c 65  pecified.** file
2d6a0 20 62 79 20 74 68 69 73 20 6f 72 20 61 6e 79 20   by this or any 
2d6b0 6f 74 68 65 72 20 70 72 6f 63 65 73 73 2e 20 49  other process. I
2d6c0 66 20 73 75 63 68 20 61 20 6c 6f 63 6b 20 69 73  f such a lock is
2d6d0 20 68 65 6c 64 2c 20 73 65 74 20 2a 70 52 65 73   held, set *pRes
2d6e0 4f 75 74 0a 2a 2a 20 74 6f 20 61 20 6e 6f 6e 2d  Out.** to a non-
2d6f0 7a 65 72 6f 20 76 61 6c 75 65 20 6f 74 68 65 72  zero value other
2d700 77 69 73 65 20 2a 70 52 65 73 4f 75 74 20 69 73  wise *pResOut is
2d710 20 73 65 74 20 74 6f 20 7a 65 72 6f 2e 20 20 54   set to zero.  T
2d720 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 0a  he return value.
2d730 2a 2a 20 69 73 20 73 65 74 20 74 6f 20 53 51 4c  ** is set to SQL
2d740 49 54 45 5f 4f 4b 20 75 6e 6c 65 73 73 20 61 6e  ITE_OK unless an
2d750 20 49 2f 4f 20 65 72 72 6f 72 20 6f 63 63 75 72   I/O error occur
2d760 73 20 64 75 72 69 6e 67 20 6c 6f 63 6b 20 63 68  s during lock ch
2d770 65 63 6b 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69  ecking..*/.stati
2d780 63 20 69 6e 74 20 70 72 6f 78 79 43 68 65 63 6b  c int proxyCheck
2d790 52 65 73 65 72 76 65 64 4c 6f 63 6b 28 73 71 6c  ReservedLock(sql
2d7a0 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69  ite3_file *id, i
2d7b0 6e 74 20 2a 70 52 65 73 4f 75 74 29 20 7b 0a 20  nt *pResOut) {. 
2d7c0 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65   unixFile *pFile
2d7d0 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64   = (unixFile*)id
2d7e0 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 70 72 6f  ;.  int rc = pro
2d7f0 78 79 54 61 6b 65 43 6f 6e 63 68 28 70 46 69 6c  xyTakeConch(pFil
2d800 65 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  e);.  if( rc==SQ
2d810 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70  LITE_OK ){.    p
2d820 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65  roxyLockingConte
2d830 78 74 20 2a 70 43 74 78 20 3d 20 28 70 72 6f 78  xt *pCtx = (prox
2d840 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20  yLockingContext 
2d850 2a 29 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67  *)pFile->locking
2d860 43 6f 6e 74 65 78 74 3b 0a 20 20 20 20 69 66 28  Context;.    if(
2d870 20 70 43 74 78 2d 3e 63 6f 6e 63 68 48 65 6c 64   pCtx->conchHeld
2d880 3e 30 20 29 7b 0a 20 20 20 20 20 20 75 6e 69 78  >0 ){.      unix
2d890 46 69 6c 65 20 2a 70 72 6f 78 79 20 3d 20 70 43  File *proxy = pC
2d8a0 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 3b 0a 20  tx->lockProxy;. 
2d8b0 20 20 20 20 20 72 65 74 75 72 6e 20 70 72 6f 78       return prox
2d8c0 79 2d 3e 70 4d 65 74 68 6f 64 2d 3e 78 43 68 65  y->pMethod->xChe
2d8d0 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 28 28  ckReservedLock((
2d8e0 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29 70 72  sqlite3_file*)pr
2d8f0 6f 78 79 2c 20 70 52 65 73 4f 75 74 29 3b 0a 20  oxy, pResOut);. 
2d900 20 20 20 7d 65 6c 73 65 7b 20 2f 2a 20 63 6f 6e     }else{ /* con
2d910 63 68 48 65 6c 64 20 3c 20 30 20 69 73 20 6c 6f  chHeld < 0 is lo
2d920 63 6b 6c 65 73 73 20 2a 2f 0a 20 20 20 20 20 20  ckless */.      
2d930 70 52 65 73 4f 75 74 3d 30 3b 0a 20 20 20 20 7d  pResOut=0;.    }
2d940 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
2d950 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 6b 20  ;.}../*.** Lock 
2d960 74 68 65 20 66 69 6c 65 20 77 69 74 68 20 74 68  the file with th
2d970 65 20 6c 6f 63 6b 20 73 70 65 63 69 66 69 65 64  e lock specified
2d980 20 62 79 20 70 61 72 61 6d 65 74 65 72 20 6c 6f   by parameter lo
2d990 63 6b 74 79 70 65 20 2d 20 6f 6e 65 0a 2a 2a 20  cktype - one.** 
2d9a0 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  of the following
2d9b0 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28 31 29 20  :.**.**     (1) 
2d9c0 53 48 41 52 45 44 5f 4c 4f 43 4b 0a 2a 2a 20 20  SHARED_LOCK.**  
2d9d0 20 20 20 28 32 29 20 52 45 53 45 52 56 45 44 5f     (2) RESERVED_
2d9e0 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 33 29 20  LOCK.**     (3) 
2d9f0 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 0a 2a 2a 20  PENDING_LOCK.** 
2da00 20 20 20 20 28 34 29 20 45 58 43 4c 55 53 49 56      (4) EXCLUSIV
2da10 45 5f 4c 4f 43 4b 0a 2a 2a 0a 2a 2a 20 53 6f 6d  E_LOCK.**.** Som
2da20 65 74 69 6d 65 73 20 77 68 65 6e 20 72 65 71 75  etimes when requ
2da30 65 73 74 69 6e 67 20 6f 6e 65 20 6c 6f 63 6b 20  esting one lock 
2da40 73 74 61 74 65 2c 20 61 64 64 69 74 69 6f 6e 61  state, additiona
2da50 6c 20 6c 6f 63 6b 20 73 74 61 74 65 73 0a 2a 2a  l lock states.**
2da60 20 61 72 65 20 69 6e 73 65 72 74 65 64 20 69 6e   are inserted in
2da70 20 62 65 74 77 65 65 6e 2e 20 20 54 68 65 20 6c   between.  The l
2da80 6f 63 6b 69 6e 67 20 6d 69 67 68 74 20 66 61 69  ocking might fai
2da90 6c 20 6f 6e 20 6f 6e 65 20 6f 66 20 74 68 65 20  l on one of the 
2daa0 6c 61 74 65 72 0a 2a 2a 20 74 72 61 6e 73 69 74  later.** transit
2dab0 69 6f 6e 73 20 6c 65 61 76 69 6e 67 20 74 68 65  ions leaving the
2dac0 20 6c 6f 63 6b 20 73 74 61 74 65 20 64 69 66 66   lock state diff
2dad0 65 72 65 6e 74 20 66 72 6f 6d 20 77 68 61 74 20  erent from what 
2dae0 69 74 20 73 74 61 72 74 65 64 20 62 75 74 0a 2a  it started but.*
2daf0 2a 20 73 74 69 6c 6c 20 73 68 6f 72 74 20 6f 66  * still short of
2db00 20 69 74 73 20 67 6f 61 6c 2e 20 20 54 68 65 20   its goal.  The 
2db10 66 6f 6c 6c 6f 77 69 6e 67 20 63 68 61 72 74 20  following chart 
2db20 73 68 6f 77 73 20 74 68 65 20 61 6c 6c 6f 77 65  shows the allowe
2db30 64 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e 73  d.** transitions
2db40 20 61 6e 64 20 74 68 65 20 69 6e 73 65 72 74 65   and the inserte
2db50 64 20 69 6e 74 65 72 6d 65 64 69 61 74 65 20 73  d intermediate s
2db60 74 61 74 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  tates:.**.**    
2db70 55 4e 4c 4f 43 4b 45 44 20 2d 3e 20 53 48 41 52  UNLOCKED -> SHAR
2db80 45 44 0a 2a 2a 20 20 20 20 53 48 41 52 45 44 20  ED.**    SHARED 
2db90 2d 3e 20 52 45 53 45 52 56 45 44 0a 2a 2a 20 20  -> RESERVED.**  
2dba0 20 20 53 48 41 52 45 44 20 2d 3e 20 28 50 45 4e    SHARED -> (PEN
2dbb0 44 49 4e 47 29 20 2d 3e 20 45 58 43 4c 55 53 49  DING) -> EXCLUSI
2dbc0 56 45 0a 2a 2a 20 20 20 20 52 45 53 45 52 56 45  VE.**    RESERVE
2dbd0 44 20 2d 3e 20 28 50 45 4e 44 49 4e 47 29 20 2d  D -> (PENDING) -
2dbe0 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20 20  > EXCLUSIVE.**  
2dbf0 20 20 50 45 4e 44 49 4e 47 20 2d 3e 20 45 58 43    PENDING -> EXC
2dc00 4c 55 53 49 56 45 0a 2a 2a 0a 2a 2a 20 54 68 69  LUSIVE.**.** Thi
2dc10 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 6f  s routine will o
2dc20 6e 6c 79 20 69 6e 63 72 65 61 73 65 20 61 20 6c  nly increase a l
2dc30 6f 63 6b 2e 20 20 55 73 65 20 74 68 65 20 73 71  ock.  Use the sq
2dc40 6c 69 74 65 33 4f 73 55 6e 6c 6f 63 6b 28 29 0a  lite3OsUnlock().
2dc50 2a 2a 20 72 6f 75 74 69 6e 65 20 74 6f 20 6c 6f  ** routine to lo
2dc60 77 65 72 20 61 20 6c 6f 63 6b 69 6e 67 20 6c 65  wer a locking le
2dc70 76 65 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  vel..*/.static i
2dc80 6e 74 20 70 72 6f 78 79 4c 6f 63 6b 28 73 71 6c  nt proxyLock(sql
2dc90 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69  ite3_file *id, i
2dca0 6e 74 20 6c 6f 63 6b 74 79 70 65 29 20 7b 0a 20  nt locktype) {. 
2dcb0 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65   unixFile *pFile
2dcc0 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64   = (unixFile*)id
2dcd0 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 70 72 6f  ;.  int rc = pro
2dce0 78 79 54 61 6b 65 43 6f 6e 63 68 28 70 46 69 6c  xyTakeConch(pFil
2dcf0 65 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  e);.  if( rc==SQ
2dd00 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70  LITE_OK ){.    p
2dd10 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65  roxyLockingConte
2dd20 78 74 20 2a 70 43 74 78 20 3d 20 28 70 72 6f 78  xt *pCtx = (prox
2dd30 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20  yLockingContext 
2dd40 2a 29 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67  *)pFile->locking
2dd50 43 6f 6e 74 65 78 74 3b 0a 20 20 20 20 69 66 28  Context;.    if(
2dd60 20 70 43 74 78 2d 3e 63 6f 6e 63 68 48 65 6c 64   pCtx->conchHeld
2dd70 3e 30 20 29 7b 0a 20 20 20 20 20 20 75 6e 69 78  >0 ){.      unix
2dd80 46 69 6c 65 20 2a 70 72 6f 78 79 20 3d 20 70 43  File *proxy = pC
2dd90 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 3b 0a 20  tx->lockProxy;. 
2dda0 20 20 20 20 20 72 63 20 3d 20 70 72 6f 78 79 2d       rc = proxy-
2ddb0 3e 70 4d 65 74 68 6f 64 2d 3e 78 4c 6f 63 6b 28  >pMethod->xLock(
2ddc0 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29 70  (sqlite3_file*)p
2ddd0 72 6f 78 79 2c 20 6c 6f 63 6b 74 79 70 65 29 3b  roxy, locktype);
2dde0 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 6f  .      pFile->lo
2ddf0 63 6b 74 79 70 65 20 3d 20 70 72 6f 78 79 2d 3e  cktype = proxy->
2de00 6c 6f 63 6b 74 79 70 65 3b 0a 20 20 20 20 7d 65  locktype;.    }e
2de10 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 63 6f  lse{.      /* co
2de20 6e 63 68 48 65 6c 64 20 3c 20 30 20 69 73 20 6c  nchHeld < 0 is l
2de30 6f 63 6b 6c 65 73 73 20 2a 2f 0a 20 20 20 20 7d  ockless */.    }
2de40 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
2de50 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 77 65  ;.}.../*.** Lowe
2de60 72 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65  r the locking le
2de70 76 65 6c 20 6f 6e 20 66 69 6c 65 20 64 65 73 63  vel on file desc
2de80 72 69 70 74 6f 72 20 70 46 69 6c 65 20 74 6f 20  riptor pFile to 
2de90 6c 6f 63 6b 74 79 70 65 2e 20 20 6c 6f 63 6b 74  locktype.  lockt
2dea0 79 70 65 0a 2a 2a 20 6d 75 73 74 20 62 65 20 65  ype.** must be e
2deb0 69 74 68 65 72 20 4e 4f 5f 4c 4f 43 4b 20 6f 72  ither NO_LOCK or
2dec0 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2e 0a 2a 2a   SHARED_LOCK..**
2ded0 0a 2a 2a 20 49 66 20 74 68 65 20 6c 6f 63 6b 69  .** If the locki
2dee0 6e 67 20 6c 65 76 65 6c 20 6f 66 20 74 68 65 20  ng level of the 
2def0 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
2df00 69 73 20 61 6c 72 65 61 64 79 20 61 74 20 6f 72  is already at or
2df10 20 62 65 6c 6f 77 0a 2a 2a 20 74 68 65 20 72 65   below.** the re
2df20 71 75 65 73 74 65 64 20 6c 6f 63 6b 69 6e 67 20  quested locking 
2df30 6c 65 76 65 6c 2c 20 74 68 69 73 20 72 6f 75 74  level, this rout
2df40 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a  ine is a no-op..
2df50 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72  */.static int pr
2df60 6f 78 79 55 6e 6c 6f 63 6b 28 73 71 6c 69 74 65  oxyUnlock(sqlite
2df70 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20  3_file *id, int 
2df80 6c 6f 63 6b 74 79 70 65 29 20 7b 0a 20 20 75 6e  locktype) {.  un
2df90 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20  ixFile *pFile = 
2dfa0 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20  (unixFile*)id;. 
2dfb0 20 69 6e 74 20 72 63 20 3d 20 70 72 6f 78 79 54   int rc = proxyT
2dfc0 61 6b 65 43 6f 6e 63 68 28 70 46 69 6c 65 29 3b  akeConch(pFile);
2dfd0 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
2dfe0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 72 6f 78  E_OK ){.    prox
2dff0 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20  yLockingContext 
2e000 2a 70 43 74 78 20 3d 20 28 70 72 6f 78 79 4c 6f  *pCtx = (proxyLo
2e010 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 29 70  ckingContext *)p
2e020 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e  File->lockingCon
2e030 74 65 78 74 3b 0a 20 20 20 20 69 66 28 20 70 43  text;.    if( pC
2e040 74 78 2d 3e 63 6f 6e 63 68 48 65 6c 64 3e 30 20  tx->conchHeld>0 
2e050 29 7b 0a 20 20 20 20 20 20 75 6e 69 78 46 69 6c  ){.      unixFil
2e060 65 20 2a 70 72 6f 78 79 20 3d 20 70 43 74 78 2d  e *proxy = pCtx-
2e070 3e 6c 6f 63 6b 50 72 6f 78 79 3b 0a 20 20 20 20  >lockProxy;.    
2e080 20 20 72 63 20 3d 20 70 72 6f 78 79 2d 3e 70 4d    rc = proxy->pM
2e090 65 74 68 6f 64 2d 3e 78 55 6e 6c 6f 63 6b 28 28  ethod->xUnlock((
2e0a0 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29 70 72  sqlite3_file*)pr
2e0b0 6f 78 79 2c 20 6c 6f 63 6b 74 79 70 65 29 3b 0a  oxy, locktype);.
2e0c0 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 6f 63        pFile->loc
2e0d0 6b 74 79 70 65 20 3d 20 70 72 6f 78 79 2d 3e 6c  ktype = proxy->l
2e0e0 6f 63 6b 74 79 70 65 3b 0a 20 20 20 20 7d 65 6c  ocktype;.    }el
2e0f0 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 63 6f 6e  se{.      /* con
2e100 63 68 48 65 6c 64 20 3c 20 30 20 69 73 20 6c 6f  chHeld < 0 is lo
2e110 63 6b 6c 65 73 73 20 2a 2f 0a 20 20 20 20 7d 0a  ckless */.    }.
2e120 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
2e130 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20  .}../*.** Close 
2e140 61 20 66 69 6c 65 20 74 68 61 74 20 75 73 65 73  a file that uses
2e150 20 70 72 6f 78 79 20 6c 6f 63 6b 73 2e 0a 2a 2f   proxy locks..*/
2e160 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72 6f 78  .static int prox
2e170 79 43 6c 6f 73 65 28 73 71 6c 69 74 65 33 5f 66  yClose(sqlite3_f
2e180 69 6c 65 20 2a 69 64 29 20 7b 0a 20 20 69 66 28  ile *id) {.  if(
2e190 20 69 64 20 29 7b 0a 20 20 20 20 75 6e 69 78 46   id ){.    unixF
2e1a0 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e  ile *pFile = (un
2e1b0 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 20 20  ixFile*)id;.    
2e1c0 70 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74  proxyLockingCont
2e1d0 65 78 74 20 2a 70 43 74 78 20 3d 20 28 70 72 6f  ext *pCtx = (pro
2e1e0 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  xyLockingContext
2e1f0 20 2a 29 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e   *)pFile->lockin
2e200 67 43 6f 6e 74 65 78 74 3b 0a 20 20 20 20 75 6e  gContext;.    un
2e210 69 78 46 69 6c 65 20 2a 6c 6f 63 6b 50 72 6f 78  ixFile *lockProx
2e220 79 20 3d 20 70 43 74 78 2d 3e 6c 6f 63 6b 50 72  y = pCtx->lockPr
2e230 6f 78 79 3b 0a 20 20 20 20 75 6e 69 78 46 69 6c  oxy;.    unixFil
2e240 65 20 2a 63 6f 6e 63 68 46 69 6c 65 20 3d 20 70  e *conchFile = p
2e250 43 74 78 2d 3e 63 6f 6e 63 68 46 69 6c 65 3b 0a  Ctx->conchFile;.
2e260 20 20 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c      int rc = SQL
2e270 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 0a 20 20 20  ITE_OK;.    .   
2e280 20 69 66 28 20 6c 6f 63 6b 50 72 6f 78 79 20 29   if( lockProxy )
2e290 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 6c 6f 63  {.      rc = loc
2e2a0 6b 50 72 6f 78 79 2d 3e 70 4d 65 74 68 6f 64 2d  kProxy->pMethod-
2e2b0 3e 78 55 6e 6c 6f 63 6b 28 28 73 71 6c 69 74 65  >xUnlock((sqlite
2e2c0 33 5f 66 69 6c 65 2a 29 6c 6f 63 6b 50 72 6f 78  3_file*)lockProx
2e2d0 79 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20 20 20  y, NO_LOCK);.   
2e2e0 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75     if( rc ) retu
2e2f0 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 72 63 20  rn rc;.      rc 
2e300 3d 20 6c 6f 63 6b 50 72 6f 78 79 2d 3e 70 4d 65  = lockProxy->pMe
2e310 74 68 6f 64 2d 3e 78 43 6c 6f 73 65 28 28 73 71  thod->xClose((sq
2e320 6c 69 74 65 33 5f 66 69 6c 65 2a 29 6c 6f 63 6b  lite3_file*)lock
2e330 50 72 6f 78 79 29 3b 0a 20 20 20 20 20 20 69 66  Proxy);.      if
2e340 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
2e350 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
2e360 66 72 65 65 28 6c 6f 63 6b 50 72 6f 78 79 29 3b  free(lockProxy);
2e370 0a 20 20 20 20 20 20 70 43 74 78 2d 3e 6c 6f 63  .      pCtx->loc
2e380 6b 50 72 6f 78 79 20 3d 20 30 3b 0a 20 20 20 20  kProxy = 0;.    
2e390 7d 0a 20 20 20 20 69 66 28 20 63 6f 6e 63 68 46  }.    if( conchF
2e3a0 69 6c 65 20 29 7b 0a 20 20 20 20 20 20 69 66 28  ile ){.      if(
2e3b0 20 70 43 74 78 2d 3e 63 6f 6e 63 68 48 65 6c 64   pCtx->conchHeld
2e3c0 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
2e3d0 20 70 72 6f 78 79 52 65 6c 65 61 73 65 43 6f 6e   proxyReleaseCon
2e3e0 63 68 28 70 46 69 6c 65 29 3b 0a 20 20 20 20 20  ch(pFile);.     
2e3f0 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75     if( rc ) retu
2e400 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20  rn rc;.      }. 
2e410 20 20 20 20 20 72 63 20 3d 20 63 6f 6e 63 68 46       rc = conchF
2e420 69 6c 65 2d 3e 70 4d 65 74 68 6f 64 2d 3e 78 43  ile->pMethod->xC
2e430 6c 6f 73 65 28 28 73 71 6c 69 74 65 33 5f 66 69  lose((sqlite3_fi
2e440 6c 65 2a 29 63 6f 6e 63 68 46 69 6c 65 29 3b 0a  le*)conchFile);.
2e450 20 20 20 20 20 20 69 66 28 20 72 63 20 29 20 72        if( rc ) r
2e460 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
2e470 73 71 6c 69 74 65 33 5f 66 72 65 65 28 63 6f 6e  sqlite3_free(con
2e480 63 68 46 69 6c 65 29 3b 0a 20 20 20 20 7d 0a 20  chFile);.    }. 
2e490 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
2e4a0 70 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 50  pCtx->lockProxyP
2e4b0 61 74 68 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ath);.    sqlite
2e4c0 33 5f 66 72 65 65 28 70 43 74 78 2d 3e 63 6f 6e  3_free(pCtx->con
2e4d0 63 68 46 69 6c 65 50 61 74 68 29 3b 0a 20 20 20  chFilePath);.   
2e4e0 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 43   sqlite3_free(pC
2e4f0 74 78 2d 3e 64 62 50 61 74 68 29 3b 0a 20 20 20  tx->dbPath);.   
2e500 20 2f 2a 20 72 65 73 74 6f 72 65 20 74 68 65 20   /* restore the 
2e510 6f 72 69 67 69 6e 61 6c 20 6c 6f 63 6b 69 6e 67  original locking
2e520 20 63 6f 6e 74 65 78 74 20 61 6e 64 20 70 4d 65   context and pMe
2e530 74 68 6f 64 20 74 68 65 6e 20 63 6c 6f 73 65 20  thod then close 
2e540 69 74 20 2a 2f 0a 20 20 20 20 70 46 69 6c 65 2d  it */.    pFile-
2e550 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20  >lockingContext 
2e560 3d 20 70 43 74 78 2d 3e 6f 6c 64 4c 6f 63 6b 69  = pCtx->oldLocki
2e570 6e 67 43 6f 6e 74 65 78 74 3b 0a 20 20 20 20 70  ngContext;.    p
2e580 46 69 6c 65 2d 3e 70 4d 65 74 68 6f 64 20 3d 20  File->pMethod = 
2e590 70 43 74 78 2d 3e 70 4f 6c 64 4d 65 74 68 6f 64  pCtx->pOldMethod
2e5a0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  ;.    sqlite3_fr
2e5b0 65 65 28 70 43 74 78 29 3b 0a 20 20 20 20 72 65  ee(pCtx);.    re
2e5c0 74 75 72 6e 20 70 46 69 6c 65 2d 3e 70 4d 65 74  turn pFile->pMet
2e5d0 68 6f 64 2d 3e 78 43 6c 6f 73 65 28 69 64 29 3b  hod->xClose(id);
2e5e0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51  .  }.  return SQ
2e5f0 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 0a 23 65  LITE_OK;.}....#e
2e600 6e 64 69 66 20 2f 2a 20 64 65 66 69 6e 65 64 28  ndif /* defined(
2e610 5f 5f 41 50 50 4c 45 5f 5f 29 20 26 26 20 53 51  __APPLE__) && SQ
2e620 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b  LITE_ENABLE_LOCK
2e630 49 4e 47 5f 53 54 59 4c 45 20 2a 2f 0a 2f 2a 0a  ING_STYLE */./*.
2e640 2a 2a 20 54 68 65 20 70 72 6f 78 79 20 6c 6f 63  ** The proxy loc
2e650 6b 69 6e 67 20 73 74 79 6c 65 20 69 73 20 69 6e  king style is in
2e660 74 65 6e 64 65 64 20 66 6f 72 20 75 73 65 20 77  tended for use w
2e670 69 74 68 20 41 46 50 20 66 69 6c 65 73 79 73 74  ith AFP filesyst
2e680 65 6d 73 2e 0a 2a 2a 20 41 6e 64 20 73 69 6e 63  ems..** And sinc
2e690 65 20 41 46 50 20 69 73 20 6f 6e 6c 79 20 73 75  e AFP is only su
2e6a0 70 70 6f 72 74 65 64 20 6f 6e 20 4d 61 63 4f 53  pported on MacOS
2e6b0 58 2c 20 74 68 65 20 70 72 6f 78 79 20 6c 6f 63  X, the proxy loc
2e6c0 6b 69 6e 67 20 69 73 20 61 6c 73 6f 0a 2a 2a 20  king is also.** 
2e6d0 72 65 73 74 72 69 63 74 65 64 20 74 6f 20 4d 61  restricted to Ma
2e6e0 63 4f 53 58 2e 0a 2a 2a 20 0a 2a 2a 0a 2a 2a 2a  cOSX..** .**.***
2e6f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2e700 20 45 6e 64 20 6f 66 20 74 68 65 20 70 72 6f 78   End of the prox
2e710 79 20 6c 6f 63 6b 20 69 6d 70 6c 65 6d 65 6e 74  y lock implement
2e720 61 74 69 6f 6e 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ation **********
2e730 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a  ************.***
2e740 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2e750 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2e760 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2e770 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2e780 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a  ***********/../*
2e790 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74  .** Initialize t
2e7a0 68 65 20 6f 70 65 72 61 74 69 6e 67 20 73 79 73  he operating sys
2e7b0 74 65 6d 20 69 6e 74 65 72 66 61 63 65 2e 0a 2a  tem interface..*
2e7c0 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
2e7d0 65 20 72 65 67 69 73 74 65 72 73 20 61 6c 6c 20  e registers all 
2e7e0 56 46 53 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  VFS implementati
2e7f0 6f 6e 73 20 66 6f 72 20 75 6e 69 78 2d 6c 69 6b  ons for unix-lik
2e800 65 20 6f 70 65 72 61 74 69 6e 67 0a 2a 2a 20 73  e operating.** s
2e810 79 73 74 65 6d 73 2e 20 20 54 68 69 73 20 72 6f  ystems.  This ro
2e820 75 74 69 6e 65 2c 20 61 6e 64 20 74 68 65 20 73  utine, and the s
2e830 71 6c 69 74 65 33 5f 6f 73 5f 65 6e 64 28 29 20  qlite3_os_end() 
2e840 72 6f 75 74 69 6e 65 20 74 68 61 74 20 66 6f 6c  routine that fol
2e850 6c 6f 77 73 2c 0a 2a 2a 20 73 68 6f 75 6c 64 20  lows,.** should 
2e860 62 65 20 74 68 65 20 6f 6e 6c 79 20 72 6f 75 74  be the only rout
2e870 69 6e 65 73 20 69 6e 20 74 68 69 73 20 66 69 6c  ines in this fil
2e880 65 20 74 68 61 74 20 61 72 65 20 76 69 73 69 62  e that are visib
2e890 6c 65 20 66 72 6f 6d 20 6f 74 68 65 72 0a 2a 2a  le from other.**
2e8a0 20 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68   files..**.** Th
2e8b0 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  is routine is ca
2e8c0 6c 6c 65 64 20 6f 6e 63 65 20 64 75 72 69 6e 67  lled once during
2e8d0 20 53 51 4c 69 74 65 20 69 6e 69 74 69 61 6c 69   SQLite initiali
2e8e0 7a 61 74 69 6f 6e 20 61 6e 64 20 62 79 20 61 0a  zation and by a.
2e8f0 2a 2a 20 73 69 6e 67 6c 65 20 74 68 72 65 61 64  ** single thread
2e900 2e 20 20 54 68 65 20 6d 65 6d 6f 72 79 20 61 6c  .  The memory al
2e910 6c 6f 63 61 74 69 6f 6e 20 61 6e 64 20 6d 75 74  location and mut
2e920 65 78 20 73 75 62 73 79 73 74 65 6d 73 20 68 61  ex subsystems ha
2e930 76 65 20 6e 6f 74 0a 2a 2a 20 6e 65 63 65 73 73  ve not.** necess
2e940 61 72 69 6c 79 20 62 65 65 6e 20 69 6e 69 74 69  arily been initi
2e950 61 6c 69 7a 65 64 20 77 68 65 6e 20 74 68 69 73  alized when this
2e960 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
2e970 65 64 2c 20 61 6e 64 20 73 6f 20 74 68 65 79 0a  ed, and so they.
2e980 2a 2a 20 73 68 6f 75 6c 64 20 6e 6f 74 20 62 65  ** should not be
2e990 20 75 73 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71   used..*/.int sq
2e9a0 6c 69 74 65 33 5f 6f 73 5f 69 6e 69 74 28 76 6f  lite3_os_init(vo
2e9b0 69 64 29 7b 20 0a 20 20 2f 2a 20 0a 20 20 2a 2a  id){ .  /* .  **
2e9c0 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 6d   The following m
2e9d0 61 63 72 6f 20 64 65 66 69 6e 65 73 20 61 6e 20  acro defines an 
2e9e0 69 6e 69 74 69 61 6c 69 7a 65 72 20 66 6f 72 20  initializer for 
2e9f0 61 6e 20 73 71 6c 69 74 65 33 5f 76 66 73 20 6f  an sqlite3_vfs o
2ea00 62 6a 65 63 74 2e 0a 20 20 2a 2a 20 54 68 65 20  bject..  ** The 
2ea10 6e 61 6d 65 20 6f 66 20 74 68 65 20 56 46 53 20  name of the VFS 
2ea20 69 73 20 4e 41 4d 45 2e 20 20 54 68 65 20 70 41  is NAME.  The pA
2ea30 70 70 44 61 74 61 20 69 73 20 61 20 70 6f 69 6e  ppData is a poin
2ea40 74 65 72 20 74 6f 20 61 20 70 6f 69 6e 74 65 72  ter to a pointer
2ea50 0a 20 20 2a 2a 20 74 6f 20 74 68 65 20 22 66 69  .  ** to the "fi
2ea60 6e 64 65 72 22 20 66 75 6e 63 74 69 6f 6e 2e 20  nder" function. 
2ea70 20 28 70 41 70 70 44 61 74 61 20 69 73 20 61 20   (pAppData is a 
2ea80 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 70 6f 69  pointer to a poi
2ea90 6e 74 65 72 20 62 65 63 61 75 73 65 0a 20 20 2a  nter because.  *
2eaa0 2a 20 73 69 6c 6c 79 20 43 39 30 20 72 75 6c 65  * silly C90 rule
2eab0 73 20 70 72 6f 68 69 62 69 74 20 61 20 76 6f 69  s prohibit a voi
2eac0 64 2a 20 66 72 6f 6d 20 62 65 69 6e 67 20 63 61  d* from being ca
2ead0 73 74 20 74 6f 20 61 20 66 75 6e 63 74 69 6f 6e  st to a function
2eae0 20 70 6f 69 6e 74 65 72 0a 20 20 2a 2a 20 61 6e   pointer.  ** an
2eaf0 64 20 73 6f 20 77 65 20 68 61 76 65 20 74 6f 20  d so we have to 
2eb00 67 6f 20 74 68 72 6f 75 67 68 20 74 68 65 20 69  go through the i
2eb10 6e 74 65 72 6d 65 64 69 61 74 65 20 70 6f 69 6e  ntermediate poin
2eb20 74 65 72 20 74 6f 20 61 76 6f 69 64 20 70 72 6f  ter to avoid pro
2eb30 62 6c 65 6d 73 0a 20 20 2a 2a 20 77 68 65 6e 20  blems.  ** when 
2eb40 63 6f 6d 70 69 6c 69 6e 67 20 77 69 74 68 20 2d  compiling with -
2eb50 70 65 64 61 6e 74 69 63 2d 65 72 72 6f 72 73 20  pedantic-errors 
2eb60 6f 6e 20 47 43 43 2e 29 0a 20 20 2a 2a 0a 20 20  on GCC.).  **.  
2eb70 2a 2a 20 54 68 65 20 46 49 4e 44 45 52 20 70 61  ** The FINDER pa
2eb80 72 61 6d 65 74 65 72 20 74 6f 20 74 68 69 73 20  rameter to this 
2eb90 6d 61 63 72 6f 20 69 73 20 74 68 65 20 6e 61 6d  macro is the nam
2eba0 65 20 6f 66 20 74 68 65 20 70 6f 69 6e 74 65 72  e of the pointer
2ebb0 20 74 6f 20 74 68 65 0a 20 20 2a 2a 20 66 69 6e   to the.  ** fin
2ebc0 64 65 72 2d 66 75 6e 63 74 69 6f 6e 2e 20 20 54  der-function.  T
2ebd0 68 65 20 66 69 6e 64 65 72 2d 66 75 6e 63 74 69  he finder-functi
2ebe0 6f 6e 20 72 65 74 75 72 6e 73 20 61 20 70 6f 69  on returns a poi
2ebf0 6e 74 65 72 20 74 6f 20 74 68 65 0a 20 20 2a 2a  nter to the.  **
2ec00 20 73 71 6c 69 74 65 5f 69 6f 5f 6d 65 74 68 6f   sqlite_io_metho
2ec10 64 73 20 6f 62 6a 65 63 74 20 74 68 61 74 20 69  ds object that i
2ec20 6d 70 6c 65 6d 65 6e 74 73 20 74 68 65 20 64 65  mplements the de
2ec30 73 69 72 65 64 20 6c 6f 63 6b 69 6e 67 0a 20 20  sired locking.  
2ec40 2a 2a 20 62 65 68 61 76 69 6f 72 73 2e 20 20 53  ** behaviors.  S
2ec50 65 65 20 74 68 65 20 64 69 76 69 73 69 6f 6e 20  ee the division 
2ec60 61 62 6f 76 65 20 74 68 61 74 20 63 6f 6e 74 61  above that conta
2ec70 69 6e 73 20 74 68 65 20 49 4f 4d 45 54 48 4f 44  ins the IOMETHOD
2ec80 53 0a 20 20 2a 2a 20 6d 61 63 72 6f 20 66 6f 72  S.  ** macro for
2ec90 20 61 64 64 69 74 69 6f 6e 20 69 6e 66 6f 72 6d   addition inform
2eca0 61 74 69 6f 6e 20 6f 6e 20 66 69 6e 64 65 72 2d  ation on finder-
2ecb0 66 75 6e 63 74 69 6f 6e 73 2e 0a 20 20 2a 2a 0a  functions..  **.
2ecc0 20 20 2a 2a 20 4d 6f 73 74 20 66 69 6e 64 65 72    ** Most finder
2ecd0 73 20 73 69 6d 70 6c 79 20 72 65 74 75 72 6e 20  s simply return 
2ece0 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 66  a pointer to a f
2ecf0 69 78 65 64 20 73 71 6c 69 74 65 33 5f 69 6f 5f  ixed sqlite3_io_
2ed00 6d 65 74 68 6f 64 73 0a 20 20 2a 2a 20 6f 62 6a  methods.  ** obj
2ed10 65 63 74 2e 20 20 42 75 74 20 74 68 65 20 22 61  ect.  But the "a
2ed20 75 74 6f 6c 6f 63 6b 49 6f 46 69 6e 64 65 72 22  utolockIoFinder"
2ed30 20 61 76 61 69 6c 61 62 6c 65 20 6f 6e 20 4d 61   available on Ma
2ed40 63 4f 53 58 20 64 6f 65 73 20 61 20 6c 69 74 74  cOSX does a litt
2ed50 6c 65 0a 20 20 2a 2a 20 6d 6f 72 65 20 74 68 61  le.  ** more tha
2ed60 6e 20 74 68 61 74 3b 20 69 74 20 6c 6f 6f 6b 73  n that; it looks
2ed70 20 61 74 20 74 68 65 20 66 69 6c 65 73 79 73 74   at the filesyst
2ed80 65 6d 20 74 79 70 65 20 74 68 61 74 20 68 6f 73  em type that hos
2ed90 74 73 20 74 68 65 20 0a 20 20 2a 2a 20 64 61 74  ts the .  ** dat
2eda0 61 62 61 73 65 20 66 69 6c 65 20 61 6e 64 20 74  abase file and t
2edb0 72 69 65 73 20 74 6f 20 63 68 6f 6f 73 65 20 61  ries to choose a
2edc0 6e 20 6c 6f 63 6b 69 6e 67 20 6d 65 74 68 6f 64  n locking method
2edd0 20 61 70 70 72 6f 70 72 69 61 74 65 20 66 6f 72   appropriate for
2ede0 0a 20 20 2a 2a 20 74 68 61 74 20 66 69 6c 65 73  .  ** that files
2edf0 79 73 74 65 6d 20 74 69 6d 65 2e 0a 20 20 2a 2f  ystem time..  */
2ee00 0a 20 20 23 64 65 66 69 6e 65 20 55 4e 49 58 56  .  #define UNIXV
2ee10 46 53 28 56 46 53 4e 41 4d 45 2c 20 46 49 4e 44  FS(VFSNAME, FIND
2ee20 45 52 29 20 7b 20 20 20 20 20 20 20 20 20 20 20  ER) {           
2ee30 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20               \. 
2ee40 20 20 20 31 2c 20 20 20 20 20 20 20 20 20 20 20     1,           
2ee50 20 20 20 20 20 20 20 20 20 2f 2a 20 69 56 65 72           /* iVer
2ee60 73 69 6f 6e 20 2a 2f 20 20 20 20 20 20 20 20 20  sion */         
2ee70 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20             \.   
2ee80 20 73 69 7a 65 6f 66 28 75 6e 69 78 46 69 6c 65   sizeof(unixFile
2ee90 29 2c 20 20 20 20 20 2f 2a 20 73 7a 4f 73 46 69  ),     /* szOsFi
2eea0 6c 65 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20  le */           
2eeb0 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 20 4d           \.    M
2eec0 41 58 5f 50 41 54 48 4e 41 4d 45 2c 20 20 20 20  AX_PATHNAME,    
2eed0 20 20 20 20 20 2f 2a 20 6d 78 50 61 74 68 6e 61       /* mxPathna
2eee0 6d 65 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20  me */           
2eef0 20 20 20 20 20 20 20 5c 0a 20 20 20 20 30 2c 20         \.    0, 
2ef00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ef10 20 20 20 2f 2a 20 70 4e 65 78 74 20 2a 2f 20 20     /* pNext */  
2ef20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ef30 20 20 20 20 20 5c 0a 20 20 20 20 56 46 53 4e 41       \.    VFSNA
2ef40 4d 45 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ME,             
2ef50 20 2f 2a 20 7a 4e 61 6d 65 20 2a 2f 20 20 20 20   /* zName */    
2ef60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ef70 20 20 20 5c 0a 20 20 20 20 28 76 6f 69 64 2a 29     \.    (void*)
2ef80 26 46 49 4e 44 45 52 2c 20 20 20 20 20 20 20 2f  &FINDER,       /
2ef90 2a 20 70 41 70 70 44 61 74 61 20 2a 2f 20 20 20  * pAppData */   
2efa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2efb0 20 5c 0a 20 20 20 20 75 6e 69 78 4f 70 65 6e 2c   \.    unixOpen,
2efc0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2efd0 78 4f 70 65 6e 20 2a 2f 20 20 20 20 20 20 20 20  xOpen */        
2efe0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c                 \
2eff0 0a 20 20 20 20 75 6e 69 78 44 65 6c 65 74 65 2c  .    unixDelete,
2f000 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 44             /* xD
2f010 65 6c 65 74 65 20 2a 2f 20 20 20 20 20 20 20 20  elete */        
2f020 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20               \. 
2f030 20 20 20 75 6e 69 78 41 63 63 65 73 73 2c 20 20     unixAccess,  
2f040 20 20 20 20 20 20 20 20 20 2f 2a 20 78 41 63 63           /* xAcc
2f050 65 73 73 20 2a 2f 20 20 20 20 20 20 20 20 20 20  ess */          
2f060 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20             \.   
2f070 20 75 6e 69 78 46 75 6c 6c 50 61 74 68 6e 61 6d   unixFullPathnam
2f080 65 2c 20 20 20 20 20 2f 2a 20 78 46 75 6c 6c 50  e,     /* xFullP
2f090 61 74 68 6e 61 6d 65 20 2a 2f 20 20 20 20 20 20  athname */      
2f0a0 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 20 75           \.    u
2f0b0 6e 69 78 44 6c 4f 70 65 6e 2c 20 20 20 20 20 20  nixDlOpen,      
2f0c0 20 20 20 20 20 2f 2a 20 78 44 6c 4f 70 65 6e 20       /* xDlOpen 
2f0d0 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20 20 20  */              
2f0e0 20 20 20 20 20 20 20 5c 0a 20 20 20 20 75 6e 69         \.    uni
2f0f0 78 44 6c 45 72 72 6f 72 2c 20 20 20 20 20 20 20  xDlError,       
2f100 20 20 20 2f 2a 20 78 44 6c 45 72 72 6f 72 20 2a     /* xDlError *
2f110 2f 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  /               
2f120 20 20 20 20 20 5c 0a 20 20 20 20 75 6e 69 78 44       \.    unixD
2f130 6c 53 79 6d 2c 20 20 20 20 20 20 20 20 20 20 20  lSym,           
2f140 20 2f 2a 20 78 44 6c 53 79 6d 20 2a 2f 20 20 20   /* xDlSym */   
2f150 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f160 20 20 20 5c 0a 20 20 20 20 75 6e 69 78 44 6c 43     \.    unixDlC
2f170 6c 6f 73 65 2c 20 20 20 20 20 20 20 20 20 20 2f  lose,          /
2f180 2a 20 78 44 6c 43 6c 6f 73 65 20 2a 2f 20 20 20  * xDlClose */   
2f190 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f1a0 20 5c 0a 20 20 20 20 75 6e 69 78 52 61 6e 64 6f   \.    unixRando
2f1b0 6d 6e 65 73 73 2c 20 20 20 20 20 20 20 2f 2a 20  mness,       /* 
2f1c0 78 52 61 6e 64 6f 6d 6e 65 73 73 20 2a 2f 20 20  xRandomness */  
2f1d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c                 \
2f1e0 0a 20 20 20 20 75 6e 69 78 53 6c 65 65 70 2c 20  .    unixSleep, 
2f1f0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53             /* xS
2f200 6c 65 65 70 20 2a 2f 20 20 20 20 20 20 20 20 20  leep */         
2f210 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20               \. 
2f220 20 20 20 75 6e 69 78 43 75 72 72 65 6e 74 54 69     unixCurrentTi
2f230 6d 65 2c 20 20 20 20 20 20 2f 2a 20 78 43 75 72  me,      /* xCur
2f240 72 65 6e 74 54 69 6d 65 20 2a 2f 20 20 20 20 20  rentTime */     
2f250 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20             \.   
2f260 20 75 6e 69 78 47 65 74 4c 61 73 74 45 72 72 6f   unixGetLastErro
2f270 72 20 20 20 20 20 20 2f 2a 20 78 47 65 74 4c 61  r      /* xGetLa
2f280 73 74 45 72 72 6f 72 20 2a 2f 20 20 20 20 20 20  stError */      
2f290 20 20 20 20 20 20 20 20 20 5c 0a 20 20 7d 0a 0a           \.  }..
2f2a0 20 20 2f 2a 0a 20 20 2a 2a 20 41 6c 6c 20 64 65    /*.  ** All de
2f2b0 66 61 75 6c 74 20 56 46 53 65 73 20 66 6f 72 20  fault VFSes for 
2f2c0 75 6e 69 78 20 61 72 65 20 63 6f 6e 74 61 69 6e  unix are contain
2f2d0 65 64 20 69 6e 20 74 68 65 20 66 6f 6c 6c 6f 77  ed in the follow
2f2e0 69 6e 67 20 61 72 72 61 79 2e 0a 20 20 2a 2a 0a  ing array..  **.
2f2f0 20 20 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 74    ** Note that t
2f300 68 65 20 73 71 6c 69 74 65 33 5f 76 66 73 2e 70  he sqlite3_vfs.p
2f310 4e 65 78 74 20 66 69 65 6c 64 20 6f 66 20 74 68  Next field of th
2f320 65 20 56 46 53 20 6f 62 6a 65 63 74 20 69 73 20  e VFS object is 
2f330 6d 6f 64 69 66 69 65 64 0a 20 20 2a 2a 20 62 79  modified.  ** by
2f340 20 74 68 65 20 53 51 4c 69 74 65 20 63 6f 72 65   the SQLite core
2f350 20 77 68 65 6e 20 74 68 65 20 56 46 53 20 69 73   when the VFS is
2f360 20 72 65 67 69 73 74 65 72 65 64 2e 20 20 53 6f   registered.  So
2f370 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a 20   the following. 
2f380 20 2a 2a 20 61 72 72 61 79 20 63 61 6e 6e 6f 74   ** array cannot
2f390 20 62 65 20 63 6f 6e 73 74 2e 0a 20 20 2a 2f 0a   be const..  */.
2f3a0 20 20 73 74 61 74 69 63 20 73 71 6c 69 74 65 33    static sqlite3
2f3b0 5f 76 66 73 20 61 56 66 73 5b 5d 20 3d 20 7b 0a  _vfs aVfs[] = {.
2f3c0 23 69 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  #if SQLITE_ENABL
2f3d0 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20  E_LOCKING_STYLE 
2f3e0 26 26 20 28 4f 53 5f 56 58 57 4f 52 4b 53 20 7c  && (OS_VXWORKS |
2f3f0 7c 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c  | defined(__APPL
2f400 45 5f 5f 29 29 0a 20 20 20 20 55 4e 49 58 56 46  E__)).    UNIXVF
2f410 53 28 22 75 6e 69 78 22 2c 20 20 20 20 20 20 20  S("unix",       
2f420 20 20 20 61 75 74 6f 6c 6f 63 6b 49 6f 46 69 6e     autolockIoFin
2f430 64 65 72 20 29 2c 0a 23 65 6c 73 65 0a 20 20 20  der ),.#else.   
2f440 20 55 4e 49 58 56 46 53 28 22 75 6e 69 78 22 2c   UNIXVFS("unix",
2f450 20 20 20 20 20 20 20 20 20 20 70 6f 73 69 78 49            posixI
2f460 6f 46 69 6e 64 65 72 20 29 2c 0a 23 65 6e 64 69  oFinder ),.#endi
2f470 66 0a 20 20 20 20 55 4e 49 58 56 46 53 28 22 75  f.    UNIXVFS("u
2f480 6e 69 78 2d 6e 6f 6e 65 22 2c 20 20 20 20 20 6e  nix-none",     n
2f490 6f 6c 6f 63 6b 49 6f 46 69 6e 64 65 72 20 29 2c  olockIoFinder ),
2f4a0 0a 20 20 20 20 55 4e 49 58 56 46 53 28 22 75 6e  .    UNIXVFS("un
2f4b0 69 78 2d 64 6f 74 66 69 6c 65 22 2c 20 20 64 6f  ix-dotfile",  do
2f4c0 74 6c 6f 63 6b 49 6f 46 69 6e 64 65 72 20 29 2c  tlockIoFinder ),
2f4d0 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a  .#if OS_VXWORKS.
2f4e0 20 20 20 20 55 4e 49 58 56 46 53 28 22 75 6e 69      UNIXVFS("uni
2f4f0 78 2d 6e 61 6d 65 64 73 65 6d 22 2c 20 73 65 6d  x-namedsem", sem
2f500 49 6f 46 69 6e 64 65 72 20 29 2c 0a 23 65 6e 64  IoFinder ),.#end
2f510 69 66 0a 23 69 66 20 53 51 4c 49 54 45 5f 45 4e  if.#if SQLITE_EN
2f520 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59  ABLE_LOCKING_STY
2f530 4c 45 0a 20 20 20 20 55 4e 49 58 56 46 53 28 22  LE.    UNIXVFS("
2f540 75 6e 69 78 2d 70 6f 73 69 78 22 2c 20 20 20 20  unix-posix",    
2f550 70 6f 73 69 78 49 6f 46 69 6e 64 65 72 20 29 2c  posixIoFinder ),
2f560 0a 23 69 66 20 21 4f 53 5f 56 58 57 4f 52 4b 53  .#if !OS_VXWORKS
2f570 0a 20 20 20 20 55 4e 49 58 56 46 53 28 22 75 6e  .    UNIXVFS("un
2f580 69 78 2d 66 6c 6f 63 6b 22 2c 20 20 20 20 66 6c  ix-flock",    fl
2f590 6f 63 6b 49 6f 46 69 6e 64 65 72 20 29 2c 0a 23  ockIoFinder ),.#
2f5a0 65 6e 64 69 66 0a 23 65 6e 64 69 66 0a 23 69 66  endif.#endif.#if
2f5b0 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c   SQLITE_ENABLE_L
2f5c0 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 26 26 20  OCKING_STYLE && 
2f5d0 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f  defined(__APPLE_
2f5e0 5f 29 0a 20 20 20 20 55 4e 49 58 56 46 53 28 22  _).    UNIXVFS("
2f5f0 75 6e 69 78 2d 61 66 70 22 2c 20 20 20 20 20 20  unix-afp",      
2f600 61 66 70 49 6f 46 69 6e 64 65 72 20 29 2c 0a 20  afpIoFinder ),. 
2f610 20 20 20 55 4e 49 58 56 46 53 28 22 75 6e 69 78     UNIXVFS("unix
2f620 2d 6e 66 73 22 2c 20 20 20 20 20 20 6e 66 73 49  -nfs",      nfsI
2f630 6f 46 69 6e 64 65 72 20 29 2c 0a 20 20 20 20 55  oFinder ),.    U
2f640 4e 49 58 56 46 53 28 22 75 6e 69 78 2d 70 72 6f  NIXVFS("unix-pro
2f650 78 79 22 2c 20 20 20 20 70 72 6f 78 79 49 6f 46  xy",    proxyIoF
2f660 69 6e 64 65 72 20 29 2c 0a 23 65 6e 64 69 66 0a  inder ),.#endif.
2f670 20 20 7d 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20    };.  unsigned 
2f680 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20  int i;          
2f690 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20  /* Loop counter 
2f6a0 2a 2f 0a 0a 20 20 2f 2a 20 52 65 67 69 73 74 65  */..  /* Registe
2f6b0 72 20 61 6c 6c 20 56 46 53 65 73 20 64 65 66 69  r all VFSes defi
2f6c0 6e 65 64 20 69 6e 20 74 68 65 20 61 56 66 73 5b  ned in the aVfs[
2f6d0 5d 20 61 72 72 61 79 20 2a 2f 0a 20 20 66 6f 72  ] array */.  for
2f6e0 28 69 3d 30 3b 20 69 3c 28 73 69 7a 65 6f 66 28  (i=0; i<(sizeof(
2f6f0 61 56 66 73 29 2f 73 69 7a 65 6f 66 28 73 71 6c  aVfs)/sizeof(sql
2f700 69 74 65 33 5f 76 66 73 29 29 3b 20 69 2b 2b 29  ite3_vfs)); i++)
2f710 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 76 66  {.    sqlite3_vf
2f720 73 5f 72 65 67 69 73 74 65 72 28 26 61 56 66 73  s_register(&aVfs
2f730 5b 69 5d 2c 20 69 3d 3d 30 29 3b 0a 20 20 7d 0a  [i], i==0);.  }.
2f740 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
2f750 4f 4b 3b 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 68  OK; .}../*.** Sh
2f760 75 74 64 6f 77 6e 20 74 68 65 20 6f 70 65 72 61  utdown the opera
2f770 74 69 6e 67 20 73 79 73 74 65 6d 20 69 6e 74 65  ting system inte
2f780 72 66 61 63 65 2e 0a 2a 2a 0a 2a 2a 20 53 6f 6d  rface..**.** Som
2f790 65 20 6f 70 65 72 61 74 69 6e 67 20 73 79 73 74  e operating syst
2f7a0 65 6d 73 20 6d 69 67 68 74 20 6e 65 65 64 20 74  ems might need t
2f7b0 6f 20 64 6f 20 73 6f 6d 65 20 63 6c 65 61 6e 75  o do some cleanu
2f7c0 70 20 69 6e 20 74 68 69 73 20 72 6f 75 74 69 6e  p in this routin
2f7d0 65 2c 0a 2a 2a 20 74 6f 20 72 65 6c 65 61 73 65  e,.** to release
2f7e0 20 64 79 6e 61 6d 69 63 61 6c 6c 79 20 61 6c 6c   dynamically all
2f7f0 6f 63 61 74 65 64 20 6f 62 6a 65 63 74 73 2e 20  ocated objects. 
2f800 20 42 75 74 20 6e 6f 74 20 6f 6e 20 75 6e 69 78   But not on unix
2f810 2e 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  ..** This routin
2f820 65 20 69 73 20 61 20 6e 6f 2d 6f 70 20 66 6f 72  e is a no-op for
2f830 20 75 6e 69 78 2e 0a 2a 2f 0a 69 6e 74 20 73 71   unix..*/.int sq
2f840 6c 69 74 65 33 5f 6f 73 5f 65 6e 64 28 76 6f 69  lite3_os_end(voi
2f850 64 29 7b 20 0a 20 20 72 65 74 75 72 6e 20 53 51  d){ .  return SQ
2f860 4c 49 54 45 5f 4f 4b 3b 20 0a 7d 0a 20 0a 23 65  LITE_OK; .}. .#e
2f870 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
2f880 53 5f 55 4e 49 58 20 2a 2f 0a                    S_UNIX */.