/ Hex Artifact Content
Login

Artifact c7ff5a947fc0a09de1c9c2008e3646551a1a8137:


0000: 2f 2a 0a 2a 2a 20 32 30 30 34 20 4d 61 79 20 32  /*.** 2004 May 2
0010: 32 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 75 74 68  2.**.** The auth
0020: 6f 72 20 64 69 73 63 6c 61 69 6d 73 20 63 6f 70  or disclaims cop
0030: 79 72 69 67 68 74 20 74 6f 20 74 68 69 73 20 73  yright to this s
0040: 6f 75 72 63 65 20 63 6f 64 65 2e 20 20 49 6e 20  ource code.  In 
0050: 70 6c 61 63 65 20 6f 66 0a 2a 2a 20 61 20 6c 65  place of.** a le
0060: 67 61 6c 20 6e 6f 74 69 63 65 2c 20 68 65 72 65  gal notice, here
0070: 20 69 73 20 61 20 62 6c 65 73 73 69 6e 67 3a 0a   is a blessing:.
0080: 2a 2a 0a 2a 2a 20 20 20 20 4d 61 79 20 79 6f 75  **.**    May you
0090: 20 64 6f 20 67 6f 6f 64 20 61 6e 64 20 6e 6f 74   do good and not
00a0: 20 65 76 69 6c 2e 0a 2a 2a 20 20 20 20 4d 61 79   evil..**    May
00b0: 20 79 6f 75 20 66 69 6e 64 20 66 6f 72 67 69 76   you find forgiv
00c0: 65 6e 65 73 73 20 66 6f 72 20 79 6f 75 72 73 65  eness for yourse
00d0: 6c 66 20 61 6e 64 20 66 6f 72 67 69 76 65 20 6f  lf and forgive o
00e0: 74 68 65 72 73 2e 0a 2a 2a 20 20 20 20 4d 61 79  thers..**    May
00f0: 20 79 6f 75 20 73 68 61 72 65 20 66 72 65 65 6c   you share freel
0100: 79 2c 20 6e 65 76 65 72 20 74 61 6b 69 6e 67 20  y, never taking 
0110: 6d 6f 72 65 20 74 68 61 6e 20 79 6f 75 20 67 69  more than you gi
0120: 76 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ve..**.*********
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 54 68 69 73  *****.**.** This
0180: 20 66 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 74   file contains t
0190: 68 65 20 56 46 53 20 69 6d 70 6c 65 6d 65 6e 74  he VFS implement
01a0: 61 74 69 6f 6e 20 66 6f 72 20 75 6e 69 78 2d 6c  ation for unix-l
01b0: 69 6b 65 20 6f 70 65 72 61 74 69 6e 67 20 73 79  ike operating sy
01c0: 73 74 65 6d 73 0a 2a 2a 20 69 6e 63 6c 75 64 65  stems.** include
01d0: 20 4c 69 6e 75 78 2c 20 4d 61 63 4f 53 58 2c 20   Linux, MacOSX, 
01e0: 2a 42 53 44 2c 20 51 4e 58 2c 20 56 78 57 6f 72  *BSD, QNX, VxWor
01f0: 6b 73 2c 20 41 49 58 2c 20 48 50 55 58 2c 20 61  ks, AIX, HPUX, a
0200: 6e 64 20 6f 74 68 65 72 73 2e 0a 2a 2a 0a 2a 2a  nd others..**.**
0210: 20 54 68 65 72 65 20 61 72 65 20 61 63 74 75 61   There are actua
0220: 6c 6c 79 20 73 65 76 65 72 61 6c 20 64 69 66 66  lly several diff
0230: 65 72 65 6e 74 20 56 46 53 20 69 6d 70 6c 65 6d  erent VFS implem
0240: 65 6e 74 61 74 69 6f 6e 73 20 69 6e 20 74 68 69  entations in thi
0250: 73 20 66 69 6c 65 2e 0a 2a 2a 20 54 68 65 20 64  s file..** The d
0260: 69 66 66 65 72 65 6e 63 65 73 20 61 72 65 20 69  ifferences are i
0270: 6e 20 74 68 65 20 77 61 79 20 74 68 61 74 20 66  n the way that f
0280: 69 6c 65 20 6c 6f 63 6b 69 6e 67 20 69 73 20 64  ile locking is d
0290: 6f 6e 65 2e 20 20 54 68 65 20 64 65 66 61 75 6c  one.  The defaul
02a0: 74 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 61 74  t.** implementat
02b0: 69 6f 6e 20 75 73 65 73 20 50 6f 73 69 78 20 41  ion uses Posix A
02c0: 64 76 69 73 6f 72 79 20 4c 6f 63 6b 73 2e 20 20  dvisory Locks.  
02d0: 41 6c 74 65 72 6e 61 74 69 76 65 20 69 6d 70 6c  Alternative impl
02e0: 65 6d 65 6e 74 61 74 69 6f 6e 73 0a 2a 2a 20 75  ementations.** u
02f0: 73 65 20 66 6c 6f 63 6b 28 29 2c 20 64 6f 74 2d  se flock(), dot-
0300: 66 69 6c 65 73 2c 20 76 61 72 69 6f 75 73 20 70  files, various p
0310: 72 6f 70 72 69 65 74 61 72 79 20 6c 6f 63 6b 69  roprietary locki
0320: 6e 67 20 73 63 68 65 6d 61 73 2c 20 6f 72 20 73  ng schemas, or s
0330: 69 6d 70 6c 79 0a 2a 2a 20 73 6b 69 70 20 6c 6f  imply.** skip lo
0340: 63 6b 69 6e 67 20 61 6c 6c 20 74 6f 67 65 74 68  cking all togeth
0350: 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 73  er..**.** This s
0360: 6f 75 72 63 65 20 66 69 6c 65 20 69 73 20 6f 72  ource file is or
0370: 67 61 6e 69 7a 65 64 20 69 6e 74 6f 20 64 69 76  ganized into div
0380: 69 73 69 6f 6e 73 20 77 68 65 72 65 20 74 68 65  isions where the
0390: 20 6c 6f 67 69 63 20 66 6f 72 20 76 61 72 69 6f   logic for vario
03a0: 75 73 0a 2a 2a 20 73 75 62 66 75 6e 63 74 69 6f  us.** subfunctio
03b0: 6e 73 20 69 73 20 63 6f 6e 74 61 69 6e 65 64 20  ns is contained 
03c0: 77 69 74 68 69 6e 20 74 68 65 20 61 70 70 72 6f  within the appro
03d0: 70 72 69 61 74 65 20 64 69 76 69 73 69 6f 6e 2e  priate division.
03e0: 20 20 50 4c 45 41 53 45 0a 2a 2a 20 4b 45 45 50    PLEASE.** KEEP
03f0: 20 54 48 45 20 53 54 52 55 43 54 55 52 45 20 4f   THE STRUCTURE O
0400: 46 20 54 48 49 53 20 46 49 4c 45 20 49 4e 54 41  F THIS FILE INTA
0410: 43 54 2e 20 20 4e 65 77 20 63 6f 64 65 20 73 68  CT.  New code sh
0420: 6f 75 6c 64 20 62 65 20 70 6c 61 63 65 64 0a 2a  ould be placed.*
0430: 2a 20 69 6e 20 74 68 65 20 63 6f 72 72 65 63 74  * in the correct
0440: 20 64 69 76 69 73 69 6f 6e 20 61 6e 64 20 73 68   division and sh
0450: 6f 75 6c 64 20 62 65 20 63 6c 65 61 72 6c 79 20  ould be clearly 
0460: 6c 61 62 65 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 54  labeled..**.** T
0470: 68 65 20 6c 61 79 6f 75 74 20 6f 66 20 64 69 76  he layout of div
0480: 69 73 69 6f 6e 73 20 69 73 20 61 73 20 66 6f 6c  isions is as fol
0490: 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20  lows:.**.**   * 
04a0: 20 47 65 6e 65 72 61 6c 2d 70 75 72 70 6f 73 65   General-purpose
04b0: 20 64 65 63 6c 61 72 61 74 69 6f 6e 73 20 61 6e   declarations an
04c0: 64 20 75 74 69 6c 69 74 79 20 66 75 6e 63 74 69  d utility functi
04d0: 6f 6e 73 2e 0a 2a 2a 20 20 20 2a 20 20 55 6e 69  ons..**   *  Uni
04e0: 71 75 65 20 66 69 6c 65 20 49 44 20 6c 6f 67 69  que file ID logi
04f0: 63 20 75 73 65 64 20 62 79 20 56 78 57 6f 72 6b  c used by VxWork
0500: 73 2e 0a 2a 2a 20 20 20 2a 20 20 56 61 72 69 6f  s..**   *  Vario
0510: 75 73 20 6c 6f 63 6b 69 6e 67 20 70 72 69 6d 69  us locking primi
0520: 74 69 76 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74  tive implementat
0530: 69 6f 6e 73 20 28 61 6c 6c 20 65 78 63 65 70 74  ions (all except
0540: 20 70 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 29 3a   proxy locking):
0550: 0a 2a 2a 20 20 20 20 20 20 2b 20 66 6f 72 20 50  .**      + for P
0560: 6f 73 69 78 20 41 64 76 69 73 6f 72 79 20 4c 6f  osix Advisory Lo
0570: 63 6b 73 0a 2a 2a 20 20 20 20 20 20 2b 20 66 6f  cks.**      + fo
0580: 72 20 6e 6f 2d 6f 70 20 6c 6f 63 6b 73 0a 2a 2a  r no-op locks.**
0590: 20 20 20 20 20 20 2b 20 66 6f 72 20 64 6f 74 2d        + for dot-
05a0: 66 69 6c 65 20 6c 6f 63 6b 73 0a 2a 2a 20 20 20  file locks.**   
05b0: 20 20 20 2b 20 66 6f 72 20 66 6c 6f 63 6b 28 29     + for flock()
05c0: 20 6c 6f 63 6b 69 6e 67 0a 2a 2a 20 20 20 20 20   locking.**     
05d0: 20 2b 20 66 6f 72 20 6e 61 6d 65 64 20 73 65 6d   + for named sem
05e0: 61 70 68 6f 72 65 20 6c 6f 63 6b 73 20 28 56 78  aphore locks (Vx
05f0: 57 6f 72 6b 73 20 6f 6e 6c 79 29 0a 2a 2a 20 20  Works only).**  
0600: 20 20 20 20 2b 20 66 6f 72 20 41 46 50 20 66 69      + for AFP fi
0610: 6c 65 73 79 73 74 65 6d 20 6c 6f 63 6b 73 20 28  lesystem locks (
0620: 4d 61 63 4f 53 58 20 6f 6e 6c 79 29 0a 2a 2a 20  MacOSX only).** 
0630: 20 20 2a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c    *  sqlite3_fil
0640: 65 20 6d 65 74 68 6f 64 73 20 6e 6f 74 20 61 73  e methods not as
0650: 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 6c 6f  sociated with lo
0660: 63 6b 69 6e 67 2e 0a 2a 2a 20 20 20 2a 20 20 44  cking..**   *  D
0670: 65 66 69 6e 69 74 69 6f 6e 73 20 6f 66 20 73 71  efinitions of sq
0680: 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73  lite3_io_methods
0690: 20 6f 62 6a 65 63 74 73 20 66 6f 72 20 61 6c 6c   objects for all
06a0: 20 6c 6f 63 6b 69 6e 67 0a 2a 2a 20 20 20 20 20   locking.**     
06b0: 20 6d 65 74 68 6f 64 73 20 70 6c 75 73 20 22 66   methods plus "f
06c0: 69 6e 64 65 72 22 20 66 75 6e 63 74 69 6f 6e 73  inder" functions
06d0: 20 66 6f 72 20 65 61 63 68 20 6c 6f 63 6b 69 6e   for each lockin
06e0: 67 20 6d 65 74 68 6f 64 2e 0a 2a 2a 20 20 20 2a  g method..**   *
06f0: 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 6d 65    sqlite3_vfs me
0700: 74 68 6f 64 20 69 6d 70 6c 65 6d 65 6e 74 61 74  thod implementat
0710: 69 6f 6e 73 2e 0a 2a 2a 20 20 20 2a 20 20 4c 6f  ions..**   *  Lo
0720: 63 6b 69 6e 67 20 70 72 69 6d 69 74 69 76 65 73  cking primitives
0730: 20 66 6f 72 20 74 68 65 20 70 72 6f 78 79 20 75   for the proxy u
0740: 62 65 72 2d 6c 6f 63 6b 69 6e 67 2d 6d 65 74 68  ber-locking-meth
0750: 6f 64 2e 20 28 4d 61 63 4f 53 58 20 6f 6e 6c 79  od. (MacOSX only
0760: 29 0a 2a 2a 20 20 20 2a 20 20 44 65 66 69 6e 69  ).**   *  Defini
0770: 74 69 6f 6e 73 20 6f 66 20 73 71 6c 69 74 65 33  tions of sqlite3
0780: 5f 76 66 73 20 6f 62 6a 65 63 74 73 20 66 6f 72  _vfs objects for
0790: 20 61 6c 6c 20 6c 6f 63 6b 69 6e 67 20 6d 65 74   all locking met
07a0: 68 6f 64 73 0a 2a 2a 20 20 20 20 20 20 70 6c 75  hods.**      plu
07b0: 73 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  s implementation
07c0: 73 20 6f 66 20 73 71 6c 69 74 65 33 5f 6f 73 5f  s of sqlite3_os_
07d0: 69 6e 69 74 28 29 20 61 6e 64 20 73 71 6c 69 74  init() and sqlit
07e0: 65 33 5f 6f 73 5f 65 6e 64 28 29 2e 0a 2a 2f 0a  e3_os_end()..*/.
07f0: 23 69 6e 63 6c 75 64 65 20 22 73 71 6c 69 74 65  #include "sqlite
0800: 49 6e 74 2e 68 22 0a 23 69 66 20 53 51 4c 49 54  Int.h".#if SQLIT
0810: 45 5f 4f 53 5f 55 4e 49 58 20 20 20 20 20 20 20  E_OS_UNIX       
0820: 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 66         /* This f
0830: 69 6c 65 20 69 73 20 75 73 65 64 20 6f 6e 20 75  ile is used on u
0840: 6e 69 78 20 6f 6e 6c 79 20 2a 2f 0a 0a 2f 2a 0a  nix only */../*.
0850: 2a 2a 20 54 68 65 72 65 20 61 72 65 20 76 61 72  ** There are var
0860: 69 6f 75 73 20 6d 65 74 68 6f 64 73 20 66 6f 72  ious methods for
0870: 20 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 20 75 73   file locking us
0880: 65 64 20 66 6f 72 20 63 6f 6e 63 75 72 72 65 6e  ed for concurren
0890: 63 79 0a 2a 2a 20 63 6f 6e 74 72 6f 6c 3a 0a 2a  cy.** control:.*
08a0: 2a 0a 2a 2a 20 20 20 31 2e 20 50 4f 53 49 58 20  *.**   1. POSIX 
08b0: 6c 6f 63 6b 69 6e 67 20 28 74 68 65 20 64 65 66  locking (the def
08c0: 61 75 6c 74 29 2c 0a 2a 2a 20 20 20 32 2e 20 4e  ault),.**   2. N
08d0: 6f 20 6c 6f 63 6b 69 6e 67 2c 0a 2a 2a 20 20 20  o locking,.**   
08e0: 33 2e 20 44 6f 74 2d 66 69 6c 65 20 6c 6f 63 6b  3. Dot-file lock
08f0: 69 6e 67 2c 0a 2a 2a 20 20 20 34 2e 20 66 6c 6f  ing,.**   4. flo
0900: 63 6b 28 29 20 6c 6f 63 6b 69 6e 67 2c 0a 2a 2a  ck() locking,.**
0910: 20 20 20 35 2e 20 41 46 50 20 6c 6f 63 6b 69 6e     5. AFP lockin
0920: 67 20 28 4f 53 58 20 6f 6e 6c 79 29 2c 0a 2a 2a  g (OSX only),.**
0930: 20 20 20 36 2e 20 4e 61 6d 65 64 20 50 4f 53 49     6. Named POSI
0940: 58 20 73 65 6d 61 70 68 6f 72 65 73 20 28 56 58  X semaphores (VX
0950: 57 6f 72 6b 73 20 6f 6e 6c 79 29 2c 0a 2a 2a 20  Works only),.** 
0960: 20 20 37 2e 20 70 72 6f 78 79 20 6c 6f 63 6b 69    7. proxy locki
0970: 6e 67 2e 20 28 4f 53 58 20 6f 6e 6c 79 29 0a 2a  ng. (OSX only).*
0980: 2a 0a 2a 2a 20 53 74 79 6c 65 73 20 34 2c 20 35  *.** Styles 4, 5
0990: 2c 20 61 6e 64 20 37 20 61 72 65 20 6f 6e 6c 79  , and 7 are only
09a0: 20 61 76 61 69 6c 61 62 6c 65 20 6f 66 20 53 51   available of SQ
09b0: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b  LITE_ENABLE_LOCK
09c0: 49 4e 47 5f 53 54 59 4c 45 0a 2a 2a 20 69 73 20  ING_STYLE.** is 
09d0: 64 65 66 69 6e 65 64 20 74 6f 20 31 2e 20 20 54  defined to 1.  T
09e0: 68 65 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  he SQLITE_ENABLE
09f0: 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 61  _LOCKING_STYLE a
0a00: 6c 73 6f 20 65 6e 61 62 6c 65 73 20 61 75 74 6f  lso enables auto
0a10: 6d 61 74 69 63 0a 2a 2a 20 73 65 6c 65 63 74 69  matic.** selecti
0a20: 6f 6e 20 6f 66 20 74 68 65 20 61 70 70 72 6f 70  on of the approp
0a30: 72 69 61 74 65 20 6c 6f 63 6b 69 6e 67 20 73 74  riate locking st
0a40: 79 6c 65 20 62 61 73 65 64 20 6f 6e 20 74 68 65  yle based on the
0a50: 20 66 69 6c 65 73 79 73 74 65 6d 0a 2a 2a 20 77   filesystem.** w
0a60: 68 65 72 65 20 74 68 65 20 64 61 74 61 62 61 73  here the databas
0a70: 65 20 69 73 20 6c 6f 63 61 74 65 64 2e 20 20 0a  e is located.  .
0a80: 2a 2f 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  */.#if !defined(
0a90: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f  SQLITE_ENABLE_LO
0aa0: 43 4b 49 4e 47 5f 53 54 59 4c 45 29 0a 23 20 20  CKING_STYLE).#  
0ab0: 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50  if defined(__APP
0ac0: 4c 45 5f 5f 29 0a 23 20 20 20 20 64 65 66 69 6e  LE__).#    defin
0ad0: 65 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  e SQLITE_ENABLE_
0ae0: 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 31 0a  LOCKING_STYLE 1.
0af0: 23 20 20 65 6c 73 65 0a 23 20 20 20 20 64 65 66  #  else.#    def
0b00: 69 6e 65 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  ine SQLITE_ENABL
0b10: 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20  E_LOCKING_STYLE 
0b20: 30 0a 23 20 20 65 6e 64 69 66 0a 23 65 6e 64 69  0.#  endif.#endi
0b30: 66 0a 0a 2f 2a 0a 2a 2a 20 44 65 66 69 6e 65 20  f../*.** Define 
0b40: 74 68 65 20 4f 53 5f 56 58 57 4f 52 4b 53 20 70  the OS_VXWORKS p
0b50: 72 65 2d 70 72 6f 63 65 73 73 6f 72 20 6d 61 63  re-processor mac
0b60: 72 6f 20 74 6f 20 31 20 69 66 20 62 75 69 6c 64  ro to 1 if build
0b70: 69 6e 67 20 6f 6e 20 0a 2a 2a 20 76 78 77 6f 72  ing on .** vxwor
0b80: 6b 73 2c 20 6f 72 20 30 20 6f 74 68 65 72 77 69  ks, or 0 otherwi
0b90: 73 65 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 4f  se..*/.#ifndef O
0ba0: 53 5f 56 58 57 4f 52 4b 53 0a 23 20 20 69 66 20  S_VXWORKS.#  if 
0bb0: 64 65 66 69 6e 65 64 28 5f 5f 52 54 50 5f 5f 29  defined(__RTP__)
0bc0: 20 7c 7c 20 64 65 66 69 6e 65 64 28 5f 57 52 53   || defined(_WRS
0bd0: 5f 4b 45 52 4e 45 4c 29 0a 23 20 20 20 20 64 65  _KERNEL).#    de
0be0: 66 69 6e 65 20 4f 53 5f 56 58 57 4f 52 4b 53 20  fine OS_VXWORKS 
0bf0: 31 0a 23 20 20 65 6c 73 65 0a 23 20 20 20 20 64  1.#  else.#    d
0c00: 65 66 69 6e 65 20 4f 53 5f 56 58 57 4f 52 4b 53  efine OS_VXWORKS
0c10: 20 30 0a 23 20 20 65 6e 64 69 66 0a 23 65 6e 64   0.#  endif.#end
0c20: 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 73 65 20  if../*.** These 
0c30: 23 64 65 66 69 6e 65 73 20 73 68 6f 75 6c 64 20  #defines should 
0c40: 65 6e 61 62 6c 65 20 3e 32 47 42 20 66 69 6c 65  enable >2GB file
0c50: 20 73 75 70 70 6f 72 74 20 6f 6e 20 50 6f 73 69   support on Posi
0c60: 78 20 69 66 20 74 68 65 0a 2a 2a 20 75 6e 64 65  x if the.** unde
0c70: 72 6c 79 69 6e 67 20 6f 70 65 72 61 74 69 6e 67  rlying operating
0c80: 20 73 79 73 74 65 6d 20 73 75 70 70 6f 72 74 73   system supports
0c90: 20 69 74 2e 20 20 49 66 20 74 68 65 20 4f 53 20   it.  If the OS 
0ca0: 6c 61 63 6b 73 0a 2a 2a 20 6c 61 72 67 65 20 66  lacks.** large f
0cb0: 69 6c 65 20 73 75 70 70 6f 72 74 2c 20 74 68 65  ile support, the
0cc0: 73 65 20 73 68 6f 75 6c 64 20 62 65 20 6e 6f 2d  se should be no-
0cd0: 6f 70 73 2e 0a 2a 2a 0a 2a 2a 20 4c 61 72 67 65  ops..**.** Large
0ce0: 20 66 69 6c 65 20 73 75 70 70 6f 72 74 20 63 61   file support ca
0cf0: 6e 20 62 65 20 64 69 73 61 62 6c 65 64 20 75 73  n be disabled us
0d00: 69 6e 67 20 74 68 65 20 2d 44 53 51 4c 49 54 45  ing the -DSQLITE
0d10: 5f 44 49 53 41 42 4c 45 5f 4c 46 53 20 73 77 69  _DISABLE_LFS swi
0d20: 74 63 68 0a 2a 2a 20 6f 6e 20 74 68 65 20 63 6f  tch.** on the co
0d30: 6d 70 69 6c 65 72 20 63 6f 6d 6d 61 6e 64 20 6c  mpiler command l
0d40: 69 6e 65 2e 20 20 54 68 69 73 20 69 73 20 6e 65  ine.  This is ne
0d50: 63 65 73 73 61 72 79 20 69 66 20 79 6f 75 20 61  cessary if you a
0d60: 72 65 20 63 6f 6d 70 69 6c 69 6e 67 0a 2a 2a 20  re compiling.** 
0d70: 6f 6e 20 61 20 72 65 63 65 6e 74 20 6d 61 63 68  on a recent mach
0d80: 69 6e 65 20 28 65 78 3a 20 52 65 64 48 61 74 20  ine (ex: RedHat 
0d90: 37 2e 32 29 20 62 75 74 20 79 6f 75 20 77 61 6e  7.2) but you wan
0da0: 74 20 79 6f 75 72 20 63 6f 64 65 20 74 6f 20 77  t your code to w
0db0: 6f 72 6b 0a 2a 2a 20 6f 6e 20 61 6e 20 6f 6c 64  ork.** on an old
0dc0: 65 72 20 6d 61 63 68 69 6e 65 20 28 65 78 3a 20  er machine (ex: 
0dd0: 52 65 64 48 61 74 20 36 2e 30 29 2e 20 20 49 66  RedHat 6.0).  If
0de0: 20 79 6f 75 20 63 6f 6d 70 69 6c 65 20 6f 6e 20   you compile on 
0df0: 52 65 64 48 61 74 20 37 2e 32 0a 2a 2a 20 77 69  RedHat 7.2.** wi
0e00: 74 68 6f 75 74 20 74 68 69 73 20 6f 70 74 69 6f  thout this optio
0e10: 6e 2c 20 4c 46 53 20 69 73 20 65 6e 61 62 6c 65  n, LFS is enable
0e20: 2e 20 20 42 75 74 20 4c 46 53 20 64 6f 65 73 20  .  But LFS does 
0e30: 6e 6f 74 20 65 78 69 73 74 20 69 6e 20 74 68 65  not exist in the
0e40: 20 6b 65 72 6e 65 6c 0a 2a 2a 20 69 6e 20 52 65   kernel.** in Re
0e50: 64 48 61 74 20 36 2e 30 2c 20 73 6f 20 74 68 65  dHat 6.0, so the
0e60: 20 63 6f 64 65 20 77 6f 6e 27 74 20 77 6f 72 6b   code won't work
0e70: 2e 20 20 48 65 6e 63 65 2c 20 66 6f 72 20 6d 61  .  Hence, for ma
0e80: 78 69 6d 75 6d 20 62 69 6e 61 72 79 0a 2a 2a 20  ximum binary.** 
0e90: 70 6f 72 74 61 62 69 6c 69 74 79 20 79 6f 75 20  portability you 
0ea0: 73 68 6f 75 6c 64 20 6f 6d 69 74 20 4c 46 53 2e  should omit LFS.
0eb0: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 72 65 76 69  .**.** The previ
0ec0: 6f 75 73 20 70 61 72 61 67 72 61 70 68 20 77 61  ous paragraph wa
0ed0: 73 20 77 72 69 74 74 65 6e 20 69 6e 20 32 30 30  s written in 200
0ee0: 35 2e 20 20 28 54 68 69 73 20 70 61 72 61 67 72  5.  (This paragr
0ef0: 61 70 68 20 69 73 20 77 72 69 74 74 65 6e 0a 2a  aph is written.*
0f00: 2a 20 6f 6e 20 32 30 30 38 2d 31 31 2d 32 38 2e  * on 2008-11-28.
0f10: 29 20 54 68 65 73 65 20 64 61 79 73 2c 20 61 6c  ) These days, al
0f20: 6c 20 4c 69 6e 75 78 20 6b 65 72 6e 65 6c 73 20  l Linux kernels 
0f30: 73 75 70 70 6f 72 74 20 6c 61 72 67 65 20 66 69  support large fi
0f40: 6c 65 73 2c 20 73 6f 0a 2a 2a 20 79 6f 75 20 73  les, so.** you s
0f50: 68 6f 75 6c 64 20 70 72 6f 62 61 62 6c 79 20 6c  hould probably l
0f60: 65 61 76 65 20 4c 46 53 20 65 6e 61 62 6c 65 64  eave LFS enabled
0f70: 2e 20 20 42 75 74 20 73 6f 6d 65 20 65 6d 62 65  .  But some embe
0f80: 64 64 65 64 20 70 6c 61 74 66 6f 72 6d 73 20 6d  dded platforms m
0f90: 69 67 68 74 0a 2a 2a 20 6c 61 63 6b 20 4c 46 53  ight.** lack LFS
0fa0: 20 69 6e 20 77 68 69 63 68 20 63 61 73 65 20 74   in which case t
0fb0: 68 65 20 53 51 4c 49 54 45 5f 44 49 53 41 42 4c  he SQLITE_DISABL
0fc0: 45 5f 4c 46 53 20 6d 61 63 72 6f 20 6d 69 67 68  E_LFS macro migh
0fd0: 74 20 73 74 69 6c 6c 20 62 65 20 75 73 65 66 75  t still be usefu
0fe0: 6c 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51  l..*/.#ifndef SQ
0ff0: 4c 49 54 45 5f 44 49 53 41 42 4c 45 5f 4c 46 53  LITE_DISABLE_LFS
1000: 0a 23 20 64 65 66 69 6e 65 20 5f 4c 41 52 47 45  .# define _LARGE
1010: 5f 46 49 4c 45 20 20 20 20 20 20 20 31 0a 23 20  _FILE       1.# 
1020: 69 66 6e 64 65 66 20 5f 46 49 4c 45 5f 4f 46 46  ifndef _FILE_OFF
1030: 53 45 54 5f 42 49 54 53 0a 23 20 20 20 64 65 66  SET_BITS.#   def
1040: 69 6e 65 20 5f 46 49 4c 45 5f 4f 46 46 53 45 54  ine _FILE_OFFSET
1050: 5f 42 49 54 53 20 36 34 0a 23 20 65 6e 64 69 66  _BITS 64.# endif
1060: 0a 23 20 64 65 66 69 6e 65 20 5f 4c 41 52 47 45  .# define _LARGE
1070: 46 49 4c 45 5f 53 4f 55 52 43 45 20 31 0a 23 65  FILE_SOURCE 1.#e
1080: 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 73 74 61 6e  ndif../*.** stan
1090: 64 61 72 64 20 69 6e 63 6c 75 64 65 20 66 69 6c  dard include fil
10a0: 65 73 2e 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65 20  es..*/.#include 
10b0: 3c 73 79 73 2f 74 79 70 65 73 2e 68 3e 0a 23 69  <sys/types.h>.#i
10c0: 6e 63 6c 75 64 65 20 3c 73 79 73 2f 73 74 61 74  nclude <sys/stat
10d0: 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 66 63  .h>.#include <fc
10e0: 6e 74 6c 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20  ntl.h>.#include 
10f0: 3c 75 6e 69 73 74 64 2e 68 3e 0a 23 69 6e 63 6c  <unistd.h>.#incl
1100: 75 64 65 20 3c 74 69 6d 65 2e 68 3e 0a 23 69 6e  ude <time.h>.#in
1110: 63 6c 75 64 65 20 3c 73 79 73 2f 74 69 6d 65 2e  clude <sys/time.
1120: 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 65 72 72  h>.#include <err
1130: 6e 6f 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c  no.h>.#include <
1140: 73 79 73 2f 6d 6d 61 6e 2e 68 3e 0a 0a 23 69 66  sys/mman.h>..#if
1150: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c   SQLITE_ENABLE_L
1160: 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 23 20 69  OCKING_STYLE.# i
1170: 6e 63 6c 75 64 65 20 3c 73 79 73 2f 69 6f 63 74  nclude <sys/ioct
1180: 6c 2e 68 3e 0a 23 20 69 66 20 4f 53 5f 56 58 57  l.h>.# if OS_VXW
1190: 4f 52 4b 53 0a 23 20 20 69 6e 63 6c 75 64 65 20  ORKS.#  include 
11a0: 3c 73 65 6d 61 70 68 6f 72 65 2e 68 3e 0a 23 20  <semaphore.h>.# 
11b0: 20 69 6e 63 6c 75 64 65 20 3c 6c 69 6d 69 74 73   include <limits
11c0: 2e 68 3e 0a 23 20 65 6c 73 65 0a 23 20 20 69 6e  .h>.# else.#  in
11d0: 63 6c 75 64 65 20 3c 73 79 73 2f 66 69 6c 65 2e  clude <sys/file.
11e0: 68 3e 0a 23 20 20 69 6e 63 6c 75 64 65 20 3c 73  h>.#  include <s
11f0: 79 73 2f 70 61 72 61 6d 2e 68 3e 0a 23 20 65 6e  ys/param.h>.# en
1200: 64 69 66 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  dif.#endif /* SQ
1210: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b  LITE_ENABLE_LOCK
1220: 49 4e 47 5f 53 54 59 4c 45 20 2a 2f 0a 0a 23 69  ING_STYLE */..#i
1230: 66 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c  f defined(__APPL
1240: 45 5f 5f 29 20 7c 7c 20 28 53 51 4c 49 54 45 5f  E__) || (SQLITE_
1250: 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53  ENABLE_LOCKING_S
1260: 54 59 4c 45 20 26 26 20 21 4f 53 5f 56 58 57 4f  TYLE && !OS_VXWO
1270: 52 4b 53 29 0a 23 20 69 6e 63 6c 75 64 65 20 3c  RKS).# include <
1280: 73 79 73 2f 6d 6f 75 6e 74 2e 68 3e 0a 23 65 6e  sys/mount.h>.#en
1290: 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 77  dif../*.** Allow
12a0: 65 64 20 76 61 6c 75 65 73 20 6f 66 20 75 6e 69  ed values of uni
12b0: 78 46 69 6c 65 2e 66 73 46 6c 61 67 73 0a 2a 2f  xFile.fsFlags.*/
12c0: 0a 23 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f  .#define SQLITE_
12d0: 46 53 46 4c 41 47 53 5f 49 53 5f 4d 53 44 4f 53  FSFLAGS_IS_MSDOS
12e0: 20 20 20 20 20 30 78 31 0a 0a 2f 2a 0a 2a 2a 20       0x1../*.** 
12f0: 49 66 20 77 65 20 61 72 65 20 74 6f 20 62 65 20  If we are to be 
1300: 74 68 72 65 61 64 2d 73 61 66 65 2c 20 69 6e 63  thread-safe, inc
1310: 6c 75 64 65 20 74 68 65 20 70 74 68 72 65 61 64  lude the pthread
1320: 73 20 68 65 61 64 65 72 20 61 6e 64 20 64 65 66  s header and def
1330: 69 6e 65 0a 2a 2a 20 74 68 65 20 53 51 4c 49 54  ine.** the SQLIT
1340: 45 5f 55 4e 49 58 5f 54 48 52 45 41 44 53 20 6d  E_UNIX_THREADS m
1350: 61 63 72 6f 2e 0a 2a 2f 0a 23 69 66 20 53 51 4c  acro..*/.#if SQL
1360: 49 54 45 5f 54 48 52 45 41 44 53 41 46 45 0a 23  ITE_THREADSAFE.#
1370: 20 69 6e 63 6c 75 64 65 20 3c 70 74 68 72 65 61   include <pthrea
1380: 64 2e 68 3e 0a 23 20 64 65 66 69 6e 65 20 53 51  d.h>.# define SQ
1390: 4c 49 54 45 5f 55 4e 49 58 5f 54 48 52 45 41 44  LITE_UNIX_THREAD
13a0: 53 20 31 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  S 1.#endif../*.*
13b0: 2a 20 44 65 66 61 75 6c 74 20 70 65 72 6d 69 73  * Default permis
13c0: 73 69 6f 6e 73 20 77 68 65 6e 20 63 72 65 61 74  sions when creat
13d0: 69 6e 67 20 61 20 6e 65 77 20 66 69 6c 65 0a 2a  ing a new file.*
13e0: 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
13f0: 5f 44 45 46 41 55 4c 54 5f 46 49 4c 45 5f 50 45  _DEFAULT_FILE_PE
1400: 52 4d 49 53 53 49 4f 4e 53 0a 23 20 64 65 66 69  RMISSIONS.# defi
1410: 6e 65 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c  ne SQLITE_DEFAUL
1420: 54 5f 46 49 4c 45 5f 50 45 52 4d 49 53 53 49 4f  T_FILE_PERMISSIO
1430: 4e 53 20 30 36 34 34 0a 23 65 6e 64 69 66 0a 0a  NS 0644.#endif..
1440: 2f 2a 0a 20 2a 2a 20 44 65 66 61 75 6c 74 20 70  /*. ** Default p
1450: 65 72 6d 69 73 73 69 6f 6e 73 20 77 68 65 6e 20  ermissions when 
1460: 63 72 65 61 74 69 6e 67 20 61 75 74 6f 20 70 72  creating auto pr
1470: 6f 78 79 20 64 69 72 0a 20 2a 2f 0a 23 69 66 6e  oxy dir. */.#ifn
1480: 64 65 66 20 53 51 4c 49 54 45 5f 44 45 46 41 55  def SQLITE_DEFAU
1490: 4c 54 5f 50 52 4f 58 59 44 49 52 5f 50 45 52 4d  LT_PROXYDIR_PERM
14a0: 49 53 53 49 4f 4e 53 0a 23 20 64 65 66 69 6e 65  ISSIONS.# define
14b0: 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f   SQLITE_DEFAULT_
14c0: 50 52 4f 58 59 44 49 52 5f 50 45 52 4d 49 53 53  PROXYDIR_PERMISS
14d0: 49 4f 4e 53 20 30 37 35 35 0a 23 65 6e 64 69 66  IONS 0755.#endif
14e0: 0a 0a 2f 2a 0a 2a 2a 20 4d 61 78 69 6d 75 6d 20  ../*.** Maximum 
14f0: 73 75 70 70 6f 72 74 65 64 20 70 61 74 68 2d 6c  supported path-l
1500: 65 6e 67 74 68 2e 0a 2a 2f 0a 23 64 65 66 69 6e  ength..*/.#defin
1510: 65 20 4d 41 58 5f 50 41 54 48 4e 41 4d 45 20 35  e MAX_PATHNAME 5
1520: 31 32 0a 0a 2f 2a 0a 2a 2a 20 4f 6e 6c 79 20 73  12../*.** Only s
1530: 65 74 20 74 68 65 20 6c 61 73 74 45 72 72 6e 6f  et the lastErrno
1540: 20 69 66 20 74 68 65 20 65 72 72 6f 72 20 63 6f   if the error co
1550: 64 65 20 69 73 20 61 20 72 65 61 6c 20 65 72 72  de is a real err
1560: 6f 72 20 61 6e 64 20 6e 6f 74 20 0a 2a 2a 20 61  or and not .** a
1570: 20 6e 6f 72 6d 61 6c 20 65 78 70 65 63 74 65 64   normal expected
1580: 20 72 65 74 75 72 6e 20 63 6f 64 65 20 6f 66 20   return code of 
1590: 53 51 4c 49 54 45 5f 42 55 53 59 20 6f 72 20 53  SQLITE_BUSY or S
15a0: 51 4c 49 54 45 5f 4f 4b 0a 2a 2f 0a 23 64 65 66  QLITE_OK.*/.#def
15b0: 69 6e 65 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f  ine IS_LOCK_ERRO
15c0: 52 28 78 29 20 20 28 28 78 20 21 3d 20 53 51 4c  R(x)  ((x != SQL
15d0: 49 54 45 5f 4f 4b 29 20 26 26 20 28 78 20 21 3d  ITE_OK) && (x !=
15e0: 20 53 51 4c 49 54 45 5f 42 55 53 59 29 29 0a 0a   SQLITE_BUSY))..
15f0: 2f 2a 20 46 6f 72 77 61 72 64 20 72 65 66 65 72  /* Forward refer
1600: 65 6e 63 65 20 2a 2f 0a 74 79 70 65 64 65 66 20  ence */.typedef 
1610: 73 74 72 75 63 74 20 75 6e 69 78 53 68 6d 20 75  struct unixShm u
1620: 6e 69 78 53 68 6d 3b 0a 74 79 70 65 64 65 66 20  nixShm;.typedef 
1630: 73 74 72 75 63 74 20 75 6e 69 78 53 68 6d 46 69  struct unixShmFi
1640: 6c 65 20 75 6e 69 78 53 68 6d 46 69 6c 65 3b 0a  le unixShmFile;.
1650: 0a 2f 2a 0a 2a 2a 20 53 6f 6d 65 74 69 6d 65 73  ./*.** Sometimes
1660: 2c 20 61 66 74 65 72 20 61 20 66 69 6c 65 20 68  , after a file h
1670: 61 6e 64 6c 65 20 69 73 20 63 6c 6f 73 65 64 20  andle is closed 
1680: 62 79 20 53 51 4c 69 74 65 2c 20 74 68 65 20 66  by SQLite, the f
1690: 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 0a 2a  ile descriptor.*
16a0: 2a 20 63 61 6e 6e 6f 74 20 62 65 20 63 6c 6f 73  * cannot be clos
16b0: 65 64 20 69 6d 6d 65 64 69 61 74 65 6c 79 2e 20  ed immediately. 
16c0: 49 6e 20 74 68 65 73 65 20 63 61 73 65 73 2c 20  In these cases, 
16d0: 69 6e 73 74 61 6e 63 65 73 20 6f 66 20 74 68 65  instances of the
16e0: 20 66 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a 20 73 74   following.** st
16f0: 72 75 63 74 75 72 65 20 61 72 65 20 75 73 65 64  ructure are used
1700: 20 74 6f 20 73 74 6f 72 65 20 74 68 65 20 66 69   to store the fi
1710: 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 77 68  le descriptor wh
1720: 69 6c 65 20 77 61 69 74 69 6e 67 20 66 6f 72 20  ile waiting for 
1730: 61 6e 0a 2a 2a 20 6f 70 70 6f 72 74 75 6e 69 74  an.** opportunit
1740: 79 20 74 6f 20 65 69 74 68 65 72 20 63 6c 6f 73  y to either clos
1750: 65 20 6f 72 20 72 65 75 73 65 20 69 74 2e 0a 2a  e or reuse it..*
1760: 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74  /.typedef struct
1770: 20 55 6e 69 78 55 6e 75 73 65 64 46 64 20 55 6e   UnixUnusedFd Un
1780: 69 78 55 6e 75 73 65 64 46 64 3b 0a 73 74 72 75  ixUnusedFd;.stru
1790: 63 74 20 55 6e 69 78 55 6e 75 73 65 64 46 64 20  ct UnixUnusedFd 
17a0: 7b 0a 20 20 69 6e 74 20 66 64 3b 20 20 20 20 20  {.  int fd;     
17b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
17c0: 20 46 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   File descriptor
17d0: 20 74 6f 20 63 6c 6f 73 65 20 2a 2f 0a 20 20 69   to close */.  i
17e0: 6e 74 20 66 6c 61 67 73 3b 20 20 20 20 20 20 20  nt flags;       
17f0: 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6c 61 67           /* Flag
1800: 73 20 74 68 69 73 20 66 69 6c 65 20 64 65 73 63  s this file desc
1810: 72 69 70 74 6f 72 20 77 61 73 20 6f 70 65 6e 65  riptor was opene
1820: 64 20 77 69 74 68 20 2a 2f 0a 20 20 55 6e 69 78  d with */.  Unix
1830: 55 6e 75 73 65 64 46 64 20 2a 70 4e 65 78 74 3b  UnusedFd *pNext;
1840: 20 20 20 20 20 20 2f 2a 20 4e 65 78 74 20 75 6e        /* Next un
1850: 75 73 65 64 20 66 69 6c 65 20 64 65 73 63 72 69  used file descri
1860: 70 74 6f 72 20 6f 6e 20 73 61 6d 65 20 66 69 6c  ptor on same fil
1870: 65 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 54  e */.};../*.** T
1880: 68 65 20 75 6e 69 78 46 69 6c 65 20 73 74 72 75  he unixFile stru
1890: 63 74 75 72 65 20 69 73 20 73 75 62 63 6c 61 73  cture is subclas
18a0: 73 20 6f 66 20 73 71 6c 69 74 65 33 5f 66 69 6c  s of sqlite3_fil
18b0: 65 20 73 70 65 63 69 66 69 63 20 74 6f 20 74 68  e specific to th
18c0: 65 20 75 6e 69 78 0a 2a 2a 20 56 46 53 20 69 6d  e unix.** VFS im
18d0: 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 73 2e 0a 2a  plementations..*
18e0: 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74  /.typedef struct
18f0: 20 75 6e 69 78 46 69 6c 65 20 75 6e 69 78 46 69   unixFile unixFi
1900: 6c 65 3b 0a 73 74 72 75 63 74 20 75 6e 69 78 46  le;.struct unixF
1910: 69 6c 65 20 7b 0a 20 20 73 71 6c 69 74 65 33 5f  ile {.  sqlite3_
1920: 69 6f 5f 6d 65 74 68 6f 64 73 20 63 6f 6e 73 74  io_methods const
1930: 20 2a 70 4d 65 74 68 6f 64 3b 20 20 2f 2a 20 41   *pMethod;  /* A
1940: 6c 77 61 79 73 20 74 68 65 20 66 69 72 73 74 20  lways the first 
1950: 65 6e 74 72 79 20 2a 2f 0a 20 20 73 74 72 75 63  entry */.  struc
1960: 74 20 75 6e 69 78 4f 70 65 6e 43 6e 74 20 2a 70  t unixOpenCnt *p
1970: 4f 70 65 6e 3b 20 20 20 20 20 20 20 2f 2a 20 49  Open;       /* I
1980: 6e 66 6f 20 61 62 6f 75 74 20 61 6c 6c 20 6f 70  nfo about all op
1990: 65 6e 20 66 64 27 73 20 6f 6e 20 74 68 69 73 20  en fd's on this 
19a0: 69 6e 6f 64 65 20 2a 2f 0a 20 20 73 74 72 75 63  inode */.  struc
19b0: 74 20 75 6e 69 78 4c 6f 63 6b 49 6e 66 6f 20 2a  t unixLockInfo *
19c0: 70 4c 6f 63 6b 3b 20 20 20 20 20 20 2f 2a 20 49  pLock;      /* I
19d0: 6e 66 6f 20 61 62 6f 75 74 20 6c 6f 63 6b 73 20  nfo about locks 
19e0: 6f 6e 20 74 68 69 73 20 69 6e 6f 64 65 20 2a 2f  on this inode */
19f0: 0a 20 20 69 6e 74 20 68 3b 20 20 20 20 20 20 20  .  int h;       
1a00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a10: 20 20 20 20 2f 2a 20 54 68 65 20 66 69 6c 65 20      /* The file 
1a20: 64 65 73 63 72 69 70 74 6f 72 20 2a 2f 0a 20 20  descriptor */.  
1a30: 69 6e 74 20 64 69 72 66 64 3b 20 20 20 20 20 20  int dirfd;      
1a40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a50: 20 2f 2a 20 46 69 6c 65 20 64 65 73 63 72 69 70   /* File descrip
1a60: 74 6f 72 20 66 6f 72 20 74 68 65 20 64 69 72 65  tor for the dire
1a70: 63 74 6f 72 79 20 2a 2f 0a 20 20 75 6e 73 69 67  ctory */.  unsig
1a80: 6e 65 64 20 63 68 61 72 20 6c 6f 63 6b 74 79 70  ned char locktyp
1a90: 65 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  e;          /* T
1aa0: 68 65 20 74 79 70 65 20 6f 66 20 6c 6f 63 6b 20  he type of lock 
1ab0: 68 65 6c 64 20 6f 6e 20 74 68 69 73 20 66 64 20  held on this fd 
1ac0: 2a 2f 0a 20 20 69 6e 74 20 6c 61 73 74 45 72 72  */.  int lastErr
1ad0: 6e 6f 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  no;             
1ae0: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 75 6e 69        /* The uni
1af0: 78 20 65 72 72 6e 6f 20 66 72 6f 6d 20 74 68 65  x errno from the
1b00: 20 6c 61 73 74 20 49 2f 4f 20 65 72 72 6f 72 20   last I/O error 
1b10: 2a 2f 0a 20 20 76 6f 69 64 20 2a 6c 6f 63 6b 69  */.  void *locki
1b20: 6e 67 43 6f 6e 74 65 78 74 3b 20 20 20 20 20 20  ngContext;      
1b30: 20 20 20 20 20 20 2f 2a 20 4c 6f 63 6b 69 6e 67        /* Locking
1b40: 20 73 74 79 6c 65 20 73 70 65 63 69 66 69 63 20   style specific 
1b50: 73 74 61 74 65 20 2a 2f 0a 20 20 55 6e 69 78 55  state */.  UnixU
1b60: 6e 75 73 65 64 46 64 20 2a 70 55 6e 75 73 65 64  nusedFd *pUnused
1b70: 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50  ;           /* P
1b80: 72 65 2d 61 6c 6c 6f 63 61 74 65 64 20 55 6e 69  re-allocated Uni
1b90: 78 55 6e 75 73 65 64 46 64 20 2a 2f 0a 20 20 69  xUnusedFd */.  i
1ba0: 6e 74 20 66 69 6c 65 46 6c 61 67 73 3b 20 20 20  nt fileFlags;   
1bb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bc0: 2f 2a 20 4d 69 73 63 65 6c 6c 61 6e 6f 75 73 20  /* Miscellanous 
1bd0: 66 6c 61 67 73 20 2a 2f 0a 20 20 63 6f 6e 73 74  flags */.  const
1be0: 20 63 68 61 72 20 2a 7a 50 61 74 68 3b 20 20 20   char *zPath;   
1bf0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
1c00: 61 6d 65 20 6f 66 20 74 68 65 20 66 69 6c 65 20  ame of the file 
1c10: 2a 2f 0a 20 20 75 6e 69 78 53 68 6d 20 2a 70 53  */.  unixShm *pS
1c20: 68 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  hm;             
1c30: 20 20 20 20 20 20 2f 2a 20 53 68 61 72 65 64 20        /* Shared 
1c40: 6d 65 6d 6f 72 79 20 73 65 67 6d 65 6e 74 20 69  memory segment i
1c50: 6e 66 6f 72 6d 61 74 69 6f 6e 20 2a 2f 0a 23 69  nformation */.#i
1c60: 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
1c70: 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 20 20  LOCKING_STYLE.  
1c80: 69 6e 74 20 6f 70 65 6e 46 6c 61 67 73 3b 20 20  int openFlags;  
1c90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ca0: 20 2f 2a 20 54 68 65 20 66 6c 61 67 73 20 73 70   /* The flags sp
1cb0: 65 63 69 66 69 65 64 20 61 74 20 6f 70 65 6e 28  ecified at open(
1cc0: 29 20 2a 2f 0a 23 65 6e 64 69 66 0a 23 69 66 20  ) */.#endif.#if 
1cd0: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f  SQLITE_ENABLE_LO
1ce0: 43 4b 49 4e 47 5f 53 54 59 4c 45 20 7c 7c 20 64  CKING_STYLE || d
1cf0: 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f  efined(__APPLE__
1d00: 29 0a 20 20 75 6e 73 69 67 6e 65 64 20 66 73 46  ).  unsigned fsF
1d10: 6c 61 67 73 3b 20 20 20 20 20 20 20 20 20 20 20  lags;           
1d20: 20 20 20 20 20 20 2f 2a 20 63 61 63 68 65 64 20        /* cached 
1d30: 64 65 74 61 69 6c 73 20 66 72 6f 6d 20 73 74 61  details from sta
1d40: 74 66 73 28 29 20 2a 2f 0a 23 65 6e 64 69 66 0a  tfs() */.#endif.
1d50: 23 69 66 20 53 51 4c 49 54 45 5f 54 48 52 45 41  #if SQLITE_THREA
1d60: 44 53 41 46 45 20 26 26 20 64 65 66 69 6e 65 64  DSAFE && defined
1d70: 28 5f 5f 6c 69 6e 75 78 5f 5f 29 0a 20 20 70 74  (__linux__).  pt
1d80: 68 72 65 61 64 5f 74 20 74 69 64 3b 20 20 20 20  hread_t tid;    
1d90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1da0: 2a 20 54 68 65 20 74 68 72 65 61 64 20 74 68 61  * The thread tha
1db0: 74 20 22 6f 77 6e 73 22 20 74 68 69 73 20 75 6e  t "owns" this un
1dc0: 69 78 46 69 6c 65 20 2a 2f 0a 23 65 6e 64 69 66  ixFile */.#endif
1dd0: 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a  .#if OS_VXWORKS.
1de0: 20 20 69 6e 74 20 69 73 44 65 6c 65 74 65 3b 20    int isDelete; 
1df0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e00: 20 20 20 2f 2a 20 44 65 6c 65 74 65 20 6f 6e 20     /* Delete on 
1e10: 63 6c 6f 73 65 20 69 66 20 74 72 75 65 20 2a 2f  close if true */
1e20: 0a 20 20 73 74 72 75 63 74 20 76 78 77 6f 72 6b  .  struct vxwork
1e30: 73 46 69 6c 65 49 64 20 2a 70 49 64 3b 20 20 20  sFileId *pId;   
1e40: 20 20 20 20 2f 2a 20 55 6e 69 71 75 65 20 66 69      /* Unique fi
1e50: 6c 65 20 49 44 20 2a 2f 0a 23 65 6e 64 69 66 0a  le ID */.#endif.
1e60: 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 20  #ifndef NDEBUG. 
1e70: 20 2f 2a 20 54 68 65 20 6e 65 78 74 20 67 72 6f   /* The next gro
1e80: 75 70 20 6f 66 20 76 61 72 69 61 62 6c 65 73 20  up of variables 
1e90: 61 72 65 20 75 73 65 64 20 74 6f 20 74 72 61 63  are used to trac
1ea0: 6b 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74  k whether or not
1eb0: 20 74 68 65 0a 20 20 2a 2a 20 74 72 61 6e 73 61   the.  ** transa
1ec0: 63 74 69 6f 6e 20 63 6f 75 6e 74 65 72 20 69 6e  ction counter in
1ed0: 20 62 79 74 65 73 20 32 34 2d 32 37 20 6f 66 20   bytes 24-27 of 
1ee0: 64 61 74 61 62 61 73 65 20 66 69 6c 65 73 20 61  database files a
1ef0: 72 65 20 75 70 64 61 74 65 64 0a 20 20 2a 2a 20  re updated.  ** 
1f00: 77 68 65 6e 65 76 65 72 20 61 6e 79 20 70 61 72  whenever any par
1f10: 74 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  t of the databas
1f20: 65 20 63 68 61 6e 67 65 73 2e 20 20 41 6e 20 61  e changes.  An a
1f30: 73 73 65 72 74 69 6f 6e 20 66 61 75 6c 74 20 77  ssertion fault w
1f40: 69 6c 6c 0a 20 20 2a 2a 20 6f 63 63 75 72 20 69  ill.  ** occur i
1f50: 66 20 61 20 66 69 6c 65 20 69 73 20 75 70 64 61  f a file is upda
1f60: 74 65 64 20 77 69 74 68 6f 75 74 20 61 6c 73 6f  ted without also
1f70: 20 75 70 64 61 74 69 6e 67 20 74 68 65 20 74 72   updating the tr
1f80: 61 6e 73 61 63 74 69 6f 6e 0a 20 20 2a 2a 20 63  ansaction.  ** c
1f90: 6f 75 6e 74 65 72 2e 20 20 54 68 69 73 20 74 65  ounter.  This te
1fa0: 73 74 20 69 73 20 6d 61 64 65 20 74 6f 20 61 76  st is made to av
1fb0: 6f 69 64 20 6e 65 77 20 70 72 6f 62 6c 65 6d 73  oid new problems
1fc0: 20 73 69 6d 69 6c 61 72 20 74 6f 20 74 68 65 0a   similar to the.
1fd0: 20 20 2a 2a 20 6f 6e 65 20 64 65 73 63 72 69 62    ** one describ
1fe0: 65 64 20 62 79 20 74 69 63 6b 65 74 20 23 33 35  ed by ticket #35
1ff0: 38 34 2e 20 0a 20 20 2a 2f 0a 20 20 75 6e 73 69  84. .  */.  unsi
2000: 67 6e 65 64 20 63 68 61 72 20 74 72 61 6e 73 43  gned char transC
2010: 6e 74 72 43 68 6e 67 3b 20 20 20 2f 2a 20 54 72  ntrChng;   /* Tr
2020: 75 65 20 69 66 20 74 68 65 20 74 72 61 6e 73 61  ue if the transa
2030: 63 74 69 6f 6e 20 63 6f 75 6e 74 65 72 20 63 68  ction counter ch
2040: 61 6e 67 65 64 20 2a 2f 0a 20 20 75 6e 73 69 67  anged */.  unsig
2050: 6e 65 64 20 63 68 61 72 20 64 62 55 70 64 61 74  ned char dbUpdat
2060: 65 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75  e;        /* Tru
2070: 65 20 69 66 20 61 6e 79 20 70 61 72 74 20 6f 66  e if any part of
2080: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 63   database file c
2090: 68 61 6e 67 65 64 20 2a 2f 0a 20 20 75 6e 73 69  hanged */.  unsi
20a0: 67 6e 65 64 20 63 68 61 72 20 69 6e 4e 6f 72 6d  gned char inNorm
20b0: 61 6c 57 72 69 74 65 3b 20 20 20 2f 2a 20 54 72  alWrite;   /* Tr
20c0: 75 65 20 69 66 20 69 6e 20 61 20 6e 6f 72 6d 61  ue if in a norma
20d0: 6c 20 77 72 69 74 65 20 6f 70 65 72 61 74 69 6f  l write operatio
20e0: 6e 20 2a 2f 0a 23 65 6e 64 69 66 0a 23 69 66 64  n */.#endif.#ifd
20f0: 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20  ef SQLITE_TEST. 
2100: 20 2f 2a 20 49 6e 20 74 65 73 74 20 6d 6f 64 65   /* In test mode
2110: 2c 20 69 6e 63 72 65 61 73 65 20 74 68 65 20 73  , increase the s
2120: 69 7a 65 20 6f 66 20 74 68 69 73 20 73 74 72 75  ize of this stru
2130: 63 74 75 72 65 20 61 20 62 69 74 20 73 6f 20 74  cture a bit so t
2140: 68 61 74 20 0a 20 20 2a 2a 20 69 74 20 69 73 20  hat .  ** it is 
2150: 6c 61 72 67 65 72 20 74 68 61 6e 20 74 68 65 20  larger than the 
2160: 73 74 72 75 63 74 20 43 72 61 73 68 46 69 6c 65  struct CrashFile
2170: 20 64 65 66 69 6e 65 64 20 69 6e 20 74 65 73 74   defined in test
2180: 36 2e 63 2e 0a 20 20 2a 2f 0a 20 20 63 68 61 72  6.c..  */.  char
2190: 20 61 50 61 64 64 69 6e 67 5b 33 32 5d 3b 0a 23   aPadding[32];.#
21a0: 65 6e 64 69 66 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20  endif.};../*.** 
21b0: 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 6d 61  The following ma
21c0: 63 72 6f 73 20 64 65 66 69 6e 65 20 62 69 74 73  cros define bits
21d0: 20 69 6e 20 75 6e 69 78 46 69 6c 65 2e 66 69 6c   in unixFile.fil
21e0: 65 46 6c 61 67 73 0a 2a 2f 0a 23 64 65 66 69 6e  eFlags.*/.#defin
21f0: 65 20 53 51 4c 49 54 45 5f 57 48 4f 4c 45 5f 46  e SQLITE_WHOLE_F
2200: 49 4c 45 5f 4c 4f 43 4b 49 4e 47 20 20 30 78 30  ILE_LOCKING  0x0
2210: 30 30 31 20 20 20 2f 2a 20 55 73 65 20 77 68 6f  001   /* Use who
2220: 6c 65 2d 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 20  le-file locking 
2230: 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 49 6e 63 6c 75 64  */../*.** Includ
2240: 65 20 63 6f 64 65 20 74 68 61 74 20 69 73 20 63  e code that is c
2250: 6f 6d 6d 6f 6e 20 74 6f 20 61 6c 6c 20 6f 73 5f  ommon to all os_
2260: 2a 2e 63 20 66 69 6c 65 73 0a 2a 2f 0a 23 69 6e  *.c files.*/.#in
2270: 63 6c 75 64 65 20 22 6f 73 5f 63 6f 6d 6d 6f 6e  clude "os_common
2280: 2e 68 22 0a 0a 2f 2a 0a 2a 2a 20 44 65 66 69 6e  .h"../*.** Defin
2290: 65 20 76 61 72 69 6f 75 73 20 6d 61 63 72 6f 73  e various macros
22a0: 20 74 68 61 74 20 61 72 65 20 6d 69 73 73 69 6e   that are missin
22b0: 67 20 66 72 6f 6d 20 73 6f 6d 65 20 73 79 73 74  g from some syst
22c0: 65 6d 73 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20  ems..*/.#ifndef 
22d0: 4f 5f 4c 41 52 47 45 46 49 4c 45 0a 23 20 64 65  O_LARGEFILE.# de
22e0: 66 69 6e 65 20 4f 5f 4c 41 52 47 45 46 49 4c 45  fine O_LARGEFILE
22f0: 20 30 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66   0.#endif.#ifdef
2300: 20 53 51 4c 49 54 45 5f 44 49 53 41 42 4c 45 5f   SQLITE_DISABLE_
2310: 4c 46 53 0a 23 20 75 6e 64 65 66 20 4f 5f 4c 41  LFS.# undef O_LA
2320: 52 47 45 46 49 4c 45 0a 23 20 64 65 66 69 6e 65  RGEFILE.# define
2330: 20 4f 5f 4c 41 52 47 45 46 49 4c 45 20 30 0a 23   O_LARGEFILE 0.#
2340: 65 6e 64 69 66 0a 23 69 66 6e 64 65 66 20 4f 5f  endif.#ifndef O_
2350: 4e 4f 46 4f 4c 4c 4f 57 0a 23 20 64 65 66 69 6e  NOFOLLOW.# defin
2360: 65 20 4f 5f 4e 4f 46 4f 4c 4c 4f 57 20 30 0a 23  e O_NOFOLLOW 0.#
2370: 65 6e 64 69 66 0a 23 69 66 6e 64 65 66 20 4f 5f  endif.#ifndef O_
2380: 42 49 4e 41 52 59 0a 23 20 64 65 66 69 6e 65 20  BINARY.# define 
2390: 4f 5f 42 49 4e 41 52 59 20 30 0a 23 65 6e 64 69  O_BINARY 0.#endi
23a0: 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 44 4a 47  f../*.** The DJG
23b0: 50 50 20 63 6f 6d 70 69 6c 65 72 20 65 6e 76 69  PP compiler envi
23c0: 72 6f 6e 6d 65 6e 74 20 6c 6f 6f 6b 73 20 6d 6f  ronment looks mo
23d0: 73 74 6c 79 20 6c 69 6b 65 20 55 6e 69 78 2c 20  stly like Unix, 
23e0: 62 75 74 20 69 74 0a 2a 2a 20 6c 61 63 6b 73 20  but it.** lacks 
23f0: 74 68 65 20 66 63 6e 74 6c 28 29 20 73 79 73 74  the fcntl() syst
2400: 65 6d 20 63 61 6c 6c 2e 20 20 53 6f 20 72 65 64  em call.  So red
2410: 65 66 69 6e 65 20 66 63 6e 74 6c 28 29 20 74 6f  efine fcntl() to
2420: 20 62 65 20 73 6f 6d 65 74 68 69 6e 67 0a 2a 2a   be something.**
2430: 20 74 68 61 74 20 61 6c 77 61 79 73 20 73 75 63   that always suc
2440: 63 65 65 64 73 2e 20 20 54 68 69 73 20 6d 65 61  ceeds.  This mea
2450: 6e 73 20 74 68 61 74 20 6c 6f 63 6b 69 6e 67 20  ns that locking 
2460: 64 6f 65 73 20 6e 6f 74 20 6f 63 63 75 72 20 75  does not occur u
2470: 6e 64 65 72 0a 2a 2a 20 44 4a 47 50 50 2e 20 20  nder.** DJGPP.  
2480: 42 75 74 20 69 74 20 69 73 20 44 4f 53 20 2d 20  But it is DOS - 
2490: 77 68 61 74 20 64 69 64 20 79 6f 75 20 65 78 70  what did you exp
24a0: 65 63 74 3f 0a 2a 2f 0a 23 69 66 64 65 66 20 5f  ect?.*/.#ifdef _
24b0: 5f 44 4a 47 50 50 5f 5f 0a 23 20 64 65 66 69 6e  _DJGPP__.# defin
24c0: 65 20 66 63 6e 74 6c 28 41 2c 42 2c 43 29 20 30  e fcntl(A,B,C) 0
24d0: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54  .#endif../*.** T
24e0: 68 65 20 74 68 72 65 61 64 69 64 20 6d 61 63 72  he threadid macr
24f0: 6f 20 72 65 73 6f 6c 76 65 73 20 74 6f 20 74 68  o resolves to th
2500: 65 20 74 68 72 65 61 64 2d 69 64 20 6f 72 20 74  e thread-id or t
2510: 6f 20 30 2e 20 20 55 73 65 64 20 66 6f 72 0a 2a  o 0.  Used for.*
2520: 2a 20 74 65 73 74 69 6e 67 20 61 6e 64 20 64 65  * testing and de
2530: 62 75 67 67 69 6e 67 20 6f 6e 6c 79 2e 0a 2a 2f  bugging only..*/
2540: 0a 23 69 66 20 53 51 4c 49 54 45 5f 54 48 52 45  .#if SQLITE_THRE
2550: 41 44 53 41 46 45 0a 23 64 65 66 69 6e 65 20 74  ADSAFE.#define t
2560: 68 72 65 61 64 69 64 20 70 74 68 72 65 61 64 5f  hreadid pthread_
2570: 73 65 6c 66 28 29 0a 23 65 6c 73 65 0a 23 64 65  self().#else.#de
2580: 66 69 6e 65 20 74 68 72 65 61 64 69 64 20 30 0a  fine threadid 0.
2590: 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 48  #endif.../*.** H
25a0: 65 6c 70 65 72 20 66 75 6e 63 74 69 6f 6e 73 20  elper functions 
25b0: 74 6f 20 6f 62 74 61 69 6e 20 61 6e 64 20 72 65  to obtain and re
25c0: 6c 69 6e 71 75 69 73 68 20 74 68 65 20 67 6c 6f  linquish the glo
25d0: 62 61 6c 20 6d 75 74 65 78 2e 20 54 68 65 0a 2a  bal mutex. The.*
25e0: 2a 20 67 6c 6f 62 61 6c 20 6d 75 74 65 78 20 69  * global mutex i
25f0: 73 20 75 73 65 64 20 74 6f 20 70 72 6f 74 65 63  s used to protec
2600: 74 20 74 68 65 20 75 6e 69 78 4f 70 65 6e 43 6e  t the unixOpenCn
2610: 74 2c 20 75 6e 69 78 4c 6f 63 6b 49 6e 66 6f 20  t, unixLockInfo 
2620: 61 6e 64 0a 2a 2a 20 76 78 77 6f 72 6b 73 46 69  and.** vxworksFi
2630: 6c 65 49 64 20 6f 62 6a 65 63 74 73 20 75 73 65  leId objects use
2640: 64 20 62 79 20 74 68 69 73 20 66 69 6c 65 2c 20  d by this file, 
2650: 61 6c 6c 20 6f 66 20 77 68 69 63 68 20 6d 61 79  all of which may
2660: 20 62 65 20 0a 2a 2a 20 73 68 61 72 65 64 20 62   be .** shared b
2670: 79 20 6d 75 6c 74 69 70 6c 65 20 74 68 72 65 61  y multiple threa
2680: 64 73 2e 0a 2a 2a 0a 2a 2a 20 46 75 6e 63 74 69  ds..**.** Functi
2690: 6f 6e 20 75 6e 69 78 4d 75 74 65 78 48 65 6c 64  on unixMutexHeld
26a0: 28 29 20 69 73 20 75 73 65 64 20 74 6f 20 61 73  () is used to as
26b0: 73 65 72 74 28 29 20 74 68 61 74 20 74 68 65 20  sert() that the 
26c0: 67 6c 6f 62 61 6c 20 6d 75 74 65 78 20 0a 2a 2a  global mutex .**
26d0: 20 69 73 20 68 65 6c 64 20 77 68 65 6e 20 72 65   is held when re
26e0: 71 75 69 72 65 64 2e 20 54 68 69 73 20 66 75 6e  quired. This fun
26f0: 63 74 69 6f 6e 20 69 73 20 6f 6e 6c 79 20 75 73  ction is only us
2700: 65 64 20 61 73 20 70 61 72 74 20 6f 66 20 61 73  ed as part of as
2710: 73 65 72 74 28 29 20 0a 2a 2a 20 73 74 61 74 65  sert() .** state
2720: 6d 65 6e 74 73 2e 20 65 2e 67 2e 0a 2a 2a 0a 2a  ments. e.g..**.*
2730: 2a 20 20 20 75 6e 69 78 45 6e 74 65 72 4d 75 74  *   unixEnterMut
2740: 65 78 28 29 0a 2a 2a 20 20 20 20 20 61 73 73 65  ex().**     asse
2750: 72 74 28 20 75 6e 69 78 4d 75 74 65 78 48 65 6c  rt( unixMutexHel
2760: 64 28 29 20 29 3b 0a 2a 2a 20 20 20 75 6e 69 78  d() );.**   unix
2770: 45 6e 74 65 72 4c 65 61 76 65 28 29 0a 2a 2f 0a  EnterLeave().*/.
2780: 73 74 61 74 69 63 20 76 6f 69 64 20 75 6e 69 78  static void unix
2790: 45 6e 74 65 72 4d 75 74 65 78 28 76 6f 69 64 29  EnterMutex(void)
27a0: 7b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  {.  sqlite3_mute
27b0: 78 5f 65 6e 74 65 72 28 73 71 6c 69 74 65 33 4d  x_enter(sqlite3M
27c0: 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49 54 45  utexAlloc(SQLITE
27d0: 5f 4d 55 54 45 58 5f 53 54 41 54 49 43 5f 4d 41  _MUTEX_STATIC_MA
27e0: 53 54 45 52 29 29 3b 0a 7d 0a 73 74 61 74 69 63  STER));.}.static
27f0: 20 76 6f 69 64 20 75 6e 69 78 4c 65 61 76 65 4d   void unixLeaveM
2800: 75 74 65 78 28 76 6f 69 64 29 7b 0a 20 20 73 71  utex(void){.  sq
2810: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76  lite3_mutex_leav
2820: 65 28 73 71 6c 69 74 65 33 4d 75 74 65 78 41 6c  e(sqlite3MutexAl
2830: 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58  loc(SQLITE_MUTEX
2840: 5f 53 54 41 54 49 43 5f 4d 41 53 54 45 52 29 29  _STATIC_MASTER))
2850: 3b 0a 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54  ;.}.#ifdef SQLIT
2860: 45 5f 44 45 42 55 47 0a 73 74 61 74 69 63 20 69  E_DEBUG.static i
2870: 6e 74 20 75 6e 69 78 4d 75 74 65 78 48 65 6c 64  nt unixMutexHeld
2880: 28 76 6f 69 64 29 20 7b 0a 20 20 72 65 74 75 72  (void) {.  retur
2890: 6e 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  n sqlite3_mutex_
28a0: 68 65 6c 64 28 73 71 6c 69 74 65 33 4d 75 74 65  held(sqlite3Mute
28b0: 78 41 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55  xAlloc(SQLITE_MU
28c0: 54 45 58 5f 53 54 41 54 49 43 5f 4d 41 53 54 45  TEX_STATIC_MASTE
28d0: 52 29 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a  R));.}.#endif...
28e0: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45  #ifdef SQLITE_DE
28f0: 42 55 47 0a 2f 2a 0a 2a 2a 20 48 65 6c 70 65 72  BUG./*.** Helper
2900: 20 66 75 6e 63 74 69 6f 6e 20 66 6f 72 20 70 72   function for pr
2910: 69 6e 74 69 6e 67 20 6f 75 74 20 74 72 61 63 65  inting out trace
2920: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 72 6f   information fro
2930: 6d 20 64 65 62 75 67 67 69 6e 67 0a 2a 2a 20 62  m debugging.** b
2940: 69 6e 61 72 69 65 73 2e 20 54 68 69 73 20 72 65  inaries. This re
2950: 74 75 72 6e 73 20 74 68 65 20 73 74 72 69 6e 67  turns the string
2960: 20 72 65 70 72 65 73 65 74 61 74 69 6f 6e 20 6f   represetation o
2970: 66 20 74 68 65 20 73 75 70 70 6c 69 65 64 0a 2a  f the supplied.*
2980: 2a 20 69 6e 74 65 67 65 72 20 6c 6f 63 6b 2d 74  * integer lock-t
2990: 79 70 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63  ype..*/.static c
29a0: 6f 6e 73 74 20 63 68 61 72 20 2a 6c 6f 63 6b 74  onst char *lockt
29b0: 79 70 65 4e 61 6d 65 28 69 6e 74 20 6c 6f 63 6b  ypeName(int lock
29c0: 74 79 70 65 29 7b 0a 20 20 73 77 69 74 63 68 28  type){.  switch(
29d0: 20 6c 6f 63 6b 74 79 70 65 20 29 7b 0a 20 20 20   locktype ){.   
29e0: 20 63 61 73 65 20 4e 4f 5f 4c 4f 43 4b 3a 20 72   case NO_LOCK: r
29f0: 65 74 75 72 6e 20 22 4e 4f 4e 45 22 3b 0a 20 20  eturn "NONE";.  
2a00: 20 20 63 61 73 65 20 53 48 41 52 45 44 5f 4c 4f    case SHARED_LO
2a10: 43 4b 3a 20 72 65 74 75 72 6e 20 22 53 48 41 52  CK: return "SHAR
2a20: 45 44 22 3b 0a 20 20 20 20 63 61 73 65 20 52 45  ED";.    case RE
2a30: 53 45 52 56 45 44 5f 4c 4f 43 4b 3a 20 72 65 74  SERVED_LOCK: ret
2a40: 75 72 6e 20 22 52 45 53 45 52 56 45 44 22 3b 0a  urn "RESERVED";.
2a50: 20 20 20 20 63 61 73 65 20 50 45 4e 44 49 4e 47      case PENDING
2a60: 5f 4c 4f 43 4b 3a 20 72 65 74 75 72 6e 20 22 50  _LOCK: return "P
2a70: 45 4e 44 49 4e 47 22 3b 0a 20 20 20 20 63 61 73  ENDING";.    cas
2a80: 65 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b  e EXCLUSIVE_LOCK
2a90: 3a 20 72 65 74 75 72 6e 20 22 45 58 43 4c 55 53  : return "EXCLUS
2aa0: 49 56 45 22 3b 0a 20 20 7d 0a 20 20 72 65 74 75  IVE";.  }.  retu
2ab0: 72 6e 20 22 45 52 52 4f 52 22 3b 0a 7d 0a 23 65  rn "ERROR";.}.#e
2ac0: 6e 64 69 66 0a 0a 23 69 66 64 65 66 20 53 51 4c  ndif..#ifdef SQL
2ad0: 49 54 45 5f 4c 4f 43 4b 5f 54 52 41 43 45 0a 2f  ITE_LOCK_TRACE./
2ae0: 2a 0a 2a 2a 20 50 72 69 6e 74 20 6f 75 74 20 69  *.** Print out i
2af0: 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74  nformation about
2b00: 20 61 6c 6c 20 6c 6f 63 6b 69 6e 67 20 6f 70 65   all locking ope
2b10: 72 61 74 69 6f 6e 73 2e 0a 2a 2a 0a 2a 2a 20 54  rations..**.** T
2b20: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75  his routine is u
2b30: 73 65 64 20 66 6f 72 20 74 72 6f 75 62 6c 65 73  sed for troubles
2b40: 68 6f 6f 74 69 6e 67 20 6c 6f 63 6b 73 20 6f 6e  hooting locks on
2b50: 20 6d 75 6c 74 69 74 68 72 65 61 64 65 64 0a 2a   multithreaded.*
2b60: 2a 20 70 6c 61 74 66 6f 72 6d 73 2e 20 20 45 6e  * platforms.  En
2b70: 61 62 6c 65 20 62 79 20 63 6f 6d 70 69 6c 69 6e  able by compilin
2b80: 67 20 77 69 74 68 20 74 68 65 20 2d 44 53 51 4c  g with the -DSQL
2b90: 49 54 45 5f 4c 4f 43 4b 5f 54 52 41 43 45 0a 2a  ITE_LOCK_TRACE.*
2ba0: 2a 20 63 6f 6d 6d 61 6e 64 2d 6c 69 6e 65 20 6f  * command-line o
2bb0: 70 74 69 6f 6e 20 6f 6e 20 74 68 65 20 63 6f 6d  ption on the com
2bc0: 70 69 6c 65 72 2e 20 20 54 68 69 73 20 63 6f 64  piler.  This cod
2bd0: 65 20 69 73 20 6e 6f 72 6d 61 6c 6c 79 0a 2a 2a  e is normally.**
2be0: 20 74 75 72 6e 65 64 20 6f 66 66 2e 0a 2a 2f 0a   turned off..*/.
2bf0: 73 74 61 74 69 63 20 69 6e 74 20 6c 6f 63 6b 54  static int lockT
2c00: 72 61 63 65 28 69 6e 74 20 66 64 2c 20 69 6e 74  race(int fd, int
2c10: 20 6f 70 2c 20 73 74 72 75 63 74 20 66 6c 6f 63   op, struct floc
2c20: 6b 20 2a 70 29 7b 0a 20 20 63 68 61 72 20 2a 7a  k *p){.  char *z
2c30: 4f 70 4e 61 6d 65 2c 20 2a 7a 54 79 70 65 3b 0a  OpName, *zType;.
2c40: 20 20 69 6e 74 20 73 3b 0a 20 20 69 6e 74 20 73    int s;.  int s
2c50: 61 76 65 64 45 72 72 6e 6f 3b 0a 20 20 69 66 28  avedErrno;.  if(
2c60: 20 6f 70 3d 3d 46 5f 47 45 54 4c 4b 20 29 7b 0a   op==F_GETLK ){.
2c70: 20 20 20 20 7a 4f 70 4e 61 6d 65 20 3d 20 22 47      zOpName = "G
2c80: 45 54 4c 4b 22 3b 0a 20 20 7d 65 6c 73 65 20 69  ETLK";.  }else i
2c90: 66 28 20 6f 70 3d 3d 46 5f 53 45 54 4c 4b 20 29  f( op==F_SETLK )
2ca0: 7b 0a 20 20 20 20 7a 4f 70 4e 61 6d 65 20 3d 20  {.    zOpName = 
2cb0: 22 53 45 54 4c 4b 22 3b 0a 20 20 7d 65 6c 73 65  "SETLK";.  }else
2cc0: 7b 0a 20 20 20 20 73 20 3d 20 66 63 6e 74 6c 28  {.    s = fcntl(
2cd0: 66 64 2c 20 6f 70 2c 20 70 29 3b 0a 20 20 20 20  fd, op, p);.    
2ce0: 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e  sqlite3DebugPrin
2cf0: 74 66 28 22 66 63 6e 74 6c 20 75 6e 6b 6e 6f 77  tf("fcntl unknow
2d00: 6e 20 25 64 20 25 64 20 25 64 5c 6e 22 2c 20 66  n %d %d %d\n", f
2d10: 64 2c 20 6f 70 2c 20 73 29 3b 0a 20 20 20 20 72  d, op, s);.    r
2d20: 65 74 75 72 6e 20 73 3b 0a 20 20 7d 0a 20 20 69  eturn s;.  }.  i
2d30: 66 28 20 70 2d 3e 6c 5f 74 79 70 65 3d 3d 46 5f  f( p->l_type==F_
2d40: 52 44 4c 43 4b 20 29 7b 0a 20 20 20 20 7a 54 79  RDLCK ){.    zTy
2d50: 70 65 20 3d 20 22 52 44 4c 43 4b 22 3b 0a 20 20  pe = "RDLCK";.  
2d60: 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e 6c 5f 74  }else if( p->l_t
2d70: 79 70 65 3d 3d 46 5f 57 52 4c 43 4b 20 29 7b 0a  ype==F_WRLCK ){.
2d80: 20 20 20 20 7a 54 79 70 65 20 3d 20 22 57 52 4c      zType = "WRL
2d90: 43 4b 22 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  CK";.  }else if(
2da0: 20 70 2d 3e 6c 5f 74 79 70 65 3d 3d 46 5f 55 4e   p->l_type==F_UN
2db0: 4c 43 4b 20 29 7b 0a 20 20 20 20 7a 54 79 70 65  LCK ){.    zType
2dc0: 20 3d 20 22 55 4e 4c 43 4b 22 3b 0a 20 20 7d 65   = "UNLCK";.  }e
2dd0: 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28  lse{.    assert(
2de0: 20 30 20 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65   0 );.  }.  asse
2df0: 72 74 28 20 70 2d 3e 6c 5f 77 68 65 6e 63 65 3d  rt( p->l_whence=
2e00: 3d 53 45 45 4b 5f 53 45 54 20 29 3b 0a 20 20 73  =SEEK_SET );.  s
2e10: 20 3d 20 66 63 6e 74 6c 28 66 64 2c 20 6f 70 2c   = fcntl(fd, op,
2e20: 20 70 29 3b 0a 20 20 73 61 76 65 64 45 72 72 6e   p);.  savedErrn
2e30: 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 73 71 6c  o = errno;.  sql
2e40: 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
2e50: 22 66 63 6e 74 6c 20 25 64 20 25 64 20 25 73 20  "fcntl %d %d %s 
2e60: 25 73 20 25 64 20 25 64 20 25 64 20 25 64 5c 6e  %s %d %d %d %d\n
2e70: 22 2c 0a 20 20 20 20 20 74 68 72 65 61 64 69 64  ",.     threadid
2e80: 2c 20 66 64 2c 20 7a 4f 70 4e 61 6d 65 2c 20 7a  , fd, zOpName, z
2e90: 54 79 70 65 2c 20 28 69 6e 74 29 70 2d 3e 6c 5f  Type, (int)p->l_
2ea0: 73 74 61 72 74 2c 20 28 69 6e 74 29 70 2d 3e 6c  start, (int)p->l
2eb0: 5f 6c 65 6e 2c 0a 20 20 20 20 20 28 69 6e 74 29  _len,.     (int)
2ec0: 70 2d 3e 6c 5f 70 69 64 2c 20 73 29 3b 0a 20 20  p->l_pid, s);.  
2ed0: 69 66 28 20 73 3d 3d 28 2d 31 29 20 26 26 20 6f  if( s==(-1) && o
2ee0: 70 3d 3d 46 5f 53 45 54 4c 4b 20 26 26 20 28 70  p==F_SETLK && (p
2ef0: 2d 3e 6c 5f 74 79 70 65 3d 3d 46 5f 52 44 4c 43  ->l_type==F_RDLC
2f00: 4b 20 7c 7c 20 70 2d 3e 6c 5f 74 79 70 65 3d 3d  K || p->l_type==
2f10: 46 5f 57 52 4c 43 4b 29 20 29 7b 0a 20 20 20 20  F_WRLCK) ){.    
2f20: 73 74 72 75 63 74 20 66 6c 6f 63 6b 20 6c 32 3b  struct flock l2;
2f30: 0a 20 20 20 20 6c 32 20 3d 20 2a 70 3b 0a 20 20  .    l2 = *p;.  
2f40: 20 20 66 63 6e 74 6c 28 66 64 2c 20 46 5f 47 45    fcntl(fd, F_GE
2f50: 54 4c 4b 2c 20 26 6c 32 29 3b 0a 20 20 20 20 69  TLK, &l2);.    i
2f60: 66 28 20 6c 32 2e 6c 5f 74 79 70 65 3d 3d 46 5f  f( l2.l_type==F_
2f70: 52 44 4c 43 4b 20 29 7b 0a 20 20 20 20 20 20 7a  RDLCK ){.      z
2f80: 54 79 70 65 20 3d 20 22 52 44 4c 43 4b 22 3b 0a  Type = "RDLCK";.
2f90: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6c 32      }else if( l2
2fa0: 2e 6c 5f 74 79 70 65 3d 3d 46 5f 57 52 4c 43 4b  .l_type==F_WRLCK
2fb0: 20 29 7b 0a 20 20 20 20 20 20 7a 54 79 70 65 20   ){.      zType 
2fc0: 3d 20 22 57 52 4c 43 4b 22 3b 0a 20 20 20 20 7d  = "WRLCK";.    }
2fd0: 65 6c 73 65 20 69 66 28 20 6c 32 2e 6c 5f 74 79  else if( l2.l_ty
2fe0: 70 65 3d 3d 46 5f 55 4e 4c 43 4b 20 29 7b 0a 20  pe==F_UNLCK ){. 
2ff0: 20 20 20 20 20 7a 54 79 70 65 20 3d 20 22 55 4e       zType = "UN
3000: 4c 43 4b 22 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  LCK";.    }else{
3010: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 30  .      assert( 0
3020: 20 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71   );.    }.    sq
3030: 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66  lite3DebugPrintf
3040: 28 22 66 63 6e 74 6c 2d 66 61 69 6c 75 72 65 2d  ("fcntl-failure-
3050: 72 65 61 73 6f 6e 3a 20 25 73 20 25 64 20 25 64  reason: %s %d %d
3060: 20 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 7a   %d\n",.       z
3070: 54 79 70 65 2c 20 28 69 6e 74 29 6c 32 2e 6c 5f  Type, (int)l2.l_
3080: 73 74 61 72 74 2c 20 28 69 6e 74 29 6c 32 2e 6c  start, (int)l2.l
3090: 5f 6c 65 6e 2c 20 28 69 6e 74 29 6c 32 2e 6c 5f  _len, (int)l2.l_
30a0: 70 69 64 29 3b 0a 20 20 7d 0a 20 20 65 72 72 6e  pid);.  }.  errn
30b0: 6f 20 3d 20 73 61 76 65 64 45 72 72 6e 6f 3b 0a  o = savedErrno;.
30c0: 20 20 72 65 74 75 72 6e 20 73 3b 0a 7d 0a 23 64    return s;.}.#d
30d0: 65 66 69 6e 65 20 66 63 6e 74 6c 20 6c 6f 63 6b  efine fcntl lock
30e0: 54 72 61 63 65 0a 23 65 6e 64 69 66 20 2f 2a 20  Trace.#endif /* 
30f0: 53 51 4c 49 54 45 5f 4c 4f 43 4b 5f 54 52 41 43  SQLITE_LOCK_TRAC
3100: 45 20 2a 2f 0a 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68  E */..../*.** Th
3110: 69 73 20 72 6f 75 74 69 6e 65 20 74 72 61 6e 73  is routine trans
3120: 6c 61 74 65 73 20 61 20 73 74 61 6e 64 61 72 64  lates a standard
3130: 20 50 4f 53 49 58 20 65 72 72 6e 6f 20 63 6f 64   POSIX errno cod
3140: 65 20 69 6e 74 6f 20 73 6f 6d 65 74 68 69 6e 67  e into something
3150: 0a 2a 2a 20 75 73 65 66 75 6c 20 74 6f 20 74 68  .** useful to th
3160: 65 20 63 6c 69 65 6e 74 73 20 6f 66 20 74 68 65  e clients of the
3170: 20 73 71 6c 69 74 65 33 20 66 75 6e 63 74 69 6f   sqlite3 functio
3180: 6e 73 2e 20 20 53 70 65 63 69 66 69 63 61 6c 6c  ns.  Specificall
3190: 79 2c 20 69 74 20 69 73 0a 2a 2a 20 69 6e 74 65  y, it is.** inte
31a0: 6e 64 65 64 20 74 6f 20 74 72 61 6e 73 6c 61 74  nded to translat
31b0: 65 20 61 20 76 61 72 69 65 74 79 20 6f 66 20 22  e a variety of "
31c0: 74 72 79 20 61 67 61 69 6e 22 20 65 72 72 6f 72  try again" error
31d0: 73 20 69 6e 74 6f 20 53 51 4c 49 54 45 5f 42 55  s into SQLITE_BU
31e0: 53 59 0a 2a 2a 20 61 6e 64 20 61 20 76 61 72 69  SY.** and a vari
31f0: 65 74 79 20 6f 66 20 22 70 6c 65 61 73 65 20 63  ety of "please c
3200: 6c 6f 73 65 20 74 68 65 20 66 69 6c 65 20 64 65  lose the file de
3210: 73 63 72 69 70 74 6f 72 20 4e 4f 57 22 20 65 72  scriptor NOW" er
3220: 72 6f 72 73 20 69 6e 74 6f 20 0a 2a 2a 20 53 51  rors into .** SQ
3230: 4c 49 54 45 5f 49 4f 45 52 52 0a 2a 2a 20 0a 2a  LITE_IOERR.** .*
3240: 2a 20 45 72 72 6f 72 73 20 64 75 72 69 6e 67 20  * Errors during 
3250: 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20 6f  initialization o
3260: 66 20 6c 6f 63 6b 73 2c 20 6f 72 20 66 69 6c 65  f locks, or file
3270: 20 73 79 73 74 65 6d 20 73 75 70 70 6f 72 74 20   system support 
3280: 66 6f 72 20 6c 6f 63 6b 73 2c 0a 2a 2a 20 73 68  for locks,.** sh
3290: 6f 75 6c 64 20 68 61 6e 64 6c 65 20 45 4e 4f 4c  ould handle ENOL
32a0: 43 4b 2c 20 45 4e 4f 54 53 55 50 2c 20 45 4f 50  CK, ENOTSUP, EOP
32b0: 4e 4f 54 53 55 50 50 20 73 65 70 61 72 61 74 65  NOTSUPP separate
32c0: 6c 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ly..*/.static in
32d0: 74 20 73 71 6c 69 74 65 45 72 72 6f 72 46 72 6f  t sqliteErrorFro
32e0: 6d 50 6f 73 69 78 45 72 72 6f 72 28 69 6e 74 20  mPosixError(int 
32f0: 70 6f 73 69 78 45 72 72 6f 72 2c 20 69 6e 74 20  posixError, int 
3300: 73 71 6c 69 74 65 49 4f 45 72 72 29 20 7b 0a 20  sqliteIOErr) {. 
3310: 20 73 77 69 74 63 68 20 28 70 6f 73 69 78 45 72   switch (posixEr
3320: 72 6f 72 29 20 7b 0a 20 20 63 61 73 65 20 30 3a  ror) {.  case 0:
3330: 20 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c   .    return SQL
3340: 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 0a 20 20 63  ITE_OK;.    .  c
3350: 61 73 65 20 45 41 47 41 49 4e 3a 0a 20 20 63 61  ase EAGAIN:.  ca
3360: 73 65 20 45 54 49 4d 45 44 4f 55 54 3a 0a 20 20  se ETIMEDOUT:.  
3370: 63 61 73 65 20 45 42 55 53 59 3a 0a 20 20 63 61  case EBUSY:.  ca
3380: 73 65 20 45 49 4e 54 52 3a 0a 20 20 63 61 73 65  se EINTR:.  case
3390: 20 45 4e 4f 4c 43 4b 3a 20 20 0a 20 20 20 20 2f   ENOLCK:  .    /
33a0: 2a 20 72 61 6e 64 6f 6d 20 4e 46 53 20 72 65 74  * random NFS ret
33b0: 72 79 20 65 72 72 6f 72 2c 20 75 6e 6c 65 73 73  ry error, unless
33c0: 20 64 75 72 69 6e 67 20 66 69 6c 65 20 73 79 73   during file sys
33d0: 74 65 6d 20 73 75 70 70 6f 72 74 20 0a 20 20 20  tem support .   
33e0: 20 20 2a 20 69 6e 74 72 6f 73 70 65 63 74 69 6f    * introspectio
33f0: 6e 2c 20 69 6e 20 77 68 69 63 68 20 69 74 20 61  n, in which it a
3400: 63 74 75 61 6c 6c 79 20 6d 65 61 6e 73 20 77 68  ctually means wh
3410: 61 74 20 69 74 20 73 61 79 73 20 2a 2f 0a 20 20  at it says */.  
3420: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
3430: 42 55 53 59 3b 0a 20 20 20 20 0a 20 20 63 61 73  BUSY;.    .  cas
3440: 65 20 45 41 43 43 45 53 3a 20 0a 20 20 20 20 2f  e EACCES: .    /
3450: 2a 20 45 41 43 43 45 53 20 69 73 20 6c 69 6b 65  * EACCES is like
3460: 20 45 41 47 41 49 4e 20 64 75 72 69 6e 67 20 6c   EAGAIN during l
3470: 6f 63 6b 69 6e 67 20 6f 70 65 72 61 74 69 6f 6e  ocking operation
3480: 73 2c 20 62 75 74 20 6e 6f 74 20 61 6e 79 20 6f  s, but not any o
3490: 74 68 65 72 20 74 69 6d 65 2a 2f 0a 20 20 20 20  ther time*/.    
34a0: 69 66 28 20 28 73 71 6c 69 74 65 49 4f 45 72 72  if( (sqliteIOErr
34b0: 20 3d 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52   == SQLITE_IOERR
34c0: 5f 4c 4f 43 4b 29 20 7c 7c 20 0a 09 28 73 71 6c  _LOCK) || ..(sql
34d0: 69 74 65 49 4f 45 72 72 20 3d 3d 20 53 51 4c 49  iteIOErr == SQLI
34e0: 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 29  TE_IOERR_UNLOCK)
34f0: 20 7c 7c 20 0a 09 28 73 71 6c 69 74 65 49 4f 45   || ..(sqliteIOE
3500: 72 72 20 3d 3d 20 53 51 4c 49 54 45 5f 49 4f 45  rr == SQLITE_IOE
3510: 52 52 5f 52 44 4c 4f 43 4b 29 20 7c 7c 0a 09 28  RR_RDLOCK) ||..(
3520: 73 71 6c 69 74 65 49 4f 45 72 72 20 3d 3d 20 53  sqliteIOErr == S
3530: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43 48 45 43  QLITE_IOERR_CHEC
3540: 4b 52 45 53 45 52 56 45 44 4c 4f 43 4b 29 20 29  KRESERVEDLOCK) )
3550: 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  {.      return S
3560: 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20  QLITE_BUSY;.    
3570: 7d 0a 20 20 20 20 2f 2a 20 65 6c 73 65 20 66 61  }.    /* else fa
3580: 6c 6c 20 74 68 72 6f 75 67 68 20 2a 2f 0a 20 20  ll through */.  
3590: 63 61 73 65 20 45 50 45 52 4d 3a 20 0a 20 20 20  case EPERM: .   
35a0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 50   return SQLITE_P
35b0: 45 52 4d 3b 0a 20 20 20 20 0a 20 20 63 61 73 65  ERM;.    .  case
35c0: 20 45 44 45 41 44 4c 4b 3a 0a 20 20 20 20 72 65   EDEADLK:.    re
35d0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52  turn SQLITE_IOER
35e0: 52 5f 42 4c 4f 43 4b 45 44 3b 0a 20 20 20 20 0a  R_BLOCKED;.    .
35f0: 23 69 66 20 45 4f 50 4e 4f 54 53 55 50 50 21 3d  #if EOPNOTSUPP!=
3600: 45 4e 4f 54 53 55 50 0a 20 20 63 61 73 65 20 45  ENOTSUP.  case E
3610: 4f 50 4e 4f 54 53 55 50 50 3a 20 0a 20 20 20 20  OPNOTSUPP: .    
3620: 2f 2a 20 73 6f 6d 65 74 68 69 6e 67 20 77 65 6e  /* something wen
3630: 74 20 74 65 72 72 69 62 6c 79 20 61 77 72 79 2c  t terribly awry,
3640: 20 75 6e 6c 65 73 73 20 64 75 72 69 6e 67 20 66   unless during f
3650: 69 6c 65 20 73 79 73 74 65 6d 20 73 75 70 70 6f  ile system suppo
3660: 72 74 20 0a 20 20 20 20 20 2a 20 69 6e 74 72 6f  rt .     * intro
3670: 73 70 65 63 74 69 6f 6e 2c 20 69 6e 20 77 68 69  spection, in whi
3680: 63 68 20 69 74 20 61 63 74 75 61 6c 6c 79 20 6d  ch it actually m
3690: 65 61 6e 73 20 77 68 61 74 20 69 74 20 73 61 79  eans what it say
36a0: 73 20 2a 2f 0a 23 65 6e 64 69 66 0a 23 69 66 64  s */.#endif.#ifd
36b0: 65 66 20 45 4e 4f 54 53 55 50 0a 20 20 63 61 73  ef ENOTSUP.  cas
36c0: 65 20 45 4e 4f 54 53 55 50 3a 20 0a 20 20 20 20  e ENOTSUP: .    
36d0: 2f 2a 20 69 6e 76 61 6c 69 64 20 66 64 2c 20 75  /* invalid fd, u
36e0: 6e 6c 65 73 73 20 64 75 72 69 6e 67 20 66 69 6c  nless during fil
36f0: 65 20 73 79 73 74 65 6d 20 73 75 70 70 6f 72 74  e system support
3700: 20 69 6e 74 72 6f 73 70 65 63 74 69 6f 6e 2c 20   introspection, 
3710: 69 6e 20 77 68 69 63 68 20 0a 20 20 20 20 20 2a  in which .     *
3720: 20 69 74 20 61 63 74 75 61 6c 6c 79 20 6d 65 61   it actually mea
3730: 6e 73 20 77 68 61 74 20 69 74 20 73 61 79 73 20  ns what it says 
3740: 2a 2f 0a 23 65 6e 64 69 66 0a 20 20 63 61 73 65  */.#endif.  case
3750: 20 45 49 4f 3a 0a 20 20 63 61 73 65 20 45 42 41   EIO:.  case EBA
3760: 44 46 3a 0a 20 20 63 61 73 65 20 45 49 4e 56 41  DF:.  case EINVA
3770: 4c 3a 0a 20 20 63 61 73 65 20 45 4e 4f 54 43 4f  L:.  case ENOTCO
3780: 4e 4e 3a 0a 20 20 63 61 73 65 20 45 4e 4f 44 45  NN:.  case ENODE
3790: 56 3a 0a 20 20 63 61 73 65 20 45 4e 58 49 4f 3a  V:.  case ENXIO:
37a0: 0a 20 20 63 61 73 65 20 45 4e 4f 45 4e 54 3a 0a  .  case ENOENT:.
37b0: 20 20 63 61 73 65 20 45 53 54 41 4c 45 3a 0a 20    case ESTALE:. 
37c0: 20 63 61 73 65 20 45 4e 4f 53 59 53 3a 0a 20 20   case ENOSYS:.  
37d0: 20 20 2f 2a 20 74 68 65 73 65 20 73 68 6f 75 6c    /* these shoul
37e0: 64 20 66 6f 72 63 65 20 74 68 65 20 63 6c 69 65  d force the clie
37f0: 6e 74 20 74 6f 20 63 6c 6f 73 65 20 74 68 65 20  nt to close the 
3800: 66 69 6c 65 20 61 6e 64 20 72 65 63 6f 6e 6e 65  file and reconne
3810: 63 74 20 2a 2f 0a 20 20 20 20 0a 20 20 64 65 66  ct */.    .  def
3820: 61 75 6c 74 3a 20 0a 20 20 20 20 72 65 74 75 72  ault: .    retur
3830: 6e 20 73 71 6c 69 74 65 49 4f 45 72 72 3b 0a 20  n sqliteIOErr;. 
3840: 20 7d 0a 7d 0a 0a 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a   }.}..../*******
3850: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
3860: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
3870: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
3880: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
3890: 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a  *******.********
38a0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 42 65 67 69 6e  ********** Begin
38b0: 20 55 6e 69 71 75 65 20 46 69 6c 65 20 49 44 20   Unique File ID 
38c0: 55 74 69 6c 69 74 79 20 55 73 65 64 20 42 79 20  Utility Used By 
38d0: 56 78 57 6f 72 6b 73 20 2a 2a 2a 2a 2a 2a 2a 2a  VxWorks ********
38e0: 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 4f 6e  *******.**.** On
38f0: 20 6d 6f 73 74 20 76 65 72 73 69 6f 6e 73 20 6f   most versions o
3900: 66 20 75 6e 69 78 2c 20 77 65 20 63 61 6e 20 67  f unix, we can g
3910: 65 74 20 61 20 75 6e 69 71 75 65 20 49 44 20 66  et a unique ID f
3920: 6f 72 20 61 20 66 69 6c 65 20 62 79 20 63 6f 6e  or a file by con
3930: 63 61 74 65 6e 61 74 69 6e 67 0a 2a 2a 20 74 68  catenating.** th
3940: 65 20 64 65 76 69 63 65 20 6e 75 6d 62 65 72 20  e device number 
3950: 61 6e 64 20 74 68 65 20 69 6e 6f 64 65 20 6e 75  and the inode nu
3960: 6d 62 65 72 2e 20 20 42 75 74 20 74 68 69 73 20  mber.  But this 
3970: 64 6f 65 73 20 6e 6f 74 20 77 6f 72 6b 20 6f 6e  does not work on
3980: 20 56 78 57 6f 72 6b 73 2e 0a 2a 2a 20 4f 6e 20   VxWorks..** On 
3990: 56 78 57 6f 72 6b 73 2c 20 61 20 75 6e 69 71 75  VxWorks, a uniqu
39a0: 65 20 66 69 6c 65 20 69 64 20 6d 75 73 74 20 62  e file id must b
39b0: 65 20 62 61 73 65 64 20 6f 6e 20 74 68 65 20 63  e based on the c
39c0: 61 6e 6f 6e 69 63 61 6c 20 66 69 6c 65 6e 61 6d  anonical filenam
39d0: 65 2e 0a 2a 2a 0a 2a 2a 20 41 20 70 6f 69 6e 74  e..**.** A point
39e0: 65 72 20 74 6f 20 61 6e 20 69 6e 73 74 61 6e 63  er to an instanc
39f0: 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  e of the followi
3a00: 6e 67 20 73 74 72 75 63 74 75 72 65 20 63 61 6e  ng structure can
3a10: 20 62 65 20 75 73 65 64 20 61 73 20 61 0a 2a 2a   be used as a.**
3a20: 20 75 6e 69 71 75 65 20 66 69 6c 65 20 49 44 20   unique file ID 
3a30: 69 6e 20 56 78 57 6f 72 6b 73 2e 20 20 45 61 63  in VxWorks.  Eac
3a40: 68 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68  h instance of th
3a50: 69 73 20 73 74 72 75 63 74 75 72 65 20 63 6f 6e  is structure con
3a60: 74 61 69 6e 73 0a 2a 2a 20 61 20 63 6f 70 79 20  tains.** a copy 
3a70: 6f 66 20 74 68 65 20 63 61 6e 6f 6e 69 63 61 6c  of the canonical
3a80: 20 66 69 6c 65 6e 61 6d 65 2e 20 20 54 68 65 72   filename.  Ther
3a90: 65 20 69 73 20 61 6c 73 6f 20 61 20 72 65 66 65  e is also a refe
3aa0: 72 65 6e 63 65 20 63 6f 75 6e 74 2e 20 20 0a 2a  rence count.  .*
3ab0: 2a 20 54 68 65 20 73 74 72 75 63 74 75 72 65 20  * The structure 
3ac0: 69 73 20 72 65 63 6c 61 69 6d 65 64 20 77 68 65  is reclaimed whe
3ad0: 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  n the number of 
3ae0: 70 6f 69 6e 74 65 72 73 20 74 6f 20 69 74 20 64  pointers to it d
3af0: 72 6f 70 73 20 74 6f 0a 2a 2a 20 7a 65 72 6f 2e  rops to.** zero.
3b00: 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65 20 61 72 65  .**.** There are
3b10: 20 6e 65 76 65 72 20 76 65 72 79 20 6d 61 6e 79   never very many
3b20: 20 66 69 6c 65 73 20 6f 70 65 6e 20 61 74 20 6f   files open at o
3b30: 6e 65 20 74 69 6d 65 20 61 6e 64 20 6c 6f 6f 6b  ne time and look
3b40: 75 70 73 20 61 72 65 20 6e 6f 74 0a 2a 2a 20 61  ups are not.** a
3b50: 20 70 65 72 66 6f 72 6d 61 6e 63 65 2d 63 72 69   performance-cri
3b60: 74 69 63 61 6c 20 70 61 74 68 2c 20 73 6f 20 69  tical path, so i
3b70: 74 20 69 73 20 73 75 66 66 69 63 69 65 6e 74 20  t is sufficient 
3b80: 74 6f 20 70 75 74 20 74 68 65 73 65 0a 2a 2a 20  to put these.** 
3b90: 73 74 72 75 63 74 75 72 65 73 20 6f 6e 20 61 20  structures on a 
3ba0: 6c 69 6e 6b 65 64 20 6c 69 73 74 2e 0a 2a 2f 0a  linked list..*/.
3bb0: 73 74 72 75 63 74 20 76 78 77 6f 72 6b 73 46 69  struct vxworksFi
3bc0: 6c 65 49 64 20 7b 0a 20 20 73 74 72 75 63 74 20  leId {.  struct 
3bd0: 76 78 77 6f 72 6b 73 46 69 6c 65 49 64 20 2a 70  vxworksFileId *p
3be0: 4e 65 78 74 3b 20 20 2f 2a 20 4e 65 78 74 20 69  Next;  /* Next i
3bf0: 6e 20 61 20 6c 69 73 74 20 6f 66 20 74 68 65 6d  n a list of them
3c00: 20 61 6c 6c 20 2a 2f 0a 20 20 69 6e 74 20 6e 52   all */.  int nR
3c10: 65 66 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ef;             
3c20: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
3c30: 72 20 6f 66 20 72 65 66 65 72 65 6e 63 65 73 20  r of references 
3c40: 74 6f 20 74 68 69 73 20 6f 6e 65 20 2a 2f 0a 20  to this one */. 
3c50: 20 69 6e 74 20 6e 4e 61 6d 65 3b 20 20 20 20 20   int nName;     
3c60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
3c70: 2a 20 4c 65 6e 67 74 68 20 6f 66 20 74 68 65 20  * Length of the 
3c80: 7a 43 61 6e 6f 6e 69 63 61 6c 4e 61 6d 65 5b 5d  zCanonicalName[]
3c90: 20 73 74 72 69 6e 67 20 2a 2f 0a 20 20 63 68 61   string */.  cha
3ca0: 72 20 2a 7a 43 61 6e 6f 6e 69 63 61 6c 4e 61 6d  r *zCanonicalNam
3cb0: 65 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 43 61  e;         /* Ca
3cc0: 6e 6f 6e 69 63 61 6c 20 66 69 6c 65 6e 61 6d 65  nonical filename
3cd0: 20 2a 2f 0a 7d 3b 0a 0a 23 69 66 20 4f 53 5f 56   */.};..#if OS_V
3ce0: 58 57 4f 52 4b 53 0a 2f 2a 20 0a 2a 2a 20 41 6c  XWORKS./* .** Al
3cf0: 6c 20 75 6e 69 71 75 65 20 66 69 6c 65 6e 61 6d  l unique filenam
3d00: 65 73 20 61 72 65 20 68 65 6c 64 20 6f 6e 20 61  es are held on a
3d10: 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20 68 65 61   linked list hea
3d20: 64 65 64 20 62 79 20 74 68 69 73 0a 2a 2a 20 76  ded by this.** v
3d30: 61 72 69 61 62 6c 65 3a 0a 2a 2f 0a 73 74 61 74  ariable:.*/.stat
3d40: 69 63 20 73 74 72 75 63 74 20 76 78 77 6f 72 6b  ic struct vxwork
3d50: 73 46 69 6c 65 49 64 20 2a 76 78 77 6f 72 6b 73  sFileId *vxworks
3d60: 46 69 6c 65 4c 69 73 74 20 3d 20 30 3b 0a 0a 2f  FileList = 0;../
3d70: 2a 0a 2a 2a 20 53 69 6d 70 6c 69 66 79 20 61 20  *.** Simplify a 
3d80: 66 69 6c 65 6e 61 6d 65 20 69 6e 74 6f 20 69 74  filename into it
3d90: 73 20 63 61 6e 6f 6e 69 63 61 6c 20 66 6f 72 6d  s canonical form
3da0: 0a 2a 2a 20 62 79 20 6d 61 6b 69 6e 67 20 74 68  .** by making th
3db0: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 68 61 6e  e following chan
3dc0: 67 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 2a 20 72 65  ges:.**.**  * re
3dd0: 6d 6f 76 69 6e 67 20 61 6e 79 20 74 72 61 69 6c  moving any trail
3de0: 69 6e 67 20 61 6e 64 20 64 75 70 6c 69 63 61 74  ing and duplicat
3df0: 65 20 2f 0a 2a 2a 20 20 2a 20 63 6f 6e 76 65 72  e /.**  * conver
3e00: 74 20 2f 2e 2f 20 69 6e 74 6f 20 6a 75 73 74 20  t /./ into just 
3e10: 2f 0a 2a 2a 20 20 2a 20 63 6f 6e 76 65 72 74 20  /.**  * convert 
3e20: 2f 41 2f 2e 2e 2f 20 77 68 65 72 65 20 41 20 69  /A/../ where A i
3e30: 73 20 61 6e 79 20 73 69 6d 70 6c 65 20 6e 61 6d  s any simple nam
3e40: 65 20 69 6e 74 6f 20 6a 75 73 74 20 2f 0a 2a 2a  e into just /.**
3e50: 0a 2a 2a 20 43 68 61 6e 67 65 73 20 61 72 65 20  .** Changes are 
3e60: 6d 61 64 65 20 69 6e 2d 70 6c 61 63 65 2e 20 20  made in-place.  
3e70: 52 65 74 75 72 6e 20 74 68 65 20 6e 65 77 20 6e  Return the new n
3e80: 61 6d 65 20 6c 65 6e 67 74 68 2e 0a 2a 2a 0a 2a  ame length..**.*
3e90: 2a 20 54 68 65 20 6f 72 69 67 69 6e 61 6c 20 66  * The original f
3ea0: 69 6c 65 6e 61 6d 65 20 69 73 20 69 6e 20 7a 5b  ilename is in z[
3eb0: 30 2e 2e 6e 2d 31 5d 2e 20 20 52 65 74 75 72 6e  0..n-1].  Return
3ec0: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a 2a   the number of.*
3ed0: 2a 20 63 68 61 72 61 63 74 65 72 73 20 69 6e 20  * characters in 
3ee0: 74 68 65 20 73 69 6d 70 6c 69 66 69 65 64 20 6e  the simplified n
3ef0: 61 6d 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ame..*/.static i
3f00: 6e 74 20 76 78 77 6f 72 6b 73 53 69 6d 70 6c 69  nt vxworksSimpli
3f10: 66 79 4e 61 6d 65 28 63 68 61 72 20 2a 7a 2c 20  fyName(char *z, 
3f20: 69 6e 74 20 6e 29 7b 0a 20 20 69 6e 74 20 69 2c  int n){.  int i,
3f30: 20 6a 3b 0a 20 20 77 68 69 6c 65 28 20 6e 3e 31   j;.  while( n>1
3f40: 20 26 26 20 7a 5b 6e 2d 31 5d 3d 3d 27 2f 27 20   && z[n-1]=='/' 
3f50: 29 7b 20 6e 2d 2d 3b 20 7d 0a 20 20 66 6f 72 28  ){ n--; }.  for(
3f60: 69 3d 6a 3d 30 3b 20 69 3c 6e 3b 20 69 2b 2b 29  i=j=0; i<n; i++)
3f70: 7b 0a 20 20 20 20 69 66 28 20 7a 5b 69 5d 3d 3d  {.    if( z[i]==
3f80: 27 2f 27 20 29 7b 0a 20 20 20 20 20 20 69 66 28  '/' ){.      if(
3f90: 20 7a 5b 69 2b 31 5d 3d 3d 27 2f 27 20 29 20 63   z[i+1]=='/' ) c
3fa0: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 69  ontinue;.      i
3fb0: 66 28 20 7a 5b 69 2b 31 5d 3d 3d 27 2e 27 20 26  f( z[i+1]=='.' &
3fc0: 26 20 69 2b 32 3c 6e 20 26 26 20 7a 5b 69 2b 32  & i+2<n && z[i+2
3fd0: 5d 3d 3d 27 2f 27 20 29 7b 0a 20 20 20 20 20 20  ]=='/' ){.      
3fe0: 20 20 69 20 2b 3d 20 31 3b 0a 20 20 20 20 20 20    i += 1;.      
3ff0: 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20    continue;.    
4000: 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 7a 5b    }.      if( z[
4010: 69 2b 31 5d 3d 3d 27 2e 27 20 26 26 20 69 2b 33  i+1]=='.' && i+3
4020: 3c 6e 20 26 26 20 7a 5b 69 2b 32 5d 3d 3d 27 2e  <n && z[i+2]=='.
4030: 27 20 26 26 20 7a 5b 69 2b 33 5d 3d 3d 27 2f 27  ' && z[i+3]=='/'
4040: 20 29 7b 0a 20 20 20 20 20 20 20 20 77 68 69 6c   ){.        whil
4050: 65 28 20 6a 3e 30 20 26 26 20 7a 5b 6a 2d 31 5d  e( j>0 && z[j-1]
4060: 21 3d 27 2f 27 20 29 7b 20 6a 2d 2d 3b 20 7d 0a  !='/' ){ j--; }.
4070: 20 20 20 20 20 20 20 20 69 66 28 20 6a 3e 30 20          if( j>0 
4080: 29 7b 20 6a 2d 2d 3b 20 7d 0a 20 20 20 20 20 20  ){ j--; }.      
4090: 20 20 69 20 2b 3d 20 32 3b 0a 20 20 20 20 20 20    i += 2;.      
40a0: 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20    continue;.    
40b0: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 7a 5b    }.    }.    z[
40c0: 6a 2b 2b 5d 20 3d 20 7a 5b 69 5d 3b 0a 20 20 7d  j++] = z[i];.  }
40d0: 0a 20 20 7a 5b 6a 5d 20 3d 20 30 3b 0a 20 20 72  .  z[j] = 0;.  r
40e0: 65 74 75 72 6e 20 6a 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn j;.}../*.*
40f0: 2a 20 46 69 6e 64 20 61 20 75 6e 69 71 75 65 20  * Find a unique 
4100: 66 69 6c 65 20 49 44 20 66 6f 72 20 74 68 65 20  file ID for the 
4110: 67 69 76 65 6e 20 61 62 73 6f 6c 75 74 65 20 70  given absolute p
4120: 61 74 68 6e 61 6d 65 2e 20 20 52 65 74 75 72 6e  athname.  Return
4130: 0a 2a 2a 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  .** a pointer to
4140: 20 74 68 65 20 76 78 77 6f 72 6b 73 46 69 6c 65   the vxworksFile
4150: 49 64 20 6f 62 6a 65 63 74 2e 20 20 54 68 69 73  Id object.  This
4160: 20 70 6f 69 6e 74 65 72 20 69 73 20 74 68 65 20   pointer is the 
4170: 75 6e 69 71 75 65 0a 2a 2a 20 66 69 6c 65 20 49  unique.** file I
4180: 44 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6e 52 65  D..**.** The nRe
4190: 66 20 66 69 65 6c 64 20 6f 66 20 74 68 65 20 76  f field of the v
41a0: 78 77 6f 72 6b 73 46 69 6c 65 49 64 20 6f 62 6a  xworksFileId obj
41b0: 65 63 74 20 69 73 20 69 6e 63 72 65 6d 65 6e 74  ect is increment
41c0: 65 64 20 62 65 66 6f 72 65 0a 2a 2a 20 74 68 65  ed before.** the
41d0: 20 6f 62 6a 65 63 74 20 69 73 20 72 65 74 75 72   object is retur
41e0: 6e 65 64 2e 20 20 41 20 6e 65 77 20 76 78 77 6f  ned.  A new vxwo
41f0: 72 6b 73 46 69 6c 65 49 64 20 6f 62 6a 65 63 74  rksFileId object
4200: 20 69 73 20 63 72 65 61 74 65 64 0a 2a 2a 20 61   is created.** a
4210: 6e 64 20 61 64 64 65 64 20 74 6f 20 74 68 65 20  nd added to the 
4220: 67 6c 6f 62 61 6c 20 6c 69 73 74 20 69 66 20 6e  global list if n
4230: 65 63 65 73 73 61 72 79 2e 0a 2a 2a 0a 2a 2a 20  ecessary..**.** 
4240: 49 66 20 61 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f  If a memory allo
4250: 63 61 74 69 6f 6e 20 65 72 72 6f 72 20 6f 63 63  cation error occ
4260: 75 72 73 2c 20 72 65 74 75 72 6e 20 4e 55 4c 4c  urs, return NULL
4270: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 73 74 72 75  ..*/.static stru
4280: 63 74 20 76 78 77 6f 72 6b 73 46 69 6c 65 49 64  ct vxworksFileId
4290: 20 2a 76 78 77 6f 72 6b 73 46 69 6e 64 46 69 6c   *vxworksFindFil
42a0: 65 49 64 28 63 6f 6e 73 74 20 63 68 61 72 20 2a  eId(const char *
42b0: 7a 41 62 73 6f 6c 75 74 65 4e 61 6d 65 29 7b 0a  zAbsoluteName){.
42c0: 20 20 73 74 72 75 63 74 20 76 78 77 6f 72 6b 73    struct vxworks
42d0: 46 69 6c 65 49 64 20 2a 70 4e 65 77 3b 20 20 20  FileId *pNew;   
42e0: 20 20 20 20 20 20 2f 2a 20 73 65 61 72 63 68 20        /* search 
42f0: 6b 65 79 20 61 6e 64 20 6e 65 77 20 66 69 6c 65  key and new file
4300: 20 49 44 20 2a 2f 0a 20 20 73 74 72 75 63 74 20   ID */.  struct 
4310: 76 78 77 6f 72 6b 73 46 69 6c 65 49 64 20 2a 70  vxworksFileId *p
4320: 43 61 6e 64 69 64 61 74 65 3b 20 20 20 2f 2a 20  Candidate;   /* 
4330: 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72  For looping over
4340: 20 65 78 69 73 74 69 6e 67 20 66 69 6c 65 20 49   existing file I
4350: 44 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 3b 20 20  Ds */.  int n;  
4360: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4370: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
4380: 65 6e 67 74 68 20 6f 66 20 7a 41 62 73 6f 6c 75  ength of zAbsolu
4390: 74 65 4e 61 6d 65 20 73 74 72 69 6e 67 20 2a 2f  teName string */
43a0: 0a 0a 20 20 61 73 73 65 72 74 28 20 7a 41 62 73  ..  assert( zAbs
43b0: 6f 6c 75 74 65 4e 61 6d 65 5b 30 5d 3d 3d 27 2f  oluteName[0]=='/
43c0: 27 20 29 3b 0a 20 20 6e 20 3d 20 28 69 6e 74 29  ' );.  n = (int)
43d0: 73 74 72 6c 65 6e 28 7a 41 62 73 6f 6c 75 74 65  strlen(zAbsolute
43e0: 4e 61 6d 65 29 3b 0a 20 20 70 4e 65 77 20 3d 20  Name);.  pNew = 
43f0: 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 20  sqlite3_malloc( 
4400: 73 69 7a 65 6f 66 28 2a 70 4e 65 77 29 20 2b 20  sizeof(*pNew) + 
4410: 28 6e 2b 31 29 20 29 3b 0a 20 20 69 66 28 20 70  (n+1) );.  if( p
4420: 4e 65 77 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  New==0 ) return 
4430: 30 3b 0a 20 20 70 4e 65 77 2d 3e 7a 43 61 6e 6f  0;.  pNew->zCano
4440: 6e 69 63 61 6c 4e 61 6d 65 20 3d 20 28 63 68 61  nicalName = (cha
4450: 72 2a 29 26 70 4e 65 77 5b 31 5d 3b 0a 20 20 6d  r*)&pNew[1];.  m
4460: 65 6d 63 70 79 28 70 4e 65 77 2d 3e 7a 43 61 6e  emcpy(pNew->zCan
4470: 6f 6e 69 63 61 6c 4e 61 6d 65 2c 20 7a 41 62 73  onicalName, zAbs
4480: 6f 6c 75 74 65 4e 61 6d 65 2c 20 6e 2b 31 29 3b  oluteName, n+1);
4490: 0a 20 20 6e 20 3d 20 76 78 77 6f 72 6b 73 53 69  .  n = vxworksSi
44a0: 6d 70 6c 69 66 79 4e 61 6d 65 28 70 4e 65 77 2d  mplifyName(pNew-
44b0: 3e 7a 43 61 6e 6f 6e 69 63 61 6c 4e 61 6d 65 2c  >zCanonicalName,
44c0: 20 6e 29 3b 0a 0a 20 20 2f 2a 20 53 65 61 72 63   n);..  /* Searc
44d0: 68 20 66 6f 72 20 61 6e 20 65 78 69 73 74 69 6e  h for an existin
44e0: 67 20 65 6e 74 72 79 20 74 68 61 74 20 6d 61 74  g entry that mat
44f0: 63 68 69 6e 67 20 74 68 65 20 63 61 6e 6f 6e 69  ching the canoni
4500: 63 61 6c 20 6e 61 6d 65 2e 0a 20 20 2a 2a 20 49  cal name..  ** I
4510: 66 20 66 6f 75 6e 64 2c 20 69 6e 63 72 65 6d 65  f found, increme
4520: 6e 74 20 74 68 65 20 72 65 66 65 72 65 6e 63 65  nt the reference
4530: 20 63 6f 75 6e 74 20 61 6e 64 20 72 65 74 75 72   count and retur
4540: 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 0a 20  n a pointer to. 
4550: 20 2a 2a 20 74 68 65 20 65 78 69 73 74 69 6e 67   ** the existing
4560: 20 66 69 6c 65 20 49 44 2e 0a 20 20 2a 2f 0a 20   file ID..  */. 
4570: 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28   unixEnterMutex(
4580: 29 3b 0a 20 20 66 6f 72 28 70 43 61 6e 64 69 64  );.  for(pCandid
4590: 61 74 65 3d 76 78 77 6f 72 6b 73 46 69 6c 65 4c  ate=vxworksFileL
45a0: 69 73 74 3b 20 70 43 61 6e 64 69 64 61 74 65 3b  ist; pCandidate;
45b0: 20 70 43 61 6e 64 69 64 61 74 65 3d 70 43 61 6e   pCandidate=pCan
45c0: 64 69 64 61 74 65 2d 3e 70 4e 65 78 74 29 7b 0a  didate->pNext){.
45d0: 20 20 20 20 69 66 28 20 70 43 61 6e 64 69 64 61      if( pCandida
45e0: 74 65 2d 3e 6e 4e 61 6d 65 3d 3d 6e 20 0a 20 20  te->nName==n .  
45f0: 20 20 20 26 26 20 6d 65 6d 63 6d 70 28 70 43 61     && memcmp(pCa
4600: 6e 64 69 64 61 74 65 2d 3e 7a 43 61 6e 6f 6e 69  ndidate->zCanoni
4610: 63 61 6c 4e 61 6d 65 2c 20 70 4e 65 77 2d 3e 7a  calName, pNew->z
4620: 43 61 6e 6f 6e 69 63 61 6c 4e 61 6d 65 2c 20 6e  CanonicalName, n
4630: 29 3d 3d 30 0a 20 20 20 20 29 7b 0a 20 20 20 20  )==0.    ){.    
4640: 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
4650: 70 4e 65 77 29 3b 0a 20 20 20 20 20 20 20 70 43  pNew);.       pC
4660: 61 6e 64 69 64 61 74 65 2d 3e 6e 52 65 66 2b 2b  andidate->nRef++
4670: 3b 0a 20 20 20 20 20 20 20 75 6e 69 78 4c 65 61  ;.       unixLea
4680: 76 65 4d 75 74 65 78 28 29 3b 0a 20 20 20 20 20  veMutex();.     
4690: 20 20 72 65 74 75 72 6e 20 70 43 61 6e 64 69 64    return pCandid
46a0: 61 74 65 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  ate;.    }.  }..
46b0: 20 20 2f 2a 20 4e 6f 20 6d 61 74 63 68 20 77 61    /* No match wa
46c0: 73 20 66 6f 75 6e 64 2e 20 20 57 65 20 77 69 6c  s found.  We wil
46d0: 6c 20 6d 61 6b 65 20 61 20 6e 65 77 20 66 69 6c  l make a new fil
46e0: 65 20 49 44 20 2a 2f 0a 20 20 70 4e 65 77 2d 3e  e ID */.  pNew->
46f0: 6e 52 65 66 20 3d 20 31 3b 0a 20 20 70 4e 65 77  nRef = 1;.  pNew
4700: 2d 3e 6e 4e 61 6d 65 20 3d 20 6e 3b 0a 20 20 70  ->nName = n;.  p
4710: 4e 65 77 2d 3e 70 4e 65 78 74 20 3d 20 76 78 77  New->pNext = vxw
4720: 6f 72 6b 73 46 69 6c 65 4c 69 73 74 3b 0a 20 20  orksFileList;.  
4730: 76 78 77 6f 72 6b 73 46 69 6c 65 4c 69 73 74 20  vxworksFileList 
4740: 3d 20 70 4e 65 77 3b 0a 20 20 75 6e 69 78 4c 65  = pNew;.  unixLe
4750: 61 76 65 4d 75 74 65 78 28 29 3b 0a 20 20 72 65  aveMutex();.  re
4760: 74 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a 0a 2f 2a  turn pNew;.}../*
4770: 0a 2a 2a 20 44 65 63 72 65 6d 65 6e 74 20 74 68  .** Decrement th
4780: 65 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e  e reference coun
4790: 74 20 6f 6e 20 61 20 76 78 77 6f 72 6b 73 46 69  t on a vxworksFi
47a0: 6c 65 49 64 20 6f 62 6a 65 63 74 2e 20 20 46 72  leId object.  Fr
47b0: 65 65 0a 2a 2a 20 74 68 65 20 6f 62 6a 65 63 74  ee.** the object
47c0: 20 77 68 65 6e 20 74 68 65 20 72 65 66 65 72 65   when the refere
47d0: 6e 63 65 20 63 6f 75 6e 74 20 72 65 61 63 68 65  nce count reache
47e0: 73 20 7a 65 72 6f 2e 0a 2a 2f 0a 73 74 61 74 69  s zero..*/.stati
47f0: 63 20 76 6f 69 64 20 76 78 77 6f 72 6b 73 52 65  c void vxworksRe
4800: 6c 65 61 73 65 46 69 6c 65 49 64 28 73 74 72 75  leaseFileId(stru
4810: 63 74 20 76 78 77 6f 72 6b 73 46 69 6c 65 49 64  ct vxworksFileId
4820: 20 2a 70 49 64 29 7b 0a 20 20 75 6e 69 78 45 6e   *pId){.  unixEn
4830: 74 65 72 4d 75 74 65 78 28 29 3b 0a 20 20 61 73  terMutex();.  as
4840: 73 65 72 74 28 20 70 49 64 2d 3e 6e 52 65 66 3e  sert( pId->nRef>
4850: 30 20 29 3b 0a 20 20 70 49 64 2d 3e 6e 52 65 66  0 );.  pId->nRef
4860: 2d 2d 3b 0a 20 20 69 66 28 20 70 49 64 2d 3e 6e  --;.  if( pId->n
4870: 52 65 66 3d 3d 30 20 29 7b 0a 20 20 20 20 73 74  Ref==0 ){.    st
4880: 72 75 63 74 20 76 78 77 6f 72 6b 73 46 69 6c 65  ruct vxworksFile
4890: 49 64 20 2a 2a 70 70 3b 0a 20 20 20 20 66 6f 72  Id **pp;.    for
48a0: 28 70 70 3d 26 76 78 77 6f 72 6b 73 46 69 6c 65  (pp=&vxworksFile
48b0: 4c 69 73 74 3b 20 2a 70 70 20 26 26 20 2a 70 70  List; *pp && *pp
48c0: 21 3d 70 49 64 3b 20 70 70 20 3d 20 26 28 28 2a  !=pId; pp = &((*
48d0: 70 70 29 2d 3e 70 4e 65 78 74 29 29 7b 7d 0a 20  pp)->pNext)){}. 
48e0: 20 20 20 61 73 73 65 72 74 28 20 2a 70 70 3d 3d     assert( *pp==
48f0: 70 49 64 20 29 3b 0a 20 20 20 20 2a 70 70 20 3d  pId );.    *pp =
4900: 20 70 49 64 2d 3e 70 4e 65 78 74 3b 0a 20 20 20   pId->pNext;.   
4910: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 49   sqlite3_free(pI
4920: 64 29 3b 0a 20 20 7d 0a 20 20 75 6e 69 78 4c 65  d);.  }.  unixLe
4930: 61 76 65 4d 75 74 65 78 28 29 3b 0a 7d 0a 23 65  aveMutex();.}.#e
4940: 6e 64 69 66 20 2f 2a 20 4f 53 5f 56 58 57 4f 52  ndif /* OS_VXWOR
4950: 4b 53 20 2a 2f 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a  KS */./*********
4960: 2a 2a 2a 2a 2a 2a 20 45 6e 64 20 6f 66 20 55 6e  ****** End of Un
4970: 69 71 75 65 20 46 69 6c 65 20 49 44 20 55 74 69  ique File ID Uti
4980: 6c 69 74 79 20 55 73 65 64 20 42 79 20 56 78 57  lity Used By VxW
4990: 6f 72 6b 73 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  orks ***********
49a0: 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  *****.**********
49b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
49c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
49d0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
49e0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
49f0: 2a 2a 2a 2a 2f 0a 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a  ****/.../*******
4a00: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4a10: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4a20: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4a30: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4a40: 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a  *******.********
4a50: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4a60: 2a 2a 2a 20 50 6f 73 69 78 20 41 64 76 69 73 6f  *** Posix Adviso
4a70: 72 79 20 4c 6f 63 6b 69 6e 67 20 2a 2a 2a 2a 2a  ry Locking *****
4a80: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4a90: 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 50 4f  *******.**.** PO
4aa0: 53 49 58 20 61 64 76 69 73 6f 72 79 20 6c 6f 63  SIX advisory loc
4ab0: 6b 73 20 61 72 65 20 62 72 6f 6b 65 6e 20 62 79  ks are broken by
4ac0: 20 64 65 73 69 67 6e 2e 20 20 41 4e 53 49 20 53   design.  ANSI S
4ad0: 54 44 20 31 30 30 33 2e 31 20 28 31 39 39 36 29  TD 1003.1 (1996)
4ae0: 0a 2a 2a 20 73 65 63 74 69 6f 6e 20 36 2e 35 2e  .** section 6.5.
4af0: 32 2e 32 20 6c 69 6e 65 73 20 34 38 33 20 74 68  2.2 lines 483 th
4b00: 72 6f 75 67 68 20 34 39 30 20 73 70 65 63 69 66  rough 490 specif
4b10: 79 20 74 68 61 74 20 77 68 65 6e 20 61 20 70 72  y that when a pr
4b20: 6f 63 65 73 73 0a 2a 2a 20 73 65 74 73 20 6f 72  ocess.** sets or
4b30: 20 63 6c 65 61 72 73 20 61 20 6c 6f 63 6b 2c 20   clears a lock, 
4b40: 74 68 61 74 20 6f 70 65 72 61 74 69 6f 6e 20 6f  that operation o
4b50: 76 65 72 72 69 64 65 73 20 61 6e 79 20 70 72 69  verrides any pri
4b60: 6f 72 20 6c 6f 63 6b 73 20 73 65 74 0a 2a 2a 20  or locks set.** 
4b70: 62 79 20 74 68 65 20 73 61 6d 65 20 70 72 6f 63  by the same proc
4b80: 65 73 73 2e 20 20 49 74 20 64 6f 65 73 20 6e 6f  ess.  It does no
4b90: 74 20 65 78 70 6c 69 63 69 74 6c 79 20 73 61 79  t explicitly say
4ba0: 20 73 6f 2c 20 62 75 74 20 74 68 69 73 20 69 6d   so, but this im
4bb0: 70 6c 69 65 73 0a 2a 2a 20 74 68 61 74 20 69 74  plies.** that it
4bc0: 20 6f 76 65 72 72 69 64 65 73 20 6c 6f 63 6b 73   overrides locks
4bd0: 20 73 65 74 20 62 79 20 74 68 65 20 73 61 6d 65   set by the same
4be0: 20 70 72 6f 63 65 73 73 20 75 73 69 6e 67 20 61   process using a
4bf0: 20 64 69 66 66 65 72 65 6e 74 0a 2a 2a 20 66 69   different.** fi
4c00: 6c 65 20 64 65 73 63 72 69 70 74 6f 72 2e 20 20  le descriptor.  
4c10: 43 6f 6e 73 69 64 65 72 20 74 68 69 73 20 74 65  Consider this te
4c20: 73 74 20 63 61 73 65 3a 0a 2a 2a 0a 2a 2a 20 20  st case:.**.**  
4c30: 20 20 20 20 20 69 6e 74 20 66 64 31 20 3d 20 6f       int fd1 = o
4c40: 70 65 6e 28 22 2e 2f 66 69 6c 65 31 22 2c 20 4f  pen("./file1", O
4c50: 5f 52 44 57 52 7c 4f 5f 43 52 45 41 54 2c 20 30  _RDWR|O_CREAT, 0
4c60: 36 34 34 29 3b 0a 2a 2a 20 20 20 20 20 20 20 69  644);.**       i
4c70: 6e 74 20 66 64 32 20 3d 20 6f 70 65 6e 28 22 2e  nt fd2 = open(".
4c80: 2f 66 69 6c 65 32 22 2c 20 4f 5f 52 44 57 52 7c  /file2", O_RDWR|
4c90: 4f 5f 43 52 45 41 54 2c 20 30 36 34 34 29 3b 0a  O_CREAT, 0644);.
4ca0: 2a 2a 0a 2a 2a 20 53 75 70 70 6f 73 65 20 2e 2f  **.** Suppose ./
4cb0: 66 69 6c 65 31 20 61 6e 64 20 2e 2f 66 69 6c 65  file1 and ./file
4cc0: 32 20 61 72 65 20 72 65 61 6c 6c 79 20 74 68 65  2 are really the
4cd0: 20 73 61 6d 65 20 66 69 6c 65 20 28 62 65 63 61   same file (beca
4ce0: 75 73 65 0a 2a 2a 20 6f 6e 65 20 69 73 20 61 20  use.** one is a 
4cf0: 68 61 72 64 20 6f 72 20 73 79 6d 62 6f 6c 69 63  hard or symbolic
4d00: 20 6c 69 6e 6b 20 74 6f 20 74 68 65 20 6f 74 68   link to the oth
4d10: 65 72 29 20 74 68 65 6e 20 69 66 20 79 6f 75 20  er) then if you 
4d20: 73 65 74 0a 2a 2a 20 61 6e 20 65 78 63 6c 75 73  set.** an exclus
4d30: 69 76 65 20 6c 6f 63 6b 20 6f 6e 20 66 64 31 2c  ive lock on fd1,
4d40: 20 74 68 65 6e 20 74 72 79 20 74 6f 20 67 65 74   then try to get
4d50: 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f   an exclusive lo
4d60: 63 6b 0a 2a 2a 20 6f 6e 20 66 64 32 2c 20 69 74  ck.** on fd2, it
4d70: 20 77 6f 72 6b 73 2e 20 20 49 20 77 6f 75 6c 64   works.  I would
4d80: 20 68 61 76 65 20 65 78 70 65 63 74 65 64 20 74   have expected t
4d90: 68 65 20 73 65 63 6f 6e 64 20 6c 6f 63 6b 20 74  he second lock t
4da0: 6f 0a 2a 2a 20 66 61 69 6c 20 73 69 6e 63 65 20  o.** fail since 
4db0: 74 68 65 72 65 20 77 61 73 20 61 6c 72 65 61 64  there was alread
4dc0: 79 20 61 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  y a lock on the 
4dd0: 66 69 6c 65 20 64 75 65 20 74 6f 20 66 64 31 2e  file due to fd1.
4de0: 0a 2a 2a 20 42 75 74 20 6e 6f 74 20 73 6f 2e 20  .** But not so. 
4df0: 20 53 69 6e 63 65 20 62 6f 74 68 20 6c 6f 63 6b   Since both lock
4e00: 73 20 63 61 6d 65 20 66 72 6f 6d 20 74 68 65 20  s came from the 
4e10: 73 61 6d 65 20 70 72 6f 63 65 73 73 2c 20 74 68  same process, th
4e20: 65 0a 2a 2a 20 73 65 63 6f 6e 64 20 6f 76 65 72  e.** second over
4e30: 72 69 64 65 73 20 74 68 65 20 66 69 72 73 74 2c  rides the first,
4e40: 20 65 76 65 6e 20 74 68 6f 75 67 68 20 74 68 65   even though the
4e50: 79 20 77 65 72 65 20 6f 6e 20 64 69 66 66 65 72  y were on differ
4e60: 65 6e 74 0a 2a 2a 20 66 69 6c 65 20 64 65 73 63  ent.** file desc
4e70: 72 69 70 74 6f 72 73 20 6f 70 65 6e 65 64 20 6f  riptors opened o
4e80: 6e 20 64 69 66 66 65 72 65 6e 74 20 66 69 6c 65  n different file
4e90: 20 6e 61 6d 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68   names..**.** Th
4ea0: 69 73 20 6d 65 61 6e 73 20 74 68 61 74 20 77 65  is means that we
4eb0: 20 63 61 6e 6e 6f 74 20 75 73 65 20 50 4f 53 49   cannot use POSI
4ec0: 58 20 6c 6f 63 6b 73 20 74 6f 20 73 79 6e 63 68  X locks to synch
4ed0: 72 6f 6e 69 7a 65 20 66 69 6c 65 20 61 63 63 65  ronize file acce
4ee0: 73 73 0a 2a 2a 20 61 6d 6f 6e 67 20 63 6f 6d 70  ss.** among comp
4ef0: 65 74 69 6e 67 20 74 68 72 65 61 64 73 20 6f 66  eting threads of
4f00: 20 74 68 65 20 73 61 6d 65 20 70 72 6f 63 65 73   the same proces
4f10: 73 2e 20 20 50 4f 53 49 58 20 6c 6f 63 6b 73 20  s.  POSIX locks 
4f20: 77 69 6c 6c 20 77 6f 72 6b 20 66 69 6e 65 0a 2a  will work fine.*
4f30: 2a 20 74 6f 20 73 79 6e 63 68 72 6f 6e 69 7a 65  * to synchronize
4f40: 20 61 63 63 65 73 73 20 66 6f 72 20 74 68 72 65   access for thre
4f50: 61 64 73 20 69 6e 20 73 65 70 61 72 61 74 65 20  ads in separate 
4f60: 70 72 6f 63 65 73 73 65 73 2c 20 62 75 74 20 6e  processes, but n
4f70: 6f 74 0a 2a 2a 20 74 68 72 65 61 64 73 20 77 69  ot.** threads wi
4f80: 74 68 69 6e 20 74 68 65 20 73 61 6d 65 20 70 72  thin the same pr
4f90: 6f 63 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20  ocess..**.** To 
4fa0: 77 6f 72 6b 20 61 72 6f 75 6e 64 20 74 68 65 20  work around the 
4fb0: 70 72 6f 62 6c 65 6d 2c 20 53 51 4c 69 74 65 20  problem, SQLite 
4fc0: 68 61 73 20 74 6f 20 6d 61 6e 61 67 65 20 66 69  has to manage fi
4fd0: 6c 65 20 6c 6f 63 6b 73 20 69 6e 74 65 72 6e 61  le locks interna
4fe0: 6c 6c 79 0a 2a 2a 20 6f 6e 20 69 74 73 20 6f 77  lly.** on its ow
4ff0: 6e 2e 20 20 57 68 65 6e 65 76 65 72 20 61 20 6e  n.  Whenever a n
5000: 65 77 20 64 61 74 61 62 61 73 65 20 69 73 20 6f  ew database is o
5010: 70 65 6e 65 64 2c 20 77 65 20 68 61 76 65 20 74  pened, we have t
5020: 6f 20 66 69 6e 64 20 74 68 65 0a 2a 2a 20 73 70  o find the.** sp
5030: 65 63 69 66 69 63 20 69 6e 6f 64 65 20 6f 66 20  ecific inode of 
5040: 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
5050: 65 20 28 74 68 65 20 69 6e 6f 64 65 20 69 73 20  e (the inode is 
5060: 64 65 74 65 72 6d 69 6e 65 64 20 62 79 20 74 68  determined by th
5070: 65 0a 2a 2a 20 73 74 5f 64 65 76 20 61 6e 64 20  e.** st_dev and 
5080: 73 74 5f 69 6e 6f 20 66 69 65 6c 64 73 20 6f 66  st_ino fields of
5090: 20 74 68 65 20 73 74 61 74 20 73 74 72 75 63 74   the stat struct
50a0: 75 72 65 20 74 68 61 74 20 66 73 74 61 74 28 29  ure that fstat()
50b0: 20 66 69 6c 6c 73 20 69 6e 29 0a 2a 2a 20 61 6e   fills in).** an
50c0: 64 20 63 68 65 63 6b 20 66 6f 72 20 6c 6f 63 6b  d check for lock
50d0: 73 20 61 6c 72 65 61 64 79 20 65 78 69 73 74 69  s already existi
50e0: 6e 67 20 6f 6e 20 74 68 61 74 20 69 6e 6f 64 65  ng on that inode
50f0: 2e 20 20 57 68 65 6e 20 6c 6f 63 6b 73 20 61 72  .  When locks ar
5100: 65 0a 2a 2a 20 63 72 65 61 74 65 64 20 6f 72 20  e.** created or 
5110: 72 65 6d 6f 76 65 64 2c 20 77 65 20 68 61 76 65  removed, we have
5120: 20 74 6f 20 6c 6f 6f 6b 20 61 74 20 6f 75 72 20   to look at our 
5130: 6f 77 6e 20 69 6e 74 65 72 6e 61 6c 20 72 65 63  own internal rec
5140: 6f 72 64 20 6f 66 20 74 68 65 0a 2a 2a 20 6c 6f  ord of the.** lo
5150: 63 6b 73 20 74 6f 20 73 65 65 20 69 66 20 61 6e  cks to see if an
5160: 6f 74 68 65 72 20 74 68 72 65 61 64 20 68 61 73  other thread has
5170: 20 70 72 65 76 69 6f 75 73 6c 79 20 73 65 74 20   previously set 
5180: 61 20 6c 6f 63 6b 20 6f 6e 20 74 68 61 74 20 73  a lock on that s
5190: 61 6d 65 0a 2a 2a 20 69 6e 6f 64 65 2e 0a 2a 2a  ame.** inode..**
51a0: 0a 2a 2a 20 28 41 73 69 64 65 3a 20 54 68 65 20  .** (Aside: The 
51b0: 75 73 65 20 6f 66 20 69 6e 6f 64 65 20 6e 75 6d  use of inode num
51c0: 62 65 72 73 20 61 73 20 75 6e 69 71 75 65 20 49  bers as unique I
51d0: 44 73 20 64 6f 65 73 20 6e 6f 74 20 77 6f 72 6b  Ds does not work
51e0: 20 6f 6e 20 56 78 57 6f 72 6b 73 2e 0a 2a 2a 20   on VxWorks..** 
51f0: 46 6f 72 20 56 78 57 6f 72 6b 73 2c 20 77 65 20  For VxWorks, we 
5200: 68 61 76 65 20 74 6f 20 75 73 65 20 74 68 65 20  have to use the 
5210: 61 6c 74 65 72 6e 61 74 69 76 65 20 75 6e 69 71  alternative uniq
5220: 75 65 20 49 44 20 73 79 73 74 65 6d 20 62 61 73  ue ID system bas
5230: 65 64 20 6f 6e 0a 2a 2a 20 63 61 6e 6f 6e 69 63  ed on.** canonic
5240: 61 6c 20 66 69 6c 65 6e 61 6d 65 20 61 6e 64 20  al filename and 
5250: 69 6d 70 6c 65 6d 65 6e 74 65 64 20 69 6e 20 74  implemented in t
5260: 68 65 20 70 72 65 76 69 6f 75 73 20 64 69 76 69  he previous divi
5270: 73 69 6f 6e 2e 29 0a 2a 2a 0a 2a 2a 20 54 68 65  sion.).**.** The
5280: 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 73 74   sqlite3_file st
5290: 72 75 63 74 75 72 65 20 66 6f 72 20 50 4f 53 49  ructure for POSI
52a0: 58 20 69 73 20 6e 6f 20 6c 6f 6e 67 65 72 20 6a  X is no longer j
52b0: 75 73 74 20 61 6e 20 69 6e 74 65 67 65 72 20 66  ust an integer f
52c0: 69 6c 65 0a 2a 2a 20 64 65 73 63 72 69 70 74 6f  ile.** descripto
52d0: 72 2e 20 20 49 74 20 69 73 20 6e 6f 77 20 61 20  r.  It is now a 
52e0: 73 74 72 75 63 74 75 72 65 20 74 68 61 74 20 68  structure that h
52f0: 6f 6c 64 73 20 74 68 65 20 69 6e 74 65 67 65 72  olds the integer
5300: 20 66 69 6c 65 0a 2a 2a 20 64 65 73 63 72 69 70   file.** descrip
5310: 74 6f 72 20 61 6e 64 20 61 20 70 6f 69 6e 74 65  tor and a pointe
5320: 72 20 74 6f 20 61 20 73 74 72 75 63 74 75 72 65  r to a structure
5330: 20 74 68 61 74 20 64 65 73 63 72 69 62 65 73 20   that describes 
5340: 74 68 65 20 69 6e 74 65 72 6e 61 6c 0a 2a 2a 20  the internal.** 
5350: 6c 6f 63 6b 73 20 6f 6e 20 74 68 65 20 63 6f 72  locks on the cor
5360: 72 65 73 70 6f 6e 64 69 6e 67 20 69 6e 6f 64 65  responding inode
5370: 2e 20 20 54 68 65 72 65 20 69 73 20 6f 6e 65 20  .  There is one 
5380: 6c 6f 63 6b 69 6e 67 20 73 74 72 75 63 74 75 72  locking structur
5390: 65 0a 2a 2a 20 70 65 72 20 69 6e 6f 64 65 2c 20  e.** per inode, 
53a0: 73 6f 20 69 66 20 74 68 65 20 73 61 6d 65 20 69  so if the same i
53b0: 6e 6f 64 65 20 69 73 20 6f 70 65 6e 65 64 20 74  node is opened t
53c0: 77 69 63 65 2c 20 62 6f 74 68 20 75 6e 69 78 46  wice, both unixF
53d0: 69 6c 65 20 73 74 72 75 63 74 75 72 65 73 0a 2a  ile structures.*
53e0: 2a 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 73  * point to the s
53f0: 61 6d 65 20 6c 6f 63 6b 69 6e 67 20 73 74 72 75  ame locking stru
5400: 63 74 75 72 65 2e 20 20 54 68 65 20 6c 6f 63 6b  cture.  The lock
5410: 69 6e 67 20 73 74 72 75 63 74 75 72 65 20 6b 65  ing structure ke
5420: 65 70 73 0a 2a 2a 20 61 20 72 65 66 65 72 65 6e  eps.** a referen
5430: 63 65 20 63 6f 75 6e 74 20 28 73 6f 20 77 65 20  ce count (so we 
5440: 77 69 6c 6c 20 6b 6e 6f 77 20 77 68 65 6e 20 74  will know when t
5450: 6f 20 64 65 6c 65 74 65 20 69 74 29 20 61 6e 64  o delete it) and
5460: 20 61 20 22 63 6e 74 22 0a 2a 2a 20 66 69 65 6c   a "cnt".** fiel
5470: 64 20 74 68 61 74 20 74 65 6c 6c 73 20 75 73 20  d that tells us 
5480: 69 74 73 20 69 6e 74 65 72 6e 61 6c 20 6c 6f 63  its internal loc
5490: 6b 20 73 74 61 74 75 73 2e 20 20 63 6e 74 3d 3d  k status.  cnt==
54a0: 30 20 6d 65 61 6e 73 20 74 68 65 0a 2a 2a 20 66  0 means the.** f
54b0: 69 6c 65 20 69 73 20 75 6e 6c 6f 63 6b 65 64 2e  ile is unlocked.
54c0: 20 20 63 6e 74 3d 3d 2d 31 20 6d 65 61 6e 73 20    cnt==-1 means 
54d0: 74 68 65 20 66 69 6c 65 20 68 61 73 20 61 6e 20  the file has an 
54e0: 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 2e 0a  exclusive lock..
54f0: 2a 2a 20 63 6e 74 3e 30 20 6d 65 61 6e 73 20 74  ** cnt>0 means t
5500: 68 65 72 65 20 61 72 65 20 63 6e 74 20 73 68 61  here are cnt sha
5510: 72 65 64 20 6c 6f 63 6b 73 20 6f 6e 20 74 68 65  red locks on the
5520: 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 41 6e 79   file..**.** Any
5530: 20 61 74 74 65 6d 70 74 20 74 6f 20 6c 6f 63 6b   attempt to lock
5540: 20 6f 72 20 75 6e 6c 6f 63 6b 20 61 20 66 69 6c   or unlock a fil
5550: 65 20 66 69 72 73 74 20 63 68 65 63 6b 73 20 74  e first checks t
5560: 68 65 20 6c 6f 63 6b 69 6e 67 0a 2a 2a 20 73 74  he locking.** st
5570: 72 75 63 74 75 72 65 2e 20 20 54 68 65 20 66 63  ructure.  The fc
5580: 6e 74 6c 28 29 20 73 79 73 74 65 6d 20 63 61 6c  ntl() system cal
5590: 6c 20 69 73 20 6f 6e 6c 79 20 69 6e 76 6f 6b 65  l is only invoke
55a0: 64 20 74 6f 20 73 65 74 20 61 20 0a 2a 2a 20 50  d to set a .** P
55b0: 4f 53 49 58 20 6c 6f 63 6b 20 69 66 20 74 68 65  OSIX lock if the
55c0: 20 69 6e 74 65 72 6e 61 6c 20 6c 6f 63 6b 20 73   internal lock s
55d0: 74 72 75 63 74 75 72 65 20 74 72 61 6e 73 69 74  tructure transit
55e0: 69 6f 6e 73 20 62 65 74 77 65 65 6e 0a 2a 2a 20  ions between.** 
55f0: 61 20 6c 6f 63 6b 65 64 20 61 6e 64 20 61 6e 20  a locked and an 
5600: 75 6e 6c 6f 63 6b 65 64 20 73 74 61 74 65 2e 0a  unlocked state..
5610: 2a 2a 0a 2a 2a 20 42 75 74 20 77 61 69 74 3a 20  **.** But wait: 
5620: 20 74 68 65 72 65 20 61 72 65 20 79 65 74 20 6d   there are yet m
5630: 6f 72 65 20 70 72 6f 62 6c 65 6d 73 20 77 69 74  ore problems wit
5640: 68 20 50 4f 53 49 58 20 61 64 76 69 73 6f 72 79  h POSIX advisory
5650: 20 6c 6f 63 6b 73 2e 0a 2a 2a 0a 2a 2a 20 49 66   locks..**.** If
5660: 20 79 6f 75 20 63 6c 6f 73 65 20 61 20 66 69 6c   you close a fil
5670: 65 20 64 65 73 63 72 69 70 74 6f 72 20 74 68 61  e descriptor tha
5680: 74 20 70 6f 69 6e 74 73 20 74 6f 20 61 20 66 69  t points to a fi
5690: 6c 65 20 74 68 61 74 20 68 61 73 20 6c 6f 63 6b  le that has lock
56a0: 73 2c 0a 2a 2a 20 61 6c 6c 20 6c 6f 63 6b 73 20  s,.** all locks 
56b0: 6f 6e 20 74 68 61 74 20 66 69 6c 65 20 74 68 61  on that file tha
56c0: 74 20 61 72 65 20 6f 77 6e 65 64 20 62 79 20 74  t are owned by t
56d0: 68 65 20 63 75 72 72 65 6e 74 20 70 72 6f 63 65  he current proce
56e0: 73 73 20 61 72 65 0a 2a 2a 20 72 65 6c 65 61 73  ss are.** releas
56f0: 65 64 2e 20 20 54 6f 20 77 6f 72 6b 20 61 72 6f  ed.  To work aro
5700: 75 6e 64 20 74 68 69 73 20 70 72 6f 62 6c 65 6d  und this problem
5710: 2c 20 65 61 63 68 20 75 6e 69 78 46 69 6c 65 20  , each unixFile 
5720: 73 74 72 75 63 74 75 72 65 20 63 6f 6e 74 61 69  structure contai
5730: 6e 73 0a 2a 2a 20 61 20 70 6f 69 6e 74 65 72 20  ns.** a pointer 
5740: 74 6f 20 61 6e 20 75 6e 69 78 4f 70 65 6e 43 6e  to an unixOpenCn
5750: 74 20 73 74 72 75 63 74 75 72 65 2e 20 20 54 68  t structure.  Th
5760: 65 72 65 20 69 73 20 6f 6e 65 20 75 6e 69 78 4f  ere is one unixO
5770: 70 65 6e 43 6e 74 20 73 74 72 75 63 74 75 72 65  penCnt structure
5780: 0a 2a 2a 20 70 65 72 20 6f 70 65 6e 20 69 6e 6f  .** per open ino
5790: 64 65 2c 20 77 68 69 63 68 20 6d 65 61 6e 73 20  de, which means 
57a0: 74 68 61 74 20 6d 75 6c 74 69 70 6c 65 20 75 6e  that multiple un
57b0: 69 78 46 69 6c 65 20 63 61 6e 20 70 6f 69 6e 74  ixFile can point
57c0: 20 74 6f 20 61 20 73 69 6e 67 6c 65 0a 2a 2a 20   to a single.** 
57d0: 75 6e 69 78 4f 70 65 6e 43 6e 74 2e 20 20 57 68  unixOpenCnt.  Wh
57e0: 65 6e 20 61 6e 20 61 74 74 65 6d 70 74 20 69 73  en an attempt is
57f0: 20 6d 61 64 65 20 74 6f 20 63 6c 6f 73 65 20 61   made to close a
5800: 6e 20 75 6e 69 78 46 69 6c 65 2c 20 69 66 20 74  n unixFile, if t
5810: 68 65 72 65 20 61 72 65 0a 2a 2a 20 6f 74 68 65  here are.** othe
5820: 72 20 75 6e 69 78 46 69 6c 65 20 6f 70 65 6e 20  r unixFile open 
5830: 6f 6e 20 74 68 65 20 73 61 6d 65 20 69 6e 6f 64  on the same inod
5840: 65 20 74 68 61 74 20 61 72 65 20 68 6f 6c 64 69  e that are holdi
5850: 6e 67 20 6c 6f 63 6b 73 2c 20 74 68 65 20 63 61  ng locks, the ca
5860: 6c 6c 0a 2a 2a 20 74 6f 20 63 6c 6f 73 65 28 29  ll.** to close()
5870: 20 74 68 65 20 66 69 6c 65 20 64 65 73 63 72 69   the file descri
5880: 70 74 6f 72 20 69 73 20 64 65 66 65 72 72 65 64  ptor is deferred
5890: 20 75 6e 74 69 6c 20 61 6c 6c 20 6f 66 20 74 68   until all of th
58a0: 65 20 6c 6f 63 6b 73 20 63 6c 65 61 72 2e 0a 2a  e locks clear..*
58b0: 2a 20 54 68 65 20 75 6e 69 78 4f 70 65 6e 43 6e  * The unixOpenCn
58c0: 74 20 73 74 72 75 63 74 75 72 65 20 6b 65 65 70  t structure keep
58d0: 73 20 61 20 6c 69 73 74 20 6f 66 20 66 69 6c 65  s a list of file
58e0: 20 64 65 73 63 72 69 70 74 6f 72 73 20 74 68 61   descriptors tha
58f0: 74 20 6e 65 65 64 20 74 6f 0a 2a 2a 20 62 65 20  t need to.** be 
5900: 63 6c 6f 73 65 64 20 61 6e 64 20 74 68 61 74 20  closed and that 
5910: 6c 69 73 74 20 69 73 20 77 61 6c 6b 65 64 20 28  list is walked (
5920: 61 6e 64 20 63 6c 65 61 72 65 64 29 20 77 68 65  and cleared) whe
5930: 6e 20 74 68 65 20 6c 61 73 74 20 6c 6f 63 6b 0a  n the last lock.
5940: 2a 2a 20 63 6c 65 61 72 73 2e 0a 2a 2a 0a 2a 2a  ** clears..**.**
5950: 20 59 65 74 20 61 6e 6f 74 68 65 72 20 70 72 6f   Yet another pro
5960: 62 6c 65 6d 3a 20 20 4c 69 6e 75 78 54 68 72 65  blem:  LinuxThre
5970: 61 64 73 20 64 6f 20 6e 6f 74 20 70 6c 61 79 20  ads do not play 
5980: 77 65 6c 6c 20 77 69 74 68 20 70 6f 73 69 78 20  well with posix 
5990: 6c 6f 63 6b 73 2e 0a 2a 2a 0a 2a 2a 20 4d 61 6e  locks..**.** Man
59a0: 79 20 6f 6c 64 65 72 20 76 65 72 73 69 6f 6e 73  y older versions
59b0: 20 6f 66 20 6c 69 6e 75 78 20 75 73 65 20 74 68   of linux use th
59c0: 65 20 4c 69 6e 75 78 54 68 72 65 61 64 73 20 6c  e LinuxThreads l
59d0: 69 62 72 61 72 79 20 77 68 69 63 68 20 69 73 0a  ibrary which is.
59e0: 2a 2a 20 6e 6f 74 20 70 6f 73 69 78 20 63 6f 6d  ** not posix com
59f0: 70 6c 69 61 6e 74 2e 20 20 55 6e 64 65 72 20 4c  pliant.  Under L
5a00: 69 6e 75 78 54 68 72 65 61 64 73 2c 20 61 20 6c  inuxThreads, a l
5a10: 6f 63 6b 20 63 72 65 61 74 65 64 20 62 79 20 74  ock created by t
5a20: 68 72 65 61 64 0a 2a 2a 20 41 20 63 61 6e 6e 6f  hread.** A canno
5a30: 74 20 62 65 20 6d 6f 64 69 66 69 65 64 20 6f 72  t be modified or
5a40: 20 6f 76 65 72 72 69 64 64 65 6e 20 62 79 20 61   overridden by a
5a50: 20 64 69 66 66 65 72 65 6e 74 20 74 68 72 65 61   different threa
5a60: 64 20 42 2e 0a 2a 2a 20 4f 6e 6c 79 20 74 68 72  d B..** Only thr
5a70: 65 61 64 20 41 20 63 61 6e 20 6d 6f 64 69 66 79  ead A can modify
5a80: 20 74 68 65 20 6c 6f 63 6b 2e 20 20 4c 6f 63 6b   the lock.  Lock
5a90: 69 6e 67 20 62 65 68 61 76 69 6f 72 20 69 73 20  ing behavior is 
5aa0: 63 6f 72 72 65 63 74 0a 2a 2a 20 69 66 20 74 68  correct.** if th
5ab0: 65 20 61 70 70 6c 69 61 74 69 6f 6e 20 75 73 65  e appliation use
5ac0: 73 20 74 68 65 20 6e 65 77 65 72 20 4e 61 74 69  s the newer Nati
5ad0: 76 65 20 50 6f 73 69 78 20 54 68 72 65 61 64 20  ve Posix Thread 
5ae0: 4c 69 62 72 61 72 79 20 28 4e 50 54 4c 29 0a 2a  Library (NPTL).*
5af0: 2a 20 6f 6e 20 6c 69 6e 75 78 20 2d 20 77 69 74  * on linux - wit
5b00: 68 20 4e 50 54 4c 20 61 20 6c 6f 63 6b 20 63 72  h NPTL a lock cr
5b10: 65 61 74 65 64 20 62 79 20 74 68 72 65 61 64 20  eated by thread 
5b20: 41 20 63 61 6e 20 6f 76 65 72 72 69 64 65 20 6c  A can override l
5b30: 6f 63 6b 73 0a 2a 2a 20 69 6e 20 74 68 72 65 61  ocks.** in threa
5b40: 64 20 42 2e 20 20 42 75 74 20 74 68 65 72 65 20  d B.  But there 
5b50: 69 73 20 6e 6f 20 77 61 79 20 74 6f 20 6b 6e 6f  is no way to kno
5b60: 77 20 61 74 20 63 6f 6d 70 69 6c 65 2d 74 69 6d  w at compile-tim
5b70: 65 20 77 68 69 63 68 0a 2a 2a 20 74 68 72 65 61  e which.** threa
5b80: 64 69 6e 67 20 6c 69 62 72 61 72 79 20 69 73 20  ding library is 
5b90: 62 65 69 6e 67 20 75 73 65 64 2e 20 20 53 6f 20  being used.  So 
5ba0: 74 68 65 72 65 20 69 73 20 6e 6f 20 77 61 79 20  there is no way 
5bb0: 74 6f 20 6b 6e 6f 77 20 61 74 0a 2a 2a 20 63 6f  to know at.** co
5bc0: 6d 70 69 6c 65 2d 74 69 6d 65 20 77 68 65 74 68  mpile-time wheth
5bd0: 65 72 20 6f 72 20 6e 6f 74 20 74 68 72 65 61 64  er or not thread
5be0: 20 41 20 63 61 6e 20 6f 76 65 72 72 69 64 65 20   A can override 
5bf0: 6c 6f 63 6b 73 20 6f 6e 20 74 68 72 65 61 64 20  locks on thread 
5c00: 42 2e 0a 2a 2a 20 57 65 20 68 61 76 65 20 74 6f  B..** We have to
5c10: 20 64 6f 20 61 20 72 75 6e 2d 74 69 6d 65 20 63   do a run-time c
5c20: 68 65 63 6b 20 74 6f 20 64 69 73 63 6f 76 65 72  heck to discover
5c30: 20 74 68 65 20 62 65 68 61 76 69 6f 72 20 6f 66   the behavior of
5c40: 20 74 68 65 0a 2a 2a 20 63 75 72 72 65 6e 74 20   the.** current 
5c50: 70 72 6f 63 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 4f  process..**.** O
5c60: 6e 20 73 79 73 74 65 6d 73 20 77 68 65 72 65 20  n systems where 
5c70: 74 68 72 65 61 64 20 41 20 69 73 20 75 6e 61 62  thread A is unab
5c80: 6c 65 20 74 6f 20 6d 6f 64 69 66 79 20 6c 6f 63  le to modify loc
5c90: 6b 73 20 63 72 65 61 74 65 64 20 62 79 0a 2a 2a  ks created by.**
5ca0: 20 74 68 72 65 61 64 20 42 2c 20 77 65 20 68 61   thread B, we ha
5cb0: 76 65 20 74 6f 20 6b 65 65 70 20 74 72 61 63 6b  ve to keep track
5cc0: 20 6f 66 20 77 68 69 63 68 20 74 68 72 65 61 64   of which thread
5cd0: 20 63 72 65 61 74 65 64 20 65 61 63 68 0a 2a 2a   created each.**
5ce0: 20 6c 6f 63 6b 2e 20 20 48 65 6e 63 65 20 74 68   lock.  Hence th
5cf0: 65 72 65 20 69 73 20 61 6e 20 65 78 74 72 61 20  ere is an extra 
5d00: 66 69 65 6c 64 20 69 6e 20 74 68 65 20 6b 65 79  field in the key
5d10: 20 74 6f 20 74 68 65 20 75 6e 69 78 4c 6f 63 6b   to the unixLock
5d20: 49 6e 66 6f 0a 2a 2a 20 73 74 72 75 63 74 75 72  Info.** structur
5d30: 65 20 74 6f 20 72 65 63 6f 72 64 20 74 68 69 73  e to record this
5d40: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 20 20 41   information.  A
5d50: 6e 64 20 6f 6e 20 74 68 6f 73 65 20 73 79 73 74  nd on those syst
5d60: 65 6d 73 20 69 74 0a 2a 2a 20 69 73 20 69 6c 6c  ems it.** is ill
5d70: 65 67 61 6c 20 74 6f 20 62 65 67 69 6e 20 61 20  egal to begin a 
5d80: 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 6e 20 6f  transaction in o
5d90: 6e 65 20 74 68 72 65 61 64 20 61 6e 64 20 66 69  ne thread and fi
5da0: 6e 69 73 68 20 69 74 0a 2a 2a 20 69 6e 20 61 6e  nish it.** in an
5db0: 6f 74 68 65 72 2e 20 20 46 6f 72 20 74 68 69 73  other.  For this
5dc0: 20 6c 61 74 74 65 72 20 72 65 73 74 72 69 63 74   latter restrict
5dd0: 69 6f 6e 2c 20 74 68 65 72 65 20 69 73 20 6e 6f  ion, there is no
5de0: 20 77 6f 72 6b 2d 61 72 6f 75 6e 64 2e 0a 2a 2a   work-around..**
5df0: 20 49 74 20 69 73 20 61 20 6c 69 6d 69 74 61 74   It is a limitat
5e00: 69 6f 6e 20 6f 66 20 4c 69 6e 75 78 54 68 72 65  ion of LinuxThre
5e10: 61 64 73 2e 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 53  ads..*/../*.** S
5e20: 65 74 20 6f 72 20 63 68 65 63 6b 20 74 68 65 20  et or check the 
5e30: 75 6e 69 78 46 69 6c 65 2e 74 69 64 20 66 69 65  unixFile.tid fie
5e40: 6c 64 2e 20 20 54 68 69 73 20 66 69 65 6c 64 20  ld.  This field 
5e50: 69 73 20 73 65 74 20 77 68 65 6e 20 61 6e 20 75  is set when an u
5e60: 6e 69 78 46 69 6c 65 0a 2a 2a 20 69 73 20 66 69  nixFile.** is fi
5e70: 72 73 74 20 6f 70 65 6e 65 64 2e 20 20 41 6c 6c  rst opened.  All
5e80: 20 73 75 62 73 65 71 75 65 6e 74 20 75 73 65 73   subsequent uses
5e90: 20 6f 66 20 74 68 65 20 75 6e 69 78 46 69 6c 65   of the unixFile
5ea0: 20 76 65 72 69 66 79 20 74 68 61 74 20 74 68 65   verify that the
5eb0: 0a 2a 2a 20 73 61 6d 65 20 74 68 72 65 61 64 20  .** same thread 
5ec0: 69 73 20 6f 70 65 72 61 74 69 6e 67 20 6f 6e 20  is operating on 
5ed0: 74 68 65 20 75 6e 69 78 46 69 6c 65 2e 20 20 53  the unixFile.  S
5ee0: 6f 6d 65 20 6f 70 65 72 61 74 69 6e 67 20 73 79  ome operating sy
5ef0: 73 74 65 6d 73 20 64 6f 0a 2a 2a 20 6e 6f 74 20  stems do.** not 
5f00: 61 6c 6c 6f 77 20 6c 6f 63 6b 73 20 74 6f 20 62  allow locks to b
5f10: 65 20 6f 76 65 72 72 69 64 64 65 6e 20 62 79 20  e overridden by 
5f20: 6f 74 68 65 72 20 74 68 72 65 61 64 73 20 61 6e  other threads an
5f30: 64 20 74 68 61 74 20 72 65 73 74 72 69 63 74 69  d that restricti
5f40: 6f 6e 0a 2a 2a 20 6d 65 61 6e 73 20 74 68 61 74  on.** means that
5f50: 20 73 71 6c 69 74 65 33 2a 20 64 61 74 61 62 61   sqlite3* databa
5f60: 73 65 20 68 61 6e 64 6c 65 73 20 63 61 6e 6e 6f  se handles canno
5f70: 74 20 62 65 20 6d 6f 76 65 64 20 66 72 6f 6d 20  t be moved from 
5f80: 6f 6e 65 20 74 68 72 65 61 64 0a 2a 2a 20 74 6f  one thread.** to
5f90: 20 61 6e 6f 74 68 65 72 20 77 68 69 6c 65 20 6c   another while l
5fa0: 6f 63 6b 73 20 61 72 65 20 68 65 6c 64 2e 0a 2a  ocks are held..*
5fb0: 2a 0a 2a 2a 20 56 65 72 73 69 6f 6e 20 33 2e 33  *.** Version 3.3
5fc0: 2e 31 20 28 32 30 30 36 2d 30 31 2d 31 35 29 3a  .1 (2006-01-15):
5fd0: 20 20 75 6e 69 78 46 69 6c 65 20 63 61 6e 20 62    unixFile can b
5fe0: 65 20 6d 6f 76 65 64 20 66 72 6f 6d 20 6f 6e 65  e moved from one
5ff0: 20 74 68 72 65 61 64 20 74 6f 0a 2a 2a 20 61 6e   thread to.** an
6000: 6f 74 68 65 72 20 61 73 20 6c 6f 6e 67 20 61 73  other as long as
6010: 20 77 65 20 61 72 65 20 72 75 6e 6e 69 6e 67 20   we are running 
6020: 6f 6e 20 61 20 73 79 73 74 65 6d 20 74 68 61 74  on a system that
6030: 20 73 75 70 70 6f 72 74 73 20 74 68 72 65 61 64   supports thread
6040: 73 0a 2a 2a 20 6f 76 65 72 72 69 64 69 6e 67 20  s.** overriding 
6050: 65 61 63 68 20 6f 74 68 65 72 73 20 6c 6f 63 6b  each others lock
6060: 73 20 28 77 68 69 63 68 20 69 73 20 6e 6f 77 20  s (which is now 
6070: 74 68 65 20 6d 6f 73 74 20 63 6f 6d 6d 6f 6e 20  the most common 
6080: 62 65 68 61 76 69 6f 72 29 0a 2a 2a 20 6f 72 20  behavior).** or 
6090: 69 66 20 6e 6f 20 6c 6f 63 6b 73 20 61 72 65 20  if no locks are 
60a0: 68 65 6c 64 2e 20 20 42 75 74 20 74 68 65 20 75  held.  But the u
60b0: 6e 69 78 46 69 6c 65 2e 70 4c 6f 63 6b 20 66 69  nixFile.pLock fi
60c0: 65 6c 64 20 6e 65 65 64 73 20 74 6f 20 62 65 0a  eld needs to be.
60d0: 2a 2a 20 72 65 63 6f 6d 70 75 74 65 64 20 62 65  ** recomputed be
60e0: 63 61 75 73 65 20 69 74 73 20 6b 65 79 20 69 6e  cause its key in
60f0: 63 6c 75 64 65 73 20 74 68 65 20 74 68 72 65 61  cludes the threa
6100: 64 2d 69 64 2e 20 20 53 65 65 20 74 68 65 20 0a  d-id.  See the .
6110: 2a 2a 20 74 72 61 6e 73 66 65 72 4f 77 6e 65 72  ** transferOwner
6120: 73 68 69 70 28 29 20 66 75 6e 63 74 69 6f 6e 20  ship() function 
6130: 62 65 6c 6f 77 20 66 6f 72 20 61 64 64 69 74 69  below for additi
6140: 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  onal information
6150: 0a 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f 54  .*/.#if SQLITE_T
6160: 48 52 45 41 44 53 41 46 45 20 26 26 20 64 65 66  HREADSAFE && def
6170: 69 6e 65 64 28 5f 5f 6c 69 6e 75 78 5f 5f 29 0a  ined(__linux__).
6180: 23 20 64 65 66 69 6e 65 20 53 45 54 5f 54 48 52  # define SET_THR
6190: 45 41 44 49 44 28 58 29 20 20 20 28 58 29 2d 3e  EADID(X)   (X)->
61a0: 74 69 64 20 3d 20 70 74 68 72 65 61 64 5f 73 65  tid = pthread_se
61b0: 6c 66 28 29 0a 23 20 64 65 66 69 6e 65 20 43 48  lf().# define CH
61c0: 45 43 4b 5f 54 48 52 45 41 44 49 44 28 58 29 20  ECK_THREADID(X) 
61d0: 28 74 68 72 65 61 64 73 4f 76 65 72 72 69 64 65  (threadsOverride
61e0: 45 61 63 68 4f 74 68 65 72 73 4c 6f 63 6b 73 3d  EachOthersLocks=
61f0: 3d 30 20 26 26 20 5c 0a 20 20 20 20 20 20 20 20  =0 && \.        
6200: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6210: 20 20 20 20 21 70 74 68 72 65 61 64 5f 65 71 75      !pthread_equ
6220: 61 6c 28 28 58 29 2d 3e 74 69 64 2c 20 70 74 68  al((X)->tid, pth
6230: 72 65 61 64 5f 73 65 6c 66 28 29 29 29 0a 23 65  read_self())).#e
6240: 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 53 45 54  lse.# define SET
6250: 5f 54 48 52 45 41 44 49 44 28 58 29 0a 23 20 64  _THREADID(X).# d
6260: 65 66 69 6e 65 20 43 48 45 43 4b 5f 54 48 52 45  efine CHECK_THRE
6270: 41 44 49 44 28 58 29 20 30 0a 23 65 6e 64 69 66  ADID(X) 0.#endif
6280: 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 69 6e 73 74 61  ../*.** An insta
6290: 6e 63 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f  nce of the follo
62a0: 77 69 6e 67 20 73 74 72 75 63 74 75 72 65 20 73  wing structure s
62b0: 65 72 76 65 73 20 61 73 20 74 68 65 20 6b 65 79  erves as the key
62c0: 20 75 73 65 64 0a 2a 2a 20 74 6f 20 6c 6f 63 61   used.** to loca
62d0: 74 65 20 61 20 70 61 72 74 69 63 75 6c 61 72 20  te a particular 
62e0: 75 6e 69 78 4f 70 65 6e 43 6e 74 20 73 74 72 75  unixOpenCnt stru
62f0: 63 74 75 72 65 20 67 69 76 65 6e 20 69 74 73 20  cture given its 
6300: 69 6e 6f 64 65 2e 20 20 54 68 69 73 0a 2a 2a 20  inode.  This.** 
6310: 69 73 20 74 68 65 20 73 61 6d 65 20 61 73 20 74  is the same as t
6320: 68 65 20 75 6e 69 78 4c 6f 63 6b 4b 65 79 20 65  he unixLockKey e
6330: 78 63 65 70 74 20 74 68 61 74 20 74 68 65 20 74  xcept that the t
6340: 68 72 65 61 64 20 49 44 20 69 73 20 6f 6d 69 74  hread ID is omit
6350: 74 65 64 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 75  ted..*/.struct u
6360: 6e 69 78 46 69 6c 65 49 64 20 7b 0a 20 20 64 65  nixFileId {.  de
6370: 76 5f 74 20 64 65 76 3b 20 20 20 20 20 20 20 20  v_t dev;        
6380: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 65 76            /* Dev
6390: 69 63 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 23 69  ice number */.#i
63a0: 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20 73  f OS_VXWORKS.  s
63b0: 74 72 75 63 74 20 76 78 77 6f 72 6b 73 46 69 6c  truct vxworksFil
63c0: 65 49 64 20 2a 70 49 64 3b 20 20 2f 2a 20 55 6e  eId *pId;  /* Un
63d0: 69 71 75 65 20 66 69 6c 65 20 49 44 20 66 6f 72  ique file ID for
63e0: 20 76 78 77 6f 72 6b 73 2e 20 2a 2f 0a 23 65 6c   vxworks. */.#el
63f0: 73 65 0a 20 20 69 6e 6f 5f 74 20 69 6e 6f 3b 20  se.  ino_t ino; 
6400: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6410: 20 2f 2a 20 49 6e 6f 64 65 20 6e 75 6d 62 65 72   /* Inode number
6420: 20 2a 2f 0a 23 65 6e 64 69 66 0a 7d 3b 0a 0a 2f   */.#endif.};../
6430: 2a 0a 2a 2a 20 41 6e 20 69 6e 73 74 61 6e 63 65  *.** An instance
6440: 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   of the followin
6450: 67 20 73 74 72 75 63 74 75 72 65 20 73 65 72 76  g structure serv
6460: 65 73 20 61 73 20 74 68 65 20 6b 65 79 20 75 73  es as the key us
6470: 65 64 0a 2a 2a 20 74 6f 20 6c 6f 63 61 74 65 20  ed.** to locate 
6480: 61 20 70 61 72 74 69 63 75 6c 61 72 20 75 6e 69  a particular uni
6490: 78 4c 6f 63 6b 49 6e 66 6f 20 73 74 72 75 63 74  xLockInfo struct
64a0: 75 72 65 20 67 69 76 65 6e 20 69 74 73 20 69 6e  ure given its in
64b0: 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ode..**.** If th
64c0: 72 65 61 64 73 20 63 61 6e 6e 6f 74 20 6f 76 65  reads cannot ove
64d0: 72 72 69 64 65 20 65 61 63 68 20 6f 74 68 65 72  rride each other
64e0: 73 20 6c 6f 63 6b 73 20 28 4c 69 6e 75 78 54 68  s locks (LinuxTh
64f0: 72 65 61 64 73 29 2c 20 74 68 65 6e 20 77 65 0a  reads), then we.
6500: 2a 2a 20 73 65 74 20 74 68 65 20 75 6e 69 78 4c  ** set the unixL
6510: 6f 63 6b 4b 65 79 2e 74 69 64 20 66 69 65 6c 64  ockKey.tid field
6520: 20 74 6f 20 74 68 65 20 74 68 72 65 61 64 20 49   to the thread I
6530: 44 2e 20 20 49 66 20 74 68 72 65 61 64 73 20 63  D.  If threads c
6540: 61 6e 20 6f 76 65 72 72 69 64 65 0a 2a 2a 20 65  an override.** e
6550: 61 63 68 20 6f 74 68 65 72 73 20 6c 6f 63 6b 73  ach others locks
6560: 20 28 50 6f 73 69 78 20 61 6e 64 20 4e 50 54 4c   (Posix and NPTL
6570: 29 20 74 68 65 6e 20 74 69 64 20 69 73 20 61 6c  ) then tid is al
6580: 77 61 79 73 20 73 65 74 20 74 6f 20 7a 65 72 6f  ways set to zero
6590: 2e 0a 2a 2a 20 74 69 64 20 69 73 20 6f 6d 69 74  ..** tid is omit
65a0: 74 65 64 20 69 66 20 77 65 20 63 6f 6d 70 69 6c  ted if we compil
65b0: 65 20 77 69 74 68 6f 75 74 20 74 68 72 65 61 64  e without thread
65c0: 69 6e 67 20 73 75 70 70 6f 72 74 20 6f 72 20 6f  ing support or o
65d0: 6e 20 61 6e 20 4f 53 0a 2a 2a 20 6f 74 68 65 72  n an OS.** other
65e0: 20 74 68 61 6e 20 6c 69 6e 75 78 2e 0a 2a 2f 0a   than linux..*/.
65f0: 73 74 72 75 63 74 20 75 6e 69 78 4c 6f 63 6b 4b  struct unixLockK
6600: 65 79 20 7b 0a 20 20 73 74 72 75 63 74 20 75 6e  ey {.  struct un
6610: 69 78 46 69 6c 65 49 64 20 66 69 64 3b 20 20 2f  ixFileId fid;  /
6620: 2a 20 55 6e 69 71 75 65 20 69 64 65 6e 74 69 66  * Unique identif
6630: 69 65 72 20 66 6f 72 20 74 68 65 20 66 69 6c 65  ier for the file
6640: 20 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f 54   */.#if SQLITE_T
6650: 48 52 45 41 44 53 41 46 45 20 26 26 20 64 65 66  HREADSAFE && def
6660: 69 6e 65 64 28 5f 5f 6c 69 6e 75 78 5f 5f 29 0a  ined(__linux__).
6670: 20 20 70 74 68 72 65 61 64 5f 74 20 74 69 64 3b    pthread_t tid;
6680: 20 20 2f 2a 20 54 68 72 65 61 64 20 49 44 20 6f    /* Thread ID o
6690: 66 20 6c 6f 63 6b 20 6f 77 6e 65 72 2e 20 5a 65  f lock owner. Ze
66a0: 72 6f 20 69 66 20 6e 6f 74 20 75 73 69 6e 67 20  ro if not using 
66b0: 4c 69 6e 75 78 54 68 72 65 61 64 73 20 2a 2f 0a  LinuxThreads */.
66c0: 23 65 6e 64 69 66 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a  #endif.};../*.**
66d0: 20 41 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20   An instance of 
66e0: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74  the following st
66f0: 72 75 63 74 75 72 65 20 69 73 20 61 6c 6c 6f 63  ructure is alloc
6700: 61 74 65 64 20 66 6f 72 20 65 61 63 68 20 6f 70  ated for each op
6710: 65 6e 0a 2a 2a 20 69 6e 6f 64 65 2e 20 20 4f 72  en.** inode.  Or
6720: 2c 20 6f 6e 20 4c 69 6e 75 78 54 68 72 65 61 64  , on LinuxThread
6730: 73 2c 20 74 68 65 72 65 20 69 73 20 6f 6e 65 20  s, there is one 
6740: 6f 66 20 74 68 65 73 65 20 73 74 72 75 63 74 75  of these structu
6750: 72 65 73 20 66 6f 72 0a 2a 2a 20 65 61 63 68 20  res for.** each 
6760: 69 6e 6f 64 65 20 6f 70 65 6e 65 64 20 62 79 20  inode opened by 
6770: 65 61 63 68 20 74 68 72 65 61 64 2e 0a 2a 2a 0a  each thread..**.
6780: 2a 2a 20 41 20 73 69 6e 67 6c 65 20 69 6e 6f 64  ** A single inod
6790: 65 20 63 61 6e 20 68 61 76 65 20 6d 75 6c 74 69  e can have multi
67a0: 70 6c 65 20 66 69 6c 65 20 64 65 73 63 72 69 70  ple file descrip
67b0: 74 6f 72 73 2c 20 73 6f 20 65 61 63 68 20 75 6e  tors, so each un
67c0: 69 78 46 69 6c 65 0a 2a 2a 20 73 74 72 75 63 74  ixFile.** struct
67d0: 75 72 65 20 63 6f 6e 74 61 69 6e 73 20 61 20 70  ure contains a p
67e0: 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20 69 6e 73  ointer to an ins
67f0: 74 61 6e 63 65 20 6f 66 20 74 68 69 73 20 6f 62  tance of this ob
6800: 6a 65 63 74 20 61 6e 64 20 74 68 69 73 0a 2a 2a  ject and this.**
6810: 20 6f 62 6a 65 63 74 20 6b 65 65 70 73 20 61 20   object keeps a 
6820: 63 6f 75 6e 74 20 6f 66 20 74 68 65 20 6e 75 6d  count of the num
6830: 62 65 72 20 6f 66 20 75 6e 69 78 46 69 6c 65 20  ber of unixFile 
6840: 70 6f 69 6e 74 69 6e 67 20 74 6f 20 69 74 2e 0a  pointing to it..
6850: 2a 2f 0a 73 74 72 75 63 74 20 75 6e 69 78 4c 6f  */.struct unixLo
6860: 63 6b 49 6e 66 6f 20 7b 0a 20 20 73 74 72 75 63  ckInfo {.  struc
6870: 74 20 75 6e 69 78 4c 6f 63 6b 4b 65 79 20 6c 6f  t unixLockKey lo
6880: 63 6b 4b 65 79 3b 20 20 20 20 20 2f 2a 20 54 68  ckKey;     /* Th
6890: 65 20 6c 6f 6f 6b 75 70 20 6b 65 79 20 2a 2f 0a  e lookup key */.
68a0: 20 20 69 6e 74 20 63 6e 74 3b 20 20 20 20 20 20    int cnt;      
68b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
68c0: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 53    /* Number of S
68d0: 48 41 52 45 44 20 6c 6f 63 6b 73 20 68 65 6c 64  HARED locks held
68e0: 20 2a 2f 0a 20 20 69 6e 74 20 6c 6f 63 6b 74 79   */.  int lockty
68f0: 70 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  pe;             
6900: 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20        /* One of 
6910: 53 48 41 52 45 44 5f 4c 4f 43 4b 2c 20 52 45 53  SHARED_LOCK, RES
6920: 45 52 56 45 44 5f 4c 4f 43 4b 20 65 74 63 2e 20  ERVED_LOCK etc. 
6930: 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 66 3b 20 20  */.  int nRef;  
6940: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6950: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
6960: 66 20 70 6f 69 6e 74 65 72 73 20 74 6f 20 74 68  f pointers to th
6970: 69 73 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a  is structure */.
6980: 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49  #if defined(SQLI
6990: 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e  TE_ENABLE_LOCKIN
69a0: 47 5f 53 54 59 4c 45 29 0a 20 20 75 6e 73 69 67  G_STYLE).  unsig
69b0: 6e 65 64 20 6c 6f 6e 67 20 6c 6f 6e 67 20 73 68  ned long long sh
69c0: 61 72 65 64 42 79 74 65 3b 20 20 2f 2a 20 66 6f  aredByte;  /* fo
69d0: 72 20 41 46 50 20 73 69 6d 75 6c 61 74 65 64 20  r AFP simulated 
69e0: 73 68 61 72 65 64 20 6c 6f 63 6b 20 2a 2f 0a 23  shared lock */.#
69f0: 65 6e 64 69 66 0a 20 20 73 74 72 75 63 74 20 75  endif.  struct u
6a00: 6e 69 78 4c 6f 63 6b 49 6e 66 6f 20 2a 70 4e 65  nixLockInfo *pNe
6a10: 78 74 3b 20 20 20 20 20 2f 2a 20 4c 69 73 74 20  xt;     /* List 
6a20: 6f 66 20 61 6c 6c 20 75 6e 69 78 4c 6f 63 6b 49  of all unixLockI
6a30: 6e 66 6f 20 6f 62 6a 65 63 74 73 20 2a 2f 0a 20  nfo objects */. 
6a40: 20 73 74 72 75 63 74 20 75 6e 69 78 4c 6f 63 6b   struct unixLock
6a50: 49 6e 66 6f 20 2a 70 50 72 65 76 3b 20 20 20 20  Info *pPrev;    
6a60: 20 2f 2a 20 20 20 20 2e 2e 2e 2e 20 64 6f 75 62   /*    .... doub
6a70: 6c 79 20 6c 69 6e 6b 65 64 20 2a 2f 0a 7d 3b 0a  ly linked */.};.
6a80: 0a 2f 2a 0a 2a 2a 20 41 6e 20 69 6e 73 74 61 6e  ./*.** An instan
6a90: 63 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77  ce of the follow
6aa0: 69 6e 67 20 73 74 72 75 63 74 75 72 65 20 69 73  ing structure is
6ab0: 20 61 6c 6c 6f 63 61 74 65 64 20 66 6f 72 20 65   allocated for e
6ac0: 61 63 68 20 6f 70 65 6e 0a 2a 2a 20 69 6e 6f 64  ach open.** inod
6ad0: 65 2e 20 20 54 68 69 73 20 73 74 72 75 63 74 75  e.  This structu
6ae0: 72 65 20 6b 65 65 70 73 20 74 72 61 63 6b 20 6f  re keeps track o
6af0: 66 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  f the number of 
6b00: 6c 6f 63 6b 73 20 6f 6e 20 74 68 61 74 0a 2a 2a  locks on that.**
6b10: 20 69 6e 6f 64 65 2e 20 20 49 66 20 61 20 63 6c   inode.  If a cl
6b20: 6f 73 65 20 69 73 20 61 74 74 65 6d 70 74 65 64  ose is attempted
6b30: 20 61 67 61 69 6e 73 74 20 61 6e 20 69 6e 6f 64   against an inod
6b40: 65 20 74 68 61 74 20 69 73 20 68 6f 6c 64 69 6e  e that is holdin
6b50: 67 0a 2a 2a 20 6c 6f 63 6b 73 2c 20 74 68 65 20  g.** locks, the 
6b60: 63 6c 6f 73 65 20 69 73 20 64 65 66 65 72 72 65  close is deferre
6b70: 64 20 75 6e 74 69 6c 20 61 6c 6c 20 6c 6f 63 6b  d until all lock
6b80: 73 20 63 6c 65 61 72 20 62 79 20 61 64 64 69 6e  s clear by addin
6b90: 67 20 74 68 65 0a 2a 2a 20 66 69 6c 65 20 64 65  g the.** file de
6ba0: 73 63 72 69 70 74 6f 72 20 74 6f 20 62 65 20 63  scriptor to be c
6bb0: 6c 6f 73 65 64 20 74 6f 20 74 68 65 20 70 65 6e  losed to the pen
6bc0: 64 69 6e 67 20 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a  ding list..**.**
6bd0: 20 54 4f 44 4f 3a 20 20 43 6f 6e 73 69 64 65 72   TODO:  Consider
6be0: 20 63 68 61 6e 67 69 6e 67 20 74 68 69 73 20 73   changing this s
6bf0: 6f 20 74 68 61 74 20 74 68 65 72 65 20 69 73 20  o that there is 
6c00: 6f 6e 6c 79 20 61 20 73 69 6e 67 6c 65 20 66 69  only a single fi
6c10: 6c 65 0a 2a 2a 20 64 65 73 63 72 69 70 74 6f 72  le.** descriptor
6c20: 20 66 6f 72 20 65 61 63 68 20 6f 70 65 6e 20 66   for each open f
6c30: 69 6c 65 2c 20 65 76 65 6e 20 77 68 65 6e 20 69  ile, even when i
6c40: 74 20 69 73 20 6f 70 65 6e 65 64 20 6d 75 6c 74  t is opened mult
6c50: 69 70 6c 65 20 74 69 6d 65 73 2e 0a 2a 2a 20 54  iple times..** T
6c60: 68 65 20 63 6c 6f 73 65 28 29 20 73 79 73 74 65  he close() syste
6c70: 6d 20 63 61 6c 6c 20 77 6f 75 6c 64 20 6f 6e 6c  m call would onl
6c80: 79 20 6f 63 63 75 72 20 77 68 65 6e 20 74 68 65  y occur when the
6c90: 20 6c 61 73 74 20 64 61 74 61 62 61 73 65 0a 2a   last database.*
6ca0: 2a 20 75 73 69 6e 67 20 74 68 65 20 66 69 6c 65  * using the file
6cb0: 20 63 6c 6f 73 65 73 2e 0a 2a 2f 0a 73 74 72 75   closes..*/.stru
6cc0: 63 74 20 75 6e 69 78 4f 70 65 6e 43 6e 74 20 7b  ct unixOpenCnt {
6cd0: 0a 20 20 73 74 72 75 63 74 20 75 6e 69 78 46 69  .  struct unixFi
6ce0: 6c 65 49 64 20 66 69 6c 65 49 64 3b 20 20 20 2f  leId fileId;   /
6cf0: 2a 20 54 68 65 20 6c 6f 6f 6b 75 70 20 6b 65 79  * The lookup key
6d00: 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 66 3b 20   */.  int nRef; 
6d10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6d20: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70    /* Number of p
6d30: 6f 69 6e 74 65 72 73 20 74 6f 20 74 68 69 73 20  ointers to this 
6d40: 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 20 20 69  structure */.  i
6d50: 6e 74 20 6e 4c 6f 63 6b 3b 20 20 20 20 20 20 20  nt nLock;       
6d60: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
6d70: 6d 62 65 72 20 6f 66 20 6f 75 74 73 74 61 6e 64  mber of outstand
6d80: 69 6e 67 20 6c 6f 63 6b 73 20 2a 2f 0a 20 20 55  ing locks */.  U
6d90: 6e 69 78 55 6e 75 73 65 64 46 64 20 2a 70 55 6e  nixUnusedFd *pUn
6da0: 75 73 65 64 3b 20 20 20 20 20 20 2f 2a 20 55 6e  used;      /* Un
6db0: 75 73 65 64 20 66 69 6c 65 20 64 65 73 63 72 69  used file descri
6dc0: 70 74 6f 72 73 20 74 6f 20 63 6c 6f 73 65 20 2a  ptors to close *
6dd0: 2f 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53  /.#if OS_VXWORKS
6de0: 0a 20 20 73 65 6d 5f 74 20 2a 70 53 65 6d 3b 20  .  sem_t *pSem; 
6df0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6e00: 20 20 20 20 2f 2a 20 4e 61 6d 65 64 20 50 4f 53      /* Named POS
6e10: 49 58 20 73 65 6d 61 70 68 6f 72 65 20 2a 2f 0a  IX semaphore */.
6e20: 20 20 63 68 61 72 20 61 53 65 6d 4e 61 6d 65 5b    char aSemName[
6e30: 4d 41 58 5f 50 41 54 48 4e 41 4d 45 2b 32 5d 3b  MAX_PATHNAME+2];
6e40: 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68     /* Name of th
6e50: 61 74 20 73 65 6d 61 70 68 6f 72 65 20 2a 2f 0a  at semaphore */.
6e60: 23 65 6e 64 69 66 0a 20 20 73 74 72 75 63 74 20  #endif.  struct 
6e70: 75 6e 69 78 4f 70 65 6e 43 6e 74 20 2a 70 4e 65  unixOpenCnt *pNe
6e80: 78 74 2c 20 2a 70 50 72 65 76 3b 20 20 20 2f 2a  xt, *pPrev;   /*
6e90: 20 4c 69 73 74 20 6f 66 20 61 6c 6c 20 75 6e 69   List of all uni
6ea0: 78 4f 70 65 6e 43 6e 74 20 6f 62 6a 65 63 74 73  xOpenCnt objects
6eb0: 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 4c 69   */.};../*.** Li
6ec0: 73 74 73 20 6f 66 20 61 6c 6c 20 75 6e 69 78 4c  sts of all unixL
6ed0: 6f 63 6b 49 6e 66 6f 20 61 6e 64 20 75 6e 69 78  ockInfo and unix
6ee0: 4f 70 65 6e 43 6e 74 20 6f 62 6a 65 63 74 73 2e  OpenCnt objects.
6ef0: 20 20 54 68 65 73 65 20 75 73 65 64 20 74 6f 20    These used to 
6f00: 62 65 20 68 61 73 68 0a 2a 2a 20 74 61 62 6c 65  be hash.** table
6f10: 73 2e 20 20 42 75 74 20 74 68 65 20 6e 75 6d 62  s.  But the numb
6f20: 65 72 20 6f 66 20 6f 62 6a 65 63 74 73 20 69 73  er of objects is
6f30: 20 72 61 72 65 6c 79 20 6d 6f 72 65 20 74 68 61   rarely more tha
6f40: 6e 20 61 20 64 6f 7a 65 6e 20 61 6e 64 0a 2a 2a  n a dozen and.**
6f50: 20 6e 65 76 65 72 20 65 78 63 65 65 64 73 20 61   never exceeds a
6f60: 20 66 65 77 20 74 68 6f 75 73 61 6e 64 2e 20 20   few thousand.  
6f70: 41 6e 64 20 6c 6f 6f 6b 75 70 20 69 73 20 6e 6f  And lookup is no
6f80: 74 20 6f 6e 20 61 20 63 72 69 74 69 63 61 6c 0a  t on a critical.
6f90: 2a 2a 20 70 61 74 68 20 73 6f 20 61 20 73 69 6d  ** path so a sim
6fa0: 70 6c 65 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20  ple linked list 
6fb0: 77 69 6c 6c 20 73 75 66 66 69 63 65 2e 0a 2a 2f  will suffice..*/
6fc0: 0a 73 74 61 74 69 63 20 73 74 72 75 63 74 20 75  .static struct u
6fd0: 6e 69 78 4c 6f 63 6b 49 6e 66 6f 20 2a 6c 6f 63  nixLockInfo *loc
6fe0: 6b 4c 69 73 74 20 3d 20 30 3b 0a 73 74 61 74 69  kList = 0;.stati
6ff0: 63 20 73 74 72 75 63 74 20 75 6e 69 78 4f 70 65  c struct unixOpe
7000: 6e 43 6e 74 20 2a 6f 70 65 6e 4c 69 73 74 20 3d  nCnt *openList =
7010: 20 30 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20   0;../*.** This 
7020: 76 61 72 69 61 62 6c 65 20 72 65 6d 65 6d 62 65  variable remembe
7030: 72 73 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f  rs whether or no
7040: 74 20 74 68 72 65 61 64 73 20 63 61 6e 20 6f 76  t threads can ov
7050: 65 72 72 69 64 65 20 65 61 63 68 20 6f 74 68 65  erride each othe
7060: 72 73 0a 2a 2a 20 6c 6f 63 6b 73 2e 0a 2a 2a 0a  rs.** locks..**.
7070: 2a 2a 20 20 20 20 30 3a 20 20 4e 6f 2e 20 20 54  **    0:  No.  T
7080: 68 72 65 61 64 73 20 63 61 6e 6e 6f 74 20 6f 76  hreads cannot ov
7090: 65 72 72 69 64 65 20 65 61 63 68 20 6f 74 68 65  erride each othe
70a0: 72 73 20 6c 6f 63 6b 73 2e 20 20 28 4c 69 6e 75  rs locks.  (Linu
70b0: 78 54 68 72 65 61 64 73 29 0a 2a 2a 20 20 20 20  xThreads).**    
70c0: 31 3a 20 20 59 65 73 2e 20 20 54 68 72 65 61 64  1:  Yes.  Thread
70d0: 73 20 63 61 6e 20 6f 76 65 72 72 69 64 65 20 65  s can override e
70e0: 61 63 68 20 6f 74 68 65 72 73 20 6c 6f 63 6b 73  ach others locks
70f0: 2e 20 20 28 50 6f 73 69 78 20 26 20 4e 4c 50 54  .  (Posix & NLPT
7100: 29 0a 2a 2a 20 20 20 2d 31 3a 20 20 57 65 20 64  ).**   -1:  We d
7110: 6f 6e 27 74 20 6b 6e 6f 77 20 79 65 74 2e 0a 2a  on't know yet..*
7120: 2a 0a 2a 2a 20 4f 6e 20 73 6f 6d 65 20 73 79 73  *.** On some sys
7130: 74 65 6d 73 2c 20 77 65 20 6b 6e 6f 77 20 61 74  tems, we know at
7140: 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 69 66   compile-time if
7150: 20 74 68 72 65 61 64 73 20 63 61 6e 20 6f 76 65   threads can ove
7160: 72 72 69 64 65 20 65 61 63 68 0a 2a 2a 20 6f 74  rride each.** ot
7170: 68 65 72 73 20 6c 6f 63 6b 73 2e 20 20 4f 6e 20  hers locks.  On 
7180: 74 68 6f 73 65 20 73 79 73 74 65 6d 73 2c 20 74  those systems, t
7190: 68 65 20 53 51 4c 49 54 45 5f 54 48 52 45 41 44  he SQLITE_THREAD
71a0: 5f 4f 56 45 52 52 49 44 45 5f 4c 4f 43 4b 20 6d  _OVERRIDE_LOCK m
71b0: 61 63 72 6f 0a 2a 2a 20 77 69 6c 6c 20 62 65 20  acro.** will be 
71c0: 73 65 74 20 61 70 70 72 6f 70 72 69 61 74 65 6c  set appropriatel
71d0: 79 2e 20 20 4f 6e 20 6f 74 68 65 72 20 73 79 73  y.  On other sys
71e0: 74 65 6d 73 2c 20 77 65 20 68 61 76 65 20 74 6f  tems, we have to
71f0: 20 63 68 65 63 6b 20 61 74 0a 2a 2a 20 72 75 6e   check at.** run
7200: 74 69 6d 65 2e 20 20 4f 6e 20 74 68 65 73 65 20  time.  On these 
7210: 6c 61 74 74 65 72 20 73 79 73 74 65 6d 73 2c 20  latter systems, 
7220: 53 51 4c 54 49 45 5f 54 48 52 45 41 44 5f 4f 56  SQLTIE_THREAD_OV
7230: 45 52 52 49 44 45 5f 4c 4f 43 4b 20 69 73 0a 2a  ERRIDE_LOCK is.*
7240: 2a 20 75 6e 64 65 66 69 6e 65 64 2e 0a 2a 2a 0a  * undefined..**.
7250: 2a 2a 20 54 68 69 73 20 76 61 72 69 61 62 6c 65  ** This variable
7260: 20 6e 6f 72 6d 61 6c 6c 79 20 68 61 73 20 66 69   normally has fi
7270: 6c 65 20 73 63 6f 70 65 20 6f 6e 6c 79 2e 20 20  le scope only.  
7280: 42 75 74 20 64 75 72 69 6e 67 20 74 65 73 74 69  But during testi
7290: 6e 67 2c 20 77 65 20 6d 61 6b 65 0a 2a 2a 20 69  ng, we make.** i
72a0: 74 20 61 20 67 6c 6f 62 61 6c 20 73 6f 20 74 68  t a global so th
72b0: 61 74 20 74 68 65 20 74 65 73 74 20 63 6f 64 65  at the test code
72c0: 20 63 61 6e 20 63 68 61 6e 67 65 20 69 74 73 20   can change its 
72d0: 76 61 6c 75 65 20 69 6e 20 6f 72 64 65 72 20 74  value in order t
72e0: 6f 20 76 65 72 69 66 79 0a 2a 2a 20 74 68 61 74  o verify.** that
72f0: 20 74 68 65 20 72 69 67 68 74 20 73 74 75 66 66   the right stuff
7300: 20 68 61 70 70 65 6e 73 20 69 6e 20 65 69 74 68   happens in eith
7310: 65 72 20 63 61 73 65 2e 0a 2a 2f 0a 23 69 66 20  er case..*/.#if 
7320: 53 51 4c 49 54 45 5f 54 48 52 45 41 44 53 41 46  SQLITE_THREADSAF
7330: 45 20 26 26 20 64 65 66 69 6e 65 64 28 5f 5f 6c  E && defined(__l
7340: 69 6e 75 78 5f 5f 29 0a 23 20 20 69 66 6e 64 65  inux__).#  ifnde
7350: 66 20 53 51 4c 49 54 45 5f 54 48 52 45 41 44 5f  f SQLITE_THREAD_
7360: 4f 56 45 52 52 49 44 45 5f 4c 4f 43 4b 0a 23 20  OVERRIDE_LOCK.# 
7370: 20 20 20 64 65 66 69 6e 65 20 53 51 4c 49 54 45     define SQLITE
7380: 5f 54 48 52 45 41 44 5f 4f 56 45 52 52 49 44 45  _THREAD_OVERRIDE
7390: 5f 4c 4f 43 4b 20 2d 31 0a 23 20 20 65 6e 64 69  _LOCK -1.#  endi
73a0: 66 0a 23 20 20 69 66 64 65 66 20 53 51 4c 49 54  f.#  ifdef SQLIT
73b0: 45 5f 54 45 53 54 0a 69 6e 74 20 74 68 72 65 61  E_TEST.int threa
73c0: 64 73 4f 76 65 72 72 69 64 65 45 61 63 68 4f 74  dsOverrideEachOt
73d0: 68 65 72 73 4c 6f 63 6b 73 20 3d 20 53 51 4c 49  hersLocks = SQLI
73e0: 54 45 5f 54 48 52 45 41 44 5f 4f 56 45 52 52 49  TE_THREAD_OVERRI
73f0: 44 45 5f 4c 4f 43 4b 3b 0a 23 20 20 65 6c 73 65  DE_LOCK;.#  else
7400: 0a 73 74 61 74 69 63 20 69 6e 74 20 74 68 72 65  .static int thre
7410: 61 64 73 4f 76 65 72 72 69 64 65 45 61 63 68 4f  adsOverrideEachO
7420: 74 68 65 72 73 4c 6f 63 6b 73 20 3d 20 53 51 4c  thersLocks = SQL
7430: 49 54 45 5f 54 48 52 45 41 44 5f 4f 56 45 52 52  ITE_THREAD_OVERR
7440: 49 44 45 5f 4c 4f 43 4b 3b 0a 23 20 20 65 6e 64  IDE_LOCK;.#  end
7450: 69 66 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  if.#endif../*.**
7460: 20 54 68 69 73 20 73 74 72 75 63 74 75 72 65 20   This structure 
7470: 68 6f 6c 64 73 20 69 6e 66 6f 72 6d 61 74 69 6f  holds informatio
7480: 6e 20 70 61 73 73 65 64 20 69 6e 74 6f 20 69 6e  n passed into in
7490: 64 69 76 69 64 75 61 6c 20 74 65 73 74 0a 2a 2a  dividual test.**
74a0: 20 74 68 72 65 61 64 73 20 62 79 20 74 68 65 20   threads by the 
74b0: 74 65 73 74 54 68 72 65 61 64 4c 6f 63 6b 69 6e  testThreadLockin
74c0: 67 42 65 68 61 76 69 6f 72 28 29 20 72 6f 75 74  gBehavior() rout
74d0: 69 6e 65 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 74  ine..*/.struct t
74e0: 68 72 65 61 64 54 65 73 74 44 61 74 61 20 7b 0a  hreadTestData {.
74f0: 20 20 69 6e 74 20 66 64 3b 20 20 20 20 20 20 20    int fd;       
7500: 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 65           /* File
7510: 20 74 6f 20 62 65 20 6c 6f 63 6b 65 64 20 2a 2f   to be locked */
7520: 0a 20 20 73 74 72 75 63 74 20 66 6c 6f 63 6b 20  .  struct flock 
7530: 6c 6f 63 6b 3b 20 20 20 20 20 2f 2a 20 54 68 65  lock;     /* The
7540: 20 6c 6f 63 6b 69 6e 67 20 6f 70 65 72 61 74 69   locking operati
7550: 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 72 65 73 75  on */.  int resu
7560: 6c 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  lt;            /
7570: 2a 20 52 65 73 75 6c 74 20 6f 66 20 74 68 65 20  * Result of the 
7580: 6c 6f 63 6b 69 6e 67 20 6f 70 65 72 61 74 69 6f  locking operatio
7590: 6e 20 2a 2f 0a 7d 3b 0a 0a 23 69 66 20 53 51 4c  n */.};..#if SQL
75a0: 49 54 45 5f 54 48 52 45 41 44 53 41 46 45 20 26  ITE_THREADSAFE &
75b0: 26 20 64 65 66 69 6e 65 64 28 5f 5f 6c 69 6e 75  & defined(__linu
75c0: 78 5f 5f 29 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  x__)./*.** This 
75d0: 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64  function is used
75e0: 20 61 73 20 74 68 65 20 6d 61 69 6e 20 72 6f 75   as the main rou
75f0: 74 69 6e 65 20 66 6f 72 20 61 20 74 68 72 65 61  tine for a threa
7600: 64 20 6c 61 75 6e 63 68 65 64 20 62 79 0a 2a 2a  d launched by.**
7610: 20 74 65 73 74 54 68 72 65 61 64 4c 6f 63 6b 69   testThreadLocki
7620: 6e 67 42 65 68 61 76 69 6f 72 28 29 2e 20 49 74  ngBehavior(). It
7630: 20 74 65 73 74 73 20 77 68 65 74 68 65 72 20 74   tests whether t
7640: 68 65 20 73 68 61 72 65 64 2d 6c 6f 63 6b 20 6f  he shared-lock o
7650: 62 74 61 69 6e 65 64 0a 2a 2a 20 62 79 20 74 68  btained.** by th
7660: 65 20 6d 61 69 6e 20 74 68 72 65 61 64 20 69 6e  e main thread in
7670: 20 74 65 73 74 54 68 72 65 61 64 4c 6f 63 6b 69   testThreadLocki
7680: 6e 67 42 65 68 61 76 69 6f 72 28 29 20 63 6f 6e  ngBehavior() con
7690: 66 6c 69 63 74 73 20 77 69 74 68 20 61 0a 2a 2a  flicts with a.**
76a0: 20 68 79 70 6f 74 68 65 74 69 63 61 6c 20 77 72   hypothetical wr
76b0: 69 74 65 2d 6c 6f 63 6b 20 6f 62 74 61 69 6e 65  ite-lock obtaine
76c0: 64 20 62 79 20 74 68 69 73 20 74 68 72 65 61 64  d by this thread
76d0: 20 6f 6e 20 74 68 65 20 73 61 6d 65 20 66 69 6c   on the same fil
76e0: 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 77 72 69  e..**.** The wri
76f0: 74 65 2d 6c 6f 63 6b 20 69 73 20 6e 6f 74 20 61  te-lock is not a
7700: 63 74 75 61 6c 6c 79 20 61 63 71 75 69 72 65 64  ctually acquired
7710: 2c 20 61 73 20 74 68 69 73 20 69 73 20 6e 6f 74  , as this is not
7720: 20 70 6f 73 73 69 62 6c 65 20 69 66 20 0a 2a 2a   possible if .**
7730: 20 74 68 65 20 66 69 6c 65 20 69 73 20 6f 70 65   the file is ope
7740: 6e 20 69 6e 20 72 65 61 64 2d 6f 6e 6c 79 20 6d  n in read-only m
7750: 6f 64 65 20 28 73 65 65 20 74 69 63 6b 65 74 20  ode (see ticket 
7760: 23 33 34 37 32 29 2e 0a 2a 2f 20 0a 73 74 61 74  #3472)..*/ .stat
7770: 69 63 20 76 6f 69 64 20 2a 74 68 72 65 61 64 4c  ic void *threadL
7780: 6f 63 6b 69 6e 67 54 65 73 74 28 76 6f 69 64 20  ockingTest(void 
7790: 2a 70 41 72 67 29 7b 0a 20 20 73 74 72 75 63 74  *pArg){.  struct
77a0: 20 74 68 72 65 61 64 54 65 73 74 44 61 74 61 20   threadTestData 
77b0: 2a 70 44 61 74 61 20 3d 20 28 73 74 72 75 63 74  *pData = (struct
77c0: 20 74 68 72 65 61 64 54 65 73 74 44 61 74 61 2a   threadTestData*
77d0: 29 70 41 72 67 3b 0a 20 20 70 44 61 74 61 2d 3e  )pArg;.  pData->
77e0: 72 65 73 75 6c 74 20 3d 20 66 63 6e 74 6c 28 70  result = fcntl(p
77f0: 44 61 74 61 2d 3e 66 64 2c 20 46 5f 47 45 54 4c  Data->fd, F_GETL
7800: 4b 2c 20 26 70 44 61 74 61 2d 3e 6c 6f 63 6b 29  K, &pData->lock)
7810: 3b 0a 20 20 72 65 74 75 72 6e 20 70 41 72 67 3b  ;.  return pArg;
7820: 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  .}.#endif /* SQL
7830: 49 54 45 5f 54 48 52 45 41 44 53 41 46 45 20 26  ITE_THREADSAFE &
7840: 26 20 64 65 66 69 6e 65 64 28 5f 5f 6c 69 6e 75  & defined(__linu
7850: 78 5f 5f 29 20 2a 2f 0a 0a 0a 23 69 66 20 53 51  x__) */...#if SQ
7860: 4c 49 54 45 5f 54 48 52 45 41 44 53 41 46 45 20  LITE_THREADSAFE 
7870: 26 26 20 64 65 66 69 6e 65 64 28 5f 5f 6c 69 6e  && defined(__lin
7880: 75 78 5f 5f 29 0a 2f 2a 0a 2a 2a 20 54 68 69 73  ux__)./*.** This
7890: 20 70 72 6f 63 65 64 75 72 65 20 61 74 74 65 6d   procedure attem
78a0: 70 74 73 20 74 6f 20 64 65 74 65 72 6d 69 6e 65  pts to determine
78b0: 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20   whether or not 
78c0: 74 68 72 65 61 64 73 0a 2a 2a 20 63 61 6e 20 6f  threads.** can o
78d0: 76 65 72 72 69 64 65 20 65 61 63 68 20 6f 74 68  verride each oth
78e0: 65 72 73 20 6c 6f 63 6b 73 20 74 68 65 6e 20 73  ers locks then s
78f0: 65 74 73 20 74 68 65 20 0a 2a 2a 20 74 68 72 65  ets the .** thre
7900: 61 64 73 4f 76 65 72 72 69 64 65 45 61 63 68 4f  adsOverrideEachO
7910: 74 68 65 72 73 4c 6f 63 6b 73 20 76 61 72 69 61  thersLocks varia
7920: 62 6c 65 20 61 70 70 72 6f 70 72 69 61 74 65 6c  ble appropriatel
7930: 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  y..*/.static voi
7940: 64 20 74 65 73 74 54 68 72 65 61 64 4c 6f 63 6b  d testThreadLock
7950: 69 6e 67 42 65 68 61 76 69 6f 72 28 69 6e 74 20  ingBehavior(int 
7960: 66 64 5f 6f 72 69 67 29 7b 0a 20 20 69 6e 74 20  fd_orig){.  int 
7970: 66 64 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  fd;.  int rc;.  
7980: 73 74 72 75 63 74 20 74 68 72 65 61 64 54 65 73  struct threadTes
7990: 74 44 61 74 61 20 64 3b 0a 20 20 73 74 72 75 63  tData d;.  struc
79a0: 74 20 66 6c 6f 63 6b 20 6c 3b 0a 20 20 70 74 68  t flock l;.  pth
79b0: 72 65 61 64 5f 74 20 74 3b 0a 0a 20 20 66 64 20  read_t t;..  fd 
79c0: 3d 20 64 75 70 28 66 64 5f 6f 72 69 67 29 3b 0a  = dup(fd_orig);.
79d0: 20 20 69 66 28 20 66 64 3c 30 20 29 20 72 65 74    if( fd<0 ) ret
79e0: 75 72 6e 3b 0a 20 20 6d 65 6d 73 65 74 28 26 6c  urn;.  memset(&l
79f0: 2c 20 30 2c 20 73 69 7a 65 6f 66 28 6c 29 29 3b  , 0, sizeof(l));
7a00: 0a 20 20 6c 2e 6c 5f 74 79 70 65 20 3d 20 46 5f  .  l.l_type = F_
7a10: 52 44 4c 43 4b 3b 0a 20 20 6c 2e 6c 5f 6c 65 6e  RDLCK;.  l.l_len
7a20: 20 3d 20 31 3b 0a 20 20 6c 2e 6c 5f 73 74 61 72   = 1;.  l.l_star
7a30: 74 20 3d 20 30 3b 0a 20 20 6c 2e 6c 5f 77 68 65  t = 0;.  l.l_whe
7a40: 6e 63 65 20 3d 20 53 45 45 4b 5f 53 45 54 3b 0a  nce = SEEK_SET;.
7a50: 20 20 72 63 20 3d 20 66 63 6e 74 6c 28 66 64 5f    rc = fcntl(fd_
7a60: 6f 72 69 67 2c 20 46 5f 53 45 54 4c 4b 2c 20 26  orig, F_SETLK, &
7a70: 6c 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 30 20  l);.  if( rc!=0 
7a80: 29 20 72 65 74 75 72 6e 3b 0a 20 20 6d 65 6d 73  ) return;.  mems
7a90: 65 74 28 26 64 2c 20 30 2c 20 73 69 7a 65 6f 66  et(&d, 0, sizeof
7aa0: 28 64 29 29 3b 0a 20 20 64 2e 66 64 20 3d 20 66  (d));.  d.fd = f
7ab0: 64 3b 0a 20 20 64 2e 6c 6f 63 6b 20 3d 20 6c 3b  d;.  d.lock = l;
7ac0: 0a 20 20 64 2e 6c 6f 63 6b 2e 6c 5f 74 79 70 65  .  d.lock.l_type
7ad0: 20 3d 20 46 5f 57 52 4c 43 4b 3b 0a 20 20 69 66   = F_WRLCK;.  if
7ae0: 28 20 70 74 68 72 65 61 64 5f 63 72 65 61 74 65  ( pthread_create
7af0: 28 26 74 2c 20 30 2c 20 74 68 72 65 61 64 4c 6f  (&t, 0, threadLo
7b00: 63 6b 69 6e 67 54 65 73 74 2c 20 26 64 29 3d 3d  ckingTest, &d)==
7b10: 30 20 29 7b 0a 20 20 20 20 70 74 68 72 65 61 64  0 ){.    pthread
7b20: 5f 6a 6f 69 6e 28 74 2c 20 30 29 3b 0a 20 20 7d  _join(t, 0);.  }
7b30: 0a 20 20 63 6c 6f 73 65 28 66 64 29 3b 0a 20 20  .  close(fd);.  
7b40: 69 66 28 20 64 2e 72 65 73 75 6c 74 21 3d 30 20  if( d.result!=0 
7b50: 29 20 72 65 74 75 72 6e 3b 0a 20 20 74 68 72 65  ) return;.  thre
7b60: 61 64 73 4f 76 65 72 72 69 64 65 45 61 63 68 4f  adsOverrideEachO
7b70: 74 68 65 72 73 4c 6f 63 6b 73 20 3d 20 28 64 2e  thersLocks = (d.
7b80: 6c 6f 63 6b 2e 6c 5f 74 79 70 65 3d 3d 46 5f 55  lock.l_type==F_U
7b90: 4e 4c 43 4b 29 3b 0a 7d 0a 23 65 6e 64 69 66 20  NLCK);.}.#endif 
7ba0: 2f 2a 20 53 51 4c 49 54 45 5f 54 48 52 45 41 44  /* SQLITE_THREAD
7bb0: 53 41 46 45 20 26 26 20 64 65 66 69 6e 65 64 28  SAFE && defined(
7bc0: 5f 5f 6c 69 6e 75 78 5f 5f 29 20 2a 2f 0a 0a 2f  __linux__) */../
7bd0: 2a 0a 2a 2a 20 52 65 6c 65 61 73 65 20 61 20 75  *.** Release a u
7be0: 6e 69 78 4c 6f 63 6b 49 6e 66 6f 20 73 74 72 75  nixLockInfo stru
7bf0: 63 74 75 72 65 20 70 72 65 76 69 6f 75 73 6c 79  cture previously
7c00: 20 61 6c 6c 6f 63 61 74 65 64 20 62 79 20 66 69   allocated by fi
7c10: 6e 64 4c 6f 63 6b 49 6e 66 6f 28 29 2e 0a 2a 2a  ndLockInfo()..**
7c20: 0a 2a 2a 20 54 68 65 20 6d 75 74 65 78 20 65 6e  .** The mutex en
7c30: 74 65 72 65 64 20 75 73 69 6e 67 20 74 68 65 20  tered using the 
7c40: 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29  unixEnterMutex()
7c50: 20 66 75 6e 63 74 69 6f 6e 20 6d 75 73 74 20 62   function must b
7c60: 65 20 68 65 6c 64 0a 2a 2a 20 77 68 65 6e 20 74  e held.** when t
7c70: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
7c80: 63 61 6c 6c 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  called..*/.stati
7c90: 63 20 76 6f 69 64 20 72 65 6c 65 61 73 65 4c 6f  c void releaseLo
7ca0: 63 6b 49 6e 66 6f 28 73 74 72 75 63 74 20 75 6e  ckInfo(struct un
7cb0: 69 78 4c 6f 63 6b 49 6e 66 6f 20 2a 70 4c 6f 63  ixLockInfo *pLoc
7cc0: 6b 29 7b 0a 20 20 61 73 73 65 72 74 28 20 75 6e  k){.  assert( un
7cd0: 69 78 4d 75 74 65 78 48 65 6c 64 28 29 20 29 3b  ixMutexHeld() );
7ce0: 0a 20 20 69 66 28 20 70 4c 6f 63 6b 20 29 7b 0a  .  if( pLock ){.
7cf0: 20 20 20 20 70 4c 6f 63 6b 2d 3e 6e 52 65 66 2d      pLock->nRef-
7d00: 2d 3b 0a 20 20 20 20 69 66 28 20 70 4c 6f 63 6b  -;.    if( pLock
7d10: 2d 3e 6e 52 65 66 3d 3d 30 20 29 7b 0a 20 20 20  ->nRef==0 ){.   
7d20: 20 20 20 69 66 28 20 70 4c 6f 63 6b 2d 3e 70 50     if( pLock->pP
7d30: 72 65 76 20 29 7b 0a 20 20 20 20 20 20 20 20 61  rev ){.        a
7d40: 73 73 65 72 74 28 20 70 4c 6f 63 6b 2d 3e 70 50  ssert( pLock->pP
7d50: 72 65 76 2d 3e 70 4e 65 78 74 3d 3d 70 4c 6f 63  rev->pNext==pLoc
7d60: 6b 20 29 3b 0a 20 20 20 20 20 20 20 20 70 4c 6f  k );.        pLo
7d70: 63 6b 2d 3e 70 50 72 65 76 2d 3e 70 4e 65 78 74  ck->pPrev->pNext
7d80: 20 3d 20 70 4c 6f 63 6b 2d 3e 70 4e 65 78 74 3b   = pLock->pNext;
7d90: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
7da0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6c 6f        assert( lo
7db0: 63 6b 4c 69 73 74 3d 3d 70 4c 6f 63 6b 20 29 3b  ckList==pLock );
7dc0: 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b 4c 69 73  .        lockLis
7dd0: 74 20 3d 20 70 4c 6f 63 6b 2d 3e 70 4e 65 78 74  t = pLock->pNext
7de0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
7df0: 69 66 28 20 70 4c 6f 63 6b 2d 3e 70 4e 65 78 74  if( pLock->pNext
7e00: 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65   ){.        asse
7e10: 72 74 28 20 70 4c 6f 63 6b 2d 3e 70 4e 65 78 74  rt( pLock->pNext
7e20: 2d 3e 70 50 72 65 76 3d 3d 70 4c 6f 63 6b 20 29  ->pPrev==pLock )
7e30: 3b 0a 20 20 20 20 20 20 20 20 70 4c 6f 63 6b 2d  ;.        pLock-
7e40: 3e 70 4e 65 78 74 2d 3e 70 50 72 65 76 20 3d 20  >pNext->pPrev = 
7e50: 70 4c 6f 63 6b 2d 3e 70 50 72 65 76 3b 0a 20 20  pLock->pPrev;.  
7e60: 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69      }.      sqli
7e70: 74 65 33 5f 66 72 65 65 28 70 4c 6f 63 6b 29 3b  te3_free(pLock);
7e80: 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a  .    }.  }.}../*
7e90: 0a 2a 2a 20 52 65 6c 65 61 73 65 20 61 20 75 6e  .** Release a un
7ea0: 69 78 4f 70 65 6e 43 6e 74 20 73 74 72 75 63 74  ixOpenCnt struct
7eb0: 75 72 65 20 70 72 65 76 69 6f 75 73 6c 79 20 61  ure previously a
7ec0: 6c 6c 6f 63 61 74 65 64 20 62 79 20 66 69 6e 64  llocated by find
7ed0: 4c 6f 63 6b 49 6e 66 6f 28 29 2e 0a 2a 2a 0a 2a  LockInfo()..**.*
7ee0: 2a 20 54 68 65 20 6d 75 74 65 78 20 65 6e 74 65  * The mutex ente
7ef0: 72 65 64 20 75 73 69 6e 67 20 74 68 65 20 75 6e  red using the un
7f00: 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29 20 66  ixEnterMutex() f
7f10: 75 6e 63 74 69 6f 6e 20 6d 75 73 74 20 62 65 20  unction must be 
7f20: 68 65 6c 64 0a 2a 2a 20 77 68 65 6e 20 74 68 69  held.** when thi
7f30: 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61  s function is ca
7f40: 6c 6c 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  lled..*/.static 
7f50: 76 6f 69 64 20 72 65 6c 65 61 73 65 4f 70 65 6e  void releaseOpen
7f60: 43 6e 74 28 73 74 72 75 63 74 20 75 6e 69 78 4f  Cnt(struct unixO
7f70: 70 65 6e 43 6e 74 20 2a 70 4f 70 65 6e 29 7b 0a  penCnt *pOpen){.
7f80: 20 20 61 73 73 65 72 74 28 20 75 6e 69 78 4d 75    assert( unixMu
7f90: 74 65 78 48 65 6c 64 28 29 20 29 3b 0a 20 20 69  texHeld() );.  i
7fa0: 66 28 20 70 4f 70 65 6e 20 29 7b 0a 20 20 20 20  f( pOpen ){.    
7fb0: 70 4f 70 65 6e 2d 3e 6e 52 65 66 2d 2d 3b 0a 20  pOpen->nRef--;. 
7fc0: 20 20 20 69 66 28 20 70 4f 70 65 6e 2d 3e 6e 52     if( pOpen->nR
7fd0: 65 66 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69  ef==0 ){.      i
7fe0: 66 28 20 70 4f 70 65 6e 2d 3e 70 50 72 65 76 20  f( pOpen->pPrev 
7ff0: 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  ){.        asser
8000: 74 28 20 70 4f 70 65 6e 2d 3e 70 50 72 65 76 2d  t( pOpen->pPrev-
8010: 3e 70 4e 65 78 74 3d 3d 70 4f 70 65 6e 20 29 3b  >pNext==pOpen );
8020: 0a 20 20 20 20 20 20 20 20 70 4f 70 65 6e 2d 3e  .        pOpen->
8030: 70 50 72 65 76 2d 3e 70 4e 65 78 74 20 3d 20 70  pPrev->pNext = p
8040: 4f 70 65 6e 2d 3e 70 4e 65 78 74 3b 0a 20 20 20  Open->pNext;.   
8050: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
8060: 20 20 61 73 73 65 72 74 28 20 6f 70 65 6e 4c 69    assert( openLi
8070: 73 74 3d 3d 70 4f 70 65 6e 20 29 3b 0a 20 20 20  st==pOpen );.   
8080: 20 20 20 20 20 6f 70 65 6e 4c 69 73 74 20 3d 20       openList = 
8090: 70 4f 70 65 6e 2d 3e 70 4e 65 78 74 3b 0a 20 20  pOpen->pNext;.  
80a0: 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
80b0: 70 4f 70 65 6e 2d 3e 70 4e 65 78 74 20 29 7b 0a  pOpen->pNext ){.
80c0: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
80d0: 70 4f 70 65 6e 2d 3e 70 4e 65 78 74 2d 3e 70 50  pOpen->pNext->pP
80e0: 72 65 76 3d 3d 70 4f 70 65 6e 20 29 3b 0a 20 20  rev==pOpen );.  
80f0: 20 20 20 20 20 20 70 4f 70 65 6e 2d 3e 70 4e 65        pOpen->pNe
8100: 78 74 2d 3e 70 50 72 65 76 20 3d 20 70 4f 70 65  xt->pPrev = pOpe
8110: 6e 2d 3e 70 50 72 65 76 3b 0a 20 20 20 20 20 20  n->pPrev;.      
8120: 7d 0a 23 69 66 20 53 51 4c 49 54 45 5f 54 48 52  }.#if SQLITE_THR
8130: 45 41 44 53 41 46 45 20 26 26 20 64 65 66 69 6e  EADSAFE && defin
8140: 65 64 28 5f 5f 6c 69 6e 75 78 5f 5f 29 0a 20 20  ed(__linux__).  
8150: 20 20 20 20 61 73 73 65 72 74 28 20 21 70 4f 70      assert( !pOp
8160: 65 6e 2d 3e 70 55 6e 75 73 65 64 20 7c 7c 20 74  en->pUnused || t
8170: 68 72 65 61 64 73 4f 76 65 72 72 69 64 65 45 61  hreadsOverrideEa
8180: 63 68 4f 74 68 65 72 73 4c 6f 63 6b 73 3d 3d 30  chOthersLocks==0
8190: 20 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20   );.#endif..    
81a0: 20 20 2f 2a 20 49 66 20 70 4f 70 65 6e 2d 3e 70    /* If pOpen->p
81b0: 55 6e 75 73 65 64 20 69 73 20 6e 6f 74 20 6e 75  Unused is not nu
81c0: 6c 6c 2c 20 74 68 65 6e 20 6d 65 6d 6f 72 79 20  ll, then memory 
81d0: 61 6e 64 20 66 69 6c 65 2d 64 65 73 63 72 69 70  and file-descrip
81e0: 74 6f 72 73 0a 20 20 20 20 20 20 2a 2a 20 61 72  tors.      ** ar
81f0: 65 20 6c 65 61 6b 65 64 2e 0a 20 20 20 20 20 20  e leaked..      
8200: 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 54 68 69 73  **.      ** This
8210: 20 77 69 6c 6c 20 6f 6e 6c 79 20 68 61 70 70 65   will only happe
8220: 6e 20 69 66 2c 20 75 6e 64 65 72 20 4c 69 6e 75  n if, under Linu
8230: 78 74 68 72 65 61 64 73 2c 20 74 68 65 20 75 73  xthreads, the us
8240: 65 72 20 68 61 73 20 6f 70 65 6e 65 64 0a 20 20  er has opened.  
8250: 20 20 20 20 2a 2a 20 61 20 74 72 61 6e 73 61 63      ** a transac
8260: 74 69 6f 6e 20 69 6e 20 6f 6e 65 20 74 68 72 65  tion in one thre
8270: 61 64 2c 20 74 68 65 6e 20 61 74 74 65 6d 70 74  ad, then attempt
8280: 73 20 74 6f 20 63 6c 6f 73 65 20 74 68 65 20 64  s to close the d
8290: 61 74 61 62 61 73 65 0a 20 20 20 20 20 20 2a 2a  atabase.      **
82a0: 20 68 61 6e 64 6c 65 20 66 72 6f 6d 20 61 6e 6f   handle from ano
82b0: 74 68 65 72 20 74 68 72 65 61 64 20 28 77 69 74  ther thread (wit
82c0: 68 6f 75 74 20 66 69 72 73 74 20 75 6e 6c 6f 63  hout first unloc
82d0: 6b 69 6e 67 20 74 68 65 20 64 62 20 66 69 6c 65  king the db file
82e0: 29 2e 0a 20 20 20 20 20 20 2a 2a 20 54 68 69 73  )..      ** This
82f0: 20 69 73 20 61 20 6d 69 73 75 73 65 2e 20 20 2a   is a misuse.  *
8300: 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  /.      sqlite3_
8310: 66 72 65 65 28 70 4f 70 65 6e 29 3b 0a 20 20 20  free(pOpen);.   
8320: 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   }.  }.}../*.** 
8330: 47 69 76 65 6e 20 61 20 66 69 6c 65 20 64 65 73  Given a file des
8340: 63 72 69 70 74 6f 72 2c 20 6c 6f 63 61 74 65 20  criptor, locate 
8350: 75 6e 69 78 4c 6f 63 6b 49 6e 66 6f 20 61 6e 64  unixLockInfo and
8360: 20 75 6e 69 78 4f 70 65 6e 43 6e 74 20 73 74 72   unixOpenCnt str
8370: 75 63 74 75 72 65 73 20 74 68 61 74 0a 2a 2a 20  uctures that.** 
8380: 64 65 73 63 72 69 62 65 73 20 74 68 61 74 20 66  describes that f
8390: 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 2e 20  ile descriptor. 
83a0: 20 43 72 65 61 74 65 20 6e 65 77 20 6f 6e 65 73   Create new ones
83b0: 20 69 66 20 6e 65 63 65 73 73 61 72 79 2e 20 20   if necessary.  
83c0: 54 68 65 0a 2a 2a 20 72 65 74 75 72 6e 20 76 61  The.** return va
83d0: 6c 75 65 73 20 6d 69 67 68 74 20 62 65 20 75 6e  lues might be un
83e0: 69 6e 69 74 69 61 6c 69 7a 65 64 20 69 66 20 61  initialized if a
83f0: 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2e 0a  n error occurs..
8400: 2a 2a 0a 2a 2a 20 54 68 65 20 6d 75 74 65 78 20  **.** The mutex 
8410: 65 6e 74 65 72 65 64 20 75 73 69 6e 67 20 74 68  entered using th
8420: 65 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78  e unixEnterMutex
8430: 28 29 20 66 75 6e 63 74 69 6f 6e 20 6d 75 73 74  () function must
8440: 20 62 65 20 68 65 6c 64 0a 2a 2a 20 77 68 65 6e   be held.** when
8450: 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   this function i
8460: 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20  s called..**.** 
8470: 52 65 74 75 72 6e 20 61 6e 20 61 70 70 72 6f 70  Return an approp
8480: 72 69 61 74 65 20 65 72 72 6f 72 20 63 6f 64 65  riate error code
8490: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
84a0: 66 69 6e 64 4c 6f 63 6b 49 6e 66 6f 28 0a 20 20  findLockInfo(.  
84b0: 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 2c  unixFile *pFile,
84c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
84d0: 2a 20 55 6e 69 78 20 66 69 6c 65 20 77 69 74 68  * Unix file with
84e0: 20 66 69 6c 65 20 64 65 73 63 20 75 73 65 64 20   file desc used 
84f0: 69 6e 20 74 68 65 20 6b 65 79 20 2a 2f 0a 20 20  in the key */.  
8500: 73 74 72 75 63 74 20 75 6e 69 78 4c 6f 63 6b 49  struct unixLockI
8510: 6e 66 6f 20 2a 2a 70 70 4c 6f 63 6b 2c 20 20 2f  nfo **ppLock,  /
8520: 2a 20 52 65 74 75 72 6e 20 74 68 65 20 75 6e 69  * Return the uni
8530: 78 4c 6f 63 6b 49 6e 66 6f 20 73 74 72 75 63 74  xLockInfo struct
8540: 75 72 65 20 68 65 72 65 20 2a 2f 0a 20 20 73 74  ure here */.  st
8550: 72 75 63 74 20 75 6e 69 78 4f 70 65 6e 43 6e 74  ruct unixOpenCnt
8560: 20 2a 2a 70 70 4f 70 65 6e 20 20 20 20 2f 2a 20   **ppOpen    /* 
8570: 52 65 74 75 72 6e 20 74 68 65 20 75 6e 69 78 4f  Return the unixO
8580: 70 65 6e 43 6e 74 20 73 74 72 75 63 74 75 72 65  penCnt structure
8590: 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e   here */.){.  in
85a0: 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20  t rc;           
85b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
85c0: 53 79 73 74 65 6d 20 63 61 6c 6c 20 72 65 74 75  System call retu
85d0: 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74  rn code */.  int
85e0: 20 66 64 3b 20 20 20 20 20 20 20 20 20 20 20 20   fd;            
85f0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
8600: 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  he file descript
8610: 6f 72 20 66 6f 72 20 70 46 69 6c 65 20 2a 2f 0a  or for pFile */.
8620: 20 20 73 74 72 75 63 74 20 75 6e 69 78 4c 6f 63    struct unixLoc
8630: 6b 4b 65 79 20 6c 6f 63 6b 4b 65 79 3b 20 20 20  kKey lockKey;   
8640: 20 2f 2a 20 4c 6f 6f 6b 75 70 20 6b 65 79 20 66   /* Lookup key f
8650: 6f 72 20 74 68 65 20 75 6e 69 78 4c 6f 63 6b 49  or the unixLockI
8660: 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20 2a 2f  nfo structure */
8670: 0a 20 20 73 74 72 75 63 74 20 75 6e 69 78 46 69  .  struct unixFi
8680: 6c 65 49 64 20 66 69 6c 65 49 64 3b 20 20 20 20  leId fileId;    
8690: 20 20 2f 2a 20 4c 6f 6f 6b 75 70 20 6b 65 79 20    /* Lookup key 
86a0: 66 6f 72 20 74 68 65 20 75 6e 69 78 4f 70 65 6e  for the unixOpen
86b0: 43 6e 74 20 73 74 72 75 63 74 20 2a 2f 0a 20 20  Cnt struct */.  
86c0: 73 74 72 75 63 74 20 73 74 61 74 20 73 74 61 74  struct stat stat
86d0: 62 75 66 3b 20 20 20 20 20 20 20 20 20 20 20 2f  buf;           /
86e0: 2a 20 4c 6f 77 2d 6c 65 76 65 6c 20 66 69 6c 65  * Low-level file
86f0: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 2a 2f 0a   information */.
8700: 20 20 73 74 72 75 63 74 20 75 6e 69 78 4c 6f 63    struct unixLoc
8710: 6b 49 6e 66 6f 20 2a 70 4c 6f 63 6b 20 3d 20 30  kInfo *pLock = 0
8720: 3b 2f 2a 20 43 61 6e 64 69 64 61 74 65 20 75 6e  ;/* Candidate un
8730: 69 78 4c 6f 63 6b 49 6e 66 6f 20 6f 62 6a 65 63  ixLockInfo objec
8740: 74 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 75 6e  t */.  struct un
8750: 69 78 4f 70 65 6e 43 6e 74 20 2a 70 4f 70 65 6e  ixOpenCnt *pOpen
8760: 3b 20 20 20 20 20 2f 2a 20 43 61 6e 64 69 64 61  ;     /* Candida
8770: 74 65 20 75 6e 69 78 4f 70 65 6e 43 6e 74 20 6f  te unixOpenCnt o
8780: 62 6a 65 63 74 20 2a 2f 0a 0a 20 20 61 73 73 65  bject */..  asse
8790: 72 74 28 20 75 6e 69 78 4d 75 74 65 78 48 65 6c  rt( unixMutexHel
87a0: 64 28 29 20 29 3b 0a 0a 20 20 2f 2a 20 47 65 74  d() );..  /* Get
87b0: 20 6c 6f 77 2d 6c 65 76 65 6c 20 69 6e 66 6f 72   low-level infor
87c0: 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20 74 68 65  mation about the
87d0: 20 66 69 6c 65 20 74 68 61 74 20 77 65 20 63 61   file that we ca
87e0: 6e 20 75 73 65 64 20 74 6f 0a 20 20 2a 2a 20 63  n used to.  ** c
87f0: 72 65 61 74 65 20 61 20 75 6e 69 71 75 65 20 6e  reate a unique n
8800: 61 6d 65 20 66 6f 72 20 74 68 65 20 66 69 6c 65  ame for the file
8810: 2e 0a 20 20 2a 2f 0a 20 20 66 64 20 3d 20 70 46  ..  */.  fd = pF
8820: 69 6c 65 2d 3e 68 3b 0a 20 20 72 63 20 3d 20 66  ile->h;.  rc = f
8830: 73 74 61 74 28 66 64 2c 20 26 73 74 61 74 62 75  stat(fd, &statbu
8840: 66 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 30 20  f);.  if( rc!=0 
8850: 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61  ){.    pFile->la
8860: 73 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b  stErrno = errno;
8870: 0a 23 69 66 64 65 66 20 45 4f 56 45 52 46 4c 4f  .#ifdef EOVERFLO
8880: 57 0a 20 20 20 20 69 66 28 20 70 46 69 6c 65 2d  W.    if( pFile-
8890: 3e 6c 61 73 74 45 72 72 6e 6f 3d 3d 45 4f 56 45  >lastErrno==EOVE
88a0: 52 46 4c 4f 57 20 29 20 72 65 74 75 72 6e 20 53  RFLOW ) return S
88b0: 51 4c 49 54 45 5f 4e 4f 4c 46 53 3b 0a 23 65 6e  QLITE_NOLFS;.#en
88c0: 64 69 66 0a 20 20 20 20 72 65 74 75 72 6e 20 53  dif.    return S
88d0: 51 4c 49 54 45 5f 49 4f 45 52 52 3b 0a 20 20 7d  QLITE_IOERR;.  }
88e0: 0a 0a 23 69 66 64 65 66 20 5f 5f 41 50 50 4c 45  ..#ifdef __APPLE
88f0: 5f 5f 0a 20 20 2f 2a 20 4f 6e 20 4f 53 20 58 20  __.  /* On OS X 
8900: 6f 6e 20 61 6e 20 6d 73 64 6f 73 20 66 69 6c 65  on an msdos file
8910: 73 79 73 74 65 6d 2c 20 74 68 65 20 69 6e 6f 64  system, the inod
8920: 65 20 6e 75 6d 62 65 72 20 69 73 20 72 65 70 6f  e number is repo
8930: 72 74 65 64 0a 20 20 2a 2a 20 69 6e 63 6f 72 72  rted.  ** incorr
8940: 65 63 74 6c 79 20 66 6f 72 20 7a 65 72 6f 2d 73  ectly for zero-s
8950: 69 7a 65 20 66 69 6c 65 73 2e 20 20 53 65 65 20  ize files.  See 
8960: 74 69 63 6b 65 74 20 23 33 32 36 30 2e 20 20 54  ticket #3260.  T
8970: 6f 20 77 6f 72 6b 0a 20 20 2a 2a 20 61 72 6f 75  o work.  ** arou
8980: 6e 64 20 74 68 69 73 20 70 72 6f 62 6c 65 6d 20  nd this problem 
8990: 28 77 65 20 63 6f 6e 73 69 64 65 72 20 69 74 20  (we consider it 
89a0: 61 20 62 75 67 20 69 6e 20 4f 53 20 58 2c 20 6e  a bug in OS X, n
89b0: 6f 74 20 53 51 4c 69 74 65 29 0a 20 20 2a 2a 20  ot SQLite).  ** 
89c0: 77 65 20 61 6c 77 61 79 73 20 69 6e 63 72 65 61  we always increa
89d0: 73 65 20 74 68 65 20 66 69 6c 65 20 73 69 7a 65  se the file size
89e0: 20 74 6f 20 31 20 62 79 20 77 72 69 74 69 6e 67   to 1 by writing
89f0: 20 61 20 73 69 6e 67 6c 65 20 62 79 74 65 0a 20   a single byte. 
8a00: 20 2a 2a 20 70 72 69 6f 72 20 74 6f 20 61 63 63   ** prior to acc
8a10: 65 73 73 69 6e 67 20 74 68 65 20 69 6e 6f 64 65  essing the inode
8a20: 20 6e 75 6d 62 65 72 2e 20 20 54 68 65 20 6f 6e   number.  The on
8a30: 65 20 62 79 74 65 20 77 72 69 74 74 65 6e 20 69  e byte written i
8a40: 73 0a 20 20 2a 2a 20 61 6e 20 41 53 43 49 49 20  s.  ** an ASCII 
8a50: 27 53 27 20 63 68 61 72 61 63 74 65 72 20 77 68  'S' character wh
8a60: 69 63 68 20 61 6c 73 6f 20 68 61 70 70 65 6e 73  ich also happens
8a70: 20 74 6f 20 62 65 20 74 68 65 20 66 69 72 73 74   to be the first
8a80: 20 62 79 74 65 0a 20 20 2a 2a 20 69 6e 20 74 68   byte.  ** in th
8a90: 65 20 68 65 61 64 65 72 20 6f 66 20 65 76 65 72  e header of ever
8aa0: 79 20 53 51 4c 69 74 65 20 64 61 74 61 62 61 73  y SQLite databas
8ab0: 65 2e 20 20 49 6e 20 74 68 69 73 20 77 61 79 2c  e.  In this way,
8ac0: 20 69 66 20 74 68 65 72 65 0a 20 20 2a 2a 20 69   if there.  ** i
8ad0: 73 20 61 20 72 61 63 65 20 63 6f 6e 64 69 74 69  s a race conditi
8ae0: 6f 6e 20 73 75 63 68 20 74 68 61 74 20 61 6e 6f  on such that ano
8af0: 74 68 65 72 20 74 68 72 65 61 64 20 68 61 73 20  ther thread has 
8b00: 61 6c 72 65 61 64 79 20 70 6f 70 75 6c 61 74 65  already populate
8b10: 64 0a 20 20 2a 2a 20 74 68 65 20 66 69 72 73 74  d.  ** the first
8b20: 20 70 61 67 65 20 6f 66 20 74 68 65 20 64 61 74   page of the dat
8b30: 61 62 61 73 65 2c 20 6e 6f 20 64 61 6d 61 67 65  abase, no damage
8b40: 20 69 73 20 64 6f 6e 65 2e 0a 20 20 2a 2f 0a 20   is done..  */. 
8b50: 20 69 66 28 20 73 74 61 74 62 75 66 2e 73 74 5f   if( statbuf.st_
8b60: 73 69 7a 65 3d 3d 30 20 26 26 20 28 70 46 69 6c  size==0 && (pFil
8b70: 65 2d 3e 66 73 46 6c 61 67 73 20 26 20 53 51 4c  e->fsFlags & SQL
8b80: 49 54 45 5f 46 53 46 4c 41 47 53 5f 49 53 5f 4d  ITE_FSFLAGS_IS_M
8b90: 53 44 4f 53 29 21 3d 30 20 29 7b 0a 20 20 20 20  SDOS)!=0 ){.    
8ba0: 72 63 20 3d 20 77 72 69 74 65 28 66 64 2c 20 22  rc = write(fd, "
8bb0: 53 22 2c 20 31 29 3b 0a 20 20 20 20 69 66 28 20  S", 1);.    if( 
8bc0: 72 63 21 3d 31 20 29 7b 0a 20 20 20 20 20 20 70  rc!=1 ){.      p
8bd0: 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20  File->lastErrno 
8be0: 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20 72  = errno;.      r
8bf0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45  eturn SQLITE_IOE
8c00: 52 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63  RR;.    }.    rc
8c10: 20 3d 20 66 73 74 61 74 28 66 64 2c 20 26 73 74   = fstat(fd, &st
8c20: 61 74 62 75 66 29 3b 0a 20 20 20 20 69 66 28 20  atbuf);.    if( 
8c30: 72 63 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 70  rc!=0 ){.      p
8c40: 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20  File->lastErrno 
8c50: 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20 72  = errno;.      r
8c60: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45  eturn SQLITE_IOE
8c70: 52 52 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65  RR;.    }.  }.#e
8c80: 6e 64 69 66 0a 0a 20 20 6d 65 6d 73 65 74 28 26  ndif..  memset(&
8c90: 6c 6f 63 6b 4b 65 79 2c 20 30 2c 20 73 69 7a 65  lockKey, 0, size
8ca0: 6f 66 28 6c 6f 63 6b 4b 65 79 29 29 3b 0a 20 20  of(lockKey));.  
8cb0: 6c 6f 63 6b 4b 65 79 2e 66 69 64 2e 64 65 76 20  lockKey.fid.dev 
8cc0: 3d 20 73 74 61 74 62 75 66 2e 73 74 5f 64 65 76  = statbuf.st_dev
8cd0: 3b 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53  ;.#if OS_VXWORKS
8ce0: 0a 20 20 6c 6f 63 6b 4b 65 79 2e 66 69 64 2e 70  .  lockKey.fid.p
8cf0: 49 64 20 3d 20 70 46 69 6c 65 2d 3e 70 49 64 3b  Id = pFile->pId;
8d00: 0a 23 65 6c 73 65 0a 20 20 6c 6f 63 6b 4b 65 79  .#else.  lockKey
8d10: 2e 66 69 64 2e 69 6e 6f 20 3d 20 73 74 61 74 62  .fid.ino = statb
8d20: 75 66 2e 73 74 5f 69 6e 6f 3b 0a 23 65 6e 64 69  uf.st_ino;.#endi
8d30: 66 0a 23 69 66 20 53 51 4c 49 54 45 5f 54 48 52  f.#if SQLITE_THR
8d40: 45 41 44 53 41 46 45 20 26 26 20 64 65 66 69 6e  EADSAFE && defin
8d50: 65 64 28 5f 5f 6c 69 6e 75 78 5f 5f 29 0a 20 20  ed(__linux__).  
8d60: 69 66 28 20 74 68 72 65 61 64 73 4f 76 65 72 72  if( threadsOverr
8d70: 69 64 65 45 61 63 68 4f 74 68 65 72 73 4c 6f 63  ideEachOthersLoc
8d80: 6b 73 3c 30 20 29 7b 0a 20 20 20 20 74 65 73 74  ks<0 ){.    test
8d90: 54 68 72 65 61 64 4c 6f 63 6b 69 6e 67 42 65 68  ThreadLockingBeh
8da0: 61 76 69 6f 72 28 66 64 29 3b 0a 20 20 7d 0a 20  avior(fd);.  }. 
8db0: 20 6c 6f 63 6b 4b 65 79 2e 74 69 64 20 3d 20 74   lockKey.tid = t
8dc0: 68 72 65 61 64 73 4f 76 65 72 72 69 64 65 45 61  hreadsOverrideEa
8dd0: 63 68 4f 74 68 65 72 73 4c 6f 63 6b 73 20 3f 20  chOthersLocks ? 
8de0: 30 20 3a 20 70 74 68 72 65 61 64 5f 73 65 6c 66  0 : pthread_self
8df0: 28 29 3b 0a 23 65 6e 64 69 66 0a 20 20 66 69 6c  ();.#endif.  fil
8e00: 65 49 64 20 3d 20 6c 6f 63 6b 4b 65 79 2e 66 69  eId = lockKey.fi
8e10: 64 3b 0a 20 20 69 66 28 20 70 70 4c 6f 63 6b 21  d;.  if( ppLock!
8e20: 3d 30 20 29 7b 0a 20 20 20 20 70 4c 6f 63 6b 20  =0 ){.    pLock 
8e30: 3d 20 6c 6f 63 6b 4c 69 73 74 3b 0a 20 20 20 20  = lockList;.    
8e40: 77 68 69 6c 65 28 20 70 4c 6f 63 6b 20 26 26 20  while( pLock && 
8e50: 6d 65 6d 63 6d 70 28 26 6c 6f 63 6b 4b 65 79 2c  memcmp(&lockKey,
8e60: 20 26 70 4c 6f 63 6b 2d 3e 6c 6f 63 6b 4b 65 79   &pLock->lockKey
8e70: 2c 20 73 69 7a 65 6f 66 28 6c 6f 63 6b 4b 65 79  , sizeof(lockKey
8e80: 29 29 20 29 7b 0a 20 20 20 20 20 20 70 4c 6f 63  )) ){.      pLoc
8e90: 6b 20 3d 20 70 4c 6f 63 6b 2d 3e 70 4e 65 78 74  k = pLock->pNext
8ea0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
8eb0: 70 4c 6f 63 6b 3d 3d 30 20 29 7b 0a 20 20 20 20  pLock==0 ){.    
8ec0: 20 20 70 4c 6f 63 6b 20 3d 20 73 71 6c 69 74 65    pLock = sqlite
8ed0: 33 5f 6d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66  3_malloc( sizeof
8ee0: 28 2a 70 4c 6f 63 6b 29 20 29 3b 0a 20 20 20 20  (*pLock) );.    
8ef0: 20 20 69 66 28 20 70 4c 6f 63 6b 3d 3d 30 20 29    if( pLock==0 )
8f00: 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53  {.        rc = S
8f10: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
8f20: 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 66       goto exit_f
8f30: 69 6e 64 6c 6f 63 6b 69 6e 66 6f 3b 0a 20 20 20  indlockinfo;.   
8f40: 20 20 20 7d 0a 20 20 20 20 20 20 6d 65 6d 63 70     }.      memcp
8f50: 79 28 26 70 4c 6f 63 6b 2d 3e 6c 6f 63 6b 4b 65  y(&pLock->lockKe
8f60: 79 2c 26 6c 6f 63 6b 4b 65 79 2c 73 69 7a 65 6f  y,&lockKey,sizeo
8f70: 66 28 6c 6f 63 6b 4b 65 79 29 29 3b 0a 20 20 20  f(lockKey));.   
8f80: 20 20 20 70 4c 6f 63 6b 2d 3e 6e 52 65 66 20 3d     pLock->nRef =
8f90: 20 31 3b 0a 20 20 20 20 20 20 70 4c 6f 63 6b 2d   1;.      pLock-
8fa0: 3e 63 6e 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  >cnt = 0;.      
8fb0: 70 4c 6f 63 6b 2d 3e 6c 6f 63 6b 74 79 70 65 20  pLock->locktype 
8fc0: 3d 20 30 3b 0a 23 69 66 20 64 65 66 69 6e 65 64  = 0;.#if defined
8fd0: 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c  (SQLITE_ENABLE_L
8fe0: 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 29 0a 20 20  OCKING_STYLE).  
8ff0: 20 20 20 20 70 4c 6f 63 6b 2d 3e 73 68 61 72 65      pLock->share
9000: 64 42 79 74 65 20 3d 20 30 3b 0a 23 65 6e 64 69  dByte = 0;.#endi
9010: 66 0a 20 20 20 20 20 20 70 4c 6f 63 6b 2d 3e 70  f.      pLock->p
9020: 4e 65 78 74 20 3d 20 6c 6f 63 6b 4c 69 73 74 3b  Next = lockList;
9030: 0a 20 20 20 20 20 20 70 4c 6f 63 6b 2d 3e 70 50  .      pLock->pP
9040: 72 65 76 20 3d 20 30 3b 0a 20 20 20 20 20 20 69  rev = 0;.      i
9050: 66 28 20 6c 6f 63 6b 4c 69 73 74 20 29 20 6c 6f  f( lockList ) lo
9060: 63 6b 4c 69 73 74 2d 3e 70 50 72 65 76 20 3d 20  ckList->pPrev = 
9070: 70 4c 6f 63 6b 3b 0a 20 20 20 20 20 20 6c 6f 63  pLock;.      loc
9080: 6b 4c 69 73 74 20 3d 20 70 4c 6f 63 6b 3b 0a 20  kList = pLock;. 
9090: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
90a0: 70 4c 6f 63 6b 2d 3e 6e 52 65 66 2b 2b 3b 0a 20  pLock->nRef++;. 
90b0: 20 20 20 7d 0a 20 20 20 20 2a 70 70 4c 6f 63 6b     }.    *ppLock
90c0: 20 3d 20 70 4c 6f 63 6b 3b 0a 20 20 7d 0a 20 20   = pLock;.  }.  
90d0: 69 66 28 20 70 70 4f 70 65 6e 21 3d 30 20 29 7b  if( ppOpen!=0 ){
90e0: 0a 20 20 20 20 70 4f 70 65 6e 20 3d 20 6f 70 65  .    pOpen = ope
90f0: 6e 4c 69 73 74 3b 0a 20 20 20 20 77 68 69 6c 65  nList;.    while
9100: 28 20 70 4f 70 65 6e 20 26 26 20 6d 65 6d 63 6d  ( pOpen && memcm
9110: 70 28 26 66 69 6c 65 49 64 2c 20 26 70 4f 70 65  p(&fileId, &pOpe
9120: 6e 2d 3e 66 69 6c 65 49 64 2c 20 73 69 7a 65 6f  n->fileId, sizeo
9130: 66 28 66 69 6c 65 49 64 29 29 20 29 7b 0a 20 20  f(fileId)) ){.  
9140: 20 20 20 20 70 4f 70 65 6e 20 3d 20 70 4f 70 65      pOpen = pOpe
9150: 6e 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 7d 0a  n->pNext;.    }.
9160: 20 20 20 20 69 66 28 20 70 4f 70 65 6e 3d 3d 30      if( pOpen==0
9170: 20 29 7b 0a 20 20 20 20 20 20 70 4f 70 65 6e 20   ){.      pOpen 
9180: 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63  = sqlite3_malloc
9190: 28 20 73 69 7a 65 6f 66 28 2a 70 4f 70 65 6e 29  ( sizeof(*pOpen)
91a0: 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4f   );.      if( pO
91b0: 70 65 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  pen==0 ){.      
91c0: 20 20 72 65 6c 65 61 73 65 4c 6f 63 6b 49 6e 66    releaseLockInf
91d0: 6f 28 70 4c 6f 63 6b 29 3b 0a 20 20 20 20 20 20  o(pLock);.      
91e0: 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f    rc = SQLITE_NO
91f0: 4d 45 4d 3b 0a 20 20 20 20 20 20 20 20 67 6f 74  MEM;.        got
9200: 6f 20 65 78 69 74 5f 66 69 6e 64 6c 6f 63 6b 69  o exit_findlocki
9210: 6e 66 6f 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  nfo;.      }.   
9220: 20 20 20 6d 65 6d 73 65 74 28 70 4f 70 65 6e 2c     memset(pOpen,
9230: 20 30 2c 20 73 69 7a 65 6f 66 28 2a 70 4f 70 65   0, sizeof(*pOpe
9240: 6e 29 29 3b 0a 20 20 20 20 20 20 70 4f 70 65 6e  n));.      pOpen
9250: 2d 3e 66 69 6c 65 49 64 20 3d 20 66 69 6c 65 49  ->fileId = fileI
9260: 64 3b 0a 20 20 20 20 20 20 70 4f 70 65 6e 2d 3e  d;.      pOpen->
9270: 6e 52 65 66 20 3d 20 31 3b 0a 20 20 20 20 20 20  nRef = 1;.      
9280: 70 4f 70 65 6e 2d 3e 70 4e 65 78 74 20 3d 20 6f  pOpen->pNext = o
9290: 70 65 6e 4c 69 73 74 3b 0a 20 20 20 20 20 20 69  penList;.      i
92a0: 66 28 20 6f 70 65 6e 4c 69 73 74 20 29 20 6f 70  f( openList ) op
92b0: 65 6e 4c 69 73 74 2d 3e 70 50 72 65 76 20 3d 20  enList->pPrev = 
92c0: 70 4f 70 65 6e 3b 0a 20 20 20 20 20 20 6f 70 65  pOpen;.      ope
92d0: 6e 4c 69 73 74 20 3d 20 70 4f 70 65 6e 3b 0a 20  nList = pOpen;. 
92e0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
92f0: 70 4f 70 65 6e 2d 3e 6e 52 65 66 2b 2b 3b 0a 20  pOpen->nRef++;. 
9300: 20 20 20 7d 0a 20 20 20 20 2a 70 70 4f 70 65 6e     }.    *ppOpen
9310: 20 3d 20 70 4f 70 65 6e 3b 0a 20 20 7d 0a 0a 65   = pOpen;.  }..e
9320: 78 69 74 5f 66 69 6e 64 6c 6f 63 6b 69 6e 66 6f  xit_findlockinfo
9330: 3a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  :.  return rc;.}
9340: 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 77 65 20 61 72  ../*.** If we ar
9350: 65 20 63 75 72 72 65 6e 74 6c 79 20 69 6e 20 61  e currently in a
9360: 20 64 69 66 66 65 72 65 6e 74 20 74 68 72 65 61   different threa
9370: 64 20 74 68 61 6e 20 74 68 65 20 74 68 72 65 61  d than the threa
9380: 64 20 74 68 61 74 20 74 68 65 0a 2a 2a 20 75 6e  d that the.** un
9390: 69 78 46 69 6c 65 20 61 72 67 75 6d 65 6e 74 20  ixFile argument 
93a0: 62 65 6c 6f 6e 67 73 20 74 6f 2c 20 74 68 65 6e  belongs to, then
93b0: 20 74 72 61 6e 73 66 65 72 20 6f 77 6e 65 72 73   transfer owners
93c0: 68 69 70 20 6f 66 20 74 68 65 20 75 6e 69 78 46  hip of the unixF
93d0: 69 6c 65 0a 2a 2a 20 6f 76 65 72 20 74 6f 20 74  ile.** over to t
93e0: 68 65 20 63 75 72 72 65 6e 74 20 74 68 72 65 61  he current threa
93f0: 64 2e 0a 2a 2a 0a 2a 2a 20 41 20 75 6e 69 78 46  d..**.** A unixF
9400: 69 6c 65 20 69 73 20 6f 6e 6c 79 20 6f 77 6e 65  ile is only owne
9410: 64 20 62 79 20 61 20 74 68 72 65 61 64 20 6f 6e  d by a thread on
9420: 20 73 79 73 74 65 6d 73 20 74 68 61 74 20 75 73   systems that us
9430: 65 20 4c 69 6e 75 78 54 68 72 65 61 64 73 2e 0a  e LinuxThreads..
9440: 2a 2a 0a 2a 2a 20 4f 77 6e 65 72 73 68 69 70 20  **.** Ownership 
9450: 74 72 61 6e 73 66 65 72 20 69 73 20 6f 6e 6c 79  transfer is only
9460: 20 61 6c 6c 6f 77 65 64 20 69 66 20 74 68 65 20   allowed if the 
9470: 75 6e 69 78 46 69 6c 65 20 69 73 20 63 75 72 72  unixFile is curr
9480: 65 6e 74 6c 79 20 75 6e 6c 6f 63 6b 65 64 2e 0a  ently unlocked..
9490: 2a 2a 20 49 66 20 74 68 65 20 75 6e 69 78 46 69  ** If the unixFi
94a0: 6c 65 20 69 73 20 6c 6f 63 6b 65 64 20 61 6e 64  le is locked and
94b0: 20 61 6e 20 6f 77 6e 65 72 73 68 69 70 20 69 73   an ownership is
94c0: 20 77 72 6f 6e 67 2c 20 74 68 65 6e 20 72 65 74   wrong, then ret
94d0: 75 72 6e 0a 2a 2a 20 53 51 4c 49 54 45 5f 4d 49  urn.** SQLITE_MI
94e0: 53 55 53 45 2e 20 20 53 51 4c 49 54 45 5f 4f 4b  SUSE.  SQLITE_OK
94f0: 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66 20   is returned if 
9500: 65 76 65 72 79 74 68 69 6e 67 20 77 6f 72 6b 73  everything works
9510: 2e 0a 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f  ..*/.#if SQLITE_
9520: 54 48 52 45 41 44 53 41 46 45 20 26 26 20 64 65  THREADSAFE && de
9530: 66 69 6e 65 64 28 5f 5f 6c 69 6e 75 78 5f 5f 29  fined(__linux__)
9540: 0a 73 74 61 74 69 63 20 69 6e 74 20 74 72 61 6e  .static int tran
9550: 73 66 65 72 4f 77 6e 65 72 73 68 69 70 28 75 6e  sferOwnership(un
9560: 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 29 7b 0a  ixFile *pFile){.
9570: 20 20 69 6e 74 20 72 63 3b 0a 20 20 70 74 68 72    int rc;.  pthr
9580: 65 61 64 5f 74 20 68 53 65 6c 66 3b 0a 20 20 69  ead_t hSelf;.  i
9590: 66 28 20 74 68 72 65 61 64 73 4f 76 65 72 72 69  f( threadsOverri
95a0: 64 65 45 61 63 68 4f 74 68 65 72 73 4c 6f 63 6b  deEachOthersLock
95b0: 73 20 29 7b 0a 20 20 20 20 2f 2a 20 4f 77 6e 65  s ){.    /* Owne
95c0: 72 73 68 69 70 20 74 72 61 6e 73 66 65 72 73 20  rship transfers 
95d0: 6e 6f 74 20 6e 65 65 64 65 64 20 6f 6e 20 74 68  not needed on th
95e0: 69 73 20 73 79 73 74 65 6d 20 2a 2f 0a 20 20 20  is system */.   
95f0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
9600: 4b 3b 0a 20 20 7d 0a 20 20 68 53 65 6c 66 20 3d  K;.  }.  hSelf =
9610: 20 70 74 68 72 65 61 64 5f 73 65 6c 66 28 29 3b   pthread_self();
9620: 0a 20 20 69 66 28 20 70 74 68 72 65 61 64 5f 65  .  if( pthread_e
9630: 71 75 61 6c 28 70 46 69 6c 65 2d 3e 74 69 64 2c  qual(pFile->tid,
9640: 20 68 53 65 6c 66 29 20 29 7b 0a 20 20 20 20 2f   hSelf) ){.    /
9650: 2a 20 57 65 20 61 72 65 20 73 74 69 6c 6c 20 69  * We are still i
9660: 6e 20 74 68 65 20 73 61 6d 65 20 74 68 72 65 61  n the same threa
9670: 64 20 2a 2f 0a 20 20 20 20 4f 53 54 52 41 43 45  d */.    OSTRACE
9680: 31 28 22 4e 6f 2d 74 72 61 6e 73 66 65 72 2c 20  1("No-transfer, 
9690: 73 61 6d 65 20 74 68 72 65 61 64 5c 6e 22 29 3b  same thread\n");
96a0: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
96b0: 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 69 66 28  TE_OK;.  }.  if(
96c0: 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65   pFile->locktype
96d0: 21 3d 4e 4f 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20  !=NO_LOCK ){.   
96e0: 20 2f 2a 20 57 65 20 63 61 6e 6e 6f 74 20 63 68   /* We cannot ch
96f0: 61 6e 67 65 20 6f 77 6e 65 72 73 68 69 70 20 77  ange ownership w
9700: 68 69 6c 65 20 77 65 20 61 72 65 20 68 6f 6c 64  hile we are hold
9710: 69 6e 67 20 61 20 6c 6f 63 6b 21 20 2a 2f 0a 20  ing a lock! */. 
9720: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
9730: 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a 20 20  _MISUSE_BKPT;.  
9740: 7d 0a 20 20 4f 53 54 52 41 43 45 34 28 22 54 72  }.  OSTRACE4("Tr
9750: 61 6e 73 66 65 72 20 6f 77 6e 65 72 73 68 69 70  ansfer ownership
9760: 20 6f 66 20 25 64 20 66 72 6f 6d 20 25 64 20 74   of %d from %d t
9770: 6f 20 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20  o %d\n",.       
9780: 20 20 20 20 20 70 46 69 6c 65 2d 3e 68 2c 20 70       pFile->h, p
9790: 46 69 6c 65 2d 3e 74 69 64 2c 20 68 53 65 6c 66  File->tid, hSelf
97a0: 29 3b 0a 20 20 70 46 69 6c 65 2d 3e 74 69 64 20  );.  pFile->tid 
97b0: 3d 20 68 53 65 6c 66 3b 0a 20 20 69 66 20 28 70  = hSelf;.  if (p
97c0: 46 69 6c 65 2d 3e 70 4c 6f 63 6b 20 21 3d 20 4e  File->pLock != N
97d0: 55 4c 4c 29 20 7b 0a 20 20 20 20 72 65 6c 65 61  ULL) {.    relea
97e0: 73 65 4c 6f 63 6b 49 6e 66 6f 28 70 46 69 6c 65  seLockInfo(pFile
97f0: 2d 3e 70 4c 6f 63 6b 29 3b 0a 20 20 20 20 72 63  ->pLock);.    rc
9800: 20 3d 20 66 69 6e 64 4c 6f 63 6b 49 6e 66 6f 28   = findLockInfo(
9810: 70 46 69 6c 65 2c 20 26 70 46 69 6c 65 2d 3e 70  pFile, &pFile->p
9820: 4c 6f 63 6b 2c 20 30 29 3b 0a 20 20 20 20 4f 53  Lock, 0);.    OS
9830: 54 52 41 43 45 35 28 22 4c 4f 43 4b 20 20 20 20  TRACE5("LOCK    
9840: 25 64 20 69 73 20 6e 6f 77 20 25 73 28 25 73 2c  %d is now %s(%s,
9850: 25 64 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68  %d)\n", pFile->h
9860: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 6c 6f 63  ,.           loc
9870: 6b 74 79 70 65 4e 61 6d 65 28 70 46 69 6c 65 2d  ktypeName(pFile-
9880: 3e 6c 6f 63 6b 74 79 70 65 29 2c 0a 20 20 20 20  >locktype),.    
9890: 20 20 20 20 20 20 20 6c 6f 63 6b 74 79 70 65 4e         locktypeN
98a0: 61 6d 65 28 70 46 69 6c 65 2d 3e 70 4c 6f 63 6b  ame(pFile->pLock
98b0: 2d 3e 6c 6f 63 6b 74 79 70 65 29 2c 20 70 46 69  ->locktype), pFi
98c0: 6c 65 2d 3e 70 4c 6f 63 6b 2d 3e 63 6e 74 29 3b  le->pLock->cnt);
98d0: 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  .    return rc;.
98e0: 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 72    } else {.    r
98f0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
9900: 0a 20 20 7d 0a 7d 0a 23 65 6c 73 65 20 20 2f 2a  .  }.}.#else  /*
9910: 20 69 66 20 6e 6f 74 20 53 51 4c 49 54 45 5f 54   if not SQLITE_T
9920: 48 52 45 41 44 53 41 46 45 20 2a 2f 0a 20 20 2f  HREADSAFE */.  /
9930: 2a 20 4f 6e 20 73 69 6e 67 6c 65 2d 74 68 72 65  * On single-thre
9940: 61 64 65 64 20 62 75 69 6c 64 73 2c 20 6f 77 6e  aded builds, own
9950: 65 72 73 68 69 70 20 74 72 61 6e 73 66 65 72 20  ership transfer 
9960: 69 73 20 61 20 6e 6f 2d 6f 70 20 2a 2f 0a 23 20  is a no-op */.# 
9970: 64 65 66 69 6e 65 20 74 72 61 6e 73 66 65 72 4f  define transferO
9980: 77 6e 65 72 73 68 69 70 28 58 29 20 53 51 4c 49  wnership(X) SQLI
9990: 54 45 5f 4f 4b 0a 23 65 6e 64 69 66 20 2f 2a 20  TE_OK.#endif /* 
99a0: 53 51 4c 49 54 45 5f 54 48 52 45 41 44 53 41 46  SQLITE_THREADSAF
99b0: 45 20 2a 2f 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  E */.../*.** Thi
99c0: 73 20 72 6f 75 74 69 6e 65 20 63 68 65 63 6b 73  s routine checks
99d0: 20 69 66 20 74 68 65 72 65 20 69 73 20 61 20 52   if there is a R
99e0: 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 68 65 6c  ESERVED lock hel
99f0: 64 20 6f 6e 20 74 68 65 20 73 70 65 63 69 66 69  d on the specifi
9a00: 65 64 0a 2a 2a 20 66 69 6c 65 20 62 79 20 74 68  ed.** file by th
9a10: 69 73 20 6f 72 20 61 6e 79 20 6f 74 68 65 72 20  is or any other 
9a20: 70 72 6f 63 65 73 73 2e 20 49 66 20 73 75 63 68  process. If such
9a30: 20 61 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64 2c   a lock is held,
9a40: 20 73 65 74 20 2a 70 52 65 73 4f 75 74 0a 2a 2a   set *pResOut.**
9a50: 20 74 6f 20 61 20 6e 6f 6e 2d 7a 65 72 6f 20 76   to a non-zero v
9a60: 61 6c 75 65 20 6f 74 68 65 72 77 69 73 65 20 2a  alue otherwise *
9a70: 70 52 65 73 4f 75 74 20 69 73 20 73 65 74 20 74  pResOut is set t
9a80: 6f 20 7a 65 72 6f 2e 20 20 54 68 65 20 72 65 74  o zero.  The ret
9a90: 75 72 6e 20 76 61 6c 75 65 0a 2a 2a 20 69 73 20  urn value.** is 
9aa0: 73 65 74 20 74 6f 20 53 51 4c 49 54 45 5f 4f 4b  set to SQLITE_OK
9ab0: 20 75 6e 6c 65 73 73 20 61 6e 20 49 2f 4f 20 65   unless an I/O e
9ac0: 72 72 6f 72 20 6f 63 63 75 72 73 20 64 75 72 69  rror occurs duri
9ad0: 6e 67 20 6c 6f 63 6b 20 63 68 65 63 6b 69 6e 67  ng lock checking
9ae0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
9af0: 75 6e 69 78 43 68 65 63 6b 52 65 73 65 72 76 65  unixCheckReserve
9b00: 64 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69  dLock(sqlite3_fi
9b10: 6c 65 20 2a 69 64 2c 20 69 6e 74 20 2a 70 52 65  le *id, int *pRe
9b20: 73 4f 75 74 29 7b 0a 20 20 69 6e 74 20 72 63 20  sOut){.  int rc 
9b30: 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69  = SQLITE_OK;.  i
9b40: 6e 74 20 72 65 73 65 72 76 65 64 20 3d 20 30 3b  nt reserved = 0;
9b50: 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69  .  unixFile *pFi
9b60: 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29  le = (unixFile*)
9b70: 69 64 3b 0a 0a 20 20 53 69 6d 75 6c 61 74 65 49  id;..  SimulateI
9b80: 4f 45 72 72 6f 72 28 20 72 65 74 75 72 6e 20 53  OError( return S
9b90: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43 48 45 43  QLITE_IOERR_CHEC
9ba0: 4b 52 45 53 45 52 56 45 44 4c 4f 43 4b 3b 20 29  KRESERVEDLOCK; )
9bb0: 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 46 69  ;..  assert( pFi
9bc0: 6c 65 20 29 3b 0a 20 20 75 6e 69 78 45 6e 74 65  le );.  unixEnte
9bd0: 72 4d 75 74 65 78 28 29 3b 20 2f 2a 20 42 65 63  rMutex(); /* Bec
9be0: 61 75 73 65 20 70 46 69 6c 65 2d 3e 70 4c 6f 63  ause pFile->pLoc
9bf0: 6b 20 69 73 20 73 68 61 72 65 64 20 61 63 72 6f  k is shared acro
9c00: 73 73 20 74 68 72 65 61 64 73 20 2a 2f 0a 0a 20  ss threads */.. 
9c10: 20 2f 2a 20 43 68 65 63 6b 20 69 66 20 61 20 74   /* Check if a t
9c20: 68 72 65 61 64 20 69 6e 20 74 68 69 73 20 70 72  hread in this pr
9c30: 6f 63 65 73 73 20 68 6f 6c 64 73 20 73 75 63 68  ocess holds such
9c40: 20 61 20 6c 6f 63 6b 20 2a 2f 0a 20 20 69 66 28   a lock */.  if(
9c50: 20 70 46 69 6c 65 2d 3e 70 4c 6f 63 6b 2d 3e 6c   pFile->pLock->l
9c60: 6f 63 6b 74 79 70 65 3e 53 48 41 52 45 44 5f 4c  ocktype>SHARED_L
9c70: 4f 43 4b 20 29 7b 0a 20 20 20 20 72 65 73 65 72  OCK ){.    reser
9c80: 76 65 64 20 3d 20 31 3b 0a 20 20 7d 0a 0a 20 20  ved = 1;.  }..  
9c90: 2f 2a 20 4f 74 68 65 72 77 69 73 65 20 73 65 65  /* Otherwise see
9ca0: 20 69 66 20 73 6f 6d 65 20 6f 74 68 65 72 20 70   if some other p
9cb0: 72 6f 63 65 73 73 20 68 6f 6c 64 73 20 69 74 2e  rocess holds it.
9cc0: 0a 20 20 2a 2f 0a 23 69 66 6e 64 65 66 20 5f 5f  .  */.#ifndef __
9cd0: 44 4a 47 50 50 5f 5f 0a 20 20 69 66 28 20 21 72  DJGPP__.  if( !r
9ce0: 65 73 65 72 76 65 64 20 29 7b 0a 20 20 20 20 73  eserved ){.    s
9cf0: 74 72 75 63 74 20 66 6c 6f 63 6b 20 6c 6f 63 6b  truct flock lock
9d00: 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 77 68 65  ;.    lock.l_whe
9d10: 6e 63 65 20 3d 20 53 45 45 4b 5f 53 45 54 3b 0a  nce = SEEK_SET;.
9d20: 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74      lock.l_start
9d30: 20 3d 20 52 45 53 45 52 56 45 44 5f 42 59 54 45   = RESERVED_BYTE
9d40: 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e  ;.    lock.l_len
9d50: 20 3d 20 31 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c   = 1;.    lock.l
9d60: 5f 74 79 70 65 20 3d 20 46 5f 57 52 4c 43 4b 3b  _type = F_WRLCK;
9d70: 0a 20 20 20 20 69 66 20 28 2d 31 20 3d 3d 20 66  .    if (-1 == f
9d80: 63 6e 74 6c 28 70 46 69 6c 65 2d 3e 68 2c 20 46  cntl(pFile->h, F
9d90: 5f 47 45 54 4c 4b 2c 20 26 6c 6f 63 6b 29 29 20  _GETLK, &lock)) 
9da0: 7b 0a 20 20 20 20 20 20 69 6e 74 20 74 45 72 72  {.      int tErr
9db0: 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20  no = errno;.    
9dc0: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 45 72 72    rc = sqliteErr
9dd0: 6f 72 46 72 6f 6d 50 6f 73 69 78 45 72 72 6f 72  orFromPosixError
9de0: 28 74 45 72 72 6e 6f 2c 20 53 51 4c 49 54 45 5f  (tErrno, SQLITE_
9df0: 49 4f 45 52 52 5f 43 48 45 43 4b 52 45 53 45 52  IOERR_CHECKRESER
9e00: 56 45 44 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20  VEDLOCK);.      
9e10: 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f  pFile->lastErrno
9e20: 20 3d 20 74 45 72 72 6e 6f 3b 0a 20 20 20 20 7d   = tErrno;.    }
9e30: 20 65 6c 73 65 20 69 66 28 20 6c 6f 63 6b 2e 6c   else if( lock.l
9e40: 5f 74 79 70 65 21 3d 46 5f 55 4e 4c 43 4b 20 29  _type!=F_UNLCK )
9e50: 7b 0a 20 20 20 20 20 20 72 65 73 65 72 76 65 64  {.      reserved
9e60: 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   = 1;.    }.  }.
9e70: 23 65 6e 64 69 66 0a 20 20 0a 20 20 75 6e 69 78  #endif.  .  unix
9e80: 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 20 20  LeaveMutex();.  
9e90: 4f 53 54 52 41 43 45 34 28 22 54 45 53 54 20 57  OSTRACE4("TEST W
9ea0: 52 2d 4c 4f 43 4b 20 25 64 20 25 64 20 25 64 20  R-LOCK %d %d %d 
9eb0: 28 75 6e 69 78 29 5c 6e 22 2c 20 70 46 69 6c 65  (unix)\n", pFile
9ec0: 2d 3e 68 2c 20 72 63 2c 20 72 65 73 65 72 76 65  ->h, rc, reserve
9ed0: 64 29 3b 0a 0a 20 20 2a 70 52 65 73 4f 75 74 20  d);..  *pResOut 
9ee0: 3d 20 72 65 73 65 72 76 65 64 3b 0a 20 20 72 65  = reserved;.  re
9ef0: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
9f00: 2a 20 4c 6f 63 6b 20 74 68 65 20 66 69 6c 65 20  * Lock the file 
9f10: 77 69 74 68 20 74 68 65 20 6c 6f 63 6b 20 73 70  with the lock sp
9f20: 65 63 69 66 69 65 64 20 62 79 20 70 61 72 61 6d  ecified by param
9f30: 65 74 65 72 20 6c 6f 63 6b 74 79 70 65 20 2d 20  eter locktype - 
9f40: 6f 6e 65 0a 2a 2a 20 6f 66 20 74 68 65 20 66 6f  one.** of the fo
9f50: 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20  llowing:.**.**  
9f60: 20 20 20 28 31 29 20 53 48 41 52 45 44 5f 4c 4f     (1) SHARED_LO
9f70: 43 4b 0a 2a 2a 20 20 20 20 20 28 32 29 20 52 45  CK.**     (2) RE
9f80: 53 45 52 56 45 44 5f 4c 4f 43 4b 0a 2a 2a 20 20  SERVED_LOCK.**  
9f90: 20 20 20 28 33 29 20 50 45 4e 44 49 4e 47 5f 4c     (3) PENDING_L
9fa0: 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 34 29 20 45  OCK.**     (4) E
9fb0: 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 0a 2a 2a  XCLUSIVE_LOCK.**
9fc0: 0a 2a 2a 20 53 6f 6d 65 74 69 6d 65 73 20 77 68  .** Sometimes wh
9fd0: 65 6e 20 72 65 71 75 65 73 74 69 6e 67 20 6f 6e  en requesting on
9fe0: 65 20 6c 6f 63 6b 20 73 74 61 74 65 2c 20 61 64  e lock state, ad
9ff0: 64 69 74 69 6f 6e 61 6c 20 6c 6f 63 6b 20 73 74  ditional lock st
a000: 61 74 65 73 0a 2a 2a 20 61 72 65 20 69 6e 73 65  ates.** are inse
a010: 72 74 65 64 20 69 6e 20 62 65 74 77 65 65 6e 2e  rted in between.
a020: 20 20 54 68 65 20 6c 6f 63 6b 69 6e 67 20 6d 69    The locking mi
a030: 67 68 74 20 66 61 69 6c 20 6f 6e 20 6f 6e 65 20  ght fail on one 
a040: 6f 66 20 74 68 65 20 6c 61 74 65 72 0a 2a 2a 20  of the later.** 
a050: 74 72 61 6e 73 69 74 69 6f 6e 73 20 6c 65 61 76  transitions leav
a060: 69 6e 67 20 74 68 65 20 6c 6f 63 6b 20 73 74 61  ing the lock sta
a070: 74 65 20 64 69 66 66 65 72 65 6e 74 20 66 72 6f  te different fro
a080: 6d 20 77 68 61 74 20 69 74 20 73 74 61 72 74 65  m what it starte
a090: 64 20 62 75 74 0a 2a 2a 20 73 74 69 6c 6c 20 73  d but.** still s
a0a0: 68 6f 72 74 20 6f 66 20 69 74 73 20 67 6f 61 6c  hort of its goal
a0b0: 2e 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  .  The following
a0c0: 20 63 68 61 72 74 20 73 68 6f 77 73 20 74 68 65   chart shows the
a0d0: 20 61 6c 6c 6f 77 65 64 0a 2a 2a 20 74 72 61 6e   allowed.** tran
a0e0: 73 69 74 69 6f 6e 73 20 61 6e 64 20 74 68 65 20  sitions and the 
a0f0: 69 6e 73 65 72 74 65 64 20 69 6e 74 65 72 6d 65  inserted interme
a100: 64 69 61 74 65 20 73 74 61 74 65 73 3a 0a 2a 2a  diate states:.**
a110: 0a 2a 2a 20 20 20 20 55 4e 4c 4f 43 4b 45 44 20  .**    UNLOCKED 
a120: 2d 3e 20 53 48 41 52 45 44 0a 2a 2a 20 20 20 20  -> SHARED.**    
a130: 53 48 41 52 45 44 20 2d 3e 20 52 45 53 45 52 56  SHARED -> RESERV
a140: 45 44 0a 2a 2a 20 20 20 20 53 48 41 52 45 44 20  ED.**    SHARED 
a150: 2d 3e 20 28 50 45 4e 44 49 4e 47 29 20 2d 3e 20  -> (PENDING) -> 
a160: 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20 20 20 20  EXCLUSIVE.**    
a170: 52 45 53 45 52 56 45 44 20 2d 3e 20 28 50 45 4e  RESERVED -> (PEN
a180: 44 49 4e 47 29 20 2d 3e 20 45 58 43 4c 55 53 49  DING) -> EXCLUSI
a190: 56 45 0a 2a 2a 20 20 20 20 50 45 4e 44 49 4e 47  VE.**    PENDING
a1a0: 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a   -> EXCLUSIVE.**
a1b0: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
a1c0: 20 77 69 6c 6c 20 6f 6e 6c 79 20 69 6e 63 72 65   will only incre
a1d0: 61 73 65 20 61 20 6c 6f 63 6b 2e 20 20 55 73 65  ase a lock.  Use
a1e0: 20 74 68 65 20 73 71 6c 69 74 65 33 4f 73 55 6e   the sqlite3OsUn
a1f0: 6c 6f 63 6b 28 29 0a 2a 2a 20 72 6f 75 74 69 6e  lock().** routin
a200: 65 20 74 6f 20 6c 6f 77 65 72 20 61 20 6c 6f 63  e to lower a loc
a210: 6b 69 6e 67 20 6c 65 76 65 6c 2e 0a 2a 2f 0a 73  king level..*/.s
a220: 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 4c 6f  tatic int unixLo
a230: 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  ck(sqlite3_file 
a240: 2a 69 64 2c 20 69 6e 74 20 6c 6f 63 6b 74 79 70  *id, int locktyp
a250: 65 29 7b 0a 20 20 2f 2a 20 54 68 65 20 66 6f 6c  e){.  /* The fol
a260: 6c 6f 77 69 6e 67 20 64 65 73 63 72 69 62 65 73  lowing describes
a270: 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74   the implementat
a280: 69 6f 6e 20 6f 66 20 74 68 65 20 76 61 72 69 6f  ion of the vario
a290: 75 73 20 6c 6f 63 6b 73 20 61 6e 64 0a 20 20 2a  us locks and.  *
a2a0: 2a 20 6c 6f 63 6b 20 74 72 61 6e 73 69 74 69 6f  * lock transitio
a2b0: 6e 73 20 69 6e 20 74 65 72 6d 73 20 6f 66 20 74  ns in terms of t
a2c0: 68 65 20 50 4f 53 49 58 20 61 64 76 69 73 6f 72  he POSIX advisor
a2d0: 79 20 73 68 61 72 65 64 20 61 6e 64 20 65 78 63  y shared and exc
a2e0: 6c 75 73 69 76 65 0a 20 20 2a 2a 20 6c 6f 63 6b  lusive.  ** lock
a2f0: 20 70 72 69 6d 69 74 69 76 65 73 20 28 63 61 6c   primitives (cal
a300: 6c 65 64 20 72 65 61 64 2d 6c 6f 63 6b 73 20 61  led read-locks a
a310: 6e 64 20 77 72 69 74 65 2d 6c 6f 63 6b 73 20 62  nd write-locks b
a320: 65 6c 6f 77 2c 20 74 6f 20 61 76 6f 69 64 0a 20  elow, to avoid. 
a330: 20 2a 2a 20 63 6f 6e 66 75 73 69 6f 6e 20 77 69   ** confusion wi
a340: 74 68 20 53 51 4c 69 74 65 20 6c 6f 63 6b 20 6e  th SQLite lock n
a350: 61 6d 65 73 29 2e 20 54 68 65 20 61 6c 67 6f 72  ames). The algor
a360: 69 74 68 6d 73 20 61 72 65 20 63 6f 6d 70 6c 69  ithms are compli
a370: 63 61 74 65 64 0a 20 20 2a 2a 20 73 6c 69 67 68  cated.  ** sligh
a380: 74 6c 79 20 69 6e 20 6f 72 64 65 72 20 74 6f 20  tly in order to 
a390: 62 65 20 63 6f 6d 70 61 74 69 62 6c 65 20 77 69  be compatible wi
a3a0: 74 68 20 77 69 6e 64 6f 77 73 20 73 79 73 74 65  th windows syste
a3b0: 6d 73 20 73 69 6d 75 6c 74 61 6e 65 6f 75 73 6c  ms simultaneousl
a3c0: 79 0a 20 20 2a 2a 20 61 63 63 65 73 73 69 6e 67  y.  ** accessing
a3d0: 20 74 68 65 20 73 61 6d 65 20 64 61 74 61 62 61   the same databa
a3e0: 73 65 20 66 69 6c 65 2c 20 69 6e 20 63 61 73 65  se file, in case
a3f0: 20 74 68 61 74 20 69 73 20 65 76 65 72 20 72 65   that is ever re
a400: 71 75 69 72 65 64 2e 0a 20 20 2a 2a 0a 20 20 2a  quired..  **.  *
a410: 2a 20 53 79 6d 62 6f 6c 73 20 64 65 66 69 6e 65  * Symbols define
a420: 64 20 69 6e 20 6f 73 2e 68 20 69 6e 64 65 6e 74  d in os.h indent
a430: 69 66 79 20 74 68 65 20 27 70 65 6e 64 69 6e 67  ify the 'pending
a440: 20 62 79 74 65 27 20 61 6e 64 20 74 68 65 20 27   byte' and the '
a450: 72 65 73 65 72 76 65 64 0a 20 20 2a 2a 20 62 79  reserved.  ** by
a460: 74 65 27 2c 20 65 61 63 68 20 73 69 6e 67 6c 65  te', each single
a470: 20 62 79 74 65 73 20 61 74 20 77 65 6c 6c 20 6b   bytes at well k
a480: 6e 6f 77 6e 20 6f 66 66 73 65 74 73 2c 20 61 6e  nown offsets, an
a490: 64 20 74 68 65 20 27 73 68 61 72 65 64 20 62 79  d the 'shared by
a4a0: 74 65 0a 20 20 2a 2a 20 72 61 6e 67 65 27 2c 20  te.  ** range', 
a4b0: 61 20 72 61 6e 67 65 20 6f 66 20 35 31 30 20 62  a range of 510 b
a4c0: 79 74 65 73 20 61 74 20 61 20 77 65 6c 6c 20 6b  ytes at a well k
a4d0: 6e 6f 77 6e 20 6f 66 66 73 65 74 2e 0a 20 20 2a  nown offset..  *
a4e0: 2a 0a 20 20 2a 2a 20 54 6f 20 6f 62 74 61 69 6e  *.  ** To obtain
a4f0: 20 61 20 53 48 41 52 45 44 20 6c 6f 63 6b 2c 20   a SHARED lock, 
a500: 61 20 72 65 61 64 2d 6c 6f 63 6b 20 69 73 20 6f  a read-lock is o
a510: 62 74 61 69 6e 65 64 20 6f 6e 20 74 68 65 20 27  btained on the '
a520: 70 65 6e 64 69 6e 67 0a 20 20 2a 2a 20 62 79 74  pending.  ** byt
a530: 65 27 2e 20 20 49 66 20 74 68 69 73 20 69 73 20  e'.  If this is 
a540: 73 75 63 63 65 73 73 66 75 6c 2c 20 61 20 72 61  successful, a ra
a550: 6e 64 6f 6d 20 62 79 74 65 20 66 72 6f 6d 20 74  ndom byte from t
a560: 68 65 20 27 73 68 61 72 65 64 20 62 79 74 65 0a  he 'shared byte.
a570: 20 20 2a 2a 20 72 61 6e 67 65 27 20 69 73 20 72    ** range' is r
a580: 65 61 64 2d 6c 6f 63 6b 65 64 20 61 6e 64 20 74  ead-locked and t
a590: 68 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 27  he lock on the '
a5a0: 70 65 6e 64 69 6e 67 20 62 79 74 65 27 20 72 65  pending byte' re
a5b0: 6c 65 61 73 65 64 2e 0a 20 20 2a 2a 0a 20 20 2a  leased..  **.  *
a5c0: 2a 20 41 20 70 72 6f 63 65 73 73 20 6d 61 79 20  * A process may 
a5d0: 6f 6e 6c 79 20 6f 62 74 61 69 6e 20 61 20 52 45  only obtain a RE
a5e0: 53 45 52 56 45 44 20 6c 6f 63 6b 20 61 66 74 65  SERVED lock afte
a5f0: 72 20 69 74 20 68 61 73 20 61 20 53 48 41 52 45  r it has a SHARE
a600: 44 20 6c 6f 63 6b 2e 0a 20 20 2a 2a 20 41 20 52  D lock..  ** A R
a610: 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 69 73 20  ESERVED lock is 
a620: 69 6d 70 6c 65 6d 65 6e 74 65 64 20 62 79 20 67  implemented by g
a630: 72 61 62 62 69 6e 67 20 61 20 77 72 69 74 65 2d  rabbing a write-
a640: 6c 6f 63 6b 20 6f 6e 20 74 68 65 0a 20 20 2a 2a  lock on the.  **
a650: 20 27 72 65 73 65 72 76 65 64 20 62 79 74 65 27   'reserved byte'
a660: 2e 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 20 70  . .  **.  ** A p
a670: 72 6f 63 65 73 73 20 6d 61 79 20 6f 6e 6c 79 20  rocess may only 
a680: 6f 62 74 61 69 6e 20 61 20 50 45 4e 44 49 4e 47  obtain a PENDING
a690: 20 6c 6f 63 6b 20 61 66 74 65 72 20 69 74 20 68   lock after it h
a6a0: 61 73 20 6f 62 74 61 69 6e 65 64 20 61 0a 20 20  as obtained a.  
a6b0: 2a 2a 20 53 48 41 52 45 44 20 6c 6f 63 6b 2e 20  ** SHARED lock. 
a6c0: 41 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 20 69  A PENDING lock i
a6d0: 73 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 62 79  s implemented by
a6e0: 20 6f 62 74 61 69 6e 69 6e 67 20 61 20 77 72 69   obtaining a wri
a6f0: 74 65 2d 6c 6f 63 6b 0a 20 20 2a 2a 20 6f 6e 20  te-lock.  ** on 
a700: 74 68 65 20 27 70 65 6e 64 69 6e 67 20 62 79 74  the 'pending byt
a710: 65 27 2e 20 54 68 69 73 20 65 6e 73 75 72 65 73  e'. This ensures
a720: 20 74 68 61 74 20 6e 6f 20 6e 65 77 20 53 48 41   that no new SHA
a730: 52 45 44 20 6c 6f 63 6b 73 20 63 61 6e 20 62 65  RED locks can be
a740: 0a 20 20 2a 2a 20 6f 62 74 61 69 6e 65 64 2c 20  .  ** obtained, 
a750: 62 75 74 20 65 78 69 73 74 69 6e 67 20 53 48 41  but existing SHA
a760: 52 45 44 20 6c 6f 63 6b 73 20 61 72 65 20 61 6c  RED locks are al
a770: 6c 6f 77 65 64 20 74 6f 20 70 65 72 73 69 73 74  lowed to persist
a780: 2e 20 41 20 70 72 6f 63 65 73 73 0a 20 20 2a 2a  . A process.  **
a790: 20 64 6f 65 73 20 6e 6f 74 20 68 61 76 65 20 74   does not have t
a7a0: 6f 20 6f 62 74 61 69 6e 20 61 20 52 45 53 45 52  o obtain a RESER
a7b0: 56 45 44 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  VED lock on the 
a7c0: 77 61 79 20 74 6f 20 61 20 50 45 4e 44 49 4e 47  way to a PENDING
a7d0: 20 6c 6f 63 6b 2e 0a 20 20 2a 2a 20 54 68 69 73   lock..  ** This
a7e0: 20 70 72 6f 70 65 72 74 79 20 69 73 20 75 73 65   property is use
a7f0: 64 20 62 79 20 74 68 65 20 61 6c 67 6f 72 69 74  d by the algorit
a800: 68 6d 20 66 6f 72 20 72 6f 6c 6c 69 6e 67 20 62  hm for rolling b
a810: 61 63 6b 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69  ack a journal fi
a820: 6c 65 0a 20 20 2a 2a 20 61 66 74 65 72 20 61 20  le.  ** after a 
a830: 63 72 61 73 68 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  crash..  **.  **
a840: 20 41 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f   An EXCLUSIVE lo
a850: 63 6b 2c 20 6f 62 74 61 69 6e 65 64 20 61 66 74  ck, obtained aft
a860: 65 72 20 61 20 50 45 4e 44 49 4e 47 20 6c 6f 63  er a PENDING loc
a870: 6b 20 69 73 20 68 65 6c 64 2c 20 69 73 0a 20 20  k is held, is.  
a880: 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 62  ** implemented b
a890: 79 20 6f 62 74 61 69 6e 69 6e 67 20 61 20 77 72  y obtaining a wr
a8a0: 69 74 65 2d 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  ite-lock on the 
a8b0: 65 6e 74 69 72 65 20 27 73 68 61 72 65 64 20 62  entire 'shared b
a8c0: 79 74 65 0a 20 20 2a 2a 20 72 61 6e 67 65 27 2e  yte.  ** range'.
a8d0: 20 53 69 6e 63 65 20 61 6c 6c 20 6f 74 68 65 72   Since all other
a8e0: 20 6c 6f 63 6b 73 20 72 65 71 75 69 72 65 20 61   locks require a
a8f0: 20 72 65 61 64 2d 6c 6f 63 6b 20 6f 6e 20 6f 6e   read-lock on on
a900: 65 20 6f 66 20 74 68 65 20 62 79 74 65 73 0a 20  e of the bytes. 
a910: 20 2a 2a 20 77 69 74 68 69 6e 20 74 68 69 73 20   ** within this 
a920: 72 61 6e 67 65 2c 20 74 68 69 73 20 65 6e 73 75  range, this ensu
a930: 72 65 73 20 74 68 61 74 20 6e 6f 20 6f 74 68 65  res that no othe
a940: 72 20 6c 6f 63 6b 73 20 61 72 65 20 68 65 6c 64  r locks are held
a950: 20 6f 6e 20 74 68 65 0a 20 20 2a 2a 20 64 61 74   on the.  ** dat
a960: 61 62 61 73 65 2e 20 0a 20 20 2a 2a 0a 20 20 2a  abase. .  **.  *
a970: 2a 20 54 68 65 20 72 65 61 73 6f 6e 20 61 20 73  * The reason a s
a980: 69 6e 67 6c 65 20 62 79 74 65 20 63 61 6e 6e 6f  ingle byte canno
a990: 74 20 62 65 20 75 73 65 64 20 69 6e 73 74 65 61  t be used instea
a9a0: 64 20 6f 66 20 74 68 65 20 27 73 68 61 72 65 64  d of the 'shared
a9b0: 20 62 79 74 65 0a 20 20 2a 2a 20 72 61 6e 67 65   byte.  ** range
a9c0: 27 20 69 73 20 74 68 61 74 20 73 6f 6d 65 20 76  ' is that some v
a9d0: 65 72 73 69 6f 6e 73 20 6f 66 20 77 69 6e 64 6f  ersions of windo
a9e0: 77 73 20 64 6f 20 6e 6f 74 20 73 75 70 70 6f 72  ws do not suppor
a9f0: 74 20 72 65 61 64 2d 6c 6f 63 6b 73 2e 20 42 79  t read-locks. By
aa00: 0a 20 20 2a 2a 20 6c 6f 63 6b 69 6e 67 20 61 20  .  ** locking a 
aa10: 72 61 6e 64 6f 6d 20 62 79 74 65 20 66 72 6f 6d  random byte from
aa20: 20 61 20 72 61 6e 67 65 2c 20 63 6f 6e 63 75 72   a range, concur
aa30: 72 65 6e 74 20 53 48 41 52 45 44 20 6c 6f 63 6b  rent SHARED lock
aa40: 73 20 6d 61 79 20 65 78 69 73 74 0a 20 20 2a 2a  s may exist.  **
aa50: 20 65 76 65 6e 20 69 66 20 74 68 65 20 6c 6f 63   even if the loc
aa60: 6b 69 6e 67 20 70 72 69 6d 69 74 69 76 65 20 75  king primitive u
aa70: 73 65 64 20 69 73 20 61 6c 77 61 79 73 20 61 20  sed is always a 
aa80: 77 72 69 74 65 2d 6c 6f 63 6b 2e 0a 20 20 2a 2f  write-lock..  */
aa90: 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
aaa0: 54 45 5f 4f 4b 3b 0a 20 20 75 6e 69 78 46 69 6c  TE_OK;.  unixFil
aab0: 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78  e *pFile = (unix
aac0: 46 69 6c 65 2a 29 69 64 3b 0a 20 20 73 74 72 75  File*)id;.  stru
aad0: 63 74 20 75 6e 69 78 4c 6f 63 6b 49 6e 66 6f 20  ct unixLockInfo 
aae0: 2a 70 4c 6f 63 6b 20 3d 20 70 46 69 6c 65 2d 3e  *pLock = pFile->
aaf0: 70 4c 6f 63 6b 3b 0a 20 20 73 74 72 75 63 74 20  pLock;.  struct 
ab00: 66 6c 6f 63 6b 20 6c 6f 63 6b 3b 0a 20 20 69 6e  flock lock;.  in
ab10: 74 20 73 20 3d 20 30 3b 0a 20 20 69 6e 74 20 74  t s = 0;.  int t
ab20: 45 72 72 6e 6f 20 3d 20 30 3b 0a 0a 20 20 61 73  Errno = 0;..  as
ab30: 73 65 72 74 28 20 70 46 69 6c 65 20 29 3b 0a 20  sert( pFile );. 
ab40: 20 4f 53 54 52 41 43 45 37 28 22 4c 4f 43 4b 20   OSTRACE7("LOCK 
ab50: 20 20 20 25 64 20 25 73 20 77 61 73 20 25 73 28     %d %s was %s(
ab60: 25 73 2c 25 64 29 20 70 69 64 3d 25 64 20 28 75  %s,%d) pid=%d (u
ab70: 6e 69 78 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e  nix)\n", pFile->
ab80: 68 2c 0a 20 20 20 20 20 20 6c 6f 63 6b 74 79 70  h,.      locktyp
ab90: 65 4e 61 6d 65 28 6c 6f 63 6b 74 79 70 65 29 2c  eName(locktype),
aba0: 20 6c 6f 63 6b 74 79 70 65 4e 61 6d 65 28 70 46   locktypeName(pF
abb0: 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 29 2c 0a  ile->locktype),.
abc0: 20 20 20 20 20 20 6c 6f 63 6b 74 79 70 65 4e 61        locktypeNa
abd0: 6d 65 28 70 4c 6f 63 6b 2d 3e 6c 6f 63 6b 74 79  me(pLock->lockty
abe0: 70 65 29 2c 20 70 4c 6f 63 6b 2d 3e 63 6e 74 20  pe), pLock->cnt 
abf0: 2c 20 67 65 74 70 69 64 28 29 29 3b 0a 0a 20 20  , getpid());..  
ac00: 2f 2a 20 49 66 20 74 68 65 72 65 20 69 73 20 61  /* If there is a
ac10: 6c 72 65 61 64 79 20 61 20 6c 6f 63 6b 20 6f 66  lready a lock of
ac20: 20 74 68 69 73 20 74 79 70 65 20 6f 72 20 6d 6f   this type or mo
ac30: 72 65 20 72 65 73 74 72 69 63 74 69 76 65 20 6f  re restrictive o
ac40: 6e 20 74 68 65 0a 20 20 2a 2a 20 75 6e 69 78 46  n the.  ** unixF
ac50: 69 6c 65 2c 20 64 6f 20 6e 6f 74 68 69 6e 67 2e  ile, do nothing.
ac60: 20 44 6f 6e 27 74 20 75 73 65 20 74 68 65 20 65   Don't use the e
ac70: 6e 64 5f 6c 6f 63 6b 3a 20 65 78 69 74 20 70 61  nd_lock: exit pa
ac80: 74 68 2c 20 61 73 0a 20 20 2a 2a 20 75 6e 69 78  th, as.  ** unix
ac90: 45 6e 74 65 72 4d 75 74 65 78 28 29 20 68 61 73  EnterMutex() has
aca0: 6e 27 74 20 62 65 65 6e 20 63 61 6c 6c 65 64 20  n't been called 
acb0: 79 65 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  yet..  */.  if( 
acc0: 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3e  pFile->locktype>
acd0: 3d 6c 6f 63 6b 74 79 70 65 20 29 7b 0a 20 20 20  =locktype ){.   
ace0: 20 4f 53 54 52 41 43 45 33 28 22 4c 4f 43 4b 20   OSTRACE3("LOCK 
acf0: 20 20 20 25 64 20 25 73 20 6f 6b 20 28 61 6c 72     %d %s ok (alr
ad00: 65 61 64 79 20 68 65 6c 64 29 20 28 75 6e 69 78  eady held) (unix
ad10: 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 0a  )\n", pFile->h,.
ad20: 20 20 20 20 20 20 20 20 20 20 20 20 6c 6f 63 6b              lock
ad30: 74 79 70 65 4e 61 6d 65 28 6c 6f 63 6b 74 79 70  typeName(locktyp
ad40: 65 29 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  e));.    return 
ad50: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a  SQLITE_OK;.  }..
ad60: 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74    /* Make sure t
ad70: 68 65 20 6c 6f 63 6b 69 6e 67 20 73 65 71 75 65  he locking seque
ad80: 6e 63 65 20 69 73 20 63 6f 72 72 65 63 74 2e 0a  nce is correct..
ad90: 20 20 2a 2a 20 20 28 31 29 20 57 65 20 6e 65 76    **  (1) We nev
ada0: 65 72 20 6d 6f 76 65 20 66 72 6f 6d 20 75 6e 6c  er move from unl
adb0: 6f 63 6b 65 64 20 74 6f 20 61 6e 79 74 68 69 6e  ocked to anythin
adc0: 67 20 68 69 67 68 65 72 20 74 68 61 6e 20 73 68  g higher than sh
add0: 61 72 65 64 20 6c 6f 63 6b 2e 0a 20 20 2a 2a 20  ared lock..  ** 
ade0: 20 28 32 29 20 53 51 4c 69 74 65 20 6e 65 76 65   (2) SQLite neve
adf0: 72 20 65 78 70 6c 69 63 69 74 6c 79 20 72 65 71  r explicitly req
ae00: 75 65 73 74 73 20 61 20 70 65 6e 64 69 67 20 6c  uests a pendig l
ae10: 6f 63 6b 2e 0a 20 20 2a 2a 20 20 28 33 29 20 41  ock..  **  (3) A
ae20: 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 69 73 20   shared lock is 
ae30: 61 6c 77 61 79 73 20 68 65 6c 64 20 77 68 65 6e  always held when
ae40: 20 61 20 72 65 73 65 72 76 65 20 6c 6f 63 6b 20   a reserve lock 
ae50: 69 73 20 72 65 71 75 65 73 74 65 64 2e 0a 20 20  is requested..  
ae60: 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 46 69  */.  assert( pFi
ae70: 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 21 3d 4e 4f  le->locktype!=NO
ae80: 5f 4c 4f 43 4b 20 7c 7c 20 6c 6f 63 6b 74 79 70  _LOCK || locktyp
ae90: 65 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29  e==SHARED_LOCK )
aea0: 3b 0a 20 20 61 73 73 65 72 74 28 20 6c 6f 63 6b  ;.  assert( lock
aeb0: 74 79 70 65 21 3d 50 45 4e 44 49 4e 47 5f 4c 4f  type!=PENDING_LO
aec0: 43 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  CK );.  assert( 
aed0: 6c 6f 63 6b 74 79 70 65 21 3d 52 45 53 45 52 56  locktype!=RESERV
aee0: 45 44 5f 4c 4f 43 4b 20 7c 7c 20 70 46 69 6c 65  ED_LOCK || pFile
aef0: 2d 3e 6c 6f 63 6b 74 79 70 65 3d 3d 53 48 41 52  ->locktype==SHAR
af00: 45 44 5f 4c 4f 43 4b 20 29 3b 0a 0a 20 20 2f 2a  ED_LOCK );..  /*
af10: 20 54 68 69 73 20 6d 75 74 65 78 20 69 73 20 6e   This mutex is n
af20: 65 65 64 65 64 20 62 65 63 61 75 73 65 20 70 46  eeded because pF
af30: 69 6c 65 2d 3e 70 4c 6f 63 6b 20 69 73 20 73 68  ile->pLock is sh
af40: 61 72 65 64 20 61 63 72 6f 73 73 20 74 68 72 65  ared across thre
af50: 61 64 73 0a 20 20 2a 2f 0a 20 20 75 6e 69 78 45  ads.  */.  unixE
af60: 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 0a 20 20  nterMutex();..  
af70: 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65  /* Make sure the
af80: 20 63 75 72 72 65 6e 74 20 74 68 72 65 61 64 20   current thread 
af90: 6f 77 6e 73 20 74 68 65 20 70 46 69 6c 65 2e 0a  owns the pFile..
afa0: 20 20 2a 2f 0a 20 20 72 63 20 3d 20 74 72 61 6e    */.  rc = tran
afb0: 73 66 65 72 4f 77 6e 65 72 73 68 69 70 28 70 46  sferOwnership(pF
afc0: 69 6c 65 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  ile);.  if( rc!=
afd0: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
afe0: 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28   unixLeaveMutex(
aff0: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63  );.    return rc
b000: 3b 0a 20 20 7d 0a 20 20 70 4c 6f 63 6b 20 3d 20  ;.  }.  pLock = 
b010: 70 46 69 6c 65 2d 3e 70 4c 6f 63 6b 3b 0a 0a 20  pFile->pLock;.. 
b020: 20 2f 2a 20 49 66 20 73 6f 6d 65 20 74 68 72 65   /* If some thre
b030: 61 64 20 75 73 69 6e 67 20 74 68 69 73 20 50 49  ad using this PI
b040: 44 20 68 61 73 20 61 20 6c 6f 63 6b 20 76 69 61  D has a lock via
b050: 20 61 20 64 69 66 66 65 72 65 6e 74 20 75 6e 69   a different uni
b060: 78 46 69 6c 65 2a 0a 20 20 2a 2a 20 68 61 6e 64  xFile*.  ** hand
b070: 6c 65 20 74 68 61 74 20 70 72 65 63 6c 75 64 65  le that preclude
b080: 73 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20  s the requested 
b090: 6c 6f 63 6b 2c 20 72 65 74 75 72 6e 20 42 55 53  lock, return BUS
b0a0: 59 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 28 70  Y..  */.  if( (p
b0b0: 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 21 3d  File->locktype!=
b0c0: 70 4c 6f 63 6b 2d 3e 6c 6f 63 6b 74 79 70 65 20  pLock->locktype 
b0d0: 26 26 20 0a 20 20 20 20 20 20 20 20 20 20 28 70  && .          (p
b0e0: 4c 6f 63 6b 2d 3e 6c 6f 63 6b 74 79 70 65 3e 3d  Lock->locktype>=
b0f0: 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 20 7c 7c 20  PENDING_LOCK || 
b100: 6c 6f 63 6b 74 79 70 65 3e 53 48 41 52 45 44 5f  locktype>SHARED_
b110: 4c 4f 43 4b 29 29 0a 20 20 29 7b 0a 20 20 20 20  LOCK)).  ){.    
b120: 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59  rc = SQLITE_BUSY
b130: 3b 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 6c  ;.    goto end_l
b140: 6f 63 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49  ock;.  }..  /* I
b150: 66 20 61 20 53 48 41 52 45 44 20 6c 6f 63 6b 20  f a SHARED lock 
b160: 69 73 20 72 65 71 75 65 73 74 65 64 2c 20 61 6e  is requested, an
b170: 64 20 73 6f 6d 65 20 74 68 72 65 61 64 20 75 73  d some thread us
b180: 69 6e 67 20 74 68 69 73 20 50 49 44 20 61 6c 72  ing this PID alr
b190: 65 61 64 79 0a 20 20 2a 2a 20 68 61 73 20 61 20  eady.  ** has a 
b1a0: 53 48 41 52 45 44 20 6f 72 20 52 45 53 45 52 56  SHARED or RESERV
b1b0: 45 44 20 6c 6f 63 6b 2c 20 74 68 65 6e 20 69 6e  ED lock, then in
b1c0: 63 72 65 6d 65 6e 74 20 72 65 66 65 72 65 6e 63  crement referenc
b1d0: 65 20 63 6f 75 6e 74 73 20 61 6e 64 0a 20 20 2a  e counts and.  *
b1e0: 2a 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  * return SQLITE_
b1f0: 4f 4b 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6c  OK..  */.  if( l
b200: 6f 63 6b 74 79 70 65 3d 3d 53 48 41 52 45 44 5f  ocktype==SHARED_
b210: 4c 4f 43 4b 20 26 26 20 0a 20 20 20 20 20 20 28  LOCK && .      (
b220: 70 4c 6f 63 6b 2d 3e 6c 6f 63 6b 74 79 70 65 3d  pLock->locktype=
b230: 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 7c 7c 20  =SHARED_LOCK || 
b240: 70 4c 6f 63 6b 2d 3e 6c 6f 63 6b 74 79 70 65 3d  pLock->locktype=
b250: 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 29 20  =RESERVED_LOCK) 
b260: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 6c  ){.    assert( l
b270: 6f 63 6b 74 79 70 65 3d 3d 53 48 41 52 45 44 5f  ocktype==SHARED_
b280: 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 61 73 73 65  LOCK );.    asse
b290: 72 74 28 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74  rt( pFile->lockt
b2a0: 79 70 65 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73  ype==0 );.    as
b2b0: 73 65 72 74 28 20 70 4c 6f 63 6b 2d 3e 63 6e 74  sert( pLock->cnt
b2c0: 3e 30 20 29 3b 0a 20 20 20 20 70 46 69 6c 65 2d  >0 );.    pFile-
b2d0: 3e 6c 6f 63 6b 74 79 70 65 20 3d 20 53 48 41 52  >locktype = SHAR
b2e0: 45 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20 70 4c 6f  ED_LOCK;.    pLo
b2f0: 63 6b 2d 3e 63 6e 74 2b 2b 3b 0a 20 20 20 20 70  ck->cnt++;.    p
b300: 46 69 6c 65 2d 3e 70 4f 70 65 6e 2d 3e 6e 4c 6f  File->pOpen->nLo
b310: 63 6b 2b 2b 3b 0a 20 20 20 20 67 6f 74 6f 20 65  ck++;.    goto e
b320: 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 7d 0a 0a 0a 20  nd_lock;.  }... 
b330: 20 2f 2a 20 41 20 50 45 4e 44 49 4e 47 20 6c 6f   /* A PENDING lo
b340: 63 6b 20 69 73 20 6e 65 65 64 65 64 20 62 65 66  ck is needed bef
b350: 6f 72 65 20 61 63 71 75 69 72 69 6e 67 20 61 20  ore acquiring a 
b360: 53 48 41 52 45 44 20 6c 6f 63 6b 20 61 6e 64 20  SHARED lock and 
b370: 62 65 66 6f 72 65 0a 20 20 2a 2a 20 61 63 71 75  before.  ** acqu
b380: 69 72 69 6e 67 20 61 6e 20 45 58 43 4c 55 53 49  iring an EXCLUSI
b390: 56 45 20 6c 6f 63 6b 2e 20 20 46 6f 72 20 74 68  VE lock.  For th
b3a0: 65 20 53 48 41 52 45 44 20 6c 6f 63 6b 2c 20 74  e SHARED lock, t
b3b0: 68 65 20 50 45 4e 44 49 4e 47 20 77 69 6c 6c 0a  he PENDING will.
b3c0: 20 20 2a 2a 20 62 65 20 72 65 6c 65 61 73 65 64    ** be released
b3d0: 2e 0a 20 20 2a 2f 0a 20 20 6c 6f 63 6b 2e 6c 5f  ..  */.  lock.l_
b3e0: 6c 65 6e 20 3d 20 31 4c 3b 0a 20 20 6c 6f 63 6b  len = 1L;.  lock
b3f0: 2e 6c 5f 77 68 65 6e 63 65 20 3d 20 53 45 45 4b  .l_whence = SEEK
b400: 5f 53 45 54 3b 0a 20 20 69 66 28 20 6c 6f 63 6b  _SET;.  if( lock
b410: 74 79 70 65 3d 3d 53 48 41 52 45 44 5f 4c 4f 43  type==SHARED_LOC
b420: 4b 20 0a 20 20 20 20 20 20 7c 7c 20 28 6c 6f 63  K .      || (loc
b430: 6b 74 79 70 65 3d 3d 45 58 43 4c 55 53 49 56 45  ktype==EXCLUSIVE
b440: 5f 4c 4f 43 4b 20 26 26 20 70 46 69 6c 65 2d 3e  _LOCK && pFile->
b450: 6c 6f 63 6b 74 79 70 65 3c 50 45 4e 44 49 4e 47  locktype<PENDING
b460: 5f 4c 4f 43 4b 29 0a 20 20 29 7b 0a 20 20 20 20  _LOCK).  ){.    
b470: 6c 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d 20 28 6c  lock.l_type = (l
b480: 6f 63 6b 74 79 70 65 3d 3d 53 48 41 52 45 44 5f  ocktype==SHARED_
b490: 4c 4f 43 4b 3f 46 5f 52 44 4c 43 4b 3a 46 5f 57  LOCK?F_RDLCK:F_W
b4a0: 52 4c 43 4b 29 3b 0a 20 20 20 20 6c 6f 63 6b 2e  RLCK);.    lock.
b4b0: 6c 5f 73 74 61 72 74 20 3d 20 50 45 4e 44 49 4e  l_start = PENDIN
b4c0: 47 5f 42 59 54 45 3b 0a 20 20 20 20 73 20 3d 20  G_BYTE;.    s = 
b4d0: 66 63 6e 74 6c 28 70 46 69 6c 65 2d 3e 68 2c 20  fcntl(pFile->h, 
b4e0: 46 5f 53 45 54 4c 4b 2c 20 26 6c 6f 63 6b 29 3b  F_SETLK, &lock);
b4f0: 0a 20 20 20 20 69 66 28 20 73 3d 3d 28 2d 31 29  .    if( s==(-1)
b500: 20 29 7b 0a 20 20 20 20 20 20 74 45 72 72 6e 6f   ){.      tErrno
b510: 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20   = errno;.      
b520: 72 63 20 3d 20 73 71 6c 69 74 65 45 72 72 6f 72  rc = sqliteError
b530: 46 72 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28 74  FromPosixError(t
b540: 45 72 72 6e 6f 2c 20 53 51 4c 49 54 45 5f 49 4f  Errno, SQLITE_IO
b550: 45 52 52 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20  ERR_LOCK);.     
b560: 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52   if( IS_LOCK_ERR
b570: 4f 52 28 72 63 29 20 29 7b 0a 20 20 20 20 20 20  OR(rc) ){.      
b580: 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72    pFile->lastErr
b590: 6e 6f 20 3d 20 74 45 72 72 6e 6f 3b 0a 20 20 20  no = tErrno;.   
b5a0: 20 20 20 7d 0a 20 20 20 20 20 20 67 6f 74 6f 20     }.      goto 
b5b0: 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 20 20 7d 0a  end_lock;.    }.
b5c0: 20 20 7d 0a 0a 0a 20 20 2f 2a 20 49 66 20 63 6f    }...  /* If co
b5d0: 6e 74 72 6f 6c 20 67 65 74 73 20 74 6f 20 74 68  ntrol gets to th
b5e0: 69 73 20 70 6f 69 6e 74 2c 20 74 68 65 6e 20 61  is point, then a
b5f0: 63 74 75 61 6c 6c 79 20 67 6f 20 61 68 65 61 64  ctually go ahead
b600: 20 61 6e 64 20 6d 61 6b 65 0a 20 20 2a 2a 20 6f   and make.  ** o
b610: 70 65 72 61 74 69 6e 67 20 73 79 73 74 65 6d 20  perating system 
b620: 63 61 6c 6c 73 20 66 6f 72 20 74 68 65 20 73 70  calls for the sp
b630: 65 63 69 66 69 65 64 20 6c 6f 63 6b 2e 0a 20 20  ecified lock..  
b640: 2a 2f 0a 20 20 69 66 28 20 6c 6f 63 6b 74 79 70  */.  if( locktyp
b650: 65 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29  e==SHARED_LOCK )
b660: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4c  {.    assert( pL
b670: 6f 63 6b 2d 3e 63 6e 74 3d 3d 30 20 29 3b 0a 20  ock->cnt==0 );. 
b680: 20 20 20 61 73 73 65 72 74 28 20 70 4c 6f 63 6b     assert( pLock
b690: 2d 3e 6c 6f 63 6b 74 79 70 65 3d 3d 30 20 29 3b  ->locktype==0 );
b6a0: 0a 0a 20 20 20 20 2f 2a 20 4e 6f 77 20 67 65 74  ..    /* Now get
b6b0: 20 74 68 65 20 72 65 61 64 2d 6c 6f 63 6b 20 2a   the read-lock *
b6c0: 2f 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61  /.    lock.l_sta
b6d0: 72 74 20 3d 20 53 48 41 52 45 44 5f 46 49 52 53  rt = SHARED_FIRS
b6e0: 54 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 6c 65  T;.    lock.l_le
b6f0: 6e 20 3d 20 53 48 41 52 45 44 5f 53 49 5a 45 3b  n = SHARED_SIZE;
b700: 0a 20 20 20 20 69 66 28 20 28 73 20 3d 20 66 63  .    if( (s = fc
b710: 6e 74 6c 28 70 46 69 6c 65 2d 3e 68 2c 20 46 5f  ntl(pFile->h, F_
b720: 53 45 54 4c 4b 2c 20 26 6c 6f 63 6b 29 29 3d 3d  SETLK, &lock))==
b730: 28 2d 31 29 20 29 7b 0a 20 20 20 20 20 20 74 45  (-1) ){.      tE
b740: 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20  rrno = errno;.  
b750: 20 20 7d 0a 20 20 20 20 2f 2a 20 44 72 6f 70 20    }.    /* Drop 
b760: 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20 50 45  the temporary PE
b770: 4e 44 49 4e 47 20 6c 6f 63 6b 20 2a 2f 0a 20 20  NDING lock */.  
b780: 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d    lock.l_start =
b790: 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 3b 0a 20   PENDING_BYTE;. 
b7a0: 20 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20     lock.l_len = 
b7b0: 31 4c 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74  1L;.    lock.l_t
b7c0: 79 70 65 20 3d 20 46 5f 55 4e 4c 43 4b 3b 0a 20  ype = F_UNLCK;. 
b7d0: 20 20 20 69 66 28 20 66 63 6e 74 6c 28 70 46 69     if( fcntl(pFi
b7e0: 6c 65 2d 3e 68 2c 20 46 5f 53 45 54 4c 4b 2c 20  le->h, F_SETLK, 
b7f0: 26 6c 6f 63 6b 29 21 3d 30 20 29 7b 0a 20 20 20  &lock)!=0 ){.   
b800: 20 20 20 69 66 28 20 73 20 21 3d 20 2d 31 20 29     if( s != -1 )
b810: 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 69  {.        /* Thi
b820: 73 20 63 6f 75 6c 64 20 68 61 70 70 65 6e 20 77  s could happen w
b830: 69 74 68 20 61 20 6e 65 74 77 6f 72 6b 20 6d 6f  ith a network mo
b840: 75 6e 74 20 2a 2f 0a 20 20 20 20 20 20 20 20 74  unt */.        t
b850: 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 20 0a  Errno = errno; .
b860: 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
b870: 69 74 65 45 72 72 6f 72 46 72 6f 6d 50 6f 73 69  iteErrorFromPosi
b880: 78 45 72 72 6f 72 28 74 45 72 72 6e 6f 2c 20 53  xError(tErrno, S
b890: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f  QLITE_IOERR_UNLO
b8a0: 43 4b 29 3b 20 0a 20 20 20 20 20 20 20 20 69 66  CK); .        if
b8b0: 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28  ( IS_LOCK_ERROR(
b8c0: 72 63 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  rc) ){.         
b8d0: 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e   pFile->lastErrn
b8e0: 6f 20 3d 20 74 45 72 72 6e 6f 3b 0a 20 20 20 20  o = tErrno;.    
b8f0: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 67 6f      }.        go
b900: 74 6f 20 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 20  to end_lock;.   
b910: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69     }.    }.    i
b920: 66 28 20 73 3d 3d 28 2d 31 29 20 29 7b 0a 20 20  f( s==(-1) ){.  
b930: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 45      rc = sqliteE
b940: 72 72 6f 72 46 72 6f 6d 50 6f 73 69 78 45 72 72  rrorFromPosixErr
b950: 6f 72 28 74 45 72 72 6e 6f 2c 20 53 51 4c 49 54  or(tErrno, SQLIT
b960: 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b 29 3b 0a 20  E_IOERR_LOCK);. 
b970: 20 20 20 20 20 69 66 28 20 49 53 5f 4c 4f 43 4b       if( IS_LOCK
b980: 5f 45 52 52 4f 52 28 72 63 29 20 29 7b 0a 20 20  _ERROR(rc) ){.  
b990: 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73        pFile->las
b9a0: 74 45 72 72 6e 6f 20 3d 20 74 45 72 72 6e 6f 3b  tErrno = tErrno;
b9b0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c  .      }.    }el
b9c0: 73 65 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d  se{.      pFile-
b9d0: 3e 6c 6f 63 6b 74 79 70 65 20 3d 20 53 48 41 52  >locktype = SHAR
b9e0: 45 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 70  ED_LOCK;.      p
b9f0: 46 69 6c 65 2d 3e 70 4f 70 65 6e 2d 3e 6e 4c 6f  File->pOpen->nLo
ba00: 63 6b 2b 2b 3b 0a 20 20 20 20 20 20 70 4c 6f 63  ck++;.      pLoc
ba10: 6b 2d 3e 63 6e 74 20 3d 20 31 3b 0a 20 20 20 20  k->cnt = 1;.    
ba20: 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 6c 6f  }.  }else if( lo
ba30: 63 6b 74 79 70 65 3d 3d 45 58 43 4c 55 53 49 56  cktype==EXCLUSIV
ba40: 45 5f 4c 4f 43 4b 20 26 26 20 70 4c 6f 63 6b 2d  E_LOCK && pLock-
ba50: 3e 63 6e 74 3e 31 20 29 7b 0a 20 20 20 20 2f 2a  >cnt>1 ){.    /*
ba60: 20 57 65 20 61 72 65 20 74 72 79 69 6e 67 20 66   We are trying f
ba70: 6f 72 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20  or an exclusive 
ba80: 6c 6f 63 6b 20 62 75 74 20 61 6e 6f 74 68 65 72  lock but another
ba90: 20 74 68 72 65 61 64 20 69 6e 20 74 68 69 73 0a   thread in this.
baa0: 20 20 20 20 2a 2a 20 73 61 6d 65 20 70 72 6f 63      ** same proc
bab0: 65 73 73 20 69 73 20 73 74 69 6c 6c 20 68 6f 6c  ess is still hol
bac0: 64 69 6e 67 20 61 20 73 68 61 72 65 64 20 6c 6f  ding a shared lo
bad0: 63 6b 2e 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20  ck. */.    rc = 
bae0: 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 7d  SQLITE_BUSY;.  }
baf0: 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54 68 65  else{.    /* The
bb00: 20 72 65 71 75 65 73 74 20 77 61 73 20 66 6f 72   request was for
bb10: 20 61 20 52 45 53 45 52 56 45 44 20 6f 72 20 45   a RESERVED or E
bb20: 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 20 20  XCLUSIVE lock.  
bb30: 49 74 20 69 73 0a 20 20 20 20 2a 2a 20 61 73 73  It is.    ** ass
bb40: 75 6d 65 64 20 74 68 61 74 20 74 68 65 72 65 20  umed that there 
bb50: 69 73 20 61 20 53 48 41 52 45 44 20 6f 72 20 67  is a SHARED or g
bb60: 72 65 61 74 65 72 20 6c 6f 63 6b 20 6f 6e 20 74  reater lock on t
bb70: 68 65 20 66 69 6c 65 0a 20 20 20 20 2a 2a 20 61  he file.    ** a
bb80: 6c 72 65 61 64 79 2e 0a 20 20 20 20 2a 2f 0a 20  lready..    */. 
bb90: 20 20 20 61 73 73 65 72 74 28 20 30 21 3d 70 46     assert( 0!=pF
bba0: 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 20 29 3b  ile->locktype );
bbb0: 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65  .    lock.l_type
bbc0: 20 3d 20 46 5f 57 52 4c 43 4b 3b 0a 20 20 20 20   = F_WRLCK;.    
bbd0: 73 77 69 74 63 68 28 20 6c 6f 63 6b 74 79 70 65  switch( locktype
bbe0: 20 29 7b 0a 20 20 20 20 20 20 63 61 73 65 20 52   ){.      case R
bbf0: 45 53 45 52 56 45 44 5f 4c 4f 43 4b 3a 0a 20 20  ESERVED_LOCK:.  
bc00: 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61        lock.l_sta
bc10: 72 74 20 3d 20 52 45 53 45 52 56 45 44 5f 42 59  rt = RESERVED_BY
bc20: 54 45 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61  TE;.        brea
bc30: 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 45 58  k;.      case EX
bc40: 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 3a 0a 20 20  CLUSIVE_LOCK:.  
bc50: 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61        lock.l_sta
bc60: 72 74 20 3d 20 53 48 41 52 45 44 5f 46 49 52 53  rt = SHARED_FIRS
bc70: 54 3b 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e  T;.        lock.
bc80: 6c 5f 6c 65 6e 20 3d 20 53 48 41 52 45 44 5f 53  l_len = SHARED_S
bc90: 49 5a 45 3b 0a 20 20 20 20 20 20 20 20 62 72 65  IZE;.        bre
bca0: 61 6b 3b 0a 20 20 20 20 20 20 64 65 66 61 75 6c  ak;.      defaul
bcb0: 74 3a 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  t:.        asser
bcc0: 74 28 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  t(0);.    }.    
bcd0: 73 20 3d 20 66 63 6e 74 6c 28 70 46 69 6c 65 2d  s = fcntl(pFile-
bce0: 3e 68 2c 20 46 5f 53 45 54 4c 4b 2c 20 26 6c 6f  >h, F_SETLK, &lo
bcf0: 63 6b 29 3b 0a 20 20 20 20 69 66 28 20 73 3d 3d  ck);.    if( s==
bd00: 28 2d 31 29 20 29 7b 0a 20 20 20 20 20 20 74 45  (-1) ){.      tE
bd10: 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20  rrno = errno;.  
bd20: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 45      rc = sqliteE
bd30: 72 72 6f 72 46 72 6f 6d 50 6f 73 69 78 45 72 72  rrorFromPosixErr
bd40: 6f 72 28 74 45 72 72 6e 6f 2c 20 53 51 4c 49 54  or(tErrno, SQLIT
bd50: 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b 29 3b 0a 20  E_IOERR_LOCK);. 
bd60: 20 20 20 20 20 69 66 28 20 49 53 5f 4c 4f 43 4b       if( IS_LOCK
bd70: 5f 45 52 52 4f 52 28 72 63 29 20 29 7b 0a 20 20  _ERROR(rc) ){.  
bd80: 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73        pFile->las
bd90: 74 45 72 72 6e 6f 20 3d 20 74 45 72 72 6e 6f 3b  tErrno = tErrno;
bda0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
bdb0: 20 7d 0a 20 20 0a 0a 23 69 66 6e 64 65 66 20 4e   }.  ..#ifndef N
bdc0: 44 45 42 55 47 0a 20 20 2f 2a 20 53 65 74 20 75  DEBUG.  /* Set u
bdd0: 70 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  p the transactio
bde0: 6e 2d 63 6f 75 6e 74 65 72 20 63 68 61 6e 67 65  n-counter change
bdf0: 20 63 68 65 63 6b 69 6e 67 20 66 6c 61 67 73 20   checking flags 
be00: 77 68 65 6e 0a 20 20 2a 2a 20 74 72 61 6e 73 69  when.  ** transi
be10: 74 69 6f 6e 69 6e 67 20 66 72 6f 6d 20 61 20 53  tioning from a S
be20: 48 41 52 45 44 20 74 6f 20 61 20 52 45 53 45 52  HARED to a RESER
be30: 56 45 44 20 6c 6f 63 6b 2e 20 20 54 68 65 20 63  VED lock.  The c
be40: 68 61 6e 67 65 0a 20 20 2a 2a 20 66 72 6f 6d 20  hange.  ** from 
be50: 53 48 41 52 45 44 20 74 6f 20 52 45 53 45 52 56  SHARED to RESERV
be60: 45 44 20 6d 61 72 6b 73 20 74 68 65 20 62 65 67  ED marks the beg
be70: 69 6e 6e 69 6e 67 20 6f 66 20 61 20 6e 6f 72 6d  inning of a norm
be80: 61 6c 0a 20 20 2a 2a 20 77 72 69 74 65 20 6f 70  al.  ** write op
be90: 65 72 61 74 69 6f 6e 20 28 6e 6f 74 20 61 20 68  eration (not a h
bea0: 6f 74 20 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62  ot journal rollb
beb0: 61 63 6b 29 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  ack)..  */.  if(
bec0: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 0a 20   rc==SQLITE_OK. 
bed0: 20 20 26 26 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b    && pFile->lock
bee0: 74 79 70 65 3c 3d 53 48 41 52 45 44 5f 4c 4f 43  type<=SHARED_LOC
bef0: 4b 0a 20 20 20 26 26 20 6c 6f 63 6b 74 79 70 65  K.   && locktype
bf00: 3d 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 0a  ==RESERVED_LOCK.
bf10: 20 20 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e    ){.    pFile->
bf20: 74 72 61 6e 73 43 6e 74 72 43 68 6e 67 20 3d 20  transCntrChng = 
bf30: 30 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 64 62  0;.    pFile->db
bf40: 55 70 64 61 74 65 20 3d 20 30 3b 0a 20 20 20 20  Update = 0;.    
bf50: 70 46 69 6c 65 2d 3e 69 6e 4e 6f 72 6d 61 6c 57  pFile->inNormalW
bf60: 72 69 74 65 20 3d 20 31 3b 0a 20 20 7d 0a 23 65  rite = 1;.  }.#e
bf70: 6e 64 69 66 0a 0a 0a 20 20 69 66 28 20 72 63 3d  ndif...  if( rc=
bf80: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
bf90: 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70    pFile->locktyp
bfa0: 65 20 3d 20 6c 6f 63 6b 74 79 70 65 3b 0a 20 20  e = locktype;.  
bfb0: 20 20 70 4c 6f 63 6b 2d 3e 6c 6f 63 6b 74 79 70    pLock->locktyp
bfc0: 65 20 3d 20 6c 6f 63 6b 74 79 70 65 3b 0a 20 20  e = locktype;.  
bfd0: 7d 65 6c 73 65 20 69 66 28 20 6c 6f 63 6b 74 79  }else if( lockty
bfe0: 70 65 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f  pe==EXCLUSIVE_LO
bff0: 43 4b 20 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d  CK ){.    pFile-
c000: 3e 6c 6f 63 6b 74 79 70 65 20 3d 20 50 45 4e 44  >locktype = PEND
c010: 49 4e 47 5f 4c 4f 43 4b 3b 0a 20 20 20 20 70 4c  ING_LOCK;.    pL
c020: 6f 63 6b 2d 3e 6c 6f 63 6b 74 79 70 65 20 3d 20  ock->locktype = 
c030: 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 3b 0a 20 20  PENDING_LOCK;.  
c040: 7d 0a 0a 65 6e 64 5f 6c 6f 63 6b 3a 0a 20 20 75  }..end_lock:.  u
c050: 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b  nixLeaveMutex();
c060: 0a 20 20 4f 53 54 52 41 43 45 34 28 22 4c 4f 43  .  OSTRACE4("LOC
c070: 4b 20 20 20 20 25 64 20 25 73 20 25 73 20 28 75  K    %d %s %s (u
c080: 6e 69 78 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e  nix)\n", pFile->
c090: 68 2c 20 6c 6f 63 6b 74 79 70 65 4e 61 6d 65 28  h, locktypeName(
c0a0: 6c 6f 63 6b 74 79 70 65 29 2c 20 0a 20 20 20 20  locktype), .    
c0b0: 20 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20    rc==SQLITE_OK 
c0c0: 3f 20 22 6f 6b 22 20 3a 20 22 66 61 69 6c 65 64  ? "ok" : "failed
c0d0: 22 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  ");.  return rc;
c0e0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20  .}../*.** Close 
c0f0: 61 6c 6c 20 66 69 6c 65 20 64 65 73 63 72 69 70  all file descrip
c100: 74 6f 72 73 20 61 63 63 75 6d 75 61 74 65 64 20  tors accumuated 
c110: 69 6e 20 74 68 65 20 75 6e 69 78 4f 70 65 6e 43  in the unixOpenC
c120: 6e 74 2d 3e 70 55 6e 75 73 65 64 20 6c 69 73 74  nt->pUnused list
c130: 2e 0a 2a 2a 20 49 66 20 61 6c 6c 20 73 75 63 68  ..** If all such
c140: 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
c150: 73 20 61 72 65 20 63 6c 6f 73 65 64 20 77 69 74  s are closed wit
c160: 68 6f 75 74 20 65 72 72 6f 72 2c 20 74 68 65 20  hout error, the 
c170: 6c 69 73 74 20 69 73 0a 2a 2a 20 63 6c 65 61 72  list is.** clear
c180: 65 64 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b  ed and SQLITE_OK
c190: 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a   returned..**.**
c1a0: 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20 61   Otherwise, if a
c1b0: 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20  n error occurs, 
c1c0: 74 68 65 6e 20 73 75 63 63 65 73 73 66 75 6c 6c  then successfull
c1d0: 79 20 63 6c 6f 73 65 64 20 66 69 6c 65 20 64 65  y closed file de
c1e0: 73 63 72 69 70 74 6f 72 0a 2a 2a 20 65 6e 74 72  scriptor.** entr
c1f0: 69 65 73 20 61 72 65 20 72 65 6d 6f 76 65 64 20  ies are removed 
c200: 66 72 6f 6d 20 74 68 65 20 6c 69 73 74 2c 20 61  from the list, a
c210: 6e 64 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  nd SQLITE_IOERR_
c220: 43 4c 4f 53 45 20 72 65 74 75 72 6e 65 64 2e 20  CLOSE returned. 
c230: 0a 2a 2a 20 6e 6f 74 20 64 65 6c 65 74 65 64 20  .** not deleted 
c240: 61 6e 64 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  and SQLITE_IOERR
c250: 5f 43 4c 4f 53 45 20 72 65 74 75 72 6e 65 64 2e  _CLOSE returned.
c260: 0a 2a 2f 20 0a 73 74 61 74 69 63 20 69 6e 74 20  .*/ .static int 
c270: 63 6c 6f 73 65 50 65 6e 64 69 6e 67 46 64 73 28  closePendingFds(
c280: 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 29  unixFile *pFile)
c290: 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
c2a0: 49 54 45 5f 4f 4b 3b 0a 20 20 73 74 72 75 63 74  ITE_OK;.  struct
c2b0: 20 75 6e 69 78 4f 70 65 6e 43 6e 74 20 2a 70 4f   unixOpenCnt *pO
c2c0: 70 65 6e 20 3d 20 70 46 69 6c 65 2d 3e 70 4f 70  pen = pFile->pOp
c2d0: 65 6e 3b 0a 20 20 55 6e 69 78 55 6e 75 73 65 64  en;.  UnixUnused
c2e0: 46 64 20 2a 70 45 72 72 6f 72 20 3d 20 30 3b 0a  Fd *pError = 0;.
c2f0: 20 20 55 6e 69 78 55 6e 75 73 65 64 46 64 20 2a    UnixUnusedFd *
c300: 70 3b 0a 20 20 55 6e 69 78 55 6e 75 73 65 64 46  p;.  UnixUnusedF
c310: 64 20 2a 70 4e 65 78 74 3b 0a 20 20 66 6f 72 28  d *pNext;.  for(
c320: 70 3d 70 4f 70 65 6e 2d 3e 70 55 6e 75 73 65 64  p=pOpen->pUnused
c330: 3b 20 70 3b 20 70 3d 70 4e 65 78 74 29 7b 0a 20  ; p; p=pNext){. 
c340: 20 20 20 70 4e 65 78 74 20 3d 20 70 2d 3e 70 4e     pNext = p->pN
c350: 65 78 74 3b 0a 20 20 20 20 69 66 28 20 63 6c 6f  ext;.    if( clo
c360: 73 65 28 70 2d 3e 66 64 29 20 29 7b 0a 20 20 20  se(p->fd) ){.   
c370: 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72     pFile->lastEr
c380: 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20  rno = errno;.   
c390: 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49     rc = SQLITE_I
c3a0: 4f 45 52 52 5f 43 4c 4f 53 45 3b 0a 20 20 20 20  OERR_CLOSE;.    
c3b0: 20 20 70 2d 3e 70 4e 65 78 74 20 3d 20 70 45 72    p->pNext = pEr
c3c0: 72 6f 72 3b 0a 20 20 20 20 20 20 70 45 72 72 6f  ror;.      pErro
c3d0: 72 20 3d 20 70 3b 0a 20 20 20 20 7d 65 6c 73 65  r = p;.    }else
c3e0: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  {.      sqlite3_
c3f0: 66 72 65 65 28 70 29 3b 0a 20 20 20 20 7d 0a 20  free(p);.    }. 
c400: 20 7d 0a 20 20 70 4f 70 65 6e 2d 3e 70 55 6e 75   }.  pOpen->pUnu
c410: 73 65 64 20 3d 20 70 45 72 72 6f 72 3b 0a 20 20  sed = pError;.  
c420: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
c430: 0a 2a 2a 20 41 64 64 20 74 68 65 20 66 69 6c 65  .** Add the file
c440: 20 64 65 73 63 72 69 70 74 6f 72 20 75 73 65 64   descriptor used
c450: 20 62 79 20 66 69 6c 65 20 68 61 6e 64 6c 65 20   by file handle 
c460: 70 46 69 6c 65 20 74 6f 20 74 68 65 20 63 6f 72  pFile to the cor
c470: 72 65 73 70 6f 6e 64 69 6e 67 0a 2a 2a 20 70 55  responding.** pU
c480: 6e 75 73 65 64 20 6c 69 73 74 2e 0a 2a 2f 0a 73  nused list..*/.s
c490: 74 61 74 69 63 20 76 6f 69 64 20 73 65 74 50 65  tatic void setPe
c4a0: 6e 64 69 6e 67 46 64 28 75 6e 69 78 46 69 6c 65  ndingFd(unixFile
c4b0: 20 2a 70 46 69 6c 65 29 7b 0a 20 20 73 74 72 75   *pFile){.  stru
c4c0: 63 74 20 75 6e 69 78 4f 70 65 6e 43 6e 74 20 2a  ct unixOpenCnt *
c4d0: 70 4f 70 65 6e 20 3d 20 70 46 69 6c 65 2d 3e 70  pOpen = pFile->p
c4e0: 4f 70 65 6e 3b 0a 20 20 55 6e 69 78 55 6e 75 73  Open;.  UnixUnus
c4f0: 65 64 46 64 20 2a 70 20 3d 20 70 46 69 6c 65 2d  edFd *p = pFile-
c500: 3e 70 55 6e 75 73 65 64 3b 0a 20 20 70 2d 3e 70  >pUnused;.  p->p
c510: 4e 65 78 74 20 3d 20 70 4f 70 65 6e 2d 3e 70 55  Next = pOpen->pU
c520: 6e 75 73 65 64 3b 0a 20 20 70 4f 70 65 6e 2d 3e  nused;.  pOpen->
c530: 70 55 6e 75 73 65 64 20 3d 20 70 3b 0a 20 20 70  pUnused = p;.  p
c540: 46 69 6c 65 2d 3e 68 20 3d 20 2d 31 3b 0a 20 20  File->h = -1;.  
c550: 70 46 69 6c 65 2d 3e 70 55 6e 75 73 65 64 20 3d  pFile->pUnused =
c560: 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 77   0;.}../*.** Low
c570: 65 72 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c  er the locking l
c580: 65 76 65 6c 20 6f 6e 20 66 69 6c 65 20 64 65 73  evel on file des
c590: 63 72 69 70 74 6f 72 20 70 46 69 6c 65 20 74 6f  criptor pFile to
c5a0: 20 6c 6f 63 6b 74 79 70 65 2e 20 20 6c 6f 63 6b   locktype.  lock
c5b0: 74 79 70 65 0a 2a 2a 20 6d 75 73 74 20 62 65 20  type.** must be 
c5c0: 65 69 74 68 65 72 20 4e 4f 5f 4c 4f 43 4b 20 6f  either NO_LOCK o
c5d0: 72 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2e 0a 2a  r SHARED_LOCK..*
c5e0: 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6c 6f 63 6b  *.** If the lock
c5f0: 69 6e 67 20 6c 65 76 65 6c 20 6f 66 20 74 68 65  ing level of the
c600: 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
c610: 20 69 73 20 61 6c 72 65 61 64 79 20 61 74 20 6f   is already at o
c620: 72 20 62 65 6c 6f 77 0a 2a 2a 20 74 68 65 20 72  r below.** the r
c630: 65 71 75 65 73 74 65 64 20 6c 6f 63 6b 69 6e 67  equested locking
c640: 20 6c 65 76 65 6c 2c 20 74 68 69 73 20 72 6f 75   level, this rou
c650: 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e  tine is a no-op.
c660: 0a 2a 2a 20 0a 2a 2a 20 49 66 20 68 61 6e 64 6c  .** .** If handl
c670: 65 4e 46 53 55 6e 6c 6f 63 6b 20 69 73 20 74 72  eNFSUnlock is tr
c680: 75 65 2c 20 74 68 65 6e 20 6f 6e 20 64 6f 77 6e  ue, then on down
c690: 67 72 61 64 69 6e 67 20 61 6e 20 45 58 43 4c 55  grading an EXCLU
c6a0: 53 49 56 45 5f 4c 4f 43 4b 20 74 6f 20 53 48 41  SIVE_LOCK to SHA
c6b0: 52 45 44 0a 2a 2a 20 74 68 65 20 62 79 74 65 20  RED.** the byte 
c6c0: 72 61 6e 67 65 20 69 73 20 64 69 76 69 64 65 64  range is divided
c6d0: 20 69 6e 74 6f 20 32 20 70 61 72 74 73 20 61 6e   into 2 parts an
c6e0: 64 20 74 68 65 20 66 69 72 73 74 20 70 61 72 74  d the first part
c6f0: 20 69 73 20 75 6e 6c 6f 63 6b 65 64 20 74 68 65   is unlocked the
c700: 6e 0a 2a 2a 20 73 65 74 20 74 6f 20 61 20 72 65  n.** set to a re
c710: 61 64 20 6c 6f 63 6b 2c 20 74 68 65 6e 20 74 68  ad lock, then th
c720: 65 20 6f 74 68 65 72 20 70 61 72 74 20 69 73 20  e other part is 
c730: 73 69 6d 70 6c 79 20 75 6e 6c 6f 63 6b 65 64 2e  simply unlocked.
c740: 20 20 54 68 69 73 20 77 6f 72 6b 73 20 0a 2a 2a    This works .**
c750: 20 61 72 6f 75 6e 64 20 61 20 62 75 67 20 69 6e   around a bug in
c760: 20 42 53 44 20 4e 46 53 20 6c 6f 63 6b 64 20 28   BSD NFS lockd (
c770: 61 6c 73 6f 20 73 65 65 6e 20 6f 6e 20 4d 61 63  also seen on Mac
c780: 4f 53 58 20 31 30 2e 33 2b 29 20 74 68 61 74 20  OSX 10.3+) that 
c790: 66 61 69 6c 73 20 74 6f 20 0a 2a 2a 20 72 65 6d  fails to .** rem
c7a0: 6f 76 65 20 74 68 65 20 77 72 69 74 65 20 6c 6f  ove the write lo
c7b0: 63 6b 20 6f 6e 20 61 20 72 65 67 69 6f 6e 20 77  ck on a region w
c7c0: 68 65 6e 20 61 20 72 65 61 64 20 6c 6f 63 6b 20  hen a read lock 
c7d0: 69 73 20 73 65 74 2e 0a 2a 2f 0a 73 74 61 74 69  is set..*/.stati
c7e0: 63 20 69 6e 74 20 5f 70 6f 73 69 78 55 6e 6c 6f  c int _posixUnlo
c7f0: 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  ck(sqlite3_file 
c800: 2a 69 64 2c 20 69 6e 74 20 6c 6f 63 6b 74 79 70  *id, int locktyp
c810: 65 2c 20 69 6e 74 20 68 61 6e 64 6c 65 4e 46 53  e, int handleNFS
c820: 55 6e 6c 6f 63 6b 29 7b 0a 20 20 75 6e 69 78 46  Unlock){.  unixF
c830: 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e  ile *pFile = (un
c840: 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 73 74  ixFile*)id;.  st
c850: 72 75 63 74 20 75 6e 69 78 4c 6f 63 6b 49 6e 66  ruct unixLockInf
c860: 6f 20 2a 70 4c 6f 63 6b 3b 0a 20 20 73 74 72 75  o *pLock;.  stru
c870: 63 74 20 66 6c 6f 63 6b 20 6c 6f 63 6b 3b 0a 20  ct flock lock;. 
c880: 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
c890: 5f 4f 4b 3b 0a 20 20 69 6e 74 20 68 3b 0a 20 20  _OK;.  int h;.  
c8a0: 69 6e 74 20 74 45 72 72 6e 6f 3b 20 20 20 20 20  int tErrno;     
c8b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c8c0: 20 2f 2a 20 45 72 72 6f 72 20 63 6f 64 65 20 66   /* Error code f
c8d0: 72 6f 6d 20 73 79 73 74 65 6d 20 63 61 6c 6c 20  rom system call 
c8e0: 65 72 72 6f 72 73 20 2a 2f 0a 0a 20 20 61 73 73  errors */..  ass
c8f0: 65 72 74 28 20 70 46 69 6c 65 20 29 3b 0a 20 20  ert( pFile );.  
c900: 4f 53 54 52 41 43 45 37 28 22 55 4e 4c 4f 43 4b  OSTRACE7("UNLOCK
c910: 20 20 25 64 20 25 64 20 77 61 73 20 25 64 28 25    %d %d was %d(%
c920: 64 2c 25 64 29 20 70 69 64 3d 25 64 20 28 75 6e  d,%d) pid=%d (un
c930: 69 78 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68  ix)\n", pFile->h
c940: 2c 20 6c 6f 63 6b 74 79 70 65 2c 0a 20 20 20 20  , locktype,.    
c950: 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70    pFile->locktyp
c960: 65 2c 20 70 46 69 6c 65 2d 3e 70 4c 6f 63 6b 2d  e, pFile->pLock-
c970: 3e 6c 6f 63 6b 74 79 70 65 2c 20 70 46 69 6c 65  >locktype, pFile
c980: 2d 3e 70 4c 6f 63 6b 2d 3e 63 6e 74 2c 20 67 65  ->pLock->cnt, ge
c990: 74 70 69 64 28 29 29 3b 0a 0a 20 20 61 73 73 65  tpid());..  asse
c9a0: 72 74 28 20 6c 6f 63 6b 74 79 70 65 3c 3d 53 48  rt( locktype<=SH
c9b0: 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 69  ARED_LOCK );.  i
c9c0: 66 28 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79  f( pFile->lockty
c9d0: 70 65 3c 3d 6c 6f 63 6b 74 79 70 65 20 29 7b 0a  pe<=locktype ){.
c9e0: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
c9f0: 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 69 66 28 20  E_OK;.  }.  if( 
ca00: 43 48 45 43 4b 5f 54 48 52 45 41 44 49 44 28 70  CHECK_THREADID(p
ca10: 46 69 6c 65 29 20 29 7b 0a 20 20 20 20 72 65 74  File) ){.    ret
ca20: 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55 53  urn SQLITE_MISUS
ca30: 45 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 75 6e  E_BKPT;.  }.  un
ca40: 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a  ixEnterMutex();.
ca50: 20 20 68 20 3d 20 70 46 69 6c 65 2d 3e 68 3b 0a    h = pFile->h;.
ca60: 20 20 70 4c 6f 63 6b 20 3d 20 70 46 69 6c 65 2d    pLock = pFile-
ca70: 3e 70 4c 6f 63 6b 3b 0a 20 20 61 73 73 65 72 74  >pLock;.  assert
ca80: 28 20 70 4c 6f 63 6b 2d 3e 63 6e 74 21 3d 30 20  ( pLock->cnt!=0 
ca90: 29 3b 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e  );.  if( pFile->
caa0: 6c 6f 63 6b 74 79 70 65 3e 53 48 41 52 45 44 5f  locktype>SHARED_
cab0: 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 61 73 73 65  LOCK ){.    asse
cac0: 72 74 28 20 70 4c 6f 63 6b 2d 3e 6c 6f 63 6b 74  rt( pLock->lockt
cad0: 79 70 65 3d 3d 70 46 69 6c 65 2d 3e 6c 6f 63 6b  ype==pFile->lock
cae0: 74 79 70 65 20 29 3b 0a 20 20 20 20 53 69 6d 75  type );.    Simu
caf0: 6c 61 74 65 49 4f 45 72 72 6f 72 42 65 6e 69 67  lateIOErrorBenig
cb00: 6e 28 31 29 3b 0a 20 20 20 20 53 69 6d 75 6c 61  n(1);.    Simula
cb10: 74 65 49 4f 45 72 72 6f 72 28 20 68 3d 28 2d 31  teIOError( h=(-1
cb20: 29 20 29 0a 20 20 20 20 53 69 6d 75 6c 61 74 65  ) ).    Simulate
cb30: 49 4f 45 72 72 6f 72 42 65 6e 69 67 6e 28 30 29  IOErrorBenign(0)
cb40: 3b 0a 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55  ;..#ifndef NDEBU
cb50: 47 0a 20 20 20 20 2f 2a 20 57 68 65 6e 20 72 65  G.    /* When re
cb60: 64 75 63 69 6e 67 20 61 20 6c 6f 63 6b 20 73 75  ducing a lock su
cb70: 63 68 20 74 68 61 74 20 6f 74 68 65 72 20 70 72  ch that other pr
cb80: 6f 63 65 73 73 65 73 20 63 61 6e 20 73 74 61 72  ocesses can star
cb90: 74 0a 20 20 20 20 2a 2a 20 72 65 61 64 69 6e 67  t.    ** reading
cba0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
cbb0: 6c 65 20 61 67 61 69 6e 2c 20 6d 61 6b 65 20 73  le again, make s
cbc0: 75 72 65 20 74 68 61 74 20 74 68 65 0a 20 20 20  ure that the.   
cbd0: 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20   ** transaction 
cbe0: 63 6f 75 6e 74 65 72 20 77 61 73 20 75 70 64 61  counter was upda
cbf0: 74 65 64 20 69 66 20 61 6e 79 20 70 61 72 74 20  ted if any part 
cc00: 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 0a  of the database.
cc10: 20 20 20 20 2a 2a 20 66 69 6c 65 20 63 68 61 6e      ** file chan
cc20: 67 65 64 2e 20 20 49 66 20 74 68 65 20 74 72 61  ged.  If the tra
cc30: 6e 73 61 63 74 69 6f 6e 20 63 6f 75 6e 74 65 72  nsaction counter
cc40: 20 69 73 20 6e 6f 74 20 75 70 64 61 74 65 64 2c   is not updated,
cc50: 0a 20 20 20 20 2a 2a 20 6f 74 68 65 72 20 63 6f  .    ** other co
cc60: 6e 6e 65 63 74 69 6f 6e 73 20 74 6f 20 74 68 65  nnections to the
cc70: 20 73 61 6d 65 20 66 69 6c 65 20 6d 69 67 68 74   same file might
cc80: 20 6e 6f 74 20 72 65 61 6c 69 7a 65 20 74 68 61   not realize tha
cc90: 74 0a 20 20 20 20 2a 2a 20 74 68 65 20 66 69 6c  t.    ** the fil
cca0: 65 20 68 61 73 20 63 68 61 6e 67 65 64 20 61 6e  e has changed an
ccb0: 64 20 68 65 6e 63 65 20 6d 69 67 68 74 20 6e 6f  d hence might no
ccc0: 74 20 6b 6e 6f 77 20 74 6f 20 66 6c 75 73 68 20  t know to flush 
ccd0: 74 68 65 69 72 0a 20 20 20 20 2a 2a 20 63 61 63  their.    ** cac
cce0: 68 65 2e 20 20 54 68 65 20 75 73 65 20 6f 66 20  he.  The use of 
ccf0: 61 20 73 74 61 6c 65 20 63 61 63 68 65 20 63 61  a stale cache ca
cd00: 6e 20 6c 65 61 64 20 74 6f 20 64 61 74 61 62 61  n lead to databa
cd10: 73 65 20 63 6f 72 72 75 70 74 69 6f 6e 2e 0a 20  se corruption.. 
cd20: 20 20 20 2a 2f 0a 23 69 66 20 30 0a 20 20 20 20     */.#if 0.    
cd30: 61 73 73 65 72 74 28 20 70 46 69 6c 65 2d 3e 69  assert( pFile->i
cd40: 6e 4e 6f 72 6d 61 6c 57 72 69 74 65 3d 3d 30 0a  nNormalWrite==0.
cd50: 20 20 20 20 20 20 20 20 20 7c 7c 20 70 46 69 6c           || pFil
cd60: 65 2d 3e 64 62 55 70 64 61 74 65 3d 3d 30 0a 20  e->dbUpdate==0. 
cd70: 20 20 20 20 20 20 20 20 7c 7c 20 70 46 69 6c 65          || pFile
cd80: 2d 3e 74 72 61 6e 73 43 6e 74 72 43 68 6e 67 3d  ->transCntrChng=
cd90: 3d 31 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20  =1 );.#endif.   
cda0: 20 70 46 69 6c 65 2d 3e 69 6e 4e 6f 72 6d 61 6c   pFile->inNormal
cdb0: 57 72 69 74 65 20 3d 20 30 3b 0a 23 65 6e 64 69  Write = 0;.#endi
cdc0: 66 0a 0a 20 20 20 20 2f 2a 20 64 6f 77 6e 67 72  f..    /* downgr
cdd0: 61 64 69 6e 67 20 74 6f 20 61 20 73 68 61 72 65  ading to a share
cde0: 64 20 6c 6f 63 6b 20 6f 6e 20 4e 46 53 20 69 6e  d lock on NFS in
cdf0: 76 6f 6c 76 65 73 20 63 6c 65 61 72 69 6e 67 20  volves clearing 
ce00: 74 68 65 20 77 72 69 74 65 20 6c 6f 63 6b 0a 20  the write lock. 
ce10: 20 20 20 2a 2a 20 62 65 66 6f 72 65 20 65 73 74     ** before est
ce20: 61 62 6c 69 73 68 69 6e 67 20 74 68 65 20 72 65  ablishing the re
ce30: 61 64 6c 6f 63 6b 20 2d 20 74 6f 20 61 76 6f 69  adlock - to avoi
ce40: 64 20 61 20 72 61 63 65 20 63 6f 6e 64 69 74 69  d a race conditi
ce50: 6f 6e 20 77 65 20 64 6f 77 6e 67 72 61 64 65 0a  on we downgrade.
ce60: 20 20 20 20 2a 2a 20 74 68 65 20 6c 6f 63 6b 20      ** the lock 
ce70: 69 6e 20 32 20 62 6c 6f 63 6b 73 2c 20 73 6f 20  in 2 blocks, so 
ce80: 74 68 61 74 20 70 61 72 74 20 6f 66 20 74 68 65  that part of the
ce90: 20 72 61 6e 67 65 20 77 69 6c 6c 20 62 65 20 63   range will be c
cea0: 6f 76 65 72 65 64 20 62 79 20 61 20 0a 20 20 20  overed by a .   
ceb0: 20 2a 2a 20 77 72 69 74 65 20 6c 6f 63 6b 20 75   ** write lock u
cec0: 6e 74 69 6c 20 74 68 65 20 72 65 73 74 20 69 73  ntil the rest is
ced0: 20 63 6f 76 65 72 65 64 20 62 79 20 61 20 72 65   covered by a re
cee0: 61 64 20 6c 6f 63 6b 3a 0a 20 20 20 20 2a 2a 20  ad lock:.    ** 
cef0: 20 31 3a 20 20 20 5b 57 57 57 57 57 5d 0a 20 20   1:   [WWWWW].  
cf00: 20 20 2a 2a 20 20 32 3a 20 20 20 5b 2e 2e 2e 2e    **  2:   [....
cf10: 57 5d 0a 20 20 20 20 2a 2a 20 20 33 3a 20 20 20  W].    **  3:   
cf20: 5b 52 52 52 52 57 5d 0a 20 20 20 20 2a 2a 20 20  [RRRRW].    **  
cf30: 34 3a 20 20 20 5b 52 52 52 52 2e 5d 0a 20 20 20  4:   [RRRR.].   
cf40: 20 2a 2f 0a 20 20 20 20 69 66 28 20 6c 6f 63 6b   */.    if( lock
cf50: 74 79 70 65 3d 3d 53 48 41 52 45 44 5f 4c 4f 43  type==SHARED_LOC
cf60: 4b 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 68  K ){.      if( h
cf70: 61 6e 64 6c 65 4e 46 53 55 6e 6c 6f 63 6b 20 29  andleNFSUnlock )
cf80: 7b 0a 20 20 20 20 20 20 20 20 6f 66 66 5f 74 20  {.        off_t 
cf90: 64 69 76 53 69 7a 65 20 3d 20 53 48 41 52 45 44  divSize = SHARED
cfa0: 5f 53 49 5a 45 20 2d 20 31 3b 0a 20 20 20 20 20  _SIZE - 1;.     
cfb0: 20 20 20 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b     .        lock
cfc0: 2e 6c 5f 74 79 70 65 20 3d 20 46 5f 55 4e 4c 43  .l_type = F_UNLC
cfd0: 4b 3b 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e  K;.        lock.
cfe0: 6c 5f 77 68 65 6e 63 65 20 3d 20 53 45 45 4b 5f  l_whence = SEEK_
cff0: 53 45 54 3b 0a 20 20 20 20 20 20 20 20 6c 6f 63  SET;.        loc
d000: 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 53 48 41 52  k.l_start = SHAR
d010: 45 44 5f 46 49 52 53 54 3b 0a 20 20 20 20 20 20  ED_FIRST;.      
d020: 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 64    lock.l_len = d
d030: 69 76 53 69 7a 65 3b 0a 20 20 20 20 20 20 20 20  ivSize;.        
d040: 69 66 28 20 66 63 6e 74 6c 28 68 2c 20 46 5f 53  if( fcntl(h, F_S
d050: 45 54 4c 4b 2c 20 26 6c 6f 63 6b 29 3d 3d 28 2d  ETLK, &lock)==(-
d060: 31 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  1) ){.          
d070: 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a  tErrno = errno;.
d080: 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73            rc = s
d090: 71 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d 50 6f  qliteErrorFromPo
d0a0: 73 69 78 45 72 72 6f 72 28 74 45 72 72 6e 6f 2c  sixError(tErrno,
d0b0: 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55 4e   SQLITE_IOERR_UN
d0c0: 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 20 20 20  LOCK);.         
d0d0: 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52   if( IS_LOCK_ERR
d0e0: 4f 52 28 72 63 29 20 29 7b 0a 20 20 20 20 20 20  OR(rc) ){.      
d0f0: 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73        pFile->las
d100: 74 45 72 72 6e 6f 20 3d 20 74 45 72 72 6e 6f 3b  tErrno = tErrno;
d110: 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
d120: 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f         goto end_
d130: 75 6e 6c 6f 63 6b 3b 0a 20 20 20 20 20 20 20 20  unlock;.        
d140: 7d 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e 6c  }.        lock.l
d150: 5f 74 79 70 65 20 3d 20 46 5f 52 44 4c 43 4b 3b  _type = F_RDLCK;
d160: 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f  .        lock.l_
d170: 77 68 65 6e 63 65 20 3d 20 53 45 45 4b 5f 53 45  whence = SEEK_SE
d180: 54 3b 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e  T;.        lock.
d190: 6c 5f 73 74 61 72 74 20 3d 20 53 48 41 52 45 44  l_start = SHARED
d1a0: 5f 46 49 52 53 54 3b 0a 20 20 20 20 20 20 20 20  _FIRST;.        
d1b0: 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 64 69 76  lock.l_len = div
d1c0: 53 69 7a 65 3b 0a 20 20 20 20 20 20 20 20 69 66  Size;.        if
d1d0: 28 20 66 63 6e 74 6c 28 68 2c 20 46 5f 53 45 54  ( fcntl(h, F_SET
d1e0: 4c 4b 2c 20 26 6c 6f 63 6b 29 3d 3d 28 2d 31 29  LK, &lock)==(-1)
d1f0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 74 45   ){.          tE
d200: 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20  rrno = errno;.  
d210: 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
d220: 69 74 65 45 72 72 6f 72 46 72 6f 6d 50 6f 73 69  iteErrorFromPosi
d230: 78 45 72 72 6f 72 28 74 45 72 72 6e 6f 2c 20 53  xError(tErrno, S
d240: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 52 44 4c 4f  QLITE_IOERR_RDLO
d250: 43 4b 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  CK);.          i
d260: 66 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52  f( IS_LOCK_ERROR
d270: 28 72 63 29 20 29 7b 0a 20 20 20 20 20 20 20 20  (rc) ){.        
d280: 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45      pFile->lastE
d290: 72 72 6e 6f 20 3d 20 74 45 72 72 6e 6f 3b 0a 20  rrno = tErrno;. 
d2a0: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
d2b0: 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 75 6e       goto end_un
d2c0: 6c 6f 63 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a  lock;.        }.
d2d0: 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74          lock.l_t
d2e0: 79 70 65 20 3d 20 46 5f 55 4e 4c 43 4b 3b 0a 20  ype = F_UNLCK;. 
d2f0: 20 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 77 68         lock.l_wh
d300: 65 6e 63 65 20 3d 20 53 45 45 4b 5f 53 45 54 3b  ence = SEEK_SET;
d310: 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f  .        lock.l_
d320: 73 74 61 72 74 20 3d 20 53 48 41 52 45 44 5f 46  start = SHARED_F
d330: 49 52 53 54 2b 64 69 76 53 69 7a 65 3b 0a 20 20  IRST+divSize;.  
d340: 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e        lock.l_len
d350: 20 3d 20 53 48 41 52 45 44 5f 53 49 5a 45 2d 64   = SHARED_SIZE-d
d360: 69 76 53 69 7a 65 3b 0a 20 20 20 20 20 20 20 20  ivSize;.        
d370: 69 66 28 20 66 63 6e 74 6c 28 68 2c 20 46 5f 53  if( fcntl(h, F_S
d380: 45 54 4c 4b 2c 20 26 6c 6f 63 6b 29 3d 3d 28 2d  ETLK, &lock)==(-
d390: 31 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  1) ){.          
d3a0: 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a  tErrno = errno;.
d3b0: 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73            rc = s
d3c0: 71 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d 50 6f  qliteErrorFromPo
d3d0: 73 69 78 45 72 72 6f 72 28 74 45 72 72 6e 6f 2c  sixError(tErrno,
d3e0: 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55 4e   SQLITE_IOERR_UN
d3f0: 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 20 20 20  LOCK);.         
d400: 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52   if( IS_LOCK_ERR
d410: 4f 52 28 72 63 29 20 29 7b 0a 20 20 20 20 20 20  OR(rc) ){.      
d420: 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73        pFile->las
d430: 74 45 72 72 6e 6f 20 3d 20 74 45 72 72 6e 6f 3b  tErrno = tErrno;
d440: 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
d450: 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f         goto end_
d460: 75 6e 6c 6f 63 6b 3b 0a 20 20 20 20 20 20 20 20  unlock;.        
d470: 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  }.      }else{. 
d480: 20 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74 79         lock.l_ty
d490: 70 65 20 3d 20 46 5f 52 44 4c 43 4b 3b 0a 20 20  pe = F_RDLCK;.  
d4a0: 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 77 68 65        lock.l_whe
d4b0: 6e 63 65 20 3d 20 53 45 45 4b 5f 53 45 54 3b 0a  nce = SEEK_SET;.
d4c0: 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73          lock.l_s
d4d0: 74 61 72 74 20 3d 20 53 48 41 52 45 44 5f 46 49  tart = SHARED_FI
d4e0: 52 53 54 3b 0a 20 20 20 20 20 20 20 20 6c 6f 63  RST;.        loc
d4f0: 6b 2e 6c 5f 6c 65 6e 20 3d 20 53 48 41 52 45 44  k.l_len = SHARED
d500: 5f 53 49 5a 45 3b 0a 20 20 20 20 20 20 20 20 69  _SIZE;.        i
d510: 66 28 20 66 63 6e 74 6c 28 68 2c 20 46 5f 53 45  f( fcntl(h, F_SE
d520: 54 4c 4b 2c 20 26 6c 6f 63 6b 29 3d 3d 28 2d 31  TLK, &lock)==(-1
d530: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 74  ) ){.          t
d540: 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20  Errno = errno;. 
d550: 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71           rc = sq
d560: 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d 50 6f 73  liteErrorFromPos
d570: 69 78 45 72 72 6f 72 28 74 45 72 72 6e 6f 2c 20  ixError(tErrno, 
d580: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 52 44 4c  SQLITE_IOERR_RDL
d590: 4f 43 4b 29 3b 0a 20 20 20 20 20 20 20 20 20 20  OCK);.          
d5a0: 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f  if( IS_LOCK_ERRO
d5b0: 52 28 72 63 29 20 29 7b 0a 20 20 20 20 20 20 20  R(rc) ){.       
d5c0: 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74       pFile->last
d5d0: 45 72 72 6e 6f 20 3d 20 74 45 72 72 6e 6f 3b 0a  Errno = tErrno;.
d5e0: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
d5f0: 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 75        goto end_u
d600: 6e 6c 6f 63 6b 3b 0a 20 20 20 20 20 20 20 20 7d  nlock;.        }
d610: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
d620: 20 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d     lock.l_type =
d630: 20 46 5f 55 4e 4c 43 4b 3b 0a 20 20 20 20 6c 6f   F_UNLCK;.    lo
d640: 63 6b 2e 6c 5f 77 68 65 6e 63 65 20 3d 20 53 45  ck.l_whence = SE
d650: 45 4b 5f 53 45 54 3b 0a 20 20 20 20 6c 6f 63 6b  EK_SET;.    lock
d660: 2e 6c 5f 73 74 61 72 74 20 3d 20 50 45 4e 44 49  .l_start = PENDI
d670: 4e 47 5f 42 59 54 45 3b 0a 20 20 20 20 6c 6f 63  NG_BYTE;.    loc
d680: 6b 2e 6c 5f 6c 65 6e 20 3d 20 32 4c 3b 20 20 61  k.l_len = 2L;  a
d690: 73 73 65 72 74 28 20 50 45 4e 44 49 4e 47 5f 42  ssert( PENDING_B
d6a0: 59 54 45 2b 31 3d 3d 52 45 53 45 52 56 45 44 5f  YTE+1==RESERVED_
d6b0: 42 59 54 45 20 29 3b 0a 20 20 20 20 69 66 28 20  BYTE );.    if( 
d6c0: 66 63 6e 74 6c 28 68 2c 20 46 5f 53 45 54 4c 4b  fcntl(h, F_SETLK
d6d0: 2c 20 26 6c 6f 63 6b 29 21 3d 28 2d 31 29 20 29  , &lock)!=(-1) )
d6e0: 7b 0a 20 20 20 20 20 20 70 4c 6f 63 6b 2d 3e 6c  {.      pLock->l
d6f0: 6f 63 6b 74 79 70 65 20 3d 20 53 48 41 52 45 44  ocktype = SHARED
d700: 5f 4c 4f 43 4b 3b 0a 20 20 20 20 7d 65 6c 73 65  _LOCK;.    }else
d710: 7b 0a 20 20 20 20 20 20 74 45 72 72 6e 6f 20 3d  {.      tErrno =
d720: 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20 72 63   errno;.      rc
d730: 20 3d 20 73 71 6c 69 74 65 45 72 72 6f 72 46 72   = sqliteErrorFr
d740: 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28 74 45 72  omPosixError(tEr
d750: 72 6e 6f 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52  rno, SQLITE_IOER
d760: 52 5f 55 4e 4c 4f 43 4b 29 3b 0a 20 20 20 20 20  R_UNLOCK);.     
d770: 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52   if( IS_LOCK_ERR
d780: 4f 52 28 72 63 29 20 29 7b 0a 20 20 20 20 20 20  OR(rc) ){.      
d790: 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72    pFile->lastErr
d7a0: 6e 6f 20 3d 20 74 45 72 72 6e 6f 3b 0a 20 20 20  no = tErrno;.   
d7b0: 20 20 20 7d 0a 20 20 20 20 20 20 67 6f 74 6f 20     }.      goto 
d7c0: 65 6e 64 5f 75 6e 6c 6f 63 6b 3b 0a 20 20 20 20  end_unlock;.    
d7d0: 7d 0a 20 20 7d 0a 20 20 69 66 28 20 6c 6f 63 6b  }.  }.  if( lock
d7e0: 74 79 70 65 3d 3d 4e 4f 5f 4c 4f 43 4b 20 29 7b  type==NO_LOCK ){
d7f0: 0a 20 20 20 20 73 74 72 75 63 74 20 75 6e 69 78  .    struct unix
d800: 4f 70 65 6e 43 6e 74 20 2a 70 4f 70 65 6e 3b 0a  OpenCnt *pOpen;.
d810: 0a 20 20 20 20 2f 2a 20 44 65 63 72 65 6d 65 6e  .    /* Decremen
d820: 74 20 74 68 65 20 73 68 61 72 65 64 20 6c 6f 63  t the shared loc
d830: 6b 20 63 6f 75 6e 74 65 72 2e 20 20 52 65 6c 65  k counter.  Rele
d840: 61 73 65 20 74 68 65 20 6c 6f 63 6b 20 75 73 69  ase the lock usi
d850: 6e 67 20 61 6e 0a 20 20 20 20 2a 2a 20 4f 53 20  ng an.    ** OS 
d860: 63 61 6c 6c 20 6f 6e 6c 79 20 77 68 65 6e 20 61  call only when a
d870: 6c 6c 20 74 68 72 65 61 64 73 20 69 6e 20 74 68  ll threads in th
d880: 69 73 20 73 61 6d 65 20 70 72 6f 63 65 73 73 20  is same process 
d890: 68 61 76 65 20 72 65 6c 65 61 73 65 64 0a 20 20  have released.  
d8a0: 20 20 2a 2a 20 74 68 65 20 6c 6f 63 6b 2e 0a 20    ** the lock.. 
d8b0: 20 20 20 2a 2f 0a 20 20 20 20 70 4c 6f 63 6b 2d     */.    pLock-
d8c0: 3e 63 6e 74 2d 2d 3b 0a 20 20 20 20 69 66 28 20  >cnt--;.    if( 
d8d0: 70 4c 6f 63 6b 2d 3e 63 6e 74 3d 3d 30 20 29 7b  pLock->cnt==0 ){
d8e0: 0a 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74 79  .      lock.l_ty
d8f0: 70 65 20 3d 20 46 5f 55 4e 4c 43 4b 3b 0a 20 20  pe = F_UNLCK;.  
d900: 20 20 20 20 6c 6f 63 6b 2e 6c 5f 77 68 65 6e 63      lock.l_whenc
d910: 65 20 3d 20 53 45 45 4b 5f 53 45 54 3b 0a 20 20  e = SEEK_SET;.  
d920: 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74      lock.l_start
d930: 20 3d 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20   = lock.l_len = 
d940: 30 4c 3b 0a 20 20 20 20 20 20 53 69 6d 75 6c 61  0L;.      Simula
d950: 74 65 49 4f 45 72 72 6f 72 42 65 6e 69 67 6e 28  teIOErrorBenign(
d960: 31 29 3b 0a 20 20 20 20 20 20 53 69 6d 75 6c 61  1);.      Simula
d970: 74 65 49 4f 45 72 72 6f 72 28 20 68 3d 28 2d 31  teIOError( h=(-1
d980: 29 20 29 0a 20 20 20 20 20 20 53 69 6d 75 6c 61  ) ).      Simula
d990: 74 65 49 4f 45 72 72 6f 72 42 65 6e 69 67 6e 28  teIOErrorBenign(
d9a0: 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 66 63  0);.      if( fc
d9b0: 6e 74 6c 28 68 2c 20 46 5f 53 45 54 4c 4b 2c 20  ntl(h, F_SETLK, 
d9c0: 26 6c 6f 63 6b 29 21 3d 28 2d 31 29 20 29 7b 0a  &lock)!=(-1) ){.
d9d0: 20 20 20 20 20 20 20 20 70 4c 6f 63 6b 2d 3e 6c          pLock->l
d9e0: 6f 63 6b 74 79 70 65 20 3d 20 4e 4f 5f 4c 4f 43  ocktype = NO_LOC
d9f0: 4b 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  K;.      }else{.
da00: 20 20 20 20 20 20 20 20 74 45 72 72 6e 6f 20 3d          tErrno =
da10: 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20 20 20   errno;.        
da20: 72 63 20 3d 20 73 71 6c 69 74 65 45 72 72 6f 72  rc = sqliteError
da30: 46 72 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28 74  FromPosixError(t
da40: 45 72 72 6e 6f 2c 20 53 51 4c 49 54 45 5f 49 4f  Errno, SQLITE_IO
da50: 45 52 52 5f 55 4e 4c 4f 43 4b 29 3b 0a 20 20 20  ERR_UNLOCK);.   
da60: 20 20 20 20 20 69 66 28 20 49 53 5f 4c 4f 43 4b       if( IS_LOCK
da70: 5f 45 52 52 4f 52 28 72 63 29 20 29 7b 0a 20 20  _ERROR(rc) ){.  
da80: 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c          pFile->l
da90: 61 73 74 45 72 72 6e 6f 20 3d 20 74 45 72 72 6e  astErrno = tErrn
daa0: 6f 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  o;.        }.   
dab0: 20 20 20 20 20 70 4c 6f 63 6b 2d 3e 6c 6f 63 6b       pLock->lock
dac0: 74 79 70 65 20 3d 20 4e 4f 5f 4c 4f 43 4b 3b 0a  type = NO_LOCK;.
dad0: 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c          pFile->l
dae0: 6f 63 6b 74 79 70 65 20 3d 20 4e 4f 5f 4c 4f 43  ocktype = NO_LOC
daf0: 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  K;.      }.    }
db00: 0a 0a 20 20 20 20 2f 2a 20 44 65 63 72 65 6d 65  ..    /* Decreme
db10: 6e 74 20 74 68 65 20 63 6f 75 6e 74 20 6f 66 20  nt the count of 
db20: 6c 6f 63 6b 73 20 61 67 61 69 6e 73 74 20 74 68  locks against th
db30: 69 73 20 73 61 6d 65 20 66 69 6c 65 2e 20 20 57  is same file.  W
db40: 68 65 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20 63  hen the.    ** c
db50: 6f 75 6e 74 20 72 65 61 63 68 65 73 20 7a 65 72  ount reaches zer
db60: 6f 2c 20 63 6c 6f 73 65 20 61 6e 79 20 6f 74 68  o, close any oth
db70: 65 72 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  er file descript
db80: 6f 72 73 20 77 68 6f 73 65 20 63 6c 6f 73 65 0a  ors whose close.
db90: 20 20 20 20 2a 2a 20 77 61 73 20 64 65 66 65 72      ** was defer
dba0: 72 65 64 20 62 65 63 61 75 73 65 20 6f 66 20 6f  red because of o
dbb0: 75 74 73 74 61 6e 64 69 6e 67 20 6c 6f 63 6b 73  utstanding locks
dbc0: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 4f 70  ..    */.    pOp
dbd0: 65 6e 20 3d 20 70 46 69 6c 65 2d 3e 70 4f 70 65  en = pFile->pOpe
dbe0: 6e 3b 0a 20 20 20 20 70 4f 70 65 6e 2d 3e 6e 4c  n;.    pOpen->nL
dbf0: 6f 63 6b 2d 2d 3b 0a 20 20 20 20 61 73 73 65 72  ock--;.    asser
dc00: 74 28 20 70 4f 70 65 6e 2d 3e 6e 4c 6f 63 6b 3e  t( pOpen->nLock>
dc10: 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20 70 4f  =0 );.    if( pO
dc20: 70 65 6e 2d 3e 6e 4c 6f 63 6b 3d 3d 30 20 29 7b  pen->nLock==0 ){
dc30: 0a 20 20 20 20 20 20 69 6e 74 20 72 63 32 20 3d  .      int rc2 =
dc40: 20 63 6c 6f 73 65 50 65 6e 64 69 6e 67 46 64 73   closePendingFds
dc50: 28 70 46 69 6c 65 29 3b 0a 20 20 20 20 20 20 69  (pFile);.      i
dc60: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
dc70: 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
dc80: 20 72 63 32 3b 0a 20 20 20 20 20 20 7d 0a 20 20   rc2;.      }.  
dc90: 20 20 7d 0a 20 20 7d 0a 09 0a 65 6e 64 5f 75 6e    }.  }...end_un
dca0: 6c 6f 63 6b 3a 0a 20 20 75 6e 69 78 4c 65 61 76  lock:.  unixLeav
dcb0: 65 4d 75 74 65 78 28 29 3b 0a 20 20 69 66 28 20  eMutex();.  if( 
dcc0: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc==SQLITE_OK ) 
dcd0: 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 20  pFile->locktype 
dce0: 3d 20 6c 6f 63 6b 74 79 70 65 3b 0a 20 20 72 65  = locktype;.  re
dcf0: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
dd00: 2a 20 4c 6f 77 65 72 20 74 68 65 20 6c 6f 63 6b  * Lower the lock
dd10: 69 6e 67 20 6c 65 76 65 6c 20 6f 6e 20 66 69 6c  ing level on fil
dd20: 65 20 64 65 73 63 72 69 70 74 6f 72 20 70 46 69  e descriptor pFi
dd30: 6c 65 20 74 6f 20 6c 6f 63 6b 74 79 70 65 2e 20  le to locktype. 
dd40: 20 6c 6f 63 6b 74 79 70 65 0a 2a 2a 20 6d 75 73   locktype.** mus
dd50: 74 20 62 65 20 65 69 74 68 65 72 20 4e 4f 5f 4c  t be either NO_L
dd60: 4f 43 4b 20 6f 72 20 53 48 41 52 45 44 5f 4c 4f  OCK or SHARED_LO
dd70: 43 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  CK..**.** If the
dd80: 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f   locking level o
dd90: 66 20 74 68 65 20 66 69 6c 65 20 64 65 73 63 72  f the file descr
dda0: 69 70 74 6f 72 20 69 73 20 61 6c 72 65 61 64 79  iptor is already
ddb0: 20 61 74 20 6f 72 20 62 65 6c 6f 77 0a 2a 2a 20   at or below.** 
ddc0: 74 68 65 20 72 65 71 75 65 73 74 65 64 20 6c 6f  the requested lo
ddd0: 63 6b 69 6e 67 20 6c 65 76 65 6c 2c 20 74 68 69  cking level, thi
dde0: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e  s routine is a n
ddf0: 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  o-op..*/.static 
de00: 69 6e 74 20 75 6e 69 78 55 6e 6c 6f 63 6b 28 73  int unixUnlock(s
de10: 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c  qlite3_file *id,
de20: 20 69 6e 74 20 6c 6f 63 6b 74 79 70 65 29 7b 0a   int locktype){.
de30: 20 20 72 65 74 75 72 6e 20 5f 70 6f 73 69 78 55    return _posixU
de40: 6e 6c 6f 63 6b 28 69 64 2c 20 6c 6f 63 6b 74 79  nlock(id, lockty
de50: 70 65 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  pe, 0);.}../*.**
de60: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 70   This function p
de70: 65 72 66 6f 72 6d 73 20 74 68 65 20 70 61 72 74  erforms the part
de80: 73 20 6f 66 20 74 68 65 20 22 63 6c 6f 73 65 20  s of the "close 
de90: 66 69 6c 65 22 20 6f 70 65 72 61 74 69 6f 6e 20  file" operation 
dea0: 0a 2a 2a 20 63 6f 6d 6d 6f 6e 20 74 6f 20 61 6c  .** common to al
deb0: 6c 20 6c 6f 63 6b 69 6e 67 20 73 63 68 65 6d 65  l locking scheme
dec0: 73 2e 20 49 74 20 63 6c 6f 73 65 73 20 74 68 65  s. It closes the
ded0: 20 64 69 72 65 63 74 6f 72 79 20 61 6e 64 20 66   directory and f
dee0: 69 6c 65 0a 2a 2a 20 68 61 6e 64 6c 65 73 2c 20  ile.** handles, 
def0: 69 66 20 74 68 65 79 20 61 72 65 20 76 61 6c 69  if they are vali
df00: 64 2c 20 61 6e 64 20 73 65 74 73 20 61 6c 6c 20  d, and sets all 
df10: 66 69 65 6c 64 73 20 6f 66 20 74 68 65 20 75 6e  fields of the un
df20: 69 78 46 69 6c 65 0a 2a 2a 20 73 74 72 75 63 74  ixFile.** struct
df30: 75 72 65 20 74 6f 20 30 2e 0a 2a 2a 0a 2a 2a 20  ure to 0..**.** 
df40: 49 74 20 69 73 20 2a 6e 6f 74 2a 20 6e 65 63 65  It is *not* nece
df50: 73 73 61 72 79 20 74 6f 20 68 6f 6c 64 20 74 68  ssary to hold th
df60: 65 20 6d 75 74 65 78 20 77 68 65 6e 20 74 68 69  e mutex when thi
df70: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
df80: 6c 65 64 2c 0a 2a 2a 20 65 76 65 6e 20 6f 6e 20  led,.** even on 
df90: 56 78 57 6f 72 6b 73 2e 20 20 41 20 6d 75 74 65  VxWorks.  A mute
dfa0: 78 20 77 69 6c 6c 20 62 65 20 61 63 71 75 69 72  x will be acquir
dfb0: 65 64 20 6f 6e 20 56 78 57 6f 72 6b 73 20 62 79  ed on VxWorks by
dfc0: 20 74 68 65 0a 2a 2a 20 76 78 77 6f 72 6b 73 52   the.** vxworksR
dfd0: 65 6c 65 61 73 65 46 69 6c 65 49 64 28 29 20 72  eleaseFileId() r
dfe0: 6f 75 74 69 6e 65 2e 0a 2a 2f 0a 73 74 61 74 69  outine..*/.stati
dff0: 63 20 69 6e 74 20 63 6c 6f 73 65 55 6e 69 78 46  c int closeUnixF
e000: 69 6c 65 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  ile(sqlite3_file
e010: 20 2a 69 64 29 7b 0a 20 20 75 6e 69 78 46 69 6c   *id){.  unixFil
e020: 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78  e *pFile = (unix
e030: 46 69 6c 65 2a 29 69 64 3b 0a 20 20 69 66 28 20  File*)id;.  if( 
e040: 70 46 69 6c 65 20 29 7b 0a 20 20 20 20 69 66 28  pFile ){.    if(
e050: 20 70 46 69 6c 65 2d 3e 64 69 72 66 64 3e 3d 30   pFile->dirfd>=0
e060: 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 65 72   ){.      int er
e070: 72 20 3d 20 63 6c 6f 73 65 28 70 46 69 6c 65 2d  r = close(pFile-
e080: 3e 64 69 72 66 64 29 3b 0a 20 20 20 20 20 20 69  >dirfd);.      i
e090: 66 28 20 65 72 72 20 29 7b 0a 20 20 20 20 20 20  f( err ){.      
e0a0: 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72    pFile->lastErr
e0b0: 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20  no = errno;.    
e0c0: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
e0d0: 45 5f 49 4f 45 52 52 5f 44 49 52 5f 43 4c 4f 53  E_IOERR_DIR_CLOS
e0e0: 45 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  E;.      }else{.
e0f0: 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 64          pFile->d
e100: 69 72 66 64 3d 2d 31 3b 0a 20 20 20 20 20 20 7d  irfd=-1;.      }
e110: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70  .    }.    if( p
e120: 46 69 6c 65 2d 3e 68 3e 3d 30 20 29 7b 0a 20 20  File->h>=0 ){.  
e130: 20 20 20 20 69 6e 74 20 65 72 72 20 3d 20 63 6c      int err = cl
e140: 6f 73 65 28 70 46 69 6c 65 2d 3e 68 29 3b 0a 20  ose(pFile->h);. 
e150: 20 20 20 20 20 69 66 28 20 65 72 72 20 29 7b 0a       if( err ){.
e160: 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c          pFile->l
e170: 61 73 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f  astErrno = errno
e180: 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
e190: 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43 4c   SQLITE_IOERR_CL
e1a0: 4f 53 45 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  OSE;.      }.   
e1b0: 20 7d 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b   }.#if OS_VXWORK
e1c0: 53 0a 20 20 20 20 69 66 28 20 70 46 69 6c 65 2d  S.    if( pFile-
e1d0: 3e 70 49 64 20 29 7b 0a 20 20 20 20 20 20 69 66  >pId ){.      if
e1e0: 28 20 70 46 69 6c 65 2d 3e 69 73 44 65 6c 65 74  ( pFile->isDelet
e1f0: 65 20 29 7b 0a 20 20 20 20 20 20 20 20 75 6e 6c  e ){.        unl
e200: 69 6e 6b 28 70 46 69 6c 65 2d 3e 70 49 64 2d 3e  ink(pFile->pId->
e210: 7a 43 61 6e 6f 6e 69 63 61 6c 4e 61 6d 65 29 3b  zCanonicalName);
e220: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 76  .      }.      v
e230: 78 77 6f 72 6b 73 52 65 6c 65 61 73 65 46 69 6c  xworksReleaseFil
e240: 65 49 64 28 70 46 69 6c 65 2d 3e 70 49 64 29 3b  eId(pFile->pId);
e250: 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 70 49  .      pFile->pI
e260: 64 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 23 65 6e  d = 0;.    }.#en
e270: 64 69 66 0a 20 20 20 20 4f 53 54 52 41 43 45 32  dif.    OSTRACE2
e280: 28 22 43 4c 4f 53 45 20 20 20 25 2d 33 64 5c 6e  ("CLOSE   %-3d\n
e290: 22 2c 20 70 46 69 6c 65 2d 3e 68 29 3b 0a 20 20  ", pFile->h);.  
e2a0: 20 20 4f 70 65 6e 43 6f 75 6e 74 65 72 28 2d 31    OpenCounter(-1
e2b0: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  );.    sqlite3_f
e2c0: 72 65 65 28 70 46 69 6c 65 2d 3e 70 55 6e 75 73  ree(pFile->pUnus
e2d0: 65 64 29 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28  ed);.    memset(
e2e0: 70 46 69 6c 65 2c 20 30 2c 20 73 69 7a 65 6f 66  pFile, 0, sizeof
e2f0: 28 75 6e 69 78 46 69 6c 65 29 29 3b 0a 20 20 7d  (unixFile));.  }
e300: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
e310: 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c  _OK;.}../*.** Cl
e320: 6f 73 65 20 61 20 66 69 6c 65 2e 0a 2a 2f 0a 73  ose a file..*/.s
e330: 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 43 6c  tatic int unixCl
e340: 6f 73 65 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  ose(sqlite3_file
e350: 20 2a 69 64 29 7b 0a 20 20 69 6e 74 20 72 63 20   *id){.  int rc 
e360: 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69  = SQLITE_OK;.  i
e370: 66 28 20 69 64 20 29 7b 0a 20 20 20 20 75 6e 69  f( id ){.    uni
e380: 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28  xFile *pFile = (
e390: 75 6e 69 78 46 69 6c 65 20 2a 29 69 64 3b 0a 20  unixFile *)id;. 
e3a0: 20 20 20 75 6e 69 78 55 6e 6c 6f 63 6b 28 69 64     unixUnlock(id
e3b0: 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20  , NO_LOCK);.    
e3c0: 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29  unixEnterMutex()
e3d0: 3b 0a 20 20 20 20 69 66 28 20 70 46 69 6c 65 2d  ;.    if( pFile-
e3e0: 3e 70 4f 70 65 6e 20 26 26 20 70 46 69 6c 65 2d  >pOpen && pFile-
e3f0: 3e 70 4f 70 65 6e 2d 3e 6e 4c 6f 63 6b 20 29 7b  >pOpen->nLock ){
e400: 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65  .      /* If the
e410: 72 65 20 61 72 65 20 6f 75 74 73 74 61 6e 64 69  re are outstandi
e420: 6e 67 20 6c 6f 63 6b 73 2c 20 64 6f 20 6e 6f 74  ng locks, do not
e430: 20 61 63 74 75 61 6c 6c 79 20 63 6c 6f 73 65 20   actually close 
e440: 74 68 65 20 66 69 6c 65 20 6a 75 73 74 0a 20 20  the file just.  
e450: 20 20 20 20 2a 2a 20 79 65 74 20 62 65 63 61 75      ** yet becau
e460: 73 65 20 74 68 61 74 20 77 6f 75 6c 64 20 63 6c  se that would cl
e470: 65 61 72 20 74 68 6f 73 65 20 6c 6f 63 6b 73 2e  ear those locks.
e480: 20 20 49 6e 73 74 65 61 64 2c 20 61 64 64 20 74    Instead, add t
e490: 68 65 20 66 69 6c 65 0a 20 20 20 20 20 20 2a 2a  he file.      **
e4a0: 20 64 65 73 63 72 69 70 74 6f 72 20 74 6f 20 70   descriptor to p
e4b0: 4f 70 65 6e 2d 3e 70 55 6e 75 73 65 64 20 6c 69  Open->pUnused li
e4c0: 73 74 2e 20 20 49 74 20 77 69 6c 6c 20 62 65 20  st.  It will be 
e4d0: 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 63 6c  automatically cl
e4e0: 6f 73 65 64 20 0a 20 20 20 20 20 20 2a 2a 20 77  osed .      ** w
e4f0: 68 65 6e 20 74 68 65 20 6c 61 73 74 20 6c 6f 63  hen the last loc
e500: 6b 20 69 73 20 63 6c 65 61 72 65 64 2e 0a 20 20  k is cleared..  
e510: 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 65 74      */.      set
e520: 50 65 6e 64 69 6e 67 46 64 28 70 46 69 6c 65 29  PendingFd(pFile)
e530: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 6c 65  ;.    }.    rele
e540: 61 73 65 4c 6f 63 6b 49 6e 66 6f 28 70 46 69 6c  aseLockInfo(pFil
e550: 65 2d 3e 70 4c 6f 63 6b 29 3b 0a 20 20 20 20 72  e->pLock);.    r
e560: 65 6c 65 61 73 65 4f 70 65 6e 43 6e 74 28 70 46  eleaseOpenCnt(pF
e570: 69 6c 65 2d 3e 70 4f 70 65 6e 29 3b 0a 20 20 20  ile->pOpen);.   
e580: 20 72 63 20 3d 20 63 6c 6f 73 65 55 6e 69 78 46   rc = closeUnixF
e590: 69 6c 65 28 69 64 29 3b 0a 20 20 20 20 75 6e 69  ile(id);.    uni
e5a0: 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 20  xLeaveMutex();. 
e5b0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
e5c0: 7d 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  }../************
e5d0: 2a 2a 20 45 6e 64 20 6f 66 20 74 68 65 20 70 6f  ** End of the po
e5e0: 73 69 78 20 61 64 76 69 73 6f 72 79 20 6c 6f 63  six advisory loc
e5f0: 6b 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  k implementation
e600: 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a   ***************
e610: 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  **.*************
e620: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
e630: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
e640: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
e650: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
e660: 2a 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  */../***********
e670: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
e680: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
e690: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
e6a0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
e6b0: 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ***.************
e6c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
e6d0: 2a 2a 20 4e 6f 2d 6f 70 20 4c 6f 63 6b 69 6e 67  ** No-op Locking
e6e0: 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a   ***************
e6f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
e700: 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 4f 66 20 74 68 65  ***.**.** Of the
e710: 20 76 61 72 69 6f 75 73 20 6c 6f 63 6b 69 6e 67   various locking
e720: 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 73   implementations
e730: 20 61 76 61 69 6c 61 62 6c 65 2c 20 74 68 69 73   available, this
e740: 20 69 73 20 62 79 20 66 61 72 20 74 68 65 0a 2a   is by far the.*
e750: 2a 20 73 69 6d 70 6c 65 73 74 3a 20 20 6c 6f 63  * simplest:  loc
e760: 6b 69 6e 67 20 69 73 20 69 67 6e 6f 72 65 64 2e  king is ignored.
e770: 20 20 4e 6f 20 61 74 74 65 6d 70 74 20 69 73 20    No attempt is 
e780: 6d 61 64 65 20 74 6f 20 6c 6f 63 6b 20 74 68 65  made to lock the
e790: 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 66 69 6c   database.** fil
e7a0: 65 20 66 6f 72 20 72 65 61 64 69 6e 67 20 6f 72  e for reading or
e7b0: 20 77 72 69 74 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20   writing..**.** 
e7c0: 54 68 69 73 20 6c 6f 63 6b 69 6e 67 20 6d 6f 64  This locking mod
e7d0: 65 20 69 73 20 61 70 70 72 6f 70 72 69 61 74 65  e is appropriate
e7e0: 20 66 6f 72 20 75 73 65 20 6f 6e 20 72 65 61 64   for use on read
e7f0: 2d 6f 6e 6c 79 20 64 61 74 61 62 61 73 65 73 0a  -only databases.
e800: 2a 2a 20 28 65 78 3a 20 64 61 74 61 62 61 73 65  ** (ex: database
e810: 73 20 74 68 61 74 20 61 72 65 20 62 75 72 6e 65  s that are burne
e820: 64 20 69 6e 74 6f 20 43 44 2d 52 4f 4d 2c 20 66  d into CD-ROM, f
e830: 6f 72 20 65 78 61 6d 70 6c 65 2e 29 20 20 49 74  or example.)  It
e840: 20 63 61 6e 0a 2a 2a 20 61 6c 73 6f 20 62 65 20   can.** also be 
e850: 75 73 65 64 20 69 66 20 74 68 65 20 61 70 70 6c  used if the appl
e860: 69 63 61 74 69 6f 6e 20 65 6d 70 6c 6f 79 73 20  ication employs 
e870: 73 6f 6d 65 20 65 78 74 65 72 6e 61 6c 20 6d 65  some external me
e880: 63 68 61 6e 69 73 6d 20 74 6f 0a 2a 2a 20 70 72  chanism to.** pr
e890: 65 76 65 6e 74 20 73 69 6d 75 6c 74 61 6e 65 6f  event simultaneo
e8a0: 75 73 20 61 63 63 65 73 73 20 6f 66 20 74 68 65  us access of the
e8b0: 20 73 61 6d 65 20 64 61 74 61 62 61 73 65 20 62   same database b
e8c0: 79 20 74 77 6f 20 6f 72 20 6d 6f 72 65 0a 2a 2a  y two or more.**
e8d0: 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   database connec
e8e0: 74 69 6f 6e 73 2e 20 20 42 75 74 20 74 68 65 72  tions.  But ther
e8f0: 65 20 69 73 20 61 20 73 65 72 69 6f 75 73 20 72  e is a serious r
e900: 69 73 6b 20 6f 66 20 64 61 74 61 62 61 73 65 0a  isk of database.
e910: 2a 2a 20 63 6f 72 72 75 70 74 69 6f 6e 20 69 66  ** corruption if
e920: 20 74 68 69 73 20 6c 6f 63 6b 69 6e 67 20 6d 6f   this locking mo
e930: 64 65 20 69 73 20 75 73 65 64 20 69 6e 20 73 69  de is used in si
e940: 74 75 61 74 69 6f 6e 73 20 77 68 65 72 65 20 6d  tuations where m
e950: 75 6c 74 69 70 6c 65 0a 2a 2a 20 64 61 74 61 62  ultiple.** datab
e960: 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20  ase connections 
e970: 61 72 65 20 61 63 63 65 73 73 69 6e 67 20 74 68  are accessing th
e980: 65 20 73 61 6d 65 20 64 61 74 61 62 61 73 65 20  e same database 
e990: 66 69 6c 65 20 61 74 20 74 68 65 20 73 61 6d 65  file at the same
e9a0: 0a 2a 2a 20 74 69 6d 65 20 61 6e 64 20 6f 6e 65  .** time and one
e9b0: 20 6f 72 20 6d 6f 72 65 20 6f 66 20 74 68 6f 73   or more of thos
e9c0: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 61 72  e connections ar
e9d0: 65 20 77 72 69 74 69 6e 67 2e 0a 2a 2f 0a 0a 73  e writing..*/..s
e9e0: 74 61 74 69 63 20 69 6e 74 20 6e 6f 6c 6f 63 6b  tatic int nolock
e9f0: 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63  CheckReservedLoc
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 2a 70 52  NotUsed, int *pR
ea20: 65 73 4f 75 74 29 7b 0a 20 20 55 4e 55 53 45 44  esOut){.  UNUSED
ea30: 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f 74 55 73  _PARAMETER(NotUs
ea40: 65 64 29 3b 0a 20 20 2a 70 52 65 73 4f 75 74 20  ed);.  *pResOut 
ea50: 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  = 0;.  return SQ
ea60: 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 73 74 61 74 69  LITE_OK;.}.stati
ea70: 63 20 69 6e 74 20 6e 6f 6c 6f 63 6b 4c 6f 63 6b  c int nolockLock
ea80: 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 4e  (sqlite3_file *N
ea90: 6f 74 55 73 65 64 2c 20 69 6e 74 20 4e 6f 74 55  otUsed, int NotU
eaa0: 73 65 64 32 29 7b 0a 20 20 55 4e 55 53 45 44 5f  sed2){.  UNUSED_
eab0: 50 41 52 41 4d 45 54 45 52 32 28 4e 6f 74 55 73  PARAMETER2(NotUs
eac0: 65 64 2c 20 4e 6f 74 55 73 65 64 32 29 3b 0a 20  ed, NotUsed2);. 
ead0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
eae0: 4b 3b 0a 7d 0a 73 74 61 74 69 63 20 69 6e 74 20  K;.}.static int 
eaf0: 6e 6f 6c 6f 63 6b 55 6e 6c 6f 63 6b 28 73 71 6c  nolockUnlock(sql
eb00: 69 74 65 33 5f 66 69 6c 65 20 2a 4e 6f 74 55 73  ite3_file *NotUs
eb10: 65 64 2c 20 69 6e 74 20 4e 6f 74 55 73 65 64 32  ed, int NotUsed2
eb20: 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  ){.  UNUSED_PARA
eb30: 4d 45 54 45 52 32 28 4e 6f 74 55 73 65 64 2c 20  METER2(NotUsed, 
eb40: 4e 6f 74 55 73 65 64 32 29 3b 0a 20 20 72 65 74  NotUsed2);.  ret
eb50: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
eb60: 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 74 68  ../*.** Close th
eb70: 65 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69  e file..*/.stati
eb80: 63 20 69 6e 74 20 6e 6f 6c 6f 63 6b 43 6c 6f 73  c int nolockClos
eb90: 65 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  e(sqlite3_file *
eba0: 69 64 29 20 7b 0a 20 20 72 65 74 75 72 6e 20 63  id) {.  return c
ebb0: 6c 6f 73 65 55 6e 69 78 46 69 6c 65 28 69 64 29  loseUnixFile(id)
ebc0: 3b 0a 7d 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ;.}../**********
ebd0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64 20 6f 66  ********* End of
ebe0: 20 74 68 65 20 6e 6f 2d 6f 70 20 6c 6f 63 6b 20   the no-op lock 
ebf0: 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 2a  implementation *
ec00: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
ec10: 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****.***********
ec20: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
ec30: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
ec40: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
ec50: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
ec60: 2a 2a 2a 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a  ***/../*********
ec70: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
ec80: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
ec90: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
eca0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
ecb0: 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  *****.**********
ecc0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20  *************** 
ecd0: 42 65 67 69 6e 20 64 6f 74 2d 66 69 6c 65 20 4c  Begin dot-file L
ece0: 6f 63 6b 69 6e 67 20 2a 2a 2a 2a 2a 2a 2a 2a 2a  ocking *********
ecf0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
ed00: 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 54 68 65 20  *****.**.** The 
ed10: 64 6f 74 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 20  dotfile locking 
ed20: 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 75  implementation u
ed30: 73 65 73 20 74 68 65 20 65 78 69 73 74 61 6e 63  ses the existanc
ed40: 65 20 6f 66 20 73 65 70 61 72 61 74 65 20 6c 6f  e of separate lo
ed50: 63 6b 0a 2a 2a 20 66 69 6c 65 73 20 69 6e 20 6f  ck.** files in o
ed60: 72 64 65 72 20 74 6f 20 63 6f 6e 74 72 6f 6c 20  rder to control 
ed70: 61 63 63 65 73 73 20 74 6f 20 74 68 65 20 64 61  access to the da
ed80: 74 61 62 61 73 65 2e 20 20 54 68 69 73 20 77 6f  tabase.  This wo
ed90: 72 6b 73 20 6f 6e 20 6a 75 73 74 0a 2a 2a 20 61  rks on just.** a
eda0: 62 6f 75 74 20 65 76 65 72 79 20 66 69 6c 65 73  bout every files
edb0: 79 73 74 65 6d 20 69 6d 61 67 69 6e 61 62 6c 65  ystem imaginable
edc0: 2e 20 20 42 75 74 20 74 68 65 72 65 20 61 72 65  .  But there are
edd0: 20 73 65 72 69 6f 75 73 20 64 6f 77 6e 73 69 64   serious downsid
ede0: 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 28 31 29  es:.**.**    (1)
edf0: 20 20 54 68 65 72 65 20 69 73 20 7a 65 72 6f 20    There is zero 
ee00: 63 6f 6e 63 75 72 72 65 6e 63 79 2e 20 20 41 20  concurrency.  A 
ee10: 73 69 6e 67 6c 65 20 72 65 61 64 65 72 20 62 6c  single reader bl
ee20: 6f 63 6b 73 20 61 6c 6c 20 6f 74 68 65 72 0a 2a  ocks all other.*
ee30: 2a 20 20 20 20 20 20 20 20 20 63 6f 6e 6e 65 63  *         connec
ee40: 74 69 6f 6e 73 20 66 72 6f 6d 20 72 65 61 64 69  tions from readi
ee50: 6e 67 20 6f 72 20 77 72 69 74 69 6e 67 20 74 68  ng or writing th
ee60: 65 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a  e database..**.*
ee70: 2a 20 20 20 20 28 32 29 20 20 41 6e 20 61 70 70  *    (2)  An app
ee80: 6c 69 63 61 74 69 6f 6e 20 63 72 61 73 68 20 6f  lication crash o
ee90: 72 20 70 6f 77 65 72 20 6c 6f 73 73 20 63 61 6e  r power loss can
eea0: 20 6c 65 61 76 65 20 73 74 61 6c 65 20 6c 6f 63   leave stale loc
eeb0: 6b 20 66 69 6c 65 73 0a 2a 2a 20 20 20 20 20 20  k files.**      
eec0: 20 20 20 73 69 74 74 69 6e 67 20 61 72 6f 75 6e     sitting aroun
eed0: 64 20 74 68 61 74 20 6e 65 65 64 20 74 6f 20 62  d that need to b
eee0: 65 20 63 6c 65 61 72 65 64 20 6d 61 6e 75 61 6c  e cleared manual
eef0: 6c 79 2e 0a 2a 2a 0a 2a 2a 20 4e 65 76 65 72 74  ly..**.** Nevert
ef00: 68 65 6c 65 73 73 2c 20 61 20 64 6f 74 6c 6f 63  heless, a dotloc
ef10: 6b 20 69 73 20 61 6e 20 61 70 70 72 6f 70 72 69  k is an appropri
ef20: 61 74 65 20 6c 6f 63 6b 69 6e 67 20 6d 6f 64 65  ate locking mode
ef30: 20 66 6f 72 20 75 73 65 20 69 66 20 6e 6f 0a 2a   for use if no.*
ef40: 2a 20 6f 74 68 65 72 20 6c 6f 63 6b 69 6e 67 20  * other locking 
ef50: 73 74 72 61 74 65 67 79 20 69 73 20 61 76 61 69  strategy is avai
ef60: 6c 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 44 6f 74  lable..**.** Dot
ef70: 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 20 77 6f 72  file locking wor
ef80: 6b 73 20 62 79 20 63 72 65 61 74 69 6e 67 20 61  ks by creating a
ef90: 20 66 69 6c 65 20 69 6e 20 74 68 65 20 73 61 6d   file in the sam
efa0: 65 20 64 69 72 65 63 74 6f 72 79 20 61 73 20 74  e directory as t
efb0: 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 61  he.** database a
efc0: 6e 64 20 77 69 74 68 20 74 68 65 20 73 61 6d 65  nd with the same
efd0: 20 6e 61 6d 65 20 62 75 74 20 77 69 74 68 20 61   name but with a
efe0: 20 22 2e 6c 6f 63 6b 22 20 65 78 74 65 6e 73 69   ".lock" extensi
eff0: 6f 6e 20 61 64 64 65 64 2e 0a 2a 2a 20 54 68 65  on added..** The
f000: 20 65 78 69 73 74 61 6e 63 65 20 6f 66 20 61 20   existance of a 
f010: 6c 6f 63 6b 20 66 69 6c 65 20 69 6d 70 6c 69 65  lock file implie
f020: 73 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c  s an EXCLUSIVE l
f030: 6f 63 6b 2e 20 20 41 6c 6c 20 6f 74 68 65 72 20  ock.  All other 
f040: 6c 6f 63 6b 0a 2a 2a 20 74 79 70 65 73 20 28 53  lock.** types (S
f050: 48 41 52 45 44 2c 20 52 45 53 45 52 56 45 44 2c  HARED, RESERVED,
f060: 20 50 45 4e 44 49 4e 47 29 20 61 72 65 20 6d 61   PENDING) are ma
f070: 70 70 65 64 20 69 6e 74 6f 20 45 58 43 4c 55 53  pped into EXCLUS
f080: 49 56 45 2e 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54  IVE..*/../*.** T
f090: 68 65 20 66 69 6c 65 20 73 75 66 66 69 78 20 61  he file suffix a
f0a0: 64 64 65 64 20 74 6f 20 74 68 65 20 64 61 74 61  dded to the data
f0b0: 20 62 61 73 65 20 66 69 6c 65 6e 61 6d 65 20 69   base filename i
f0c0: 6e 20 6f 72 64 65 72 20 74 6f 20 63 72 65 61 74  n order to creat
f0d0: 65 20 74 68 65 0a 2a 2a 20 6c 6f 63 6b 20 66 69  e the.** lock fi
f0e0: 6c 65 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 44  le..*/.#define D
f0f0: 4f 54 4c 4f 43 4b 5f 53 55 46 46 49 58 20 22 2e  OTLOCK_SUFFIX ".
f100: 6c 6f 63 6b 22 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  lock"../*.** Thi
f110: 73 20 72 6f 75 74 69 6e 65 20 63 68 65 63 6b 73  s routine checks
f120: 20 69 66 20 74 68 65 72 65 20 69 73 20 61 20 52   if there is a R
f130: 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 68 65 6c  ESERVED lock hel
f140: 64 20 6f 6e 20 74 68 65 20 73 70 65 63 69 66 69  d on the specifi
f150: 65 64 0a 2a 2a 20 66 69 6c 65 20 62 79 20 74 68  ed.** file by th
f160: 69 73 20 6f 72 20 61 6e 79 20 6f 74 68 65 72 20  is or any other 
f170: 70 72 6f 63 65 73 73 2e 20 49 66 20 73 75 63 68  process. If such
f180: 20 61 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64 2c   a lock is held,
f190: 20 73 65 74 20 2a 70 52 65 73 4f 75 74 0a 2a 2a   set *pResOut.**
f1a0: 20 74 6f 20 61 20 6e 6f 6e 2d 7a 65 72 6f 20 76   to a non-zero v
f1b0: 61 6c 75 65 20 6f 74 68 65 72 77 69 73 65 20 2a  alue otherwise *
f1c0: 70 52 65 73 4f 75 74 20 69 73 20 73 65 74 20 74  pResOut is set t
f1d0: 6f 20 7a 65 72 6f 2e 20 20 54 68 65 20 72 65 74  o zero.  The ret
f1e0: 75 72 6e 20 76 61 6c 75 65 0a 2a 2a 20 69 73 20  urn value.** is 
f1f0: 73 65 74 20 74 6f 20 53 51 4c 49 54 45 5f 4f 4b  set to SQLITE_OK
f200: 20 75 6e 6c 65 73 73 20 61 6e 20 49 2f 4f 20 65   unless an I/O e
f210: 72 72 6f 72 20 6f 63 63 75 72 73 20 64 75 72 69  rror occurs duri
f220: 6e 67 20 6c 6f 63 6b 20 63 68 65 63 6b 69 6e 67  ng lock checking
f230: 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 64 6f 74 66 69  ..**.** In dotfi
f240: 6c 65 20 6c 6f 63 6b 69 6e 67 2c 20 65 69 74 68  le locking, eith
f250: 65 72 20 61 20 6c 6f 63 6b 20 65 78 69 73 74 73  er a lock exists
f260: 20 6f 72 20 69 74 20 64 6f 65 73 20 6e 6f 74 2e   or it does not.
f270: 20 20 53 6f 20 69 6e 20 74 68 69 73 0a 2a 2a 20    So in this.** 
f280: 76 61 72 69 61 74 69 6f 6e 20 6f 66 20 43 68 65  variation of Che
f290: 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 28 29  ckReservedLock()
f2a0: 2c 20 2a 70 52 65 73 4f 75 74 20 69 73 20 73 65  , *pResOut is se
f2b0: 74 20 74 6f 20 74 72 75 65 20 69 66 20 61 6e 79  t to true if any
f2c0: 20 6c 6f 63 6b 0a 2a 2a 20 69 73 20 68 65 6c 64   lock.** is held
f2d0: 20 6f 6e 20 74 68 65 20 66 69 6c 65 20 61 6e 64   on the file and
f2e0: 20 66 61 6c 73 65 20 69 66 20 74 68 65 20 66 69   false if the fi
f2f0: 6c 65 20 69 73 20 75 6e 6c 6f 63 6b 65 64 2e 0a  le is unlocked..
f300: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 64 6f  */.static int do
f310: 74 6c 6f 63 6b 43 68 65 63 6b 52 65 73 65 72 76  tlockCheckReserv
f320: 65 64 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66  edLock(sqlite3_f
f330: 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 2a 70 52  ile *id, int *pR
f340: 65 73 4f 75 74 29 20 7b 0a 20 20 69 6e 74 20 72  esOut) {.  int r
f350: 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
f360: 20 69 6e 74 20 72 65 73 65 72 76 65 64 20 3d 20   int reserved = 
f370: 30 3b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70  0;.  unixFile *p
f380: 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65  File = (unixFile
f390: 2a 29 69 64 3b 0a 0a 20 20 53 69 6d 75 6c 61 74  *)id;..  Simulat
f3a0: 65 49 4f 45 72 72 6f 72 28 20 72 65 74 75 72 6e  eIOError( return
f3b0: 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43 48   SQLITE_IOERR_CH
f3c0: 45 43 4b 52 45 53 45 52 56 45 44 4c 4f 43 4b 3b  ECKRESERVEDLOCK;
f3d0: 20 29 3b 0a 20 20 0a 20 20 61 73 73 65 72 74 28   );.  .  assert(
f3e0: 20 70 46 69 6c 65 20 29 3b 0a 0a 20 20 2f 2a 20   pFile );..  /* 
f3f0: 43 68 65 63 6b 20 69 66 20 61 20 74 68 72 65 61  Check if a threa
f400: 64 20 69 6e 20 74 68 69 73 20 70 72 6f 63 65 73  d in this proces
f410: 73 20 68 6f 6c 64 73 20 73 75 63 68 20 61 20 6c  s holds such a l
f420: 6f 63 6b 20 2a 2f 0a 20 20 69 66 28 20 70 46 69  ock */.  if( pFi
f430: 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3e 53 48 41  le->locktype>SHA
f440: 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20  RED_LOCK ){.    
f450: 2f 2a 20 45 69 74 68 65 72 20 74 68 69 73 20 63  /* Either this c
f460: 6f 6e 6e 65 63 74 69 6f 6e 20 6f 72 20 73 6f 6d  onnection or som
f470: 65 20 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74 69  e other connecti
f480: 6f 6e 20 69 6e 20 74 68 65 20 73 61 6d 65 20 70  on in the same p
f490: 72 6f 63 65 73 73 0a 20 20 20 20 2a 2a 20 68 6f  rocess.    ** ho
f4a0: 6c 64 73 20 61 20 6c 6f 63 6b 20 6f 6e 20 74 68  lds a lock on th
f4b0: 65 20 66 69 6c 65 2e 20 20 4e 6f 20 6e 65 65 64  e file.  No need
f4c0: 20 74 6f 20 63 68 65 63 6b 20 66 75 72 74 68 65   to check furthe
f4d0: 72 2e 20 2a 2f 0a 20 20 20 20 72 65 73 65 72 76  r. */.    reserv
f4e0: 65 64 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 7b  ed = 1;.  }else{
f4f0: 0a 20 20 20 20 2f 2a 20 54 68 65 20 6c 6f 63 6b  .    /* The lock
f500: 20 69 73 20 68 65 6c 64 20 69 66 20 61 6e 64 20   is held if and 
f510: 6f 6e 6c 79 20 69 66 20 74 68 65 20 6c 6f 63 6b  only if the lock
f520: 66 69 6c 65 20 65 78 69 73 74 73 20 2a 2f 0a 20  file exists */. 
f530: 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
f540: 4c 6f 63 6b 46 69 6c 65 20 3d 20 28 63 6f 6e 73  LockFile = (cons
f550: 74 20 63 68 61 72 2a 29 70 46 69 6c 65 2d 3e 6c  t char*)pFile->l
f560: 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 0a 20  ockingContext;. 
f570: 20 20 20 72 65 73 65 72 76 65 64 20 3d 20 61 63     reserved = ac
f580: 63 65 73 73 28 7a 4c 6f 63 6b 46 69 6c 65 2c 20  cess(zLockFile, 
f590: 30 29 3d 3d 30 3b 0a 20 20 7d 0a 20 20 4f 53 54  0)==0;.  }.  OST
f5a0: 52 41 43 45 34 28 22 54 45 53 54 20 57 52 2d 4c  RACE4("TEST WR-L
f5b0: 4f 43 4b 20 25 64 20 25 64 20 25 64 20 28 64 6f  OCK %d %d %d (do
f5c0: 74 6c 6f 63 6b 29 5c 6e 22 2c 20 70 46 69 6c 65  tlock)\n", pFile
f5d0: 2d 3e 68 2c 20 72 63 2c 20 72 65 73 65 72 76 65  ->h, rc, reserve
f5e0: 64 29 3b 0a 20 20 2a 70 52 65 73 4f 75 74 20 3d  d);.  *pResOut =
f5f0: 20 72 65 73 65 72 76 65 64 3b 0a 20 20 72 65 74   reserved;.  ret
f600: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
f610: 20 4c 6f 63 6b 20 74 68 65 20 66 69 6c 65 20 77   Lock the file w
f620: 69 74 68 20 74 68 65 20 6c 6f 63 6b 20 73 70 65  ith the lock spe
f630: 63 69 66 69 65 64 20 62 79 20 70 61 72 61 6d 65  cified by parame
f640: 74 65 72 20 6c 6f 63 6b 74 79 70 65 20 2d 20 6f  ter locktype - o
f650: 6e 65 0a 2a 2a 20 6f 66 20 74 68 65 20 66 6f 6c  ne.** of the fol
f660: 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20  lowing:.**.**   
f670: 20 20 28 31 29 20 53 48 41 52 45 44 5f 4c 4f 43    (1) SHARED_LOC
f680: 4b 0a 2a 2a 20 20 20 20 20 28 32 29 20 52 45 53  K.**     (2) RES
f690: 45 52 56 45 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20  ERVED_LOCK.**   
f6a0: 20 20 28 33 29 20 50 45 4e 44 49 4e 47 5f 4c 4f    (3) PENDING_LO
f6b0: 43 4b 0a 2a 2a 20 20 20 20 20 28 34 29 20 45 58  CK.**     (4) EX
f6c0: 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 0a 2a 2a 0a  CLUSIVE_LOCK.**.
f6d0: 2a 2a 20 53 6f 6d 65 74 69 6d 65 73 20 77 68 65  ** Sometimes whe
f6e0: 6e 20 72 65 71 75 65 73 74 69 6e 67 20 6f 6e 65  n requesting one
f6f0: 20 6c 6f 63 6b 20 73 74 61 74 65 2c 20 61 64 64   lock state, add
f700: 69 74 69 6f 6e 61 6c 20 6c 6f 63 6b 20 73 74 61  itional lock sta
f710: 74 65 73 0a 2a 2a 20 61 72 65 20 69 6e 73 65 72  tes.** are inser
f720: 74 65 64 20 69 6e 20 62 65 74 77 65 65 6e 2e 20  ted in between. 
f730: 20 54 68 65 20 6c 6f 63 6b 69 6e 67 20 6d 69 67   The locking mig
f740: 68 74 20 66 61 69 6c 20 6f 6e 20 6f 6e 65 20 6f  ht fail on one o
f750: 66 20 74 68 65 20 6c 61 74 65 72 0a 2a 2a 20 74  f the later.** t
f760: 72 61 6e 73 69 74 69 6f 6e 73 20 6c 65 61 76 69  ransitions leavi
f770: 6e 67 20 74 68 65 20 6c 6f 63 6b 20 73 74 61 74  ng the lock stat
f780: 65 20 64 69 66 66 65 72 65 6e 74 20 66 72 6f 6d  e different from
f790: 20 77 68 61 74 20 69 74 20 73 74 61 72 74 65 64   what it started
f7a0: 20 62 75 74 0a 2a 2a 20 73 74 69 6c 6c 20 73 68   but.** still sh
f7b0: 6f 72 74 20 6f 66 20 69 74 73 20 67 6f 61 6c 2e  ort of its goal.
f7c0: 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20    The following 
f7d0: 63 68 61 72 74 20 73 68 6f 77 73 20 74 68 65 20  chart shows the 
f7e0: 61 6c 6c 6f 77 65 64 0a 2a 2a 20 74 72 61 6e 73  allowed.** trans
f7f0: 69 74 69 6f 6e 73 20 61 6e 64 20 74 68 65 20 69  itions and the i
f800: 6e 73 65 72 74 65 64 20 69 6e 74 65 72 6d 65 64  nserted intermed
f810: 69 61 74 65 20 73 74 61 74 65 73 3a 0a 2a 2a 0a  iate states:.**.
f820: 2a 2a 20 20 20 20 55 4e 4c 4f 43 4b 45 44 20 2d  **    UNLOCKED -
f830: 3e 20 53 48 41 52 45 44 0a 2a 2a 20 20 20 20 53  > SHARED.**    S
f840: 48 41 52 45 44 20 2d 3e 20 52 45 53 45 52 56 45  HARED -> RESERVE
f850: 44 0a 2a 2a 20 20 20 20 53 48 41 52 45 44 20 2d  D.**    SHARED -
f860: 3e 20 28 50 45 4e 44 49 4e 47 29 20 2d 3e 20 45  > (PENDING) -> E
f870: 58 43 4c 55 53 49 56 45 0a 2a 2a 20 20 20 20 52  XCLUSIVE.**    R
f880: 45 53 45 52 56 45 44 20 2d 3e 20 28 50 45 4e 44  ESERVED -> (PEND
f890: 49 4e 47 29 20 2d 3e 20 45 58 43 4c 55 53 49 56  ING) -> EXCLUSIV
f8a0: 45 0a 2a 2a 20 20 20 20 50 45 4e 44 49 4e 47 20  E.**    PENDING 
f8b0: 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 0a  -> EXCLUSIVE.**.
f8c0: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
f8d0: 77 69 6c 6c 20 6f 6e 6c 79 20 69 6e 63 72 65 61  will only increa
f8e0: 73 65 20 61 20 6c 6f 63 6b 2e 20 20 55 73 65 20  se a lock.  Use 
f8f0: 74 68 65 20 73 71 6c 69 74 65 33 4f 73 55 6e 6c  the sqlite3OsUnl
f900: 6f 63 6b 28 29 0a 2a 2a 20 72 6f 75 74 69 6e 65  ock().** routine
f910: 20 74 6f 20 6c 6f 77 65 72 20 61 20 6c 6f 63 6b   to lower a lock
f920: 69 6e 67 20 6c 65 76 65 6c 2e 0a 2a 2a 0a 2a 2a  ing level..**.**
f930: 20 57 69 74 68 20 64 6f 74 66 69 6c 65 20 6c 6f   With dotfile lo
f940: 63 6b 69 6e 67 2c 20 77 65 20 72 65 61 6c 6c 79  cking, we really
f950: 20 6f 6e 6c 79 20 73 75 70 70 6f 72 74 20 73 74   only support st
f960: 61 74 65 20 28 34 29 3a 20 45 58 43 4c 55 53 49  ate (4): EXCLUSI
f970: 56 45 2e 0a 2a 2a 20 42 75 74 20 77 65 20 74 72  VE..** But we tr
f980: 61 63 6b 20 74 68 65 20 6f 74 68 65 72 20 6c 6f  ack the other lo
f990: 63 6b 69 6e 67 20 6c 65 76 65 6c 73 20 69 6e 74  cking levels int
f9a0: 65 72 6e 61 6c 6c 79 2e 0a 2a 2f 0a 73 74 61 74  ernally..*/.stat
f9b0: 69 63 20 69 6e 74 20 64 6f 74 6c 6f 63 6b 4c 6f  ic int dotlockLo
f9c0: 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  ck(sqlite3_file 
f9d0: 2a 69 64 2c 20 69 6e 74 20 6c 6f 63 6b 74 79 70  *id, int locktyp
f9e0: 65 29 20 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20  e) {.  unixFile 
f9f0: 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69  *pFile = (unixFi
fa00: 6c 65 2a 29 69 64 3b 0a 20 20 69 6e 74 20 66 64  le*)id;.  int fd
fa10: 3b 0a 20 20 63 68 61 72 20 2a 7a 4c 6f 63 6b 46  ;.  char *zLockF
fa20: 69 6c 65 20 3d 20 28 63 68 61 72 20 2a 29 70 46  ile = (char *)pF
fa30: 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74  ile->lockingCont
fa40: 65 78 74 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20  ext;.  int rc = 
fa50: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 0a 20 20 2f  SQLITE_OK;...  /
fa60: 2a 20 49 66 20 77 65 20 68 61 76 65 20 61 6e 79  * If we have any
fa70: 20 6c 6f 63 6b 2c 20 74 68 65 6e 20 74 68 65 20   lock, then the 
fa80: 6c 6f 63 6b 20 66 69 6c 65 20 61 6c 72 65 61 64  lock file alread
fa90: 79 20 65 78 69 73 74 73 2e 20 20 41 6c 6c 20 77  y exists.  All w
faa0: 65 20 68 61 76 65 0a 20 20 2a 2a 20 74 6f 20 64  e have.  ** to d
fab0: 6f 20 69 73 20 61 64 6a 75 73 74 20 6f 75 72 20  o is adjust our 
fac0: 69 6e 74 65 72 6e 61 6c 20 72 65 63 6f 72 64 20  internal record 
fad0: 6f 66 20 74 68 65 20 6c 6f 63 6b 20 6c 65 76 65  of the lock leve
fae0: 6c 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 46  l..  */.  if( pF
faf0: 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 20 3e 20  ile->locktype > 
fb00: 4e 4f 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 70  NO_LOCK ){.    p
fb10: 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 20 3d  File->locktype =
fb20: 20 6c 6f 63 6b 74 79 70 65 3b 0a 23 69 66 20 21   locktype;.#if !
fb30: 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20 20 20 2f  OS_VXWORKS.    /
fb40: 2a 20 41 6c 77 61 79 73 20 75 70 64 61 74 65 20  * Always update 
fb50: 74 68 65 20 74 69 6d 65 73 74 61 6d 70 20 6f 6e  the timestamp on
fb60: 20 74 68 65 20 6f 6c 64 20 66 69 6c 65 20 2a 2f   the old file */
fb70: 0a 20 20 20 20 75 74 69 6d 65 73 28 7a 4c 6f 63  .    utimes(zLoc
fb80: 6b 46 69 6c 65 2c 20 4e 55 4c 4c 29 3b 0a 23 65  kFile, NULL);.#e
fb90: 6e 64 69 66 0a 20 20 20 20 72 65 74 75 72 6e 20  ndif.    return 
fba0: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20  SQLITE_OK;.  }. 
fbb0: 20 0a 20 20 2f 2a 20 67 72 61 62 20 61 6e 20 65   .  /* grab an e
fbc0: 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20 2a 2f  xclusive lock */
fbd0: 0a 20 20 66 64 20 3d 20 6f 70 65 6e 28 7a 4c 6f  .  fd = open(zLo
fbe0: 63 6b 46 69 6c 65 2c 4f 5f 52 44 4f 4e 4c 59 7c  ckFile,O_RDONLY|
fbf0: 4f 5f 43 52 45 41 54 7c 4f 5f 45 58 43 4c 2c 30  O_CREAT|O_EXCL,0
fc00: 36 30 30 29 3b 0a 20 20 69 66 28 20 66 64 3c 30  600);.  if( fd<0
fc10: 20 29 7b 0a 20 20 20 20 2f 2a 20 66 61 69 6c 65   ){.    /* faile
fc20: 64 20 74 6f 20 6f 70 65 6e 2f 63 72 65 61 74 65  d to open/create
fc30: 20 74 68 65 20 66 69 6c 65 2c 20 73 6f 6d 65 6f   the file, someo
fc40: 6e 65 20 65 6c 73 65 20 6d 61 79 20 68 61 76 65  ne else may have
fc50: 20 73 74 6f 6c 65 6e 20 74 68 65 20 6c 6f 63 6b   stolen the lock
fc60: 20 2a 2f 0a 20 20 20 20 69 6e 74 20 74 45 72 72   */.    int tErr
fc70: 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20  no = errno;.    
fc80: 69 66 28 20 45 45 58 49 53 54 20 3d 3d 20 74 45  if( EEXIST == tE
fc90: 72 72 6e 6f 20 29 7b 0a 20 20 20 20 20 20 72 63  rrno ){.      rc
fca0: 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a   = SQLITE_BUSY;.
fcb0: 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20      } else {.   
fcc0: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 45 72     rc = sqliteEr
fcd0: 72 6f 72 46 72 6f 6d 50 6f 73 69 78 45 72 72 6f  rorFromPosixErro
fce0: 72 28 74 45 72 72 6e 6f 2c 20 53 51 4c 49 54 45  r(tErrno, SQLITE
fcf0: 5f 49 4f 45 52 52 5f 4c 4f 43 4b 29 3b 0a 20 20  _IOERR_LOCK);.  
fd00: 20 20 20 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f      if( IS_LOCK_
fd10: 45 52 52 4f 52 28 72 63 29 20 29 7b 0a 20 20 20  ERROR(rc) ){.   
fd20: 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74       pFile->last
fd30: 45 72 72 6e 6f 20 3d 20 74 45 72 72 6e 6f 3b 0a  Errno = tErrno;.
fd40: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
fd50: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d    return rc;.  }
fd60: 20 0a 20 20 69 66 28 20 63 6c 6f 73 65 28 66 64   .  if( close(fd
fd70: 29 20 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e  ) ){.    pFile->
fd80: 6c 61 73 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e  lastErrno = errn
fd90: 6f 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  o;.    rc = SQLI
fda0: 54 45 5f 49 4f 45 52 52 5f 43 4c 4f 53 45 3b 0a  TE_IOERR_CLOSE;.
fdb0: 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 67 6f 74 20    }.  .  /* got 
fdc0: 69 74 2c 20 73 65 74 20 74 68 65 20 74 79 70 65  it, set the type
fdd0: 20 61 6e 64 20 72 65 74 75 72 6e 20 6f 6b 20 2a   and return ok *
fde0: 2f 0a 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74  /.  pFile->lockt
fdf0: 79 70 65 20 3d 20 6c 6f 63 6b 74 79 70 65 3b 0a  ype = locktype;.
fe00: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
fe10: 2f 2a 0a 2a 2a 20 4c 6f 77 65 72 20 74 68 65 20  /*.** Lower the 
fe20: 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 6e  locking level on
fe30: 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
fe40: 20 70 46 69 6c 65 20 74 6f 20 6c 6f 63 6b 74 79   pFile to lockty
fe50: 70 65 2e 20 20 6c 6f 63 6b 74 79 70 65 0a 2a 2a  pe.  locktype.**
fe60: 20 6d 75 73 74 20 62 65 20 65 69 74 68 65 72 20   must be either 
fe70: 4e 4f 5f 4c 4f 43 4b 20 6f 72 20 53 48 41 52 45  NO_LOCK or SHARE
fe80: 44 5f 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66  D_LOCK..**.** If
fe90: 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76   the locking lev
fea0: 65 6c 20 6f 66 20 74 68 65 20 66 69 6c 65 20 64  el of the file d
feb0: 65 73 63 72 69 70 74 6f 72 20 69 73 20 61 6c 72  escriptor is alr
fec0: 65 61 64 79 20 61 74 20 6f 72 20 62 65 6c 6f 77  eady at or below
fed0: 0a 2a 2a 20 74 68 65 20 72 65 71 75 65 73 74 65  .** the requeste
fee0: 64 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 2c  d locking level,
fef0: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
ff00: 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20   a no-op..**.** 
ff10: 57 68 65 6e 20 74 68 65 20 6c 6f 63 6b 69 6e 67  When the locking
ff20: 20 6c 65 76 65 6c 20 72 65 61 63 68 65 73 20 4e   level reaches N
ff30: 4f 5f 4c 4f 43 4b 2c 20 64 65 6c 65 74 65 20 74  O_LOCK, delete t
ff40: 68 65 20 6c 6f 63 6b 20 66 69 6c 65 2e 0a 2a 2f  he lock file..*/
ff50: 0a 73 74 61 74 69 63 20 69 6e 74 20 64 6f 74 6c  .static int dotl
ff60: 6f 63 6b 55 6e 6c 6f 63 6b 28 73 71 6c 69 74 65  ockUnlock(sqlite
ff70: 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20  3_file *id, int 
ff80: 6c 6f 63 6b 74 79 70 65 29 20 7b 0a 20 20 75 6e  locktype) {.  un
ff90: 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20  ixFile *pFile = 
ffa0: 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20  (unixFile*)id;. 
ffb0: 20 63 68 61 72 20 2a 7a 4c 6f 63 6b 46 69 6c 65   char *zLockFile
ffc0: 20 3d 20 28 63 68 61 72 20 2a 29 70 46 69 6c 65   = (char *)pFile
ffd0: 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  ->lockingContext
ffe0: 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 46 69  ;..  assert( pFi
fff0: 6c 65 20 29 3b 0a 20 20 4f 53 54 52 41 43 45 35  le );.  OSTRACE5
10000 28 22 55 4e 4c 4f 43 4b 20 20 25 64 20 25 64 20  ("UNLOCK  %d %d 
10010 77 61 73 20 25 64 20 70 69 64 3d 25 64 20 28 64  was %d pid=%d (d
10020 6f 74 6c 6f 63 6b 29 5c 6e 22 2c 20 70 46 69 6c  otlock)\n", pFil
10030 65 2d 3e 68 2c 20 6c 6f 63 6b 74 79 70 65 2c 0a  e->h, locktype,.
10040 09 20 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74  .   pFile->lockt
10050 79 70 65 2c 20 67 65 74 70 69 64 28 29 29 3b 0a  ype, getpid());.
10060 20 20 61 73 73 65 72 74 28 20 6c 6f 63 6b 74 79    assert( lockty
10070 70 65 3c 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20  pe<=SHARED_LOCK 
10080 29 3b 0a 20 20 0a 20 20 2f 2a 20 6e 6f 2d 6f 70  );.  .  /* no-op
10090 20 69 66 20 70 6f 73 73 69 62 6c 65 20 2a 2f 0a   if possible */.
100a0 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 6c 6f 63    if( pFile->loc
100b0 6b 74 79 70 65 3d 3d 6c 6f 63 6b 74 79 70 65 20  ktype==locktype 
100c0 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
100d0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20  LITE_OK;.  }..  
100e0 2f 2a 20 54 6f 20 64 6f 77 6e 67 72 61 64 65 20  /* To downgrade 
100f0 74 6f 20 73 68 61 72 65 64 2c 20 73 69 6d 70 6c  to shared, simpl
10100 79 20 75 70 64 61 74 65 20 6f 75 72 20 69 6e 74  y update our int
10110 65 72 6e 61 6c 20 6e 6f 74 69 6f 6e 20 6f 66 20  ernal notion of 
10120 74 68 65 0a 20 20 2a 2a 20 6c 6f 63 6b 20 73 74  the.  ** lock st
10130 61 74 65 2e 20 20 4e 6f 20 6e 65 65 64 20 74 6f  ate.  No need to
10140 20 6d 65 73 73 20 77 69 74 68 20 74 68 65 20 66   mess with the f
10150 69 6c 65 20 6f 6e 20 64 69 73 6b 2e 0a 20 20 2a  ile on disk..  *
10160 2f 0a 20 20 69 66 28 20 6c 6f 63 6b 74 79 70 65  /.  if( locktype
10170 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 7b  ==SHARED_LOCK ){
10180 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b  .    pFile->lock
10190 74 79 70 65 20 3d 20 53 48 41 52 45 44 5f 4c 4f  type = SHARED_LO
101a0 43 4b 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53  CK;.    return S
101b0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20  QLITE_OK;.  }.  
101c0 0a 20 20 2f 2a 20 54 6f 20 66 75 6c 6c 79 20 75  .  /* To fully u
101d0 6e 6c 6f 63 6b 20 74 68 65 20 64 61 74 61 62 61  nlock the databa
101e0 73 65 2c 20 64 65 6c 65 74 65 20 74 68 65 20 6c  se, delete the l
101f0 6f 63 6b 20 66 69 6c 65 20 2a 2f 0a 20 20 61 73  ock file */.  as
10200 73 65 72 74 28 20 6c 6f 63 6b 74 79 70 65 3d 3d  sert( locktype==
10210 4e 4f 5f 4c 4f 43 4b 20 29 3b 0a 20 20 69 66 28  NO_LOCK );.  if(
10220 20 75 6e 6c 69 6e 6b 28 7a 4c 6f 63 6b 46 69 6c   unlink(zLockFil
10230 65 29 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 63  e) ){.    int rc
10240 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 74 45   = 0;.    int tE
10250 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20  rrno = errno;.  
10260 20 20 69 66 28 20 45 4e 4f 45 4e 54 20 21 3d 20    if( ENOENT != 
10270 74 45 72 72 6e 6f 20 29 7b 0a 20 20 20 20 20 20  tErrno ){.      
10280 72 63 20 3d 20 73 71 6c 69 74 65 45 72 72 6f 72  rc = sqliteError
10290 46 72 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28 74  FromPosixError(t
102a0 45 72 72 6e 6f 2c 20 53 51 4c 49 54 45 5f 49 4f  Errno, SQLITE_IO
102b0 45 52 52 5f 55 4e 4c 4f 43 4b 29 3b 0a 20 20 20  ERR_UNLOCK);.   
102c0 20 7d 0a 20 20 20 20 69 66 28 20 49 53 5f 4c 4f   }.    if( IS_LO
102d0 43 4b 5f 45 52 52 4f 52 28 72 63 29 20 29 7b 0a  CK_ERROR(rc) ){.
102e0 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73        pFile->las
102f0 74 45 72 72 6e 6f 20 3d 20 74 45 72 72 6e 6f 3b  tErrno = tErrno;
10300 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72  .    }.    retur
10310 6e 20 72 63 3b 20 0a 20 20 7d 0a 20 20 70 46 69  n rc; .  }.  pFi
10320 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 20 3d 20 4e  le->locktype = N
10330 4f 5f 4c 4f 43 4b 3b 0a 20 20 72 65 74 75 72 6e  O_LOCK;.  return
10340 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
10350 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 20 66 69 6c  *.** Close a fil
10360 65 2e 20 20 4d 61 6b 65 20 73 75 72 65 20 74 68  e.  Make sure th
10370 65 20 6c 6f 63 6b 20 68 61 73 20 62 65 65 6e 20  e lock has been 
10380 72 65 6c 65 61 73 65 64 20 62 65 66 6f 72 65 20  released before 
10390 63 6c 6f 73 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74  closing..*/.stat
103a0 69 63 20 69 6e 74 20 64 6f 74 6c 6f 63 6b 43 6c  ic int dotlockCl
103b0 6f 73 65 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  ose(sqlite3_file
103c0 20 2a 69 64 29 20 7b 0a 20 20 69 6e 74 20 72 63   *id) {.  int rc
103d0 3b 0a 20 20 69 66 28 20 69 64 20 29 7b 0a 20 20  ;.  if( id ){.  
103e0 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c    unixFile *pFil
103f0 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69  e = (unixFile*)i
10400 64 3b 0a 20 20 20 20 64 6f 74 6c 6f 63 6b 55 6e  d;.    dotlockUn
10410 6c 6f 63 6b 28 69 64 2c 20 4e 4f 5f 4c 4f 43 4b  lock(id, NO_LOCK
10420 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  );.    sqlite3_f
10430 72 65 65 28 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69  ree(pFile->locki
10440 6e 67 43 6f 6e 74 65 78 74 29 3b 0a 20 20 7d 0a  ngContext);.  }.
10450 20 20 72 63 20 3d 20 63 6c 6f 73 65 55 6e 69 78    rc = closeUnix
10460 46 69 6c 65 28 69 64 29 3b 0a 20 20 72 65 74 75  File(id);.  retu
10470 72 6e 20 72 63 3b 0a 7d 0a 2f 2a 2a 2a 2a 2a 2a  rn rc;.}./******
10480 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64  ************ End
10490 20 6f 66 20 74 68 65 20 64 6f 74 2d 66 69 6c 65   of the dot-file
104a0 20 6c 6f 63 6b 20 69 6d 70 6c 65 6d 65 6e 74 61   lock implementa
104b0 74 69 6f 6e 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  tion ***********
104c0 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a  ********.*******
104d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
104e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
104f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10500 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10510 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 2a 2a 2a 2a  *******/../*****
10520 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10530 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10540 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10550 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10560 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a  *********.******
10570 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10580 2a 2a 2a 2a 20 42 65 67 69 6e 20 66 6c 6f 63 6b  **** Begin flock
10590 20 4c 6f 63 6b 69 6e 67 20 2a 2a 2a 2a 2a 2a 2a   Locking *******
105a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
105b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20  *********.**.** 
105c0 55 73 65 20 74 68 65 20 66 6c 6f 63 6b 28 29 20  Use the flock() 
105d0 73 79 73 74 65 6d 20 63 61 6c 6c 20 74 6f 20 64  system call to d
105e0 6f 20 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 2e 0a  o file locking..
105f0 2a 2a 0a 2a 2a 20 66 6c 6f 63 6b 28 29 20 6c 6f  **.** flock() lo
10600 63 6b 69 6e 67 20 69 73 20 6c 69 6b 65 20 64 6f  cking is like do
10610 74 2d 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 20 69  t-file locking i
10620 6e 20 74 68 61 74 20 74 68 65 20 76 61 72 69 6f  n that the vario
10630 75 73 0a 2a 2a 20 66 69 6e 65 2d 67 72 61 69 6e  us.** fine-grain
10640 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 73 20   locking levels 
10650 73 75 70 70 6f 72 74 65 64 20 62 79 20 53 51 4c  supported by SQL
10660 69 74 65 20 61 72 65 20 63 6f 6c 6c 61 70 73 65  ite are collapse
10670 64 20 69 6e 74 6f 0a 2a 2a 20 61 20 73 69 6e 67  d into.** a sing
10680 6c 65 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63  le exclusive loc
10690 6b 2e 20 20 49 6e 20 6f 74 68 65 72 20 77 6f 72  k.  In other wor
106a0 64 73 2c 20 53 48 41 52 45 44 2c 20 52 45 53 45  ds, SHARED, RESE
106b0 52 56 45 44 2c 20 61 6e 64 0a 2a 2a 20 50 45 4e  RVED, and.** PEN
106c0 44 49 4e 47 20 6c 6f 63 6b 73 20 61 72 65 20 74  DING locks are t
106d0 68 65 20 73 61 6d 65 20 74 68 69 6e 67 20 61 73  he same thing as
106e0 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f   an EXCLUSIVE lo
106f0 63 6b 2e 20 20 53 51 4c 69 74 65 0a 2a 2a 20 73  ck.  SQLite.** s
10700 74 69 6c 6c 20 77 6f 72 6b 73 20 77 68 65 6e 20  till works when 
10710 79 6f 75 20 64 6f 20 74 68 69 73 2c 20 62 75 74  you do this, but
10720 20 63 6f 6e 63 75 72 72 65 6e 63 79 20 69 73 20   concurrency is 
10730 72 65 64 75 63 65 64 20 73 69 6e 63 65 0a 2a 2a  reduced since.**
10740 20 6f 6e 6c 79 20 61 20 73 69 6e 67 6c 65 20 70   only a single p
10750 72 6f 63 65 73 73 20 63 61 6e 20 62 65 20 72 65  rocess can be re
10760 61 64 69 6e 67 20 74 68 65 20 64 61 74 61 62 61  ading the databa
10770 73 65 20 61 74 20 61 20 74 69 6d 65 2e 0a 2a 2a  se at a time..**
10780 0a 2a 2a 20 4f 6d 69 74 20 74 68 69 73 20 73 65  .** Omit this se
10790 63 74 69 6f 6e 20 69 66 20 53 51 4c 49 54 45 5f  ction if SQLITE_
107a0 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53  ENABLE_LOCKING_S
107b0 54 59 4c 45 20 69 73 20 74 75 72 6e 65 64 20 6f  TYLE is turned o
107c0 66 66 20 6f 72 20 69 66 0a 2a 2a 20 63 6f 6d 70  ff or if.** comp
107d0 69 6c 69 6e 67 20 66 6f 72 20 56 58 57 4f 52 4b  iling for VXWORK
107e0 53 2e 0a 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45  S..*/.#if SQLITE
107f0 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f  _ENABLE_LOCKING_
10800 53 54 59 4c 45 20 26 26 20 21 4f 53 5f 56 58 57  STYLE && !OS_VXW
10810 4f 52 4b 53 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  ORKS../*.** This
10820 20 72 6f 75 74 69 6e 65 20 63 68 65 63 6b 73 20   routine checks 
10830 69 66 20 74 68 65 72 65 20 69 73 20 61 20 52 45  if there is a RE
10840 53 45 52 56 45 44 20 6c 6f 63 6b 20 68 65 6c 64  SERVED lock held
10850 20 6f 6e 20 74 68 65 20 73 70 65 63 69 66 69 65   on the specifie
10860 64 0a 2a 2a 20 66 69 6c 65 20 62 79 20 74 68 69  d.** file by thi
10870 73 20 6f 72 20 61 6e 79 20 6f 74 68 65 72 20 70  s or any other p
10880 72 6f 63 65 73 73 2e 20 49 66 20 73 75 63 68 20  rocess. If such 
10890 61 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64 2c 20  a lock is held, 
108a0 73 65 74 20 2a 70 52 65 73 4f 75 74 0a 2a 2a 20  set *pResOut.** 
108b0 74 6f 20 61 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61  to a non-zero va
108c0 6c 75 65 20 6f 74 68 65 72 77 69 73 65 20 2a 70  lue otherwise *p
108d0 52 65 73 4f 75 74 20 69 73 20 73 65 74 20 74 6f  ResOut is set to
108e0 20 7a 65 72 6f 2e 20 20 54 68 65 20 72 65 74 75   zero.  The retu
108f0 72 6e 20 76 61 6c 75 65 0a 2a 2a 20 69 73 20 73  rn value.** is s
10900 65 74 20 74 6f 20 53 51 4c 49 54 45 5f 4f 4b 20  et to SQLITE_OK 
10910 75 6e 6c 65 73 73 20 61 6e 20 49 2f 4f 20 65 72  unless an I/O er
10920 72 6f 72 20 6f 63 63 75 72 73 20 64 75 72 69 6e  ror occurs durin
10930 67 20 6c 6f 63 6b 20 63 68 65 63 6b 69 6e 67 2e  g lock checking.
10940 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66  .*/.static int f
10950 6c 6f 63 6b 43 68 65 63 6b 52 65 73 65 72 76 65  lockCheckReserve
10960 64 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69  dLock(sqlite3_fi
10970 6c 65 20 2a 69 64 2c 20 69 6e 74 20 2a 70 52 65  le *id, int *pRe
10980 73 4f 75 74 29 7b 0a 20 20 69 6e 74 20 72 63 20  sOut){.  int rc 
10990 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69  = SQLITE_OK;.  i
109a0 6e 74 20 72 65 73 65 72 76 65 64 20 3d 20 30 3b  nt reserved = 0;
109b0 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69  .  unixFile *pFi
109c0 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29  le = (unixFile*)
109d0 69 64 3b 0a 20 20 0a 20 20 53 69 6d 75 6c 61 74  id;.  .  Simulat
109e0 65 49 4f 45 72 72 6f 72 28 20 72 65 74 75 72 6e  eIOError( return
109f0 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43 48   SQLITE_IOERR_CH
10a00 45 43 4b 52 45 53 45 52 56 45 44 4c 4f 43 4b 3b  ECKRESERVEDLOCK;
10a10 20 29 3b 0a 20 20 0a 20 20 61 73 73 65 72 74 28   );.  .  assert(
10a20 20 70 46 69 6c 65 20 29 3b 0a 20 20 0a 20 20 2f   pFile );.  .  /
10a30 2a 20 43 68 65 63 6b 20 69 66 20 61 20 74 68 72  * Check if a thr
10a40 65 61 64 20 69 6e 20 74 68 69 73 20 70 72 6f 63  ead in this proc
10a50 65 73 73 20 68 6f 6c 64 73 20 73 75 63 68 20 61  ess holds such a
10a60 20 6c 6f 63 6b 20 2a 2f 0a 20 20 69 66 28 20 70   lock */.  if( p
10a70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3e 53  File->locktype>S
10a80 48 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20  HARED_LOCK ){.  
10a90 20 20 72 65 73 65 72 76 65 64 20 3d 20 31 3b 0a    reserved = 1;.
10aa0 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 4f 74 68 65    }.  .  /* Othe
10ab0 72 77 69 73 65 20 73 65 65 20 69 66 20 73 6f 6d  rwise see if som
10ac0 65 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20  e other process 
10ad0 68 6f 6c 64 73 20 69 74 2e 20 2a 2f 0a 20 20 69  holds it. */.  i
10ae0 66 28 20 21 72 65 73 65 72 76 65 64 20 29 7b 0a  f( !reserved ){.
10af0 20 20 20 20 2f 2a 20 61 74 74 65 6d 70 74 20 74      /* attempt t
10b00 6f 20 67 65 74 20 74 68 65 20 6c 6f 63 6b 20 2a  o get the lock *
10b10 2f 0a 20 20 20 20 69 6e 74 20 6c 72 63 20 3d 20  /.    int lrc = 
10b20 66 6c 6f 63 6b 28 70 46 69 6c 65 2d 3e 68 2c 20  flock(pFile->h, 
10b30 4c 4f 43 4b 5f 45 58 20 7c 20 4c 4f 43 4b 5f 4e  LOCK_EX | LOCK_N
10b40 42 29 3b 0a 20 20 20 20 69 66 28 20 21 6c 72 63  B);.    if( !lrc
10b50 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 67 6f 74   ){.      /* got
10b60 20 74 68 65 20 6c 6f 63 6b 2c 20 75 6e 6c 6f 63   the lock, unloc
10b70 6b 20 69 74 20 2a 2f 0a 20 20 20 20 20 20 6c 72  k it */.      lr
10b80 63 20 3d 20 66 6c 6f 63 6b 28 70 46 69 6c 65 2d  c = flock(pFile-
10b90 3e 68 2c 20 4c 4f 43 4b 5f 55 4e 29 3b 0a 20 20  >h, LOCK_UN);.  
10ba0 20 20 20 20 69 66 20 28 20 6c 72 63 20 29 20 7b      if ( lrc ) {
10bb0 0a 20 20 20 20 20 20 20 20 69 6e 74 20 74 45 72  .        int tEr
10bc0 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20  rno = errno;.   
10bd0 20 20 20 20 20 2f 2a 20 75 6e 6c 6f 63 6b 20 66       /* unlock f
10be0 61 69 6c 65 64 20 77 69 74 68 20 61 6e 20 65 72  ailed with an er
10bf0 72 6f 72 20 2a 2f 0a 20 20 20 20 20 20 20 20 6c  ror */.        l
10c00 72 63 20 3d 20 73 71 6c 69 74 65 45 72 72 6f 72  rc = sqliteError
10c10 46 72 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28 74  FromPosixError(t
10c20 45 72 72 6e 6f 2c 20 53 51 4c 49 54 45 5f 49 4f  Errno, SQLITE_IO
10c30 45 52 52 5f 55 4e 4c 4f 43 4b 29 3b 20 0a 20 20  ERR_UNLOCK); .  
10c40 20 20 20 20 20 20 69 66 28 20 49 53 5f 4c 4f 43        if( IS_LOC
10c50 4b 5f 45 52 52 4f 52 28 6c 72 63 29 20 29 7b 0a  K_ERROR(lrc) ){.
10c60 20 20 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d            pFile-
10c70 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 74 45 72  >lastErrno = tEr
10c80 72 6e 6f 3b 0a 20 20 20 20 20 20 20 20 20 20 72  rno;.          r
10c90 63 20 3d 20 6c 72 63 3b 0a 20 20 20 20 20 20 20  c = lrc;.       
10ca0 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
10cb0 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 69 6e   else {.      in
10cc0 74 20 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f  t tErrno = errno
10cd0 3b 0a 20 20 20 20 20 20 72 65 73 65 72 76 65 64  ;.      reserved
10ce0 20 3d 20 31 3b 0a 20 20 20 20 20 20 2f 2a 20 73   = 1;.      /* s
10cf0 6f 6d 65 6f 6e 65 20 65 6c 73 65 20 6d 69 67 68  omeone else migh
10d00 74 20 68 61 76 65 20 69 74 20 72 65 73 65 72 76  t have it reserv
10d10 65 64 20 2a 2f 0a 20 20 20 20 20 20 6c 72 63 20  ed */.      lrc 
10d20 3d 20 73 71 6c 69 74 65 45 72 72 6f 72 46 72 6f  = sqliteErrorFro
10d30 6d 50 6f 73 69 78 45 72 72 6f 72 28 74 45 72 72  mPosixError(tErr
10d40 6e 6f 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  no, SQLITE_IOERR
10d50 5f 4c 4f 43 4b 29 3b 20 0a 20 20 20 20 20 20 69  _LOCK); .      i
10d60 66 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52  f( IS_LOCK_ERROR
10d70 28 6c 72 63 29 20 29 7b 0a 20 20 20 20 20 20 20  (lrc) ){.       
10d80 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e   pFile->lastErrn
10d90 6f 20 3d 20 74 45 72 72 6e 6f 3b 0a 20 20 20 20  o = tErrno;.    
10da0 20 20 20 20 72 63 20 3d 20 6c 72 63 3b 0a 20 20      rc = lrc;.  
10db0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
10dc0 20 20 4f 53 54 52 41 43 45 34 28 22 54 45 53 54    OSTRACE4("TEST
10dd0 20 57 52 2d 4c 4f 43 4b 20 25 64 20 25 64 20 25   WR-LOCK %d %d %
10de0 64 20 28 66 6c 6f 63 6b 29 5c 6e 22 2c 20 70 46  d (flock)\n", pF
10df0 69 6c 65 2d 3e 68 2c 20 72 63 2c 20 72 65 73 65  ile->h, rc, rese
10e00 72 76 65 64 29 3b 0a 0a 23 69 66 64 65 66 20 53  rved);..#ifdef S
10e10 51 4c 49 54 45 5f 49 47 4e 4f 52 45 5f 46 4c 4f  QLITE_IGNORE_FLO
10e20 43 4b 5f 4c 4f 43 4b 5f 45 52 52 4f 52 53 0a 20  CK_LOCK_ERRORS. 
10e30 20 69 66 28 20 28 72 63 20 26 20 53 51 4c 49 54   if( (rc & SQLIT
10e40 45 5f 49 4f 45 52 52 29 20 3d 3d 20 53 51 4c 49  E_IOERR) == SQLI
10e50 54 45 5f 49 4f 45 52 52 20 29 7b 0a 20 20 20 20  TE_IOERR ){.    
10e60 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
10e70 20 20 20 20 72 65 73 65 72 76 65 64 3d 31 3b 0a      reserved=1;.
10e80 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51    }.#endif /* SQ
10e90 4c 49 54 45 5f 49 47 4e 4f 52 45 5f 46 4c 4f 43  LITE_IGNORE_FLOC
10ea0 4b 5f 4c 4f 43 4b 5f 45 52 52 4f 52 53 20 2a 2f  K_LOCK_ERRORS */
10eb0 0a 20 20 2a 70 52 65 73 4f 75 74 20 3d 20 72 65  .  *pResOut = re
10ec0 73 65 72 76 65 64 3b 0a 20 20 72 65 74 75 72 6e  served;.  return
10ed0 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f   rc;.}../*.** Lo
10ee0 63 6b 20 74 68 65 20 66 69 6c 65 20 77 69 74 68  ck the file with
10ef0 20 74 68 65 20 6c 6f 63 6b 20 73 70 65 63 69 66   the lock specif
10f00 69 65 64 20 62 79 20 70 61 72 61 6d 65 74 65 72  ied by parameter
10f10 20 6c 6f 63 6b 74 79 70 65 20 2d 20 6f 6e 65 0a   locktype - one.
10f20 2a 2a 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77  ** of the follow
10f30 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28  ing:.**.**     (
10f40 31 29 20 53 48 41 52 45 44 5f 4c 4f 43 4b 0a 2a  1) SHARED_LOCK.*
10f50 2a 20 20 20 20 20 28 32 29 20 52 45 53 45 52 56  *     (2) RESERV
10f60 45 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28  ED_LOCK.**     (
10f70 33 29 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 0a  3) PENDING_LOCK.
10f80 2a 2a 20 20 20 20 20 28 34 29 20 45 58 43 4c 55  **     (4) EXCLU
10f90 53 49 56 45 5f 4c 4f 43 4b 0a 2a 2a 0a 2a 2a 20  SIVE_LOCK.**.** 
10fa0 53 6f 6d 65 74 69 6d 65 73 20 77 68 65 6e 20 72  Sometimes when r
10fb0 65 71 75 65 73 74 69 6e 67 20 6f 6e 65 20 6c 6f  equesting one lo
10fc0 63 6b 20 73 74 61 74 65 2c 20 61 64 64 69 74 69  ck state, additi
10fd0 6f 6e 61 6c 20 6c 6f 63 6b 20 73 74 61 74 65 73  onal lock states
10fe0 0a 2a 2a 20 61 72 65 20 69 6e 73 65 72 74 65 64  .** are inserted
10ff0 20 69 6e 20 62 65 74 77 65 65 6e 2e 20 20 54 68   in between.  Th
11000 65 20 6c 6f 63 6b 69 6e 67 20 6d 69 67 68 74 20  e locking might 
11010 66 61 69 6c 20 6f 6e 20 6f 6e 65 20 6f 66 20 74  fail on one of t
11020 68 65 20 6c 61 74 65 72 0a 2a 2a 20 74 72 61 6e  he later.** tran
11030 73 69 74 69 6f 6e 73 20 6c 65 61 76 69 6e 67 20  sitions leaving 
11040 74 68 65 20 6c 6f 63 6b 20 73 74 61 74 65 20 64  the lock state d
11050 69 66 66 65 72 65 6e 74 20 66 72 6f 6d 20 77 68  ifferent from wh
11060 61 74 20 69 74 20 73 74 61 72 74 65 64 20 62 75  at it started bu
11070 74 0a 2a 2a 20 73 74 69 6c 6c 20 73 68 6f 72 74  t.** still short
11080 20 6f 66 20 69 74 73 20 67 6f 61 6c 2e 20 20 54   of its goal.  T
11090 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 68 61  he following cha
110a0 72 74 20 73 68 6f 77 73 20 74 68 65 20 61 6c 6c  rt shows the all
110b0 6f 77 65 64 0a 2a 2a 20 74 72 61 6e 73 69 74 69  owed.** transiti
110c0 6f 6e 73 20 61 6e 64 20 74 68 65 20 69 6e 73 65  ons and the inse
110d0 72 74 65 64 20 69 6e 74 65 72 6d 65 64 69 61 74  rted intermediat
110e0 65 20 73 74 61 74 65 73 3a 0a 2a 2a 0a 2a 2a 20  e states:.**.** 
110f0 20 20 20 55 4e 4c 4f 43 4b 45 44 20 2d 3e 20 53     UNLOCKED -> S
11100 48 41 52 45 44 0a 2a 2a 20 20 20 20 53 48 41 52  HARED.**    SHAR
11110 45 44 20 2d 3e 20 52 45 53 45 52 56 45 44 0a 2a  ED -> RESERVED.*
11120 2a 20 20 20 20 53 48 41 52 45 44 20 2d 3e 20 28  *    SHARED -> (
11130 50 45 4e 44 49 4e 47 29 20 2d 3e 20 45 58 43 4c  PENDING) -> EXCL
11140 55 53 49 56 45 0a 2a 2a 20 20 20 20 52 45 53 45  USIVE.**    RESE
11150 52 56 45 44 20 2d 3e 20 28 50 45 4e 44 49 4e 47  RVED -> (PENDING
11160 29 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a  ) -> EXCLUSIVE.*
11170 2a 20 20 20 20 50 45 4e 44 49 4e 47 20 2d 3e 20  *    PENDING -> 
11180 45 58 43 4c 55 53 49 56 45 0a 2a 2a 0a 2a 2a 20  EXCLUSIVE.**.** 
11190 66 6c 6f 63 6b 28 29 20 6f 6e 6c 79 20 72 65 61  flock() only rea
111a0 6c 6c 79 20 73 75 70 70 6f 72 74 20 45 58 43 4c  lly support EXCL
111b0 55 53 49 56 45 20 6c 6f 63 6b 73 2e 20 20 57 65  USIVE locks.  We
111c0 20 74 72 61 63 6b 20 69 6e 74 65 72 6d 65 64 69   track intermedi
111d0 61 74 65 0a 2a 2a 20 6c 6f 63 6b 20 73 74 61 74  ate.** lock stat
111e0 65 73 20 69 6e 20 74 68 65 20 73 71 6c 69 74 65  es in the sqlite
111f0 33 5f 66 69 6c 65 20 73 74 72 75 63 74 75 72 65  3_file structure
11200 2c 20 62 75 74 20 61 6c 6c 20 6c 6f 63 6b 73 20  , but all locks 
11210 53 48 41 52 45 44 20 6f 72 0a 2a 2a 20 61 62 6f  SHARED or.** abo
11220 76 65 20 61 72 65 20 72 65 61 6c 6c 79 20 45 58  ve are really EX
11230 43 4c 55 53 49 56 45 20 6c 6f 63 6b 73 20 61 6e  CLUSIVE locks an
11240 64 20 65 78 63 6c 75 64 65 20 61 6c 6c 20 6f 74  d exclude all ot
11250 68 65 72 20 70 72 6f 63 65 73 73 65 73 20 66 72  her processes fr
11260 6f 6d 0a 2a 2a 20 61 63 63 65 73 73 20 74 68 65  om.** access the
11270 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69   file..**.** Thi
11280 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 6f  s routine will o
11290 6e 6c 79 20 69 6e 63 72 65 61 73 65 20 61 20 6c  nly increase a l
112a0 6f 63 6b 2e 20 20 55 73 65 20 74 68 65 20 73 71  ock.  Use the sq
112b0 6c 69 74 65 33 4f 73 55 6e 6c 6f 63 6b 28 29 0a  lite3OsUnlock().
112c0 2a 2a 20 72 6f 75 74 69 6e 65 20 74 6f 20 6c 6f  ** routine to lo
112d0 77 65 72 20 61 20 6c 6f 63 6b 69 6e 67 20 6c 65  wer a locking le
112e0 76 65 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  vel..*/.static i
112f0 6e 74 20 66 6c 6f 63 6b 4c 6f 63 6b 28 73 71 6c  nt flockLock(sql
11300 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69  ite3_file *id, i
11310 6e 74 20 6c 6f 63 6b 74 79 70 65 29 20 7b 0a 20  nt locktype) {. 
11320 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
11330 5f 4f 4b 3b 0a 20 20 75 6e 69 78 46 69 6c 65 20  _OK;.  unixFile 
11340 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69  *pFile = (unixFi
11350 6c 65 2a 29 69 64 3b 0a 0a 20 20 61 73 73 65 72  le*)id;..  asser
11360 74 28 20 70 46 69 6c 65 20 29 3b 0a 0a 20 20 2f  t( pFile );..  /
11370 2a 20 69 66 20 77 65 20 61 6c 72 65 61 64 79 20  * if we already 
11380 68 61 76 65 20 61 20 6c 6f 63 6b 2c 20 69 74 20  have a lock, it 
11390 69 73 20 65 78 63 6c 75 73 69 76 65 2e 20 20 0a  is exclusive.  .
113a0 20 20 2a 2a 20 4a 75 73 74 20 61 64 6a 75 73 74    ** Just adjust
113b0 20 6c 65 76 65 6c 20 61 6e 64 20 70 75 6e 74 20   level and punt 
113c0 6f 6e 20 6f 75 74 74 61 20 68 65 72 65 2e 20 2a  on outta here. *
113d0 2f 0a 20 20 69 66 20 28 70 46 69 6c 65 2d 3e 6c  /.  if (pFile->l
113e0 6f 63 6b 74 79 70 65 20 3e 20 4e 4f 5f 4c 4f 43  ocktype > NO_LOC
113f0 4b 29 20 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e  K) {.    pFile->
11400 6c 6f 63 6b 74 79 70 65 20 3d 20 6c 6f 63 6b 74  locktype = lockt
11410 79 70 65 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  ype;.    return 
11420 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20  SQLITE_OK;.  }. 
11430 20 0a 20 20 2f 2a 20 67 72 61 62 20 61 6e 20 65   .  /* grab an e
11440 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20 2a 2f  xclusive lock */
11450 0a 20 20 0a 20 20 69 66 20 28 66 6c 6f 63 6b 28  .  .  if (flock(
11460 70 46 69 6c 65 2d 3e 68 2c 20 4c 4f 43 4b 5f 45  pFile->h, LOCK_E
11470 58 20 7c 20 4c 4f 43 4b 5f 4e 42 29 29 20 7b 0a  X | LOCK_NB)) {.
11480 20 20 20 20 69 6e 74 20 74 45 72 72 6e 6f 20 3d      int tErrno =
11490 20 65 72 72 6e 6f 3b 0a 20 20 20 20 2f 2a 20 64   errno;.    /* d
114a0 69 64 6e 27 74 20 67 65 74 2c 20 6d 75 73 74 20  idn't get, must 
114b0 62 65 20 62 75 73 79 20 2a 2f 0a 20 20 20 20 72  be busy */.    r
114c0 63 20 3d 20 73 71 6c 69 74 65 45 72 72 6f 72 46  c = sqliteErrorF
114d0 72 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28 74 45  romPosixError(tE
114e0 72 72 6e 6f 2c 20 53 51 4c 49 54 45 5f 49 4f 45  rrno, SQLITE_IOE
114f0 52 52 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 69 66  RR_LOCK);.    if
11500 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28  ( IS_LOCK_ERROR(
11510 72 63 29 20 29 7b 0a 20 20 20 20 20 20 70 46 69  rc) ){.      pFi
11520 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20  le->lastErrno = 
11530 74 45 72 72 6e 6f 3b 0a 20 20 20 20 7d 0a 20 20  tErrno;.    }.  
11540 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 2f 2a 20  } else {.    /* 
11550 67 6f 74 20 69 74 2c 20 73 65 74 20 74 68 65 20  got it, set the 
11560 74 79 70 65 20 61 6e 64 20 72 65 74 75 72 6e 20  type and return 
11570 6f 6b 20 2a 2f 0a 20 20 20 20 70 46 69 6c 65 2d  ok */.    pFile-
11580 3e 6c 6f 63 6b 74 79 70 65 20 3d 20 6c 6f 63 6b  >locktype = lock
11590 74 79 70 65 3b 0a 20 20 7d 0a 20 20 4f 53 54 52  type;.  }.  OSTR
115a0 41 43 45 34 28 22 4c 4f 43 4b 20 20 20 20 25 64  ACE4("LOCK    %d
115b0 20 25 73 20 25 73 20 28 66 6c 6f 63 6b 29 5c 6e   %s %s (flock)\n
115c0 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 6c 6f 63  ", pFile->h, loc
115d0 6b 74 79 70 65 4e 61 6d 65 28 6c 6f 63 6b 74 79  ktypeName(lockty
115e0 70 65 29 2c 20 0a 20 20 20 20 20 20 20 20 20 20  pe), .          
115f0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 3f   rc==SQLITE_OK ?
11600 20 22 6f 6b 22 20 3a 20 22 66 61 69 6c 65 64 22   "ok" : "failed"
11610 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  );.#ifdef SQLITE
11620 5f 49 47 4e 4f 52 45 5f 46 4c 4f 43 4b 5f 4c 4f  _IGNORE_FLOCK_LO
11630 43 4b 5f 45 52 52 4f 52 53 0a 20 20 69 66 28 20  CK_ERRORS.  if( 
11640 28 72 63 20 26 20 53 51 4c 49 54 45 5f 49 4f 45  (rc & SQLITE_IOE
11650 52 52 29 20 3d 3d 20 53 51 4c 49 54 45 5f 49 4f  RR) == SQLITE_IO
11660 45 52 52 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  ERR ){.    rc = 
11670 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 7d  SQLITE_BUSY;.  }
11680 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
11690 45 5f 49 47 4e 4f 52 45 5f 46 4c 4f 43 4b 5f 4c  E_IGNORE_FLOCK_L
116a0 4f 43 4b 5f 45 52 52 4f 52 53 20 2a 2f 0a 20 20  OCK_ERRORS */.  
116b0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f  return rc;.}.../
116c0 2a 0a 2a 2a 20 4c 6f 77 65 72 20 74 68 65 20 6c  *.** Lower the l
116d0 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 6e 20  ocking level on 
116e0 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
116f0 70 46 69 6c 65 20 74 6f 20 6c 6f 63 6b 74 79 70  pFile to locktyp
11700 65 2e 20 20 6c 6f 63 6b 74 79 70 65 0a 2a 2a 20  e.  locktype.** 
11710 6d 75 73 74 20 62 65 20 65 69 74 68 65 72 20 4e  must be either N
11720 4f 5f 4c 4f 43 4b 20 6f 72 20 53 48 41 52 45 44  O_LOCK or SHARED
11730 5f 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  _LOCK..**.** If 
11740 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65  the locking leve
11750 6c 20 6f 66 20 74 68 65 20 66 69 6c 65 20 64 65  l of the file de
11760 73 63 72 69 70 74 6f 72 20 69 73 20 61 6c 72 65  scriptor is alre
11770 61 64 79 20 61 74 20 6f 72 20 62 65 6c 6f 77 0a  ady at or below.
11780 2a 2a 20 74 68 65 20 72 65 71 75 65 73 74 65 64  ** the requested
11790 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 2c 20   locking level, 
117a0 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
117b0 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74  a no-op..*/.stat
117c0 69 63 20 69 6e 74 20 66 6c 6f 63 6b 55 6e 6c 6f  ic int flockUnlo
117d0 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  ck(sqlite3_file 
117e0 2a 69 64 2c 20 69 6e 74 20 6c 6f 63 6b 74 79 70  *id, int locktyp
117f0 65 29 20 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20  e) {.  unixFile 
11800 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69  *pFile = (unixFi
11810 6c 65 2a 29 69 64 3b 0a 20 20 0a 20 20 61 73 73  le*)id;.  .  ass
11820 65 72 74 28 20 70 46 69 6c 65 20 29 3b 0a 20 20  ert( pFile );.  
11830 4f 53 54 52 41 43 45 35 28 22 55 4e 4c 4f 43 4b  OSTRACE5("UNLOCK
11840 20 20 25 64 20 25 64 20 77 61 73 20 25 64 20 70    %d %d was %d p
11850 69 64 3d 25 64 20 28 66 6c 6f 63 6b 29 5c 6e 22  id=%d (flock)\n"
11860 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 6c 6f 63 6b  , pFile->h, lock
11870 74 79 70 65 2c 0a 20 20 20 20 20 20 20 20 20 20  type,.          
11880 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65   pFile->locktype
11890 2c 20 67 65 74 70 69 64 28 29 29 3b 0a 20 20 61  , getpid());.  a
118a0 73 73 65 72 74 28 20 6c 6f 63 6b 74 79 70 65 3c  ssert( locktype<
118b0 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a  =SHARED_LOCK );.
118c0 20 20 0a 20 20 2f 2a 20 6e 6f 2d 6f 70 20 69 66    .  /* no-op if
118d0 20 70 6f 73 73 69 62 6c 65 20 2a 2f 0a 20 20 69   possible */.  i
118e0 66 28 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79  f( pFile->lockty
118f0 70 65 3d 3d 6c 6f 63 6b 74 79 70 65 20 29 7b 0a  pe==locktype ){.
11900 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
11910 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f  E_OK;.  }.  .  /
11920 2a 20 73 68 61 72 65 64 20 63 61 6e 20 6a 75 73  * shared can jus
11930 74 20 62 65 20 73 65 74 20 62 65 63 61 75 73 65  t be set because
11940 20 77 65 20 61 6c 77 61 79 73 20 68 61 76 65 20   we always have 
11950 61 6e 20 65 78 63 6c 75 73 69 76 65 20 2a 2f 0a  an exclusive */.
11960 20 20 69 66 20 28 6c 6f 63 6b 74 79 70 65 3d 3d    if (locktype==
11970 53 48 41 52 45 44 5f 4c 4f 43 4b 29 20 7b 0a 20  SHARED_LOCK) {. 
11980 20 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79     pFile->lockty
11990 70 65 20 3d 20 6c 6f 63 6b 74 79 70 65 3b 0a 20  pe = locktype;. 
119a0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
119b0 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a  _OK;.  }.  .  /*
119c0 20 6e 6f 2c 20 72 65 61 6c 6c 79 2c 20 75 6e 6c   no, really, unl
119d0 6f 63 6b 2e 20 2a 2f 0a 20 20 69 6e 74 20 72 63  ock. */.  int rc
119e0 20 3d 20 66 6c 6f 63 6b 28 70 46 69 6c 65 2d 3e   = flock(pFile->
119f0 68 2c 20 4c 4f 43 4b 5f 55 4e 29 3b 0a 20 20 69  h, LOCK_UN);.  i
11a00 66 20 28 72 63 29 20 7b 0a 20 20 20 20 69 6e 74  f (rc) {.    int
11a10 20 72 2c 20 74 45 72 72 6e 6f 20 3d 20 65 72 72   r, tErrno = err
11a20 6e 6f 3b 0a 20 20 20 20 72 20 3d 20 73 71 6c 69  no;.    r = sqli
11a30 74 65 45 72 72 6f 72 46 72 6f 6d 50 6f 73 69 78  teErrorFromPosix
11a40 45 72 72 6f 72 28 74 45 72 72 6e 6f 2c 20 53 51  Error(tErrno, SQ
11a50 4c 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43  LITE_IOERR_UNLOC
11a60 4b 29 3b 0a 20 20 20 20 69 66 28 20 49 53 5f 4c  K);.    if( IS_L
11a70 4f 43 4b 5f 45 52 52 4f 52 28 72 29 20 29 7b 0a  OCK_ERROR(r) ){.
11a80 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73        pFile->las
11a90 74 45 72 72 6e 6f 20 3d 20 74 45 72 72 6e 6f 3b  tErrno = tErrno;
11aa0 0a 20 20 20 20 7d 0a 23 69 66 64 65 66 20 53 51  .    }.#ifdef SQ
11ab0 4c 49 54 45 5f 49 47 4e 4f 52 45 5f 46 4c 4f 43  LITE_IGNORE_FLOC
11ac0 4b 5f 4c 4f 43 4b 5f 45 52 52 4f 52 53 0a 20 20  K_LOCK_ERRORS.  
11ad0 20 20 69 66 28 20 28 72 20 26 20 53 51 4c 49 54    if( (r & SQLIT
11ae0 45 5f 49 4f 45 52 52 29 20 3d 3d 20 53 51 4c 49  E_IOERR) == SQLI
11af0 54 45 5f 49 4f 45 52 52 20 29 7b 0a 20 20 20 20  TE_IOERR ){.    
11b00 20 20 72 20 3d 20 53 51 4c 49 54 45 5f 42 55 53    r = SQLITE_BUS
11b10 59 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 20  Y;.    }.#endif 
11b20 2f 2a 20 53 51 4c 49 54 45 5f 49 47 4e 4f 52 45  /* SQLITE_IGNORE
11b30 5f 46 4c 4f 43 4b 5f 4c 4f 43 4b 5f 45 52 52 4f  _FLOCK_LOCK_ERRO
11b40 52 53 20 2a 2f 0a 20 20 20 20 0a 20 20 20 20 72  RS */.    .    r
11b50 65 74 75 72 6e 20 72 3b 0a 20 20 7d 20 65 6c 73  eturn r;.  } els
11b60 65 20 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c  e {.    pFile->l
11b70 6f 63 6b 74 79 70 65 20 3d 20 4e 4f 5f 4c 4f 43  ocktype = NO_LOC
11b80 4b 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  K;.    return SQ
11b90 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 7d 0a 0a  LITE_OK;.  }.}..
11ba0 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 20 66 69  /*.** Close a fi
11bb0 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  le..*/.static in
11bc0 74 20 66 6c 6f 63 6b 43 6c 6f 73 65 28 73 71 6c  t flockClose(sql
11bd0 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 29 20 7b  ite3_file *id) {
11be0 0a 20 20 69 66 28 20 69 64 20 29 7b 0a 20 20 20  .  if( id ){.   
11bf0 20 66 6c 6f 63 6b 55 6e 6c 6f 63 6b 28 69 64 2c   flockUnlock(id,
11c00 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20 20 7d 0a 20   NO_LOCK);.  }. 
11c10 20 72 65 74 75 72 6e 20 63 6c 6f 73 65 55 6e 69   return closeUni
11c20 78 46 69 6c 65 28 69 64 29 3b 0a 7d 0a 0a 23 65  xFile(id);.}..#e
11c30 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 45  ndif /* SQLITE_E
11c40 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54  NABLE_LOCKING_ST
11c50 59 4c 45 20 26 26 20 21 4f 53 5f 56 58 57 4f 52  YLE && !OS_VXWOR
11c60 4b 20 2a 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a  K */../*********
11c70 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64 20 6f  ********** End o
11c80 66 20 74 68 65 20 66 6c 6f 63 6b 20 6c 6f 63 6b  f the flock lock
11c90 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   implementation 
11ca0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11cb0 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  *****.**********
11cc0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11cd0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11ce0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11cf0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11d00 2a 2a 2a 2a 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a  ****/../********
11d10 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11d20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11d30 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11d40 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11d50 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ******.*********
11d60 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20  *************** 
11d70 42 65 67 69 6e 20 4e 61 6d 65 64 20 53 65 6d 61  Begin Named Sema
11d80 70 68 6f 72 65 20 4c 6f 63 6b 69 6e 67 20 2a 2a  phore Locking **
11d90 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11da0 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 4e 61 6d  ******.**.** Nam
11db0 65 64 20 73 65 6d 61 70 68 6f 72 65 20 6c 6f 63  ed semaphore loc
11dc0 6b 69 6e 67 20 69 73 20 6f 6e 6c 79 20 73 75 70  king is only sup
11dd0 70 6f 72 74 65 64 20 6f 6e 20 56 78 57 6f 72 6b  ported on VxWork
11de0 73 2e 0a 2a 2a 0a 2a 2a 20 53 65 6d 61 70 68 6f  s..**.** Semapho
11df0 72 65 20 6c 6f 63 6b 69 6e 67 20 69 73 20 6c 69  re locking is li
11e00 6b 65 20 64 6f 74 2d 6c 6f 63 6b 20 61 6e 64 20  ke dot-lock and 
11e10 66 6c 6f 63 6b 20 69 6e 20 74 68 61 74 20 69 74  flock in that it
11e20 20 72 65 61 6c 6c 79 20 6f 6e 6c 79 0a 2a 2a 20   really only.** 
11e30 73 75 70 70 6f 72 74 73 20 45 58 43 4c 55 53 49  supports EXCLUSI
11e40 56 45 20 6c 6f 63 6b 69 6e 67 2e 20 20 4f 6e 6c  VE locking.  Onl
11e50 79 20 61 20 73 69 6e 67 6c 65 20 70 72 6f 63 65  y a single proce
11e60 73 73 20 63 61 6e 20 72 65 61 64 20 6f 72 20 77  ss can read or w
11e70 72 69 74 65 0a 2a 2a 20 74 68 65 20 64 61 74 61  rite.** the data
11e80 62 61 73 65 20 66 69 6c 65 20 61 74 20 61 20 74  base file at a t
11e90 69 6d 65 2e 20 20 54 68 69 73 20 72 65 64 75 63  ime.  This reduc
11ea0 65 73 20 70 6f 74 65 6e 74 69 61 6c 20 63 6f 6e  es potential con
11eb0 63 75 72 72 65 6e 63 79 2c 20 62 75 74 0a 2a 2a  currency, but.**
11ec0 20 6d 61 6b 65 73 20 74 68 65 20 6c 6f 63 6b 20   makes the lock 
11ed0 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6d  implementation m
11ee0 75 63 68 20 65 61 73 69 65 72 2e 0a 2a 2f 0a 23  uch easier..*/.#
11ef0 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 0a 2f  if OS_VXWORKS../
11f00 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
11f10 65 20 63 68 65 63 6b 73 20 69 66 20 74 68 65 72  e checks if ther
11f20 65 20 69 73 20 61 20 52 45 53 45 52 56 45 44 20  e is a RESERVED 
11f30 6c 6f 63 6b 20 68 65 6c 64 20 6f 6e 20 74 68 65  lock held on the
11f40 20 73 70 65 63 69 66 69 65 64 0a 2a 2a 20 66 69   specified.** fi
11f50 6c 65 20 62 79 20 74 68 69 73 20 6f 72 20 61 6e  le by this or an
11f60 79 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 2e  y other process.
11f70 20 49 66 20 73 75 63 68 20 61 20 6c 6f 63 6b 20   If such a lock 
11f80 69 73 20 68 65 6c 64 2c 20 73 65 74 20 2a 70 52  is held, set *pR
11f90 65 73 4f 75 74 0a 2a 2a 20 74 6f 20 61 20 6e 6f  esOut.** to a no
11fa0 6e 2d 7a 65 72 6f 20 76 61 6c 75 65 20 6f 74 68  n-zero value oth
11fb0 65 72 77 69 73 65 20 2a 70 52 65 73 4f 75 74 20  erwise *pResOut 
11fc0 69 73 20 73 65 74 20 74 6f 20 7a 65 72 6f 2e 20  is set to zero. 
11fd0 20 54 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75   The return valu
11fe0 65 0a 2a 2a 20 69 73 20 73 65 74 20 74 6f 20 53  e.** is set to S
11ff0 51 4c 49 54 45 5f 4f 4b 20 75 6e 6c 65 73 73 20  QLITE_OK unless 
12000 61 6e 20 49 2f 4f 20 65 72 72 6f 72 20 6f 63 63  an I/O error occ
12010 75 72 73 20 64 75 72 69 6e 67 20 6c 6f 63 6b 20  urs during lock 
12020 63 68 65 63 6b 69 6e 67 2e 0a 2a 2f 0a 73 74 61  checking..*/.sta
12030 74 69 63 20 69 6e 74 20 73 65 6d 43 68 65 63 6b  tic int semCheck
12040 52 65 73 65 72 76 65 64 4c 6f 63 6b 28 73 71 6c  ReservedLock(sql
12050 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69  ite3_file *id, i
12060 6e 74 20 2a 70 52 65 73 4f 75 74 29 20 7b 0a 20  nt *pResOut) {. 
12070 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
12080 5f 4f 4b 3b 0a 20 20 69 6e 74 20 72 65 73 65 72  _OK;.  int reser
12090 76 65 64 20 3d 20 30 3b 0a 20 20 75 6e 69 78 46  ved = 0;.  unixF
120a0 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e  ile *pFile = (un
120b0 69 78 46 69 6c 65 2a 29 69 64 3b 0a 0a 20 20 53  ixFile*)id;..  S
120c0 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20  imulateIOError( 
120d0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f  return SQLITE_IO
120e0 45 52 52 5f 43 48 45 43 4b 52 45 53 45 52 56 45  ERR_CHECKRESERVE
120f0 44 4c 4f 43 4b 3b 20 29 3b 0a 20 20 0a 20 20 61  DLOCK; );.  .  a
12100 73 73 65 72 74 28 20 70 46 69 6c 65 20 29 3b 0a  ssert( pFile );.
12110 0a 20 20 2f 2a 20 43 68 65 63 6b 20 69 66 20 61  .  /* Check if a
12120 20 74 68 72 65 61 64 20 69 6e 20 74 68 69 73 20   thread in this 
12130 70 72 6f 63 65 73 73 20 68 6f 6c 64 73 20 73 75  process holds su
12140 63 68 20 61 20 6c 6f 63 6b 20 2a 2f 0a 20 20 69  ch a lock */.  i
12150 66 28 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79  f( pFile->lockty
12160 70 65 3e 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29  pe>SHARED_LOCK )
12170 7b 0a 20 20 20 20 72 65 73 65 72 76 65 64 20 3d  {.    reserved =
12180 20 31 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20   1;.  }.  .  /* 
12190 4f 74 68 65 72 77 69 73 65 20 73 65 65 20 69 66  Otherwise see if
121a0 20 73 6f 6d 65 20 6f 74 68 65 72 20 70 72 6f 63   some other proc
121b0 65 73 73 20 68 6f 6c 64 73 20 69 74 2e 20 2a 2f  ess holds it. */
121c0 0a 20 20 69 66 28 20 21 72 65 73 65 72 76 65 64  .  if( !reserved
121d0 20 29 7b 0a 20 20 20 20 73 65 6d 5f 74 20 2a 70   ){.    sem_t *p
121e0 53 65 6d 20 3d 20 70 46 69 6c 65 2d 3e 70 4f 70  Sem = pFile->pOp
121f0 65 6e 2d 3e 70 53 65 6d 3b 0a 20 20 20 20 73 74  en->pSem;.    st
12200 72 75 63 74 20 73 74 61 74 20 73 74 61 74 42 75  ruct stat statBu
12210 66 3b 0a 0a 20 20 20 20 69 66 28 20 73 65 6d 5f  f;..    if( sem_
12220 74 72 79 77 61 69 74 28 70 53 65 6d 29 3d 3d 2d  trywait(pSem)==-
12230 31 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 74  1 ){.      int t
12240 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20  Errno = errno;. 
12250 20 20 20 20 20 69 66 28 20 45 41 47 41 49 4e 20       if( EAGAIN 
12260 21 3d 20 74 45 72 72 6e 6f 20 29 7b 0a 20 20 20  != tErrno ){.   
12270 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
12280 45 72 72 6f 72 46 72 6f 6d 50 6f 73 69 78 45 72  ErrorFromPosixEr
12290 72 6f 72 28 74 45 72 72 6e 6f 2c 20 53 51 4c 49  ror(tErrno, SQLI
122a0 54 45 5f 49 4f 45 52 52 5f 43 48 45 43 4b 52 45  TE_IOERR_CHECKRE
122b0 53 45 52 56 45 44 4c 4f 43 4b 29 3b 0a 20 20 20  SERVEDLOCK);.   
122c0 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74       pFile->last
122d0 45 72 72 6e 6f 20 3d 20 74 45 72 72 6e 6f 3b 0a  Errno = tErrno;.
122e0 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20        } else {. 
122f0 20 20 20 20 20 20 20 2f 2a 20 73 6f 6d 65 6f 6e         /* someon
12300 65 20 65 6c 73 65 20 68 61 73 20 74 68 65 20 6c  e else has the l
12310 6f 63 6b 20 77 68 65 6e 20 77 65 20 61 72 65 20  ock when we are 
12320 69 6e 20 4e 4f 5f 4c 4f 43 4b 20 2a 2f 0a 20 20  in NO_LOCK */.  
12330 20 20 20 20 20 20 72 65 73 65 72 76 65 64 20 3d        reserved =
12340 20 28 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70   (pFile->locktyp
12350 65 20 3c 20 53 48 41 52 45 44 5f 4c 4f 43 4b 29  e < SHARED_LOCK)
12360 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65  ;.      }.    }e
12370 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 77 65  lse{.      /* we
12380 20 63 6f 75 6c 64 20 68 61 76 65 20 69 74 20 69   could have it i
12390 66 20 77 65 20 77 61 6e 74 20 69 74 20 2a 2f 0a  f we want it */.
123a0 20 20 20 20 20 20 73 65 6d 5f 70 6f 73 74 28 70        sem_post(p
123b0 53 65 6d 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  Sem);.    }.  }.
123c0 20 20 4f 53 54 52 41 43 45 34 28 22 54 45 53 54    OSTRACE4("TEST
123d0 20 57 52 2d 4c 4f 43 4b 20 25 64 20 25 64 20 25   WR-LOCK %d %d %
123e0 64 20 28 73 65 6d 29 5c 6e 22 2c 20 70 46 69 6c  d (sem)\n", pFil
123f0 65 2d 3e 68 2c 20 72 63 2c 20 72 65 73 65 72 76  e->h, rc, reserv
12400 65 64 29 3b 0a 0a 20 20 2a 70 52 65 73 4f 75 74  ed);..  *pResOut
12410 20 3d 20 72 65 73 65 72 76 65 64 3b 0a 20 20 72   = reserved;.  r
12420 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
12430 2a 2a 20 4c 6f 63 6b 20 74 68 65 20 66 69 6c 65  ** Lock the file
12440 20 77 69 74 68 20 74 68 65 20 6c 6f 63 6b 20 73   with the lock s
12450 70 65 63 69 66 69 65 64 20 62 79 20 70 61 72 61  pecified by para
12460 6d 65 74 65 72 20 6c 6f 63 6b 74 79 70 65 20 2d  meter locktype -
12470 20 6f 6e 65 0a 2a 2a 20 6f 66 20 74 68 65 20 66   one.** of the f
12480 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20  ollowing:.**.** 
12490 20 20 20 20 28 31 29 20 53 48 41 52 45 44 5f 4c      (1) SHARED_L
124a0 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 32 29 20 52  OCK.**     (2) R
124b0 45 53 45 52 56 45 44 5f 4c 4f 43 4b 0a 2a 2a 20  ESERVED_LOCK.** 
124c0 20 20 20 20 28 33 29 20 50 45 4e 44 49 4e 47 5f      (3) PENDING_
124d0 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 34 29 20  LOCK.**     (4) 
124e0 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 0a 2a  EXCLUSIVE_LOCK.*
124f0 2a 0a 2a 2a 20 53 6f 6d 65 74 69 6d 65 73 20 77  *.** Sometimes w
12500 68 65 6e 20 72 65 71 75 65 73 74 69 6e 67 20 6f  hen requesting o
12510 6e 65 20 6c 6f 63 6b 20 73 74 61 74 65 2c 20 61  ne lock state, a
12520 64 64 69 74 69 6f 6e 61 6c 20 6c 6f 63 6b 20 73  dditional lock s
12530 74 61 74 65 73 0a 2a 2a 20 61 72 65 20 69 6e 73  tates.** are ins
12540 65 72 74 65 64 20 69 6e 20 62 65 74 77 65 65 6e  erted in between
12550 2e 20 20 54 68 65 20 6c 6f 63 6b 69 6e 67 20 6d  .  The locking m
12560 69 67 68 74 20 66 61 69 6c 20 6f 6e 20 6f 6e 65  ight fail on one
12570 20 6f 66 20 74 68 65 20 6c 61 74 65 72 0a 2a 2a   of the later.**
12580 20 74 72 61 6e 73 69 74 69 6f 6e 73 20 6c 65 61   transitions lea
12590 76 69 6e 67 20 74 68 65 20 6c 6f 63 6b 20 73 74  ving the lock st
125a0 61 74 65 20 64 69 66 66 65 72 65 6e 74 20 66 72  ate different fr
125b0 6f 6d 20 77 68 61 74 20 69 74 20 73 74 61 72 74  om what it start
125c0 65 64 20 62 75 74 0a 2a 2a 20 73 74 69 6c 6c 20  ed but.** still 
125d0 73 68 6f 72 74 20 6f 66 20 69 74 73 20 67 6f 61  short of its goa
125e0 6c 2e 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  l.  The followin
125f0 67 20 63 68 61 72 74 20 73 68 6f 77 73 20 74 68  g chart shows th
12600 65 20 61 6c 6c 6f 77 65 64 0a 2a 2a 20 74 72 61  e allowed.** tra
12610 6e 73 69 74 69 6f 6e 73 20 61 6e 64 20 74 68 65  nsitions and the
12620 20 69 6e 73 65 72 74 65 64 20 69 6e 74 65 72 6d   inserted interm
12630 65 64 69 61 74 65 20 73 74 61 74 65 73 3a 0a 2a  ediate states:.*
12640 2a 0a 2a 2a 20 20 20 20 55 4e 4c 4f 43 4b 45 44  *.**    UNLOCKED
12650 20 2d 3e 20 53 48 41 52 45 44 0a 2a 2a 20 20 20   -> SHARED.**   
12660 20 53 48 41 52 45 44 20 2d 3e 20 52 45 53 45 52   SHARED -> RESER
12670 56 45 44 0a 2a 2a 20 20 20 20 53 48 41 52 45 44  VED.**    SHARED
12680 20 2d 3e 20 28 50 45 4e 44 49 4e 47 29 20 2d 3e   -> (PENDING) ->
12690 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20 20 20   EXCLUSIVE.**   
126a0 20 52 45 53 45 52 56 45 44 20 2d 3e 20 28 50 45   RESERVED -> (PE
126b0 4e 44 49 4e 47 29 20 2d 3e 20 45 58 43 4c 55 53  NDING) -> EXCLUS
126c0 49 56 45 0a 2a 2a 20 20 20 20 50 45 4e 44 49 4e  IVE.**    PENDIN
126d0 47 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a  G -> EXCLUSIVE.*
126e0 2a 0a 2a 2a 20 53 65 6d 61 70 68 6f 72 65 20 6c  *.** Semaphore l
126f0 6f 63 6b 73 20 6f 6e 6c 79 20 72 65 61 6c 6c 79  ocks only really
12700 20 73 75 70 70 6f 72 74 20 45 58 43 4c 55 53 49   support EXCLUSI
12710 56 45 20 6c 6f 63 6b 73 2e 20 20 57 65 20 74 72  VE locks.  We tr
12720 61 63 6b 20 69 6e 74 65 72 6d 65 64 69 61 74 65  ack intermediate
12730 0a 2a 2a 20 6c 6f 63 6b 20 73 74 61 74 65 73 20  .** lock states 
12740 69 6e 20 74 68 65 20 73 71 6c 69 74 65 33 5f 66  in the sqlite3_f
12750 69 6c 65 20 73 74 72 75 63 74 75 72 65 2c 20 62  ile structure, b
12760 75 74 20 61 6c 6c 20 6c 6f 63 6b 73 20 53 48 41  ut all locks SHA
12770 52 45 44 20 6f 72 0a 2a 2a 20 61 62 6f 76 65 20  RED or.** above 
12780 61 72 65 20 72 65 61 6c 6c 79 20 45 58 43 4c 55  are really EXCLU
12790 53 49 56 45 20 6c 6f 63 6b 73 20 61 6e 64 20 65  SIVE locks and e
127a0 78 63 6c 75 64 65 20 61 6c 6c 20 6f 74 68 65 72  xclude all other
127b0 20 70 72 6f 63 65 73 73 65 73 20 66 72 6f 6d 0a   processes from.
127c0 2a 2a 20 61 63 63 65 73 73 20 74 68 65 20 66 69  ** access the fi
127d0 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  le..**.** This r
127e0 6f 75 74 69 6e 65 20 77 69 6c 6c 20 6f 6e 6c 79  outine will only
127f0 20 69 6e 63 72 65 61 73 65 20 61 20 6c 6f 63 6b   increase a lock
12800 2e 20 20 55 73 65 20 74 68 65 20 73 71 6c 69 74  .  Use the sqlit
12810 65 33 4f 73 55 6e 6c 6f 63 6b 28 29 0a 2a 2a 20  e3OsUnlock().** 
12820 72 6f 75 74 69 6e 65 20 74 6f 20 6c 6f 77 65 72  routine to lower
12830 20 61 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c   a locking level
12840 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
12850 73 65 6d 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f  semLock(sqlite3_
12860 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 6c 6f  file *id, int lo
12870 63 6b 74 79 70 65 29 20 7b 0a 20 20 75 6e 69 78  cktype) {.  unix
12880 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75  File *pFile = (u
12890 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 69  nixFile*)id;.  i
128a0 6e 74 20 66 64 3b 0a 20 20 73 65 6d 5f 74 20 2a  nt fd;.  sem_t *
128b0 70 53 65 6d 20 3d 20 70 46 69 6c 65 2d 3e 70 4f  pSem = pFile->pO
128c0 70 65 6e 2d 3e 70 53 65 6d 3b 0a 20 20 69 6e 74  pen->pSem;.  int
128d0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
128e0 0a 0a 20 20 2f 2a 20 69 66 20 77 65 20 61 6c 72  ..  /* if we alr
128f0 65 61 64 79 20 68 61 76 65 20 61 20 6c 6f 63 6b  eady have a lock
12900 2c 20 69 74 20 69 73 20 65 78 63 6c 75 73 69 76  , it is exclusiv
12910 65 2e 20 20 0a 20 20 2a 2a 20 4a 75 73 74 20 61  e.  .  ** Just a
12920 64 6a 75 73 74 20 6c 65 76 65 6c 20 61 6e 64 20  djust level and 
12930 70 75 6e 74 20 6f 6e 20 6f 75 74 74 61 20 68 65  punt on outta he
12940 72 65 2e 20 2a 2f 0a 20 20 69 66 20 28 70 46 69  re. */.  if (pFi
12950 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 20 3e 20 4e  le->locktype > N
12960 4f 5f 4c 4f 43 4b 29 20 7b 0a 20 20 20 20 70 46  O_LOCK) {.    pF
12970 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 20 3d 20  ile->locktype = 
12980 6c 6f 63 6b 74 79 70 65 3b 0a 20 20 20 20 72 63  locktype;.    rc
12990 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
129a0 20 20 67 6f 74 6f 20 73 65 6d 5f 65 6e 64 5f 6c    goto sem_end_l
129b0 6f 63 6b 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a  ock;.  }.  .  /*
129c0 20 6c 6f 63 6b 20 73 65 6d 61 70 68 6f 72 65 20   lock semaphore 
129d0 6e 6f 77 20 62 75 74 20 62 61 69 6c 20 6f 75 74  now but bail out
129e0 20 77 68 65 6e 20 61 6c 72 65 61 64 79 20 6c 6f   when already lo
129f0 63 6b 65 64 2e 20 2a 2f 0a 20 20 69 66 28 20 73  cked. */.  if( s
12a00 65 6d 5f 74 72 79 77 61 69 74 28 70 53 65 6d 29  em_trywait(pSem)
12a10 3d 3d 2d 31 20 29 7b 0a 20 20 20 20 72 63 20 3d  ==-1 ){.    rc =
12a20 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20   SQLITE_BUSY;.  
12a30 20 20 67 6f 74 6f 20 73 65 6d 5f 65 6e 64 5f 6c    goto sem_end_l
12a40 6f 63 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 67  ock;.  }..  /* g
12a50 6f 74 20 69 74 2c 20 73 65 74 20 74 68 65 20 74  ot it, set the t
12a60 79 70 65 20 61 6e 64 20 72 65 74 75 72 6e 20 6f  ype and return o
12a70 6b 20 2a 2f 0a 20 20 70 46 69 6c 65 2d 3e 6c 6f  k */.  pFile->lo
12a80 63 6b 74 79 70 65 20 3d 20 6c 6f 63 6b 74 79 70  cktype = locktyp
12a90 65 3b 0a 0a 20 73 65 6d 5f 65 6e 64 5f 6c 6f 63  e;.. sem_end_loc
12aa0 6b 3a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  k:.  return rc;.
12ab0 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 77 65 72 20 74  }../*.** Lower t
12ac0 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c  he locking level
12ad0 20 6f 6e 20 66 69 6c 65 20 64 65 73 63 72 69 70   on file descrip
12ae0 74 6f 72 20 70 46 69 6c 65 20 74 6f 20 6c 6f 63  tor pFile to loc
12af0 6b 74 79 70 65 2e 20 20 6c 6f 63 6b 74 79 70 65  ktype.  locktype
12b00 0a 2a 2a 20 6d 75 73 74 20 62 65 20 65 69 74 68  .** must be eith
12b10 65 72 20 4e 4f 5f 4c 4f 43 4b 20 6f 72 20 53 48  er NO_LOCK or SH
12b20 41 52 45 44 5f 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a  ARED_LOCK..**.**
12b30 20 49 66 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20   If the locking 
12b40 6c 65 76 65 6c 20 6f 66 20 74 68 65 20 66 69 6c  level of the fil
12b50 65 20 64 65 73 63 72 69 70 74 6f 72 20 69 73 20  e descriptor is 
12b60 61 6c 72 65 61 64 79 20 61 74 20 6f 72 20 62 65  already at or be
12b70 6c 6f 77 0a 2a 2a 20 74 68 65 20 72 65 71 75 65  low.** the reque
12b80 73 74 65 64 20 6c 6f 63 6b 69 6e 67 20 6c 65 76  sted locking lev
12b90 65 6c 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65  el, this routine
12ba0 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a   is a no-op..*/.
12bb0 73 74 61 74 69 63 20 69 6e 74 20 73 65 6d 55 6e  static int semUn
12bc0 6c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c  lock(sqlite3_fil
12bd0 65 20 2a 69 64 2c 20 69 6e 74 20 6c 6f 63 6b 74  e *id, int lockt
12be0 79 70 65 29 20 7b 0a 20 20 75 6e 69 78 46 69 6c  ype) {.  unixFil
12bf0 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78  e *pFile = (unix
12c00 46 69 6c 65 2a 29 69 64 3b 0a 20 20 73 65 6d 5f  File*)id;.  sem_
12c10 74 20 2a 70 53 65 6d 20 3d 20 70 46 69 6c 65 2d  t *pSem = pFile-
12c20 3e 70 4f 70 65 6e 2d 3e 70 53 65 6d 3b 0a 0a 20  >pOpen->pSem;.. 
12c30 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 20 29   assert( pFile )
12c40 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53 65 6d  ;.  assert( pSem
12c50 20 29 3b 0a 20 20 4f 53 54 52 41 43 45 35 28 22   );.  OSTRACE5("
12c60 55 4e 4c 4f 43 4b 20 20 25 64 20 25 64 20 77 61  UNLOCK  %d %d wa
12c70 73 20 25 64 20 70 69 64 3d 25 64 20 28 73 65 6d  s %d pid=%d (sem
12c80 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20  )\n", pFile->h, 
12c90 6c 6f 63 6b 74 79 70 65 2c 0a 09 20 20 20 70 46  locktype,..   pF
12ca0 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 2c 20 67  ile->locktype, g
12cb0 65 74 70 69 64 28 29 29 3b 0a 20 20 61 73 73 65  etpid());.  asse
12cc0 72 74 28 20 6c 6f 63 6b 74 79 70 65 3c 3d 53 48  rt( locktype<=SH
12cd0 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 0a  ARED_LOCK );.  .
12ce0 20 20 2f 2a 20 6e 6f 2d 6f 70 20 69 66 20 70 6f    /* no-op if po
12cf0 73 73 69 62 6c 65 20 2a 2f 0a 20 20 69 66 28 20  ssible */.  if( 
12d00 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3d  pFile->locktype=
12d10 3d 6c 6f 63 6b 74 79 70 65 20 29 7b 0a 20 20 20  =locktype ){.   
12d20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
12d30 4b 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 73  K;.  }.  .  /* s
12d40 68 61 72 65 64 20 63 61 6e 20 6a 75 73 74 20 62  hared can just b
12d50 65 20 73 65 74 20 62 65 63 61 75 73 65 20 77 65  e set because we
12d60 20 61 6c 77 61 79 73 20 68 61 76 65 20 61 6e 20   always have an 
12d70 65 78 63 6c 75 73 69 76 65 20 2a 2f 0a 20 20 69  exclusive */.  i
12d80 66 20 28 6c 6f 63 6b 74 79 70 65 3d 3d 53 48 41  f (locktype==SHA
12d90 52 45 44 5f 4c 4f 43 4b 29 20 7b 0a 20 20 20 20  RED_LOCK) {.    
12da0 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 20  pFile->locktype 
12db0 3d 20 6c 6f 63 6b 74 79 70 65 3b 0a 20 20 20 20  = locktype;.    
12dc0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
12dd0 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 6e 6f  ;.  }.  .  /* no
12de0 2c 20 72 65 61 6c 6c 79 20 75 6e 6c 6f 63 6b 2e  , really unlock.
12df0 20 2a 2f 0a 20 20 69 66 20 28 20 73 65 6d 5f 70   */.  if ( sem_p
12e00 6f 73 74 28 70 53 65 6d 29 3d 3d 2d 31 20 29 20  ost(pSem)==-1 ) 
12e10 7b 0a 20 20 20 20 69 6e 74 20 72 63 2c 20 74 45  {.    int rc, tE
12e20 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20  rrno = errno;.  
12e30 20 20 72 63 20 3d 20 73 71 6c 69 74 65 45 72 72    rc = sqliteErr
12e40 6f 72 46 72 6f 6d 50 6f 73 69 78 45 72 72 6f 72  orFromPosixError
12e50 28 74 45 72 72 6e 6f 2c 20 53 51 4c 49 54 45 5f  (tErrno, SQLITE_
12e60 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 29 3b 0a 20  IOERR_UNLOCK);. 
12e70 20 20 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45     if( IS_LOCK_E
12e80 52 52 4f 52 28 72 63 29 20 29 7b 0a 20 20 20 20  RROR(rc) ){.    
12e90 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72    pFile->lastErr
12ea0 6e 6f 20 3d 20 74 45 72 72 6e 6f 3b 0a 20 20 20  no = tErrno;.   
12eb0 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63   }.    return rc
12ec0 3b 20 0a 20 20 7d 0a 20 20 70 46 69 6c 65 2d 3e  ; .  }.  pFile->
12ed0 6c 6f 63 6b 74 79 70 65 20 3d 20 4e 4f 5f 4c 4f  locktype = NO_LO
12ee0 43 4b 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  CK;.  return SQL
12ef0 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 20 2a  ITE_OK;.}../*. *
12f00 2a 20 43 6c 6f 73 65 20 61 20 66 69 6c 65 2e 0a  * Close a file..
12f10 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73   */.static int s
12f20 65 6d 43 6c 6f 73 65 28 73 71 6c 69 74 65 33 5f  emClose(sqlite3_
12f30 66 69 6c 65 20 2a 69 64 29 20 7b 0a 20 20 69 66  file *id) {.  if
12f40 28 20 69 64 20 29 7b 0a 20 20 20 20 75 6e 69 78  ( id ){.    unix
12f50 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75  File *pFile = (u
12f60 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 20  nixFile*)id;.   
12f70 20 73 65 6d 55 6e 6c 6f 63 6b 28 69 64 2c 20 4e   semUnlock(id, N
12f80 4f 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 61 73 73  O_LOCK);.    ass
12f90 65 72 74 28 20 70 46 69 6c 65 20 29 3b 0a 20 20  ert( pFile );.  
12fa0 20 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78    unixEnterMutex
12fb0 28 29 3b 0a 20 20 20 20 72 65 6c 65 61 73 65 4c  ();.    releaseL
12fc0 6f 63 6b 49 6e 66 6f 28 70 46 69 6c 65 2d 3e 70  ockInfo(pFile->p
12fd0 4c 6f 63 6b 29 3b 0a 20 20 20 20 72 65 6c 65 61  Lock);.    relea
12fe0 73 65 4f 70 65 6e 43 6e 74 28 70 46 69 6c 65 2d  seOpenCnt(pFile-
12ff0 3e 70 4f 70 65 6e 29 3b 0a 20 20 20 20 75 6e 69  >pOpen);.    uni
13000 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 20  xLeaveMutex();. 
13010 20 20 20 63 6c 6f 73 65 55 6e 69 78 46 69 6c 65     closeUnixFile
13020 28 69 64 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  (id);.  }.  retu
13030 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
13040 0a 23 65 6e 64 69 66 20 2f 2a 20 4f 53 5f 56 58  .#endif /* OS_VX
13050 57 4f 52 4b 53 20 2a 2f 0a 2f 2a 0a 2a 2a 20 4e  WORKS */./*.** N
13060 61 6d 65 64 20 73 65 6d 61 70 68 6f 72 65 20 6c  amed semaphore l
13070 6f 63 6b 69 6e 67 20 69 73 20 6f 6e 6c 79 20 61  ocking is only a
13080 76 61 69 6c 61 62 6c 65 20 6f 6e 20 56 78 57 6f  vailable on VxWo
13090 72 6b 73 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a  rks..**.********
130a0 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64 20 6f 66 20 74  ******* End of t
130b0 68 65 20 6e 61 6d 65 64 20 73 65 6d 61 70 68 6f  he named semapho
130c0 72 65 20 6c 6f 63 6b 20 69 6d 70 6c 65 6d 65 6e  re lock implemen
130d0 74 61 74 69 6f 6e 20 2a 2a 2a 2a 2a 2a 2a 2a 2a  tation *********
130e0 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a  *******.********
130f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13100 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13110 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13120 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13130 2a 2a 2a 2a 2a 2a 2f 0a 0a 0a 2f 2a 2a 2a 2a 2a  ******/.../*****
13140 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13150 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13160 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13170 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13180 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a  *********.******
13190 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
131a0 2a 2a 2a 2a 2a 20 42 65 67 69 6e 20 41 46 50 20  ***** Begin AFP 
131b0 4c 6f 63 6b 69 6e 67 20 2a 2a 2a 2a 2a 2a 2a 2a  Locking ********
131c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
131d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20  *********.**.** 
131e0 41 46 50 20 69 73 20 74 68 65 20 41 70 70 6c 65  AFP is the Apple
131f0 20 46 69 6c 69 6e 67 20 50 72 6f 74 6f 63 6f 6c   Filing Protocol
13200 2e 20 20 41 46 50 20 69 73 20 61 20 6e 65 74 77  .  AFP is a netw
13210 6f 72 6b 20 66 69 6c 65 73 79 73 74 65 6d 20 66  ork filesystem f
13220 6f 75 6e 64 0a 2a 2a 20 6f 6e 20 41 70 70 6c 65  ound.** on Apple
13230 20 4d 61 63 69 6e 74 6f 73 68 20 63 6f 6d 70 75   Macintosh compu
13240 74 65 72 73 20 2d 20 62 6f 74 68 20 4f 53 39 20  ters - both OS9 
13250 61 6e 64 20 4f 53 58 2e 0a 2a 2a 0a 2a 2a 20 54  and OSX..**.** T
13260 68 69 72 64 2d 70 61 72 74 79 20 69 6d 70 6c 65  hird-party imple
13270 6d 65 6e 74 61 74 69 6f 6e 73 20 6f 66 20 41 46  mentations of AF
13280 50 20 61 72 65 20 61 76 61 69 6c 61 62 6c 65 2e  P are available.
13290 20 20 42 75 74 20 74 68 69 73 20 63 6f 64 65 20    But this code 
132a0 68 65 72 65 0a 2a 2a 20 6f 6e 6c 79 20 77 6f 72  here.** only wor
132b0 6b 73 20 6f 6e 20 4f 53 58 2e 0a 2a 2f 0a 0a 23  ks on OSX..*/..#
132c0 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50  if defined(__APP
132d0 4c 45 5f 5f 29 20 26 26 20 53 51 4c 49 54 45 5f  LE__) && SQLITE_
132e0 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53  ENABLE_LOCKING_S
132f0 54 59 4c 45 0a 2f 2a 0a 2a 2a 20 54 68 65 20 61  TYLE./*.** The a
13300 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  fpLockingContext
13310 20 73 74 72 75 63 74 75 72 65 20 63 6f 6e 74 61   structure conta
13320 69 6e 73 20 61 6c 6c 20 61 66 70 20 6c 6f 63 6b  ins all afp lock
13330 20 73 70 65 63 69 66 69 63 20 73 74 61 74 65 0a   specific state.
13340 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75 63  */.typedef struc
13350 74 20 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74  t afpLockingCont
13360 65 78 74 20 61 66 70 4c 6f 63 6b 69 6e 67 43 6f  ext afpLockingCo
13370 6e 74 65 78 74 3b 0a 73 74 72 75 63 74 20 61 66  ntext;.struct af
13380 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20  pLockingContext 
13390 7b 0a 20 20 69 6e 74 20 72 65 73 65 72 76 65 64  {.  int reserved
133a0 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ;.  const char *
133b0 64 62 50 61 74 68 3b 20 20 20 20 20 20 20 20 20  dbPath;         
133c0 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74      /* Name of t
133d0 68 65 20 6f 70 65 6e 20 66 69 6c 65 20 2a 2f 0a  he open file */.
133e0 7d 3b 0a 0a 73 74 72 75 63 74 20 42 79 74 65 52  };..struct ByteR
133f0 61 6e 67 65 4c 6f 63 6b 50 42 32 0a 7b 0a 20 20  angeLockPB2.{.  
13400 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6c 6f  unsigned long lo
13410 6e 67 20 6f 66 66 73 65 74 3b 20 20 20 20 20 20  ng offset;      
13420 20 20 2f 2a 20 6f 66 66 73 65 74 20 74 6f 20 66    /* offset to f
13430 69 72 73 74 20 62 79 74 65 20 74 6f 20 6c 6f 63  irst byte to loc
13440 6b 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20  k */.  unsigned 
13450 6c 6f 6e 67 20 6c 6f 6e 67 20 6c 65 6e 67 74 68  long long length
13460 3b 20 20 20 20 20 20 20 20 2f 2a 20 6e 62 72 20  ;        /* nbr 
13470 6f 66 20 62 79 74 65 73 20 74 6f 20 6c 6f 63 6b  of bytes to lock
13480 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 6c   */.  unsigned l
13490 6f 6e 67 20 6c 6f 6e 67 20 72 65 74 52 61 6e 67  ong long retRang
134a0 65 53 74 61 72 74 3b 20 2f 2a 20 6e 62 72 20 6f  eStart; /* nbr o
134b0 66 20 31 73 74 20 62 79 74 65 20 6c 6f 63 6b 65  f 1st byte locke
134c0 64 20 69 66 20 73 75 63 63 65 73 73 66 75 6c 20  d if successful 
134d0 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68  */.  unsigned ch
134e0 61 72 20 75 6e 4c 6f 63 6b 46 6c 61 67 3b 20 20  ar unLockFlag;  
134f0 20 20 20 20 20 20 20 2f 2a 20 31 20 3d 20 75 6e         /* 1 = un
13500 6c 6f 63 6b 2c 20 30 20 3d 20 6c 6f 63 6b 20 2a  lock, 0 = lock *
13510 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  /.  unsigned cha
13520 72 20 73 74 61 72 74 45 6e 64 46 6c 61 67 3b 20  r startEndFlag; 
13530 20 20 20 20 20 20 2f 2a 20 31 3d 72 65 6c 20 74        /* 1=rel t
13540 6f 20 65 6e 64 20 6f 66 20 66 6f 72 6b 2c 20 30  o end of fork, 0
13550 3d 72 65 6c 20 74 6f 20 73 74 61 72 74 20 2a 2f  =rel to start */
13560 0a 20 20 69 6e 74 20 66 64 3b 20 20 20 20 20 20  .  int fd;      
13570 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13580 20 20 20 20 20 2f 2a 20 66 69 6c 65 20 64 65 73       /* file des
13590 63 20 74 6f 20 61 73 73 6f 63 20 74 68 69 73 20  c to assoc this 
135a0 6c 6f 63 6b 20 77 69 74 68 20 2a 2f 0a 7d 3b 0a  lock with */.};.
135b0 0a 23 64 65 66 69 6e 65 20 61 66 70 66 73 42 79  .#define afpfsBy
135c0 74 65 52 61 6e 67 65 4c 6f 63 6b 32 46 53 43 54  teRangeLock2FSCT
135d0 4c 20 20 20 20 20 20 20 20 5f 49 4f 57 52 28 27  L        _IOWR('
135e0 7a 27 2c 20 32 33 2c 20 73 74 72 75 63 74 20 42  z', 23, struct B
135f0 79 74 65 52 61 6e 67 65 4c 6f 63 6b 50 42 32 29  yteRangeLockPB2)
13600 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20  ../*.** This is 
13610 61 20 75 74 69 6c 69 74 79 20 66 6f 72 20 73 65  a utility for se
13620 74 74 69 6e 67 20 6f 72 20 63 6c 65 61 72 69 6e  tting or clearin
13630 67 20 61 20 62 69 74 2d 72 61 6e 67 65 20 6c 6f  g a bit-range lo
13640 63 6b 20 6f 6e 20 61 6e 0a 2a 2a 20 41 46 50 20  ck on an.** AFP 
13650 66 69 6c 65 73 79 73 74 65 6d 2e 0a 2a 2a 20 0a  filesystem..** .
13660 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45  ** Return SQLITE
13670 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73 2c 20  _OK on success, 
13680 53 51 4c 49 54 45 5f 42 55 53 59 20 6f 6e 20 66  SQLITE_BUSY on f
13690 61 69 6c 75 72 65 2e 0a 2a 2f 0a 73 74 61 74 69  ailure..*/.stati
136a0 63 20 69 6e 74 20 61 66 70 53 65 74 4c 6f 63 6b  c int afpSetLock
136b0 28 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  (.  const char *
136c0 70 61 74 68 2c 20 20 20 20 20 20 20 20 20 20 20  path,           
136d0 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68     /* Name of th
136e0 65 20 66 69 6c 65 20 74 6f 20 62 65 20 6c 6f 63  e file to be loc
136f0 6b 65 64 20 6f 72 20 75 6e 6c 6f 63 6b 65 64 20  ked or unlocked 
13700 2a 2f 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70  */.  unixFile *p
13710 46 69 6c 65 2c 20 20 20 20 20 20 20 20 20 20 20  File,           
13720 20 20 20 20 2f 2a 20 4f 70 65 6e 20 66 69 6c 65      /* Open file
13730 20 64 65 73 63 72 69 70 74 6f 72 20 6f 6e 20 70   descriptor on p
13740 61 74 68 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65  ath */.  unsigne
13750 64 20 6c 6f 6e 67 20 6c 6f 6e 67 20 6f 66 66 73  d long long offs
13760 65 74 2c 20 20 20 20 20 2f 2a 20 46 69 72 73 74  et,     /* First
13770 20 62 79 74 65 20 74 6f 20 62 65 20 6c 6f 63 6b   byte to be lock
13780 65 64 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64  ed */.  unsigned
13790 20 6c 6f 6e 67 20 6c 6f 6e 67 20 6c 65 6e 67 74   long long lengt
137a0 68 2c 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72  h,     /* Number
137b0 20 6f 66 20 62 79 74 65 73 20 74 6f 20 6c 6f 63   of bytes to loc
137c0 6b 20 2a 2f 0a 20 20 69 6e 74 20 73 65 74 4c 6f  k */.  int setLo
137d0 63 6b 46 6c 61 67 20 20 20 20 20 20 20 20 20 20  ckFlag          
137e0 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 74 6f        /* True to
137f0 20 73 65 74 20 6c 6f 63 6b 2e 20 20 46 61 6c 73   set lock.  Fals
13800 65 20 74 6f 20 63 6c 65 61 72 20 6c 6f 63 6b 20  e to clear lock 
13810 2a 2f 0a 29 7b 0a 20 20 73 74 72 75 63 74 20 42  */.){.  struct B
13820 79 74 65 52 61 6e 67 65 4c 6f 63 6b 50 42 32 20  yteRangeLockPB2 
13830 70 62 3b 0a 20 20 69 6e 74 20 65 72 72 3b 0a 20  pb;.  int err;. 
13840 20 0a 20 20 70 62 2e 75 6e 4c 6f 63 6b 46 6c 61   .  pb.unLockFla
13850 67 20 3d 20 73 65 74 4c 6f 63 6b 46 6c 61 67 20  g = setLockFlag 
13860 3f 20 30 20 3a 20 31 3b 0a 20 20 70 62 2e 73 74  ? 0 : 1;.  pb.st
13870 61 72 74 45 6e 64 46 6c 61 67 20 3d 20 30 3b 0a  artEndFlag = 0;.
13880 20 20 70 62 2e 6f 66 66 73 65 74 20 3d 20 6f 66    pb.offset = of
13890 66 73 65 74 3b 0a 20 20 70 62 2e 6c 65 6e 67 74  fset;.  pb.lengt
138a0 68 20 3d 20 6c 65 6e 67 74 68 3b 20 0a 20 20 70  h = length; .  p
138b0 62 2e 66 64 20 3d 20 70 46 69 6c 65 2d 3e 68 3b  b.fd = pFile->h;
138c0 0a 20 20 0a 20 20 4f 53 54 52 41 43 45 36 28 22  .  .  OSTRACE6("
138d0 41 46 50 53 45 54 4c 4f 43 4b 20 5b 25 73 5d 20  AFPSETLOCK [%s] 
138e0 66 6f 72 20 25 64 25 73 20 69 6e 20 72 61 6e 67  for %d%s in rang
138f0 65 20 25 6c 6c 78 3a 25 6c 6c 78 5c 6e 22 2c 20  e %llx:%llx\n", 
13900 0a 20 20 20 20 28 73 65 74 4c 6f 63 6b 46 6c 61  .    (setLockFla
13910 67 3f 22 4f 4e 22 3a 22 4f 46 46 22 29 2c 20 70  g?"ON":"OFF"), p
13920 46 69 6c 65 2d 3e 68 2c 20 28 70 62 2e 66 64 3d  File->h, (pb.fd=
13930 3d 2d 31 3f 22 5b 74 65 73 74 76 61 6c 2d 31 5d  =-1?"[testval-1]
13940 22 3a 22 22 29 2c 0a 20 20 20 20 6f 66 66 73 65  ":""),.    offse
13950 74 2c 20 6c 65 6e 67 74 68 29 3b 0a 20 20 65 72  t, length);.  er
13960 72 20 3d 20 66 73 63 74 6c 28 70 61 74 68 2c 20  r = fsctl(path, 
13970 61 66 70 66 73 42 79 74 65 52 61 6e 67 65 4c 6f  afpfsByteRangeLo
13980 63 6b 32 46 53 43 54 4c 2c 20 26 70 62 2c 20 30  ck2FSCTL, &pb, 0
13990 29 3b 0a 20 20 69 66 20 28 20 65 72 72 3d 3d 2d  );.  if ( err==-
139a0 31 20 29 20 7b 0a 20 20 20 20 69 6e 74 20 72 63  1 ) {.    int rc
139b0 3b 0a 20 20 20 20 69 6e 74 20 74 45 72 72 6e 6f  ;.    int tErrno
139c0 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 4f 53   = errno;.    OS
139d0 54 52 41 43 45 34 28 22 41 46 50 53 45 54 4c 4f  TRACE4("AFPSETLO
139e0 43 4b 20 66 61 69 6c 65 64 20 74 6f 20 66 73 63  CK failed to fsc
139f0 74 6c 28 29 20 27 25 73 27 20 25 64 20 25 73 5c  tl() '%s' %d %s\
13a00 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  n",.            
13a10 20 70 61 74 68 2c 20 74 45 72 72 6e 6f 2c 20 73   path, tErrno, s
13a20 74 72 65 72 72 6f 72 28 74 45 72 72 6e 6f 29 29  trerror(tErrno))
13a30 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ;.#ifdef SQLITE_
13a40 49 47 4e 4f 52 45 5f 41 46 50 5f 4c 4f 43 4b 5f  IGNORE_AFP_LOCK_
13a50 45 52 52 4f 52 53 0a 20 20 20 20 72 63 20 3d 20  ERRORS.    rc = 
13a60 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 23 65 6c  SQLITE_BUSY;.#el
13a70 73 65 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  se.    rc = sqli
13a80 74 65 45 72 72 6f 72 46 72 6f 6d 50 6f 73 69 78  teErrorFromPosix
13a90 45 72 72 6f 72 28 74 45 72 72 6e 6f 2c 0a 20 20  Error(tErrno,.  
13aa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13ab0 20 20 73 65 74 4c 6f 63 6b 46 6c 61 67 20 3f 20    setLockFlag ? 
13ac0 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4c 4f 43  SQLITE_IOERR_LOC
13ad0 4b 20 3a 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  K : SQLITE_IOERR
13ae0 5f 55 4e 4c 4f 43 4b 29 3b 0a 23 65 6e 64 69 66  _UNLOCK);.#endif
13af0 20 2f 2a 20 53 51 4c 49 54 45 5f 49 47 4e 4f 52   /* SQLITE_IGNOR
13b00 45 5f 41 46 50 5f 4c 4f 43 4b 5f 45 52 52 4f 52  E_AFP_LOCK_ERROR
13b10 53 20 2a 2f 0a 20 20 20 20 69 66 28 20 49 53 5f  S */.    if( IS_
13b20 4c 4f 43 4b 5f 45 52 52 4f 52 28 72 63 29 20 29  LOCK_ERROR(rc) )
13b30 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c  {.      pFile->l
13b40 61 73 74 45 72 72 6e 6f 20 3d 20 74 45 72 72 6e  astErrno = tErrn
13b50 6f 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74  o;.    }.    ret
13b60 75 72 6e 20 72 63 3b 0a 20 20 7d 20 65 6c 73 65  urn rc;.  } else
13b70 20 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51   {.    return SQ
13b80 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 7d 0a 0a  LITE_OK;.  }.}..
13b90 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
13ba0 6e 65 20 63 68 65 63 6b 73 20 69 66 20 74 68 65  ne checks if the
13bb0 72 65 20 69 73 20 61 20 52 45 53 45 52 56 45 44  re is a RESERVED
13bc0 20 6c 6f 63 6b 20 68 65 6c 64 20 6f 6e 20 74 68   lock held on th
13bd0 65 20 73 70 65 63 69 66 69 65 64 0a 2a 2a 20 66  e specified.** f
13be0 69 6c 65 20 62 79 20 74 68 69 73 20 6f 72 20 61  ile by this or a
13bf0 6e 79 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73  ny other process
13c00 2e 20 49 66 20 73 75 63 68 20 61 20 6c 6f 63 6b  . If such a lock
13c10 20 69 73 20 68 65 6c 64 2c 20 73 65 74 20 2a 70   is held, set *p
13c20 52 65 73 4f 75 74 0a 2a 2a 20 74 6f 20 61 20 6e  ResOut.** to a n
13c30 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75 65 20 6f 74  on-zero value ot
13c40 68 65 72 77 69 73 65 20 2a 70 52 65 73 4f 75 74  herwise *pResOut
13c50 20 69 73 20 73 65 74 20 74 6f 20 7a 65 72 6f 2e   is set to zero.
13c60 20 20 54 68 65 20 72 65 74 75 72 6e 20 76 61 6c    The return val
13c70 75 65 0a 2a 2a 20 69 73 20 73 65 74 20 74 6f 20  ue.** is set to 
13c80 53 51 4c 49 54 45 5f 4f 4b 20 75 6e 6c 65 73 73  SQLITE_OK unless
13c90 20 61 6e 20 49 2f 4f 20 65 72 72 6f 72 20 6f 63   an I/O error oc
13ca0 63 75 72 73 20 64 75 72 69 6e 67 20 6c 6f 63 6b  curs during lock
13cb0 20 63 68 65 63 6b 69 6e 67 2e 0a 2a 2f 0a 73 74   checking..*/.st
13cc0 61 74 69 63 20 69 6e 74 20 61 66 70 43 68 65 63  atic int afpChec
13cd0 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 28 73 71  kReservedLock(sq
13ce0 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20  lite3_file *id, 
13cf0 69 6e 74 20 2a 70 52 65 73 4f 75 74 29 7b 0a 20  int *pResOut){. 
13d00 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
13d10 5f 4f 4b 3b 0a 20 20 69 6e 74 20 72 65 73 65 72  _OK;.  int reser
13d20 76 65 64 20 3d 20 30 3b 0a 20 20 75 6e 69 78 46  ved = 0;.  unixF
13d30 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e  ile *pFile = (un
13d40 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 0a 20  ixFile*)id;.  . 
13d50 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72   SimulateIOError
13d60 28 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ( return SQLITE_
13d70 49 4f 45 52 52 5f 43 48 45 43 4b 52 45 53 45 52  IOERR_CHECKRESER
13d80 56 45 44 4c 4f 43 4b 3b 20 29 3b 0a 20 20 0a 20  VEDLOCK; );.  . 
13d90 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 20 29   assert( pFile )
13da0 3b 0a 20 20 61 66 70 4c 6f 63 6b 69 6e 67 43 6f  ;.  afpLockingCo
13db0 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 20 3d  ntext *context =
13dc0 20 28 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74   (afpLockingCont
13dd0 65 78 74 20 2a 29 20 70 46 69 6c 65 2d 3e 6c 6f  ext *) pFile->lo
13de0 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 0a 20 20  ckingContext;.  
13df0 69 66 28 20 63 6f 6e 74 65 78 74 2d 3e 72 65 73  if( context->res
13e00 65 72 76 65 64 20 29 7b 0a 20 20 20 20 2a 70 52  erved ){.    *pR
13e10 65 73 4f 75 74 20 3d 20 31 3b 0a 20 20 20 20 72  esOut = 1;.    r
13e20 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
13e30 0a 20 20 7d 0a 20 20 75 6e 69 78 45 6e 74 65 72  .  }.  unixEnter
13e40 4d 75 74 65 78 28 29 3b 20 2f 2a 20 42 65 63 61  Mutex(); /* Beca
13e50 75 73 65 20 70 46 69 6c 65 2d 3e 70 4c 6f 63 6b  use pFile->pLock
13e60 20 69 73 20 73 68 61 72 65 64 20 61 63 72 6f 73   is shared acros
13e70 73 20 74 68 72 65 61 64 73 20 2a 2f 0a 20 20 0a  s threads */.  .
13e80 20 20 2f 2a 20 43 68 65 63 6b 20 69 66 20 61 20    /* Check if a 
13e90 74 68 72 65 61 64 20 69 6e 20 74 68 69 73 20 70  thread in this p
13ea0 72 6f 63 65 73 73 20 68 6f 6c 64 73 20 73 75 63  rocess holds suc
13eb0 68 20 61 20 6c 6f 63 6b 20 2a 2f 0a 20 20 69 66  h a lock */.  if
13ec0 28 20 70 46 69 6c 65 2d 3e 70 4c 6f 63 6b 2d 3e  ( pFile->pLock->
13ed0 6c 6f 63 6b 74 79 70 65 3e 53 48 41 52 45 44 5f  locktype>SHARED_
13ee0 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 72 65 73 65  LOCK ){.    rese
13ef0 72 76 65 64 20 3d 20 31 3b 0a 20 20 7d 0a 20 20  rved = 1;.  }.  
13f00 0a 20 20 2f 2a 20 4f 74 68 65 72 77 69 73 65 20  .  /* Otherwise 
13f10 73 65 65 20 69 66 20 73 6f 6d 65 20 6f 74 68 65  see if some othe
13f20 72 20 70 72 6f 63 65 73 73 20 68 6f 6c 64 73 20  r process holds 
13f30 69 74 2e 0a 20 20 20 2a 2f 0a 20 20 69 66 28 20  it..   */.  if( 
13f40 21 72 65 73 65 72 76 65 64 20 29 7b 0a 20 20 20  !reserved ){.   
13f50 20 2f 2a 20 6c 6f 63 6b 20 74 68 65 20 52 45 53   /* lock the RES
13f60 45 52 56 45 44 20 62 79 74 65 20 2a 2f 0a 20 20  ERVED byte */.  
13f70 20 20 69 6e 74 20 6c 72 63 20 3d 20 61 66 70 53    int lrc = afpS
13f80 65 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e  etLock(context->
13f90 64 62 50 61 74 68 2c 20 70 46 69 6c 65 2c 20 52  dbPath, pFile, R
13fa0 45 53 45 52 56 45 44 5f 42 59 54 45 2c 20 31 2c  ESERVED_BYTE, 1,
13fb0 31 29 3b 20 20 0a 20 20 20 20 69 66 28 20 53 51  1);  .    if( SQ
13fc0 4c 49 54 45 5f 4f 4b 3d 3d 6c 72 63 20 29 7b 0a  LITE_OK==lrc ){.
13fd0 20 20 20 20 20 20 2f 2a 20 69 66 20 77 65 20 73        /* if we s
13fe0 75 63 63 65 65 64 65 64 20 69 6e 20 74 61 6b 69  ucceeded in taki
13ff0 6e 67 20 74 68 65 20 72 65 73 65 72 76 65 64 20  ng the reserved 
14000 6c 6f 63 6b 2c 20 75 6e 6c 6f 63 6b 20 69 74 20  lock, unlock it 
14010 74 6f 20 72 65 73 74 6f 72 65 0a 20 20 20 20 20  to restore.     
14020 20 2a 2a 20 74 68 65 20 6f 72 69 67 69 6e 61 6c   ** the original
14030 20 73 74 61 74 65 20 2a 2f 0a 20 20 20 20 20 20   state */.      
14040 6c 72 63 20 3d 20 61 66 70 53 65 74 4c 6f 63 6b  lrc = afpSetLock
14050 28 63 6f 6e 74 65 78 74 2d 3e 64 62 50 61 74 68  (context->dbPath
14060 2c 20 70 46 69 6c 65 2c 20 52 45 53 45 52 56 45  , pFile, RESERVE
14070 44 5f 42 59 54 45 2c 20 31 2c 20 30 29 3b 0a 20  D_BYTE, 1, 0);. 
14080 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20     } else {.    
14090 20 20 2f 2a 20 69 66 20 77 65 20 66 61 69 6c 65    /* if we faile
140a0 64 20 74 6f 20 67 65 74 20 74 68 65 20 6c 6f 63  d to get the loc
140b0 6b 20 74 68 65 6e 20 73 6f 6d 65 6f 6e 65 20 65  k then someone e
140c0 6c 73 65 20 6d 75 73 74 20 68 61 76 65 20 69 74  lse must have it
140d0 20 2a 2f 0a 20 20 20 20 20 20 72 65 73 65 72 76   */.      reserv
140e0 65 64 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20  ed = 1;.    }.  
140f0 20 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45 52    if( IS_LOCK_ER
14100 52 4f 52 28 6c 72 63 29 20 29 7b 0a 20 20 20 20  ROR(lrc) ){.    
14110 20 20 72 63 3d 6c 72 63 3b 0a 20 20 20 20 7d 0a    rc=lrc;.    }.
14120 20 20 7d 0a 20 20 0a 20 20 75 6e 69 78 4c 65 61    }.  .  unixLea
14130 76 65 4d 75 74 65 78 28 29 3b 0a 20 20 4f 53 54  veMutex();.  OST
14140 52 41 43 45 34 28 22 54 45 53 54 20 57 52 2d 4c  RACE4("TEST WR-L
14150 4f 43 4b 20 25 64 20 25 64 20 25 64 20 28 61 66  OCK %d %d %d (af
14160 70 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c  p)\n", pFile->h,
14170 20 72 63 2c 20 72 65 73 65 72 76 65 64 29 3b 0a   rc, reserved);.
14180 20 20 0a 20 20 2a 70 52 65 73 4f 75 74 20 3d 20    .  *pResOut = 
14190 72 65 73 65 72 76 65 64 3b 0a 20 20 72 65 74 75  reserved;.  retu
141a0 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
141b0 4c 6f 63 6b 20 74 68 65 20 66 69 6c 65 20 77 69  Lock the file wi
141c0 74 68 20 74 68 65 20 6c 6f 63 6b 20 73 70 65 63  th the lock spec
141d0 69 66 69 65 64 20 62 79 20 70 61 72 61 6d 65 74  ified by paramet
141e0 65 72 20 6c 6f 63 6b 74 79 70 65 20 2d 20 6f 6e  er locktype - on
141f0 65 0a 2a 2a 20 6f 66 20 74 68 65 20 66 6f 6c 6c  e.** of the foll
14200 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  owing:.**.**    
14210 20 28 31 29 20 53 48 41 52 45 44 5f 4c 4f 43 4b   (1) SHARED_LOCK
14220 0a 2a 2a 20 20 20 20 20 28 32 29 20 52 45 53 45  .**     (2) RESE
14230 52 56 45 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20  RVED_LOCK.**    
14240 20 28 33 29 20 50 45 4e 44 49 4e 47 5f 4c 4f 43   (3) PENDING_LOC
14250 4b 0a 2a 2a 20 20 20 20 20 28 34 29 20 45 58 43  K.**     (4) EXC
14260 4c 55 53 49 56 45 5f 4c 4f 43 4b 0a 2a 2a 0a 2a  LUSIVE_LOCK.**.*
14270 2a 20 53 6f 6d 65 74 69 6d 65 73 20 77 68 65 6e  * Sometimes when
14280 20 72 65 71 75 65 73 74 69 6e 67 20 6f 6e 65 20   requesting one 
14290 6c 6f 63 6b 20 73 74 61 74 65 2c 20 61 64 64 69  lock state, addi
142a0 74 69 6f 6e 61 6c 20 6c 6f 63 6b 20 73 74 61 74  tional lock stat
142b0 65 73 0a 2a 2a 20 61 72 65 20 69 6e 73 65 72 74  es.** are insert
142c0 65 64 20 69 6e 20 62 65 74 77 65 65 6e 2e 20 20  ed in between.  
142d0 54 68 65 20 6c 6f 63 6b 69 6e 67 20 6d 69 67 68  The locking migh
142e0 74 20 66 61 69 6c 20 6f 6e 20 6f 6e 65 20 6f 66  t fail on one of
142f0 20 74 68 65 20 6c 61 74 65 72 0a 2a 2a 20 74 72   the later.** tr
14300 61 6e 73 69 74 69 6f 6e 73 20 6c 65 61 76 69 6e  ansitions leavin
14310 67 20 74 68 65 20 6c 6f 63 6b 20 73 74 61 74 65  g the lock state
14320 20 64 69 66 66 65 72 65 6e 74 20 66 72 6f 6d 20   different from 
14330 77 68 61 74 20 69 74 20 73 74 61 72 74 65 64 20  what it started 
14340 62 75 74 0a 2a 2a 20 73 74 69 6c 6c 20 73 68 6f  but.** still sho
14350 72 74 20 6f 66 20 69 74 73 20 67 6f 61 6c 2e 20  rt of its goal. 
14360 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63   The following c
14370 68 61 72 74 20 73 68 6f 77 73 20 74 68 65 20 61  hart shows the a
14380 6c 6c 6f 77 65 64 0a 2a 2a 20 74 72 61 6e 73 69  llowed.** transi
14390 74 69 6f 6e 73 20 61 6e 64 20 74 68 65 20 69 6e  tions and the in
143a0 73 65 72 74 65 64 20 69 6e 74 65 72 6d 65 64 69  serted intermedi
143b0 61 74 65 20 73 74 61 74 65 73 3a 0a 2a 2a 0a 2a  ate states:.**.*
143c0 2a 20 20 20 20 55 4e 4c 4f 43 4b 45 44 20 2d 3e  *    UNLOCKED ->
143d0 20 53 48 41 52 45 44 0a 2a 2a 20 20 20 20 53 48   SHARED.**    SH
143e0 41 52 45 44 20 2d 3e 20 52 45 53 45 52 56 45 44  ARED -> RESERVED
143f0 0a 2a 2a 20 20 20 20 53 48 41 52 45 44 20 2d 3e  .**    SHARED ->
14400 20 28 50 45 4e 44 49 4e 47 29 20 2d 3e 20 45 58   (PENDING) -> EX
14410 43 4c 55 53 49 56 45 0a 2a 2a 20 20 20 20 52 45  CLUSIVE.**    RE
14420 53 45 52 56 45 44 20 2d 3e 20 28 50 45 4e 44 49  SERVED -> (PENDI
14430 4e 47 29 20 2d 3e 20 45 58 43 4c 55 53 49 56 45  NG) -> EXCLUSIVE
14440 0a 2a 2a 20 20 20 20 50 45 4e 44 49 4e 47 20 2d  .**    PENDING -
14450 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 0a 2a  > EXCLUSIVE.**.*
14460 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77  * This routine w
14470 69 6c 6c 20 6f 6e 6c 79 20 69 6e 63 72 65 61 73  ill only increas
14480 65 20 61 20 6c 6f 63 6b 2e 20 20 55 73 65 20 74  e a lock.  Use t
14490 68 65 20 73 71 6c 69 74 65 33 4f 73 55 6e 6c 6f  he sqlite3OsUnlo
144a0 63 6b 28 29 0a 2a 2a 20 72 6f 75 74 69 6e 65 20  ck().** routine 
144b0 74 6f 20 6c 6f 77 65 72 20 61 20 6c 6f 63 6b 69  to lower a locki
144c0 6e 67 20 6c 65 76 65 6c 2e 0a 2a 2f 0a 73 74 61  ng level..*/.sta
144d0 74 69 63 20 69 6e 74 20 61 66 70 4c 6f 63 6b 28  tic int afpLock(
144e0 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64  sqlite3_file *id
144f0 2c 20 69 6e 74 20 6c 6f 63 6b 74 79 70 65 29 7b  , int locktype){
14500 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
14510 54 45 5f 4f 4b 3b 0a 20 20 75 6e 69 78 46 69 6c  TE_OK;.  unixFil
14520 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78  e *pFile = (unix
14530 46 69 6c 65 2a 29 69 64 3b 0a 20 20 73 74 72 75  File*)id;.  stru
14540 63 74 20 75 6e 69 78 4c 6f 63 6b 49 6e 66 6f 20  ct unixLockInfo 
14550 2a 70 4c 6f 63 6b 20 3d 20 70 46 69 6c 65 2d 3e  *pLock = pFile->
14560 70 4c 6f 63 6b 3b 0a 20 20 61 66 70 4c 6f 63 6b  pLock;.  afpLock
14570 69 6e 67 43 6f 6e 74 65 78 74 20 2a 63 6f 6e 74  ingContext *cont
14580 65 78 74 20 3d 20 28 61 66 70 4c 6f 63 6b 69 6e  ext = (afpLockin
14590 67 43 6f 6e 74 65 78 74 20 2a 29 20 70 46 69 6c  gContext *) pFil
145a0 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78  e->lockingContex
145b0 74 3b 0a 20 20 0a 20 20 61 73 73 65 72 74 28 20  t;.  .  assert( 
145c0 70 46 69 6c 65 20 29 3b 0a 20 20 4f 53 54 52 41  pFile );.  OSTRA
145d0 43 45 37 28 22 4c 4f 43 4b 20 20 20 20 25 64 20  CE7("LOCK    %d 
145e0 25 73 20 77 61 73 20 25 73 28 25 73 2c 25 64 29  %s was %s(%s,%d)
145f0 20 70 69 64 3d 25 64 20 28 61 66 70 29 5c 6e 22   pid=%d (afp)\n"
14600 2c 20 70 46 69 6c 65 2d 3e 68 2c 0a 20 20 20 20  , pFile->h,.    
14610 20 20 20 20 20 20 20 6c 6f 63 6b 74 79 70 65 4e         locktypeN
14620 61 6d 65 28 6c 6f 63 6b 74 79 70 65 29 2c 20 6c  ame(locktype), l
14630 6f 63 6b 74 79 70 65 4e 61 6d 65 28 70 46 69 6c  ocktypeName(pFil
14640 65 2d 3e 6c 6f 63 6b 74 79 70 65 29 2c 0a 20 20  e->locktype),.  
14650 20 20 20 20 20 20 20 20 20 6c 6f 63 6b 74 79 70           locktyp
14660 65 4e 61 6d 65 28 70 4c 6f 63 6b 2d 3e 6c 6f 63  eName(pLock->loc
14670 6b 74 79 70 65 29 2c 20 70 4c 6f 63 6b 2d 3e 63  ktype), pLock->c
14680 6e 74 20 2c 20 67 65 74 70 69 64 28 29 29 3b 0a  nt , getpid());.
14690 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 69  .  /* If there i
146a0 73 20 61 6c 72 65 61 64 79 20 61 20 6c 6f 63 6b  s already a lock
146b0 20 6f 66 20 74 68 69 73 20 74 79 70 65 20 6f 72   of this type or
146c0 20 6d 6f 72 65 20 72 65 73 74 72 69 63 74 69 76   more restrictiv
146d0 65 20 6f 6e 20 74 68 65 0a 20 20 2a 2a 20 75 6e  e on the.  ** un
146e0 69 78 46 69 6c 65 2c 20 64 6f 20 6e 6f 74 68 69  ixFile, do nothi
146f0 6e 67 2e 20 44 6f 6e 27 74 20 75 73 65 20 74 68  ng. Don't use th
14700 65 20 61 66 70 5f 65 6e 64 5f 6c 6f 63 6b 3a 20  e afp_end_lock: 
14710 65 78 69 74 20 70 61 74 68 2c 20 61 73 0a 20 20  exit path, as.  
14720 2a 2a 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65  ** unixEnterMute
14730 78 28 29 20 68 61 73 6e 27 74 20 62 65 65 6e 20  x() hasn't been 
14740 63 61 6c 6c 65 64 20 79 65 74 2e 0a 20 20 2a 2f  called yet..  */
14750 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 6c 6f  .  if( pFile->lo
14760 63 6b 74 79 70 65 3e 3d 6c 6f 63 6b 74 79 70 65  cktype>=locktype
14770 20 29 7b 0a 20 20 20 20 4f 53 54 52 41 43 45 33   ){.    OSTRACE3
14780 28 22 4c 4f 43 4b 20 20 20 20 25 64 20 25 73 20  ("LOCK    %d %s 
14790 6f 6b 20 28 61 6c 72 65 61 64 79 20 68 65 6c 64  ok (already held
147a0 29 20 28 61 66 70 29 5c 6e 22 2c 20 70 46 69 6c  ) (afp)\n", pFil
147b0 65 2d 3e 68 2c 0a 20 20 20 20 20 20 20 20 20 20  e->h,.          
147c0 20 6c 6f 63 6b 74 79 70 65 4e 61 6d 65 28 6c 6f   locktypeName(lo
147d0 63 6b 74 79 70 65 29 29 3b 0a 20 20 20 20 72 65  cktype));.    re
147e0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
147f0 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73    }..  /* Make s
14800 75 72 65 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20  ure the locking 
14810 73 65 71 75 65 6e 63 65 20 69 73 20 63 6f 72 72  sequence is corr
14820 65 63 74 0a 20 20 2a 2a 20 20 28 31 29 20 57 65  ect.  **  (1) We
14830 20 6e 65 76 65 72 20 6d 6f 76 65 20 66 72 6f 6d   never move from
14840 20 75 6e 6c 6f 63 6b 65 64 20 74 6f 20 61 6e 79   unlocked to any
14850 74 68 69 6e 67 20 68 69 67 68 65 72 20 74 68 61  thing higher tha
14860 6e 20 73 68 61 72 65 64 20 6c 6f 63 6b 2e 0a 20  n shared lock.. 
14870 20 2a 2a 20 20 28 32 29 20 53 51 4c 69 74 65 20   **  (2) SQLite 
14880 6e 65 76 65 72 20 65 78 70 6c 69 63 69 74 6c 79  never explicitly
14890 20 72 65 71 75 65 73 74 73 20 61 20 70 65 6e 64   requests a pend
148a0 69 67 20 6c 6f 63 6b 2e 0a 20 20 2a 2a 20 20 28  ig lock..  **  (
148b0 33 29 20 41 20 73 68 61 72 65 64 20 6c 6f 63 6b  3) A shared lock
148c0 20 69 73 20 61 6c 77 61 79 73 20 68 65 6c 64 20   is always held 
148d0 77 68 65 6e 20 61 20 72 65 73 65 72 76 65 20 6c  when a reserve l
148e0 6f 63 6b 20 69 73 20 72 65 71 75 65 73 74 65 64  ock is requested
148f0 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ..  */.  assert(
14900 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65   pFile->locktype
14910 21 3d 4e 4f 5f 4c 4f 43 4b 20 7c 7c 20 6c 6f 63  !=NO_LOCK || loc
14920 6b 74 79 70 65 3d 3d 53 48 41 52 45 44 5f 4c 4f  ktype==SHARED_LO
14930 43 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  CK );.  assert( 
14940 6c 6f 63 6b 74 79 70 65 21 3d 50 45 4e 44 49 4e  locktype!=PENDIN
14950 47 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65  G_LOCK );.  asse
14960 72 74 28 20 6c 6f 63 6b 74 79 70 65 21 3d 52 45  rt( locktype!=RE
14970 53 45 52 56 45 44 5f 4c 4f 43 4b 20 7c 7c 20 70  SERVED_LOCK || p
14980 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3d 3d  File->locktype==
14990 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20  SHARED_LOCK );. 
149a0 20 0a 20 20 2f 2a 20 54 68 69 73 20 6d 75 74 65   .  /* This mute
149b0 78 20 69 73 20 6e 65 65 64 65 64 20 62 65 63 61  x is needed beca
149c0 75 73 65 20 70 46 69 6c 65 2d 3e 70 4c 6f 63 6b  use pFile->pLock
149d0 20 69 73 20 73 68 61 72 65 64 20 61 63 72 6f 73   is shared acros
149e0 73 20 74 68 72 65 61 64 73 0a 20 20 2a 2f 0a 20  s threads.  */. 
149f0 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28   unixEnterMutex(
14a00 29 3b 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75  );..  /* Make su
14a10 72 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 74  re the current t
14a20 68 72 65 61 64 20 6f 77 6e 73 20 74 68 65 20 70  hread owns the p
14a30 46 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20 72 63 20  File..  */.  rc 
14a40 3d 20 74 72 61 6e 73 66 65 72 4f 77 6e 65 72 73  = transferOwners
14a50 68 69 70 28 70 46 69 6c 65 29 3b 0a 20 20 69 66  hip(pFile);.  if
14a60 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
14a70 29 7b 0a 20 20 20 20 75 6e 69 78 4c 65 61 76 65  ){.    unixLeave
14a80 4d 75 74 65 78 28 29 3b 0a 20 20 20 20 72 65 74  Mutex();.    ret
14a90 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 70 4c  urn rc;.  }.  pL
14aa0 6f 63 6b 20 3d 20 70 46 69 6c 65 2d 3e 70 4c 6f  ock = pFile->pLo
14ab0 63 6b 3b 0a 0a 20 20 2f 2a 20 49 66 20 73 6f 6d  ck;..  /* If som
14ac0 65 20 74 68 72 65 61 64 20 75 73 69 6e 67 20 74  e thread using t
14ad0 68 69 73 20 50 49 44 20 68 61 73 20 61 20 6c 6f  his PID has a lo
14ae0 63 6b 20 76 69 61 20 61 20 64 69 66 66 65 72 65  ck via a differe
14af0 6e 74 20 75 6e 69 78 46 69 6c 65 2a 0a 20 20 2a  nt unixFile*.  *
14b00 2a 20 68 61 6e 64 6c 65 20 74 68 61 74 20 70 72  * handle that pr
14b10 65 63 6c 75 64 65 73 20 74 68 65 20 72 65 71 75  ecludes the requ
14b20 65 73 74 65 64 20 6c 6f 63 6b 2c 20 72 65 74 75  ested lock, retu
14b30 72 6e 20 42 55 53 59 2e 0a 20 20 2a 2f 0a 20 20  rn BUSY..  */.  
14b40 69 66 28 20 28 70 46 69 6c 65 2d 3e 6c 6f 63 6b  if( (pFile->lock
14b50 74 79 70 65 21 3d 70 4c 6f 63 6b 2d 3e 6c 6f 63  type!=pLock->loc
14b60 6b 74 79 70 65 20 26 26 20 0a 20 20 20 20 20 20  ktype && .      
14b70 20 28 70 4c 6f 63 6b 2d 3e 6c 6f 63 6b 74 79 70   (pLock->locktyp
14b80 65 3e 3d 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 20  e>=PENDING_LOCK 
14b90 7c 7c 20 6c 6f 63 6b 74 79 70 65 3e 53 48 41 52  || locktype>SHAR
14ba0 45 44 5f 4c 4f 43 4b 29 29 0a 20 20 20 20 20 29  ED_LOCK)).     )
14bb0 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  {.    rc = SQLIT
14bc0 45 5f 42 55 53 59 3b 0a 20 20 20 20 67 6f 74 6f  E_BUSY;.    goto
14bd0 20 61 66 70 5f 65 6e 64 5f 6c 6f 63 6b 3b 0a 20   afp_end_lock;. 
14be0 20 7d 0a 20 20 0a 20 20 2f 2a 20 49 66 20 61 20   }.  .  /* If a 
14bf0 53 48 41 52 45 44 20 6c 6f 63 6b 20 69 73 20 72  SHARED lock is r
14c00 65 71 75 65 73 74 65 64 2c 20 61 6e 64 20 73 6f  equested, and so
14c10 6d 65 20 74 68 72 65 61 64 20 75 73 69 6e 67 20  me thread using 
14c20 74 68 69 73 20 50 49 44 20 61 6c 72 65 61 64 79  this PID already
14c30 0a 20 20 2a 2a 20 68 61 73 20 61 20 53 48 41 52  .  ** has a SHAR
14c40 45 44 20 6f 72 20 52 45 53 45 52 56 45 44 20 6c  ED or RESERVED l
14c50 6f 63 6b 2c 20 74 68 65 6e 20 69 6e 63 72 65 6d  ock, then increm
14c60 65 6e 74 20 72 65 66 65 72 65 6e 63 65 20 63 6f  ent reference co
14c70 75 6e 74 73 20 61 6e 64 0a 20 20 2a 2a 20 72 65  unts and.  ** re
14c80 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a  turn SQLITE_OK..
14c90 20 20 2a 2f 0a 20 20 69 66 28 20 6c 6f 63 6b 74    */.  if( lockt
14ca0 79 70 65 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b  ype==SHARED_LOCK
14cb0 20 26 26 20 0a 20 20 20 20 20 28 70 4c 6f 63 6b   && .     (pLock
14cc0 2d 3e 6c 6f 63 6b 74 79 70 65 3d 3d 53 48 41 52  ->locktype==SHAR
14cd0 45 44 5f 4c 4f 43 4b 20 7c 7c 20 70 4c 6f 63 6b  ED_LOCK || pLock
14ce0 2d 3e 6c 6f 63 6b 74 79 70 65 3d 3d 52 45 53 45  ->locktype==RESE
14cf0 52 56 45 44 5f 4c 4f 43 4b 29 20 29 7b 0a 20 20  RVED_LOCK) ){.  
14d00 20 20 61 73 73 65 72 74 28 20 6c 6f 63 6b 74 79    assert( lockty
14d10 70 65 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20  pe==SHARED_LOCK 
14d20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
14d30 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3d 3d  File->locktype==
14d40 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  0 );.    assert(
14d50 20 70 4c 6f 63 6b 2d 3e 63 6e 74 3e 30 20 29 3b   pLock->cnt>0 );
14d60 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b  .    pFile->lock
14d70 74 79 70 65 20 3d 20 53 48 41 52 45 44 5f 4c 4f  type = SHARED_LO
14d80 43 4b 3b 0a 20 20 20 20 70 4c 6f 63 6b 2d 3e 63  CK;.    pLock->c
14d90 6e 74 2b 2b 3b 0a 20 20 20 20 70 46 69 6c 65 2d  nt++;.    pFile-
14da0 3e 70 4f 70 65 6e 2d 3e 6e 4c 6f 63 6b 2b 2b 3b  >pOpen->nLock++;
14db0 0a 20 20 20 20 67 6f 74 6f 20 61 66 70 5f 65 6e  .    goto afp_en
14dc0 64 5f 6c 6f 63 6b 3b 0a 20 20 7d 0a 20 20 20 20  d_lock;.  }.    
14dd0 0a 20 20 2f 2a 20 41 20 50 45 4e 44 49 4e 47 20  .  /* A PENDING 
14de0 6c 6f 63 6b 20 69 73 20 6e 65 65 64 65 64 20 62  lock is needed b
14df0 65 66 6f 72 65 20 61 63 71 75 69 72 69 6e 67 20  efore acquiring 
14e00 61 20 53 48 41 52 45 44 20 6c 6f 63 6b 20 61 6e  a SHARED lock an
14e10 64 20 62 65 66 6f 72 65 0a 20 20 2a 2a 20 61 63  d before.  ** ac
14e20 71 75 69 72 69 6e 67 20 61 6e 20 45 58 43 4c 55  quiring an EXCLU
14e30 53 49 56 45 20 6c 6f 63 6b 2e 20 20 46 6f 72 20  SIVE lock.  For 
14e40 74 68 65 20 53 48 41 52 45 44 20 6c 6f 63 6b 2c  the SHARED lock,
14e50 20 74 68 65 20 50 45 4e 44 49 4e 47 20 77 69 6c   the PENDING wil
14e60 6c 0a 20 20 2a 2a 20 62 65 20 72 65 6c 65 61 73  l.  ** be releas
14e70 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6c  ed..  */.  if( l
14e80 6f 63 6b 74 79 70 65 3d 3d 53 48 41 52 45 44 5f  ocktype==SHARED_
14e90 4c 4f 43 4b 20 0a 20 20 20 20 20 20 7c 7c 20 28  LOCK .      || (
14ea0 6c 6f 63 6b 74 79 70 65 3d 3d 45 58 43 4c 55 53  locktype==EXCLUS
14eb0 49 56 45 5f 4c 4f 43 4b 20 26 26 20 70 46 69 6c  IVE_LOCK && pFil
14ec0 65 2d 3e 6c 6f 63 6b 74 79 70 65 3c 50 45 4e 44  e->locktype<PEND
14ed0 49 4e 47 5f 4c 4f 43 4b 29 0a 20 20 29 7b 0a 20  ING_LOCK).  ){. 
14ee0 20 20 20 69 6e 74 20 66 61 69 6c 65 64 3b 0a 20     int failed;. 
14ef0 20 20 20 66 61 69 6c 65 64 20 3d 20 61 66 70 53     failed = afpS
14f00 65 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e  etLock(context->
14f10 64 62 50 61 74 68 2c 20 70 46 69 6c 65 2c 20 50  dbPath, pFile, P
14f20 45 4e 44 49 4e 47 5f 42 59 54 45 2c 20 31 2c 20  ENDING_BYTE, 1, 
14f30 31 29 3b 0a 20 20 20 20 69 66 20 28 66 61 69 6c  1);.    if (fail
14f40 65 64 29 20 7b 0a 20 20 20 20 20 20 72 63 20 3d  ed) {.      rc =
14f50 20 66 61 69 6c 65 64 3b 0a 20 20 20 20 20 20 67   failed;.      g
14f60 6f 74 6f 20 61 66 70 5f 65 6e 64 5f 6c 6f 63 6b  oto afp_end_lock
14f70 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 0a 20  ;.    }.  }.  . 
14f80 20 2f 2a 20 49 66 20 63 6f 6e 74 72 6f 6c 20 67   /* If control g
14f90 65 74 73 20 74 6f 20 74 68 69 73 20 70 6f 69 6e  ets to this poin
14fa0 74 2c 20 74 68 65 6e 20 61 63 74 75 61 6c 6c 79  t, then actually
14fb0 20 67 6f 20 61 68 65 61 64 20 61 6e 64 20 6d 61   go ahead and ma
14fc0 6b 65 0a 20 20 2a 2a 20 6f 70 65 72 61 74 69 6e  ke.  ** operatin
14fd0 67 20 73 79 73 74 65 6d 20 63 61 6c 6c 73 20 66  g system calls f
14fe0 6f 72 20 74 68 65 20 73 70 65 63 69 66 69 65 64  or the specified
14ff0 20 6c 6f 63 6b 2e 0a 20 20 2a 2f 0a 20 20 69 66   lock..  */.  if
15000 28 20 6c 6f 63 6b 74 79 70 65 3d 3d 53 48 41 52  ( locktype==SHAR
15010 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 69  ED_LOCK ){.    i
15020 6e 74 20 6c 72 63 31 2c 20 6c 72 63 32 2c 20 6c  nt lrc1, lrc2, l
15030 72 63 31 45 72 72 6e 6f 3b 0a 20 20 20 20 6c 6f  rc1Errno;.    lo
15040 6e 67 20 6c 6b 2c 20 6d 61 73 6b 3b 0a 20 20 20  ng lk, mask;.   
15050 20 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4c   .    assert( pL
15060 6f 63 6b 2d 3e 63 6e 74 3d 3d 30 20 29 3b 0a 20  ock->cnt==0 );. 
15070 20 20 20 61 73 73 65 72 74 28 20 70 4c 6f 63 6b     assert( pLock
15080 2d 3e 6c 6f 63 6b 74 79 70 65 3d 3d 30 20 29 3b  ->locktype==0 );
15090 0a 20 20 20 20 20 20 20 20 0a 20 20 20 20 6d 61  .        .    ma
150a0 73 6b 20 3d 20 28 73 69 7a 65 6f 66 28 6c 6f 6e  sk = (sizeof(lon
150b0 67 29 3d 3d 38 29 20 3f 20 4c 41 52 47 45 53 54  g)==8) ? LARGEST
150c0 5f 49 4e 54 36 34 20 3a 20 30 78 37 66 66 66 66  _INT64 : 0x7ffff
150d0 66 66 66 3b 0a 20 20 20 20 2f 2a 20 4e 6f 77 20  fff;.    /* Now 
150e0 67 65 74 20 74 68 65 20 72 65 61 64 2d 6c 6f 63  get the read-loc
150f0 6b 20 53 48 41 52 45 44 5f 4c 4f 43 4b 20 2a 2f  k SHARED_LOCK */
15100 0a 20 20 20 20 2f 2a 20 6e 6f 74 65 20 74 68 61  .    /* note tha
15110 74 20 74 68 65 20 71 75 61 6c 69 74 79 20 6f 66  t the quality of
15120 20 74 68 65 20 72 61 6e 64 6f 6d 6e 65 73 73 20   the randomness 
15130 64 6f 65 73 6e 27 74 20 6d 61 74 74 65 72 20 74  doesn't matter t
15140 68 61 74 20 6d 75 63 68 20 2a 2f 0a 20 20 20 20  hat much */.    
15150 6c 6b 20 3d 20 72 61 6e 64 6f 6d 28 29 3b 20 0a  lk = random(); .
15160 20 20 20 20 70 4c 6f 63 6b 2d 3e 73 68 61 72 65      pLock->share
15170 64 42 79 74 65 20 3d 20 28 6c 6b 20 26 20 6d 61  dByte = (lk & ma
15180 73 6b 29 25 28 53 48 41 52 45 44 5f 53 49 5a 45  sk)%(SHARED_SIZE
15190 20 2d 20 31 29 3b 0a 20 20 20 20 6c 72 63 31 20   - 1);.    lrc1 
151a0 3d 20 61 66 70 53 65 74 4c 6f 63 6b 28 63 6f 6e  = afpSetLock(con
151b0 74 65 78 74 2d 3e 64 62 50 61 74 68 2c 20 70 46  text->dbPath, pF
151c0 69 6c 65 2c 20 0a 20 20 20 20 20 20 20 20 20 20  ile, .          
151d0 53 48 41 52 45 44 5f 46 49 52 53 54 2b 70 4c 6f  SHARED_FIRST+pLo
151e0 63 6b 2d 3e 73 68 61 72 65 64 42 79 74 65 2c 20  ck->sharedByte, 
151f0 31 2c 20 31 29 3b 0a 20 20 20 20 69 66 28 20 49  1, 1);.    if( I
15200 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 6c 72 63  S_LOCK_ERROR(lrc
15210 31 29 20 29 7b 0a 20 20 20 20 20 20 6c 72 63 31  1) ){.      lrc1
15220 45 72 72 6e 6f 20 3d 20 70 46 69 6c 65 2d 3e 6c  Errno = pFile->l
15230 61 73 74 45 72 72 6e 6f 3b 0a 20 20 20 20 7d 0a  astErrno;.    }.
15240 20 20 20 20 2f 2a 20 44 72 6f 70 20 74 68 65 20      /* Drop the 
15250 74 65 6d 70 6f 72 61 72 79 20 50 45 4e 44 49 4e  temporary PENDIN
15260 47 20 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20 6c 72  G lock */.    lr
15270 63 32 20 3d 20 61 66 70 53 65 74 4c 6f 63 6b 28  c2 = afpSetLock(
15280 63 6f 6e 74 65 78 74 2d 3e 64 62 50 61 74 68 2c  context->dbPath,
15290 20 70 46 69 6c 65 2c 20 50 45 4e 44 49 4e 47 5f   pFile, PENDING_
152a0 42 59 54 45 2c 20 31 2c 20 30 29 3b 0a 20 20 20  BYTE, 1, 0);.   
152b0 20 0a 20 20 20 20 69 66 28 20 49 53 5f 4c 4f 43   .    if( IS_LOC
152c0 4b 5f 45 52 52 4f 52 28 6c 72 63 31 29 20 29 20  K_ERROR(lrc1) ) 
152d0 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c  {.      pFile->l
152e0 61 73 74 45 72 72 6e 6f 20 3d 20 6c 72 63 31 45  astErrno = lrc1E
152f0 72 72 6e 6f 3b 0a 20 20 20 20 20 20 72 63 20 3d  rrno;.      rc =
15300 20 6c 72 63 31 3b 0a 20 20 20 20 20 20 67 6f 74   lrc1;.      got
15310 6f 20 61 66 70 5f 65 6e 64 5f 6c 6f 63 6b 3b 0a  o afp_end_lock;.
15320 20 20 20 20 7d 20 65 6c 73 65 20 69 66 28 20 49      } else if( I
15330 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 6c 72 63  S_LOCK_ERROR(lrc
15340 32 29 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  2) ){.      rc =
15350 20 6c 72 63 32 3b 0a 20 20 20 20 20 20 67 6f 74   lrc2;.      got
15360 6f 20 61 66 70 5f 65 6e 64 5f 6c 6f 63 6b 3b 0a  o afp_end_lock;.
15370 20 20 20 20 7d 20 65 6c 73 65 20 69 66 28 20 6c      } else if( l
15380 72 63 31 20 21 3d 20 53 51 4c 49 54 45 5f 4f 4b  rc1 != SQLITE_OK
15390 20 29 20 7b 0a 20 20 20 20 20 20 72 63 20 3d 20   ) {.      rc = 
153a0 6c 72 63 31 3b 0a 20 20 20 20 7d 20 65 6c 73 65  lrc1;.    } else
153b0 20 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e   {.      pFile->
153c0 6c 6f 63 6b 74 79 70 65 20 3d 20 53 48 41 52 45  locktype = SHARE
153d0 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 70 46  D_LOCK;.      pF
153e0 69 6c 65 2d 3e 70 4f 70 65 6e 2d 3e 6e 4c 6f 63  ile->pOpen->nLoc
153f0 6b 2b 2b 3b 0a 20 20 20 20 20 20 70 4c 6f 63 6b  k++;.      pLock
15400 2d 3e 63 6e 74 20 3d 20 31 3b 0a 20 20 20 20 7d  ->cnt = 1;.    }
15410 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 6c 6f 63  .  }else if( loc
15420 6b 74 79 70 65 3d 3d 45 58 43 4c 55 53 49 56 45  ktype==EXCLUSIVE
15430 5f 4c 4f 43 4b 20 26 26 20 70 4c 6f 63 6b 2d 3e  _LOCK && pLock->
15440 63 6e 74 3e 31 20 29 7b 0a 20 20 20 20 2f 2a 20  cnt>1 ){.    /* 
15450 57 65 20 61 72 65 20 74 72 79 69 6e 67 20 66 6f  We are trying fo
15460 72 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c  r an exclusive l
15470 6f 63 6b 20 62 75 74 20 61 6e 6f 74 68 65 72 20  ock but another 
15480 74 68 72 65 61 64 20 69 6e 20 74 68 69 73 0a 20  thread in this. 
15490 20 20 20 20 2a 2a 20 73 61 6d 65 20 70 72 6f 63      ** same proc
154a0 65 73 73 20 69 73 20 73 74 69 6c 6c 20 68 6f 6c  ess is still hol
154b0 64 69 6e 67 20 61 20 73 68 61 72 65 64 20 6c 6f  ding a shared lo
154c0 63 6b 2e 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20  ck. */.    rc = 
154d0 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 7d  SQLITE_BUSY;.  }
154e0 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54 68 65  else{.    /* The
154f0 20 72 65 71 75 65 73 74 20 77 61 73 20 66 6f 72   request was for
15500 20 61 20 52 45 53 45 52 56 45 44 20 6f 72 20 45   a RESERVED or E
15510 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 20 20  XCLUSIVE lock.  
15520 49 74 20 69 73 0a 20 20 20 20 2a 2a 20 61 73 73  It is.    ** ass
15530 75 6d 65 64 20 74 68 61 74 20 74 68 65 72 65 20  umed that there 
15540 69 73 20 61 20 53 48 41 52 45 44 20 6f 72 20 67  is a SHARED or g
15550 72 65 61 74 65 72 20 6c 6f 63 6b 20 6f 6e 20 74  reater lock on t
15560 68 65 20 66 69 6c 65 0a 20 20 20 20 2a 2a 20 61  he file.    ** a
15570 6c 72 65 61 64 79 2e 0a 20 20 20 20 2a 2f 0a 20  lready..    */. 
15580 20 20 20 69 6e 74 20 66 61 69 6c 65 64 20 3d 20     int failed = 
15590 30 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 30  0;.    assert( 0
155a0 21 3d 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70  !=pFile->locktyp
155b0 65 20 29 3b 0a 20 20 20 20 69 66 20 28 6c 6f 63  e );.    if (loc
155c0 6b 74 79 70 65 20 3e 3d 20 52 45 53 45 52 56 45  ktype >= RESERVE
155d0 44 5f 4c 4f 43 4b 20 26 26 20 70 46 69 6c 65 2d  D_LOCK && pFile-
155e0 3e 6c 6f 63 6b 74 79 70 65 20 3c 20 52 45 53 45  >locktype < RESE
155f0 52 56 45 44 5f 4c 4f 43 4b 29 20 7b 0a 20 20 20  RVED_LOCK) {.   
15600 20 20 20 20 20 2f 2a 20 41 63 71 75 69 72 65 20       /* Acquire 
15610 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20  a RESERVED lock 
15620 2a 2f 0a 20 20 20 20 20 20 20 20 66 61 69 6c 65  */.        faile
15630 64 20 3d 20 61 66 70 53 65 74 4c 6f 63 6b 28 63  d = afpSetLock(c
15640 6f 6e 74 65 78 74 2d 3e 64 62 50 61 74 68 2c 20  ontext->dbPath, 
15650 70 46 69 6c 65 2c 20 52 45 53 45 52 56 45 44 5f  pFile, RESERVED_
15660 42 59 54 45 2c 20 31 2c 31 29 3b 0a 20 20 20 20  BYTE, 1,1);.    
15670 20 20 69 66 28 20 21 66 61 69 6c 65 64 20 29 7b    if( !failed ){
15680 0a 20 20 20 20 20 20 20 20 63 6f 6e 74 65 78 74  .        context
15690 2d 3e 72 65 73 65 72 76 65 64 20 3d 20 31 3b 0a  ->reserved = 1;.
156a0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
156b0 20 20 69 66 20 28 21 66 61 69 6c 65 64 20 26 26    if (!failed &&
156c0 20 6c 6f 63 6b 74 79 70 65 20 3d 3d 20 45 58 43   locktype == EXC
156d0 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 20 7b 0a 20  LUSIVE_LOCK) {. 
156e0 20 20 20 20 20 2f 2a 20 41 63 71 75 69 72 65 20       /* Acquire 
156f0 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63  an EXCLUSIVE loc
15700 6b 20 2a 2f 0a 20 20 20 20 20 20 20 20 0a 20 20  k */.        .  
15710 20 20 20 20 2f 2a 20 52 65 6d 6f 76 65 20 74 68      /* Remove th
15720 65 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 62 65  e shared lock be
15730 66 6f 72 65 20 74 72 79 69 6e 67 20 74 68 65 20  fore trying the 
15740 72 61 6e 67 65 2e 20 20 77 65 27 6c 6c 20 6e 65  range.  we'll ne
15750 65 64 20 74 6f 20 0a 20 20 20 20 20 20 2a 2a 20  ed to .      ** 
15760 72 65 65 73 74 61 62 6c 69 73 68 20 74 68 65 20  reestablish the 
15770 73 68 61 72 65 64 20 6c 6f 63 6b 20 69 66 20 77  shared lock if w
15780 65 20 63 61 6e 27 74 20 67 65 74 20 74 68 65 20  e can't get the 
15790 20 61 66 70 55 6e 6c 6f 63 6b 0a 20 20 20 20 20   afpUnlock.     
157a0 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 21 28   */.      if( !(
157b0 66 61 69 6c 65 64 20 3d 20 61 66 70 53 65 74 4c  failed = afpSetL
157c0 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 64 62 50  ock(context->dbP
157d0 61 74 68 2c 20 70 46 69 6c 65 2c 20 53 48 41 52  ath, pFile, SHAR
157e0 45 44 5f 46 49 52 53 54 20 2b 0a 20 20 20 20 20  ED_FIRST +.     
157f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15800 20 20 20 20 70 4c 6f 63 6b 2d 3e 73 68 61 72 65      pLock->share
15810 64 42 79 74 65 2c 20 31 2c 20 30 29 29 20 29 7b  dByte, 1, 0)) ){
15820 0a 20 20 20 20 20 20 20 20 69 6e 74 20 66 61 69  .        int fai
15830 6c 65 64 32 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  led2 = SQLITE_OK
15840 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20 6e 6f 77  ;.        /* now
15850 20 61 74 74 65 6d 6d 70 74 20 74 6f 20 67 65 74   attemmpt to get
15860 20 74 68 65 20 65 78 63 6c 75 73 69 76 65 20 6c   the exclusive l
15870 6f 63 6b 20 72 61 6e 67 65 20 2a 2f 0a 20 20 20  ock range */.   
15880 20 20 20 20 20 66 61 69 6c 65 64 20 3d 20 61 66       failed = af
15890 70 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74  pSetLock(context
158a0 2d 3e 64 62 50 61 74 68 2c 20 70 46 69 6c 65 2c  ->dbPath, pFile,
158b0 20 53 48 41 52 45 44 5f 46 49 52 53 54 2c 20 0a   SHARED_FIRST, .
158c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
158d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53                 S
158e0 48 41 52 45 44 5f 53 49 5a 45 2c 20 31 29 3b 0a  HARED_SIZE, 1);.
158f0 20 20 20 20 20 20 20 20 69 66 28 20 66 61 69 6c          if( fail
15900 65 64 20 26 26 20 28 66 61 69 6c 65 64 32 20 3d  ed && (failed2 =
15910 20 61 66 70 53 65 74 4c 6f 63 6b 28 63 6f 6e 74   afpSetLock(cont
15920 65 78 74 2d 3e 64 62 50 61 74 68 2c 20 70 46 69  ext->dbPath, pFi
15930 6c 65 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20  le, .           
15940 20 20 20 20 20 20 20 20 20 20 20 20 53 48 41 52              SHAR
15950 45 44 5f 46 49 52 53 54 20 2b 20 70 4c 6f 63 6b  ED_FIRST + pLock
15960 2d 3e 73 68 61 72 65 64 42 79 74 65 2c 20 31 2c  ->sharedByte, 1,
15970 20 31 29 29 20 29 7b 0a 20 20 20 20 20 20 20 20   1)) ){.        
15980 20 20 2f 2a 20 43 61 6e 27 74 20 72 65 65 73 74    /* Can't reest
15990 61 62 6c 69 73 68 20 74 68 65 20 73 68 61 72 65  ablish the share
159a0 64 20 6c 6f 63 6b 2e 20 20 53 71 6c 69 74 65 20  d lock.  Sqlite 
159b0 63 61 6e 27 74 20 64 65 61 6c 2c 20 74 68 69 73  can't deal, this
159c0 20 69 73 0a 20 20 20 20 20 20 20 20 20 20 2a 2a   is.          **
159d0 20 61 20 63 72 69 74 69 63 61 6c 20 49 2f 4f 20   a critical I/O 
159e0 65 72 72 6f 72 0a 20 20 20 20 20 20 20 20 20 20  error.          
159f0 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  */.          rc 
15a00 3d 20 28 28 66 61 69 6c 65 64 20 26 20 53 51 4c  = ((failed & SQL
15a10 49 54 45 5f 49 4f 45 52 52 29 20 3d 3d 20 53 51  ITE_IOERR) == SQ
15a20 4c 49 54 45 5f 49 4f 45 52 52 29 20 3f 20 66 61  LITE_IOERR) ? fa
15a30 69 6c 65 64 32 20 3a 20 0a 20 20 20 20 20 20 20  iled2 : .       
15a40 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 49          SQLITE_I
15a50 4f 45 52 52 5f 4c 4f 43 4b 3b 0a 20 20 20 20 20  OERR_LOCK;.     
15a60 20 20 20 20 20 67 6f 74 6f 20 61 66 70 5f 65 6e       goto afp_en
15a70 64 5f 6c 6f 63 6b 3b 0a 20 20 20 20 20 20 20 20  d_lock;.        
15a80 7d 20 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  } .      }else{.
15a90 20 20 20 20 20 20 20 20 72 63 20 3d 20 66 61 69          rc = fai
15aa0 6c 65 64 3b 20 0a 20 20 20 20 20 20 7d 0a 20 20  led; .      }.  
15ab0 20 20 7d 0a 20 20 20 20 69 66 28 20 66 61 69 6c    }.    if( fail
15ac0 65 64 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  ed ){.      rc =
15ad0 20 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 20   failed;.    }. 
15ae0 20 7d 0a 20 20 0a 20 20 69 66 28 20 72 63 3d 3d   }.  .  if( rc==
15af0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
15b00 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65   pFile->locktype
15b10 20 3d 20 6c 6f 63 6b 74 79 70 65 3b 0a 20 20 20   = locktype;.   
15b20 20 70 4c 6f 63 6b 2d 3e 6c 6f 63 6b 74 79 70 65   pLock->locktype
15b30 20 3d 20 6c 6f 63 6b 74 79 70 65 3b 0a 20 20 7d   = locktype;.  }
15b40 65 6c 73 65 20 69 66 28 20 6c 6f 63 6b 74 79 70  else if( locktyp
15b50 65 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43  e==EXCLUSIVE_LOC
15b60 4b 20 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e  K ){.    pFile->
15b70 6c 6f 63 6b 74 79 70 65 20 3d 20 50 45 4e 44 49  locktype = PENDI
15b80 4e 47 5f 4c 4f 43 4b 3b 0a 20 20 20 20 70 4c 6f  NG_LOCK;.    pLo
15b90 63 6b 2d 3e 6c 6f 63 6b 74 79 70 65 20 3d 20 50  ck->locktype = P
15ba0 45 4e 44 49 4e 47 5f 4c 4f 43 4b 3b 0a 20 20 7d  ENDING_LOCK;.  }
15bb0 0a 20 20 0a 61 66 70 5f 65 6e 64 5f 6c 6f 63 6b  .  .afp_end_lock
15bc0 3a 0a 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74  :.  unixLeaveMut
15bd0 65 78 28 29 3b 0a 20 20 4f 53 54 52 41 43 45 34  ex();.  OSTRACE4
15be0 28 22 4c 4f 43 4b 20 20 20 20 25 64 20 25 73 20  ("LOCK    %d %s 
15bf0 25 73 20 28 61 66 70 29 5c 6e 22 2c 20 70 46 69  %s (afp)\n", pFi
15c00 6c 65 2d 3e 68 2c 20 6c 6f 63 6b 74 79 70 65 4e  le->h, locktypeN
15c10 61 6d 65 28 6c 6f 63 6b 74 79 70 65 29 2c 20 0a  ame(locktype), .
15c20 20 20 20 20 20 20 20 20 20 72 63 3d 3d 53 51 4c           rc==SQL
15c30 49 54 45 5f 4f 4b 20 3f 20 22 6f 6b 22 20 3a 20  ITE_OK ? "ok" : 
15c40 22 66 61 69 6c 65 64 22 29 3b 0a 20 20 72 65 74  "failed");.  ret
15c50 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
15c60 20 4c 6f 77 65 72 20 74 68 65 20 6c 6f 63 6b 69   Lower the locki
15c70 6e 67 20 6c 65 76 65 6c 20 6f 6e 20 66 69 6c 65  ng level on file
15c80 20 64 65 73 63 72 69 70 74 6f 72 20 70 46 69 6c   descriptor pFil
15c90 65 20 74 6f 20 6c 6f 63 6b 74 79 70 65 2e 20 20  e to locktype.  
15ca0 6c 6f 63 6b 74 79 70 65 0a 2a 2a 20 6d 75 73 74  locktype.** must
15cb0 20 62 65 20 65 69 74 68 65 72 20 4e 4f 5f 4c 4f   be either NO_LO
15cc0 43 4b 20 6f 72 20 53 48 41 52 45 44 5f 4c 4f 43  CK or SHARED_LOC
15cd0 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  K..**.** If the 
15ce0 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 66  locking level of
15cf0 20 74 68 65 20 66 69 6c 65 20 64 65 73 63 72 69   the file descri
15d00 70 74 6f 72 20 69 73 20 61 6c 72 65 61 64 79 20  ptor is already 
15d10 61 74 20 6f 72 20 62 65 6c 6f 77 0a 2a 2a 20 74  at or below.** t
15d20 68 65 20 72 65 71 75 65 73 74 65 64 20 6c 6f 63  he requested loc
15d30 6b 69 6e 67 20 6c 65 76 65 6c 2c 20 74 68 69 73  king level, this
15d40 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f   routine is a no
15d50 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  -op..*/.static i
15d60 6e 74 20 61 66 70 55 6e 6c 6f 63 6b 28 73 71 6c  nt afpUnlock(sql
15d70 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69  ite3_file *id, i
15d80 6e 74 20 6c 6f 63 6b 74 79 70 65 29 20 7b 0a 20  nt locktype) {. 
15d90 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
15da0 5f 4f 4b 3b 0a 20 20 75 6e 69 78 46 69 6c 65 20  _OK;.  unixFile 
15db0 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69  *pFile = (unixFi
15dc0 6c 65 2a 29 69 64 3b 0a 20 20 73 74 72 75 63 74  le*)id;.  struct
15dd0 20 75 6e 69 78 4c 6f 63 6b 49 6e 66 6f 20 2a 70   unixLockInfo *p
15de0 4c 6f 63 6b 3b 0a 20 20 61 66 70 4c 6f 63 6b 69  Lock;.  afpLocki
15df0 6e 67 43 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65  ngContext *conte
15e00 78 74 20 3d 20 28 61 66 70 4c 6f 63 6b 69 6e 67  xt = (afpLocking
15e10 43 6f 6e 74 65 78 74 20 2a 29 20 70 46 69 6c 65  Context *) pFile
15e20 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  ->lockingContext
15e30 3b 0a 20 20 69 6e 74 20 73 6b 69 70 53 68 61 72  ;.  int skipShar
15e40 65 64 20 3d 20 30 3b 0a 23 69 66 64 65 66 20 53  ed = 0;.#ifdef S
15e50 51 4c 49 54 45 5f 54 45 53 54 0a 20 20 69 6e 74  QLITE_TEST.  int
15e60 20 68 20 3d 20 70 46 69 6c 65 2d 3e 68 3b 0a 23   h = pFile->h;.#
15e70 65 6e 64 69 66 0a 0a 20 20 61 73 73 65 72 74 28  endif..  assert(
15e80 20 70 46 69 6c 65 20 29 3b 0a 20 20 4f 53 54 52   pFile );.  OSTR
15e90 41 43 45 37 28 22 55 4e 4c 4f 43 4b 20 20 25 64  ACE7("UNLOCK  %d
15ea0 20 25 64 20 77 61 73 20 25 64 28 25 64 2c 25 64   %d was %d(%d,%d
15eb0 29 20 70 69 64 3d 25 64 20 28 61 66 70 29 5c 6e  ) pid=%d (afp)\n
15ec0 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 6c 6f 63  ", pFile->h, loc
15ed0 6b 74 79 70 65 2c 0a 20 20 20 20 20 20 20 20 20  ktype,.         
15ee0 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70    pFile->locktyp
15ef0 65 2c 20 70 46 69 6c 65 2d 3e 70 4c 6f 63 6b 2d  e, pFile->pLock-
15f00 3e 6c 6f 63 6b 74 79 70 65 2c 20 70 46 69 6c 65  >locktype, pFile
15f10 2d 3e 70 4c 6f 63 6b 2d 3e 63 6e 74 2c 20 67 65  ->pLock->cnt, ge
15f20 74 70 69 64 28 29 29 3b 0a 0a 20 20 61 73 73 65  tpid());..  asse
15f30 72 74 28 20 6c 6f 63 6b 74 79 70 65 3c 3d 53 48  rt( locktype<=SH
15f40 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 69  ARED_LOCK );.  i
15f50 66 28 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79  f( pFile->lockty
15f60 70 65 3c 3d 6c 6f 63 6b 74 79 70 65 20 29 7b 0a  pe<=locktype ){.
15f70 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
15f80 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 69 66 28 20  E_OK;.  }.  if( 
15f90 43 48 45 43 4b 5f 54 48 52 45 41 44 49 44 28 70  CHECK_THREADID(p
15fa0 46 69 6c 65 29 20 29 7b 0a 20 20 20 20 72 65 74  File) ){.    ret
15fb0 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55 53  urn SQLITE_MISUS
15fc0 45 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 75 6e  E_BKPT;.  }.  un
15fd0 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a  ixEnterMutex();.
15fe0 20 20 70 4c 6f 63 6b 20 3d 20 70 46 69 6c 65 2d    pLock = pFile-
15ff0 3e 70 4c 6f 63 6b 3b 0a 20 20 61 73 73 65 72 74  >pLock;.  assert
16000 28 20 70 4c 6f 63 6b 2d 3e 63 6e 74 21 3d 30 20  ( pLock->cnt!=0 
16010 29 3b 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e  );.  if( pFile->
16020 6c 6f 63 6b 74 79 70 65 3e 53 48 41 52 45 44 5f  locktype>SHARED_
16030 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 61 73 73 65  LOCK ){.    asse
16040 72 74 28 20 70 4c 6f 63 6b 2d 3e 6c 6f 63 6b 74  rt( pLock->lockt
16050 79 70 65 3d 3d 70 46 69 6c 65 2d 3e 6c 6f 63 6b  ype==pFile->lock
16060 74 79 70 65 20 29 3b 0a 20 20 20 20 53 69 6d 75  type );.    Simu
16070 6c 61 74 65 49 4f 45 72 72 6f 72 42 65 6e 69 67  lateIOErrorBenig
16080 6e 28 31 29 3b 0a 20 20 20 20 53 69 6d 75 6c 61  n(1);.    Simula
16090 74 65 49 4f 45 72 72 6f 72 28 20 68 3d 28 2d 31  teIOError( h=(-1
160a0 29 20 29 0a 20 20 20 20 53 69 6d 75 6c 61 74 65  ) ).    Simulate
160b0 49 4f 45 72 72 6f 72 42 65 6e 69 67 6e 28 30 29  IOErrorBenign(0)
160c0 3b 0a 20 20 20 20 0a 23 69 66 6e 64 65 66 20 4e  ;.    .#ifndef N
160d0 44 45 42 55 47 0a 20 20 20 20 2f 2a 20 57 68 65  DEBUG.    /* Whe
160e0 6e 20 72 65 64 75 63 69 6e 67 20 61 20 6c 6f 63  n reducing a loc
160f0 6b 20 73 75 63 68 20 74 68 61 74 20 6f 74 68 65  k such that othe
16100 72 20 70 72 6f 63 65 73 73 65 73 20 63 61 6e 20  r processes can 
16110 73 74 61 72 74 0a 20 20 20 20 2a 2a 20 72 65 61  start.    ** rea
16120 64 69 6e 67 20 74 68 65 20 64 61 74 61 62 61 73  ding the databas
16130 65 20 66 69 6c 65 20 61 67 61 69 6e 2c 20 6d 61  e file again, ma
16140 6b 65 20 73 75 72 65 20 74 68 61 74 20 74 68 65  ke sure that the
16150 0a 20 20 20 20 2a 2a 20 74 72 61 6e 73 61 63 74  .    ** transact
16160 69 6f 6e 20 63 6f 75 6e 74 65 72 20 77 61 73 20  ion counter was 
16170 75 70 64 61 74 65 64 20 69 66 20 61 6e 79 20 70  updated if any p
16180 61 72 74 20 6f 66 20 74 68 65 20 64 61 74 61 62  art of the datab
16190 61 73 65 0a 20 20 20 20 2a 2a 20 66 69 6c 65 20  ase.    ** file 
161a0 63 68 61 6e 67 65 64 2e 20 20 49 66 20 74 68 65  changed.  If the
161b0 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f 75   transaction cou
161c0 6e 74 65 72 20 69 73 20 6e 6f 74 20 75 70 64 61  nter is not upda
161d0 74 65 64 2c 0a 20 20 20 20 2a 2a 20 6f 74 68 65  ted,.    ** othe
161e0 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 74 6f  r connections to
161f0 20 74 68 65 20 73 61 6d 65 20 66 69 6c 65 20 6d   the same file m
16200 69 67 68 74 20 6e 6f 74 20 72 65 61 6c 69 7a 65  ight not realize
16210 20 74 68 61 74 0a 20 20 20 20 2a 2a 20 74 68 65   that.    ** the
16220 20 66 69 6c 65 20 68 61 73 20 63 68 61 6e 67 65   file has change
16230 64 20 61 6e 64 20 68 65 6e 63 65 20 6d 69 67 68  d and hence migh
16240 74 20 6e 6f 74 20 6b 6e 6f 77 20 74 6f 20 66 6c  t not know to fl
16250 75 73 68 20 74 68 65 69 72 0a 20 20 20 20 2a 2a  ush their.    **
16260 20 63 61 63 68 65 2e 20 20 54 68 65 20 75 73 65   cache.  The use
16270 20 6f 66 20 61 20 73 74 61 6c 65 20 63 61 63 68   of a stale cach
16280 65 20 63 61 6e 20 6c 65 61 64 20 74 6f 20 64 61  e can lead to da
16290 74 61 62 61 73 65 20 63 6f 72 72 75 70 74 69 6f  tabase corruptio
162a0 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73  n..    */.    as
162b0 73 65 72 74 28 20 70 46 69 6c 65 2d 3e 69 6e 4e  sert( pFile->inN
162c0 6f 72 6d 61 6c 57 72 69 74 65 3d 3d 30 0a 20 20  ormalWrite==0.  
162d0 20 20 20 20 20 20 20 20 20 7c 7c 20 70 46 69 6c           || pFil
162e0 65 2d 3e 64 62 55 70 64 61 74 65 3d 3d 30 0a 20  e->dbUpdate==0. 
162f0 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70 46 69            || pFi
16300 6c 65 2d 3e 74 72 61 6e 73 43 6e 74 72 43 68 6e  le->transCntrChn
16310 67 3d 3d 31 20 29 3b 0a 20 20 20 20 70 46 69 6c  g==1 );.    pFil
16320 65 2d 3e 69 6e 4e 6f 72 6d 61 6c 57 72 69 74 65  e->inNormalWrite
16330 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 20 20 20   = 0;.#endif.   
16340 20 0a 20 20 20 20 69 66 28 20 70 46 69 6c 65 2d   .    if( pFile-
16350 3e 6c 6f 63 6b 74 79 70 65 3d 3d 45 58 43 4c 55  >locktype==EXCLU
16360 53 49 56 45 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20  SIVE_LOCK ){.   
16370 20 20 20 72 63 20 3d 20 61 66 70 53 65 74 4c 6f     rc = afpSetLo
16380 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 64 62 50 61  ck(context->dbPa
16390 74 68 2c 20 70 46 69 6c 65 2c 20 53 48 41 52 45  th, pFile, SHARE
163a0 44 5f 46 49 52 53 54 2c 20 53 48 41 52 45 44 5f  D_FIRST, SHARED_
163b0 53 49 5a 45 2c 20 30 29 3b 0a 20 20 20 20 20 20  SIZE, 0);.      
163c0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
163d0 4b 20 26 26 20 28 6c 6f 63 6b 74 79 70 65 3d 3d  K && (locktype==
163e0 53 48 41 52 45 44 5f 4c 4f 43 4b 20 7c 7c 20 70  SHARED_LOCK || p
163f0 4c 6f 63 6b 2d 3e 63 6e 74 3e 31 29 20 29 7b 0a  Lock->cnt>1) ){.
16400 20 20 20 20 20 20 20 20 2f 2a 20 6f 6e 6c 79 20          /* only 
16410 72 65 2d 65 73 74 61 62 6c 69 73 68 20 74 68 65  re-establish the
16420 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 69 66 20   shared lock if 
16430 6e 65 63 65 73 73 61 72 79 20 2a 2f 0a 20 20 20  necessary */.   
16440 20 20 20 20 20 69 6e 74 20 73 68 61 72 65 64 4c       int sharedL
16450 6f 63 6b 42 79 74 65 20 3d 20 53 48 41 52 45 44  ockByte = SHARED
16460 5f 46 49 52 53 54 2b 70 4c 6f 63 6b 2d 3e 73 68  _FIRST+pLock->sh
16470 61 72 65 64 42 79 74 65 3b 0a 20 20 20 20 20 20  aredByte;.      
16480 20 20 72 63 20 3d 20 61 66 70 53 65 74 4c 6f 63    rc = afpSetLoc
16490 6b 28 63 6f 6e 74 65 78 74 2d 3e 64 62 50 61 74  k(context->dbPat
164a0 68 2c 20 70 46 69 6c 65 2c 20 73 68 61 72 65 64  h, pFile, shared
164b0 4c 6f 63 6b 42 79 74 65 2c 20 31 2c 20 31 29 3b  LockByte, 1, 1);
164c0 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a  .      } else {.
164d0 20 20 20 20 20 20 20 20 73 6b 69 70 53 68 61 72          skipShar
164e0 65 64 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a  ed = 1;.      }.
164f0 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63      }.    if( rc
16500 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70  ==SQLITE_OK && p
16510 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3e 3d  File->locktype>=
16520 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 20 29 7b 0a  PENDING_LOCK ){.
16530 20 20 20 20 20 20 72 63 20 3d 20 61 66 70 53 65        rc = afpSe
16540 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 64  tLock(context->d
16550 62 50 61 74 68 2c 20 70 46 69 6c 65 2c 20 50 45  bPath, pFile, PE
16560 4e 44 49 4e 47 5f 42 59 54 45 2c 20 31 2c 20 30  NDING_BYTE, 1, 0
16570 29 3b 0a 20 20 20 20 7d 20 0a 20 20 20 20 69 66  );.    } .    if
16580 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
16590 26 26 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79  && pFile->lockty
165a0 70 65 3e 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43  pe>=RESERVED_LOC
165b0 4b 20 26 26 20 63 6f 6e 74 65 78 74 2d 3e 72 65  K && context->re
165c0 73 65 72 76 65 64 20 29 7b 0a 20 20 20 20 20 20  served ){.      
165d0 72 63 20 3d 20 61 66 70 53 65 74 4c 6f 63 6b 28  rc = afpSetLock(
165e0 63 6f 6e 74 65 78 74 2d 3e 64 62 50 61 74 68 2c  context->dbPath,
165f0 20 70 46 69 6c 65 2c 20 52 45 53 45 52 56 45 44   pFile, RESERVED
16600 5f 42 59 54 45 2c 20 31 2c 20 30 29 3b 0a 20 20  _BYTE, 1, 0);.  
16610 20 20 20 20 69 66 28 20 21 72 63 20 29 7b 20 0a      if( !rc ){ .
16620 20 20 20 20 20 20 20 20 63 6f 6e 74 65 78 74 2d          context-
16630 3e 72 65 73 65 72 76 65 64 20 3d 20 30 3b 20 0a  >reserved = 0; .
16640 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
16650 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
16660 5f 4f 4b 20 26 26 20 28 6c 6f 63 6b 74 79 70 65  _OK && (locktype
16670 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 7c 7c  ==SHARED_LOCK ||
16680 20 70 4c 6f 63 6b 2d 3e 63 6e 74 3e 31 29 29 7b   pLock->cnt>1)){
16690 0a 20 20 20 20 20 20 70 4c 6f 63 6b 2d 3e 6c 6f  .      pLock->lo
166a0 63 6b 74 79 70 65 20 3d 20 53 48 41 52 45 44 5f  cktype = SHARED_
166b0 4c 4f 43 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  LOCK;.    }.  }.
166c0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
166d0 5f 4f 4b 20 26 26 20 6c 6f 63 6b 74 79 70 65 3d  _OK && locktype=
166e0 3d 4e 4f 5f 4c 4f 43 4b 20 29 7b 0a 0a 20 20 20  =NO_LOCK ){..   
166f0 20 2f 2a 20 44 65 63 72 65 6d 65 6e 74 20 74 68   /* Decrement th
16700 65 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 63 6f  e shared lock co
16710 75 6e 74 65 72 2e 20 20 52 65 6c 65 61 73 65 20  unter.  Release 
16720 74 68 65 20 6c 6f 63 6b 20 75 73 69 6e 67 20 61  the lock using a
16730 6e 0a 20 20 20 20 2a 2a 20 4f 53 20 63 61 6c 6c  n.    ** OS call
16740 20 6f 6e 6c 79 20 77 68 65 6e 20 61 6c 6c 20 74   only when all t
16750 68 72 65 61 64 73 20 69 6e 20 74 68 69 73 20 73  hreads in this s
16760 61 6d 65 20 70 72 6f 63 65 73 73 20 68 61 76 65  ame process have
16770 20 72 65 6c 65 61 73 65 64 0a 20 20 20 20 2a 2a   released.    **
16780 20 74 68 65 20 6c 6f 63 6b 2e 0a 20 20 20 20 2a   the lock..    *
16790 2f 0a 20 20 20 20 75 6e 73 69 67 6e 65 64 20 6c  /.    unsigned l
167a0 6f 6e 67 20 6c 6f 6e 67 20 73 68 61 72 65 64 4c  ong long sharedL
167b0 6f 63 6b 42 79 74 65 20 3d 20 53 48 41 52 45 44  ockByte = SHARED
167c0 5f 46 49 52 53 54 2b 70 4c 6f 63 6b 2d 3e 73 68  _FIRST+pLock->sh
167d0 61 72 65 64 42 79 74 65 3b 0a 20 20 20 20 70 4c  aredByte;.    pL
167e0 6f 63 6b 2d 3e 63 6e 74 2d 2d 3b 0a 20 20 20 20  ock->cnt--;.    
167f0 69 66 28 20 70 4c 6f 63 6b 2d 3e 63 6e 74 3d 3d  if( pLock->cnt==
16800 30 20 29 7b 0a 20 20 20 20 20 20 53 69 6d 75 6c  0 ){.      Simul
16810 61 74 65 49 4f 45 72 72 6f 72 42 65 6e 69 67 6e  ateIOErrorBenign
16820 28 31 29 3b 0a 20 20 20 20 20 20 53 69 6d 75 6c  (1);.      Simul
16830 61 74 65 49 4f 45 72 72 6f 72 28 20 68 3d 28 2d  ateIOError( h=(-
16840 31 29 20 29 0a 20 20 20 20 20 20 53 69 6d 75 6c  1) ).      Simul
16850 61 74 65 49 4f 45 72 72 6f 72 42 65 6e 69 67 6e  ateIOErrorBenign
16860 28 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 21  (0);.      if( !
16870 73 6b 69 70 53 68 61 72 65 64 20 29 7b 0a 20 20  skipShared ){.  
16880 20 20 20 20 20 20 72 63 20 3d 20 61 66 70 53 65        rc = afpSe
16890 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 64  tLock(context->d
168a0 62 50 61 74 68 2c 20 70 46 69 6c 65 2c 20 73 68  bPath, pFile, sh
168b0 61 72 65 64 4c 6f 63 6b 42 79 74 65 2c 20 31 2c  aredLockByte, 1,
168c0 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   0);.      }.   
168d0 20 20 20 69 66 28 20 21 72 63 20 29 7b 0a 20 20     if( !rc ){.  
168e0 20 20 20 20 20 20 70 4c 6f 63 6b 2d 3e 6c 6f 63        pLock->loc
168f0 6b 74 79 70 65 20 3d 20 4e 4f 5f 4c 4f 43 4b 3b  ktype = NO_LOCK;
16900 0a 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e  .        pFile->
16910 6c 6f 63 6b 74 79 70 65 20 3d 20 4e 4f 5f 4c 4f  locktype = NO_LO
16920 43 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  CK;.      }.    
16930 7d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  }.    if( rc==SQ
16940 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
16950 20 73 74 72 75 63 74 20 75 6e 69 78 4f 70 65 6e   struct unixOpen
16960 43 6e 74 20 2a 70 4f 70 65 6e 20 3d 20 70 46 69  Cnt *pOpen = pFi
16970 6c 65 2d 3e 70 4f 70 65 6e 3b 0a 20 20 20 20 20  le->pOpen;.     
16980 20 20 20 0a 20 20 20 20 20 20 70 4f 70 65 6e 2d     .      pOpen-
16990 3e 6e 4c 6f 63 6b 2d 2d 3b 0a 20 20 20 20 20 20  >nLock--;.      
169a0 61 73 73 65 72 74 28 20 70 4f 70 65 6e 2d 3e 6e  assert( pOpen->n
169b0 4c 6f 63 6b 3e 3d 30 20 29 3b 0a 20 20 20 20 20  Lock>=0 );.     
169c0 20 69 66 28 20 70 4f 70 65 6e 2d 3e 6e 4c 6f 63   if( pOpen->nLoc
169d0 6b 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  k==0 ){.        
169e0 72 63 20 3d 20 63 6c 6f 73 65 50 65 6e 64 69 6e  rc = closePendin
169f0 67 46 64 73 28 70 46 69 6c 65 29 3b 0a 20 20 20  gFds(pFile);.   
16a00 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20     }.    }.  }. 
16a10 20 0a 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74   .  unixLeaveMut
16a20 65 78 28 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d  ex();.  if( rc==
16a30 53 51 4c 49 54 45 5f 4f 4b 20 29 20 70 46 69 6c  SQLITE_OK ) pFil
16a40 65 2d 3e 6c 6f 63 6b 74 79 70 65 20 3d 20 6c 6f  e->locktype = lo
16a50 63 6b 74 79 70 65 3b 0a 20 20 72 65 74 75 72 6e  cktype;.  return
16a60 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c   rc;.}../*.** Cl
16a70 6f 73 65 20 61 20 66 69 6c 65 20 26 20 63 6c 65  ose a file & cle
16a80 61 6e 75 70 20 41 46 50 20 73 70 65 63 69 66 69  anup AFP specifi
16a90 63 20 6c 6f 63 6b 69 6e 67 20 63 6f 6e 74 65 78  c locking contex
16aa0 74 20 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  t .*/.static int
16ab0 20 61 66 70 43 6c 6f 73 65 28 73 71 6c 69 74 65   afpClose(sqlite
16ac0 33 5f 66 69 6c 65 20 2a 69 64 29 20 7b 0a 20 20  3_file *id) {.  
16ad0 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
16ae0 4f 4b 3b 0a 20 20 69 66 28 20 69 64 20 29 7b 0a  OK;.  if( id ){.
16af0 20 20 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46      unixFile *pF
16b00 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a  ile = (unixFile*
16b10 29 69 64 3b 0a 20 20 20 20 61 66 70 55 6e 6c 6f  )id;.    afpUnlo
16b20 63 6b 28 69 64 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b  ck(id, NO_LOCK);
16b30 0a 20 20 20 20 75 6e 69 78 45 6e 74 65 72 4d 75  .    unixEnterMu
16b40 74 65 78 28 29 3b 0a 20 20 20 20 69 66 28 20 70  tex();.    if( p
16b50 46 69 6c 65 2d 3e 70 4f 70 65 6e 20 26 26 20 70  File->pOpen && p
16b60 46 69 6c 65 2d 3e 70 4f 70 65 6e 2d 3e 6e 4c 6f  File->pOpen->nLo
16b70 63 6b 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49  ck ){.      /* I
16b80 66 20 74 68 65 72 65 20 61 72 65 20 6f 75 74 73  f there are outs
16b90 74 61 6e 64 69 6e 67 20 6c 6f 63 6b 73 2c 20 64  tanding locks, d
16ba0 6f 20 6e 6f 74 20 61 63 74 75 61 6c 6c 79 20 63  o not actually c
16bb0 6c 6f 73 65 20 74 68 65 20 66 69 6c 65 20 6a 75  lose the file ju
16bc0 73 74 0a 20 20 20 20 20 20 2a 2a 20 79 65 74 20  st.      ** yet 
16bd0 62 65 63 61 75 73 65 20 74 68 61 74 20 77 6f 75  because that wou
16be0 6c 64 20 63 6c 65 61 72 20 74 68 6f 73 65 20 6c  ld clear those l
16bf0 6f 63 6b 73 2e 20 20 49 6e 73 74 65 61 64 2c 20  ocks.  Instead, 
16c00 61 64 64 20 74 68 65 20 66 69 6c 65 0a 20 20 20  add the file.   
16c10 20 20 20 2a 2a 20 64 65 73 63 72 69 70 74 6f 72     ** descriptor
16c20 20 74 6f 20 70 4f 70 65 6e 2d 3e 61 50 65 6e 64   to pOpen->aPend
16c30 69 6e 67 2e 20 20 49 74 20 77 69 6c 6c 20 62 65  ing.  It will be
16c40 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 63   automatically c
16c50 6c 6f 73 65 64 20 77 68 65 6e 0a 20 20 20 20 20  losed when.     
16c60 20 2a 2a 20 74 68 65 20 6c 61 73 74 20 6c 6f 63   ** the last loc
16c70 6b 20 69 73 20 63 6c 65 61 72 65 64 2e 0a 20 20  k is cleared..  
16c80 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 65 74      */.      set
16c90 50 65 6e 64 69 6e 67 46 64 28 70 46 69 6c 65 29  PendingFd(pFile)
16ca0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 6c 65  ;.    }.    rele
16cb0 61 73 65 4c 6f 63 6b 49 6e 66 6f 28 70 46 69 6c  aseLockInfo(pFil
16cc0 65 2d 3e 70 4c 6f 63 6b 29 3b 0a 20 20 20 20 72  e->pLock);.    r
16cd0 65 6c 65 61 73 65 4f 70 65 6e 43 6e 74 28 70 46  eleaseOpenCnt(pF
16ce0 69 6c 65 2d 3e 70 4f 70 65 6e 29 3b 0a 20 20 20  ile->pOpen);.   
16cf0 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 46   sqlite3_free(pF
16d00 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74  ile->lockingCont
16d10 65 78 74 29 3b 0a 20 20 20 20 72 63 20 3d 20 63  ext);.    rc = c
16d20 6c 6f 73 65 55 6e 69 78 46 69 6c 65 28 69 64 29  loseUnixFile(id)
16d30 3b 0a 20 20 20 20 75 6e 69 78 4c 65 61 76 65 4d  ;.    unixLeaveM
16d40 75 74 65 78 28 29 3b 0a 20 20 7d 0a 20 20 72 65  utex();.  }.  re
16d50 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 65 6e 64  turn rc;.}..#end
16d60 69 66 20 2f 2a 20 64 65 66 69 6e 65 64 28 5f 5f  if /* defined(__
16d70 41 50 50 4c 45 5f 5f 29 20 26 26 20 53 51 4c 49  APPLE__) && SQLI
16d80 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e  TE_ENABLE_LOCKIN
16d90 47 5f 53 54 59 4c 45 20 2a 2f 0a 2f 2a 0a 2a 2a  G_STYLE */./*.**
16da0 20 54 68 65 20 63 6f 64 65 20 61 62 6f 76 65 20   The code above 
16db0 69 73 20 74 68 65 20 41 46 50 20 6c 6f 63 6b 20  is the AFP lock 
16dc0 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 2e 20  implementation. 
16dd0 20 54 68 65 20 63 6f 64 65 20 69 73 20 73 70 65   The code is spe
16de0 63 69 66 69 63 0a 2a 2a 20 74 6f 20 4d 61 63 4f  cific.** to MacO
16df0 53 58 20 61 6e 64 20 64 6f 65 73 20 6e 6f 74 20  SX and does not 
16e00 77 6f 72 6b 20 6f 6e 20 6f 74 68 65 72 20 75 6e  work on other un
16e10 69 78 20 70 6c 61 74 66 6f 72 6d 73 2e 20 20 4e  ix platforms.  N
16e20 6f 20 61 6c 74 65 72 6e 61 74 69 76 65 0a 2a 2a  o alternative.**
16e30 20 69 73 20 61 76 61 69 6c 61 62 6c 65 2e 20 20   is available.  
16e40 49 66 20 79 6f 75 20 64 6f 6e 27 74 20 63 6f 6d  If you don't com
16e50 70 69 6c 65 20 66 6f 72 20 61 20 6d 61 63 2c 20  pile for a mac, 
16e60 74 68 65 6e 20 74 68 65 20 22 75 6e 69 78 2d 61  then the "unix-a
16e70 66 70 22 0a 2a 2a 20 56 46 53 20 69 73 20 6e 6f  fp".** VFS is no
16e80 74 20 61 76 61 69 6c 61 62 6c 65 2e 0a 2a 2a 0a  t available..**.
16e90 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
16ea0 2a 2a 2a 2a 2a 20 45 6e 64 20 6f 66 20 74 68 65  ***** End of the
16eb0 20 41 46 50 20 6c 6f 63 6b 20 69 6d 70 6c 65 6d   AFP lock implem
16ec0 65 6e 74 61 74 69 6f 6e 20 2a 2a 2a 2a 2a 2a 2a  entation *******
16ed0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a  ***************.
16ee0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
16ef0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
16f00 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
16f10 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
16f20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a  **************/.
16f30 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ./**************
16f40 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
16f50 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
16f60 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
16f70 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
16f80 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .***************
16f90 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 42 65 67  ************ Beg
16fa0 69 6e 20 4e 46 53 20 4c 6f 63 6b 69 6e 67 20 2a  in NFS Locking *
16fb0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
16fc0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f  ***************/
16fd0 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f 5f  ..#if defined(__
16fe0 41 50 50 4c 45 5f 5f 29 20 26 26 20 53 51 4c 49  APPLE__) && SQLI
16ff0 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e  TE_ENABLE_LOCKIN
17000 47 5f 53 54 59 4c 45 0a 2f 2a 0a 20 2a 2a 20 4c  G_STYLE./*. ** L
17010 6f 77 65 72 20 74 68 65 20 6c 6f 63 6b 69 6e 67  ower the locking
17020 20 6c 65 76 65 6c 20 6f 6e 20 66 69 6c 65 20 64   level on file d
17030 65 73 63 72 69 70 74 6f 72 20 70 46 69 6c 65 20  escriptor pFile 
17040 74 6f 20 6c 6f 63 6b 74 79 70 65 2e 20 20 6c 6f  to locktype.  lo
17050 63 6b 74 79 70 65 0a 20 2a 2a 20 6d 75 73 74 20  cktype. ** must 
17060 62 65 20 65 69 74 68 65 72 20 4e 4f 5f 4c 4f 43  be either NO_LOC
17070 4b 20 6f 72 20 53 48 41 52 45 44 5f 4c 4f 43 4b  K or SHARED_LOCK
17080 2e 0a 20 2a 2a 0a 20 2a 2a 20 49 66 20 74 68 65  .. **. ** If the
17090 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f   locking level o
170a0 66 20 74 68 65 20 66 69 6c 65 20 64 65 73 63 72  f the file descr
170b0 69 70 74 6f 72 20 69 73 20 61 6c 72 65 61 64 79  iptor is already
170c0 20 61 74 20 6f 72 20 62 65 6c 6f 77 0a 20 2a 2a   at or below. **
170d0 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20 6c   the requested l
170e0 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 2c 20 74 68  ocking level, th
170f0 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20  is routine is a 
17100 6e 6f 2d 6f 70 2e 0a 20 2a 2f 0a 73 74 61 74 69  no-op.. */.stati
17110 63 20 69 6e 74 20 6e 66 73 55 6e 6c 6f 63 6b 28  c int nfsUnlock(
17120 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64  sqlite3_file *id
17130 2c 20 69 6e 74 20 6c 6f 63 6b 74 79 70 65 29 7b  , int locktype){
17140 0a 20 20 72 65 74 75 72 6e 20 5f 70 6f 73 69 78  .  return _posix
17150 55 6e 6c 6f 63 6b 28 69 64 2c 20 6c 6f 63 6b 74  Unlock(id, lockt
17160 79 70 65 2c 20 31 29 3b 0a 7d 0a 0a 23 65 6e 64  ype, 1);.}..#end
17170 69 66 20 2f 2a 20 64 65 66 69 6e 65 64 28 5f 5f  if /* defined(__
17180 41 50 50 4c 45 5f 5f 29 20 26 26 20 53 51 4c 49  APPLE__) && SQLI
17190 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e  TE_ENABLE_LOCKIN
171a0 47 5f 53 54 59 4c 45 20 2a 2f 0a 2f 2a 0a 2a 2a  G_STYLE */./*.**
171b0 20 54 68 65 20 63 6f 64 65 20 61 62 6f 76 65 20   The code above 
171c0 69 73 20 74 68 65 20 4e 46 53 20 6c 6f 63 6b 20  is the NFS lock 
171d0 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 2e 20  implementation. 
171e0 20 54 68 65 20 63 6f 64 65 20 69 73 20 73 70 65   The code is spe
171f0 63 69 66 69 63 0a 2a 2a 20 74 6f 20 4d 61 63 4f  cific.** to MacO
17200 53 58 20 61 6e 64 20 64 6f 65 73 20 6e 6f 74 20  SX and does not 
17210 77 6f 72 6b 20 6f 6e 20 6f 74 68 65 72 20 75 6e  work on other un
17220 69 78 20 70 6c 61 74 66 6f 72 6d 73 2e 20 20 4e  ix platforms.  N
17230 6f 20 61 6c 74 65 72 6e 61 74 69 76 65 0a 2a 2a  o alternative.**
17240 20 69 73 20 61 76 61 69 6c 61 62 6c 65 2e 20 20   is available.  
17250 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .**.************
17260 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64 20 6f 66  ********* End of
17270 20 74 68 65 20 4e 46 53 20 6c 6f 63 6b 20 69 6d   the NFS lock im
17280 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 2a 2a 2a  plementation ***
17290 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
172a0 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ***.************
172b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
172c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
172d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
172e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
172f0 2a 2a 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  **/../**********
17300 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
17310 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
17320 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
17330 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
17340 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****.***********
17350 2a 2a 2a 2a 2a 20 4e 6f 6e 2d 6c 6f 63 6b 69 6e  ***** Non-lockin
17360 67 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 6d  g sqlite3_file m
17370 65 74 68 6f 64 73 20 2a 2a 2a 2a 2a 2a 2a 2a 2a  ethods *********
17380 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
17390 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6e  ****.**.** The n
173a0 65 78 74 20 64 69 76 69 73 69 6f 6e 20 63 6f 6e  ext division con
173b0 74 61 69 6e 73 20 69 6d 70 6c 65 6d 65 6e 74 61  tains implementa
173c0 74 69 6f 6e 73 20 66 6f 72 20 61 6c 6c 20 6d 65  tions for all me
173d0 74 68 6f 64 73 20 6f 66 20 74 68 65 20 0a 2a 2a  thods of the .**
173e0 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 6f 62   sqlite3_file ob
173f0 6a 65 63 74 20 6f 74 68 65 72 20 74 68 61 6e 20  ject other than 
17400 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6d 65 74 68  the locking meth
17410 6f 64 73 2e 20 20 54 68 65 20 6c 6f 63 6b 69 6e  ods.  The lockin
17420 67 0a 2a 2a 20 6d 65 74 68 6f 64 73 20 77 65 72  g.** methods wer
17430 65 20 64 65 66 69 6e 65 64 20 69 6e 20 64 69 76  e defined in div
17440 69 73 69 6f 6e 73 20 61 62 6f 76 65 20 28 6f 6e  isions above (on
17450 65 20 6c 6f 63 6b 69 6e 67 20 6d 65 74 68 6f 64  e locking method
17460 20 70 65 72 0a 2a 2a 20 64 69 76 69 73 69 6f 6e   per.** division
17470 29 2e 20 20 54 68 6f 73 65 20 6d 65 74 68 6f 64  ).  Those method
17480 73 20 74 68 61 74 20 61 72 65 20 63 6f 6d 6d 6f  s that are commo
17490 6e 20 74 6f 20 61 6c 6c 20 6c 6f 63 6b 69 6e 67  n to all locking
174a0 20 6d 6f 64 65 73 0a 2a 2a 20 61 72 65 20 67 61   modes.** are ga
174b0 74 68 65 72 20 74 6f 67 65 74 68 65 72 20 69 6e  ther together in
174c0 74 6f 20 74 68 69 73 20 64 69 76 69 73 69 6f 6e  to this division
174d0 2e 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 53 65 65 6b  ..*/../*.** Seek
174e0 20 74 6f 20 74 68 65 20 6f 66 66 73 65 74 20 70   to the offset p
174f0 61 73 73 65 64 20 61 73 20 74 68 65 20 73 65 63  assed as the sec
17500 6f 6e 64 20 61 72 67 75 6d 65 6e 74 2c 20 74 68  ond argument, th
17510 65 6e 20 72 65 61 64 20 63 6e 74 20 0a 2a 2a 20  en read cnt .** 
17520 62 79 74 65 73 20 69 6e 74 6f 20 70 42 75 66 2e  bytes into pBuf.
17530 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62   Return the numb
17540 65 72 20 6f 66 20 62 79 74 65 73 20 61 63 74 75  er of bytes actu
17550 61 6c 6c 79 20 72 65 61 64 2e 0a 2a 2a 0a 2a 2a  ally read..**.**
17560 20 4e 42 3a 20 20 49 66 20 79 6f 75 20 64 65 66   NB:  If you def
17570 69 6e 65 20 55 53 45 5f 50 52 45 41 44 20 6f 72  ine USE_PREAD or
17580 20 55 53 45 5f 50 52 45 41 44 36 34 2c 20 74 68   USE_PREAD64, th
17590 65 6e 20 69 74 20 6d 69 67 68 74 20 61 6c 73 6f  en it might also
175a0 0a 2a 2a 20 62 65 20 6e 65 63 65 73 73 61 72 79  .** be necessary
175b0 20 74 6f 20 64 65 66 69 6e 65 20 5f 58 4f 50 45   to define _XOPE
175c0 4e 5f 53 4f 55 52 43 45 20 74 6f 20 62 65 20 35  N_SOURCE to be 5
175d0 30 30 2e 20 20 54 68 69 73 20 76 61 72 69 65 73  00.  This varies
175e0 20 66 72 6f 6d 0a 2a 2a 20 6f 6e 65 20 73 79 73   from.** one sys
175f0 74 65 6d 20 74 6f 20 61 6e 6f 74 68 65 72 2e 20  tem to another. 
17600 20 53 69 6e 63 65 20 53 51 4c 69 74 65 20 64 6f   Since SQLite do
17610 65 73 20 6e 6f 74 20 64 65 66 69 6e 65 20 55 53  es not define US
17620 45 5f 50 52 45 41 44 0a 2a 2a 20 61 6e 79 20 61  E_PREAD.** any a
17630 6e 79 20 66 6f 72 6d 20 62 79 20 64 65 66 61 75  ny form by defau
17640 6c 74 2c 20 77 65 20 77 69 6c 6c 20 6e 6f 74 20  lt, we will not 
17650 61 74 74 65 6d 70 74 20 74 6f 20 64 65 66 69 6e  attempt to defin
17660 65 20 5f 58 4f 50 45 4e 5f 53 4f 55 52 43 45 2e  e _XOPEN_SOURCE.
17670 0a 2a 2a 20 53 65 65 20 74 69 63 6b 65 74 73 20  .** See tickets 
17680 23 32 37 34 31 20 61 6e 64 20 23 32 36 38 31 2e  #2741 and #2681.
17690 0a 2a 2a 0a 2a 2a 20 54 6f 20 61 76 6f 69 64 20  .**.** To avoid 
176a0 73 74 6f 6d 70 69 6e 67 20 74 68 65 20 65 72 72  stomping the err
176b0 6e 6f 20 76 61 6c 75 65 20 6f 6e 20 61 20 66 61  no value on a fa
176c0 69 6c 65 64 20 72 65 61 64 20 74 68 65 20 6c 61  iled read the la
176d0 73 74 45 72 72 6e 6f 20 76 61 6c 75 65 0a 2a 2a  stErrno value.**
176e0 20 69 73 20 73 65 74 20 62 65 66 6f 72 65 20 72   is set before r
176f0 65 74 75 72 6e 69 6e 67 2e 0a 2a 2f 0a 73 74 61  eturning..*/.sta
17700 74 69 63 20 69 6e 74 20 73 65 65 6b 41 6e 64 52  tic int seekAndR
17710 65 61 64 28 75 6e 69 78 46 69 6c 65 20 2a 69 64  ead(unixFile *id
17720 2c 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20  , sqlite3_int64 
17730 6f 66 66 73 65 74 2c 20 76 6f 69 64 20 2a 70 42  offset, void *pB
17740 75 66 2c 20 69 6e 74 20 63 6e 74 29 7b 0a 20 20  uf, int cnt){.  
17750 69 6e 74 20 67 6f 74 3b 0a 23 69 66 20 28 21 64  int got;.#if (!d
17760 65 66 69 6e 65 64 28 55 53 45 5f 50 52 45 41 44  efined(USE_PREAD
17770 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 55 53  ) && !defined(US
17780 45 5f 50 52 45 41 44 36 34 29 29 0a 20 20 69 36  E_PREAD64)).  i6
17790 34 20 6e 65 77 4f 66 66 73 65 74 3b 0a 23 65 6e  4 newOffset;.#en
177a0 64 69 66 0a 20 20 54 49 4d 45 52 5f 53 54 41 52  dif.  TIMER_STAR
177b0 54 3b 0a 23 69 66 20 64 65 66 69 6e 65 64 28 55  T;.#if defined(U
177c0 53 45 5f 50 52 45 41 44 29 0a 20 20 67 6f 74 20  SE_PREAD).  got 
177d0 3d 20 70 72 65 61 64 28 69 64 2d 3e 68 2c 20 70  = pread(id->h, p
177e0 42 75 66 2c 20 63 6e 74 2c 20 6f 66 66 73 65 74  Buf, cnt, offset
177f0 29 3b 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45  );.  SimulateIOE
17800 72 72 6f 72 28 20 67 6f 74 20 3d 20 2d 31 20 29  rror( got = -1 )
17810 3b 0a 23 65 6c 69 66 20 64 65 66 69 6e 65 64 28  ;.#elif defined(
17820 55 53 45 5f 50 52 45 41 44 36 34 29 0a 20 20 67  USE_PREAD64).  g
17830 6f 74 20 3d 20 70 72 65 61 64 36 34 28 69 64 2d  ot = pread64(id-
17840 3e 68 2c 20 70 42 75 66 2c 20 63 6e 74 2c 20 6f  >h, pBuf, cnt, o
17850 66 66 73 65 74 29 3b 0a 20 20 53 69 6d 75 6c 61  ffset);.  Simula
17860 74 65 49 4f 45 72 72 6f 72 28 20 67 6f 74 20 3d  teIOError( got =
17870 20 2d 31 20 29 3b 0a 23 65 6c 73 65 0a 20 20 6e   -1 );.#else.  n
17880 65 77 4f 66 66 73 65 74 20 3d 20 6c 73 65 65 6b  ewOffset = lseek
17890 28 69 64 2d 3e 68 2c 20 6f 66 66 73 65 74 2c 20  (id->h, offset, 
178a0 53 45 45 4b 5f 53 45 54 29 3b 0a 20 20 53 69 6d  SEEK_SET);.  Sim
178b0 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 6e 65  ulateIOError( ne
178c0 77 4f 66 66 73 65 74 2d 2d 20 29 3b 0a 20 20 69  wOffset-- );.  i
178d0 66 28 20 6e 65 77 4f 66 66 73 65 74 21 3d 6f 66  f( newOffset!=of
178e0 66 73 65 74 20 29 7b 0a 20 20 20 20 69 66 28 20  fset ){.    if( 
178f0 6e 65 77 4f 66 66 73 65 74 20 3d 3d 20 2d 31 20  newOffset == -1 
17900 29 7b 0a 20 20 20 20 20 20 28 28 75 6e 69 78 46  ){.      ((unixF
17910 69 6c 65 2a 29 69 64 29 2d 3e 6c 61 73 74 45 72  ile*)id)->lastEr
17920 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20  rno = errno;.   
17930 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 28 28   }else{.      ((
17940 75 6e 69 78 46 69 6c 65 2a 29 69 64 29 2d 3e 6c  unixFile*)id)->l
17950 61 73 74 45 72 72 6e 6f 20 3d 20 30 3b 09 09 09  astErrno = 0;...
17960 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72  .    }.    retur
17970 6e 20 2d 31 3b 0a 20 20 7d 0a 20 20 67 6f 74 20  n -1;.  }.  got 
17980 3d 20 72 65 61 64 28 69 64 2d 3e 68 2c 20 70 42  = read(id->h, pB
17990 75 66 2c 20 63 6e 74 29 3b 0a 23 65 6e 64 69 66  uf, cnt);.#endif
179a0 0a 20 20 54 49 4d 45 52 5f 45 4e 44 3b 0a 20 20  .  TIMER_END;.  
179b0 69 66 28 20 67 6f 74 3c 30 20 29 7b 0a 20 20 20  if( got<0 ){.   
179c0 20 28 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 29   ((unixFile*)id)
179d0 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 65 72  ->lastErrno = er
179e0 72 6e 6f 3b 0a 20 20 7d 0a 20 20 4f 53 54 52 41  rno;.  }.  OSTRA
179f0 43 45 35 28 22 52 45 41 44 20 20 20 20 25 2d 33  CE5("READ    %-3
17a00 64 20 25 35 64 20 25 37 6c 6c 64 20 25 6c 6c 75  d %5d %7lld %llu
17a10 5c 6e 22 2c 20 69 64 2d 3e 68 2c 20 67 6f 74 2c  \n", id->h, got,
17a20 20 6f 66 66 73 65 74 2c 20 54 49 4d 45 52 5f 45   offset, TIMER_E
17a30 4c 41 50 53 45 44 29 3b 0a 20 20 72 65 74 75 72  LAPSED);.  retur
17a40 6e 20 67 6f 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  n got;.}../*.** 
17a50 52 65 61 64 20 64 61 74 61 20 66 72 6f 6d 20 61  Read data from a
17a60 20 66 69 6c 65 20 69 6e 74 6f 20 61 20 62 75 66   file into a buf
17a70 66 65 72 2e 20 20 52 65 74 75 72 6e 20 53 51 4c  fer.  Return SQL
17a80 49 54 45 5f 4f 4b 20 69 66 20 61 6c 6c 0a 2a 2a  ITE_OK if all.**
17a90 20 62 79 74 65 73 20 77 65 72 65 20 72 65 61 64   bytes were read
17aa0 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20 61 6e   successfully an
17ab0 64 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 20 69  d SQLITE_IOERR i
17ac0 66 20 61 6e 79 74 68 69 6e 67 20 67 6f 65 73 0a  f anything goes.
17ad0 2a 2a 20 77 72 6f 6e 67 2e 0a 2a 2f 0a 73 74 61  ** wrong..*/.sta
17ae0 74 69 63 20 69 6e 74 20 75 6e 69 78 52 65 61 64  tic int unixRead
17af0 28 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65  (.  sqlite3_file
17b00 20 2a 69 64 2c 20 0a 20 20 76 6f 69 64 20 2a 70   *id, .  void *p
17b10 42 75 66 2c 20 0a 20 20 69 6e 74 20 61 6d 74 2c  Buf, .  int amt,
17b20 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34  .  sqlite3_int64
17b30 20 6f 66 66 73 65 74 0a 29 7b 0a 20 20 75 6e 69   offset.){.  uni
17b40 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28  xFile *pFile = (
17b50 75 6e 69 78 46 69 6c 65 20 2a 29 69 64 3b 0a 20  unixFile *)id;. 
17b60 20 69 6e 74 20 67 6f 74 3b 0a 20 20 61 73 73 65   int got;.  asse
17b70 72 74 28 20 69 64 20 29 3b 0a 0a 20 20 2f 2a 20  rt( id );..  /* 
17b80 49 66 20 74 68 69 73 20 69 73 20 61 20 64 61 74  If this is a dat
17b90 61 62 61 73 65 20 66 69 6c 65 20 28 6e 6f 74 20  abase file (not 
17ba0 61 20 6a 6f 75 72 6e 61 6c 2c 20 6d 61 73 74 65  a journal, maste
17bb0 72 2d 6a 6f 75 72 6e 61 6c 20 6f 72 20 74 65 6d  r-journal or tem
17bc0 70 0a 20 20 2a 2a 20 66 69 6c 65 29 2c 20 74 68  p.  ** file), th
17bd0 65 20 62 79 74 65 73 20 69 6e 20 74 68 65 20 6c  e bytes in the l
17be0 6f 63 6b 69 6e 67 20 72 61 6e 67 65 20 73 68 6f  ocking range sho
17bf0 75 6c 64 20 6e 65 76 65 72 20 62 65 20 72 65 61  uld never be rea
17c00 64 20 6f 72 20 77 72 69 74 74 65 6e 2e 20 2a 2f  d or written. */
17c10 0a 23 69 66 20 30 0a 20 20 61 73 73 65 72 74 28  .#if 0.  assert(
17c20 20 70 46 69 6c 65 2d 3e 70 55 6e 75 73 65 64 3d   pFile->pUnused=
17c30 3d 30 0a 20 20 20 20 20 20 20 7c 7c 20 6f 66 66  =0.       || off
17c40 73 65 74 3e 3d 50 45 4e 44 49 4e 47 5f 42 59 54  set>=PENDING_BYT
17c50 45 2b 35 31 32 0a 20 20 20 20 20 20 20 7c 7c 20  E+512.       || 
17c60 6f 66 66 73 65 74 2b 61 6d 74 3c 3d 50 45 4e 44  offset+amt<=PEND
17c70 49 4e 47 5f 42 59 54 45 20 0a 20 20 29 3b 0a 23  ING_BYTE .  );.#
17c80 65 6e 64 69 66 0a 0a 20 20 67 6f 74 20 3d 20 73  endif..  got = s
17c90 65 65 6b 41 6e 64 52 65 61 64 28 70 46 69 6c 65  eekAndRead(pFile
17ca0 2c 20 6f 66 66 73 65 74 2c 20 70 42 75 66 2c 20  , offset, pBuf, 
17cb0 61 6d 74 29 3b 0a 20 20 69 66 28 20 67 6f 74 3d  amt);.  if( got=
17cc0 3d 61 6d 74 20 29 7b 0a 20 20 20 20 72 65 74 75  =amt ){.    retu
17cd0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
17ce0 7d 65 6c 73 65 20 69 66 28 20 67 6f 74 3c 30 20  }else if( got<0 
17cf0 29 7b 0a 20 20 20 20 2f 2a 20 6c 61 73 74 45 72  ){.    /* lastEr
17d00 72 6e 6f 20 73 65 74 20 62 79 20 73 65 65 6b 41  rno set by seekA
17d10 6e 64 52 65 61 64 20 2a 2f 0a 20 20 20 20 72 65  ndRead */.    re
17d20 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52  turn SQLITE_IOER
17d30 52 5f 52 45 41 44 3b 0a 20 20 7d 65 6c 73 65 7b  R_READ;.  }else{
17d40 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74  .    pFile->last
17d50 45 72 72 6e 6f 20 3d 20 30 3b 20 2f 2a 20 6e 6f  Errno = 0; /* no
17d60 74 20 61 20 73 79 73 74 65 6d 20 65 72 72 6f 72  t a system error
17d70 20 2a 2f 0a 20 20 20 20 2f 2a 20 55 6e 72 65 61   */.    /* Unrea
17d80 64 20 70 61 72 74 73 20 6f 66 20 74 68 65 20 62  d parts of the b
17d90 75 66 66 65 72 20 6d 75 73 74 20 62 65 20 7a 65  uffer must be ze
17da0 72 6f 2d 66 69 6c 6c 65 64 20 2a 2f 0a 20 20 20  ro-filled */.   
17db0 20 6d 65 6d 73 65 74 28 26 28 28 63 68 61 72 2a   memset(&((char*
17dc0 29 70 42 75 66 29 5b 67 6f 74 5d 2c 20 30 2c 20  )pBuf)[got], 0, 
17dd0 61 6d 74 2d 67 6f 74 29 3b 0a 20 20 20 20 72 65  amt-got);.    re
17de0 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52  turn SQLITE_IOER
17df0 52 5f 53 48 4f 52 54 5f 52 45 41 44 3b 0a 20 20  R_SHORT_READ;.  
17e00 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 65 6b 20  }.}../*.** Seek 
17e10 74 6f 20 74 68 65 20 6f 66 66 73 65 74 20 69 6e  to the offset in
17e20 20 69 64 2d 3e 6f 66 66 73 65 74 20 74 68 65 6e   id->offset then
17e30 20 72 65 61 64 20 63 6e 74 20 62 79 74 65 73 20   read cnt bytes 
17e40 69 6e 74 6f 20 70 42 75 66 2e 0a 2a 2a 20 52 65  into pBuf..** Re
17e50 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20  turn the number 
17e60 6f 66 20 62 79 74 65 73 20 61 63 74 75 61 6c 6c  of bytes actuall
17e70 79 20 72 65 61 64 2e 20 20 55 70 64 61 74 65 20  y read.  Update 
17e80 74 68 65 20 6f 66 66 73 65 74 2e 0a 2a 2a 0a 2a  the offset..**.*
17e90 2a 20 54 6f 20 61 76 6f 69 64 20 73 74 6f 6d 70  * To avoid stomp
17ea0 69 6e 67 20 74 68 65 20 65 72 72 6e 6f 20 76 61  ing the errno va
17eb0 6c 75 65 20 6f 6e 20 61 20 66 61 69 6c 65 64 20  lue on a failed 
17ec0 77 72 69 74 65 20 74 68 65 20 6c 61 73 74 45 72  write the lastEr
17ed0 72 6e 6f 20 76 61 6c 75 65 0a 2a 2a 20 69 73 20  rno value.** is 
17ee0 73 65 74 20 62 65 66 6f 72 65 20 72 65 74 75 72  set before retur
17ef0 6e 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ning..*/.static 
17f00 69 6e 74 20 73 65 65 6b 41 6e 64 57 72 69 74 65  int seekAndWrite
17f10 28 75 6e 69 78 46 69 6c 65 20 2a 69 64 2c 20 69  (unixFile *id, i
17f20 36 34 20 6f 66 66 73 65 74 2c 20 63 6f 6e 73 74  64 offset, const
17f30 20 76 6f 69 64 20 2a 70 42 75 66 2c 20 69 6e 74   void *pBuf, int
17f40 20 63 6e 74 29 7b 0a 20 20 69 6e 74 20 67 6f 74   cnt){.  int got
17f50 3b 0a 23 69 66 20 28 21 64 65 66 69 6e 65 64 28  ;.#if (!defined(
17f60 55 53 45 5f 50 52 45 41 44 29 20 26 26 20 21 64  USE_PREAD) && !d
17f70 65 66 69 6e 65 64 28 55 53 45 5f 50 52 45 41 44  efined(USE_PREAD
17f80 36 34 29 29 0a 20 20 69 36 34 20 6e 65 77 4f 66  64)).  i64 newOf
17f90 66 73 65 74 3b 0a 23 65 6e 64 69 66 0a 20 20 54  fset;.#endif.  T
17fa0 49 4d 45 52 5f 53 54 41 52 54 3b 0a 23 69 66 20  IMER_START;.#if 
17fb0 64 65 66 69 6e 65 64 28 55 53 45 5f 50 52 45 41  defined(USE_PREA
17fc0 44 29 0a 20 20 67 6f 74 20 3d 20 70 77 72 69 74  D).  got = pwrit
17fd0 65 28 69 64 2d 3e 68 2c 20 70 42 75 66 2c 20 63  e(id->h, pBuf, c
17fe0 6e 74 2c 20 6f 66 66 73 65 74 29 3b 0a 23 65 6c  nt, offset);.#el
17ff0 69 66 20 64 65 66 69 6e 65 64 28 55 53 45 5f 50  if defined(USE_P
18000 52 45 41 44 36 34 29 0a 20 20 67 6f 74 20 3d 20  READ64).  got = 
18010 70 77 72 69 74 65 36 34 28 69 64 2d 3e 68 2c 20  pwrite64(id->h, 
18020 70 42 75 66 2c 20 63 6e 74 2c 20 6f 66 66 73 65  pBuf, cnt, offse
18030 74 29 3b 0a 23 65 6c 73 65 0a 20 20 6e 65 77 4f  t);.#else.  newO
18040 66 66 73 65 74 20 3d 20 6c 73 65 65 6b 28 69 64  ffset = lseek(id
18050 2d 3e 68 2c 20 6f 66 66 73 65 74 2c 20 53 45 45  ->h, offset, SEE
18060 4b 5f 53 45 54 29 3b 0a 20 20 69 66 28 20 6e 65  K_SET);.  if( ne
18070 77 4f 66 66 73 65 74 21 3d 6f 66 66 73 65 74 20  wOffset!=offset 
18080 29 7b 0a 20 20 20 20 69 66 28 20 6e 65 77 4f 66  ){.    if( newOf
18090 66 73 65 74 20 3d 3d 20 2d 31 20 29 7b 0a 20 20  fset == -1 ){.  
180a0 20 20 20 20 28 28 75 6e 69 78 46 69 6c 65 2a 29      ((unixFile*)
180b0 69 64 29 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d  id)->lastErrno =
180c0 20 65 72 72 6e 6f 3b 0a 20 20 20 20 7d 65 6c 73   errno;.    }els
180d0 65 7b 0a 20 20 20 20 20 20 28 28 75 6e 69 78 46  e{.      ((unixF
180e0 69 6c 65 2a 29 69 64 29 2d 3e 6c 61 73 74 45 72  ile*)id)->lastEr
180f0 72 6e 6f 20 3d 20 30 3b 09 09 09 0a 20 20 20 20  rno = 0;....    
18100 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 2d 31 3b  }.    return -1;
18110 0a 20 20 7d 0a 20 20 67 6f 74 20 3d 20 77 72 69  .  }.  got = wri
18120 74 65 28 69 64 2d 3e 68 2c 20 70 42 75 66 2c 20  te(id->h, pBuf, 
18130 63 6e 74 29 3b 0a 23 65 6e 64 69 66 0a 20 20 54  cnt);.#endif.  T
18140 49 4d 45 52 5f 45 4e 44 3b 0a 20 20 69 66 28 20  IMER_END;.  if( 
18150 67 6f 74 3c 30 20 29 7b 0a 20 20 20 20 28 28 75  got<0 ){.    ((u
18160 6e 69 78 46 69 6c 65 2a 29 69 64 29 2d 3e 6c 61  nixFile*)id)->la
18170 73 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b  stErrno = errno;
18180 0a 20 20 7d 0a 0a 20 20 4f 53 54 52 41 43 45 35  .  }..  OSTRACE5
18190 28 22 57 52 49 54 45 20 20 20 25 2d 33 64 20 25  ("WRITE   %-3d %
181a0 35 64 20 25 37 6c 6c 64 20 25 6c 6c 75 5c 6e 22  5d %7lld %llu\n"
181b0 2c 20 69 64 2d 3e 68 2c 20 67 6f 74 2c 20 6f 66  , id->h, got, of
181c0 66 73 65 74 2c 20 54 49 4d 45 52 5f 45 4c 41 50  fset, TIMER_ELAP
181d0 53 45 44 29 3b 0a 20 20 72 65 74 75 72 6e 20 67  SED);.  return g
181e0 6f 74 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 57 72  ot;.}.../*.** Wr
181f0 69 74 65 20 64 61 74 61 20 66 72 6f 6d 20 61 20  ite data from a 
18200 62 75 66 66 65 72 20 69 6e 74 6f 20 61 20 66 69  buffer into a fi
18210 6c 65 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49  le.  Return SQLI
18220 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73  TE_OK on success
18230 0a 2a 2a 20 6f 72 20 73 6f 6d 65 20 6f 74 68 65  .** or some othe
18240 72 20 65 72 72 6f 72 20 63 6f 64 65 20 6f 6e 20  r error code on 
18250 66 61 69 6c 75 72 65 2e 0a 2a 2f 0a 73 74 61 74  failure..*/.stat
18260 69 63 20 69 6e 74 20 75 6e 69 78 57 72 69 74 65  ic int unixWrite
18270 28 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65  (.  sqlite3_file
18280 20 2a 69 64 2c 20 0a 20 20 63 6f 6e 73 74 20 76   *id, .  const v
18290 6f 69 64 20 2a 70 42 75 66 2c 20 0a 20 20 69 6e  oid *pBuf, .  in
182a0 74 20 61 6d 74 2c 0a 20 20 73 71 6c 69 74 65 33  t amt,.  sqlite3
182b0 5f 69 6e 74 36 34 20 6f 66 66 73 65 74 20 0a 29  _int64 offset .)
182c0 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46  {.  unixFile *pF
182d0 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a  ile = (unixFile*
182e0 29 69 64 3b 0a 20 20 69 6e 74 20 77 72 6f 74 65  )id;.  int wrote
182f0 20 3d 20 30 3b 0a 20 20 61 73 73 65 72 74 28 20   = 0;.  assert( 
18300 69 64 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  id );.  assert( 
18310 61 6d 74 3e 30 20 29 3b 0a 0a 20 20 2f 2a 20 49  amt>0 );..  /* I
18320 66 20 74 68 69 73 20 69 73 20 61 20 64 61 74 61  f this is a data
18330 62 61 73 65 20 66 69 6c 65 20 28 6e 6f 74 20 61  base file (not a
18340 20 6a 6f 75 72 6e 61 6c 2c 20 6d 61 73 74 65 72   journal, master
18350 2d 6a 6f 75 72 6e 61 6c 20 6f 72 20 74 65 6d 70  -journal or temp
18360 0a 20 20 2a 2a 20 66 69 6c 65 29 2c 20 74 68 65  .  ** file), the
18370 20 62 79 74 65 73 20 69 6e 20 74 68 65 20 6c 6f   bytes in the lo
18380 63 6b 69 6e 67 20 72 61 6e 67 65 20 73 68 6f 75  cking range shou
18390 6c 64 20 6e 65 76 65 72 20 62 65 20 72 65 61 64  ld never be read
183a0 20 6f 72 20 77 72 69 74 74 65 6e 2e 20 2a 2f 0a   or written. */.
183b0 23 69 66 20 30 0a 20 20 61 73 73 65 72 74 28 20  #if 0.  assert( 
183c0 70 46 69 6c 65 2d 3e 70 55 6e 75 73 65 64 3d 3d  pFile->pUnused==
183d0 30 0a 20 20 20 20 20 20 20 7c 7c 20 6f 66 66 73  0.       || offs
183e0 65 74 3e 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45  et>=PENDING_BYTE
183f0 2b 35 31 32 0a 20 20 20 20 20 20 20 7c 7c 20 6f  +512.       || o
18400 66 66 73 65 74 2b 61 6d 74 3c 3d 50 45 4e 44 49  ffset+amt<=PENDI
18410 4e 47 5f 42 59 54 45 20 0a 20 20 29 3b 0a 23 65  NG_BYTE .  );.#e
18420 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 4e 44  ndif..#ifndef ND
18430 45 42 55 47 0a 20 20 2f 2a 20 49 66 20 77 65 20  EBUG.  /* If we 
18440 61 72 65 20 64 6f 69 6e 67 20 61 20 6e 6f 72 6d  are doing a norm
18450 61 6c 20 77 72 69 74 65 20 74 6f 20 61 20 64 61  al write to a da
18460 74 61 62 61 73 65 20 66 69 6c 65 20 28 61 73 20  tabase file (as 
18470 6f 70 70 6f 73 65 64 20 74 6f 0a 20 20 2a 2a 20  opposed to.  ** 
18480 64 6f 69 6e 67 20 61 20 68 6f 74 2d 6a 6f 75 72  doing a hot-jour
18490 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 20 6f 72 20  nal rollback or 
184a0 61 20 77 72 69 74 65 20 74 6f 20 73 6f 6d 65 20  a write to some 
184b0 66 69 6c 65 20 6f 74 68 65 72 20 74 68 61 6e 20  file other than 
184c0 61 0a 20 20 2a 2a 20 6e 6f 72 6d 61 6c 20 64 61  a.  ** normal da
184d0 74 61 62 61 73 65 20 66 69 6c 65 29 20 74 68 65  tabase file) the
184e0 6e 20 72 65 63 6f 72 64 20 74 68 65 20 66 61 63  n record the fac
184f0 74 20 74 68 61 74 20 74 68 65 20 64 61 74 61 62  t that the datab
18500 61 73 65 0a 20 20 2a 2a 20 68 61 73 20 63 68 61  ase.  ** has cha
18510 6e 67 65 64 2e 20 20 49 66 20 74 68 65 20 74 72  nged.  If the tr
18520 61 6e 73 61 63 74 69 6f 6e 20 63 6f 75 6e 74 65  ansaction counte
18530 72 20 69 73 20 6d 6f 64 69 66 69 65 64 2c 20 72  r is modified, r
18540 65 63 6f 72 64 20 74 68 61 74 0a 20 20 2a 2a 20  ecord that.  ** 
18550 66 61 63 74 20 74 6f 6f 2e 0a 20 20 2a 2f 0a 20  fact too..  */. 
18560 20 69 66 28 20 70 46 69 6c 65 2d 3e 69 6e 4e 6f   if( pFile->inNo
18570 72 6d 61 6c 57 72 69 74 65 20 29 7b 0a 20 20 20  rmalWrite ){.   
18580 20 70 46 69 6c 65 2d 3e 64 62 55 70 64 61 74 65   pFile->dbUpdate
18590 20 3d 20 31 3b 20 20 2f 2a 20 54 68 65 20 64 61   = 1;  /* The da
185a0 74 61 62 61 73 65 20 68 61 73 20 62 65 65 6e 20  tabase has been 
185b0 6d 6f 64 69 66 69 65 64 20 2a 2f 0a 20 20 20 20  modified */.    
185c0 69 66 28 20 6f 66 66 73 65 74 3c 3d 32 34 20 26  if( offset<=24 &
185d0 26 20 6f 66 66 73 65 74 2b 61 6d 74 3e 3d 32 37  & offset+amt>=27
185e0 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 72 63   ){.      int rc
185f0 3b 0a 20 20 20 20 20 20 63 68 61 72 20 6f 6c 64  ;.      char old
18600 43 6e 74 72 5b 34 5d 3b 0a 20 20 20 20 20 20 53  Cntr[4];.      S
18610 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 42 65  imulateIOErrorBe
18620 6e 69 67 6e 28 31 29 3b 0a 20 20 20 20 20 20 72  nign(1);.      r
18630 63 20 3d 20 73 65 65 6b 41 6e 64 52 65 61 64 28  c = seekAndRead(
18640 70 46 69 6c 65 2c 20 32 34 2c 20 6f 6c 64 43 6e  pFile, 24, oldCn
18650 74 72 2c 20 34 29 3b 0a 20 20 20 20 20 20 53 69  tr, 4);.      Si
18660 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 42 65 6e  mulateIOErrorBen
18670 69 67 6e 28 30 29 3b 0a 20 20 20 20 20 20 69 66  ign(0);.      if
18680 28 20 72 63 21 3d 34 20 7c 7c 20 6d 65 6d 63 6d  ( rc!=4 || memcm
18690 70 28 6f 6c 64 43 6e 74 72 2c 20 26 28 28 63 68  p(oldCntr, &((ch
186a0 61 72 2a 29 70 42 75 66 29 5b 32 34 2d 6f 66 66  ar*)pBuf)[24-off
186b0 73 65 74 5d 2c 20 34 29 21 3d 30 20 29 7b 0a 20  set], 4)!=0 ){. 
186c0 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 74 72         pFile->tr
186d0 61 6e 73 43 6e 74 72 43 68 6e 67 20 3d 20 31 3b  ansCntrChng = 1;
186e0 20 20 2f 2a 20 54 68 65 20 74 72 61 6e 73 61 63    /* The transac
186f0 74 69 6f 6e 20 63 6f 75 6e 74 65 72 20 68 61 73  tion counter has
18700 20 63 68 61 6e 67 65 64 20 2a 2f 0a 20 20 20 20   changed */.    
18710 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65    }.    }.  }.#e
18720 6e 64 69 66 0a 0a 20 20 77 68 69 6c 65 28 20 61  ndif..  while( a
18730 6d 74 3e 30 20 26 26 20 28 77 72 6f 74 65 20 3d  mt>0 && (wrote =
18740 20 73 65 65 6b 41 6e 64 57 72 69 74 65 28 70 46   seekAndWrite(pF
18750 69 6c 65 2c 20 6f 66 66 73 65 74 2c 20 70 42 75  ile, offset, pBu
18760 66 2c 20 61 6d 74 29 29 3e 30 20 29 7b 0a 20 20  f, amt))>0 ){.  
18770 20 20 61 6d 74 20 2d 3d 20 77 72 6f 74 65 3b 0a    amt -= wrote;.
18780 20 20 20 20 6f 66 66 73 65 74 20 2b 3d 20 77 72      offset += wr
18790 6f 74 65 3b 0a 20 20 20 20 70 42 75 66 20 3d 20  ote;.    pBuf = 
187a0 26 28 28 63 68 61 72 2a 29 70 42 75 66 29 5b 77  &((char*)pBuf)[w
187b0 72 6f 74 65 5d 3b 0a 20 20 7d 0a 20 20 53 69 6d  rote];.  }.  Sim
187c0 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 28 20 77  ulateIOError(( w
187d0 72 6f 74 65 3d 28 2d 31 29 2c 20 61 6d 74 3d 31  rote=(-1), amt=1
187e0 20 29 29 3b 0a 20 20 53 69 6d 75 6c 61 74 65 44   ));.  SimulateD
187f0 69 73 6b 66 75 6c 6c 45 72 72 6f 72 28 28 20 77  iskfullError(( w
18800 72 6f 74 65 3d 30 2c 20 61 6d 74 3d 31 20 29 29  rote=0, amt=1 ))
18810 3b 0a 20 20 69 66 28 20 61 6d 74 3e 30 20 29 7b  ;.  if( amt>0 ){
18820 0a 20 20 20 20 69 66 28 20 77 72 6f 74 65 3c 30  .    if( wrote<0
18830 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 6c 61 73   ){.      /* las
18840 74 45 72 72 6e 6f 20 73 65 74 20 62 79 20 73 65  tErrno set by se
18850 65 6b 41 6e 64 57 72 69 74 65 20 2a 2f 0a 20 20  ekAndWrite */.  
18860 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
18870 45 5f 49 4f 45 52 52 5f 57 52 49 54 45 3b 0a 20  E_IOERR_WRITE;. 
18880 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
18890 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f  pFile->lastErrno
188a0 20 3d 20 30 3b 20 2f 2a 20 6e 6f 74 20 61 20 73   = 0; /* not a s
188b0 79 73 74 65 6d 20 65 72 72 6f 72 20 2a 2f 0a 20  ystem error */. 
188c0 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
188d0 54 45 5f 46 55 4c 4c 3b 0a 20 20 20 20 7d 0a 20  TE_FULL;.    }. 
188e0 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49   }.  return SQLI
188f0 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 64 65 66  TE_OK;.}..#ifdef
18900 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 2f 2a 0a   SQLITE_TEST./*.
18910 2a 2a 20 43 6f 75 6e 74 20 74 68 65 20 6e 75 6d  ** Count the num
18920 62 65 72 20 6f 66 20 66 75 6c 6c 73 79 6e 63 73  ber of fullsyncs
18930 20 61 6e 64 20 6e 6f 72 6d 61 6c 20 73 79 6e 63   and normal sync
18940 73 2e 20 20 54 68 69 73 20 69 73 20 75 73 65 64  s.  This is used
18950 20 74 6f 20 74 65 73 74 0a 2a 2a 20 74 68 61 74   to test.** that
18960 20 73 79 6e 63 73 20 61 6e 64 20 66 75 6c 6c 73   syncs and fulls
18970 79 6e 63 73 20 61 72 65 20 6f 63 63 75 72 72 69  yncs are occurri
18980 6e 67 20 61 74 20 74 68 65 20 72 69 67 68 74 20  ng at the right 
18990 74 69 6d 65 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71  times..*/.int sq
189a0 6c 69 74 65 33 5f 73 79 6e 63 5f 63 6f 75 6e 74  lite3_sync_count
189b0 20 3d 20 30 3b 0a 69 6e 74 20 73 71 6c 69 74 65   = 0;.int sqlite
189c0 33 5f 66 75 6c 6c 73 79 6e 63 5f 63 6f 75 6e 74  3_fullsync_count
189d0 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 0a 2f 2a   = 0;.#endif../*
189e0 0a 2a 2a 20 57 65 20 64 6f 20 6e 6f 74 20 74 72  .** We do not tr
189f0 75 73 74 20 73 79 73 74 65 6d 73 20 74 6f 20 70  ust systems to p
18a00 72 6f 76 69 64 65 20 61 20 77 6f 72 6b 69 6e 67  rovide a working
18a10 20 66 64 61 74 61 73 79 6e 63 28 29 2e 20 20 53   fdatasync().  S
18a20 6f 6d 65 20 64 6f 2e 0a 2a 2a 20 4f 74 68 65 72  ome do..** Other
18a30 73 20 64 6f 20 6e 6f 2e 20 20 54 6f 20 62 65 20  s do no.  To be 
18a40 73 61 66 65 2c 20 77 65 20 77 69 6c 6c 20 73 74  safe, we will st
18a50 69 63 6b 20 77 69 74 68 20 74 68 65 20 28 73 6c  ick with the (sl
18a60 6f 77 65 72 29 20 66 73 79 6e 63 28 29 2e 0a 2a  ower) fsync()..*
18a70 2a 20 49 66 20 79 6f 75 20 6b 6e 6f 77 20 74 68  * If you know th
18a80 61 74 20 79 6f 75 72 20 73 79 73 74 65 6d 20 64  at your system d
18a90 6f 65 73 20 73 75 70 70 6f 72 74 20 66 64 61 74  oes support fdat
18aa0 61 73 79 6e 63 28 29 20 63 6f 72 72 65 63 74 6c  async() correctl
18ab0 79 2c 0a 2a 2a 20 74 68 65 6e 20 73 69 6d 70 6c  y,.** then simpl
18ac0 79 20 63 6f 6d 70 69 6c 65 20 77 69 74 68 20 2d  y compile with -
18ad0 44 66 64 61 74 61 73 79 6e 63 3d 66 64 61 74 61  Dfdatasync=fdata
18ae0 73 79 6e 63 0a 2a 2f 0a 23 69 66 20 21 64 65 66  sync.*/.#if !def
18af0 69 6e 65 64 28 66 64 61 74 61 73 79 6e 63 29 20  ined(fdatasync) 
18b00 26 26 20 21 64 65 66 69 6e 65 64 28 5f 5f 6c 69  && !defined(__li
18b10 6e 75 78 5f 5f 29 0a 23 20 64 65 66 69 6e 65 20  nux__).# define 
18b20 66 64 61 74 61 73 79 6e 63 20 66 73 79 6e 63 0a  fdatasync fsync.
18b30 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 44 65  #endif../*.** De
18b40 66 69 6e 65 20 48 41 56 45 5f 46 55 4c 4c 46 53  fine HAVE_FULLFS
18b50 59 4e 43 20 74 6f 20 30 20 6f 72 20 31 20 64 65  YNC to 0 or 1 de
18b60 70 65 6e 64 69 6e 67 20 6f 6e 20 77 68 65 74 68  pending on wheth
18b70 65 72 20 6f 72 20 6e 6f 74 0a 2a 2a 20 74 68 65  er or not.** the
18b80 20 46 5f 46 55 4c 4c 46 53 59 4e 43 20 6d 61 63   F_FULLFSYNC mac
18b90 72 6f 20 69 73 20 64 65 66 69 6e 65 64 2e 20 20  ro is defined.  
18ba0 46 5f 46 55 4c 4c 46 53 59 4e 43 20 69 73 20 63  F_FULLFSYNC is c
18bb0 75 72 72 65 6e 74 6c 79 0a 2a 2a 20 6f 6e 6c 79  urrently.** only
18bc0 20 61 76 61 69 6c 61 62 6c 65 20 6f 6e 20 4d 61   available on Ma
18bd0 63 20 4f 53 20 58 2e 20 20 42 75 74 20 74 68 61  c OS X.  But tha
18be0 74 20 63 6f 75 6c 64 20 63 68 61 6e 67 65 2e 0a  t could change..
18bf0 2a 2f 0a 23 69 66 64 65 66 20 46 5f 46 55 4c 4c  */.#ifdef F_FULL
18c00 46 53 59 4e 43 0a 23 20 64 65 66 69 6e 65 20 48  FSYNC.# define H
18c10 41 56 45 5f 46 55 4c 4c 46 53 59 4e 43 20 31 0a  AVE_FULLFSYNC 1.
18c20 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 48  #else.# define H
18c30 41 56 45 5f 46 55 4c 4c 46 53 59 4e 43 20 30 0a  AVE_FULLFSYNC 0.
18c40 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 54  #endif.../*.** T
18c50 68 65 20 66 73 79 6e 63 28 29 20 73 79 73 74 65  he fsync() syste
18c60 6d 20 63 61 6c 6c 20 64 6f 65 73 20 6e 6f 74 20  m call does not 
18c70 77 6f 72 6b 20 61 73 20 61 64 76 65 72 74 69 73  work as advertis
18c80 65 64 20 6f 6e 20 6d 61 6e 79 0a 2a 2a 20 75 6e  ed on many.** un
18c90 69 78 20 73 79 73 74 65 6d 73 2e 20 20 54 68 65  ix systems.  The
18ca0 20 66 6f 6c 6c 6f 77 69 6e 67 20 70 72 6f 63 65   following proce
18cb0 64 75 72 65 20 69 73 20 61 6e 20 61 74 74 65 6d  dure is an attem
18cc0 70 74 20 74 6f 20 6d 61 6b 65 0a 2a 2a 20 69 74  pt to make.** it
18cd0 20 77 6f 72 6b 20 62 65 74 74 65 72 2e 0a 2a 2a   work better..**
18ce0 0a 2a 2a 20 54 68 65 20 53 51 4c 49 54 45 5f 4e  .** The SQLITE_N
18cf0 4f 5f 53 59 4e 43 20 6d 61 63 72 6f 20 64 69 73  O_SYNC macro dis
18d00 61 62 6c 65 73 20 61 6c 6c 20 66 73 79 6e 63 28  ables all fsync(
18d10 29 73 2e 20 20 54 68 69 73 20 69 73 20 75 73 65  )s.  This is use
18d20 66 75 6c 0a 2a 2a 20 66 6f 72 20 74 65 73 74 69  ful.** for testi
18d30 6e 67 20 77 68 65 6e 20 77 65 20 77 61 6e 74 20  ng when we want 
18d40 74 6f 20 72 75 6e 20 74 68 72 6f 75 67 68 20 74  to run through t
18d50 68 65 20 74 65 73 74 20 73 75 69 74 65 20 71 75  he test suite qu
18d60 69 63 6b 6c 79 2e 0a 2a 2a 20 59 6f 75 20 61 72  ickly..** You ar
18d70 65 20 73 74 72 6f 6e 67 6c 79 20 61 64 76 69 73  e strongly advis
18d80 65 64 20 2a 6e 6f 74 2a 20 74 6f 20 64 65 70 6c  ed *not* to depl
18d90 6f 79 20 77 69 74 68 20 53 51 4c 49 54 45 5f 4e  oy with SQLITE_N
18da0 4f 5f 53 59 4e 43 0a 2a 2a 20 65 6e 61 62 6c 65  O_SYNC.** enable
18db0 64 2c 20 68 6f 77 65 76 65 72 2c 20 73 69 6e 63  d, however, sinc
18dc0 65 20 77 69 74 68 20 53 51 4c 49 54 45 5f 4e 4f  e with SQLITE_NO
18dd0 5f 53 59 4e 43 20 65 6e 61 62 6c 65 64 2c 20 61  _SYNC enabled, a
18de0 6e 20 4f 53 20 63 72 61 73 68 0a 2a 2a 20 6f 72  n OS crash.** or
18df0 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65 20 77   power failure w
18e00 69 6c 6c 20 6c 69 6b 65 6c 79 20 63 6f 72 72 75  ill likely corru
18e10 70 74 20 74 68 65 20 64 61 74 61 62 61 73 65 20  pt the database 
18e20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 69  file..**.** SQLi
18e30 74 65 20 73 65 74 73 20 74 68 65 20 64 61 74 61  te sets the data
18e40 4f 6e 6c 79 20 66 6c 61 67 20 69 66 20 74 68 65  Only flag if the
18e50 20 73 69 7a 65 20 6f 66 20 74 68 65 20 66 69 6c   size of the fil
18e60 65 20 69 73 20 75 6e 63 68 61 6e 67 65 64 2e 0a  e is unchanged..
18e70 2a 2a 20 54 68 65 20 69 64 65 61 20 62 65 68 69  ** The idea behi
18e80 6e 64 20 64 61 74 61 4f 6e 6c 79 20 69 73 20 74  nd dataOnly is t
18e90 68 61 74 20 69 74 20 73 68 6f 75 6c 64 20 6f 6e  hat it should on
18ea0 6c 79 20 77 72 69 74 65 20 74 68 65 20 66 69 6c  ly write the fil
18eb0 65 20 63 6f 6e 74 65 6e 74 0a 2a 2a 20 74 6f 20  e content.** to 
18ec0 64 69 73 6b 2c 20 6e 6f 74 20 74 68 65 20 69 6e  disk, not the in
18ed0 6f 64 65 2e 20 20 57 65 20 6f 6e 6c 79 20 73 65  ode.  We only se
18ee0 74 20 64 61 74 61 4f 6e 6c 79 20 69 66 20 74 68  t dataOnly if th
18ef0 65 20 66 69 6c 65 20 73 69 7a 65 20 69 73 20 0a  e file size is .
18f00 2a 2a 20 75 6e 63 68 61 6e 67 65 64 20 73 69 6e  ** unchanged sin
18f10 63 65 20 74 68 65 20 66 69 6c 65 20 73 69 7a 65  ce the file size
18f20 20 69 73 20 70 61 72 74 20 6f 66 20 74 68 65 20   is part of the 
18f30 69 6e 6f 64 65 2e 20 20 48 6f 77 65 76 65 72 2c  inode.  However,
18f40 20 0a 2a 2a 20 54 65 64 20 54 73 27 6f 20 74 65   .** Ted Ts'o te
18f50 6c 6c 73 20 75 73 20 74 68 61 74 20 66 64 61 74  lls us that fdat
18f60 61 73 79 6e 63 28 29 20 77 69 6c 6c 20 61 6c 73  async() will als
18f70 6f 20 77 72 69 74 65 20 74 68 65 20 69 6e 6f 64  o write the inod
18f80 65 20 69 66 20 74 68 65 0a 2a 2a 20 66 69 6c 65  e if the.** file
18f90 20 73 69 7a 65 20 68 61 73 20 63 68 61 6e 67 65   size has change
18fa0 64 2e 20 20 54 68 65 20 6f 6e 6c 79 20 72 65 61  d.  The only rea
18fb0 6c 20 64 69 66 66 65 72 65 6e 63 65 20 62 65 74  l difference bet
18fc0 77 65 65 6e 20 66 64 61 74 61 73 79 6e 63 28 29  ween fdatasync()
18fd0 0a 2a 2a 20 61 6e 64 20 66 73 79 6e 63 28 29 2c  .** and fsync(),
18fe0 20 54 65 64 20 74 65 6c 6c 73 20 75 73 2c 20 69   Ted tells us, i
18ff0 73 20 74 68 61 74 20 66 64 61 74 61 73 79 6e 63  s that fdatasync
19000 28 29 20 77 69 6c 6c 20 6e 6f 74 20 66 6c 75 73  () will not flus
19010 68 20 74 68 65 0a 2a 2a 20 69 6e 6f 64 65 20 69  h the.** inode i
19020 66 20 74 68 65 20 6d 74 69 6d 65 20 6f 72 20 6f  f the mtime or o
19030 77 6e 65 72 20 6f 72 20 6f 74 68 65 72 20 69 6e  wner or other in
19040 6f 64 65 20 61 74 74 72 69 62 75 74 65 73 20 68  ode attributes h
19050 61 76 65 20 63 68 61 6e 67 65 64 2e 0a 2a 2a 20  ave changed..** 
19060 57 65 20 6f 6e 6c 79 20 63 61 72 65 20 61 62 6f  We only care abo
19070 75 74 20 74 68 65 20 66 69 6c 65 20 73 69 7a 65  ut the file size
19080 2c 20 6e 6f 74 20 74 68 65 20 6f 74 68 65 72 20  , not the other 
19090 66 69 6c 65 20 61 74 74 72 69 62 75 74 65 73 2c  file attributes,
190a0 20 73 6f 0a 2a 2a 20 61 73 20 66 61 72 20 61 73   so.** as far as
190b0 20 53 51 4c 69 74 65 20 69 73 20 63 6f 6e 63 65   SQLite is conce
190c0 72 6e 65 64 2c 20 61 6e 20 66 64 61 74 61 73 79  rned, an fdatasy
190d0 6e 63 28 29 20 69 73 20 61 6c 77 61 79 73 20 61  nc() is always a
190e0 64 65 71 75 61 74 65 2e 0a 2a 2a 20 53 6f 2c 20  dequate..** So, 
190f0 77 65 20 61 6c 77 61 79 73 20 75 73 65 20 66 64  we always use fd
19100 61 74 61 73 79 6e 63 28 29 20 69 66 20 69 74 20  atasync() if it 
19110 69 73 20 61 76 61 69 6c 61 62 6c 65 2c 20 72 65  is available, re
19120 67 61 72 64 6c 65 73 73 20 6f 66 0a 2a 2a 20 74  gardless of.** t
19130 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20  he value of the 
19140 64 61 74 61 4f 6e 6c 79 20 66 6c 61 67 2e 0a 2a  dataOnly flag..*
19150 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 75 6c  /.static int ful
19160 6c 5f 66 73 79 6e 63 28 69 6e 74 20 66 64 2c 20  l_fsync(int fd, 
19170 69 6e 74 20 66 75 6c 6c 53 79 6e 63 2c 20 69 6e  int fullSync, in
19180 74 20 64 61 74 61 4f 6e 6c 79 29 7b 0a 20 20 69  t dataOnly){.  i
19190 6e 74 20 72 63 3b 0a 0a 20 20 2f 2a 20 54 68 65  nt rc;..  /* The
191a0 20 66 6f 6c 6c 6f 77 69 6e 67 20 22 69 66 64 65   following "ifde
191b0 66 2f 65 6c 69 66 2f 65 6c 73 65 2f 22 20 62 6c  f/elif/else/" bl
191c0 6f 63 6b 20 68 61 73 20 74 68 65 20 73 61 6d 65  ock has the same
191d0 20 73 74 72 75 63 74 75 72 65 20 61 73 0a 20 20   structure as.  
191e0 2a 2a 20 74 68 65 20 6f 6e 65 20 62 65 6c 6f 77  ** the one below
191f0 2e 20 49 74 20 69 73 20 72 65 70 6c 69 63 61 74  . It is replicat
19200 65 64 20 68 65 72 65 20 73 6f 6c 65 6c 79 20 74  ed here solely t
19210 6f 20 61 76 6f 69 64 20 63 6c 75 74 74 65 72 69  o avoid clutteri
19220 6e 67 20 0a 20 20 2a 2a 20 75 70 20 74 68 65 20  ng .  ** up the 
19230 72 65 61 6c 20 63 6f 64 65 20 77 69 74 68 20 74  real code with t
19240 68 65 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  he UNUSED_PARAME
19250 54 45 52 28 29 20 6d 61 63 72 6f 73 2e 0a 20 20  TER() macros..  
19260 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  */.#ifdef SQLITE
19270 5f 4e 4f 5f 53 59 4e 43 0a 20 20 55 4e 55 53 45  _NO_SYNC.  UNUSE
19280 44 5f 50 41 52 41 4d 45 54 45 52 28 66 64 29 3b  D_PARAMETER(fd);
19290 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
192a0 54 45 52 28 66 75 6c 6c 53 79 6e 63 29 3b 0a 20  TER(fullSync);. 
192b0 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
192c0 52 28 64 61 74 61 4f 6e 6c 79 29 3b 0a 23 65 6c  R(dataOnly);.#el
192d0 69 66 20 48 41 56 45 5f 46 55 4c 4c 46 53 59 4e  if HAVE_FULLFSYN
192e0 43 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  C.  UNUSED_PARAM
192f0 45 54 45 52 28 64 61 74 61 4f 6e 6c 79 29 3b 0a  ETER(dataOnly);.
19300 23 65 6c 73 65 0a 20 20 55 4e 55 53 45 44 5f 50  #else.  UNUSED_P
19310 41 52 41 4d 45 54 45 52 28 66 75 6c 6c 53 79 6e  ARAMETER(fullSyn
19320 63 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  c);.  UNUSED_PAR
19330 41 4d 45 54 45 52 28 64 61 74 61 4f 6e 6c 79 29  AMETER(dataOnly)
19340 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 52  ;.#endif..  /* R
19350 65 63 6f 72 64 20 74 68 65 20 6e 75 6d 62 65 72  ecord the number
19360 20 6f 66 20 74 69 6d 65 73 20 74 68 61 74 20 77   of times that w
19370 65 20 64 6f 20 61 20 6e 6f 72 6d 61 6c 20 66 73  e do a normal fs
19380 79 6e 63 28 29 20 61 6e 64 20 0a 20 20 2a 2a 20  ync() and .  ** 
19390 46 55 4c 4c 53 59 4e 43 2e 20 20 54 68 69 73 20  FULLSYNC.  This 
193a0 69 73 20 75 73 65 64 20 64 75 72 69 6e 67 20 74  is used during t
193b0 65 73 74 69 6e 67 20 74 6f 20 76 65 72 69 66 79  esting to verify
193c0 20 74 68 61 74 20 74 68 69 73 20 70 72 6f 63 65   that this proce
193d0 64 75 72 65 0a 20 20 2a 2a 20 67 65 74 73 20 63  dure.  ** gets c
193e0 61 6c 6c 65 64 20 77 69 74 68 20 74 68 65 20 63  alled with the c
193f0 6f 72 72 65 63 74 20 61 72 67 75 6d 65 6e 74 73  orrect arguments
19400 2e 0a 20 20 2a 2f 0a 23 69 66 64 65 66 20 53 51  ..  */.#ifdef SQ
19410 4c 49 54 45 5f 54 45 53 54 0a 20 20 69 66 28 20  LITE_TEST.  if( 
19420 66 75 6c 6c 53 79 6e 63 20 29 20 73 71 6c 69 74  fullSync ) sqlit
19430 65 33 5f 66 75 6c 6c 73 79 6e 63 5f 63 6f 75 6e  e3_fullsync_coun
19440 74 2b 2b 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73  t++;.  sqlite3_s
19450 79 6e 63 5f 63 6f 75 6e 74 2b 2b 3b 0a 23 65 6e  ync_count++;.#en
19460 64 69 66 0a 0a 20 20 2f 2a 20 49 66 20 77 65 20  dif..  /* If we 
19470 63 6f 6d 70 69 6c 65 64 20 77 69 74 68 20 74 68  compiled with th
19480 65 20 53 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e 43  e SQLITE_NO_SYNC
19490 20 66 6c 61 67 2c 20 74 68 65 6e 20 73 79 6e 63   flag, then sync
194a0 69 6e 67 20 69 73 20 61 0a 20 20 2a 2a 20 6e 6f  ing is a.  ** no
194b0 2d 6f 70 0a 20 20 2a 2f 0a 23 69 66 64 65 66 20  -op.  */.#ifdef 
194c0 53 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e 43 0a 20  SQLITE_NO_SYNC. 
194d0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
194e0 0a 23 65 6c 69 66 20 48 41 56 45 5f 46 55 4c 4c  .#elif HAVE_FULL
194f0 46 53 59 4e 43 0a 20 20 69 66 28 20 66 75 6c 6c  FSYNC.  if( full
19500 53 79 6e 63 20 29 7b 0a 20 20 20 20 72 63 20 3d  Sync ){.    rc =
19510 20 66 63 6e 74 6c 28 66 64 2c 20 46 5f 46 55 4c   fcntl(fd, F_FUL
19520 4c 46 53 59 4e 43 2c 20 30 29 3b 0a 20 20 7d 65  LFSYNC, 0);.  }e
19530 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 31 3b  lse{.    rc = 1;
19540 0a 20 20 7d 0a 20 20 2f 2a 20 49 66 20 74 68 65  .  }.  /* If the
19550 20 46 55 4c 4c 46 53 59 4e 43 20 66 61 69 6c 65   FULLFSYNC faile
19560 64 2c 20 66 61 6c 6c 20 62 61 63 6b 20 74 6f 20  d, fall back to 
19570 61 74 74 65 6d 70 74 69 6e 67 20 61 6e 20 66 73  attempting an fs
19580 79 6e 63 28 29 2e 0a 20 20 2a 2a 20 49 74 20 73  ync()..  ** It s
19590 68 6f 75 6c 64 6e 27 74 20 62 65 20 70 6f 73 73  houldn't be poss
195a0 69 62 6c 65 20 66 6f 72 20 66 75 6c 6c 66 73 79  ible for fullfsy
195b0 6e 63 20 74 6f 20 66 61 69 6c 20 6f 6e 20 74 68  nc to fail on th
195c0 65 20 6c 6f 63 61 6c 20 0a 20 20 2a 2a 20 66 69  e local .  ** fi
195d0 6c 65 20 73 79 73 74 65 6d 20 28 6f 6e 20 4f 53  le system (on OS
195e0 58 29 2c 20 73 6f 20 66 61 69 6c 75 72 65 20 69  X), so failure i
195f0 6e 64 69 63 61 74 65 73 20 74 68 61 74 20 46 55  ndicates that FU
19600 4c 4c 46 53 59 4e 43 0a 20 20 2a 2a 20 69 73 6e  LLFSYNC.  ** isn
19610 27 74 20 73 75 70 70 6f 72 74 65 64 20 66 6f 72  't supported for
19620 20 74 68 69 73 20 66 69 6c 65 20 73 79 73 74 65   this file syste
19630 6d 2e 20 53 6f 2c 20 61 74 74 65 6d 70 74 20 61  m. So, attempt a
19640 6e 20 66 73 79 6e 63 20 0a 20 20 2a 2a 20 61 6e  n fsync .  ** an
19650 64 20 28 66 6f 72 20 6e 6f 77 29 20 69 67 6e 6f  d (for now) igno
19660 72 65 20 74 68 65 20 6f 76 65 72 68 65 61 64 20  re the overhead 
19670 6f 66 20 61 20 73 75 70 65 72 66 6c 75 6f 75 73  of a superfluous
19680 20 66 63 6e 74 6c 20 63 61 6c 6c 2e 20 20 0a 20   fcntl call.  . 
19690 20 2a 2a 20 49 74 27 64 20 62 65 20 62 65 74 74   ** It'd be bett
196a0 65 72 20 74 6f 20 64 65 74 65 63 74 20 66 75 6c  er to detect ful
196b0 6c 66 73 79 6e 63 20 73 75 70 70 6f 72 74 20 6f  lfsync support o
196c0 6e 63 65 20 61 6e 64 20 61 76 6f 69 64 20 0a 20  nce and avoid . 
196d0 20 2a 2a 20 74 68 65 20 66 63 6e 74 6c 20 63 61   ** the fcntl ca
196e0 6c 6c 20 65 76 65 72 79 20 74 69 6d 65 20 73 79  ll every time sy
196f0 6e 63 20 69 73 20 63 61 6c 6c 65 64 2e 0a 20 20  nc is called..  
19700 2a 2f 0a 20 20 69 66 28 20 72 63 20 29 20 72 63  */.  if( rc ) rc
19710 20 3d 20 66 73 79 6e 63 28 66 64 29 3b 0a 0a 23   = fsync(fd);..#
19720 65 6c 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 41  elif defined(__A
19730 50 50 4c 45 5f 5f 29 0a 20 20 2f 2a 20 66 64 61  PPLE__).  /* fda
19740 74 61 73 79 6e 63 28 29 20 6f 6e 20 48 46 53 2b  tasync() on HFS+
19750 20 64 6f 65 73 6e 27 74 20 79 65 74 20 66 6c 75   doesn't yet flu
19760 73 68 20 74 68 65 20 66 69 6c 65 20 73 69 7a 65  sh the file size
19770 20 69 66 20 69 74 20 63 68 61 6e 67 65 64 20 63   if it changed c
19780 6f 72 72 65 63 74 6c 79 0a 20 20 2a 2a 20 73 6f  orrectly.  ** so
19790 20 63 75 72 72 65 6e 74 6c 79 20 77 65 20 64 65   currently we de
197a0 66 61 75 6c 74 20 74 6f 20 74 68 65 20 6d 61 63  fault to the mac
197b0 72 6f 20 74 68 61 74 20 72 65 64 65 66 69 6e 65  ro that redefine
197c0 73 20 66 64 61 74 61 73 79 6e 63 20 74 6f 20 66  s fdatasync to f
197d0 73 79 6e 63 0a 20 20 2a 2f 0a 20 20 72 63 20 3d  sync.  */.  rc =
197e0 20 66 73 79 6e 63 28 66 64 29 3b 0a 23 65 6c 73   fsync(fd);.#els
197f0 65 20 0a 20 20 72 63 20 3d 20 66 64 61 74 61 73  e .  rc = fdatas
19800 79 6e 63 28 66 64 29 3b 0a 23 69 66 20 4f 53 5f  ync(fd);.#if OS_
19810 56 58 57 4f 52 4b 53 0a 20 20 69 66 28 20 72 63  VXWORKS.  if( rc
19820 3d 3d 2d 31 20 26 26 20 65 72 72 6e 6f 3d 3d 45  ==-1 && errno==E
19830 4e 4f 54 53 55 50 20 29 7b 0a 20 20 20 20 72 63  NOTSUP ){.    rc
19840 20 3d 20 66 73 79 6e 63 28 66 64 29 3b 0a 20 20   = fsync(fd);.  
19850 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 4f 53 5f 56  }.#endif /* OS_V
19860 58 57 4f 52 4b 53 20 2a 2f 0a 23 65 6e 64 69 66  XWORKS */.#endif
19870 20 2f 2a 20 69 66 64 65 66 20 53 51 4c 49 54 45   /* ifdef SQLITE
19880 5f 4e 4f 5f 53 59 4e 43 20 65 6c 69 66 20 48 41  _NO_SYNC elif HA
19890 56 45 5f 46 55 4c 4c 46 53 59 4e 43 20 2a 2f 0a  VE_FULLFSYNC */.
198a0 0a 20 20 69 66 28 20 4f 53 5f 56 58 57 4f 52 4b  .  if( OS_VXWORK
198b0 53 20 26 26 20 72 63 21 3d 20 2d 31 20 29 7b 0a  S && rc!= -1 ){.
198c0 20 20 20 20 72 63 20 3d 20 30 3b 0a 20 20 7d 0a      rc = 0;.  }.
198d0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
198e0 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75 72 65 20  /*.** Make sure 
198f0 61 6c 6c 20 77 72 69 74 65 73 20 74 6f 20 61 20  all writes to a 
19900 70 61 72 74 69 63 75 6c 61 72 20 66 69 6c 65 20  particular file 
19910 61 72 65 20 63 6f 6d 6d 69 74 74 65 64 20 74 6f  are committed to
19920 20 64 69 73 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   disk..**.** If 
19930 64 61 74 61 4f 6e 6c 79 3d 3d 30 20 74 68 65 6e  dataOnly==0 then
19940 20 62 6f 74 68 20 74 68 65 20 66 69 6c 65 20 69   both the file i
19950 74 73 65 6c 66 20 61 6e 64 20 69 74 73 20 6d 65  tself and its me
19960 74 61 64 61 74 61 20 28 66 69 6c 65 0a 2a 2a 20  tadata (file.** 
19970 73 69 7a 65 2c 20 61 63 63 65 73 73 20 74 69 6d  size, access tim
19980 65 2c 20 65 74 63 29 20 61 72 65 20 73 79 6e 63  e, etc) are sync
19990 65 64 2e 20 20 49 66 20 64 61 74 61 4f 6e 6c 79  ed.  If dataOnly
199a0 21 3d 30 20 74 68 65 6e 20 6f 6e 6c 79 20 74 68  !=0 then only th
199b0 65 0a 2a 2a 20 66 69 6c 65 20 64 61 74 61 20 69  e.** file data i
199c0 73 20 73 79 6e 63 65 64 2e 0a 2a 2a 0a 2a 2a 20  s synced..**.** 
199d0 55 6e 64 65 72 20 55 6e 69 78 2c 20 61 6c 73 6f  Under Unix, also
199e0 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74 20   make sure that 
199f0 74 68 65 20 64 69 72 65 63 74 6f 72 79 20 65 6e  the directory en
19a00 74 72 79 20 66 6f 72 20 74 68 65 20 66 69 6c 65  try for the file
19a10 0a 2a 2a 20 68 61 73 20 62 65 65 6e 20 63 72 65  .** has been cre
19a20 61 74 65 64 20 62 79 20 66 73 79 6e 63 2d 69 6e  ated by fsync-in
19a30 67 20 74 68 65 20 64 69 72 65 63 74 6f 72 79 20  g the directory 
19a40 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 74 68  that contains th
19a50 65 20 66 69 6c 65 2e 0a 2a 2a 20 49 66 20 77 65  e file..** If we
19a60 20 64 6f 20 6e 6f 74 20 64 6f 20 74 68 69 73 20   do not do this 
19a70 61 6e 64 20 77 65 20 65 6e 63 6f 75 6e 74 65 72  and we encounter
19a80 20 61 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65   a power failure
19a90 2c 20 74 68 65 20 64 69 72 65 63 74 6f 72 79 0a  , the directory.
19aa0 2a 2a 20 65 6e 74 72 79 20 66 6f 72 20 74 68 65  ** entry for the
19ab0 20 6a 6f 75 72 6e 61 6c 20 6d 69 67 68 74 20 6e   journal might n
19ac0 6f 74 20 65 78 69 73 74 20 61 66 74 65 72 20 77  ot exist after w
19ad0 65 20 72 65 62 6f 6f 74 2e 20 20 54 68 65 20 6e  e reboot.  The n
19ae0 65 78 74 0a 2a 2a 20 53 51 4c 69 74 65 20 74 6f  ext.** SQLite to
19af0 20 61 63 63 65 73 73 20 74 68 65 20 66 69 6c 65   access the file
19b00 20 77 69 6c 6c 20 6e 6f 74 20 6b 6e 6f 77 20 74   will not know t
19b10 68 61 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  hat the journal 
19b20 65 78 69 73 74 73 20 28 62 65 63 61 75 73 65 0a  exists (because.
19b30 2a 2a 20 74 68 65 20 64 69 72 65 63 74 6f 72 79  ** the directory
19b40 20 65 6e 74 72 79 20 66 6f 72 20 74 68 65 20 6a   entry for the j
19b50 6f 75 72 6e 61 6c 20 77 61 73 20 6e 65 76 65 72  ournal was never
19b60 20 63 72 65 61 74 65 64 29 20 61 6e 64 20 74 68   created) and th
19b70 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a  e transaction.**
19b80 20 77 69 6c 6c 20 6e 6f 74 20 72 6f 6c 6c 20 62   will not roll b
19b90 61 63 6b 20 2d 20 70 6f 73 73 69 62 6c 79 20 6c  ack - possibly l
19ba0 65 61 64 69 6e 67 20 74 6f 20 64 61 74 61 62 61  eading to databa
19bb0 73 65 20 63 6f 72 72 75 70 74 69 6f 6e 2e 0a 2a  se corruption..*
19bc0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69  /.static int uni
19bd0 78 53 79 6e 63 28 73 71 6c 69 74 65 33 5f 66 69  xSync(sqlite3_fi
19be0 6c 65 20 2a 69 64 2c 20 69 6e 74 20 66 6c 61 67  le *id, int flag
19bf0 73 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  s){.  int rc;.  
19c00 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20  unixFile *pFile 
19c10 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b  = (unixFile*)id;
19c20 0a 0a 20 20 69 6e 74 20 69 73 44 61 74 61 4f 6e  ..  int isDataOn
19c30 6c 79 20 3d 20 28 66 6c 61 67 73 26 53 51 4c 49  ly = (flags&SQLI
19c40 54 45 5f 53 59 4e 43 5f 44 41 54 41 4f 4e 4c 59  TE_SYNC_DATAONLY
19c50 29 3b 0a 20 20 69 6e 74 20 69 73 46 75 6c 6c 73  );.  int isFulls
19c60 79 6e 63 20 3d 20 28 66 6c 61 67 73 26 30 78 30  ync = (flags&0x0
19c70 46 29 3d 3d 53 51 4c 49 54 45 5f 53 59 4e 43 5f  F)==SQLITE_SYNC_
19c80 46 55 4c 4c 3b 0a 0a 20 20 2f 2a 20 43 68 65 63  FULL;..  /* Chec
19c90 6b 20 74 68 61 74 20 6f 6e 65 20 6f 66 20 53 51  k that one of SQ
19ca0 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c  LITE_SYNC_NORMAL
19cb0 20 6f 72 20 46 55 4c 4c 20 77 61 73 20 70 61 73   or FULL was pas
19cc0 73 65 64 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  sed */.  assert(
19cd0 28 66 6c 61 67 73 26 30 78 30 46 29 3d 3d 53 51  (flags&0x0F)==SQ
19ce0 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c  LITE_SYNC_NORMAL
19cf0 0a 20 20 20 20 20 20 7c 7c 20 28 66 6c 61 67 73  .      || (flags
19d00 26 30 78 30 46 29 3d 3d 53 51 4c 49 54 45 5f 53  &0x0F)==SQLITE_S
19d10 59 4e 43 5f 46 55 4c 4c 0a 20 20 29 3b 0a 0a 20  YNC_FULL.  );.. 
19d20 20 2f 2a 20 55 6e 69 78 20 63 61 6e 6e 6f 74 2c   /* Unix cannot,
19d30 20 62 75 74 20 73 6f 6d 65 20 73 79 73 74 65 6d   but some system
19d40 73 20 6d 61 79 20 72 65 74 75 72 6e 20 53 51 4c  s may return SQL
19d50 49 54 45 5f 46 55 4c 4c 20 66 72 6f 6d 20 68 65  ITE_FULL from he
19d60 72 65 2e 20 54 68 69 73 0a 20 20 2a 2a 20 6c 69  re. This.  ** li
19d70 6e 65 20 69 73 20 74 6f 20 74 65 73 74 20 74 68  ne is to test th
19d80 61 74 20 64 6f 69 6e 67 20 73 6f 20 64 6f 65 73  at doing so does
19d90 20 6e 6f 74 20 63 61 75 73 65 20 61 6e 79 20 70   not cause any p
19da0 72 6f 62 6c 65 6d 73 2e 0a 20 20 2a 2f 0a 20 20  roblems..  */.  
19db0 53 69 6d 75 6c 61 74 65 44 69 73 6b 66 75 6c 6c  SimulateDiskfull
19dc0 45 72 72 6f 72 28 20 72 65 74 75 72 6e 20 53 51  Error( return SQ
19dd0 4c 49 54 45 5f 46 55 4c 4c 20 29 3b 0a 0a 20 20  LITE_FULL );..  
19de0 61 73 73 65 72 74 28 20 70 46 69 6c 65 20 29 3b  assert( pFile );
19df0 0a 20 20 4f 53 54 52 41 43 45 32 28 22 53 59 4e  .  OSTRACE2("SYN
19e00 43 20 20 20 20 25 2d 33 64 5c 6e 22 2c 20 70 46  C    %-3d\n", pF
19e10 69 6c 65 2d 3e 68 29 3b 0a 20 20 72 63 20 3d 20  ile->h);.  rc = 
19e20 66 75 6c 6c 5f 66 73 79 6e 63 28 70 46 69 6c 65  full_fsync(pFile
19e30 2d 3e 68 2c 20 69 73 46 75 6c 6c 73 79 6e 63 2c  ->h, isFullsync,
19e40 20 69 73 44 61 74 61 4f 6e 6c 79 29 3b 0a 20 20   isDataOnly);.  
19e50 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28  SimulateIOError(
19e60 20 72 63 3d 31 20 29 3b 0a 20 20 69 66 28 20 72   rc=1 );.  if( r
19e70 63 20 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e  c ){.    pFile->
19e80 6c 61 73 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e  lastErrno = errn
19e90 6f 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  o;.    return SQ
19ea0 4c 49 54 45 5f 49 4f 45 52 52 5f 46 53 59 4e 43  LITE_IOERR_FSYNC
19eb0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 46 69 6c  ;.  }.  if( pFil
19ec0 65 2d 3e 64 69 72 66 64 3e 3d 30 20 29 7b 0a 20  e->dirfd>=0 ){. 
19ed0 20 20 20 69 6e 74 20 65 72 72 3b 0a 20 20 20 20     int err;.    
19ee0 4f 53 54 52 41 43 45 34 28 22 44 49 52 53 59 4e  OSTRACE4("DIRSYN
19ef0 43 20 25 2d 33 64 20 28 68 61 76 65 5f 66 75 6c  C %-3d (have_ful
19f00 6c 66 73 79 6e 63 3d 25 64 20 66 75 6c 6c 73 79  lfsync=%d fullsy
19f10 6e 63 3d 25 64 29 5c 6e 22 2c 20 70 46 69 6c 65  nc=%d)\n", pFile
19f20 2d 3e 64 69 72 66 64 2c 0a 20 20 20 20 20 20 20  ->dirfd,.       
19f30 20 20 20 20 20 48 41 56 45 5f 46 55 4c 4c 46 53       HAVE_FULLFS
19f40 59 4e 43 2c 20 69 73 46 75 6c 6c 73 79 6e 63 29  YNC, isFullsync)
19f50 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
19f60 5f 44 49 53 41 42 4c 45 5f 44 49 52 53 59 4e 43  _DISABLE_DIRSYNC
19f70 0a 20 20 20 20 2f 2a 20 54 68 65 20 64 69 72 65  .    /* The dire
19f80 63 74 6f 72 79 20 73 79 6e 63 20 69 73 20 6f 6e  ctory sync is on
19f90 6c 79 20 61 74 74 65 6d 70 74 65 64 20 69 66 20  ly attempted if 
19fa0 66 75 6c 6c 5f 66 73 79 6e 63 20 69 73 0a 20 20  full_fsync is.  
19fb0 20 20 2a 2a 20 74 75 72 6e 65 64 20 6f 66 66 20    ** turned off 
19fc0 6f 72 20 75 6e 61 76 61 69 6c 61 62 6c 65 2e 20  or unavailable. 
19fd0 20 49 66 20 61 20 66 75 6c 6c 5f 66 73 79 6e 63   If a full_fsync
19fe0 20 6f 63 63 75 72 72 65 64 20 61 62 6f 76 65 2c   occurred above,
19ff0 0a 20 20 20 20 2a 2a 20 74 68 65 6e 20 74 68 65  .    ** then the
1a000 20 64 69 72 65 63 74 6f 72 79 20 73 79 6e 63 20   directory sync 
1a010 69 73 20 73 75 70 65 72 66 6c 75 6f 75 73 2e 0a  is superfluous..
1a020 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 28      */.    if( (
1a030 21 48 41 56 45 5f 46 55 4c 4c 46 53 59 4e 43 20  !HAVE_FULLFSYNC 
1a040 7c 7c 20 21 69 73 46 75 6c 6c 73 79 6e 63 29 20  || !isFullsync) 
1a050 26 26 20 66 75 6c 6c 5f 66 73 79 6e 63 28 70 46  && full_fsync(pF
1a060 69 6c 65 2d 3e 64 69 72 66 64 2c 30 2c 30 29 20  ile->dirfd,0,0) 
1a070 29 7b 0a 20 20 20 20 20 20 20 2f 2a 0a 20 20 20  ){.       /*.   
1a080 20 20 20 20 2a 2a 20 57 65 20 68 61 76 65 20 72      ** We have r
1a090 65 63 65 69 76 65 64 20 6d 75 6c 74 69 70 6c 65  eceived multiple
1a0a0 20 72 65 70 6f 72 74 73 20 6f 66 20 66 73 79 6e   reports of fsyn
1a0b0 63 28 29 20 72 65 74 75 72 6e 69 6e 67 0a 20 20  c() returning.  
1a0c0 20 20 20 20 20 2a 2a 20 65 72 72 6f 72 73 20 77       ** errors w
1a0d0 68 65 6e 20 61 70 70 6c 69 65 64 20 74 6f 20 64  hen applied to d
1a0e0 69 72 65 63 74 6f 72 69 65 73 20 6f 6e 20 63 65  irectories on ce
1a0f0 72 74 61 69 6e 20 66 69 6c 65 20 73 79 73 74 65  rtain file syste
1a100 6d 73 2e 0a 20 20 20 20 20 20 20 2a 2a 20 41 20  ms..       ** A 
1a110 66 61 69 6c 65 64 20 64 69 72 65 63 74 6f 72 79  failed directory
1a120 20 73 79 6e 63 20 69 73 20 6e 6f 74 20 61 20 62   sync is not a b
1a130 69 67 20 64 65 61 6c 2e 20 20 53 6f 20 69 74 20  ig deal.  So it 
1a140 73 65 65 6d 73 0a 20 20 20 20 20 20 20 2a 2a 20  seems.       ** 
1a150 62 65 74 74 65 72 20 74 6f 20 69 67 6e 6f 72 65  better to ignore
1a160 20 74 68 65 20 65 72 72 6f 72 2e 20 20 54 69 63   the error.  Tic
1a170 6b 65 74 20 23 31 36 35 37 0a 20 20 20 20 20 20  ket #1657.      
1a180 20 2a 2f 0a 20 20 20 20 20 20 20 2f 2a 20 70 46   */.       /* pF
1a190 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d  ile->lastErrno =
1a1a0 20 65 72 72 6e 6f 3b 20 2a 2f 0a 20 20 20 20 20   errno; */.     
1a1b0 20 20 2f 2a 20 72 65 74 75 72 6e 20 53 51 4c 49    /* return SQLI
1a1c0 54 45 5f 49 4f 45 52 52 3b 20 2a 2f 0a 20 20 20  TE_IOERR; */.   
1a1d0 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 65 72   }.#endif.    er
1a1e0 72 20 3d 20 63 6c 6f 73 65 28 70 46 69 6c 65 2d  r = close(pFile-
1a1f0 3e 64 69 72 66 64 29 3b 20 2f 2a 20 4f 6e 6c 79  >dirfd); /* Only
1a200 20 6e 65 65 64 20 74 6f 20 73 79 6e 63 20 6f 6e   need to sync on
1a210 63 65 2c 20 73 6f 20 63 6c 6f 73 65 20 74 68 65  ce, so close the
1a220 20 2a 2f 0a 20 20 20 20 69 66 28 20 65 72 72 3d   */.    if( err=
1a230 3d 30 20 29 7b 20 20 20 20 20 20 20 20 20 20 20  =0 ){           
1a240 20 20 20 2f 2a 20 64 69 72 65 63 74 6f 72 79 20     /* directory 
1a250 77 68 65 6e 20 77 65 20 61 72 65 20 64 6f 6e 65  when we are done
1a260 20 2a 2f 0a 20 20 20 20 20 20 70 46 69 6c 65 2d   */.      pFile-
1a270 3e 64 69 72 66 64 20 3d 20 2d 31 3b 0a 20 20 20  >dirfd = -1;.   
1a280 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 46   }else{.      pF
1a290 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d  ile->lastErrno =
1a2a0 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20 72 63   errno;.      rc
1a2b0 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f   = SQLITE_IOERR_
1a2c0 44 49 52 5f 43 4c 4f 53 45 3b 0a 20 20 20 20 7d  DIR_CLOSE;.    }
1a2d0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
1a2e0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72 75 6e 63  ;.}../*.** Trunc
1a2f0 61 74 65 20 61 6e 20 6f 70 65 6e 20 66 69 6c 65  ate an open file
1a300 20 74 6f 20 61 20 73 70 65 63 69 66 69 65 64 20   to a specified 
1a310 73 69 7a 65 0a 2a 2f 0a 73 74 61 74 69 63 20 69  size.*/.static i
1a320 6e 74 20 75 6e 69 78 54 72 75 6e 63 61 74 65 28  nt unixTruncate(
1a330 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64  sqlite3_file *id
1a340 2c 20 69 36 34 20 6e 42 79 74 65 29 7b 0a 20 20  , i64 nByte){.  
1a350 69 6e 74 20 72 63 3b 0a 20 20 61 73 73 65 72 74  int rc;.  assert
1a360 28 20 69 64 20 29 3b 0a 20 20 53 69 6d 75 6c 61  ( id );.  Simula
1a370 74 65 49 4f 45 72 72 6f 72 28 20 72 65 74 75 72  teIOError( retur
1a380 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 54  n SQLITE_IOERR_T
1a390 52 55 4e 43 41 54 45 20 29 3b 0a 20 20 72 63 20  RUNCATE );.  rc 
1a3a0 3d 20 66 74 72 75 6e 63 61 74 65 28 28 28 75 6e  = ftruncate(((un
1a3b0 69 78 46 69 6c 65 2a 29 69 64 29 2d 3e 68 2c 20  ixFile*)id)->h, 
1a3c0 28 6f 66 66 5f 74 29 6e 42 79 74 65 29 3b 0a 20  (off_t)nByte);. 
1a3d0 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 28   if( rc ){.    (
1a3e0 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 29 2d 3e  (unixFile*)id)->
1a3f0 6c 61 73 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e  lastErrno = errn
1a400 6f 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  o;.    return SQ
1a410 4c 49 54 45 5f 49 4f 45 52 52 5f 54 52 55 4e 43  LITE_IOERR_TRUNC
1a420 41 54 45 3b 0a 20 20 7d 65 6c 73 65 7b 0a 23 69  ATE;.  }else{.#i
1a430 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 20 20 20  fndef NDEBUG.   
1a440 20 2f 2a 20 49 66 20 77 65 20 61 72 65 20 64 6f   /* If we are do
1a450 69 6e 67 20 61 20 6e 6f 72 6d 61 6c 20 77 72 69  ing a normal wri
1a460 74 65 20 74 6f 20 61 20 64 61 74 61 62 61 73 65  te to a database
1a470 20 66 69 6c 65 20 28 61 73 20 6f 70 70 6f 73 65   file (as oppose
1a480 64 20 74 6f 0a 20 20 20 20 2a 2a 20 64 6f 69 6e  d to.    ** doin
1a490 67 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20  g a hot-journal 
1a4a0 72 6f 6c 6c 62 61 63 6b 20 6f 72 20 61 20 77 72  rollback or a wr
1a4b0 69 74 65 20 74 6f 20 73 6f 6d 65 20 66 69 6c 65  ite to some file
1a4c0 20 6f 74 68 65 72 20 74 68 61 6e 20 61 0a 20 20   other than a.  
1a4d0 20 20 2a 2a 20 6e 6f 72 6d 61 6c 20 64 61 74 61    ** normal data
1a4e0 62 61 73 65 20 66 69 6c 65 29 20 61 6e 64 20 77  base file) and w
1a4f0 65 20 74 72 75 6e 63 61 74 65 20 74 68 65 20 66  e truncate the f
1a500 69 6c 65 20 74 6f 20 7a 65 72 6f 20 6c 65 6e 67  ile to zero leng
1a510 74 68 2c 0a 20 20 20 20 2a 2a 20 74 68 61 74 20  th,.    ** that 
1a520 65 66 66 65 63 74 69 76 65 6c 79 20 75 70 64 61  effectively upda
1a530 74 65 73 20 74 68 65 20 63 68 61 6e 67 65 20 63  tes the change c
1a540 6f 75 6e 74 65 72 2e 20 20 54 68 69 73 20 6d 69  ounter.  This mi
1a550 67 68 74 20 68 61 70 70 65 6e 0a 20 20 20 20 2a  ght happen.    *
1a560 2a 20 77 68 65 6e 20 72 65 73 74 6f 72 69 6e 67  * when restoring
1a570 20 61 20 64 61 74 61 62 61 73 65 20 75 73 69 6e   a database usin
1a580 67 20 74 68 65 20 62 61 63 6b 75 70 20 41 50 49  g the backup API
1a590 20 66 72 6f 6d 20 61 20 7a 65 72 6f 2d 6c 65 6e   from a zero-len
1a5a0 67 74 68 0a 20 20 20 20 2a 2a 20 73 6f 75 72 63  gth.    ** sourc
1a5b0 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  e..    */.    if
1a5c0 28 20 28 28 75 6e 69 78 46 69 6c 65 2a 29 69 64  ( ((unixFile*)id
1a5d0 29 2d 3e 69 6e 4e 6f 72 6d 61 6c 57 72 69 74 65  )->inNormalWrite
1a5e0 20 26 26 20 6e 42 79 74 65 3d 3d 30 20 29 7b 0a   && nByte==0 ){.
1a5f0 20 20 20 20 20 20 28 28 75 6e 69 78 46 69 6c 65        ((unixFile
1a600 2a 29 69 64 29 2d 3e 74 72 61 6e 73 43 6e 74 72  *)id)->transCntr
1a610 43 68 6e 67 20 3d 20 31 3b 0a 20 20 20 20 7d 0a  Chng = 1;.    }.
1a620 23 65 6e 64 69 66 0a 0a 20 20 20 20 72 65 74 75  #endif..    retu
1a630 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
1a640 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 74 65 72  }.}../*.** Deter
1a650 6d 69 6e 65 20 74 68 65 20 63 75 72 72 65 6e 74  mine the current
1a660 20 73 69 7a 65 20 6f 66 20 61 20 66 69 6c 65 20   size of a file 
1a670 69 6e 20 62 79 74 65 73 0a 2a 2f 0a 73 74 61 74  in bytes.*/.stat
1a680 69 63 20 69 6e 74 20 75 6e 69 78 46 69 6c 65 53  ic int unixFileS
1a690 69 7a 65 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  ize(sqlite3_file
1a6a0 20 2a 69 64 2c 20 69 36 34 20 2a 70 53 69 7a 65   *id, i64 *pSize
1a6b0 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 73  ){.  int rc;.  s
1a6c0 74 72 75 63 74 20 73 74 61 74 20 62 75 66 3b 0a  truct stat buf;.
1a6d0 20 20 61 73 73 65 72 74 28 20 69 64 20 29 3b 0a    assert( id );.
1a6e0 20 20 72 63 20 3d 20 66 73 74 61 74 28 28 28 75    rc = fstat(((u
1a6f0 6e 69 78 46 69 6c 65 2a 29 69 64 29 2d 3e 68 2c  nixFile*)id)->h,
1a700 20 26 62 75 66 29 3b 0a 20 20 53 69 6d 75 6c 61   &buf);.  Simula
1a710 74 65 49 4f 45 72 72 6f 72 28 20 72 63 3d 31 20  teIOError( rc=1 
1a720 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 30 20 29  );.  if( rc!=0 )
1a730 7b 0a 20 20 20 20 28 28 75 6e 69 78 46 69 6c 65  {.    ((unixFile
1a740 2a 29 69 64 29 2d 3e 6c 61 73 74 45 72 72 6e 6f  *)id)->lastErrno
1a750 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 72 65   = errno;.    re
1a760 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52  turn SQLITE_IOER
1a770 52 5f 46 53 54 41 54 3b 0a 20 20 7d 0a 20 20 2a  R_FSTAT;.  }.  *
1a780 70 53 69 7a 65 20 3d 20 62 75 66 2e 73 74 5f 73  pSize = buf.st_s
1a790 69 7a 65 3b 0a 0a 20 20 2f 2a 20 57 68 65 6e 20  ize;..  /* When 
1a7a0 6f 70 65 6e 69 6e 67 20 61 20 7a 65 72 6f 2d 73  opening a zero-s
1a7b0 69 7a 65 20 64 61 74 61 62 61 73 65 2c 20 74 68  ize database, th
1a7c0 65 20 66 69 6e 64 4c 6f 63 6b 49 6e 66 6f 28 29  e findLockInfo()
1a7d0 20 70 72 6f 63 65 64 75 72 65 0a 20 20 2a 2a 20   procedure.  ** 
1a7e0 77 72 69 74 65 73 20 61 20 73 69 6e 67 6c 65 20  writes a single 
1a7f0 62 79 74 65 20 69 6e 74 6f 20 74 68 61 74 20 66  byte into that f
1a800 69 6c 65 20 69 6e 20 6f 72 64 65 72 20 74 6f 20  ile in order to 
1a810 77 6f 72 6b 20 61 72 6f 75 6e 64 20 61 20 62 75  work around a bu
1a820 67 0a 20 20 2a 2a 20 69 6e 20 74 68 65 20 4f 53  g.  ** in the OS
1a830 2d 58 20 6d 73 64 6f 73 20 66 69 6c 65 73 79 73  -X msdos filesys
1a840 74 65 6d 2e 20 20 49 6e 20 6f 72 64 65 72 20 74  tem.  In order t
1a850 6f 20 61 76 6f 69 64 20 70 72 6f 62 6c 65 6d 73  o avoid problems
1a860 20 77 69 74 68 20 75 70 70 65 72 0a 20 20 2a 2a   with upper.  **
1a870 20 6c 61 79 65 72 73 2c 20 77 65 20 6e 65 65 64   layers, we need
1a880 20 74 6f 20 72 65 70 6f 72 74 20 74 68 69 73 20   to report this 
1a890 66 69 6c 65 20 73 69 7a 65 20 61 73 20 7a 65 72  file size as zer
1a8a0 6f 20 65 76 65 6e 20 74 68 6f 75 67 68 20 69 74  o even though it
1a8b0 20 69 73 0a 20 20 2a 2a 20 72 65 61 6c 6c 79 20   is.  ** really 
1a8c0 31 2e 20 20 20 54 69 63 6b 65 74 20 23 33 32 36  1.   Ticket #326
1a8d0 30 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 2a 70  0..  */.  if( *p
1a8e0 53 69 7a 65 3d 3d 31 20 29 20 2a 70 53 69 7a 65  Size==1 ) *pSize
1a8f0 20 3d 20 30 3b 0a 0a 0a 20 20 72 65 74 75 72 6e   = 0;...  return
1a900 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23   SQLITE_OK;.}..#
1a910 69 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  if SQLITE_ENABLE
1a920 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 26  _LOCKING_STYLE &
1a930 26 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c  & defined(__APPL
1a940 45 5f 5f 29 0a 2f 2a 0a 2a 2a 20 48 61 6e 64 6c  E__)./*.** Handl
1a950 65 72 20 66 6f 72 20 70 72 6f 78 79 2d 6c 6f 63  er for proxy-loc
1a960 6b 69 6e 67 20 66 69 6c 65 2d 63 6f 6e 74 72 6f  king file-contro
1a970 6c 20 76 65 72 62 73 2e 20 20 44 65 66 69 6e 65  l verbs.  Define
1a980 64 20 62 65 6c 6f 77 20 69 6e 20 74 68 65 0a 2a  d below in the.*
1a990 2a 20 70 72 6f 78 79 69 6e 67 20 6c 6f 63 6b 69  * proxying locki
1a9a0 6e 67 20 64 69 76 69 73 69 6f 6e 2e 0a 2a 2f 0a  ng division..*/.
1a9b0 73 74 61 74 69 63 20 69 6e 74 20 70 72 6f 78 79  static int proxy
1a9c0 46 69 6c 65 43 6f 6e 74 72 6f 6c 28 73 71 6c 69  FileControl(sqli
1a9d0 74 65 33 5f 66 69 6c 65 2a 2c 69 6e 74 2c 76 6f  te3_file*,int,vo
1a9e0 69 64 2a 29 3b 0a 23 65 6e 64 69 66 0a 0a 0a 2f  id*);.#endif.../
1a9f0 2a 0a 2a 2a 20 49 6e 66 6f 72 6d 61 74 69 6f 6e  *.** Information
1aa00 20 61 6e 64 20 63 6f 6e 74 72 6f 6c 20 6f 66 20   and control of 
1aa10 61 6e 20 6f 70 65 6e 20 66 69 6c 65 20 68 61 6e  an open file han
1aa20 64 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  dle..*/.static i
1aa30 6e 74 20 75 6e 69 78 46 69 6c 65 43 6f 6e 74 72  nt unixFileContr
1aa40 6f 6c 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  ol(sqlite3_file 
1aa50 2a 69 64 2c 20 69 6e 74 20 6f 70 2c 20 76 6f 69  *id, int op, voi
1aa60 64 20 2a 70 41 72 67 29 7b 0a 20 20 73 77 69 74  d *pArg){.  swit
1aa70 63 68 28 20 6f 70 20 29 7b 0a 20 20 20 20 63 61  ch( op ){.    ca
1aa80 73 65 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f  se SQLITE_FCNTL_
1aa90 4c 4f 43 4b 53 54 41 54 45 3a 20 7b 0a 20 20 20  LOCKSTATE: {.   
1aaa0 20 20 20 2a 28 69 6e 74 2a 29 70 41 72 67 20 3d     *(int*)pArg =
1aab0 20 28 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 29   ((unixFile*)id)
1aac0 2d 3e 6c 6f 63 6b 74 79 70 65 3b 0a 20 20 20 20  ->locktype;.    
1aad0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1aae0 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  OK;.    }.    ca
1aaf0 73 65 20 53 51 4c 49 54 45 5f 4c 41 53 54 5f 45  se SQLITE_LAST_E
1ab00 52 52 4e 4f 3a 20 7b 0a 20 20 20 20 20 20 2a 28  RRNO: {.      *(
1ab10 69 6e 74 2a 29 70 41 72 67 20 3d 20 28 28 75 6e  int*)pArg = ((un
1ab20 69 78 46 69 6c 65 2a 29 69 64 29 2d 3e 6c 61 73  ixFile*)id)->las
1ab30 74 45 72 72 6e 6f 3b 0a 20 20 20 20 20 20 72 65  tErrno;.      re
1ab40 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
1ab50 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 4e 44      }.#ifndef ND
1ab60 45 42 55 47 0a 20 20 20 20 2f 2a 20 54 68 65 20  EBUG.    /* The 
1ab70 70 61 67 65 72 20 63 61 6c 6c 73 20 74 68 69 73  pager calls this
1ab80 20 6d 65 74 68 6f 64 20 74 6f 20 73 69 67 6e 61   method to signa
1ab90 6c 20 74 68 61 74 20 69 74 20 68 61 73 20 64 6f  l that it has do
1aba0 6e 65 0a 20 20 20 20 2a 2a 20 61 20 72 6f 6c 6c  ne.    ** a roll
1abb0 62 61 63 6b 20 61 6e 64 20 74 68 61 74 20 74 68  back and that th
1abc0 65 20 64 61 74 61 62 61 73 65 20 69 73 20 74 68  e database is th
1abd0 65 72 65 66 6f 72 65 20 75 6e 63 68 61 6e 67 65  erefore unchange
1abe0 64 20 61 6e 64 0a 20 20 20 20 2a 2a 20 69 74 20  d and.    ** it 
1abf0 68 65 6e 63 65 20 69 74 20 69 73 20 4f 4b 20 66  hence it is OK f
1ac00 6f 72 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  or the transacti
1ac10 6f 6e 20 63 68 61 6e 67 65 20 63 6f 75 6e 74 65  on change counte
1ac20 72 20 74 6f 20 62 65 0a 20 20 20 20 2a 2a 20 75  r to be.    ** u
1ac30 6e 63 68 61 6e 67 65 64 2e 0a 20 20 20 20 2a 2f  nchanged..    */
1ac40 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
1ac50 5f 46 43 4e 54 4c 5f 44 42 5f 55 4e 43 48 41 4e  _FCNTL_DB_UNCHAN
1ac60 47 45 44 3a 20 7b 0a 20 20 20 20 20 20 28 28 75  GED: {.      ((u
1ac70 6e 69 78 46 69 6c 65 2a 29 69 64 29 2d 3e 64 62  nixFile*)id)->db
1ac80 55 70 64 61 74 65 20 3d 20 30 3b 0a 20 20 20 20  Update = 0;.    
1ac90 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1aca0 4f 4b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  OK;.    }.#endif
1acb0 0a 23 69 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  .#if SQLITE_ENAB
1acc0 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45  LE_LOCKING_STYLE
1acd0 20 26 26 20 64 65 66 69 6e 65 64 28 5f 5f 41 50   && defined(__AP
1ace0 50 4c 45 5f 5f 29 0a 20 20 20 20 63 61 73 65 20  PLE__).    case 
1acf0 53 51 4c 49 54 45 5f 53 45 54 5f 4c 4f 43 4b 50  SQLITE_SET_LOCKP
1ad00 52 4f 58 59 46 49 4c 45 3a 0a 20 20 20 20 63 61  ROXYFILE:.    ca
1ad10 73 65 20 53 51 4c 49 54 45 5f 47 45 54 5f 4c 4f  se SQLITE_GET_LO
1ad20 43 4b 50 52 4f 58 59 46 49 4c 45 3a 20 7b 0a 20  CKPROXYFILE: {. 
1ad30 20 20 20 20 20 72 65 74 75 72 6e 20 70 72 6f 78       return prox
1ad40 79 46 69 6c 65 43 6f 6e 74 72 6f 6c 28 69 64 2c  yFileControl(id,
1ad50 6f 70 2c 70 41 72 67 29 3b 0a 20 20 20 20 7d 0a  op,pArg);.    }.
1ad60 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
1ad70 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f  _ENABLE_LOCKING_
1ad80 53 54 59 4c 45 20 26 26 20 64 65 66 69 6e 65 64  STYLE && defined
1ad90 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 2a 2f 0a 20  (__APPLE__) */. 
1ada0 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49   }.  return SQLI
1adb0 54 45 5f 45 52 52 4f 52 3b 0a 7d 0a 0a 2f 2a 0a  TE_ERROR;.}../*.
1adc0 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 73 65  ** Return the se
1add0 63 74 6f 72 20 73 69 7a 65 20 69 6e 20 62 79 74  ctor size in byt
1ade0 65 73 20 6f 66 20 74 68 65 20 75 6e 64 65 72 6c  es of the underl
1adf0 79 69 6e 67 20 62 6c 6f 63 6b 20 64 65 76 69 63  ying block devic
1ae00 65 20 66 6f 72 0a 2a 2a 20 74 68 65 20 73 70 65  e for.** the spe
1ae10 63 69 66 69 65 64 20 66 69 6c 65 2e 20 54 68 69  cified file. Thi
1ae20 73 20 69 73 20 61 6c 6d 6f 73 74 20 61 6c 77 61  s is almost alwa
1ae30 79 73 20 35 31 32 20 62 79 74 65 73 2c 20 62 75  ys 512 bytes, bu
1ae40 74 20 6d 61 79 20 62 65 0a 2a 2a 20 6c 61 72 67  t may be.** larg
1ae50 65 72 20 66 6f 72 20 73 6f 6d 65 20 64 65 76 69  er for some devi
1ae60 63 65 73 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 69 74  ces..**.** SQLit
1ae70 65 20 63 6f 64 65 20 61 73 73 75 6d 65 73 20 74  e code assumes t
1ae80 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 63 61 6e  his function can
1ae90 6e 6f 74 20 66 61 69 6c 2e 20 49 74 20 61 6c 73  not fail. It als
1aea0 6f 20 61 73 73 75 6d 65 73 20 74 68 61 74 0a 2a  o assumes that.*
1aeb0 2a 20 69 66 20 74 77 6f 20 66 69 6c 65 73 20 61  * if two files a
1aec0 72 65 20 63 72 65 61 74 65 64 20 69 6e 20 74 68  re created in th
1aed0 65 20 73 61 6d 65 20 66 69 6c 65 2d 73 79 73 74  e same file-syst
1aee0 65 6d 20 64 69 72 65 63 74 6f 72 79 20 28 69 2e  em directory (i.
1aef0 65 2e 0a 2a 2a 20 61 20 64 61 74 61 62 61 73 65  e..** a database
1af00 20 61 6e 64 20 69 74 73 20 6a 6f 75 72 6e 61 6c   and its journal
1af10 20 66 69 6c 65 29 20 74 68 61 74 20 74 68 65 20   file) that the 
1af20 73 65 63 74 6f 72 20 73 69 7a 65 20 77 69 6c 6c  sector size will
1af30 20 62 65 20 74 68 65 0a 2a 2a 20 73 61 6d 65 20   be the.** same 
1af40 66 6f 72 20 62 6f 74 68 2e 0a 2a 2f 0a 73 74 61  for both..*/.sta
1af50 74 69 63 20 69 6e 74 20 75 6e 69 78 53 65 63 74  tic int unixSect
1af60 6f 72 53 69 7a 65 28 73 71 6c 69 74 65 33 5f 66  orSize(sqlite3_f
1af70 69 6c 65 20 2a 4e 6f 74 55 73 65 64 29 7b 0a 20  ile *NotUsed){. 
1af80 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
1af90 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20 72 65  R(NotUsed);.  re
1afa0 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 45 46 41  turn SQLITE_DEFA
1afb0 55 4c 54 5f 53 45 43 54 4f 52 5f 53 49 5a 45 3b  ULT_SECTOR_SIZE;
1afc0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
1afd0 20 74 68 65 20 64 65 76 69 63 65 20 63 68 61 72   the device char
1afe0 61 63 74 65 72 69 73 74 69 63 73 20 66 6f 72 20  acteristics for 
1aff0 74 68 65 20 66 69 6c 65 2e 20 54 68 69 73 20 69  the file. This i
1b000 73 20 61 6c 77 61 79 73 20 30 20 66 6f 72 20 75  s always 0 for u
1b010 6e 69 78 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  nix..*/.static i
1b020 6e 74 20 75 6e 69 78 44 65 76 69 63 65 43 68 61  nt unixDeviceCha
1b030 72 61 63 74 65 72 69 73 74 69 63 73 28 73 71 6c  racteristics(sql
1b040 69 74 65 33 5f 66 69 6c 65 20 2a 4e 6f 74 55 73  ite3_file *NotUs
1b050 65 64 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41  ed){.  UNUSED_PA
1b060 52 41 4d 45 54 45 52 28 4e 6f 74 55 73 65 64 29  RAMETER(NotUsed)
1b070 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  ;.  return 0;.}.
1b080 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
1b090 4f 4d 49 54 5f 57 41 4c 0a 0a 0a 2f 2a 0a 2a 2a  OMIT_WAL.../*.**
1b0a0 20 4f 62 6a 65 63 74 20 75 73 65 64 20 74 6f 20   Object used to 
1b0b0 72 65 70 72 65 73 65 6e 74 20 61 20 73 69 6e 67  represent a sing
1b0c0 6c 65 20 66 69 6c 65 20 6f 70 65 6e 65 64 20 61  le file opened a
1b0d0 6e 64 20 6d 6d 61 70 70 65 64 20 74 6f 20 70 72  nd mmapped to pr
1b0e0 6f 76 69 64 65 0a 2a 2a 20 73 68 61 72 65 64 20  ovide.** shared 
1b0f0 6d 65 6d 6f 72 79 2e 20 20 57 68 65 6e 20 6d 75  memory.  When mu
1b100 6c 74 69 70 6c 65 20 74 68 72 65 61 64 73 20 61  ltiple threads a
1b110 6c 6c 20 72 65 66 65 72 65 6e 63 65 20 74 68 65  ll reference the
1b120 20 73 61 6d 65 0a 2a 2a 20 6c 6f 67 2d 73 75 6d   same.** log-sum
1b130 6d 61 72 79 2c 20 65 61 63 68 20 74 68 72 65 61  mary, each threa
1b140 64 20 68 61 73 20 69 74 73 20 6f 77 6e 20 75 6e  d has its own un
1b150 69 78 46 69 6c 65 20 6f 62 6a 65 63 74 2c 20 62  ixFile object, b
1b160 75 74 20 74 68 65 79 20 61 6c 6c 0a 2a 2a 20 70  ut they all.** p
1b170 6f 69 6e 74 20 74 6f 20 61 20 73 69 6e 67 6c 65  oint to a single
1b180 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 69   instance of thi
1b190 73 20 6f 62 6a 65 63 74 2e 20 20 49 6e 20 6f 74  s object.  In ot
1b1a0 68 65 72 20 77 6f 72 64 73 2c 20 65 61 63 68 0a  her words, each.
1b1b0 2a 2a 20 6c 6f 67 2d 73 75 6d 6d 61 72 79 20 69  ** log-summary i
1b1c0 73 20 6f 70 65 6e 65 64 20 6f 6e 6c 79 20 6f 6e  s opened only on
1b1d0 63 65 20 70 65 72 20 70 72 6f 63 65 73 73 2e 0a  ce per process..
1b1e0 2a 2a 0a 2a 2a 20 75 6e 69 78 4d 75 74 65 78 48  **.** unixMutexH
1b1f0 65 6c 64 28 29 20 6d 75 73 74 20 62 65 20 74 72  eld() must be tr
1b200 75 65 20 77 68 65 6e 20 63 72 65 61 74 69 6e 67  ue when creating
1b210 20 6f 72 20 64 65 73 74 72 6f 79 69 6e 67 0a 2a   or destroying.*
1b220 2a 20 74 68 69 73 20 6f 62 6a 65 63 74 20 6f 72  * this object or
1b230 20 77 68 69 6c 65 20 72 65 61 64 69 6e 67 20 6f   while reading o
1b240 72 20 77 72 69 74 69 6e 67 20 74 68 65 20 66 6f  r writing the fo
1b250 6c 6c 6f 77 69 6e 67 20 66 69 65 6c 64 73 3a 0a  llowing fields:.
1b260 2a 2a 0a 2a 2a 20 20 20 20 20 20 6e 52 65 66 0a  **.**      nRef.
1b270 2a 2a 20 20 20 20 20 20 70 4e 65 78 74 20 0a 2a  **      pNext .*
1b280 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69  *.** The followi
1b290 6e 67 20 66 69 65 6c 64 73 20 61 72 65 20 72 65  ng fields are re
1b2a0 61 64 2d 6f 6e 6c 79 20 61 66 74 65 72 20 74 68  ad-only after th
1b2b0 65 20 6f 62 6a 65 63 74 20 69 73 20 63 72 65 61  e object is crea
1b2c0 74 65 64 3a 0a 2a 2a 20 0a 2a 2a 20 20 20 20 20  ted:.** .**     
1b2d0 20 66 69 64 0a 2a 2a 20 20 20 20 20 20 7a 46 69   fid.**      zFi
1b2e0 6c 65 6e 61 6d 65 0a 2a 2a 0a 2a 2a 20 45 69 74  lename.**.** Eit
1b2f0 68 65 72 20 75 6e 69 78 53 68 6d 46 69 6c 65 2e  her unixShmFile.
1b300 6d 75 74 65 78 20 6d 75 73 74 20 62 65 20 68 65  mutex must be he
1b310 6c 64 20 6f 72 20 75 6e 69 78 53 68 6d 46 69 6c  ld or unixShmFil
1b320 65 2e 6e 52 65 66 3d 3d 30 20 61 6e 64 0a 2a 2a  e.nRef==0 and.**
1b330 20 75 6e 69 78 4d 75 74 65 78 48 65 6c 64 28 29   unixMutexHeld()
1b340 20 69 73 20 74 72 75 65 20 77 68 65 6e 20 72 65   is true when re
1b350 61 64 69 6e 67 20 6f 72 20 77 72 69 74 69 6e 67  ading or writing
1b360 20 61 6e 79 20 6f 74 68 65 72 20 66 69 65 6c 64   any other field
1b370 0a 2a 2a 20 69 6e 20 74 68 69 73 20 73 74 72 75  .** in this stru
1b380 63 74 75 72 65 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20  cture..**.** To 
1b390 61 76 6f 69 64 20 64 65 61 64 6c 6f 63 6b 73 2c  avoid deadlocks,
1b3a0 20 6d 75 74 65 78 20 61 6e 64 20 6d 75 74 65 78   mutex and mutex
1b3b0 42 75 66 20 61 72 65 20 61 6c 77 61 79 73 20 72  Buf are always r
1b3c0 65 6c 65 61 73 65 64 20 69 6e 20 74 68 65 0a 2a  eleased in the.*
1b3d0 2a 20 72 65 76 65 72 73 65 20 6f 72 64 65 72 20  * reverse order 
1b3e0 74 68 61 74 20 74 68 65 79 20 61 72 65 20 61 63  that they are ac
1b3f0 71 75 69 72 65 64 2e 20 20 6d 75 74 65 78 42 75  quired.  mutexBu
1b400 66 20 69 73 20 61 6c 77 61 79 73 20 61 63 71 75  f is always acqu
1b410 69 72 65 64 0a 2a 2a 20 66 69 72 73 74 20 61 6e  ired.** first an
1b420 64 20 72 65 6c 65 61 73 65 64 20 6c 61 73 74 2e  d released last.
1b430 20 20 54 68 69 73 20 69 6e 76 61 72 69 61 6e 74    This invariant
1b440 20 69 73 20 63 68 65 63 6b 20 62 79 20 61 73 73   is check by ass
1b450 65 72 74 69 6e 67 0a 2a 2a 20 73 71 6c 69 74 65  erting.** sqlite
1b460 33 5f 6d 75 74 65 78 5f 6e 6f 74 68 65 6c 64 28  3_mutex_notheld(
1b470 29 20 6f 6e 20 6d 75 74 65 78 20 77 68 65 6e 65  ) on mutex whene
1b480 76 65 72 20 6d 75 74 65 78 42 75 66 20 69 73 20  ver mutexBuf is 
1b490 61 63 71 75 69 72 65 64 20 6f 72 0a 2a 2a 20 72  acquired or.** r
1b4a0 65 6c 65 61 73 65 64 2e 0a 2a 2f 0a 73 74 72 75  eleased..*/.stru
1b4b0 63 74 20 75 6e 69 78 53 68 6d 46 69 6c 65 20 7b  ct unixShmFile {
1b4c0 0a 20 20 73 74 72 75 63 74 20 75 6e 69 78 46 69  .  struct unixFi
1b4d0 6c 65 49 64 20 66 69 64 3b 20 20 20 20 20 2f 2a  leId fid;     /*
1b4e0 20 55 6e 69 71 75 65 20 66 69 6c 65 20 69 64 65   Unique file ide
1b4f0 6e 74 69 66 69 65 72 20 2a 2f 0a 20 20 73 71 6c  ntifier */.  sql
1b500 69 74 65 33 5f 6d 75 74 65 78 20 2a 6d 75 74 65  ite3_mutex *mute
1b510 78 3b 20 20 20 20 20 20 2f 2a 20 4d 75 74 65 78  x;      /* Mutex
1b520 20 74 6f 20 61 63 63 65 73 73 20 74 68 69 73 20   to access this 
1b530 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 73 71 6c 69  object */.  sqli
1b540 74 65 33 5f 6d 75 74 65 78 20 2a 6d 75 74 65 78  te3_mutex *mutex
1b550 42 75 66 3b 20 20 20 2f 2a 20 4d 75 74 65 78 20  Buf;   /* Mutex 
1b560 74 6f 20 61 63 63 65 73 73 20 7a 42 75 66 5b 5d  to access zBuf[]
1b570 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 46 69 6c   */.  char *zFil
1b580 65 6e 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20  ename;          
1b590 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20   /* Name of the 
1b5a0 6d 6d 61 70 70 65 64 20 66 69 6c 65 20 2a 2f 0a  mmapped file */.
1b5b0 20 20 69 6e 74 20 68 3b 20 20 20 20 20 20 20 20    int h;        
1b5c0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1b5d0 4f 70 65 6e 20 66 69 6c 65 20 64 65 73 63 72 69  Open file descri
1b5e0 70 74 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 73 7a  ptor */.  int sz
1b5f0 4d 61 70 3b 20 20 20 20 20 20 20 20 20 20 20 20  Map;            
1b600 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20       /* Size of 
1b610 74 68 65 20 6d 61 70 70 69 6e 67 20 6f 66 20 66  the mapping of f
1b620 69 6c 65 20 69 6e 74 6f 20 6d 65 6d 6f 72 79 20  ile into memory 
1b630 2a 2f 0a 20 20 63 68 61 72 20 2a 70 4d 4d 61 70  */.  char *pMMap
1b640 42 75 66 3b 20 20 20 20 20 20 20 20 20 20 20 20  Buf;            
1b650 2f 2a 20 57 68 65 72 65 20 63 75 72 72 65 6e 74  /* Where current
1b660 6c 79 20 6d 6d 61 70 70 65 64 28 29 2e 20 20 4e  ly mmapped().  N
1b670 55 4c 4c 20 69 66 20 75 6e 6d 61 70 70 65 64 20  ULL if unmapped 
1b680 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 66 3b 20 20  */.  int nRef;  
1b690 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b6a0 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 75 6e 69  /* Number of uni
1b6b0 78 53 68 6d 20 6f 62 6a 65 63 74 73 20 70 6f 69  xShm objects poi
1b6c0 6e 74 69 6e 67 20 74 6f 20 74 68 69 73 20 2a 2f  nting to this */
1b6d0 0a 20 20 75 6e 69 78 53 68 6d 20 2a 70 46 69 72  .  unixShm *pFir
1b6e0 73 74 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  st;           /*
1b6f0 20 41 6c 6c 20 75 6e 69 78 53 68 6d 20 6f 62 6a   All unixShm obj
1b700 65 63 74 73 20 70 6f 69 6e 74 69 6e 67 20 74 6f  ects pointing to
1b710 20 74 68 69 73 20 2a 2f 0a 20 20 75 6e 69 78 53   this */.  unixS
1b720 68 6d 46 69 6c 65 20 2a 70 4e 65 78 74 3b 20 20  hmFile *pNext;  
1b730 20 20 20 20 20 20 2f 2a 20 4e 65 78 74 20 69 6e        /* Next in
1b740 20 6c 69 73 74 20 6f 66 20 61 6c 6c 20 75 6e 69   list of all uni
1b750 78 53 68 6d 46 69 6c 65 20 6f 62 6a 65 63 74 73  xShmFile objects
1b760 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54   */.#ifdef SQLIT
1b770 45 5f 44 45 42 55 47 0a 20 20 75 38 20 65 78 63  E_DEBUG.  u8 exc
1b780 6c 4d 61 73 6b 3b 20 20 20 20 20 20 20 20 20 20  lMask;          
1b790 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20       /* Mask of 
1b7a0 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 73 20  exclusive locks 
1b7b0 68 65 6c 64 20 2a 2f 0a 20 20 75 38 20 73 68 61  held */.  u8 sha
1b7c0 72 65 64 4d 61 73 6b 3b 20 20 20 20 20 20 20 20  redMask;        
1b7d0 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20       /* Mask of 
1b7e0 73 68 61 72 65 64 20 6c 6f 63 6b 73 20 68 65 6c  shared locks hel
1b7f0 64 20 2a 2f 0a 20 20 75 38 20 6e 65 78 74 53 68  d */.  u8 nextSh
1b800 6d 49 64 3b 20 20 20 20 20 20 20 20 20 20 20 20  mId;            
1b810 20 20 2f 2a 20 4e 65 78 74 20 61 76 61 69 6c 61    /* Next availa
1b820 62 6c 65 20 75 6e 69 78 53 68 6d 2e 69 64 20 76  ble unixShm.id v
1b830 61 6c 75 65 20 2a 2f 0a 23 65 6e 64 69 66 0a 7d  alue */.#endif.}
1b840 3b 0a 0a 2f 2a 0a 2a 2a 20 41 20 67 6c 6f 62 61  ;../*.** A globa
1b850 6c 20 61 72 72 61 79 20 6f 66 20 61 6c 6c 20 75  l array of all u
1b860 6e 69 78 53 68 6d 46 69 6c 65 20 6f 62 6a 65 63  nixShmFile objec
1b870 74 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 75 6e  ts..**.** The un
1b880 69 78 4d 75 74 65 78 48 65 6c 64 28 29 20 6d 75  ixMutexHeld() mu
1b890 73 74 20 62 65 20 74 72 75 65 20 77 68 69 6c 65  st be true while
1b8a0 20 72 65 61 64 69 6e 67 20 6f 72 20 77 72 69 74   reading or writ
1b8b0 69 6e 67 20 74 68 69 73 20 6c 69 73 74 2e 0a 2a  ing this list..*
1b8c0 2f 0a 73 74 61 74 69 63 20 75 6e 69 78 53 68 6d  /.static unixShm
1b8d0 46 69 6c 65 20 2a 75 6e 69 78 53 68 6d 46 69 6c  File *unixShmFil
1b8e0 65 4c 69 73 74 20 3d 20 30 3b 0a 0a 2f 2a 0a 2a  eList = 0;../*.*
1b8f0 2a 20 53 74 72 75 63 74 75 72 65 20 75 73 65 64  * Structure used
1b900 20 69 6e 74 65 72 6e 61 6c 6c 79 20 62 79 20 74   internally by t
1b910 68 69 73 20 56 46 53 20 74 6f 20 72 65 63 6f 72  his VFS to recor
1b920 64 20 74 68 65 20 73 74 61 74 65 20 6f 66 20 61  d the state of a
1b930 6e 0a 2a 2a 20 6f 70 65 6e 20 73 68 61 72 65 64  n.** open shared
1b940 20 6d 65 6d 6f 72 79 20 63 6f 6e 6e 65 63 74 69   memory connecti
1b950 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 75 6e 69 78 53 68  on..**.** unixSh
1b960 6d 2e 70 46 69 6c 65 2d 3e 6d 75 74 65 78 20 6d  m.pFile->mutex m
1b970 75 73 74 20 62 65 20 68 65 6c 64 20 77 68 69 6c  ust be held whil
1b980 65 20 72 65 61 64 69 6e 67 20 6f 72 20 77 72 69  e reading or wri
1b990 74 69 6e 67 20 74 68 65 0a 2a 2a 20 75 6e 69 78  ting the.** unix
1b9a0 53 68 6d 2e 70 4e 65 78 74 20 61 6e 64 20 75 6e  Shm.pNext and un
1b9b0 69 78 53 68 6d 2e 6c 6f 63 6b 73 5b 5d 20 65 6c  ixShm.locks[] el
1b9c0 65 6d 65 6e 74 73 2e 0a 2a 2a 0a 2a 2a 20 54 68  ements..**.** Th
1b9d0 65 20 75 6e 69 78 53 68 6d 2e 70 46 69 6c 65 20  e unixShm.pFile 
1b9e0 65 6c 65 6d 65 6e 74 20 69 73 20 69 6e 69 74 69  element is initi
1b9f0 61 6c 69 7a 65 64 20 77 68 65 6e 20 74 68 65 20  alized when the 
1ba00 6f 62 6a 65 63 74 20 69 73 20 63 72 65 61 74 65  object is create
1ba10 64 0a 2a 2a 20 61 6e 64 20 69 73 20 72 65 61 64  d.** and is read
1ba20 2d 6f 6e 6c 79 20 74 68 65 72 65 61 66 74 65 72  -only thereafter
1ba30 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 75 6e 69 78  ..*/.struct unix
1ba40 53 68 6d 20 7b 0a 20 20 75 6e 69 78 53 68 6d 46  Shm {.  unixShmF
1ba50 69 6c 65 20 2a 70 46 69 6c 65 3b 20 20 20 20 20  ile *pFile;     
1ba60 20 20 20 2f 2a 20 54 68 65 20 75 6e 64 65 72 6c     /* The underl
1ba70 79 69 6e 67 20 75 6e 69 78 53 68 6d 46 69 6c 65  ying unixShmFile
1ba80 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 75 6e 69   object */.  uni
1ba90 78 53 68 6d 20 2a 70 4e 65 78 74 3b 20 20 20 20  xShm *pNext;    
1baa0 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 78 74 20          /* Next 
1bab0 75 6e 69 78 53 68 6d 20 77 69 74 68 20 74 68 65  unixShm with the
1bac0 20 73 61 6d 65 20 75 6e 69 78 53 68 6d 46 69 6c   same unixShmFil
1bad0 65 20 2a 2f 0a 20 20 75 38 20 6c 6f 63 6b 53 74  e */.  u8 lockSt
1bae0 61 74 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ate;            
1baf0 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 6c 6f 63    /* Current loc
1bb00 6b 20 73 74 61 74 65 20 2a 2f 0a 20 20 75 38 20  k state */.  u8 
1bb10 68 61 73 4d 75 74 65 78 3b 20 20 20 20 20 20 20  hasMutex;       
1bb20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
1bb30 69 66 20 68 6f 6c 64 69 6e 67 20 74 68 65 20 75  if holding the u
1bb40 6e 69 78 53 68 6d 46 69 6c 65 20 6d 75 74 65 78  nixShmFile mutex
1bb50 20 2a 2f 0a 20 20 75 38 20 68 61 73 4d 75 74 65   */.  u8 hasMute
1bb60 78 42 75 66 3b 20 20 20 20 20 20 20 20 20 20 20  xBuf;           
1bb70 20 2f 2a 20 54 72 75 65 20 69 66 20 68 6f 6c 64   /* True if hold
1bb80 69 6e 67 20 70 46 69 6c 65 2d 3e 6d 75 74 65 78  ing pFile->mutex
1bb90 42 75 66 20 2a 2f 0a 20 20 75 38 20 73 68 61 72  Buf */.  u8 shar
1bba0 65 64 4d 61 73 6b 3b 20 20 20 20 20 20 20 20 20  edMask;         
1bbb0 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 73      /* Mask of s
1bbc0 68 61 72 65 64 20 6c 6f 63 6b 73 20 68 65 6c 64  hared locks held
1bbd0 20 2a 2f 0a 20 20 75 38 20 65 78 63 6c 4d 61 73   */.  u8 exclMas
1bbe0 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  k;              
1bbf0 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 65 78 63 6c   /* Mask of excl
1bc00 75 73 69 76 65 20 6c 6f 63 6b 73 20 68 65 6c 64  usive locks held
1bc10 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54   */.#ifdef SQLIT
1bc20 45 5f 44 45 42 55 47 0a 20 20 75 38 20 69 64 3b  E_DEBUG.  u8 id;
1bc30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bc40 20 20 20 20 20 2f 2a 20 49 64 20 6f 66 20 74 68       /* Id of th
1bc50 69 73 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77 69  is connection wi
1bc60 74 68 20 69 74 73 20 75 6e 69 78 53 68 6d 46 69  th its unixShmFi
1bc70 6c 65 20 2a 2f 0a 23 65 6e 64 69 66 0a 7d 3b 0a  le */.#endif.};.
1bc80 0a 2f 2a 0a 2a 2a 20 53 69 7a 65 20 69 6e 63 72  ./*.** Size incr
1bc90 65 6d 65 6e 74 20 62 79 20 77 68 69 63 68 20 73  ement by which s
1bca0 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 67 72 6f  hared memory gro
1bcb0 77 73 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 53 51  ws.*/.#define SQ
1bcc0 4c 49 54 45 5f 55 4e 49 58 5f 53 48 4d 5f 49 4e  LITE_UNIX_SHM_IN
1bcd0 43 52 20 20 34 30 39 36 0a 0a 2f 2a 0a 2a 2a 20  CR  4096../*.** 
1bce0 43 6f 6e 73 74 61 6e 74 73 20 75 73 65 64 20 66  Constants used f
1bcf0 6f 72 20 6c 6f 63 6b 69 6e 67 0a 2a 2f 0a 23 64  or locking.*/.#d
1bd00 65 66 69 6e 65 20 55 4e 49 58 5f 53 48 4d 5f 42  efine UNIX_SHM_B
1bd10 41 53 45 20 20 20 20 20 20 33 32 20 20 20 20 20  ASE      32     
1bd20 20 20 20 2f 2a 20 42 79 74 65 20 6f 66 66 73 65     /* Byte offse
1bd30 74 20 6f 66 20 74 68 65 20 66 69 72 73 74 20 6c  t of the first l
1bd40 6f 63 6b 20 62 79 74 65 20 2a 2f 0a 23 64 65 66  ock byte */.#def
1bd50 69 6e 65 20 55 4e 49 58 5f 53 48 4d 5f 44 4d 53  ine UNIX_SHM_DMS
1bd60 20 20 20 20 20 20 20 30 78 30 31 20 20 20 20 20         0x01     
1bd70 20 2f 2a 20 4d 61 73 6b 20 66 6f 72 20 44 65 61   /* Mask for Dea
1bd80 64 2d 4d 61 6e 2d 53 77 69 74 63 68 20 6c 6f 63  d-Man-Switch loc
1bd90 6b 20 2a 2f 0a 23 64 65 66 69 6e 65 20 55 4e 49  k */.#define UNI
1bda0 58 5f 53 48 4d 5f 41 20 20 20 20 20 20 20 20 20  X_SHM_A         
1bdb0 30 78 31 30 20 20 20 20 20 20 2f 2a 20 4d 61 73  0x10      /* Mas
1bdc0 6b 20 66 6f 72 20 72 65 67 69 6f 6e 20 6c 6f 63  k for region loc
1bdd0 6b 73 2e 2e 2e 20 2a 2f 0a 23 64 65 66 69 6e 65  ks... */.#define
1bde0 20 55 4e 49 58 5f 53 48 4d 5f 42 20 20 20 20 20   UNIX_SHM_B     
1bdf0 20 20 20 20 30 78 32 30 0a 23 64 65 66 69 6e 65      0x20.#define
1be00 20 55 4e 49 58 5f 53 48 4d 5f 43 20 20 20 20 20   UNIX_SHM_C     
1be10 20 20 20 20 30 78 34 30 0a 23 64 65 66 69 6e 65      0x40.#define
1be20 20 55 4e 49 58 5f 53 48 4d 5f 44 20 20 20 20 20   UNIX_SHM_D     
1be30 20 20 20 20 30 78 38 30 0a 0a 23 69 66 64 65 66      0x80..#ifdef
1be40 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 2f 2a   SQLITE_DEBUG./*
1be50 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69  .** Return a poi
1be60 6e 74 65 72 20 74 6f 20 61 20 6e 75 6c 2d 74 65  nter to a nul-te
1be70 72 6d 69 6e 61 74 65 64 20 73 74 72 69 6e 67 20  rminated string 
1be80 69 6e 20 73 74 61 74 69 63 20 6d 65 6d 6f 72 79  in static memory
1be90 20 74 68 61 74 0a 2a 2a 20 64 65 73 63 72 69 62   that.** describ
1bea0 65 73 20 61 20 6c 6f 63 6b 69 6e 67 20 6d 61 73  es a locking mas
1beb0 6b 2e 20 20 54 68 65 20 73 74 72 69 6e 67 20 69  k.  The string i
1bec0 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 22 4d  s of the form "M
1bed0 53 41 42 43 44 22 20 77 69 74 68 0a 2a 2a 20 65  SABCD" with.** e
1bee0 61 63 68 20 63 68 61 72 61 63 74 65 72 20 72 65  ach character re
1bef0 70 72 65 73 65 6e 74 69 6e 67 20 61 20 6c 6f 63  presenting a loc
1bf00 6b 2e 20 20 22 4d 22 20 66 6f 72 20 4d 55 54 45  k.  "M" for MUTE
1bf10 58 2c 20 22 53 22 20 66 6f 72 20 44 4d 53 2c 20  X, "S" for DMS, 
1bf20 0a 2a 2a 20 61 6e 64 20 22 41 22 20 74 68 72 6f  .** and "A" thro
1bf30 75 67 68 20 22 44 22 20 66 6f 72 20 74 68 65 20  ugh "D" for the 
1bf40 72 65 67 69 6f 6e 20 6c 6f 63 6b 73 2e 20 20 49  region locks.  I
1bf50 66 20 61 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64  f a lock is held
1bf60 2c 20 74 68 65 0a 2a 2a 20 6c 65 74 74 65 72 20  , the.** letter 
1bf70 69 73 20 73 68 6f 77 6e 2e 20 20 49 66 20 74 68  is shown.  If th
1bf80 65 20 6c 6f 63 6b 20 69 73 20 6e 6f 74 20 68 65  e lock is not he
1bf90 6c 64 2c 20 74 68 65 20 6c 65 74 74 65 72 20 69  ld, the letter i
1bfa0 73 20 63 6f 6e 76 65 72 74 65 64 0a 2a 2a 20 74  s converted.** t
1bfb0 6f 20 22 2e 22 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  o "."..**.** Thi
1bfc0 73 20 72 6f 75 74 69 6e 65 20 69 73 20 66 6f 72  s routine is for
1bfd0 20 64 65 62 75 67 67 69 6e 67 20 70 75 72 70 6f   debugging purpo
1bfe0 73 65 73 20 6f 6e 6c 79 20 61 6e 64 20 64 6f 65  ses only and doe
1bff0 73 20 6e 6f 74 20 61 70 70 65 61 72 0a 2a 2a 20  s not appear.** 
1c000 69 6e 20 61 20 70 72 6f 64 75 63 74 69 6f 6e 20  in a production 
1c010 62 75 69 6c 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  build..*/.static
1c020 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 75 6e 69   const char *uni
1c030 78 53 68 6d 4c 6f 63 6b 53 74 72 69 6e 67 28 75  xShmLockString(u
1c040 38 20 6d 61 73 6b 29 7b 0a 20 20 73 74 61 74 69  8 mask){.  stati
1c050 63 20 63 68 61 72 20 7a 42 75 66 5b 34 38 5d 3b  c char zBuf[48];
1c060 0a 20 20 73 74 61 74 69 63 20 69 6e 74 20 69 42  .  static int iB
1c070 75 66 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 2a  uf = 0;.  char *
1c080 7a 3b 0a 0a 20 20 7a 20 3d 20 26 7a 42 75 66 5b  z;..  z = &zBuf[
1c090 69 42 75 66 5d 3b 0a 20 20 69 42 75 66 20 2b 3d  iBuf];.  iBuf +=
1c0a0 20 38 3b 0a 20 20 69 66 28 20 69 42 75 66 3e 3d   8;.  if( iBuf>=
1c0b0 73 69 7a 65 6f 66 28 7a 42 75 66 29 20 29 20 69  sizeof(zBuf) ) i
1c0c0 42 75 66 20 3d 20 30 3b 0a 0a 20 20 7a 5b 30 5d  Buf = 0;..  z[0]
1c0d0 20 3d 20 28 6d 61 73 6b 20 26 20 55 4e 49 58 5f   = (mask & UNIX_
1c0e0 53 48 4d 5f 44 4d 53 29 20 20 20 3f 20 27 53 27  SHM_DMS)   ? 'S'
1c0f0 20 3a 20 27 2e 27 3b 0a 20 20 7a 5b 31 5d 20 3d   : '.';.  z[1] =
1c100 20 28 6d 61 73 6b 20 26 20 55 4e 49 58 5f 53 48   (mask & UNIX_SH
1c110 4d 5f 41 29 20 20 20 20 20 3f 20 27 41 27 20 3a  M_A)     ? 'A' :
1c120 20 27 2e 27 3b 0a 20 20 7a 5b 32 5d 20 3d 20 28   '.';.  z[2] = (
1c130 6d 61 73 6b 20 26 20 55 4e 49 58 5f 53 48 4d 5f  mask & UNIX_SHM_
1c140 42 29 20 20 20 20 20 3f 20 27 42 27 20 3a 20 27  B)     ? 'B' : '
1c150 2e 27 3b 0a 20 20 7a 5b 33 5d 20 3d 20 28 6d 61  .';.  z[3] = (ma
1c160 73 6b 20 26 20 55 4e 49 58 5f 53 48 4d 5f 43 29  sk & UNIX_SHM_C)
1c170 20 20 20 20 20 3f 20 27 43 27 20 3a 20 27 2e 27       ? 'C' : '.'
1c180 3b 0a 20 20 7a 5b 34 5d 20 3d 20 28 6d 61 73 6b  ;.  z[4] = (mask
1c190 20 26 20 55 4e 49 58 5f 53 48 4d 5f 44 29 20 20   & UNIX_SHM_D)  
1c1a0 20 20 20 3f 20 27 44 27 20 3a 20 27 2e 27 3b 0a     ? 'D' : '.';.
1c1b0 20 20 7a 5b 35 5d 20 3d 20 30 3b 0a 20 20 72 65    z[5] = 0;.  re
1c1c0 74 75 72 6e 20 7a 3b 0a 7d 0a 23 65 6e 64 69 66  turn z;.}.#endif
1c1d0 20 2f 2a 20 53 51 4c 49 54 45 5f 44 45 42 55 47   /* SQLITE_DEBUG
1c1e0 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 41 70 70 6c 79   */../*.** Apply
1c1f0 20 70 6f 73 69 78 20 61 64 76 69 73 6f 72 79 20   posix advisory 
1c200 6c 6f 63 6b 73 20 66 6f 72 20 61 6c 6c 20 62 79  locks for all by
1c210 74 65 73 20 69 64 65 6e 74 69 66 69 65 64 20 69  tes identified i
1c220 6e 20 6c 6f 63 6b 4d 61 73 6b 2e 0a 2a 2a 0a 2a  n lockMask..**.*
1c230 2a 20 6c 6f 63 6b 4d 61 73 6b 20 6d 69 67 68 74  * lockMask might
1c240 20 63 6f 6e 74 61 69 6e 20 6d 75 6c 74 69 70 6c   contain multipl
1c250 65 20 62 69 74 73 20 62 75 74 20 61 6c 6c 20 62  e bits but all b
1c260 69 74 73 20 61 72 65 20 67 75 61 72 61 6e 74 65  its are guarante
1c270 65 64 0a 2a 2a 20 74 6f 20 62 65 20 63 6f 6e 74  ed.** to be cont
1c280 69 67 75 6f 75 73 2e 0a 2a 2a 0a 2a 2a 20 4c 6f  iguous..**.** Lo
1c290 63 6b 73 20 62 6c 6f 63 6b 20 69 66 20 74 68 65  cks block if the
1c2a0 20 6d 61 73 6b 20 69 73 20 65 78 61 63 74 6c 79   mask is exactly
1c2b0 20 55 4e 49 58 5f 53 48 4d 5f 43 20 61 6e 64 20   UNIX_SHM_C and 
1c2c0 61 72 65 20 6e 6f 6e 2d 62 6c 6f 63 6b 69 6e 67  are non-blocking
1c2d0 0a 2a 2a 20 6f 74 68 65 72 77 69 73 65 2e 0a 2a  .** otherwise..*
1c2e0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69  /.static int uni
1c2f0 78 53 68 6d 53 79 73 74 65 6d 4c 6f 63 6b 28 0a  xShmSystemLock(.
1c300 20 20 75 6e 69 78 53 68 6d 46 69 6c 65 20 2a 70    unixShmFile *p
1c310 46 69 6c 65 2c 20 20 20 2f 2a 20 41 70 70 6c 79  File,   /* Apply
1c320 20 6c 6f 63 6b 73 20 74 6f 20 74 68 69 73 20 6f   locks to this o
1c330 70 65 6e 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72  pen shared-memor
1c340 79 20 73 65 67 6d 65 6e 74 20 2a 2f 0a 20 20 69  y segment */.  i
1c350 6e 74 20 6c 6f 63 6b 54 79 70 65 2c 20 20 20 20  nt lockType,    
1c360 20 20 20 20 20 2f 2a 20 46 5f 55 4e 4c 43 4b 2c       /* F_UNLCK,
1c370 20 46 5f 52 44 4c 43 4b 2c 20 6f 72 20 46 5f 57   F_RDLCK, or F_W
1c380 52 4c 43 4b 20 2a 2f 0a 20 20 75 38 20 6c 6f 63  RLCK */.  u8 loc
1c390 6b 4d 61 73 6b 20 20 20 20 20 20 20 20 20 20 20  kMask           
1c3a0 2f 2a 20 57 68 69 63 68 20 62 79 74 65 73 20 74  /* Which bytes t
1c3b0 6f 20 6c 6f 63 6b 20 6f 72 20 75 6e 6c 6f 63 6b  o lock or unlock
1c3c0 20 2a 2f 0a 29 7b 0a 20 20 73 74 72 75 63 74 20   */.){.  struct 
1c3d0 66 6c 6f 63 6b 20 66 3b 20 20 20 20 20 20 20 2f  flock f;       /
1c3e0 2a 20 54 68 65 20 70 6f 73 69 78 20 61 64 76 69  * The posix advi
1c3f0 73 6f 72 79 20 6c 6f 63 6b 69 6e 67 20 73 74 72  sory locking str
1c400 75 63 74 75 72 65 20 2a 2f 0a 20 20 69 6e 74 20  ucture */.  int 
1c410 6c 6f 63 6b 4f 70 3b 20 20 20 20 20 20 20 20 20  lockOp;         
1c420 20 20 2f 2a 20 54 68 65 20 6f 70 63 6f 64 65 20    /* The opcode 
1c430 66 6f 72 20 66 63 6e 74 6c 28 29 20 2a 2f 0a 20  for fcntl() */. 
1c440 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20   int i;         
1c450 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74         /* Offset
1c460 20 69 6e 74 6f 20 74 68 65 20 6c 6f 63 6b 69 6e   into the lockin
1c470 67 20 62 79 74 65 20 72 61 6e 67 65 20 2a 2f 0a  g byte range */.
1c480 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20    int rc;       
1c490 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c          /* Resul
1c4a0 74 20 63 6f 64 65 20 66 6f 72 6d 20 66 63 6e 74  t code form fcnt
1c4b0 6c 28 29 20 2a 2f 0a 20 20 75 38 20 6d 61 73 6b  l() */.  u8 mask
1c4c0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
1c4d0 2a 20 4d 61 73 6b 20 6f 66 20 62 69 74 73 20 69  * Mask of bits i
1c4e0 6e 20 6c 6f 63 6b 4d 61 73 6b 20 2a 2f 0a 0a 20  n lockMask */.. 
1c4f0 20 2f 2a 20 41 63 63 65 73 73 20 74 6f 20 74 68   /* Access to th
1c500 65 20 75 6e 69 78 53 68 6d 46 69 6c 65 20 6f 62  e unixShmFile ob
1c510 6a 65 63 74 20 69 73 20 73 65 72 69 61 6c 69 7a  ject is serializ
1c520 65 64 20 62 79 20 74 68 65 20 63 61 6c 6c 65 72  ed by the caller
1c530 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 73 71   */.  assert( sq
1c540 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
1c550 28 70 46 69 6c 65 2d 3e 6d 75 74 65 78 29 20 7c  (pFile->mutex) |
1c560 7c 20 70 46 69 6c 65 2d 3e 6e 52 65 66 3d 3d 30  | pFile->nRef==0
1c570 20 29 3b 0a 0a 20 20 2f 2a 20 49 6e 69 74 69 61   );..  /* Initia
1c580 6c 69 7a 65 20 74 68 65 20 6c 6f 63 6b 69 6e 67  lize the locking
1c590 20 70 61 72 61 6d 65 74 65 72 73 20 2a 2f 0a 20   parameters */. 
1c5a0 20 6d 65 6d 73 65 74 28 26 66 2c 20 30 2c 20 73   memset(&f, 0, s
1c5b0 69 7a 65 6f 66 28 66 29 29 3b 0a 20 20 66 2e 6c  izeof(f));.  f.l
1c5c0 5f 74 79 70 65 20 3d 20 6c 6f 63 6b 54 79 70 65  _type = lockType
1c5d0 3b 0a 20 20 66 2e 6c 5f 77 68 65 6e 63 65 20 3d  ;.  f.l_whence =
1c5e0 20 53 45 45 4b 5f 53 45 54 3b 0a 20 20 69 66 28   SEEK_SET;.  if(
1c5f0 20 6c 6f 63 6b 4d 61 73 6b 3d 3d 55 4e 49 58 5f   lockMask==UNIX_
1c600 53 48 4d 5f 43 20 26 26 20 6c 6f 63 6b 54 79 70  SHM_C && lockTyp
1c610 65 21 3d 46 5f 55 4e 4c 43 4b 20 29 7b 0a 20 20  e!=F_UNLCK ){.  
1c620 20 20 6c 6f 63 6b 4f 70 20 3d 20 46 5f 53 45 54    lockOp = F_SET
1c630 4c 4b 57 3b 0a 20 20 20 20 4f 53 54 52 41 43 45  LKW;.    OSTRACE
1c640 28 28 22 53 48 4d 2d 4c 4f 43 4b 20 72 65 71 75  (("SHM-LOCK requ
1c650 65 73 74 69 6e 67 20 62 6c 6f 63 6b 69 6e 67 20  esting blocking 
1c660 6c 6f 63 6b 5c 6e 22 29 29 3b 0a 20 20 7d 65 6c  lock\n"));.  }el
1c670 73 65 7b 0a 20 20 20 20 6c 6f 63 6b 4f 70 20 3d  se{.    lockOp =
1c680 20 46 5f 53 45 54 4c 4b 3b 0a 20 20 7d 0a 0a 20   F_SETLK;.  }.. 
1c690 20 2f 2a 20 46 69 6e 64 20 74 68 65 20 66 69 72   /* Find the fir
1c6a0 73 74 20 62 69 74 20 69 6e 20 6c 6f 63 6b 4d 61  st bit in lockMa
1c6b0 73 6b 20 74 68 61 74 20 69 73 20 73 65 74 20 2a  sk that is set *
1c6c0 2f 0a 20 20 66 6f 72 28 69 3d 30 2c 20 6d 61 73  /.  for(i=0, mas
1c6d0 6b 3d 30 78 30 31 3b 20 6d 61 73 6b 21 3d 30 20  k=0x01; mask!=0 
1c6e0 26 26 20 28 6c 6f 63 6b 4d 61 73 6b 26 6d 61 73  && (lockMask&mas
1c6f0 6b 29 3d 3d 30 3b 20 6d 61 73 6b 20 3c 3c 3d 20  k)==0; mask <<= 
1c700 31 2c 20 69 2b 2b 29 7b 7d 0a 20 20 61 73 73 65  1, i++){}.  asse
1c710 72 74 28 20 6d 61 73 6b 21 3d 30 20 29 3b 0a 20  rt( mask!=0 );. 
1c720 20 66 2e 6c 5f 73 74 61 72 74 20 3d 20 69 2b 55   f.l_start = i+U
1c730 4e 49 58 5f 53 48 4d 5f 42 41 53 45 3b 0a 20 20  NIX_SHM_BASE;.  
1c740 66 2e 6c 5f 6c 65 6e 20 3d 20 31 3b 0a 0a 20 20  f.l_len = 1;..  
1c750 2f 2a 20 45 78 74 65 6e 64 20 74 68 65 20 6c 6f  /* Extend the lo
1c760 63 6b 69 6e 67 20 72 61 6e 67 65 20 66 6f 72 20  cking range for 
1c770 65 61 63 68 20 61 64 64 69 74 69 6f 6e 61 6c 20  each additional 
1c780 62 69 74 20 74 68 61 74 20 69 73 20 73 65 74 20  bit that is set 
1c790 2a 2f 0a 20 20 6d 61 73 6b 20 3c 3c 3d 20 31 3b  */.  mask <<= 1;
1c7a0 0a 20 20 77 68 69 6c 65 28 20 6d 61 73 6b 21 3d  .  while( mask!=
1c7b0 30 20 26 26 20 28 6c 6f 63 6b 4d 61 73 6b 20 26  0 && (lockMask &
1c7c0 20 6d 61 73 6b 29 21 3d 30 20 29 7b 0a 20 20 20   mask)!=0 ){.   
1c7d0 20 66 2e 6c 5f 6c 65 6e 2b 2b 3b 0a 20 20 20 20   f.l_len++;.    
1c7e0 6d 61 73 6b 20 3c 3c 3d 20 31 3b 0a 20 20 7d 0a  mask <<= 1;.  }.
1c7f0 0a 20 20 2f 2a 20 56 65 72 69 66 79 20 74 68 61  .  /* Verify tha
1c800 74 20 61 6c 6c 20 62 69 74 73 20 73 65 74 20 69  t all bits set i
1c810 6e 20 6c 6f 63 6b 4d 61 73 6b 20 61 72 65 20 63  n lockMask are c
1c820 6f 6e 74 69 67 75 6f 75 73 20 2a 2f 0a 20 20 61  ontiguous */.  a
1c830 73 73 65 72 74 28 20 6d 61 73 6b 3d 3d 30 20 7c  ssert( mask==0 |
1c840 7c 20 28 6c 6f 63 6b 4d 61 73 6b 20 26 20 7e 28  | (lockMask & ~(
1c850 6d 61 73 6b 20 7c 20 28 6d 61 73 6b 2d 31 29 29  mask | (mask-1))
1c860 29 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 41 63  )==0 );..  /* Ac
1c870 71 75 69 72 65 20 74 68 65 20 73 79 73 74 65 6d  quire the system
1c880 2d 6c 65 76 65 6c 20 6c 6f 63 6b 20 2a 2f 0a 20  -level lock */. 
1c890 20 72 63 20 3d 20 66 63 6e 74 6c 28 70 46 69 6c   rc = fcntl(pFil
1c8a0 65 2d 3e 68 2c 20 6c 6f 63 6b 4f 70 2c 20 26 66  e->h, lockOp, &f
1c8b0 29 3b 0a 20 20 72 63 20 3d 20 28 72 63 21 3d 28  );.  rc = (rc!=(
1c8c0 2d 31 29 29 20 3f 20 53 51 4c 49 54 45 5f 4f 4b  -1)) ? SQLITE_OK
1c8d0 20 3a 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a   : SQLITE_BUSY;.
1c8e0 0a 20 20 2f 2a 20 55 70 64 61 74 65 20 74 68 65  .  /* Update the
1c8f0 20 67 6c 6f 62 61 6c 20 6c 6f 63 6b 20 73 74 61   global lock sta
1c900 74 65 20 61 6e 64 20 64 6f 20 64 65 62 75 67 20  te and do debug 
1c910 74 72 61 63 69 6e 67 20 2a 2f 0a 23 69 66 64 65  tracing */.#ifde
1c920 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20  f SQLITE_DEBUG. 
1c930 20 4f 53 54 52 41 43 45 28 28 22 53 48 4d 2d 4c   OSTRACE(("SHM-L
1c940 4f 43 4b 20 22 29 29 3b 0a 20 20 69 66 28 20 72  OCK "));.  if( r
1c950 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
1c960 20 20 20 20 69 66 28 20 6c 6f 63 6b 54 79 70 65      if( lockType
1c970 3d 3d 46 5f 55 4e 4c 43 4b 20 29 7b 0a 20 20 20  ==F_UNLCK ){.   
1c980 20 20 20 4f 53 54 52 41 43 45 28 28 22 75 6e 6c     OSTRACE(("unl
1c990 6f 63 6b 20 6f 6b 22 29 29 3b 0a 20 20 20 20 20  ock ok"));.     
1c9a0 20 70 46 69 6c 65 2d 3e 65 78 63 6c 4d 61 73 6b   pFile->exclMask
1c9b0 20 26 3d 20 7e 6c 6f 63 6b 4d 61 73 6b 3b 0a 20   &= ~lockMask;. 
1c9c0 20 20 20 20 20 70 46 69 6c 65 2d 3e 73 68 61 72       pFile->shar
1c9d0 65 64 4d 61 73 6b 20 26 3d 20 7e 6c 6f 63 6b 4d  edMask &= ~lockM
1c9e0 61 73 6b 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  ask;.    }else i
1c9f0 66 28 20 6c 6f 63 6b 54 79 70 65 3d 3d 46 5f 52  f( lockType==F_R
1ca00 44 4c 43 4b 20 29 7b 0a 20 20 20 20 20 20 4f 53  DLCK ){.      OS
1ca10 54 52 41 43 45 28 28 22 72 65 61 64 2d 6c 6f 63  TRACE(("read-loc
1ca20 6b 20 6f 6b 22 29 29 3b 0a 20 20 20 20 20 20 70  k ok"));.      p
1ca30 46 69 6c 65 2d 3e 65 78 63 6c 4d 61 73 6b 20 26  File->exclMask &
1ca40 3d 20 7e 6c 6f 63 6b 4d 61 73 6b 3b 0a 20 20 20  = ~lockMask;.   
1ca50 20 20 20 70 46 69 6c 65 2d 3e 73 68 61 72 65 64     pFile->shared
1ca60 4d 61 73 6b 20 7c 3d 20 6c 6f 63 6b 4d 61 73 6b  Mask |= lockMask
1ca70 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
1ca80 20 20 20 61 73 73 65 72 74 28 20 6c 6f 63 6b 54     assert( lockT
1ca90 79 70 65 3d 3d 46 5f 57 52 4c 43 4b 20 29 3b 0a  ype==F_WRLCK );.
1caa0 20 20 20 20 20 20 4f 53 54 52 41 43 45 28 28 22        OSTRACE(("
1cab0 77 72 69 74 65 2d 6c 6f 63 6b 20 6f 6b 22 29 29  write-lock ok"))
1cac0 3b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 65  ;.      pFile->e
1cad0 78 63 6c 4d 61 73 6b 20 7c 3d 20 6c 6f 63 6b 4d  xclMask |= lockM
1cae0 61 73 6b 3b 0a 20 20 20 20 20 20 70 46 69 6c 65  ask;.      pFile
1caf0 2d 3e 73 68 61 72 65 64 4d 61 73 6b 20 26 3d 20  ->sharedMask &= 
1cb00 7e 6c 6f 63 6b 4d 61 73 6b 3b 0a 20 20 20 20 7d  ~lockMask;.    }
1cb10 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 66  .  }else{.    if
1cb20 28 20 6c 6f 63 6b 54 79 70 65 3d 3d 46 5f 55 4e  ( lockType==F_UN
1cb30 4c 43 4b 20 29 7b 0a 20 20 20 20 20 20 4f 53 54  LCK ){.      OST
1cb40 52 41 43 45 28 28 22 75 6e 6c 6f 63 6b 20 66 61  RACE(("unlock fa
1cb50 69 6c 65 64 22 29 29 3b 0a 20 20 20 20 7d 65 6c  iled"));.    }el
1cb60 73 65 20 69 66 28 20 6c 6f 63 6b 54 79 70 65 3d  se if( lockType=
1cb70 3d 46 5f 52 44 4c 43 4b 20 29 7b 0a 20 20 20 20  =F_RDLCK ){.    
1cb80 20 20 4f 53 54 52 41 43 45 28 28 22 72 65 61 64    OSTRACE(("read
1cb90 2d 6c 6f 63 6b 20 66 61 69 6c 65 64 22 29 29 3b  -lock failed"));
1cba0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
1cbb0 20 20 61 73 73 65 72 74 28 20 6c 6f 63 6b 54 79    assert( lockTy
1cbc0 70 65 3d 3d 46 5f 57 52 4c 43 4b 20 29 3b 0a 20  pe==F_WRLCK );. 
1cbd0 20 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 77       OSTRACE(("w
1cbe0 72 69 74 65 2d 6c 6f 63 6b 20 66 61 69 6c 65 64  rite-lock failed
1cbf0 22 29 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  "));.    }.  }. 
1cc00 20 4f 53 54 52 41 43 45 28 28 22 20 2d 20 63 68   OSTRACE((" - ch
1cc10 61 6e 67 65 20 72 65 71 75 65 73 74 65 64 20 25  ange requested %
1cc20 73 20 2d 20 61 66 74 65 72 77 61 72 64 73 20 25  s - afterwards %
1cc30 73 3a 25 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20  s:%s\n",.       
1cc40 20 20 20 20 75 6e 69 78 53 68 6d 4c 6f 63 6b 53      unixShmLockS
1cc50 74 72 69 6e 67 28 6c 6f 63 6b 4d 61 73 6b 29 2c  tring(lockMask),
1cc60 0a 20 20 20 20 20 20 20 20 20 20 20 75 6e 69 78  .           unix
1cc70 53 68 6d 4c 6f 63 6b 53 74 72 69 6e 67 28 70 46  ShmLockString(pF
1cc80 69 6c 65 2d 3e 73 68 61 72 65 64 4d 61 73 6b 29  ile->sharedMask)
1cc90 2c 0a 20 20 20 20 20 20 20 20 20 20 20 75 6e 69  ,.           uni
1cca0 78 53 68 6d 4c 6f 63 6b 53 74 72 69 6e 67 28 70  xShmLockString(p
1ccb0 46 69 6c 65 2d 3e 65 78 63 6c 4d 61 73 6b 29 29  File->exclMask))
1ccc0 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 72 65 74  );.#endif..  ret
1ccd0 75 72 6e 20 72 63 3b 20 20 20 20 20 20 20 20 0a  urn rc;        .
1cce0 7d 0a 0a 2f 2a 0a 2a 2a 20 46 6f 72 20 63 6f 6e  }../*.** For con
1ccf0 6e 65 63 74 69 6f 6e 20 70 2c 20 75 6e 6c 6f 63  nection p, unloc
1cd00 6b 20 61 6c 6c 20 6f 66 20 74 68 65 20 6c 6f 63  k all of the loc
1cd10 6b 73 20 69 64 65 6e 74 69 66 69 65 64 20 62 79  ks identified by
1cd20 20 74 68 65 20 75 6e 6c 6f 63 6b 4d 61 73 6b 0a   the unlockMask.
1cd30 2a 2a 20 70 61 72 61 6d 65 74 65 72 2e 0a 2a 2f  ** parameter..*/
1cd40 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78  .static int unix
1cd50 53 68 6d 55 6e 6c 6f 63 6b 28 0a 20 20 75 6e 69  ShmUnlock(.  uni
1cd60 78 53 68 6d 46 69 6c 65 20 2a 70 46 69 6c 65 2c  xShmFile *pFile,
1cd70 20 20 20 2f 2a 20 54 68 65 20 75 6e 64 65 72 6c     /* The underl
1cd80 79 69 6e 67 20 73 68 61 72 65 64 2d 6d 65 6d 6f  ying shared-memo
1cd90 72 79 20 66 69 6c 65 20 2a 2f 0a 20 20 75 6e 69  ry file */.  uni
1cda0 78 53 68 6d 20 2a 70 2c 20 20 20 20 20 20 20 20  xShm *p,        
1cdb0 20 20 20 2f 2a 20 54 68 65 20 63 6f 6e 6e 65 63     /* The connec
1cdc0 74 69 6f 6e 20 74 6f 20 62 65 20 75 6e 6c 6f 63  tion to be unloc
1cdd0 6b 65 64 20 2a 2f 0a 20 20 75 38 20 75 6e 6c 6f  ked */.  u8 unlo
1cde0 63 6b 4d 61 73 6b 20 20 20 20 20 20 20 20 20 2f  ckMask         /
1cdf0 2a 20 4d 61 73 6b 20 6f 66 20 6c 6f 63 6b 73 20  * Mask of locks 
1ce00 74 6f 20 62 65 20 75 6e 6c 6f 63 6b 65 64 20 2a  to be unlocked *
1ce10 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20  /.){.  int rc;  
1ce20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f      /* Result co
1ce30 64 65 20 2a 2f 0a 20 20 75 6e 69 78 53 68 6d 20  de */.  unixShm 
1ce40 2a 70 58 3b 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70  *pX; /* For loop
1ce50 69 6e 67 20 6f 76 65 72 20 61 6c 6c 20 73 69 62  ing over all sib
1ce60 6c 69 6e 67 20 63 6f 6e 6e 65 63 74 69 6f 6e 73  ling connections
1ce70 20 2a 2f 0a 20 20 75 38 20 61 6c 6c 4d 61 73 6b   */.  u8 allMask
1ce80 3b 20 20 2f 2a 20 55 6e 69 6f 6e 20 6f 66 20 6c  ;  /* Union of l
1ce90 6f 63 6b 73 20 68 65 6c 64 20 62 79 20 63 6f 6e  ocks held by con
1cea0 6e 65 63 74 69 6f 6e 73 20 6f 74 68 65 72 20 74  nections other t
1ceb0 68 61 6e 20 22 70 22 20 2a 2f 0a 0a 20 20 2f 2a  han "p" */..  /*
1cec0 20 41 63 63 65 73 73 20 74 6f 20 74 68 65 20 75   Access to the u
1ced0 6e 69 78 53 68 6d 46 69 6c 65 20 6f 62 6a 65 63  nixShmFile objec
1cee0 74 20 69 73 20 73 65 72 69 61 6c 69 7a 65 64 20  t is serialized 
1cef0 62 79 20 74 68 65 20 63 61 6c 6c 65 72 20 2a 2f  by the caller */
1cf00 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
1cf10 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 46  e3_mutex_held(pF
1cf20 69 6c 65 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 0a  ile->mutex) );..
1cf30 20 20 2f 2a 20 43 6f 6d 70 75 74 65 20 6c 6f 63    /* Compute loc
1cf40 6b 73 20 68 65 6c 64 20 62 79 20 73 69 62 6c 69  ks held by sibli
1cf50 6e 67 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 2a  ng connections *
1cf60 2f 0a 20 20 61 6c 6c 4d 61 73 6b 20 3d 20 30 3b  /.  allMask = 0;
1cf70 0a 20 20 66 6f 72 28 70 58 3d 70 46 69 6c 65 2d  .  for(pX=pFile-
1cf80 3e 70 46 69 72 73 74 3b 20 70 58 3b 20 70 58 3d  >pFirst; pX; pX=
1cf90 70 58 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20  pX->pNext){.    
1cfa0 69 66 28 20 70 58 3d 3d 70 20 29 20 63 6f 6e 74  if( pX==p ) cont
1cfb0 69 6e 75 65 3b 0a 20 20 20 20 61 73 73 65 72 74  inue;.    assert
1cfc0 28 20 28 70 58 2d 3e 65 78 63 6c 4d 61 73 6b 20  ( (pX->exclMask 
1cfd0 26 20 28 70 2d 3e 65 78 63 6c 4d 61 73 6b 7c 70  & (p->exclMask|p
1cfe0 2d 3e 73 68 61 72 65 64 4d 61 73 6b 29 29 3d 3d  ->sharedMask))==
1cff0 30 20 29 3b 0a 20 20 20 20 61 6c 6c 4d 61 73 6b  0 );.    allMask
1d000 20 7c 3d 20 70 58 2d 3e 73 68 61 72 65 64 4d 61   |= pX->sharedMa
1d010 73 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 55 6e  sk;.  }..  /* Un
1d020 6c 6f 63 6b 20 74 68 65 20 73 79 73 74 65 6d 2d  lock the system-
1d030 6c 65 76 65 6c 20 6c 6f 63 6b 73 20 2a 2f 0a 20  level locks */. 
1d040 20 69 66 28 20 28 75 6e 6c 6f 63 6b 4d 61 73 6b   if( (unlockMask
1d050 20 26 20 61 6c 6c 4d 61 73 6b 29 21 3d 75 6e 6c   & allMask)!=unl
1d060 6f 63 6b 4d 61 73 6b 20 29 7b 0a 20 20 20 20 72  ockMask ){.    r
1d070 63 20 3d 20 75 6e 69 78 53 68 6d 53 79 73 74 65  c = unixShmSyste
1d080 6d 4c 6f 63 6b 28 70 46 69 6c 65 2c 20 46 5f 55  mLock(pFile, F_U
1d090 4e 4c 43 4b 2c 20 75 6e 6c 6f 63 6b 4d 61 73 6b  NLCK, unlockMask
1d0a0 20 26 20 7e 61 6c 6c 4d 61 73 6b 29 3b 0a 20 20   & ~allMask);.  
1d0b0 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20  }else{.    rc = 
1d0c0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a  SQLITE_OK;.  }..
1d0d0 20 20 2f 2a 20 55 6e 64 6f 20 74 68 65 20 6c 6f    /* Undo the lo
1d0e0 63 61 6c 20 6c 6f 63 6b 73 20 2a 2f 0a 20 20 69  cal locks */.  i
1d0f0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
1d100 20 29 7b 0a 20 20 20 20 70 2d 3e 65 78 63 6c 4d   ){.    p->exclM
1d110 61 73 6b 20 26 3d 20 7e 75 6e 6c 6f 63 6b 4d 61  ask &= ~unlockMa
1d120 73 6b 3b 0a 20 20 20 20 70 2d 3e 73 68 61 72 65  sk;.    p->share
1d130 64 4d 61 73 6b 20 26 3d 20 7e 75 6e 6c 6f 63 6b  dMask &= ~unlock
1d140 4d 61 73 6b 3b 0a 20 20 7d 20 0a 20 20 72 65 74  Mask;.  } .  ret
1d150 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
1d160 20 47 65 74 20 72 65 61 64 65 72 20 6c 6f 63 6b   Get reader lock
1d170 73 20 66 6f 72 20 63 6f 6e 6e 65 63 74 69 6f 6e  s for connection
1d180 20 70 20 6f 6e 20 61 6c 6c 20 6c 6f 63 6b 73 20   p on all locks 
1d190 69 6e 20 74 68 65 20 72 65 61 64 4d 61 73 6b 20  in the readMask 
1d1a0 70 61 72 61 6d 65 74 65 72 2e 0a 2a 2f 0a 73 74  parameter..*/.st
1d1b0 61 74 69 63 20 69 6e 74 20 75 6e 69 78 53 68 6d  atic int unixShm
1d1c0 53 68 61 72 65 64 4c 6f 63 6b 28 0a 20 20 75 6e  SharedLock(.  un
1d1d0 69 78 53 68 6d 46 69 6c 65 20 2a 70 46 69 6c 65  ixShmFile *pFile
1d1e0 2c 20 20 20 2f 2a 20 54 68 65 20 75 6e 64 65 72  ,   /* The under
1d1f0 6c 79 69 6e 67 20 73 68 61 72 65 64 2d 6d 65 6d  lying shared-mem
1d200 6f 72 79 20 66 69 6c 65 20 2a 2f 0a 20 20 75 6e  ory file */.  un
1d210 69 78 53 68 6d 20 2a 70 2c 20 20 20 20 20 20 20  ixShm *p,       
1d220 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 6e 6e 65      /* The conne
1d230 63 74 69 6f 6e 20 74 6f 20 67 65 74 20 74 68 65  ction to get the
1d240 20 73 68 61 72 65 64 20 6c 6f 63 6b 73 20 2a 2f   shared locks */
1d250 0a 20 20 75 38 20 72 65 61 64 4d 61 73 6b 20 20  .  u8 readMask  
1d260 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b           /* Mask
1d270 20 6f 66 20 73 68 61 72 65 64 20 6c 6f 63 6b 73   of shared locks
1d280 20 74 6f 20 62 65 20 61 63 71 75 69 72 65 64 20   to be acquired 
1d290 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20  */.){.  int rc; 
1d2a0 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74         /* Result
1d2b0 20 63 6f 64 65 20 2a 2f 0a 20 20 75 6e 69 78 53   code */.  unixS
1d2c0 68 6d 20 2a 70 58 3b 20 20 20 2f 2a 20 46 6f 72  hm *pX;   /* For
1d2d0 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72 20 61 6c   looping over al
1d2e0 6c 20 73 69 62 6c 69 6e 67 20 63 6f 6e 6e 65 63  l sibling connec
1d2f0 74 69 6f 6e 73 20 2a 2f 0a 20 20 75 38 20 61 6c  tions */.  u8 al
1d300 6c 53 68 61 72 65 64 3b 20 20 2f 2a 20 55 6e 69  lShared;  /* Uni
1d310 6f 6e 20 6f 66 20 6c 6f 63 6b 73 20 68 65 6c 64  on of locks held
1d320 20 62 79 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20   by connections 
1d330 6f 74 68 65 72 20 74 68 61 6e 20 22 70 22 20 2a  other than "p" *
1d340 2f 0a 0a 20 20 2f 2a 20 41 63 63 65 73 73 20 74  /..  /* Access t
1d350 6f 20 74 68 65 20 75 6e 69 78 53 68 6d 46 69 6c  o the unixShmFil
1d360 65 20 6f 62 6a 65 63 74 20 69 73 20 73 65 72 69  e object is seri
1d370 61 6c 69 7a 65 64 20 62 79 20 74 68 65 20 63 61  alized by the ca
1d380 6c 6c 65 72 20 2a 2f 0a 20 20 61 73 73 65 72 74  ller */.  assert
1d390 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
1d3a0 68 65 6c 64 28 70 46 69 6c 65 2d 3e 6d 75 74 65  held(pFile->mute
1d3b0 78 29 20 29 3b 0a 0a 20 20 2f 2a 20 46 69 6e 64  x) );..  /* Find
1d3c0 20 6f 75 74 20 77 68 69 63 68 20 73 68 61 72 65   out which share
1d3d0 64 20 6c 6f 63 6b 73 20 61 72 65 20 61 6c 72 65  d locks are alre
1d3e0 61 64 79 20 68 65 6c 64 20 62 79 20 73 69 62 6c  ady held by sibl
1d3f0 69 6e 67 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 2e  ing connections.
1d400 0a 20 20 2a 2a 20 49 66 20 61 6e 79 20 73 69 62  .  ** If any sib
1d410 6c 69 6e 67 20 61 6c 72 65 61 64 79 20 68 6f 6c  ling already hol
1d420 64 73 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20  ds an exclusive 
1d430 6c 6f 63 6b 2c 20 67 6f 20 61 68 65 61 64 20 61  lock, go ahead a
1d440 6e 64 20 72 65 74 75 72 6e 0a 20 20 2a 2a 20 53  nd return.  ** S
1d450 51 4c 49 54 45 5f 42 55 53 59 2e 0a 20 20 2a 2f  QLITE_BUSY..  */
1d460 0a 20 20 61 6c 6c 53 68 61 72 65 64 20 3d 20 30  .  allShared = 0
1d470 3b 0a 20 20 66 6f 72 28 70 58 3d 70 46 69 6c 65  ;.  for(pX=pFile
1d480 2d 3e 70 46 69 72 73 74 3b 20 70 58 3b 20 70 58  ->pFirst; pX; pX
1d490 3d 70 58 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20  =pX->pNext){.   
1d4a0 20 69 66 28 20 70 58 3d 3d 70 20 29 20 63 6f 6e   if( pX==p ) con
1d4b0 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 28  tinue;.    if( (
1d4c0 70 58 2d 3e 65 78 63 6c 4d 61 73 6b 20 26 20 72  pX->exclMask & r
1d4d0 65 61 64 4d 61 73 6b 29 21 3d 30 20 29 20 72 65  eadMask)!=0 ) re
1d4e0 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59  turn SQLITE_BUSY
1d4f0 3b 0a 20 20 20 20 61 6c 6c 53 68 61 72 65 64 20  ;.    allShared 
1d500 7c 3d 20 70 58 2d 3e 73 68 61 72 65 64 4d 61 73  |= pX->sharedMas
1d510 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 47 65 74  k;.  }..  /* Get
1d520 20 73 68 61 72 65 64 20 6c 6f 63 6b 73 20 61 74   shared locks at
1d530 20 74 68 65 20 73 79 73 74 65 6d 20 6c 65 76 65   the system leve
1d540 6c 2c 20 69 66 20 6e 65 63 65 73 73 61 72 79 20  l, if necessary 
1d550 2a 2f 0a 20 20 69 66 28 20 28 7e 61 6c 6c 53 68  */.  if( (~allSh
1d560 61 72 65 64 29 20 26 20 72 65 61 64 4d 61 73 6b  ared) & readMask
1d570 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 75 6e 69   ){.    rc = uni
1d580 78 53 68 6d 53 79 73 74 65 6d 4c 6f 63 6b 28 70  xShmSystemLock(p
1d590 46 69 6c 65 2c 20 46 5f 52 44 4c 43 4b 2c 20 72  File, F_RDLCK, r
1d5a0 65 61 64 4d 61 73 6b 29 3b 0a 20 20 7d 65 6c 73  eadMask);.  }els
1d5b0 65 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  e{.    rc = SQLI
1d5c0 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  TE_OK;.  }..  /*
1d5d0 20 47 65 74 20 74 68 65 20 6c 6f 63 61 6c 20 73   Get the local s
1d5e0 68 61 72 65 64 20 6c 6f 63 6b 73 20 2a 2f 0a 20  hared locks */. 
1d5f0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
1d600 4f 4b 20 29 7b 0a 20 20 20 20 70 2d 3e 73 68 61  OK ){.    p->sha
1d610 72 65 64 4d 61 73 6b 20 7c 3d 20 72 65 61 64 4d  redMask |= readM
1d620 61 73 6b 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  ask;.  }.  retur
1d630 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46  n rc;.}../*.** F
1d640 6f 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 70 2c  or connection p,
1d650 20 67 65 74 20 61 6e 20 65 78 63 6c 75 73 69 76   get an exclusiv
1d660 65 20 6c 6f 63 6b 20 6f 6e 20 61 6c 6c 20 6c 6f  e lock on all lo
1d670 63 6b 73 20 69 64 65 6e 74 69 66 69 65 64 20 69  cks identified i
1d680 6e 0a 2a 2a 20 74 68 65 20 77 72 69 74 65 4d 61  n.** the writeMa
1d690 73 6b 20 70 61 72 61 6d 65 74 65 72 2e 0a 2a 2f  sk parameter..*/
1d6a0 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78  .static int unix
1d6b0 53 68 6d 45 78 63 6c 75 73 69 76 65 4c 6f 63 6b  ShmExclusiveLock
1d6c0 28 0a 20 20 75 6e 69 78 53 68 6d 46 69 6c 65 20  (.  unixShmFile 
1d6d0 2a 70 46 69 6c 65 2c 20 20 20 20 2f 2a 20 54 68  *pFile,    /* Th
1d6e0 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 73 68 61  e underlying sha
1d6f0 72 65 64 2d 6d 65 6d 6f 72 79 20 66 69 6c 65 20  red-memory file 
1d700 2a 2f 0a 20 20 75 6e 69 78 53 68 6d 20 2a 70 2c  */.  unixShm *p,
1d710 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
1d720 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f  he connection to
1d730 20 67 65 74 20 74 68 65 20 65 78 63 6c 75 73 69   get the exclusi
1d740 76 65 20 6c 6f 63 6b 73 20 2a 2f 0a 20 20 75 38  ve locks */.  u8
1d750 20 77 72 69 74 65 4d 61 73 6b 20 20 20 20 20 20   writeMask      
1d760 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20       /* Mask of 
1d770 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 73 20  exclusive locks 
1d780 74 6f 20 62 65 20 61 63 71 75 69 72 65 64 20 2a  to be acquired *
1d790 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20  /.){.  int rc;  
1d7a0 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 20        /* Result 
1d7b0 63 6f 64 65 20 2a 2f 0a 20 20 75 6e 69 78 53 68  code */.  unixSh
1d7c0 6d 20 2a 70 58 3b 20 20 20 2f 2a 20 46 6f 72 20  m *pX;   /* For 
1d7d0 6c 6f 6f 70 69 6e 67 20 6f 76 65 72 20 61 6c 6c  looping over all
1d7e0 20 73 69 62 6c 69 6e 67 20 63 6f 6e 6e 65 63 74   sibling connect
1d7f0 69 6f 6e 73 20 2a 2f 0a 0a 20 20 2f 2a 20 41 63  ions */..  /* Ac
1d800 63 65 73 73 20 74 6f 20 74 68 65 20 75 6e 69 78  cess to the unix
1d810 53 68 6d 46 69 6c 65 20 6f 62 6a 65 63 74 20 69  ShmFile object i
1d820 73 20 73 65 72 69 61 6c 69 7a 65 64 20 62 79 20  s serialized by 
1d830 74 68 65 20 63 61 6c 6c 65 72 20 2a 2f 0a 20 20  the caller */.  
1d840 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
1d850 6d 75 74 65 78 5f 68 65 6c 64 28 70 46 69 6c 65  mutex_held(pFile
1d860 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 0a 20 20 2f  ->mutex) );..  /
1d870 2a 20 4d 61 6b 65 20 73 75 72 65 20 6e 6f 20 73  * Make sure no s
1d880 69 62 6c 69 6e 67 20 63 6f 6e 6e 65 63 74 69 6f  ibling connectio
1d890 6e 73 20 68 6f 6c 64 20 6c 6f 63 6b 73 20 74 68  ns hold locks th
1d8a0 61 74 20 77 69 6c 6c 20 62 6c 6f 63 6b 20 74 68  at will block th
1d8b0 69 73 0a 20 20 2a 2a 20 6c 6f 63 6b 2e 20 20 49  is.  ** lock.  I
1d8c0 66 20 61 6e 79 20 64 6f 2c 20 72 65 74 75 72 6e  f any do, return
1d8d0 20 53 51 4c 49 54 45 5f 42 55 53 59 20 72 69 67   SQLITE_BUSY rig
1d8e0 68 74 20 61 77 61 79 2e 0a 20 20 2a 2f 0a 20 20  ht away..  */.  
1d8f0 66 6f 72 28 70 58 3d 70 46 69 6c 65 2d 3e 70 46  for(pX=pFile->pF
1d900 69 72 73 74 3b 20 70 58 3b 20 70 58 3d 70 58 2d  irst; pX; pX=pX-
1d910 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 69 66 28  >pNext){.    if(
1d920 20 70 58 3d 3d 70 20 29 20 63 6f 6e 74 69 6e 75   pX==p ) continu
1d930 65 3b 0a 20 20 20 20 69 66 28 20 28 70 58 2d 3e  e;.    if( (pX->
1d940 65 78 63 6c 4d 61 73 6b 20 26 20 77 72 69 74 65  exclMask & write
1d950 4d 61 73 6b 29 21 3d 30 20 29 20 72 65 74 75 72  Mask)!=0 ) retur
1d960 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20  n SQLITE_BUSY;. 
1d970 20 20 20 69 66 28 20 28 70 58 2d 3e 73 68 61 72     if( (pX->shar
1d980 65 64 4d 61 73 6b 20 26 20 77 72 69 74 65 4d 61  edMask & writeMa
1d990 73 6b 29 21 3d 30 20 29 20 72 65 74 75 72 6e 20  sk)!=0 ) return 
1d9a0 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 7d  SQLITE_BUSY;.  }
1d9b0 0a 0a 20 20 2f 2a 20 47 65 74 20 74 68 65 20 65  ..  /* Get the e
1d9c0 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 73 20 61  xclusive locks a
1d9d0 74 20 74 68 65 20 73 79 73 74 65 6d 20 6c 65 76  t the system lev
1d9e0 65 6c 2e 20 20 54 68 65 6e 20 69 66 20 73 75 63  el.  Then if suc
1d9f0 63 65 73 73 66 75 6c 0a 20 20 2a 2a 20 61 6c 73  cessful.  ** als
1da00 6f 20 6d 61 72 6b 20 74 68 65 20 6c 6f 63 61 6c  o mark the local
1da10 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 61 73 20 62   connection as b
1da20 65 69 6e 67 20 6c 6f 63 6b 65 64 2e 0a 20 20 2a  eing locked..  *
1da30 2f 0a 20 20 72 63 20 3d 20 75 6e 69 78 53 68 6d  /.  rc = unixShm
1da40 53 79 73 74 65 6d 4c 6f 63 6b 28 70 46 69 6c 65  SystemLock(pFile
1da50 2c 20 46 5f 57 52 4c 43 4b 2c 20 77 72 69 74 65  , F_WRLCK, write
1da60 4d 61 73 6b 29 3b 0a 20 20 69 66 28 20 72 63 3d  Mask);.  if( rc=
1da70 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1da80 20 20 70 2d 3e 73 68 61 72 65 64 4d 61 73 6b 20    p->sharedMask 
1da90 26 3d 20 7e 77 72 69 74 65 4d 61 73 6b 3b 0a 20  &= ~writeMask;. 
1daa0 20 20 20 70 2d 3e 65 78 63 6c 4d 61 73 6b 20 7c     p->exclMask |
1dab0 3d 20 77 72 69 74 65 4d 61 73 6b 3b 0a 20 20 7d  = writeMask;.  }
1dac0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
1dad0 0a 2f 2a 0a 2a 2a 20 50 75 72 67 65 20 74 68 65  ./*.** Purge the
1dae0 20 75 6e 69 78 53 68 6d 46 69 6c 65 4c 69 73 74   unixShmFileList
1daf0 20 6c 69 73 74 20 6f 66 20 61 6c 6c 20 65 6e 74   list of all ent
1db00 72 69 65 73 20 77 69 74 68 20 75 6e 69 78 53 68  ries with unixSh
1db10 6d 46 69 6c 65 2e 6e 52 65 66 3d 3d 30 2e 0a 2a  mFile.nRef==0..*
1db20 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 6e 6f 74  *.** This is not
1db30 20 61 20 56 46 53 20 73 68 61 72 65 64 2d 6d 65   a VFS shared-me
1db40 6d 6f 72 79 20 6d 65 74 68 6f 64 3b 20 69 74 20  mory method; it 
1db50 69 73 20 61 20 75 74 69 6c 69 74 79 20 66 75 6e  is a utility fun
1db60 63 74 69 6f 6e 20 63 61 6c 6c 65 64 0a 2a 2a 20  ction called.** 
1db70 62 79 20 56 46 53 20 73 68 61 72 65 64 2d 6d 65  by VFS shared-me
1db80 6d 6f 72 79 20 6d 65 74 68 6f 64 73 2e 0a 2a 2f  mory methods..*/
1db90 0a 73 74 61 74 69 63 20 76 6f 69 64 20 75 6e 69  .static void uni
1dba0 78 53 68 6d 50 75 72 67 65 28 76 6f 69 64 29 7b  xShmPurge(void){
1dbb0 0a 20 20 75 6e 69 78 53 68 6d 46 69 6c 65 20 2a  .  unixShmFile *
1dbc0 2a 70 70 3b 0a 20 20 75 6e 69 78 53 68 6d 46 69  *pp;.  unixShmFi
1dbd0 6c 65 20 2a 70 3b 0a 20 20 61 73 73 65 72 74 28  le *p;.  assert(
1dbe0 20 75 6e 69 78 4d 75 74 65 78 48 65 6c 64 28 29   unixMutexHeld()
1dbf0 20 29 3b 0a 20 20 70 70 20 3d 20 26 75 6e 69 78   );.  pp = &unix
1dc00 53 68 6d 46 69 6c 65 4c 69 73 74 3b 0a 20 20 77  ShmFileList;.  w
1dc10 68 69 6c 65 28 20 28 70 20 3d 20 2a 70 70 29 21  hile( (p = *pp)!
1dc20 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 70 2d  =0 ){.    if( p-
1dc30 3e 6e 52 65 66 3d 3d 30 20 29 7b 0a 20 20 20 20  >nRef==0 ){.    
1dc40 20 20 69 66 28 20 70 2d 3e 6d 75 74 65 78 20 29    if( p->mutex )
1dc50 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 66   sqlite3_mutex_f
1dc60 72 65 65 28 70 2d 3e 6d 75 74 65 78 29 3b 0a 20  ree(p->mutex);. 
1dc70 20 20 20 20 20 69 66 28 20 70 2d 3e 6d 75 74 65       if( p->mute
1dc80 78 42 75 66 20 29 20 73 71 6c 69 74 65 33 5f 6d  xBuf ) sqlite3_m
1dc90 75 74 65 78 5f 66 72 65 65 28 70 2d 3e 6d 75 74  utex_free(p->mut
1dca0 65 78 42 75 66 29 3b 0a 20 20 20 20 20 20 69 66  exBuf);.      if
1dcb0 28 20 70 2d 3e 68 3e 3d 30 20 29 20 63 6c 6f 73  ( p->h>=0 ) clos
1dcc0 65 28 70 2d 3e 68 29 3b 0a 20 20 20 20 20 20 2a  e(p->h);.      *
1dcd0 70 70 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a 20  pp = p->pNext;. 
1dce0 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
1dcf0 65 28 70 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  e(p);.    }else{
1dd00 0a 20 20 20 20 20 20 70 70 20 3d 20 26 70 2d 3e  .      pp = &p->
1dd10 70 4e 65 78 74 3b 0a 20 20 20 20 7d 0a 20 20 7d  pNext;.    }.  }
1dd20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 61  .}../*.** Open a
1dd30 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 61   shared-memory a
1dd40 72 65 61 2e 20 20 54 68 69 73 20 70 61 72 74 69  rea.  This parti
1dd50 63 75 6c 61 72 20 69 6d 70 6c 65 6d 65 6e 74 61  cular implementa
1dd60 74 69 6f 6e 20 75 73 65 73 0a 2a 2a 20 6d 6d 61  tion uses.** mma
1dd70 70 70 65 64 20 66 69 6c 65 73 2e 0a 2a 2a 0a 2a  pped files..**.*
1dd80 2a 20 7a 4e 61 6d 65 20 69 73 20 61 20 66 69 6c  * zName is a fil
1dd90 65 6e 61 6d 65 20 75 73 65 64 20 74 6f 20 69 64  ename used to id
1dda0 65 6e 74 69 66 79 20 74 68 65 20 73 68 61 72 65  entify the share
1ddb0 64 2d 6d 65 6d 6f 72 79 20 61 72 65 61 2e 20 20  d-memory area.  
1ddc0 54 68 65 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74  The.** implement
1ddd0 61 74 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 20 28  ation does not (
1dde0 61 6e 64 20 70 65 72 68 61 70 73 20 73 68 6f 75  and perhaps shou
1ddf0 6c 64 20 6e 6f 74 29 20 75 73 65 20 74 68 69 73  ld not) use this
1de00 20 6e 61 6d 65 0a 2a 2a 20 64 69 72 65 63 74 6c   name.** directl
1de10 79 2c 20 62 75 74 20 72 61 74 68 65 72 20 75 73  y, but rather us
1de20 65 20 69 74 20 61 73 20 61 20 74 65 6d 70 6c 61  e it as a templa
1de30 74 65 20 66 6f 72 20 66 69 6e 64 69 6e 67 20 61  te for finding a
1de40 6e 20 61 70 70 72 6f 70 72 69 61 74 65 0a 2a 2a  n appropriate.**
1de50 20 6e 61 6d 65 20 66 6f 72 20 74 68 65 20 73 68   name for the sh
1de60 61 72 65 64 2d 6d 65 6d 6f 72 79 20 73 74 6f 72  ared-memory stor
1de70 61 67 65 2e 20 20 49 6e 20 74 68 69 73 20 69 6d  age.  In this im
1de80 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 2c 20 74 68  plementation, th
1de90 65 0a 2a 2a 20 73 74 72 69 6e 67 20 22 2d 69 6e  e.** string "-in
1dea0 64 65 78 22 20 69 73 20 61 70 70 65 6e 64 65 64  dex" is appended
1deb0 20 74 6f 20 7a 4e 61 6d 65 20 61 6e 64 20 75 73   to zName and us
1dec0 65 64 20 61 73 20 74 68 65 20 6e 61 6d 65 20 6f  ed as the name o
1ded0 66 20 74 68 65 0a 2a 2a 20 6d 6d 61 70 70 65 64  f the.** mmapped
1dee0 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 57 68 65   file..**.** Whe
1def0 6e 20 6f 70 65 6e 69 6e 67 20 61 20 6e 65 77 20  n opening a new 
1df00 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 66 69  shared-memory fi
1df10 6c 65 2c 20 69 66 20 6e 6f 20 6f 74 68 65 72 20  le, if no other 
1df20 69 6e 73 74 61 6e 63 65 73 20 6f 66 20 74 68 61  instances of tha
1df30 74 0a 2a 2a 20 66 69 6c 65 20 61 72 65 20 63 75  t.** file are cu
1df40 72 72 65 6e 74 6c 79 20 6f 70 65 6e 2c 20 69 6e  rrently open, in
1df50 20 74 68 69 73 20 70 72 6f 63 65 73 73 20 6f 72   this process or
1df60 20 69 6e 20 6f 74 68 65 72 20 70 72 6f 63 65 73   in other proces
1df70 73 65 73 2c 20 74 68 65 6e 0a 2a 2a 20 74 68 65  ses, then.** the
1df80 20 66 69 6c 65 20 6d 75 73 74 20 62 65 20 74 72   file must be tr
1df90 75 6e 63 61 74 65 64 20 74 6f 20 7a 65 72 6f 20  uncated to zero 
1dfa0 6c 65 6e 67 74 68 20 6f 72 20 68 61 76 65 20 69  length or have i
1dfb0 74 73 20 68 65 61 64 65 72 20 63 6c 65 61 72 65  ts header cleare
1dfc0 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
1dfd0 20 75 6e 69 78 53 68 6d 4f 70 65 6e 28 0a 20 20   unixShmOpen(.  
1dfe0 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66 64  sqlite3_file *fd
1dff0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 66 69 6c        /* The fil
1e000 65 20 64 65 73 63 72 69 70 74 6f 72 20 6f 66 20  e descriptor of 
1e010 74 68 65 20 61 73 73 6f 63 69 61 74 65 64 20 64  the associated d
1e020 61 74 61 62 61 73 65 20 2a 2f 0a 29 7b 0a 20 20  atabase */.){.  
1e030 73 74 72 75 63 74 20 75 6e 69 78 53 68 6d 20 2a  struct unixShm *
1e040 70 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  p = 0;          
1e050 20 20 20 2f 2a 20 54 68 65 20 63 6f 6e 6e 65 63     /* The connec
1e060 74 69 6f 6e 20 74 6f 20 62 65 20 6f 70 65 6e 65  tion to be opene
1e070 64 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 75 6e  d */.  struct un
1e080 69 78 53 68 6d 46 69 6c 65 20 2a 70 46 69 6c 65  ixShmFile *pFile
1e090 20 3d 20 30 3b 20 20 20 20 20 2f 2a 20 54 68 65   = 0;     /* The
1e0a0 20 75 6e 64 65 72 6c 79 69 6e 67 20 6d 6d 61 70   underlying mmap
1e0b0 70 65 64 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e  ped file */.  in
1e0c0 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20  t rc;           
1e0d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e0e0 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64 65 20   /* Result code 
1e0f0 2a 2f 0a 20 20 73 74 72 75 63 74 20 75 6e 69 78  */.  struct unix
1e100 46 69 6c 65 49 64 20 66 69 64 3b 20 20 20 20 20  FileId fid;     
1e110 20 20 20 20 20 20 20 20 2f 2a 20 55 6e 69 78 20          /* Unix 
1e120 66 69 6c 65 20 69 64 65 6e 74 69 66 69 65 72 20  file identifier 
1e130 2a 2f 0a 20 20 73 74 72 75 63 74 20 75 6e 69 78  */.  struct unix
1e140 53 68 6d 46 69 6c 65 20 2a 70 4e 65 77 3b 20 20  ShmFile *pNew;  
1e150 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 77 6c 79          /* Newly
1e160 20 61 6c 6c 6f 63 61 74 65 64 20 70 46 69 6c 65   allocated pFile
1e170 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 73 74 61   */.  struct sta
1e180 74 20 73 53 74 61 74 3b 20 20 20 20 20 20 20 20  t sStat;        
1e190 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75           /* Resu
1e1a0 6c 74 20 66 72 6f 6d 20 73 74 61 74 28 29 20 61  lt from stat() a
1e1b0 6e 20 66 73 74 61 74 28 29 20 2a 2f 0a 20 20 73  n fstat() */.  s
1e1c0 74 72 75 63 74 20 75 6e 69 78 46 69 6c 65 20 2a  truct unixFile *
1e1d0 70 44 62 46 64 3b 20 20 20 20 20 20 20 20 20 20  pDbFd;          
1e1e0 20 20 2f 2a 20 55 6e 64 65 72 6c 79 69 6e 67 20    /* Underlying 
1e1f0 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f  database file */
1e200 0a 20 20 69 6e 74 20 6e 50 61 74 68 3b 20 20 20  .  int nPath;   
1e210 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e220 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66        /* Size of
1e230 20 70 44 62 46 64 2d 3e 7a 50 61 74 68 20 69 6e   pDbFd->zPath in
1e240 20 62 79 74 65 73 20 2a 2f 0a 0a 20 20 2f 2a 20   bytes */..  /* 
1e250 41 6c 6c 6f 63 61 74 65 20 73 70 61 63 65 20 66  Allocate space f
1e260 6f 72 20 74 68 65 20 6e 65 77 20 73 71 6c 69 74  or the new sqlit
1e270 65 33 5f 73 68 6d 20 6f 62 6a 65 63 74 2e 20 20  e3_shm object.  
1e280 41 6c 73 6f 20 73 70 65 63 75 6c 61 74 69 76 65  Also speculative
1e290 6c 79 0a 20 20 2a 2a 20 61 6c 6c 6f 63 61 74 65  ly.  ** allocate
1e2a0 20 73 70 61 63 65 20 66 6f 72 20 61 20 6e 65 77   space for a new
1e2b0 20 75 6e 69 78 53 68 6d 46 69 6c 65 20 61 6e 64   unixShmFile and
1e2c0 20 66 69 6c 65 6e 61 6d 65 2e 0a 20 20 2a 2f 0a   filename..  */.
1e2d0 20 20 70 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61    p = sqlite3_ma
1e2e0 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 2a 70 29  lloc( sizeof(*p)
1e2f0 20 29 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29   );.  if( p==0 )
1e300 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
1e310 4f 4d 45 4d 3b 0a 20 20 6d 65 6d 73 65 74 28 70  OMEM;.  memset(p
1e320 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a 70 29 29  , 0, sizeof(*p))
1e330 3b 0a 20 20 70 44 62 46 64 20 3d 20 28 73 74 72  ;.  pDbFd = (str
1e340 75 63 74 20 75 6e 69 78 46 69 6c 65 2a 29 66 64  uct unixFile*)fd
1e350 3b 0a 20 20 61 73 73 65 72 74 28 20 70 44 62 46  ;.  assert( pDbF
1e360 64 2d 3e 70 53 68 6d 3d 3d 30 20 29 3b 0a 20 20  d->pShm==0 );.  
1e370 6e 50 61 74 68 20 3d 20 73 74 72 6c 65 6e 28 70  nPath = strlen(p
1e380 44 62 46 64 2d 3e 7a 50 61 74 68 29 3b 0a 20 20  DbFd->zPath);.  
1e390 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 5f 6d  pNew = sqlite3_m
1e3a0 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 2a 70  alloc( sizeof(*p
1e3b0 46 69 6c 65 29 20 2b 20 6e 50 61 74 68 20 2b 20  File) + nPath + 
1e3c0 31 35 20 29 3b 0a 20 20 69 66 28 20 70 4e 65 77  15 );.  if( pNew
1e3d0 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ==0 ){.    sqlit
1e3e0 65 33 5f 66 72 65 65 28 70 29 3b 0a 20 20 20 20  e3_free(p);.    
1e3f0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
1e400 4d 45 4d 3b 0a 20 20 7d 0a 20 20 6d 65 6d 73 65  MEM;.  }.  memse
1e410 74 28 70 4e 65 77 2c 20 30 2c 20 73 69 7a 65 6f  t(pNew, 0, sizeo
1e420 66 28 2a 70 4e 65 77 29 29 3b 0a 20 20 70 4e 65  f(*pNew));.  pNe
1e430 77 2d 3e 7a 46 69 6c 65 6e 61 6d 65 20 3d 20 28  w->zFilename = (
1e440 63 68 61 72 2a 29 26 70 4e 65 77 5b 31 5d 3b 0a  char*)&pNew[1];.
1e450 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
1e460 74 66 28 6e 50 61 74 68 2b 31 35 2c 20 70 4e 65  tf(nPath+15, pNe
1e470 77 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c 20 22 25  w->zFilename, "%
1e480 73 2d 77 61 6c 2d 69 6e 64 65 78 22 2c 20 70 44  s-wal-index", pD
1e490 62 46 64 2d 3e 7a 50 61 74 68 29 3b 0a 0a 20 20  bFd->zPath);..  
1e4a0 2f 2a 20 4c 6f 6f 6b 20 74 6f 20 73 65 65 20 69  /* Look to see i
1e4b0 66 20 74 68 65 72 65 20 69 73 20 61 6e 20 65 78  f there is an ex
1e4c0 69 73 74 69 6e 67 20 75 6e 69 78 53 68 6d 46 69  isting unixShmFi
1e4d0 6c 65 20 74 68 61 74 20 63 61 6e 20 62 65 20 75  le that can be u
1e4e0 73 65 64 2e 0a 20 20 2a 2a 20 49 66 20 6e 6f 20  sed..  ** If no 
1e4f0 6d 61 74 63 68 69 6e 67 20 75 6e 69 78 53 68 6d  matching unixShm
1e500 46 69 6c 65 20 63 75 72 72 65 6e 74 6c 79 20 65  File currently e
1e510 78 69 73 74 73 2c 20 63 72 65 61 74 65 20 61 20  xists, create a 
1e520 6e 65 77 20 6f 6e 65 2e 0a 20 20 2a 2f 0a 20 20  new one..  */.  
1e530 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29  unixEnterMutex()
1e540 3b 0a 20 20 72 63 20 3d 20 73 74 61 74 28 70 4e  ;.  rc = stat(pN
1e550 65 77 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c 20 26  ew->zFilename, &
1e560 73 53 74 61 74 29 3b 0a 20 20 69 66 28 20 72 63  sStat);.  if( rc
1e570 3d 3d 30 20 29 7b 0a 20 20 20 20 6d 65 6d 73 65  ==0 ){.    memse
1e580 74 28 26 66 69 64 2c 20 30 2c 20 73 69 7a 65 6f  t(&fid, 0, sizeo
1e590 66 28 66 69 64 29 29 3b 0a 20 20 20 20 66 69 64  f(fid));.    fid
1e5a0 2e 64 65 76 20 3d 20 73 53 74 61 74 2e 73 74 5f  .dev = sStat.st_
1e5b0 64 65 76 3b 0a 20 20 20 20 66 69 64 2e 69 6e 6f  dev;.    fid.ino
1e5c0 20 3d 20 73 53 74 61 74 2e 73 74 5f 69 6e 6f 3b   = sStat.st_ino;
1e5d0 0a 20 20 20 20 66 6f 72 28 70 46 69 6c 65 20 3d  .    for(pFile =
1e5e0 20 75 6e 69 78 53 68 6d 46 69 6c 65 4c 69 73 74   unixShmFileList
1e5f0 3b 20 70 46 69 6c 65 3b 20 70 46 69 6c 65 3d 70  ; pFile; pFile=p
1e600 46 69 6c 65 2d 3e 70 4e 65 78 74 29 7b 0a 20 20  File->pNext){.  
1e610 20 20 20 20 69 66 28 20 6d 65 6d 63 6d 70 28 26      if( memcmp(&
1e620 70 46 69 6c 65 2d 3e 66 69 64 2c 20 26 66 69 64  pFile->fid, &fid
1e630 2c 20 73 69 7a 65 6f 66 28 66 69 64 29 29 3d 3d  , sizeof(fid))==
1e640 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d  0 ) break;.    }
1e650 0a 20 20 7d 0a 20 20 69 66 28 20 70 46 69 6c 65  .  }.  if( pFile
1e660 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
1e670 66 72 65 65 28 70 4e 65 77 29 3b 0a 20 20 7d 65  free(pNew);.  }e
1e680 6c 73 65 7b 0a 20 20 20 20 70 46 69 6c 65 20 3d  lse{.    pFile =
1e690 20 70 4e 65 77 3b 0a 20 20 20 20 70 4e 65 77 20   pNew;.    pNew 
1e6a0 3d 20 30 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e  = 0;.    pFile->
1e6b0 68 20 3d 20 2d 31 3b 0a 20 20 20 20 70 46 69 6c  h = -1;.    pFil
1e6c0 65 2d 3e 70 4e 65 78 74 20 3d 20 75 6e 69 78 53  e->pNext = unixS
1e6d0 68 6d 46 69 6c 65 4c 69 73 74 3b 0a 20 20 20 20  hmFileList;.    
1e6e0 75 6e 69 78 53 68 6d 46 69 6c 65 4c 69 73 74 20  unixShmFileList 
1e6f0 3d 20 70 46 69 6c 65 3b 0a 0a 20 20 20 20 70 46  = pFile;..    pF
1e700 69 6c 65 2d 3e 6d 75 74 65 78 20 3d 20 73 71 6c  ile->mutex = sql
1e710 69 74 65 33 5f 6d 75 74 65 78 5f 61 6c 6c 6f 63  ite3_mutex_alloc
1e720 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 46 41  (SQLITE_MUTEX_FA
1e730 53 54 29 3b 0a 20 20 20 20 69 66 28 20 70 46 69  ST);.    if( pFi
1e740 6c 65 2d 3e 6d 75 74 65 78 3d 3d 30 20 29 7b 0a  le->mutex==0 ){.
1e750 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
1e760 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 67  E_NOMEM;.      g
1e770 6f 74 6f 20 73 68 6d 5f 6f 70 65 6e 5f 65 72 72  oto shm_open_err
1e780 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 46 69 6c  ;.    }.    pFil
1e790 65 2d 3e 6d 75 74 65 78 42 75 66 20 3d 20 73 71  e->mutexBuf = sq
1e7a0 6c 69 74 65 33 5f 6d 75 74 65 78 5f 61 6c 6c 6f  lite3_mutex_allo
1e7b0 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 46  c(SQLITE_MUTEX_F
1e7c0 41 53 54 29 3b 0a 20 20 20 20 69 66 28 20 70 46  AST);.    if( pF
1e7d0 69 6c 65 2d 3e 6d 75 74 65 78 42 75 66 3d 3d 30  ile->mutexBuf==0
1e7e0 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53   ){.      rc = S
1e7f0 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
1e800 20 20 20 67 6f 74 6f 20 73 68 6d 5f 6f 70 65 6e     goto shm_open
1e810 5f 65 72 72 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  _err;.    }..   
1e820 20 70 46 69 6c 65 2d 3e 68 20 3d 20 6f 70 65 6e   pFile->h = open
1e830 28 70 46 69 6c 65 2d 3e 7a 46 69 6c 65 6e 61 6d  (pFile->zFilenam
1e840 65 2c 20 4f 5f 52 44 57 52 7c 4f 5f 43 52 45 41  e, O_RDWR|O_CREA
1e850 54 2c 20 30 36 36 34 29 3b 0a 20 20 20 20 69 66  T, 0664);.    if
1e860 28 20 70 46 69 6c 65 2d 3e 68 3c 30 20 29 7b 0a  ( pFile->h<0 ){.
1e870 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
1e880 45 5f 43 41 4e 54 4f 50 45 4e 5f 42 4b 50 54 3b  E_CANTOPEN_BKPT;
1e890 0a 20 20 20 20 20 20 67 6f 74 6f 20 73 68 6d 5f  .      goto shm_
1e8a0 6f 70 65 6e 5f 65 72 72 3b 0a 20 20 20 20 7d 0a  open_err;.    }.
1e8b0 0a 20 20 20 20 72 63 20 3d 20 66 73 74 61 74 28  .    rc = fstat(
1e8c0 70 46 69 6c 65 2d 3e 68 2c 20 26 73 53 74 61 74  pFile->h, &sStat
1e8d0 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 7b  );.    if( rc ){
1e8e0 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
1e8f0 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 42 4b 50 54  TE_CANTOPEN_BKPT
1e900 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 73 68 6d  ;.      goto shm
1e910 5f 6f 70 65 6e 5f 65 72 72 3b 0a 20 20 20 20 7d  _open_err;.    }
1e920 0a 20 20 20 20 70 46 69 6c 65 2d 3e 66 69 64 2e  .    pFile->fid.
1e930 64 65 76 20 3d 20 73 53 74 61 74 2e 73 74 5f 64  dev = sStat.st_d
1e940 65 76 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 66  ev;.    pFile->f
1e950 69 64 2e 69 6e 6f 20 3d 20 73 53 74 61 74 2e 73  id.ino = sStat.s
1e960 74 5f 69 6e 6f 3b 0a 0a 20 20 20 20 2f 2a 20 43  t_ino;..    /* C
1e970 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 61  heck to see if a
1e980 6e 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20 69  nother process i
1e990 73 20 68 6f 6c 64 69 6e 67 20 74 68 65 20 64 65  s holding the de
1e9a0 61 64 2d 6d 61 6e 20 73 77 69 74 63 68 2e 0a 20  ad-man switch.. 
1e9b0 20 20 20 2a 2a 20 49 66 20 6e 6f 74 2c 20 74 72     ** If not, tr
1e9c0 75 6e 63 61 74 65 20 74 68 65 20 66 69 6c 65 20  uncate the file 
1e9d0 74 6f 20 7a 65 72 6f 20 6c 65 6e 67 74 68 2e 20  to zero length. 
1e9e0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
1e9f0 75 6e 69 78 53 68 6d 53 79 73 74 65 6d 4c 6f 63  unixShmSystemLoc
1ea00 6b 28 70 46 69 6c 65 2c 20 46 5f 57 52 4c 43 4b  k(pFile, F_WRLCK
1ea10 2c 20 55 4e 49 58 5f 53 48 4d 5f 44 4d 53 29 3d  , UNIX_SHM_DMS)=
1ea20 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1ea30 20 20 20 20 69 66 28 20 66 74 72 75 6e 63 61 74      if( ftruncat
1ea40 65 28 70 46 69 6c 65 2d 3e 68 2c 20 30 29 20 29  e(pFile->h, 0) )
1ea50 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53  {.        rc = S
1ea60 51 4c 49 54 45 5f 49 4f 45 52 52 3b 0a 20 20 20  QLITE_IOERR;.   
1ea70 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69     }.    }.    i
1ea80 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
1ea90 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 75   ){.      rc = u
1eaa0 6e 69 78 53 68 6d 53 79 73 74 65 6d 4c 6f 63 6b  nixShmSystemLock
1eab0 28 70 46 69 6c 65 2c 20 46 5f 52 44 4c 43 4b 2c  (pFile, F_RDLCK,
1eac0 20 55 4e 49 58 5f 53 48 4d 5f 44 4d 53 29 3b 0a   UNIX_SHM_DMS);.
1ead0 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63      }.    if( rc
1eae0 20 29 20 67 6f 74 6f 20 73 68 6d 5f 6f 70 65 6e   ) goto shm_open
1eaf0 5f 65 72 72 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  _err;.  }..  /* 
1eb00 4d 61 6b 65 20 74 68 65 20 6e 65 77 20 63 6f 6e  Make the new con
1eb10 6e 65 63 74 69 6f 6e 20 61 20 63 68 69 6c 64 20  nection a child 
1eb20 6f 66 20 74 68 65 20 75 6e 69 78 53 68 6d 46 69  of the unixShmFi
1eb30 6c 65 20 2a 2f 0a 20 20 70 2d 3e 70 46 69 6c 65  le */.  p->pFile
1eb40 20 3d 20 70 46 69 6c 65 3b 0a 20 20 70 2d 3e 70   = pFile;.  p->p
1eb50 4e 65 78 74 20 3d 20 70 46 69 6c 65 2d 3e 70 46  Next = pFile->pF
1eb60 69 72 73 74 3b 0a 23 69 66 64 65 66 20 53 51 4c  irst;.#ifdef SQL
1eb70 49 54 45 5f 44 45 42 55 47 0a 20 20 70 2d 3e 69  ITE_DEBUG.  p->i
1eb80 64 20 3d 20 70 46 69 6c 65 2d 3e 6e 65 78 74 53  d = pFile->nextS
1eb90 68 6d 49 64 2b 2b 3b 0a 23 65 6e 64 69 66 0a 20  hmId++;.#endif. 
1eba0 20 70 46 69 6c 65 2d 3e 70 46 69 72 73 74 20 3d   pFile->pFirst =
1ebb0 20 70 3b 0a 20 20 70 46 69 6c 65 2d 3e 6e 52 65   p;.  pFile->nRe
1ebc0 66 2b 2b 3b 0a 20 20 70 44 62 46 64 2d 3e 70 53  f++;.  pDbFd->pS
1ebd0 68 6d 20 3d 20 70 3b 0a 20 20 75 6e 69 78 4c 65  hm = p;.  unixLe
1ebe0 61 76 65 4d 75 74 65 78 28 29 3b 0a 20 20 72 65  aveMutex();.  re
1ebf0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
1ec00 0a 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20  .  /* Jump here 
1ec10 6f 6e 20 61 6e 79 20 65 72 72 6f 72 20 2a 2f 0a  on any error */.
1ec20 73 68 6d 5f 6f 70 65 6e 5f 65 72 72 3a 0a 20 20  shm_open_err:.  
1ec30 75 6e 69 78 53 68 6d 50 75 72 67 65 28 29 3b 20  unixShmPurge(); 
1ec40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ec50 2f 2a 20 54 68 69 73 20 63 61 6c 6c 20 66 72 65  /* This call fre
1ec60 65 73 20 70 46 69 6c 65 20 69 66 20 72 65 71 75  es pFile if requ
1ec70 69 72 65 64 20 2a 2f 0a 20 20 73 71 6c 69 74 65  ired */.  sqlite
1ec80 33 5f 66 72 65 65 28 70 29 3b 0a 20 20 73 71 6c  3_free(p);.  sql
1ec90 69 74 65 33 5f 66 72 65 65 28 70 4e 65 77 29 3b  ite3_free(pNew);
1eca0 0a 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65  .  unixLeaveMute
1ecb0 78 28 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  x();.  return rc
1ecc0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65  ;.}../*.** Close
1ecd0 20 61 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f   a connection to
1ece0 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 2e 20   shared-memory. 
1ecf0 20 44 65 6c 65 74 65 20 74 68 65 20 75 6e 64 65   Delete the unde
1ed00 72 6c 79 69 6e 67 20 0a 2a 2a 20 73 74 6f 72 61  rlying .** stora
1ed10 67 65 20 69 66 20 64 65 6c 65 74 65 46 6c 61 67  ge if deleteFlag
1ed20 20 69 73 20 74 72 75 65 2e 0a 2a 2f 0a 73 74 61   is true..*/.sta
1ed30 74 69 63 20 69 6e 74 20 75 6e 69 78 53 68 6d 43  tic int unixShmC
1ed40 6c 6f 73 65 28 0a 20 20 73 71 6c 69 74 65 33 5f  lose(.  sqlite3_
1ed50 66 69 6c 65 20 2a 66 64 2c 20 20 20 20 20 20 20  file *fd,       
1ed60 20 20 20 2f 2a 20 54 68 65 20 75 6e 64 65 72 6c     /* The underl
1ed70 79 69 6e 67 20 64 61 74 61 62 61 73 65 20 66 69  ying database fi
1ed80 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 64 65 6c 65  le */.  int dele
1ed90 74 65 46 6c 61 67 20 20 20 20 20 20 20 20 20 20  teFlag          
1eda0 20 20 20 2f 2a 20 44 65 6c 65 74 65 20 73 68 61     /* Delete sha
1edb0 72 65 64 2d 6d 65 6d 6f 72 79 20 69 66 20 74 72  red-memory if tr
1edc0 75 65 20 2a 2f 0a 29 7b 0a 20 20 75 6e 69 78 53  ue */.){.  unixS
1edd0 68 6d 20 2a 70 3b 20 20 20 20 20 20 20 20 20 20  hm *p;          
1ede0 20 20 2f 2a 20 54 68 65 20 63 6f 6e 6e 65 63 74    /* The connect
1edf0 69 6f 6e 20 74 6f 20 62 65 20 63 6c 6f 73 65 64  ion to be closed
1ee00 20 2a 2f 0a 20 20 75 6e 69 78 53 68 6d 46 69 6c   */.  unixShmFil
1ee10 65 20 2a 70 46 69 6c 65 3b 20 20 20 20 2f 2a 20  e *pFile;    /* 
1ee20 54 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 73  The underlying s
1ee30 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 66 69 6c  hared-memory fil
1ee40 65 20 2a 2f 0a 20 20 75 6e 69 78 53 68 6d 20 2a  e */.  unixShm *
1ee50 2a 70 70 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  *pp;          /*
1ee60 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65   For looping ove
1ee70 72 20 73 69 62 6c 69 6e 67 20 63 6f 6e 6e 65 63  r sibling connec
1ee80 74 69 6f 6e 73 20 2a 2f 0a 20 20 75 6e 69 78 46  tions */.  unixF
1ee90 69 6c 65 20 2a 70 44 62 46 64 3b 20 20 20 20 20  ile *pDbFd;     
1eea0 20 20 2f 2a 20 54 68 65 20 75 6e 64 65 72 6c 79    /* The underly
1eeb0 69 6e 67 20 64 61 74 61 62 61 73 65 20 66 69 6c  ing database fil
1eec0 65 20 2a 2f 0a 0a 20 20 70 44 62 46 64 20 3d 20  e */..  pDbFd = 
1eed0 28 75 6e 69 78 46 69 6c 65 2a 29 66 64 3b 0a 20  (unixFile*)fd;. 
1eee0 20 70 20 3d 20 70 44 62 46 64 2d 3e 70 53 68 6d   p = pDbFd->pShm
1eef0 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72  ;.  if( p==0 ) r
1ef00 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
1ef10 0a 20 20 70 46 69 6c 65 20 3d 20 70 2d 3e 70 46  .  pFile = p->pF
1ef20 69 6c 65 3b 0a 0a 20 20 2f 2a 20 56 65 72 69 66  ile;..  /* Verif
1ef30 79 20 74 68 61 74 20 74 68 65 20 63 6f 6e 6e 65  y that the conne
1ef40 63 74 69 6f 6e 20 62 65 69 6e 67 20 63 6c 6f 73  ction being clos
1ef50 65 64 20 68 6f 6c 64 73 20 6e 6f 20 6c 6f 63 6b  ed holds no lock
1ef60 73 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70  s */.  assert( p
1ef70 2d 3e 65 78 63 6c 4d 61 73 6b 3d 3d 30 20 29 3b  ->exclMask==0 );
1ef80 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 73 68  .  assert( p->sh
1ef90 61 72 65 64 4d 61 73 6b 3d 3d 30 20 29 3b 0a 0a  aredMask==0 );..
1efa0 20 20 2f 2a 20 52 65 6d 6f 76 65 20 63 6f 6e 6e    /* Remove conn
1efb0 65 63 74 69 6f 6e 20 70 20 66 72 6f 6d 20 74 68  ection p from th
1efc0 65 20 73 65 74 20 6f 66 20 63 6f 6e 6e 65 63 74  e set of connect
1efd0 69 6f 6e 73 20 61 73 73 6f 63 69 61 74 65 64 20  ions associated 
1efe0 77 69 74 68 20 70 46 69 6c 65 20 2a 2f 0a 20 20  with pFile */.  
1eff0 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e  sqlite3_mutex_en
1f000 74 65 72 28 70 46 69 6c 65 2d 3e 6d 75 74 65 78  ter(pFile->mutex
1f010 29 3b 0a 20 20 66 6f 72 28 70 70 3d 26 70 46 69  );.  for(pp=&pFi
1f020 6c 65 2d 3e 70 46 69 72 73 74 3b 20 28 2a 70 70  le->pFirst; (*pp
1f030 29 21 3d 70 3b 20 70 70 20 3d 20 26 28 2a 70 70  )!=p; pp = &(*pp
1f040 29 2d 3e 70 4e 65 78 74 29 7b 7d 0a 20 20 2a 70  )->pNext){}.  *p
1f050 70 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a 0a 20  p = p->pNext;.. 
1f060 20 2f 2a 20 46 72 65 65 20 74 68 65 20 63 6f 6e   /* Free the con
1f070 6e 65 63 74 69 6f 6e 20 70 20 2a 2f 0a 20 20 73  nection p */.  s
1f080 71 6c 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0a  qlite3_free(p);.
1f090 20 20 70 44 62 46 64 2d 3e 70 53 68 6d 20 3d 20    pDbFd->pShm = 
1f0a0 30 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  0;.  sqlite3_mut
1f0b0 65 78 5f 6c 65 61 76 65 28 70 46 69 6c 65 2d 3e  ex_leave(pFile->
1f0c0 6d 75 74 65 78 29 3b 0a 0a 20 20 2f 2a 20 49 66  mutex);..  /* If
1f0d0 20 70 46 69 6c 65 2d 3e 6e 52 65 66 20 68 61 73   pFile->nRef has
1f0e0 20 72 65 61 63 68 65 64 20 30 2c 20 74 68 65 6e   reached 0, then
1f0f0 20 63 6c 6f 73 65 20 74 68 65 20 75 6e 64 65 72   close the under
1f100 6c 79 69 6e 67 0a 20 20 2a 2a 20 73 68 61 72 65  lying.  ** share
1f110 64 2d 6d 65 6d 6f 72 79 20 66 69 6c 65 2c 20 74  d-memory file, t
1f120 6f 6f 20 2a 2f 0a 20 20 75 6e 69 78 45 6e 74 65  oo */.  unixEnte
1f130 72 4d 75 74 65 78 28 29 3b 0a 20 20 61 73 73 65  rMutex();.  asse
1f140 72 74 28 20 70 46 69 6c 65 2d 3e 6e 52 65 66 3e  rt( pFile->nRef>
1f150 30 20 29 3b 0a 20 20 70 46 69 6c 65 2d 3e 6e 52  0 );.  pFile->nR
1f160 65 66 2d 2d 3b 0a 20 20 69 66 28 20 70 46 69 6c  ef--;.  if( pFil
1f170 65 2d 3e 6e 52 65 66 3d 3d 30 20 29 7b 0a 20 20  e->nRef==0 ){.  
1f180 20 20 69 66 28 20 64 65 6c 65 74 65 46 6c 61 67    if( deleteFlag
1f190 20 29 20 75 6e 6c 69 6e 6b 28 70 46 69 6c 65 2d   ) unlink(pFile-
1f1a0 3e 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20  >zFilename);.   
1f1b0 20 75 6e 69 78 53 68 6d 50 75 72 67 65 28 29 3b   unixShmPurge();
1f1c0 0a 20 20 7d 0a 20 20 75 6e 69 78 4c 65 61 76 65  .  }.  unixLeave
1f1d0 4d 75 74 65 78 28 29 3b 0a 0a 20 20 72 65 74 75  Mutex();..  retu
1f1e0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
1f1f0 0a 2f 2a 0a 2a 2a 20 51 75 65 72 79 20 61 6e 64  ./*.** Query and
1f200 2f 6f 72 20 63 68 61 6e 67 65 73 20 74 68 65 20  /or changes the 
1f210 73 69 7a 65 20 6f 66 20 74 68 65 20 75 6e 64 65  size of the unde
1f220 72 6c 79 69 6e 67 20 73 74 6f 72 61 67 65 20 66  rlying storage f
1f230 6f 72 0a 2a 2a 20 61 20 73 68 61 72 65 64 2d 6d  or.** a shared-m
1f240 65 6d 6f 72 79 20 73 65 67 6d 65 6e 74 2e 20 20  emory segment.  
1f250 54 68 65 20 72 65 71 53 69 7a 65 20 70 61 72 61  The reqSize para
1f260 6d 65 74 65 72 20 69 73 20 74 68 65 20 6e 65 77  meter is the new
1f270 20 73 69 7a 65 0a 2a 2a 20 6f 66 20 74 68 65 20   size.** of the 
1f280 75 6e 64 65 72 6c 79 69 6e 67 20 73 74 6f 72 61  underlying stora
1f290 67 65 2c 20 6f 72 20 2d 31 20 74 6f 20 64 6f 20  ge, or -1 to do 
1f2a0 6a 75 73 74 20 61 20 71 75 65 72 79 2e 20 20 54  just a query.  T
1f2b0 68 65 20 73 69 7a 65 0a 2a 2a 20 6f 66 20 74 68  he size.** of th
1f2c0 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 73 74 6f  e underlying sto
1f2d0 72 61 67 65 20 28 61 66 74 65 72 20 72 65 73 69  rage (after resi
1f2e0 7a 69 6e 67 20 69 66 20 72 65 73 69 7a 69 6e 67  zing if resizing
1f2f0 20 6f 63 63 75 72 73 29 20 69 73 0a 2a 2a 20 77   occurs) is.** w
1f300 72 69 74 74 65 6e 20 69 6e 74 6f 20 70 4e 65 77  ritten into pNew
1f310 53 69 7a 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  Size..**.** This
1f320 20 72 6f 75 74 69 6e 65 20 64 6f 65 73 20 6e 6f   routine does no
1f330 74 20 28 6e 65 63 65 73 73 61 72 69 6c 79 29 20  t (necessarily) 
1f340 63 68 61 6e 67 65 20 74 68 65 20 73 69 7a 65 20  change the size 
1f350 6f 66 20 74 68 65 20 6d 61 70 70 69 6e 67 20 0a  of the mapping .
1f360 2a 2a 20 6f 66 20 74 68 65 20 75 6e 64 65 72 6c  ** of the underl
1f370 79 69 6e 67 20 73 74 6f 72 61 67 65 20 69 6e 74  ying storage int
1f380 6f 20 6d 65 6d 6f 72 79 2e 20 20 55 73 65 20 78  o memory.  Use x
1f390 53 68 6d 47 65 74 28 29 20 74 6f 20 63 68 61 6e  ShmGet() to chan
1f3a0 67 65 0a 2a 2a 20 74 68 65 20 6d 61 70 70 69 6e  ge.** the mappin
1f3b0 67 20 73 69 7a 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  g size..**.** Th
1f3c0 65 20 72 65 71 53 69 7a 65 20 70 61 72 61 6d 65  e reqSize parame
1f3d0 74 65 72 20 69 73 20 74 68 65 20 6d 69 6e 69 6d  ter is the minim
1f3e0 75 6d 20 73 69 7a 65 20 72 65 71 75 65 73 74 65  um size requeste
1f3f0 64 2e 20 20 54 68 65 20 69 6d 70 6c 65 6d 65 6e  d.  The implemen
1f400 74 61 74 69 6f 6e 0a 2a 2a 20 69 73 20 66 72 65  tation.** is fre
1f410 65 20 74 6f 20 65 78 70 61 6e 64 20 74 68 65 20  e to expand the 
1f420 73 74 6f 72 61 67 65 20 74 6f 20 73 6f 6d 65 20  storage to some 
1f430 6c 61 72 67 65 72 20 61 6d 6f 75 6e 74 20 69 66  larger amount if
1f440 20 69 74 20 63 68 6f 6f 73 65 73 2e 0a 2a 2f 0a   it chooses..*/.
1f450 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 53  static int unixS
1f460 68 6d 53 69 7a 65 28 0a 20 20 73 71 6c 69 74 65  hmSize(.  sqlite
1f470 33 5f 66 69 6c 65 20 2a 66 64 2c 20 20 20 20 20  3_file *fd,     
1f480 20 20 20 20 2f 2a 20 54 68 65 20 6f 70 65 6e 20      /* The open 
1f490 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 68 6f  database file ho
1f4a0 6c 64 69 6e 67 20 53 48 4d 20 2a 2f 0a 20 20 69  lding SHM */.  i
1f4b0 6e 74 20 72 65 71 53 69 7a 65 2c 20 20 20 20 20  nt reqSize,     
1f4c0 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 71 75           /* Requ
1f4d0 65 73 74 65 64 20 73 69 7a 65 2e 20 20 2d 31 20  ested size.  -1 
1f4e0 66 6f 72 20 71 75 65 72 79 20 6f 6e 6c 79 20 2a  for query only *
1f4f0 2f 0a 20 20 69 6e 74 20 2a 70 4e 65 77 53 69 7a  /.  int *pNewSiz
1f500 65 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  e             /*
1f510 20 57 72 69 74 65 20 6e 65 77 20 73 69 7a 65 20   Write new size 
1f520 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 75 6e 69  here */.){.  uni
1f530 78 46 69 6c 65 20 2a 70 44 62 46 64 20 3d 20 28  xFile *pDbFd = (
1f540 75 6e 69 78 46 69 6c 65 2a 29 66 64 3b 0a 20 20  unixFile*)fd;.  
1f550 75 6e 69 78 53 68 6d 20 2a 70 20 3d 20 70 44 62  unixShm *p = pDb
1f560 46 64 2d 3e 70 53 68 6d 3b 0a 20 20 75 6e 69 78  Fd->pShm;.  unix
1f570 53 68 6d 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d  ShmFile *pFile =
1f580 20 70 2d 3e 70 46 69 6c 65 3b 0a 20 20 69 6e 74   p->pFile;.  int
1f590 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
1f5a0 0a 20 20 73 74 72 75 63 74 20 73 74 61 74 20 73  .  struct stat s
1f5b0 53 74 61 74 3b 0a 0a 20 20 69 66 28 20 72 65 71  Stat;..  if( req
1f5c0 53 69 7a 65 3e 3d 30 20 29 7b 0a 20 20 20 20 72  Size>=0 ){.    r
1f5d0 65 71 53 69 7a 65 20 3d 20 28 72 65 71 53 69 7a  eqSize = (reqSiz
1f5e0 65 20 2b 20 53 51 4c 49 54 45 5f 55 4e 49 58 5f  e + SQLITE_UNIX_
1f5f0 53 48 4d 5f 49 4e 43 52 20 2d 20 31 29 2f 53 51  SHM_INCR - 1)/SQ
1f600 4c 49 54 45 5f 55 4e 49 58 5f 53 48 4d 5f 49 4e  LITE_UNIX_SHM_IN
1f610 43 52 3b 0a 20 20 20 20 72 65 71 53 69 7a 65 20  CR;.    reqSize 
1f620 2a 3d 20 53 51 4c 49 54 45 5f 55 4e 49 58 5f 53  *= SQLITE_UNIX_S
1f630 48 4d 5f 49 4e 43 52 3b 0a 20 20 20 20 72 63 20  HM_INCR;.    rc 
1f640 3d 20 66 74 72 75 6e 63 61 74 65 28 70 46 69 6c  = ftruncate(pFil
1f650 65 2d 3e 68 2c 20 72 65 71 53 69 7a 65 29 3b 0a  e->h, reqSize);.
1f660 20 20 7d 0a 20 20 69 66 28 20 66 73 74 61 74 28    }.  if( fstat(
1f670 70 46 69 6c 65 2d 3e 68 2c 20 26 73 53 74 61 74  pFile->h, &sStat
1f680 29 3d 3d 30 20 29 7b 0a 20 20 20 20 2a 70 4e 65  )==0 ){.    *pNe
1f690 77 53 69 7a 65 20 3d 20 28 69 6e 74 29 73 53 74  wSize = (int)sSt
1f6a0 61 74 2e 73 74 5f 73 69 7a 65 3b 0a 20 20 7d 65  at.st_size;.  }e
1f6b0 6c 73 65 7b 0a 20 20 20 20 2a 70 4e 65 77 53 69  lse{.    *pNewSi
1f6c0 7a 65 20 3d 20 30 3b 0a 20 20 20 20 72 63 20 3d  ze = 0;.    rc =
1f6d0 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 3b 0a 20   SQLITE_IOERR;. 
1f6e0 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
1f6f0 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 4d 61 70 20 74 68  }.../*.** Map th
1f700 65 20 73 68 61 72 65 64 20 73 74 6f 72 61 67 65  e shared storage
1f710 20 69 6e 74 6f 20 6d 65 6d 6f 72 79 2e 20 20 54   into memory.  T
1f720 68 65 20 6d 69 6e 69 6d 75 6d 20 73 69 7a 65 20  he minimum size 
1f730 6f 66 20 74 68 65 0a 2a 2a 20 6d 61 70 70 69 6e  of the.** mappin
1f740 67 20 73 68 6f 75 6c 64 20 62 65 20 72 65 71 4d  g should be reqM
1f750 61 70 53 69 7a 65 20 69 66 20 72 65 71 4d 61 70  apSize if reqMap
1f760 53 69 7a 65 20 69 73 20 70 6f 73 69 74 69 76 65  Size is positive
1f770 2e 20 20 49 66 0a 2a 2a 20 72 65 71 4d 61 70 53  .  If.** reqMapS
1f780 69 7a 65 20 69 73 20 7a 65 72 6f 20 6f 72 20 6e  ize is zero or n
1f790 65 67 61 74 69 76 65 2c 20 74 68 65 20 69 6d 70  egative, the imp
1f7a0 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 63 61 6e 20  lementation can 
1f7b0 63 68 6f 6f 73 65 0a 2a 2a 20 77 68 61 74 65 76  choose.** whatev
1f7c0 65 72 20 6d 61 70 70 69 6e 67 20 73 69 7a 65 20  er mapping size 
1f7d0 69 73 20 63 6f 6e 76 65 6e 69 65 6e 74 2e 0a 2a  is convenient..*
1f7e0 2a 0a 2a 2a 20 2a 70 70 42 75 66 20 69 73 20 6d  *.** *ppBuf is m
1f7f0 61 64 65 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20  ade to point to 
1f800 74 68 65 20 6d 65 6d 6f 72 79 20 77 68 69 63 68  the memory which
1f810 20 69 73 20 61 20 6d 61 70 70 69 6e 67 20 6f 66   is a mapping of
1f820 20 74 68 65 0a 2a 2a 20 75 6e 64 65 72 6c 79 69   the.** underlyi
1f830 6e 67 20 73 74 6f 72 61 67 65 2e 20 20 41 20 6d  ng storage.  A m
1f840 75 74 65 78 20 69 73 20 61 63 71 75 69 72 65 64  utex is acquired
1f850 20 74 6f 20 70 72 65 76 65 6e 74 20 6f 74 68 65   to prevent othe
1f860 72 20 74 68 72 65 61 64 73 0a 2a 2a 20 66 72 6f  r threads.** fro
1f870 6d 20 72 75 6e 6e 69 6e 67 20 77 68 69 6c 65 20  m running while 
1f880 2a 70 70 42 75 66 20 69 73 20 69 6e 20 75 73 65  *ppBuf is in use
1f890 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 70 72 65   in order to pre
1f8a0 76 65 6e 74 20 6f 74 68 65 72 20 74 68 72 65 61  vent other threa
1f8b0 64 73 0a 2a 2a 20 72 65 6d 61 70 70 69 6e 67 20  ds.** remapping 
1f8c0 2a 70 70 42 75 66 20 6f 75 74 20 66 72 6f 6d 20  *ppBuf out from 
1f8d0 75 6e 64 65 72 20 74 68 69 73 20 74 68 72 65 61  under this threa
1f8e0 64 2e 20 20 54 68 65 20 75 6e 69 78 53 68 6d 52  d.  The unixShmR
1f8f0 65 6c 65 61 73 65 28 29 0a 2a 2a 20 63 61 6c 6c  elease().** call
1f900 20 77 69 6c 6c 20 72 65 6c 65 61 73 65 20 74 68   will release th
1f910 65 20 6d 75 74 65 78 2e 20 20 48 6f 77 65 76 65  e mutex.  Howeve
1f920 72 2c 20 69 66 20 74 68 65 20 6c 6f 63 6b 20 73  r, if the lock s
1f930 74 61 74 65 20 69 73 20 43 48 45 43 4b 50 4f 49  tate is CHECKPOI
1f940 4e 54 2c 0a 2a 2a 20 74 68 65 20 6d 75 74 65 78  NT,.** the mutex
1f950 20 69 73 20 6e 6f 74 20 61 63 71 75 69 72 65 64   is not acquired
1f960 20 62 65 63 61 75 73 65 20 43 48 45 43 4b 50 4f   because CHECKPO
1f970 49 4e 54 20 77 69 6c 6c 20 6e 65 76 65 72 20 72  INT will never r
1f980 65 6d 61 70 20 74 68 65 0a 2a 2a 20 62 75 66 66  emap the.** buff
1f990 65 72 2e 20 20 52 45 43 4f 56 45 52 20 6d 69 67  er.  RECOVER mig
1f9a0 68 74 20 72 65 6d 61 70 2c 20 74 68 6f 75 67 68  ht remap, though
1f9b0 2c 20 73 6f 20 43 48 45 43 4b 50 4f 49 4e 54 20  , so CHECKPOINT 
1f9c0 77 69 6c 6c 20 61 63 71 75 69 72 65 0a 2a 2a 20  will acquire.** 
1f9d0 74 68 65 20 6d 75 74 65 78 20 69 66 20 61 6e 64  the mutex if and
1f9e0 20 77 68 65 6e 20 69 74 20 70 72 6f 6d 6f 74 65   when it promote
1f9f0 73 20 74 6f 20 52 45 43 4f 56 45 52 2e 0a 2a 2a  s to RECOVER..**
1fa00 0a 2a 2a 20 52 45 43 4f 56 45 52 20 6e 65 65 64  .** RECOVER need
1fa10 73 20 74 6f 20 62 65 20 61 74 6f 6d 69 63 2e 20  s to be atomic. 
1fa20 20 54 68 65 20 73 61 6d 65 20 6d 75 74 65 78 20   The same mutex 
1fa30 74 68 61 74 20 70 72 65 76 65 6e 74 73 20 2a 70  that prevents *p
1fa40 70 42 75 66 20 66 72 6f 6d 0a 2a 2a 20 62 65 69  pBuf from.** bei
1fa50 6e 67 20 72 65 6d 61 70 70 65 64 20 61 6c 73 6f  ng remapped also
1fa60 20 70 72 65 76 65 6e 74 73 20 6d 6f 72 65 20 74   prevents more t
1fa70 68 61 6e 20 6f 6e 65 20 74 68 72 65 61 64 20 66  han one thread f
1fa80 72 6f 6d 20 62 65 69 6e 67 20 69 6e 0a 2a 2a 20  rom being in.** 
1fa90 52 45 43 4f 56 45 52 20 61 74 20 61 20 74 69 6d  RECOVER at a tim
1faa0 65 2e 20 20 42 75 74 2c 20 52 45 43 4f 56 45 52  e.  But, RECOVER
1fab0 20 73 6f 6d 65 74 69 6d 65 73 20 77 61 6e 74 73   sometimes wants
1fac0 20 74 6f 20 72 65 6d 61 70 20 69 74 73 65 6c 66   to remap itself
1fad0 2e 0a 2a 2a 20 54 6f 20 70 72 65 76 65 6e 74 20  ..** To prevent 
1fae0 52 45 43 4f 56 45 52 20 66 72 6f 6d 20 6c 6f 73  RECOVER from los
1faf0 69 6e 67 20 69 74 73 20 6c 6f 63 6b 20 77 68 69  ing its lock whi
1fb00 6c 65 20 72 65 6d 61 70 70 69 6e 67 2c 20 74 68  le remapping, th
1fb10 65 0a 2a 2a 20 6d 75 74 65 78 20 69 73 20 6e 6f  e.** mutex is no
1fb20 74 20 72 65 6c 65 61 73 65 64 20 62 79 20 75 6e  t released by un
1fb30 69 78 53 68 6d 52 65 6c 65 61 73 65 28 29 20 77  ixShmRelease() w
1fb40 68 65 6e 20 69 6e 20 52 45 43 4f 56 45 52 2e 0a  hen in RECOVER..
1fb50 2a 2a 0a 2a 2a 20 2a 70 4e 65 77 4d 61 70 53 69  **.** *pNewMapSi
1fb60 7a 65 20 69 73 20 73 65 74 20 74 6f 20 74 68 65  ze is set to the
1fb70 20 73 69 7a 65 20 6f 66 20 74 68 65 20 6d 61 70   size of the map
1fb80 70 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 2a 70 70 42  ping..**.** *ppB
1fb90 75 66 20 61 6e 64 20 2a 70 4e 65 77 4d 61 70 53  uf and *pNewMapS
1fba0 69 7a 65 20 6d 69 67 68 74 20 62 65 20 4e 55 4c  ize might be NUL
1fbb0 4c 20 61 6e 64 20 7a 65 72 6f 20 69 66 20 6e 6f  L and zero if no
1fbc0 20 73 70 61 63 65 20 68 61 73 0a 2a 2a 20 79 65   space has.** ye
1fbd0 74 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64  t been allocated
1fbe0 20 74 6f 20 74 68 65 20 75 6e 64 65 72 6c 79 69   to the underlyi
1fbf0 6e 67 20 73 74 6f 72 61 67 65 2e 0a 2a 2f 0a 73  ng storage..*/.s
1fc00 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 53 68  tatic int unixSh
1fc10 6d 47 65 74 28 0a 20 20 73 71 6c 69 74 65 33 5f  mGet(.  sqlite3_
1fc20 66 69 6c 65 20 2a 66 64 2c 20 20 20 20 20 20 20  file *fd,       
1fc30 20 2f 2a 20 44 61 74 61 62 61 73 65 20 66 69 6c   /* Database fil
1fc40 65 20 68 6f 6c 64 69 6e 67 20 73 68 61 72 65 64  e holding shared
1fc50 20 6d 65 6d 6f 72 79 20 2a 2f 0a 20 20 69 6e 74   memory */.  int
1fc60 20 72 65 71 4d 61 70 53 69 7a 65 2c 20 20 20 20   reqMapSize,    
1fc70 20 20 20 20 20 20 2f 2a 20 52 65 71 75 65 73 74        /* Request
1fc80 65 64 20 73 69 7a 65 20 6f 66 20 6d 61 70 70 69  ed size of mappi
1fc90 6e 67 2e 20 2d 31 20 6d 65 61 6e 73 20 64 6f 6e  ng. -1 means don
1fca0 27 74 20 63 61 72 65 20 2a 2f 0a 20 20 69 6e 74  't care */.  int
1fcb0 20 2a 70 4e 65 77 4d 61 70 53 69 7a 65 2c 20 20   *pNewMapSize,  
1fcc0 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 6e        /* Write n
1fcd0 65 77 20 73 69 7a 65 20 6f 66 20 6d 61 70 70 69  ew size of mappi
1fce0 6e 67 20 68 65 72 65 20 2a 2f 0a 20 20 76 6f 69  ng here */.  voi
1fcf0 64 20 2a 2a 70 70 42 75 66 20 20 20 20 20 20 20  d **ppBuf       
1fd00 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 6d        /* Write m
1fd10 61 70 70 69 6e 67 20 62 75 66 66 65 72 20 6f 72  apping buffer or
1fd20 69 67 69 6e 20 68 65 72 65 20 2a 2f 0a 29 7b 0a  igin here */.){.
1fd30 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 44 62 46    unixFile *pDbF
1fd40 64 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 66  d = (unixFile*)f
1fd50 64 3b 0a 20 20 75 6e 69 78 53 68 6d 20 2a 70 20  d;.  unixShm *p 
1fd60 3d 20 70 44 62 46 64 2d 3e 70 53 68 6d 3b 0a 20  = pDbFd->pShm;. 
1fd70 20 75 6e 69 78 53 68 6d 46 69 6c 65 20 2a 70 46   unixShmFile *pF
1fd80 69 6c 65 20 3d 20 70 2d 3e 70 46 69 6c 65 3b 0a  ile = p->pFile;.
1fd90 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
1fda0 45 5f 4f 4b 3b 0a 0a 20 20 69 66 28 20 70 2d 3e  E_OK;..  if( p->
1fdb0 6c 6f 63 6b 53 74 61 74 65 21 3d 53 51 4c 49 54  lockState!=SQLIT
1fdc0 45 5f 53 48 4d 5f 43 48 45 43 4b 50 4f 49 4e 54  E_SHM_CHECKPOINT
1fdd0 20 26 26 20 70 2d 3e 68 61 73 4d 75 74 65 78 42   && p->hasMutexB
1fde0 75 66 3d 3d 30 20 29 7b 0a 20 20 20 20 61 73 73  uf==0 ){.    ass
1fdf0 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
1fe00 65 78 5f 6e 6f 74 68 65 6c 64 28 70 46 69 6c 65  ex_notheld(pFile
1fe10 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 20 20  ->mutex) );.    
1fe20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e  sqlite3_mutex_en
1fe30 74 65 72 28 70 46 69 6c 65 2d 3e 6d 75 74 65 78  ter(pFile->mutex
1fe40 42 75 66 29 3b 0a 20 20 20 20 70 2d 3e 68 61 73  Buf);.    p->has
1fe50 4d 75 74 65 78 42 75 66 20 3d 20 31 3b 0a 20 20  MutexBuf = 1;.  
1fe60 7d 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  }.  sqlite3_mute
1fe70 78 5f 65 6e 74 65 72 28 70 46 69 6c 65 2d 3e 6d  x_enter(pFile->m
1fe80 75 74 65 78 29 3b 0a 20 20 69 66 28 20 70 46 69  utex);.  if( pFi
1fe90 6c 65 2d 3e 73 7a 4d 61 70 3d 3d 30 20 7c 7c 20  le->szMap==0 || 
1fea0 72 65 71 4d 61 70 53 69 7a 65 3e 70 46 69 6c 65  reqMapSize>pFile
1feb0 2d 3e 73 7a 4d 61 70 20 29 7b 0a 20 20 20 20 69  ->szMap ){.    i
1fec0 6e 74 20 61 63 74 75 61 6c 53 69 7a 65 3b 0a 20  nt actualSize;. 
1fed0 20 20 20 69 66 28 20 75 6e 69 78 53 68 6d 53 69     if( unixShmSi
1fee0 7a 65 28 66 64 2c 20 2d 31 2c 20 26 61 63 74 75  ze(fd, -1, &actu
1fef0 61 6c 53 69 7a 65 29 3d 3d 53 51 4c 49 54 45 5f  alSize)==SQLITE_
1ff00 4f 4b 0a 20 20 20 20 20 26 26 20 72 65 71 4d 61  OK.     && reqMa
1ff10 70 53 69 7a 65 3c 61 63 74 75 61 6c 53 69 7a 65  pSize<actualSize
1ff20 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 72 65  .    ){.      re
1ff30 71 4d 61 70 53 69 7a 65 20 3d 20 61 63 74 75 61  qMapSize = actua
1ff40 6c 53 69 7a 65 3b 0a 20 20 20 20 7d 0a 20 20 20  lSize;.    }.   
1ff50 20 69 66 28 20 70 46 69 6c 65 2d 3e 70 4d 4d 61   if( pFile->pMMa
1ff60 70 42 75 66 20 29 7b 0a 20 20 20 20 20 20 6d 75  pBuf ){.      mu
1ff70 6e 6d 61 70 28 70 46 69 6c 65 2d 3e 70 4d 4d 61  nmap(pFile->pMMa
1ff80 70 42 75 66 2c 20 70 46 69 6c 65 2d 3e 73 7a 4d  pBuf, pFile->szM
1ff90 61 70 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  ap);.    }.    p
1ffa0 46 69 6c 65 2d 3e 70 4d 4d 61 70 42 75 66 20 3d  File->pMMapBuf =
1ffb0 20 6d 6d 61 70 28 30 2c 20 72 65 71 4d 61 70 53   mmap(0, reqMapS
1ffc0 69 7a 65 2c 20 50 52 4f 54 5f 52 45 41 44 7c 50  ize, PROT_READ|P
1ffd0 52 4f 54 5f 57 52 49 54 45 2c 20 4d 41 50 5f 53  ROT_WRITE, MAP_S
1ffe0 48 41 52 45 44 2c 0a 20 20 20 20 20 20 20 20 20  HARED,.         
1fff0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20000 20 20 70 46 69 6c 65 2d 3e 68 2c 20 30 29 3b 0a    pFile->h, 0);.
20010 20 20 20 20 70 46 69 6c 65 2d 3e 73 7a 4d 61 70      pFile->szMap
20020 20 3d 20 70 46 69 6c 65 2d 3e 70 4d 4d 61 70 42   = pFile->pMMapB
20030 75 66 20 3f 20 72 65 71 4d 61 70 53 69 7a 65 20  uf ? reqMapSize 
20040 3a 20 30 3b 0a 20 20 7d 0a 20 20 2a 70 4e 65 77  : 0;.  }.  *pNew
20050 4d 61 70 53 69 7a 65 20 3d 20 70 46 69 6c 65 2d  MapSize = pFile-
20060 3e 73 7a 4d 61 70 3b 0a 20 20 2a 70 70 42 75 66  >szMap;.  *ppBuf
20070 20 3d 20 70 46 69 6c 65 2d 3e 70 4d 4d 61 70 42   = pFile->pMMapB
20080 75 66 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75  uf;.  sqlite3_mu
20090 74 65 78 5f 6c 65 61 76 65 28 70 46 69 6c 65 2d  tex_leave(pFile-
200a0 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72  >mutex);.  retur
200b0 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  n rc;.}../*.** R
200c0 65 6c 65 61 73 65 20 74 68 65 20 6c 6f 63 6b 20  elease the lock 
200d0 68 65 6c 64 20 6f 6e 20 74 68 65 20 73 68 61 72  held on the shar
200e0 65 64 20 6d 65 6d 6f 72 79 20 73 65 67 6d 65 6e  ed memory segmen
200f0 74 20 74 6f 20 74 68 61 74 20 6f 74 68 65 72 0a  t to that other.
20100 2a 2a 20 74 68 72 65 61 64 73 20 61 72 65 20 66  ** threads are f
20110 72 65 65 20 74 6f 20 72 65 73 69 7a 65 20 69 74  ree to resize it
20120 20 69 66 20 6e 65 63 65 73 73 61 72 79 2e 0a 2a   if necessary..*
20130 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6c 6f 63 6b  *.** If the lock
20140 20 69 73 20 6e 6f 74 20 63 75 72 72 65 6e 74 6c   is not currentl
20150 79 20 68 65 6c 64 2c 20 74 68 69 73 20 72 6f 75  y held, this rou
20160 74 69 6e 65 20 69 73 20 61 20 68 61 72 6d 6c 65  tine is a harmle
20170 73 73 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20  ss no-op..**.** 
20180 49 66 20 74 68 65 20 73 68 61 72 65 64 2d 6d 65  If the shared-me
20190 6d 6f 72 79 20 6f 62 6a 65 63 74 20 69 73 20 69  mory object is i
201a0 6e 20 6c 6f 63 6b 20 73 74 61 74 65 20 52 45 43  n lock state REC
201b0 4f 56 45 52 2c 20 74 68 65 6e 20 77 65 20 64 6f  OVER, then we do
201c0 20 6e 6f 74 0a 2a 2a 20 72 65 61 6c 6c 79 20 77   not.** really w
201d0 61 6e 74 20 74 6f 20 72 65 6c 65 61 73 65 20 74  ant to release t
201e0 68 65 20 6c 6f 63 6b 2c 20 73 6f 20 69 6e 20 74  he lock, so in t
201f0 68 61 74 20 63 61 73 65 20 74 6f 6f 2c 20 74 68  hat case too, th
20200 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 69 73  is routine.** is
20210 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61   a no-op..*/.sta
20220 74 69 63 20 69 6e 74 20 75 6e 69 78 53 68 6d 52  tic int unixShmR
20230 65 6c 65 61 73 65 28 73 71 6c 69 74 65 33 5f 66  elease(sqlite3_f
20240 69 6c 65 20 2a 66 64 29 7b 0a 20 20 75 6e 69 78  ile *fd){.  unix
20250 46 69 6c 65 20 2a 70 44 62 46 64 20 3d 20 28 75  File *pDbFd = (u
20260 6e 69 78 46 69 6c 65 2a 29 66 64 3b 0a 20 20 75  nixFile*)fd;.  u
20270 6e 69 78 53 68 6d 20 2a 70 20 3d 20 70 44 62 46  nixShm *p = pDbF
20280 64 2d 3e 70 53 68 6d 3b 0a 0a 20 20 69 66 28 20  d->pShm;..  if( 
20290 70 2d 3e 68 61 73 4d 75 74 65 78 42 75 66 20 26  p->hasMutexBuf &
202a0 26 20 70 2d 3e 6c 6f 63 6b 53 74 61 74 65 21 3d  & p->lockState!=
202b0 53 51 4c 49 54 45 5f 53 48 4d 5f 52 45 43 4f 56  SQLITE_SHM_RECOV
202c0 45 52 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  ER ){.    assert
202d0 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
202e0 6e 6f 74 68 65 6c 64 28 70 2d 3e 70 46 69 6c 65  notheld(p->pFile
202f0 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 20 20  ->mutex) );.    
20300 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65  sqlite3_mutex_le
20310 61 76 65 28 70 2d 3e 70 46 69 6c 65 2d 3e 6d 75  ave(p->pFile->mu
20320 74 65 78 42 75 66 29 3b 0a 20 20 20 20 70 2d 3e  texBuf);.    p->
20330 68 61 73 4d 75 74 65 78 42 75 66 20 3d 20 30 3b  hasMutexBuf = 0;
20340 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51  .  }.  return SQ
20350 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
20360 2a 20 53 79 6d 62 6f 6c 69 63 20 6e 61 6d 65 73  * Symbolic names
20370 20 66 6f 72 20 4c 4f 43 4b 20 73 74 61 74 65 73   for LOCK states
20380 20 75 73 65 64 20 66 6f 72 20 64 65 62 75 67 67   used for debugg
20390 69 6e 67 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53  ing..*/.#ifdef S
203a0 51 4c 49 54 45 5f 44 45 42 55 47 0a 73 74 61 74  QLITE_DEBUG.stat
203b0 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 61  ic const char *a
203c0 7a 4c 6b 4e 61 6d 65 5b 5d 20 3d 20 7b 0a 20 20  zLkName[] = {.  
203d0 22 55 4e 4c 4f 43 4b 22 2c 0a 20 20 22 52 45 41  "UNLOCK",.  "REA
203e0 44 22 2c 0a 20 20 22 52 45 41 44 5f 46 55 4c 4c  D",.  "READ_FULL
203f0 22 2c 0a 20 20 22 57 52 49 54 45 22 2c 0a 20 20  ",.  "WRITE",.  
20400 22 50 45 4e 44 49 4e 47 22 2c 0a 20 20 22 43 48  "PENDING",.  "CH
20410 45 43 4b 50 4f 49 4e 54 22 2c 0a 20 20 22 52 45  ECKPOINT",.  "RE
20420 43 4f 56 45 52 22 0a 7d 3b 0a 23 65 6e 64 69 66  COVER".};.#endif
20430 0a 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20  .../*.** Change 
20440 74 68 65 20 6c 6f 63 6b 20 73 74 61 74 65 20 66  the lock state f
20450 6f 72 20 61 20 73 68 61 72 65 64 2d 6d 65 6d 6f  or a shared-memo
20460 72 79 20 73 65 67 6d 65 6e 74 2e 0a 2a 2f 0a 73  ry segment..*/.s
20470 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 53 68  tatic int unixSh
20480 6d 4c 6f 63 6b 28 0a 20 20 73 71 6c 69 74 65 33  mLock(.  sqlite3
20490 5f 66 69 6c 65 20 2a 66 64 2c 20 20 20 20 20 20  _file *fd,      
204a0 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20      /* Database 
204b0 66 69 6c 65 20 68 6f 6c 64 69 6e 67 20 74 68 65  file holding the
204c0 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 2a   shared memory *
204d0 2f 0a 20 20 69 6e 74 20 64 65 73 69 72 65 64 4c  /.  int desiredL
204e0 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20 2f  ock,           /
204f0 2a 20 4f 6e 65 20 6f 66 20 53 51 4c 49 54 45 5f  * One of SQLITE_
20500 53 48 4d 5f 78 78 78 78 78 20 6c 6f 63 6b 69 6e  SHM_xxxxx lockin
20510 67 20 73 74 61 74 65 73 20 2a 2f 0a 20 20 69 6e  g states */.  in
20520 74 20 2a 70 47 6f 74 4c 6f 63 6b 20 20 20 20 20  t *pGotLock     
20530 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
20540 6c 6f 63 6b 20 79 6f 75 20 61 63 74 75 61 6c 6c  lock you actuall
20550 79 20 67 6f 74 20 2a 2f 0a 29 7b 0a 20 20 75 6e  y got */.){.  un
20560 69 78 46 69 6c 65 20 2a 70 44 62 46 64 20 3d 20  ixFile *pDbFd = 
20570 28 75 6e 69 78 46 69 6c 65 2a 29 66 64 3b 0a 20  (unixFile*)fd;. 
20580 20 75 6e 69 78 53 68 6d 20 2a 70 20 3d 20 70 44   unixShm *p = pD
20590 62 46 64 2d 3e 70 53 68 6d 3b 0a 20 20 75 6e 69  bFd->pShm;.  uni
205a0 78 53 68 6d 46 69 6c 65 20 2a 70 46 69 6c 65 20  xShmFile *pFile 
205b0 3d 20 70 2d 3e 70 46 69 6c 65 3b 0a 20 20 69 6e  = p->pFile;.  in
205c0 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 50 52  t rc = SQLITE_PR
205d0 4f 54 4f 43 4f 4c 3b 0a 0a 20 20 2f 2a 20 4e 6f  OTOCOL;..  /* No
205e0 74 65 20 74 68 61 74 20 53 51 4c 49 54 45 5f 53  te that SQLITE_S
205f0 48 4d 5f 52 45 41 44 5f 46 55 4c 4c 20 61 6e 64  HM_READ_FULL and
20600 20 53 51 4c 49 54 45 5f 53 48 4d 5f 50 45 4e 44   SQLITE_SHM_PEND
20610 49 4e 47 20 61 72 65 20 6e 65 76 65 72 0a 20 20  ING are never.  
20620 2a 2a 20 64 69 72 65 63 74 6c 79 20 72 65 71 75  ** directly requ
20630 65 73 74 65 64 3b 20 74 68 65 79 20 61 72 65 20  ested; they are 
20640 73 69 64 65 20 65 66 66 65 63 74 73 20 66 72 6f  side effects fro
20650 6d 20 72 65 71 75 65 73 74 69 6e 67 0a 20 20 2a  m requesting.  *
20660 2a 20 53 51 4c 49 54 45 5f 53 48 4d 5f 52 45 41  * SQLITE_SHM_REA
20670 44 20 61 6e 64 20 53 51 4c 49 54 45 5f 53 48 4d  D and SQLITE_SHM
20680 5f 43 48 45 43 4b 50 4f 49 4e 54 2c 20 72 65 73  _CHECKPOINT, res
20690 70 65 63 74 69 76 65 6c 79 2e 0a 20 20 2a 2f 0a  pectively..  */.
206a0 20 20 61 73 73 65 72 74 28 20 64 65 73 69 72 65    assert( desire
206b0 64 4c 6f 63 6b 3d 3d 53 51 4c 49 54 45 5f 53 48  dLock==SQLITE_SH
206c0 4d 5f 55 4e 4c 4f 43 4b 0a 20 20 20 20 20 20 20  M_UNLOCK.       
206d0 7c 7c 20 64 65 73 69 72 65 64 4c 6f 63 6b 3d 3d  || desiredLock==
206e0 53 51 4c 49 54 45 5f 53 48 4d 5f 52 45 41 44 0a  SQLITE_SHM_READ.
206f0 20 20 20 20 20 20 20 7c 7c 20 64 65 73 69 72 65         || desire
20700 64 4c 6f 63 6b 3d 3d 53 51 4c 49 54 45 5f 53 48  dLock==SQLITE_SH
20710 4d 5f 57 52 49 54 45 0a 20 20 20 20 20 20 20 7c  M_WRITE.       |
20720 7c 20 64 65 73 69 72 65 64 4c 6f 63 6b 3d 3d 53  | desiredLock==S
20730 51 4c 49 54 45 5f 53 48 4d 5f 43 48 45 43 4b 50  QLITE_SHM_CHECKP
20740 4f 49 4e 54 0a 20 20 20 20 20 20 20 7c 7c 20 64  OINT.       || d
20750 65 73 69 72 65 64 4c 6f 63 6b 3d 3d 53 51 4c 49  esiredLock==SQLI
20760 54 45 5f 53 48 4d 5f 52 45 43 4f 56 45 52 20 29  TE_SHM_RECOVER )
20770 3b 0a 0a 20 20 2f 2a 20 52 65 74 75 72 6e 20 64  ;..  /* Return d
20780 69 72 65 63 74 6c 79 20 69 66 20 74 68 69 73 20  irectly if this 
20790 69 73 20 6a 75 73 74 20 61 20 6c 6f 63 6b 20 73  is just a lock s
207a0 74 61 74 65 20 71 75 65 72 79 2c 20 6f 72 20 69  tate query, or i
207b0 66 0a 20 20 2a 2a 20 74 68 65 20 63 6f 6e 6e 65  f.  ** the conne
207c0 63 74 69 6f 6e 20 69 73 20 61 6c 72 65 61 64 79  ction is already
207d0 20 69 6e 20 74 68 65 20 64 65 73 69 72 65 64 20   in the desired 
207e0 6c 6f 63 6b 69 6e 67 20 73 74 61 74 65 2e 0a 20  locking state.. 
207f0 20 2a 2f 0a 20 20 69 66 28 20 64 65 73 69 72 65   */.  if( desire
20800 64 4c 6f 63 6b 3d 3d 70 2d 3e 6c 6f 63 6b 53 74  dLock==p->lockSt
20810 61 74 65 0a 20 20 20 7c 7c 20 28 64 65 73 69 72  ate.   || (desir
20820 65 64 4c 6f 63 6b 3d 3d 53 51 4c 49 54 45 5f 53  edLock==SQLITE_S
20830 48 4d 5f 52 45 41 44 20 26 26 20 70 2d 3e 6c 6f  HM_READ && p->lo
20840 63 6b 53 74 61 74 65 3d 3d 53 51 4c 49 54 45 5f  ckState==SQLITE_
20850 53 48 4d 5f 52 45 41 44 5f 46 55 4c 4c 29 0a 20  SHM_READ_FULL). 
20860 20 29 7b 0a 20 20 20 20 4f 53 54 52 41 43 45 28   ){.    OSTRACE(
20870 28 22 53 48 4d 2d 4c 4f 43 4b 20 73 68 6d 69 64  ("SHM-LOCK shmid
20880 2d 25 64 2c 20 70 69 64 2d 25 64 20 72 65 71 75  -%d, pid-%d requ
20890 65 73 74 20 25 73 20 61 6e 64 20 67 6f 74 20 25  est %s and got %
208a0 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  s\n",.          
208b0 20 20 20 70 2d 3e 69 64 2c 20 67 65 74 70 69 64     p->id, getpid
208c0 28 29 2c 20 61 7a 4c 6b 4e 61 6d 65 5b 64 65 73  (), azLkName[des
208d0 69 72 65 64 4c 6f 63 6b 5d 2c 20 61 7a 4c 6b 4e  iredLock], azLkN
208e0 61 6d 65 5b 70 2d 3e 6c 6f 63 6b 53 74 61 74 65  ame[p->lockState
208f0 5d 29 29 3b 0a 20 20 20 20 69 66 28 20 70 47 6f  ]));.    if( pGo
20900 74 4c 6f 63 6b 20 29 20 2a 70 47 6f 74 4c 6f 63  tLock ) *pGotLoc
20910 6b 20 3d 20 70 2d 3e 6c 6f 63 6b 53 74 61 74 65  k = p->lockState
20920 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
20930 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 4f  ITE_OK;.  }..  O
20940 53 54 52 41 43 45 28 28 22 53 48 4d 2d 4c 4f 43  STRACE(("SHM-LOC
20950 4b 20 73 68 6d 69 64 2d 25 64 2c 20 70 69 64 2d  K shmid-%d, pid-
20960 25 64 20 72 65 71 75 65 73 74 20 25 73 2d 3e 25  %d request %s->%
20970 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  s\n",.          
20980 20 20 70 2d 3e 69 64 2c 20 67 65 74 70 69 64 28    p->id, getpid(
20990 29 2c 20 61 7a 4c 6b 4e 61 6d 65 5b 70 2d 3e 6c  ), azLkName[p->l
209a0 6f 63 6b 53 74 61 74 65 5d 2c 20 61 7a 4c 6b 4e  ockState], azLkN
209b0 61 6d 65 5b 64 65 73 69 72 65 64 4c 6f 63 6b 5d  ame[desiredLock]
209c0 29 29 3b 0a 20 20 0a 20 20 69 66 28 20 64 65 73  ));.  .  if( des
209d0 69 72 65 64 4c 6f 63 6b 3d 3d 53 51 4c 49 54 45  iredLock==SQLITE
209e0 5f 53 48 4d 5f 52 45 43 4f 56 45 52 20 26 26 20  _SHM_RECOVER && 
209f0 21 70 2d 3e 68 61 73 4d 75 74 65 78 42 75 66 20  !p->hasMutexBuf 
20a00 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73  ){.    assert( s
20a10 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6e 6f 74  qlite3_mutex_not
20a20 68 65 6c 64 28 70 46 69 6c 65 2d 3e 6d 75 74 65  held(pFile->mute
20a30 78 29 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  x) );.    sqlite
20a40 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 70 46  3_mutex_enter(pF
20a50 69 6c 65 2d 3e 6d 75 74 65 78 42 75 66 29 3b 0a  ile->mutexBuf);.
20a60 20 20 20 20 70 2d 3e 68 61 73 4d 75 74 65 78 42      p->hasMutexB
20a70 75 66 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 73 71  uf = 1;.  }.  sq
20a80 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65  lite3_mutex_ente
20a90 72 28 70 46 69 6c 65 2d 3e 6d 75 74 65 78 29 3b  r(pFile->mutex);
20aa0 0a 20 20 73 77 69 74 63 68 28 20 64 65 73 69 72  .  switch( desir
20ab0 65 64 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 63 61  edLock ){.    ca
20ac0 73 65 20 53 51 4c 49 54 45 5f 53 48 4d 5f 55 4e  se SQLITE_SHM_UN
20ad0 4c 4f 43 4b 3a 20 7b 0a 20 20 20 20 20 20 61 73  LOCK: {.      as
20ae0 73 65 72 74 28 20 70 2d 3e 6c 6f 63 6b 53 74 61  sert( p->lockSta
20af0 74 65 21 3d 53 51 4c 49 54 45 5f 53 48 4d 5f 52  te!=SQLITE_SHM_R
20b00 45 43 4f 56 45 52 20 29 3b 0a 20 20 20 20 20 20  ECOVER );.      
20b10 75 6e 69 78 53 68 6d 55 6e 6c 6f 63 6b 28 70 46  unixShmUnlock(pF
20b20 69 6c 65 2c 20 70 2c 20 55 4e 49 58 5f 53 48 4d  ile, p, UNIX_SHM
20b30 5f 41 7c 55 4e 49 58 5f 53 48 4d 5f 42 7c 55 4e  _A|UNIX_SHM_B|UN
20b40 49 58 5f 53 48 4d 5f 43 7c 55 4e 49 58 5f 53 48  IX_SHM_C|UNIX_SH
20b50 4d 5f 44 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  M_D);.      rc =
20b60 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
20b70 20 20 70 2d 3e 6c 6f 63 6b 53 74 61 74 65 20 3d    p->lockState =
20b80 20 53 51 4c 49 54 45 5f 53 48 4d 5f 55 4e 4c 4f   SQLITE_SHM_UNLO
20b90 43 4b 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  CK;.      break;
20ba0 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
20bb0 53 51 4c 49 54 45 5f 53 48 4d 5f 52 45 41 44 3a  SQLITE_SHM_READ:
20bc0 20 7b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e   {.      if( p->
20bd0 6c 6f 63 6b 53 74 61 74 65 3d 3d 53 51 4c 49 54  lockState==SQLIT
20be0 45 5f 53 48 4d 5f 55 4e 4c 4f 43 4b 20 29 7b 0a  E_SHM_UNLOCK ){.
20bf0 20 20 20 20 20 20 20 20 69 6e 74 20 6e 41 74 74          int nAtt
20c00 65 6d 70 74 3b 0a 20 20 20 20 20 20 20 20 72 63  empt;.        rc
20c10 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a   = SQLITE_BUSY;.
20c20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
20c30 70 2d 3e 6c 6f 63 6b 53 74 61 74 65 3d 3d 53 51  p->lockState==SQ
20c40 4c 49 54 45 5f 53 48 4d 5f 55 4e 4c 4f 43 4b 20  LITE_SHM_UNLOCK 
20c50 29 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 6e  );.        for(n
20c60 41 74 74 65 6d 70 74 3d 30 3b 20 6e 41 74 74 65  Attempt=0; nAtte
20c70 6d 70 74 3c 35 20 26 26 20 72 63 3d 3d 53 51 4c  mpt<5 && rc==SQL
20c80 49 54 45 5f 42 55 53 59 3b 20 6e 41 74 74 65 6d  ITE_BUSY; nAttem
20c90 70 74 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20  pt++){.         
20ca0 20 72 63 20 3d 20 75 6e 69 78 53 68 6d 53 68 61   rc = unixShmSha
20cb0 72 65 64 4c 6f 63 6b 28 70 46 69 6c 65 2c 20 70  redLock(pFile, p
20cc0 2c 20 55 4e 49 58 5f 53 48 4d 5f 41 7c 55 4e 49  , UNIX_SHM_A|UNI
20cd0 58 5f 53 48 4d 5f 42 29 3b 0a 20 20 20 20 20 20  X_SHM_B);.      
20ce0 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
20cf0 54 45 5f 42 55 53 59 20 29 7b 0a 20 20 20 20 20  TE_BUSY ){.     
20d00 20 20 20 20 20 20 20 72 63 20 3d 20 75 6e 69 78         rc = unix
20d10 53 68 6d 53 68 61 72 65 64 4c 6f 63 6b 28 70 46  ShmSharedLock(pF
20d20 69 6c 65 2c 20 70 2c 20 55 4e 49 58 5f 53 48 4d  ile, p, UNIX_SHM
20d30 5f 44 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  _D);.           
20d40 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
20d50 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
20d60 20 20 20 20 70 2d 3e 6c 6f 63 6b 53 74 61 74 65      p->lockState
20d70 20 3d 20 53 51 4c 49 54 45 5f 53 48 4d 5f 52 45   = SQLITE_SHM_RE
20d80 41 44 5f 46 55 4c 4c 3b 0a 20 20 20 20 20 20 20  AD_FULL;.       
20d90 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
20da0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
20db0 20 20 20 20 75 6e 69 78 53 68 6d 55 6e 6c 6f 63      unixShmUnloc
20dc0 6b 28 70 46 69 6c 65 2c 20 70 2c 20 55 4e 49 58  k(pFile, p, UNIX
20dd0 5f 53 48 4d 5f 42 29 3b 0a 20 20 20 20 20 20 20  _SHM_B);.       
20de0 20 20 20 20 20 70 2d 3e 6c 6f 63 6b 53 74 61 74       p->lockStat
20df0 65 20 3d 20 53 51 4c 49 54 45 5f 53 48 4d 5f 52  e = SQLITE_SHM_R
20e00 45 41 44 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  EAD;.          }
20e10 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
20e20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 61   }else{.       a
20e30 73 73 65 72 74 28 20 70 2d 3e 6c 6f 63 6b 53 74  ssert( p->lockSt
20e40 61 74 65 3d 3d 53 51 4c 49 54 45 5f 53 48 4d 5f  ate==SQLITE_SHM_
20e50 57 52 49 54 45 0a 20 20 20 20 20 20 20 20 20 20  WRITE.          
20e60 20 20 20 20 20 7c 7c 20 70 2d 3e 6c 6f 63 6b 53       || p->lockS
20e70 74 61 74 65 3d 3d 53 51 4c 49 54 45 5f 53 48 4d  tate==SQLITE_SHM
20e80 5f 52 45 43 4f 56 45 52 20 29 3b 0a 20 20 20 20  _RECOVER );.    
20e90 20 20 20 20 72 63 20 3d 20 75 6e 69 78 53 68 6d      rc = unixShm
20ea0 53 68 61 72 65 64 4c 6f 63 6b 28 70 46 69 6c 65  SharedLock(pFile
20eb0 2c 20 70 2c 20 55 4e 49 58 5f 53 48 4d 5f 41 29  , p, UNIX_SHM_A)
20ec0 3b 0a 20 20 20 20 20 20 20 20 75 6e 69 78 53 68  ;.        unixSh
20ed0 6d 55 6e 6c 6f 63 6b 28 70 46 69 6c 65 2c 20 70  mUnlock(pFile, p
20ee0 2c 20 55 4e 49 58 5f 53 48 4d 5f 43 7c 55 4e 49  , UNIX_SHM_C|UNI
20ef0 58 5f 53 48 4d 5f 44 29 3b 0a 20 20 20 20 20 20  X_SHM_D);.      
20f00 20 20 70 2d 3e 6c 6f 63 6b 53 74 61 74 65 20 3d    p->lockState =
20f10 20 53 51 4c 49 54 45 5f 53 48 4d 5f 52 45 41 44   SQLITE_SHM_READ
20f20 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
20f30 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
20f40 20 63 61 73 65 20 53 51 4c 49 54 45 5f 53 48 4d   case SQLITE_SHM
20f50 5f 57 52 49 54 45 3a 20 7b 0a 20 20 20 20 20 20  _WRITE: {.      
20f60 61 73 73 65 72 74 28 20 70 2d 3e 6c 6f 63 6b 53  assert( p->lockS
20f70 74 61 74 65 3d 3d 53 51 4c 49 54 45 5f 53 48 4d  tate==SQLITE_SHM
20f80 5f 52 45 41 44 20 0a 20 20 20 20 20 20 20 20 20  _READ .         
20f90 20 20 20 20 20 7c 7c 20 70 2d 3e 6c 6f 63 6b 53       || p->lockS
20fa0 74 61 74 65 3d 3d 53 51 4c 49 54 45 5f 53 48 4d  tate==SQLITE_SHM
20fb0 5f 52 45 41 44 5f 46 55 4c 4c 20 29 3b 0a 20 20  _READ_FULL );.  
20fc0 20 20 20 20 72 63 20 3d 20 75 6e 69 78 53 68 6d      rc = unixShm
20fd0 45 78 63 6c 75 73 69 76 65 4c 6f 63 6b 28 70 46  ExclusiveLock(pF
20fe0 69 6c 65 2c 20 70 2c 20 55 4e 49 58 5f 53 48 4d  ile, p, UNIX_SHM
20ff0 5f 43 7c 55 4e 49 58 5f 53 48 4d 5f 44 29 3b 0a  _C|UNIX_SHM_D);.
21000 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
21010 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
21020 20 20 20 70 2d 3e 6c 6f 63 6b 53 74 61 74 65 20     p->lockState 
21030 3d 20 53 51 4c 49 54 45 5f 53 48 4d 5f 57 52 49  = SQLITE_SHM_WRI
21040 54 45 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  TE;.      }.    
21050 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
21060 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 53     case SQLITE_S
21070 48 4d 5f 43 48 45 43 4b 50 4f 49 4e 54 3a 20 7b  HM_CHECKPOINT: {
21080 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
21090 2d 3e 6c 6f 63 6b 53 74 61 74 65 3d 3d 53 51 4c  ->lockState==SQL
210a0 49 54 45 5f 53 48 4d 5f 55 4e 4c 4f 43 4b 0a 20  ITE_SHM_UNLOCK. 
210b0 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70 2d 3e            || p->
210c0 6c 6f 63 6b 53 74 61 74 65 3d 3d 53 51 4c 49 54  lockState==SQLIT
210d0 45 5f 53 48 4d 5f 50 45 4e 44 49 4e 47 0a 20 20  E_SHM_PENDING.  
210e0 20 20 20 20 29 3b 0a 20 20 20 20 20 20 69 66 28      );.      if(
210f0 20 70 2d 3e 6c 6f 63 6b 53 74 61 74 65 3d 3d 53   p->lockState==S
21100 51 4c 49 54 45 5f 53 48 4d 5f 55 4e 4c 4f 43 4b  QLITE_SHM_UNLOCK
21110 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
21120 20 75 6e 69 78 53 68 6d 45 78 63 6c 75 73 69 76   unixShmExclusiv
21130 65 4c 6f 63 6b 28 70 46 69 6c 65 2c 20 70 2c 20  eLock(pFile, p, 
21140 55 4e 49 58 5f 53 48 4d 5f 42 7c 55 4e 49 58 5f  UNIX_SHM_B|UNIX_
21150 53 48 4d 5f 43 29 3b 0a 20 20 20 20 20 20 20 20  SHM_C);.        
21160 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
21170 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70  K ){.          p
21180 2d 3e 6c 6f 63 6b 53 74 61 74 65 20 3d 20 53 51  ->lockState = SQ
21190 4c 49 54 45 5f 53 48 4d 5f 50 45 4e 44 49 4e 47  LITE_SHM_PENDING
211a0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
211b0 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 2d    }.      if( p-
211c0 3e 6c 6f 63 6b 53 74 61 74 65 3d 3d 53 51 4c 49  >lockState==SQLI
211d0 54 45 5f 53 48 4d 5f 50 45 4e 44 49 4e 47 20 29  TE_SHM_PENDING )
211e0 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 75  {.        rc = u
211f0 6e 69 78 53 68 6d 45 78 63 6c 75 73 69 76 65 4c  nixShmExclusiveL
21200 6f 63 6b 28 70 46 69 6c 65 2c 20 70 2c 20 55 4e  ock(pFile, p, UN
21210 49 58 5f 53 48 4d 5f 41 29 3b 0a 20 20 20 20 20  IX_SHM_A);.     
21220 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
21230 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
21240 20 20 70 2d 3e 6c 6f 63 6b 53 74 61 74 65 20 3d    p->lockState =
21250 20 53 51 4c 49 54 45 5f 53 48 4d 5f 43 48 45 43   SQLITE_SHM_CHEC
21260 4b 50 4f 49 4e 54 3b 0a 20 20 20 20 20 20 20 20  KPOINT;.        
21270 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
21280 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
21290 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20   default: {.    
212a0 20 20 61 73 73 65 72 74 28 20 64 65 73 69 72 65    assert( desire
212b0 64 4c 6f 63 6b 3d 3d 53 51 4c 49 54 45 5f 53 48  dLock==SQLITE_SH
212c0 4d 5f 52 45 43 4f 56 45 52 20 29 3b 0a 20 20 20  M_RECOVER );.   
212d0 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6c 6f     assert( p->lo
212e0 63 6b 53 74 61 74 65 3d 3d 53 51 4c 49 54 45 5f  ckState==SQLITE_
212f0 53 48 4d 5f 52 45 41 44 0a 20 20 20 20 20 20 20  SHM_READ.       
21300 20 20 20 20 7c 7c 20 70 2d 3e 6c 6f 63 6b 53 74      || p->lockSt
21310 61 74 65 3d 3d 53 51 4c 49 54 45 5f 53 48 4d 5f  ate==SQLITE_SHM_
21320 52 45 41 44 5f 46 55 4c 4c 0a 20 20 20 20 20 20  READ_FULL.      
21330 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
21340 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
21350 65 6c 64 28 70 46 69 6c 65 2d 3e 6d 75 74 65 78  eld(pFile->mutex
21360 42 75 66 29 20 29 3b 0a 20 20 20 20 20 20 72 63  Buf) );.      rc
21370 20 3d 20 75 6e 69 78 53 68 6d 45 78 63 6c 75 73   = unixShmExclus
21380 69 76 65 4c 6f 63 6b 28 70 46 69 6c 65 2c 20 70  iveLock(pFile, p
21390 2c 20 55 4e 49 58 5f 53 48 4d 5f 43 29 3b 0a 20  , UNIX_SHM_C);. 
213a0 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
213b0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
213c0 20 20 70 2d 3e 6c 6f 63 6b 53 74 61 74 65 20 3d    p->lockState =
213d0 20 53 51 4c 49 54 45 5f 53 48 4d 5f 52 45 43 4f   SQLITE_SHM_RECO
213e0 56 45 52 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  VER;.      }.   
213f0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
21400 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75    }.  sqlite3_mu
21410 74 65 78 5f 6c 65 61 76 65 28 70 46 69 6c 65 2d  tex_leave(pFile-
21420 3e 6d 75 74 65 78 29 3b 0a 20 20 4f 53 54 52 41  >mutex);.  OSTRA
21430 43 45 28 28 22 53 48 4d 2d 4c 4f 43 4b 20 73 68  CE(("SHM-LOCK sh
21440 6d 69 64 2d 25 64 2c 20 70 69 64 2d 25 64 20 67  mid-%d, pid-%d g
21450 6f 74 20 25 73 5c 6e 22 2c 0a 20 20 20 20 20 20  ot %s\n",.      
21460 20 20 20 20 20 70 2d 3e 69 64 2c 20 67 65 74 70       p->id, getp
21470 69 64 28 29 2c 20 61 7a 4c 6b 4e 61 6d 65 5b 70  id(), azLkName[p
21480 2d 3e 6c 6f 63 6b 53 74 61 74 65 5d 29 29 3b 0a  ->lockState]));.
21490 20 20 69 66 28 20 70 47 6f 74 4c 6f 63 6b 20 29    if( pGotLock )
214a0 20 2a 70 47 6f 74 4c 6f 63 6b 20 3d 20 70 2d 3e   *pGotLock = p->
214b0 6c 6f 63 6b 53 74 61 74 65 3b 0a 20 20 72 65 74  lockState;.  ret
214c0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 65 6c 73 65  urn rc;.}..#else
214d0 0a 23 20 64 65 66 69 6e 65 20 75 6e 69 78 53 68  .# define unixSh
214e0 6d 4f 70 65 6e 20 20 20 20 30 0a 23 20 64 65 66  mOpen    0.# def
214f0 69 6e 65 20 75 6e 69 78 53 68 6d 53 69 7a 65 20  ine unixShmSize 
21500 20 20 20 30 0a 23 20 64 65 66 69 6e 65 20 75 6e     0.# define un
21510 69 78 53 68 6d 47 65 74 20 20 20 20 20 30 0a 23  ixShmGet     0.#
21520 20 64 65 66 69 6e 65 20 75 6e 69 78 53 68 6d 52   define unixShmR
21530 65 6c 65 61 73 65 20 30 0a 23 20 64 65 66 69 6e  elease 0.# defin
21540 65 20 75 6e 69 78 53 68 6d 4c 6f 63 6b 20 20 20  e unixShmLock   
21550 20 30 0a 23 20 64 65 66 69 6e 65 20 75 6e 69 78   0.# define unix
21560 53 68 6d 43 6c 6f 73 65 20 20 20 30 0a 23 65 6e  ShmClose   0.#en
21570 64 69 66 20 2f 2a 20 23 69 66 6e 64 65 66 20 53  dif /* #ifndef S
21580 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 20 2a  QLITE_OMIT_WAL *
21590 2f 0a 0a 2f 2a 0a 2a 2a 20 48 65 72 65 20 65 6e  /../*.** Here en
215a0 64 73 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74  ds the implement
215b0 61 74 69 6f 6e 20 6f 66 20 61 6c 6c 20 73 71 6c  ation of all sql
215c0 69 74 65 33 5f 66 69 6c 65 20 6d 65 74 68 6f 64  ite3_file method
215d0 73 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  s..**.**********
215e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64  ************ End
215f0 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 4d 65   sqlite3_file Me
21600 74 68 6f 64 73 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  thods **********
21610 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
21620 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  *****.**********
21630 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
21640 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
21650 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
21660 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
21670 2a 2a 2a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  ****/../*.** Thi
21680 73 20 64 69 76 69 73 69 6f 6e 20 63 6f 6e 74 61  s division conta
21690 69 6e 73 20 64 65 66 69 6e 69 74 69 6f 6e 73 20  ins definitions 
216a0 6f 66 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65  of sqlite3_io_me
216b0 74 68 6f 64 73 20 6f 62 6a 65 63 74 73 20 74 68  thods objects th
216c0 61 74 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 20  at.** implement 
216d0 76 61 72 69 6f 75 73 20 66 69 6c 65 20 6c 6f 63  various file loc
216e0 6b 69 6e 67 20 73 74 72 61 74 65 67 69 65 73 2e  king strategies.
216f0 20 20 49 74 20 61 6c 73 6f 20 63 6f 6e 74 61 69    It also contai
21700 6e 73 20 64 65 66 69 6e 69 74 69 6f 6e 73 0a 2a  ns definitions.*
21710 2a 20 6f 66 20 22 66 69 6e 64 65 72 22 20 66 75  * of "finder" fu
21720 6e 63 74 69 6f 6e 73 2e 20 20 41 20 66 69 6e 64  nctions.  A find
21730 65 72 2d 66 75 6e 63 74 69 6f 6e 20 69 73 20 75  er-function is u
21740 73 65 64 20 74 6f 20 6c 6f 63 61 74 65 20 74 68  sed to locate th
21750 65 20 61 70 70 72 6f 70 72 69 61 74 65 0a 2a 2a  e appropriate.**
21760 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68   sqlite3_io_meth
21770 6f 64 73 20 6f 62 6a 65 63 74 20 66 6f 72 20 61  ods object for a
21780 20 70 61 72 74 69 63 75 6c 61 72 20 64 61 74 61   particular data
21790 62 61 73 65 20 66 69 6c 65 2e 20 20 54 68 65 20  base file.  The 
217a0 70 41 70 70 44 61 74 61 0a 2a 2a 20 66 69 65 6c  pAppData.** fiel
217b0 64 20 6f 66 20 74 68 65 20 73 71 6c 69 74 65 33  d of the sqlite3
217c0 5f 76 66 73 20 56 46 53 20 6f 62 6a 65 63 74 73  _vfs VFS objects
217d0 20 61 72 65 20 69 6e 69 74 69 61 6c 69 7a 65 64   are initialized
217e0 20 74 6f 20 62 65 20 70 6f 69 6e 74 65 72 73 20   to be pointers 
217f0 74 6f 0a 2a 2a 20 74 68 65 20 63 6f 72 72 65 63  to.** the correc
21800 74 20 66 69 6e 64 65 72 2d 66 75 6e 63 74 69 6f  t finder-functio
21810 6e 20 66 6f 72 20 74 68 61 74 20 56 46 53 2e 0a  n for that VFS..
21820 2a 2a 0a 2a 2a 20 4d 6f 73 74 20 66 69 6e 64 65  **.** Most finde
21830 72 20 66 75 6e 63 74 69 6f 6e 73 20 72 65 74 75  r functions retu
21840 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  rn a pointer to 
21850 61 20 66 69 78 65 64 20 73 71 6c 69 74 65 33 5f  a fixed sqlite3_
21860 69 6f 5f 6d 65 74 68 6f 64 73 0a 2a 2a 20 6f 62  io_methods.** ob
21870 6a 65 63 74 2e 20 20 54 68 65 20 6f 6e 6c 79 20  ject.  The only 
21880 69 6e 74 65 72 65 73 74 69 6e 67 20 66 69 6e 64  interesting find
21890 65 72 2d 66 75 6e 63 74 69 6f 6e 20 69 73 20 61  er-function is a
218a0 75 74 6f 6c 6f 63 6b 49 6f 46 69 6e 64 65 72 2c  utolockIoFinder,
218b0 20 77 68 69 63 68 0a 2a 2a 20 6c 6f 6f 6b 73 20   which.** looks 
218c0 61 74 20 74 68 65 20 66 69 6c 65 73 79 73 74 65  at the filesyste
218d0 6d 20 74 79 70 65 20 61 6e 64 20 74 72 69 65 73  m type and tries
218e0 20 74 6f 20 67 75 65 73 73 20 74 68 65 20 62 65   to guess the be
218f0 73 74 20 6c 6f 63 6b 69 6e 67 0a 2a 2a 20 73 74  st locking.** st
21900 72 61 74 65 67 79 20 66 72 6f 6d 20 74 68 61 74  rategy from that
21910 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 66 69 6e 64  ..**.** For find
21920 65 72 2d 66 75 6e 74 69 6f 6e 20 46 2c 20 74 77  er-funtion F, tw
21930 6f 20 6f 62 6a 65 63 74 73 20 61 72 65 20 63 72  o objects are cr
21940 65 61 74 65 64 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  eated:.**.**    
21950 28 31 29 20 54 68 65 20 72 65 61 6c 20 66 69 6e  (1) The real fin
21960 64 65 72 2d 66 75 6e 63 74 69 6f 6e 20 6e 61 6d  der-function nam
21970 65 64 20 22 46 49 6d 70 74 28 29 22 2e 0a 2a 2a  ed "FImpt()"..**
21980 0a 2a 2a 20 20 20 20 28 32 29 20 41 20 63 6f 6e  .**    (2) A con
21990 73 74 61 6e 74 20 70 6f 69 6e 74 65 72 20 74 6f  stant pointer to
219a0 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6e   this function n
219b0 61 6d 65 64 20 6a 75 73 74 20 22 46 22 2e 0a 2a  amed just "F"..*
219c0 2a 0a 2a 2a 0a 2a 2a 20 41 20 70 6f 69 6e 74 65  *.**.** A pointe
219d0 72 20 74 6f 20 74 68 65 20 46 20 70 6f 69 6e 74  r to the F point
219e0 65 72 20 69 73 20 75 73 65 64 20 61 73 20 74 68  er is used as th
219f0 65 20 70 41 70 70 44 61 74 61 20 76 61 6c 75 65  e pAppData value
21a00 20 66 6f 72 20 56 46 53 0a 2a 2a 20 6f 62 6a 65   for VFS.** obje
21a10 63 74 73 2e 20 20 57 65 20 68 61 76 65 20 74 6f  cts.  We have to
21a20 20 64 6f 20 74 68 69 73 20 69 6e 73 74 65 61 64   do this instead
21a30 20 6f 66 20 6c 65 74 74 69 6e 67 20 70 41 70 70   of letting pApp
21a40 44 61 74 61 20 70 6f 69 6e 74 0a 2a 2a 20 64 69  Data point.** di
21a50 72 65 63 74 6c 79 20 61 74 20 74 68 65 20 66 69  rectly at the fi
21a60 6e 64 65 72 2d 66 75 6e 63 74 69 6f 6e 20 73 69  nder-function si
21a70 6e 63 65 20 43 39 30 20 72 75 6c 65 73 20 70 72  nce C90 rules pr
21a80 65 76 65 6e 74 20 61 20 76 6f 69 64 2a 0a 2a 2a  event a void*.**
21a90 20 66 72 6f 6d 20 62 65 20 63 61 73 74 20 69 6e   from be cast in
21aa0 74 6f 20 61 20 66 75 6e 63 74 69 6f 6e 20 70 6f  to a function po
21ab0 69 6e 74 65 72 2e 0a 2a 2a 0a 2a 2a 0a 2a 2a 20  inter..**.**.** 
21ac0 45 61 63 68 20 69 6e 73 74 61 6e 63 65 20 6f 66  Each instance of
21ad0 20 74 68 69 73 20 6d 61 63 72 6f 20 67 65 6e 65   this macro gene
21ae0 72 61 74 65 73 20 74 77 6f 20 6f 62 6a 65 63 74  rates two object
21af0 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 20 41 20  s:.**.**   *  A 
21b00 63 6f 6e 73 74 61 6e 74 20 73 71 6c 69 74 65 33  constant sqlite3
21b10 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 6f 62 6a 65  _io_methods obje
21b20 63 74 20 63 61 6c 6c 20 4d 45 54 48 4f 44 20 74  ct call METHOD t
21b30 68 61 74 20 68 61 73 20 6c 6f 63 6b 69 6e 67 0a  hat has locking.
21b40 2a 2a 20 20 20 20 20 20 6d 65 74 68 6f 64 73 20  **      methods 
21b50 43 4c 4f 53 45 2c 20 4c 4f 43 4b 2c 20 55 4e 4c  CLOSE, LOCK, UNL
21b60 4f 43 4b 2c 20 43 4b 52 45 53 4c 4f 43 4b 2e 0a  OCK, CKRESLOCK..
21b70 2a 2a 0a 2a 2a 20 20 20 2a 20 20 41 6e 20 49 2f  **.**   *  An I/
21b80 4f 20 6d 65 74 68 6f 64 20 66 69 6e 64 65 72 20  O method finder 
21b90 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 65 64 20  function called 
21ba0 46 49 4e 44 45 52 20 74 68 61 74 20 72 65 74 75  FINDER that retu
21bb0 72 6e 73 20 61 20 70 6f 69 6e 74 65 72 0a 2a 2a  rns a pointer.**
21bc0 20 20 20 20 20 20 74 6f 20 74 68 65 20 4d 45 54        to the MET
21bd0 48 4f 44 20 6f 62 6a 65 63 74 20 69 6e 20 74 68  HOD object in th
21be0 65 20 70 72 65 76 69 6f 75 73 20 62 75 6c 6c 65  e previous bulle
21bf0 74 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 49 4f  t..*/.#define IO
21c00 4d 45 54 48 4f 44 53 28 46 49 4e 44 45 52 2c 20  METHODS(FINDER, 
21c10 4d 45 54 48 4f 44 2c 20 56 45 52 53 49 4f 4e 2c  METHOD, VERSION,
21c20 20 43 4c 4f 53 45 2c 20 4c 4f 43 4b 2c 20 55 4e   CLOSE, LOCK, UN
21c30 4c 4f 43 4b 2c 20 43 4b 4c 4f 43 4b 29 20 20 20  LOCK, CKLOCK)   
21c40 20 20 20 5c 0a 73 74 61 74 69 63 20 63 6f 6e 73     \.static cons
21c50 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74  t sqlite3_io_met
21c60 68 6f 64 73 20 4d 45 54 48 4f 44 20 3d 20 7b 20  hods METHOD = { 
21c70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21c80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21c90 20 20 5c 0a 20 20 20 56 45 52 53 49 4f 4e 2c 20    \.   VERSION, 
21ca0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21cb0 20 20 20 2f 2a 20 69 56 65 72 73 69 6f 6e 20 2a     /* iVersion *
21cc0 2f 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  /               
21cd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21ce0 20 5c 0a 20 20 20 43 4c 4f 53 45 2c 20 20 20 20   \.   CLOSE,    
21cf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21d00 20 20 2f 2a 20 78 43 6c 6f 73 65 20 2a 2f 20 20    /* xClose */  
21d10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21d20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21d30 5c 0a 20 20 20 75 6e 69 78 52 65 61 64 2c 20 20  \.   unixRead,  
21d40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21d50 20 2f 2a 20 78 52 65 61 64 20 2a 2f 20 20 20 20   /* xRead */    
21d60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21d70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c                 \
21d80 0a 20 20 20 75 6e 69 78 57 72 69 74 65 2c 20 20  .   unixWrite,  
21d90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21da0 2f 2a 20 78 57 72 69 74 65 20 2a 2f 20 20 20 20  /* xWrite */    
21db0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21dc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a                \.
21dd0 20 20 20 75 6e 69 78 54 72 75 6e 63 61 74 65 2c     unixTruncate,
21de0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
21df0 2a 20 78 54 72 75 6e 63 61 74 65 20 2a 2f 20 20  * xTruncate */  
21e00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21e10 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20               \. 
21e20 20 20 75 6e 69 78 53 79 6e 63 2c 20 20 20 20 20    unixSync,     
21e30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
21e40 20 78 53 79 6e 63 20 2a 2f 20 20 20 20 20 20 20   xSync */       
21e50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21e60 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20              \.  
21e70 20 75 6e 69 78 46 69 6c 65 53 69 7a 65 2c 20 20   unixFileSize,  
21e80 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
21e90 78 46 69 6c 65 53 69 7a 65 20 2a 2f 20 20 20 20  xFileSize */    
21ea0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21eb0 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20             \.   
21ec0 4c 4f 43 4b 2c 20 20 20 20 20 20 20 20 20 20 20  LOCK,           
21ed0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
21ee0 4c 6f 63 6b 20 2a 2f 20 20 20 20 20 20 20 20 20  Lock */         
21ef0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21f00 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 55            \.   U
21f10 4e 4c 4f 43 4b 2c 20 20 20 20 20 20 20 20 20 20  NLOCK,          
21f20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 55             /* xU
21f30 6e 6c 6f 63 6b 20 2a 2f 20 20 20 20 20 20 20 20  nlock */        
21f40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21f50 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 43 4b           \.   CK
21f60 4c 4f 43 4b 2c 20 20 20 20 20 20 20 20 20 20 20  LOCK,           
21f70 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 43 68            /* xCh
21f80 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 20  eckReservedLock 
21f90 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20 20 20  */              
21fa0 20 20 20 20 20 20 20 20 5c 0a 20 20 20 75 6e 69          \.   uni
21fb0 78 46 69 6c 65 43 6f 6e 74 72 6f 6c 2c 20 20 20  xFileControl,   
21fc0 20 20 20 20 20 20 20 20 20 2f 2a 20 78 46 69 6c           /* xFil
21fd0 65 43 6f 6e 74 72 6f 6c 20 2a 2f 20 20 20 20 20  eControl */     
21fe0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21ff0 20 20 20 20 20 20 20 5c 0a 20 20 20 75 6e 69 78         \.   unix
22000 53 65 63 74 6f 72 53 69 7a 65 2c 20 20 20 20 20  SectorSize,     
22010 20 20 20 20 20 20 20 20 2f 2a 20 78 53 65 63 74          /* xSect
22020 6f 72 53 69 7a 65 20 2a 2f 20 20 20 20 20 20 20  orSize */       
22030 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22040 20 20 20 20 20 20 5c 0a 20 20 20 75 6e 69 78 44        \.   unixD
22050 65 76 69 63 65 43 68 61 72 61 63 74 65 72 69 73  eviceCharacteris
22060 74 69 63 73 2c 20 20 2f 2a 20 78 44 65 76 69 63  tics,  /* xDevic
22070 65 43 61 70 61 62 69 6c 69 74 69 65 73 20 2a 2f  eCapabilities */
22080 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22090 20 20 20 20 20 5c 0a 20 20 20 75 6e 69 78 53 68       \.   unixSh
220a0 6d 4f 70 65 6e 2c 20 20 20 20 20 20 20 20 20 20  mOpen,          
220b0 20 20 20 20 20 20 2f 2a 20 78 53 68 6d 4f 70 65        /* xShmOpe
220c0 6e 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20  n */            
220d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
220e0 20 20 20 20 5c 0a 20 20 20 75 6e 69 78 53 68 6d      \.   unixShm
220f0 53 69 7a 65 2c 20 20 20 20 20 20 20 20 20 20 20  Size,           
22100 20 20 20 20 20 2f 2a 20 78 53 68 6d 53 69 7a 65       /* xShmSize
22110 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20 20   */             
22120 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22130 20 20 20 5c 0a 20 20 20 75 6e 69 78 53 68 6d 47     \.   unixShmG
22140 65 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  et,             
22150 20 20 20 20 2f 2a 20 78 53 68 6d 47 65 74 20 2a      /* xShmGet *
22160 2f 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  /               
22170 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22180 20 20 5c 0a 20 20 20 75 6e 69 78 53 68 6d 52 65    \.   unixShmRe
22190 6c 65 61 73 65 2c 20 20 20 20 20 20 20 20 20 20  lease,          
221a0 20 20 20 2f 2a 20 78 53 68 6d 52 65 6c 65 61 73     /* xShmReleas
221b0 65 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20  e */            
221c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
221d0 20 5c 0a 20 20 20 75 6e 69 78 53 68 6d 4c 6f 63   \.   unixShmLoc
221e0 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  k,              
221f0 20 20 2f 2a 20 78 53 68 6d 4c 6f 63 6b 20 2a 2f    /* xShmLock */
22200 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22210 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22220 5c 0a 20 20 20 75 6e 69 78 53 68 6d 43 6c 6f 73  \.   unixShmClos
22230 65 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e               
22240 20 2f 2a 20 78 53 68 6d 43 6c 6f 73 65 20 2a 2f   /* xShmClose */
22250 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22260 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c                 \
22270 0a 7d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  .};             
22280 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22290 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
222a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
222b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a                \.
222c0 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73 71 6c  static const sql
222d0 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20  ite3_io_methods 
222e0 2a 46 49 4e 44 45 52 23 23 49 6d 70 6c 28 63 6f  *FINDER##Impl(co
222f0 6e 73 74 20 63 68 61 72 20 2a 7a 2c 20 75 6e 69  nst char *z, uni
22300 78 46 69 6c 65 20 2a 70 29 7b 20 20 20 5c 0a 20  xFile *p){   \. 
22310 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
22320 52 28 7a 29 3b 20 55 4e 55 53 45 44 5f 50 41 52  R(z); UNUSED_PAR
22330 41 4d 45 54 45 52 28 70 29 3b 20 20 20 20 20 20  AMETER(p);      
22340 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22350 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20              \.  
22360 72 65 74 75 72 6e 20 26 4d 45 54 48 4f 44 3b 20  return &METHOD; 
22370 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22380 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22390 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
223a0 20 20 20 20 20 20 20 20 20 20 20 5c 0a 7d 20 20             \.}  
223b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
223c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
223d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
223e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
223f0 20 20 20 20 20 20 20 20 20 20 5c 0a 73 74 61 74            \.stat
22400 69 63 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33  ic const sqlite3
22410 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 2a 28 2a 63  _io_methods *(*c
22420 6f 6e 73 74 20 46 49 4e 44 45 52 29 28 63 6f 6e  onst FINDER)(con
22430 73 74 20 63 68 61 72 2a 2c 75 6e 69 78 46 69 6c  st char*,unixFil
22440 65 20 2a 70 29 20 20 20 20 5c 0a 20 20 20 20 3d  e *p)    \.    =
22450 20 46 49 4e 44 45 52 23 23 49 6d 70 6c 3b 0a 0a   FINDER##Impl;..
22460 2f 2a 0a 2a 2a 20 48 65 72 65 20 61 72 65 20 61  /*.** Here are a
22470 6c 6c 20 6f 66 20 74 68 65 20 73 71 6c 69 74 65  ll of the sqlite
22480 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 6f 62 6a  3_io_methods obj
22490 65 63 74 73 20 66 6f 72 20 65 61 63 68 20 6f 66  ects for each of
224a0 20 74 68 65 0a 2a 2a 20 6c 6f 63 6b 69 6e 67 20   the.** locking 
224b0 73 74 72 61 74 65 67 69 65 73 2e 20 20 46 75 6e  strategies.  Fun
224c0 63 74 69 6f 6e 73 20 74 68 61 74 20 72 65 74 75  ctions that retu
224d0 72 6e 20 70 6f 69 6e 74 65 72 73 20 74 6f 20 74  rn pointers to t
224e0 68 65 73 65 20 6d 65 74 68 6f 64 73 0a 2a 2a 20  hese methods.** 
224f0 61 72 65 20 61 6c 73 6f 20 63 72 65 61 74 65 64  are also created
22500 2e 0a 2a 2f 0a 49 4f 4d 45 54 48 4f 44 53 28 0a  ..*/.IOMETHODS(.
22510 20 20 70 6f 73 69 78 49 6f 46 69 6e 64 65 72 2c    posixIoFinder,
22520 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
22530 69 6e 64 65 72 20 66 75 6e 63 74 69 6f 6e 20 6e  inder function n
22540 61 6d 65 20 2a 2f 0a 20 20 70 6f 73 69 78 49 6f  ame */.  posixIo
22550 4d 65 74 68 6f 64 73 2c 20 20 20 20 20 20 20 20  Methods,        
22560 20 20 20 2f 2a 20 73 71 6c 69 74 65 33 5f 69 6f     /* sqlite3_io
22570 5f 6d 65 74 68 6f 64 73 20 6f 62 6a 65 63 74 20  _methods object 
22580 6e 61 6d 65 20 2a 2f 0a 20 20 32 2c 20 20 20 20  name */.  2,    
22590 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
225a0 20 20 20 20 2f 2a 20 53 68 6d 4f 70 65 6e 20 69      /* ShmOpen i
225b0 73 20 65 6e 61 62 6c 65 64 20 2a 2f 0a 20 20 75  s enabled */.  u
225c0 6e 69 78 43 6c 6f 73 65 2c 20 20 20 20 20 20 20  nixClose,       
225d0 20 20 20 20 20 20 20 20 20 2f 2a 20 78 43 6c 6f           /* xClo
225e0 73 65 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 75  se method */.  u
225f0 6e 69 78 4c 6f 63 6b 2c 20 20 20 20 20 20 20 20  nixLock,        
22600 20 20 20 20 20 20 20 20 20 2f 2a 20 78 4c 6f 63           /* xLoc
22610 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 75 6e  k method */.  un
22620 69 78 55 6e 6c 6f 63 6b 2c 20 20 20 20 20 20 20  ixUnlock,       
22630 20 20 20 20 20 20 20 20 2f 2a 20 78 55 6e 6c 6f          /* xUnlo
22640 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 75  ck method */.  u
22650 6e 69 78 43 68 65 63 6b 52 65 73 65 72 76 65 64  nixCheckReserved
22660 4c 6f 63 6b 20 20 20 20 20 2f 2a 20 78 43 68 65  Lock     /* xChe
22670 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 20 6d  ckReservedLock m
22680 65 74 68 6f 64 20 2a 2f 0a 29 0a 49 4f 4d 45 54  ethod */.).IOMET
22690 48 4f 44 53 28 0a 20 20 6e 6f 6c 6f 63 6b 49 6f  HODS(.  nolockIo
226a0 46 69 6e 64 65 72 2c 20 20 20 20 20 20 20 20 20  Finder,         
226b0 20 20 2f 2a 20 46 69 6e 64 65 72 20 66 75 6e 63    /* Finder func
226c0 74 69 6f 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20 6e  tion name */.  n
226d0 6f 6c 6f 63 6b 49 6f 4d 65 74 68 6f 64 73 2c 20  olockIoMethods, 
226e0 20 20 20 20 20 20 20 20 20 2f 2a 20 73 71 6c 69           /* sqli
226f0 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 6f  te3_io_methods o
22700 62 6a 65 63 74 20 6e 61 6d 65 20 2a 2f 0a 20 20  bject name */.  
22710 31 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  1,              
22720 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 68 6d            /* Shm
22730 4f 70 65 6e 20 69 73 20 64 69 73 61 62 6c 65 64  Open is disabled
22740 20 2a 2f 0a 20 20 6e 6f 6c 6f 63 6b 43 6c 6f 73   */.  nolockClos
22750 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
22760 2f 2a 20 78 43 6c 6f 73 65 20 6d 65 74 68 6f 64  /* xClose method
22770 20 2a 2f 0a 20 20 6e 6f 6c 6f 63 6b 4c 6f 63 6b   */.  nolockLock
22780 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
22790 2f 2a 20 78 4c 6f 63 6b 20 6d 65 74 68 6f 64 20  /* xLock method 
227a0 2a 2f 0a 20 20 6e 6f 6c 6f 63 6b 55 6e 6c 6f 63  */.  nolockUnloc
227b0 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  k,             /
227c0 2a 20 78 55 6e 6c 6f 63 6b 20 6d 65 74 68 6f 64  * xUnlock method
227d0 20 2a 2f 0a 20 20 6e 6f 6c 6f 63 6b 43 68 65 63   */.  nolockChec
227e0 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 20 20 20  kReservedLock   
227f0 2f 2a 20 78 43 68 65 63 6b 52 65 73 65 72 76 65  /* xCheckReserve
22800 64 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a  dLock method */.
22810 29 0a 49 4f 4d 45 54 48 4f 44 53 28 0a 20 20 64  ).IOMETHODS(.  d
22820 6f 74 6c 6f 63 6b 49 6f 46 69 6e 64 65 72 2c 20  otlockIoFinder, 
22830 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6e 64           /* Find
22840 65 72 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65  er function name
22850 20 2a 2f 0a 20 20 64 6f 74 6c 6f 63 6b 49 6f 4d   */.  dotlockIoM
22860 65 74 68 6f 64 73 2c 20 20 20 20 20 20 20 20 20  ethods,         
22870 2f 2a 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65  /* sqlite3_io_me
22880 74 68 6f 64 73 20 6f 62 6a 65 63 74 20 6e 61 6d  thods object nam
22890 65 20 2a 2f 0a 20 20 31 2c 20 20 20 20 20 20 20  e */.  1,       
228a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
228b0 20 2f 2a 20 53 68 6d 4f 70 65 6e 20 69 73 20 64   /* ShmOpen is d
228c0 69 73 61 62 6c 65 64 20 2a 2f 0a 20 20 64 6f 74  isabled */.  dot
228d0 6c 6f 63 6b 43 6c 6f 73 65 2c 20 20 20 20 20 20  lockClose,      
228e0 20 20 20 20 20 20 20 2f 2a 20 78 43 6c 6f 73 65         /* xClose
228f0 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 64 6f 74   method */.  dot
22900 6c 6f 63 6b 4c 6f 63 6b 2c 20 20 20 20 20 20 20  lockLock,       
22910 20 20 20 20 20 20 20 2f 2a 20 78 4c 6f 63 6b 20         /* xLock 
22920 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 64 6f 74 6c  method */.  dotl
22930 6f 63 6b 55 6e 6c 6f 63 6b 2c 20 20 20 20 20 20  ockUnlock,      
22940 20 20 20 20 20 20 2f 2a 20 78 55 6e 6c 6f 63 6b        /* xUnlock
22950 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 64 6f 74   method */.  dot
22960 6c 6f 63 6b 43 68 65 63 6b 52 65 73 65 72 76 65  lockCheckReserve
22970 64 4c 6f 63 6b 20 20 2f 2a 20 78 43 68 65 63 6b  dLock  /* xCheck
22980 52 65 73 65 72 76 65 64 4c 6f 63 6b 20 6d 65 74  ReservedLock met
22990 68 6f 64 20 2a 2f 0a 29 0a 0a 23 69 66 20 53 51  hod */.)..#if SQ
229a0 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b  LITE_ENABLE_LOCK
229b0 49 4e 47 5f 53 54 59 4c 45 20 26 26 20 21 4f 53  ING_STYLE && !OS
229c0 5f 56 58 57 4f 52 4b 53 0a 49 4f 4d 45 54 48 4f  _VXWORKS.IOMETHO
229d0 44 53 28 0a 20 20 66 6c 6f 63 6b 49 6f 46 69 6e  DS(.  flockIoFin
229e0 64 65 72 2c 20 20 20 20 20 20 20 20 20 20 20 20  der,            
229f0 2f 2a 20 46 69 6e 64 65 72 20 66 75 6e 63 74 69  /* Finder functi
22a00 6f 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20 66 6c 6f  on name */.  flo
22a10 63 6b 49 6f 4d 65 74 68 6f 64 73 2c 20 20 20 20  ckIoMethods,    
22a20 20 20 20 20 20 20 20 2f 2a 20 73 71 6c 69 74 65         /* sqlite
22a30 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 6f 62 6a  3_io_methods obj
22a40 65 63 74 20 6e 61 6d 65 20 2a 2f 0a 20 20 31 2c  ect name */.  1,
22a50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22a60 20 20 20 20 20 20 20 20 2f 2a 20 53 68 6d 4f 70          /* ShmOp
22a70 65 6e 20 69 73 20 64 69 73 61 62 6c 65 64 20 2a  en is disabled *
22a80 2f 0a 20 20 66 6c 6f 63 6b 43 6c 6f 73 65 2c 20  /.  flockClose, 
22a90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
22aa0 20 78 43 6c 6f 73 65 20 6d 65 74 68 6f 64 20 2a   xClose method *
22ab0 2f 0a 20 20 66 6c 6f 63 6b 4c 6f 63 6b 2c 20 20  /.  flockLock,  
22ac0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
22ad0 20 78 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f   xLock method */
22ae0 0a 20 20 66 6c 6f 63 6b 55 6e 6c 6f 63 6b 2c 20  .  flockUnlock, 
22af0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
22b00 78 55 6e 6c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a  xUnlock method *
22b10 2f 0a 20 20 66 6c 6f 63 6b 43 68 65 63 6b 52 65  /.  flockCheckRe
22b20 73 65 72 76 65 64 4c 6f 63 6b 20 20 20 20 2f 2a  servedLock    /*
22b30 20 78 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c   xCheckReservedL
22b40 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 29 0a  ock method */.).
22b50 23 65 6e 64 69 66 0a 0a 23 69 66 20 4f 53 5f 56  #endif..#if OS_V
22b60 58 57 4f 52 4b 53 0a 49 4f 4d 45 54 48 4f 44 53  XWORKS.IOMETHODS
22b70 28 0a 20 20 73 65 6d 49 6f 46 69 6e 64 65 72 2c  (.  semIoFinder,
22b80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
22b90 20 46 69 6e 64 65 72 20 66 75 6e 63 74 69 6f 6e   Finder function
22ba0 20 6e 61 6d 65 20 2a 2f 0a 20 20 73 65 6d 49 6f   name */.  semIo
22bb0 4d 65 74 68 6f 64 73 2c 20 20 20 20 20 20 20 20  Methods,        
22bc0 20 20 20 20 20 2f 2a 20 73 71 6c 69 74 65 33 5f       /* sqlite3_
22bd0 69 6f 5f 6d 65 74 68 6f 64 73 20 6f 62 6a 65 63  io_methods objec
22be0 74 20 6e 61 6d 65 20 2a 2f 0a 20 20 31 2c 20 20  t name */.  1,  
22bf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22c00 20 20 20 20 20 20 2f 2a 20 53 68 6d 4f 70 65 6e        /* ShmOpen
22c10 20 69 73 20 64 69 73 61 62 6c 65 64 20 2a 2f 0a   is disabled */.
22c20 20 20 73 65 6d 43 6c 6f 73 65 2c 20 20 20 20 20    semClose,     
22c30 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
22c40 43 6c 6f 73 65 20 6d 65 74 68 6f 64 20 2a 2f 0a  Close method */.
22c50 20 20 73 65 6d 4c 6f 63 6b 2c 20 20 20 20 20 20    semLock,      
22c60 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
22c70 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20  Lock method */. 
22c80 20 73 65 6d 55 6e 6c 6f 63 6b 2c 20 20 20 20 20   semUnlock,     
22c90 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 55             /* xU
22ca0 6e 6c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a  nlock method */.
22cb0 20 20 73 65 6d 43 68 65 63 6b 52 65 73 65 72 76    semCheckReserv
22cc0 65 64 4c 6f 63 6b 20 20 20 20 20 20 2f 2a 20 78  edLock      /* x
22cd0 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63  CheckReservedLoc
22ce0 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 29 0a 23 65  k method */.).#e
22cf0 6e 64 69 66 0a 0a 23 69 66 20 64 65 66 69 6e 65  ndif..#if define
22d00 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 26 26 20  d(__APPLE__) && 
22d10 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f  SQLITE_ENABLE_LO
22d20 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 49 4f 4d 45  CKING_STYLE.IOME
22d30 54 48 4f 44 53 28 0a 20 20 61 66 70 49 6f 46 69  THODS(.  afpIoFi
22d40 6e 64 65 72 2c 20 20 20 20 20 20 20 20 20 20 20  nder,           
22d50 20 20 20 2f 2a 20 46 69 6e 64 65 72 20 66 75 6e     /* Finder fun
22d60 63 74 69 6f 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20  ction name */.  
22d70 61 66 70 49 6f 4d 65 74 68 6f 64 73 2c 20 20 20  afpIoMethods,   
22d80 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73 71 6c            /* sql
22d90 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20  ite3_io_methods 
22da0 6f 62 6a 65 63 74 20 6e 61 6d 65 20 2a 2f 0a 20  object name */. 
22db0 20 31 2c 20 20 20 20 20 20 20 20 20 20 20 20 20   1,             
22dc0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 68             /* Sh
22dd0 6d 4f 70 65 6e 20 69 73 20 64 69 73 61 62 6c 65  mOpen is disable
22de0 64 20 2a 2f 0a 20 20 61 66 70 43 6c 6f 73 65 2c  d */.  afpClose,
22df0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22e00 20 2f 2a 20 78 43 6c 6f 73 65 20 6d 65 74 68 6f   /* xClose metho
22e10 64 20 2a 2f 0a 20 20 61 66 70 4c 6f 63 6b 2c 20  d */.  afpLock, 
22e20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22e30 20 2f 2a 20 78 4c 6f 63 6b 20 6d 65 74 68 6f 64   /* xLock method
22e40 20 2a 2f 0a 20 20 61 66 70 55 6e 6c 6f 63 6b 2c   */.  afpUnlock,
22e50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22e60 2f 2a 20 78 55 6e 6c 6f 63 6b 20 6d 65 74 68 6f  /* xUnlock metho
22e70 64 20 2a 2f 0a 20 20 61 66 70 43 68 65 63 6b 52  d */.  afpCheckR
22e80 65 73 65 72 76 65 64 4c 6f 63 6b 20 20 20 20 20  eservedLock     
22e90 20 2f 2a 20 78 43 68 65 63 6b 52 65 73 65 72 76   /* xCheckReserv
22ea0 65 64 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f  edLock method */
22eb0 0a 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  .).#endif../*.**
22ec0 20 54 68 65 20 70 72 6f 78 79 20 6c 6f 63 6b 69   The proxy locki
22ed0 6e 67 20 6d 65 74 68 6f 64 20 69 73 20 61 20 22  ng method is a "
22ee0 73 75 70 65 72 2d 6d 65 74 68 6f 64 22 20 69 6e  super-method" in
22ef0 20 74 68 65 20 73 65 6e 73 65 20 74 68 61 74 20   the sense that 
22f00 69 74 0a 2a 2a 20 6f 70 65 6e 73 20 73 65 63 6f  it.** opens seco
22f10 6e 64 61 72 79 20 66 69 6c 65 20 64 65 73 63 72  ndary file descr
22f20 69 70 74 6f 72 73 20 66 6f 72 20 74 68 65 20 63  iptors for the c
22f30 6f 6e 63 68 20 61 6e 64 20 6c 6f 63 6b 20 66 69  onch and lock fi
22f40 6c 65 73 20 61 6e 64 0a 2a 2a 20 69 74 20 75 73  les and.** it us
22f50 65 73 20 70 72 6f 78 79 2c 20 64 6f 74 2d 66 69  es proxy, dot-fi
22f60 6c 65 2c 20 41 46 50 2c 20 61 6e 64 20 66 6c 6f  le, AFP, and flo
22f70 63 6b 28 29 20 6c 6f 63 6b 69 6e 67 20 6d 65 74  ck() locking met
22f80 68 6f 64 73 20 6f 6e 20 74 68 6f 73 65 0a 2a 2a  hods on those.**
22f90 20 73 65 63 6f 6e 64 61 72 79 20 66 69 6c 65 73   secondary files
22fa0 2e 20 20 46 6f 72 20 74 68 69 73 20 72 65 61 73  .  For this reas
22fb0 6f 6e 2c 20 74 68 65 20 64 69 76 69 73 69 6f 6e  on, the division
22fc0 20 74 68 61 74 20 69 6d 70 6c 65 6d 65 6e 74 73   that implements
22fd0 0a 2a 2a 20 70 72 6f 78 79 20 6c 6f 63 6b 69 6e  .** proxy lockin
22fe0 67 20 69 73 20 6c 6f 63 61 74 65 64 20 6d 75 63  g is located muc
22ff0 68 20 66 75 72 74 68 65 72 20 64 6f 77 6e 20 69  h further down i
23000 6e 20 74 68 65 20 66 69 6c 65 2e 20 20 42 75 74  n the file.  But
23010 20 77 65 20 6e 65 65 64 0a 2a 2a 20 74 6f 20 67   we need.** to g
23020 6f 20 61 68 65 61 64 20 61 6e 64 20 64 65 66 69  o ahead and defi
23030 6e 65 20 74 68 65 20 73 71 6c 69 74 65 33 5f 69  ne the sqlite3_i
23040 6f 5f 6d 65 74 68 6f 64 73 20 61 6e 64 20 66 69  o_methods and fi
23050 6e 64 65 72 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a  nder function.**
23060 20 66 6f 72 20 70 72 6f 78 79 20 6c 6f 63 6b 69   for proxy locki
23070 6e 67 20 68 65 72 65 2e 20 20 53 6f 20 77 65 20  ng here.  So we 
23080 66 6f 72 77 61 72 64 20 64 65 63 6c 61 72 65 20  forward declare 
23090 74 68 65 20 49 2f 4f 20 6d 65 74 68 6f 64 73 2e  the I/O methods.
230a0 0a 2a 2f 0a 23 69 66 20 64 65 66 69 6e 65 64 28  .*/.#if defined(
230b0 5f 5f 41 50 50 4c 45 5f 5f 29 20 26 26 20 53 51  __APPLE__) && SQ
230c0 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b  LITE_ENABLE_LOCK
230d0 49 4e 47 5f 53 54 59 4c 45 0a 73 74 61 74 69 63  ING_STYLE.static
230e0 20 69 6e 74 20 70 72 6f 78 79 43 6c 6f 73 65 28   int proxyClose(
230f0 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29 3b 0a  sqlite3_file*);.
23100 73 74 61 74 69 63 20 69 6e 74 20 70 72 6f 78 79  static int proxy
23110 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c  Lock(sqlite3_fil
23120 65 2a 2c 20 69 6e 74 29 3b 0a 73 74 61 74 69 63  e*, int);.static
23130 20 69 6e 74 20 70 72 6f 78 79 55 6e 6c 6f 63 6b   int proxyUnlock
23140 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 2c 20  (sqlite3_file*, 
23150 69 6e 74 29 3b 0a 73 74 61 74 69 63 20 69 6e 74  int);.static int
23160 20 70 72 6f 78 79 43 68 65 63 6b 52 65 73 65 72   proxyCheckReser
23170 76 65 64 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f  vedLock(sqlite3_
23180 66 69 6c 65 2a 2c 20 69 6e 74 2a 29 3b 0a 49 4f  file*, int*);.IO
23190 4d 45 54 48 4f 44 53 28 0a 20 20 70 72 6f 78 79  METHODS(.  proxy
231a0 49 6f 46 69 6e 64 65 72 2c 20 20 20 20 20 20 20  IoFinder,       
231b0 20 20 20 20 20 2f 2a 20 46 69 6e 64 65 72 20 66       /* Finder f
231c0 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 20 2a 2f 0a  unction name */.
231d0 20 20 70 72 6f 78 79 49 6f 4d 65 74 68 6f 64 73    proxyIoMethods
231e0 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73  ,           /* s
231f0 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64  qlite3_io_method
23200 73 20 6f 62 6a 65 63 74 20 6e 61 6d 65 20 2a 2f  s object name */
23210 0a 20 20 31 2c 20 20 20 20 20 20 20 20 20 20 20  .  1,           
23220 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
23230 53 68 6d 4f 70 65 6e 20 69 73 20 64 69 73 61 62  ShmOpen is disab
23240 6c 65 64 20 2a 2f 0a 20 20 70 72 6f 78 79 43 6c  led */.  proxyCl
23250 6f 73 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  ose,            
23260 20 20 20 2f 2a 20 78 43 6c 6f 73 65 20 6d 65 74     /* xClose met
23270 68 6f 64 20 2a 2f 0a 20 20 70 72 6f 78 79 4c 6f  hod */.  proxyLo
23280 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ck,             
23290 20 20 20 2f 2a 20 78 4c 6f 63 6b 20 6d 65 74 68     /* xLock meth
232a0 6f 64 20 2a 2f 0a 20 20 70 72 6f 78 79 55 6e 6c  od */.  proxyUnl
232b0 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20  ock,            
232c0 20 20 2f 2a 20 78 55 6e 6c 6f 63 6b 20 6d 65 74    /* xUnlock met
232d0 68 6f 64 20 2a 2f 0a 20 20 70 72 6f 78 79 43 68  hod */.  proxyCh
232e0 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 20  eckReservedLock 
232f0 20 20 20 2f 2a 20 78 43 68 65 63 6b 52 65 73 65     /* xCheckRese
23300 72 76 65 64 4c 6f 63 6b 20 6d 65 74 68 6f 64 20  rvedLock method 
23310 2a 2f 0a 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 20  */.).#endif../* 
23320 6e 66 73 20 6c 6f 63 6b 64 20 6f 6e 20 4f 53 58  nfs lockd on OSX
23330 20 31 30 2e 33 2b 20 64 6f 65 73 6e 27 74 20 63   10.3+ doesn't c
23340 6c 65 61 72 20 77 72 69 74 65 20 6c 6f 63 6b 73  lear write locks
23350 20 77 68 65 6e 20 61 20 72 65 61 64 20 6c 6f 63   when a read loc
23360 6b 20 69 73 20 73 65 74 20 2a 2f 0a 23 69 66 20  k is set */.#if 
23370 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f  defined(__APPLE_
23380 5f 29 20 26 26 20 53 51 4c 49 54 45 5f 45 4e 41  _) && SQLITE_ENA
23390 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c  BLE_LOCKING_STYL
233a0 45 0a 49 4f 4d 45 54 48 4f 44 53 28 0a 20 20 6e  E.IOMETHODS(.  n
233b0 66 73 49 6f 46 69 6e 64 65 72 2c 20 20 20 20 20  fsIoFinder,     
233c0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6e            /* Fin
233d0 64 65 72 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d  der function nam
233e0 65 20 2a 2f 0a 20 20 6e 66 73 49 6f 4d 65 74 68  e */.  nfsIoMeth
233f0 6f 64 73 2c 20 20 20 20 20 20 20 20 20 20 20 20  ods,            
23400 20 20 2f 2a 20 73 71 6c 69 74 65 33 5f 69 6f 5f    /* sqlite3_io_
23410 6d 65 74 68 6f 64 73 20 6f 62 6a 65 63 74 20 6e  methods object n
23420 61 6d 65 20 2a 2f 0a 20 20 31 2c 20 20 20 20 20  ame */.  1,     
23430 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23440 20 20 20 20 2f 2a 20 53 68 6d 4f 70 65 6e 20 69      /* ShmOpen i
23450 73 20 64 69 73 61 62 6c 65 64 20 2a 2f 0a 20 20  s disabled */.  
23460 75 6e 69 78 43 6c 6f 73 65 2c 20 20 20 20 20 20  unixClose,      
23470 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 43             /* xC
23480 6c 6f 73 65 20 6d 65 74 68 6f 64 20 2a 2f 0a 20  lose method */. 
23490 20 75 6e 69 78 4c 6f 63 6b 2c 20 20 20 20 20 20   unixLock,      
234a0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
234b0 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20  Lock method */. 
234c0 20 6e 66 73 55 6e 6c 6f 63 6b 2c 20 20 20 20 20   nfsUnlock,     
234d0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
234e0 55 6e 6c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f  Unlock method */
234f0 0a 20 20 75 6e 69 78 43 68 65 63 6b 52 65 73 65  .  unixCheckRese
23500 72 76 65 64 4c 6f 63 6b 20 20 20 20 20 20 2f 2a  rvedLock      /*
23510 20 78 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c   xCheckReservedL
23520 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 29 0a  ock method */.).
23530 23 65 6e 64 69 66 0a 0a 23 69 66 20 64 65 66 69  #endif..#if defi
23540 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 26  ned(__APPLE__) &
23550 26 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  & SQLITE_ENABLE_
23560 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 2f 2a  LOCKING_STYLE./*
23570 20 0a 2a 2a 20 54 68 69 73 20 22 66 69 6e 64 65   .** This "finde
23580 72 22 20 66 75 6e 63 74 69 6f 6e 20 61 74 74 65  r" function atte
23590 6d 70 74 73 20 74 6f 20 64 65 74 65 72 6d 69 6e  mpts to determin
235a0 65 20 74 68 65 20 62 65 73 74 20 6c 6f 63 6b 69  e the best locki
235b0 6e 67 20 73 74 72 61 74 65 67 79 20 0a 2a 2a 20  ng strategy .** 
235c0 66 6f 72 20 74 68 65 20 64 61 74 61 62 61 73 65  for the database
235d0 20 66 69 6c 65 20 22 66 69 6c 65 50 61 74 68 22   file "filePath"
235e0 2e 20 20 49 74 20 74 68 65 6e 20 72 65 74 75 72  .  It then retur
235f0 6e 73 20 74 68 65 20 73 71 6c 69 74 65 33 5f 69  ns the sqlite3_i
23600 6f 5f 6d 65 74 68 6f 64 73 0a 2a 2a 20 6f 62 6a  o_methods.** obj
23610 65 63 74 20 74 68 61 74 20 69 6d 70 6c 65 6d 65  ect that impleme
23620 6e 74 73 20 74 68 61 74 20 73 74 72 61 74 65 67  nts that strateg
23630 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73  y..**.** This is
23640 20 66 6f 72 20 4d 61 63 4f 53 58 20 6f 6e 6c 79   for MacOSX only
23650 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73  ..*/.static cons
23660 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74  t sqlite3_io_met
23670 68 6f 64 73 20 2a 61 75 74 6f 6c 6f 63 6b 49 6f  hods *autolockIo
23680 46 69 6e 64 65 72 49 6d 70 6c 28 0a 20 20 63 6f  FinderImpl(.  co
23690 6e 73 74 20 63 68 61 72 20 2a 66 69 6c 65 50 61  nst char *filePa
236a0 74 68 2c 20 20 20 20 2f 2a 20 6e 61 6d 65 20 6f  th,    /* name o
236b0 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  f the database f
236c0 69 6c 65 20 2a 2f 0a 20 20 75 6e 69 78 46 69 6c  ile */.  unixFil
236d0 65 20 2a 70 4e 65 77 20 20 20 20 20 20 20 20 20  e *pNew         
236e0 20 20 2f 2a 20 6f 70 65 6e 20 66 69 6c 65 20 6f    /* open file o
236f0 62 6a 65 63 74 20 66 6f 72 20 74 68 65 20 64 61  bject for the da
23700 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 29  tabase file */.)
23710 7b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74  {.  static const
23720 20 73 74 72 75 63 74 20 4d 61 70 70 69 6e 67 20   struct Mapping 
23730 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72  {.    const char
23740 20 2a 7a 46 69 6c 65 73 79 73 74 65 6d 3b 20 20   *zFilesystem;  
23750 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
23760 69 6c 65 73 79 73 74 65 6d 20 74 79 70 65 20 6e  ilesystem type n
23770 61 6d 65 20 2a 2f 0a 20 20 20 20 63 6f 6e 73 74  ame */.    const
23780 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68   sqlite3_io_meth
23790 6f 64 73 20 2a 70 4d 65 74 68 6f 64 73 3b 20 20  ods *pMethods;  
237a0 20 2f 2a 20 41 70 70 72 6f 70 72 69 61 74 65 20   /* Appropriate 
237b0 6c 6f 63 6b 69 6e 67 20 6d 65 74 68 6f 64 20 2a  locking method *
237c0 2f 0a 20 20 7d 20 61 4d 61 70 5b 5d 20 3d 20 7b  /.  } aMap[] = {
237d0 0a 20 20 20 20 7b 20 22 68 66 73 22 2c 20 20 20  .    { "hfs",   
237e0 20 26 70 6f 73 69 78 49 6f 4d 65 74 68 6f 64 73   &posixIoMethods
237f0 20 7d 2c 0a 20 20 20 20 7b 20 22 75 66 73 22 2c   },.    { "ufs",
23800 20 20 20 20 26 70 6f 73 69 78 49 6f 4d 65 74 68      &posixIoMeth
23810 6f 64 73 20 7d 2c 0a 20 20 20 20 7b 20 22 61 66  ods },.    { "af
23820 70 66 73 22 2c 20 20 26 61 66 70 49 6f 4d 65 74  pfs",  &afpIoMet
23830 68 6f 64 73 20 7d 2c 0a 20 20 20 20 7b 20 22 73  hods },.    { "s
23840 6d 62 66 73 22 2c 20 20 26 61 66 70 49 6f 4d 65  mbfs",  &afpIoMe
23850 74 68 6f 64 73 20 7d 2c 0a 20 20 20 20 7b 20 22  thods },.    { "
23860 77 65 62 64 61 76 22 2c 20 26 6e 6f 6c 6f 63 6b  webdav", &nolock
23870 49 6f 4d 65 74 68 6f 64 73 20 7d 2c 0a 20 20 20  IoMethods },.   
23880 20 7b 20 30 2c 20 30 20 7d 0a 20 20 7d 3b 0a 20   { 0, 0 }.  };. 
23890 20 69 6e 74 20 69 3b 0a 20 20 73 74 72 75 63 74   int i;.  struct
238a0 20 73 74 61 74 66 73 20 66 73 49 6e 66 6f 3b 0a   statfs fsInfo;.
238b0 20 20 73 74 72 75 63 74 20 66 6c 6f 63 6b 20 6c    struct flock l
238c0 6f 63 6b 49 6e 66 6f 3b 0a 0a 20 20 69 66 28 20  ockInfo;..  if( 
238d0 21 66 69 6c 65 50 61 74 68 20 29 7b 0a 20 20 20  !filePath ){.   
238e0 20 2f 2a 20 49 66 20 66 69 6c 65 50 61 74 68 3d   /* If filePath=
238f0 3d 4e 55 4c 4c 20 74 68 61 74 20 6d 65 61 6e 73  =NULL that means
23900 20 77 65 20 61 72 65 20 64 65 61 6c 69 6e 67 20   we are dealing 
23910 77 69 74 68 20 61 20 74 72 61 6e 73 69 65 6e 74  with a transient
23920 20 66 69 6c 65 0a 20 20 20 20 2a 2a 20 74 68 61   file.    ** tha
23930 74 20 64 6f 65 73 20 6e 6f 74 20 6e 65 65 64 20  t does not need 
23940 74 6f 20 62 65 20 6c 6f 63 6b 65 64 2e 20 2a 2f  to be locked. */
23950 0a 20 20 20 20 72 65 74 75 72 6e 20 26 6e 6f 6c  .    return &nol
23960 6f 63 6b 49 6f 4d 65 74 68 6f 64 73 3b 0a 20 20  ockIoMethods;.  
23970 7d 0a 20 20 69 66 28 20 73 74 61 74 66 73 28 66  }.  if( statfs(f
23980 69 6c 65 50 61 74 68 2c 20 26 66 73 49 6e 66 6f  ilePath, &fsInfo
23990 29 20 21 3d 20 2d 31 20 29 7b 0a 20 20 20 20 69  ) != -1 ){.    i
239a0 66 28 20 66 73 49 6e 66 6f 2e 66 5f 66 6c 61 67  f( fsInfo.f_flag
239b0 73 20 26 20 4d 4e 54 5f 52 44 4f 4e 4c 59 20 29  s & MNT_RDONLY )
239c0 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 26  {.      return &
239d0 6e 6f 6c 6f 63 6b 49 6f 4d 65 74 68 6f 64 73 3b  nolockIoMethods;
239e0 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 69  .    }.    for(i
239f0 3d 30 3b 20 61 4d 61 70 5b 69 5d 2e 7a 46 69 6c  =0; aMap[i].zFil
23a00 65 73 79 73 74 65 6d 3b 20 69 2b 2b 29 7b 0a 20  esystem; i++){. 
23a10 20 20 20 20 20 69 66 28 20 73 74 72 63 6d 70 28       if( strcmp(
23a20 66 73 49 6e 66 6f 2e 66 5f 66 73 74 79 70 65 6e  fsInfo.f_fstypen
23a30 61 6d 65 2c 20 61 4d 61 70 5b 69 5d 2e 7a 46 69  ame, aMap[i].zFi
23a40 6c 65 73 79 73 74 65 6d 29 3d 3d 30 20 29 7b 0a  lesystem)==0 ){.
23a50 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 61          return a
23a60 4d 61 70 5b 69 5d 2e 70 4d 65 74 68 6f 64 73 3b  Map[i].pMethods;
23a70 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
23a80 20 7d 0a 0a 20 20 2f 2a 20 44 65 66 61 75 6c 74   }..  /* Default
23a90 20 63 61 73 65 2e 20 48 61 6e 64 6c 65 73 2c 20   case. Handles, 
23aa0 61 6d 6f 6e 67 73 74 20 6f 74 68 65 72 73 2c 20  amongst others, 
23ab0 22 6e 66 73 22 2e 0a 20 20 2a 2a 20 54 65 73 74  "nfs"..  ** Test
23ac0 20 62 79 74 65 2d 72 61 6e 67 65 20 6c 6f 63 6b   byte-range lock
23ad0 20 75 73 69 6e 67 20 66 63 6e 74 6c 28 29 2e 20   using fcntl(). 
23ae0 49 66 20 74 68 65 20 63 61 6c 6c 20 73 75 63 63  If the call succ
23af0 65 65 64 73 2c 20 0a 20 20 2a 2a 20 61 73 73 75  eeds, .  ** assu
23b00 6d 65 20 74 68 61 74 20 74 68 65 20 66 69 6c 65  me that the file
23b10 2d 73 79 73 74 65 6d 20 73 75 70 70 6f 72 74 73  -system supports
23b20 20 50 4f 53 49 58 20 73 74 79 6c 65 20 6c 6f 63   POSIX style loc
23b30 6b 73 2e 20 0a 20 20 2a 2f 0a 20 20 6c 6f 63 6b  ks. .  */.  lock
23b40 49 6e 66 6f 2e 6c 5f 6c 65 6e 20 3d 20 31 3b 0a  Info.l_len = 1;.
23b50 20 20 6c 6f 63 6b 49 6e 66 6f 2e 6c 5f 73 74 61    lockInfo.l_sta
23b60 72 74 20 3d 20 30 3b 0a 20 20 6c 6f 63 6b 49 6e  rt = 0;.  lockIn
23b70 66 6f 2e 6c 5f 77 68 65 6e 63 65 20 3d 20 53 45  fo.l_whence = SE
23b80 45 4b 5f 53 45 54 3b 0a 20 20 6c 6f 63 6b 49 6e  EK_SET;.  lockIn
23b90 66 6f 2e 6c 5f 74 79 70 65 20 3d 20 46 5f 52 44  fo.l_type = F_RD
23ba0 4c 43 4b 3b 0a 20 20 69 66 28 20 66 63 6e 74 6c  LCK;.  if( fcntl
23bb0 28 70 4e 65 77 2d 3e 68 2c 20 46 5f 47 45 54 4c  (pNew->h, F_GETL
23bc0 4b 2c 20 26 6c 6f 63 6b 49 6e 66 6f 29 21 3d 2d  K, &lockInfo)!=-
23bd0 31 20 29 20 7b 0a 20 20 20 20 69 66 28 20 73 74  1 ) {.    if( st
23be0 72 63 6d 70 28 66 73 49 6e 66 6f 2e 66 5f 66 73  rcmp(fsInfo.f_fs
23bf0 74 79 70 65 6e 61 6d 65 2c 20 22 6e 66 73 22 29  typename, "nfs")
23c00 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 65 74  ==0 ){.      ret
23c10 75 72 6e 20 26 6e 66 73 49 6f 4d 65 74 68 6f 64  urn &nfsIoMethod
23c20 73 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a  s;.    } else {.
23c30 20 20 20 20 20 20 72 65 74 75 72 6e 20 26 70 6f        return &po
23c40 73 69 78 49 6f 4d 65 74 68 6f 64 73 3b 0a 20 20  sixIoMethods;.  
23c50 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20    }.  }else{.   
23c60 20 72 65 74 75 72 6e 20 26 64 6f 74 6c 6f 63 6b   return &dotlock
23c70 49 6f 4d 65 74 68 6f 64 73 3b 0a 20 20 7d 0a 7d  IoMethods;.  }.}
23c80 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73 71  .static const sq
23c90 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73  lite3_io_methods
23ca0 20 0a 20 20 2a 28 2a 63 6f 6e 73 74 20 61 75 74   .  *(*const aut
23cb0 6f 6c 6f 63 6b 49 6f 46 69 6e 64 65 72 29 28 63  olockIoFinder)(c
23cc0 6f 6e 73 74 20 63 68 61 72 2a 2c 75 6e 69 78 46  onst char*,unixF
23cd0 69 6c 65 2a 29 20 3d 20 61 75 74 6f 6c 6f 63 6b  ile*) = autolock
23ce0 49 6f 46 69 6e 64 65 72 49 6d 70 6c 3b 0a 0a 23  IoFinderImpl;..#
23cf0 65 6e 64 69 66 20 2f 2a 20 64 65 66 69 6e 65 64  endif /* defined
23d00 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 26 26 20 53  (__APPLE__) && S
23d10 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43  QLITE_ENABLE_LOC
23d20 4b 49 4e 47 5f 53 54 59 4c 45 20 2a 2f 0a 0a 23  KING_STYLE */..#
23d30 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53 20 26 26  if OS_VXWORKS &&
23d40 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c   SQLITE_ENABLE_L
23d50 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 2f 2a 20  OCKING_STYLE./* 
23d60 0a 2a 2a 20 54 68 69 73 20 22 66 69 6e 64 65 72  .** This "finder
23d70 22 20 66 75 6e 63 74 69 6f 6e 20 61 74 74 65 6d  " function attem
23d80 70 74 73 20 74 6f 20 64 65 74 65 72 6d 69 6e 65  pts to determine
23d90 20 74 68 65 20 62 65 73 74 20 6c 6f 63 6b 69 6e   the best lockin
23da0 67 20 73 74 72 61 74 65 67 79 20 0a 2a 2a 20 66  g strategy .** f
23db0 6f 72 20 74 68 65 20 64 61 74 61 62 61 73 65 20  or the database 
23dc0 66 69 6c 65 20 22 66 69 6c 65 50 61 74 68 22 2e  file "filePath".
23dd0 20 20 49 74 20 74 68 65 6e 20 72 65 74 75 72 6e    It then return
23de0 73 20 74 68 65 20 73 71 6c 69 74 65 33 5f 69 6f  s the sqlite3_io
23df0 5f 6d 65 74 68 6f 64 73 0a 2a 2a 20 6f 62 6a 65  _methods.** obje
23e00 63 74 20 74 68 61 74 20 69 6d 70 6c 65 6d 65 6e  ct that implemen
23e10 74 73 20 74 68 61 74 20 73 74 72 61 74 65 67 79  ts that strategy
23e20 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20  ..**.** This is 
23e30 66 6f 72 20 56 58 57 6f 72 6b 73 20 6f 6e 6c 79  for VXWorks only
23e40 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73  ..*/.static cons
23e50 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74  t sqlite3_io_met
23e60 68 6f 64 73 20 2a 61 75 74 6f 6c 6f 63 6b 49 6f  hods *autolockIo
23e70 46 69 6e 64 65 72 49 6d 70 6c 28 0a 20 20 63 6f  FinderImpl(.  co
23e80 6e 73 74 20 63 68 61 72 20 2a 66 69 6c 65 50 61  nst char *filePa
23e90 74 68 2c 20 20 20 20 2f 2a 20 6e 61 6d 65 20 6f  th,    /* name o
23ea0 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  f the database f
23eb0 69 6c 65 20 2a 2f 0a 20 20 75 6e 69 78 46 69 6c  ile */.  unixFil
23ec0 65 20 2a 70 4e 65 77 20 20 20 20 20 20 20 20 20  e *pNew         
23ed0 20 20 2f 2a 20 74 68 65 20 6f 70 65 6e 20 66 69    /* the open fi
23ee0 6c 65 20 6f 62 6a 65 63 74 20 2a 2f 0a 29 7b 0a  le object */.){.
23ef0 20 20 73 74 72 75 63 74 20 66 6c 6f 63 6b 20 6c    struct flock l
23f00 6f 63 6b 49 6e 66 6f 3b 0a 0a 20 20 69 66 28 20  ockInfo;..  if( 
23f10 21 66 69 6c 65 50 61 74 68 20 29 7b 0a 20 20 20  !filePath ){.   
23f20 20 2f 2a 20 49 66 20 66 69 6c 65 50 61 74 68 3d   /* If filePath=
23f30 3d 4e 55 4c 4c 20 74 68 61 74 20 6d 65 61 6e 73  =NULL that means
23f40 20 77 65 20 61 72 65 20 64 65 61 6c 69 6e 67 20   we are dealing 
23f50 77 69 74 68 20 61 20 74 72 61 6e 73 69 65 6e 74  with a transient
23f60 20 66 69 6c 65 0a 20 20 20 20 2a 2a 20 74 68 61   file.    ** tha
23f70 74 20 64 6f 65 73 20 6e 6f 74 20 6e 65 65 64 20  t does not need 
23f80 74 6f 20 62 65 20 6c 6f 63 6b 65 64 2e 20 2a 2f  to be locked. */
23f90 0a 20 20 20 20 72 65 74 75 72 6e 20 26 6e 6f 6c  .    return &nol
23fa0 6f 63 6b 49 6f 4d 65 74 68 6f 64 73 3b 0a 20 20  ockIoMethods;.  
23fb0 7d 0a 0a 20 20 2f 2a 20 54 65 73 74 20 69 66 20  }..  /* Test if 
23fc0 66 63 6e 74 6c 28 29 20 69 73 20 73 75 70 70 6f  fcntl() is suppo
23fd0 72 74 65 64 20 61 6e 64 20 75 73 65 20 50 4f 53  rted and use POS
23fe0 49 58 20 73 74 79 6c 65 20 6c 6f 63 6b 73 2e 0a  IX style locks..
23ff0 20 20 2a 2a 20 4f 74 68 65 72 77 69 73 65 20 66    ** Otherwise f
24000 61 6c 6c 20 62 61 63 6b 20 74 6f 20 74 68 65 20  all back to the 
24010 6e 61 6d 65 64 20 73 65 6d 61 70 68 6f 72 65 20  named semaphore 
24020 6d 65 74 68 6f 64 2e 0a 20 20 2a 2f 0a 20 20 6c  method..  */.  l
24030 6f 63 6b 49 6e 66 6f 2e 6c 5f 6c 65 6e 20 3d 20  ockInfo.l_len = 
24040 31 3b 0a 20 20 6c 6f 63 6b 49 6e 66 6f 2e 6c 5f  1;.  lockInfo.l_
24050 73 74 61 72 74 20 3d 20 30 3b 0a 20 20 6c 6f 63  start = 0;.  loc
24060 6b 49 6e 66 6f 2e 6c 5f 77 68 65 6e 63 65 20 3d  kInfo.l_whence =
24070 20 53 45 45 4b 5f 53 45 54 3b 0a 20 20 6c 6f 63   SEEK_SET;.  loc
24080 6b 49 6e 66 6f 2e 6c 5f 74 79 70 65 20 3d 20 46  kInfo.l_type = F
24090 5f 52 44 4c 43 4b 3b 0a 20 20 69 66 28 20 66 63  _RDLCK;.  if( fc
240a0 6e 74 6c 28 70 4e 65 77 2d 3e 68 2c 20 46 5f 47  ntl(pNew->h, F_G
240b0 45 54 4c 4b 2c 20 26 6c 6f 63 6b 49 6e 66 6f 29  ETLK, &lockInfo)
240c0 21 3d 2d 31 20 29 20 7b 0a 20 20 20 20 72 65 74  !=-1 ) {.    ret
240d0 75 72 6e 20 26 70 6f 73 69 78 49 6f 4d 65 74 68  urn &posixIoMeth
240e0 6f 64 73 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ods;.  }else{.  
240f0 20 20 72 65 74 75 72 6e 20 26 73 65 6d 49 6f 4d    return &semIoM
24100 65 74 68 6f 64 73 3b 0a 20 20 7d 0a 7d 0a 73 74  ethods;.  }.}.st
24110 61 74 69 63 20 63 6f 6e 73 74 20 73 71 6c 69 74  atic const sqlit
24120 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 0a 20  e3_io_methods . 
24130 20 2a 28 2a 63 6f 6e 73 74 20 61 75 74 6f 6c 6f   *(*const autolo
24140 63 6b 49 6f 46 69 6e 64 65 72 29 28 63 6f 6e 73  ckIoFinder)(cons
24150 74 20 63 68 61 72 2a 2c 75 6e 69 78 46 69 6c 65  t char*,unixFile
24160 2a 29 20 3d 20 61 75 74 6f 6c 6f 63 6b 49 6f 46  *) = autolockIoF
24170 69 6e 64 65 72 49 6d 70 6c 3b 0a 0a 23 65 6e 64  inderImpl;..#end
24180 69 66 20 2f 2a 20 4f 53 5f 56 58 57 4f 52 4b 53  if /* OS_VXWORKS
24190 20 26 26 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c   && SQLITE_ENABL
241a0 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20  E_LOCKING_STYLE 
241b0 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 61 62 73  */../*.** An abs
241c0 74 72 61 63 74 20 74 79 70 65 20 66 6f 72 20 61  tract type for a
241d0 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 49 4f   pointer to a IO
241e0 20 6d 65 74 68 6f 64 20 66 69 6e 64 65 72 20 66   method finder f
241f0 75 6e 63 74 69 6f 6e 3a 0a 2a 2f 0a 74 79 70 65  unction:.*/.type
24200 64 65 66 20 63 6f 6e 73 74 20 73 71 6c 69 74 65  def const sqlite
24210 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 2a 28 2a  3_io_methods *(*
24220 66 69 6e 64 65 72 5f 74 79 70 65 29 28 63 6f 6e  finder_type)(con
24230 73 74 20 63 68 61 72 2a 2c 75 6e 69 78 46 69 6c  st char*,unixFil
24240 65 2a 29 3b 0a 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a  e*);.../********
24250 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
24260 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
24270 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
24280 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
24290 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****.***********
242a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
242b0 2a 20 73 71 6c 69 74 65 33 5f 76 66 73 20 6d 65  * sqlite3_vfs me
242c0 74 68 6f 64 73 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  thods **********
242d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
242e0 2a 2a 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 64 69  **.**.** This di
242f0 76 69 73 69 6f 6e 20 63 6f 6e 74 61 69 6e 73 20  vision contains 
24300 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  the implementati
24310 6f 6e 20 6f 66 20 6d 65 74 68 6f 64 73 20 6f 6e  on of methods on
24320 20 74 68 65 0a 2a 2a 20 73 71 6c 69 74 65 33 5f   the.** sqlite3_
24330 76 66 73 20 6f 62 6a 65 63 74 2e 0a 2a 2f 0a 0a  vfs object..*/..
24340 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65  /*.** Initialize
24350 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66   the contents of
24360 20 74 68 65 20 75 6e 69 78 46 69 6c 65 20 73 74   the unixFile st
24370 72 75 63 74 75 72 65 20 70 6f 69 6e 74 65 64 20  ructure pointed 
24380 74 6f 20 62 79 20 70 49 64 2e 0a 2a 2f 0a 73 74  to by pId..*/.st
24390 61 74 69 63 20 69 6e 74 20 66 69 6c 6c 49 6e 55  atic int fillInU
243a0 6e 69 78 46 69 6c 65 28 0a 20 20 73 71 6c 69 74  nixFile(.  sqlit
243b0 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 20 20  e3_vfs *pVfs,   
243c0 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f     /* Pointer to
243d0 20 76 66 73 20 6f 62 6a 65 63 74 20 2a 2f 0a 20   vfs object */. 
243e0 20 69 6e 74 20 68 2c 20 20 20 20 20 20 20 20 20   int h,         
243f0 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 70 65 6e           /* Open
24400 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
24410 20 6f 66 20 66 69 6c 65 20 62 65 69 6e 67 20 6f   of file being o
24420 70 65 6e 65 64 20 2a 2f 0a 20 20 69 6e 74 20 64  pened */.  int d
24430 69 72 66 64 2c 20 20 20 20 20 20 20 20 20 20 20  irfd,           
24440 20 20 20 2f 2a 20 44 69 72 65 63 74 6f 72 79 20     /* Directory 
24450 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
24460 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c  */.  sqlite3_fil
24470 65 20 2a 70 49 64 2c 20 20 20 20 20 20 2f 2a 20  e *pId,      /* 
24480 57 72 69 74 65 20 74 6f 20 74 68 65 20 75 6e 69  Write to the uni
24490 78 46 69 6c 65 20 73 74 72 75 63 74 75 72 65 20  xFile structure 
244a0 68 65 72 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  here */.  const 
244b0 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c  char *zFilename,
244c0 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65    /* Name of the
244d0 20 66 69 6c 65 20 62 65 69 6e 67 20 6f 70 65 6e   file being open
244e0 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 6f 4c 6f  ed */.  int noLo
244f0 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ck,             
24500 2f 2a 20 4f 6d 69 74 20 6c 6f 63 6b 69 6e 67 20  /* Omit locking 
24510 69 66 20 74 72 75 65 20 2a 2f 0a 20 20 69 6e 74  if true */.  int
24520 20 69 73 44 65 6c 65 74 65 20 20 20 20 20 20 20   isDelete       
24530 20 20 20 20 20 2f 2a 20 44 65 6c 65 74 65 20 6f       /* Delete o
24540 6e 20 63 6c 6f 73 65 20 69 66 20 74 72 75 65 20  n close if true 
24550 2a 2f 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 73 71  */.){.  const sq
24560 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73  lite3_io_methods
24570 20 2a 70 4c 6f 63 6b 69 6e 67 53 74 79 6c 65 3b   *pLockingStyle;
24580 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 4e 65  .  unixFile *pNe
24590 77 20 3d 20 28 75 6e 69 78 46 69 6c 65 20 2a 29  w = (unixFile *)
245a0 70 49 64 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20  pId;.  int rc = 
245b0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 61 73  SQLITE_OK;..  as
245c0 73 65 72 74 28 20 70 4e 65 77 2d 3e 70 4c 6f 63  sert( pNew->pLoc
245d0 6b 3d 3d 4e 55 4c 4c 20 29 3b 0a 20 20 61 73 73  k==NULL );.  ass
245e0 65 72 74 28 20 70 4e 65 77 2d 3e 70 4f 70 65 6e  ert( pNew->pOpen
245f0 3d 3d 4e 55 4c 4c 20 29 3b 0a 0a 20 20 2f 2a 20  ==NULL );..  /* 
24600 50 61 72 61 6d 65 74 65 72 20 69 73 44 65 6c 65  Parameter isDele
24610 74 65 20 69 73 20 6f 6e 6c 79 20 75 73 65 64 20  te is only used 
24620 6f 6e 20 76 78 77 6f 72 6b 73 2e 20 45 78 70 72  on vxworks. Expr
24630 65 73 73 20 74 68 69 73 20 65 78 70 6c 69 63 69  ess this explici
24640 74 6c 79 20 0a 20 20 2a 2a 20 68 65 72 65 20 74  tly .  ** here t
24650 6f 20 70 72 65 76 65 6e 74 20 63 6f 6d 70 69 6c  o prevent compil
24660 65 72 20 77 61 72 6e 69 6e 67 73 20 61 62 6f 75  er warnings abou
24670 74 20 75 6e 75 73 65 64 20 70 61 72 61 6d 65 74  t unused paramet
24680 65 72 73 2e 0a 20 20 2a 2f 0a 20 20 55 4e 55 53  ers..  */.  UNUS
24690 45 44 5f 50 41 52 41 4d 45 54 45 52 28 69 73 44  ED_PARAMETER(isD
246a0 65 6c 65 74 65 29 3b 0a 0a 20 20 4f 53 54 52 41  elete);..  OSTRA
246b0 43 45 33 28 22 4f 50 45 4e 20 20 20 20 25 2d 33  CE3("OPEN    %-3
246c0 64 20 25 73 5c 6e 22 2c 20 68 2c 20 7a 46 69 6c  d %s\n", h, zFil
246d0 65 6e 61 6d 65 29 3b 20 20 20 20 0a 20 20 70 4e  ename);    .  pN
246e0 65 77 2d 3e 68 20 3d 20 68 3b 0a 20 20 70 4e 65  ew->h = h;.  pNe
246f0 77 2d 3e 64 69 72 66 64 20 3d 20 64 69 72 66 64  w->dirfd = dirfd
24700 3b 0a 20 20 53 45 54 5f 54 48 52 45 41 44 49 44  ;.  SET_THREADID
24710 28 70 4e 65 77 29 3b 0a 20 20 70 4e 65 77 2d 3e  (pNew);.  pNew->
24720 66 69 6c 65 46 6c 61 67 73 20 3d 20 30 3b 0a 20  fileFlags = 0;. 
24730 20 61 73 73 65 72 74 28 20 7a 46 69 6c 65 6e 61   assert( zFilena
24740 6d 65 3d 3d 30 20 7c 7c 20 7a 46 69 6c 65 6e 61  me==0 || zFilena
24750 6d 65 5b 30 5d 3d 3d 27 2f 27 20 29 3b 20 20 2f  me[0]=='/' );  /
24760 2a 20 4e 65 76 65 72 20 61 20 72 65 6c 61 74 69  * Never a relati
24770 76 65 20 70 61 74 68 6e 61 6d 65 20 2a 2f 0a 20  ve pathname */. 
24780 20 70 4e 65 77 2d 3e 7a 50 61 74 68 20 3d 20 7a   pNew->zPath = z
24790 46 69 6c 65 6e 61 6d 65 3b 0a 0a 23 69 66 20 4f  Filename;..#if O
247a0 53 5f 56 58 57 4f 52 4b 53 0a 20 20 70 4e 65 77  S_VXWORKS.  pNew
247b0 2d 3e 70 49 64 20 3d 20 76 78 77 6f 72 6b 73 46  ->pId = vxworksF
247c0 69 6e 64 46 69 6c 65 49 64 28 7a 46 69 6c 65 6e  indFileId(zFilen
247d0 61 6d 65 29 3b 0a 20 20 69 66 28 20 70 4e 65 77  ame);.  if( pNew
247e0 2d 3e 70 49 64 3d 3d 30 20 29 7b 0a 20 20 20 20  ->pId==0 ){.    
247f0 6e 6f 4c 6f 63 6b 20 3d 20 31 3b 0a 20 20 20 20  noLock = 1;.    
24800 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  rc = SQLITE_NOME
24810 4d 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  M;.  }.#endif.. 
24820 20 69 66 28 20 6e 6f 4c 6f 63 6b 20 29 7b 0a 20   if( noLock ){. 
24830 20 20 20 70 4c 6f 63 6b 69 6e 67 53 74 79 6c 65     pLockingStyle
24840 20 3d 20 26 6e 6f 6c 6f 63 6b 49 6f 4d 65 74 68   = &nolockIoMeth
24850 6f 64 73 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ods;.  }else{.  
24860 20 20 70 4c 6f 63 6b 69 6e 67 53 74 79 6c 65 20    pLockingStyle 
24870 3d 20 28 2a 2a 28 66 69 6e 64 65 72 5f 74 79 70  = (**(finder_typ
24880 65 2a 29 70 56 66 73 2d 3e 70 41 70 70 44 61 74  e*)pVfs->pAppDat
24890 61 29 28 7a 46 69 6c 65 6e 61 6d 65 2c 20 70 4e  a)(zFilename, pN
248a0 65 77 29 3b 0a 23 69 66 20 53 51 4c 49 54 45 5f  ew);.#if SQLITE_
248b0 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53  ENABLE_LOCKING_S
248c0 54 59 4c 45 0a 20 20 20 20 2f 2a 20 43 61 63 68  TYLE.    /* Cach
248d0 65 20 7a 46 69 6c 65 6e 61 6d 65 20 69 6e 20 74  e zFilename in t
248e0 68 65 20 6c 6f 63 6b 69 6e 67 20 63 6f 6e 74 65  he locking conte
248f0 78 74 20 28 41 46 50 20 61 6e 64 20 64 6f 74 6c  xt (AFP and dotl
24900 6f 63 6b 20 6f 76 65 72 72 69 64 65 29 20 66 6f  ock override) fo
24910 72 0a 20 20 20 20 2a 2a 20 70 72 6f 78 79 4c 6f  r.    ** proxyLo
24920 63 6b 20 61 63 74 69 76 61 74 69 6f 6e 20 69 73  ck activation is
24930 20 70 6f 73 73 69 62 6c 65 20 28 72 65 6d 6f 74   possible (remot
24940 65 20 70 72 6f 78 79 20 69 73 20 62 61 73 65 64  e proxy is based
24950 20 6f 6e 20 64 62 20 6e 61 6d 65 29 0a 20 20 20   on db name).   
24960 20 2a 2a 20 7a 46 69 6c 65 6e 61 6d 65 20 72 65   ** zFilename re
24970 6d 61 69 6e 73 20 76 61 6c 69 64 20 75 6e 74 69  mains valid unti
24980 6c 20 66 69 6c 65 20 69 73 20 63 6c 6f 73 65 64  l file is closed
24990 2c 20 74 6f 20 73 75 70 70 6f 72 74 20 2a 2f 0a  , to support */.
249a0 20 20 20 20 70 4e 65 77 2d 3e 6c 6f 63 6b 69 6e      pNew->lockin
249b0 67 43 6f 6e 74 65 78 74 20 3d 20 28 76 6f 69 64  gContext = (void
249c0 2a 29 7a 46 69 6c 65 6e 61 6d 65 3b 0a 23 65 6e  *)zFilename;.#en
249d0 64 69 66 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70  dif.  }..  if( p
249e0 4c 6f 63 6b 69 6e 67 53 74 79 6c 65 20 3d 3d 20  LockingStyle == 
249f0 26 70 6f 73 69 78 49 6f 4d 65 74 68 6f 64 73 0a  &posixIoMethods.
24a00 23 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 41 50  #if defined(__AP
24a10 50 4c 45 5f 5f 29 20 26 26 20 53 51 4c 49 54 45  PLE__) && SQLITE
24a20 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f  _ENABLE_LOCKING_
24a30 53 54 59 4c 45 0a 20 20 20 20 7c 7c 20 70 4c 6f  STYLE.    || pLo
24a40 63 6b 69 6e 67 53 74 79 6c 65 20 3d 3d 20 26 6e  ckingStyle == &n
24a50 66 73 49 6f 4d 65 74 68 6f 64 73 0a 23 65 6e 64  fsIoMethods.#end
24a60 69 66 0a 20 20 29 7b 0a 20 20 20 20 75 6e 69 78  if.  ){.    unix
24a70 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 20 20  EnterMutex();.  
24a80 20 20 72 63 20 3d 20 66 69 6e 64 4c 6f 63 6b 49    rc = findLockI
24a90 6e 66 6f 28 70 4e 65 77 2c 20 26 70 4e 65 77 2d  nfo(pNew, &pNew-
24aa0 3e 70 4c 6f 63 6b 2c 20 26 70 4e 65 77 2d 3e 70  >pLock, &pNew->p
24ab0 4f 70 65 6e 29 3b 0a 20 20 20 20 69 66 28 20 72  Open);.    if( r
24ac0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
24ad0 20 20 20 20 20 20 2f 2a 20 49 66 20 61 6e 20 65        /* If an e
24ae0 72 72 6f 72 20 6f 63 63 75 72 65 64 20 69 6e 20  rror occured in 
24af0 66 69 6e 64 4c 6f 63 6b 49 6e 66 6f 28 29 2c 20  findLockInfo(), 
24b00 63 6c 6f 73 65 20 74 68 65 20 66 69 6c 65 20 64  close the file d
24b10 65 73 63 72 69 70 74 6f 72 0a 20 20 20 20 20 20  escriptor.      
24b20 2a 2a 20 69 6d 6d 65 64 69 61 74 65 6c 79 2c 20  ** immediately, 
24b30 62 65 66 6f 72 65 20 72 65 6c 65 61 73 69 6e 67  before releasing
24b40 20 74 68 65 20 6d 75 74 65 78 2e 20 66 69 6e 64   the mutex. find
24b50 4c 6f 63 6b 49 6e 66 6f 28 29 20 6d 61 79 20 66  LockInfo() may f
24b60 61 69 6c 0a 20 20 20 20 20 20 2a 2a 20 69 6e 20  ail.      ** in 
24b70 74 77 6f 20 73 63 65 6e 61 72 69 6f 73 3a 0a 20  two scenarios:. 
24b80 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a       **.      **
24b90 20 20 20 28 61 29 20 41 20 63 61 6c 6c 20 74 6f     (a) A call to
24ba0 20 66 73 74 61 74 28 29 20 66 61 69 6c 65 64 2e   fstat() failed.
24bb0 0a 20 20 20 20 20 20 2a 2a 20 20 20 28 62 29 20  .      **   (b) 
24bc0 41 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 65 64 2e  A malloc failed.
24bd0 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20  .      **.      
24be0 2a 2a 20 53 63 65 6e 61 72 69 6f 20 28 62 29 20  ** Scenario (b) 
24bf0 6d 61 79 20 6f 6e 6c 79 20 6f 63 63 75 72 20 69  may only occur i
24c00 66 20 74 68 65 20 70 72 6f 63 65 73 73 20 69 73  f the process is
24c10 20 68 6f 6c 64 69 6e 67 20 6e 6f 20 6f 74 68 65   holding no othe
24c20 72 0a 20 20 20 20 20 20 2a 2a 20 66 69 6c 65 20  r.      ** file 
24c30 64 65 73 63 72 69 70 74 6f 72 73 20 6f 70 65 6e  descriptors open
24c40 20 6f 6e 20 74 68 65 20 73 61 6d 65 20 66 69 6c   on the same fil
24c50 65 2e 20 49 66 20 74 68 65 72 65 20 77 65 72 65  e. If there were
24c60 20 6f 74 68 65 72 20 66 69 6c 65 0a 20 20 20 20   other file.    
24c70 20 20 2a 2a 20 64 65 73 63 72 69 70 74 6f 72 73    ** descriptors
24c80 20 6f 6e 20 74 68 69 73 20 66 69 6c 65 2c 20 74   on this file, t
24c90 68 65 6e 20 6e 6f 20 6d 61 6c 6c 6f 63 20 77 6f  hen no malloc wo
24ca0 75 6c 64 20 62 65 20 72 65 71 75 69 72 65 64 20  uld be required 
24cb0 62 79 0a 20 20 20 20 20 20 2a 2a 20 66 69 6e 64  by.      ** find
24cc0 4c 6f 63 6b 49 6e 66 6f 28 29 2e 20 49 66 20 74  LockInfo(). If t
24cd0 68 69 73 20 69 73 20 74 68 65 20 63 61 73 65 2c  his is the case,
24ce0 20 69 74 20 69 73 20 71 75 69 74 65 20 73 61 66   it is quite saf
24cf0 65 20 74 6f 20 63 6c 6f 73 65 0a 20 20 20 20 20  e to close.     
24d00 20 2a 2a 20 68 61 6e 64 6c 65 20 68 20 2d 20 61   ** handle h - a
24d10 73 20 69 74 20 69 73 20 67 75 61 72 61 6e 74 65  s it is guarante
24d20 65 64 20 74 68 61 74 20 6e 6f 20 70 6f 73 69 78  ed that no posix
24d30 20 6c 6f 63 6b 73 20 77 69 6c 6c 20 62 65 20 72   locks will be r
24d40 65 6c 65 61 73 65 64 0a 20 20 20 20 20 20 2a 2a  eleased.      **
24d50 20 62 79 20 64 6f 69 6e 67 20 73 6f 2e 0a 20 20   by doing so..  
24d60 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20      **.      ** 
24d70 49 66 20 73 63 65 6e 61 72 69 6f 20 28 61 29 20  If scenario (a) 
24d80 63 61 75 73 65 64 20 74 68 65 20 65 72 72 6f 72  caused the error
24d90 20 74 68 65 6e 20 74 68 69 6e 67 73 20 61 72 65   then things are
24da0 20 6e 6f 74 20 73 6f 20 73 61 66 65 2e 20 54 68   not so safe. Th
24db0 65 0a 20 20 20 20 20 20 2a 2a 20 69 6d 70 6c 69  e.      ** impli
24dc0 63 69 74 20 61 73 73 75 6d 70 74 69 6f 6e 20 68  cit assumption h
24dd0 65 72 65 20 69 73 20 74 68 61 74 20 69 66 20 66  ere is that if f
24de0 73 74 61 74 28 29 20 66 61 69 6c 73 2c 20 74 68  stat() fails, th
24df0 69 6e 67 73 20 61 72 65 20 69 6e 0a 20 20 20 20  ings are in.    
24e00 20 20 2a 2a 20 73 75 63 68 20 62 61 64 20 73 68    ** such bad sh
24e10 61 70 65 20 74 68 61 74 20 64 72 6f 70 70 69 6e  ape that droppin
24e20 67 20 61 20 6c 6f 63 6b 20 6f 72 20 74 77 6f 20  g a lock or two 
24e30 64 6f 65 73 6e 27 74 20 6d 61 74 74 65 72 20 6d  doesn't matter m
24e40 75 63 68 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  uch..      */.  
24e50 20 20 20 20 63 6c 6f 73 65 28 68 29 3b 0a 20 20      close(h);.  
24e60 20 20 20 20 68 20 3d 20 2d 31 3b 0a 20 20 20 20      h = -1;.    
24e70 7d 0a 20 20 20 20 75 6e 69 78 4c 65 61 76 65 4d  }.    unixLeaveM
24e80 75 74 65 78 28 29 3b 0a 20 20 7d 0a 0a 23 69 66  utex();.  }..#if
24e90 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c   SQLITE_ENABLE_L
24ea0 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 26 26 20  OCKING_STYLE && 
24eb0 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f  defined(__APPLE_
24ec0 5f 29 0a 20 20 65 6c 73 65 20 69 66 28 20 70 4c  _).  else if( pL
24ed0 6f 63 6b 69 6e 67 53 74 79 6c 65 20 3d 3d 20 26  ockingStyle == &
24ee0 61 66 70 49 6f 4d 65 74 68 6f 64 73 20 29 7b 0a  afpIoMethods ){.
24ef0 20 20 20 20 2f 2a 20 41 46 50 20 6c 6f 63 6b 69      /* AFP locki
24f00 6e 67 20 75 73 65 73 20 74 68 65 20 66 69 6c 65  ng uses the file
24f10 20 70 61 74 68 20 73 6f 20 69 74 20 6e 65 65 64   path so it need
24f20 73 20 74 6f 20 62 65 20 69 6e 63 6c 75 64 65 64  s to be included
24f30 20 69 6e 0a 20 20 20 20 2a 2a 20 74 68 65 20 61   in.    ** the a
24f40 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  fpLockingContext
24f50 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 66 70  ..    */.    afp
24f60 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a  LockingContext *
24f70 70 43 74 78 3b 0a 20 20 20 20 70 4e 65 77 2d 3e  pCtx;.    pNew->
24f80 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 3d  lockingContext =
24f90 20 70 43 74 78 20 3d 20 73 71 6c 69 74 65 33 5f   pCtx = sqlite3_
24fa0 6d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 2a  malloc( sizeof(*
24fb0 70 43 74 78 29 20 29 3b 0a 20 20 20 20 69 66 28  pCtx) );.    if(
24fc0 20 70 43 74 78 3d 3d 30 20 29 7b 0a 20 20 20 20   pCtx==0 ){.    
24fd0 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f    rc = SQLITE_NO
24fe0 4d 45 4d 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  MEM;.    }else{.
24ff0 20 20 20 20 20 20 2f 2a 20 4e 42 3a 20 7a 46 69        /* NB: zFi
25000 6c 65 6e 61 6d 65 20 65 78 69 73 74 73 20 61 6e  lename exists an
25010 64 20 72 65 6d 61 69 6e 73 20 76 61 6c 69 64 20  d remains valid 
25020 75 6e 74 69 6c 20 74 68 65 20 66 69 6c 65 20 69  until the file i
25030 73 20 63 6c 6f 73 65 64 0a 20 20 20 20 20 20 2a  s closed.      *
25040 2a 20 61 63 63 6f 72 64 69 6e 67 20 74 6f 20 72  * according to r
25050 65 71 75 69 72 65 6d 65 6e 74 20 46 31 31 31 34  equirement F1114
25060 31 2e 20 20 53 6f 20 77 65 20 64 6f 20 6e 6f 74  1.  So we do not
25070 20 6e 65 65 64 20 74 6f 20 6d 61 6b 65 20 61 0a   need to make a.
25080 20 20 20 20 20 20 2a 2a 20 63 6f 70 79 20 6f 66        ** copy of
25090 20 74 68 65 20 66 69 6c 65 6e 61 6d 65 2e 20 2a   the filename. *
250a0 2f 0a 20 20 20 20 20 20 70 43 74 78 2d 3e 64 62  /.      pCtx->db
250b0 50 61 74 68 20 3d 20 7a 46 69 6c 65 6e 61 6d 65  Path = zFilename
250c0 3b 0a 20 20 20 20 20 20 70 43 74 78 2d 3e 72 65  ;.      pCtx->re
250d0 73 65 72 76 65 64 20 3d 20 30 3b 0a 20 20 20 20  served = 0;.    
250e0 20 20 73 72 61 6e 64 6f 6d 64 65 76 28 29 3b 0a    srandomdev();.
250f0 20 20 20 20 20 20 75 6e 69 78 45 6e 74 65 72 4d        unixEnterM
25100 75 74 65 78 28 29 3b 0a 20 20 20 20 20 20 72 63  utex();.      rc
25110 20 3d 20 66 69 6e 64 4c 6f 63 6b 49 6e 66 6f 28   = findLockInfo(
25120 70 4e 65 77 2c 20 26 70 4e 65 77 2d 3e 70 4c 6f  pNew, &pNew->pLo
25130 63 6b 2c 20 26 70 4e 65 77 2d 3e 70 4f 70 65 6e  ck, &pNew->pOpen
25140 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21  );.      if( rc!
25150 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
25160 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
25170 65 65 28 70 4e 65 77 2d 3e 6c 6f 63 6b 69 6e 67  ee(pNew->locking
25180 43 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20 20 20  Context);.      
25190 20 20 63 6c 6f 73 65 28 68 29 3b 0a 20 20 20 20    close(h);.    
251a0 20 20 20 20 68 20 3d 20 2d 31 3b 0a 20 20 20 20      h = -1;.    
251b0 20 20 7d 0a 20 20 20 20 20 20 75 6e 69 78 4c 65    }.      unixLe
251c0 61 76 65 4d 75 74 65 78 28 29 3b 20 20 20 20 20  aveMutex();     
251d0 20 20 20 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65     .    }.  }.#e
251e0 6e 64 69 66 0a 0a 20 20 65 6c 73 65 20 69 66 28  ndif..  else if(
251f0 20 70 4c 6f 63 6b 69 6e 67 53 74 79 6c 65 20 3d   pLockingStyle =
25200 3d 20 26 64 6f 74 6c 6f 63 6b 49 6f 4d 65 74 68  = &dotlockIoMeth
25210 6f 64 73 20 29 7b 0a 20 20 20 20 2f 2a 20 44 6f  ods ){.    /* Do
25220 74 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 20 75 73  tfile locking us
25230 65 73 20 74 68 65 20 66 69 6c 65 20 70 61 74 68  es the file path
25240 20 73 6f 20 69 74 20 6e 65 65 64 73 20 74 6f 20   so it needs to 
25250 62 65 20 69 6e 63 6c 75 64 65 64 20 69 6e 0a 20  be included in. 
25260 20 20 20 2a 2a 20 74 68 65 20 64 6f 74 6c 6f 63     ** the dotloc
25270 6b 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20  kLockingContext 
25280 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 68 61 72  .    */.    char
25290 20 2a 7a 4c 6f 63 6b 46 69 6c 65 3b 0a 20 20 20   *zLockFile;.   
252a0 20 69 6e 74 20 6e 46 69 6c 65 6e 61 6d 65 3b 0a   int nFilename;.
252b0 20 20 20 20 6e 46 69 6c 65 6e 61 6d 65 20 3d 20      nFilename = 
252c0 28 69 6e 74 29 73 74 72 6c 65 6e 28 7a 46 69 6c  (int)strlen(zFil
252d0 65 6e 61 6d 65 29 20 2b 20 36 3b 0a 20 20 20 20  ename) + 6;.    
252e0 7a 4c 6f 63 6b 46 69 6c 65 20 3d 20 28 63 68 61  zLockFile = (cha
252f0 72 20 2a 29 73 71 6c 69 74 65 33 5f 6d 61 6c 6c  r *)sqlite3_mall
25300 6f 63 28 6e 46 69 6c 65 6e 61 6d 65 29 3b 0a 20  oc(nFilename);. 
25310 20 20 20 69 66 28 20 7a 4c 6f 63 6b 46 69 6c 65     if( zLockFile
25320 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20  ==0 ){.      rc 
25330 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  = SQLITE_NOMEM;.
25340 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
25350 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
25360 66 28 6e 46 69 6c 65 6e 61 6d 65 2c 20 7a 4c 6f  f(nFilename, zLo
25370 63 6b 46 69 6c 65 2c 20 22 25 73 22 20 44 4f 54  ckFile, "%s" DOT
25380 4c 4f 43 4b 5f 53 55 46 46 49 58 2c 20 7a 46 69  LOCK_SUFFIX, zFi
25390 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 20  lename);.    }. 
253a0 20 20 20 70 4e 65 77 2d 3e 6c 6f 63 6b 69 6e 67     pNew->locking
253b0 43 6f 6e 74 65 78 74 20 3d 20 7a 4c 6f 63 6b 46  Context = zLockF
253c0 69 6c 65 3b 0a 20 20 7d 0a 0a 23 69 66 20 4f 53  ile;.  }..#if OS
253d0 5f 56 58 57 4f 52 4b 53 0a 20 20 65 6c 73 65 20  _VXWORKS.  else 
253e0 69 66 28 20 70 4c 6f 63 6b 69 6e 67 53 74 79 6c  if( pLockingStyl
253f0 65 20 3d 3d 20 26 73 65 6d 49 6f 4d 65 74 68 6f  e == &semIoMetho
25400 64 73 20 29 7b 0a 20 20 20 20 2f 2a 20 4e 61 6d  ds ){.    /* Nam
25410 65 64 20 73 65 6d 61 70 68 6f 72 65 20 6c 6f 63  ed semaphore loc
25420 6b 69 6e 67 20 75 73 65 73 20 74 68 65 20 66 69  king uses the fi
25430 6c 65 20 70 61 74 68 20 73 6f 20 69 74 20 6e 65  le path so it ne
25440 65 64 73 20 74 6f 20 62 65 0a 20 20 20 20 2a 2a  eds to be.    **
25450 20 69 6e 63 6c 75 64 65 64 20 69 6e 20 74 68 65   included in the
25460 20 73 65 6d 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65   semLockingConte
25470 78 74 0a 20 20 20 20 2a 2f 0a 20 20 20 20 75 6e  xt.    */.    un
25480 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a  ixEnterMutex();.
25490 20 20 20 20 72 63 20 3d 20 66 69 6e 64 4c 6f 63      rc = findLoc
254a0 6b 49 6e 66 6f 28 70 4e 65 77 2c 20 26 70 4e 65  kInfo(pNew, &pNe
254b0 77 2d 3e 70 4c 6f 63 6b 2c 20 26 70 4e 65 77 2d  w->pLock, &pNew-
254c0 3e 70 4f 70 65 6e 29 3b 0a 20 20 20 20 69 66 28  >pOpen);.    if(
254d0 20 28 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 29   (rc==SQLITE_OK)
254e0 20 26 26 20 28 70 4e 65 77 2d 3e 70 4f 70 65 6e   && (pNew->pOpen
254f0 2d 3e 70 53 65 6d 3d 3d 4e 55 4c 4c 29 20 29 7b  ->pSem==NULL) ){
25500 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a 53 65  .      char *zSe
25510 6d 4e 61 6d 65 20 3d 20 70 4e 65 77 2d 3e 70 4f  mName = pNew->pO
25520 70 65 6e 2d 3e 61 53 65 6d 4e 61 6d 65 3b 0a 20  pen->aSemName;. 
25530 20 20 20 20 20 69 6e 74 20 6e 3b 0a 20 20 20 20       int n;.    
25540 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
25550 74 66 28 4d 41 58 5f 50 41 54 48 4e 41 4d 45 2c  tf(MAX_PATHNAME,
25560 20 7a 53 65 6d 4e 61 6d 65 2c 20 22 2f 25 73 2e   zSemName, "/%s.
25570 73 65 6d 22 2c 0a 20 20 20 20 20 20 20 20 20 20  sem",.          
25580 20 20 20 20 20 20 20 20 20 20 20 20 20 70 4e 65               pNe
25590 77 2d 3e 70 49 64 2d 3e 7a 43 61 6e 6f 6e 69 63  w->pId->zCanonic
255a0 61 6c 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 66  alName);.      f
255b0 6f 72 28 20 6e 3d 31 3b 20 7a 53 65 6d 4e 61 6d  or( n=1; zSemNam
255c0 65 5b 6e 5d 3b 20 6e 2b 2b 20 29 0a 20 20 20 20  e[n]; n++ ).    
255d0 20 20 20 20 69 66 28 20 7a 53 65 6d 4e 61 6d 65      if( zSemName
255e0 5b 6e 5d 3d 3d 27 2f 27 20 29 20 7a 53 65 6d 4e  [n]=='/' ) zSemN
255f0 61 6d 65 5b 6e 5d 20 3d 20 27 5f 27 3b 0a 20 20  ame[n] = '_';.  
25600 20 20 20 20 70 4e 65 77 2d 3e 70 4f 70 65 6e 2d      pNew->pOpen-
25610 3e 70 53 65 6d 20 3d 20 73 65 6d 5f 6f 70 65 6e  >pSem = sem_open
25620 28 7a 53 65 6d 4e 61 6d 65 2c 20 4f 5f 43 52 45  (zSemName, O_CRE
25630 41 54 2c 20 30 36 36 36 2c 20 31 29 3b 0a 20 20  AT, 0666, 1);.  
25640 20 20 20 20 69 66 28 20 70 4e 65 77 2d 3e 70 4f      if( pNew->pO
25650 70 65 6e 2d 3e 70 53 65 6d 20 3d 3d 20 53 45 4d  pen->pSem == SEM
25660 5f 46 41 49 4c 45 44 20 29 7b 0a 20 20 20 20 20  _FAILED ){.     
25670 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e     rc = SQLITE_N
25680 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 20 20 70 4e  OMEM;.        pN
25690 65 77 2d 3e 70 4f 70 65 6e 2d 3e 61 53 65 6d 4e  ew->pOpen->aSemN
256a0 61 6d 65 5b 30 5d 20 3d 20 27 5c 30 27 3b 0a 20  ame[0] = '\0';. 
256b0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
256c0 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28   unixLeaveMutex(
256d0 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  );.  }.#endif.  
256e0 0a 20 20 70 4e 65 77 2d 3e 6c 61 73 74 45 72 72  .  pNew->lastErr
256f0 6e 6f 20 3d 20 30 3b 0a 23 69 66 20 4f 53 5f 56  no = 0;.#if OS_V
25700 58 57 4f 52 4b 53 0a 20 20 69 66 28 20 72 63 21  XWORKS.  if( rc!
25710 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
25720 20 20 69 66 28 20 68 3e 3d 30 20 29 20 63 6c 6f    if( h>=0 ) clo
25730 73 65 28 68 29 3b 0a 20 20 20 20 68 20 3d 20 2d  se(h);.    h = -
25740 31 3b 0a 20 20 20 20 75 6e 6c 69 6e 6b 28 7a 46  1;.    unlink(zF
25750 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20 69 73  ilename);.    is
25760 44 65 6c 65 74 65 20 3d 20 30 3b 0a 20 20 7d 0a  Delete = 0;.  }.
25770 20 20 70 4e 65 77 2d 3e 69 73 44 65 6c 65 74 65    pNew->isDelete
25780 20 3d 20 69 73 44 65 6c 65 74 65 3b 0a 23 65 6e   = isDelete;.#en
25790 64 69 66 0a 20 20 69 66 28 20 72 63 21 3d 53 51  dif.  if( rc!=SQ
257a0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69  LITE_OK ){.    i
257b0 66 28 20 64 69 72 66 64 3e 3d 30 20 29 20 63 6c  f( dirfd>=0 ) cl
257c0 6f 73 65 28 64 69 72 66 64 29 3b 20 2f 2a 20 73  ose(dirfd); /* s
257d0 69 6c 65 6e 74 20 6c 65 61 6b 20 69 66 20 66 61  ilent leak if fa
257e0 69 6c 2c 20 61 6c 72 65 61 64 79 20 69 6e 20 65  il, already in e
257f0 72 72 6f 72 20 2a 2f 0a 20 20 20 20 69 66 28 20  rror */.    if( 
25800 68 3e 3d 30 20 29 20 63 6c 6f 73 65 28 68 29 3b  h>=0 ) close(h);
25810 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 4e  .  }else{.    pN
25820 65 77 2d 3e 70 4d 65 74 68 6f 64 20 3d 20 70 4c  ew->pMethod = pL
25830 6f 63 6b 69 6e 67 53 74 79 6c 65 3b 0a 20 20 20  ockingStyle;.   
25840 20 4f 70 65 6e 43 6f 75 6e 74 65 72 28 2b 31 29   OpenCounter(+1)
25850 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
25860 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e  c;.}../*.** Open
25870 20 61 20 66 69 6c 65 20 64 65 73 63 72 69 70 74   a file descript
25880 6f 72 20 74 6f 20 74 68 65 20 64 69 72 65 63 74  or to the direct
25890 6f 72 79 20 63 6f 6e 74 61 69 6e 69 6e 67 20 66  ory containing f
258a0 69 6c 65 20 7a 46 69 6c 65 6e 61 6d 65 2e 0a 2a  ile zFilename..*
258b0 2a 20 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c  * If successful,
258c0 20 2a 70 46 64 20 69 73 20 73 65 74 20 74 6f 20   *pFd is set to 
258d0 74 68 65 20 6f 70 65 6e 65 64 20 66 69 6c 65 20  the opened file 
258e0 64 65 73 63 72 69 70 74 6f 72 20 61 6e 64 0a 2a  descriptor and.*
258f0 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72  * SQLITE_OK is r
25900 65 74 75 72 6e 65 64 2e 20 49 66 20 61 6e 20 65  eturned. If an e
25910 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 65 69 74  rror occurs, eit
25920 68 65 72 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  her SQLITE_NOMEM
25930 0a 2a 2a 20 6f 72 20 53 51 4c 49 54 45 5f 43 41  .** or SQLITE_CA
25940 4e 54 4f 50 45 4e 20 69 73 20 72 65 74 75 72 6e  NTOPEN is return
25950 65 64 20 61 6e 64 20 2a 70 46 64 20 69 73 20 73  ed and *pFd is s
25960 65 74 20 74 6f 20 61 6e 20 75 6e 64 65 66 69 6e  et to an undefin
25970 65 64 0a 2a 2a 20 76 61 6c 75 65 2e 0a 2a 2a 0a  ed.** value..**.
25980 2a 2a 20 49 66 20 53 51 4c 49 54 45 5f 4f 4b 20  ** If SQLITE_OK 
25990 69 73 20 72 65 74 75 72 6e 65 64 2c 20 74 68 65  is returned, the
259a0 20 63 61 6c 6c 65 72 20 69 73 20 72 65 73 70 6f   caller is respo
259b0 6e 73 69 62 6c 65 20 66 6f 72 20 63 6c 6f 73 69  nsible for closi
259c0 6e 67 0a 2a 2a 20 74 68 65 20 66 69 6c 65 20 64  ng.** the file d
259d0 65 73 63 72 69 70 74 6f 72 20 2a 70 46 64 20 75  escriptor *pFd u
259e0 73 69 6e 67 20 63 6c 6f 73 65 28 29 2e 0a 2a 2f  sing close()..*/
259f0 0a 73 74 61 74 69 63 20 69 6e 74 20 6f 70 65 6e  .static int open
25a00 44 69 72 65 63 74 6f 72 79 28 63 6f 6e 73 74 20  Directory(const 
25a10 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c  char *zFilename,
25a20 20 69 6e 74 20 2a 70 46 64 29 7b 0a 20 20 69 6e   int *pFd){.  in
25a30 74 20 69 69 3b 0a 20 20 69 6e 74 20 66 64 20 3d  t ii;.  int fd =
25a40 20 2d 31 3b 0a 20 20 63 68 61 72 20 7a 44 69 72   -1;.  char zDir
25a50 6e 61 6d 65 5b 4d 41 58 5f 50 41 54 48 4e 41 4d  name[MAX_PATHNAM
25a60 45 2b 31 5d 3b 0a 0a 20 20 73 71 6c 69 74 65 33  E+1];..  sqlite3
25a70 5f 73 6e 70 72 69 6e 74 66 28 4d 41 58 5f 50 41  _snprintf(MAX_PA
25a80 54 48 4e 41 4d 45 2c 20 7a 44 69 72 6e 61 6d 65  THNAME, zDirname
25a90 2c 20 22 25 73 22 2c 20 7a 46 69 6c 65 6e 61 6d  , "%s", zFilenam
25aa0 65 29 3b 0a 20 20 66 6f 72 28 69 69 3d 28 69 6e  e);.  for(ii=(in
25ab0 74 29 73 74 72 6c 65 6e 28 7a 44 69 72 6e 61 6d  t)strlen(zDirnam
25ac0 65 29 3b 20 69 69 3e 31 20 26 26 20 7a 44 69 72  e); ii>1 && zDir
25ad0 6e 61 6d 65 5b 69 69 5d 21 3d 27 2f 27 3b 20 69  name[ii]!='/'; i
25ae0 69 2d 2d 29 3b 0a 20 20 69 66 28 20 69 69 3e 30  i--);.  if( ii>0
25af0 20 29 7b 0a 20 20 20 20 7a 44 69 72 6e 61 6d 65   ){.    zDirname
25b00 5b 69 69 5d 20 3d 20 27 5c 30 27 3b 0a 20 20 20  [ii] = '\0';.   
25b10 20 66 64 20 3d 20 6f 70 65 6e 28 7a 44 69 72 6e   fd = open(zDirn
25b20 61 6d 65 2c 20 4f 5f 52 44 4f 4e 4c 59 7c 4f 5f  ame, O_RDONLY|O_
25b30 42 49 4e 41 52 59 2c 20 30 29 3b 0a 20 20 20 20  BINARY, 0);.    
25b40 69 66 28 20 66 64 3e 3d 30 20 29 7b 0a 23 69 66  if( fd>=0 ){.#if
25b50 64 65 66 20 46 44 5f 43 4c 4f 45 58 45 43 0a 20  def FD_CLOEXEC. 
25b60 20 20 20 20 20 66 63 6e 74 6c 28 66 64 2c 20 46       fcntl(fd, F
25b70 5f 53 45 54 46 44 2c 20 66 63 6e 74 6c 28 66 64  _SETFD, fcntl(fd
25b80 2c 20 46 5f 47 45 54 46 44 2c 20 30 29 20 7c 20  , F_GETFD, 0) | 
25b90 46 44 5f 43 4c 4f 45 58 45 43 29 3b 0a 23 65 6e  FD_CLOEXEC);.#en
25ba0 64 69 66 0a 20 20 20 20 20 20 4f 53 54 52 41 43  dif.      OSTRAC
25bb0 45 33 28 22 4f 50 45 4e 44 49 52 20 25 2d 33 64  E3("OPENDIR %-3d
25bc0 20 25 73 5c 6e 22 2c 20 66 64 2c 20 7a 44 69 72   %s\n", fd, zDir
25bd0 6e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  name);.    }.  }
25be0 0a 20 20 2a 70 46 64 20 3d 20 66 64 3b 0a 20 20  .  *pFd = fd;.  
25bf0 72 65 74 75 72 6e 20 28 66 64 3e 3d 30 3f 53 51  return (fd>=0?SQ
25c00 4c 49 54 45 5f 4f 4b 3a 53 51 4c 49 54 45 5f 43  LITE_OK:SQLITE_C
25c10 41 4e 54 4f 50 45 4e 5f 42 4b 50 54 29 3b 0a 7d  ANTOPEN_BKPT);.}
25c20 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61  ../*.** Create a
25c30 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 20   temporary file 
25c40 6e 61 6d 65 20 69 6e 20 7a 42 75 66 2e 20 20 7a  name in zBuf.  z
25c50 42 75 66 20 6d 75 73 74 20 62 65 20 61 6c 6c 6f  Buf must be allo
25c60 63 61 74 65 64 0a 2a 2a 20 62 79 20 74 68 65 20  cated.** by the 
25c70 63 61 6c 6c 69 6e 67 20 70 72 6f 63 65 73 73 20  calling process 
25c80 61 6e 64 20 6d 75 73 74 20 62 65 20 62 69 67 20  and must be big 
25c90 65 6e 6f 75 67 68 20 74 6f 20 68 6f 6c 64 20 61  enough to hold a
25ca0 74 20 6c 65 61 73 74 0a 2a 2a 20 70 56 66 73 2d  t least.** pVfs-
25cb0 3e 6d 78 50 61 74 68 6e 61 6d 65 20 62 79 74 65  >mxPathname byte
25cc0 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  s..*/.static int
25cd0 20 67 65 74 54 65 6d 70 6e 61 6d 65 28 69 6e 74   getTempname(int
25ce0 20 6e 42 75 66 2c 20 63 68 61 72 20 2a 7a 42 75   nBuf, char *zBu
25cf0 66 29 7b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e  f){.  static con
25d00 73 74 20 63 68 61 72 20 2a 61 7a 44 69 72 73 5b  st char *azDirs[
25d10 5d 20 3d 20 7b 0a 20 20 20 20 20 30 2c 0a 20 20  ] = {.     0,.  
25d20 20 20 20 30 2c 0a 20 20 20 20 20 22 2f 76 61 72     0,.     "/var
25d30 2f 74 6d 70 22 2c 0a 20 20 20 20 20 22 2f 75 73  /tmp",.     "/us
25d40 72 2f 74 6d 70 22 2c 0a 20 20 20 20 20 22 2f 74  r/tmp",.     "/t
25d50 6d 70 22 2c 0a 20 20 20 20 20 22 2e 22 2c 0a 20  mp",.     ".",. 
25d60 20 7d 3b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e   };.  static con
25d70 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  st unsigned char
25d80 20 7a 43 68 61 72 73 5b 5d 20 3d 0a 20 20 20 20   zChars[] =.    
25d90 22 61 62 63 64 65 66 67 68 69 6a 6b 6c 6d 6e 6f  "abcdefghijklmno
25da0 70 71 72 73 74 75 76 77 78 79 7a 22 0a 20 20 20  pqrstuvwxyz".   
25db0 20 22 41 42 43 44 45 46 47 48 49 4a 4b 4c 4d 4e   "ABCDEFGHIJKLMN
25dc0 4f 50 51 52 53 54 55 56 57 58 59 5a 22 0a 20 20  OPQRSTUVWXYZ".  
25dd0 20 20 22 30 31 32 33 34 35 36 37 38 39 22 3b 0a    "0123456789";.
25de0 20 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 69    unsigned int i
25df0 2c 20 6a 3b 0a 20 20 73 74 72 75 63 74 20 73 74  , j;.  struct st
25e00 61 74 20 62 75 66 3b 0a 20 20 63 6f 6e 73 74 20  at buf;.  const 
25e10 63 68 61 72 20 2a 7a 44 69 72 20 3d 20 22 2e 22  char *zDir = "."
25e20 3b 0a 0a 20 20 2f 2a 20 49 74 27 73 20 6f 64 64  ;..  /* It's odd
25e30 20 74 6f 20 73 69 6d 75 6c 61 74 65 20 61 6e 20   to simulate an 
25e40 69 6f 2d 65 72 72 6f 72 20 68 65 72 65 2c 20 62  io-error here, b
25e50 75 74 20 72 65 61 6c 6c 79 20 74 68 69 73 20 69  ut really this i
25e60 73 20 6a 75 73 74 0a 20 20 2a 2a 20 75 73 69 6e  s just.  ** usin
25e70 67 20 74 68 65 20 69 6f 2d 65 72 72 6f 72 20 69  g the io-error i
25e80 6e 66 72 61 73 74 72 75 63 74 75 72 65 20 74 6f  nfrastructure to
25e90 20 74 65 73 74 20 74 68 61 74 20 53 51 4c 69 74   test that SQLit
25ea0 65 20 68 61 6e 64 6c 65 73 20 74 68 69 73 0a 20  e handles this. 
25eb0 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 66 61 69   ** function fai
25ec0 6c 69 6e 67 2e 20 0a 20 20 2a 2f 0a 20 20 53 69  ling. .  */.  Si
25ed0 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 72  mulateIOError( r
25ee0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45  eturn SQLITE_IOE
25ef0 52 52 20 29 3b 0a 0a 20 20 61 7a 44 69 72 73 5b  RR );..  azDirs[
25f00 30 5d 20 3d 20 73 71 6c 69 74 65 33 5f 74 65 6d  0] = sqlite3_tem
25f10 70 5f 64 69 72 65 63 74 6f 72 79 3b 0a 20 20 69  p_directory;.  i
25f20 66 20 28 4e 55 4c 4c 20 3d 3d 20 61 7a 44 69 72  f (NULL == azDir
25f30 73 5b 31 5d 29 20 7b 0a 20 20 20 20 61 7a 44 69  s[1]) {.    azDi
25f40 72 73 5b 31 5d 20 3d 20 67 65 74 65 6e 76 28 22  rs[1] = getenv("
25f50 54 4d 50 44 49 52 22 29 3b 0a 20 20 7d 0a 20 20  TMPDIR");.  }.  
25f60 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 69  .  for(i=0; i<si
25f70 7a 65 6f 66 28 61 7a 44 69 72 73 29 2f 73 69 7a  zeof(azDirs)/siz
25f80 65 6f 66 28 61 7a 44 69 72 73 5b 30 5d 29 3b 20  eof(azDirs[0]); 
25f90 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 61 7a  i++){.    if( az
25fa0 44 69 72 73 5b 69 5d 3d 3d 30 20 29 20 63 6f 6e  Dirs[i]==0 ) con
25fb0 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 73  tinue;.    if( s
25fc0 74 61 74 28 61 7a 44 69 72 73 5b 69 5d 2c 20 26  tat(azDirs[i], &
25fd0 62 75 66 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b  buf) ) continue;
25fe0 0a 20 20 20 20 69 66 28 20 21 53 5f 49 53 44 49  .    if( !S_ISDI
25ff0 52 28 62 75 66 2e 73 74 5f 6d 6f 64 65 29 20 29  R(buf.st_mode) )
26000 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69   continue;.    i
26010 66 28 20 61 63 63 65 73 73 28 61 7a 44 69 72 73  f( access(azDirs
26020 5b 69 5d 2c 20 30 37 29 20 29 20 63 6f 6e 74 69  [i], 07) ) conti
26030 6e 75 65 3b 0a 20 20 20 20 7a 44 69 72 20 3d 20  nue;.    zDir = 
26040 61 7a 44 69 72 73 5b 69 5d 3b 0a 20 20 20 20 62  azDirs[i];.    b
26050 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  reak;.  }..  /* 
26060 43 68 65 63 6b 20 74 68 61 74 20 74 68 65 20 6f  Check that the o
26070 75 74 70 75 74 20 62 75 66 66 65 72 20 69 73 20  utput buffer is 
26080 6c 61 72 67 65 20 65 6e 6f 75 67 68 20 66 6f 72  large enough for
26090 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20 66   the temporary f
260a0 69 6c 65 20 0a 20 20 2a 2a 20 6e 61 6d 65 2e 20  ile .  ** name. 
260b0 49 66 20 69 74 20 69 73 20 6e 6f 74 2c 20 72 65  If it is not, re
260c0 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f  turn SQLITE_ERRO
260d0 52 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 28 73  R..  */.  if( (s
260e0 74 72 6c 65 6e 28 7a 44 69 72 29 20 2b 20 73 74  trlen(zDir) + st
260f0 72 6c 65 6e 28 53 51 4c 49 54 45 5f 54 45 4d 50  rlen(SQLITE_TEMP
26100 5f 46 49 4c 45 5f 50 52 45 46 49 58 29 20 2b 20  _FILE_PREFIX) + 
26110 31 37 29 20 3e 3d 20 28 73 69 7a 65 5f 74 29 6e  17) >= (size_t)n
26120 42 75 66 20 29 7b 0a 20 20 20 20 72 65 74 75 72  Buf ){.    retur
26130 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  n SQLITE_ERROR;.
26140 20 20 7d 0a 0a 20 20 64 6f 7b 0a 20 20 20 20 73    }..  do{.    s
26150 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
26160 6e 42 75 66 2d 31 37 2c 20 7a 42 75 66 2c 20 22  nBuf-17, zBuf, "
26170 25 73 2f 22 53 51 4c 49 54 45 5f 54 45 4d 50 5f  %s/"SQLITE_TEMP_
26180 46 49 4c 45 5f 50 52 45 46 49 58 2c 20 7a 44 69  FILE_PREFIX, zDi
26190 72 29 3b 0a 20 20 20 20 6a 20 3d 20 28 69 6e 74  r);.    j = (int
261a0 29 73 74 72 6c 65 6e 28 7a 42 75 66 29 3b 0a 20  )strlen(zBuf);. 
261b0 20 20 20 73 71 6c 69 74 65 33 5f 72 61 6e 64 6f     sqlite3_rando
261c0 6d 6e 65 73 73 28 31 35 2c 20 26 7a 42 75 66 5b  mness(15, &zBuf[
261d0 6a 5d 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  j]);.    for(i=0
261e0 3b 20 69 3c 31 35 3b 20 69 2b 2b 2c 20 6a 2b 2b  ; i<15; i++, j++
261f0 29 7b 0a 20 20 20 20 20 20 7a 42 75 66 5b 6a 5d  ){.      zBuf[j]
26200 20 3d 20 28 63 68 61 72 29 7a 43 68 61 72 73 5b   = (char)zChars[
26210 20 28 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72   ((unsigned char
26220 29 7a 42 75 66 5b 6a 5d 29 25 28 73 69 7a 65 6f  )zBuf[j])%(sizeo
26230 66 28 7a 43 68 61 72 73 29 2d 31 29 20 5d 3b 0a  f(zChars)-1) ];.
26240 20 20 20 20 7d 0a 20 20 20 20 7a 42 75 66 5b 6a      }.    zBuf[j
26250 5d 20 3d 20 30 3b 0a 20 20 7d 77 68 69 6c 65 28  ] = 0;.  }while(
26260 20 61 63 63 65 73 73 28 7a 42 75 66 2c 30 29 3d   access(zBuf,0)=
26270 3d 30 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 53  =0 );.  return S
26280 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66  QLITE_OK;.}..#if
26290 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c   SQLITE_ENABLE_L
262a0 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 26 26 20  OCKING_STYLE && 
262b0 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f  defined(__APPLE_
262c0 5f 29 0a 2f 2a 0a 2a 2a 20 52 6f 75 74 69 6e 65  _)./*.** Routine
262d0 20 74 6f 20 74 72 61 6e 73 66 6f 72 6d 20 61 20   to transform a 
262e0 75 6e 69 78 46 69 6c 65 20 69 6e 74 6f 20 61 20  unixFile into a 
262f0 70 72 6f 78 79 2d 6c 6f 63 6b 69 6e 67 20 75 6e  proxy-locking un
26300 69 78 46 69 6c 65 2e 0a 2a 2a 20 49 6d 70 6c 65  ixFile..** Imple
26310 6d 65 6e 74 61 74 69 6f 6e 20 69 6e 20 74 68 65  mentation in the
26320 20 70 72 6f 78 79 2d 6c 6f 63 6b 20 64 69 76 69   proxy-lock divi
26330 73 69 6f 6e 2c 20 62 75 74 20 75 73 65 64 20 62  sion, but used b
26340 79 20 75 6e 69 78 4f 70 65 6e 28 29 0a 2a 2a 20  y unixOpen().** 
26350 69 66 20 53 51 4c 49 54 45 5f 50 52 45 46 45 52  if SQLITE_PREFER
26360 5f 50 52 4f 58 59 5f 4c 4f 43 4b 49 4e 47 20 69  _PROXY_LOCKING i
26370 73 20 64 65 66 69 6e 65 64 2e 0a 2a 2f 0a 73 74  s defined..*/.st
26380 61 74 69 63 20 69 6e 74 20 70 72 6f 78 79 54 72  atic int proxyTr
26390 61 6e 73 66 6f 72 6d 55 6e 69 78 46 69 6c 65 28  ansformUnixFile(
263a0 75 6e 69 78 46 69 6c 65 2a 2c 20 63 6f 6e 73 74  unixFile*, const
263b0 20 63 68 61 72 2a 29 3b 0a 23 65 6e 64 69 66 0a   char*);.#endif.
263c0 0a 2f 2a 0a 2a 2a 20 53 65 61 72 63 68 20 66 6f  ./*.** Search fo
263d0 72 20 61 6e 20 75 6e 75 73 65 64 20 66 69 6c 65  r an unused file
263e0 20 64 65 73 63 72 69 70 74 6f 72 20 74 68 61 74   descriptor that
263f0 20 77 61 73 20 6f 70 65 6e 65 64 20 6f 6e 20 74   was opened on t
26400 68 65 20 64 61 74 61 62 61 73 65 20 0a 2a 2a 20  he database .** 
26410 66 69 6c 65 20 28 6e 6f 74 20 61 20 6a 6f 75 72  file (not a jour
26420 6e 61 6c 20 6f 72 20 6d 61 73 74 65 72 2d 6a 6f  nal or master-jo
26430 75 72 6e 61 6c 20 66 69 6c 65 29 20 69 64 65 6e  urnal file) iden
26440 74 69 66 69 65 64 20 62 79 20 70 61 74 68 6e 61  tified by pathna
26450 6d 65 0a 2a 2a 20 7a 50 61 74 68 20 77 69 74 68  me.** zPath with
26460 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 58 58 58   SQLITE_OPEN_XXX
26470 20 66 6c 61 67 73 20 6d 61 74 63 68 69 6e 67 20   flags matching 
26480 74 68 6f 73 65 20 70 61 73 73 65 64 20 61 73 20  those passed as 
26490 74 68 65 20 73 65 63 6f 6e 64 0a 2a 2a 20 61 72  the second.** ar
264a0 67 75 6d 65 6e 74 20 74 6f 20 74 68 69 73 20 66  gument to this f
264b0 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 53  unction..**.** S
264c0 75 63 68 20 61 20 66 69 6c 65 20 64 65 73 63 72  uch a file descr
264d0 69 70 74 6f 72 20 6d 61 79 20 65 78 69 73 74 20  iptor may exist 
264e0 69 66 20 61 20 64 61 74 61 62 61 73 65 20 63 6f  if a database co
264f0 6e 6e 65 63 74 69 6f 6e 20 77 61 73 20 63 6c 6f  nnection was clo
26500 73 65 64 0a 2a 2a 20 62 75 74 20 74 68 65 20 61  sed.** but the a
26510 73 73 6f 63 69 61 74 65 64 20 66 69 6c 65 20 64  ssociated file d
26520 65 73 63 72 69 70 74 6f 72 20 63 6f 75 6c 64 20  escriptor could 
26530 6e 6f 74 20 62 65 20 63 6c 6f 73 65 64 20 62 65  not be closed be
26540 63 61 75 73 65 20 73 6f 6d 65 0a 2a 2a 20 6f 74  cause some.** ot
26550 68 65 72 20 66 69 6c 65 20 64 65 73 63 72 69 70  her file descrip
26560 74 6f 72 20 6f 70 65 6e 20 6f 6e 20 74 68 65 20  tor open on the 
26570 73 61 6d 65 20 66 69 6c 65 20 69 73 20 68 6f 6c  same file is hol
26580 64 69 6e 67 20 61 20 66 69 6c 65 2d 6c 6f 63 6b  ding a file-lock
26590 2e 0a 2a 2a 20 52 65 66 65 72 20 74 6f 20 63 6f  ..** Refer to co
265a0 6d 6d 65 6e 74 73 20 69 6e 20 74 68 65 20 75 6e  mments in the un
265b0 69 78 43 6c 6f 73 65 28 29 20 66 75 6e 63 74 69  ixClose() functi
265c0 6f 6e 20 61 6e 64 20 74 68 65 20 6c 65 6e 67 74  on and the lengt
265d0 68 79 20 63 6f 6d 6d 65 6e 74 0a 2a 2a 20 64 65  hy comment.** de
265e0 73 63 72 69 62 69 6e 67 20 22 50 6f 73 69 78 20  scribing "Posix 
265f0 41 64 76 69 73 6f 72 79 20 4c 6f 63 6b 69 6e 67  Advisory Locking
26600 22 20 61 74 20 74 68 65 20 73 74 61 72 74 20 6f  " at the start o
26610 66 20 74 68 69 73 20 66 69 6c 65 20 66 6f 72 20  f this file for 
26620 0a 2a 2a 20 66 75 72 74 68 65 72 20 64 65 74 61  .** further deta
26630 69 6c 73 2e 20 41 6c 73 6f 2c 20 74 69 63 6b 65  ils. Also, ticke
26640 74 20 23 34 30 31 38 2e 0a 2a 2a 0a 2a 2a 20 49  t #4018..**.** I
26650 66 20 61 20 73 75 69 74 61 62 6c 65 20 66 69 6c  f a suitable fil
26660 65 20 64 65 73 63 72 69 70 74 6f 72 20 69 73 20  e descriptor is 
26670 66 6f 75 6e 64 2c 20 74 68 65 6e 20 69 74 20 69  found, then it i
26680 73 20 72 65 74 75 72 6e 65 64 2e 20 49 66 20 6e  s returned. If n
26690 6f 0a 2a 2a 20 73 75 63 68 20 66 69 6c 65 20 64  o.** such file d
266a0 65 73 63 72 69 70 74 6f 72 20 69 73 20 6c 6f 63  escriptor is loc
266b0 61 74 65 64 2c 20 2d 31 20 69 73 20 72 65 74 75  ated, -1 is retu
266c0 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rned..*/.static 
266d0 55 6e 69 78 55 6e 75 73 65 64 46 64 20 2a 66 69  UnixUnusedFd *fi
266e0 6e 64 52 65 75 73 61 62 6c 65 46 64 28 63 6f 6e  ndReusableFd(con
266f0 73 74 20 63 68 61 72 20 2a 7a 50 61 74 68 2c 20  st char *zPath, 
26700 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20 20 55 6e  int flags){.  Un
26710 69 78 55 6e 75 73 65 64 46 64 20 2a 70 55 6e 75  ixUnusedFd *pUnu
26720 73 65 64 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 44  sed = 0;..  /* D
26730 6f 20 6e 6f 74 20 73 65 61 72 63 68 20 66 6f 72  o not search for
26740 20 61 6e 20 75 6e 75 73 65 64 20 66 69 6c 65 20   an unused file 
26750 64 65 73 63 72 69 70 74 6f 72 20 6f 6e 20 76 78  descriptor on vx
26760 77 6f 72 6b 73 2e 20 4e 6f 74 20 62 65 63 61 75  works. Not becau
26770 73 65 0a 20 20 2a 2a 20 76 78 77 6f 72 6b 73 20  se.  ** vxworks 
26780 77 6f 75 6c 64 20 6e 6f 74 20 62 65 6e 65 66 69  would not benefi
26790 74 20 66 72 6f 6d 20 74 68 65 20 63 68 61 6e 67  t from the chang
267a0 65 20 28 69 74 20 6d 69 67 68 74 2c 20 77 65 27  e (it might, we'
267b0 72 65 20 6e 6f 74 20 73 75 72 65 29 2c 0a 20 20  re not sure),.  
267c0 2a 2a 20 62 75 74 20 62 65 63 61 75 73 65 20 6e  ** but because n
267d0 6f 20 77 61 79 20 74 6f 20 74 65 73 74 20 69 74  o way to test it
267e0 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 61 76   is currently av
267f0 61 69 6c 61 62 6c 65 2e 20 49 74 20 69 73 20 62  ailable. It is b
26800 65 74 74 65 72 20 0a 20 20 2a 2a 20 6e 6f 74 20  etter .  ** not 
26810 74 6f 20 72 69 73 6b 20 62 72 65 61 6b 69 6e 67  to risk breaking
26820 20 76 78 77 6f 72 6b 73 20 73 75 70 70 6f 72 74   vxworks support
26830 20 66 6f 72 20 74 68 65 20 73 61 6b 65 20 6f 66   for the sake of
26840 20 73 75 63 68 20 61 6e 20 6f 62 73 63 75 72 65   such an obscure
26850 20 0a 20 20 2a 2a 20 66 65 61 74 75 72 65 2e 20   .  ** feature. 
26860 20 2a 2f 0a 23 69 66 20 21 4f 53 5f 56 58 57 4f   */.#if !OS_VXWO
26870 52 4b 53 0a 20 20 73 74 72 75 63 74 20 73 74 61  RKS.  struct sta
26880 74 20 73 53 74 61 74 3b 20 20 20 20 20 20 20 20  t sStat;        
26890 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
268a0 73 75 6c 74 73 20 6f 66 20 73 74 61 74 28 29 20  sults of stat() 
268b0 63 61 6c 6c 20 2a 2f 0a 0a 20 20 2f 2a 20 41 20  call */..  /* A 
268c0 73 74 61 74 28 29 20 63 61 6c 6c 20 6d 61 79 20  stat() call may 
268d0 66 61 69 6c 20 66 6f 72 20 76 61 72 69 6f 75 73  fail for various
268e0 20 72 65 61 73 6f 6e 73 2e 20 49 66 20 74 68 69   reasons. If thi
268f0 73 20 68 61 70 70 65 6e 73 2c 20 69 74 20 69 73  s happens, it is
26900 0a 20 20 2a 2a 20 61 6c 6d 6f 73 74 20 63 65 72  .  ** almost cer
26910 74 61 69 6e 20 74 68 61 74 20 61 6e 20 6f 70 65  tain that an ope
26920 6e 28 29 20 63 61 6c 6c 20 6f 6e 20 74 68 65 20  n() call on the 
26930 73 61 6d 65 20 70 61 74 68 20 77 69 6c 6c 20 61  same path will a
26940 6c 73 6f 20 66 61 69 6c 2e 0a 20 20 2a 2a 20 46  lso fail..  ** F
26950 6f 72 20 74 68 69 73 20 72 65 61 73 6f 6e 2c 20  or this reason, 
26960 69 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  if an error occu
26970 72 73 20 69 6e 20 74 68 65 20 73 74 61 74 28 29  rs in the stat()
26980 20 63 61 6c 6c 20 68 65 72 65 2c 20 69 74 20 69   call here, it i
26990 73 0a 20 20 2a 2a 20 69 67 6e 6f 72 65 64 20 61  s.  ** ignored a
269a0 6e 64 20 2d 31 20 69 73 20 72 65 74 75 72 6e 65  nd -1 is returne
269b0 64 2e 20 54 68 65 20 63 61 6c 6c 65 72 20 77 69  d. The caller wi
269c0 6c 6c 20 74 72 79 20 74 6f 20 6f 70 65 6e 20 61  ll try to open a
269d0 20 6e 65 77 20 66 69 6c 65 0a 20 20 2a 2a 20 64   new file.  ** d
269e0 65 73 63 72 69 70 74 6f 72 20 6f 6e 20 74 68 65  escriptor on the
269f0 20 73 61 6d 65 20 70 61 74 68 2c 20 66 61 69 6c   same path, fail
26a00 2c 20 61 6e 64 20 72 65 74 75 72 6e 20 61 6e 20  , and return an 
26a10 65 72 72 6f 72 20 74 6f 20 53 51 4c 69 74 65 2e  error to SQLite.
26a20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 45 76 65 6e 20  .  **.  ** Even 
26a30 69 66 20 61 20 73 75 62 73 65 71 75 65 6e 74 20  if a subsequent 
26a40 6f 70 65 6e 28 29 20 63 61 6c 6c 20 64 6f 65 73  open() call does
26a50 20 73 75 63 63 65 65 64 2c 20 74 68 65 20 63 6f   succeed, the co
26a60 6e 73 65 71 75 65 6e 63 65 73 20 6f 66 0a 20 20  nsequences of.  
26a70 2a 2a 20 6e 6f 74 20 73 65 61 72 63 68 69 6e 67  ** not searching
26a80 20 66 6f 72 20 61 20 72 65 73 75 73 61 62 6c 65   for a resusable
26a90 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
26aa0 20 61 72 65 20 6e 6f 74 20 64 69 72 65 2e 20 20   are not dire.  
26ab0 2a 2f 0a 20 20 69 66 28 20 30 3d 3d 73 74 61 74  */.  if( 0==stat
26ac0 28 7a 50 61 74 68 2c 20 26 73 53 74 61 74 29 20  (zPath, &sStat) 
26ad0 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 75 6e  ){.    struct un
26ae0 69 78 4f 70 65 6e 43 6e 74 20 2a 70 4f 70 65 6e  ixOpenCnt *pOpen
26af0 3b 0a 0a 20 20 20 20 75 6e 69 78 45 6e 74 65 72  ;..    unixEnter
26b00 4d 75 74 65 78 28 29 3b 0a 20 20 20 20 70 4f 70  Mutex();.    pOp
26b10 65 6e 20 3d 20 6f 70 65 6e 4c 69 73 74 3b 0a 20  en = openList;. 
26b20 20 20 20 77 68 69 6c 65 28 20 70 4f 70 65 6e 20     while( pOpen 
26b30 26 26 20 28 70 4f 70 65 6e 2d 3e 66 69 6c 65 49  && (pOpen->fileI
26b40 64 2e 64 65 76 21 3d 73 53 74 61 74 2e 73 74 5f  d.dev!=sStat.st_
26b50 64 65 76 0a 20 20 20 20 20 20 20 20 20 20 20 20  dev.            
26b60 20 20 20 20 20 20 20 20 20 7c 7c 20 70 4f 70 65           || pOpe
26b70 6e 2d 3e 66 69 6c 65 49 64 2e 69 6e 6f 21 3d 73  n->fileId.ino!=s
26b80 53 74 61 74 2e 73 74 5f 69 6e 6f 29 20 29 7b 0a  Stat.st_ino) ){.
26b90 20 20 20 20 20 20 20 70 4f 70 65 6e 20 3d 20 70         pOpen = p
26ba0 4f 70 65 6e 2d 3e 70 4e 65 78 74 3b 0a 20 20 20  Open->pNext;.   
26bb0 20 7d 0a 20 20 20 20 69 66 28 20 70 4f 70 65 6e   }.    if( pOpen
26bc0 20 29 7b 0a 20 20 20 20 20 20 55 6e 69 78 55 6e   ){.      UnixUn
26bd0 75 73 65 64 46 64 20 2a 2a 70 70 3b 0a 20 20 20  usedFd **pp;.   
26be0 20 20 20 66 6f 72 28 70 70 3d 26 70 4f 70 65 6e     for(pp=&pOpen
26bf0 2d 3e 70 55 6e 75 73 65 64 3b 20 2a 70 70 20 26  ->pUnused; *pp &
26c00 26 20 28 2a 70 70 29 2d 3e 66 6c 61 67 73 21 3d  & (*pp)->flags!=
26c10 66 6c 61 67 73 3b 20 70 70 3d 26 28 28 2a 70 70  flags; pp=&((*pp
26c20 29 2d 3e 70 4e 65 78 74 29 29 3b 0a 20 20 20 20  )->pNext));.    
26c30 20 20 70 55 6e 75 73 65 64 20 3d 20 2a 70 70 3b    pUnused = *pp;
26c40 0a 20 20 20 20 20 20 69 66 28 20 70 55 6e 75 73  .      if( pUnus
26c50 65 64 20 29 7b 0a 20 20 20 20 20 20 20 20 2a 70  ed ){.        *p
26c60 70 20 3d 20 70 55 6e 75 73 65 64 2d 3e 70 4e 65  p = pUnused->pNe
26c70 78 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  xt;.      }.    
26c80 7d 0a 20 20 20 20 75 6e 69 78 4c 65 61 76 65 4d  }.    unixLeaveM
26c90 75 74 65 78 28 29 3b 0a 20 20 7d 0a 23 65 6e 64  utex();.  }.#end
26ca0 69 66 20 20 20 20 2f 2a 20 69 66 20 21 4f 53 5f  if    /* if !OS_
26cb0 56 58 57 4f 52 4b 53 20 2a 2f 0a 20 20 72 65 74  VXWORKS */.  ret
26cc0 75 72 6e 20 70 55 6e 75 73 65 64 3b 0a 7d 0a 0a  urn pUnused;.}..
26cd0 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 74 68 65 20 66  /*.** Open the f
26ce0 69 6c 65 20 7a 50 61 74 68 2e 0a 2a 2a 20 0a 2a  ile zPath..** .*
26cf0 2a 20 50 72 65 76 69 6f 75 73 6c 79 2c 20 74 68  * Previously, th
26d00 65 20 53 51 4c 69 74 65 20 4f 53 20 6c 61 79 65  e SQLite OS laye
26d10 72 20 75 73 65 64 20 74 68 72 65 65 20 66 75 6e  r used three fun
26d20 63 74 69 6f 6e 73 20 69 6e 20 70 6c 61 63 65 20  ctions in place 
26d30 6f 66 20 74 68 69 73 0a 2a 2a 20 6f 6e 65 3a 0a  of this.** one:.
26d40 2a 2a 0a 2a 2a 20 20 20 20 20 73 71 6c 69 74 65  **.**     sqlite
26d50 33 4f 73 4f 70 65 6e 52 65 61 64 57 72 69 74 65  3OsOpenReadWrite
26d60 28 29 3b 0a 2a 2a 20 20 20 20 20 73 71 6c 69 74  ();.**     sqlit
26d70 65 33 4f 73 4f 70 65 6e 52 65 61 64 4f 6e 6c 79  e3OsOpenReadOnly
26d80 28 29 3b 0a 2a 2a 20 20 20 20 20 73 71 6c 69 74  ();.**     sqlit
26d90 65 33 4f 73 4f 70 65 6e 45 78 63 6c 75 73 69 76  e3OsOpenExclusiv
26da0 65 28 29 3b 0a 2a 2a 0a 2a 2a 20 54 68 65 73 65  e();.**.** These
26db0 20 63 61 6c 6c 73 20 63 6f 72 72 65 73 70 6f 6e   calls correspon
26dc0 64 20 74 6f 20 74 68 65 20 66 6f 6c 6c 6f 77 69  d to the followi
26dd0 6e 67 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 73 20  ng combinations 
26de0 6f 66 20 66 6c 61 67 73 3a 0a 2a 2a 0a 2a 2a 20  of flags:.**.** 
26df0 20 20 20 20 52 65 61 64 57 72 69 74 65 28 29 20      ReadWrite() 
26e00 2d 3e 20 20 20 20 20 28 52 45 41 44 57 52 49 54  ->     (READWRIT
26e10 45 20 7c 20 43 52 45 41 54 45 29 0a 2a 2a 20 20  E | CREATE).**  
26e20 20 20 20 52 65 61 64 4f 6e 6c 79 28 29 20 20 2d     ReadOnly()  -
26e30 3e 20 20 20 20 20 28 52 45 41 44 4f 4e 4c 59 29  >     (READONLY)
26e40 20 0a 2a 2a 20 20 20 20 20 4f 70 65 6e 45 78 63   .**     OpenExc
26e50 6c 75 73 69 76 65 28 29 20 2d 3e 20 28 52 45 41  lusive() -> (REA
26e60 44 57 52 49 54 45 20 7c 20 43 52 45 41 54 45 20  DWRITE | CREATE 
26e70 7c 20 45 58 43 4c 55 53 49 56 45 29 0a 2a 2a 0a  | EXCLUSIVE).**.
26e80 2a 2a 20 54 68 65 20 6f 6c 64 20 4f 70 65 6e 45  ** The old OpenE
26e90 78 63 6c 75 73 69 76 65 28 29 20 61 63 63 65 70  xclusive() accep
26ea0 74 65 64 20 61 20 62 6f 6f 6c 65 61 6e 20 61 72  ted a boolean ar
26eb0 67 75 6d 65 6e 74 20 2d 20 22 64 65 6c 46 6c 61  gument - "delFla
26ec0 67 22 2e 20 49 66 0a 2a 2a 20 74 72 75 65 2c 20  g". If.** true, 
26ed0 74 68 65 20 66 69 6c 65 20 77 61 73 20 63 6f 6e  the file was con
26ee0 66 69 67 75 72 65 64 20 74 6f 20 62 65 20 61 75  figured to be au
26ef0 74 6f 6d 61 74 69 63 61 6c 6c 79 20 64 65 6c 65  tomatically dele
26f00 74 65 64 20 77 68 65 6e 20 74 68 65 0a 2a 2a 20  ted when the.** 
26f10 66 69 6c 65 20 68 61 6e 64 6c 65 20 63 6c 6f 73  file handle clos
26f20 65 64 2e 20 54 6f 20 61 63 68 69 65 76 65 20 74  ed. To achieve t
26f30 68 65 20 73 61 6d 65 20 65 66 66 65 63 74 20 75  he same effect u
26f40 73 69 6e 67 20 74 68 69 73 20 6e 65 77 20 0a 2a  sing this new .*
26f50 2a 20 69 6e 74 65 72 66 61 63 65 2c 20 61 64 64  * interface, add
26f60 20 74 68 65 20 44 45 4c 45 54 45 4f 4e 43 4c 4f   the DELETEONCLO
26f70 53 45 20 66 6c 61 67 20 74 6f 20 74 68 6f 73 65  SE flag to those
26f80 20 73 70 65 63 69 66 69 65 64 20 61 62 6f 76 65   specified above
26f90 20 66 6f 72 20 0a 2a 2a 20 4f 70 65 6e 45 78 63   for .** OpenExc
26fa0 6c 75 73 69 76 65 28 29 2e 0a 2a 2f 0a 73 74 61  lusive()..*/.sta
26fb0 74 69 63 20 69 6e 74 20 75 6e 69 78 4f 70 65 6e  tic int unixOpen
26fc0 28 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20  (.  sqlite3_vfs 
26fd0 2a 70 56 66 73 2c 20 20 20 20 20 20 20 20 20 20  *pVfs,          
26fe0 20 2f 2a 20 54 68 65 20 56 46 53 20 66 6f 72 20   /* The VFS for 
26ff0 77 68 69 63 68 20 74 68 69 73 20 69 73 20 74 68  which this is th
27000 65 20 78 4f 70 65 6e 20 6d 65 74 68 6f 64 20 2a  e xOpen method *
27010 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
27020 7a 50 61 74 68 2c 20 20 20 20 20 20 20 20 20 20  zPath,          
27030 20 2f 2a 20 50 61 74 68 6e 61 6d 65 20 6f 66 20   /* Pathname of 
27040 66 69 6c 65 20 74 6f 20 62 65 20 6f 70 65 6e 65  file to be opene
27050 64 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66  d */.  sqlite3_f
27060 69 6c 65 20 2a 70 46 69 6c 65 2c 20 20 20 20 20  ile *pFile,     
27070 20 20 20 20 2f 2a 20 54 68 65 20 66 69 6c 65 20      /* The file 
27080 64 65 73 63 72 69 70 74 6f 72 20 74 6f 20 62 65  descriptor to be
27090 20 66 69 6c 6c 65 64 20 69 6e 20 2a 2f 0a 20 20   filled in */.  
270a0 69 6e 74 20 66 6c 61 67 73 2c 20 20 20 20 20 20  int flags,      
270b0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
270c0 49 6e 70 75 74 20 66 6c 61 67 73 20 74 6f 20 63  Input flags to c
270d0 6f 6e 74 72 6f 6c 20 74 68 65 20 6f 70 65 6e 69  ontrol the openi
270e0 6e 67 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 4f 75  ng */.  int *pOu
270f0 74 46 6c 61 67 73 20 20 20 20 20 20 20 20 20 20  tFlags          
27100 20 20 20 20 20 2f 2a 20 4f 75 74 70 75 74 20 66       /* Output f
27110 6c 61 67 73 20 72 65 74 75 72 6e 65 64 20 74 6f  lags returned to
27120 20 53 51 4c 69 74 65 20 63 6f 72 65 20 2a 2f 0a   SQLite core */.
27130 29 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70  ){.  unixFile *p
27140 20 3d 20 28 75 6e 69 78 46 69 6c 65 20 2a 29 70   = (unixFile *)p
27150 46 69 6c 65 3b 0a 20 20 69 6e 74 20 66 64 20 3d  File;.  int fd =
27160 20 2d 31 3b 20 20 20 20 20 20 20 20 20 20 20 20   -1;            
27170 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 65 20 64         /* File d
27180 65 73 63 72 69 70 74 6f 72 20 72 65 74 75 72 6e  escriptor return
27190 65 64 20 62 79 20 6f 70 65 6e 28 29 20 2a 2f 0a  ed by open() */.
271a0 20 20 69 6e 74 20 64 69 72 66 64 20 3d 20 2d 31    int dirfd = -1
271b0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
271c0 20 2f 2a 20 44 69 72 65 63 74 6f 72 79 20 66 69   /* Directory fi
271d0 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 2a 2f  le descriptor */
271e0 0a 20 20 69 6e 74 20 6f 70 65 6e 46 6c 61 67 73  .  int openFlags
271f0 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
27200 20 20 2f 2a 20 46 6c 61 67 73 20 74 6f 20 70 61    /* Flags to pa
27210 73 73 20 74 6f 20 6f 70 65 6e 28 29 20 2a 2f 0a  ss to open() */.
27220 20 20 69 6e 74 20 65 54 79 70 65 20 3d 20 66 6c    int eType = fl
27230 61 67 73 26 30 78 46 46 46 46 46 46 30 30 3b 20  ags&0xFFFFFF00; 
27240 20 2f 2a 20 54 79 70 65 20 6f 66 20 66 69 6c 65   /* Type of file
27250 20 74 6f 20 6f 70 65 6e 20 2a 2f 0a 20 20 69 6e   to open */.  in
27260 74 20 6e 6f 4c 6f 63 6b 3b 20 20 20 20 20 20 20  t noLock;       
27270 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
27280 54 72 75 65 20 74 6f 20 6f 6d 69 74 20 6c 6f 63  True to omit loc
27290 6b 69 6e 67 20 70 72 69 6d 69 74 69 76 65 73 20  king primitives 
272a0 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  */.  int rc = SQ
272b0 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20  LITE_OK;        
272c0 20 20 20 20 2f 2a 20 46 75 6e 63 74 69 6f 6e 20      /* Function 
272d0 52 65 74 75 72 6e 20 43 6f 64 65 20 2a 2f 0a 0a  Return Code */..
272e0 20 20 69 6e 74 20 69 73 45 78 63 6c 75 73 69 76    int isExclusiv
272f0 65 20 20 3d 20 28 66 6c 61 67 73 20 26 20 53 51  e  = (flags & SQ
27300 4c 49 54 45 5f 4f 50 45 4e 5f 45 58 43 4c 55 53  LITE_OPEN_EXCLUS
27310 49 56 45 29 3b 0a 20 20 69 6e 74 20 69 73 44 65  IVE);.  int isDe
27320 6c 65 74 65 20 20 20 20 20 3d 20 28 66 6c 61 67  lete     = (flag
27330 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  s & SQLITE_OPEN_
27340 44 45 4c 45 54 45 4f 4e 43 4c 4f 53 45 29 3b 0a  DELETEONCLOSE);.
27350 20 20 69 6e 74 20 69 73 43 72 65 61 74 65 20 20    int isCreate  
27360 20 20 20 3d 20 28 66 6c 61 67 73 20 26 20 53 51     = (flags & SQ
27370 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45  LITE_OPEN_CREATE
27380 29 3b 0a 20 20 69 6e 74 20 69 73 52 65 61 64 6f  );.  int isReado
27390 6e 6c 79 20 20 20 3d 20 28 66 6c 61 67 73 20 26  nly   = (flags &
273a0 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41   SQLITE_OPEN_REA
273b0 44 4f 4e 4c 59 29 3b 0a 20 20 69 6e 74 20 69 73  DONLY);.  int is
273c0 52 65 61 64 57 72 69 74 65 20 20 3d 20 28 66 6c  ReadWrite  = (fl
273d0 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45  ags & SQLITE_OPE
273e0 4e 5f 52 45 41 44 57 52 49 54 45 29 3b 0a 23 69  N_READWRITE);.#i
273f0 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
27400 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 20 20  LOCKING_STYLE.  
27410 69 6e 74 20 69 73 41 75 74 6f 50 72 6f 78 79 20  int isAutoProxy 
27420 20 3d 20 28 66 6c 61 67 73 20 26 20 53 51 4c 49   = (flags & SQLI
27430 54 45 5f 4f 50 45 4e 5f 41 55 54 4f 50 52 4f 58  TE_OPEN_AUTOPROX
27440 59 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a  Y);.#endif..  /*
27450 20 49 66 20 63 72 65 61 74 69 6e 67 20 61 20 6d   If creating a m
27460 61 73 74 65 72 20 6f 72 20 6d 61 69 6e 2d 66 69  aster or main-fi
27470 6c 65 20 6a 6f 75 72 6e 61 6c 2c 20 74 68 69 73  le journal, this
27480 20 66 75 6e 63 74 69 6f 6e 20 77 69 6c 6c 20 6f   function will o
27490 70 65 6e 0a 20 20 2a 2a 20 61 20 66 69 6c 65 2d  pen.  ** a file-
274a0 64 65 73 63 72 69 70 74 6f 72 20 6f 6e 20 74 68  descriptor on th
274b0 65 20 64 69 72 65 63 74 6f 72 79 20 74 6f 6f 2e  e directory too.
274c0 20 54 68 65 20 66 69 72 73 74 20 74 69 6d 65 20   The first time 
274d0 75 6e 69 78 53 79 6e 63 28 29 0a 20 20 2a 2a 20  unixSync().  ** 
274e0 69 73 20 63 61 6c 6c 65 64 20 74 68 65 20 64 69  is called the di
274f0 72 65 63 74 6f 72 79 20 66 69 6c 65 20 64 65 73  rectory file des
27500 63 72 69 70 74 6f 72 20 77 69 6c 6c 20 62 65 20  criptor will be 
27510 66 73 79 6e 63 28 29 65 64 20 61 6e 64 20 63 6c  fsync()ed and cl
27520 6f 73 65 28 29 64 2e 0a 20 20 2a 2f 0a 20 20 69  ose()d..  */.  i
27530 6e 74 20 69 73 4f 70 65 6e 44 69 72 65 63 74 6f  nt isOpenDirecto
27540 72 79 20 3d 20 28 69 73 43 72 65 61 74 65 20 26  ry = (isCreate &
27550 26 20 0a 20 20 20 20 20 20 28 65 54 79 70 65 3d  & .      (eType=
27560 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 53  =SQLITE_OPEN_MAS
27570 54 45 52 5f 4a 4f 55 52 4e 41 4c 20 7c 7c 20 65  TER_JOURNAL || e
27580 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45  Type==SQLITE_OPE
27590 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 29 0a  N_MAIN_JOURNAL).
275a0 20 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 61 72    );..  /* If ar
275b0 67 75 6d 65 6e 74 20 7a 50 61 74 68 20 69 73 20  gument zPath is 
275c0 61 20 4e 55 4c 4c 20 70 6f 69 6e 74 65 72 2c 20  a NULL pointer, 
275d0 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  this function is
275e0 20 72 65 71 75 69 72 65 64 20 74 6f 20 6f 70 65   required to ope
275f0 6e 0a 20 20 2a 2a 20 61 20 74 65 6d 70 6f 72 61  n.  ** a tempora
27600 72 79 20 66 69 6c 65 2e 20 55 73 65 20 74 68 69  ry file. Use thi
27610 73 20 62 75 66 66 65 72 20 74 6f 20 73 74 6f 72  s buffer to stor
27620 65 20 74 68 65 20 66 69 6c 65 20 6e 61 6d 65 20  e the file name 
27630 69 6e 2e 0a 20 20 2a 2f 0a 20 20 63 68 61 72 20  in..  */.  char 
27640 7a 54 6d 70 6e 61 6d 65 5b 4d 41 58 5f 50 41 54  zTmpname[MAX_PAT
27650 48 4e 41 4d 45 2b 31 5d 3b 0a 20 20 63 6f 6e 73  HNAME+1];.  cons
27660 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20  t char *zName = 
27670 7a 50 61 74 68 3b 0a 0a 20 20 2f 2a 20 43 68 65  zPath;..  /* Che
27680 63 6b 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ck the following
27690 20 73 74 61 74 65 6d 65 6e 74 73 20 61 72 65 20   statements are 
276a0 74 72 75 65 3a 20 0a 20 20 2a 2a 0a 20 20 2a 2a  true: .  **.  **
276b0 20 20 20 28 61 29 20 45 78 61 63 74 6c 79 20 6f     (a) Exactly o
276c0 6e 65 20 6f 66 20 74 68 65 20 52 45 41 44 57 52  ne of the READWR
276d0 49 54 45 20 61 6e 64 20 52 45 41 44 4f 4e 4c 59  ITE and READONLY
276e0 20 66 6c 61 67 73 20 6d 75 73 74 20 62 65 20 73   flags must be s
276f0 65 74 2c 20 61 6e 64 20 0a 20 20 2a 2a 20 20 20  et, and .  **   
27700 28 62 29 20 69 66 20 43 52 45 41 54 45 20 69 73  (b) if CREATE is
27710 20 73 65 74 2c 20 74 68 65 6e 20 52 45 41 44 57   set, then READW
27720 52 49 54 45 20 6d 75 73 74 20 61 6c 73 6f 20 62  RITE must also b
27730 65 20 73 65 74 2c 20 61 6e 64 0a 20 20 2a 2a 20  e set, and.  ** 
27740 20 20 28 63 29 20 69 66 20 45 58 43 4c 55 53 49    (c) if EXCLUSI
27750 56 45 20 69 73 20 73 65 74 2c 20 74 68 65 6e 20  VE is set, then 
27760 43 52 45 41 54 45 20 6d 75 73 74 20 61 6c 73 6f  CREATE must also
27770 20 62 65 20 73 65 74 2e 0a 20 20 2a 2a 20 20 20   be set..  **   
27780 28 64 29 20 69 66 20 44 45 4c 45 54 45 4f 4e 43  (d) if DELETEONC
27790 4c 4f 53 45 20 69 73 20 73 65 74 2c 20 74 68 65  LOSE is set, the
277a0 6e 20 43 52 45 41 54 45 20 6d 75 73 74 20 61 6c  n CREATE must al
277b0 73 6f 20 62 65 20 73 65 74 2e 0a 20 20 2a 2f 0a  so be set..  */.
277c0 20 20 61 73 73 65 72 74 28 28 69 73 52 65 61 64    assert((isRead
277d0 6f 6e 6c 79 3d 3d 30 20 7c 7c 20 69 73 52 65 61  only==0 || isRea
277e0 64 57 72 69 74 65 3d 3d 30 29 20 26 26 20 28 69  dWrite==0) && (i
277f0 73 52 65 61 64 57 72 69 74 65 20 7c 7c 20 69 73  sReadWrite || is
27800 52 65 61 64 6f 6e 6c 79 29 29 3b 0a 20 20 61 73  Readonly));.  as
27810 73 65 72 74 28 69 73 43 72 65 61 74 65 3d 3d 30  sert(isCreate==0
27820 20 7c 7c 20 69 73 52 65 61 64 57 72 69 74 65 29   || isReadWrite)
27830 3b 0a 20 20 61 73 73 65 72 74 28 69 73 45 78 63  ;.  assert(isExc
27840 6c 75 73 69 76 65 3d 3d 30 20 7c 7c 20 69 73 43  lusive==0 || isC
27850 72 65 61 74 65 29 3b 0a 20 20 61 73 73 65 72 74  reate);.  assert
27860 28 69 73 44 65 6c 65 74 65 3d 3d 30 20 7c 7c 20  (isDelete==0 || 
27870 69 73 43 72 65 61 74 65 29 3b 0a 0a 20 20 2f 2a  isCreate);..  /*
27880 20 54 68 65 20 6d 61 69 6e 20 44 42 2c 20 6d 61   The main DB, ma
27890 69 6e 20 6a 6f 75 72 6e 61 6c 2c 20 61 6e 64 20  in journal, and 
278a0 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 61  master journal a
278b0 72 65 20 6e 65 76 65 72 20 61 75 74 6f 6d 61 74  re never automat
278c0 69 63 61 6c 6c 79 0a 20 20 2a 2a 20 64 65 6c 65  ically.  ** dele
278d0 74 65 64 2e 20 4e 6f 72 20 61 72 65 20 74 68 65  ted. Nor are the
278e0 79 20 65 76 65 72 20 74 65 6d 70 6f 72 61 72 79  y ever temporary
278f0 20 66 69 6c 65 73 2e 20 20 2a 2f 0a 20 20 61 73   files.  */.  as
27900 73 65 72 74 28 20 28 21 69 73 44 65 6c 65 74 65  sert( (!isDelete
27910 20 26 26 20 7a 4e 61 6d 65 29 20 7c 7c 20 65 54   && zName) || eT
27920 79 70 65 21 3d 53 51 4c 49 54 45 5f 4f 50 45 4e  ype!=SQLITE_OPEN
27930 5f 4d 41 49 4e 5f 44 42 20 29 3b 0a 20 20 61 73  _MAIN_DB );.  as
27940 73 65 72 74 28 20 28 21 69 73 44 65 6c 65 74 65  sert( (!isDelete
27950 20 26 26 20 7a 4e 61 6d 65 29 20 7c 7c 20 65 54   && zName) || eT
27960 79 70 65 21 3d 53 51 4c 49 54 45 5f 4f 50 45 4e  ype!=SQLITE_OPEN
27970 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 20 29 3b  _MAIN_JOURNAL );
27980 0a 20 20 61 73 73 65 72 74 28 20 28 21 69 73 44  .  assert( (!isD
27990 65 6c 65 74 65 20 26 26 20 7a 4e 61 6d 65 29 20  elete && zName) 
279a0 7c 7c 20 65 54 79 70 65 21 3d 53 51 4c 49 54 45  || eType!=SQLITE
279b0 5f 4f 50 45 4e 5f 4d 41 53 54 45 52 5f 4a 4f 55  _OPEN_MASTER_JOU
279c0 52 4e 41 4c 20 29 3b 0a 0a 20 20 2f 2a 20 41 73  RNAL );..  /* As
279d0 73 65 72 74 20 74 68 61 74 20 74 68 65 20 75 70  sert that the up
279e0 70 65 72 20 6c 61 79 65 72 20 68 61 73 20 73 65  per layer has se
279f0 74 20 6f 6e 65 20 6f 66 20 74 68 65 20 22 66 69  t one of the "fi
27a00 6c 65 2d 74 79 70 65 22 20 66 6c 61 67 73 2e 20  le-type" flags. 
27a10 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 65 54 79  */.  assert( eTy
27a20 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  pe==SQLITE_OPEN_
27a30 4d 41 49 4e 5f 44 42 20 20 20 20 20 20 7c 7c 20  MAIN_DB      || 
27a40 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50  eType==SQLITE_OP
27a50 45 4e 5f 54 45 4d 50 5f 44 42 20 0a 20 20 20 20  EN_TEMP_DB .    
27a60 20 20 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c     || eType==SQL
27a70 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f  ITE_OPEN_MAIN_JO
27a80 55 52 4e 41 4c 20 7c 7c 20 65 54 79 70 65 3d 3d  URNAL || eType==
27a90 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 45 4d 50  SQLITE_OPEN_TEMP
27aa0 5f 4a 4f 55 52 4e 41 4c 20 0a 20 20 20 20 20 20  _JOURNAL .      
27ab0 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49 54   || eType==SQLIT
27ac0 45 5f 4f 50 45 4e 5f 53 55 42 4a 4f 55 52 4e 41  E_OPEN_SUBJOURNA
27ad0 4c 20 20 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51  L   || eType==SQ
27ae0 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 53 54 45 52  LITE_OPEN_MASTER
27af0 5f 4a 4f 55 52 4e 41 4c 20 0a 20 20 20 20 20 20  _JOURNAL .      
27b00 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49 54   || eType==SQLIT
27b10 45 5f 4f 50 45 4e 5f 54 52 41 4e 53 49 45 4e 54  E_OPEN_TRANSIENT
27b20 5f 44 42 0a 20 20 29 3b 0a 0a 20 20 6d 65 6d 73  _DB.  );..  mems
27b30 65 74 28 70 2c 20 30 2c 20 73 69 7a 65 6f 66 28  et(p, 0, sizeof(
27b40 75 6e 69 78 46 69 6c 65 29 29 3b 0a 0a 20 20 69  unixFile));..  i
27b50 66 28 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45  f( eType==SQLITE
27b60 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42 20 29 7b  _OPEN_MAIN_DB ){
27b70 0a 20 20 20 20 55 6e 69 78 55 6e 75 73 65 64 46  .    UnixUnusedF
27b80 64 20 2a 70 55 6e 75 73 65 64 3b 0a 20 20 20 20  d *pUnused;.    
27b90 70 55 6e 75 73 65 64 20 3d 20 66 69 6e 64 52 65  pUnused = findRe
27ba0 75 73 61 62 6c 65 46 64 28 7a 4e 61 6d 65 2c 20  usableFd(zName, 
27bb0 66 6c 61 67 73 29 3b 0a 20 20 20 20 69 66 28 20  flags);.    if( 
27bc0 70 55 6e 75 73 65 64 20 29 7b 0a 20 20 20 20 20  pUnused ){.     
27bd0 20 66 64 20 3d 20 70 55 6e 75 73 65 64 2d 3e 66   fd = pUnused->f
27be0 64 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  d;.    }else{.  
27bf0 20 20 20 20 70 55 6e 75 73 65 64 20 3d 20 73 71      pUnused = sq
27c00 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 73 69 7a  lite3_malloc(siz
27c10 65 6f 66 28 2a 70 55 6e 75 73 65 64 29 29 3b 0a  eof(*pUnused));.
27c20 20 20 20 20 20 20 69 66 28 20 21 70 55 6e 75 73        if( !pUnus
27c30 65 64 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65  ed ){.        re
27c40 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
27c50 4d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  M;.      }.    }
27c60 0a 20 20 20 20 70 2d 3e 70 55 6e 75 73 65 64 20  .    p->pUnused 
27c70 3d 20 70 55 6e 75 73 65 64 3b 0a 20 20 7d 65 6c  = pUnused;.  }el
27c80 73 65 20 69 66 28 20 21 7a 4e 61 6d 65 20 29 7b  se if( !zName ){
27c90 0a 20 20 20 20 2f 2a 20 49 66 20 7a 4e 61 6d 65  .    /* If zName
27ca0 20 69 73 20 4e 55 4c 4c 2c 20 74 68 65 20 75 70   is NULL, the up
27cb0 70 65 72 20 6c 61 79 65 72 20 69 73 20 72 65 71  per layer is req
27cc0 75 65 73 74 69 6e 67 20 61 20 74 65 6d 70 20 66  uesting a temp f
27cd0 69 6c 65 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65  ile. */.    asse
27ce0 72 74 28 69 73 44 65 6c 65 74 65 20 26 26 20 21  rt(isDelete && !
27cf0 69 73 4f 70 65 6e 44 69 72 65 63 74 6f 72 79 29  isOpenDirectory)
27d00 3b 0a 20 20 20 20 72 63 20 3d 20 67 65 74 54 65  ;.    rc = getTe
27d10 6d 70 6e 61 6d 65 28 4d 41 58 5f 50 41 54 48 4e  mpname(MAX_PATHN
27d20 41 4d 45 2b 31 2c 20 7a 54 6d 70 6e 61 6d 65 29  AME+1, zTmpname)
27d30 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
27d40 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
27d50 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
27d60 7d 0a 20 20 20 20 7a 4e 61 6d 65 20 3d 20 7a 54  }.    zName = zT
27d70 6d 70 6e 61 6d 65 3b 0a 20 20 7d 0a 0a 20 20 2f  mpname;.  }..  /
27d80 2a 20 44 65 74 65 72 6d 69 6e 65 20 74 68 65 20  * Determine the 
27d90 76 61 6c 75 65 20 6f 66 20 74 68 65 20 66 6c 61  value of the fla
27da0 67 73 20 70 61 72 61 6d 65 74 65 72 20 70 61 73  gs parameter pas
27db0 73 65 64 20 74 6f 20 50 4f 53 49 58 20 66 75 6e  sed to POSIX fun
27dc0 63 74 69 6f 6e 0a 20 20 2a 2a 20 6f 70 65 6e 28  ction.  ** open(
27dd0 29 2e 20 54 68 65 73 65 20 6d 75 73 74 20 62 65  ). These must be
27de0 20 63 61 6c 63 75 6c 61 74 65 64 20 65 76 65 6e   calculated even
27df0 20 69 66 20 6f 70 65 6e 28 29 20 69 73 20 6e 6f   if open() is no
27e00 74 20 63 61 6c 6c 65 64 2c 20 61 73 0a 20 20 2a  t called, as.  *
27e10 2a 20 74 68 65 79 20 6d 61 79 20 62 65 20 73 74  * they may be st
27e20 6f 72 65 64 20 61 73 20 70 61 72 74 20 6f 66 20  ored as part of 
27e30 74 68 65 20 66 69 6c 65 20 68 61 6e 64 6c 65 20  the file handle 
27e40 61 6e 64 20 75 73 65 64 20 62 79 20 74 68 65 20  and used by the 
27e50 0a 20 20 2a 2a 20 27 63 6f 6e 63 68 20 66 69 6c  .  ** 'conch fil
27e60 65 27 20 6c 6f 63 6b 69 6e 67 20 66 75 6e 63 74  e' locking funct
27e70 69 6f 6e 73 20 6c 61 74 65 72 20 6f 6e 2e 20 20  ions later on.  
27e80 2a 2f 0a 20 20 69 66 28 20 69 73 52 65 61 64 6f  */.  if( isReado
27e90 6e 6c 79 20 29 20 20 6f 70 65 6e 46 6c 61 67 73  nly )  openFlags
27ea0 20 7c 3d 20 4f 5f 52 44 4f 4e 4c 59 3b 0a 20 20   |= O_RDONLY;.  
27eb0 69 66 28 20 69 73 52 65 61 64 57 72 69 74 65 20  if( isReadWrite 
27ec0 29 20 6f 70 65 6e 46 6c 61 67 73 20 7c 3d 20 4f  ) openFlags |= O
27ed0 5f 52 44 57 52 3b 0a 20 20 69 66 28 20 69 73 43  _RDWR;.  if( isC
27ee0 72 65 61 74 65 20 29 20 20 20 20 6f 70 65 6e 46  reate )    openF
27ef0 6c 61 67 73 20 7c 3d 20 4f 5f 43 52 45 41 54 3b  lags |= O_CREAT;
27f00 0a 20 20 69 66 28 20 69 73 45 78 63 6c 75 73 69  .  if( isExclusi
27f10 76 65 20 29 20 6f 70 65 6e 46 6c 61 67 73 20 7c  ve ) openFlags |
27f20 3d 20 28 4f 5f 45 58 43 4c 7c 4f 5f 4e 4f 46 4f  = (O_EXCL|O_NOFO
27f30 4c 4c 4f 57 29 3b 0a 20 20 6f 70 65 6e 46 6c 61  LLOW);.  openFla
27f40 67 73 20 7c 3d 20 28 4f 5f 4c 41 52 47 45 46 49  gs |= (O_LARGEFI
27f50 4c 45 7c 4f 5f 42 49 4e 41 52 59 29 3b 0a 0a 20  LE|O_BINARY);.. 
27f60 20 69 66 28 20 66 64 3c 30 20 29 7b 0a 20 20 20   if( fd<0 ){.   
27f70 20 6d 6f 64 65 5f 74 20 6f 70 65 6e 4d 6f 64 65   mode_t openMode
27f80 20 3d 20 28 69 73 44 65 6c 65 74 65 3f 30 36 30   = (isDelete?060
27f90 30 3a 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54  0:SQLITE_DEFAULT
27fa0 5f 46 49 4c 45 5f 50 45 52 4d 49 53 53 49 4f 4e  _FILE_PERMISSION
27fb0 53 29 3b 0a 20 20 20 20 66 64 20 3d 20 6f 70 65  S);.    fd = ope
27fc0 6e 28 7a 4e 61 6d 65 2c 20 6f 70 65 6e 46 6c 61  n(zName, openFla
27fd0 67 73 2c 20 6f 70 65 6e 4d 6f 64 65 29 3b 0a 20  gs, openMode);. 
27fe0 20 20 20 4f 53 54 52 41 43 45 34 28 22 4f 50 45     OSTRACE4("OPE
27ff0 4e 58 20 20 20 25 2d 33 64 20 25 73 20 30 25 6f  NX   %-3d %s 0%o
28000 5c 6e 22 2c 20 66 64 2c 20 7a 4e 61 6d 65 2c 20  \n", fd, zName, 
28010 6f 70 65 6e 46 6c 61 67 73 29 3b 0a 20 20 20 20  openFlags);.    
28020 69 66 28 20 66 64 3c 30 20 26 26 20 65 72 72 6e  if( fd<0 && errn
28030 6f 21 3d 45 49 53 44 49 52 20 26 26 20 69 73 52  o!=EISDIR && isR
28040 65 61 64 57 72 69 74 65 20 26 26 20 21 69 73 45  eadWrite && !isE
28050 78 63 6c 75 73 69 76 65 20 29 7b 0a 20 20 20 20  xclusive ){.    
28060 20 20 2f 2a 20 46 61 69 6c 65 64 20 74 6f 20 6f    /* Failed to o
28070 70 65 6e 20 74 68 65 20 66 69 6c 65 20 66 6f 72  pen the file for
28080 20 72 65 61 64 2f 77 72 69 74 65 20 61 63 63 65   read/write acce
28090 73 73 2e 20 54 72 79 20 72 65 61 64 2d 6f 6e 6c  ss. Try read-onl
280a0 79 2e 20 2a 2f 0a 20 20 20 20 20 20 66 6c 61 67  y. */.      flag
280b0 73 20 26 3d 20 7e 28 53 51 4c 49 54 45 5f 4f 50  s &= ~(SQLITE_OP
280c0 45 4e 5f 52 45 41 44 57 52 49 54 45 7c 53 51 4c  EN_READWRITE|SQL
280d0 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 29  ITE_OPEN_CREATE)
280e0 3b 0a 20 20 20 20 20 20 6f 70 65 6e 46 6c 61 67  ;.      openFlag
280f0 73 20 26 3d 20 7e 28 4f 5f 52 44 57 52 7c 4f 5f  s &= ~(O_RDWR|O_
28100 43 52 45 41 54 29 3b 0a 20 20 20 20 20 20 66 6c  CREAT);.      fl
28110 61 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f 4f 50  ags |= SQLITE_OP
28120 45 4e 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 20  EN_READONLY;.   
28130 20 20 20 6f 70 65 6e 46 6c 61 67 73 20 7c 3d 20     openFlags |= 
28140 4f 5f 52 44 4f 4e 4c 59 3b 0a 20 20 20 20 20 20  O_RDONLY;.      
28150 66 64 20 3d 20 6f 70 65 6e 28 7a 4e 61 6d 65 2c  fd = open(zName,
28160 20 6f 70 65 6e 46 6c 61 67 73 2c 20 6f 70 65 6e   openFlags, open
28170 4d 6f 64 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20  Mode);.    }.   
28180 20 69 66 28 20 66 64 3c 30 20 29 7b 0a 20 20 20   if( fd<0 ){.   
28190 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43     rc = SQLITE_C
281a0 41 4e 54 4f 50 45 4e 5f 42 4b 50 54 3b 0a 20 20  ANTOPEN_BKPT;.  
281b0 20 20 20 20 67 6f 74 6f 20 6f 70 65 6e 5f 66 69      goto open_fi
281c0 6e 69 73 68 65 64 3b 0a 20 20 20 20 7d 0a 20 20  nished;.    }.  
281d0 7d 0a 20 20 61 73 73 65 72 74 28 20 66 64 3e 3d  }.  assert( fd>=
281e0 30 20 29 3b 0a 20 20 69 66 28 20 70 4f 75 74 46  0 );.  if( pOutF
281f0 6c 61 67 73 20 29 7b 0a 20 20 20 20 2a 70 4f 75  lags ){.    *pOu
28200 74 46 6c 61 67 73 20 3d 20 66 6c 61 67 73 3b 0a  tFlags = flags;.
28210 20 20 7d 0a 0a 20 20 69 66 28 20 70 2d 3e 70 55    }..  if( p->pU
28220 6e 75 73 65 64 20 29 7b 0a 20 20 20 20 70 2d 3e  nused ){.    p->
28230 70 55 6e 75 73 65 64 2d 3e 66 64 20 3d 20 66 64  pUnused->fd = fd
28240 3b 0a 20 20 20 20 70 2d 3e 70 55 6e 75 73 65 64  ;.    p->pUnused
28250 2d 3e 66 6c 61 67 73 20 3d 20 66 6c 61 67 73 3b  ->flags = flags;
28260 0a 20 20 7d 0a 0a 20 20 69 66 28 20 69 73 44 65  .  }..  if( isDe
28270 6c 65 74 65 20 29 7b 0a 23 69 66 20 4f 53 5f 56  lete ){.#if OS_V
28280 58 57 4f 52 4b 53 0a 20 20 20 20 7a 50 61 74 68  XWORKS.    zPath
28290 20 3d 20 7a 4e 61 6d 65 3b 0a 23 65 6c 73 65 0a   = zName;.#else.
282a0 20 20 20 20 75 6e 6c 69 6e 6b 28 7a 4e 61 6d 65      unlink(zName
282b0 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 23 69  );.#endif.  }.#i
282c0 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
282d0 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 20 20  LOCKING_STYLE.  
282e0 65 6c 73 65 7b 0a 20 20 20 20 70 2d 3e 6f 70 65  else{.    p->ope
282f0 6e 46 6c 61 67 73 20 3d 20 6f 70 65 6e 46 6c 61  nFlags = openFla
28300 67 73 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  gs;.  }.#endif..
28310 20 20 69 66 28 20 69 73 4f 70 65 6e 44 69 72 65    if( isOpenDire
28320 63 74 6f 72 79 20 29 7b 0a 20 20 20 20 72 63 20  ctory ){.    rc 
28330 3d 20 6f 70 65 6e 44 69 72 65 63 74 6f 72 79 28  = openDirectory(
28340 7a 50 61 74 68 2c 20 26 64 69 72 66 64 29 3b 0a  zPath, &dirfd);.
28350 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
28360 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 2f  TE_OK ){.      /
28370 2a 20 49 74 20 69 73 20 73 61 66 65 20 74 6f 20  * It is safe to 
28380 63 6c 6f 73 65 20 66 64 20 61 74 20 74 68 69 73  close fd at this
28390 20 70 6f 69 6e 74 2c 20 62 65 63 61 75 73 65 20   point, because 
283a0 69 74 20 69 73 20 67 75 61 72 61 6e 74 65 65 64  it is guaranteed
283b0 20 6e 6f 74 0a 20 20 20 20 20 20 2a 2a 20 74 6f   not.      ** to
283c0 20 62 65 20 6f 70 65 6e 20 6f 6e 20 61 20 64 61   be open on a da
283d0 74 61 62 61 73 65 20 66 69 6c 65 2e 20 49 66 20  tabase file. If 
283e0 69 74 20 77 65 72 65 20 6f 70 65 6e 20 6f 6e 20  it were open on 
283f0 61 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c  a database file,
28400 0a 20 20 20 20 20 20 2a 2a 20 69 74 20 77 6f 75  .      ** it wou
28410 6c 64 20 6e 6f 74 20 62 65 20 73 61 66 65 20 74  ld not be safe t
28420 6f 20 63 6c 6f 73 65 20 61 73 20 74 68 69 73 20  o close as this 
28430 77 6f 75 6c 64 20 72 65 6c 65 61 73 65 20 61 6e  would release an
28440 79 20 6c 6f 63 6b 73 20 68 65 6c 64 0a 20 20 20  y locks held.   
28450 20 20 20 2a 2a 20 6f 6e 20 74 68 65 20 66 69 6c     ** on the fil
28460 65 20 62 79 20 74 68 69 73 20 70 72 6f 63 65 73  e by this proces
28470 73 2e 20 20 2a 2f 0a 20 20 20 20 20 20 61 73 73  s.  */.      ass
28480 65 72 74 28 20 65 54 79 70 65 21 3d 53 51 4c 49  ert( eType!=SQLI
28490 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42 20  TE_OPEN_MAIN_DB 
284a0 29 3b 0a 20 20 20 20 20 20 63 6c 6f 73 65 28 66  );.      close(f
284b0 64 29 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  d);             
284c0 2f 2a 20 73 69 6c 65 6e 74 6c 79 20 6c 65 61 6b  /* silently leak
284d0 20 69 66 20 66 61 69 6c 2c 20 61 6c 72 65 61 64   if fail, alread
284e0 79 20 69 6e 20 65 72 72 6f 72 20 2a 2f 0a 20 20  y in error */.  
284f0 20 20 20 20 67 6f 74 6f 20 6f 70 65 6e 5f 66 69      goto open_fi
28500 6e 69 73 68 65 64 3b 0a 20 20 20 20 7d 0a 20 20  nished;.    }.  
28510 7d 0a 0a 23 69 66 64 65 66 20 46 44 5f 43 4c 4f  }..#ifdef FD_CLO
28520 45 58 45 43 0a 20 20 66 63 6e 74 6c 28 66 64 2c  EXEC.  fcntl(fd,
28530 20 46 5f 53 45 54 46 44 2c 20 66 63 6e 74 6c 28   F_SETFD, fcntl(
28540 66 64 2c 20 46 5f 47 45 54 46 44 2c 20 30 29 20  fd, F_GETFD, 0) 
28550 7c 20 46 44 5f 43 4c 4f 45 58 45 43 29 3b 0a 23  | FD_CLOEXEC);.#
28560 65 6e 64 69 66 0a 0a 20 20 6e 6f 4c 6f 63 6b 20  endif..  noLock 
28570 3d 20 65 54 79 70 65 21 3d 53 51 4c 49 54 45 5f  = eType!=SQLITE_
28580 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42 3b 0a 0a 20  OPEN_MAIN_DB;.. 
28590 20 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f 5f   .#if defined(__
285a0 41 50 50 4c 45 5f 5f 29 20 7c 7c 20 53 51 4c 49  APPLE__) || SQLI
285b0 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e  TE_ENABLE_LOCKIN
285c0 47 5f 53 54 59 4c 45 0a 20 20 73 74 72 75 63 74  G_STYLE.  struct
285d0 20 73 74 61 74 66 73 20 66 73 49 6e 66 6f 3b 0a   statfs fsInfo;.
285e0 20 20 69 66 28 20 66 73 74 61 74 66 73 28 66 64    if( fstatfs(fd
285f0 2c 20 26 66 73 49 6e 66 6f 29 20 3d 3d 20 2d 31  , &fsInfo) == -1
28600 20 29 7b 0a 20 20 20 20 28 28 75 6e 69 78 46 69   ){.    ((unixFi
28610 6c 65 2a 29 70 46 69 6c 65 29 2d 3e 6c 61 73 74  le*)pFile)->last
28620 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20  Errno = errno;. 
28630 20 20 20 69 66 28 20 64 69 72 66 64 3e 3d 30 20     if( dirfd>=0 
28640 29 20 63 6c 6f 73 65 28 64 69 72 66 64 29 3b 20  ) close(dirfd); 
28650 2f 2a 20 73 69 6c 65 6e 74 6c 79 20 6c 65 61 6b  /* silently leak
28660 20 69 66 20 66 61 69 6c 2c 20 69 6e 20 65 72 72   if fail, in err
28670 6f 72 20 2a 2f 0a 20 20 20 20 63 6c 6f 73 65 28  or */.    close(
28680 66 64 29 3b 20 2f 2a 20 73 69 6c 65 6e 74 6c 79  fd); /* silently
28690 20 6c 65 61 6b 20 69 66 20 66 61 69 6c 2c 20 69   leak if fail, i
286a0 6e 20 65 72 72 6f 72 20 2a 2f 0a 20 20 20 20 72  n error */.    r
286b0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45  eturn SQLITE_IOE
286c0 52 52 5f 41 43 43 45 53 53 3b 0a 20 20 7d 0a 20  RR_ACCESS;.  }. 
286d0 20 69 66 20 28 30 20 3d 3d 20 73 74 72 6e 63 6d   if (0 == strncm
286e0 70 28 22 6d 73 64 6f 73 22 2c 20 66 73 49 6e 66  p("msdos", fsInf
286f0 6f 2e 66 5f 66 73 74 79 70 65 6e 61 6d 65 2c 20  o.f_fstypename, 
28700 35 29 29 20 7b 0a 20 20 20 20 28 28 75 6e 69 78  5)) {.    ((unix
28710 46 69 6c 65 2a 29 70 46 69 6c 65 29 2d 3e 66 73  File*)pFile)->fs
28720 46 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f  Flags |= SQLITE_
28730 46 53 46 4c 41 47 53 5f 49 53 5f 4d 53 44 4f 53  FSFLAGS_IS_MSDOS
28740 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 0a  ;.  }.#endif.  .
28750 23 69 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  #if SQLITE_ENABL
28760 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a  E_LOCKING_STYLE.
28770 23 69 66 20 53 51 4c 49 54 45 5f 50 52 45 46 45  #if SQLITE_PREFE
28780 52 5f 50 52 4f 58 59 5f 4c 4f 43 4b 49 4e 47 0a  R_PROXY_LOCKING.
28790 20 20 69 73 41 75 74 6f 50 72 6f 78 79 20 3d 20    isAutoProxy = 
287a0 31 3b 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20  1;.#endif.  if( 
287b0 69 73 41 75 74 6f 50 72 6f 78 79 20 26 26 20 28  isAutoProxy && (
287c0 7a 50 61 74 68 21 3d 4e 55 4c 4c 29 20 26 26 20  zPath!=NULL) && 
287d0 28 21 6e 6f 4c 6f 63 6b 29 20 26 26 20 70 56 66  (!noLock) && pVf
287e0 73 2d 3e 78 4f 70 65 6e 20 29 7b 0a 20 20 20 20  s->xOpen ){.    
287f0 63 68 61 72 20 2a 65 6e 76 66 6f 72 63 65 20 3d  char *envforce =
28800 20 67 65 74 65 6e 76 28 22 53 51 4c 49 54 45 5f   getenv("SQLITE_
28810 46 4f 52 43 45 5f 50 52 4f 58 59 5f 4c 4f 43 4b  FORCE_PROXY_LOCK
28820 49 4e 47 22 29 3b 0a 20 20 20 20 69 6e 74 20 75  ING");.    int u
28830 73 65 50 72 6f 78 79 20 3d 20 30 3b 0a 0a 20 20  seProxy = 0;..  
28840 20 20 2f 2a 20 53 51 4c 49 54 45 5f 46 4f 52 43    /* SQLITE_FORC
28850 45 5f 50 52 4f 58 59 5f 4c 4f 43 4b 49 4e 47 3d  E_PROXY_LOCKING=
28860 3d 31 20 6d 65 61 6e 73 20 66 6f 72 63 65 20 61  =1 means force a
28870 6c 77 61 79 73 20 75 73 65 20 70 72 6f 78 79 2c  lways use proxy,
28880 20 30 20 6d 65 61 6e 73 20 0a 20 20 20 20 2a 2a   0 means .    **
28890 20 6e 65 76 65 72 20 75 73 65 20 70 72 6f 78 79   never use proxy
288a0 2c 20 4e 55 4c 4c 20 6d 65 61 6e 73 20 75 73 65  , NULL means use
288b0 20 70 72 6f 78 79 20 66 6f 72 20 6e 6f 6e 2d 6c   proxy for non-l
288c0 6f 63 61 6c 20 66 69 6c 65 73 20 6f 6e 6c 79 2e  ocal files only.
288d0 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 65 6e 76    */.    if( env
288e0 66 6f 72 63 65 21 3d 4e 55 4c 4c 20 29 7b 0a 20  force!=NULL ){. 
288f0 20 20 20 20 20 75 73 65 50 72 6f 78 79 20 3d 20       useProxy = 
28900 61 74 6f 69 28 65 6e 76 66 6f 72 63 65 29 3e 30  atoi(envforce)>0
28910 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
28920 20 20 20 73 74 72 75 63 74 20 73 74 61 74 66 73     struct statfs
28930 20 66 73 49 6e 66 6f 3b 0a 20 20 20 20 20 20 69   fsInfo;.      i
28940 66 28 20 73 74 61 74 66 73 28 7a 50 61 74 68 2c  f( statfs(zPath,
28950 20 26 66 73 49 6e 66 6f 29 20 3d 3d 20 2d 31 20   &fsInfo) == -1 
28960 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 6e  ){.        /* In
28970 20 74 68 65 6f 72 79 2c 20 74 68 65 20 63 6c 6f   theory, the clo
28980 73 65 28 66 64 29 20 63 61 6c 6c 20 69 73 20 73  se(fd) call is s
28990 75 62 2d 6f 70 74 69 6d 61 6c 2e 20 49 66 20 74  ub-optimal. If t
289a0 68 65 20 66 69 6c 65 20 6f 70 65 6e 65 64 0a 20  he file opened. 
289b0 20 20 20 20 20 20 20 2a 2a 20 77 69 74 68 20 66         ** with f
289c0 64 20 69 73 20 61 20 64 61 74 61 62 61 73 65 20  d is a database 
289d0 66 69 6c 65 2c 20 61 6e 64 20 74 68 65 72 65 20  file, and there 
289e0 61 72 65 20 6f 74 68 65 72 20 63 6f 6e 6e 65 63  are other connec
289f0 74 69 6f 6e 73 20 6f 70 65 6e 0a 20 20 20 20 20  tions open.     
28a00 20 20 20 2a 2a 20 6f 6e 20 74 68 61 74 20 66 69     ** on that fi
28a10 6c 65 20 74 68 61 74 20 61 72 65 20 63 75 72 72  le that are curr
28a20 65 6e 74 6c 79 20 68 6f 6c 64 69 6e 67 20 61 64  ently holding ad
28a30 76 69 73 6f 72 79 20 6c 6f 63 6b 73 20 6f 6e 20  visory locks on 
28a40 69 74 2c 0a 20 20 20 20 20 20 20 20 2a 2a 20 74  it,.        ** t
28a50 68 65 6e 20 74 68 65 20 63 61 6c 6c 20 74 6f 20  hen the call to 
28a60 63 6c 6f 73 65 28 29 20 77 69 6c 6c 20 63 61 6e  close() will can
28a70 63 65 6c 20 74 68 6f 73 65 20 6c 6f 63 6b 73 2e  cel those locks.
28a80 20 49 6e 20 70 72 61 63 74 69 63 65 2c 0a 20 20   In practice,.  
28a90 20 20 20 20 20 20 2a 2a 20 77 65 27 72 65 20 61        ** we're a
28aa0 73 73 75 6d 69 6e 67 20 74 68 61 74 20 73 74 61  ssuming that sta
28ab0 74 66 73 28 29 20 64 6f 65 73 6e 27 74 20 66 61  tfs() doesn't fa
28ac0 69 6c 20 76 65 72 79 20 6f 66 74 65 6e 2e 20 41  il very often. A
28ad0 74 20 6c 65 61 73 74 0a 20 20 20 20 20 20 20 20  t least.        
28ae0 2a 2a 20 6e 6f 74 20 77 68 69 6c 65 20 6f 74 68  ** not while oth
28af0 65 72 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  er file descript
28b00 6f 72 73 20 6f 70 65 6e 65 64 20 62 79 20 74 68  ors opened by th
28b10 65 20 73 61 6d 65 20 70 72 6f 63 65 73 73 20 6f  e same process o
28b20 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65  n.        ** the
28b30 20 73 61 6d 65 20 66 69 6c 65 20 61 72 65 20 77   same file are w
28b40 6f 72 6b 69 6e 67 2e 20 20 2a 2f 0a 20 20 20 20  orking.  */.    
28b50 20 20 20 20 70 2d 3e 6c 61 73 74 45 72 72 6e 6f      p->lastErrno
28b60 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20   = errno;.      
28b70 20 20 69 66 28 20 64 69 72 66 64 3e 3d 30 20 29    if( dirfd>=0 )
28b80 7b 0a 20 20 20 20 20 20 20 20 20 20 63 6c 6f 73  {.          clos
28b90 65 28 64 69 72 66 64 29 3b 20 2f 2a 20 73 69 6c  e(dirfd); /* sil
28ba0 65 6e 74 6c 79 20 6c 65 61 6b 20 69 66 20 66 61  ently leak if fa
28bb0 69 6c 2c 20 69 6e 20 65 72 72 6f 72 20 2a 2f 0a  il, in error */.
28bc0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
28bd0 20 20 63 6c 6f 73 65 28 66 64 29 3b 20 2f 2a 20    close(fd); /* 
28be0 73 69 6c 65 6e 74 6c 79 20 6c 65 61 6b 20 69 66  silently leak if
28bf0 20 66 61 69 6c 2c 20 69 6e 20 65 72 72 6f 72 20   fail, in error 
28c00 2a 2f 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  */.        rc = 
28c10 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 41 43 43  SQLITE_IOERR_ACC
28c20 45 53 53 3b 0a 20 20 20 20 20 20 20 20 67 6f 74  ESS;.        got
28c30 6f 20 6f 70 65 6e 5f 66 69 6e 69 73 68 65 64 3b  o open_finished;
28c40 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 75  .      }.      u
28c50 73 65 50 72 6f 78 79 20 3d 20 21 28 66 73 49 6e  seProxy = !(fsIn
28c60 66 6f 2e 66 5f 66 6c 61 67 73 26 4d 4e 54 5f 4c  fo.f_flags&MNT_L
28c70 4f 43 41 4c 29 3b 0a 20 20 20 20 7d 0a 20 20 20  OCAL);.    }.   
28c80 20 69 66 28 20 75 73 65 50 72 6f 78 79 20 29 7b   if( useProxy ){
28c90 0a 20 20 20 20 20 20 72 63 20 3d 20 66 69 6c 6c  .      rc = fill
28ca0 49 6e 55 6e 69 78 46 69 6c 65 28 70 56 66 73 2c  InUnixFile(pVfs,
28cb0 20 66 64 2c 20 64 69 72 66 64 2c 20 70 46 69 6c   fd, dirfd, pFil
28cc0 65 2c 20 7a 50 61 74 68 2c 20 6e 6f 4c 6f 63 6b  e, zPath, noLock
28cd0 2c 20 69 73 44 65 6c 65 74 65 29 3b 0a 20 20 20  , isDelete);.   
28ce0 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
28cf0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
28d00 72 63 20 3d 20 70 72 6f 78 79 54 72 61 6e 73 66  rc = proxyTransf
28d10 6f 72 6d 55 6e 69 78 46 69 6c 65 28 28 75 6e 69  ormUnixFile((uni
28d20 78 46 69 6c 65 2a 29 70 46 69 6c 65 2c 20 22 3a  xFile*)pFile, ":
28d30 61 75 74 6f 3a 22 29 3b 0a 20 20 20 20 20 20 20  auto:");.       
28d40 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
28d50 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
28d60 2f 2a 20 55 73 65 20 75 6e 69 78 43 6c 6f 73 65  /* Use unixClose
28d70 20 74 6f 20 63 6c 65 61 6e 20 75 70 20 74 68 65   to clean up the
28d80 20 72 65 73 6f 75 72 63 65 73 20 61 64 64 65 64   resources added
28d90 20 69 6e 20 66 69 6c 6c 49 6e 55 6e 69 78 46 69   in fillInUnixFi
28da0 6c 65 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  le .          **
28db0 20 61 6e 64 20 63 6c 65 61 72 20 61 6c 6c 20 74   and clear all t
28dc0 68 65 20 73 74 72 75 63 74 75 72 65 27 73 20 72  he structure's r
28dd0 65 66 65 72 65 6e 63 65 73 2e 20 20 53 70 65 63  eferences.  Spec
28de0 69 66 69 63 61 6c 6c 79 2c 20 0a 20 20 20 20 20  ifically, .     
28df0 20 20 20 20 20 2a 2a 20 70 46 69 6c 65 2d 3e 70       ** pFile->p
28e00 4d 65 74 68 6f 64 73 20 77 69 6c 6c 20 62 65 20  Methods will be 
28e10 4e 55 4c 4c 20 73 6f 20 73 71 6c 69 74 65 33 4f  NULL so sqlite3O
28e20 73 43 6c 6f 73 65 20 77 69 6c 6c 20 62 65 20 61  sClose will be a
28e30 20 6e 6f 2d 6f 70 20 0a 20 20 20 20 20 20 20 20   no-op .        
28e40 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 75    */.          u
28e50 6e 69 78 43 6c 6f 73 65 28 70 46 69 6c 65 29 3b  nixClose(pFile);
28e60 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72  .          retur
28e70 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a  n rc;.        }.
28e80 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 67 6f        }.      go
28e90 74 6f 20 6f 70 65 6e 5f 66 69 6e 69 73 68 65 64  to open_finished
28ea0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64  ;.    }.  }.#end
28eb0 69 66 0a 20 20 0a 20 20 72 63 20 3d 20 66 69 6c  if.  .  rc = fil
28ec0 6c 49 6e 55 6e 69 78 46 69 6c 65 28 70 56 66 73  lInUnixFile(pVfs
28ed0 2c 20 66 64 2c 20 64 69 72 66 64 2c 20 70 46 69  , fd, dirfd, pFi
28ee0 6c 65 2c 20 7a 50 61 74 68 2c 20 6e 6f 4c 6f 63  le, zPath, noLoc
28ef0 6b 2c 20 69 73 44 65 6c 65 74 65 29 3b 0a 6f 70  k, isDelete);.op
28f00 65 6e 5f 66 69 6e 69 73 68 65 64 3a 0a 20 20 69  en_finished:.  i
28f10 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
28f20 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
28f30 66 72 65 65 28 70 2d 3e 70 55 6e 75 73 65 64 29  free(p->pUnused)
28f40 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
28f50 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c  c;.}.../*.** Del
28f60 65 74 65 20 74 68 65 20 66 69 6c 65 20 61 74 20  ete the file at 
28f70 7a 50 61 74 68 2e 20 49 66 20 74 68 65 20 64 69  zPath. If the di
28f80 72 53 79 6e 63 20 61 72 67 75 6d 65 6e 74 20 69  rSync argument i
28f90 73 20 74 72 75 65 2c 20 66 73 79 6e 63 28 29 0a  s true, fsync().
28fa0 2a 2a 20 74 68 65 20 64 69 72 65 63 74 6f 72 79  ** the directory
28fb0 20 61 66 74 65 72 20 64 65 6c 65 74 69 6e 67 20   after deleting 
28fc0 74 68 65 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61  the file..*/.sta
28fd0 74 69 63 20 69 6e 74 20 75 6e 69 78 44 65 6c 65  tic int unixDele
28fe0 74 65 28 0a 20 20 73 71 6c 69 74 65 33 5f 76 66  te(.  sqlite3_vf
28ff0 73 20 2a 4e 6f 74 55 73 65 64 2c 20 20 20 20 20  s *NotUsed,     
29000 2f 2a 20 56 46 53 20 63 6f 6e 74 61 69 6e 69 6e  /* VFS containin
29010 67 20 74 68 69 73 20 61 73 20 74 68 65 20 78 44  g this as the xD
29020 65 6c 65 74 65 20 6d 65 74 68 6f 64 20 2a 2f 0a  elete method */.
29030 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50    const char *zP
29040 61 74 68 2c 20 20 20 20 20 20 20 20 2f 2a 20 4e  ath,        /* N
29050 61 6d 65 20 6f 66 20 66 69 6c 65 20 74 6f 20 62  ame of file to b
29060 65 20 64 65 6c 65 74 65 64 20 2a 2f 0a 20 20 69  e deleted */.  i
29070 6e 74 20 64 69 72 53 79 6e 63 20 20 20 20 20 20  nt dirSync      
29080 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74           /* If t
29090 72 75 65 2c 20 66 73 79 6e 63 28 29 20 64 69 72  rue, fsync() dir
290a0 65 63 74 6f 72 79 20 61 66 74 65 72 20 64 65 6c  ectory after del
290b0 65 74 69 6e 67 20 66 69 6c 65 20 2a 2f 0a 29 7b  eting file */.){
290c0 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
290d0 54 45 5f 4f 4b 3b 0a 20 20 55 4e 55 53 45 44 5f  TE_OK;.  UNUSED_
290e0 50 41 52 41 4d 45 54 45 52 28 4e 6f 74 55 73 65  PARAMETER(NotUse
290f0 64 29 3b 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f  d);.  SimulateIO
29100 45 72 72 6f 72 28 72 65 74 75 72 6e 20 53 51 4c  Error(return SQL
29110 49 54 45 5f 49 4f 45 52 52 5f 44 45 4c 45 54 45  ITE_IOERR_DELETE
29120 29 3b 0a 20 20 75 6e 6c 69 6e 6b 28 7a 50 61 74  );.  unlink(zPat
29130 68 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  h);.#ifndef SQLI
29140 54 45 5f 44 49 53 41 42 4c 45 5f 44 49 52 53 59  TE_DISABLE_DIRSY
29150 4e 43 0a 20 20 69 66 28 20 64 69 72 53 79 6e 63  NC.  if( dirSync
29160 20 29 7b 0a 20 20 20 20 69 6e 74 20 66 64 3b 0a   ){.    int fd;.
29170 20 20 20 20 72 63 20 3d 20 6f 70 65 6e 44 69 72      rc = openDir
29180 65 63 74 6f 72 79 28 7a 50 61 74 68 2c 20 26 66  ectory(zPath, &f
29190 64 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d  d);.    if( rc==
291a0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 23 69 66  SQLITE_OK ){.#if
291b0 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20 20 20   OS_VXWORKS.    
291c0 20 20 69 66 28 20 66 73 79 6e 63 28 66 64 29 3d    if( fsync(fd)=
291d0 3d 2d 31 20 29 0a 23 65 6c 73 65 0a 20 20 20 20  =-1 ).#else.    
291e0 20 20 69 66 28 20 66 73 79 6e 63 28 66 64 29 20    if( fsync(fd) 
291f0 29 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 7b  ).#endif.      {
29200 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51  .        rc = SQ
29210 4c 49 54 45 5f 49 4f 45 52 52 5f 44 49 52 5f 46  LITE_IOERR_DIR_F
29220 53 59 4e 43 3b 0a 20 20 20 20 20 20 7d 0a 20 20  SYNC;.      }.  
29230 20 20 20 20 69 66 28 20 63 6c 6f 73 65 28 66 64      if( close(fd
29240 29 26 26 21 72 63 20 29 7b 0a 20 20 20 20 20 20  )&&!rc ){.      
29250 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f    rc = SQLITE_IO
29260 45 52 52 5f 44 49 52 5f 43 4c 4f 53 45 3b 0a 20  ERR_DIR_CLOSE;. 
29270 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
29280 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e  .#endif.  return
29290 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 65   rc;.}../*.** Te
292a0 73 74 20 74 68 65 20 65 78 69 73 74 61 6e 63 65  st the existance
292b0 20 6f 66 20 6f 72 20 61 63 63 65 73 73 20 70 65   of or access pe
292c0 72 6d 69 73 73 69 6f 6e 73 20 6f 66 20 66 69 6c  rmissions of fil
292d0 65 20 7a 50 61 74 68 2e 20 54 68 65 0a 2a 2a 20  e zPath. The.** 
292e0 74 65 73 74 20 70 65 72 66 6f 72 6d 65 64 20 64  test performed d
292f0 65 70 65 6e 64 73 20 6f 6e 20 74 68 65 20 76 61  epends on the va
29300 6c 75 65 20 6f 66 20 66 6c 61 67 73 3a 0a 2a 2a  lue of flags:.**
29310 0a 2a 2a 20 20 20 20 20 53 51 4c 49 54 45 5f 41  .**     SQLITE_A
29320 43 43 45 53 53 5f 45 58 49 53 54 53 3a 20 52 65  CCESS_EXISTS: Re
29330 74 75 72 6e 20 31 20 69 66 20 74 68 65 20 66 69  turn 1 if the fi
29340 6c 65 20 65 78 69 73 74 73 0a 2a 2a 20 20 20 20  le exists.**    
29350 20 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 52   SQLITE_ACCESS_R
29360 45 41 44 57 52 49 54 45 3a 20 52 65 74 75 72 6e  EADWRITE: Return
29370 20 31 20 69 66 20 74 68 65 20 66 69 6c 65 20 69   1 if the file i
29380 73 20 72 65 61 64 20 61 6e 64 20 77 72 69 74 61  s read and writa
29390 62 6c 65 2e 0a 2a 2a 20 20 20 20 20 53 51 4c 49  ble..**     SQLI
293a0 54 45 5f 41 43 43 45 53 53 5f 52 45 41 44 4f 4e  TE_ACCESS_READON
293b0 4c 59 3a 20 52 65 74 75 72 6e 20 31 20 69 66 20  LY: Return 1 if 
293c0 74 68 65 20 66 69 6c 65 20 69 73 20 72 65 61 64  the file is read
293d0 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65  able..**.** Othe
293e0 72 77 69 73 65 20 72 65 74 75 72 6e 20 30 2e 0a  rwise return 0..
293f0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e  */.static int un
29400 69 78 41 63 63 65 73 73 28 0a 20 20 73 71 6c 69  ixAccess(.  sqli
29410 74 65 33 5f 76 66 73 20 2a 4e 6f 74 55 73 65 64  te3_vfs *NotUsed
29420 2c 20 20 20 2f 2a 20 54 68 65 20 56 46 53 20 63  ,   /* The VFS c
29430 6f 6e 74 61 69 6e 69 6e 67 20 74 68 69 73 20 78  ontaining this x
29440 41 63 63 65 73 73 20 6d 65 74 68 6f 64 20 2a 2f  Access method */
29450 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
29460 50 61 74 68 2c 20 20 20 20 20 20 2f 2a 20 50 61  Path,      /* Pa
29470 74 68 20 6f 66 20 74 68 65 20 66 69 6c 65 20 74  th of the file t
29480 6f 20 65 78 61 6d 69 6e 65 20 2a 2f 0a 20 20 69  o examine */.  i
29490 6e 74 20 66 6c 61 67 73 2c 20 20 20 20 20 20 20  nt flags,       
294a0 20 20 20 20 20 20 20 2f 2a 20 57 68 61 74 20 64         /* What d
294b0 6f 20 77 65 20 77 61 6e 74 20 74 6f 20 6c 65 61  o we want to lea
294c0 72 6e 20 61 62 6f 75 74 20 74 68 65 20 7a 50 61  rn about the zPa
294d0 74 68 20 66 69 6c 65 3f 20 2a 2f 0a 20 20 69 6e  th file? */.  in
294e0 74 20 2a 70 52 65 73 4f 75 74 20 20 20 20 20 20  t *pResOut      
294f0 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 72        /* Write r
29500 65 73 75 6c 74 20 62 6f 6f 6c 65 61 6e 20 68 65  esult boolean he
29510 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 61  re */.){.  int a
29520 6d 6f 64 65 20 3d 20 30 3b 0a 20 20 55 4e 55 53  mode = 0;.  UNUS
29530 45 44 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f 74  ED_PARAMETER(Not
29540 55 73 65 64 29 3b 0a 20 20 53 69 6d 75 6c 61 74  Used);.  Simulat
29550 65 49 4f 45 72 72 6f 72 28 20 72 65 74 75 72 6e  eIOError( return
29560 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 41 43   SQLITE_IOERR_AC
29570 43 45 53 53 3b 20 29 3b 0a 20 20 73 77 69 74 63  CESS; );.  switc
29580 68 28 20 66 6c 61 67 73 20 29 7b 0a 20 20 20 20  h( flags ){.    
29590 63 61 73 65 20 53 51 4c 49 54 45 5f 41 43 43 45  case SQLITE_ACCE
295a0 53 53 5f 45 58 49 53 54 53 3a 0a 20 20 20 20 20  SS_EXISTS:.     
295b0 20 61 6d 6f 64 65 20 3d 20 46 5f 4f 4b 3b 0a 20   amode = F_OK;. 
295c0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
295d0 63 61 73 65 20 53 51 4c 49 54 45 5f 41 43 43 45  case SQLITE_ACCE
295e0 53 53 5f 52 45 41 44 57 52 49 54 45 3a 0a 20 20  SS_READWRITE:.  
295f0 20 20 20 20 61 6d 6f 64 65 20 3d 20 57 5f 4f 4b      amode = W_OK
29600 7c 52 5f 4f 4b 3b 0a 20 20 20 20 20 20 62 72 65  |R_OK;.      bre
29610 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c  ak;.    case SQL
29620 49 54 45 5f 41 43 43 45 53 53 5f 52 45 41 44 3a  ITE_ACCESS_READ:
29630 0a 20 20 20 20 20 20 61 6d 6f 64 65 20 3d 20 52  .      amode = R
29640 5f 4f 4b 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  _OK;.      break
29650 3b 0a 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 0a  ;..    default:.
29660 20 20 20 20 20 20 61 73 73 65 72 74 28 21 22 49        assert(!"I
29670 6e 76 61 6c 69 64 20 66 6c 61 67 73 20 61 72 67  nvalid flags arg
29680 75 6d 65 6e 74 22 29 3b 0a 20 20 7d 0a 20 20 2a  ument");.  }.  *
29690 70 52 65 73 4f 75 74 20 3d 20 28 61 63 63 65 73  pResOut = (acces
296a0 73 28 7a 50 61 74 68 2c 20 61 6d 6f 64 65 29 3d  s(zPath, amode)=
296b0 3d 30 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  =0);.  return SQ
296c0 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a  LITE_OK;.}.../*.
296d0 2a 2a 20 54 75 72 6e 20 61 20 72 65 6c 61 74 69  ** Turn a relati
296e0 76 65 20 70 61 74 68 6e 61 6d 65 20 69 6e 74 6f  ve pathname into
296f0 20 61 20 66 75 6c 6c 20 70 61 74 68 6e 61 6d 65   a full pathname
29700 2e 20 54 68 65 20 72 65 6c 61 74 69 76 65 20 70  . The relative p
29710 61 74 68 0a 2a 2a 20 69 73 20 73 74 6f 72 65 64  ath.** is stored
29720 20 61 73 20 61 20 6e 75 6c 2d 74 65 72 6d 69 6e   as a nul-termin
29730 61 74 65 64 20 73 74 72 69 6e 67 20 69 6e 20 74  ated string in t
29740 68 65 20 62 75 66 66 65 72 20 70 6f 69 6e 74 65  he buffer pointe
29750 64 20 74 6f 20 62 79 0a 2a 2a 20 7a 50 61 74 68  d to by.** zPath
29760 2e 20 0a 2a 2a 0a 2a 2a 20 7a 4f 75 74 20 70 6f  . .**.** zOut po
29770 69 6e 74 73 20 74 6f 20 61 20 62 75 66 66 65 72  ints to a buffer
29780 20 6f 66 20 61 74 20 6c 65 61 73 74 20 73 71 6c   of at least sql
29790 69 74 65 33 5f 76 66 73 2e 6d 78 50 61 74 68 6e  ite3_vfs.mxPathn
297a0 61 6d 65 20 62 79 74 65 73 20 0a 2a 2a 20 28 69  ame bytes .** (i
297b0 6e 20 74 68 69 73 20 63 61 73 65 2c 20 4d 41 58  n this case, MAX
297c0 5f 50 41 54 48 4e 41 4d 45 20 62 79 74 65 73 29  _PATHNAME bytes)
297d0 2e 20 54 68 65 20 66 75 6c 6c 2d 70 61 74 68 20  . The full-path 
297e0 69 73 20 77 72 69 74 74 65 6e 20 74 6f 0a 2a 2a  is written to.**
297f0 20 74 68 69 73 20 62 75 66 66 65 72 20 62 65 66   this buffer bef
29800 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a  ore returning..*
29810 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69  /.static int uni
29820 78 46 75 6c 6c 50 61 74 68 6e 61 6d 65 28 0a 20  xFullPathname(. 
29830 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56   sqlite3_vfs *pV
29840 66 73 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f  fs,            /
29850 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 76 66 73  * Pointer to vfs
29860 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 63 6f 6e   object */.  con
29870 73 74 20 63 68 61 72 20 2a 7a 50 61 74 68 2c 20  st char *zPath, 
29880 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f             /* Po
29890 73 73 69 62 6c 79 20 72 65 6c 61 74 69 76 65 20  ssibly relative 
298a0 69 6e 70 75 74 20 70 61 74 68 20 2a 2f 0a 20 20  input path */.  
298b0 69 6e 74 20 6e 4f 75 74 2c 20 20 20 20 20 20 20  int nOut,       
298c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
298d0 20 53 69 7a 65 20 6f 66 20 6f 75 74 70 75 74 20   Size of output 
298e0 62 75 66 66 65 72 20 69 6e 20 62 79 74 65 73 20  buffer in bytes 
298f0 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4f 75 74 20  */.  char *zOut 
29900 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29910 20 20 20 2f 2a 20 4f 75 74 70 75 74 20 62 75 66     /* Output buf
29920 66 65 72 20 2a 2f 0a 29 7b 0a 0a 20 20 2f 2a 20  fer */.){..  /* 
29930 49 74 27 73 20 6f 64 64 20 74 6f 20 73 69 6d 75  It's odd to simu
29940 6c 61 74 65 20 61 6e 20 69 6f 2d 65 72 72 6f 72  late an io-error
29950 20 68 65 72 65 2c 20 62 75 74 20 72 65 61 6c 6c   here, but reall
29960 79 20 74 68 69 73 20 69 73 20 6a 75 73 74 0a 20  y this is just. 
29970 20 2a 2a 20 75 73 69 6e 67 20 74 68 65 20 69 6f   ** using the io
29980 2d 65 72 72 6f 72 20 69 6e 66 72 61 73 74 72 75  -error infrastru
29990 63 74 75 72 65 20 74 6f 20 74 65 73 74 20 74 68  cture to test th
299a0 61 74 20 53 51 4c 69 74 65 20 68 61 6e 64 6c 65  at SQLite handle
299b0 73 20 74 68 69 73 0a 20 20 2a 2a 20 66 75 6e 63  s this.  ** func
299c0 74 69 6f 6e 20 66 61 69 6c 69 6e 67 2e 20 54 68  tion failing. Th
299d0 69 73 20 66 75 6e 63 74 69 6f 6e 20 63 6f 75 6c  is function coul
299e0 64 20 66 61 69 6c 20 69 66 2c 20 66 6f 72 20 65  d fail if, for e
299f0 78 61 6d 70 6c 65 2c 20 74 68 65 0a 20 20 2a 2a  xample, the.  **
29a00 20 63 75 72 72 65 6e 74 20 77 6f 72 6b 69 6e 67   current working
29a10 20 64 69 72 65 63 74 6f 72 79 20 68 61 73 20 62   directory has b
29a20 65 65 6e 20 75 6e 6c 69 6e 6b 65 64 2e 0a 20 20  een unlinked..  
29a30 2a 2f 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45  */.  SimulateIOE
29a40 72 72 6f 72 28 20 72 65 74 75 72 6e 20 53 51 4c  rror( return SQL
29a50 49 54 45 5f 45 52 52 4f 52 20 29 3b 0a 0a 20 20  ITE_ERROR );..  
29a60 61 73 73 65 72 74 28 20 70 56 66 73 2d 3e 6d 78  assert( pVfs->mx
29a70 50 61 74 68 6e 61 6d 65 3d 3d 4d 41 58 5f 50 41  Pathname==MAX_PA
29a80 54 48 4e 41 4d 45 20 29 3b 0a 20 20 55 4e 55 53  THNAME );.  UNUS
29a90 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70 56 66  ED_PARAMETER(pVf
29aa0 73 29 3b 0a 0a 20 20 7a 4f 75 74 5b 6e 4f 75 74  s);..  zOut[nOut
29ab0 2d 31 5d 20 3d 20 27 5c 30 27 3b 0a 20 20 69 66  -1] = '\0';.  if
29ac0 28 20 7a 50 61 74 68 5b 30 5d 3d 3d 27 2f 27 20  ( zPath[0]=='/' 
29ad0 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73  ){.    sqlite3_s
29ae0 6e 70 72 69 6e 74 66 28 6e 4f 75 74 2c 20 7a 4f  nprintf(nOut, zO
29af0 75 74 2c 20 22 25 73 22 2c 20 7a 50 61 74 68 29  ut, "%s", zPath)
29b00 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69  ;.  }else{.    i
29b10 6e 74 20 6e 43 77 64 3b 0a 20 20 20 20 69 66 28  nt nCwd;.    if(
29b20 20 67 65 74 63 77 64 28 7a 4f 75 74 2c 20 6e 4f   getcwd(zOut, nO
29b30 75 74 2d 31 29 3d 3d 30 20 29 7b 0a 20 20 20 20  ut-1)==0 ){.    
29b40 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
29b50 43 41 4e 54 4f 50 45 4e 5f 42 4b 50 54 3b 0a 20  CANTOPEN_BKPT;. 
29b60 20 20 20 7d 0a 20 20 20 20 6e 43 77 64 20 3d 20     }.    nCwd = 
29b70 28 69 6e 74 29 73 74 72 6c 65 6e 28 7a 4f 75 74  (int)strlen(zOut
29b80 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73  );.    sqlite3_s
29b90 6e 70 72 69 6e 74 66 28 6e 4f 75 74 2d 6e 43 77  nprintf(nOut-nCw
29ba0 64 2c 20 26 7a 4f 75 74 5b 6e 43 77 64 5d 2c 20  d, &zOut[nCwd], 
29bb0 22 2f 25 73 22 2c 20 7a 50 61 74 68 29 3b 0a 20  "/%s", zPath);. 
29bc0 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49   }.  return SQLI
29bd0 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 23 69 66 6e 64  TE_OK;.}...#ifnd
29be0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c  ef SQLITE_OMIT_L
29bf0 4f 41 44 5f 45 58 54 45 4e 53 49 4f 4e 0a 2f 2a  OAD_EXTENSION./*
29c00 0a 2a 2a 20 49 6e 74 65 72 66 61 63 65 73 20 66  .** Interfaces f
29c10 6f 72 20 6f 70 65 6e 69 6e 67 20 61 20 73 68 61  or opening a sha
29c20 72 65 64 20 6c 69 62 72 61 72 79 2c 20 66 69 6e  red library, fin
29c30 64 69 6e 67 20 65 6e 74 72 79 20 70 6f 69 6e 74  ding entry point
29c40 73 0a 2a 2a 20 77 69 74 68 69 6e 20 74 68 65 20  s.** within the 
29c50 73 68 61 72 65 64 20 6c 69 62 72 61 72 79 2c 20  shared library, 
29c60 61 6e 64 20 63 6c 6f 73 69 6e 67 20 74 68 65 20  and closing the 
29c70 73 68 61 72 65 64 20 6c 69 62 72 61 72 79 2e 0a  shared library..
29c80 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 3c 64 6c 66  */.#include <dlf
29c90 63 6e 2e 68 3e 0a 73 74 61 74 69 63 20 76 6f 69  cn.h>.static voi
29ca0 64 20 2a 75 6e 69 78 44 6c 4f 70 65 6e 28 73 71  d *unixDlOpen(sq
29cb0 6c 69 74 65 33 5f 76 66 73 20 2a 4e 6f 74 55 73  lite3_vfs *NotUs
29cc0 65 64 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ed, const char *
29cd0 7a 46 69 6c 65 6e 61 6d 65 29 7b 0a 20 20 55 4e  zFilename){.  UN
29ce0 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 4e  USED_PARAMETER(N
29cf0 6f 74 55 73 65 64 29 3b 0a 20 20 72 65 74 75 72  otUsed);.  retur
29d00 6e 20 64 6c 6f 70 65 6e 28 7a 46 69 6c 65 6e 61  n dlopen(zFilena
29d10 6d 65 2c 20 52 54 4c 44 5f 4e 4f 57 20 7c 20 52  me, RTLD_NOW | R
29d20 54 4c 44 5f 47 4c 4f 42 41 4c 29 3b 0a 7d 0a 0a  TLD_GLOBAL);.}..
29d30 2f 2a 0a 2a 2a 20 53 51 4c 69 74 65 20 63 61 6c  /*.** SQLite cal
29d40 6c 73 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  ls this function
29d50 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 61 66 74   immediately aft
29d60 65 72 20 61 20 63 61 6c 6c 20 74 6f 20 75 6e 69  er a call to uni
29d70 78 44 6c 53 79 6d 28 29 20 6f 72 0a 2a 2a 20 75  xDlSym() or.** u
29d80 6e 69 78 44 6c 4f 70 65 6e 28 29 20 66 61 69 6c  nixDlOpen() fail
29d90 73 20 28 72 65 74 75 72 6e 73 20 61 20 6e 75 6c  s (returns a nul
29da0 6c 20 70 6f 69 6e 74 65 72 29 2e 20 49 66 20 61  l pointer). If a
29db0 20 6d 6f 72 65 20 64 65 74 61 69 6c 65 64 20 65   more detailed e
29dc0 72 72 6f 72 0a 2a 2a 20 6d 65 73 73 61 67 65 20  rror.** message 
29dd0 69 73 20 61 76 61 69 6c 61 62 6c 65 2c 20 69 74  is available, it
29de0 20 69 73 20 77 72 69 74 74 65 6e 20 74 6f 20 7a   is written to z
29df0 42 75 66 4f 75 74 2e 20 49 66 20 6e 6f 20 65 72  BufOut. If no er
29e00 72 6f 72 20 6d 65 73 73 61 67 65 0a 2a 2a 20 69  ror message.** i
29e10 73 20 61 76 61 69 6c 61 62 6c 65 2c 20 7a 42 75  s available, zBu
29e20 66 4f 75 74 20 69 73 20 6c 65 66 74 20 75 6e 6d  fOut is left unm
29e30 6f 64 69 66 69 65 64 20 61 6e 64 20 53 51 4c 69  odified and SQLi
29e40 74 65 20 75 73 65 73 20 61 20 64 65 66 61 75 6c  te uses a defaul
29e50 74 0a 2a 2a 20 65 72 72 6f 72 20 6d 65 73 73 61  t.** error messa
29e60 67 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ge..*/.static vo
29e70 69 64 20 75 6e 69 78 44 6c 45 72 72 6f 72 28 73  id unixDlError(s
29e80 71 6c 69 74 65 33 5f 76 66 73 20 2a 4e 6f 74 55  qlite3_vfs *NotU
29e90 73 65 64 2c 20 69 6e 74 20 6e 42 75 66 2c 20 63  sed, int nBuf, c
29ea0 68 61 72 20 2a 7a 42 75 66 4f 75 74 29 7b 0a 20  har *zBufOut){. 
29eb0 20 63 68 61 72 20 2a 7a 45 72 72 3b 0a 20 20 55   char *zErr;.  U
29ec0 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
29ed0 4e 6f 74 55 73 65 64 29 3b 0a 20 20 75 6e 69 78  NotUsed);.  unix
29ee0 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 20 20  EnterMutex();.  
29ef0 7a 45 72 72 20 3d 20 64 6c 65 72 72 6f 72 28 29  zErr = dlerror()
29f00 3b 0a 20 20 69 66 28 20 7a 45 72 72 20 29 7b 0a  ;.  if( zErr ){.
29f10 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
29f20 69 6e 74 66 28 6e 42 75 66 2c 20 7a 42 75 66 4f  intf(nBuf, zBufO
29f30 75 74 2c 20 22 25 73 22 2c 20 7a 45 72 72 29 3b  ut, "%s", zErr);
29f40 0a 20 20 7d 0a 20 20 75 6e 69 78 4c 65 61 76 65  .  }.  unixLeave
29f50 4d 75 74 65 78 28 29 3b 0a 7d 0a 73 74 61 74 69  Mutex();.}.stati
29f60 63 20 76 6f 69 64 20 28 2a 75 6e 69 78 44 6c 53  c void (*unixDlS
29f70 79 6d 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a  ym(sqlite3_vfs *
29f80 4e 6f 74 55 73 65 64 2c 20 76 6f 69 64 20 2a 70  NotUsed, void *p
29f90 2c 20 63 6f 6e 73 74 20 63 68 61 72 2a 7a 53 79  , const char*zSy
29fa0 6d 29 29 28 76 6f 69 64 29 7b 0a 20 20 2f 2a 20  m))(void){.  /* 
29fb0 0a 20 20 2a 2a 20 47 43 43 20 77 69 74 68 20 2d  .  ** GCC with -
29fc0 70 65 64 61 6e 74 69 63 2d 65 72 72 6f 72 73 20  pedantic-errors 
29fd0 73 61 79 73 20 74 68 61 74 20 43 39 30 20 64 6f  says that C90 do
29fe0 65 73 20 6e 6f 74 20 61 6c 6c 6f 77 20 61 20 76  es not allow a v
29ff0 6f 69 64 2a 20 74 6f 20 62 65 0a 20 20 2a 2a 20  oid* to be.  ** 
2a000 63 61 73 74 20 69 6e 74 6f 20 61 20 70 6f 69 6e  cast into a poin
2a010 74 65 72 20 74 6f 20 61 20 66 75 6e 63 74 69 6f  ter to a functio
2a020 6e 2e 20 20 41 6e 64 20 79 65 74 20 74 68 65 20  n.  And yet the 
2a030 6c 69 62 72 61 72 79 20 64 6c 73 79 6d 28 29 20  library dlsym() 
2a040 72 6f 75 74 69 6e 65 0a 20 20 2a 2a 20 72 65 74  routine.  ** ret
2a050 75 72 6e 73 20 61 20 76 6f 69 64 2a 20 77 68 69  urns a void* whi
2a060 63 68 20 69 73 20 72 65 61 6c 6c 79 20 61 20 70  ch is really a p
2a070 6f 69 6e 74 65 72 20 74 6f 20 61 20 66 75 6e 63  ointer to a func
2a080 74 69 6f 6e 2e 20 20 53 6f 20 68 6f 77 20 64 6f  tion.  So how do
2a090 20 77 65 0a 20 20 2a 2a 20 75 73 65 20 64 6c 73   we.  ** use dls
2a0a0 79 6d 28 29 20 77 69 74 68 20 2d 70 65 64 61 6e  ym() with -pedan
2a0b0 74 69 63 2d 65 72 72 6f 72 73 3f 0a 20 20 2a 2a  tic-errors?.  **
2a0c0 0a 20 20 2a 2a 20 56 61 72 69 61 62 6c 65 20 78  .  ** Variable x
2a0d0 20 62 65 6c 6f 77 20 69 73 20 64 65 66 69 6e 65   below is define
2a0e0 64 20 74 6f 20 62 65 20 61 20 70 6f 69 6e 74 65  d to be a pointe
2a0f0 72 20 74 6f 20 61 20 66 75 6e 63 74 69 6f 6e 20  r to a function 
2a100 74 61 6b 69 6e 67 0a 20 20 2a 2a 20 70 61 72 61  taking.  ** para
2a110 6d 65 74 65 72 73 20 76 6f 69 64 2a 20 61 6e 64  meters void* and
2a120 20 63 6f 6e 73 74 20 63 68 61 72 2a 20 61 6e 64   const char* and
2a130 20 72 65 74 75 72 6e 69 6e 67 20 61 20 70 6f 69   returning a poi
2a140 6e 74 65 72 20 74 6f 20 61 20 66 75 6e 63 74 69  nter to a functi
2a150 6f 6e 2e 0a 20 20 2a 2a 20 57 65 20 69 6e 69 74  on..  ** We init
2a160 69 61 6c 69 7a 65 20 78 20 62 79 20 61 73 73 69  ialize x by assi
2a170 67 6e 69 6e 67 20 69 74 20 61 20 70 6f 69 6e 74  gning it a point
2a180 65 72 20 74 6f 20 74 68 65 20 64 6c 73 79 6d 28  er to the dlsym(
2a190 29 20 66 75 6e 63 74 69 6f 6e 2e 0a 20 20 2a 2a  ) function..  **
2a1a0 20 28 54 68 61 74 20 61 73 73 69 67 6e 6d 65 6e   (That assignmen
2a1b0 74 20 72 65 71 75 69 72 65 73 20 61 20 63 61 73  t requires a cas
2a1c0 74 2e 29 20 20 54 68 65 6e 20 77 65 20 63 61 6c  t.)  Then we cal
2a1d0 6c 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 74  l the function t
2a1e0 68 61 74 0a 20 20 2a 2a 20 78 20 70 6f 69 6e 74  hat.  ** x point
2a1f0 73 20 74 6f 2e 20 20 0a 20 20 2a 2a 0a 20 20 2a  s to.  .  **.  *
2a200 2a 20 54 68 69 73 20 77 6f 72 6b 2d 61 72 6f 75  * This work-arou
2a210 6e 64 20 69 73 20 75 6e 6c 69 6b 65 6c 79 20 74  nd is unlikely t
2a220 6f 20 77 6f 72 6b 20 63 6f 72 72 65 63 74 6c 79  o work correctly
2a230 20 6f 6e 20 61 6e 79 20 73 79 73 74 65 6d 20 77   on any system w
2a240 68 65 72 65 0a 20 20 2a 2a 20 79 6f 75 20 72 65  here.  ** you re
2a250 61 6c 6c 79 20 63 61 6e 6e 6f 74 20 63 61 73 74  ally cannot cast
2a260 20 61 20 66 75 6e 63 74 69 6f 6e 20 70 6f 69 6e   a function poin
2a270 74 65 72 20 69 6e 74 6f 20 76 6f 69 64 2a 2e 20  ter into void*. 
2a280 20 42 75 74 20 74 68 65 6e 2c 20 6f 6e 20 74 68   But then, on th
2a290 65 0a 20 20 2a 2a 20 6f 74 68 65 72 20 68 61 6e  e.  ** other han
2a2a0 64 2c 20 64 6c 73 79 6d 28 29 20 77 69 6c 6c 20  d, dlsym() will 
2a2b0 6e 6f 74 20 77 6f 72 6b 20 6f 6e 20 73 75 63 68  not work on such
2a2c0 20 61 20 73 79 73 74 65 6d 20 65 69 74 68 65 72   a system either
2a2d0 2c 20 73 6f 20 77 65 20 68 61 76 65 0a 20 20 2a  , so we have.  *
2a2e0 2a 20 6e 6f 74 20 72 65 61 6c 6c 79 20 6c 6f 73  * not really los
2a2f0 74 20 61 6e 79 74 68 69 6e 67 2e 0a 20 20 2a 2f  t anything..  */
2a300 0a 20 20 76 6f 69 64 20 28 2a 28 2a 78 29 28 76  .  void (*(*x)(v
2a310 6f 69 64 2a 2c 63 6f 6e 73 74 20 63 68 61 72 2a  oid*,const char*
2a320 29 29 28 76 6f 69 64 29 3b 0a 20 20 55 4e 55 53  ))(void);.  UNUS
2a330 45 44 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f 74  ED_PARAMETER(Not
2a340 55 73 65 64 29 3b 0a 20 20 78 20 3d 20 28 76 6f  Used);.  x = (vo
2a350 69 64 28 2a 28 2a 29 28 76 6f 69 64 2a 2c 63 6f  id(*(*)(void*,co
2a360 6e 73 74 20 63 68 61 72 2a 29 29 28 76 6f 69 64  nst char*))(void
2a370 29 29 64 6c 73 79 6d 3b 0a 20 20 72 65 74 75 72  ))dlsym;.  retur
2a380 6e 20 28 2a 78 29 28 70 2c 20 7a 53 79 6d 29 3b  n (*x)(p, zSym);
2a390 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 75  .}.static void u
2a3a0 6e 69 78 44 6c 43 6c 6f 73 65 28 73 71 6c 69 74  nixDlClose(sqlit
2a3b0 65 33 5f 76 66 73 20 2a 4e 6f 74 55 73 65 64 2c  e3_vfs *NotUsed,
2a3c0 20 76 6f 69 64 20 2a 70 48 61 6e 64 6c 65 29 7b   void *pHandle){
2a3d0 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
2a3e0 54 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20  TER(NotUsed);.  
2a3f0 64 6c 63 6c 6f 73 65 28 70 48 61 6e 64 6c 65 29  dlclose(pHandle)
2a400 3b 0a 7d 0a 23 65 6c 73 65 20 2f 2a 20 69 66 20  ;.}.#else /* if 
2a410 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c 4f 41 44  SQLITE_OMIT_LOAD
2a420 5f 45 58 54 45 4e 53 49 4f 4e 20 69 73 20 64 65  _EXTENSION is de
2a430 66 69 6e 65 64 3a 20 2a 2f 0a 20 20 23 64 65 66  fined: */.  #def
2a440 69 6e 65 20 75 6e 69 78 44 6c 4f 70 65 6e 20 20  ine unixDlOpen  
2a450 30 0a 20 20 23 64 65 66 69 6e 65 20 75 6e 69 78  0.  #define unix
2a460 44 6c 45 72 72 6f 72 20 30 0a 20 20 23 64 65 66  DlError 0.  #def
2a470 69 6e 65 20 75 6e 69 78 44 6c 53 79 6d 20 20 20  ine unixDlSym   
2a480 30 0a 20 20 23 64 65 66 69 6e 65 20 75 6e 69 78  0.  #define unix
2a490 44 6c 43 6c 6f 73 65 20 30 0a 23 65 6e 64 69 66  DlClose 0.#endif
2a4a0 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 6e 42  ../*.** Write nB
2a4b0 75 66 20 62 79 74 65 73 20 6f 66 20 72 61 6e 64  uf bytes of rand
2a4c0 6f 6d 20 64 61 74 61 20 74 6f 20 74 68 65 20 73  om data to the s
2a4d0 75 70 70 6c 69 65 64 20 62 75 66 66 65 72 20 7a  upplied buffer z
2a4e0 42 75 66 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  Buf..*/.static i
2a4f0 6e 74 20 75 6e 69 78 52 61 6e 64 6f 6d 6e 65 73  nt unixRandomnes
2a500 73 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 4e  s(sqlite3_vfs *N
2a510 6f 74 55 73 65 64 2c 20 69 6e 74 20 6e 42 75 66  otUsed, int nBuf
2a520 2c 20 63 68 61 72 20 2a 7a 42 75 66 29 7b 0a 20  , char *zBuf){. 
2a530 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
2a540 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20 61 73  R(NotUsed);.  as
2a550 73 65 72 74 28 28 73 69 7a 65 5f 74 29 6e 42 75  sert((size_t)nBu
2a560 66 3e 3d 28 73 69 7a 65 6f 66 28 74 69 6d 65 5f  f>=(sizeof(time_
2a570 74 29 2b 73 69 7a 65 6f 66 28 69 6e 74 29 29 29  t)+sizeof(int)))
2a580 3b 0a 0a 20 20 2f 2a 20 57 65 20 68 61 76 65 20  ;..  /* We have 
2a590 74 6f 20 69 6e 69 74 69 61 6c 69 7a 65 20 7a 42  to initialize zB
2a5a0 75 66 20 74 6f 20 70 72 65 76 65 6e 74 20 76 61  uf to prevent va
2a5b0 6c 67 72 69 6e 64 20 66 72 6f 6d 20 72 65 70 6f  lgrind from repo
2a5c0 72 74 69 6e 67 0a 20 20 2a 2a 20 65 72 72 6f 72  rting.  ** error
2a5d0 73 2e 20 20 54 68 65 20 72 65 70 6f 72 74 73 20  s.  The reports 
2a5e0 69 73 73 75 65 64 20 62 79 20 76 61 6c 67 72 69  issued by valgri
2a5f0 6e 64 20 61 72 65 20 69 6e 63 6f 72 72 65 63 74  nd are incorrect
2a600 20 2d 20 77 65 20 77 6f 75 6c 64 0a 20 20 2a 2a   - we would.  **
2a610 20 70 72 65 66 65 72 20 74 68 61 74 20 74 68 65   prefer that the
2a620 20 72 61 6e 64 6f 6d 6e 65 73 73 20 62 65 20 69   randomness be i
2a630 6e 63 72 65 61 73 65 64 20 62 79 20 6d 61 6b 69  ncreased by maki
2a640 6e 67 20 75 73 65 20 6f 66 20 74 68 65 0a 20 20  ng use of the.  
2a650 2a 2a 20 75 6e 69 6e 69 74 69 61 6c 69 7a 65 64  ** uninitialized
2a660 20 73 70 61 63 65 20 69 6e 20 7a 42 75 66 20 2d   space in zBuf -
2a670 20 62 75 74 20 76 61 6c 67 72 69 6e 64 20 65 72   but valgrind er
2a680 72 6f 72 73 20 74 65 6e 64 20 74 6f 20 77 6f 72  rors tend to wor
2a690 72 79 0a 20 20 2a 2a 20 73 6f 6d 65 20 75 73 65  ry.  ** some use
2a6a0 72 73 2e 20 20 52 61 74 68 65 72 20 74 68 61 6e  rs.  Rather than
2a6b0 20 61 72 67 75 65 2c 20 69 74 20 73 65 65 6d 73   argue, it seems
2a6c0 20 65 61 73 69 65 72 20 6a 75 73 74 20 74 6f 20   easier just to 
2a6d0 69 6e 69 74 69 61 6c 69 7a 65 0a 20 20 2a 2a 20  initialize.  ** 
2a6e0 74 68 65 20 77 68 6f 6c 65 20 61 72 72 61 79 20  the whole array 
2a6f0 61 6e 64 20 73 69 6c 65 6e 63 65 20 76 61 6c 67  and silence valg
2a700 72 69 6e 64 2c 20 65 76 65 6e 20 69 66 20 74 68  rind, even if th
2a710 61 74 20 6d 65 61 6e 73 20 6c 65 73 73 20 72 61  at means less ra
2a720 6e 64 6f 6d 6e 65 73 73 0a 20 20 2a 2a 20 69 6e  ndomness.  ** in
2a730 20 74 68 65 20 72 61 6e 64 6f 6d 20 73 65 65 64   the random seed
2a740 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 57 68 65 6e  ..  **.  ** When
2a750 20 74 65 73 74 69 6e 67 2c 20 69 6e 69 74 69 61   testing, initia
2a760 6c 69 7a 69 6e 67 20 7a 42 75 66 5b 5d 20 74 6f  lizing zBuf[] to
2a770 20 7a 65 72 6f 20 69 73 20 61 6c 6c 20 77 65 20   zero is all we 
2a780 64 6f 2e 20 20 54 68 61 74 20 6d 65 61 6e 73 0a  do.  That means.
2a790 20 20 2a 2a 20 74 68 61 74 20 77 65 20 61 6c 77    ** that we alw
2a7a0 61 79 73 20 75 73 65 20 74 68 65 20 73 61 6d 65  ays use the same
2a7b0 20 72 61 6e 64 6f 6d 20 6e 75 6d 62 65 72 20 73   random number s
2a7c0 65 71 75 65 6e 63 65 2e 20 20 54 68 69 73 20 6d  equence.  This m
2a7d0 61 6b 65 73 20 74 68 65 0a 20 20 2a 2a 20 74 65  akes the.  ** te
2a7e0 73 74 73 20 72 65 70 65 61 74 61 62 6c 65 2e 0a  sts repeatable..
2a7f0 20 20 2a 2f 0a 20 20 6d 65 6d 73 65 74 28 7a 42    */.  memset(zB
2a800 75 66 2c 20 30 2c 20 6e 42 75 66 29 3b 0a 23 69  uf, 0, nBuf);.#i
2a810 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  f !defined(SQLIT
2a820 45 5f 54 45 53 54 29 0a 20 20 7b 0a 20 20 20 20  E_TEST).  {.    
2a830 69 6e 74 20 70 69 64 2c 20 66 64 3b 0a 20 20 20  int pid, fd;.   
2a840 20 66 64 20 3d 20 6f 70 65 6e 28 22 2f 64 65 76   fd = open("/dev
2a850 2f 75 72 61 6e 64 6f 6d 22 2c 20 4f 5f 52 44 4f  /urandom", O_RDO
2a860 4e 4c 59 29 3b 0a 20 20 20 20 69 66 28 20 66 64  NLY);.    if( fd
2a870 3c 30 20 29 7b 0a 20 20 20 20 20 20 74 69 6d 65  <0 ){.      time
2a880 5f 74 20 74 3b 0a 20 20 20 20 20 20 74 69 6d 65  _t t;.      time
2a890 28 26 74 29 3b 0a 20 20 20 20 20 20 6d 65 6d 63  (&t);.      memc
2a8a0 70 79 28 7a 42 75 66 2c 20 26 74 2c 20 73 69 7a  py(zBuf, &t, siz
2a8b0 65 6f 66 28 74 29 29 3b 0a 20 20 20 20 20 20 70  eof(t));.      p
2a8c0 69 64 20 3d 20 67 65 74 70 69 64 28 29 3b 0a 20  id = getpid();. 
2a8d0 20 20 20 20 20 6d 65 6d 63 70 79 28 26 7a 42 75       memcpy(&zBu
2a8e0 66 5b 73 69 7a 65 6f 66 28 74 29 5d 2c 20 26 70  f[sizeof(t)], &p
2a8f0 69 64 2c 20 73 69 7a 65 6f 66 28 70 69 64 29 29  id, sizeof(pid))
2a900 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
2a910 73 69 7a 65 6f 66 28 74 29 2b 73 69 7a 65 6f 66  sizeof(t)+sizeof
2a920 28 70 69 64 29 3c 3d 28 73 69 7a 65 5f 74 29 6e  (pid)<=(size_t)n
2a930 42 75 66 20 29 3b 0a 20 20 20 20 20 20 6e 42 75  Buf );.      nBu
2a940 66 20 3d 20 73 69 7a 65 6f 66 28 74 29 20 2b 20  f = sizeof(t) + 
2a950 73 69 7a 65 6f 66 28 70 69 64 29 3b 0a 20 20 20  sizeof(pid);.   
2a960 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6e 42   }else{.      nB
2a970 75 66 20 3d 20 72 65 61 64 28 66 64 2c 20 7a 42  uf = read(fd, zB
2a980 75 66 2c 20 6e 42 75 66 29 3b 0a 20 20 20 20 20  uf, nBuf);.     
2a990 20 63 6c 6f 73 65 28 66 64 29 3b 0a 20 20 20 20   close(fd);.    
2a9a0 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 72  }.  }.#endif.  r
2a9b0 65 74 75 72 6e 20 6e 42 75 66 3b 0a 7d 0a 0a 0a  eturn nBuf;.}...
2a9c0 2f 2a 0a 2a 2a 20 53 6c 65 65 70 20 66 6f 72 20  /*.** Sleep for 
2a9d0 61 20 6c 69 74 74 6c 65 20 77 68 69 6c 65 2e 20  a little while. 
2a9e0 20 52 65 74 75 72 6e 20 74 68 65 20 61 6d 6f 75   Return the amou
2a9f0 6e 74 20 6f 66 20 74 69 6d 65 20 73 6c 65 70 74  nt of time slept
2aa00 2e 0a 2a 2a 20 54 68 65 20 61 72 67 75 6d 65 6e  ..** The argumen
2aa10 74 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20  t is the number 
2aa20 6f 66 20 6d 69 63 72 6f 73 65 63 6f 6e 64 73 20  of microseconds 
2aa30 77 65 20 77 61 6e 74 20 74 6f 20 73 6c 65 65 70  we want to sleep
2aa40 2e 0a 2a 2a 20 54 68 65 20 72 65 74 75 72 6e 20  ..** The return 
2aa50 76 61 6c 75 65 20 69 73 20 74 68 65 20 6e 75 6d  value is the num
2aa60 62 65 72 20 6f 66 20 6d 69 63 72 6f 73 65 63 6f  ber of microseco
2aa70 6e 64 73 20 6f 66 20 73 6c 65 65 70 20 61 63 74  nds of sleep act
2aa80 75 61 6c 6c 79 0a 2a 2a 20 72 65 71 75 65 73 74  ually.** request
2aa90 65 64 20 66 72 6f 6d 20 74 68 65 20 75 6e 64 65  ed from the unde
2aaa0 72 6c 79 69 6e 67 20 6f 70 65 72 61 74 69 6e 67  rlying operating
2aab0 20 73 79 73 74 65 6d 2c 20 61 20 6e 75 6d 62 65   system, a numbe
2aac0 72 20 77 68 69 63 68 0a 2a 2a 20 6d 69 67 68 74  r which.** might
2aad0 20 62 65 20 67 72 65 61 74 65 72 20 74 68 61 6e   be greater than
2aae0 20 6f 72 20 65 71 75 61 6c 20 74 6f 20 74 68 65   or equal to the
2aaf0 20 61 72 67 75 6d 65 6e 74 2c 20 62 75 74 20 6e   argument, but n
2ab00 6f 74 20 6c 65 73 73 0a 2a 2a 20 74 68 61 6e 20  ot less.** than 
2ab10 74 68 65 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f  the argument..*/
2ab20 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78  .static int unix
2ab30 53 6c 65 65 70 28 73 71 6c 69 74 65 33 5f 76 66  Sleep(sqlite3_vf
2ab40 73 20 2a 4e 6f 74 55 73 65 64 2c 20 69 6e 74 20  s *NotUsed, int 
2ab50 6d 69 63 72 6f 73 65 63 6f 6e 64 73 29 7b 0a 23  microseconds){.#
2ab60 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20  if OS_VXWORKS.  
2ab70 73 74 72 75 63 74 20 74 69 6d 65 73 70 65 63 20  struct timespec 
2ab80 73 70 3b 0a 0a 20 20 73 70 2e 74 76 5f 73 65 63  sp;..  sp.tv_sec
2ab90 20 3d 20 6d 69 63 72 6f 73 65 63 6f 6e 64 73 20   = microseconds 
2aba0 2f 20 31 30 30 30 30 30 30 3b 0a 20 20 73 70 2e  / 1000000;.  sp.
2abb0 74 76 5f 6e 73 65 63 20 3d 20 28 6d 69 63 72 6f  tv_nsec = (micro
2abc0 73 65 63 6f 6e 64 73 20 25 20 31 30 30 30 30 30  seconds % 100000
2abd0 30 29 20 2a 20 31 30 30 30 3b 0a 20 20 6e 61 6e  0) * 1000;.  nan
2abe0 6f 73 6c 65 65 70 28 26 73 70 2c 20 4e 55 4c 4c  osleep(&sp, NULL
2abf0 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  );.  UNUSED_PARA
2ac00 4d 45 54 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a  METER(NotUsed);.
2ac10 20 20 72 65 74 75 72 6e 20 6d 69 63 72 6f 73 65    return microse
2ac20 63 6f 6e 64 73 3b 0a 23 65 6c 69 66 20 64 65 66  conds;.#elif def
2ac30 69 6e 65 64 28 48 41 56 45 5f 55 53 4c 45 45 50  ined(HAVE_USLEEP
2ac40 29 20 26 26 20 48 41 56 45 5f 55 53 4c 45 45 50  ) && HAVE_USLEEP
2ac50 0a 20 20 75 73 6c 65 65 70 28 6d 69 63 72 6f 73  .  usleep(micros
2ac60 65 63 6f 6e 64 73 29 3b 0a 20 20 55 4e 55 53 45  econds);.  UNUSE
2ac70 44 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f 74 55  D_PARAMETER(NotU
2ac80 73 65 64 29 3b 0a 20 20 72 65 74 75 72 6e 20 6d  sed);.  return m
2ac90 69 63 72 6f 73 65 63 6f 6e 64 73 3b 0a 23 65 6c  icroseconds;.#el
2aca0 73 65 0a 20 20 69 6e 74 20 73 65 63 6f 6e 64 73  se.  int seconds
2acb0 20 3d 20 28 6d 69 63 72 6f 73 65 63 6f 6e 64 73   = (microseconds
2acc0 2b 39 39 39 39 39 39 29 2f 31 30 30 30 30 30 30  +999999)/1000000
2acd0 3b 0a 20 20 73 6c 65 65 70 28 73 65 63 6f 6e 64  ;.  sleep(second
2ace0 73 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  s);.  UNUSED_PAR
2acf0 41 4d 45 54 45 52 28 4e 6f 74 55 73 65 64 29 3b  AMETER(NotUsed);
2ad00 0a 20 20 72 65 74 75 72 6e 20 73 65 63 6f 6e 64  .  return second
2ad10 73 2a 31 30 30 30 30 30 30 3b 0a 23 65 6e 64 69  s*1000000;.#endi
2ad20 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66  f.}../*.** The f
2ad30 6f 6c 6c 6f 77 69 6e 67 20 76 61 72 69 61 62 6c  ollowing variabl
2ad40 65 2c 20 69 66 20 73 65 74 20 74 6f 20 61 20 6e  e, if set to a n
2ad50 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75 65 2c 20 69  on-zero value, i
2ad60 73 20 69 6e 74 65 72 70 72 65 74 65 64 20 61 73  s interpreted as
2ad70 0a 2a 2a 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  .** the number o
2ad80 66 20 73 65 63 6f 6e 64 73 20 73 69 6e 63 65 20  f seconds since 
2ad90 31 39 37 30 20 61 6e 64 20 69 73 20 75 73 65 64  1970 and is used
2ada0 20 74 6f 20 73 65 74 20 74 68 65 20 72 65 73 75   to set the resu
2adb0 6c 74 20 6f 66 0a 2a 2a 20 73 71 6c 69 74 65 33  lt of.** sqlite3
2adc0 4f 73 43 75 72 72 65 6e 74 54 69 6d 65 28 29 20  OsCurrentTime() 
2add0 64 75 72 69 6e 67 20 74 65 73 74 69 6e 67 2e 0a  during testing..
2ade0 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  */.#ifdef SQLITE
2adf0 5f 54 45 53 54 0a 69 6e 74 20 73 71 6c 69 74 65  _TEST.int sqlite
2ae00 33 5f 63 75 72 72 65 6e 74 5f 74 69 6d 65 20 3d  3_current_time =
2ae10 20 30 3b 20 20 2f 2a 20 46 61 6b 65 20 73 79 73   0;  /* Fake sys
2ae20 74 65 6d 20 74 69 6d 65 20 69 6e 20 73 65 63 6f  tem time in seco
2ae30 6e 64 73 20 73 69 6e 63 65 20 31 39 37 30 2e 20  nds since 1970. 
2ae40 2a 2f 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  */.#endif../*.**
2ae50 20 46 69 6e 64 20 74 68 65 20 63 75 72 72 65 6e   Find the curren
2ae60 74 20 74 69 6d 65 20 28 69 6e 20 55 6e 69 76 65  t time (in Unive
2ae70 72 73 61 6c 20 43 6f 6f 72 64 69 6e 61 74 65 64  rsal Coordinated
2ae80 20 54 69 6d 65 29 2e 20 20 57 72 69 74 65 20 69   Time).  Write i
2ae90 6e 74 6f 20 2a 70 69 4e 6f 77 0a 2a 2a 20 74 68  nto *piNow.** th
2aea0 65 20 63 75 72 72 65 6e 74 20 74 69 6d 65 20 61  e current time a
2aeb0 6e 64 20 64 61 74 65 20 61 73 20 61 20 4a 75 6c  nd date as a Jul
2aec0 69 61 6e 20 44 61 79 20 6e 75 6d 62 65 72 20 74  ian Day number t
2aed0 69 6d 65 73 20 38 36 5f 34 30 30 5f 30 30 30 2e  imes 86_400_000.
2aee0 20 20 49 6e 0a 2a 2a 20 6f 74 68 65 72 20 77 6f    In.** other wo
2aef0 72 64 73 2c 20 77 72 69 74 65 20 69 6e 74 6f 20  rds, write into 
2af00 2a 70 69 4e 6f 77 20 74 68 65 20 6e 75 6d 62 65  *piNow the numbe
2af10 72 20 6f 66 20 6d 69 6c 6c 69 73 65 63 6f 6e 64  r of millisecond
2af20 73 20 73 69 6e 63 65 20 74 68 65 20 4a 75 6c 69  s since the Juli
2af30 61 6e 0a 2a 2a 20 65 70 6f 63 68 20 6f 66 20 6e  an.** epoch of n
2af40 6f 6f 6e 20 69 6e 20 47 72 65 65 6e 77 69 63 68  oon in Greenwich
2af50 20 6f 6e 20 4e 6f 76 65 6d 62 65 72 20 32 34 2c   on November 24,
2af60 20 34 37 31 34 20 42 2e 43 20 61 63 63 6f 72 64   4714 B.C accord
2af70 69 6e 67 20 74 6f 20 74 68 65 0a 2a 2a 20 70 72  ing to the.** pr
2af80 6f 6c 65 70 74 69 63 20 47 72 65 67 6f 72 69 61  oleptic Gregoria
2af90 6e 20 63 61 6c 65 6e 64 61 72 2e 0a 2a 2a 0a 2a  n calendar..**.*
2afa0 2a 20 4f 6e 20 73 75 63 63 65 73 73 2c 20 72 65  * On success, re
2afb0 74 75 72 6e 20 30 2e 20 20 52 65 74 75 72 6e 20  turn 0.  Return 
2afc0 31 20 69 66 20 74 68 65 20 74 69 6d 65 20 61 6e  1 if the time an
2afd0 64 20 64 61 74 65 20 63 61 6e 6e 6f 74 20 62 65  d date cannot be
2afe0 20 66 6f 75 6e 64 2e 0a 2a 2f 0a 73 74 61 74 69   found..*/.stati
2aff0 63 20 69 6e 74 20 75 6e 69 78 43 75 72 72 65 6e  c int unixCurren
2b000 74 54 69 6d 65 49 6e 74 36 34 28 73 71 6c 69 74  tTimeInt64(sqlit
2b010 65 33 5f 76 66 73 20 2a 4e 6f 74 55 73 65 64 2c  e3_vfs *NotUsed,
2b020 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 2a   sqlite3_int64 *
2b030 70 69 4e 6f 77 29 7b 0a 20 20 73 74 61 74 69 63  piNow){.  static
2b040 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 69   const sqlite3_i
2b050 6e 74 36 34 20 75 6e 69 78 45 70 6f 63 68 20 3d  nt64 unixEpoch =
2b060 20 32 34 34 30 35 38 37 35 2a 28 73 71 6c 69 74   24405875*(sqlit
2b070 65 33 5f 69 6e 74 36 34 29 38 36 34 30 30 30 30  e3_int64)8640000
2b080 3b 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4e 4f  ;.#if defined(NO
2b090 5f 47 45 54 54 4f 44 29 0a 20 20 74 69 6d 65 5f  _GETTOD).  time_
2b0a0 74 20 74 3b 0a 20 20 74 69 6d 65 28 26 74 29 3b  t t;.  time(&t);
2b0b0 0a 20 20 2a 70 69 4e 6f 77 20 3d 20 28 28 73 71  .  *piNow = ((sq
2b0c0 6c 69 74 65 33 5f 69 6e 74 36 34 29 69 29 2a 31  lite3_int64)i)*1
2b0d0 30 30 30 20 2b 20 75 6e 69 78 45 70 6f 63 68 3b  000 + unixEpoch;
2b0e0 0a 23 65 6c 69 66 20 4f 53 5f 56 58 57 4f 52 4b  .#elif OS_VXWORK
2b0f0 53 0a 20 20 73 74 72 75 63 74 20 74 69 6d 65 73  S.  struct times
2b100 70 65 63 20 73 4e 6f 77 3b 0a 20 20 63 6c 6f 63  pec sNow;.  cloc
2b110 6b 5f 67 65 74 74 69 6d 65 28 43 4c 4f 43 4b 5f  k_gettime(CLOCK_
2b120 52 45 41 4c 54 49 4d 45 2c 20 26 73 4e 6f 77 29  REALTIME, &sNow)
2b130 3b 0a 20 20 2a 70 69 4e 6f 77 20 3d 20 75 6e 69  ;.  *piNow = uni
2b140 78 45 70 6f 63 68 20 2b 20 31 30 30 30 2a 28 73  xEpoch + 1000*(s
2b150 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 73 4e 6f  qlite3_int64)sNo
2b160 77 2e 74 76 5f 73 65 63 20 2b 20 73 4e 6f 77 2e  w.tv_sec + sNow.
2b170 74 76 5f 6e 73 65 63 2f 31 30 30 30 30 30 30 3b  tv_nsec/1000000;
2b180 0a 23 65 6c 73 65 0a 20 20 73 74 72 75 63 74 20  .#else.  struct 
2b190 74 69 6d 65 76 61 6c 20 73 4e 6f 77 3b 0a 20 20  timeval sNow;.  
2b1a0 67 65 74 74 69 6d 65 6f 66 64 61 79 28 26 73 4e  gettimeofday(&sN
2b1b0 6f 77 2c 20 30 29 3b 0a 20 20 2a 70 69 4e 6f 77  ow, 0);.  *piNow
2b1c0 20 3d 20 75 6e 69 78 45 70 6f 63 68 20 2b 20 31   = unixEpoch + 1
2b1d0 30 30 30 2a 28 73 71 6c 69 74 65 33 5f 69 6e 74  000*(sqlite3_int
2b1e0 36 34 29 73 4e 6f 77 2e 74 76 5f 73 65 63 20 2b  64)sNow.tv_sec +
2b1f0 20 73 4e 6f 77 2e 74 76 5f 75 73 65 63 2f 31 30   sNow.tv_usec/10
2b200 30 30 3b 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64  00;.#endif..#ifd
2b210 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20  ef SQLITE_TEST. 
2b220 20 69 66 28 20 73 71 6c 69 74 65 33 5f 63 75 72   if( sqlite3_cur
2b230 72 65 6e 74 5f 74 69 6d 65 20 29 7b 0a 20 20 20  rent_time ){.   
2b240 20 2a 70 69 4e 6f 77 20 3d 20 31 30 30 30 2a 28   *piNow = 1000*(
2b250 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 73 71  sqlite3_int64)sq
2b260 6c 69 74 65 33 5f 63 75 72 72 65 6e 74 5f 74 69  lite3_current_ti
2b270 6d 65 20 2b 20 75 6e 69 78 45 70 6f 63 68 3b 0a  me + unixEpoch;.
2b280 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 55 4e 55    }.#endif.  UNU
2b290 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f  SED_PARAMETER(No
2b2a0 74 55 73 65 64 29 3b 0a 20 20 72 65 74 75 72 6e  tUsed);.  return
2b2b0 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 69 6e   0;.}../*.** Fin
2b2c0 64 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 69  d the current ti
2b2d0 6d 65 20 28 69 6e 20 55 6e 69 76 65 72 73 61 6c  me (in Universal
2b2e0 20 43 6f 6f 72 64 69 6e 61 74 65 64 20 54 69 6d   Coordinated Tim
2b2f0 65 29 2e 20 20 57 72 69 74 65 20 74 68 65 0a 2a  e).  Write the.*
2b300 2a 20 63 75 72 72 65 6e 74 20 74 69 6d 65 20 61  * current time a
2b310 6e 64 20 64 61 74 65 20 61 73 20 61 20 4a 75 6c  nd date as a Jul
2b320 69 61 6e 20 44 61 79 20 6e 75 6d 62 65 72 20 69  ian Day number i
2b330 6e 74 6f 20 2a 70 72 4e 6f 77 20 61 6e 64 0a 2a  nto *prNow and.*
2b340 2a 20 72 65 74 75 72 6e 20 30 2e 20 20 52 65 74  * return 0.  Ret
2b350 75 72 6e 20 31 20 69 66 20 74 68 65 20 74 69 6d  urn 1 if the tim
2b360 65 20 61 6e 64 20 64 61 74 65 20 63 61 6e 6e 6f  e and date canno
2b370 74 20 62 65 20 66 6f 75 6e 64 2e 0a 2a 2f 0a 73  t be found..*/.s
2b380 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 43 75  tatic int unixCu
2b390 72 72 65 6e 74 54 69 6d 65 28 73 71 6c 69 74 65  rrentTime(sqlite
2b3a0 33 5f 76 66 73 20 2a 4e 6f 74 55 73 65 64 2c 20  3_vfs *NotUsed, 
2b3b0 64 6f 75 62 6c 65 20 2a 70 72 4e 6f 77 29 7b 0a  double *prNow){.
2b3c0 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20    sqlite3_int64 
2b3d0 69 3b 0a 20 20 75 6e 69 78 43 75 72 72 65 6e 74  i;.  unixCurrent
2b3e0 54 69 6d 65 49 6e 74 36 34 28 30 2c 20 26 69 29  TimeInt64(0, &i)
2b3f0 3b 0a 20 20 2a 70 72 4e 6f 77 20 3d 20 69 2f 38  ;.  *prNow = i/8
2b400 36 34 30 30 30 30 30 2e 30 3b 0a 20 20 72 65 74  6400000.0;.  ret
2b410 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn 0;.}../*.** 
2b420 57 65 20 61 64 64 65 64 20 74 68 65 20 78 47 65  We added the xGe
2b430 74 4c 61 73 74 45 72 72 6f 72 28 29 20 6d 65 74  tLastError() met
2b440 68 6f 64 20 77 69 74 68 20 74 68 65 20 69 6e 74  hod with the int
2b450 65 6e 74 69 6f 6e 20 6f 66 20 70 72 6f 76 69 64  ention of provid
2b460 69 6e 67 0a 2a 2a 20 62 65 74 74 65 72 20 6c 6f  ing.** better lo
2b470 77 2d 6c 65 76 65 6c 20 65 72 72 6f 72 20 6d 65  w-level error me
2b480 73 73 61 67 65 73 20 77 68 65 6e 20 6f 70 65 72  ssages when oper
2b490 61 74 69 6e 67 2d 73 79 73 74 65 6d 20 70 72 6f  ating-system pro
2b4a0 62 6c 65 6d 73 20 63 6f 6d 65 20 75 70 0a 2a 2a  blems come up.**
2b4b0 20 64 75 72 69 6e 67 20 53 51 4c 69 74 65 20 6f   during SQLite o
2b4c0 70 65 72 61 74 69 6f 6e 2e 20 20 42 75 74 20 73  peration.  But s
2b4d0 6f 20 66 61 72 2c 20 6e 6f 6e 65 20 6f 66 20 74  o far, none of t
2b4e0 68 61 74 20 68 61 73 20 62 65 65 6e 20 69 6d 70  hat has been imp
2b4f0 6c 65 6d 65 6e 74 65 64 0a 2a 2a 20 69 6e 20 74  lemented.** in t
2b500 68 65 20 63 6f 72 65 2e 20 20 53 6f 20 74 68 69  he core.  So thi
2b510 73 20 72 6f 75 74 69 6e 65 20 69 73 20 6e 65 76  s routine is nev
2b520 65 72 20 63 61 6c 6c 65 64 2e 20 20 46 6f 72 20  er called.  For 
2b530 6e 6f 77 2c 20 69 74 20 69 73 20 6d 65 72 65 6c  now, it is merel
2b540 79 0a 2a 2a 20 61 20 70 6c 61 63 65 2d 68 6f 6c  y.** a place-hol
2b550 64 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  der..*/.static i
2b560 6e 74 20 75 6e 69 78 47 65 74 4c 61 73 74 45 72  nt unixGetLastEr
2b570 72 6f 72 28 73 71 6c 69 74 65 33 5f 76 66 73 20  ror(sqlite3_vfs 
2b580 2a 4e 6f 74 55 73 65 64 2c 20 69 6e 74 20 4e 6f  *NotUsed, int No
2b590 74 55 73 65 64 32 2c 20 63 68 61 72 20 2a 4e 6f  tUsed2, char *No
2b5a0 74 55 73 65 64 33 29 7b 0a 20 20 55 4e 55 53 45  tUsed3){.  UNUSE
2b5b0 44 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f 74 55  D_PARAMETER(NotU
2b5c0 73 65 64 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50  sed);.  UNUSED_P
2b5d0 41 52 41 4d 45 54 45 52 28 4e 6f 74 55 73 65 64  ARAMETER(NotUsed
2b5e0 32 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  2);.  UNUSED_PAR
2b5f0 41 4d 45 54 45 52 28 4e 6f 74 55 73 65 64 33 29  AMETER(NotUsed3)
2b600 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  ;.  return 0;.}.
2b610 0a 0a 2f 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ../*.***********
2b620 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e  ************* En
2b630 64 20 6f 66 20 73 71 6c 69 74 65 33 5f 76 66 73  d of sqlite3_vfs
2b640 20 6d 65 74 68 6f 64 73 20 2a 2a 2a 2a 2a 2a 2a   methods *******
2b650 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2b660 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****.***********
2b670 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2b680 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2b690 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2b6a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2b6b0 2a 2a 2a 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a  ***/../*********
2b6c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2b6d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2b6e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2b6f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2b700 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  *****.**********
2b710 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2b720 20 42 65 67 69 6e 20 50 72 6f 78 79 20 4c 6f 63   Begin Proxy Loc
2b730 6b 69 6e 67 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  king ***********
2b740 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2b750 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 50 72 6f 78  *****.**.** Prox
2b760 79 20 6c 6f 63 6b 69 6e 67 20 69 73 20 61 20 22  y locking is a "
2b770 75 62 65 72 2d 6c 6f 63 6b 69 6e 67 2d 6d 65 74  uber-locking-met
2b780 68 6f 64 22 20 69 6e 20 74 68 69 73 20 73 65 6e  hod" in this sen
2b790 73 65 3a 20 20 49 74 20 75 73 65 73 20 74 68 65  se:  It uses the
2b7a0 0a 2a 2a 20 6f 74 68 65 72 20 6c 6f 63 6b 69 6e  .** other lockin
2b7b0 67 20 6d 65 74 68 6f 64 73 20 6f 6e 20 73 65 63  g methods on sec
2b7c0 6f 6e 64 61 72 79 20 6c 6f 63 6b 20 66 69 6c 65  ondary lock file
2b7d0 73 2e 20 20 50 72 6f 78 79 20 6c 6f 63 6b 69 6e  s.  Proxy lockin
2b7e0 67 20 69 73 20 61 0a 2a 2a 20 6d 65 74 61 2d 6c  g is a.** meta-l
2b7f0 61 79 65 72 20 6f 76 65 72 20 74 6f 70 20 6f 66  ayer over top of
2b800 20 74 68 65 20 70 72 69 6d 69 74 69 76 65 20 6c   the primitive l
2b810 6f 63 6b 69 6e 67 20 69 6d 70 6c 65 6d 65 6e 74  ocking implement
2b820 65 64 20 61 62 6f 76 65 2e 20 20 46 6f 72 0a 2a  ed above.  For.*
2b830 2a 20 74 68 69 73 20 72 65 61 73 6f 6e 2c 20 74  * this reason, t
2b840 68 65 20 64 69 76 69 73 69 6f 6e 20 74 68 61 74  he division that
2b850 20 69 6d 70 6c 65 6d 65 6e 74 73 20 6f 66 20 70   implements of p
2b860 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 20 69 73 20  roxy locking is 
2b870 64 65 66 65 72 72 65 64 0a 2a 2a 20 75 6e 74 69  deferred.** unti
2b880 6c 20 6c 61 74 65 20 69 6e 20 74 68 65 20 66 69  l late in the fi
2b890 6c 65 20 28 68 65 72 65 29 20 61 66 74 65 72 20  le (here) after 
2b8a0 61 6c 6c 20 6f 66 20 74 68 65 20 6f 74 68 65 72  all of the other
2b8b0 20 49 2f 4f 20 6d 65 74 68 6f 64 73 20 68 61 76   I/O methods hav
2b8c0 65 0a 2a 2a 20 62 65 65 6e 20 64 65 66 69 6e 65  e.** been define
2b8d0 64 20 2d 20 73 6f 20 74 68 61 74 20 74 68 65 20  d - so that the 
2b8e0 70 72 69 6d 69 74 69 76 65 20 6c 6f 63 6b 69 6e  primitive lockin
2b8f0 67 20 6d 65 74 68 6f 64 73 20 61 72 65 20 61 76  g methods are av
2b900 61 69 6c 61 62 6c 65 0a 2a 2a 20 61 73 20 73 65  ailable.** as se
2b910 72 76 69 63 65 73 20 74 6f 20 68 65 6c 70 20 77  rvices to help w
2b920 69 74 68 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e  ith the implemen
2b930 74 61 74 69 6f 6e 20 6f 66 20 70 72 6f 78 79 20  tation of proxy 
2b940 6c 6f 63 6b 69 6e 67 2e 0a 2a 2a 0a 2a 2a 2a 2a  locking..**.****
2b950 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64 65 66 61 75  .**.** The defau
2b960 6c 74 20 6c 6f 63 6b 69 6e 67 20 73 63 68 65 6d  lt locking schem
2b970 65 73 20 69 6e 20 53 51 4c 69 74 65 20 75 73 65  es in SQLite use
2b980 20 62 79 74 65 2d 72 61 6e 67 65 20 6c 6f 63 6b   byte-range lock
2b990 73 20 6f 6e 20 74 68 65 0a 2a 2a 20 64 61 74 61  s on the.** data
2b9a0 62 61 73 65 20 66 69 6c 65 20 74 6f 20 63 6f 6f  base file to coo
2b9b0 72 64 69 6e 61 74 65 20 73 61 66 65 2c 20 63 6f  rdinate safe, co
2b9c0 6e 63 75 72 72 65 6e 74 20 61 63 63 65 73 73 20  ncurrent access 
2b9d0 62 79 20 6d 75 6c 74 69 70 6c 65 20 72 65 61 64  by multiple read
2b9e0 65 72 73 0a 2a 2a 20 61 6e 64 20 77 72 69 74 65  ers.** and write
2b9f0 72 73 20 5b 68 74 74 70 3a 2f 2f 73 71 6c 69 74  rs [http://sqlit
2ba00 65 2e 6f 72 67 2f 6c 6f 63 6b 69 6e 67 76 33 2e  e.org/lockingv3.
2ba10 68 74 6d 6c 5d 2e 20 20 54 68 65 20 66 69 76 65  html].  The five
2ba20 20 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 0a 2a 2a   file locking.**
2ba30 20 73 74 61 74 65 73 20 28 55 4e 4c 4f 43 4b 45   states (UNLOCKE
2ba40 44 2c 20 50 45 4e 44 49 4e 47 2c 20 53 48 41 52  D, PENDING, SHAR
2ba50 45 44 2c 20 52 45 53 45 52 56 45 44 2c 20 45 58  ED, RESERVED, EX
2ba60 43 4c 55 53 49 56 45 29 20 61 72 65 20 69 6d 70  CLUSIVE) are imp
2ba70 6c 65 6d 65 6e 74 65 64 0a 2a 2a 20 61 73 20 50  lemented.** as P
2ba80 4f 53 49 58 20 72 65 61 64 20 26 20 77 72 69 74  OSIX read & writ
2ba90 65 20 6c 6f 63 6b 73 20 6f 76 65 72 20 66 69 78  e locks over fix
2baa0 65 64 20 73 65 74 20 6f 66 20 6c 6f 63 61 74 69  ed set of locati
2bab0 6f 6e 73 20 28 76 69 61 20 66 73 63 74 6c 29 2c  ons (via fsctl),
2bac0 0a 2a 2a 20 6f 6e 20 41 46 50 20 61 6e 64 20 53  .** on AFP and S
2bad0 4d 42 20 6f 6e 6c 79 20 65 78 63 6c 75 73 69 76  MB only exclusiv
2bae0 65 20 62 79 74 65 2d 72 61 6e 67 65 20 6c 6f 63  e byte-range loc
2baf0 6b 73 20 61 72 65 20 61 76 61 69 6c 61 62 6c 65  ks are available
2bb00 20 76 69 61 20 66 73 63 74 6c 0a 2a 2a 20 77 69   via fsctl.** wi
2bb10 74 68 20 5f 49 4f 57 52 28 27 7a 27 2c 20 32 33  th _IOWR('z', 23
2bb20 2c 20 73 74 72 75 63 74 20 42 79 74 65 52 61 6e  , struct ByteRan
2bb30 67 65 4c 6f 63 6b 50 42 32 29 20 74 6f 20 74 72  geLockPB2) to tr
2bb40 61 63 6b 20 74 68 65 20 73 61 6d 65 20 35 20 73  ack the same 5 s
2bb50 74 61 74 65 73 2e 0a 2a 2a 20 54 6f 20 73 69 6d  tates..** To sim
2bb60 75 6c 61 74 65 20 61 20 46 5f 52 44 4c 43 4b 20  ulate a F_RDLCK 
2bb70 6f 6e 20 74 68 65 20 73 68 61 72 65 64 20 72 61  on the shared ra
2bb80 6e 67 65 2c 20 6f 6e 20 41 46 50 20 61 20 72 61  nge, on AFP a ra
2bb90 6e 64 6f 6d 6c 79 20 73 65 6c 65 63 74 65 64 0a  ndomly selected.
2bba0 2a 2a 20 61 64 64 72 65 73 73 20 69 6e 20 74 68  ** address in th
2bbb0 65 20 73 68 61 72 65 64 20 72 61 6e 67 65 20 69  e shared range i
2bbc0 73 20 74 61 6b 65 6e 20 66 6f 72 20 61 20 53 48  s taken for a SH
2bbd0 41 52 45 44 20 6c 6f 63 6b 2c 20 74 68 65 20 65  ARED lock, the e
2bbe0 6e 74 69 72 65 0a 2a 2a 20 73 68 61 72 65 64 20  ntire.** shared 
2bbf0 72 61 6e 67 65 20 69 73 20 74 61 6b 65 6e 20 66  range is taken f
2bc00 6f 72 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20  or an EXCLUSIVE 
2bc10 6c 6f 63 6b 29 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  lock):.**.**    
2bc20 20 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 20 20    PENDING_BYTE  
2bc30 20 20 20 20 20 20 30 78 34 30 30 30 30 30 30 30        0x40000000
2bc40 09 09 20 20 20 09 0a 2a 2a 20 20 20 20 20 20 52  ..   ..**      R
2bc50 45 53 45 52 56 45 44 5f 42 59 54 45 20 20 20 20  ESERVED_BYTE    
2bc60 20 20 20 30 78 34 30 30 30 30 30 30 31 0a 2a 2a     0x40000001.**
2bc70 20 20 20 20 20 20 53 48 41 52 45 44 5f 52 41 4e        SHARED_RAN
2bc80 47 45 20 20 20 20 20 20 20 20 30 78 34 30 30 30  GE        0x4000
2bc90 30 30 30 32 20 2d 3e 20 30 78 34 30 30 30 30 32  0002 -> 0x400002
2bca0 30 30 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 77 6f  00.**.** This wo
2bcb0 72 6b 73 20 77 65 6c 6c 20 6f 6e 20 74 68 65 20  rks well on the 
2bcc0 6c 6f 63 61 6c 20 66 69 6c 65 20 73 79 73 74 65  local file syste
2bcd0 6d 2c 20 62 75 74 20 73 68 6f 77 73 20 61 20 6e  m, but shows a n
2bce0 65 61 72 6c 79 20 31 30 30 78 0a 2a 2a 20 73 6c  early 100x.** sl
2bcf0 6f 77 64 6f 77 6e 20 69 6e 20 72 65 61 64 20 70  owdown in read p
2bd00 65 72 66 6f 72 6d 61 6e 63 65 20 6f 6e 20 41 46  erformance on AF
2bd10 50 20 62 65 63 61 75 73 65 20 74 68 65 20 41 46  P because the AF
2bd20 50 20 63 6c 69 65 6e 74 20 64 69 73 61 62 6c 65  P client disable
2bd30 73 0a 2a 2a 20 74 68 65 20 72 65 61 64 20 63 61  s.** the read ca
2bd40 63 68 65 20 77 68 65 6e 20 62 79 74 65 2d 72 61  che when byte-ra
2bd50 6e 67 65 20 6c 6f 63 6b 73 20 61 72 65 20 70 72  nge locks are pr
2bd60 65 73 65 6e 74 2e 20 20 45 6e 61 62 6c 69 6e 67  esent.  Enabling
2bd70 20 74 68 65 20 72 65 61 64 0a 2a 2a 20 63 61 63   the read.** cac
2bd80 68 65 20 65 78 70 6f 73 65 73 20 61 20 63 61 63  he exposes a cac
2bd90 68 65 20 63 6f 68 65 72 65 6e 63 79 20 70 72 6f  he coherency pro
2bda0 62 6c 65 6d 20 74 68 61 74 20 69 73 20 70 72 65  blem that is pre
2bdb0 73 65 6e 74 20 6f 6e 20 61 6c 6c 20 4f 53 20 58  sent on all OS X
2bdc0 0a 2a 2a 20 73 75 70 70 6f 72 74 65 64 20 6e 65  .** supported ne
2bdd0 74 77 6f 72 6b 20 66 69 6c 65 20 73 79 73 74 65  twork file syste
2bde0 6d 73 2e 20 20 4e 46 53 20 61 6e 64 20 41 46 50  ms.  NFS and AFP
2bdf0 20 62 6f 74 68 20 6f 62 73 65 72 76 65 20 74 68   both observe th
2be00 65 0a 2a 2a 20 63 6c 6f 73 65 2d 74 6f 2d 6f 70  e.** close-to-op
2be10 65 6e 20 73 65 6d 61 6e 74 69 63 73 20 66 6f 72  en semantics for
2be20 20 65 6e 73 75 72 69 6e 67 20 63 61 63 68 65 20   ensuring cache 
2be30 63 6f 68 65 72 65 6e 63 79 0a 2a 2a 20 5b 68 74  coherency.** [ht
2be40 74 70 3a 2f 2f 6e 66 73 2e 73 6f 75 72 63 65 66  tp://nfs.sourcef
2be50 6f 72 67 65 2e 6e 65 74 2f 23 66 61 71 5f 61 38  orge.net/#faq_a8
2be60 5d 2c 20 77 68 69 63 68 20 64 6f 65 73 20 6e 6f  ], which does no
2be70 74 20 65 66 66 65 63 74 69 76 65 6c 79 0a 2a 2a  t effectively.**
2be80 20 61 64 64 72 65 73 73 20 74 68 65 20 72 65 71   address the req
2be90 75 69 72 65 6d 65 6e 74 73 20 66 6f 72 20 63 6f  uirements for co
2bea0 6e 63 75 72 72 65 6e 74 20 64 61 74 61 62 61 73  ncurrent databas
2beb0 65 20 61 63 63 65 73 73 20 62 79 20 6d 75 6c 74  e access by mult
2bec0 69 70 6c 65 0a 2a 2a 20 72 65 61 64 65 72 73 20  iple.** readers 
2bed0 61 6e 64 20 77 72 69 74 65 72 73 0a 2a 2a 20 5b  and writers.** [
2bee0 68 74 74 70 3a 2f 2f 77 77 77 2e 6e 61 62 62 6c  http://www.nabbl
2bef0 65 2e 63 6f 6d 2f 53 51 4c 69 74 65 2d 6f 6e 2d  e.com/SQLite-on-
2bf00 4e 46 53 2d 63 61 63 68 65 2d 63 6f 68 65 72 65  NFS-cache-cohere
2bf10 6e 63 79 2d 74 64 31 35 36 35 35 37 30 31 2e 68  ncy-td15655701.h
2bf20 74 6d 6c 5d 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20 61  tml]..**.** To a
2bf30 64 64 72 65 73 73 20 74 68 65 20 70 65 72 66 6f  ddress the perfo
2bf40 72 6d 61 6e 63 65 20 61 6e 64 20 63 61 63 68 65  rmance and cache
2bf50 20 63 6f 68 65 72 65 6e 63 79 20 69 73 73 75 65   coherency issue
2bf60 73 2c 20 70 72 6f 78 79 20 66 69 6c 65 20 6c 6f  s, proxy file lo
2bf70 63 6b 69 6e 67 0a 2a 2a 20 63 68 61 6e 67 65 73  cking.** changes
2bf80 20 74 68 65 20 77 61 79 20 64 61 74 61 62 61 73   the way databas
2bf90 65 20 61 63 63 65 73 73 20 69 73 20 63 6f 6e 74  e access is cont
2bfa0 72 6f 6c 6c 65 64 20 62 79 20 6c 69 6d 69 74 69  rolled by limiti
2bfb0 6e 67 20 61 63 63 65 73 73 20 74 6f 20 61 0a 2a  ng access to a.*
2bfc0 2a 20 73 69 6e 67 6c 65 20 68 6f 73 74 20 61 74  * single host at
2bfd0 20 61 20 74 69 6d 65 20 61 6e 64 20 6d 6f 76 69   a time and movi
2bfe0 6e 67 20 66 69 6c 65 20 6c 6f 63 6b 73 20 6f 66  ng file locks of
2bff0 66 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  f of the databas
2c000 65 20 66 69 6c 65 0a 2a 2a 20 61 6e 64 20 6f 6e  e file.** and on
2c010 74 6f 20 61 20 70 72 6f 78 79 20 66 69 6c 65 20  to a proxy file 
2c020 6f 6e 20 74 68 65 20 6c 6f 63 61 6c 20 66 69 6c  on the local fil
2c030 65 20 73 79 73 74 65 6d 2e 20 20 0a 2a 2a 0a 2a  e system.  .**.*
2c040 2a 0a 2a 2a 20 55 73 69 6e 67 20 70 72 6f 78 79  *.** Using proxy
2c050 20 6c 6f 63 6b 73 0a 2a 2a 20 2d 2d 2d 2d 2d 2d   locks.** ------
2c060 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 0a 2a  -----------.**.*
2c070 2a 20 43 20 41 50 49 73 0a 2a 2a 0a 2a 2a 20 20  * C APIs.**.**  
2c080 73 71 6c 69 74 65 33 5f 66 69 6c 65 5f 63 6f 6e  sqlite3_file_con
2c090 74 72 6f 6c 28 64 62 2c 20 64 62 6e 61 6d 65 2c  trol(db, dbname,
2c0a0 20 53 51 4c 49 54 45 5f 53 45 54 5f 4c 4f 43 4b   SQLITE_SET_LOCK
2c0b0 50 52 4f 58 59 46 49 4c 45 2c 0a 2a 2a 20 20 20  PROXYFILE,.**   
2c0c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c0d0 20 20 20 20 3c 70 72 6f 78 79 5f 70 61 74 68 3e      <proxy_path>
2c0e0 20 7c 20 22 3a 61 75 74 6f 3a 22 29 3b 0a 2a 2a   | ":auto:");.**
2c0f0 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 5f 63    sqlite3_file_c
2c100 6f 6e 74 72 6f 6c 28 64 62 2c 20 64 62 6e 61 6d  ontrol(db, dbnam
2c110 65 2c 20 53 51 4c 49 54 45 5f 47 45 54 5f 4c 4f  e, SQLITE_GET_LO
2c120 43 4b 50 52 4f 58 59 46 49 4c 45 2c 20 26 3c 70  CKPROXYFILE, &<p
2c130 72 6f 78 79 5f 70 61 74 68 3e 29 3b 0a 2a 2a 0a  roxy_path>);.**.
2c140 2a 2a 0a 2a 2a 20 53 51 4c 20 70 72 61 67 6d 61  **.** SQL pragma
2c150 73 0a 2a 2a 0a 2a 2a 20 20 50 52 41 47 4d 41 20  s.**.**  PRAGMA 
2c160 5b 64 61 74 61 62 61 73 65 2e 5d 6c 6f 63 6b 5f  [database.]lock_
2c170 70 72 6f 78 79 5f 66 69 6c 65 3d 3c 70 72 6f 78  proxy_file=<prox
2c180 79 5f 70 61 74 68 3e 20 7c 20 3a 61 75 74 6f 3a  y_path> | :auto:
2c190 0a 2a 2a 20 20 50 52 41 47 4d 41 20 5b 64 61 74  .**  PRAGMA [dat
2c1a0 61 62 61 73 65 2e 5d 6c 6f 63 6b 5f 70 72 6f 78  abase.]lock_prox
2c1b0 79 5f 66 69 6c 65 0a 2a 2a 0a 2a 2a 20 53 70 65  y_file.**.** Spe
2c1c0 63 69 66 79 69 6e 67 20 22 3a 61 75 74 6f 3a 22  cifying ":auto:"
2c1d0 20 6d 65 61 6e 73 20 74 68 61 74 20 69 66 20 74   means that if t
2c1e0 68 65 72 65 20 69 73 20 61 20 63 6f 6e 63 68 20  here is a conch 
2c1f0 66 69 6c 65 20 77 69 74 68 20 61 20 6d 61 74 63  file with a matc
2c200 68 69 6e 67 0a 2a 2a 20 68 6f 73 74 20 49 44 20  hing.** host ID 
2c210 69 6e 20 69 74 2c 20 74 68 65 20 70 72 6f 78 79  in it, the proxy
2c220 20 70 61 74 68 20 69 6e 20 74 68 65 20 63 6f 6e   path in the con
2c230 63 68 20 66 69 6c 65 20 77 69 6c 6c 20 62 65 20  ch file will be 
2c240 75 73 65 64 2c 20 6f 74 68 65 72 77 69 73 65 0a  used, otherwise.
2c250 2a 2a 20 61 20 70 72 6f 78 79 20 70 61 74 68 20  ** a proxy path 
2c260 62 61 73 65 64 20 6f 6e 20 74 68 65 20 75 73 65  based on the use
2c270 72 27 73 20 74 65 6d 70 20 64 69 72 0a 2a 2a 20  r's temp dir.** 
2c280 28 76 69 61 20 63 6f 6e 66 73 74 72 28 5f 43 53  (via confstr(_CS
2c290 5f 44 41 52 57 49 4e 5f 55 53 45 52 5f 54 45 4d  _DARWIN_USER_TEM
2c2a0 50 5f 44 49 52 2c 2e 2e 2e 29 29 20 77 69 6c 6c  P_DIR,...)) will
2c2b0 20 62 65 20 75 73 65 64 20 61 6e 64 20 74 68 65   be used and the
2c2c0 0a 2a 2a 20 61 63 74 75 61 6c 20 70 72 6f 78 79  .** actual proxy
2c2d0 20 66 69 6c 65 20 6e 61 6d 65 20 69 73 20 67 65   file name is ge
2c2e0 6e 65 72 61 74 65 64 20 66 72 6f 6d 20 74 68 65  nerated from the
2c2f0 20 6e 61 6d 65 20 61 6e 64 20 70 61 74 68 20 6f   name and path o
2c300 66 20 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73  f the.** databas
2c310 65 20 66 69 6c 65 2e 20 20 46 6f 72 20 65 78 61  e file.  For exa
2c320 6d 70 6c 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  mple:.**.**     
2c330 20 20 46 6f 72 20 64 61 74 61 62 61 73 65 20 70    For database p
2c340 61 74 68 20 22 2f 55 73 65 72 73 2f 6d 65 2f 66  ath "/Users/me/f
2c350 6f 6f 2e 64 62 22 20 0a 2a 2a 20 20 20 20 20 20  oo.db" .**      
2c360 20 54 68 65 20 6c 6f 63 6b 20 70 61 74 68 20 77   The lock path w
2c370 69 6c 6c 20 62 65 20 22 3c 74 6d 70 64 69 72 3e  ill be "<tmpdir>
2c380 2f 73 71 6c 69 74 65 70 6c 6f 63 6b 73 2f 5f 55  /sqliteplocks/_U
2c390 73 65 72 73 5f 6d 65 5f 66 6f 6f 2e 64 62 3a 61  sers_me_foo.db:a
2c3a0 75 74 6f 3a 22 29 0a 2a 2a 0a 2a 2a 20 4f 6e 63  uto:").**.** Onc
2c3b0 65 20 61 20 6c 6f 63 6b 20 70 72 6f 78 79 20 69  e a lock proxy i
2c3c0 73 20 63 6f 6e 66 69 67 75 72 65 64 20 66 6f 72  s configured for
2c3d0 20 61 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e   a database conn
2c3e0 65 63 74 69 6f 6e 2c 20 69 74 20 63 61 6e 20 6e  ection, it can n
2c3f0 6f 74 0a 2a 2a 20 62 65 20 72 65 6d 6f 76 65 64  ot.** be removed
2c400 2c 20 68 6f 77 65 76 65 72 20 69 74 20 6d 61 79  , however it may
2c410 20 62 65 20 73 77 69 74 63 68 65 64 20 74 6f 20   be switched to 
2c420 61 20 64 69 66 66 65 72 65 6e 74 20 70 72 6f 78  a different prox
2c430 79 20 70 61 74 68 20 76 69 61 0a 2a 2a 20 74 68  y path via.** th
2c440 65 20 61 62 6f 76 65 20 41 50 49 73 20 28 61 73  e above APIs (as
2c450 73 75 6d 69 6e 67 20 74 68 65 20 63 6f 6e 63 68  suming the conch
2c460 20 66 69 6c 65 20 69 73 20 6e 6f 74 20 62 65 69   file is not bei
2c470 6e 67 20 68 65 6c 64 20 62 79 20 61 6e 6f 74 68  ng held by anoth
2c480 65 72 0a 2a 2a 20 63 6f 6e 6e 65 63 74 69 6f 6e  er.** connection
2c490 20 6f 72 20 70 72 6f 63 65 73 73 29 2e 20 0a 2a   or process). .*
2c4a0 2a 0a 2a 2a 0a 2a 2a 20 48 6f 77 20 70 72 6f 78  *.**.** How prox
2c4b0 79 20 6c 6f 63 6b 69 6e 67 20 77 6f 72 6b 73 0a  y locking works.
2c4c0 2a 2a 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ** -------------
2c4d0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 0a 2a 2a  ----------.**.**
2c4e0 20 50 72 6f 78 79 20 66 69 6c 65 20 6c 6f 63 6b   Proxy file lock
2c4f0 69 6e 67 20 72 65 6c 69 65 73 20 70 72 69 6d 61  ing relies prima
2c500 72 69 6c 79 20 6f 6e 20 74 77 6f 20 6e 65 77 20  rily on two new 
2c510 73 75 70 70 6f 72 74 69 6e 67 20 66 69 6c 65 73  supporting files
2c520 3a 20 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 20 63 6f  : .**.**   *  co
2c530 6e 63 68 20 66 69 6c 65 20 74 6f 20 6c 69 6d 69  nch file to limi
2c540 74 20 61 63 63 65 73 73 20 74 6f 20 74 68 65 20  t access to the 
2c550 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 74 6f  database file to
2c560 20 61 20 73 69 6e 67 6c 65 20 68 6f 73 74 0a 2a   a single host.*
2c570 2a 20 20 20 20 20 20 61 74 20 61 20 74 69 6d 65  *      at a time
2c580 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 20 70 72 6f 78  .**.**   *  prox
2c590 79 20 66 69 6c 65 20 74 6f 20 61 63 74 20 61 73  y file to act as
2c5a0 20 61 20 70 72 6f 78 79 20 66 6f 72 20 74 68 65   a proxy for the
2c5b0 20 61 64 76 69 73 6f 72 79 20 6c 6f 63 6b 73 20   advisory locks 
2c5c0 6e 6f 72 6d 61 6c 6c 79 0a 2a 2a 20 20 20 20 20  normally.**     
2c5d0 20 74 61 6b 65 6e 20 6f 6e 20 74 68 65 20 64 61   taken on the da
2c5e0 74 61 62 61 73 65 0a 2a 2a 0a 2a 2a 20 54 68 65  tabase.**.** The
2c5f0 20 63 6f 6e 63 68 20 66 69 6c 65 20 2d 20 74 6f   conch file - to
2c600 20 75 73 65 20 61 20 70 72 6f 78 79 20 66 69 6c   use a proxy fil
2c610 65 2c 20 73 71 6c 69 74 65 20 6d 75 73 74 20 66  e, sqlite must f
2c620 69 72 73 74 20 22 68 6f 6c 64 20 74 68 65 20 63  irst "hold the c
2c630 6f 6e 63 68 22 0a 2a 2a 20 62 79 20 74 61 6b 69  onch".** by taki
2c640 6e 67 20 61 6e 20 73 71 6c 69 74 65 2d 73 74 79  ng an sqlite-sty
2c650 6c 65 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 6f  le shared lock o
2c660 6e 20 74 68 65 20 63 6f 6e 63 68 20 66 69 6c 65  n the conch file
2c670 2c 20 72 65 61 64 69 6e 67 20 74 68 65 0a 2a 2a  , reading the.**
2c680 20 63 6f 6e 74 65 6e 74 73 20 61 6e 64 20 63 6f   contents and co
2c690 6d 70 61 72 69 6e 67 20 74 68 65 20 68 6f 73 74  mparing the host
2c6a0 27 73 20 75 6e 69 71 75 65 20 68 6f 73 74 20 49  's unique host I
2c6b0 44 20 28 73 65 65 20 62 65 6c 6f 77 29 20 61 6e  D (see below) an
2c6c0 64 20 6c 6f 63 6b 0a 2a 2a 20 70 72 6f 78 79 20  d lock.** proxy 
2c6d0 70 61 74 68 20 61 67 61 69 6e 73 74 20 74 68 65  path against the
2c6e0 20 76 61 6c 75 65 73 20 73 74 6f 72 65 64 20 69   values stored i
2c6f0 6e 20 74 68 65 20 63 6f 6e 63 68 2e 20 20 54 68  n the conch.  Th
2c700 65 20 63 6f 6e 63 68 20 66 69 6c 65 20 69 73 0a  e conch file is.
2c710 2a 2a 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65  ** stored in the
2c720 20 73 61 6d 65 20 64 69 72 65 63 74 6f 72 79 20   same directory 
2c730 61 73 20 74 68 65 20 64 61 74 61 62 61 73 65 20  as the database 
2c740 66 69 6c 65 20 61 6e 64 20 74 68 65 20 66 69 6c  file and the fil
2c750 65 20 6e 61 6d 65 0a 2a 2a 20 69 73 20 70 61 74  e name.** is pat
2c760 74 65 72 6e 65 64 20 61 66 74 65 72 20 74 68 65  terned after the
2c770 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 6e   database file n
2c780 61 6d 65 20 61 73 20 22 2e 3c 64 61 74 61 62 61  ame as ".<databa
2c790 73 65 6e 61 6d 65 3e 2d 63 6f 6e 63 68 22 2e 0a  sename>-conch"..
2c7a0 2a 2a 20 49 66 20 74 68 65 20 63 6f 6e 63 68 20  ** If the conch 
2c7b0 66 69 6c 65 20 64 6f 65 73 20 6e 6f 74 20 65 78  file does not ex
2c7c0 69 73 74 2c 20 6f 72 20 69 74 27 73 20 63 6f 6e  ist, or it's con
2c7d0 74 65 6e 74 73 20 64 6f 20 6e 6f 74 20 6d 61 74  tents do not mat
2c7e0 63 68 20 74 68 65 0a 2a 2a 20 68 6f 73 74 20 49  ch the.** host I
2c7f0 44 20 61 6e 64 2f 6f 72 20 70 72 6f 78 79 20 70  D and/or proxy p
2c800 61 74 68 2c 20 74 68 65 6e 20 74 68 65 20 6c 6f  ath, then the lo
2c810 63 6b 20 69 73 20 65 73 63 61 6c 61 74 65 64 20  ck is escalated 
2c820 74 6f 20 61 6e 20 65 78 63 6c 75 73 69 76 65 0a  to an exclusive.
2c830 2a 2a 20 6c 6f 63 6b 20 61 6e 64 20 74 68 65 20  ** lock and the 
2c840 63 6f 6e 63 68 20 66 69 6c 65 20 63 6f 6e 74 65  conch file conte
2c850 6e 74 73 20 69 73 20 75 70 64 61 74 65 64 20 77  nts is updated w
2c860 69 74 68 20 74 68 65 20 68 6f 73 74 20 49 44 20  ith the host ID 
2c870 61 6e 64 20 70 72 6f 78 79 0a 2a 2a 20 70 61 74  and proxy.** pat
2c880 68 20 61 6e 64 20 74 68 65 20 6c 6f 63 6b 20 69  h and the lock i
2c890 73 20 64 6f 77 6e 67 72 61 64 65 64 20 74 6f 20  s downgraded to 
2c8a0 61 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 61 67  a shared lock ag
2c8b0 61 69 6e 2e 20 20 49 66 20 74 68 65 20 63 6f 6e  ain.  If the con
2c8c0 63 68 0a 2a 2a 20 69 73 20 68 65 6c 64 20 62 79  ch.** is held by
2c8d0 20 61 6e 6f 74 68 65 72 20 70 72 6f 63 65 73 73   another process
2c8e0 20 28 77 69 74 68 20 61 20 73 68 61 72 65 64 20   (with a shared 
2c8f0 6c 6f 63 6b 29 2c 20 74 68 65 20 65 78 63 6c 75  lock), the exclu
2c900 73 69 76 65 20 6c 6f 63 6b 0a 2a 2a 20 77 69 6c  sive lock.** wil
2c910 6c 20 66 61 69 6c 20 61 6e 64 20 53 51 4c 49 54  l fail and SQLIT
2c920 45 5f 42 55 53 59 20 69 73 20 72 65 74 75 72 6e  E_BUSY is return
2c930 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 72  ed..**.** The pr
2c940 6f 78 79 20 66 69 6c 65 20 2d 20 61 20 73 69 6e  oxy file - a sin
2c950 67 6c 65 2d 62 79 74 65 20 66 69 6c 65 20 75 73  gle-byte file us
2c960 65 64 20 66 6f 72 20 61 6c 6c 20 61 64 76 69 73  ed for all advis
2c970 6f 72 79 20 66 69 6c 65 20 6c 6f 63 6b 73 0a 2a  ory file locks.*
2c980 2a 20 6e 6f 72 6d 61 6c 6c 79 20 74 61 6b 65 6e  * normally taken
2c990 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
2c9a0 20 66 69 6c 65 2e 20 20 20 54 68 69 73 20 61 6c   file.   This al
2c9b0 6c 6f 77 73 20 66 6f 72 20 73 61 66 65 20 73 68  lows for safe sh
2c9c0 61 72 69 6e 67 0a 2a 2a 20 6f 66 20 74 68 65 20  aring.** of the 
2c9d0 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 66 6f  database file fo
2c9e0 72 20 6d 75 6c 74 69 70 6c 65 20 72 65 61 64 65  r multiple reade
2c9f0 72 73 20 61 6e 64 20 77 72 69 74 65 72 73 20 6f  rs and writers o
2ca00 6e 20 74 68 65 20 73 61 6d 65 0a 2a 2a 20 68 6f  n the same.** ho
2ca10 73 74 20 28 74 68 65 20 63 6f 6e 63 68 20 65 6e  st (the conch en
2ca20 73 75 72 65 73 20 74 68 61 74 20 74 68 65 79 20  sures that they 
2ca30 61 6c 6c 20 75 73 65 20 74 68 65 20 73 61 6d 65  all use the same
2ca40 20 6c 6f 63 61 6c 20 6c 6f 63 6b 20 66 69 6c 65   local lock file
2ca50 29 2e 0a 2a 2a 0a 2a 2a 20 52 65 71 75 65 73 74  )..**.** Request
2ca60 69 6e 67 20 74 68 65 20 6c 6f 63 6b 20 70 72 6f  ing the lock pro
2ca70 78 79 20 64 6f 65 73 20 6e 6f 74 20 69 6d 6d 65  xy does not imme
2ca80 64 69 61 74 65 6c 79 20 74 61 6b 65 20 74 68 65  diately take the
2ca90 20 63 6f 6e 63 68 2c 20 69 74 20 69 73 0a 2a 2a   conch, it is.**
2caa0 20 6f 6e 6c 79 20 74 61 6b 65 6e 20 77 68 65 6e   only taken when
2cab0 20 74 68 65 20 66 69 72 73 74 20 72 65 71 75 65   the first reque
2cac0 73 74 20 74 6f 20 6c 6f 63 6b 20 64 61 74 61 62  st to lock datab
2cad0 61 73 65 20 66 69 6c 65 20 69 73 20 6d 61 64 65  ase file is made
2cae0 2e 20 20 0a 2a 2a 20 54 68 69 73 20 6d 61 74 63  .  .** This matc
2caf0 68 65 73 20 74 68 65 20 73 65 6d 61 6e 74 69 63  hes the semantic
2cb00 73 20 6f 66 20 74 68 65 20 74 72 61 64 69 74 69  s of the traditi
2cb10 6f 6e 61 6c 20 6c 6f 63 6b 69 6e 67 20 62 65 68  onal locking beh
2cb20 61 76 69 6f 72 2c 20 77 68 65 72 65 0a 2a 2a 20  avior, where.** 
2cb30 6f 70 65 6e 69 6e 67 20 61 20 63 6f 6e 6e 65 63  opening a connec
2cb40 74 69 6f 6e 20 74 6f 20 61 20 64 61 74 61 62 61  tion to a databa
2cb50 73 65 20 66 69 6c 65 20 64 6f 65 73 20 6e 6f 74  se file does not
2cb60 20 74 61 6b 65 20 61 20 6c 6f 63 6b 20 6f 6e 20   take a lock on 
2cb70 69 74 2e 0a 2a 2a 20 54 68 65 20 73 68 61 72 65  it..** The share
2cb80 64 20 6c 6f 63 6b 20 61 6e 64 20 61 6e 20 6f 70  d lock and an op
2cb90 65 6e 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  en file descript
2cba0 6f 72 20 61 72 65 20 6d 61 69 6e 74 61 69 6e 65  or are maintaine
2cbb0 64 20 75 6e 74 69 6c 20 0a 2a 2a 20 74 68 65 20  d until .** the 
2cbc0 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 74 68  connection to th
2cbd0 65 20 64 61 74 61 62 61 73 65 20 69 73 20 63 6c  e database is cl
2cbe0 6f 73 65 64 2e 20 0a 2a 2a 0a 2a 2a 20 54 68 65  osed. .**.** The
2cbf0 20 70 72 6f 78 79 20 66 69 6c 65 20 61 6e 64 20   proxy file and 
2cc00 74 68 65 20 6c 6f 63 6b 20 66 69 6c 65 20 61 72  the lock file ar
2cc10 65 20 6e 65 76 65 72 20 64 65 6c 65 74 65 64 20  e never deleted 
2cc20 73 6f 20 74 68 65 79 20 6f 6e 6c 79 20 6e 65 65  so they only nee
2cc30 64 0a 2a 2a 20 74 6f 20 62 65 20 63 72 65 61 74  d.** to be creat
2cc40 65 64 20 74 68 65 20 66 69 72 73 74 20 74 69 6d  ed the first tim
2cc50 65 20 74 68 65 79 20 61 72 65 20 75 73 65 64 2e  e they are used.
2cc60 0a 2a 2a 0a 2a 2a 20 43 6f 6e 66 69 67 75 72 61  .**.** Configura
2cc70 74 69 6f 6e 20 6f 70 74 69 6f 6e 73 0a 2a 2a 20  tion options.** 
2cc80 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2cc90 2d 2d 2d 2d 2d 0a 2a 2a 0a 2a 2a 20 20 53 51 4c  -----.**.**  SQL
2cca0 49 54 45 5f 50 52 45 46 45 52 5f 50 52 4f 58 59  ITE_PREFER_PROXY
2ccb0 5f 4c 4f 43 4b 49 4e 47 0a 2a 2a 0a 2a 2a 20 20  _LOCKING.**.**  
2ccc0 20 20 20 20 20 44 61 74 61 62 61 73 65 20 66 69       Database fi
2ccd0 6c 65 73 20 61 63 63 65 73 73 65 64 20 6f 6e 20  les accessed on 
2cce0 6e 6f 6e 2d 6c 6f 63 61 6c 20 66 69 6c 65 20 73  non-local file s
2ccf0 79 73 74 65 6d 73 20 61 72 65 0a 2a 2a 20 20 20  ystems are.**   
2cd00 20 20 20 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c      automaticall
2cd10 79 20 63 6f 6e 66 69 67 75 72 65 64 20 66 6f 72  y configured for
2cd20 20 70 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 2c 20   proxy locking, 
2cd30 6c 6f 63 6b 20 66 69 6c 65 73 20 61 72 65 0a 2a  lock files are.*
2cd40 2a 20 20 20 20 20 20 20 6e 61 6d 65 64 20 61 75  *       named au
2cd50 74 6f 6d 61 74 69 63 61 6c 6c 79 20 75 73 69 6e  tomatically usin
2cd60 67 20 74 68 65 20 73 61 6d 65 20 6c 6f 67 69 63  g the same logic
2cd70 20 61 73 0a 2a 2a 20 20 20 20 20 20 20 50 52 41   as.**       PRA
2cd80 47 4d 41 20 6c 6f 63 6b 5f 70 72 6f 78 79 5f 66  GMA lock_proxy_f
2cd90 69 6c 65 3d 22 3a 61 75 74 6f 3a 22 0a 2a 2a 20  ile=":auto:".** 
2cda0 20 20 20 0a 2a 2a 20 20 53 51 4c 49 54 45 5f 50     .**  SQLITE_P
2cdb0 52 4f 58 59 5f 44 45 42 55 47 0a 2a 2a 0a 2a 2a  ROXY_DEBUG.**.**
2cdc0 20 20 20 20 20 20 20 45 6e 61 62 6c 65 73 20 74         Enables t
2cdd0 68 65 20 6c 6f 67 67 69 6e 67 20 6f 66 20 65 72  he logging of er
2cde0 72 6f 72 20 6d 65 73 73 61 67 65 73 20 64 75 72  ror messages dur
2cdf0 69 6e 67 20 68 6f 73 74 20 69 64 20 66 69 6c 65  ing host id file
2ce00 0a 2a 2a 20 20 20 20 20 20 20 72 65 74 72 69 65  .**       retrie
2ce10 76 61 6c 20 61 6e 64 20 63 72 65 61 74 69 6f 6e  val and creation
2ce20 0a 2a 2a 0a 2a 2a 20 20 4c 4f 43 4b 50 52 4f 58  .**.**  LOCKPROX
2ce30 59 44 49 52 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20  YDIR.**.**      
2ce40 20 4f 76 65 72 72 69 64 65 73 20 74 68 65 20 64   Overrides the d
2ce50 65 66 61 75 6c 74 20 64 69 72 65 63 74 6f 72 79  efault directory
2ce60 20 75 73 65 64 20 66 6f 72 20 6c 6f 63 6b 20 70   used for lock p
2ce70 72 6f 78 79 20 66 69 6c 65 73 20 74 68 61 74 0a  roxy files that.
2ce80 2a 2a 20 20 20 20 20 20 20 61 72 65 20 6e 61 6d  **       are nam
2ce90 65 64 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79  ed automatically
2cea0 20 76 69 61 20 74 68 65 20 22 3a 61 75 74 6f 3a   via the ":auto:
2ceb0 22 20 73 65 74 74 69 6e 67 0a 2a 2a 0a 2a 2a 20  " setting.**.** 
2cec0 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f   SQLITE_DEFAULT_
2ced0 50 52 4f 58 59 44 49 52 5f 50 45 52 4d 49 53 53  PROXYDIR_PERMISS
2cee0 49 4f 4e 53 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20  IONS.**.**      
2cef0 20 50 65 72 6d 69 73 73 69 6f 6e 73 20 74 6f 20   Permissions to 
2cf00 75 73 65 20 77 68 65 6e 20 63 72 65 61 74 69 6e  use when creatin
2cf10 67 20 61 20 64 69 72 65 63 74 6f 72 79 20 66 6f  g a directory fo
2cf20 72 20 73 74 6f 72 69 6e 67 20 74 68 65 0a 2a 2a  r storing the.**
2cf30 20 20 20 20 20 20 20 6c 6f 63 6b 20 70 72 6f 78         lock prox
2cf40 79 20 66 69 6c 65 73 2c 20 6f 6e 6c 79 20 75 73  y files, only us
2cf50 65 64 20 77 68 65 6e 20 4c 4f 43 4b 50 52 4f 58  ed when LOCKPROX
2cf60 59 44 49 52 20 69 73 20 6e 6f 74 20 73 65 74 2e  YDIR is not set.
2cf70 0a 2a 2a 20 20 20 20 0a 2a 2a 20 20 20 20 0a 2a  .**    .**    .*
2cf80 2a 20 41 73 20 6d 65 6e 74 69 6f 6e 65 64 20 61  * As mentioned a
2cf90 62 6f 76 65 2c 20 77 68 65 6e 20 63 6f 6d 70 69  bove, when compi
2cfa0 6c 65 64 20 77 69 74 68 20 53 51 4c 49 54 45 5f  led with SQLITE_
2cfb0 50 52 45 46 45 52 5f 50 52 4f 58 59 5f 4c 4f 43  PREFER_PROXY_LOC
2cfc0 4b 49 4e 47 2c 0a 2a 2a 20 73 65 74 74 69 6e 67  KING,.** setting
2cfd0 20 74 68 65 20 65 6e 76 69 72 6f 6e 6d 65 6e 74   the environment
2cfe0 20 76 61 72 69 61 62 6c 65 20 53 51 4c 49 54 45   variable SQLITE
2cff0 5f 46 4f 52 43 45 5f 50 52 4f 58 59 5f 4c 4f 43  _FORCE_PROXY_LOC
2d000 4b 49 4e 47 20 74 6f 20 31 20 77 69 6c 6c 0a 2a  KING to 1 will.*
2d010 2a 20 66 6f 72 63 65 20 70 72 6f 78 79 20 6c 6f  * force proxy lo
2d020 63 6b 69 6e 67 20 74 6f 20 62 65 20 75 73 65 64  cking to be used
2d030 20 66 6f 72 20 65 76 65 72 79 20 64 61 74 61 62   for every datab
2d040 61 73 65 20 66 69 6c 65 20 6f 70 65 6e 65 64 2c  ase file opened,
2d050 20 61 6e 64 20 30 0a 2a 2a 20 77 69 6c 6c 20 66   and 0.** will f
2d060 6f 72 63 65 20 61 75 74 6f 6d 61 74 69 63 20 70  orce automatic p
2d070 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 20 74 6f 20  roxy locking to 
2d080 62 65 20 64 69 73 61 62 6c 65 64 20 66 6f 72 20  be disabled for 
2d090 61 6c 6c 20 64 61 74 61 62 61 73 65 0a 2a 2a 20  all database.** 
2d0a0 66 69 6c 65 73 20 28 65 78 70 6c 69 63 69 74 79  files (explicity
2d0b0 20 63 61 6c 6c 69 6e 67 20 74 68 65 20 53 51 4c   calling the SQL
2d0c0 49 54 45 5f 53 45 54 5f 4c 4f 43 4b 50 52 4f 58  ITE_SET_LOCKPROX
2d0d0 59 46 49 4c 45 20 70 72 61 67 6d 61 20 6f 72 0a  YFILE pragma or.
2d0e0 2a 2a 20 73 71 6c 69 74 65 5f 66 69 6c 65 5f 63  ** sqlite_file_c
2d0f0 6f 6e 74 72 6f 6c 20 41 50 49 20 69 73 20 6e 6f  ontrol API is no
2d100 74 20 61 66 66 65 63 74 65 64 20 62 79 20 53 51  t affected by SQ
2d110 4c 49 54 45 5f 46 4f 52 43 45 5f 50 52 4f 58 59  LITE_FORCE_PROXY
2d120 5f 4c 4f 43 4b 49 4e 47 29 2e 0a 2a 2f 0a 0a 2f  _LOCKING)..*/../
2d130 2a 0a 2a 2a 20 50 72 6f 78 79 20 6c 6f 63 6b 69  *.** Proxy locki
2d140 6e 67 20 69 73 20 6f 6e 6c 79 20 61 76 61 69 6c  ng is only avail
2d150 61 62 6c 65 20 6f 6e 20 4d 61 63 4f 53 58 20 0a  able on MacOSX .
2d160 2a 2f 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f  */.#if defined(_
2d170 5f 41 50 50 4c 45 5f 5f 29 20 26 26 20 53 51 4c  _APPLE__) && SQL
2d180 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49  ITE_ENABLE_LOCKI
2d190 4e 47 5f 53 54 59 4c 45 0a 0a 2f 2a 0a 2a 2a 20  NG_STYLE../*.** 
2d1a0 54 68 65 20 70 72 6f 78 79 4c 6f 63 6b 69 6e 67  The proxyLocking
2d1b0 43 6f 6e 74 65 78 74 20 68 61 73 20 74 68 65 20  Context has the 
2d1c0 70 61 74 68 20 61 6e 64 20 66 69 6c 65 20 73 74  path and file st
2d1d0 72 75 63 74 75 72 65 73 20 66 6f 72 20 74 68 65  ructures for the
2d1e0 20 72 65 6d 6f 74 65 20 0a 2a 2a 20 61 6e 64 20   remote .** and 
2d1f0 6c 6f 63 61 6c 20 70 72 6f 78 79 20 66 69 6c 65  local proxy file
2d200 73 20 69 6e 20 69 74 0a 2a 2f 0a 74 79 70 65 64  s in it.*/.typed
2d210 65 66 20 73 74 72 75 63 74 20 70 72 6f 78 79 4c  ef struct proxyL
2d220 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 70 72  ockingContext pr
2d230 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78  oxyLockingContex
2d240 74 3b 0a 73 74 72 75 63 74 20 70 72 6f 78 79 4c  t;.struct proxyL
2d250 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 7b 0a  ockingContext {.
2d260 20 20 75 6e 69 78 46 69 6c 65 20 2a 63 6f 6e 63    unixFile *conc
2d270 68 46 69 6c 65 3b 20 20 20 20 20 20 20 20 20 2f  hFile;         /
2d280 2a 20 4f 70 65 6e 20 63 6f 6e 63 68 20 66 69 6c  * Open conch fil
2d290 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 63 6f 6e  e */.  char *con
2d2a0 63 68 46 69 6c 65 50 61 74 68 3b 20 20 20 20 20  chFilePath;     
2d2b0 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74      /* Name of t
2d2c0 68 65 20 63 6f 6e 63 68 20 66 69 6c 65 20 2a 2f  he conch file */
2d2d0 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 6c 6f 63  .  unixFile *loc
2d2e0 6b 50 72 6f 78 79 3b 20 20 20 20 20 20 20 20 20  kProxy;         
2d2f0 2f 2a 20 4f 70 65 6e 20 70 72 6f 78 79 20 6c 6f  /* Open proxy lo
2d300 63 6b 20 66 69 6c 65 20 2a 2f 0a 20 20 63 68 61  ck file */.  cha
2d310 72 20 2a 6c 6f 63 6b 50 72 6f 78 79 50 61 74 68  r *lockProxyPath
2d320 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d  ;         /* Nam
2d330 65 20 6f 66 20 74 68 65 20 70 72 6f 78 79 20 6c  e of the proxy l
2d340 6f 63 6b 20 66 69 6c 65 20 2a 2f 0a 20 20 63 68  ock file */.  ch
2d350 61 72 20 2a 64 62 50 61 74 68 3b 20 20 20 20 20  ar *dbPath;     
2d360 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61             /* Na
2d370 6d 65 20 6f 66 20 74 68 65 20 6f 70 65 6e 20 66  me of the open f
2d380 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 63 6f 6e  ile */.  int con
2d390 63 68 48 65 6c 64 3b 20 20 20 20 20 20 20 20 20  chHeld;         
2d3a0 20 20 20 20 20 20 2f 2a 20 31 20 69 66 20 74 68        /* 1 if th
2d3b0 65 20 63 6f 6e 63 68 20 69 73 20 68 65 6c 64 2c  e conch is held,
2d3c0 20 2d 31 20 69 66 20 6c 6f 63 6b 6c 65 73 73 20   -1 if lockless 
2d3d0 2a 2f 0a 20 20 76 6f 69 64 20 2a 6f 6c 64 4c 6f  */.  void *oldLo
2d3e0 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 20 20 20  ckingContext;   
2d3f0 20 20 2f 2a 20 4f 72 69 67 69 6e 61 6c 20 6c 6f    /* Original lo
2d400 63 6b 69 6e 67 63 6f 6e 74 65 78 74 20 74 6f 20  ckingcontext to 
2d410 72 65 73 74 6f 72 65 20 6f 6e 20 63 6c 6f 73 65  restore on close
2d420 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 69 6f   */.  sqlite3_io
2d430 5f 6d 65 74 68 6f 64 73 20 63 6f 6e 73 74 20 2a  _methods const *
2d440 70 4f 6c 64 4d 65 74 68 6f 64 3b 20 20 20 20 20  pOldMethod;     
2d450 2f 2a 20 4f 72 69 67 69 6e 61 6c 20 49 2f 4f 20  /* Original I/O 
2d460 6d 65 74 68 6f 64 73 20 66 6f 72 20 63 6c 6f 73  methods for clos
2d470 65 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 20 0a 2a 2a 20  e */.};../* .** 
2d480 54 68 65 20 70 72 6f 78 79 20 6c 6f 63 6b 20 66  The proxy lock f
2d490 69 6c 65 20 70 61 74 68 20 66 6f 72 20 74 68 65  ile path for the
2d4a0 20 64 61 74 61 62 61 73 65 20 61 74 20 64 62 50   database at dbP
2d4b0 61 74 68 20 69 73 20 77 72 69 74 74 65 6e 20 69  ath is written i
2d4c0 6e 74 6f 20 6c 50 61 74 68 2c 20 0a 2a 2a 20 77  nto lPath, .** w
2d4d0 68 69 63 68 20 6d 75 73 74 20 70 6f 69 6e 74 20  hich must point 
2d4e0 74 6f 20 76 61 6c 69 64 2c 20 77 72 69 74 61 62  to valid, writab
2d4f0 6c 65 20 6d 65 6d 6f 72 79 20 6c 61 72 67 65 20  le memory large 
2d500 65 6e 6f 75 67 68 20 66 6f 72 20 61 20 6d 61 78  enough for a max
2d510 4c 65 6e 20 6c 65 6e 67 74 68 0a 2a 2a 20 66 69  Len length.** fi
2d520 6c 65 20 70 61 74 68 2e 20 0a 2a 2f 0a 73 74 61  le path. .*/.sta
2d530 74 69 63 20 69 6e 74 20 70 72 6f 78 79 47 65 74  tic int proxyGet
2d540 4c 6f 63 6b 50 61 74 68 28 63 6f 6e 73 74 20 63  LockPath(const c
2d550 68 61 72 20 2a 64 62 50 61 74 68 2c 20 63 68 61  har *dbPath, cha
2d560 72 20 2a 6c 50 61 74 68 2c 20 73 69 7a 65 5f 74  r *lPath, size_t
2d570 20 6d 61 78 4c 65 6e 29 7b 0a 20 20 69 6e 74 20   maxLen){.  int 
2d580 6c 65 6e 3b 0a 20 20 69 6e 74 20 64 62 4c 65 6e  len;.  int dbLen
2d590 3b 0a 20 20 69 6e 74 20 69 3b 0a 0a 23 69 66 64  ;.  int i;..#ifd
2d5a0 65 66 20 4c 4f 43 4b 50 52 4f 58 59 44 49 52 0a  ef LOCKPROXYDIR.
2d5b0 20 20 6c 65 6e 20 3d 20 73 74 72 6c 63 70 79 28    len = strlcpy(
2d5c0 6c 50 61 74 68 2c 20 4c 4f 43 4b 50 52 4f 58 59  lPath, LOCKPROXY
2d5d0 44 49 52 2c 20 6d 61 78 4c 65 6e 29 3b 0a 23 65  DIR, maxLen);.#e
2d5e0 6c 73 65 0a 23 20 69 66 64 65 66 20 5f 43 53 5f  lse.# ifdef _CS_
2d5f0 44 41 52 57 49 4e 5f 55 53 45 52 5f 54 45 4d 50  DARWIN_USER_TEMP
2d600 5f 44 49 52 0a 20 20 7b 0a 20 20 20 20 69 66 28  _DIR.  {.    if(
2d610 20 21 63 6f 6e 66 73 74 72 28 5f 43 53 5f 44 41   !confstr(_CS_DA
2d620 52 57 49 4e 5f 55 53 45 52 5f 54 45 4d 50 5f 44  RWIN_USER_TEMP_D
2d630 49 52 2c 20 6c 50 61 74 68 2c 20 6d 61 78 4c 65  IR, lPath, maxLe
2d640 6e 29 20 29 7b 0a 20 20 20 20 20 20 4f 53 54 52  n) ){.      OSTR
2d650 41 43 45 34 28 22 47 45 54 4c 4f 43 4b 50 41 54  ACE4("GETLOCKPAT
2d660 48 20 20 66 61 69 6c 65 64 20 25 73 20 65 72 72  H  failed %s err
2d670 6e 6f 3d 25 64 20 70 69 64 3d 25 64 5c 6e 22 2c  no=%d pid=%d\n",
2d680 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2d690 6c 50 61 74 68 2c 20 65 72 72 6e 6f 2c 20 67 65  lPath, errno, ge
2d6a0 74 70 69 64 28 29 29 3b 0a 20 20 20 20 20 20 72  tpid());.      r
2d6b0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45  eturn SQLITE_IOE
2d6c0 52 52 5f 4c 4f 43 4b 3b 0a 20 20 20 20 7d 0a 20  RR_LOCK;.    }. 
2d6d0 20 20 20 6c 65 6e 20 3d 20 73 74 72 6c 63 61 74     len = strlcat
2d6e0 28 6c 50 61 74 68 2c 20 22 73 71 6c 69 74 65 70  (lPath, "sqlitep
2d6f0 6c 6f 63 6b 73 22 2c 20 6d 61 78 4c 65 6e 29 3b  locks", maxLen);
2d700 20 20 20 20 0a 20 20 7d 0a 23 20 65 6c 73 65 0a      .  }.# else.
2d710 20 20 6c 65 6e 20 3d 20 73 74 72 6c 63 70 79 28    len = strlcpy(
2d720 6c 50 61 74 68 2c 20 22 2f 74 6d 70 2f 22 2c 20  lPath, "/tmp/", 
2d730 6d 61 78 4c 65 6e 29 3b 0a 23 20 65 6e 64 69 66  maxLen);.# endif
2d740 0a 23 65 6e 64 69 66 0a 0a 20 20 69 66 28 20 6c  .#endif..  if( l
2d750 50 61 74 68 5b 6c 65 6e 2d 31 5d 21 3d 27 2f 27  Path[len-1]!='/'
2d760 20 29 7b 0a 20 20 20 20 6c 65 6e 20 3d 20 73 74   ){.    len = st
2d770 72 6c 63 61 74 28 6c 50 61 74 68 2c 20 22 2f 22  rlcat(lPath, "/"
2d780 2c 20 6d 61 78 4c 65 6e 29 3b 0a 20 20 7d 0a 20  , maxLen);.  }. 
2d790 20 0a 20 20 2f 2a 20 74 72 61 6e 73 66 6f 72 6d   .  /* transform
2d7a0 20 74 68 65 20 64 62 20 70 61 74 68 20 74 6f 20   the db path to 
2d7b0 61 20 75 6e 69 71 75 65 20 63 61 63 68 65 20 6e  a unique cache n
2d7c0 61 6d 65 20 2a 2f 0a 20 20 64 62 4c 65 6e 20 3d  ame */.  dbLen =
2d7d0 20 28 69 6e 74 29 73 74 72 6c 65 6e 28 64 62 50   (int)strlen(dbP
2d7e0 61 74 68 29 3b 0a 20 20 66 6f 72 28 20 69 3d 30  ath);.  for( i=0
2d7f0 3b 20 69 3c 64 62 4c 65 6e 20 26 26 20 28 69 2b  ; i<dbLen && (i+
2d800 6c 65 6e 2b 37 29 3c 6d 61 78 4c 65 6e 3b 20 69  len+7)<maxLen; i
2d810 2b 2b 29 7b 0a 20 20 20 20 63 68 61 72 20 63 20  ++){.    char c 
2d820 3d 20 64 62 50 61 74 68 5b 69 5d 3b 0a 20 20 20  = dbPath[i];.   
2d830 20 6c 50 61 74 68 5b 69 2b 6c 65 6e 5d 20 3d 20   lPath[i+len] = 
2d840 28 63 3d 3d 27 2f 27 29 3f 27 5f 27 3a 63 3b 0a  (c=='/')?'_':c;.
2d850 20 20 7d 0a 20 20 6c 50 61 74 68 5b 69 2b 6c 65    }.  lPath[i+le
2d860 6e 5d 3d 27 5c 30 27 3b 0a 20 20 73 74 72 6c 63  n]='\0';.  strlc
2d870 61 74 28 6c 50 61 74 68 2c 20 22 3a 61 75 74 6f  at(lPath, ":auto
2d880 3a 22 2c 20 6d 61 78 4c 65 6e 29 3b 0a 20 20 4f  :", maxLen);.  O
2d890 53 54 52 41 43 45 33 28 22 47 45 54 4c 4f 43 4b  STRACE3("GETLOCK
2d8a0 50 41 54 48 20 20 70 72 6f 78 79 20 6c 6f 63 6b  PATH  proxy lock
2d8b0 20 70 61 74 68 3d 25 73 20 70 69 64 3d 25 64 5c   path=%s pid=%d\
2d8c0 6e 22 2c 20 6c 50 61 74 68 2c 20 67 65 74 70 69  n", lPath, getpi
2d8d0 64 28 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 53  d());.  return S
2d8e0 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 20  QLITE_OK;.}../* 
2d8f0 0a 20 2a 2a 20 43 72 65 61 74 65 73 20 74 68 65  . ** Creates the
2d900 20 6c 6f 63 6b 20 66 69 6c 65 20 61 6e 64 20 61   lock file and a
2d910 6e 79 20 6d 69 73 73 69 6e 67 20 64 69 72 65 63  ny missing direc
2d920 74 6f 72 69 65 73 20 69 6e 20 6c 6f 63 6b 50 61  tories in lockPa
2d930 74 68 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e  th. */.static in
2d940 74 20 70 72 6f 78 79 43 72 65 61 74 65 4c 6f 63  t proxyCreateLoc
2d950 6b 50 61 74 68 28 63 6f 6e 73 74 20 63 68 61 72  kPath(const char
2d960 20 2a 6c 6f 63 6b 50 61 74 68 29 7b 0a 20 20 69   *lockPath){.  i
2d970 6e 74 20 69 2c 20 6c 65 6e 3b 0a 20 20 63 68 61  nt i, len;.  cha
2d980 72 20 62 75 66 5b 4d 41 58 50 41 54 48 4c 45 4e  r buf[MAXPATHLEN
2d990 5d 3b 0a 20 20 69 6e 74 20 73 74 61 72 74 20 3d  ];.  int start =
2d9a0 20 30 3b 0a 20 20 0a 20 20 61 73 73 65 72 74 28   0;.  .  assert(
2d9b0 6c 6f 63 6b 50 61 74 68 21 3d 4e 55 4c 4c 29 3b  lockPath!=NULL);
2d9c0 0a 20 20 2f 2a 20 74 72 79 20 74 6f 20 63 72 65  .  /* try to cre
2d9d0 61 74 65 20 61 6c 6c 20 74 68 65 20 69 6e 74 65  ate all the inte
2d9e0 72 6d 65 64 69 61 74 65 20 64 69 72 65 63 74 6f  rmediate directo
2d9f0 72 69 65 73 20 2a 2f 0a 20 20 6c 65 6e 20 3d 20  ries */.  len = 
2da00 28 69 6e 74 29 73 74 72 6c 65 6e 28 6c 6f 63 6b  (int)strlen(lock
2da10 50 61 74 68 29 3b 0a 20 20 62 75 66 5b 30 5d 20  Path);.  buf[0] 
2da20 3d 20 6c 6f 63 6b 50 61 74 68 5b 30 5d 3b 0a 20  = lockPath[0];. 
2da30 20 66 6f 72 28 20 69 3d 31 3b 20 69 3c 6c 65 6e   for( i=1; i<len
2da40 3b 20 69 2b 2b 20 29 7b 0a 20 20 20 20 69 66 28  ; i++ ){.    if(
2da50 20 6c 6f 63 6b 50 61 74 68 5b 69 5d 20 3d 3d 20   lockPath[i] == 
2da60 27 2f 27 20 26 26 20 28 69 20 2d 20 73 74 61 72  '/' && (i - star
2da70 74 20 3e 20 30 29 20 29 7b 0a 20 20 20 20 20 20  t > 0) ){.      
2da80 2f 2a 20 6f 6e 6c 79 20 6d 6b 64 69 72 20 69 66  /* only mkdir if
2da90 20 6c 65 61 66 20 64 69 72 20 21 3d 20 22 2e 22   leaf dir != "."
2daa0 20 6f 72 20 22 2f 22 20 6f 72 20 22 2e 2e 22 20   or "/" or ".." 
2dab0 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 69 2d 73  */.      if( i-s
2dac0 74 61 72 74 3e 32 20 7c 7c 20 28 69 2d 73 74 61  tart>2 || (i-sta
2dad0 72 74 3d 3d 31 20 26 26 20 62 75 66 5b 73 74 61  rt==1 && buf[sta
2dae0 72 74 5d 20 21 3d 20 27 2e 27 20 26 26 20 62 75  rt] != '.' && bu
2daf0 66 5b 73 74 61 72 74 5d 20 21 3d 20 27 2f 27 29  f[start] != '/')
2db00 20 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 28 69   .         || (i
2db10 2d 73 74 61 72 74 3d 3d 32 20 26 26 20 62 75 66  -start==2 && buf
2db20 5b 73 74 61 72 74 5d 20 21 3d 20 27 2e 27 20 26  [start] != '.' &
2db30 26 20 62 75 66 5b 73 74 61 72 74 2b 31 5d 20 21  & buf[start+1] !
2db40 3d 20 27 2e 27 29 20 29 7b 0a 20 20 20 20 20 20  = '.') ){.      
2db50 20 20 62 75 66 5b 69 5d 3d 27 5c 30 27 3b 0a 20    buf[i]='\0';. 
2db60 20 20 20 20 20 20 20 69 66 28 20 6d 6b 64 69 72         if( mkdir
2db70 28 62 75 66 2c 20 53 51 4c 49 54 45 5f 44 45 46  (buf, SQLITE_DEF
2db80 41 55 4c 54 5f 50 52 4f 58 59 44 49 52 5f 50 45  AULT_PROXYDIR_PE
2db90 52 4d 49 53 53 49 4f 4e 53 29 20 29 7b 0a 20 20  RMISSIONS) ){.  
2dba0 20 20 20 20 20 20 20 20 69 6e 74 20 65 72 72 3d          int err=
2dbb0 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20 20 20 20  errno;.         
2dbc0 20 69 66 28 20 65 72 72 21 3d 45 45 58 49 53 54   if( err!=EEXIST
2dbd0 20 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20   ) {.           
2dbe0 20 4f 53 54 52 41 43 45 35 28 22 43 52 45 41 54   OSTRACE5("CREAT
2dbf0 45 4c 4f 43 4b 50 41 54 48 20 20 46 41 49 4c 45  ELOCKPATH  FAILE
2dc00 44 20 63 72 65 61 74 69 6e 67 20 25 73 2c 20 22  D creating %s, "
2dc10 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2dc20 20 20 20 20 20 20 22 27 25 73 27 20 70 72 6f 78        "'%s' prox
2dc30 79 20 6c 6f 63 6b 20 70 61 74 68 3d 25 73 20 70  y lock path=%s p
2dc40 69 64 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20  id=%d\n",.      
2dc50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62                 b
2dc60 75 66 2c 20 73 74 72 65 72 72 6f 72 28 65 72 72  uf, strerror(err
2dc70 29 2c 20 6c 6f 63 6b 50 61 74 68 2c 20 67 65 74  ), lockPath, get
2dc80 70 69 64 28 29 29 3b 0a 20 20 20 20 20 20 20 20  pid());.        
2dc90 20 20 20 20 72 65 74 75 72 6e 20 65 72 72 3b 0a      return err;.
2dca0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
2dcb0 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
2dcc0 20 20 20 20 73 74 61 72 74 3d 69 2b 31 3b 0a 20      start=i+1;. 
2dcd0 20 20 20 7d 0a 20 20 20 20 62 75 66 5b 69 5d 20     }.    buf[i] 
2dce0 3d 20 6c 6f 63 6b 50 61 74 68 5b 69 5d 3b 0a 20  = lockPath[i];. 
2dcf0 20 7d 0a 20 20 4f 53 54 52 41 43 45 33 28 22 43   }.  OSTRACE3("C
2dd00 52 45 41 54 45 4c 4f 43 4b 50 41 54 48 20 20 70  REATELOCKPATH  p
2dd10 72 6f 78 79 20 6c 6f 63 6b 20 70 61 74 68 3d 25  roxy lock path=%
2dd20 73 20 70 69 64 3d 25 64 5c 6e 22 2c 20 6c 6f 63  s pid=%d\n", loc
2dd30 6b 50 61 74 68 2c 20 67 65 74 70 69 64 28 29 29  kPath, getpid())
2dd40 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  ;.  return 0;.}.
2dd50 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61 20  ./*.** Create a 
2dd60 6e 65 77 20 56 46 53 20 66 69 6c 65 20 64 65 73  new VFS file des
2dd70 63 72 69 70 74 6f 72 20 28 73 74 6f 72 65 64 20  criptor (stored 
2dd80 69 6e 20 6d 65 6d 6f 72 79 20 6f 62 74 61 69 6e  in memory obtain
2dd90 65 64 20 66 72 6f 6d 0a 2a 2a 20 73 71 6c 69 74  ed from.** sqlit
2dda0 65 33 5f 6d 61 6c 6c 6f 63 29 20 61 6e 64 20 6f  e3_malloc) and o
2ddb0 70 65 6e 20 74 68 65 20 66 69 6c 65 20 6e 61 6d  pen the file nam
2ddc0 65 64 20 22 70 61 74 68 22 20 69 6e 20 74 68 65  ed "path" in the
2ddd0 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
2dde0 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 61 6c 6c  ..**.** The call
2ddf0 65 72 20 69 73 20 72 65 73 70 6f 6e 73 69 62 6c  er is responsibl
2de00 65 20 6e 6f 74 20 6f 6e 6c 79 20 66 6f 72 20 63  e not only for c
2de10 6c 6f 73 69 6e 67 20 74 68 65 20 66 69 6c 65 20  losing the file 
2de20 64 65 73 63 72 69 70 74 6f 72 0a 2a 2a 20 62 75  descriptor.** bu
2de30 74 20 61 6c 73 6f 20 66 6f 72 20 66 72 65 65 69  t also for freei
2de40 6e 67 20 74 68 65 20 6d 65 6d 6f 72 79 20 61 73  ng the memory as
2de50 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68  sociated with th
2de60 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  e file descripto
2de70 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  r..*/.static int
2de80 20 70 72 6f 78 79 43 72 65 61 74 65 55 6e 69 78   proxyCreateUnix
2de90 46 69 6c 65 28 0a 20 20 20 20 63 6f 6e 73 74 20  File(.    const 
2dea0 63 68 61 72 20 2a 70 61 74 68 2c 20 20 20 20 20  char *path,     
2deb0 20 20 20 2f 2a 20 70 61 74 68 20 66 6f 72 20 74     /* path for t
2dec0 68 65 20 6e 65 77 20 75 6e 69 78 46 69 6c 65 20  he new unixFile 
2ded0 2a 2f 0a 20 20 20 20 75 6e 69 78 46 69 6c 65 20  */.    unixFile 
2dee0 2a 2a 70 70 46 69 6c 65 2c 20 20 20 20 20 20 20  **ppFile,       
2def0 2f 2a 20 75 6e 69 78 46 69 6c 65 20 63 72 65 61  /* unixFile crea
2df00 74 65 64 20 61 6e 64 20 72 65 74 75 72 6e 65 64  ted and returned
2df10 20 62 79 20 72 65 66 20 2a 2f 0a 20 20 20 20 69   by ref */.    i
2df20 6e 74 20 69 73 6c 6f 63 6b 66 69 6c 65 20 20 20  nt islockfile   
2df30 20 20 20 20 20 20 20 20 2f 2a 20 69 66 20 6e 6f          /* if no
2df40 6e 20 7a 65 72 6f 20 6d 69 73 73 69 6e 67 20 64  n zero missing d
2df50 69 72 73 20 77 69 6c 6c 20 62 65 20 63 72 65 61  irs will be crea
2df60 74 65 64 20 2a 2f 0a 29 20 7b 0a 20 20 69 6e 74  ted */.) {.  int
2df70 20 66 64 20 3d 20 2d 31 3b 0a 20 20 69 6e 74 20   fd = -1;.  int 
2df80 64 69 72 66 64 20 3d 20 2d 31 3b 0a 20 20 75 6e  dirfd = -1;.  un
2df90 69 78 46 69 6c 65 20 2a 70 4e 65 77 3b 0a 20 20  ixFile *pNew;.  
2dfa0 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
2dfb0 4f 4b 3b 0a 20 20 69 6e 74 20 6f 70 65 6e 46 6c  OK;.  int openFl
2dfc0 61 67 73 20 3d 20 4f 5f 52 44 57 52 20 7c 20 4f  ags = O_RDWR | O
2dfd0 5f 43 52 45 41 54 3b 0a 20 20 73 71 6c 69 74 65  _CREAT;.  sqlite
2dfe0 33 5f 76 66 73 20 64 75 6d 6d 79 56 66 73 3b 0a  3_vfs dummyVfs;.
2dff0 20 20 69 6e 74 20 74 65 72 72 6e 6f 20 3d 20 30    int terrno = 0
2e000 3b 0a 20 20 55 6e 69 78 55 6e 75 73 65 64 46 64  ;.  UnixUnusedFd
2e010 20 2a 70 55 6e 75 73 65 64 20 3d 20 4e 55 4c 4c   *pUnused = NULL
2e020 3b 0a 0a 20 20 2f 2a 20 31 2e 20 66 69 72 73 74  ;..  /* 1. first
2e030 20 74 72 79 20 74 6f 20 6f 70 65 6e 2f 63 72 65   try to open/cre
2e040 61 74 65 20 74 68 65 20 66 69 6c 65 0a 20 20 2a  ate the file.  *
2e050 2a 20 32 2e 20 69 66 20 74 68 61 74 20 66 61 69  * 2. if that fai
2e060 6c 73 2c 20 61 6e 64 20 74 68 69 73 20 69 73 20  ls, and this is 
2e070 61 20 6c 6f 63 6b 20 66 69 6c 65 20 28 6e 6f 74  a lock file (not
2e080 2d 63 6f 6e 63 68 29 2c 20 74 72 79 20 63 72 65  -conch), try cre
2e090 61 74 69 6e 67 0a 20 20 2a 2a 20 74 68 65 20 70  ating.  ** the p
2e0a0 61 72 65 6e 74 20 64 69 72 65 63 74 6f 72 69 65  arent directorie
2e0b0 73 20 61 6e 64 20 74 68 65 6e 20 74 72 79 20 61  s and then try a
2e0c0 67 61 69 6e 2e 0a 20 20 2a 2a 20 33 2e 20 69 66  gain..  ** 3. if
2e0d0 20 74 68 61 74 20 66 61 69 6c 73 2c 20 74 72 79   that fails, try
2e0e0 20 74 6f 20 6f 70 65 6e 20 74 68 65 20 66 69 6c   to open the fil
2e0f0 65 20 72 65 61 64 2d 6f 6e 6c 79 0a 20 20 2a 2a  e read-only.  **
2e100 20 6f 74 68 65 72 77 69 73 65 20 72 65 74 75 72   otherwise retur
2e110 6e 20 42 55 53 59 20 28 69 66 20 6c 6f 63 6b 20  n BUSY (if lock 
2e120 66 69 6c 65 29 20 6f 72 20 43 41 4e 54 4f 50 45  file) or CANTOPE
2e130 4e 20 66 6f 72 20 74 68 65 20 63 6f 6e 63 68 20  N for the conch 
2e140 66 69 6c 65 0a 20 20 2a 2f 0a 20 20 70 55 6e 75  file.  */.  pUnu
2e150 73 65 64 20 3d 20 66 69 6e 64 52 65 75 73 61 62  sed = findReusab
2e160 6c 65 46 64 28 70 61 74 68 2c 20 6f 70 65 6e 46  leFd(path, openF
2e170 6c 61 67 73 29 3b 0a 20 20 69 66 28 20 70 55 6e  lags);.  if( pUn
2e180 75 73 65 64 20 29 7b 0a 20 20 20 20 66 64 20 3d  used ){.    fd =
2e190 20 70 55 6e 75 73 65 64 2d 3e 66 64 3b 0a 20 20   pUnused->fd;.  
2e1a0 7d 65 6c 73 65 7b 0a 20 20 20 20 70 55 6e 75 73  }else{.    pUnus
2e1b0 65 64 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c  ed = sqlite3_mal
2e1c0 6c 6f 63 28 73 69 7a 65 6f 66 28 2a 70 55 6e 75  loc(sizeof(*pUnu
2e1d0 73 65 64 29 29 3b 0a 20 20 20 20 69 66 28 20 21  sed));.    if( !
2e1e0 70 55 6e 75 73 65 64 20 29 7b 0a 20 20 20 20 20  pUnused ){.     
2e1f0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
2e200 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  OMEM;.    }.  }.
2e210 20 20 69 66 28 20 66 64 3c 30 20 29 7b 0a 20 20    if( fd<0 ){.  
2e220 20 20 66 64 20 3d 20 6f 70 65 6e 28 70 61 74 68    fd = open(path
2e230 2c 20 6f 70 65 6e 46 6c 61 67 73 2c 20 53 51 4c  , openFlags, SQL
2e240 49 54 45 5f 44 45 46 41 55 4c 54 5f 46 49 4c 45  ITE_DEFAULT_FILE
2e250 5f 50 45 52 4d 49 53 53 49 4f 4e 53 29 3b 0a 20  _PERMISSIONS);. 
2e260 20 20 20 74 65 72 72 6e 6f 20 3d 20 65 72 72 6e     terrno = errn
2e270 6f 3b 0a 20 20 20 20 69 66 28 20 66 64 3c 30 20  o;.    if( fd<0 
2e280 26 26 20 65 72 72 6e 6f 3d 3d 45 4e 4f 45 4e 54  && errno==ENOENT
2e290 20 26 26 20 69 73 6c 6f 63 6b 66 69 6c 65 20 29   && islockfile )
2e2a0 7b 0a 20 20 20 20 20 20 69 66 28 20 70 72 6f 78  {.      if( prox
2e2b0 79 43 72 65 61 74 65 4c 6f 63 6b 50 61 74 68 28  yCreateLockPath(
2e2c0 70 61 74 68 29 20 3d 3d 20 53 51 4c 49 54 45 5f  path) == SQLITE_
2e2d0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 66 64  OK ){.        fd
2e2e0 20 3d 20 6f 70 65 6e 28 70 61 74 68 2c 20 6f 70   = open(path, op
2e2f0 65 6e 46 6c 61 67 73 2c 20 53 51 4c 49 54 45 5f  enFlags, SQLITE_
2e300 44 45 46 41 55 4c 54 5f 46 49 4c 45 5f 50 45 52  DEFAULT_FILE_PER
2e310 4d 49 53 53 49 4f 4e 53 29 3b 0a 20 20 20 20 20  MISSIONS);.     
2e320 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69   }.    }.  }.  i
2e330 66 28 20 66 64 3c 30 20 29 7b 0a 20 20 20 20 6f  f( fd<0 ){.    o
2e340 70 65 6e 46 6c 61 67 73 20 3d 20 4f 5f 52 44 4f  penFlags = O_RDO
2e350 4e 4c 59 3b 0a 20 20 20 20 66 64 20 3d 20 6f 70  NLY;.    fd = op
2e360 65 6e 28 70 61 74 68 2c 20 6f 70 65 6e 46 6c 61  en(path, openFla
2e370 67 73 2c 20 53 51 4c 49 54 45 5f 44 45 46 41 55  gs, SQLITE_DEFAU
2e380 4c 54 5f 46 49 4c 45 5f 50 45 52 4d 49 53 53 49  LT_FILE_PERMISSI
2e390 4f 4e 53 29 3b 0a 20 20 20 20 74 65 72 72 6e 6f  ONS);.    terrno
2e3a0 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 7d 0a 20 20   = errno;.  }.  
2e3b0 69 66 28 20 66 64 3c 30 20 29 7b 0a 20 20 20 20  if( fd<0 ){.    
2e3c0 69 66 28 20 69 73 6c 6f 63 6b 66 69 6c 65 20 29  if( islockfile )
2e3d0 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  {.      return S
2e3e0 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20  QLITE_BUSY;.    
2e3f0 7d 0a 20 20 20 20 73 77 69 74 63 68 20 28 74 65  }.    switch (te
2e400 72 72 6e 6f 29 20 7b 0a 20 20 20 20 20 20 63 61  rrno) {.      ca
2e410 73 65 20 45 41 43 43 45 53 3a 0a 20 20 20 20 20  se EACCES:.     
2e420 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
2e430 5f 50 45 52 4d 3b 0a 20 20 20 20 20 20 63 61 73  _PERM;.      cas
2e440 65 20 45 49 4f 3a 20 0a 20 20 20 20 20 20 20 20  e EIO: .        
2e450 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f  return SQLITE_IO
2e460 45 52 52 5f 4c 4f 43 4b 3b 20 2f 2a 20 65 76 65  ERR_LOCK; /* eve
2e470 6e 20 74 68 6f 75 67 68 20 69 74 20 69 73 20 74  n though it is t
2e480 68 65 20 63 6f 6e 63 68 20 2a 2f 0a 20 20 20 20  he conch */.    
2e490 20 20 64 65 66 61 75 6c 74 3a 0a 20 20 20 20 20    default:.     
2e4a0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
2e4b0 5f 43 41 4e 54 4f 50 45 4e 5f 42 4b 50 54 3b 0a  _CANTOPEN_BKPT;.
2e4c0 20 20 20 20 7d 0a 20 20 7d 0a 20 20 0a 20 20 70      }.  }.  .  p
2e4d0 4e 65 77 20 3d 20 28 75 6e 69 78 46 69 6c 65 20  New = (unixFile 
2e4e0 2a 29 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63  *)sqlite3_malloc
2e4f0 28 73 69 7a 65 6f 66 28 2a 70 4e 65 77 29 29 3b  (sizeof(*pNew));
2e500 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d 4e 55 4c  .  if( pNew==NUL
2e510 4c 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51  L ){.    rc = SQ
2e520 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
2e530 67 6f 74 6f 20 65 6e 64 5f 63 72 65 61 74 65 5f  goto end_create_
2e540 70 72 6f 78 79 3b 0a 20 20 7d 0a 20 20 6d 65 6d  proxy;.  }.  mem
2e550 73 65 74 28 70 4e 65 77 2c 20 30 2c 20 73 69 7a  set(pNew, 0, siz
2e560 65 6f 66 28 75 6e 69 78 46 69 6c 65 29 29 3b 0a  eof(unixFile));.
2e570 20 20 70 4e 65 77 2d 3e 6f 70 65 6e 46 6c 61 67    pNew->openFlag
2e580 73 20 3d 20 6f 70 65 6e 46 6c 61 67 73 3b 0a 20  s = openFlags;. 
2e590 20 64 75 6d 6d 79 56 66 73 2e 70 41 70 70 44 61   dummyVfs.pAppDa
2e5a0 74 61 20 3d 20 28 76 6f 69 64 2a 29 26 61 75 74  ta = (void*)&aut
2e5b0 6f 6c 6f 63 6b 49 6f 46 69 6e 64 65 72 3b 0a 20  olockIoFinder;. 
2e5c0 20 70 55 6e 75 73 65 64 2d 3e 66 64 20 3d 20 66   pUnused->fd = f
2e5d0 64 3b 0a 20 20 70 55 6e 75 73 65 64 2d 3e 66 6c  d;.  pUnused->fl
2e5e0 61 67 73 20 3d 20 6f 70 65 6e 46 6c 61 67 73 3b  ags = openFlags;
2e5f0 0a 20 20 70 4e 65 77 2d 3e 70 55 6e 75 73 65 64  .  pNew->pUnused
2e600 20 3d 20 70 55 6e 75 73 65 64 3b 0a 20 20 0a 20   = pUnused;.  . 
2e610 20 72 63 20 3d 20 66 69 6c 6c 49 6e 55 6e 69 78   rc = fillInUnix
2e620 46 69 6c 65 28 26 64 75 6d 6d 79 56 66 73 2c 20  File(&dummyVfs, 
2e630 66 64 2c 20 64 69 72 66 64 2c 20 28 73 71 6c 69  fd, dirfd, (sqli
2e640 74 65 33 5f 66 69 6c 65 2a 29 70 4e 65 77 2c 20  te3_file*)pNew, 
2e650 70 61 74 68 2c 20 30 2c 20 30 29 3b 0a 20 20 69  path, 0, 0);.  i
2e660 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
2e670 20 29 7b 0a 20 20 20 20 2a 70 70 46 69 6c 65 20   ){.    *ppFile 
2e680 3d 20 70 4e 65 77 3b 0a 20 20 20 20 72 65 74 75  = pNew;.    retu
2e690 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
2e6a0 7d 0a 65 6e 64 5f 63 72 65 61 74 65 5f 70 72 6f  }.end_create_pro
2e6b0 78 79 3a 20 20 20 20 0a 20 20 63 6c 6f 73 65 28  xy:    .  close(
2e6c0 66 64 29 3b 20 2f 2a 20 73 69 6c 65 6e 74 6c 79  fd); /* silently
2e6d0 20 6c 65 61 6b 20 66 64 20 69 66 20 65 72 72 6f   leak fd if erro
2e6e0 72 2c 20 77 65 27 72 65 20 61 6c 72 65 61 64 79  r, we're already
2e6f0 20 69 6e 20 65 72 72 6f 72 20 2a 2f 0a 20 20 73   in error */.  s
2e700 71 6c 69 74 65 33 5f 66 72 65 65 28 70 4e 65 77  qlite3_free(pNew
2e710 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65  );.  sqlite3_fre
2e720 65 28 70 55 6e 75 73 65 64 29 3b 0a 20 20 72 65  e(pUnused);.  re
2e730 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 64  turn rc;.}..#ifd
2e740 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 2f  ef SQLITE_TEST./
2e750 2a 20 73 69 6d 75 6c 61 74 65 20 6d 75 6c 74 69  * simulate multi
2e760 70 6c 65 20 68 6f 73 74 73 20 62 79 20 63 72 65  ple hosts by cre
2e770 61 74 69 6e 67 20 75 6e 69 71 75 65 20 68 6f 73  ating unique hos
2e780 74 69 64 20 66 69 6c 65 20 70 61 74 68 73 20 2a  tid file paths *
2e790 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 68 6f  /.int sqlite3_ho
2e7a0 73 74 69 64 5f 6e 75 6d 20 3d 20 30 3b 0a 23 65  stid_num = 0;.#e
2e7b0 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 50 52  ndif..#define PR
2e7c0 4f 58 59 5f 48 4f 53 54 49 44 4c 45 4e 20 20 20  OXY_HOSTIDLEN   
2e7d0 20 31 36 20 20 2f 2a 20 63 6f 6e 63 68 20 66 69   16  /* conch fi
2e7e0 6c 65 20 68 6f 73 74 20 69 64 20 6c 65 6e 67 74  le host id lengt
2e7f0 68 20 2a 2f 0a 0a 2f 2a 20 67 65 74 20 74 68 65  h */../* get the
2e800 20 68 6f 73 74 20 49 44 20 76 69 61 20 67 65 74   host ID via get
2e810 68 6f 73 74 75 75 69 64 28 29 2c 20 70 48 6f 73  hostuuid(), pHos
2e820 74 49 44 20 6d 75 73 74 20 70 6f 69 6e 74 20 74  tID must point t
2e830 6f 20 50 52 4f 58 59 5f 48 4f 53 54 49 44 4c 45  o PROXY_HOSTIDLE
2e840 4e 20 0a 2a 2a 20 62 79 74 65 73 20 6f 66 20 77  N .** bytes of w
2e850 72 69 74 61 62 6c 65 20 6d 65 6d 6f 72 79 2e 0a  ritable memory..
2e860 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72  */.static int pr
2e870 6f 78 79 47 65 74 48 6f 73 74 49 44 28 75 6e 73  oxyGetHostID(uns
2e880 69 67 6e 65 64 20 63 68 61 72 20 2a 70 48 6f 73  igned char *pHos
2e890 74 49 44 2c 20 69 6e 74 20 2a 70 45 72 72 6f 72  tID, int *pError
2e8a0 29 7b 0a 20 20 73 74 72 75 63 74 20 74 69 6d 65  ){.  struct time
2e8b0 73 70 65 63 20 74 69 6d 65 6f 75 74 20 3d 20 7b  spec timeout = {
2e8c0 31 2c 20 30 7d 3b 20 2f 2a 20 31 20 73 65 63 20  1, 0}; /* 1 sec 
2e8d0 74 69 6d 65 6f 75 74 20 2a 2f 0a 20 20 0a 20 20  timeout */.  .  
2e8e0 61 73 73 65 72 74 28 50 52 4f 58 59 5f 48 4f 53  assert(PROXY_HOS
2e8f0 54 49 44 4c 45 4e 20 3d 3d 20 73 69 7a 65 6f 66  TIDLEN == sizeof
2e900 28 75 75 69 64 5f 74 29 29 3b 0a 20 20 6d 65 6d  (uuid_t));.  mem
2e910 73 65 74 28 70 48 6f 73 74 49 44 2c 20 30 2c 20  set(pHostID, 0, 
2e920 50 52 4f 58 59 5f 48 4f 53 54 49 44 4c 45 4e 29  PROXY_HOSTIDLEN)
2e930 3b 0a 20 20 69 66 28 20 67 65 74 68 6f 73 74 75  ;.  if( gethostu
2e940 75 69 64 28 70 48 6f 73 74 49 44 2c 20 26 74 69  uid(pHostID, &ti
2e950 6d 65 6f 75 74 29 20 29 7b 0a 20 20 20 20 69 6e  meout) ){.    in
2e960 74 20 65 72 72 20 3d 20 65 72 72 6e 6f 3b 0a 20  t err = errno;. 
2e970 20 20 20 69 66 28 20 70 45 72 72 6f 72 20 29 7b     if( pError ){
2e980 0a 20 20 20 20 20 20 2a 70 45 72 72 6f 72 20 3d  .      *pError =
2e990 20 65 72 72 3b 0a 20 20 20 20 7d 0a 20 20 20 20   err;.    }.    
2e9a0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f  return SQLITE_IO
2e9b0 45 52 52 3b 0a 20 20 7d 0a 23 69 66 64 65 66 20  ERR;.  }.#ifdef 
2e9c0 53 51 4c 49 54 45 5f 54 45 53 54 0a 20 20 2f 2a  SQLITE_TEST.  /*
2e9d0 20 73 69 6d 75 6c 61 74 65 20 6d 75 6c 74 69 70   simulate multip
2e9e0 6c 65 20 68 6f 73 74 73 20 62 79 20 63 72 65 61  le hosts by crea
2e9f0 74 69 6e 67 20 75 6e 69 71 75 65 20 68 6f 73 74  ting unique host
2ea00 69 64 20 66 69 6c 65 20 70 61 74 68 73 20 2a 2f  id file paths */
2ea10 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 68  .  if( sqlite3_h
2ea20 6f 73 74 69 64 5f 6e 75 6d 20 21 3d 20 30 29 7b  ostid_num != 0){
2ea30 0a 20 20 20 20 70 48 6f 73 74 49 44 5b 30 5d 20  .    pHostID[0] 
2ea40 3d 20 28 63 68 61 72 29 28 70 48 6f 73 74 49 44  = (char)(pHostID
2ea50 5b 30 5d 20 2b 20 28 63 68 61 72 29 28 73 71 6c  [0] + (char)(sql
2ea60 69 74 65 33 5f 68 6f 73 74 69 64 5f 6e 75 6d 20  ite3_hostid_num 
2ea70 26 20 30 78 46 46 29 29 3b 0a 20 20 7d 0a 23 65  & 0xFF));.  }.#e
2ea80 6e 64 69 66 0a 20 20 0a 20 20 72 65 74 75 72 6e  ndif.  .  return
2ea90 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
2eaa0 2a 20 54 68 65 20 63 6f 6e 63 68 20 66 69 6c 65  * The conch file
2eab0 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 68 65   contains the he
2eac0 61 64 65 72 2c 20 68 6f 73 74 20 69 64 20 61 6e  ader, host id an
2ead0 64 20 6c 6f 63 6b 20 66 69 6c 65 20 70 61 74 68  d lock file path
2eae0 0a 20 2a 2f 0a 23 64 65 66 69 6e 65 20 50 52 4f  . */.#define PRO
2eaf0 58 59 5f 43 4f 4e 43 48 56 45 52 53 49 4f 4e 20  XY_CONCHVERSION 
2eb00 32 20 20 20 2f 2a 20 31 2d 62 79 74 65 20 68 65  2   /* 1-byte he
2eb10 61 64 65 72 2c 20 31 36 2d 62 79 74 65 20 68 6f  ader, 16-byte ho
2eb20 73 74 20 69 64 2c 20 70 61 74 68 20 2a 2f 0a 23  st id, path */.#
2eb30 64 65 66 69 6e 65 20 50 52 4f 58 59 5f 48 45 41  define PROXY_HEA
2eb40 44 45 52 4c 45 4e 20 20 20 20 31 20 20 20 2f 2a  DERLEN    1   /*
2eb50 20 63 6f 6e 63 68 20 66 69 6c 65 20 68 65 61 64   conch file head
2eb60 65 72 20 6c 65 6e 67 74 68 20 2a 2f 0a 23 64 65  er length */.#de
2eb70 66 69 6e 65 20 50 52 4f 58 59 5f 50 41 54 48 49  fine PROXY_PATHI
2eb80 4e 44 45 58 20 20 20 20 28 50 52 4f 58 59 5f 48  NDEX    (PROXY_H
2eb90 45 41 44 45 52 4c 45 4e 2b 50 52 4f 58 59 5f 48  EADERLEN+PROXY_H
2eba0 4f 53 54 49 44 4c 45 4e 29 0a 23 64 65 66 69 6e  OSTIDLEN).#defin
2ebb0 65 20 50 52 4f 58 59 5f 4d 41 58 43 4f 4e 43 48  e PROXY_MAXCONCH
2ebc0 4c 45 4e 20 20 28 50 52 4f 58 59 5f 48 45 41 44  LEN  (PROXY_HEAD
2ebd0 45 52 4c 45 4e 2b 50 52 4f 58 59 5f 48 4f 53 54  ERLEN+PROXY_HOST
2ebe0 49 44 4c 45 4e 2b 4d 41 58 50 41 54 48 4c 45 4e  IDLEN+MAXPATHLEN
2ebf0 29 0a 0a 2f 2a 20 0a 2a 2a 20 54 61 6b 65 73 20  )../* .** Takes 
2ec00 61 6e 20 6f 70 65 6e 20 63 6f 6e 63 68 20 66 69  an open conch fi
2ec10 6c 65 2c 20 63 6f 70 69 65 73 20 74 68 65 20 63  le, copies the c
2ec20 6f 6e 74 65 6e 74 73 20 74 6f 20 61 20 6e 65 77  ontents to a new
2ec30 20 70 61 74 68 20 61 6e 64 20 74 68 65 6e 20 6d   path and then m
2ec40 6f 76 65 73 20 0a 2a 2a 20 69 74 20 62 61 63 6b  oves .** it back
2ec50 2e 20 20 54 68 65 20 6e 65 77 6c 79 20 63 72 65  .  The newly cre
2ec60 61 74 65 64 20 66 69 6c 65 27 73 20 66 69 6c 65  ated file's file
2ec70 20 64 65 73 63 72 69 70 74 6f 72 20 69 73 20 61   descriptor is a
2ec80 73 73 69 67 6e 65 64 20 74 6f 20 74 68 65 0a 2a  ssigned to the.*
2ec90 2a 20 63 6f 6e 63 68 20 66 69 6c 65 20 73 74 72  * conch file str
2eca0 75 63 74 75 72 65 20 61 6e 64 20 66 69 6e 61 6c  ucture and final
2ecb0 6c 79 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20  ly the original 
2ecc0 63 6f 6e 63 68 20 66 69 6c 65 20 64 65 73 63 72  conch file descr
2ecd0 69 70 74 6f 72 20 69 73 20 0a 2a 2a 20 63 6c 6f  iptor is .** clo
2ece0 73 65 64 2e 20 20 52 65 74 75 72 6e 73 20 7a 65  sed.  Returns ze
2ecf0 72 6f 20 69 66 20 73 75 63 63 65 73 73 66 75 6c  ro if successful
2ed00 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
2ed10 70 72 6f 78 79 42 72 65 61 6b 43 6f 6e 63 68 4c  proxyBreakConchL
2ed20 6f 63 6b 28 75 6e 69 78 46 69 6c 65 20 2a 70 46  ock(unixFile *pF
2ed30 69 6c 65 2c 20 75 75 69 64 5f 74 20 6d 79 48 6f  ile, uuid_t myHo
2ed40 73 74 49 44 29 7b 0a 20 20 70 72 6f 78 79 4c 6f  stID){.  proxyLo
2ed50 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 70 43  ckingContext *pC
2ed60 74 78 20 3d 20 28 70 72 6f 78 79 4c 6f 63 6b 69  tx = (proxyLocki
2ed70 6e 67 43 6f 6e 74 65 78 74 20 2a 29 70 46 69 6c  ngContext *)pFil
2ed80 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78  e->lockingContex
2ed90 74 3b 20 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a  t; .  unixFile *
2eda0 63 6f 6e 63 68 46 69 6c 65 20 3d 20 70 43 74 78  conchFile = pCtx
2edb0 2d 3e 63 6f 6e 63 68 46 69 6c 65 3b 0a 20 20 63  ->conchFile;.  c
2edc0 68 61 72 20 74 50 61 74 68 5b 4d 41 58 50 41 54  har tPath[MAXPAT
2edd0 48 4c 45 4e 5d 3b 0a 20 20 63 68 61 72 20 62 75  HLEN];.  char bu
2ede0 66 5b 50 52 4f 58 59 5f 4d 41 58 43 4f 4e 43 48  f[PROXY_MAXCONCH
2edf0 4c 45 4e 5d 3b 0a 20 20 63 68 61 72 20 2a 63 50  LEN];.  char *cP
2ee00 61 74 68 20 3d 20 70 43 74 78 2d 3e 63 6f 6e 63  ath = pCtx->conc
2ee10 68 46 69 6c 65 50 61 74 68 3b 0a 20 20 73 69 7a  hFilePath;.  siz
2ee20 65 5f 74 20 72 65 61 64 4c 65 6e 20 3d 20 30 3b  e_t readLen = 0;
2ee30 0a 20 20 73 69 7a 65 5f 74 20 70 61 74 68 4c 65  .  size_t pathLe
2ee40 6e 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 65 72  n = 0;.  char er
2ee50 72 6d 73 67 5b 36 34 5d 20 3d 20 22 22 3b 0a 20  rmsg[64] = "";. 
2ee60 20 69 6e 74 20 66 64 20 3d 20 2d 31 3b 0a 20 20   int fd = -1;.  
2ee70 69 6e 74 20 72 63 20 3d 20 2d 31 3b 0a 0a 20 20  int rc = -1;..  
2ee80 2f 2a 20 63 72 65 61 74 65 20 61 20 6e 65 77 20  /* create a new 
2ee90 70 61 74 68 20 62 79 20 72 65 70 6c 61 63 65 20  path by replace 
2eea0 74 68 65 20 74 72 61 69 6c 69 6e 67 20 27 2d 63  the trailing '-c
2eeb0 6f 6e 63 68 27 20 77 69 74 68 20 27 2d 62 72 65  onch' with '-bre
2eec0 61 6b 27 20 2a 2f 0a 20 20 70 61 74 68 4c 65 6e  ak' */.  pathLen
2eed0 20 3d 20 73 74 72 6c 63 70 79 28 74 50 61 74 68   = strlcpy(tPath
2eee0 2c 20 63 50 61 74 68 2c 20 4d 41 58 50 41 54 48  , cPath, MAXPATH
2eef0 4c 45 4e 29 3b 0a 20 20 69 66 28 20 70 61 74 68  LEN);.  if( path
2ef00 4c 65 6e 3e 4d 41 58 50 41 54 48 4c 45 4e 20 7c  Len>MAXPATHLEN |
2ef10 7c 20 70 61 74 68 4c 65 6e 3c 36 20 7c 7c 20 0a  | pathLen<6 || .
2ef20 20 20 20 20 20 28 73 74 72 6c 63 70 79 28 26 74       (strlcpy(&t
2ef30 50 61 74 68 5b 70 61 74 68 4c 65 6e 2d 35 5d 2c  Path[pathLen-5],
2ef40 20 22 62 72 65 61 6b 22 2c 20 36 29 20 21 3d 20   "break", 6) != 
2ef50 35 29 20 29 7b 0a 20 20 20 20 73 70 72 69 6e 74  5) ){.    sprint
2ef60 66 28 65 72 72 6d 73 67 2c 20 22 70 61 74 68 20  f(errmsg, "path 
2ef70 65 72 72 6f 72 20 28 6c 65 6e 20 25 64 29 22 2c  error (len %d)",
2ef80 20 28 69 6e 74 29 70 61 74 68 4c 65 6e 29 3b 0a   (int)pathLen);.
2ef90 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 62 72 65      goto end_bre
2efa0 61 6b 6c 6f 63 6b 3b 0a 20 20 7d 0a 20 20 2f 2a  aklock;.  }.  /*
2efb0 20 72 65 61 64 20 74 68 65 20 63 6f 6e 63 68 20   read the conch 
2efc0 63 6f 6e 74 65 6e 74 20 2a 2f 0a 20 20 72 65 61  content */.  rea
2efd0 64 4c 65 6e 20 3d 20 70 72 65 61 64 28 63 6f 6e  dLen = pread(con
2efe0 63 68 46 69 6c 65 2d 3e 68 2c 20 62 75 66 2c 20  chFile->h, buf, 
2eff0 50 52 4f 58 59 5f 4d 41 58 43 4f 4e 43 48 4c 45  PROXY_MAXCONCHLE
2f000 4e 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 65 61  N, 0);.  if( rea
2f010 64 4c 65 6e 3c 50 52 4f 58 59 5f 50 41 54 48 49  dLen<PROXY_PATHI
2f020 4e 44 45 58 20 29 7b 0a 20 20 20 20 73 70 72 69  NDEX ){.    spri
2f030 6e 74 66 28 65 72 72 6d 73 67 2c 20 22 72 65 61  ntf(errmsg, "rea
2f040 64 20 65 72 72 6f 72 20 28 6c 65 6e 20 25 64 29  d error (len %d)
2f050 22 2c 20 28 69 6e 74 29 72 65 61 64 4c 65 6e 29  ", (int)readLen)
2f060 3b 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 62  ;.    goto end_b
2f070 72 65 61 6b 6c 6f 63 6b 3b 0a 20 20 7d 0a 20 20  reaklock;.  }.  
2f080 2f 2a 20 77 72 69 74 65 20 69 74 20 6f 75 74 20  /* write it out 
2f090 74 6f 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79  to the temporary
2f0a0 20 62 72 65 61 6b 20 66 69 6c 65 20 2a 2f 0a 20   break file */. 
2f0b0 20 66 64 20 3d 20 6f 70 65 6e 28 74 50 61 74 68   fd = open(tPath
2f0c0 2c 20 28 4f 5f 52 44 57 52 7c 4f 5f 43 52 45 41  , (O_RDWR|O_CREA
2f0d0 54 7c 4f 5f 45 58 43 4c 29 2c 20 53 51 4c 49 54  T|O_EXCL), SQLIT
2f0e0 45 5f 44 45 46 41 55 4c 54 5f 46 49 4c 45 5f 50  E_DEFAULT_FILE_P
2f0f0 45 52 4d 49 53 53 49 4f 4e 53 29 3b 0a 20 20 69  ERMISSIONS);.  i
2f100 66 28 20 66 64 3c 30 20 29 7b 0a 20 20 20 20 73  f( fd<0 ){.    s
2f110 70 72 69 6e 74 66 28 65 72 72 6d 73 67 2c 20 22  printf(errmsg, "
2f120 63 72 65 61 74 65 20 66 61 69 6c 65 64 20 28 25  create failed (%
2f130 64 29 22 2c 20 65 72 72 6e 6f 29 3b 0a 20 20 20  d)", errno);.   
2f140 20 67 6f 74 6f 20 65 6e 64 5f 62 72 65 61 6b 6c   goto end_breakl
2f150 6f 63 6b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  ock;.  }.  if( p
2f160 77 72 69 74 65 28 66 64 2c 20 62 75 66 2c 20 72  write(fd, buf, r
2f170 65 61 64 4c 65 6e 2c 20 30 29 20 21 3d 20 72 65  eadLen, 0) != re
2f180 61 64 4c 65 6e 20 29 7b 0a 20 20 20 20 73 70 72  adLen ){.    spr
2f190 69 6e 74 66 28 65 72 72 6d 73 67 2c 20 22 77 72  intf(errmsg, "wr
2f1a0 69 74 65 20 66 61 69 6c 65 64 20 28 25 64 29 22  ite failed (%d)"
2f1b0 2c 20 65 72 72 6e 6f 29 3b 0a 20 20 20 20 67 6f  , errno);.    go
2f1c0 74 6f 20 65 6e 64 5f 62 72 65 61 6b 6c 6f 63 6b  to end_breaklock
2f1d0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 65 6e 61  ;.  }.  if( rena
2f1e0 6d 65 28 74 50 61 74 68 2c 20 63 50 61 74 68 29  me(tPath, cPath)
2f1f0 20 29 7b 0a 20 20 20 20 73 70 72 69 6e 74 66 28   ){.    sprintf(
2f200 65 72 72 6d 73 67 2c 20 22 72 65 6e 61 6d 65 20  errmsg, "rename 
2f210 66 61 69 6c 65 64 20 28 25 64 29 22 2c 20 65 72  failed (%d)", er
2f220 72 6e 6f 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65  rno);.    goto e
2f230 6e 64 5f 62 72 65 61 6b 6c 6f 63 6b 3b 0a 20 20  nd_breaklock;.  
2f240 7d 0a 20 20 72 63 20 3d 20 30 3b 0a 20 20 66 70  }.  rc = 0;.  fp
2f250 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 62  rintf(stderr, "b
2f260 72 6f 6b 65 20 73 74 61 6c 65 20 6c 6f 63 6b 20  roke stale lock 
2f270 6f 6e 20 25 73 5c 6e 22 2c 20 63 50 61 74 68 29  on %s\n", cPath)
2f280 3b 0a 20 20 63 6c 6f 73 65 28 63 6f 6e 63 68 46  ;.  close(conchF
2f290 69 6c 65 2d 3e 68 29 3b 0a 20 20 63 6f 6e 63 68  ile->h);.  conch
2f2a0 46 69 6c 65 2d 3e 68 20 3d 20 66 64 3b 0a 20 20  File->h = fd;.  
2f2b0 63 6f 6e 63 68 46 69 6c 65 2d 3e 6f 70 65 6e 46  conchFile->openF
2f2c0 6c 61 67 73 20 3d 20 4f 5f 52 44 57 52 20 7c 20  lags = O_RDWR | 
2f2d0 4f 5f 43 52 45 41 54 3b 0a 0a 65 6e 64 5f 62 72  O_CREAT;..end_br
2f2e0 65 61 6b 6c 6f 63 6b 3a 0a 20 20 69 66 28 20 72  eaklock:.  if( r
2f2f0 63 20 29 7b 0a 20 20 20 20 69 66 28 20 66 64 3e  c ){.    if( fd>
2f300 3d 30 20 29 7b 0a 20 20 20 20 20 20 75 6e 6c 69  =0 ){.      unli
2f310 6e 6b 28 74 50 61 74 68 29 3b 0a 20 20 20 20 20  nk(tPath);.     
2f320 20 63 6c 6f 73 65 28 66 64 29 3b 0a 20 20 20 20   close(fd);.    
2f330 7d 0a 20 20 20 20 66 70 72 69 6e 74 66 28 73 74  }.    fprintf(st
2f340 64 65 72 72 2c 20 22 66 61 69 6c 65 64 20 74 6f  derr, "failed to
2f350 20 62 72 65 61 6b 20 73 74 61 6c 65 20 6c 6f 63   break stale loc
2f360 6b 20 6f 6e 20 25 73 2c 20 25 73 5c 6e 22 2c 20  k on %s, %s\n", 
2f370 63 50 61 74 68 2c 20 65 72 72 6d 73 67 29 3b 0a  cPath, errmsg);.
2f380 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
2f390 0a 7d 0a 0a 2f 2a 20 54 61 6b 65 20 74 68 65 20  .}../* Take the 
2f3a0 72 65 71 75 65 73 74 65 64 20 6c 6f 63 6b 20 6f  requested lock o
2f3b0 6e 20 74 68 65 20 63 6f 6e 63 68 20 66 69 6c 65  n the conch file
2f3c0 20 61 6e 64 20 62 72 65 61 6b 20 61 20 73 74 61   and break a sta
2f3d0 6c 65 20 6c 6f 63 6b 20 69 66 20 74 68 65 20 0a  le lock if the .
2f3e0 2a 2a 20 68 6f 73 74 20 69 64 20 6d 61 74 63 68  ** host id match
2f3f0 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  es..*/.static in
2f400 74 20 70 72 6f 78 79 43 6f 6e 63 68 4c 6f 63 6b  t proxyConchLock
2f410 28 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65  (unixFile *pFile
2f420 2c 20 75 75 69 64 5f 74 20 6d 79 48 6f 73 74 49  , uuid_t myHostI
2f430 44 2c 20 69 6e 74 20 6c 6f 63 6b 54 79 70 65 29  D, int lockType)
2f440 7b 0a 20 20 70 72 6f 78 79 4c 6f 63 6b 69 6e 67  {.  proxyLocking
2f450 43 6f 6e 74 65 78 74 20 2a 70 43 74 78 20 3d 20  Context *pCtx = 
2f460 28 70 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e  (proxyLockingCon
2f470 74 65 78 74 20 2a 29 70 46 69 6c 65 2d 3e 6c 6f  text *)pFile->lo
2f480 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 20 0a 20  ckingContext; . 
2f490 20 75 6e 69 78 46 69 6c 65 20 2a 63 6f 6e 63 68   unixFile *conch
2f4a0 46 69 6c 65 20 3d 20 70 43 74 78 2d 3e 63 6f 6e  File = pCtx->con
2f4b0 63 68 46 69 6c 65 3b 0a 20 20 69 6e 74 20 72 63  chFile;.  int rc
2f4c0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
2f4d0 69 6e 74 20 6e 54 72 69 65 73 20 3d 20 30 3b 0a  int nTries = 0;.
2f4e0 20 20 73 74 72 75 63 74 20 74 69 6d 65 73 70 65    struct timespe
2f4f0 63 20 63 6f 6e 63 68 4d 6f 64 54 69 6d 65 3b 0a  c conchModTime;.
2f500 20 20 0a 20 20 64 6f 20 7b 0a 20 20 20 20 72 63    .  do {.    rc
2f510 20 3d 20 63 6f 6e 63 68 46 69 6c 65 2d 3e 70 4d   = conchFile->pM
2f520 65 74 68 6f 64 2d 3e 78 4c 6f 63 6b 28 28 73 71  ethod->xLock((sq
2f530 6c 69 74 65 33 5f 66 69 6c 65 2a 29 63 6f 6e 63  lite3_file*)conc
2f540 68 46 69 6c 65 2c 20 6c 6f 63 6b 54 79 70 65 29  hFile, lockType)
2f550 3b 0a 20 20 20 20 6e 54 72 69 65 73 20 2b 2b 3b  ;.    nTries ++;
2f560 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
2f570 49 54 45 5f 42 55 53 59 20 29 7b 0a 20 20 20 20  ITE_BUSY ){.    
2f580 20 20 2f 2a 20 49 66 20 74 68 65 20 6c 6f 63 6b    /* If the lock
2f590 20 66 61 69 6c 65 64 20 28 62 75 73 79 29 3a 0a   failed (busy):.
2f5a0 20 20 20 20 20 20 20 2a 20 31 73 74 20 74 72 79         * 1st try
2f5b0 3a 20 67 65 74 20 74 68 65 20 6d 6f 64 20 74 69  : get the mod ti
2f5c0 6d 65 20 6f 66 20 74 68 65 20 63 6f 6e 63 68 2c  me of the conch,
2f5d0 20 77 61 69 74 20 30 2e 35 73 20 61 6e 64 20 74   wait 0.5s and t
2f5e0 72 79 20 61 67 61 69 6e 2e 20 0a 20 20 20 20 20  ry again. .     
2f5f0 20 20 2a 20 32 6e 64 20 74 72 79 3a 20 66 61 69    * 2nd try: fai
2f600 6c 20 69 66 20 74 68 65 20 6d 6f 64 20 74 69 6d  l if the mod tim
2f610 65 20 63 68 61 6e 67 65 64 20 6f 72 20 68 6f 73  e changed or hos
2f620 74 20 69 64 20 69 73 20 64 69 66 66 65 72 65 6e  t id is differen
2f630 74 2c 20 77 61 69 74 20 0a 20 20 20 20 20 20 20  t, wait .       
2f640 2a 20 20 20 20 20 20 20 20 20 20 20 31 30 20 73  *           10 s
2f650 65 63 20 61 6e 64 20 74 72 79 20 61 67 61 69 6e  ec and try again
2f660 0a 20 20 20 20 20 20 20 2a 20 33 72 64 20 74 72  .       * 3rd tr
2f670 79 3a 20 62 72 65 61 6b 20 74 68 65 20 6c 6f 63  y: break the loc
2f680 6b 20 75 6e 6c 65 73 73 20 74 68 65 20 6d 6f 64  k unless the mod
2f690 20 74 69 6d 65 20 68 61 73 20 63 68 61 6e 67 65   time has change
2f6a0 64 2e 0a 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  d..       */.   
2f6b0 20 20 20 73 74 72 75 63 74 20 73 74 61 74 20 62     struct stat b
2f6c0 75 66 3b 0a 20 20 20 20 20 20 69 66 28 20 66 73  uf;.      if( fs
2f6d0 74 61 74 28 63 6f 6e 63 68 46 69 6c 65 2d 3e 68  tat(conchFile->h
2f6e0 2c 20 26 62 75 66 29 20 29 7b 0a 20 20 20 20 20  , &buf) ){.     
2f6f0 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72     pFile->lastEr
2f700 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20  rno = errno;.   
2f710 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
2f720 54 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b 3b 0a 20  TE_IOERR_LOCK;. 
2f730 20 20 20 20 20 7d 0a 20 20 20 20 20 20 0a 20 20       }.      .  
2f740 20 20 20 20 69 66 28 20 6e 54 72 69 65 73 3d 3d      if( nTries==
2f750 31 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 6e  1 ){.        con
2f760 63 68 4d 6f 64 54 69 6d 65 20 3d 20 62 75 66 2e  chModTime = buf.
2f770 73 74 5f 6d 74 69 6d 65 73 70 65 63 3b 0a 20 20  st_mtimespec;.  
2f780 20 20 20 20 20 20 75 73 6c 65 65 70 28 35 30 30        usleep(500
2f790 30 30 30 29 3b 20 2f 2a 20 77 61 69 74 20 30 2e  000); /* wait 0.
2f7a0 35 20 73 65 63 20 61 6e 64 20 74 72 79 20 74 68  5 sec and try th
2f7b0 65 20 6c 6f 63 6b 20 61 67 61 69 6e 2a 2f 0a 20  e lock again*/. 
2f7c0 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b         continue;
2f7d0 20 20 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20    .      }..    
2f7e0 20 20 61 73 73 65 72 74 28 20 6e 54 72 69 65 73    assert( nTries
2f7f0 3e 31 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  >1 );.      if( 
2f800 63 6f 6e 63 68 4d 6f 64 54 69 6d 65 2e 74 76 5f  conchModTime.tv_
2f810 73 65 63 20 21 3d 20 62 75 66 2e 73 74 5f 6d 74  sec != buf.st_mt
2f820 69 6d 65 73 70 65 63 2e 74 76 5f 73 65 63 20 7c  imespec.tv_sec |
2f830 7c 20 0a 20 20 20 20 20 20 20 20 20 63 6f 6e 63  | .         conc
2f840 68 4d 6f 64 54 69 6d 65 2e 74 76 5f 6e 73 65 63  hModTime.tv_nsec
2f850 20 21 3d 20 62 75 66 2e 73 74 5f 6d 74 69 6d 65   != buf.st_mtime
2f860 73 70 65 63 2e 74 76 5f 6e 73 65 63 20 29 7b 0a  spec.tv_nsec ){.
2f870 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53          return S
2f880 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20  QLITE_BUSY;.    
2f890 20 20 7d 0a 20 20 20 20 20 20 0a 20 20 20 20 20    }.      .     
2f8a0 20 69 66 28 20 6e 54 72 69 65 73 3d 3d 32 20 29   if( nTries==2 )
2f8b0 7b 20 20 0a 20 20 20 20 20 20 20 20 63 68 61 72  {  .        char
2f8c0 20 74 42 75 66 5b 50 52 4f 58 59 5f 4d 41 58 43   tBuf[PROXY_MAXC
2f8d0 4f 4e 43 48 4c 45 4e 5d 3b 0a 20 20 20 20 20 20  ONCHLEN];.      
2f8e0 20 20 69 6e 74 20 6c 65 6e 20 3d 20 70 72 65 61    int len = prea
2f8f0 64 28 63 6f 6e 63 68 46 69 6c 65 2d 3e 68 2c 20  d(conchFile->h, 
2f900 74 42 75 66 2c 20 50 52 4f 58 59 5f 4d 41 58 43  tBuf, PROXY_MAXC
2f910 4f 4e 43 48 4c 45 4e 2c 20 30 29 3b 0a 20 20 20  ONCHLEN, 0);.   
2f920 20 20 20 20 20 69 66 28 20 6c 65 6e 3c 30 20 29       if( len<0 )
2f930 7b 0a 20 20 20 20 20 20 20 20 20 20 70 46 69 6c  {.          pFil
2f940 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 65  e->lastErrno = e
2f950 72 72 6e 6f 3b 0a 20 20 20 20 20 20 20 20 20 20  rrno;.          
2f960 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f  return SQLITE_IO
2f970 45 52 52 5f 4c 4f 43 4b 3b 0a 20 20 20 20 20 20  ERR_LOCK;.      
2f980 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20    }.        if( 
2f990 6c 65 6e 3e 50 52 4f 58 59 5f 50 41 54 48 49 4e  len>PROXY_PATHIN
2f9a0 44 45 58 20 26 26 20 74 42 75 66 5b 30 5d 3d 3d  DEX && tBuf[0]==
2f9b0 28 63 68 61 72 29 50 52 4f 58 59 5f 43 4f 4e 43  (char)PROXY_CONC
2f9c0 48 56 45 52 53 49 4f 4e 29 7b 0a 20 20 20 20 20  HVERSION){.     
2f9d0 20 20 20 20 20 2f 2a 20 64 6f 6e 27 74 20 62 72       /* don't br
2f9e0 65 61 6b 20 74 68 65 20 6c 6f 63 6b 20 69 66 20  eak the lock if 
2f9f0 74 68 65 20 68 6f 73 74 20 69 64 20 64 6f 65 73  the host id does
2fa00 6e 27 74 20 6d 61 74 63 68 20 2a 2f 0a 20 20 20  n't match */.   
2fa10 20 20 20 20 20 20 20 69 66 28 20 30 21 3d 6d 65         if( 0!=me
2fa20 6d 63 6d 70 28 26 74 42 75 66 5b 50 52 4f 58 59  mcmp(&tBuf[PROXY
2fa30 5f 48 45 41 44 45 52 4c 45 4e 5d 2c 20 6d 79 48  _HEADERLEN], myH
2fa40 6f 73 74 49 44 2c 20 50 52 4f 58 59 5f 48 4f 53  ostID, PROXY_HOS
2fa50 54 49 44 4c 45 4e 29 20 29 7b 0a 20 20 20 20 20  TIDLEN) ){.     
2fa60 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51         return SQ
2fa70 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 20  LITE_BUSY;.     
2fa80 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
2fa90 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
2faa0 2f 2a 20 64 6f 6e 27 74 20 62 72 65 61 6b 20 74  /* don't break t
2fab0 68 65 20 6c 6f 63 6b 20 6f 6e 20 73 68 6f 72 74  he lock on short
2fac0 20 72 65 61 64 20 6f 72 20 61 20 76 65 72 73 69   read or a versi
2fad0 6f 6e 20 6d 69 73 6d 61 74 63 68 20 2a 2f 0a 20  on mismatch */. 
2fae0 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
2faf0 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20  SQLITE_BUSY;.   
2fb00 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 75       }.        u
2fb10 73 6c 65 65 70 28 31 30 30 30 30 30 30 30 29 3b  sleep(10000000);
2fb20 20 2f 2a 20 77 61 69 74 20 31 30 20 73 65 63 20   /* wait 10 sec 
2fb30 61 6e 64 20 74 72 79 20 74 68 65 20 6c 6f 63 6b  and try the lock
2fb40 20 61 67 61 69 6e 20 2a 2f 0a 20 20 20 20 20 20   again */.      
2fb50 20 20 63 6f 6e 74 69 6e 75 65 3b 20 0a 20 20 20    continue; .   
2fb60 20 20 20 7d 0a 20 20 20 20 20 20 0a 20 20 20 20     }.      .    
2fb70 20 20 61 73 73 65 72 74 28 20 6e 54 72 69 65 73    assert( nTries
2fb80 3d 3d 33 20 29 3b 0a 20 20 20 20 20 20 69 66 28  ==3 );.      if(
2fb90 20 30 3d 3d 70 72 6f 78 79 42 72 65 61 6b 43 6f   0==proxyBreakCo
2fba0 6e 63 68 4c 6f 63 6b 28 70 46 69 6c 65 2c 20 6d  nchLock(pFile, m
2fbb0 79 48 6f 73 74 49 44 29 20 29 7b 0a 20 20 20 20  yHostID) ){.    
2fbc0 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
2fbd0 4f 4b 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  OK;.        if( 
2fbe0 6c 6f 63 6b 54 79 70 65 3d 3d 45 58 43 4c 55 53  lockType==EXCLUS
2fbf0 49 56 45 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20  IVE_LOCK ){.    
2fc00 20 20 20 20 20 20 72 63 20 3d 20 63 6f 6e 63 68        rc = conch
2fc10 46 69 6c 65 2d 3e 70 4d 65 74 68 6f 64 2d 3e 78  File->pMethod->x
2fc20 4c 6f 63 6b 28 28 73 71 6c 69 74 65 33 5f 66 69  Lock((sqlite3_fi
2fc30 6c 65 2a 29 63 6f 6e 63 68 46 69 6c 65 2c 20 53  le*)conchFile, S
2fc40 48 41 52 45 44 5f 4c 4f 43 4b 29 3b 20 20 20 20  HARED_LOCK);    
2fc50 20 20 20 20 20 20 0a 20 20 20 20 20 20 20 20 7d        .        }
2fc60 0a 20 20 20 20 20 20 20 20 69 66 28 20 21 72 63  .        if( !rc
2fc70 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63   ){.          rc
2fc80 20 3d 20 63 6f 6e 63 68 46 69 6c 65 2d 3e 70 4d   = conchFile->pM
2fc90 65 74 68 6f 64 2d 3e 78 4c 6f 63 6b 28 28 73 71  ethod->xLock((sq
2fca0 6c 69 74 65 33 5f 66 69 6c 65 2a 29 63 6f 6e 63  lite3_file*)conc
2fcb0 68 46 69 6c 65 2c 20 6c 6f 63 6b 54 79 70 65 29  hFile, lockType)
2fcc0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
2fcd0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 20 77 68    }.    }.  } wh
2fce0 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f  ile( rc==SQLITE_
2fcf0 42 55 53 59 20 26 26 20 6e 54 72 69 65 73 3c 33  BUSY && nTries<3
2fd00 20 29 3b 0a 20 20 0a 20 20 72 65 74 75 72 6e 20   );.  .  return 
2fd10 72 63 3b 0a 7d 0a 0a 2f 2a 20 54 61 6b 65 73 20  rc;.}../* Takes 
2fd20 74 68 65 20 63 6f 6e 63 68 20 62 79 20 74 61 6b  the conch by tak
2fd30 69 6e 67 20 61 20 73 68 61 72 65 64 20 6c 6f 63  ing a shared loc
2fd40 6b 20 61 6e 64 20 72 65 61 64 20 74 68 65 20 63  k and read the c
2fd50 6f 6e 74 65 6e 74 73 20 63 6f 6e 63 68 2c 20 69  ontents conch, i
2fd60 66 20 0a 2a 2a 20 6c 6f 63 6b 50 61 74 68 20 69  f .** lockPath i
2fd70 73 20 6e 6f 6e 2d 4e 55 4c 4c 2c 20 74 68 65 20  s non-NULL, the 
2fd80 68 6f 73 74 20 49 44 20 61 6e 64 20 6c 6f 63 6b  host ID and lock
2fd90 20 66 69 6c 65 20 70 61 74 68 20 6d 75 73 74 20   file path must 
2fda0 6d 61 74 63 68 2e 20 20 41 20 4e 55 4c 4c 20 0a  match.  A NULL .
2fdb0 2a 2a 20 6c 6f 63 6b 50 61 74 68 20 6d 65 61 6e  ** lockPath mean
2fdc0 73 20 74 68 61 74 20 74 68 65 20 6c 6f 63 6b 50  s that the lockP
2fdd0 61 74 68 20 69 6e 20 74 68 65 20 63 6f 6e 63 68  ath in the conch
2fde0 20 66 69 6c 65 20 77 69 6c 6c 20 62 65 20 75 73   file will be us
2fdf0 65 64 20 69 66 20 74 68 65 20 0a 2a 2a 20 68 6f  ed if the .** ho
2fe00 73 74 20 49 44 73 20 6d 61 74 63 68 2c 20 6f 72  st IDs match, or
2fe10 20 61 20 6e 65 77 20 6c 6f 63 6b 20 70 61 74 68   a new lock path
2fe20 20 77 69 6c 6c 20 62 65 20 67 65 6e 65 72 61 74   will be generat
2fe30 65 64 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79  ed automatically
2fe40 20 0a 2a 2a 20 61 6e 64 20 77 72 69 74 74 65 6e   .** and written
2fe50 20 74 6f 20 74 68 65 20 63 6f 6e 63 68 20 66 69   to the conch fi
2fe60 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  le..*/.static in
2fe70 74 20 70 72 6f 78 79 54 61 6b 65 43 6f 6e 63 68  t proxyTakeConch
2fe80 28 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65  (unixFile *pFile
2fe90 29 7b 0a 20 20 70 72 6f 78 79 4c 6f 63 6b 69 6e  ){.  proxyLockin
2fea0 67 43 6f 6e 74 65 78 74 20 2a 70 43 74 78 20 3d  gContext *pCtx =
2feb0 20 28 70 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f   (proxyLockingCo
2fec0 6e 74 65 78 74 20 2a 29 70 46 69 6c 65 2d 3e 6c  ntext *)pFile->l
2fed0 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 20 0a  ockingContext; .
2fee0 20 20 0a 20 20 69 66 28 20 70 43 74 78 2d 3e 63    .  if( pCtx->c
2fef0 6f 6e 63 68 48 65 6c 64 21 3d 30 20 29 7b 0a 20  onchHeld!=0 ){. 
2ff00 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
2ff10 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  _OK;.  }else{.  
2ff20 20 20 75 6e 69 78 46 69 6c 65 20 2a 63 6f 6e 63    unixFile *conc
2ff30 68 46 69 6c 65 20 3d 20 70 43 74 78 2d 3e 63 6f  hFile = pCtx->co
2ff40 6e 63 68 46 69 6c 65 3b 0a 20 20 20 20 75 75 69  nchFile;.    uui
2ff50 64 5f 74 20 6d 79 48 6f 73 74 49 44 3b 0a 20 20  d_t myHostID;.  
2ff60 20 20 69 6e 74 20 70 45 72 72 6f 72 20 3d 20 30    int pError = 0
2ff70 3b 0a 20 20 20 20 63 68 61 72 20 72 65 61 64 42  ;.    char readB
2ff80 75 66 5b 50 52 4f 58 59 5f 4d 41 58 43 4f 4e 43  uf[PROXY_MAXCONC
2ff90 48 4c 45 4e 5d 3b 0a 20 20 20 20 63 68 61 72 20  HLEN];.    char 
2ffa0 6c 6f 63 6b 50 61 74 68 5b 4d 41 58 50 41 54 48  lockPath[MAXPATH
2ffb0 4c 45 4e 5d 3b 0a 20 20 20 20 63 68 61 72 20 2a  LEN];.    char *
2ffc0 74 65 6d 70 4c 6f 63 6b 50 61 74 68 20 3d 20 4e  tempLockPath = N
2ffd0 55 4c 4c 3b 0a 20 20 20 20 69 6e 74 20 72 63 20  ULL;.    int rc 
2ffe0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  = SQLITE_OK;.   
2fff0 20 69 6e 74 20 63 72 65 61 74 65 43 6f 6e 63 68   int createConch
30000 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 68 6f   = 0;.    int ho
30010 73 74 49 64 4d 61 74 63 68 20 3d 20 30 3b 0a 20  stIdMatch = 0;. 
30020 20 20 20 69 6e 74 20 72 65 61 64 4c 65 6e 20 3d     int readLen =
30030 20 30 3b 0a 20 20 20 20 69 6e 74 20 74 72 79 4f   0;.    int tryO
30040 6c 64 4c 6f 63 6b 50 61 74 68 20 3d 20 30 3b 0a  ldLockPath = 0;.
30050 20 20 20 20 69 6e 74 20 66 6f 72 63 65 4e 65 77      int forceNew
30060 4c 6f 63 6b 50 61 74 68 20 3d 20 30 3b 0a 20 20  LockPath = 0;.  
30070 20 20 0a 20 20 20 20 4f 53 54 52 41 43 45 34 28    .    OSTRACE4(
30080 22 54 41 4b 45 43 4f 4e 43 48 20 20 25 64 20 66  "TAKECONCH  %d f
30090 6f 72 20 25 73 20 70 69 64 3d 25 64 5c 6e 22 2c  or %s pid=%d\n",
300a0 20 63 6f 6e 63 68 46 69 6c 65 2d 3e 68 2c 0a 20   conchFile->h,. 
300b0 20 20 20 20 20 20 20 20 20 20 20 20 28 70 43 74              (pCt
300c0 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 50 61 74 68  x->lockProxyPath
300d0 20 3f 20 70 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f   ? pCtx->lockPro
300e0 78 79 50 61 74 68 20 3a 20 22 3a 61 75 74 6f 3a  xyPath : ":auto:
300f0 22 29 2c 20 67 65 74 70 69 64 28 29 29 3b 0a 0a  "), getpid());..
30100 20 20 20 20 72 63 20 3d 20 70 72 6f 78 79 47 65      rc = proxyGe
30110 74 48 6f 73 74 49 44 28 6d 79 48 6f 73 74 49 44  tHostID(myHostID
30120 2c 20 26 70 45 72 72 6f 72 29 3b 0a 20 20 20 20  , &pError);.    
30130 69 66 28 20 28 72 63 26 30 78 66 66 29 3d 3d 53  if( (rc&0xff)==S
30140 51 4c 49 54 45 5f 49 4f 45 52 52 20 29 7b 0a 20  QLITE_IOERR ){. 
30150 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74       pFile->last
30160 45 72 72 6e 6f 20 3d 20 70 45 72 72 6f 72 3b 0a  Errno = pError;.
30170 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 74        goto end_t
30180 61 6b 65 63 6f 6e 63 68 3b 0a 20 20 20 20 7d 0a  akeconch;.    }.
30190 20 20 20 20 72 63 20 3d 20 70 72 6f 78 79 43 6f      rc = proxyCo
301a0 6e 63 68 4c 6f 63 6b 28 70 46 69 6c 65 2c 20 6d  nchLock(pFile, m
301b0 79 48 6f 73 74 49 44 2c 20 53 48 41 52 45 44 5f  yHostID, SHARED_
301c0 4c 4f 43 4b 29 3b 0a 20 20 20 20 69 66 28 20 72  LOCK);.    if( r
301d0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
301e0 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 74        goto end_t
301f0 61 6b 65 63 6f 6e 63 68 3b 0a 20 20 20 20 7d 0a  akeconch;.    }.
30200 20 20 20 20 2f 2a 20 72 65 61 64 20 74 68 65 20      /* read the 
30210 65 78 69 73 74 69 6e 67 20 63 6f 6e 63 68 20 66  existing conch f
30220 69 6c 65 20 2a 2f 0a 20 20 20 20 72 65 61 64 4c  ile */.    readL
30230 65 6e 20 3d 20 73 65 65 6b 41 6e 64 52 65 61 64  en = seekAndRead
30240 28 28 75 6e 69 78 46 69 6c 65 2a 29 63 6f 6e 63  ((unixFile*)conc
30250 68 46 69 6c 65 2c 20 30 2c 20 72 65 61 64 42 75  hFile, 0, readBu
30260 66 2c 20 50 52 4f 58 59 5f 4d 41 58 43 4f 4e 43  f, PROXY_MAXCONC
30270 48 4c 45 4e 29 3b 0a 20 20 20 20 69 66 28 20 72  HLEN);.    if( r
30280 65 61 64 4c 65 6e 3c 30 20 29 7b 0a 20 20 20 20  eadLen<0 ){.    
30290 20 20 2f 2a 20 49 2f 4f 20 65 72 72 6f 72 3a 20    /* I/O error: 
302a0 6c 61 73 74 45 72 72 6e 6f 20 73 65 74 20 62 79  lastErrno set by
302b0 20 73 65 65 6b 41 6e 64 52 65 61 64 20 2a 2f 0a   seekAndRead */.
302c0 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73        pFile->las
302d0 74 45 72 72 6e 6f 20 3d 20 63 6f 6e 63 68 46 69  tErrno = conchFi
302e0 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 3b 0a 20  le->lastErrno;. 
302f0 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
30300 5f 49 4f 45 52 52 5f 52 45 41 44 3b 0a 20 20 20  _IOERR_READ;.   
30310 20 20 20 67 6f 74 6f 20 65 6e 64 5f 74 61 6b 65     goto end_take
30320 63 6f 6e 63 68 3b 0a 20 20 20 20 7d 65 6c 73 65  conch;.    }else
30330 20 69 66 28 20 72 65 61 64 4c 65 6e 3c 3d 28 50   if( readLen<=(P
30340 52 4f 58 59 5f 48 45 41 44 45 52 4c 45 4e 2b 50  ROXY_HEADERLEN+P
30350 52 4f 58 59 5f 48 4f 53 54 49 44 4c 45 4e 29 20  ROXY_HOSTIDLEN) 
30360 7c 7c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  || .            
30370 20 72 65 61 64 42 75 66 5b 30 5d 21 3d 28 63 68   readBuf[0]!=(ch
30380 61 72 29 50 52 4f 58 59 5f 43 4f 4e 43 48 56 45  ar)PROXY_CONCHVE
30390 52 53 49 4f 4e 20 29 7b 0a 20 20 20 20 20 20 2f  RSION ){.      /
303a0 2a 20 61 20 73 68 6f 72 74 20 72 65 61 64 20 6f  * a short read o
303b0 72 20 76 65 72 73 69 6f 6e 20 66 6f 72 6d 61 74  r version format
303c0 20 6d 69 73 6d 61 74 63 68 20 6d 65 61 6e 73 20   mismatch means 
303d0 77 65 20 6e 65 65 64 20 74 6f 20 63 72 65 61 74  we need to creat
303e0 65 20 61 20 6e 65 77 20 0a 20 20 20 20 20 20 2a  e a new .      *
303f0 2a 20 63 6f 6e 63 68 20 66 69 6c 65 2e 20 0a 20  * conch file. . 
30400 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 63 72       */.      cr
30410 65 61 74 65 43 6f 6e 63 68 20 3d 20 31 3b 0a 20  eateConch = 1;. 
30420 20 20 20 7d 0a 20 20 20 20 2f 2a 20 69 66 20 74     }.    /* if t
30430 68 65 20 68 6f 73 74 20 69 64 20 6d 61 74 63 68  he host id match
30440 65 73 20 61 6e 64 20 74 68 65 20 6c 6f 63 6b 20  es and the lock 
30450 70 61 74 68 20 61 6c 72 65 61 64 79 20 65 78 69  path already exi
30460 73 74 73 20 69 6e 20 74 68 65 20 63 6f 6e 63 68  sts in the conch
30470 0a 20 20 20 20 2a 2a 20 77 65 27 6c 6c 20 74 72  .    ** we'll tr
30480 79 20 74 6f 20 75 73 65 20 74 68 65 20 70 61 74  y to use the pat
30490 68 20 74 68 65 72 65 2c 20 69 66 20 77 65 20 63  h there, if we c
304a0 61 6e 27 74 20 6f 70 65 6e 20 74 68 61 74 20 70  an't open that p
304b0 61 74 68 2c 20 77 65 27 6c 6c 20 0a 20 20 20 20  ath, we'll .    
304c0 2a 2a 20 72 65 74 72 79 20 77 69 74 68 20 61 20  ** retry with a 
304d0 6e 65 77 20 61 75 74 6f 2d 67 65 6e 65 72 61 74  new auto-generat
304e0 65 64 20 70 61 74 68 20 0a 20 20 20 20 2a 2f 0a  ed path .    */.
304f0 20 20 20 20 64 6f 20 7b 20 2f 2a 20 69 6e 20 63      do { /* in c
30500 61 73 65 20 77 65 20 6e 65 65 64 20 74 6f 20 74  ase we need to t
30510 72 79 20 61 67 61 69 6e 20 66 6f 72 20 61 6e 20  ry again for an 
30520 3a 61 75 74 6f 3a 20 6e 61 6d 65 64 20 6c 6f 63  :auto: named loc
30530 6b 20 66 69 6c 65 20 2a 2f 0a 0a 20 20 20 20 20  k file */..     
30540 20 69 66 28 20 21 63 72 65 61 74 65 43 6f 6e 63   if( !createConc
30550 68 20 26 26 20 21 66 6f 72 63 65 4e 65 77 4c 6f  h && !forceNewLo
30560 63 6b 50 61 74 68 20 29 7b 0a 20 20 20 20 20 20  ckPath ){.      
30570 20 20 68 6f 73 74 49 64 4d 61 74 63 68 20 3d 20    hostIdMatch = 
30580 21 6d 65 6d 63 6d 70 28 26 72 65 61 64 42 75 66  !memcmp(&readBuf
30590 5b 50 52 4f 58 59 5f 48 45 41 44 45 52 4c 45 4e  [PROXY_HEADERLEN
305a0 5d 2c 20 6d 79 48 6f 73 74 49 44 2c 20 0a 20 20  ], myHostID, .  
305b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
305c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
305d0 50 52 4f 58 59 5f 48 4f 53 54 49 44 4c 45 4e 29  PROXY_HOSTIDLEN)
305e0 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20 69 66 20  ;.        /* if 
305f0 74 68 65 20 63 6f 6e 63 68 20 68 61 73 20 64 61  the conch has da
30600 74 61 20 63 6f 6d 70 61 72 65 20 74 68 65 20 63  ta compare the c
30610 6f 6e 74 65 6e 74 73 20 2a 2f 0a 20 20 20 20 20  ontents */.     
30620 20 20 20 69 66 28 20 21 70 43 74 78 2d 3e 6c 6f     if( !pCtx->lo
30630 63 6b 50 72 6f 78 79 50 61 74 68 20 29 7b 0a 20  ckProxyPath ){. 
30640 20 20 20 20 20 20 20 20 20 2f 2a 20 66 6f 72 20           /* for 
30650 61 75 74 6f 2d 6e 61 6d 65 64 20 6c 6f 63 61 6c  auto-named local
30660 20 6c 6f 63 6b 20 66 69 6c 65 2c 20 6a 75 73 74   lock file, just
30670 20 63 68 65 63 6b 20 74 68 65 20 68 6f 73 74 20   check the host 
30680 49 44 20 61 6e 64 20 77 65 27 6c 6c 0a 20 20 20  ID and we'll.   
30690 20 20 20 20 20 20 20 20 2a 2a 20 75 73 65 20 74          ** use t
306a0 68 65 20 6c 6f 63 61 6c 20 6c 6f 63 6b 20 66 69  he local lock fi
306b0 6c 65 20 70 61 74 68 20 74 68 61 74 27 73 20 61  le path that's a
306c0 6c 72 65 61 64 79 20 69 6e 20 74 68 65 72 65 0a  lready in there.
306d0 20 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20             */.  
306e0 20 20 20 20 20 20 20 20 69 66 28 20 68 6f 73 74          if( host
306f0 49 64 4d 61 74 63 68 20 29 7b 0a 20 20 20 20 20  IdMatch ){.     
30700 20 20 20 20 20 20 20 73 69 7a 65 5f 74 20 70 61         size_t pa
30710 74 68 4c 65 6e 20 3d 20 28 72 65 61 64 4c 65 6e  thLen = (readLen
30720 20 2d 20 50 52 4f 58 59 5f 50 41 54 48 49 4e 44   - PROXY_PATHIND
30730 45 58 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  EX);.           
30740 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66   .            if
30750 28 20 70 61 74 68 4c 65 6e 3e 3d 4d 41 58 50 41  ( pathLen>=MAXPA
30760 54 48 4c 45 4e 20 29 7b 0a 20 20 20 20 20 20 20  THLEN ){.       
30770 20 20 20 20 20 20 20 70 61 74 68 4c 65 6e 3d 4d         pathLen=M
30780 41 58 50 41 54 48 4c 45 4e 2d 31 3b 0a 20 20 20  AXPATHLEN-1;.   
30790 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
307a0 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 6c 6f         memcpy(lo
307b0 63 6b 50 61 74 68 2c 20 26 72 65 61 64 42 75 66  ckPath, &readBuf
307c0 5b 50 52 4f 58 59 5f 50 41 54 48 49 4e 44 45 58  [PROXY_PATHINDEX
307d0 5d 2c 20 70 61 74 68 4c 65 6e 29 3b 0a 20 20 20  ], pathLen);.   
307e0 20 20 20 20 20 20 20 20 20 6c 6f 63 6b 50 61 74           lockPat
307f0 68 5b 70 61 74 68 4c 65 6e 5d 20 3d 20 30 3b 0a  h[pathLen] = 0;.
30800 20 20 20 20 20 20 20 20 20 20 20 20 74 65 6d 70              temp
30810 4c 6f 63 6b 50 61 74 68 20 3d 20 6c 6f 63 6b 50  LockPath = lockP
30820 61 74 68 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ath;.           
30830 20 74 72 79 4f 6c 64 4c 6f 63 6b 50 61 74 68 20   tryOldLockPath 
30840 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 20  = 1;.           
30850 20 2f 2a 20 63 72 65 61 74 65 20 61 20 63 6f 70   /* create a cop
30860 79 20 6f 66 20 74 68 65 20 6c 6f 63 6b 20 70 61  y of the lock pa
30870 74 68 20 69 66 20 74 68 65 20 63 6f 6e 63 68 20  th if the conch 
30880 69 73 20 74 61 6b 65 6e 20 2a 2f 0a 20 20 20 20  is taken */.    
30890 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64          goto end
308a0 5f 74 61 6b 65 63 6f 6e 63 68 3b 0a 20 20 20 20  _takeconch;.    
308b0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
308c0 7d 65 6c 73 65 20 69 66 28 20 68 6f 73 74 49 64  }else if( hostId
308d0 4d 61 74 63 68 0a 20 20 20 20 20 20 20 20 20 20  Match.          
308e0 20 20 20 20 20 26 26 20 21 73 74 72 6e 63 6d 70       && !strncmp
308f0 28 70 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79  (pCtx->lockProxy
30900 50 61 74 68 2c 20 26 72 65 61 64 42 75 66 5b 50  Path, &readBuf[P
30910 52 4f 58 59 5f 50 41 54 48 49 4e 44 45 58 5d 2c  ROXY_PATHINDEX],
30920 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
30930 20 20 20 20 20 20 20 20 20 20 20 20 72 65 61 64              read
30940 4c 65 6e 2d 50 52 4f 58 59 5f 50 41 54 48 49 4e  Len-PROXY_PATHIN
30950 44 45 58 29 0a 20 20 20 20 20 20 20 20 29 7b 0a  DEX).        ){.
30960 20 20 20 20 20 20 20 20 20 20 2f 2a 20 63 6f 6e            /* con
30970 63 68 20 68 6f 73 74 20 61 6e 64 20 6c 6f 63 6b  ch host and lock
30980 20 70 61 74 68 20 6d 61 74 63 68 20 2a 2f 0a 20   path match */. 
30990 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e           goto en
309a0 64 5f 74 61 6b 65 63 6f 6e 63 68 3b 20 0a 20 20  d_takeconch; .  
309b0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
309c0 20 20 20 20 20 20 0a 20 20 20 20 20 20 2f 2a 20        .      /* 
309d0 69 66 20 74 68 65 20 63 6f 6e 63 68 20 69 73 6e  if the conch isn
309e0 27 74 20 77 72 69 74 61 62 6c 65 20 61 6e 64 20  't writable and 
309f0 64 6f 65 73 6e 27 74 20 6d 61 74 63 68 2c 20 77  doesn't match, w
30a00 65 20 63 61 6e 27 74 20 74 61 6b 65 20 69 74 20  e can't take it 
30a10 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 28 63 6f  */.      if( (co
30a20 6e 63 68 46 69 6c 65 2d 3e 6f 70 65 6e 46 6c 61  nchFile->openFla
30a30 67 73 26 4f 5f 52 44 57 52 29 20 3d 3d 20 30 20  gs&O_RDWR) == 0 
30a40 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
30a50 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20  SQLITE_BUSY;.   
30a60 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 74 61       goto end_ta
30a70 6b 65 63 6f 6e 63 68 3b 0a 20 20 20 20 20 20 7d  keconch;.      }
30a80 0a 20 20 20 20 20 20 0a 20 20 20 20 20 20 2f 2a  .      .      /*
30a90 20 65 69 74 68 65 72 20 74 68 65 20 63 6f 6e 63   either the conc
30aa0 68 20 64 69 64 6e 27 74 20 6d 61 74 63 68 20 6f  h didn't match o
30ab0 72 20 77 65 20 6e 65 65 64 20 74 6f 20 63 72 65  r we need to cre
30ac0 61 74 65 20 61 20 6e 65 77 20 6f 6e 65 20 2a 2f  ate a new one */
30ad0 0a 20 20 20 20 20 20 69 66 28 20 21 70 43 74 78  .      if( !pCtx
30ae0 2d 3e 6c 6f 63 6b 50 72 6f 78 79 50 61 74 68 20  ->lockProxyPath 
30af0 29 7b 0a 20 20 20 20 20 20 20 20 70 72 6f 78 79  ){.        proxy
30b00 47 65 74 4c 6f 63 6b 50 61 74 68 28 70 43 74 78  GetLockPath(pCtx
30b10 2d 3e 64 62 50 61 74 68 2c 20 6c 6f 63 6b 50 61  ->dbPath, lockPa
30b20 74 68 2c 20 4d 41 58 50 41 54 48 4c 45 4e 29 3b  th, MAXPATHLEN);
30b30 0a 20 20 20 20 20 20 20 20 74 65 6d 70 4c 6f 63  .        tempLoc
30b40 6b 50 61 74 68 20 3d 20 6c 6f 63 6b 50 61 74 68  kPath = lockPath
30b50 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20 63 72 65  ;.        /* cre
30b60 61 74 65 20 61 20 63 6f 70 79 20 6f 66 20 74 68  ate a copy of th
30b70 65 20 6c 6f 63 6b 20 70 61 74 68 20 5f 6f 6e 6c  e lock path _onl
30b80 79 5f 20 69 66 20 74 68 65 20 63 6f 6e 63 68 20  y_ if the conch 
30b90 69 73 20 74 61 6b 65 6e 20 2a 2f 0a 20 20 20 20  is taken */.    
30ba0 20 20 7d 0a 20 20 20 20 20 20 0a 20 20 20 20 20    }.      .     
30bb0 20 2f 2a 20 75 70 64 61 74 65 20 63 6f 6e 63 68   /* update conch
30bc0 20 77 69 74 68 20 68 6f 73 74 20 61 6e 64 20 70   with host and p
30bd0 61 74 68 20 28 74 68 69 73 20 77 69 6c 6c 20 66  ath (this will f
30be0 61 69 6c 20 69 66 20 6f 74 68 65 72 20 70 72 6f  ail if other pro
30bf0 63 65 73 73 0a 20 20 20 20 20 20 2a 2a 20 68 61  cess.      ** ha
30c00 73 20 61 20 73 68 61 72 65 64 20 6c 6f 63 6b 20  s a shared lock 
30c10 61 6c 72 65 61 64 79 29 2c 20 69 66 20 74 68 65  already), if the
30c20 20 68 6f 73 74 20 69 64 20 6d 61 74 63 68 65 73   host id matches
30c30 2c 20 75 73 65 20 74 68 65 20 62 69 67 0a 20 20  , use the big.  
30c40 20 20 20 20 2a 2a 20 73 74 69 63 6b 2e 0a 20 20      ** stick..  
30c50 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 66 75 74      */.      fut
30c60 69 6d 65 73 28 63 6f 6e 63 68 46 69 6c 65 2d 3e  imes(conchFile->
30c70 68 2c 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20  h, NULL);.      
30c80 69 66 28 20 68 6f 73 74 49 64 4d 61 74 63 68 20  if( hostIdMatch 
30c90 26 26 20 21 63 72 65 61 74 65 43 6f 6e 63 68 20  && !createConch 
30ca0 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 63  ){.        if( c
30cb0 6f 6e 63 68 46 69 6c 65 2d 3e 70 4c 6f 63 6b 20  onchFile->pLock 
30cc0 26 26 20 63 6f 6e 63 68 46 69 6c 65 2d 3e 70 4c  && conchFile->pL
30cd0 6f 63 6b 2d 3e 63 6e 74 3e 31 20 29 7b 0a 20 20  ock->cnt>1 ){.  
30ce0 20 20 20 20 20 20 20 20 2f 2a 20 57 65 20 61 72          /* We ar
30cf0 65 20 74 72 79 69 6e 67 20 66 6f 72 20 61 6e 20  e trying for an 
30d00 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20 62  exclusive lock b
30d10 75 74 20 61 6e 6f 74 68 65 72 20 74 68 72 65 61  ut another threa
30d20 64 20 69 6e 20 74 68 69 73 0a 20 20 20 20 20 20  d in this.      
30d30 20 20 20 20 20 2a 2a 20 73 61 6d 65 20 70 72 6f       ** same pro
30d40 63 65 73 73 20 69 73 20 73 74 69 6c 6c 20 68 6f  cess is still ho
30d50 6c 64 69 6e 67 20 61 20 73 68 61 72 65 64 20 6c  lding a shared l
30d60 6f 63 6b 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20  ock. */.        
30d70 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55    rc = SQLITE_BU
30d80 53 59 3b 0a 20 20 20 20 20 20 20 20 7d 20 65 6c  SY;.        } el
30d90 73 65 20 7b 20 20 20 20 20 20 20 20 20 20 0a 20  se {          . 
30da0 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 70 72           rc = pr
30db0 6f 78 79 43 6f 6e 63 68 4c 6f 63 6b 28 70 46 69  oxyConchLock(pFi
30dc0 6c 65 2c 20 6d 79 48 6f 73 74 49 44 2c 20 45 58  le, myHostID, EX
30dd0 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 3b 0a 20  CLUSIVE_LOCK);. 
30de0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
30df0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72 63  else{.        rc
30e00 20 3d 20 63 6f 6e 63 68 46 69 6c 65 2d 3e 70 4d   = conchFile->pM
30e10 65 74 68 6f 64 2d 3e 78 4c 6f 63 6b 28 28 73 71  ethod->xLock((sq
30e20 6c 69 74 65 33 5f 66 69 6c 65 2a 29 63 6f 6e 63  lite3_file*)conc
30e30 68 46 69 6c 65 2c 20 45 58 43 4c 55 53 49 56 45  hFile, EXCLUSIVE
30e40 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 7d 0a  _LOCK);.      }.
30e50 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
30e60 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
30e70 20 20 20 63 68 61 72 20 77 72 69 74 65 42 75 66     char writeBuf
30e80 66 65 72 5b 50 52 4f 58 59 5f 4d 41 58 43 4f 4e  fer[PROXY_MAXCON
30e90 43 48 4c 45 4e 5d 3b 0a 20 20 20 20 20 20 20 20  CHLEN];.        
30ea0 69 6e 74 20 77 72 69 74 65 53 69 7a 65 20 3d 20  int writeSize = 
30eb0 30 3b 0a 20 20 20 20 20 20 20 20 0a 20 20 20 20  0;.        .    
30ec0 20 20 20 20 77 72 69 74 65 42 75 66 66 65 72 5b      writeBuffer[
30ed0 30 5d 20 3d 20 28 63 68 61 72 29 50 52 4f 58 59  0] = (char)PROXY
30ee0 5f 43 4f 4e 43 48 56 45 52 53 49 4f 4e 3b 0a 20  _CONCHVERSION;. 
30ef0 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 77         memcpy(&w
30f00 72 69 74 65 42 75 66 66 65 72 5b 50 52 4f 58 59  riteBuffer[PROXY
30f10 5f 48 45 41 44 45 52 4c 45 4e 5d 2c 20 6d 79 48  _HEADERLEN], myH
30f20 6f 73 74 49 44 2c 20 50 52 4f 58 59 5f 48 4f 53  ostID, PROXY_HOS
30f30 54 49 44 4c 45 4e 29 3b 0a 20 20 20 20 20 20 20  TIDLEN);.       
30f40 20 69 66 28 20 70 43 74 78 2d 3e 6c 6f 63 6b 50   if( pCtx->lockP
30f50 72 6f 78 79 50 61 74 68 21 3d 4e 55 4c 4c 20 29  roxyPath!=NULL )
30f60 7b 0a 20 20 20 20 20 20 20 20 20 20 73 74 72 6c  {.          strl
30f70 63 70 79 28 26 77 72 69 74 65 42 75 66 66 65 72  cpy(&writeBuffer
30f80 5b 50 52 4f 58 59 5f 50 41 54 48 49 4e 44 45 58  [PROXY_PATHINDEX
30f90 5d 2c 20 70 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f  ], pCtx->lockPro
30fa0 78 79 50 61 74 68 2c 20 4d 41 58 50 41 54 48 4c  xyPath, MAXPATHL
30fb0 45 4e 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  EN);.        }el
30fc0 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 73 74  se{.          st
30fd0 72 6c 63 70 79 28 26 77 72 69 74 65 42 75 66 66  rlcpy(&writeBuff
30fe0 65 72 5b 50 52 4f 58 59 5f 50 41 54 48 49 4e 44  er[PROXY_PATHIND
30ff0 45 58 5d 2c 20 74 65 6d 70 4c 6f 63 6b 50 61 74  EX], tempLockPat
31000 68 2c 20 4d 41 58 50 41 54 48 4c 45 4e 29 3b 0a  h, MAXPATHLEN);.
31010 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
31020 20 20 77 72 69 74 65 53 69 7a 65 20 3d 20 50 52    writeSize = PR
31030 4f 58 59 5f 50 41 54 48 49 4e 44 45 58 20 2b 20  OXY_PATHINDEX + 
31040 73 74 72 6c 65 6e 28 26 77 72 69 74 65 42 75 66  strlen(&writeBuf
31050 66 65 72 5b 50 52 4f 58 59 5f 50 41 54 48 49 4e  fer[PROXY_PATHIN
31060 44 45 58 5d 29 3b 0a 20 20 20 20 20 20 20 20 66  DEX]);.        f
31070 74 72 75 6e 63 61 74 65 28 63 6f 6e 63 68 46 69  truncate(conchFi
31080 6c 65 2d 3e 68 2c 20 77 72 69 74 65 53 69 7a 65  le->h, writeSize
31090 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  );.        rc = 
310a0 75 6e 69 78 57 72 69 74 65 28 28 73 71 6c 69 74  unixWrite((sqlit
310b0 65 33 5f 66 69 6c 65 20 2a 29 63 6f 6e 63 68 46  e3_file *)conchF
310c0 69 6c 65 2c 20 77 72 69 74 65 42 75 66 66 65 72  ile, writeBuffer
310d0 2c 20 77 72 69 74 65 53 69 7a 65 2c 20 30 29 3b  , writeSize, 0);
310e0 0a 20 20 20 20 20 20 20 20 66 73 79 6e 63 28 63  .        fsync(c
310f0 6f 6e 63 68 46 69 6c 65 2d 3e 68 29 3b 0a 20 20  onchFile->h);.  
31100 20 20 20 20 20 20 2f 2a 20 49 66 20 77 65 20 63        /* If we c
31110 72 65 61 74 65 64 20 61 20 6e 65 77 20 63 6f 6e  reated a new con
31120 63 68 20 66 69 6c 65 20 28 6e 6f 74 20 6a 75 73  ch file (not jus
31130 74 20 75 70 64 61 74 65 64 20 74 68 65 20 63 6f  t updated the co
31140 6e 74 65 6e 74 73 20 6f 66 20 61 20 0a 20 20 20  ntents of a .   
31150 20 20 20 20 20 20 2a 2a 20 76 61 6c 69 64 20 63        ** valid c
31160 6f 6e 63 68 20 66 69 6c 65 29 2c 20 74 72 79 20  onch file), try 
31170 74 6f 20 6d 61 74 63 68 20 74 68 65 20 70 65 72  to match the per
31180 6d 69 73 73 69 6f 6e 73 20 6f 66 20 74 68 65 20  missions of the 
31190 64 61 74 61 62 61 73 65 20 0a 20 20 20 20 20 20  database .      
311a0 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66     */.        if
311b0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
311c0 26 26 20 63 72 65 61 74 65 43 6f 6e 63 68 20 29  && createConch )
311d0 7b 0a 20 20 20 20 20 20 20 20 20 20 73 74 72 75  {.          stru
311e0 63 74 20 73 74 61 74 20 62 75 66 3b 0a 20 20 20  ct stat buf;.   
311f0 20 20 20 20 20 20 20 69 6e 74 20 65 72 72 20 3d         int err =
31200 20 66 73 74 61 74 28 70 46 69 6c 65 2d 3e 68 2c   fstat(pFile->h,
31210 20 26 62 75 66 29 3b 0a 20 20 20 20 20 20 20 20   &buf);.        
31220 20 20 69 66 28 20 65 72 72 3d 3d 30 20 29 7b 0a    if( err==0 ){.
31230 20 20 20 20 20 20 20 20 20 20 20 20 6d 6f 64 65              mode
31240 5f 74 20 63 6d 6f 64 65 20 3d 20 62 75 66 2e 73  _t cmode = buf.s
31250 74 5f 6d 6f 64 65 26 28 53 5f 49 52 55 53 52 7c  t_mode&(S_IRUSR|
31260 53 5f 49 57 55 53 52 20 7c 20 53 5f 49 52 47 52  S_IWUSR | S_IRGR
31270 50 7c 53 5f 49 57 47 52 50 20 7c 0a 20 20 20 20  P|S_IWGRP |.    
31280 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31290 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
312a0 20 20 20 20 53 5f 49 52 4f 54 48 7c 53 5f 49 57      S_IROTH|S_IW
312b0 4f 54 48 29 3b 0a 20 20 20 20 20 20 20 20 20 20  OTH);.          
312c0 20 20 2f 2a 20 74 72 79 20 74 6f 20 6d 61 74 63    /* try to matc
312d0 68 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  h the database f
312e0 69 6c 65 20 52 2f 57 20 70 65 72 6d 69 73 73 69  ile R/W permissi
312f0 6f 6e 73 2c 20 69 67 6e 6f 72 65 20 66 61 69 6c  ons, ignore fail
31300 75 72 65 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53  ure */.#ifndef S
31310 51 4c 49 54 45 5f 50 52 4f 58 59 5f 44 45 42 55  QLITE_PROXY_DEBU
31320 47 0a 20 20 20 20 20 20 20 20 20 20 20 20 66 63  G.            fc
31330 68 6d 6f 64 28 63 6f 6e 63 68 46 69 6c 65 2d 3e  hmod(conchFile->
31340 68 2c 20 63 6d 6f 64 65 29 3b 0a 23 65 6c 73 65  h, cmode);.#else
31350 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
31360 20 66 63 68 6d 6f 64 28 63 6f 6e 63 68 46 69 6c   fchmod(conchFil
31370 65 2d 3e 68 2c 20 63 6d 6f 64 65 29 21 3d 30 20  e->h, cmode)!=0 
31380 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
31390 20 69 6e 74 20 63 6f 64 65 20 3d 20 65 72 72 6e   int code = errn
313a0 6f 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  o;.             
313b0 20 66 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c   fprintf(stderr,
313c0 20 22 66 63 68 6d 6f 64 20 25 6f 20 46 41 49 4c   "fchmod %o FAIL
313d0 45 44 20 77 69 74 68 20 25 64 20 25 73 5c 6e 22  ED with %d %s\n"
313e0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
313f0 20 20 20 20 20 20 20 20 63 6d 6f 64 65 2c 20 63          cmode, c
31400 6f 64 65 2c 20 73 74 72 65 72 72 6f 72 28 63 6f  ode, strerror(co
31410 64 65 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20  de));.          
31420 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 20    } else {.     
31430 20 20 20 20 20 20 20 20 20 66 70 72 69 6e 74 66           fprintf
31440 28 73 74 64 65 72 72 2c 20 22 66 63 68 6d 6f 64  (stderr, "fchmod
31450 20 25 6f 20 53 55 43 43 45 44 45 44 5c 6e 22 2c   %o SUCCEDED\n",
31460 63 6d 6f 64 65 29 3b 0a 20 20 20 20 20 20 20 20  cmode);.        
31470 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
31480 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
31490 20 20 20 69 6e 74 20 63 6f 64 65 20 3d 20 65 72     int code = er
314a0 72 6e 6f 3b 0a 20 20 20 20 20 20 20 20 20 20 20  rno;.           
314b0 20 66 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c   fprintf(stderr,
314c0 20 22 53 54 41 54 20 46 41 49 4c 45 44 5b 25 64   "STAT FAILED[%d
314d0 5d 20 77 69 74 68 20 25 64 20 25 73 5c 6e 22 2c  ] with %d %s\n",
314e0 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
314f0 20 20 20 20 20 20 65 72 72 2c 20 63 6f 64 65 2c        err, code,
31500 20 73 74 72 65 72 72 6f 72 28 63 6f 64 65 29 29   strerror(code))
31510 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 20  ;.#endif.       
31520 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
31530 20 20 20 20 20 7d 0a 20 20 20 20 20 20 63 6f 6e       }.      con
31540 63 68 46 69 6c 65 2d 3e 70 4d 65 74 68 6f 64 2d  chFile->pMethod-
31550 3e 78 55 6e 6c 6f 63 6b 28 28 73 71 6c 69 74 65  >xUnlock((sqlite
31560 33 5f 66 69 6c 65 2a 29 63 6f 6e 63 68 46 69 6c  3_file*)conchFil
31570 65 2c 20 53 48 41 52 45 44 5f 4c 4f 43 4b 29 3b  e, SHARED_LOCK);
31580 0a 20 20 20 20 20 20 0a 20 20 20 20 65 6e 64 5f  .      .    end_
31590 74 61 6b 65 63 6f 6e 63 68 3a 0a 20 20 20 20 20  takeconch:.     
315a0 20 4f 53 54 52 41 43 45 32 28 22 54 52 41 4e 53   OSTRACE2("TRANS
315b0 50 52 4f 58 59 3a 20 43 4c 4f 53 45 20 20 25 64  PROXY: CLOSE  %d
315c0 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 29 3b 0a  \n", pFile->h);.
315d0 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
315e0 4c 49 54 45 5f 4f 4b 20 26 26 20 70 46 69 6c 65  LITE_OK && pFile
315f0 2d 3e 6f 70 65 6e 46 6c 61 67 73 20 29 7b 0a 20  ->openFlags ){. 
31600 20 20 20 20 20 20 20 69 66 28 20 70 46 69 6c 65         if( pFile
31610 2d 3e 68 3e 3d 30 20 29 7b 0a 23 69 66 64 65 66  ->h>=0 ){.#ifdef
31620 20 53 54 52 49 43 54 5f 43 4c 4f 53 45 5f 45 52   STRICT_CLOSE_ER
31630 52 4f 52 0a 20 20 20 20 20 20 20 20 20 20 69 66  ROR.          if
31640 28 20 63 6c 6f 73 65 28 70 46 69 6c 65 2d 3e 68  ( close(pFile->h
31650 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ) ){.           
31660 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e   pFile->lastErrn
31670 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20  o = errno;.     
31680 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51         return SQ
31690 4c 49 54 45 5f 49 4f 45 52 52 5f 43 4c 4f 53 45  LITE_IOERR_CLOSE
316a0 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 23 65  ;.          }.#e
316b0 6c 73 65 0a 20 20 20 20 20 20 20 20 20 20 63 6c  lse.          cl
316c0 6f 73 65 28 70 46 69 6c 65 2d 3e 68 29 3b 20 2f  ose(pFile->h); /
316d0 2a 20 73 69 6c 65 6e 74 6c 79 20 6c 65 61 6b 20  * silently leak 
316e0 66 64 20 69 66 20 66 61 69 6c 20 2a 2f 0a 23 65  fd if fail */.#e
316f0 6e 64 69 66 0a 20 20 20 20 20 20 20 20 7d 0a 20  ndif.        }. 
31700 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 68 20         pFile->h 
31710 3d 20 2d 31 3b 0a 20 20 20 20 20 20 20 20 69 6e  = -1;.        in
31720 74 20 66 64 20 3d 20 6f 70 65 6e 28 70 43 74 78  t fd = open(pCtx
31730 2d 3e 64 62 50 61 74 68 2c 20 70 46 69 6c 65 2d  ->dbPath, pFile-
31740 3e 6f 70 65 6e 46 6c 61 67 73 2c 0a 20 20 20 20  >openFlags,.    
31750 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31760 20 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54    SQLITE_DEFAULT
31770 5f 46 49 4c 45 5f 50 45 52 4d 49 53 53 49 4f 4e  _FILE_PERMISSION
31780 53 29 3b 0a 20 20 20 20 20 20 20 20 4f 53 54 52  S);.        OSTR
31790 41 43 45 32 28 22 54 52 41 4e 53 50 52 4f 58 59  ACE2("TRANSPROXY
317a0 3a 20 4f 50 45 4e 20 20 25 64 5c 6e 22 2c 20 66  : OPEN  %d\n", f
317b0 64 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  d);.        if( 
317c0 66 64 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  fd>=0 ){.       
317d0 20 20 20 70 46 69 6c 65 2d 3e 68 20 3d 20 66 64     pFile->h = fd
317e0 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
317f0 0a 20 20 20 20 20 20 20 20 20 20 72 63 3d 53 51  .          rc=SQ
31800 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 42 4b  LITE_CANTOPEN_BK
31810 50 54 3b 20 2f 2a 20 53 51 4c 49 54 45 5f 42 55  PT; /* SQLITE_BU
31820 53 59 3f 20 70 72 6f 78 79 54 61 6b 65 43 6f 6e  SY? proxyTakeCon
31830 63 68 20 63 61 6c 6c 65 64 0a 20 20 20 20 20 20  ch called.      
31840 20 20 20 20 20 64 75 72 69 6e 67 20 6c 6f 63 6b       during lock
31850 69 6e 67 20 2a 2f 0a 20 20 20 20 20 20 20 20 7d  ing */.        }
31860 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
31870 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
31880 20 26 26 20 21 70 43 74 78 2d 3e 6c 6f 63 6b 50   && !pCtx->lockP
31890 72 6f 78 79 20 29 7b 0a 20 20 20 20 20 20 20 20  roxy ){.        
318a0 63 68 61 72 20 2a 70 61 74 68 20 3d 20 74 65 6d  char *path = tem
318b0 70 4c 6f 63 6b 50 61 74 68 20 3f 20 74 65 6d 70  pLockPath ? temp
318c0 4c 6f 63 6b 50 61 74 68 20 3a 20 70 43 74 78 2d  LockPath : pCtx-
318d0 3e 6c 6f 63 6b 50 72 6f 78 79 50 61 74 68 3b 0a  >lockProxyPath;.
318e0 20 20 20 20 20 20 20 20 72 63 20 3d 20 70 72 6f          rc = pro
318f0 78 79 43 72 65 61 74 65 55 6e 69 78 46 69 6c 65  xyCreateUnixFile
31900 28 70 61 74 68 2c 20 26 70 43 74 78 2d 3e 6c 6f  (path, &pCtx->lo
31910 63 6b 50 72 6f 78 79 2c 20 31 29 3b 0a 20 20 20  ckProxy, 1);.   
31920 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
31930 49 54 45 5f 4f 4b 20 26 26 20 72 63 21 3d 53 51  ITE_OK && rc!=SQ
31940 4c 49 54 45 5f 4e 4f 4d 45 4d 20 26 26 20 74 72  LITE_NOMEM && tr
31950 79 4f 6c 64 4c 6f 63 6b 50 61 74 68 20 29 7b 0a  yOldLockPath ){.
31960 20 20 20 20 20 20 20 20 20 20 2f 2a 20 77 65 20            /* we 
31970 63 6f 75 6c 64 6e 27 74 20 63 72 65 61 74 65 20  couldn't create 
31980 74 68 65 20 70 72 6f 78 79 20 6c 6f 63 6b 20 66  the proxy lock f
31990 69 6c 65 20 77 69 74 68 20 74 68 65 20 6f 6c 64  ile with the old
319a0 20 6c 6f 63 6b 20 66 69 6c 65 20 70 61 74 68 0a   lock file path.
319b0 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 73 6f             ** so
319c0 20 74 72 79 20 61 67 61 69 6e 20 76 69 61 20 61   try again via a
319d0 75 74 6f 2d 6e 61 6d 69 6e 67 20 0a 20 20 20 20  uto-naming .    
319e0 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
319f0 20 20 20 20 66 6f 72 63 65 4e 65 77 4c 6f 63 6b      forceNewLock
31a00 50 61 74 68 20 3d 20 31 3b 0a 20 20 20 20 20 20  Path = 1;.      
31a10 20 20 20 20 74 72 79 4f 6c 64 4c 6f 63 6b 50 61      tryOldLockPa
31a20 74 68 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  th = 0;.        
31a30 20 20 63 6f 6e 74 69 6e 75 65 3b 20 2f 2a 20 67    continue; /* g
31a40 6f 20 62 61 63 6b 20 74 6f 20 74 68 65 20 64 6f  o back to the do
31a50 20 7b 7d 20 77 68 69 6c 65 20 73 74 61 72 74 20   {} while start 
31a60 70 6f 69 6e 74 2c 20 74 72 79 20 61 67 61 69 6e  point, try again
31a70 20 2a 2f 0a 20 20 20 20 20 20 20 20 7d 0a 20 20   */.        }.  
31a80 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
31a90 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
31aa0 0a 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 65 64  .        /* Need
31ab0 20 74 6f 20 6d 61 6b 65 20 61 20 63 6f 70 79 20   to make a copy 
31ac0 6f 66 20 70 61 74 68 20 69 66 20 77 65 20 65 78  of path if we ex
31ad0 74 72 61 63 74 65 64 20 74 68 65 20 76 61 6c 75  tracted the valu
31ae0 65 0a 20 20 20 20 20 20 20 20 20 2a 2a 20 66 72  e.         ** fr
31af0 6f 6d 20 74 68 65 20 63 6f 6e 63 68 20 66 69 6c  om the conch fil
31b00 65 20 6f 72 20 74 68 65 20 70 61 74 68 20 77 61  e or the path wa
31b10 73 20 61 6c 6c 6f 63 61 74 65 64 20 6f 6e 20 74  s allocated on t
31b20 68 65 20 73 74 61 63 6b 0a 20 20 20 20 20 20 20  he stack.       
31b30 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28    */.        if(
31b40 20 74 65 6d 70 4c 6f 63 6b 50 61 74 68 20 29 7b   tempLockPath ){
31b50 0a 20 20 20 20 20 20 20 20 20 20 70 43 74 78 2d  .          pCtx-
31b60 3e 6c 6f 63 6b 50 72 6f 78 79 50 61 74 68 20 3d  >lockProxyPath =
31b70 20 73 71 6c 69 74 65 33 44 62 53 74 72 44 75 70   sqlite3DbStrDup
31b80 28 30 2c 20 74 65 6d 70 4c 6f 63 6b 50 61 74 68  (0, tempLockPath
31b90 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
31ba0 20 21 70 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78   !pCtx->lockProx
31bb0 79 50 61 74 68 20 29 7b 0a 20 20 20 20 20 20 20  yPath ){.       
31bc0 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
31bd0 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 20 20  _NOMEM;.        
31be0 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20    }.        }.  
31bf0 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
31c00 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
31c10 0a 20 20 20 20 20 20 20 20 70 43 74 78 2d 3e 63  .        pCtx->c
31c20 6f 6e 63 68 48 65 6c 64 20 3d 20 31 3b 0a 20 20  onchHeld = 1;.  
31c30 20 20 20 20 20 20 0a 20 20 20 20 20 20 20 20 69        .        i
31c40 66 28 20 70 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f  f( pCtx->lockPro
31c50 78 79 2d 3e 70 4d 65 74 68 6f 64 20 3d 3d 20 26  xy->pMethod == &
31c60 61 66 70 49 6f 4d 65 74 68 6f 64 73 20 29 7b 0a  afpIoMethods ){.
31c70 20 20 20 20 20 20 20 20 20 20 61 66 70 4c 6f 63            afpLoc
31c80 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 61 66 70  kingContext *afp
31c90 43 74 78 3b 0a 20 20 20 20 20 20 20 20 20 20 61  Ctx;.          a
31ca0 66 70 43 74 78 20 3d 20 28 61 66 70 4c 6f 63 6b  fpCtx = (afpLock
31cb0 69 6e 67 43 6f 6e 74 65 78 74 20 2a 29 70 43 74  ingContext *)pCt
31cc0 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 2d 3e 6c 6f  x->lockProxy->lo
31cd0 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 0a 20 20  ckingContext;.  
31ce0 20 20 20 20 20 20 20 20 61 66 70 43 74 78 2d 3e          afpCtx->
31cf0 64 62 50 61 74 68 20 3d 20 70 43 74 78 2d 3e 6c  dbPath = pCtx->l
31d00 6f 63 6b 50 72 6f 78 79 50 61 74 68 3b 0a 20 20  ockProxyPath;.  
31d10 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 20        }.      } 
31d20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 20 20 63  else {.        c
31d30 6f 6e 63 68 46 69 6c 65 2d 3e 70 4d 65 74 68 6f  onchFile->pMetho
31d40 64 2d 3e 78 55 6e 6c 6f 63 6b 28 28 73 71 6c 69  d->xUnlock((sqli
31d50 74 65 33 5f 66 69 6c 65 2a 29 63 6f 6e 63 68 46  te3_file*)conchF
31d60 69 6c 65 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20  ile, NO_LOCK);. 
31d70 20 20 20 20 20 7d 0a 20 20 20 20 20 20 4f 53 54       }.      OST
31d80 52 41 43 45 33 28 22 54 41 4b 45 43 4f 4e 43 48  RACE3("TAKECONCH
31d90 20 20 25 64 20 25 73 5c 6e 22 2c 20 63 6f 6e 63    %d %s\n", conc
31da0 68 46 69 6c 65 2d 3e 68 2c 20 72 63 3d 3d 53 51  hFile->h, rc==SQ
31db0 4c 49 54 45 5f 4f 4b 3f 22 6f 6b 22 3a 22 66 61  LITE_OK?"ok":"fa
31dc0 69 6c 65 64 22 29 3b 0a 20 20 20 20 20 20 72 65  iled");.      re
31dd0 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 20 77  turn rc;.    } w
31de0 68 69 6c 65 20 28 31 29 3b 20 2f 2a 20 69 6e 20  hile (1); /* in 
31df0 63 61 73 65 20 77 65 20 6e 65 65 64 20 74 6f 20  case we need to 
31e00 72 65 74 72 79 20 74 68 65 20 3a 61 75 74 6f 3a  retry the :auto:
31e10 20 6c 6f 63 6b 20 66 69 6c 65 20 2d 20 77 65 20   lock file - we 
31e20 73 68 6f 75 6c 64 20 6e 65 76 65 72 20 67 65 74  should never get
31e30 20 68 65 72 65 20 65 78 63 65 70 74 20 76 69 61   here except via
31e40 20 74 68 65 20 27 63 6f 6e 74 69 6e 75 65 27 20   the 'continue' 
31e50 63 61 6c 6c 2e 20 2a 2f 0a 20 20 7d 0a 7d 0a 0a  call. */.  }.}..
31e60 2f 2a 0a 2a 2a 20 49 66 20 70 46 69 6c 65 20 68  /*.** If pFile h
31e70 6f 6c 64 73 20 61 20 6c 6f 63 6b 20 6f 6e 20 61  olds a lock on a
31e80 20 63 6f 6e 63 68 20 66 69 6c 65 2c 20 74 68 65   conch file, the
31e90 6e 20 72 65 6c 65 61 73 65 20 74 68 61 74 20 6c  n release that l
31ea0 6f 63 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ock..*/.static i
31eb0 6e 74 20 70 72 6f 78 79 52 65 6c 65 61 73 65 43  nt proxyReleaseC
31ec0 6f 6e 63 68 28 75 6e 69 78 46 69 6c 65 20 2a 70  onch(unixFile *p
31ed0 46 69 6c 65 29 7b 0a 20 20 69 6e 74 20 72 63 20  File){.  int rc 
31ee0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20  = SQLITE_OK;    
31ef0 20 20 20 20 20 2f 2a 20 53 75 62 72 6f 75 74 69       /* Subrouti
31f00 6e 65 20 72 65 74 75 72 6e 20 63 6f 64 65 20 2a  ne return code *
31f10 2f 0a 20 20 70 72 6f 78 79 4c 6f 63 6b 69 6e 67  /.  proxyLocking
31f20 43 6f 6e 74 65 78 74 20 2a 70 43 74 78 3b 20 20  Context *pCtx;  
31f30 2f 2a 20 54 68 65 20 6c 6f 63 6b 69 6e 67 20 63  /* The locking c
31f40 6f 6e 74 65 78 74 20 66 6f 72 20 74 68 65 20 70  ontext for the p
31f50 72 6f 78 79 20 6c 6f 63 6b 20 2a 2f 0a 20 20 75  roxy lock */.  u
31f60 6e 69 78 46 69 6c 65 20 2a 63 6f 6e 63 68 46 69  nixFile *conchFi
31f70 6c 65 3b 20 20 20 20 20 20 20 20 2f 2a 20 4e 61  le;        /* Na
31f80 6d 65 20 6f 66 20 74 68 65 20 63 6f 6e 63 68 20  me of the conch 
31f90 66 69 6c 65 20 2a 2f 0a 0a 20 20 70 43 74 78 20  file */..  pCtx 
31fa0 3d 20 28 70 72 6f 78 79 4c 6f 63 6b 69 6e 67 43  = (proxyLockingC
31fb0 6f 6e 74 65 78 74 20 2a 29 70 46 69 6c 65 2d 3e  ontext *)pFile->
31fc0 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 0a  lockingContext;.
31fd0 20 20 63 6f 6e 63 68 46 69 6c 65 20 3d 20 70 43    conchFile = pC
31fe0 74 78 2d 3e 63 6f 6e 63 68 46 69 6c 65 3b 0a 20  tx->conchFile;. 
31ff0 20 4f 53 54 52 41 43 45 34 28 22 52 45 4c 45 41   OSTRACE4("RELEA
32000 53 45 43 4f 4e 43 48 20 20 25 64 20 66 6f 72 20  SECONCH  %d for 
32010 25 73 20 70 69 64 3d 25 64 5c 6e 22 2c 20 63 6f  %s pid=%d\n", co
32020 6e 63 68 46 69 6c 65 2d 3e 68 2c 0a 20 20 20 20  nchFile->h,.    
32030 20 20 20 20 20 20 20 28 70 43 74 78 2d 3e 6c 6f         (pCtx->lo
32040 63 6b 50 72 6f 78 79 50 61 74 68 20 3f 20 70 43  ckProxyPath ? pC
32050 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 50 61 74  tx->lockProxyPat
32060 68 20 3a 20 22 3a 61 75 74 6f 3a 22 29 2c 20 0a  h : ":auto:"), .
32070 20 20 20 20 20 20 20 20 20 20 20 67 65 74 70 69             getpi
32080 64 28 29 29 3b 0a 20 20 69 66 28 20 70 43 74 78  d());.  if( pCtx
32090 2d 3e 63 6f 6e 63 68 48 65 6c 64 3e 30 20 29 7b  ->conchHeld>0 ){
320a0 0a 20 20 20 20 72 63 20 3d 20 63 6f 6e 63 68 46  .    rc = conchF
320b0 69 6c 65 2d 3e 70 4d 65 74 68 6f 64 2d 3e 78 55  ile->pMethod->xU
320c0 6e 6c 6f 63 6b 28 28 73 71 6c 69 74 65 33 5f 66  nlock((sqlite3_f
320d0 69 6c 65 2a 29 63 6f 6e 63 68 46 69 6c 65 2c 20  ile*)conchFile, 
320e0 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20 20 7d 0a 20 20  NO_LOCK);.  }.  
320f0 70 43 74 78 2d 3e 63 6f 6e 63 68 48 65 6c 64 20  pCtx->conchHeld 
32100 3d 20 30 3b 0a 20 20 4f 53 54 52 41 43 45 33 28  = 0;.  OSTRACE3(
32110 22 52 45 4c 45 41 53 45 43 4f 4e 43 48 20 20 25  "RELEASECONCH  %
32120 64 20 25 73 5c 6e 22 2c 20 63 6f 6e 63 68 46 69  d %s\n", conchFi
32130 6c 65 2d 3e 68 2c 0a 20 20 20 20 20 20 20 20 20  le->h,.         
32140 20 20 28 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b    (rc==SQLITE_OK
32150 20 3f 20 22 6f 6b 22 20 3a 20 22 66 61 69 6c 65   ? "ok" : "faile
32160 64 22 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  d"));.  return r
32170 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65  c;.}../*.** Give
32180 6e 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 20  n the name of a 
32190 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 63  database file, c
321a0 6f 6d 70 75 74 65 20 74 68 65 20 6e 61 6d 65 20  ompute the name 
321b0 6f 66 20 69 74 73 20 63 6f 6e 63 68 20 66 69 6c  of its conch fil
321c0 65 2e 0a 2a 2a 20 53 74 6f 72 65 20 74 68 65 20  e..** Store the 
321d0 63 6f 6e 63 68 20 66 69 6c 65 6e 61 6d 65 20 69  conch filename i
321e0 6e 20 6d 65 6d 6f 72 79 20 6f 62 74 61 69 6e 65  n memory obtaine
321f0 64 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 5f 6d  d from sqlite3_m
32200 61 6c 6c 6f 63 28 29 2e 0a 2a 2a 20 4d 61 6b 65  alloc()..** Make
32210 20 2a 70 43 6f 6e 63 68 50 61 74 68 20 70 6f 69   *pConchPath poi
32220 6e 74 20 74 6f 20 74 68 65 20 6e 65 77 20 6e 61  nt to the new na
32230 6d 65 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49  me.  Return SQLI
32240 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73  TE_OK on success
32250 0a 2a 2a 20 6f 72 20 53 51 4c 49 54 45 5f 4e 4f  .** or SQLITE_NO
32260 4d 45 4d 20 69 66 20 75 6e 61 62 6c 65 20 74 6f  MEM if unable to
32270 20 6f 62 74 61 69 6e 20 6d 65 6d 6f 72 79 2e 0a   obtain memory..
32280 2a 2a 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 65 72  **.** The caller
32290 20 69 73 20 72 65 73 70 6f 6e 73 69 62 6c 65 20   is responsible 
322a0 66 6f 72 20 65 6e 73 75 72 69 6e 67 20 74 68 61  for ensuring tha
322b0 74 20 74 68 65 20 61 6c 6c 6f 63 61 74 65 64 20  t the allocated 
322c0 6d 65 6d 6f 72 79 0a 2a 2a 20 73 70 61 63 65 20  memory.** space 
322d0 69 73 20 65 76 65 6e 74 75 61 6c 6c 79 20 66 72  is eventually fr
322e0 65 65 64 2e 0a 2a 2a 0a 2a 2a 20 2a 70 43 6f 6e  eed..**.** *pCon
322f0 63 68 50 61 74 68 20 69 73 20 73 65 74 20 74 6f  chPath is set to
32300 20 4e 55 4c 4c 20 69 66 20 61 20 6d 65 6d 6f 72   NULL if a memor
32310 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 65 72 72  y allocation err
32320 6f 72 20 6f 63 63 75 72 73 2e 0a 2a 2f 0a 73 74  or occurs..*/.st
32330 61 74 69 63 20 69 6e 74 20 70 72 6f 78 79 43 72  atic int proxyCr
32340 65 61 74 65 43 6f 6e 63 68 50 61 74 68 6e 61 6d  eateConchPathnam
32350 65 28 63 68 61 72 20 2a 64 62 50 61 74 68 2c 20  e(char *dbPath, 
32360 63 68 61 72 20 2a 2a 70 43 6f 6e 63 68 50 61 74  char **pConchPat
32370 68 29 7b 0a 20 20 69 6e 74 20 69 3b 20 20 20 20  h){.  int i;    
32380 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32390 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e      /* Loop coun
323a0 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 6c 65 6e  ter */.  int len
323b0 20 3d 20 28 69 6e 74 29 73 74 72 6c 65 6e 28 64   = (int)strlen(d
323c0 62 50 61 74 68 29 3b 20 2f 2a 20 4c 65 6e 67 74  bPath); /* Lengt
323d0 68 20 6f 66 20 64 61 74 61 62 61 73 65 20 66 69  h of database fi
323e0 6c 65 6e 61 6d 65 20 2d 20 64 62 50 61 74 68 20  lename - dbPath 
323f0 2a 2f 0a 20 20 63 68 61 72 20 2a 63 6f 6e 63 68  */.  char *conch
32400 50 61 74 68 3b 20 20 20 20 20 20 20 20 20 20 20  Path;           
32410 20 20 20 2f 2a 20 62 75 66 66 65 72 20 69 6e 20     /* buffer in 
32420 77 68 69 63 68 20 74 6f 20 63 6f 6e 73 74 72 75  which to constru
32430 63 74 20 63 6f 6e 63 68 20 6e 61 6d 65 20 2a 2f  ct conch name */
32440 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20  ..  /* Allocate 
32450 73 70 61 63 65 20 66 6f 72 20 74 68 65 20 63 6f  space for the co
32460 6e 63 68 20 66 69 6c 65 6e 61 6d 65 20 61 6e 64  nch filename and
32470 20 69 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20   initialize the 
32480 6e 61 6d 65 20 74 6f 0a 20 20 2a 2a 20 74 68 65  name to.  ** the
32490 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 6f 72 69   name of the ori
324a0 67 69 6e 61 6c 20 64 61 74 61 62 61 73 65 20 66  ginal database f
324b0 69 6c 65 2e 20 2a 2f 20 20 0a 20 20 2a 70 43 6f  ile. */  .  *pCo
324c0 6e 63 68 50 61 74 68 20 3d 20 63 6f 6e 63 68 50  nchPath = conchP
324d0 61 74 68 20 3d 20 28 63 68 61 72 20 2a 29 73 71  ath = (char *)sq
324e0 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 6c 65 6e  lite3_malloc(len
324f0 20 2b 20 38 29 3b 0a 20 20 69 66 28 20 63 6f 6e   + 8);.  if( con
32500 63 68 50 61 74 68 3d 3d 30 20 29 7b 0a 20 20 20  chPath==0 ){.   
32510 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
32520 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 6d 65 6d 63  OMEM;.  }.  memc
32530 70 79 28 63 6f 6e 63 68 50 61 74 68 2c 20 64 62  py(conchPath, db
32540 50 61 74 68 2c 20 6c 65 6e 2b 31 29 3b 0a 20 20  Path, len+1);.  
32550 0a 20 20 2f 2a 20 6e 6f 77 20 69 6e 73 65 72 74  .  /* now insert
32560 20 61 20 22 2e 22 20 62 65 66 6f 72 65 20 74 68   a "." before th
32570 65 20 6c 61 73 74 20 2f 20 63 68 61 72 61 63 74  e last / charact
32580 65 72 20 2a 2f 0a 20 20 66 6f 72 28 20 69 3d 28  er */.  for( i=(
32590 6c 65 6e 2d 31 29 3b 20 69 3e 3d 30 3b 20 69 2d  len-1); i>=0; i-
325a0 2d 20 29 7b 0a 20 20 20 20 69 66 28 20 63 6f 6e  - ){.    if( con
325b0 63 68 50 61 74 68 5b 69 5d 3d 3d 27 2f 27 20 29  chPath[i]=='/' )
325c0 7b 0a 20 20 20 20 20 20 69 2b 2b 3b 0a 20 20 20  {.      i++;.   
325d0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
325e0 20 20 7d 0a 20 20 63 6f 6e 63 68 50 61 74 68 5b    }.  conchPath[
325f0 69 5d 3d 27 2e 27 3b 0a 20 20 77 68 69 6c 65 20  i]='.';.  while 
32600 28 20 69 3c 6c 65 6e 20 29 7b 0a 20 20 20 20 63  ( i<len ){.    c
32610 6f 6e 63 68 50 61 74 68 5b 69 2b 31 5d 3d 64 62  onchPath[i+1]=db
32620 50 61 74 68 5b 69 5d 3b 0a 20 20 20 20 69 2b 2b  Path[i];.    i++
32630 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 61 70 70 65  ;.  }..  /* appe
32640 6e 64 20 74 68 65 20 22 2d 63 6f 6e 63 68 22 20  nd the "-conch" 
32650 73 75 66 66 69 78 20 74 6f 20 74 68 65 20 66 69  suffix to the fi
32660 6c 65 20 2a 2f 0a 20 20 6d 65 6d 63 70 79 28 26  le */.  memcpy(&
32670 63 6f 6e 63 68 50 61 74 68 5b 69 2b 31 5d 2c 20  conchPath[i+1], 
32680 22 2d 63 6f 6e 63 68 22 2c 20 37 29 3b 0a 20 20  "-conch", 7);.  
32690 61 73 73 65 72 74 28 20 28 69 6e 74 29 73 74 72  assert( (int)str
326a0 6c 65 6e 28 63 6f 6e 63 68 50 61 74 68 29 20 3d  len(conchPath) =
326b0 3d 20 6c 65 6e 2b 37 20 29 3b 0a 0a 20 20 72 65  = len+7 );..  re
326c0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
326d0 7d 0a 0a 0a 2f 2a 20 54 61 6b 65 73 20 61 20 66  }.../* Takes a f
326e0 75 6c 6c 79 20 63 6f 6e 66 69 67 75 72 65 64 20  ully configured 
326f0 70 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 2d 73 74  proxy locking-st
32700 79 6c 65 20 75 6e 69 78 20 66 69 6c 65 20 61 6e  yle unix file an
32710 64 20 73 77 69 74 63 68 65 73 0a 2a 2a 20 74 68  d switches.** th
32720 65 20 6c 6f 63 61 6c 20 6c 6f 63 6b 20 66 69 6c  e local lock fil
32730 65 20 70 61 74 68 20 0a 2a 2f 0a 73 74 61 74 69  e path .*/.stati
32740 63 20 69 6e 74 20 73 77 69 74 63 68 4c 6f 63 6b  c int switchLock
32750 50 72 6f 78 79 50 61 74 68 28 75 6e 69 78 46 69  ProxyPath(unixFi
32760 6c 65 20 2a 70 46 69 6c 65 2c 20 63 6f 6e 73 74  le *pFile, const
32770 20 63 68 61 72 20 2a 70 61 74 68 29 20 7b 0a 20   char *path) {. 
32780 20 70 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e   proxyLockingCon
32790 74 65 78 74 20 2a 70 43 74 78 20 3d 20 28 70 72  text *pCtx = (pr
327a0 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78  oxyLockingContex
327b0 74 2a 29 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e  t*)pFile->lockin
327c0 67 43 6f 6e 74 65 78 74 3b 0a 20 20 63 68 61 72  gContext;.  char
327d0 20 2a 6f 6c 64 50 61 74 68 20 3d 20 70 43 74 78   *oldPath = pCtx
327e0 2d 3e 6c 6f 63 6b 50 72 6f 78 79 50 61 74 68 3b  ->lockProxyPath;
327f0 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
32800 54 45 5f 4f 4b 3b 0a 0a 20 20 69 66 28 20 70 46  TE_OK;..  if( pF
32810 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 21 3d 4e  ile->locktype!=N
32820 4f 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 72 65  O_LOCK ){.    re
32830 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59  turn SQLITE_BUSY
32840 3b 0a 20 20 7d 20 20 0a 0a 20 20 2f 2a 20 6e 6f  ;.  }  ..  /* no
32850 74 68 69 6e 67 20 74 6f 20 64 6f 20 69 66 20 74  thing to do if t
32860 68 65 20 70 61 74 68 20 69 73 20 4e 55 4c 4c 2c  he path is NULL,
32870 20 3a 61 75 74 6f 3a 20 6f 72 20 6d 61 74 63 68   :auto: or match
32880 65 73 20 74 68 65 20 65 78 69 73 74 69 6e 67 20  es the existing 
32890 70 61 74 68 20 2a 2f 0a 20 20 69 66 28 20 21 70  path */.  if( !p
328a0 61 74 68 20 7c 7c 20 70 61 74 68 5b 30 5d 3d 3d  ath || path[0]==
328b0 27 5c 30 27 20 7c 7c 20 21 73 74 72 63 6d 70 28  '\0' || !strcmp(
328c0 70 61 74 68 2c 20 22 3a 61 75 74 6f 3a 22 29 20  path, ":auto:") 
328d0 7c 7c 0a 20 20 20 20 28 6f 6c 64 50 61 74 68 20  ||.    (oldPath 
328e0 26 26 20 21 73 74 72 6e 63 6d 70 28 6f 6c 64 50  && !strncmp(oldP
328f0 61 74 68 2c 20 70 61 74 68 2c 20 4d 41 58 50 41  ath, path, MAXPA
32900 54 48 4c 45 4e 29 29 20 29 7b 0a 20 20 20 20 72  THLEN)) ){.    r
32910 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
32920 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 75 6e  .  }else{.    un
32930 69 78 46 69 6c 65 20 2a 6c 6f 63 6b 50 72 6f 78  ixFile *lockProx
32940 79 20 3d 20 70 43 74 78 2d 3e 6c 6f 63 6b 50 72  y = pCtx->lockPr
32950 6f 78 79 3b 0a 20 20 20 20 70 43 74 78 2d 3e 6c  oxy;.    pCtx->l
32960 6f 63 6b 50 72 6f 78 79 3d 4e 55 4c 4c 3b 0a 20  ockProxy=NULL;. 
32970 20 20 20 70 43 74 78 2d 3e 63 6f 6e 63 68 48 65     pCtx->conchHe
32980 6c 64 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20  ld = 0;.    if( 
32990 6c 6f 63 6b 50 72 6f 78 79 21 3d 4e 55 4c 4c 20  lockProxy!=NULL 
329a0 29 7b 0a 20 20 20 20 20 20 72 63 3d 6c 6f 63 6b  ){.      rc=lock
329b0 50 72 6f 78 79 2d 3e 70 4d 65 74 68 6f 64 2d 3e  Proxy->pMethod->
329c0 78 43 6c 6f 73 65 28 28 73 71 6c 69 74 65 33 5f  xClose((sqlite3_
329d0 66 69 6c 65 20 2a 29 6c 6f 63 6b 50 72 6f 78 79  file *)lockProxy
329e0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 20  );.      if( rc 
329f0 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20  ) return rc;.   
32a00 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
32a10 6c 6f 63 6b 50 72 6f 78 79 29 3b 0a 20 20 20 20  lockProxy);.    
32a20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  }.    sqlite3_fr
32a30 65 65 28 6f 6c 64 50 61 74 68 29 3b 0a 20 20 20  ee(oldPath);.   
32a40 20 70 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79   pCtx->lockProxy
32a50 50 61 74 68 20 3d 20 73 71 6c 69 74 65 33 44 62  Path = sqlite3Db
32a60 53 74 72 44 75 70 28 30 2c 20 70 61 74 68 29 3b  StrDup(0, path);
32a70 0a 20 20 7d 0a 20 20 0a 20 20 72 65 74 75 72 6e  .  }.  .  return
32a80 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 70 46   rc;.}../*.** pF
32a90 69 6c 65 20 69 73 20 61 20 66 69 6c 65 20 74 68  ile is a file th
32aa0 61 74 20 68 61 73 20 62 65 65 6e 20 6f 70 65 6e  at has been open
32ab0 65 64 20 62 79 20 61 20 70 72 69 6f 72 20 78 4f  ed by a prior xO
32ac0 70 65 6e 20 63 61 6c 6c 2e 20 20 64 62 50 61 74  pen call.  dbPat
32ad0 68 0a 2a 2a 20 69 73 20 61 20 73 74 72 69 6e 67  h.** is a string
32ae0 20 62 75 66 66 65 72 20 61 74 20 6c 65 61 73 74   buffer at least
32af0 20 4d 41 58 50 41 54 48 4c 45 4e 2b 31 20 63 68   MAXPATHLEN+1 ch
32b00 61 72 61 63 74 65 72 73 20 69 6e 20 73 69 7a 65  aracters in size
32b10 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
32b20 74 69 6e 65 20 66 69 6e 64 20 74 68 65 20 66 69  tine find the fi
32b30 6c 65 6e 61 6d 65 20 61 73 73 6f 63 69 61 74 65  lename associate
32b40 64 20 77 69 74 68 20 70 46 69 6c 65 20 61 6e 64  d with pFile and
32b50 20 77 72 69 74 65 73 20 69 74 0a 2a 2a 20 69 6e   writes it.** in
32b60 74 20 64 62 50 61 74 68 2e 0a 2a 2f 0a 73 74 61  t dbPath..*/.sta
32b70 74 69 63 20 69 6e 74 20 70 72 6f 78 79 47 65 74  tic int proxyGet
32b80 44 62 50 61 74 68 46 6f 72 55 6e 69 78 46 69 6c  DbPathForUnixFil
32b90 65 28 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c  e(unixFile *pFil
32ba0 65 2c 20 63 68 61 72 20 2a 64 62 50 61 74 68 29  e, char *dbPath)
32bb0 7b 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f 5f  {.#if defined(__
32bc0 41 50 50 4c 45 5f 5f 29 0a 20 20 69 66 28 20 70  APPLE__).  if( p
32bd0 46 69 6c 65 2d 3e 70 4d 65 74 68 6f 64 20 3d 3d  File->pMethod ==
32be0 20 26 61 66 70 49 6f 4d 65 74 68 6f 64 73 20 29   &afpIoMethods )
32bf0 7b 0a 20 20 20 20 2f 2a 20 61 66 70 20 73 74 79  {.    /* afp sty
32c00 6c 65 20 6b 65 65 70 73 20 61 20 72 65 66 65 72  le keeps a refer
32c10 65 6e 63 65 20 74 6f 20 74 68 65 20 64 62 20 70  ence to the db p
32c20 61 74 68 20 69 6e 20 74 68 65 20 66 69 6c 65 50  ath in the fileP
32c30 61 74 68 20 66 69 65 6c 64 20 0a 20 20 20 20 2a  ath field .    *
32c40 2a 20 6f 66 20 74 68 65 20 73 74 72 75 63 74 20  * of the struct 
32c50 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 28  */.    assert( (
32c60 69 6e 74 29 73 74 72 6c 65 6e 28 28 63 68 61 72  int)strlen((char
32c70 2a 29 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67  *)pFile->locking
32c80 43 6f 6e 74 65 78 74 29 3c 3d 4d 41 58 50 41 54  Context)<=MAXPAT
32c90 48 4c 45 4e 20 29 3b 0a 20 20 20 20 73 74 72 6c  HLEN );.    strl
32ca0 63 70 79 28 64 62 50 61 74 68 2c 20 28 28 61 66  cpy(dbPath, ((af
32cb0 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20  pLockingContext 
32cc0 2a 29 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67  *)pFile->locking
32cd0 43 6f 6e 74 65 78 74 29 2d 3e 64 62 50 61 74 68  Context)->dbPath
32ce0 2c 20 4d 41 58 50 41 54 48 4c 45 4e 29 3b 0a 20  , MAXPATHLEN);. 
32cf0 20 7d 20 65 6c 73 65 0a 23 65 6e 64 69 66 0a 20   } else.#endif. 
32d00 20 69 66 28 20 70 46 69 6c 65 2d 3e 70 4d 65 74   if( pFile->pMet
32d10 68 6f 64 20 3d 3d 20 26 64 6f 74 6c 6f 63 6b 49  hod == &dotlockI
32d20 6f 4d 65 74 68 6f 64 73 20 29 7b 0a 20 20 20 20  oMethods ){.    
32d30 2f 2a 20 64 6f 74 20 6c 6f 63 6b 20 73 74 79 6c  /* dot lock styl
32d40 65 20 75 73 65 73 20 74 68 65 20 6c 6f 63 6b 69  e uses the locki
32d50 6e 67 20 63 6f 6e 74 65 78 74 20 74 6f 20 73 74  ng context to st
32d60 6f 72 65 20 74 68 65 20 64 6f 74 20 6c 6f 63 6b  ore the dot lock
32d70 0a 20 20 20 20 2a 2a 20 66 69 6c 65 20 70 61 74  .    ** file pat
32d80 68 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6c 65 6e  h */.    int len
32d90 20 3d 20 73 74 72 6c 65 6e 28 28 63 68 61 72 20   = strlen((char 
32da0 2a 29 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67  *)pFile->locking
32db0 43 6f 6e 74 65 78 74 29 20 2d 20 73 74 72 6c 65  Context) - strle
32dc0 6e 28 44 4f 54 4c 4f 43 4b 5f 53 55 46 46 49 58  n(DOTLOCK_SUFFIX
32dd0 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 64 62  );.    memcpy(db
32de0 50 61 74 68 2c 20 28 63 68 61 72 20 2a 29 70 46  Path, (char *)pF
32df0 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74  ile->lockingCont
32e00 65 78 74 2c 20 6c 65 6e 20 2b 20 31 29 3b 0a 20  ext, len + 1);. 
32e10 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 61   }else{.    /* a
32e20 6c 6c 20 6f 74 68 65 72 20 73 74 79 6c 65 73 20  ll other styles 
32e30 75 73 65 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20  use the locking 
32e40 63 6f 6e 74 65 78 74 20 74 6f 20 73 74 6f 72 65  context to store
32e50 20 74 68 65 20 64 62 20 66 69 6c 65 20 70 61 74   the db file pat
32e60 68 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28  h */.    assert(
32e70 20 73 74 72 6c 65 6e 28 28 63 68 61 72 2a 29 70   strlen((char*)p
32e80 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e  File->lockingCon
32e90 74 65 78 74 29 3c 3d 4d 41 58 50 41 54 48 4c 45  text)<=MAXPATHLE
32ea0 4e 20 29 3b 0a 20 20 20 20 73 74 72 6c 63 70 79  N );.    strlcpy
32eb0 28 64 62 50 61 74 68 2c 20 28 63 68 61 72 20 2a  (dbPath, (char *
32ec0 29 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43  )pFile->lockingC
32ed0 6f 6e 74 65 78 74 2c 20 4d 41 58 50 41 54 48 4c  ontext, MAXPATHL
32ee0 45 4e 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  EN);.  }.  retur
32ef0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
32f00 2f 2a 0a 2a 2a 20 54 61 6b 65 73 20 61 6e 20 61  /*.** Takes an a
32f10 6c 72 65 61 64 79 20 66 69 6c 6c 65 64 20 69 6e  lready filled in
32f20 20 75 6e 69 78 20 66 69 6c 65 20 61 6e 64 20 61   unix file and a
32f30 6c 74 65 72 73 20 69 74 20 73 6f 20 61 6c 6c 20  lters it so all 
32f40 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 20 0a 2a 2a  file locking .**
32f50 20 77 69 6c 6c 20 62 65 20 70 65 72 66 6f 72 6d   will be perform
32f60 65 64 20 6f 6e 20 74 68 65 20 6c 6f 63 61 6c 20  ed on the local 
32f70 70 72 6f 78 79 20 6c 6f 63 6b 20 66 69 6c 65 2e  proxy lock file.
32f80 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20    The following 
32f90 66 69 65 6c 64 73 0a 2a 2a 20 61 72 65 20 70 72  fields.** are pr
32fa0 65 73 65 72 76 65 64 20 69 6e 20 74 68 65 20 6c  eserved in the l
32fb0 6f 63 6b 69 6e 67 20 63 6f 6e 74 65 78 74 20 73  ocking context s
32fc0 6f 20 74 68 61 74 20 74 68 65 79 20 63 61 6e 20  o that they can 
32fd0 62 65 20 72 65 73 74 6f 72 65 64 20 61 6e 64 20  be restored and 
32fe0 0a 2a 2a 20 74 68 65 20 75 6e 69 78 20 73 74 72  .** the unix str
32ff0 75 63 74 75 72 65 20 70 72 6f 70 65 72 6c 79 20  ucture properly 
33000 63 6c 65 61 6e 65 64 20 75 70 20 61 74 20 63 6c  cleaned up at cl
33010 6f 73 65 20 74 69 6d 65 3a 0a 2a 2a 20 20 2d 3e  ose time:.**  ->
33020 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 0a 2a  lockingContext.*
33030 2a 20 20 2d 3e 70 4d 65 74 68 6f 64 0a 2a 2f 0a  *  ->pMethod.*/.
33040 73 74 61 74 69 63 20 69 6e 74 20 70 72 6f 78 79  static int proxy
33050 54 72 61 6e 73 66 6f 72 6d 55 6e 69 78 46 69 6c  TransformUnixFil
33060 65 28 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c  e(unixFile *pFil
33070 65 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 70  e, const char *p
33080 61 74 68 29 20 7b 0a 20 20 70 72 6f 78 79 4c 6f  ath) {.  proxyLo
33090 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 70 43  ckingContext *pC
330a0 74 78 3b 0a 20 20 63 68 61 72 20 64 62 50 61 74  tx;.  char dbPat
330b0 68 5b 4d 41 58 50 41 54 48 4c 45 4e 2b 31 5d 3b  h[MAXPATHLEN+1];
330c0 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f         /* Name o
330d0 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  f the database f
330e0 69 6c 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 6c  ile */.  char *l
330f0 6f 63 6b 50 61 74 68 3d 4e 55 4c 4c 3b 0a 20 20  ockPath=NULL;.  
33100 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
33110 4f 4b 3b 0a 20 20 0a 20 20 69 66 28 20 70 46 69  OK;.  .  if( pFi
33120 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 21 3d 4e 4f  le->locktype!=NO
33130 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 72 65 74  _LOCK ){.    ret
33140 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 3b  urn SQLITE_BUSY;
33150 0a 20 20 7d 0a 20 20 70 72 6f 78 79 47 65 74 44  .  }.  proxyGetD
33160 62 50 61 74 68 46 6f 72 55 6e 69 78 46 69 6c 65  bPathForUnixFile
33170 28 70 46 69 6c 65 2c 20 64 62 50 61 74 68 29 3b  (pFile, dbPath);
33180 0a 20 20 69 66 28 20 21 70 61 74 68 20 7c 7c 20  .  if( !path || 
33190 70 61 74 68 5b 30 5d 3d 3d 27 5c 30 27 20 7c 7c  path[0]=='\0' ||
331a0 20 21 73 74 72 63 6d 70 28 70 61 74 68 2c 20 22   !strcmp(path, "
331b0 3a 61 75 74 6f 3a 22 29 20 29 7b 0a 20 20 20 20  :auto:") ){.    
331c0 6c 6f 63 6b 50 61 74 68 3d 4e 55 4c 4c 3b 0a 20  lockPath=NULL;. 
331d0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6c 6f 63 6b   }else{.    lock
331e0 50 61 74 68 3d 28 63 68 61 72 20 2a 29 70 61 74  Path=(char *)pat
331f0 68 3b 0a 20 20 7d 0a 20 20 0a 20 20 4f 53 54 52  h;.  }.  .  OSTR
33200 41 43 45 34 28 22 54 52 41 4e 53 50 52 4f 58 59  ACE4("TRANSPROXY
33210 20 20 25 64 20 66 6f 72 20 25 73 20 70 69 64 3d    %d for %s pid=
33220 25 64 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c  %d\n", pFile->h,
33230 0a 20 20 20 20 20 20 20 20 20 20 20 28 6c 6f 63  .           (loc
33240 6b 50 61 74 68 20 3f 20 6c 6f 63 6b 50 61 74 68  kPath ? lockPath
33250 20 3a 20 22 3a 61 75 74 6f 3a 22 29 2c 20 67 65   : ":auto:"), ge
33260 74 70 69 64 28 29 29 3b 0a 0a 20 20 70 43 74 78  tpid());..  pCtx
33270 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f   = sqlite3_mallo
33280 63 28 20 73 69 7a 65 6f 66 28 2a 70 43 74 78 29  c( sizeof(*pCtx)
33290 20 29 3b 0a 20 20 69 66 28 20 70 43 74 78 3d 3d   );.  if( pCtx==
332a0 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  0 ){.    return 
332b0 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
332c0 7d 0a 20 20 6d 65 6d 73 65 74 28 70 43 74 78 2c  }.  memset(pCtx,
332d0 20 30 2c 20 73 69 7a 65 6f 66 28 2a 70 43 74 78   0, sizeof(*pCtx
332e0 29 29 3b 0a 0a 20 20 72 63 20 3d 20 70 72 6f 78  ));..  rc = prox
332f0 79 43 72 65 61 74 65 43 6f 6e 63 68 50 61 74 68  yCreateConchPath
33300 6e 61 6d 65 28 64 62 50 61 74 68 2c 20 26 70 43  name(dbPath, &pC
33310 74 78 2d 3e 63 6f 6e 63 68 46 69 6c 65 50 61 74  tx->conchFilePat
33320 68 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  h);.  if( rc==SQ
33330 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72  LITE_OK ){.    r
33340 63 20 3d 20 70 72 6f 78 79 43 72 65 61 74 65 55  c = proxyCreateU
33350 6e 69 78 46 69 6c 65 28 70 43 74 78 2d 3e 63 6f  nixFile(pCtx->co
33360 6e 63 68 46 69 6c 65 50 61 74 68 2c 20 26 70 43  nchFilePath, &pC
33370 74 78 2d 3e 63 6f 6e 63 68 46 69 6c 65 2c 20 30  tx->conchFile, 0
33380 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  );.    if( rc==S
33390 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 20 26  QLITE_CANTOPEN &
333a0 26 20 28 28 70 46 69 6c 65 2d 3e 6f 70 65 6e 46  & ((pFile->openF
333b0 6c 61 67 73 26 4f 5f 52 44 57 52 29 20 3d 3d 20  lags&O_RDWR) == 
333c0 30 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 69  0) ){.      /* i
333d0 66 20 28 61 29 20 74 68 65 20 6f 70 65 6e 20 66  f (a) the open f
333e0 6c 61 67 73 20 61 72 65 20 6e 6f 74 20 4f 5f 52  lags are not O_R
333f0 44 57 52 2c 20 28 62 29 20 74 68 65 20 63 6f 6e  DWR, (b) the con
33400 63 68 20 69 73 6e 27 74 20 74 68 65 72 65 2c 20  ch isn't there, 
33410 61 6e 64 0a 20 20 20 20 20 20 2a 2a 20 28 63 29  and.      ** (c)
33420 20 74 68 65 20 66 69 6c 65 20 73 79 73 74 65 6d   the file system
33430 20 69 73 20 72 65 61 64 2d 6f 6e 6c 79 2c 20 74   is read-only, t
33440 68 65 6e 20 65 6e 61 62 6c 65 20 6e 6f 2d 6c 6f  hen enable no-lo
33450 63 6b 69 6e 67 20 61 63 63 65 73 73 2e 0a 20 20  cking access..  
33460 20 20 20 20 2a 2a 20 55 67 68 2c 20 73 69 6e 63      ** Ugh, sinc
33470 65 20 4f 5f 52 44 4f 4e 4c 59 3d 3d 30 78 30 30  e O_RDONLY==0x00
33480 30 30 20 77 65 20 74 65 73 74 20 66 6f 72 20 21  00 we test for !
33490 4f 5f 52 44 57 52 20 73 69 6e 63 65 20 75 6e 69  O_RDWR since uni
334a0 78 4f 70 65 6e 20 61 73 73 65 72 74 73 0a 20 20  xOpen asserts.  
334b0 20 20 20 20 2a 2a 20 74 68 61 74 20 6f 70 65 6e      ** that open
334c0 46 6c 61 67 73 20 77 69 6c 6c 20 68 61 76 65 20  Flags will have 
334d0 6f 6e 6c 79 20 6f 6e 65 20 6f 66 20 4f 5f 52 44  only one of O_RD
334e0 4f 4e 4c 59 20 6f 72 20 4f 5f 52 44 57 52 2e 0a  ONLY or O_RDWR..
334f0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73        */.      s
33500 74 72 75 63 74 20 73 74 61 74 66 73 20 66 73 49  truct statfs fsI
33510 6e 66 6f 3b 0a 20 20 20 20 20 20 73 74 72 75 63  nfo;.      struc
33520 74 20 73 74 61 74 20 63 6f 6e 63 68 49 6e 66 6f  t stat conchInfo
33530 3b 0a 20 20 20 20 20 20 69 6e 74 20 67 6f 4c 6f  ;.      int goLo
33540 63 6b 6c 65 73 73 20 3d 20 30 3b 0a 0a 20 20 20  ckless = 0;..   
33550 20 20 20 69 66 28 20 73 74 61 74 28 70 43 74 78     if( stat(pCtx
33560 2d 3e 63 6f 6e 63 68 46 69 6c 65 50 61 74 68 2c  ->conchFilePath,
33570 20 26 63 6f 6e 63 68 49 6e 66 6f 29 20 3d 3d 20   &conchInfo) == 
33580 2d 31 20 29 20 7b 0a 20 20 20 20 20 20 20 20 69  -1 ) {.        i
33590 6e 74 20 65 72 72 20 3d 20 65 72 72 6e 6f 3b 0a  nt err = errno;.
335a0 20 20 20 20 20 20 20 20 69 66 28 20 28 65 72 72          if( (err
335b0 3d 3d 45 4e 4f 45 4e 54 29 20 26 26 20 28 73 74  ==ENOENT) && (st
335c0 61 74 66 73 28 64 62 50 61 74 68 2c 20 26 66 73  atfs(dbPath, &fs
335d0 49 6e 66 6f 29 20 21 3d 20 2d 31 29 20 29 7b 0a  Info) != -1) ){.
335e0 20 20 20 20 20 20 20 20 20 20 67 6f 4c 6f 63 6b            goLock
335f0 6c 65 73 73 20 3d 20 28 66 73 49 6e 66 6f 2e 66  less = (fsInfo.f
33600 5f 66 6c 61 67 73 26 4d 4e 54 5f 52 44 4f 4e 4c  _flags&MNT_RDONL
33610 59 29 20 3d 3d 20 4d 4e 54 5f 52 44 4f 4e 4c 59  Y) == MNT_RDONLY
33620 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
33630 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 67 6f    }.      if( go
33640 4c 6f 63 6b 6c 65 73 73 20 29 7b 0a 20 20 20 20  Lockless ){.    
33650 20 20 20 20 70 43 74 78 2d 3e 63 6f 6e 63 68 48      pCtx->conchH
33660 65 6c 64 20 3d 20 2d 31 3b 20 2f 2a 20 72 65 61  eld = -1; /* rea
33670 64 20 6f 6e 6c 79 20 46 53 2f 20 6c 6f 63 6b 6c  d only FS/ lockl
33680 65 73 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 72  ess */.        r
33690 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
336a0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
336b0 20 20 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c    .  if( rc==SQL
336c0 49 54 45 5f 4f 4b 20 26 26 20 6c 6f 63 6b 50 61  ITE_OK && lockPa
336d0 74 68 20 29 7b 0a 20 20 20 20 70 43 74 78 2d 3e  th ){.    pCtx->
336e0 6c 6f 63 6b 50 72 6f 78 79 50 61 74 68 20 3d 20  lockProxyPath = 
336f0 73 71 6c 69 74 65 33 44 62 53 74 72 44 75 70 28  sqlite3DbStrDup(
33700 30 2c 20 6c 6f 63 6b 50 61 74 68 29 3b 0a 20 20  0, lockPath);.  
33710 7d 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  }..  if( rc==SQL
33720 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 43  ITE_OK ){.    pC
33730 74 78 2d 3e 64 62 50 61 74 68 20 3d 20 73 71 6c  tx->dbPath = sql
33740 69 74 65 33 44 62 53 74 72 44 75 70 28 30 2c 20  ite3DbStrDup(0, 
33750 64 62 50 61 74 68 29 3b 0a 20 20 20 20 69 66 28  dbPath);.    if(
33760 20 70 43 74 78 2d 3e 64 62 50 61 74 68 3d 3d 4e   pCtx->dbPath==N
33770 55 4c 4c 20 29 7b 0a 20 20 20 20 20 20 72 63 20  ULL ){.      rc 
33780 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  = SQLITE_NOMEM;.
33790 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20      }.  }.  if( 
337a0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
337b0 0a 20 20 20 20 2f 2a 20 61 6c 6c 20 6d 65 6d 6f  .    /* all memo
337c0 72 79 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 2c  ry is allocated,
337d0 20 70 72 6f 78 79 73 20 61 72 65 20 63 72 65 61   proxys are crea
337e0 74 65 64 20 61 6e 64 20 61 73 73 69 67 6e 65 64  ted and assigned
337f0 2c 20 0a 20 20 20 20 2a 2a 20 73 77 69 74 63 68  , .    ** switch
33800 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 63 6f 6e   the locking con
33810 74 65 78 74 20 61 6e 64 20 70 4d 65 74 68 6f 64  text and pMethod
33820 20 74 68 65 6e 20 72 65 74 75 72 6e 2e 0a 20 20   then return..  
33830 20 20 2a 2f 0a 20 20 20 20 70 43 74 78 2d 3e 6f    */.    pCtx->o
33840 6c 64 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  ldLockingContext
33850 20 3d 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e   = pFile->lockin
33860 67 43 6f 6e 74 65 78 74 3b 0a 20 20 20 20 70 46  gContext;.    pF
33870 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74  ile->lockingCont
33880 65 78 74 20 3d 20 70 43 74 78 3b 0a 20 20 20 20  ext = pCtx;.    
33890 70 43 74 78 2d 3e 70 4f 6c 64 4d 65 74 68 6f 64  pCtx->pOldMethod
338a0 20 3d 20 70 46 69 6c 65 2d 3e 70 4d 65 74 68 6f   = pFile->pMetho
338b0 64 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 70 4d  d;.    pFile->pM
338c0 65 74 68 6f 64 20 3d 20 26 70 72 6f 78 79 49 6f  ethod = &proxyIo
338d0 4d 65 74 68 6f 64 73 3b 0a 20 20 7d 65 6c 73 65  Methods;.  }else
338e0 7b 0a 20 20 20 20 69 66 28 20 70 43 74 78 2d 3e  {.    if( pCtx->
338f0 63 6f 6e 63 68 46 69 6c 65 20 29 7b 20 0a 20 20  conchFile ){ .  
33900 20 20 20 20 70 43 74 78 2d 3e 63 6f 6e 63 68 46      pCtx->conchF
33910 69 6c 65 2d 3e 70 4d 65 74 68 6f 64 2d 3e 78 43  ile->pMethod->xC
33920 6c 6f 73 65 28 28 73 71 6c 69 74 65 33 5f 66 69  lose((sqlite3_fi
33930 6c 65 20 2a 29 70 43 74 78 2d 3e 63 6f 6e 63 68  le *)pCtx->conch
33940 46 69 6c 65 29 3b 0a 20 20 20 20 20 20 73 71 6c  File);.      sql
33950 69 74 65 33 5f 66 72 65 65 28 70 43 74 78 2d 3e  ite3_free(pCtx->
33960 63 6f 6e 63 68 46 69 6c 65 29 3b 0a 20 20 20 20  conchFile);.    
33970 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  }.    sqlite3_fr
33980 65 65 28 70 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f  ee(pCtx->lockPro
33990 78 79 50 61 74 68 29 3b 0a 20 20 20 20 73 71 6c  xyPath);.    sql
339a0 69 74 65 33 5f 66 72 65 65 28 70 43 74 78 2d 3e  ite3_free(pCtx->
339b0 63 6f 6e 63 68 46 69 6c 65 50 61 74 68 29 3b 20  conchFilePath); 
339c0 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
339d0 65 28 70 43 74 78 29 3b 0a 20 20 7d 0a 20 20 4f  e(pCtx);.  }.  O
339e0 53 54 52 41 43 45 33 28 22 54 52 41 4e 53 50 52  STRACE3("TRANSPR
339f0 4f 58 59 20 20 25 64 20 25 73 5c 6e 22 2c 20 70  OXY  %d %s\n", p
33a00 46 69 6c 65 2d 3e 68 2c 0a 20 20 20 20 20 20 20  File->h,.       
33a10 20 20 20 20 28 72 63 3d 3d 53 51 4c 49 54 45 5f      (rc==SQLITE_
33a20 4f 4b 20 3f 20 22 6f 6b 22 20 3a 20 22 66 61 69  OK ? "ok" : "fai
33a30 6c 65 64 22 29 29 3b 0a 20 20 72 65 74 75 72 6e  led"));.  return
33a40 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54   rc;.}.../*.** T
33a50 68 69 73 20 72 6f 75 74 69 6e 65 20 68 61 6e 64  his routine hand
33a60 6c 65 73 20 73 71 6c 69 74 65 33 5f 66 69 6c 65  les sqlite3_file
33a70 5f 63 6f 6e 74 72 6f 6c 28 29 20 63 61 6c 6c 73  _control() calls
33a80 20 74 68 61 74 20 61 72 65 20 73 70 65 63 69 66   that are specif
33a90 69 63 0a 2a 2a 20 74 6f 20 70 72 6f 78 79 20 6c  ic.** to proxy l
33aa0 6f 63 6b 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69  ocking..*/.stati
33ab0 63 20 69 6e 74 20 70 72 6f 78 79 46 69 6c 65 43  c int proxyFileC
33ac0 6f 6e 74 72 6f 6c 28 73 71 6c 69 74 65 33 5f 66  ontrol(sqlite3_f
33ad0 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 6f 70 2c  ile *id, int op,
33ae0 20 76 6f 69 64 20 2a 70 41 72 67 29 7b 0a 20 20   void *pArg){.  
33af0 73 77 69 74 63 68 28 20 6f 70 20 29 7b 0a 20 20  switch( op ){.  
33b00 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 47 45    case SQLITE_GE
33b10 54 5f 4c 4f 43 4b 50 52 4f 58 59 46 49 4c 45 3a  T_LOCKPROXYFILE:
33b20 20 7b 0a 20 20 20 20 20 20 75 6e 69 78 46 69 6c   {.      unixFil
33b30 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78  e *pFile = (unix
33b40 46 69 6c 65 2a 29 69 64 3b 0a 20 20 20 20 20 20  File*)id;.      
33b50 69 66 28 20 70 46 69 6c 65 2d 3e 70 4d 65 74 68  if( pFile->pMeth
33b60 6f 64 20 3d 3d 20 26 70 72 6f 78 79 49 6f 4d 65  od == &proxyIoMe
33b70 74 68 6f 64 73 20 29 7b 0a 20 20 20 20 20 20 20  thods ){.       
33b80 20 70 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e   proxyLockingCon
33b90 74 65 78 74 20 2a 70 43 74 78 20 3d 20 28 70 72  text *pCtx = (pr
33ba0 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78  oxyLockingContex
33bb0 74 2a 29 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e  t*)pFile->lockin
33bc0 67 43 6f 6e 74 65 78 74 3b 0a 20 20 20 20 20 20  gContext;.      
33bd0 20 20 70 72 6f 78 79 54 61 6b 65 43 6f 6e 63 68    proxyTakeConch
33be0 28 70 46 69 6c 65 29 3b 0a 20 20 20 20 20 20 20  (pFile);.       
33bf0 20 69 66 28 20 70 43 74 78 2d 3e 6c 6f 63 6b 50   if( pCtx->lockP
33c00 72 6f 78 79 50 61 74 68 20 29 7b 0a 20 20 20 20  roxyPath ){.    
33c10 20 20 20 20 20 20 2a 28 63 6f 6e 73 74 20 63 68        *(const ch
33c20 61 72 20 2a 2a 29 70 41 72 67 20 3d 20 70 43 74  ar **)pArg = pCt
33c30 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 50 61 74 68  x->lockProxyPath
33c40 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
33c50 0a 20 20 20 20 20 20 20 20 20 20 2a 28 63 6f 6e  .          *(con
33c60 73 74 20 63 68 61 72 20 2a 2a 29 70 41 72 67 20  st char **)pArg 
33c70 3d 20 22 3a 61 75 74 6f 3a 20 28 6e 6f 74 20 68  = ":auto: (not h
33c80 65 6c 64 29 22 3b 0a 20 20 20 20 20 20 20 20 7d  eld)";.        }
33c90 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a  .      } else {.
33ca0 20 20 20 20 20 20 20 20 2a 28 63 6f 6e 73 74 20          *(const 
33cb0 63 68 61 72 20 2a 2a 29 70 41 72 67 20 3d 20 4e  char **)pArg = N
33cc0 55 4c 4c 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ULL;.      }.   
33cd0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
33ce0 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  _OK;.    }.    c
33cf0 61 73 65 20 53 51 4c 49 54 45 5f 53 45 54 5f 4c  ase SQLITE_SET_L
33d00 4f 43 4b 50 52 4f 58 59 46 49 4c 45 3a 20 7b 0a  OCKPROXYFILE: {.
33d10 20 20 20 20 20 20 75 6e 69 78 46 69 6c 65 20 2a        unixFile *
33d20 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c  pFile = (unixFil
33d30 65 2a 29 69 64 3b 0a 20 20 20 20 20 20 69 6e 74  e*)id;.      int
33d40 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
33d50 0a 20 20 20 20 20 20 69 6e 74 20 69 73 50 72 6f  .      int isPro
33d60 78 79 53 74 79 6c 65 20 3d 20 28 70 46 69 6c 65  xyStyle = (pFile
33d70 2d 3e 70 4d 65 74 68 6f 64 20 3d 3d 20 26 70 72  ->pMethod == &pr
33d80 6f 78 79 49 6f 4d 65 74 68 6f 64 73 29 3b 0a 20  oxyIoMethods);. 
33d90 20 20 20 20 20 69 66 28 20 70 41 72 67 3d 3d 4e       if( pArg==N
33da0 55 4c 4c 20 7c 7c 20 28 63 6f 6e 73 74 20 63 68  ULL || (const ch
33db0 61 72 20 2a 29 70 41 72 67 3d 3d 30 20 29 7b 0a  ar *)pArg==0 ){.
33dc0 20 20 20 20 20 20 20 20 69 66 28 20 69 73 50 72          if( isPr
33dd0 6f 78 79 53 74 79 6c 65 20 29 7b 0a 20 20 20 20  oxyStyle ){.    
33de0 20 20 20 20 20 20 2f 2a 20 74 75 72 6e 20 6f 66        /* turn of
33df0 66 20 70 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 20  f proxy locking 
33e00 2d 20 6e 6f 74 20 73 75 70 70 6f 72 74 65 64 20  - not supported 
33e10 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  */.          rc 
33e20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 20 2f  = SQLITE_ERROR /
33e30 2a 53 51 4c 49 54 45 5f 50 52 4f 54 4f 43 4f 4c  *SQLITE_PROTOCOL
33e40 3f 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 3f  ? SQLITE_MISUSE?
33e50 2a 2f 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  */;.        }els
33e60 65 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  e{.          /* 
33e70 74 75 72 6e 20 6f 66 66 20 70 72 6f 78 79 20 6c  turn off proxy l
33e80 6f 63 6b 69 6e 67 20 2d 20 61 6c 72 65 61 64 79  ocking - already
33e90 20 6f 66 66 20 2d 20 4e 4f 4f 50 20 2a 2f 0a 20   off - NOOP */. 
33ea0 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51           rc = SQ
33eb0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20  LITE_OK;.       
33ec0 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a   }.      }else{.
33ed0 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68          const ch
33ee0 61 72 20 2a 70 72 6f 78 79 50 61 74 68 20 3d 20  ar *proxyPath = 
33ef0 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 29 70 41  (const char *)pA
33f00 72 67 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  rg;.        if( 
33f10 69 73 50 72 6f 78 79 53 74 79 6c 65 20 29 7b 0a  isProxyStyle ){.
33f20 20 20 20 20 20 20 20 20 20 20 70 72 6f 78 79 4c            proxyL
33f30 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 70  ockingContext *p
33f40 43 74 78 20 3d 20 0a 20 20 20 20 20 20 20 20 20  Ctx = .         
33f50 20 20 20 28 70 72 6f 78 79 4c 6f 63 6b 69 6e 67     (proxyLocking
33f60 43 6f 6e 74 65 78 74 2a 29 70 46 69 6c 65 2d 3e  Context*)pFile->
33f70 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 0a  lockingContext;.
33f80 20 20 20 20 20 20 20 20 20 20 69 66 28 20 21 73            if( !s
33f90 74 72 63 6d 70 28 70 41 72 67 2c 20 22 3a 61 75  trcmp(pArg, ":au
33fa0 74 6f 3a 22 29 20 0a 20 20 20 20 20 20 20 20 20  to:") .         
33fb0 20 20 7c 7c 20 28 70 43 74 78 2d 3e 6c 6f 63 6b    || (pCtx->lock
33fc0 50 72 6f 78 79 50 61 74 68 20 26 26 0a 20 20 20  ProxyPath &&.   
33fd0 20 20 20 20 20 20 20 20 20 20 20 20 21 73 74 72              !str
33fe0 6e 63 6d 70 28 70 43 74 78 2d 3e 6c 6f 63 6b 50  ncmp(pCtx->lockP
33ff0 72 6f 78 79 50 61 74 68 2c 20 70 72 6f 78 79 50  roxyPath, proxyP
34000 61 74 68 2c 20 4d 41 58 50 41 54 48 4c 45 4e 29  ath, MAXPATHLEN)
34010 29 0a 20 20 20 20 20 20 20 20 20 20 29 7b 0a 20  ).          ){. 
34020 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20             rc = 
34030 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20  SQLITE_OK;.     
34040 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
34050 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 77 69          rc = swi
34060 74 63 68 4c 6f 63 6b 50 72 6f 78 79 50 61 74 68  tchLockProxyPath
34070 28 70 46 69 6c 65 2c 20 70 72 6f 78 79 50 61 74  (pFile, proxyPat
34080 68 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  h);.          }.
34090 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
340a0 20 20 20 20 20 20 20 20 20 2f 2a 20 74 75 72 6e           /* turn
340b0 20 6f 6e 20 70 72 6f 78 79 20 66 69 6c 65 20 6c   on proxy file l
340c0 6f 63 6b 69 6e 67 20 2a 2f 0a 20 20 20 20 20 20  ocking */.      
340d0 20 20 20 20 72 63 20 3d 20 70 72 6f 78 79 54 72      rc = proxyTr
340e0 61 6e 73 66 6f 72 6d 55 6e 69 78 46 69 6c 65 28  ansformUnixFile(
340f0 70 46 69 6c 65 2c 20 70 72 6f 78 79 50 61 74 68  pFile, proxyPath
34100 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
34110 20 20 20 7d 0a 20 20 20 20 20 20 72 65 74 75 72     }.      retur
34120 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20  n rc;.    }.    
34130 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20  default: {.     
34140 20 61 73 73 65 72 74 28 20 30 20 29 3b 20 20 2f   assert( 0 );  /
34150 2a 20 54 68 65 20 63 61 6c 6c 20 61 73 73 75 72  * The call assur
34160 65 73 20 74 68 61 74 20 6f 6e 6c 79 20 76 61 6c  es that only val
34170 69 64 20 6f 70 63 6f 64 65 73 20 61 72 65 20 73  id opcodes are s
34180 65 6e 74 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 7d  ent */.    }.  }
34190 0a 20 20 2f 2a 4e 4f 54 52 45 41 43 48 45 44 2a  .  /*NOTREACHED*
341a0 2f 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  /.  return SQLIT
341b0 45 5f 45 52 52 4f 52 3b 0a 7d 0a 0a 2f 2a 0a 2a  E_ERROR;.}../*.*
341c0 2a 20 57 69 74 68 69 6e 20 74 68 69 73 20 64 69  * Within this di
341d0 76 69 73 69 6f 6e 20 28 74 68 65 20 70 72 6f 78  vision (the prox
341e0 79 69 6e 67 20 6c 6f 63 6b 69 6e 67 20 69 6d 70  ying locking imp
341f0 6c 65 6d 65 6e 74 61 74 69 6f 6e 29 20 74 68 65  lementation) the
34200 20 70 72 6f 63 65 64 75 72 65 73 0a 2a 2a 20 61   procedures.** a
34210 62 6f 76 65 20 74 68 69 73 20 70 6f 69 6e 74 20  bove this point 
34220 61 72 65 20 61 6c 6c 20 75 74 69 6c 69 74 69 65  are all utilitie
34230 73 2e 20 20 54 68 65 20 6c 6f 63 6b 2d 72 65 6c  s.  The lock-rel
34240 61 74 65 64 20 6d 65 74 68 6f 64 73 20 6f 66 20  ated methods of 
34250 74 68 65 0a 2a 2a 20 70 72 6f 78 79 2d 6c 6f 63  the.** proxy-loc
34260 6b 69 6e 67 20 73 71 6c 69 74 65 33 5f 69 6f 5f  king sqlite3_io_
34270 6d 65 74 68 6f 64 20 6f 62 6a 65 63 74 20 66 6f  method object fo
34280 6c 6c 6f 77 2e 0a 2a 2f 0a 0a 0a 2f 2a 0a 2a 2a  llow..*/.../*.**
34290 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63 68   This routine ch
342a0 65 63 6b 73 20 69 66 20 74 68 65 72 65 20 69 73  ecks if there is
342b0 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b   a RESERVED lock
342c0 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 73 70 65   held on the spe
342d0 63 69 66 69 65 64 0a 2a 2a 20 66 69 6c 65 20 62  cified.** file b
342e0 79 20 74 68 69 73 20 6f 72 20 61 6e 79 20 6f 74  y this or any ot
342f0 68 65 72 20 70 72 6f 63 65 73 73 2e 20 49 66 20  her process. If 
34300 73 75 63 68 20 61 20 6c 6f 63 6b 20 69 73 20 68  such a lock is h
34310 65 6c 64 2c 20 73 65 74 20 2a 70 52 65 73 4f 75  eld, set *pResOu
34320 74 0a 2a 2a 20 74 6f 20 61 20 6e 6f 6e 2d 7a 65  t.** to a non-ze
34330 72 6f 20 76 61 6c 75 65 20 6f 74 68 65 72 77 69  ro value otherwi
34340 73 65 20 2a 70 52 65 73 4f 75 74 20 69 73 20 73  se *pResOut is s
34350 65 74 20 74 6f 20 7a 65 72 6f 2e 20 20 54 68 65  et to zero.  The
34360 20 72 65 74 75 72 6e 20 76 61 6c 75 65 0a 2a 2a   return value.**
34370 20 69 73 20 73 65 74 20 74 6f 20 53 51 4c 49 54   is set to SQLIT
34380 45 5f 4f 4b 20 75 6e 6c 65 73 73 20 61 6e 20 49  E_OK unless an I
34390 2f 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20  /O error occurs 
343a0 64 75 72 69 6e 67 20 6c 6f 63 6b 20 63 68 65 63  during lock chec
343b0 6b 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  king..*/.static 
343c0 69 6e 74 20 70 72 6f 78 79 43 68 65 63 6b 52 65  int proxyCheckRe
343d0 73 65 72 76 65 64 4c 6f 63 6b 28 73 71 6c 69 74  servedLock(sqlit
343e0 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74  e3_file *id, int
343f0 20 2a 70 52 65 73 4f 75 74 29 20 7b 0a 20 20 75   *pResOut) {.  u
34400 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d  nixFile *pFile =
34410 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a   (unixFile*)id;.
34420 20 20 69 6e 74 20 72 63 20 3d 20 70 72 6f 78 79    int rc = proxy
34430 54 61 6b 65 43 6f 6e 63 68 28 70 46 69 6c 65 29  TakeConch(pFile)
34440 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ;.  if( rc==SQLI
34450 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 72 6f  TE_OK ){.    pro
34460 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  xyLockingContext
34470 20 2a 70 43 74 78 20 3d 20 28 70 72 6f 78 79 4c   *pCtx = (proxyL
34480 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 29  ockingContext *)
34490 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f  pFile->lockingCo
344a0 6e 74 65 78 74 3b 0a 20 20 20 20 69 66 28 20 70  ntext;.    if( p
344b0 43 74 78 2d 3e 63 6f 6e 63 68 48 65 6c 64 3e 30  Ctx->conchHeld>0
344c0 20 29 7b 0a 20 20 20 20 20 20 75 6e 69 78 46 69   ){.      unixFi
344d0 6c 65 20 2a 70 72 6f 78 79 20 3d 20 70 43 74 78  le *proxy = pCtx
344e0 2d 3e 6c 6f 63 6b 50 72 6f 78 79 3b 0a 20 20 20  ->lockProxy;.   
344f0 20 20 20 72 65 74 75 72 6e 20 70 72 6f 78 79 2d     return proxy-
34500 3e 70 4d 65 74 68 6f 64 2d 3e 78 43 68 65 63 6b  >pMethod->xCheck
34510 52 65 73 65 72 76 65 64 4c 6f 63 6b 28 28 73 71  ReservedLock((sq
34520 6c 69 74 65 33 5f 66 69 6c 65 2a 29 70 72 6f 78  lite3_file*)prox
34530 79 2c 20 70 52 65 73 4f 75 74 29 3b 0a 20 20 20  y, pResOut);.   
34540 20 7d 65 6c 73 65 7b 20 2f 2a 20 63 6f 6e 63 68   }else{ /* conch
34550 48 65 6c 64 20 3c 20 30 20 69 73 20 6c 6f 63 6b  Held < 0 is lock
34560 6c 65 73 73 20 2a 2f 0a 20 20 20 20 20 20 70 52  less */.      pR
34570 65 73 4f 75 74 3d 30 3b 0a 20 20 20 20 7d 0a 20  esOut=0;.    }. 
34580 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
34590 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 6b 20 74 68  }../*.** Lock th
345a0 65 20 66 69 6c 65 20 77 69 74 68 20 74 68 65 20  e file with the 
345b0 6c 6f 63 6b 20 73 70 65 63 69 66 69 65 64 20 62  lock specified b
345c0 79 20 70 61 72 61 6d 65 74 65 72 20 6c 6f 63 6b  y parameter lock
345d0 74 79 70 65 20 2d 20 6f 6e 65 0a 2a 2a 20 6f 66  type - one.** of
345e0 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a   the following:.
345f0 2a 2a 0a 2a 2a 20 20 20 20 20 28 31 29 20 53 48  **.**     (1) SH
34600 41 52 45 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20  ARED_LOCK.**    
34610 20 28 32 29 20 52 45 53 45 52 56 45 44 5f 4c 4f   (2) RESERVED_LO
34620 43 4b 0a 2a 2a 20 20 20 20 20 28 33 29 20 50 45  CK.**     (3) PE
34630 4e 44 49 4e 47 5f 4c 4f 43 4b 0a 2a 2a 20 20 20  NDING_LOCK.**   
34640 20 20 28 34 29 20 45 58 43 4c 55 53 49 56 45 5f    (4) EXCLUSIVE_
34650 4c 4f 43 4b 0a 2a 2a 0a 2a 2a 20 53 6f 6d 65 74  LOCK.**.** Somet
34660 69 6d 65 73 20 77 68 65 6e 20 72 65 71 75 65 73  imes when reques
34670 74 69 6e 67 20 6f 6e 65 20 6c 6f 63 6b 20 73 74  ting one lock st
34680 61 74 65 2c 20 61 64 64 69 74 69 6f 6e 61 6c 20  ate, additional 
34690 6c 6f 63 6b 20 73 74 61 74 65 73 0a 2a 2a 20 61  lock states.** a
346a0 72 65 20 69 6e 73 65 72 74 65 64 20 69 6e 20 62  re inserted in b
346b0 65 74 77 65 65 6e 2e 20 20 54 68 65 20 6c 6f 63  etween.  The loc
346c0 6b 69 6e 67 20 6d 69 67 68 74 20 66 61 69 6c 20  king might fail 
346d0 6f 6e 20 6f 6e 65 20 6f 66 20 74 68 65 20 6c 61  on one of the la
346e0 74 65 72 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f  ter.** transitio
346f0 6e 73 20 6c 65 61 76 69 6e 67 20 74 68 65 20 6c  ns leaving the l
34700 6f 63 6b 20 73 74 61 74 65 20 64 69 66 66 65 72  ock state differ
34710 65 6e 74 20 66 72 6f 6d 20 77 68 61 74 20 69 74  ent from what it
34720 20 73 74 61 72 74 65 64 20 62 75 74 0a 2a 2a 20   started but.** 
34730 73 74 69 6c 6c 20 73 68 6f 72 74 20 6f 66 20 69  still short of i
34740 74 73 20 67 6f 61 6c 2e 20 20 54 68 65 20 66 6f  ts goal.  The fo
34750 6c 6c 6f 77 69 6e 67 20 63 68 61 72 74 20 73 68  llowing chart sh
34760 6f 77 73 20 74 68 65 20 61 6c 6c 6f 77 65 64 0a  ows the allowed.
34770 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e 73 20 61  ** transitions a
34780 6e 64 20 74 68 65 20 69 6e 73 65 72 74 65 64 20  nd the inserted 
34790 69 6e 74 65 72 6d 65 64 69 61 74 65 20 73 74 61  intermediate sta
347a0 74 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 55 4e  tes:.**.**    UN
347b0 4c 4f 43 4b 45 44 20 2d 3e 20 53 48 41 52 45 44  LOCKED -> SHARED
347c0 0a 2a 2a 20 20 20 20 53 48 41 52 45 44 20 2d 3e  .**    SHARED ->
347d0 20 52 45 53 45 52 56 45 44 0a 2a 2a 20 20 20 20   RESERVED.**    
347e0 53 48 41 52 45 44 20 2d 3e 20 28 50 45 4e 44 49  SHARED -> (PENDI
347f0 4e 47 29 20 2d 3e 20 45 58 43 4c 55 53 49 56 45  NG) -> EXCLUSIVE
34800 0a 2a 2a 20 20 20 20 52 45 53 45 52 56 45 44 20  .**    RESERVED 
34810 2d 3e 20 28 50 45 4e 44 49 4e 47 29 20 2d 3e 20  -> (PENDING) -> 
34820 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20 20 20 20  EXCLUSIVE.**    
34830 50 45 4e 44 49 4e 47 20 2d 3e 20 45 58 43 4c 55  PENDING -> EXCLU
34840 53 49 56 45 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  SIVE.**.** This 
34850 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 6f 6e 6c  routine will onl
34860 79 20 69 6e 63 72 65 61 73 65 20 61 20 6c 6f 63  y increase a loc
34870 6b 2e 20 20 55 73 65 20 74 68 65 20 73 71 6c 69  k.  Use the sqli
34880 74 65 33 4f 73 55 6e 6c 6f 63 6b 28 29 0a 2a 2a  te3OsUnlock().**
34890 20 72 6f 75 74 69 6e 65 20 74 6f 20 6c 6f 77 65   routine to lowe
348a0 72 20 61 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65  r a locking leve
348b0 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  l..*/.static int
348c0 20 70 72 6f 78 79 4c 6f 63 6b 28 73 71 6c 69 74   proxyLock(sqlit
348d0 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74  e3_file *id, int
348e0 20 6c 6f 63 6b 74 79 70 65 29 20 7b 0a 20 20 75   locktype) {.  u
348f0 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d  nixFile *pFile =
34900 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a   (unixFile*)id;.
34910 20 20 69 6e 74 20 72 63 20 3d 20 70 72 6f 78 79    int rc = proxy
34920 54 61 6b 65 43 6f 6e 63 68 28 70 46 69 6c 65 29  TakeConch(pFile)
34930 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ;.  if( rc==SQLI
34940 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 72 6f  TE_OK ){.    pro
34950 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  xyLockingContext
34960 20 2a 70 43 74 78 20 3d 20 28 70 72 6f 78 79 4c   *pCtx = (proxyL
34970 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 29  ockingContext *)
34980 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f  pFile->lockingCo
34990 6e 74 65 78 74 3b 0a 20 20 20 20 69 66 28 20 70  ntext;.    if( p
349a0 43 74 78 2d 3e 63 6f 6e 63 68 48 65 6c 64 3e 30  Ctx->conchHeld>0
349b0 20 29 7b 0a 20 20 20 20 20 20 75 6e 69 78 46 69   ){.      unixFi
349c0 6c 65 20 2a 70 72 6f 78 79 20 3d 20 70 43 74 78  le *proxy = pCtx
349d0 2d 3e 6c 6f 63 6b 50 72 6f 78 79 3b 0a 20 20 20  ->lockProxy;.   
349e0 20 20 20 72 63 20 3d 20 70 72 6f 78 79 2d 3e 70     rc = proxy->p
349f0 4d 65 74 68 6f 64 2d 3e 78 4c 6f 63 6b 28 28 73  Method->xLock((s
34a00 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29 70 72 6f  qlite3_file*)pro
34a10 78 79 2c 20 6c 6f 63 6b 74 79 70 65 29 3b 0a 20  xy, locktype);. 
34a20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b       pFile->lock
34a30 74 79 70 65 20 3d 20 70 72 6f 78 79 2d 3e 6c 6f  type = proxy->lo
34a40 63 6b 74 79 70 65 3b 0a 20 20 20 20 7d 65 6c 73  cktype;.    }els
34a50 65 7b 0a 20 20 20 20 20 20 2f 2a 20 63 6f 6e 63  e{.      /* conc
34a60 68 48 65 6c 64 20 3c 20 30 20 69 73 20 6c 6f 63  hHeld < 0 is loc
34a70 6b 6c 65 73 73 20 2a 2f 0a 20 20 20 20 7d 0a 20  kless */.    }. 
34a80 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
34a90 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 77 65 72 20  }.../*.** Lower 
34aa0 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65  the locking leve
34ab0 6c 20 6f 6e 20 66 69 6c 65 20 64 65 73 63 72 69  l on file descri
34ac0 70 74 6f 72 20 70 46 69 6c 65 20 74 6f 20 6c 6f  ptor pFile to lo
34ad0 63 6b 74 79 70 65 2e 20 20 6c 6f 63 6b 74 79 70  cktype.  locktyp
34ae0 65 0a 2a 2a 20 6d 75 73 74 20 62 65 20 65 69 74  e.** must be eit
34af0 68 65 72 20 4e 4f 5f 4c 4f 43 4b 20 6f 72 20 53  her NO_LOCK or S
34b00 48 41 52 45 44 5f 4c 4f 43 4b 2e 0a 2a 2a 0a 2a  HARED_LOCK..**.*
34b10 2a 20 49 66 20 74 68 65 20 6c 6f 63 6b 69 6e 67  * If the locking
34b20 20 6c 65 76 65 6c 20 6f 66 20 74 68 65 20 66 69   level of the fi
34b30 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 69 73  le descriptor is
34b40 20 61 6c 72 65 61 64 79 20 61 74 20 6f 72 20 62   already at or b
34b50 65 6c 6f 77 0a 2a 2a 20 74 68 65 20 72 65 71 75  elow.** the requ
34b60 65 73 74 65 64 20 6c 6f 63 6b 69 6e 67 20 6c 65  ested locking le
34b70 76 65 6c 2c 20 74 68 69 73 20 72 6f 75 74 69 6e  vel, this routin
34b80 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f  e is a no-op..*/
34b90 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72 6f 78  .static int prox
34ba0 79 55 6e 6c 6f 63 6b 28 73 71 6c 69 74 65 33 5f  yUnlock(sqlite3_
34bb0 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 6c 6f  file *id, int lo
34bc0 63 6b 74 79 70 65 29 20 7b 0a 20 20 75 6e 69 78  cktype) {.  unix
34bd0 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75  File *pFile = (u
34be0 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 69  nixFile*)id;.  i
34bf0 6e 74 20 72 63 20 3d 20 70 72 6f 78 79 54 61 6b  nt rc = proxyTak
34c00 65 43 6f 6e 63 68 28 70 46 69 6c 65 29 3b 0a 20  eConch(pFile);. 
34c10 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
34c20 4f 4b 20 29 7b 0a 20 20 20 20 70 72 6f 78 79 4c  OK ){.    proxyL
34c30 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 70  ockingContext *p
34c40 43 74 78 20 3d 20 28 70 72 6f 78 79 4c 6f 63 6b  Ctx = (proxyLock
34c50 69 6e 67 43 6f 6e 74 65 78 74 20 2a 29 70 46 69  ingContext *)pFi
34c60 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65  le->lockingConte
34c70 78 74 3b 0a 20 20 20 20 69 66 28 20 70 43 74 78  xt;.    if( pCtx
34c80 2d 3e 63 6f 6e 63 68 48 65 6c 64 3e 30 20 29 7b  ->conchHeld>0 ){
34c90 0a 20 20 20 20 20 20 75 6e 69 78 46 69 6c 65 20  .      unixFile 
34ca0 2a 70 72 6f 78 79 20 3d 20 70 43 74 78 2d 3e 6c  *proxy = pCtx->l
34cb0 6f 63 6b 50 72 6f 78 79 3b 0a 20 20 20 20 20 20  ockProxy;.      
34cc0 72 63 20 3d 20 70 72 6f 78 79 2d 3e 70 4d 65 74  rc = proxy->pMet
34cd0 68 6f 64 2d 3e 78 55 6e 6c 6f 63 6b 28 28 73 71  hod->xUnlock((sq
34ce0 6c 69 74 65 33 5f 66 69 6c 65 2a 29 70 72 6f 78  lite3_file*)prox
34cf0 79 2c 20 6c 6f 63 6b 74 79 70 65 29 3b 0a 20 20  y, locktype);.  
34d00 20 20 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74      pFile->lockt
34d10 79 70 65 20 3d 20 70 72 6f 78 79 2d 3e 6c 6f 63  ype = proxy->loc
34d20 6b 74 79 70 65 3b 0a 20 20 20 20 7d 65 6c 73 65  ktype;.    }else
34d30 7b 0a 20 20 20 20 20 20 2f 2a 20 63 6f 6e 63 68  {.      /* conch
34d40 48 65 6c 64 20 3c 20 30 20 69 73 20 6c 6f 63 6b  Held < 0 is lock
34d50 6c 65 73 73 20 2a 2f 0a 20 20 20 20 7d 0a 20 20  less */.    }.  
34d60 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
34d70 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 20  ../*.** Close a 
34d80 66 69 6c 65 20 74 68 61 74 20 75 73 65 73 20 70  file that uses p
34d90 72 6f 78 79 20 6c 6f 63 6b 73 2e 0a 2a 2f 0a 73  roxy locks..*/.s
34da0 74 61 74 69 63 20 69 6e 74 20 70 72 6f 78 79 43  tatic int proxyC
34db0 6c 6f 73 65 28 73 71 6c 69 74 65 33 5f 66 69 6c  lose(sqlite3_fil
34dc0 65 20 2a 69 64 29 20 7b 0a 20 20 69 66 28 20 69  e *id) {.  if( i
34dd0 64 20 29 7b 0a 20 20 20 20 75 6e 69 78 46 69 6c  d ){.    unixFil
34de0 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78  e *pFile = (unix
34df0 46 69 6c 65 2a 29 69 64 3b 0a 20 20 20 20 70 72  File*)id;.    pr
34e00 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78  oxyLockingContex
34e10 74 20 2a 70 43 74 78 20 3d 20 28 70 72 6f 78 79  t *pCtx = (proxy
34e20 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a  LockingContext *
34e30 29 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43  )pFile->lockingC
34e40 6f 6e 74 65 78 74 3b 0a 20 20 20 20 75 6e 69 78  ontext;.    unix
34e50 46 69 6c 65 20 2a 6c 6f 63 6b 50 72 6f 78 79 20  File *lockProxy 
34e60 3d 20 70 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78  = pCtx->lockProx
34e70 79 3b 0a 20 20 20 20 75 6e 69 78 46 69 6c 65 20  y;.    unixFile 
34e80 2a 63 6f 6e 63 68 46 69 6c 65 20 3d 20 70 43 74  *conchFile = pCt
34e90 78 2d 3e 63 6f 6e 63 68 46 69 6c 65 3b 0a 20 20  x->conchFile;.  
34ea0 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
34eb0 45 5f 4f 4b 3b 0a 20 20 20 20 0a 20 20 20 20 69  E_OK;.    .    i
34ec0 66 28 20 6c 6f 63 6b 50 72 6f 78 79 20 29 7b 0a  f( lockProxy ){.
34ed0 20 20 20 20 20 20 72 63 20 3d 20 6c 6f 63 6b 50        rc = lockP
34ee0 72 6f 78 79 2d 3e 70 4d 65 74 68 6f 64 2d 3e 78  roxy->pMethod->x
34ef0 55 6e 6c 6f 63 6b 28 28 73 71 6c 69 74 65 33 5f  Unlock((sqlite3_
34f00 66 69 6c 65 2a 29 6c 6f 63 6b 50 72 6f 78 79 2c  file*)lockProxy,
34f10 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20   NO_LOCK);.     
34f20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
34f30 20 72 63 3b 0a 20 20 20 20 20 20 72 63 20 3d 20   rc;.      rc = 
34f40 6c 6f 63 6b 50 72 6f 78 79 2d 3e 70 4d 65 74 68  lockProxy->pMeth
34f50 6f 64 2d 3e 78 43 6c 6f 73 65 28 28 73 71 6c 69  od->xClose((sqli
34f60 74 65 33 5f 66 69 6c 65 2a 29 6c 6f 63 6b 50 72  te3_file*)lockPr
34f70 6f 78 79 29 3b 0a 20 20 20 20 20 20 69 66 28 20  oxy);.      if( 
34f80 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
34f90 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
34fa0 65 65 28 6c 6f 63 6b 50 72 6f 78 79 29 3b 0a 20  ee(lockProxy);. 
34fb0 20 20 20 20 20 70 43 74 78 2d 3e 6c 6f 63 6b 50       pCtx->lockP
34fc0 72 6f 78 79 20 3d 20 30 3b 0a 20 20 20 20 7d 0a  roxy = 0;.    }.
34fd0 20 20 20 20 69 66 28 20 63 6f 6e 63 68 46 69 6c      if( conchFil
34fe0 65 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  e ){.      if( p
34ff0 43 74 78 2d 3e 63 6f 6e 63 68 48 65 6c 64 20 29  Ctx->conchHeld )
35000 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 70  {.        rc = p
35010 72 6f 78 79 52 65 6c 65 61 73 65 43 6f 6e 63 68  roxyReleaseConch
35020 28 70 46 69 6c 65 29 3b 0a 20 20 20 20 20 20 20  (pFile);.       
35030 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
35040 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   rc;.      }.   
35050 20 20 20 72 63 20 3d 20 63 6f 6e 63 68 46 69 6c     rc = conchFil
35060 65 2d 3e 70 4d 65 74 68 6f 64 2d 3e 78 43 6c 6f  e->pMethod->xClo
35070 73 65 28 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  se((sqlite3_file
35080 2a 29 63 6f 6e 63 68 46 69 6c 65 29 3b 0a 20 20  *)conchFile);.  
35090 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74      if( rc ) ret
350a0 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 73 71  urn rc;.      sq
350b0 6c 69 74 65 33 5f 66 72 65 65 28 63 6f 6e 63 68  lite3_free(conch
350c0 46 69 6c 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20  File);.    }.   
350d0 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 43   sqlite3_free(pC
350e0 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 50 61 74  tx->lockProxyPat
350f0 68 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  h);.    sqlite3_
35100 66 72 65 65 28 70 43 74 78 2d 3e 63 6f 6e 63 68  free(pCtx->conch
35110 46 69 6c 65 50 61 74 68 29 3b 0a 20 20 20 20 73  FilePath);.    s
35120 71 6c 69 74 65 33 5f 66 72 65 65 28 70 43 74 78  qlite3_free(pCtx
35130 2d 3e 64 62 50 61 74 68 29 3b 0a 20 20 20 20 2f  ->dbPath);.    /
35140 2a 20 72 65 73 74 6f 72 65 20 74 68 65 20 6f 72  * restore the or
35150 69 67 69 6e 61 6c 20 6c 6f 63 6b 69 6e 67 20 63  iginal locking c
35160 6f 6e 74 65 78 74 20 61 6e 64 20 70 4d 65 74 68  ontext and pMeth
35170 6f 64 20 74 68 65 6e 20 63 6c 6f 73 65 20 69 74  od then close it
35180 20 2a 2f 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c   */.    pFile->l
35190 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 3d 20  ockingContext = 
351a0 70 43 74 78 2d 3e 6f 6c 64 4c 6f 63 6b 69 6e 67  pCtx->oldLocking
351b0 43 6f 6e 74 65 78 74 3b 0a 20 20 20 20 70 46 69  Context;.    pFi
351c0 6c 65 2d 3e 70 4d 65 74 68 6f 64 20 3d 20 70 43  le->pMethod = pC
351d0 74 78 2d 3e 70 4f 6c 64 4d 65 74 68 6f 64 3b 0a  tx->pOldMethod;.
351e0 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
351f0 28 70 43 74 78 29 3b 0a 20 20 20 20 72 65 74 75  (pCtx);.    retu
35200 72 6e 20 70 46 69 6c 65 2d 3e 70 4d 65 74 68 6f  rn pFile->pMetho
35210 64 2d 3e 78 43 6c 6f 73 65 28 69 64 29 3b 0a 20  d->xClose(id);. 
35220 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49   }.  return SQLI
35230 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 0a 23 65 6e 64  TE_OK;.}....#end
35240 69 66 20 2f 2a 20 64 65 66 69 6e 65 64 28 5f 5f  if /* defined(__
35250 41 50 50 4c 45 5f 5f 29 20 26 26 20 53 51 4c 49  APPLE__) && SQLI
35260 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e  TE_ENABLE_LOCKIN
35270 47 5f 53 54 59 4c 45 20 2a 2f 0a 2f 2a 0a 2a 2a  G_STYLE */./*.**
35280 20 54 68 65 20 70 72 6f 78 79 20 6c 6f 63 6b 69   The proxy locki
35290 6e 67 20 73 74 79 6c 65 20 69 73 20 69 6e 74 65  ng style is inte
352a0 6e 64 65 64 20 66 6f 72 20 75 73 65 20 77 69 74  nded for use wit
352b0 68 20 41 46 50 20 66 69 6c 65 73 79 73 74 65 6d  h AFP filesystem
352c0 73 2e 0a 2a 2a 20 41 6e 64 20 73 69 6e 63 65 20  s..** And since 
352d0 41 46 50 20 69 73 20 6f 6e 6c 79 20 73 75 70 70  AFP is only supp
352e0 6f 72 74 65 64 20 6f 6e 20 4d 61 63 4f 53 58 2c  orted on MacOSX,
352f0 20 74 68 65 20 70 72 6f 78 79 20 6c 6f 63 6b 69   the proxy locki
35300 6e 67 20 69 73 20 61 6c 73 6f 0a 2a 2a 20 72 65  ng is also.** re
35310 73 74 72 69 63 74 65 64 20 74 6f 20 4d 61 63 4f  stricted to MacO
35320 53 58 2e 0a 2a 2a 20 0a 2a 2a 0a 2a 2a 2a 2a 2a  SX..** .**.*****
35330 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45  ************** E
35340 6e 64 20 6f 66 20 74 68 65 20 70 72 6f 78 79 20  nd of the proxy 
35350 6c 6f 63 6b 20 69 6d 70 6c 65 6d 65 6e 74 61 74  lock implementat
35360 69 6f 6e 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ion ************
35370 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a  **********.*****
35380 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
35390 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
353a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
353b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
353c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 0a 2a  *********/../*.*
353d0 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65  * Initialize the
353e0 20 6f 70 65 72 61 74 69 6e 67 20 73 79 73 74 65   operating syste
353f0 6d 20 69 6e 74 65 72 66 61 63 65 2e 0a 2a 2a 0a  m interface..**.
35400 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
35410 72 65 67 69 73 74 65 72 73 20 61 6c 6c 20 56 46  registers all VF
35420 53 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  S implementation
35430 73 20 66 6f 72 20 75 6e 69 78 2d 6c 69 6b 65 20  s for unix-like 
35440 6f 70 65 72 61 74 69 6e 67 0a 2a 2a 20 73 79 73  operating.** sys
35450 74 65 6d 73 2e 20 20 54 68 69 73 20 72 6f 75 74  tems.  This rout
35460 69 6e 65 2c 20 61 6e 64 20 74 68 65 20 73 71 6c  ine, and the sql
35470 69 74 65 33 5f 6f 73 5f 65 6e 64 28 29 20 72 6f  ite3_os_end() ro
35480 75 74 69 6e 65 20 74 68 61 74 20 66 6f 6c 6c 6f  utine that follo
35490 77 73 2c 0a 2a 2a 20 73 68 6f 75 6c 64 20 62 65  ws,.** should be
354a0 20 74 68 65 20 6f 6e 6c 79 20 72 6f 75 74 69 6e   the only routin
354b0 65 73 20 69 6e 20 74 68 69 73 20 66 69 6c 65 20  es in this file 
354c0 74 68 61 74 20 61 72 65 20 76 69 73 69 62 6c 65  that are visible
354d0 20 66 72 6f 6d 20 6f 74 68 65 72 0a 2a 2a 20 66   from other.** f
354e0 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  iles..**.** This
354f0 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
35500 65 64 20 6f 6e 63 65 20 64 75 72 69 6e 67 20 53  ed once during S
35510 51 4c 69 74 65 20 69 6e 69 74 69 61 6c 69 7a 61  QLite initializa
35520 74 69 6f 6e 20 61 6e 64 20 62 79 20 61 0a 2a 2a  tion and by a.**
35530 20 73 69 6e 67 6c 65 20 74 68 72 65 61 64 2e 20   single thread. 
35540 20 54 68 65 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f   The memory allo
35550 63 61 74 69 6f 6e 20 61 6e 64 20 6d 75 74 65 78  cation and mutex
35560 20 73 75 62 73 79 73 74 65 6d 73 20 68 61 76 65   subsystems have
35570 20 6e 6f 74 0a 2a 2a 20 6e 65 63 65 73 73 61 72   not.** necessar
35580 69 6c 79 20 62 65 65 6e 20 69 6e 69 74 69 61 6c  ily been initial
35590 69 7a 65 64 20 77 68 65 6e 20 74 68 69 73 20 72  ized when this r
355a0 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
355b0 2c 20 61 6e 64 20 73 6f 20 74 68 65 79 0a 2a 2a  , and so they.**
355c0 20 73 68 6f 75 6c 64 20 6e 6f 74 20 62 65 20 75   should not be u
355d0 73 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  sed..*/.int sqli
355e0 74 65 33 5f 6f 73 5f 69 6e 69 74 28 76 6f 69 64  te3_os_init(void
355f0 29 7b 20 0a 20 20 2f 2a 20 0a 20 20 2a 2a 20 54  ){ .  /* .  ** T
35600 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 6d 61 63  he following mac
35610 72 6f 20 64 65 66 69 6e 65 73 20 61 6e 20 69 6e  ro defines an in
35620 69 74 69 61 6c 69 7a 65 72 20 66 6f 72 20 61 6e  itializer for an
35630 20 73 71 6c 69 74 65 33 5f 76 66 73 20 6f 62 6a   sqlite3_vfs obj
35640 65 63 74 2e 0a 20 20 2a 2a 20 54 68 65 20 6e 61  ect..  ** The na
35650 6d 65 20 6f 66 20 74 68 65 20 56 46 53 20 69 73  me of the VFS is
35660 20 4e 41 4d 45 2e 20 20 54 68 65 20 70 41 70 70   NAME.  The pApp
35670 44 61 74 61 20 69 73 20 61 20 70 6f 69 6e 74 65  Data is a pointe
35680 72 20 74 6f 20 61 20 70 6f 69 6e 74 65 72 0a 20  r to a pointer. 
35690 20 2a 2a 20 74 6f 20 74 68 65 20 22 66 69 6e 64   ** to the "find
356a0 65 72 22 20 66 75 6e 63 74 69 6f 6e 2e 20 20 28  er" function.  (
356b0 70 41 70 70 44 61 74 61 20 69 73 20 61 20 70 6f  pAppData is a po
356c0 69 6e 74 65 72 20 74 6f 20 61 20 70 6f 69 6e 74  inter to a point
356d0 65 72 20 62 65 63 61 75 73 65 0a 20 20 2a 2a 20  er because.  ** 
356e0 73 69 6c 6c 79 20 43 39 30 20 72 75 6c 65 73 20  silly C90 rules 
356f0 70 72 6f 68 69 62 69 74 20 61 20 76 6f 69 64 2a  prohibit a void*
35700 20 66 72 6f 6d 20 62 65 69 6e 67 20 63 61 73 74   from being cast
35710 20 74 6f 20 61 20 66 75 6e 63 74 69 6f 6e 20 70   to a function p
35720 6f 69 6e 74 65 72 0a 20 20 2a 2a 20 61 6e 64 20  ointer.  ** and 
35730 73 6f 20 77 65 20 68 61 76 65 20 74 6f 20 67 6f  so we have to go
35740 20 74 68 72 6f 75 67 68 20 74 68 65 20 69 6e 74   through the int
35750 65 72 6d 65 64 69 61 74 65 20 70 6f 69 6e 74 65  ermediate pointe
35760 72 20 74 6f 20 61 76 6f 69 64 20 70 72 6f 62 6c  r to avoid probl
35770 65 6d 73 0a 20 20 2a 2a 20 77 68 65 6e 20 63 6f  ems.  ** when co
35780 6d 70 69 6c 69 6e 67 20 77 69 74 68 20 2d 70 65  mpiling with -pe
35790 64 61 6e 74 69 63 2d 65 72 72 6f 72 73 20 6f 6e  dantic-errors on
357a0 20 47 43 43 2e 29 0a 20 20 2a 2a 0a 20 20 2a 2a   GCC.).  **.  **
357b0 20 54 68 65 20 46 49 4e 44 45 52 20 70 61 72 61   The FINDER para
357c0 6d 65 74 65 72 20 74 6f 20 74 68 69 73 20 6d 61  meter to this ma
357d0 63 72 6f 20 69 73 20 74 68 65 20 6e 61 6d 65 20  cro is the name 
357e0 6f 66 20 74 68 65 20 70 6f 69 6e 74 65 72 20 74  of the pointer t
357f0 6f 20 74 68 65 0a 20 20 2a 2a 20 66 69 6e 64 65  o the.  ** finde
35800 72 2d 66 75 6e 63 74 69 6f 6e 2e 20 20 54 68 65  r-function.  The
35810 20 66 69 6e 64 65 72 2d 66 75 6e 63 74 69 6f 6e   finder-function
35820 20 72 65 74 75 72 6e 73 20 61 20 70 6f 69 6e 74   returns a point
35830 65 72 20 74 6f 20 74 68 65 0a 20 20 2a 2a 20 73  er to the.  ** s
35840 71 6c 69 74 65 5f 69 6f 5f 6d 65 74 68 6f 64 73  qlite_io_methods
35850 20 6f 62 6a 65 63 74 20 74 68 61 74 20 69 6d 70   object that imp
35860 6c 65 6d 65 6e 74 73 20 74 68 65 20 64 65 73 69  lements the desi
35870 72 65 64 20 6c 6f 63 6b 69 6e 67 0a 20 20 2a 2a  red locking.  **
35880 20 62 65 68 61 76 69 6f 72 73 2e 20 20 53 65 65   behaviors.  See
35890 20 74 68 65 20 64 69 76 69 73 69 6f 6e 20 61 62   the division ab
358a0 6f 76 65 20 74 68 61 74 20 63 6f 6e 74 61 69 6e  ove that contain
358b0 73 20 74 68 65 20 49 4f 4d 45 54 48 4f 44 53 0a  s the IOMETHODS.
358c0 20 20 2a 2a 20 6d 61 63 72 6f 20 66 6f 72 20 61    ** macro for a
358d0 64 64 69 74 69 6f 6e 20 69 6e 66 6f 72 6d 61 74  ddition informat
358e0 69 6f 6e 20 6f 6e 20 66 69 6e 64 65 72 2d 66 75  ion on finder-fu
358f0 6e 63 74 69 6f 6e 73 2e 0a 20 20 2a 2a 0a 20 20  nctions..  **.  
35900 2a 2a 20 4d 6f 73 74 20 66 69 6e 64 65 72 73 20  ** Most finders 
35910 73 69 6d 70 6c 79 20 72 65 74 75 72 6e 20 61 20  simply return a 
35920 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 66 69 78  pointer to a fix
35930 65 64 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65  ed sqlite3_io_me
35940 74 68 6f 64 73 0a 20 20 2a 2a 20 6f 62 6a 65 63  thods.  ** objec
35950 74 2e 20 20 42 75 74 20 74 68 65 20 22 61 75 74  t.  But the "aut
35960 6f 6c 6f 63 6b 49 6f 46 69 6e 64 65 72 22 20 61  olockIoFinder" a
35970 76 61 69 6c 61 62 6c 65 20 6f 6e 20 4d 61 63 4f  vailable on MacO
35980 53 58 20 64 6f 65 73 20 61 20 6c 69 74 74 6c 65  SX does a little
35990 0a 20 20 2a 2a 20 6d 6f 72 65 20 74 68 61 6e 20  .  ** more than 
359a0 74 68 61 74 3b 20 69 74 20 6c 6f 6f 6b 73 20 61  that; it looks a
359b0 74 20 74 68 65 20 66 69 6c 65 73 79 73 74 65 6d  t the filesystem
359c0 20 74 79 70 65 20 74 68 61 74 20 68 6f 73 74 73   type that hosts
359d0 20 74 68 65 20 0a 20 20 2a 2a 20 64 61 74 61 62   the .  ** datab
359e0 61 73 65 20 66 69 6c 65 20 61 6e 64 20 74 72 69  ase file and tri
359f0 65 73 20 74 6f 20 63 68 6f 6f 73 65 20 61 6e 20  es to choose an 
35a00 6c 6f 63 6b 69 6e 67 20 6d 65 74 68 6f 64 20 61  locking method a
35a10 70 70 72 6f 70 72 69 61 74 65 20 66 6f 72 0a 20  ppropriate for. 
35a20 20 2a 2a 20 74 68 61 74 20 66 69 6c 65 73 79 73   ** that filesys
35a30 74 65 6d 20 74 69 6d 65 2e 0a 20 20 2a 2f 0a 20  tem time..  */. 
35a40 20 23 64 65 66 69 6e 65 20 55 4e 49 58 56 46 53   #define UNIXVFS
35a50 28 56 46 53 4e 41 4d 45 2c 20 46 49 4e 44 45 52  (VFSNAME, FINDER
35a60 29 20 7b 20 20 20 20 20 20 20 20 20 20 20 20 20  ) {             
35a70 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20             \.   
35a80 20 32 2c 20 20 20 20 20 20 20 20 20 20 20 20 20   2,             
35a90 20 20 20 20 20 20 20 2f 2a 20 69 56 65 72 73 69         /* iVersi
35aa0 6f 6e 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20  on */           
35ab0 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 20 73           \.    s
35ac0 69 7a 65 6f 66 28 75 6e 69 78 46 69 6c 65 29 2c  izeof(unixFile),
35ad0 20 20 20 20 20 2f 2a 20 73 7a 4f 73 46 69 6c 65       /* szOsFile
35ae0 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20 20   */             
35af0 20 20 20 20 20 20 20 5c 0a 20 20 20 20 4d 41 58         \.    MAX
35b00 5f 50 41 54 48 4e 41 4d 45 2c 20 20 20 20 20 20  _PATHNAME,      
35b10 20 20 20 2f 2a 20 6d 78 50 61 74 68 6e 61 6d 65     /* mxPathname
35b20 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20 20   */             
35b30 20 20 20 20 20 5c 0a 20 20 20 20 30 2c 20 20 20       \.    0,   
35b40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35b50 20 2f 2a 20 70 4e 65 78 74 20 2a 2f 20 20 20 20   /* pNext */    
35b60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35b70 20 20 20 5c 0a 20 20 20 20 56 46 53 4e 41 4d 45     \.    VFSNAME
35b80 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
35b90 2a 20 7a 4e 61 6d 65 20 2a 2f 20 20 20 20 20 20  * zName */      
35ba0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35bb0 20 5c 0a 20 20 20 20 28 76 6f 69 64 2a 29 26 46   \.    (void*)&F
35bc0 49 4e 44 45 52 2c 20 20 20 20 20 20 20 2f 2a 20  INDER,       /* 
35bd0 70 41 70 70 44 61 74 61 20 2a 2f 20 20 20 20 20  pAppData */     
35be0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c                 \
35bf0 0a 20 20 20 20 75 6e 69 78 4f 70 65 6e 2c 20 20  .    unixOpen,  
35c00 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 4f             /* xO
35c10 70 65 6e 20 2a 2f 20 20 20 20 20 20 20 20 20 20  pen */          
35c20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20               \. 
35c30 20 20 20 75 6e 69 78 44 65 6c 65 74 65 2c 20 20     unixDelete,  
35c40 20 20 20 20 20 20 20 20 20 2f 2a 20 78 44 65 6c           /* xDel
35c50 65 74 65 20 2a 2f 20 20 20 20 20 20 20 20 20 20  ete */          
35c60 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20             \.   
35c70 20 75 6e 69 78 41 63 63 65 73 73 2c 20 20 20 20   unixAccess,    
35c80 20 20 20 20 20 20 20 2f 2a 20 78 41 63 63 65 73         /* xAcces
35c90 73 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20  s */            
35ca0 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 20 75           \.    u
35cb0 6e 69 78 46 75 6c 6c 50 61 74 68 6e 61 6d 65 2c  nixFullPathname,
35cc0 20 20 20 20 20 2f 2a 20 78 46 75 6c 6c 50 61 74       /* xFullPat
35cd0 68 6e 61 6d 65 20 2a 2f 20 20 20 20 20 20 20 20  hname */        
35ce0 20 20 20 20 20 20 20 5c 0a 20 20 20 20 75 6e 69         \.    uni
35cf0 78 44 6c 4f 70 65 6e 2c 20 20 20 20 20 20 20 20  xDlOpen,        
35d00 20 20 20 2f 2a 20 78 44 6c 4f 70 65 6e 20 2a 2f     /* xDlOpen */
35d10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35d20 20 20 20 20 20 5c 0a 20 20 20 20 75 6e 69 78 44       \.    unixD
35d30 6c 45 72 72 6f 72 2c 20 20 20 20 20 20 20 20 20  lError,         
35d40 20 2f 2a 20 78 44 6c 45 72 72 6f 72 20 2a 2f 20   /* xDlError */ 
35d50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35d60 20 20 20 5c 0a 20 20 20 20 75 6e 69 78 44 6c 53     \.    unixDlS
35d70 79 6d 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f  ym,            /
35d80 2a 20 78 44 6c 53 79 6d 20 2a 2f 20 20 20 20 20  * xDlSym */     
35d90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35da0 20 5c 0a 20 20 20 20 75 6e 69 78 44 6c 43 6c 6f   \.    unixDlClo
35db0 73 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  se,          /* 
35dc0 78 44 6c 43 6c 6f 73 65 20 2a 2f 20 20 20 20 20  xDlClose */     
35dd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c                 \
35de0 0a 20 20 20 20 75 6e 69 78 52 61 6e 64 6f 6d 6e  .    unixRandomn
35df0 65 73 73 2c 20 20 20 20 20 20 20 2f 2a 20 78 52  ess,       /* xR
35e00 61 6e 64 6f 6d 6e 65 73 73 20 2a 2f 20 20 20 20  andomness */    
35e10 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20               \. 
35e20 20 20 20 75 6e 69 78 53 6c 65 65 70 2c 20 20 20     unixSleep,   
35e30 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53 6c 65           /* xSle
35e40 65 70 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20  ep */           
35e50 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20             \.   
35e60 20 75 6e 69 78 43 75 72 72 65 6e 74 54 69 6d 65   unixCurrentTime
35e70 2c 20 20 20 20 20 20 2f 2a 20 78 43 75 72 72 65  ,      /* xCurre
35e80 6e 74 54 69 6d 65 20 2a 2f 20 20 20 20 20 20 20  ntTime */       
35e90 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 20 75           \.    u
35ea0 6e 69 78 47 65 74 4c 61 73 74 45 72 72 6f 72 2c  nixGetLastError,
35eb0 20 20 20 20 20 2f 2a 20 78 47 65 74 4c 61 73 74       /* xGetLast
35ec0 45 72 72 6f 72 20 2a 2f 20 20 20 20 20 20 20 20  Error */        
35ed0 20 20 20 20 20 20 20 5c 0a 20 20 20 20 30 2c 20         \.    0, 
35ee0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35ef0 20 20 20 2f 2a 20 78 52 65 6e 61 6d 65 20 2a 2f     /* xRename */
35f00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35f10 20 20 20 20 20 5c 0a 20 20 20 20 75 6e 69 78 43       \.    unixC
35f20 75 72 72 65 6e 74 54 69 6d 65 49 6e 74 36 34 2c  urrentTimeInt64,
35f30 20 2f 2a 20 78 43 75 72 72 65 6e 74 54 69 6d 65   /* xCurrentTime
35f40 49 6e 74 36 34 20 2a 2f 20 20 20 20 20 20 20 20  Int64 */        
35f50 20 20 20 5c 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20     \.  }..  /*. 
35f60 20 2a 2a 20 41 6c 6c 20 64 65 66 61 75 6c 74 20   ** All default 
35f70 56 46 53 65 73 20 66 6f 72 20 75 6e 69 78 20 61  VFSes for unix a
35f80 72 65 20 63 6f 6e 74 61 69 6e 65 64 20 69 6e 20  re contained in 
35f90 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 72  the following ar
35fa0 72 61 79 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4e  ray..  **.  ** N
35fb0 6f 74 65 20 74 68 61 74 20 74 68 65 20 73 71 6c  ote that the sql
35fc0 69 74 65 33 5f 76 66 73 2e 70 4e 65 78 74 20 66  ite3_vfs.pNext f
35fd0 69 65 6c 64 20 6f 66 20 74 68 65 20 56 46 53 20  ield of the VFS 
35fe0 6f 62 6a 65 63 74 20 69 73 20 6d 6f 64 69 66 69  object is modifi
35ff0 65 64 0a 20 20 2a 2a 20 62 79 20 74 68 65 20 53  ed.  ** by the S
36000 51 4c 69 74 65 20 63 6f 72 65 20 77 68 65 6e 20  QLite core when 
36010 74 68 65 20 56 46 53 20 69 73 20 72 65 67 69 73  the VFS is regis
36020 74 65 72 65 64 2e 20 20 53 6f 20 74 68 65 20 66  tered.  So the f
36030 6f 6c 6c 6f 77 69 6e 67 0a 20 20 2a 2a 20 61 72  ollowing.  ** ar
36040 72 61 79 20 63 61 6e 6e 6f 74 20 62 65 20 63 6f  ray cannot be co
36050 6e 73 74 2e 0a 20 20 2a 2f 0a 20 20 73 74 61 74  nst..  */.  stat
36060 69 63 20 73 71 6c 69 74 65 33 5f 76 66 73 20 61  ic sqlite3_vfs a
36070 56 66 73 5b 5d 20 3d 20 7b 0a 23 69 66 20 53 51  Vfs[] = {.#if SQ
36080 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b  LITE_ENABLE_LOCK
36090 49 4e 47 5f 53 54 59 4c 45 20 26 26 20 28 4f 53  ING_STYLE && (OS
360a0 5f 56 58 57 4f 52 4b 53 20 7c 7c 20 64 65 66 69  _VXWORKS || defi
360b0 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 29 0a  ned(__APPLE__)).
360c0 20 20 20 20 55 4e 49 58 56 46 53 28 22 75 6e 69      UNIXVFS("uni
360d0 78 22 2c 20 20 20 20 20 20 20 20 20 20 61 75 74  x",          aut
360e0 6f 6c 6f 63 6b 49 6f 46 69 6e 64 65 72 20 29 2c  olockIoFinder ),
360f0 0a 23 65 6c 73 65 0a 20 20 20 20 55 4e 49 58 56  .#else.    UNIXV
36100 46 53 28 22 75 6e 69 78 22 2c 20 20 20 20 20 20  FS("unix",      
36110 20 20 20 20 70 6f 73 69 78 49 6f 46 69 6e 64 65      posixIoFinde
36120 72 20 29 2c 0a 23 65 6e 64 69 66 0a 20 20 20 20  r ),.#endif.    
36130 55 4e 49 58 56 46 53 28 22 75 6e 69 78 2d 6e 6f  UNIXVFS("unix-no
36140 6e 65 22 2c 20 20 20 20 20 6e 6f 6c 6f 63 6b 49  ne",     nolockI
36150 6f 46 69 6e 64 65 72 20 29 2c 0a 20 20 20 20 55  oFinder ),.    U
36160 4e 49 58 56 46 53 28 22 75 6e 69 78 2d 64 6f 74  NIXVFS("unix-dot
36170 66 69 6c 65 22 2c 20 20 64 6f 74 6c 6f 63 6b 49  file",  dotlockI
36180 6f 46 69 6e 64 65 72 20 29 2c 0a 23 69 66 20 4f  oFinder ),.#if O
36190 53 5f 56 58 57 4f 52 4b 53 0a 20 20 20 20 55 4e  S_VXWORKS.    UN
361a0 49 58 56 46 53 28 22 75 6e 69 78 2d 6e 61 6d 65  IXVFS("unix-name
361b0 64 73 65 6d 22 2c 20 73 65 6d 49 6f 46 69 6e 64  dsem", semIoFind
361c0 65 72 20 29 2c 0a 23 65 6e 64 69 66 0a 23 69 66  er ),.#endif.#if
361d0 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c   SQLITE_ENABLE_L
361e0 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 20 20 20  OCKING_STYLE.   
361f0 20 55 4e 49 58 56 46 53 28 22 75 6e 69 78 2d 70   UNIXVFS("unix-p
36200 6f 73 69 78 22 2c 20 20 20 20 70 6f 73 69 78 49  osix",    posixI
36210 6f 46 69 6e 64 65 72 20 29 2c 0a 23 69 66 20 21  oFinder ),.#if !
36220 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20 20 20 55  OS_VXWORKS.    U
36230 4e 49 58 56 46 53 28 22 75 6e 69 78 2d 66 6c 6f  NIXVFS("unix-flo
36240 63 6b 22 2c 20 20 20 20 66 6c 6f 63 6b 49 6f 46  ck",    flockIoF
36250 69 6e 64 65 72 20 29 2c 0a 23 65 6e 64 69 66 0a  inder ),.#endif.
36260 23 65 6e 64 69 66 0a 23 69 66 20 53 51 4c 49 54  #endif.#if SQLIT
36270 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47  E_ENABLE_LOCKING
36280 5f 53 54 59 4c 45 20 26 26 20 64 65 66 69 6e 65  _STYLE && define
36290 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 0a 20 20 20  d(__APPLE__).   
362a0 20 55 4e 49 58 56 46 53 28 22 75 6e 69 78 2d 61   UNIXVFS("unix-a
362b0 66 70 22 2c 20 20 20 20 20 20 61 66 70 49 6f 46  fp",      afpIoF
362c0 69 6e 64 65 72 20 29 2c 0a 20 20 20 20 55 4e 49  inder ),.    UNI
362d0 58 56 46 53 28 22 75 6e 69 78 2d 6e 66 73 22 2c  XVFS("unix-nfs",
362e0 20 20 20 20 20 20 6e 66 73 49 6f 46 69 6e 64 65        nfsIoFinde
362f0 72 20 29 2c 0a 20 20 20 20 55 4e 49 58 56 46 53  r ),.    UNIXVFS
36300 28 22 75 6e 69 78 2d 70 72 6f 78 79 22 2c 20 20  ("unix-proxy",  
36310 20 20 70 72 6f 78 79 49 6f 46 69 6e 64 65 72 20    proxyIoFinder 
36320 29 2c 0a 23 65 6e 64 69 66 0a 20 20 7d 3b 0a 20  ),.#endif.  };. 
36330 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 69 3b   unsigned int i;
36340 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f            /* Loo
36350 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 0a 20 20  p counter */..  
36360 2f 2a 20 52 65 67 69 73 74 65 72 20 61 6c 6c 20  /* Register all 
36370 56 46 53 65 73 20 64 65 66 69 6e 65 64 20 69 6e  VFSes defined in
36380 20 74 68 65 20 61 56 66 73 5b 5d 20 61 72 72 61   the aVfs[] arra
36390 79 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20  y */.  for(i=0; 
363a0 69 3c 28 73 69 7a 65 6f 66 28 61 56 66 73 29 2f  i<(sizeof(aVfs)/
363b0 73 69 7a 65 6f 66 28 73 71 6c 69 74 65 33 5f 76  sizeof(sqlite3_v
363c0 66 73 29 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  fs)); i++){.    
363d0 73 71 6c 69 74 65 33 5f 76 66 73 5f 72 65 67 69  sqlite3_vfs_regi
363e0 73 74 65 72 28 26 61 56 66 73 5b 69 5d 2c 20 69  ster(&aVfs[i], i
363f0 3d 3d 30 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  ==0);.  }.  retu
36400 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 0a 7d  rn SQLITE_OK; .}
36410 0a 0a 2f 2a 0a 2a 2a 20 53 68 75 74 64 6f 77 6e  ../*.** Shutdown
36420 20 74 68 65 20 6f 70 65 72 61 74 69 6e 67 20 73   the operating s
36430 79 73 74 65 6d 20 69 6e 74 65 72 66 61 63 65 2e  ystem interface.
36440 0a 2a 2a 0a 2a 2a 20 53 6f 6d 65 20 6f 70 65 72  .**.** Some oper
36450 61 74 69 6e 67 20 73 79 73 74 65 6d 73 20 6d 69  ating systems mi
36460 67 68 74 20 6e 65 65 64 20 74 6f 20 64 6f 20 73  ght need to do s
36470 6f 6d 65 20 63 6c 65 61 6e 75 70 20 69 6e 20 74  ome cleanup in t
36480 68 69 73 20 72 6f 75 74 69 6e 65 2c 0a 2a 2a 20  his routine,.** 
36490 74 6f 20 72 65 6c 65 61 73 65 20 64 79 6e 61 6d  to release dynam
364a0 69 63 61 6c 6c 79 20 61 6c 6c 6f 63 61 74 65 64  ically allocated
364b0 20 6f 62 6a 65 63 74 73 2e 20 20 42 75 74 20 6e   objects.  But n
364c0 6f 74 20 6f 6e 20 75 6e 69 78 2e 0a 2a 2a 20 54  ot on unix..** T
364d0 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61  his routine is a
364e0 20 6e 6f 2d 6f 70 20 66 6f 72 20 75 6e 69 78 2e   no-op for unix.
364f0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f  .*/.int sqlite3_
36500 6f 73 5f 65 6e 64 28 76 6f 69 64 29 7b 20 0a 20  os_end(void){ . 
36510 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
36520 4b 3b 20 0a 7d 0a 20 0a 23 65 6e 64 69 66 20 2f  K; .}. .#endif /
36530 2a 20 53 51 4c 49 54 45 5f 4f 53 5f 55 4e 49 58  * SQLITE_OS_UNIX
36540 20 2a 2f 0a                                       */.