/ Hex Artifact Content
Login

Artifact d402146bd3731575ff399d2ebcdc0867034e8451:


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: 0a 2f 2a 0a 2a 2a 20 53 6f 6d 65 74 69 6d 65 73  ./*.** Sometimes
1600: 2c 20 61 66 74 65 72 20 61 20 66 69 6c 65 20 68  , after a file h
1610: 61 6e 64 6c 65 20 69 73 20 63 6c 6f 73 65 64 20  andle is closed 
1620: 62 79 20 53 51 4c 69 74 65 2c 20 74 68 65 20 66  by SQLite, the f
1630: 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 0a 2a  ile descriptor.*
1640: 2a 20 63 61 6e 6e 6f 74 20 62 65 20 63 6c 6f 73  * cannot be clos
1650: 65 64 20 69 6d 6d 65 64 69 61 74 65 6c 79 2e 20  ed immediately. 
1660: 49 6e 20 74 68 65 73 65 20 63 61 73 65 73 2c 20  In these cases, 
1670: 69 6e 73 74 61 6e 63 65 73 20 6f 66 20 74 68 65  instances of the
1680: 20 66 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a 20 73 74   following.** st
1690: 72 75 63 74 75 72 65 20 61 72 65 20 75 73 65 64  ructure are used
16a0: 20 74 6f 20 73 74 6f 72 65 20 74 68 65 20 66 69   to store the fi
16b0: 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 77 68  le descriptor wh
16c0: 69 6c 65 20 77 61 69 74 69 6e 67 20 66 6f 72 20  ile waiting for 
16d0: 61 6e 0a 2a 2a 20 6f 70 70 6f 72 74 75 6e 69 74  an.** opportunit
16e0: 79 20 74 6f 20 65 69 74 68 65 72 20 63 6c 6f 73  y to either clos
16f0: 65 20 6f 72 20 72 65 75 73 65 20 69 74 2e 0a 2a  e or reuse it..*
1700: 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74  /.typedef struct
1710: 20 55 6e 69 78 55 6e 75 73 65 64 46 64 20 55 6e   UnixUnusedFd Un
1720: 69 78 55 6e 75 73 65 64 46 64 3b 0a 73 74 72 75  ixUnusedFd;.stru
1730: 63 74 20 55 6e 69 78 55 6e 75 73 65 64 46 64 20  ct UnixUnusedFd 
1740: 7b 0a 20 20 69 6e 74 20 66 64 3b 20 20 20 20 20  {.  int fd;     
1750: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1760: 20 46 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   File descriptor
1770: 20 74 6f 20 63 6c 6f 73 65 20 2a 2f 0a 20 20 69   to close */.  i
1780: 6e 74 20 66 6c 61 67 73 3b 20 20 20 20 20 20 20  nt flags;       
1790: 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6c 61 67           /* Flag
17a0: 73 20 74 68 69 73 20 66 69 6c 65 20 64 65 73 63  s this file desc
17b0: 72 69 70 74 6f 72 20 77 61 73 20 6f 70 65 6e 65  riptor was opene
17c0: 64 20 77 69 74 68 20 2a 2f 0a 20 20 55 6e 69 78  d with */.  Unix
17d0: 55 6e 75 73 65 64 46 64 20 2a 70 4e 65 78 74 3b  UnusedFd *pNext;
17e0: 20 20 20 20 20 20 2f 2a 20 4e 65 78 74 20 75 6e        /* Next un
17f0: 75 73 65 64 20 66 69 6c 65 20 64 65 73 63 72 69  used file descri
1800: 70 74 6f 72 20 6f 6e 20 73 61 6d 65 20 66 69 6c  ptor on same fil
1810: 65 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 54  e */.};../*.** T
1820: 68 65 20 75 6e 69 78 46 69 6c 65 20 73 74 72 75  he unixFile stru
1830: 63 74 75 72 65 20 69 73 20 73 75 62 63 6c 61 73  cture is subclas
1840: 73 20 6f 66 20 73 71 6c 69 74 65 33 5f 66 69 6c  s of sqlite3_fil
1850: 65 20 73 70 65 63 69 66 69 63 20 74 6f 20 74 68  e specific to th
1860: 65 20 75 6e 69 78 0a 2a 2a 20 56 46 53 20 69 6d  e unix.** VFS im
1870: 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 73 2e 0a 2a  plementations..*
1880: 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74  /.typedef struct
1890: 20 75 6e 69 78 46 69 6c 65 20 75 6e 69 78 46 69   unixFile unixFi
18a0: 6c 65 3b 0a 73 74 72 75 63 74 20 75 6e 69 78 46  le;.struct unixF
18b0: 69 6c 65 20 7b 0a 20 20 73 71 6c 69 74 65 33 5f  ile {.  sqlite3_
18c0: 69 6f 5f 6d 65 74 68 6f 64 73 20 63 6f 6e 73 74  io_methods const
18d0: 20 2a 70 4d 65 74 68 6f 64 3b 20 20 2f 2a 20 41   *pMethod;  /* A
18e0: 6c 77 61 79 73 20 74 68 65 20 66 69 72 73 74 20  lways the first 
18f0: 65 6e 74 72 79 20 2a 2f 0a 20 20 73 74 72 75 63  entry */.  struc
1900: 74 20 75 6e 69 78 4f 70 65 6e 43 6e 74 20 2a 70  t unixOpenCnt *p
1910: 4f 70 65 6e 3b 20 20 20 20 20 20 20 2f 2a 20 49  Open;       /* I
1920: 6e 66 6f 20 61 62 6f 75 74 20 61 6c 6c 20 6f 70  nfo about all op
1930: 65 6e 20 66 64 27 73 20 6f 6e 20 74 68 69 73 20  en fd's on this 
1940: 69 6e 6f 64 65 20 2a 2f 0a 20 20 73 74 72 75 63  inode */.  struc
1950: 74 20 75 6e 69 78 4c 6f 63 6b 49 6e 66 6f 20 2a  t unixLockInfo *
1960: 70 4c 6f 63 6b 3b 20 20 20 20 20 20 2f 2a 20 49  pLock;      /* I
1970: 6e 66 6f 20 61 62 6f 75 74 20 6c 6f 63 6b 73 20  nfo about locks 
1980: 6f 6e 20 74 68 69 73 20 69 6e 6f 64 65 20 2a 2f  on this inode */
1990: 0a 20 20 69 6e 74 20 68 3b 20 20 20 20 20 20 20  .  int h;       
19a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19b0: 20 20 20 20 2f 2a 20 54 68 65 20 66 69 6c 65 20      /* The file 
19c0: 64 65 73 63 72 69 70 74 6f 72 20 2a 2f 0a 20 20  descriptor */.  
19d0: 69 6e 74 20 64 69 72 66 64 3b 20 20 20 20 20 20  int dirfd;      
19e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19f0: 20 2f 2a 20 46 69 6c 65 20 64 65 73 63 72 69 70   /* File descrip
1a00: 74 6f 72 20 66 6f 72 20 74 68 65 20 64 69 72 65  tor for the dire
1a10: 63 74 6f 72 79 20 2a 2f 0a 20 20 75 6e 73 69 67  ctory */.  unsig
1a20: 6e 65 64 20 63 68 61 72 20 6c 6f 63 6b 74 79 70  ned char locktyp
1a30: 65 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  e;          /* T
1a40: 68 65 20 74 79 70 65 20 6f 66 20 6c 6f 63 6b 20  he type of lock 
1a50: 68 65 6c 64 20 6f 6e 20 74 68 69 73 20 66 64 20  held on this fd 
1a60: 2a 2f 0a 20 20 69 6e 74 20 6c 61 73 74 45 72 72  */.  int lastErr
1a70: 6e 6f 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  no;             
1a80: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 75 6e 69        /* The uni
1a90: 78 20 65 72 72 6e 6f 20 66 72 6f 6d 20 74 68 65  x errno from the
1aa0: 20 6c 61 73 74 20 49 2f 4f 20 65 72 72 6f 72 20   last I/O error 
1ab0: 2a 2f 0a 20 20 76 6f 69 64 20 2a 6c 6f 63 6b 69  */.  void *locki
1ac0: 6e 67 43 6f 6e 74 65 78 74 3b 20 20 20 20 20 20  ngContext;      
1ad0: 20 20 20 20 20 20 2f 2a 20 4c 6f 63 6b 69 6e 67        /* Locking
1ae0: 20 73 74 79 6c 65 20 73 70 65 63 69 66 69 63 20   style specific 
1af0: 73 74 61 74 65 20 2a 2f 0a 20 20 55 6e 69 78 55  state */.  UnixU
1b00: 6e 75 73 65 64 46 64 20 2a 70 55 6e 75 73 65 64  nusedFd *pUnused
1b10: 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50  ;           /* P
1b20: 72 65 2d 61 6c 6c 6f 63 61 74 65 64 20 55 6e 69  re-allocated Uni
1b30: 78 55 6e 75 73 65 64 46 64 20 2a 2f 0a 20 20 69  xUnusedFd */.  i
1b40: 6e 74 20 66 69 6c 65 46 6c 61 67 73 3b 20 20 20  nt fileFlags;   
1b50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b60: 2f 2a 20 4d 69 73 63 65 6c 6c 61 6e 6f 75 73 20  /* Miscellanous 
1b70: 66 6c 61 67 73 20 2a 2f 0a 23 69 66 20 53 51 4c  flags */.#if SQL
1b80: 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49  ITE_ENABLE_LOCKI
1b90: 4e 47 5f 53 54 59 4c 45 0a 20 20 69 6e 74 20 6f  NG_STYLE.  int o
1ba0: 70 65 6e 46 6c 61 67 73 3b 20 20 20 20 20 20 20  penFlags;       
1bb0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
1bc0: 68 65 20 66 6c 61 67 73 20 73 70 65 63 69 66 69  he flags specifi
1bd0: 65 64 20 61 74 20 6f 70 65 6e 28 29 20 2a 2f 0a  ed at open() */.
1be0: 23 65 6e 64 69 66 0a 23 69 66 20 53 51 4c 49 54  #endif.#if SQLIT
1bf0: 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47  E_ENABLE_LOCKING
1c00: 5f 53 54 59 4c 45 20 7c 7c 20 64 65 66 69 6e 65  _STYLE || define
1c10: 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 0a 20 20 75  d(__APPLE__).  u
1c20: 6e 73 69 67 6e 65 64 20 66 73 46 6c 61 67 73 3b  nsigned fsFlags;
1c30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c40: 20 2f 2a 20 63 61 63 68 65 64 20 64 65 74 61 69   /* cached detai
1c50: 6c 73 20 66 72 6f 6d 20 73 74 61 74 66 73 28 29  ls from statfs()
1c60: 20 2a 2f 0a 23 65 6e 64 69 66 0a 23 69 66 20 53   */.#endif.#if S
1c70: 51 4c 49 54 45 5f 54 48 52 45 41 44 53 41 46 45  QLITE_THREADSAFE
1c80: 20 26 26 20 64 65 66 69 6e 65 64 28 5f 5f 6c 69   && defined(__li
1c90: 6e 75 78 5f 5f 29 0a 20 20 70 74 68 72 65 61 64  nux__).  pthread
1ca0: 5f 74 20 74 69 64 3b 20 20 20 20 20 20 20 20 20  _t tid;         
1cb0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
1cc0: 20 74 68 72 65 61 64 20 74 68 61 74 20 22 6f 77   thread that "ow
1cd0: 6e 73 22 20 74 68 69 73 20 75 6e 69 78 46 69 6c  ns" this unixFil
1ce0: 65 20 2a 2f 0a 23 65 6e 64 69 66 0a 23 69 66 20  e */.#endif.#if 
1cf0: 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20 69 6e 74  OS_VXWORKS.  int
1d00: 20 69 73 44 65 6c 65 74 65 3b 20 20 20 20 20 20   isDelete;      
1d10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1d20: 20 44 65 6c 65 74 65 20 6f 6e 20 63 6c 6f 73 65   Delete on close
1d30: 20 69 66 20 74 72 75 65 20 2a 2f 0a 20 20 73 74   if true */.  st
1d40: 72 75 63 74 20 76 78 77 6f 72 6b 73 46 69 6c 65  ruct vxworksFile
1d50: 49 64 20 2a 70 49 64 3b 20 20 20 20 20 20 20 2f  Id *pId;       /
1d60: 2a 20 55 6e 69 71 75 65 20 66 69 6c 65 20 49 44  * Unique file ID
1d70: 20 2a 2f 0a 23 65 6e 64 69 66 0a 23 69 66 6e 64   */.#endif.#ifnd
1d80: 65 66 20 4e 44 45 42 55 47 0a 20 20 2f 2a 20 54  ef NDEBUG.  /* T
1d90: 68 65 20 6e 65 78 74 20 67 72 6f 75 70 20 6f 66  he next group of
1da0: 20 76 61 72 69 61 62 6c 65 73 20 61 72 65 20 75   variables are u
1db0: 73 65 64 20 74 6f 20 74 72 61 63 6b 20 77 68 65  sed to track whe
1dc0: 74 68 65 72 20 6f 72 20 6e 6f 74 20 74 68 65 0a  ther or not the.
1dd0: 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e    ** transaction
1de0: 20 63 6f 75 6e 74 65 72 20 69 6e 20 62 79 74 65   counter in byte
1df0: 73 20 32 34 2d 32 37 20 6f 66 20 64 61 74 61 62  s 24-27 of datab
1e00: 61 73 65 20 66 69 6c 65 73 20 61 72 65 20 75 70  ase files are up
1e10: 64 61 74 65 64 0a 20 20 2a 2a 20 77 68 65 6e 65  dated.  ** whene
1e20: 76 65 72 20 61 6e 79 20 70 61 72 74 20 6f 66 20  ver any part of 
1e30: 74 68 65 20 64 61 74 61 62 61 73 65 20 63 68 61  the database cha
1e40: 6e 67 65 73 2e 20 20 41 6e 20 61 73 73 65 72 74  nges.  An assert
1e50: 69 6f 6e 20 66 61 75 6c 74 20 77 69 6c 6c 0a 20  ion fault will. 
1e60: 20 2a 2a 20 6f 63 63 75 72 20 69 66 20 61 20 66   ** occur if a f
1e70: 69 6c 65 20 69 73 20 75 70 64 61 74 65 64 20 77  ile is updated w
1e80: 69 74 68 6f 75 74 20 61 6c 73 6f 20 75 70 64 61  ithout also upda
1e90: 74 69 6e 67 20 74 68 65 20 74 72 61 6e 73 61 63  ting the transac
1ea0: 74 69 6f 6e 0a 20 20 2a 2a 20 63 6f 75 6e 74 65  tion.  ** counte
1eb0: 72 2e 20 20 54 68 69 73 20 74 65 73 74 20 69 73  r.  This test is
1ec0: 20 6d 61 64 65 20 74 6f 20 61 76 6f 69 64 20 6e   made to avoid n
1ed0: 65 77 20 70 72 6f 62 6c 65 6d 73 20 73 69 6d 69  ew problems simi
1ee0: 6c 61 72 20 74 6f 20 74 68 65 0a 20 20 2a 2a 20  lar to the.  ** 
1ef0: 6f 6e 65 20 64 65 73 63 72 69 62 65 64 20 62 79  one described by
1f00: 20 74 69 63 6b 65 74 20 23 33 35 38 34 2e 20 0a   ticket #3584. .
1f10: 20 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20    */.  unsigned 
1f20: 63 68 61 72 20 74 72 61 6e 73 43 6e 74 72 43 68  char transCntrCh
1f30: 6e 67 3b 20 20 20 2f 2a 20 54 72 75 65 20 69 66  ng;   /* True if
1f40: 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
1f50: 20 63 6f 75 6e 74 65 72 20 63 68 61 6e 67 65 64   counter changed
1f60: 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63   */.  unsigned c
1f70: 68 61 72 20 64 62 55 70 64 61 74 65 3b 20 20 20  har dbUpdate;   
1f80: 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
1f90: 61 6e 79 20 70 61 72 74 20 6f 66 20 64 61 74 61  any part of data
1fa0: 62 61 73 65 20 66 69 6c 65 20 63 68 61 6e 67 65  base file change
1fb0: 64 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20  d */.  unsigned 
1fc0: 63 68 61 72 20 69 6e 4e 6f 72 6d 61 6c 57 72 69  char inNormalWri
1fd0: 74 65 3b 20 20 20 2f 2a 20 54 72 75 65 20 69 66  te;   /* True if
1fe0: 20 69 6e 20 61 20 6e 6f 72 6d 61 6c 20 77 72 69   in a normal wri
1ff0: 74 65 20 6f 70 65 72 61 74 69 6f 6e 20 2a 2f 0a  te operation */.
2000: 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20 53 51  #endif.#ifdef SQ
2010: 4c 49 54 45 5f 54 45 53 54 0a 20 20 2f 2a 20 49  LITE_TEST.  /* I
2020: 6e 20 74 65 73 74 20 6d 6f 64 65 2c 20 69 6e 63  n test mode, inc
2030: 72 65 61 73 65 20 74 68 65 20 73 69 7a 65 20 6f  rease the size o
2040: 66 20 74 68 69 73 20 73 74 72 75 63 74 75 72 65  f this structure
2050: 20 61 20 62 69 74 20 73 6f 20 74 68 61 74 20 0a   a bit so that .
2060: 20 20 2a 2a 20 69 74 20 69 73 20 6c 61 72 67 65    ** it is large
2070: 72 20 74 68 61 6e 20 74 68 65 20 73 74 72 75 63  r than the struc
2080: 74 20 43 72 61 73 68 46 69 6c 65 20 64 65 66 69  t CrashFile defi
2090: 6e 65 64 20 69 6e 20 74 65 73 74 36 2e 63 2e 0a  ned in test6.c..
20a0: 20 20 2a 2f 0a 20 20 63 68 61 72 20 61 50 61 64    */.  char aPad
20b0: 64 69 6e 67 5b 33 32 5d 3b 0a 23 65 6e 64 69 66  ding[32];.#endif
20c0: 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66  .};../*.** The f
20d0: 6f 6c 6c 6f 77 69 6e 67 20 6d 61 63 72 6f 73 20  ollowing macros 
20e0: 64 65 66 69 6e 65 20 62 69 74 73 20 69 6e 20 75  define bits in u
20f0: 6e 69 78 46 69 6c 65 2e 66 69 6c 65 46 6c 61 67  nixFile.fileFlag
2100: 73 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 53 51 4c  s.*/.#define SQL
2110: 49 54 45 5f 57 48 4f 4c 45 5f 46 49 4c 45 5f 4c  ITE_WHOLE_FILE_L
2120: 4f 43 4b 49 4e 47 20 20 30 78 30 30 30 31 20 20  OCKING  0x0001  
2130: 20 2f 2a 20 55 73 65 20 77 68 6f 6c 65 2d 66 69   /* Use whole-fi
2140: 6c 65 20 6c 6f 63 6b 69 6e 67 20 2a 2f 0a 0a 2f  le locking */../
2150: 2a 0a 2a 2a 20 49 6e 63 6c 75 64 65 20 63 6f 64  *.** Include cod
2160: 65 20 74 68 61 74 20 69 73 20 63 6f 6d 6d 6f 6e  e that is common
2170: 20 74 6f 20 61 6c 6c 20 6f 73 5f 2a 2e 63 20 66   to all os_*.c f
2180: 69 6c 65 73 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65  iles.*/.#include
2190: 20 22 6f 73 5f 63 6f 6d 6d 6f 6e 2e 68 22 0a 0a   "os_common.h"..
21a0: 2f 2a 0a 2a 2a 20 44 65 66 69 6e 65 20 76 61 72  /*.** Define var
21b0: 69 6f 75 73 20 6d 61 63 72 6f 73 20 74 68 61 74  ious macros that
21c0: 20 61 72 65 20 6d 69 73 73 69 6e 67 20 66 72 6f   are missing fro
21d0: 6d 20 73 6f 6d 65 20 73 79 73 74 65 6d 73 2e 0a  m some systems..
21e0: 2a 2f 0a 23 69 66 6e 64 65 66 20 4f 5f 4c 41 52  */.#ifndef O_LAR
21f0: 47 45 46 49 4c 45 0a 23 20 64 65 66 69 6e 65 20  GEFILE.# define 
2200: 4f 5f 4c 41 52 47 45 46 49 4c 45 20 30 0a 23 65  O_LARGEFILE 0.#e
2210: 6e 64 69 66 0a 23 69 66 64 65 66 20 53 51 4c 49  ndif.#ifdef SQLI
2220: 54 45 5f 44 49 53 41 42 4c 45 5f 4c 46 53 0a 23  TE_DISABLE_LFS.#
2230: 20 75 6e 64 65 66 20 4f 5f 4c 41 52 47 45 46 49   undef O_LARGEFI
2240: 4c 45 0a 23 20 64 65 66 69 6e 65 20 4f 5f 4c 41  LE.# define O_LA
2250: 52 47 45 46 49 4c 45 20 30 0a 23 65 6e 64 69 66  RGEFILE 0.#endif
2260: 0a 23 69 66 6e 64 65 66 20 4f 5f 4e 4f 46 4f 4c  .#ifndef O_NOFOL
2270: 4c 4f 57 0a 23 20 64 65 66 69 6e 65 20 4f 5f 4e  LOW.# define O_N
2280: 4f 46 4f 4c 4c 4f 57 20 30 0a 23 65 6e 64 69 66  OFOLLOW 0.#endif
2290: 0a 23 69 66 6e 64 65 66 20 4f 5f 42 49 4e 41 52  .#ifndef O_BINAR
22a0: 59 0a 23 20 64 65 66 69 6e 65 20 4f 5f 42 49 4e  Y.# define O_BIN
22b0: 41 52 59 20 30 0a 23 65 6e 64 69 66 0a 0a 2f 2a  ARY 0.#endif../*
22c0: 0a 2a 2a 20 54 68 65 20 44 4a 47 50 50 20 63 6f  .** The DJGPP co
22d0: 6d 70 69 6c 65 72 20 65 6e 76 69 72 6f 6e 6d 65  mpiler environme
22e0: 6e 74 20 6c 6f 6f 6b 73 20 6d 6f 73 74 6c 79 20  nt looks mostly 
22f0: 6c 69 6b 65 20 55 6e 69 78 2c 20 62 75 74 20 69  like Unix, but i
2300: 74 0a 2a 2a 20 6c 61 63 6b 73 20 74 68 65 20 66  t.** lacks the f
2310: 63 6e 74 6c 28 29 20 73 79 73 74 65 6d 20 63 61  cntl() system ca
2320: 6c 6c 2e 20 20 53 6f 20 72 65 64 65 66 69 6e 65  ll.  So redefine
2330: 20 66 63 6e 74 6c 28 29 20 74 6f 20 62 65 20 73   fcntl() to be s
2340: 6f 6d 65 74 68 69 6e 67 0a 2a 2a 20 74 68 61 74  omething.** that
2350: 20 61 6c 77 61 79 73 20 73 75 63 63 65 65 64 73   always succeeds
2360: 2e 20 20 54 68 69 73 20 6d 65 61 6e 73 20 74 68  .  This means th
2370: 61 74 20 6c 6f 63 6b 69 6e 67 20 64 6f 65 73 20  at locking does 
2380: 6e 6f 74 20 6f 63 63 75 72 20 75 6e 64 65 72 0a  not occur under.
2390: 2a 2a 20 44 4a 47 50 50 2e 20 20 42 75 74 20 69  ** DJGPP.  But i
23a0: 74 20 69 73 20 44 4f 53 20 2d 20 77 68 61 74 20  t is DOS - what 
23b0: 64 69 64 20 79 6f 75 20 65 78 70 65 63 74 3f 0a  did you expect?.
23c0: 2a 2f 0a 23 69 66 64 65 66 20 5f 5f 44 4a 47 50  */.#ifdef __DJGP
23d0: 50 5f 5f 0a 23 20 64 65 66 69 6e 65 20 66 63 6e  P__.# define fcn
23e0: 74 6c 28 41 2c 42 2c 43 29 20 30 0a 23 65 6e 64  tl(A,B,C) 0.#end
23f0: 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 74 68  if../*.** The th
2400: 72 65 61 64 69 64 20 6d 61 63 72 6f 20 72 65 73  readid macro res
2410: 6f 6c 76 65 73 20 74 6f 20 74 68 65 20 74 68 72  olves to the thr
2420: 65 61 64 2d 69 64 20 6f 72 20 74 6f 20 30 2e 20  ead-id or to 0. 
2430: 20 55 73 65 64 20 66 6f 72 0a 2a 2a 20 74 65 73   Used for.** tes
2440: 74 69 6e 67 20 61 6e 64 20 64 65 62 75 67 67 69  ting and debuggi
2450: 6e 67 20 6f 6e 6c 79 2e 0a 2a 2f 0a 23 69 66 20  ng only..*/.#if 
2460: 53 51 4c 49 54 45 5f 54 48 52 45 41 44 53 41 46  SQLITE_THREADSAF
2470: 45 0a 23 64 65 66 69 6e 65 20 74 68 72 65 61 64  E.#define thread
2480: 69 64 20 70 74 68 72 65 61 64 5f 73 65 6c 66 28  id pthread_self(
2490: 29 0a 23 65 6c 73 65 0a 23 64 65 66 69 6e 65 20  ).#else.#define 
24a0: 74 68 72 65 61 64 69 64 20 30 0a 23 65 6e 64 69  threadid 0.#endi
24b0: 66 0a 0a 0a 2f 2a 0a 2a 2a 20 48 65 6c 70 65 72  f.../*.** Helper
24c0: 20 66 75 6e 63 74 69 6f 6e 73 20 74 6f 20 6f 62   functions to ob
24d0: 74 61 69 6e 20 61 6e 64 20 72 65 6c 69 6e 71 75  tain and relinqu
24e0: 69 73 68 20 74 68 65 20 67 6c 6f 62 61 6c 20 6d  ish the global m
24f0: 75 74 65 78 2e 20 54 68 65 0a 2a 2a 20 67 6c 6f  utex. The.** glo
2500: 62 61 6c 20 6d 75 74 65 78 20 69 73 20 75 73 65  bal mutex is use
2510: 64 20 74 6f 20 70 72 6f 74 65 63 74 20 74 68 65  d to protect the
2520: 20 75 6e 69 78 4f 70 65 6e 43 6e 74 2c 20 75 6e   unixOpenCnt, un
2530: 69 78 4c 6f 63 6b 49 6e 66 6f 20 61 6e 64 0a 2a  ixLockInfo and.*
2540: 2a 20 76 78 77 6f 72 6b 73 46 69 6c 65 49 64 20  * vxworksFileId 
2550: 6f 62 6a 65 63 74 73 20 75 73 65 64 20 62 79 20  objects used by 
2560: 74 68 69 73 20 66 69 6c 65 2c 20 61 6c 6c 20 6f  this file, all o
2570: 66 20 77 68 69 63 68 20 6d 61 79 20 62 65 20 0a  f which may be .
2580: 2a 2a 20 73 68 61 72 65 64 20 62 79 20 6d 75 6c  ** shared by mul
2590: 74 69 70 6c 65 20 74 68 72 65 61 64 73 2e 0a 2a  tiple threads..*
25a0: 2a 0a 2a 2a 20 46 75 6e 63 74 69 6f 6e 20 75 6e  *.** Function un
25b0: 69 78 4d 75 74 65 78 48 65 6c 64 28 29 20 69 73  ixMutexHeld() is
25c0: 20 75 73 65 64 20 74 6f 20 61 73 73 65 72 74 28   used to assert(
25d0: 29 20 74 68 61 74 20 74 68 65 20 67 6c 6f 62 61  ) that the globa
25e0: 6c 20 6d 75 74 65 78 20 0a 2a 2a 20 69 73 20 68  l mutex .** is h
25f0: 65 6c 64 20 77 68 65 6e 20 72 65 71 75 69 72 65  eld when require
2600: 64 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  d. This function
2610: 20 69 73 20 6f 6e 6c 79 20 75 73 65 64 20 61 73   is only used as
2620: 20 70 61 72 74 20 6f 66 20 61 73 73 65 72 74 28   part of assert(
2630: 29 20 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74 73  ) .** statements
2640: 2e 20 65 2e 67 2e 0a 2a 2a 0a 2a 2a 20 20 20 75  . e.g..**.**   u
2650: 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29 0a  nixEnterMutex().
2660: 2a 2a 20 20 20 20 20 61 73 73 65 72 74 28 20 75  **     assert( u
2670: 6e 69 78 4d 75 74 65 78 48 65 6c 64 28 29 20 29  nixMutexHeld() )
2680: 3b 0a 2a 2a 20 20 20 75 6e 69 78 45 6e 74 65 72  ;.**   unixEnter
2690: 4c 65 61 76 65 28 29 0a 2a 2f 0a 73 74 61 74 69  Leave().*/.stati
26a0: 63 20 76 6f 69 64 20 75 6e 69 78 45 6e 74 65 72  c void unixEnter
26b0: 4d 75 74 65 78 28 76 6f 69 64 29 7b 0a 20 20 73  Mutex(void){.  s
26c0: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74  qlite3_mutex_ent
26d0: 65 72 28 73 71 6c 69 74 65 33 4d 75 74 65 78 41  er(sqlite3MutexA
26e0: 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45  lloc(SQLITE_MUTE
26f0: 58 5f 53 54 41 54 49 43 5f 4d 41 53 54 45 52 29  X_STATIC_MASTER)
2700: 29 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64  );.}.static void
2710: 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28   unixLeaveMutex(
2720: 76 6f 69 64 29 7b 0a 20 20 73 71 6c 69 74 65 33  void){.  sqlite3
2730: 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 73 71 6c  _mutex_leave(sql
2740: 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53  ite3MutexAlloc(S
2750: 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54 41 54  QLITE_MUTEX_STAT
2760: 49 43 5f 4d 41 53 54 45 52 29 29 3b 0a 7d 0a 23  IC_MASTER));.}.#
2770: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42  ifdef SQLITE_DEB
2780: 55 47 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e  UG.static int un
2790: 69 78 4d 75 74 65 78 48 65 6c 64 28 76 6f 69 64  ixMutexHeld(void
27a0: 29 20 7b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c  ) {.  return sql
27b0: 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
27c0: 73 71 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f  sqlite3MutexAllo
27d0: 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53  c(SQLITE_MUTEX_S
27e0: 54 41 54 49 43 5f 4d 41 53 54 45 52 29 29 3b 0a  TATIC_MASTER));.
27f0: 7d 0a 23 65 6e 64 69 66 0a 0a 0a 23 69 66 64 65  }.#endif...#ifde
2800: 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 2f  f SQLITE_DEBUG./
2810: 2a 0a 2a 2a 20 48 65 6c 70 65 72 20 66 75 6e 63  *.** Helper func
2820: 74 69 6f 6e 20 66 6f 72 20 70 72 69 6e 74 69 6e  tion for printin
2830: 67 20 6f 75 74 20 74 72 61 63 65 20 69 6e 66 6f  g out trace info
2840: 72 6d 61 74 69 6f 6e 20 66 72 6f 6d 20 64 65 62  rmation from deb
2850: 75 67 67 69 6e 67 0a 2a 2a 20 62 69 6e 61 72 69  ugging.** binari
2860: 65 73 2e 20 54 68 69 73 20 72 65 74 75 72 6e 73  es. This returns
2870: 20 74 68 65 20 73 74 72 69 6e 67 20 72 65 70 72   the string repr
2880: 65 73 65 74 61 74 69 6f 6e 20 6f 66 20 74 68 65  esetation of the
2890: 20 73 75 70 70 6c 69 65 64 0a 2a 2a 20 69 6e 74   supplied.** int
28a0: 65 67 65 72 20 6c 6f 63 6b 2d 74 79 70 65 2e 0a  eger lock-type..
28b0: 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20  */.static const 
28c0: 63 68 61 72 20 2a 6c 6f 63 6b 74 79 70 65 4e 61  char *locktypeNa
28d0: 6d 65 28 69 6e 74 20 6c 6f 63 6b 74 79 70 65 29  me(int locktype)
28e0: 7b 0a 20 20 73 77 69 74 63 68 28 20 6c 6f 63 6b  {.  switch( lock
28f0: 74 79 70 65 20 29 7b 0a 20 20 20 20 63 61 73 65  type ){.    case
2900: 20 4e 4f 5f 4c 4f 43 4b 3a 20 72 65 74 75 72 6e   NO_LOCK: return
2910: 20 22 4e 4f 4e 45 22 3b 0a 20 20 20 20 63 61 73   "NONE";.    cas
2920: 65 20 53 48 41 52 45 44 5f 4c 4f 43 4b 3a 20 72  e SHARED_LOCK: r
2930: 65 74 75 72 6e 20 22 53 48 41 52 45 44 22 3b 0a  eturn "SHARED";.
2940: 20 20 20 20 63 61 73 65 20 52 45 53 45 52 56 45      case RESERVE
2950: 44 5f 4c 4f 43 4b 3a 20 72 65 74 75 72 6e 20 22  D_LOCK: return "
2960: 52 45 53 45 52 56 45 44 22 3b 0a 20 20 20 20 63  RESERVED";.    c
2970: 61 73 65 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b  ase PENDING_LOCK
2980: 3a 20 72 65 74 75 72 6e 20 22 50 45 4e 44 49 4e  : return "PENDIN
2990: 47 22 3b 0a 20 20 20 20 63 61 73 65 20 45 58 43  G";.    case EXC
29a0: 4c 55 53 49 56 45 5f 4c 4f 43 4b 3a 20 72 65 74  LUSIVE_LOCK: ret
29b0: 75 72 6e 20 22 45 58 43 4c 55 53 49 56 45 22 3b  urn "EXCLUSIVE";
29c0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 22 45  .  }.  return "E
29d0: 52 52 4f 52 22 3b 0a 7d 0a 23 65 6e 64 69 66 0a  RROR";.}.#endif.
29e0: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4c  .#ifdef SQLITE_L
29f0: 4f 43 4b 5f 54 52 41 43 45 0a 2f 2a 0a 2a 2a 20  OCK_TRACE./*.** 
2a00: 50 72 69 6e 74 20 6f 75 74 20 69 6e 66 6f 72 6d  Print out inform
2a10: 61 74 69 6f 6e 20 61 62 6f 75 74 20 61 6c 6c 20  ation about all 
2a20: 6c 6f 63 6b 69 6e 67 20 6f 70 65 72 61 74 69 6f  locking operatio
2a30: 6e 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  ns..**.** This r
2a40: 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64 20 66  outine is used f
2a50: 6f 72 20 74 72 6f 75 62 6c 65 73 68 6f 6f 74 69  or troubleshooti
2a60: 6e 67 20 6c 6f 63 6b 73 20 6f 6e 20 6d 75 6c 74  ng locks on mult
2a70: 69 74 68 72 65 61 64 65 64 0a 2a 2a 20 70 6c 61  ithreaded.** pla
2a80: 74 66 6f 72 6d 73 2e 20 20 45 6e 61 62 6c 65 20  tforms.  Enable 
2a90: 62 79 20 63 6f 6d 70 69 6c 69 6e 67 20 77 69 74  by compiling wit
2aa0: 68 20 74 68 65 20 2d 44 53 51 4c 49 54 45 5f 4c  h the -DSQLITE_L
2ab0: 4f 43 4b 5f 54 52 41 43 45 0a 2a 2a 20 63 6f 6d  OCK_TRACE.** com
2ac0: 6d 61 6e 64 2d 6c 69 6e 65 20 6f 70 74 69 6f 6e  mand-line option
2ad0: 20 6f 6e 20 74 68 65 20 63 6f 6d 70 69 6c 65 72   on the compiler
2ae0: 2e 20 20 54 68 69 73 20 63 6f 64 65 20 69 73 20  .  This code is 
2af0: 6e 6f 72 6d 61 6c 6c 79 0a 2a 2a 20 74 75 72 6e  normally.** turn
2b00: 65 64 20 6f 66 66 2e 0a 2a 2f 0a 73 74 61 74 69  ed off..*/.stati
2b10: 63 20 69 6e 74 20 6c 6f 63 6b 54 72 61 63 65 28  c int lockTrace(
2b20: 69 6e 74 20 66 64 2c 20 69 6e 74 20 6f 70 2c 20  int fd, int op, 
2b30: 73 74 72 75 63 74 20 66 6c 6f 63 6b 20 2a 70 29  struct flock *p)
2b40: 7b 0a 20 20 63 68 61 72 20 2a 7a 4f 70 4e 61 6d  {.  char *zOpNam
2b50: 65 2c 20 2a 7a 54 79 70 65 3b 0a 20 20 69 6e 74  e, *zType;.  int
2b60: 20 73 3b 0a 20 20 69 6e 74 20 73 61 76 65 64 45   s;.  int savedE
2b70: 72 72 6e 6f 3b 0a 20 20 69 66 28 20 6f 70 3d 3d  rrno;.  if( op==
2b80: 46 5f 47 45 54 4c 4b 20 29 7b 0a 20 20 20 20 7a  F_GETLK ){.    z
2b90: 4f 70 4e 61 6d 65 20 3d 20 22 47 45 54 4c 4b 22  OpName = "GETLK"
2ba0: 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 6f 70  ;.  }else if( op
2bb0: 3d 3d 46 5f 53 45 54 4c 4b 20 29 7b 0a 20 20 20  ==F_SETLK ){.   
2bc0: 20 7a 4f 70 4e 61 6d 65 20 3d 20 22 53 45 54 4c   zOpName = "SETL
2bd0: 4b 22 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  K";.  }else{.   
2be0: 20 73 20 3d 20 66 63 6e 74 6c 28 66 64 2c 20 6f   s = fcntl(fd, o
2bf0: 70 2c 20 70 29 3b 0a 20 20 20 20 73 71 6c 69 74  p, p);.    sqlit
2c00: 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 66  e3DebugPrintf("f
2c10: 63 6e 74 6c 20 75 6e 6b 6e 6f 77 6e 20 25 64 20  cntl unknown %d 
2c20: 25 64 20 25 64 5c 6e 22 2c 20 66 64 2c 20 6f 70  %d %d\n", fd, op
2c30: 2c 20 73 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  , s);.    return
2c40: 20 73 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d   s;.  }.  if( p-
2c50: 3e 6c 5f 74 79 70 65 3d 3d 46 5f 52 44 4c 43 4b  >l_type==F_RDLCK
2c60: 20 29 7b 0a 20 20 20 20 7a 54 79 70 65 20 3d 20   ){.    zType = 
2c70: 22 52 44 4c 43 4b 22 3b 0a 20 20 7d 65 6c 73 65  "RDLCK";.  }else
2c80: 20 69 66 28 20 70 2d 3e 6c 5f 74 79 70 65 3d 3d   if( p->l_type==
2c90: 46 5f 57 52 4c 43 4b 20 29 7b 0a 20 20 20 20 7a  F_WRLCK ){.    z
2ca0: 54 79 70 65 20 3d 20 22 57 52 4c 43 4b 22 3b 0a  Type = "WRLCK";.
2cb0: 20 20 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e 6c    }else if( p->l
2cc0: 5f 74 79 70 65 3d 3d 46 5f 55 4e 4c 43 4b 20 29  _type==F_UNLCK )
2cd0: 7b 0a 20 20 20 20 7a 54 79 70 65 20 3d 20 22 55  {.    zType = "U
2ce0: 4e 4c 43 4b 22 3b 0a 20 20 7d 65 6c 73 65 7b 0a  NLCK";.  }else{.
2cf0: 20 20 20 20 61 73 73 65 72 74 28 20 30 20 29 3b      assert( 0 );
2d00: 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70  .  }.  assert( p
2d10: 2d 3e 6c 5f 77 68 65 6e 63 65 3d 3d 53 45 45 4b  ->l_whence==SEEK
2d20: 5f 53 45 54 20 29 3b 0a 20 20 73 20 3d 20 66 63  _SET );.  s = fc
2d30: 6e 74 6c 28 66 64 2c 20 6f 70 2c 20 70 29 3b 0a  ntl(fd, op, p);.
2d40: 20 20 73 61 76 65 64 45 72 72 6e 6f 20 3d 20 65    savedErrno = e
2d50: 72 72 6e 6f 3b 0a 20 20 73 71 6c 69 74 65 33 44  rrno;.  sqlite3D
2d60: 65 62 75 67 50 72 69 6e 74 66 28 22 66 63 6e 74  ebugPrintf("fcnt
2d70: 6c 20 25 64 20 25 64 20 25 73 20 25 73 20 25 64  l %d %d %s %s %d
2d80: 20 25 64 20 25 64 20 25 64 5c 6e 22 2c 0a 20 20   %d %d %d\n",.  
2d90: 20 20 20 74 68 72 65 61 64 69 64 2c 20 66 64 2c     threadid, fd,
2da0: 20 7a 4f 70 4e 61 6d 65 2c 20 7a 54 79 70 65 2c   zOpName, zType,
2db0: 20 28 69 6e 74 29 70 2d 3e 6c 5f 73 74 61 72 74   (int)p->l_start
2dc0: 2c 20 28 69 6e 74 29 70 2d 3e 6c 5f 6c 65 6e 2c  , (int)p->l_len,
2dd0: 0a 20 20 20 20 20 28 69 6e 74 29 70 2d 3e 6c 5f  .     (int)p->l_
2de0: 70 69 64 2c 20 73 29 3b 0a 20 20 69 66 28 20 73  pid, s);.  if( s
2df0: 3d 3d 28 2d 31 29 20 26 26 20 6f 70 3d 3d 46 5f  ==(-1) && op==F_
2e00: 53 45 54 4c 4b 20 26 26 20 28 70 2d 3e 6c 5f 74  SETLK && (p->l_t
2e10: 79 70 65 3d 3d 46 5f 52 44 4c 43 4b 20 7c 7c 20  ype==F_RDLCK || 
2e20: 70 2d 3e 6c 5f 74 79 70 65 3d 3d 46 5f 57 52 4c  p->l_type==F_WRL
2e30: 43 4b 29 20 29 7b 0a 20 20 20 20 73 74 72 75 63  CK) ){.    struc
2e40: 74 20 66 6c 6f 63 6b 20 6c 32 3b 0a 20 20 20 20  t flock l2;.    
2e50: 6c 32 20 3d 20 2a 70 3b 0a 20 20 20 20 66 63 6e  l2 = *p;.    fcn
2e60: 74 6c 28 66 64 2c 20 46 5f 47 45 54 4c 4b 2c 20  tl(fd, F_GETLK, 
2e70: 26 6c 32 29 3b 0a 20 20 20 20 69 66 28 20 6c 32  &l2);.    if( l2
2e80: 2e 6c 5f 74 79 70 65 3d 3d 46 5f 52 44 4c 43 4b  .l_type==F_RDLCK
2e90: 20 29 7b 0a 20 20 20 20 20 20 7a 54 79 70 65 20   ){.      zType 
2ea0: 3d 20 22 52 44 4c 43 4b 22 3b 0a 20 20 20 20 7d  = "RDLCK";.    }
2eb0: 65 6c 73 65 20 69 66 28 20 6c 32 2e 6c 5f 74 79  else if( l2.l_ty
2ec0: 70 65 3d 3d 46 5f 57 52 4c 43 4b 20 29 7b 0a 20  pe==F_WRLCK ){. 
2ed0: 20 20 20 20 20 7a 54 79 70 65 20 3d 20 22 57 52       zType = "WR
2ee0: 4c 43 4b 22 3b 0a 20 20 20 20 7d 65 6c 73 65 20  LCK";.    }else 
2ef0: 69 66 28 20 6c 32 2e 6c 5f 74 79 70 65 3d 3d 46  if( l2.l_type==F
2f00: 5f 55 4e 4c 43 4b 20 29 7b 0a 20 20 20 20 20 20  _UNLCK ){.      
2f10: 7a 54 79 70 65 20 3d 20 22 55 4e 4c 43 4b 22 3b  zType = "UNLCK";
2f20: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
2f30: 20 20 61 73 73 65 72 74 28 20 30 20 29 3b 0a 20    assert( 0 );. 
2f40: 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
2f50: 44 65 62 75 67 50 72 69 6e 74 66 28 22 66 63 6e  DebugPrintf("fcn
2f60: 74 6c 2d 66 61 69 6c 75 72 65 2d 72 65 61 73 6f  tl-failure-reaso
2f70: 6e 3a 20 25 73 20 25 64 20 25 64 20 25 64 5c 6e  n: %s %d %d %d\n
2f80: 22 2c 0a 20 20 20 20 20 20 20 7a 54 79 70 65 2c  ",.       zType,
2f90: 20 28 69 6e 74 29 6c 32 2e 6c 5f 73 74 61 72 74   (int)l2.l_start
2fa0: 2c 20 28 69 6e 74 29 6c 32 2e 6c 5f 6c 65 6e 2c  , (int)l2.l_len,
2fb0: 20 28 69 6e 74 29 6c 32 2e 6c 5f 70 69 64 29 3b   (int)l2.l_pid);
2fc0: 0a 20 20 7d 0a 20 20 65 72 72 6e 6f 20 3d 20 73  .  }.  errno = s
2fd0: 61 76 65 64 45 72 72 6e 6f 3b 0a 20 20 72 65 74  avedErrno;.  ret
2fe0: 75 72 6e 20 73 3b 0a 7d 0a 23 64 65 66 69 6e 65  urn s;.}.#define
2ff0: 20 66 63 6e 74 6c 20 6c 6f 63 6b 54 72 61 63 65   fcntl lockTrace
3000: 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
3010: 45 5f 4c 4f 43 4b 5f 54 52 41 43 45 20 2a 2f 0a  E_LOCK_TRACE */.
3020: 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  .../*.** This ro
3030: 75 74 69 6e 65 20 74 72 61 6e 73 6c 61 74 65 73  utine translates
3040: 20 61 20 73 74 61 6e 64 61 72 64 20 50 4f 53 49   a standard POSI
3050: 58 20 65 72 72 6e 6f 20 63 6f 64 65 20 69 6e 74  X errno code int
3060: 6f 20 73 6f 6d 65 74 68 69 6e 67 0a 2a 2a 20 75  o something.** u
3070: 73 65 66 75 6c 20 74 6f 20 74 68 65 20 63 6c 69  seful to the cli
3080: 65 6e 74 73 20 6f 66 20 74 68 65 20 73 71 6c 69  ents of the sqli
3090: 74 65 33 20 66 75 6e 63 74 69 6f 6e 73 2e 20 20  te3 functions.  
30a0: 53 70 65 63 69 66 69 63 61 6c 6c 79 2c 20 69 74  Specifically, it
30b0: 20 69 73 0a 2a 2a 20 69 6e 74 65 6e 64 65 64 20   is.** intended 
30c0: 74 6f 20 74 72 61 6e 73 6c 61 74 65 20 61 20 76  to translate a v
30d0: 61 72 69 65 74 79 20 6f 66 20 22 74 72 79 20 61  ariety of "try a
30e0: 67 61 69 6e 22 20 65 72 72 6f 72 73 20 69 6e 74  gain" errors int
30f0: 6f 20 53 51 4c 49 54 45 5f 42 55 53 59 0a 2a 2a  o SQLITE_BUSY.**
3100: 20 61 6e 64 20 61 20 76 61 72 69 65 74 79 20 6f   and a variety o
3110: 66 20 22 70 6c 65 61 73 65 20 63 6c 6f 73 65 20  f "please close 
3120: 74 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70  the file descrip
3130: 74 6f 72 20 4e 4f 57 22 20 65 72 72 6f 72 73 20  tor NOW" errors 
3140: 69 6e 74 6f 20 0a 2a 2a 20 53 51 4c 49 54 45 5f  into .** SQLITE_
3150: 49 4f 45 52 52 0a 2a 2a 20 0a 2a 2a 20 45 72 72  IOERR.** .** Err
3160: 6f 72 73 20 64 75 72 69 6e 67 20 69 6e 69 74 69  ors during initi
3170: 61 6c 69 7a 61 74 69 6f 6e 20 6f 66 20 6c 6f 63  alization of loc
3180: 6b 73 2c 20 6f 72 20 66 69 6c 65 20 73 79 73 74  ks, or file syst
3190: 65 6d 20 73 75 70 70 6f 72 74 20 66 6f 72 20 6c  em support for l
31a0: 6f 63 6b 73 2c 0a 2a 2a 20 73 68 6f 75 6c 64 20  ocks,.** should 
31b0: 68 61 6e 64 6c 65 20 45 4e 4f 4c 43 4b 2c 20 45  handle ENOLCK, E
31c0: 4e 4f 54 53 55 50 2c 20 45 4f 50 4e 4f 54 53 55  NOTSUP, EOPNOTSU
31d0: 50 50 20 73 65 70 61 72 61 74 65 6c 79 2e 0a 2a  PP separately..*
31e0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 71 6c  /.static int sql
31f0: 69 74 65 45 72 72 6f 72 46 72 6f 6d 50 6f 73 69  iteErrorFromPosi
3200: 78 45 72 72 6f 72 28 69 6e 74 20 70 6f 73 69 78  xError(int posix
3210: 45 72 72 6f 72 2c 20 69 6e 74 20 73 71 6c 69 74  Error, int sqlit
3220: 65 49 4f 45 72 72 29 20 7b 0a 20 20 73 77 69 74  eIOErr) {.  swit
3230: 63 68 20 28 70 6f 73 69 78 45 72 72 6f 72 29 20  ch (posixError) 
3240: 7b 0a 20 20 63 61 73 65 20 30 3a 20 0a 20 20 20  {.  case 0: .   
3250: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
3260: 4b 3b 0a 20 20 20 20 0a 20 20 63 61 73 65 20 45  K;.    .  case E
3270: 41 47 41 49 4e 3a 0a 20 20 63 61 73 65 20 45 54  AGAIN:.  case ET
3280: 49 4d 45 44 4f 55 54 3a 0a 20 20 63 61 73 65 20  IMEDOUT:.  case 
3290: 45 42 55 53 59 3a 0a 20 20 63 61 73 65 20 45 49  EBUSY:.  case EI
32a0: 4e 54 52 3a 0a 20 20 63 61 73 65 20 45 4e 4f 4c  NTR:.  case ENOL
32b0: 43 4b 3a 20 20 0a 20 20 20 20 2f 2a 20 72 61 6e  CK:  .    /* ran
32c0: 64 6f 6d 20 4e 46 53 20 72 65 74 72 79 20 65 72  dom NFS retry er
32d0: 72 6f 72 2c 20 75 6e 6c 65 73 73 20 64 75 72 69  ror, unless duri
32e0: 6e 67 20 66 69 6c 65 20 73 79 73 74 65 6d 20 73  ng file system s
32f0: 75 70 70 6f 72 74 20 0a 20 20 20 20 20 2a 20 69  upport .     * i
3300: 6e 74 72 6f 73 70 65 63 74 69 6f 6e 2c 20 69 6e  ntrospection, in
3310: 20 77 68 69 63 68 20 69 74 20 61 63 74 75 61 6c   which it actual
3320: 6c 79 20 6d 65 61 6e 73 20 77 68 61 74 20 69 74  ly means what it
3330: 20 73 61 79 73 20 2a 2f 0a 20 20 20 20 72 65 74   says */.    ret
3340: 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 3b  urn SQLITE_BUSY;
3350: 0a 20 20 20 20 0a 20 20 63 61 73 65 20 45 41 43  .    .  case EAC
3360: 43 45 53 3a 20 0a 20 20 20 20 2f 2a 20 45 41 43  CES: .    /* EAC
3370: 43 45 53 20 69 73 20 6c 69 6b 65 20 45 41 47 41  CES is like EAGA
3380: 49 4e 20 64 75 72 69 6e 67 20 6c 6f 63 6b 69 6e  IN during lockin
3390: 67 20 6f 70 65 72 61 74 69 6f 6e 73 2c 20 62 75  g operations, bu
33a0: 74 20 6e 6f 74 20 61 6e 79 20 6f 74 68 65 72 20  t not any other 
33b0: 74 69 6d 65 2a 2f 0a 20 20 20 20 69 66 28 20 28  time*/.    if( (
33c0: 73 71 6c 69 74 65 49 4f 45 72 72 20 3d 3d 20 53  sqliteIOErr == S
33d0: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b  QLITE_IOERR_LOCK
33e0: 29 20 7c 7c 20 0a 09 28 73 71 6c 69 74 65 49 4f  ) || ..(sqliteIO
33f0: 45 72 72 20 3d 3d 20 53 51 4c 49 54 45 5f 49 4f  Err == SQLITE_IO
3400: 45 52 52 5f 55 4e 4c 4f 43 4b 29 20 7c 7c 20 0a  ERR_UNLOCK) || .
3410: 09 28 73 71 6c 69 74 65 49 4f 45 72 72 20 3d 3d  .(sqliteIOErr ==
3420: 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 52 44   SQLITE_IOERR_RD
3430: 4c 4f 43 4b 29 20 7c 7c 0a 09 28 73 71 6c 69 74  LOCK) ||..(sqlit
3440: 65 49 4f 45 72 72 20 3d 3d 20 53 51 4c 49 54 45  eIOErr == SQLITE
3450: 5f 49 4f 45 52 52 5f 43 48 45 43 4b 52 45 53 45  _IOERR_CHECKRESE
3460: 52 56 45 44 4c 4f 43 4b 29 20 29 7b 0a 20 20 20  RVEDLOCK) ){.   
3470: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
3480: 5f 42 55 53 59 3b 0a 20 20 20 20 7d 0a 20 20 20  _BUSY;.    }.   
3490: 20 2f 2a 20 65 6c 73 65 20 66 61 6c 6c 20 74 68   /* else fall th
34a0: 72 6f 75 67 68 20 2a 2f 0a 20 20 63 61 73 65 20  rough */.  case 
34b0: 45 50 45 52 4d 3a 20 0a 20 20 20 20 72 65 74 75  EPERM: .    retu
34c0: 72 6e 20 53 51 4c 49 54 45 5f 50 45 52 4d 3b 0a  rn SQLITE_PERM;.
34d0: 20 20 20 20 0a 20 20 63 61 73 65 20 45 44 45 41      .  case EDEA
34e0: 44 4c 4b 3a 0a 20 20 20 20 72 65 74 75 72 6e 20  DLK:.    return 
34f0: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 42 4c 4f  SQLITE_IOERR_BLO
3500: 43 4b 45 44 3b 0a 20 20 20 20 0a 23 69 66 20 45  CKED;.    .#if E
3510: 4f 50 4e 4f 54 53 55 50 50 21 3d 45 4e 4f 54 53  OPNOTSUPP!=ENOTS
3520: 55 50 0a 20 20 63 61 73 65 20 45 4f 50 4e 4f 54  UP.  case EOPNOT
3530: 53 55 50 50 3a 20 0a 20 20 20 20 2f 2a 20 73 6f  SUPP: .    /* so
3540: 6d 65 74 68 69 6e 67 20 77 65 6e 74 20 74 65 72  mething went ter
3550: 72 69 62 6c 79 20 61 77 72 79 2c 20 75 6e 6c 65  ribly awry, unle
3560: 73 73 20 64 75 72 69 6e 67 20 66 69 6c 65 20 73  ss during file s
3570: 79 73 74 65 6d 20 73 75 70 70 6f 72 74 20 0a 20  ystem support . 
3580: 20 20 20 20 2a 20 69 6e 74 72 6f 73 70 65 63 74      * introspect
3590: 69 6f 6e 2c 20 69 6e 20 77 68 69 63 68 20 69 74  ion, in which it
35a0: 20 61 63 74 75 61 6c 6c 79 20 6d 65 61 6e 73 20   actually means 
35b0: 77 68 61 74 20 69 74 20 73 61 79 73 20 2a 2f 0a  what it says */.
35c0: 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20 45 4e  #endif.#ifdef EN
35d0: 4f 54 53 55 50 0a 20 20 63 61 73 65 20 45 4e 4f  OTSUP.  case ENO
35e0: 54 53 55 50 3a 20 0a 20 20 20 20 2f 2a 20 69 6e  TSUP: .    /* in
35f0: 76 61 6c 69 64 20 66 64 2c 20 75 6e 6c 65 73 73  valid fd, unless
3600: 20 64 75 72 69 6e 67 20 66 69 6c 65 20 73 79 73   during file sys
3610: 74 65 6d 20 73 75 70 70 6f 72 74 20 69 6e 74 72  tem support intr
3620: 6f 73 70 65 63 74 69 6f 6e 2c 20 69 6e 20 77 68  ospection, in wh
3630: 69 63 68 20 0a 20 20 20 20 20 2a 20 69 74 20 61  ich .     * it a
3640: 63 74 75 61 6c 6c 79 20 6d 65 61 6e 73 20 77 68  ctually means wh
3650: 61 74 20 69 74 20 73 61 79 73 20 2a 2f 0a 23 65  at it says */.#e
3660: 6e 64 69 66 0a 20 20 63 61 73 65 20 45 49 4f 3a  ndif.  case EIO:
3670: 0a 20 20 63 61 73 65 20 45 42 41 44 46 3a 0a 20  .  case EBADF:. 
3680: 20 63 61 73 65 20 45 49 4e 56 41 4c 3a 0a 20 20   case EINVAL:.  
3690: 63 61 73 65 20 45 4e 4f 54 43 4f 4e 4e 3a 0a 20  case ENOTCONN:. 
36a0: 20 63 61 73 65 20 45 4e 4f 44 45 56 3a 0a 20 20   case ENODEV:.  
36b0: 63 61 73 65 20 45 4e 58 49 4f 3a 0a 20 20 63 61  case ENXIO:.  ca
36c0: 73 65 20 45 4e 4f 45 4e 54 3a 0a 20 20 63 61 73  se ENOENT:.  cas
36d0: 65 20 45 53 54 41 4c 45 3a 0a 20 20 63 61 73 65  e ESTALE:.  case
36e0: 20 45 4e 4f 53 59 53 3a 0a 20 20 20 20 2f 2a 20   ENOSYS:.    /* 
36f0: 74 68 65 73 65 20 73 68 6f 75 6c 64 20 66 6f 72  these should for
3700: 63 65 20 74 68 65 20 63 6c 69 65 6e 74 20 74 6f  ce the client to
3710: 20 63 6c 6f 73 65 20 74 68 65 20 66 69 6c 65 20   close the file 
3720: 61 6e 64 20 72 65 63 6f 6e 6e 65 63 74 20 2a 2f  and reconnect */
3730: 0a 20 20 20 20 0a 20 20 64 65 66 61 75 6c 74 3a  .    .  default:
3740: 20 0a 20 20 20 20 72 65 74 75 72 6e 20 73 71 6c   .    return sql
3750: 69 74 65 49 4f 45 72 72 3b 0a 20 20 7d 0a 7d 0a  iteIOErr;.  }.}.
3760: 0a 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .../************
3770: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
3780: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
3790: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
37a0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
37b0: 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  **.*************
37c0: 2a 2a 2a 2a 2a 20 42 65 67 69 6e 20 55 6e 69 71  ***** Begin Uniq
37d0: 75 65 20 46 69 6c 65 20 49 44 20 55 74 69 6c 69  ue File ID Utili
37e0: 74 79 20 55 73 65 64 20 42 79 20 56 78 57 6f 72  ty Used By VxWor
37f0: 6b 73 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ks *************
3800: 2a 2a 0a 2a 2a 0a 2a 2a 20 4f 6e 20 6d 6f 73 74  **.**.** On most
3810: 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 75 6e 69   versions of uni
3820: 78 2c 20 77 65 20 63 61 6e 20 67 65 74 20 61 20  x, we can get a 
3830: 75 6e 69 71 75 65 20 49 44 20 66 6f 72 20 61 20  unique ID for a 
3840: 66 69 6c 65 20 62 79 20 63 6f 6e 63 61 74 65 6e  file by concaten
3850: 61 74 69 6e 67 0a 2a 2a 20 74 68 65 20 64 65 76  ating.** the dev
3860: 69 63 65 20 6e 75 6d 62 65 72 20 61 6e 64 20 74  ice number and t
3870: 68 65 20 69 6e 6f 64 65 20 6e 75 6d 62 65 72 2e  he inode number.
3880: 20 20 42 75 74 20 74 68 69 73 20 64 6f 65 73 20    But this does 
3890: 6e 6f 74 20 77 6f 72 6b 20 6f 6e 20 56 78 57 6f  not work on VxWo
38a0: 72 6b 73 2e 0a 2a 2a 20 4f 6e 20 56 78 57 6f 72  rks..** On VxWor
38b0: 6b 73 2c 20 61 20 75 6e 69 71 75 65 20 66 69 6c  ks, a unique fil
38c0: 65 20 69 64 20 6d 75 73 74 20 62 65 20 62 61 73  e id must be bas
38d0: 65 64 20 6f 6e 20 74 68 65 20 63 61 6e 6f 6e 69  ed on the canoni
38e0: 63 61 6c 20 66 69 6c 65 6e 61 6d 65 2e 0a 2a 2a  cal filename..**
38f0: 0a 2a 2a 20 41 20 70 6f 69 6e 74 65 72 20 74 6f  .** A pointer to
3900: 20 61 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20   an instance of 
3910: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74  the following st
3920: 72 75 63 74 75 72 65 20 63 61 6e 20 62 65 20 75  ructure can be u
3930: 73 65 64 20 61 73 20 61 0a 2a 2a 20 75 6e 69 71  sed as a.** uniq
3940: 75 65 20 66 69 6c 65 20 49 44 20 69 6e 20 56 78  ue file ID in Vx
3950: 57 6f 72 6b 73 2e 20 20 45 61 63 68 20 69 6e 73  Works.  Each ins
3960: 74 61 6e 63 65 20 6f 66 20 74 68 69 73 20 73 74  tance of this st
3970: 72 75 63 74 75 72 65 20 63 6f 6e 74 61 69 6e 73  ructure contains
3980: 0a 2a 2a 20 61 20 63 6f 70 79 20 6f 66 20 74 68  .** a copy of th
3990: 65 20 63 61 6e 6f 6e 69 63 61 6c 20 66 69 6c 65  e canonical file
39a0: 6e 61 6d 65 2e 20 20 54 68 65 72 65 20 69 73 20  name.  There is 
39b0: 61 6c 73 6f 20 61 20 72 65 66 65 72 65 6e 63 65  also a reference
39c0: 20 63 6f 75 6e 74 2e 20 20 0a 2a 2a 20 54 68 65   count.  .** The
39d0: 20 73 74 72 75 63 74 75 72 65 20 69 73 20 72 65   structure is re
39e0: 63 6c 61 69 6d 65 64 20 77 68 65 6e 20 74 68 65  claimed when the
39f0: 20 6e 75 6d 62 65 72 20 6f 66 20 70 6f 69 6e 74   number of point
3a00: 65 72 73 20 74 6f 20 69 74 20 64 72 6f 70 73 20  ers to it drops 
3a10: 74 6f 0a 2a 2a 20 7a 65 72 6f 2e 0a 2a 2a 0a 2a  to.** zero..**.*
3a20: 2a 20 54 68 65 72 65 20 61 72 65 20 6e 65 76 65  * There are neve
3a30: 72 20 76 65 72 79 20 6d 61 6e 79 20 66 69 6c 65  r very many file
3a40: 73 20 6f 70 65 6e 20 61 74 20 6f 6e 65 20 74 69  s open at one ti
3a50: 6d 65 20 61 6e 64 20 6c 6f 6f 6b 75 70 73 20 61  me and lookups a
3a60: 72 65 20 6e 6f 74 0a 2a 2a 20 61 20 70 65 72 66  re not.** a perf
3a70: 6f 72 6d 61 6e 63 65 2d 63 72 69 74 69 63 61 6c  ormance-critical
3a80: 20 70 61 74 68 2c 20 73 6f 20 69 74 20 69 73 20   path, so it is 
3a90: 73 75 66 66 69 63 69 65 6e 74 20 74 6f 20 70 75  sufficient to pu
3aa0: 74 20 74 68 65 73 65 0a 2a 2a 20 73 74 72 75 63  t these.** struc
3ab0: 74 75 72 65 73 20 6f 6e 20 61 20 6c 69 6e 6b 65  tures on a linke
3ac0: 64 20 6c 69 73 74 2e 0a 2a 2f 0a 73 74 72 75 63  d list..*/.struc
3ad0: 74 20 76 78 77 6f 72 6b 73 46 69 6c 65 49 64 20  t vxworksFileId 
3ae0: 7b 0a 20 20 73 74 72 75 63 74 20 76 78 77 6f 72  {.  struct vxwor
3af0: 6b 73 46 69 6c 65 49 64 20 2a 70 4e 65 78 74 3b  ksFileId *pNext;
3b00: 20 20 2f 2a 20 4e 65 78 74 20 69 6e 20 61 20 6c    /* Next in a l
3b10: 69 73 74 20 6f 66 20 74 68 65 6d 20 61 6c 6c 20  ist of them all 
3b20: 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 66 3b 20 20  */.  int nRef;  
3b30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3b40: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
3b50: 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 74 68  references to th
3b60: 69 73 20 6f 6e 65 20 2a 2f 0a 20 20 69 6e 74 20  is one */.  int 
3b70: 6e 4e 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20  nName;          
3b80: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 65 6e            /* Len
3b90: 67 74 68 20 6f 66 20 74 68 65 20 7a 43 61 6e 6f  gth of the zCano
3ba0: 6e 69 63 61 6c 4e 61 6d 65 5b 5d 20 73 74 72 69  nicalName[] stri
3bb0: 6e 67 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 43  ng */.  char *zC
3bc0: 61 6e 6f 6e 69 63 61 6c 4e 61 6d 65 3b 20 20 20  anonicalName;   
3bd0: 20 20 20 20 20 20 2f 2a 20 43 61 6e 6f 6e 69 63        /* Canonic
3be0: 61 6c 20 66 69 6c 65 6e 61 6d 65 20 2a 2f 0a 7d  al filename */.}
3bf0: 3b 0a 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b  ;..#if OS_VXWORK
3c00: 53 0a 2f 2a 20 0a 2a 2a 20 41 6c 6c 20 75 6e 69  S./* .** All uni
3c10: 71 75 65 20 66 69 6c 65 6e 61 6d 65 73 20 61 72  que filenames ar
3c20: 65 20 68 65 6c 64 20 6f 6e 20 61 20 6c 69 6e 6b  e held on a link
3c30: 65 64 20 6c 69 73 74 20 68 65 61 64 65 64 20 62  ed list headed b
3c40: 79 20 74 68 69 73 0a 2a 2a 20 76 61 72 69 61 62  y this.** variab
3c50: 6c 65 3a 0a 2a 2f 0a 73 74 61 74 69 63 20 73 74  le:.*/.static st
3c60: 72 75 63 74 20 76 78 77 6f 72 6b 73 46 69 6c 65  ruct vxworksFile
3c70: 49 64 20 2a 76 78 77 6f 72 6b 73 46 69 6c 65 4c  Id *vxworksFileL
3c80: 69 73 74 20 3d 20 30 3b 0a 0a 2f 2a 0a 2a 2a 20  ist = 0;../*.** 
3c90: 53 69 6d 70 6c 69 66 79 20 61 20 66 69 6c 65 6e  Simplify a filen
3ca0: 61 6d 65 20 69 6e 74 6f 20 69 74 73 20 63 61 6e  ame into its can
3cb0: 6f 6e 69 63 61 6c 20 66 6f 72 6d 0a 2a 2a 20 62  onical form.** b
3cc0: 79 20 6d 61 6b 69 6e 67 20 74 68 65 20 66 6f 6c  y making the fol
3cd0: 6c 6f 77 69 6e 67 20 63 68 61 6e 67 65 73 3a 0a  lowing changes:.
3ce0: 2a 2a 0a 2a 2a 20 20 2a 20 72 65 6d 6f 76 69 6e  **.**  * removin
3cf0: 67 20 61 6e 79 20 74 72 61 69 6c 69 6e 67 20 61  g any trailing a
3d00: 6e 64 20 64 75 70 6c 69 63 61 74 65 20 2f 0a 2a  nd duplicate /.*
3d10: 2a 20 20 2a 20 63 6f 6e 76 65 72 74 20 2f 2e 2f  *  * convert /./
3d20: 20 69 6e 74 6f 20 6a 75 73 74 20 2f 0a 2a 2a 20   into just /.** 
3d30: 20 2a 20 63 6f 6e 76 65 72 74 20 2f 41 2f 2e 2e   * convert /A/..
3d40: 2f 20 77 68 65 72 65 20 41 20 69 73 20 61 6e 79  / where A is any
3d50: 20 73 69 6d 70 6c 65 20 6e 61 6d 65 20 69 6e 74   simple name int
3d60: 6f 20 6a 75 73 74 20 2f 0a 2a 2a 0a 2a 2a 20 43  o just /.**.** C
3d70: 68 61 6e 67 65 73 20 61 72 65 20 6d 61 64 65 20  hanges are made 
3d80: 69 6e 2d 70 6c 61 63 65 2e 20 20 52 65 74 75 72  in-place.  Retur
3d90: 6e 20 74 68 65 20 6e 65 77 20 6e 61 6d 65 20 6c  n the new name l
3da0: 65 6e 67 74 68 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  ength..**.** The
3db0: 20 6f 72 69 67 69 6e 61 6c 20 66 69 6c 65 6e 61   original filena
3dc0: 6d 65 20 69 73 20 69 6e 20 7a 5b 30 2e 2e 6e 2d  me is in z[0..n-
3dd0: 31 5d 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20  1].  Return the 
3de0: 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a 20 63 68 61  number of.** cha
3df0: 72 61 63 74 65 72 73 20 69 6e 20 74 68 65 20 73  racters in the s
3e00: 69 6d 70 6c 69 66 69 65 64 20 6e 61 6d 65 2e 0a  implified name..
3e10: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 76 78  */.static int vx
3e20: 77 6f 72 6b 73 53 69 6d 70 6c 69 66 79 4e 61 6d  worksSimplifyNam
3e30: 65 28 63 68 61 72 20 2a 7a 2c 20 69 6e 74 20 6e  e(char *z, int n
3e40: 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20  ){.  int i, j;. 
3e50: 20 77 68 69 6c 65 28 20 6e 3e 31 20 26 26 20 7a   while( n>1 && z
3e60: 5b 6e 2d 31 5d 3d 3d 27 2f 27 20 29 7b 20 6e 2d  [n-1]=='/' ){ n-
3e70: 2d 3b 20 7d 0a 20 20 66 6f 72 28 69 3d 6a 3d 30  -; }.  for(i=j=0
3e80: 3b 20 69 3c 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20  ; i<n; i++){.   
3e90: 20 69 66 28 20 7a 5b 69 5d 3d 3d 27 2f 27 20 29   if( z[i]=='/' )
3ea0: 7b 0a 20 20 20 20 20 20 69 66 28 20 7a 5b 69 2b  {.      if( z[i+
3eb0: 31 5d 3d 3d 27 2f 27 20 29 20 63 6f 6e 74 69 6e  1]=='/' ) contin
3ec0: 75 65 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 5b  ue;.      if( z[
3ed0: 69 2b 31 5d 3d 3d 27 2e 27 20 26 26 20 69 2b 32  i+1]=='.' && i+2
3ee0: 3c 6e 20 26 26 20 7a 5b 69 2b 32 5d 3d 3d 27 2f  <n && z[i+2]=='/
3ef0: 27 20 29 7b 0a 20 20 20 20 20 20 20 20 69 20 2b  ' ){.        i +
3f00: 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 63 6f 6e  = 1;.        con
3f10: 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 7d 0a 20  tinue;.      }. 
3f20: 20 20 20 20 20 69 66 28 20 7a 5b 69 2b 31 5d 3d       if( z[i+1]=
3f30: 3d 27 2e 27 20 26 26 20 69 2b 33 3c 6e 20 26 26  ='.' && i+3<n &&
3f40: 20 7a 5b 69 2b 32 5d 3d 3d 27 2e 27 20 26 26 20   z[i+2]=='.' && 
3f50: 7a 5b 69 2b 33 5d 3d 3d 27 2f 27 20 29 7b 0a 20  z[i+3]=='/' ){. 
3f60: 20 20 20 20 20 20 20 77 68 69 6c 65 28 20 6a 3e         while( j>
3f70: 30 20 26 26 20 7a 5b 6a 2d 31 5d 21 3d 27 2f 27  0 && z[j-1]!='/'
3f80: 20 29 7b 20 6a 2d 2d 3b 20 7d 0a 20 20 20 20 20   ){ j--; }.     
3f90: 20 20 20 69 66 28 20 6a 3e 30 20 29 7b 20 6a 2d     if( j>0 ){ j-
3fa0: 2d 3b 20 7d 0a 20 20 20 20 20 20 20 20 69 20 2b  -; }.        i +
3fb0: 3d 20 32 3b 0a 20 20 20 20 20 20 20 20 63 6f 6e  = 2;.        con
3fc0: 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 7d 0a 20  tinue;.      }. 
3fd0: 20 20 20 7d 0a 20 20 20 20 7a 5b 6a 2b 2b 5d 20     }.    z[j++] 
3fe0: 3d 20 7a 5b 69 5d 3b 0a 20 20 7d 0a 20 20 7a 5b  = z[i];.  }.  z[
3ff0: 6a 5d 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e  j] = 0;.  return
4000: 20 6a 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 69 6e   j;.}../*.** Fin
4010: 64 20 61 20 75 6e 69 71 75 65 20 66 69 6c 65 20  d a unique file 
4020: 49 44 20 66 6f 72 20 74 68 65 20 67 69 76 65 6e  ID for the given
4030: 20 61 62 73 6f 6c 75 74 65 20 70 61 74 68 6e 61   absolute pathna
4040: 6d 65 2e 20 20 52 65 74 75 72 6e 0a 2a 2a 20 61  me.  Return.** a
4050: 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
4060: 76 78 77 6f 72 6b 73 46 69 6c 65 49 64 20 6f 62  vxworksFileId ob
4070: 6a 65 63 74 2e 20 20 54 68 69 73 20 70 6f 69 6e  ject.  This poin
4080: 74 65 72 20 69 73 20 74 68 65 20 75 6e 69 71 75  ter is the uniqu
4090: 65 0a 2a 2a 20 66 69 6c 65 20 49 44 2e 0a 2a 2a  e.** file ID..**
40a0: 0a 2a 2a 20 54 68 65 20 6e 52 65 66 20 66 69 65  .** The nRef fie
40b0: 6c 64 20 6f 66 20 74 68 65 20 76 78 77 6f 72 6b  ld of the vxwork
40c0: 73 46 69 6c 65 49 64 20 6f 62 6a 65 63 74 20 69  sFileId object i
40d0: 73 20 69 6e 63 72 65 6d 65 6e 74 65 64 20 62 65  s incremented be
40e0: 66 6f 72 65 0a 2a 2a 20 74 68 65 20 6f 62 6a 65  fore.** the obje
40f0: 63 74 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20  ct is returned. 
4100: 20 41 20 6e 65 77 20 76 78 77 6f 72 6b 73 46 69   A new vxworksFi
4110: 6c 65 49 64 20 6f 62 6a 65 63 74 20 69 73 20 63  leId object is c
4120: 72 65 61 74 65 64 0a 2a 2a 20 61 6e 64 20 61 64  reated.** and ad
4130: 64 65 64 20 74 6f 20 74 68 65 20 67 6c 6f 62 61  ded to the globa
4140: 6c 20 6c 69 73 74 20 69 66 20 6e 65 63 65 73 73  l list if necess
4150: 61 72 79 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20  ary..**.** If a 
4160: 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f  memory allocatio
4170: 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20  n error occurs, 
4180: 72 65 74 75 72 6e 20 4e 55 4c 4c 2e 0a 2a 2f 0a  return NULL..*/.
4190: 73 74 61 74 69 63 20 73 74 72 75 63 74 20 76 78  static struct vx
41a0: 77 6f 72 6b 73 46 69 6c 65 49 64 20 2a 76 78 77  worksFileId *vxw
41b0: 6f 72 6b 73 46 69 6e 64 46 69 6c 65 49 64 28 63  orksFindFileId(c
41c0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 41 62 73 6f  onst char *zAbso
41d0: 6c 75 74 65 4e 61 6d 65 29 7b 0a 20 20 73 74 72  luteName){.  str
41e0: 75 63 74 20 76 78 77 6f 72 6b 73 46 69 6c 65 49  uct vxworksFileI
41f0: 64 20 2a 70 4e 65 77 3b 20 20 20 20 20 20 20 20  d *pNew;        
4200: 20 2f 2a 20 73 65 61 72 63 68 20 6b 65 79 20 61   /* search key a
4210: 6e 64 20 6e 65 77 20 66 69 6c 65 20 49 44 20 2a  nd new file ID *
4220: 2f 0a 20 20 73 74 72 75 63 74 20 76 78 77 6f 72  /.  struct vxwor
4230: 6b 73 46 69 6c 65 49 64 20 2a 70 43 61 6e 64 69  ksFileId *pCandi
4240: 64 61 74 65 3b 20 20 20 2f 2a 20 46 6f 72 20 6c  date;   /* For l
4250: 6f 6f 70 69 6e 67 20 6f 76 65 72 20 65 78 69 73  ooping over exis
4260: 74 69 6e 67 20 66 69 6c 65 20 49 44 73 20 2a 2f  ting file IDs */
4270: 0a 20 20 69 6e 74 20 6e 3b 20 20 20 20 20 20 20  .  int n;       
4280: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4290: 20 20 20 20 20 20 20 2f 2a 20 4c 65 6e 67 74 68         /* Length
42a0: 20 6f 66 20 7a 41 62 73 6f 6c 75 74 65 4e 61 6d   of zAbsoluteNam
42b0: 65 20 73 74 72 69 6e 67 20 2a 2f 0a 0a 20 20 61  e string */..  a
42c0: 73 73 65 72 74 28 20 7a 41 62 73 6f 6c 75 74 65  ssert( zAbsolute
42d0: 4e 61 6d 65 5b 30 5d 3d 3d 27 2f 27 20 29 3b 0a  Name[0]=='/' );.
42e0: 20 20 6e 20 3d 20 28 69 6e 74 29 73 74 72 6c 65    n = (int)strle
42f0: 6e 28 7a 41 62 73 6f 6c 75 74 65 4e 61 6d 65 29  n(zAbsoluteName)
4300: 3b 0a 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74  ;.  pNew = sqlit
4310: 65 33 5f 6d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f  e3_malloc( sizeo
4320: 66 28 2a 70 4e 65 77 29 20 2b 20 28 6e 2b 31 29  f(*pNew) + (n+1)
4330: 20 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d   );.  if( pNew==
4340: 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
4350: 70 4e 65 77 2d 3e 7a 43 61 6e 6f 6e 69 63 61 6c  pNew->zCanonical
4360: 4e 61 6d 65 20 3d 20 28 63 68 61 72 2a 29 26 70  Name = (char*)&p
4370: 4e 65 77 5b 31 5d 3b 0a 20 20 6d 65 6d 63 70 79  New[1];.  memcpy
4380: 28 70 4e 65 77 2d 3e 7a 43 61 6e 6f 6e 69 63 61  (pNew->zCanonica
4390: 6c 4e 61 6d 65 2c 20 7a 41 62 73 6f 6c 75 74 65  lName, zAbsolute
43a0: 4e 61 6d 65 2c 20 6e 2b 31 29 3b 0a 20 20 6e 20  Name, n+1);.  n 
43b0: 3d 20 76 78 77 6f 72 6b 73 53 69 6d 70 6c 69 66  = vxworksSimplif
43c0: 79 4e 61 6d 65 28 70 4e 65 77 2d 3e 7a 43 61 6e  yName(pNew->zCan
43d0: 6f 6e 69 63 61 6c 4e 61 6d 65 2c 20 6e 29 3b 0a  onicalName, n);.
43e0: 0a 20 20 2f 2a 20 53 65 61 72 63 68 20 66 6f 72  .  /* Search for
43f0: 20 61 6e 20 65 78 69 73 74 69 6e 67 20 65 6e 74   an existing ent
4400: 72 79 20 74 68 61 74 20 6d 61 74 63 68 69 6e 67  ry that matching
4410: 20 74 68 65 20 63 61 6e 6f 6e 69 63 61 6c 20 6e   the canonical n
4420: 61 6d 65 2e 0a 20 20 2a 2a 20 49 66 20 66 6f 75  ame..  ** If fou
4430: 6e 64 2c 20 69 6e 63 72 65 6d 65 6e 74 20 74 68  nd, increment th
4440: 65 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e  e reference coun
4450: 74 20 61 6e 64 20 72 65 74 75 72 6e 20 61 20 70  t and return a p
4460: 6f 69 6e 74 65 72 20 74 6f 0a 20 20 2a 2a 20 74  ointer to.  ** t
4470: 68 65 20 65 78 69 73 74 69 6e 67 20 66 69 6c 65  he existing file
4480: 20 49 44 2e 0a 20 20 2a 2f 0a 20 20 75 6e 69 78   ID..  */.  unix
4490: 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 20 20  EnterMutex();.  
44a0: 66 6f 72 28 70 43 61 6e 64 69 64 61 74 65 3d 76  for(pCandidate=v
44b0: 78 77 6f 72 6b 73 46 69 6c 65 4c 69 73 74 3b 20  xworksFileList; 
44c0: 70 43 61 6e 64 69 64 61 74 65 3b 20 70 43 61 6e  pCandidate; pCan
44d0: 64 69 64 61 74 65 3d 70 43 61 6e 64 69 64 61 74  didate=pCandidat
44e0: 65 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 69  e->pNext){.    i
44f0: 66 28 20 70 43 61 6e 64 69 64 61 74 65 2d 3e 6e  f( pCandidate->n
4500: 4e 61 6d 65 3d 3d 6e 20 0a 20 20 20 20 20 26 26  Name==n .     &&
4510: 20 6d 65 6d 63 6d 70 28 70 43 61 6e 64 69 64 61   memcmp(pCandida
4520: 74 65 2d 3e 7a 43 61 6e 6f 6e 69 63 61 6c 4e 61  te->zCanonicalNa
4530: 6d 65 2c 20 70 4e 65 77 2d 3e 7a 43 61 6e 6f 6e  me, pNew->zCanon
4540: 69 63 61 6c 4e 61 6d 65 2c 20 6e 29 3d 3d 30 0a  icalName, n)==0.
4550: 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 73 71      ){.       sq
4560: 6c 69 74 65 33 5f 66 72 65 65 28 70 4e 65 77 29  lite3_free(pNew)
4570: 3b 0a 20 20 20 20 20 20 20 70 43 61 6e 64 69 64  ;.       pCandid
4580: 61 74 65 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 20  ate->nRef++;.   
4590: 20 20 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74      unixLeaveMut
45a0: 65 78 28 29 3b 0a 20 20 20 20 20 20 20 72 65 74  ex();.       ret
45b0: 75 72 6e 20 70 43 61 6e 64 69 64 61 74 65 3b 0a  urn pCandidate;.
45c0: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
45d0: 4e 6f 20 6d 61 74 63 68 20 77 61 73 20 66 6f 75  No match was fou
45e0: 6e 64 2e 20 20 57 65 20 77 69 6c 6c 20 6d 61 6b  nd.  We will mak
45f0: 65 20 61 20 6e 65 77 20 66 69 6c 65 20 49 44 20  e a new file ID 
4600: 2a 2f 0a 20 20 70 4e 65 77 2d 3e 6e 52 65 66 20  */.  pNew->nRef 
4610: 3d 20 31 3b 0a 20 20 70 4e 65 77 2d 3e 6e 4e 61  = 1;.  pNew->nNa
4620: 6d 65 20 3d 20 6e 3b 0a 20 20 70 4e 65 77 2d 3e  me = n;.  pNew->
4630: 70 4e 65 78 74 20 3d 20 76 78 77 6f 72 6b 73 46  pNext = vxworksF
4640: 69 6c 65 4c 69 73 74 3b 0a 20 20 76 78 77 6f 72  ileList;.  vxwor
4650: 6b 73 46 69 6c 65 4c 69 73 74 20 3d 20 70 4e 65  ksFileList = pNe
4660: 77 3b 0a 20 20 75 6e 69 78 4c 65 61 76 65 4d 75  w;.  unixLeaveMu
4670: 74 65 78 28 29 3b 0a 20 20 72 65 74 75 72 6e 20  tex();.  return 
4680: 70 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44  pNew;.}../*.** D
4690: 65 63 72 65 6d 65 6e 74 20 74 68 65 20 72 65 66  ecrement the ref
46a0: 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 6f 6e 20  erence count on 
46b0: 61 20 76 78 77 6f 72 6b 73 46 69 6c 65 49 64 20  a vxworksFileId 
46c0: 6f 62 6a 65 63 74 2e 20 20 46 72 65 65 0a 2a 2a  object.  Free.**
46d0: 20 74 68 65 20 6f 62 6a 65 63 74 20 77 68 65 6e   the object when
46e0: 20 74 68 65 20 72 65 66 65 72 65 6e 63 65 20 63   the reference c
46f0: 6f 75 6e 74 20 72 65 61 63 68 65 73 20 7a 65 72  ount reaches zer
4700: 6f 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  o..*/.static voi
4710: 64 20 76 78 77 6f 72 6b 73 52 65 6c 65 61 73 65  d vxworksRelease
4720: 46 69 6c 65 49 64 28 73 74 72 75 63 74 20 76 78  FileId(struct vx
4730: 77 6f 72 6b 73 46 69 6c 65 49 64 20 2a 70 49 64  worksFileId *pId
4740: 29 7b 0a 20 20 75 6e 69 78 45 6e 74 65 72 4d 75  ){.  unixEnterMu
4750: 74 65 78 28 29 3b 0a 20 20 61 73 73 65 72 74 28  tex();.  assert(
4760: 20 70 49 64 2d 3e 6e 52 65 66 3e 30 20 29 3b 0a   pId->nRef>0 );.
4770: 20 20 70 49 64 2d 3e 6e 52 65 66 2d 2d 3b 0a 20    pId->nRef--;. 
4780: 20 69 66 28 20 70 49 64 2d 3e 6e 52 65 66 3d 3d   if( pId->nRef==
4790: 30 20 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20  0 ){.    struct 
47a0: 76 78 77 6f 72 6b 73 46 69 6c 65 49 64 20 2a 2a  vxworksFileId **
47b0: 70 70 3b 0a 20 20 20 20 66 6f 72 28 70 70 3d 26  pp;.    for(pp=&
47c0: 76 78 77 6f 72 6b 73 46 69 6c 65 4c 69 73 74 3b  vxworksFileList;
47d0: 20 2a 70 70 20 26 26 20 2a 70 70 21 3d 70 49 64   *pp && *pp!=pId
47e0: 3b 20 70 70 20 3d 20 26 28 28 2a 70 70 29 2d 3e  ; pp = &((*pp)->
47f0: 70 4e 65 78 74 29 29 7b 7d 0a 20 20 20 20 61 73  pNext)){}.    as
4800: 73 65 72 74 28 20 2a 70 70 3d 3d 70 49 64 20 29  sert( *pp==pId )
4810: 3b 0a 20 20 20 20 2a 70 70 20 3d 20 70 49 64 2d  ;.    *pp = pId-
4820: 3e 70 4e 65 78 74 3b 0a 20 20 20 20 73 71 6c 69  >pNext;.    sqli
4830: 74 65 33 5f 66 72 65 65 28 70 49 64 29 3b 0a 20  te3_free(pId);. 
4840: 20 7d 0a 20 20 75 6e 69 78 4c 65 61 76 65 4d 75   }.  unixLeaveMu
4850: 74 65 78 28 29 3b 0a 7d 0a 23 65 6e 64 69 66 20  tex();.}.#endif 
4860: 2f 2a 20 4f 53 5f 56 58 57 4f 52 4b 53 20 2a 2f  /* OS_VXWORKS */
4870: 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ./**************
4880: 2a 20 45 6e 64 20 6f 66 20 55 6e 69 71 75 65 20  * End of Unique 
4890: 46 69 6c 65 20 49 44 20 55 74 69 6c 69 74 79 20  File ID Utility 
48a0: 55 73 65 64 20 42 79 20 56 78 57 6f 72 6b 73 20  Used By VxWorks 
48b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
48c0: 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .***************
48d0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
48e0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
48f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4900: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f  ***************/
4910: 0a 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .../************
4920: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4930: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4940: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4950: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4960: 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  **.*************
4970: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 50  ************** P
4980: 6f 73 69 78 20 41 64 76 69 73 6f 72 79 20 4c 6f  osix Advisory Lo
4990: 63 6b 69 6e 67 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  cking **********
49a0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
49b0: 2a 2a 0a 2a 2a 0a 2a 2a 20 50 4f 53 49 58 20 61  **.**.** POSIX a
49c0: 64 76 69 73 6f 72 79 20 6c 6f 63 6b 73 20 61 72  dvisory locks ar
49d0: 65 20 62 72 6f 6b 65 6e 20 62 79 20 64 65 73 69  e broken by desi
49e0: 67 6e 2e 20 20 41 4e 53 49 20 53 54 44 20 31 30  gn.  ANSI STD 10
49f0: 30 33 2e 31 20 28 31 39 39 36 29 0a 2a 2a 20 73  03.1 (1996).** s
4a00: 65 63 74 69 6f 6e 20 36 2e 35 2e 32 2e 32 20 6c  ection 6.5.2.2 l
4a10: 69 6e 65 73 20 34 38 33 20 74 68 72 6f 75 67 68  ines 483 through
4a20: 20 34 39 30 20 73 70 65 63 69 66 79 20 74 68 61   490 specify tha
4a30: 74 20 77 68 65 6e 20 61 20 70 72 6f 63 65 73 73  t when a process
4a40: 0a 2a 2a 20 73 65 74 73 20 6f 72 20 63 6c 65 61  .** sets or clea
4a50: 72 73 20 61 20 6c 6f 63 6b 2c 20 74 68 61 74 20  rs a lock, that 
4a60: 6f 70 65 72 61 74 69 6f 6e 20 6f 76 65 72 72 69  operation overri
4a70: 64 65 73 20 61 6e 79 20 70 72 69 6f 72 20 6c 6f  des any prior lo
4a80: 63 6b 73 20 73 65 74 0a 2a 2a 20 62 79 20 74 68  cks set.** by th
4a90: 65 20 73 61 6d 65 20 70 72 6f 63 65 73 73 2e 20  e same process. 
4aa0: 20 49 74 20 64 6f 65 73 20 6e 6f 74 20 65 78 70   It does not exp
4ab0: 6c 69 63 69 74 6c 79 20 73 61 79 20 73 6f 2c 20  licitly say so, 
4ac0: 62 75 74 20 74 68 69 73 20 69 6d 70 6c 69 65 73  but this implies
4ad0: 0a 2a 2a 20 74 68 61 74 20 69 74 20 6f 76 65 72  .** that it over
4ae0: 72 69 64 65 73 20 6c 6f 63 6b 73 20 73 65 74 20  rides locks set 
4af0: 62 79 20 74 68 65 20 73 61 6d 65 20 70 72 6f 63  by the same proc
4b00: 65 73 73 20 75 73 69 6e 67 20 61 20 64 69 66 66  ess using a diff
4b10: 65 72 65 6e 74 0a 2a 2a 20 66 69 6c 65 20 64 65  erent.** file de
4b20: 73 63 72 69 70 74 6f 72 2e 20 20 43 6f 6e 73 69  scriptor.  Consi
4b30: 64 65 72 20 74 68 69 73 20 74 65 73 74 20 63 61  der this test ca
4b40: 73 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20  se:.**.**       
4b50: 69 6e 74 20 66 64 31 20 3d 20 6f 70 65 6e 28 22  int fd1 = open("
4b60: 2e 2f 66 69 6c 65 31 22 2c 20 4f 5f 52 44 57 52  ./file1", O_RDWR
4b70: 7c 4f 5f 43 52 45 41 54 2c 20 30 36 34 34 29 3b  |O_CREAT, 0644);
4b80: 0a 2a 2a 20 20 20 20 20 20 20 69 6e 74 20 66 64  .**       int fd
4b90: 32 20 3d 20 6f 70 65 6e 28 22 2e 2f 66 69 6c 65  2 = open("./file
4ba0: 32 22 2c 20 4f 5f 52 44 57 52 7c 4f 5f 43 52 45  2", O_RDWR|O_CRE
4bb0: 41 54 2c 20 30 36 34 34 29 3b 0a 2a 2a 0a 2a 2a  AT, 0644);.**.**
4bc0: 20 53 75 70 70 6f 73 65 20 2e 2f 66 69 6c 65 31   Suppose ./file1
4bd0: 20 61 6e 64 20 2e 2f 66 69 6c 65 32 20 61 72 65   and ./file2 are
4be0: 20 72 65 61 6c 6c 79 20 74 68 65 20 73 61 6d 65   really the same
4bf0: 20 66 69 6c 65 20 28 62 65 63 61 75 73 65 0a 2a   file (because.*
4c00: 2a 20 6f 6e 65 20 69 73 20 61 20 68 61 72 64 20  * one is a hard 
4c10: 6f 72 20 73 79 6d 62 6f 6c 69 63 20 6c 69 6e 6b  or symbolic link
4c20: 20 74 6f 20 74 68 65 20 6f 74 68 65 72 29 20 74   to the other) t
4c30: 68 65 6e 20 69 66 20 79 6f 75 20 73 65 74 0a 2a  hen if you set.*
4c40: 2a 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c  * an exclusive l
4c50: 6f 63 6b 20 6f 6e 20 66 64 31 2c 20 74 68 65 6e  ock on fd1, then
4c60: 20 74 72 79 20 74 6f 20 67 65 74 20 61 6e 20 65   try to get an e
4c70: 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 0a 2a 2a  xclusive lock.**
4c80: 20 6f 6e 20 66 64 32 2c 20 69 74 20 77 6f 72 6b   on fd2, it work
4c90: 73 2e 20 20 49 20 77 6f 75 6c 64 20 68 61 76 65  s.  I would have
4ca0: 20 65 78 70 65 63 74 65 64 20 74 68 65 20 73 65   expected the se
4cb0: 63 6f 6e 64 20 6c 6f 63 6b 20 74 6f 0a 2a 2a 20  cond lock to.** 
4cc0: 66 61 69 6c 20 73 69 6e 63 65 20 74 68 65 72 65  fail since there
4cd0: 20 77 61 73 20 61 6c 72 65 61 64 79 20 61 20 6c   was already a l
4ce0: 6f 63 6b 20 6f 6e 20 74 68 65 20 66 69 6c 65 20  ock on the file 
4cf0: 64 75 65 20 74 6f 20 66 64 31 2e 0a 2a 2a 20 42  due to fd1..** B
4d00: 75 74 20 6e 6f 74 20 73 6f 2e 20 20 53 69 6e 63  ut not so.  Sinc
4d10: 65 20 62 6f 74 68 20 6c 6f 63 6b 73 20 63 61 6d  e both locks cam
4d20: 65 20 66 72 6f 6d 20 74 68 65 20 73 61 6d 65 20  e from the same 
4d30: 70 72 6f 63 65 73 73 2c 20 74 68 65 0a 2a 2a 20  process, the.** 
4d40: 73 65 63 6f 6e 64 20 6f 76 65 72 72 69 64 65 73  second overrides
4d50: 20 74 68 65 20 66 69 72 73 74 2c 20 65 76 65 6e   the first, even
4d60: 20 74 68 6f 75 67 68 20 74 68 65 79 20 77 65 72   though they wer
4d70: 65 20 6f 6e 20 64 69 66 66 65 72 65 6e 74 0a 2a  e on different.*
4d80: 2a 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  * file descripto
4d90: 72 73 20 6f 70 65 6e 65 64 20 6f 6e 20 64 69 66  rs opened on dif
4da0: 66 65 72 65 6e 74 20 66 69 6c 65 20 6e 61 6d 65  ferent file name
4db0: 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 6d 65  s..**.** This me
4dc0: 61 6e 73 20 74 68 61 74 20 77 65 20 63 61 6e 6e  ans that we cann
4dd0: 6f 74 20 75 73 65 20 50 4f 53 49 58 20 6c 6f 63  ot use POSIX loc
4de0: 6b 73 20 74 6f 20 73 79 6e 63 68 72 6f 6e 69 7a  ks to synchroniz
4df0: 65 20 66 69 6c 65 20 61 63 63 65 73 73 0a 2a 2a  e file access.**
4e00: 20 61 6d 6f 6e 67 20 63 6f 6d 70 65 74 69 6e 67   among competing
4e10: 20 74 68 72 65 61 64 73 20 6f 66 20 74 68 65 20   threads of the 
4e20: 73 61 6d 65 20 70 72 6f 63 65 73 73 2e 20 20 50  same process.  P
4e30: 4f 53 49 58 20 6c 6f 63 6b 73 20 77 69 6c 6c 20  OSIX locks will 
4e40: 77 6f 72 6b 20 66 69 6e 65 0a 2a 2a 20 74 6f 20  work fine.** to 
4e50: 73 79 6e 63 68 72 6f 6e 69 7a 65 20 61 63 63 65  synchronize acce
4e60: 73 73 20 66 6f 72 20 74 68 72 65 61 64 73 20 69  ss for threads i
4e70: 6e 20 73 65 70 61 72 61 74 65 20 70 72 6f 63 65  n separate proce
4e80: 73 73 65 73 2c 20 62 75 74 20 6e 6f 74 0a 2a 2a  sses, but not.**
4e90: 20 74 68 72 65 61 64 73 20 77 69 74 68 69 6e 20   threads within 
4ea0: 74 68 65 20 73 61 6d 65 20 70 72 6f 63 65 73 73  the same process
4eb0: 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20 77 6f 72 6b 20  ..**.** To work 
4ec0: 61 72 6f 75 6e 64 20 74 68 65 20 70 72 6f 62 6c  around the probl
4ed0: 65 6d 2c 20 53 51 4c 69 74 65 20 68 61 73 20 74  em, SQLite has t
4ee0: 6f 20 6d 61 6e 61 67 65 20 66 69 6c 65 20 6c 6f  o manage file lo
4ef0: 63 6b 73 20 69 6e 74 65 72 6e 61 6c 6c 79 0a 2a  cks internally.*
4f00: 2a 20 6f 6e 20 69 74 73 20 6f 77 6e 2e 20 20 57  * on its own.  W
4f10: 68 65 6e 65 76 65 72 20 61 20 6e 65 77 20 64 61  henever a new da
4f20: 74 61 62 61 73 65 20 69 73 20 6f 70 65 6e 65 64  tabase is opened
4f30: 2c 20 77 65 20 68 61 76 65 20 74 6f 20 66 69 6e  , we have to fin
4f40: 64 20 74 68 65 0a 2a 2a 20 73 70 65 63 69 66 69  d the.** specifi
4f50: 63 20 69 6e 6f 64 65 20 6f 66 20 74 68 65 20 64  c inode of the d
4f60: 61 74 61 62 61 73 65 20 66 69 6c 65 20 28 74 68  atabase file (th
4f70: 65 20 69 6e 6f 64 65 20 69 73 20 64 65 74 65 72  e inode is deter
4f80: 6d 69 6e 65 64 20 62 79 20 74 68 65 0a 2a 2a 20  mined by the.** 
4f90: 73 74 5f 64 65 76 20 61 6e 64 20 73 74 5f 69 6e  st_dev and st_in
4fa0: 6f 20 66 69 65 6c 64 73 20 6f 66 20 74 68 65 20  o fields of the 
4fb0: 73 74 61 74 20 73 74 72 75 63 74 75 72 65 20 74  stat structure t
4fc0: 68 61 74 20 66 73 74 61 74 28 29 20 66 69 6c 6c  hat fstat() fill
4fd0: 73 20 69 6e 29 0a 2a 2a 20 61 6e 64 20 63 68 65  s in).** and che
4fe0: 63 6b 20 66 6f 72 20 6c 6f 63 6b 73 20 61 6c 72  ck for locks alr
4ff0: 65 61 64 79 20 65 78 69 73 74 69 6e 67 20 6f 6e  eady existing on
5000: 20 74 68 61 74 20 69 6e 6f 64 65 2e 20 20 57 68   that inode.  Wh
5010: 65 6e 20 6c 6f 63 6b 73 20 61 72 65 0a 2a 2a 20  en locks are.** 
5020: 63 72 65 61 74 65 64 20 6f 72 20 72 65 6d 6f 76  created or remov
5030: 65 64 2c 20 77 65 20 68 61 76 65 20 74 6f 20 6c  ed, we have to l
5040: 6f 6f 6b 20 61 74 20 6f 75 72 20 6f 77 6e 20 69  ook at our own i
5050: 6e 74 65 72 6e 61 6c 20 72 65 63 6f 72 64 20 6f  nternal record o
5060: 66 20 74 68 65 0a 2a 2a 20 6c 6f 63 6b 73 20 74  f the.** locks t
5070: 6f 20 73 65 65 20 69 66 20 61 6e 6f 74 68 65 72  o see if another
5080: 20 74 68 72 65 61 64 20 68 61 73 20 70 72 65 76   thread has prev
5090: 69 6f 75 73 6c 79 20 73 65 74 20 61 20 6c 6f 63  iously set a loc
50a0: 6b 20 6f 6e 20 74 68 61 74 20 73 61 6d 65 0a 2a  k on that same.*
50b0: 2a 20 69 6e 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 28  * inode..**.** (
50c0: 41 73 69 64 65 3a 20 54 68 65 20 75 73 65 20 6f  Aside: The use o
50d0: 66 20 69 6e 6f 64 65 20 6e 75 6d 62 65 72 73 20  f inode numbers 
50e0: 61 73 20 75 6e 69 71 75 65 20 49 44 73 20 64 6f  as unique IDs do
50f0: 65 73 20 6e 6f 74 20 77 6f 72 6b 20 6f 6e 20 56  es not work on V
5100: 78 57 6f 72 6b 73 2e 0a 2a 2a 20 46 6f 72 20 56  xWorks..** For V
5110: 78 57 6f 72 6b 73 2c 20 77 65 20 68 61 76 65 20  xWorks, we have 
5120: 74 6f 20 75 73 65 20 74 68 65 20 61 6c 74 65 72  to use the alter
5130: 6e 61 74 69 76 65 20 75 6e 69 71 75 65 20 49 44  native unique ID
5140: 20 73 79 73 74 65 6d 20 62 61 73 65 64 20 6f 6e   system based on
5150: 0a 2a 2a 20 63 61 6e 6f 6e 69 63 61 6c 20 66 69  .** canonical fi
5160: 6c 65 6e 61 6d 65 20 61 6e 64 20 69 6d 70 6c 65  lename and imple
5170: 6d 65 6e 74 65 64 20 69 6e 20 74 68 65 20 70 72  mented in the pr
5180: 65 76 69 6f 75 73 20 64 69 76 69 73 69 6f 6e 2e  evious division.
5190: 29 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 71 6c 69  ).**.** The sqli
51a0: 74 65 33 5f 66 69 6c 65 20 73 74 72 75 63 74 75  te3_file structu
51b0: 72 65 20 66 6f 72 20 50 4f 53 49 58 20 69 73 20  re for POSIX is 
51c0: 6e 6f 20 6c 6f 6e 67 65 72 20 6a 75 73 74 20 61  no longer just a
51d0: 6e 20 69 6e 74 65 67 65 72 20 66 69 6c 65 0a 2a  n integer file.*
51e0: 2a 20 64 65 73 63 72 69 70 74 6f 72 2e 20 20 49  * descriptor.  I
51f0: 74 20 69 73 20 6e 6f 77 20 61 20 73 74 72 75 63  t is now a struc
5200: 74 75 72 65 20 74 68 61 74 20 68 6f 6c 64 73 20  ture that holds 
5210: 74 68 65 20 69 6e 74 65 67 65 72 20 66 69 6c 65  the integer file
5220: 0a 2a 2a 20 64 65 73 63 72 69 70 74 6f 72 20 61  .** descriptor a
5230: 6e 64 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  nd a pointer to 
5240: 61 20 73 74 72 75 63 74 75 72 65 20 74 68 61 74  a structure that
5250: 20 64 65 73 63 72 69 62 65 73 20 74 68 65 20 69   describes the i
5260: 6e 74 65 72 6e 61 6c 0a 2a 2a 20 6c 6f 63 6b 73  nternal.** locks
5270: 20 6f 6e 20 74 68 65 20 63 6f 72 72 65 73 70 6f   on the correspo
5280: 6e 64 69 6e 67 20 69 6e 6f 64 65 2e 20 20 54 68  nding inode.  Th
5290: 65 72 65 20 69 73 20 6f 6e 65 20 6c 6f 63 6b 69  ere is one locki
52a0: 6e 67 20 73 74 72 75 63 74 75 72 65 0a 2a 2a 20  ng structure.** 
52b0: 70 65 72 20 69 6e 6f 64 65 2c 20 73 6f 20 69 66  per inode, so if
52c0: 20 74 68 65 20 73 61 6d 65 20 69 6e 6f 64 65 20   the same inode 
52d0: 69 73 20 6f 70 65 6e 65 64 20 74 77 69 63 65 2c  is opened twice,
52e0: 20 62 6f 74 68 20 75 6e 69 78 46 69 6c 65 20 73   both unixFile s
52f0: 74 72 75 63 74 75 72 65 73 0a 2a 2a 20 70 6f 69  tructures.** poi
5300: 6e 74 20 74 6f 20 74 68 65 20 73 61 6d 65 20 6c  nt to the same l
5310: 6f 63 6b 69 6e 67 20 73 74 72 75 63 74 75 72 65  ocking structure
5320: 2e 20 20 54 68 65 20 6c 6f 63 6b 69 6e 67 20 73  .  The locking s
5330: 74 72 75 63 74 75 72 65 20 6b 65 65 70 73 0a 2a  tructure keeps.*
5340: 2a 20 61 20 72 65 66 65 72 65 6e 63 65 20 63 6f  * a reference co
5350: 75 6e 74 20 28 73 6f 20 77 65 20 77 69 6c 6c 20  unt (so we will 
5360: 6b 6e 6f 77 20 77 68 65 6e 20 74 6f 20 64 65 6c  know when to del
5370: 65 74 65 20 69 74 29 20 61 6e 64 20 61 20 22 63  ete it) and a "c
5380: 6e 74 22 0a 2a 2a 20 66 69 65 6c 64 20 74 68 61  nt".** field tha
5390: 74 20 74 65 6c 6c 73 20 75 73 20 69 74 73 20 69  t tells us its i
53a0: 6e 74 65 72 6e 61 6c 20 6c 6f 63 6b 20 73 74 61  nternal lock sta
53b0: 74 75 73 2e 20 20 63 6e 74 3d 3d 30 20 6d 65 61  tus.  cnt==0 mea
53c0: 6e 73 20 74 68 65 0a 2a 2a 20 66 69 6c 65 20 69  ns the.** file i
53d0: 73 20 75 6e 6c 6f 63 6b 65 64 2e 20 20 63 6e 74  s unlocked.  cnt
53e0: 3d 3d 2d 31 20 6d 65 61 6e 73 20 74 68 65 20 66  ==-1 means the f
53f0: 69 6c 65 20 68 61 73 20 61 6e 20 65 78 63 6c 75  ile has an exclu
5400: 73 69 76 65 20 6c 6f 63 6b 2e 0a 2a 2a 20 63 6e  sive lock..** cn
5410: 74 3e 30 20 6d 65 61 6e 73 20 74 68 65 72 65 20  t>0 means there 
5420: 61 72 65 20 63 6e 74 20 73 68 61 72 65 64 20 6c  are cnt shared l
5430: 6f 63 6b 73 20 6f 6e 20 74 68 65 20 66 69 6c 65  ocks on the file
5440: 2e 0a 2a 2a 0a 2a 2a 20 41 6e 79 20 61 74 74 65  ..**.** Any atte
5450: 6d 70 74 20 74 6f 20 6c 6f 63 6b 20 6f 72 20 75  mpt to lock or u
5460: 6e 6c 6f 63 6b 20 61 20 66 69 6c 65 20 66 69 72  nlock a file fir
5470: 73 74 20 63 68 65 63 6b 73 20 74 68 65 20 6c 6f  st checks the lo
5480: 63 6b 69 6e 67 0a 2a 2a 20 73 74 72 75 63 74 75  cking.** structu
5490: 72 65 2e 20 20 54 68 65 20 66 63 6e 74 6c 28 29  re.  The fcntl()
54a0: 20 73 79 73 74 65 6d 20 63 61 6c 6c 20 69 73 20   system call is 
54b0: 6f 6e 6c 79 20 69 6e 76 6f 6b 65 64 20 74 6f 20  only invoked to 
54c0: 73 65 74 20 61 20 0a 2a 2a 20 50 4f 53 49 58 20  set a .** POSIX 
54d0: 6c 6f 63 6b 20 69 66 20 74 68 65 20 69 6e 74 65  lock if the inte
54e0: 72 6e 61 6c 20 6c 6f 63 6b 20 73 74 72 75 63 74  rnal lock struct
54f0: 75 72 65 20 74 72 61 6e 73 69 74 69 6f 6e 73 20  ure transitions 
5500: 62 65 74 77 65 65 6e 0a 2a 2a 20 61 20 6c 6f 63  between.** a loc
5510: 6b 65 64 20 61 6e 64 20 61 6e 20 75 6e 6c 6f 63  ked and an unloc
5520: 6b 65 64 20 73 74 61 74 65 2e 0a 2a 2a 0a 2a 2a  ked state..**.**
5530: 20 42 75 74 20 77 61 69 74 3a 20 20 74 68 65 72   But wait:  ther
5540: 65 20 61 72 65 20 79 65 74 20 6d 6f 72 65 20 70  e are yet more p
5550: 72 6f 62 6c 65 6d 73 20 77 69 74 68 20 50 4f 53  roblems with POS
5560: 49 58 20 61 64 76 69 73 6f 72 79 20 6c 6f 63 6b  IX advisory lock
5570: 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 79 6f 75 20  s..**.** If you 
5580: 63 6c 6f 73 65 20 61 20 66 69 6c 65 20 64 65 73  close a file des
5590: 63 72 69 70 74 6f 72 20 74 68 61 74 20 70 6f 69  criptor that poi
55a0: 6e 74 73 20 74 6f 20 61 20 66 69 6c 65 20 74 68  nts to a file th
55b0: 61 74 20 68 61 73 20 6c 6f 63 6b 73 2c 0a 2a 2a  at has locks,.**
55c0: 20 61 6c 6c 20 6c 6f 63 6b 73 20 6f 6e 20 74 68   all locks on th
55d0: 61 74 20 66 69 6c 65 20 74 68 61 74 20 61 72 65  at file that are
55e0: 20 6f 77 6e 65 64 20 62 79 20 74 68 65 20 63 75   owned by the cu
55f0: 72 72 65 6e 74 20 70 72 6f 63 65 73 73 20 61 72  rrent process ar
5600: 65 0a 2a 2a 20 72 65 6c 65 61 73 65 64 2e 20 20  e.** released.  
5610: 54 6f 20 77 6f 72 6b 20 61 72 6f 75 6e 64 20 74  To work around t
5620: 68 69 73 20 70 72 6f 62 6c 65 6d 2c 20 65 61 63  his problem, eac
5630: 68 20 75 6e 69 78 46 69 6c 65 20 73 74 72 75 63  h unixFile struc
5640: 74 75 72 65 20 63 6f 6e 74 61 69 6e 73 0a 2a 2a  ture contains.**
5650: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e   a pointer to an
5660: 20 75 6e 69 78 4f 70 65 6e 43 6e 74 20 73 74 72   unixOpenCnt str
5670: 75 63 74 75 72 65 2e 20 20 54 68 65 72 65 20 69  ucture.  There i
5680: 73 20 6f 6e 65 20 75 6e 69 78 4f 70 65 6e 43 6e  s one unixOpenCn
5690: 74 20 73 74 72 75 63 74 75 72 65 0a 2a 2a 20 70  t structure.** p
56a0: 65 72 20 6f 70 65 6e 20 69 6e 6f 64 65 2c 20 77  er open inode, w
56b0: 68 69 63 68 20 6d 65 61 6e 73 20 74 68 61 74 20  hich means that 
56c0: 6d 75 6c 74 69 70 6c 65 20 75 6e 69 78 46 69 6c  multiple unixFil
56d0: 65 20 63 61 6e 20 70 6f 69 6e 74 20 74 6f 20 61  e can point to a
56e0: 20 73 69 6e 67 6c 65 0a 2a 2a 20 75 6e 69 78 4f   single.** unixO
56f0: 70 65 6e 43 6e 74 2e 20 20 57 68 65 6e 20 61 6e  penCnt.  When an
5700: 20 61 74 74 65 6d 70 74 20 69 73 20 6d 61 64 65   attempt is made
5710: 20 74 6f 20 63 6c 6f 73 65 20 61 6e 20 75 6e 69   to close an uni
5720: 78 46 69 6c 65 2c 20 69 66 20 74 68 65 72 65 20  xFile, if there 
5730: 61 72 65 0a 2a 2a 20 6f 74 68 65 72 20 75 6e 69  are.** other uni
5740: 78 46 69 6c 65 20 6f 70 65 6e 20 6f 6e 20 74 68  xFile open on th
5750: 65 20 73 61 6d 65 20 69 6e 6f 64 65 20 74 68 61  e same inode tha
5760: 74 20 61 72 65 20 68 6f 6c 64 69 6e 67 20 6c 6f  t are holding lo
5770: 63 6b 73 2c 20 74 68 65 20 63 61 6c 6c 0a 2a 2a  cks, the call.**
5780: 20 74 6f 20 63 6c 6f 73 65 28 29 20 74 68 65 20   to close() the 
5790: 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
57a0: 69 73 20 64 65 66 65 72 72 65 64 20 75 6e 74 69  is deferred unti
57b0: 6c 20 61 6c 6c 20 6f 66 20 74 68 65 20 6c 6f 63  l all of the loc
57c0: 6b 73 20 63 6c 65 61 72 2e 0a 2a 2a 20 54 68 65  ks clear..** The
57d0: 20 75 6e 69 78 4f 70 65 6e 43 6e 74 20 73 74 72   unixOpenCnt str
57e0: 75 63 74 75 72 65 20 6b 65 65 70 73 20 61 20 6c  ucture keeps a l
57f0: 69 73 74 20 6f 66 20 66 69 6c 65 20 64 65 73 63  ist of file desc
5800: 72 69 70 74 6f 72 73 20 74 68 61 74 20 6e 65 65  riptors that nee
5810: 64 20 74 6f 0a 2a 2a 20 62 65 20 63 6c 6f 73 65  d to.** be close
5820: 64 20 61 6e 64 20 74 68 61 74 20 6c 69 73 74 20  d and that list 
5830: 69 73 20 77 61 6c 6b 65 64 20 28 61 6e 64 20 63  is walked (and c
5840: 6c 65 61 72 65 64 29 20 77 68 65 6e 20 74 68 65  leared) when the
5850: 20 6c 61 73 74 20 6c 6f 63 6b 0a 2a 2a 20 63 6c   last lock.** cl
5860: 65 61 72 73 2e 0a 2a 2a 0a 2a 2a 20 59 65 74 20  ears..**.** Yet 
5870: 61 6e 6f 74 68 65 72 20 70 72 6f 62 6c 65 6d 3a  another problem:
5880: 20 20 4c 69 6e 75 78 54 68 72 65 61 64 73 20 64    LinuxThreads d
5890: 6f 20 6e 6f 74 20 70 6c 61 79 20 77 65 6c 6c 20  o not play well 
58a0: 77 69 74 68 20 70 6f 73 69 78 20 6c 6f 63 6b 73  with posix locks
58b0: 2e 0a 2a 2a 0a 2a 2a 20 4d 61 6e 79 20 6f 6c 64  ..**.** Many old
58c0: 65 72 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 6c  er versions of l
58d0: 69 6e 75 78 20 75 73 65 20 74 68 65 20 4c 69 6e  inux use the Lin
58e0: 75 78 54 68 72 65 61 64 73 20 6c 69 62 72 61 72  uxThreads librar
58f0: 79 20 77 68 69 63 68 20 69 73 0a 2a 2a 20 6e 6f  y which is.** no
5900: 74 20 70 6f 73 69 78 20 63 6f 6d 70 6c 69 61 6e  t posix complian
5910: 74 2e 20 20 55 6e 64 65 72 20 4c 69 6e 75 78 54  t.  Under LinuxT
5920: 68 72 65 61 64 73 2c 20 61 20 6c 6f 63 6b 20 63  hreads, a lock c
5930: 72 65 61 74 65 64 20 62 79 20 74 68 72 65 61 64  reated by thread
5940: 0a 2a 2a 20 41 20 63 61 6e 6e 6f 74 20 62 65 20  .** A cannot be 
5950: 6d 6f 64 69 66 69 65 64 20 6f 72 20 6f 76 65 72  modified or over
5960: 72 69 64 64 65 6e 20 62 79 20 61 20 64 69 66 66  ridden by a diff
5970: 65 72 65 6e 74 20 74 68 72 65 61 64 20 42 2e 0a  erent thread B..
5980: 2a 2a 20 4f 6e 6c 79 20 74 68 72 65 61 64 20 41  ** Only thread A
5990: 20 63 61 6e 20 6d 6f 64 69 66 79 20 74 68 65 20   can modify the 
59a0: 6c 6f 63 6b 2e 20 20 4c 6f 63 6b 69 6e 67 20 62  lock.  Locking b
59b0: 65 68 61 76 69 6f 72 20 69 73 20 63 6f 72 72 65  ehavior is corre
59c0: 63 74 0a 2a 2a 20 69 66 20 74 68 65 20 61 70 70  ct.** if the app
59d0: 6c 69 61 74 69 6f 6e 20 75 73 65 73 20 74 68 65  liation uses the
59e0: 20 6e 65 77 65 72 20 4e 61 74 69 76 65 20 50 6f   newer Native Po
59f0: 73 69 78 20 54 68 72 65 61 64 20 4c 69 62 72 61  six Thread Libra
5a00: 72 79 20 28 4e 50 54 4c 29 0a 2a 2a 20 6f 6e 20  ry (NPTL).** on 
5a10: 6c 69 6e 75 78 20 2d 20 77 69 74 68 20 4e 50 54  linux - with NPT
5a20: 4c 20 61 20 6c 6f 63 6b 20 63 72 65 61 74 65 64  L a lock created
5a30: 20 62 79 20 74 68 72 65 61 64 20 41 20 63 61 6e   by thread A can
5a40: 20 6f 76 65 72 72 69 64 65 20 6c 6f 63 6b 73 0a   override locks.
5a50: 2a 2a 20 69 6e 20 74 68 72 65 61 64 20 42 2e 20  ** in thread B. 
5a60: 20 42 75 74 20 74 68 65 72 65 20 69 73 20 6e 6f   But there is no
5a70: 20 77 61 79 20 74 6f 20 6b 6e 6f 77 20 61 74 20   way to know at 
5a80: 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 77 68 69  compile-time whi
5a90: 63 68 0a 2a 2a 20 74 68 72 65 61 64 69 6e 67 20  ch.** threading 
5aa0: 6c 69 62 72 61 72 79 20 69 73 20 62 65 69 6e 67  library is being
5ab0: 20 75 73 65 64 2e 20 20 53 6f 20 74 68 65 72 65   used.  So there
5ac0: 20 69 73 20 6e 6f 20 77 61 79 20 74 6f 20 6b 6e   is no way to kn
5ad0: 6f 77 20 61 74 0a 2a 2a 20 63 6f 6d 70 69 6c 65  ow at.** compile
5ae0: 2d 74 69 6d 65 20 77 68 65 74 68 65 72 20 6f 72  -time whether or
5af0: 20 6e 6f 74 20 74 68 72 65 61 64 20 41 20 63 61   not thread A ca
5b00: 6e 20 6f 76 65 72 72 69 64 65 20 6c 6f 63 6b 73  n override locks
5b10: 20 6f 6e 20 74 68 72 65 61 64 20 42 2e 0a 2a 2a   on thread B..**
5b20: 20 57 65 20 68 61 76 65 20 74 6f 20 64 6f 20 61   We have to do a
5b30: 20 72 75 6e 2d 74 69 6d 65 20 63 68 65 63 6b 20   run-time check 
5b40: 74 6f 20 64 69 73 63 6f 76 65 72 20 74 68 65 20  to discover the 
5b50: 62 65 68 61 76 69 6f 72 20 6f 66 20 74 68 65 0a  behavior of the.
5b60: 2a 2a 20 63 75 72 72 65 6e 74 20 70 72 6f 63 65  ** current proce
5b70: 73 73 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 20 73 79 73  ss..**.** On sys
5b80: 74 65 6d 73 20 77 68 65 72 65 20 74 68 72 65 61  tems where threa
5b90: 64 20 41 20 69 73 20 75 6e 61 62 6c 65 20 74 6f  d A is unable to
5ba0: 20 6d 6f 64 69 66 79 20 6c 6f 63 6b 73 20 63 72   modify locks cr
5bb0: 65 61 74 65 64 20 62 79 0a 2a 2a 20 74 68 72 65  eated by.** thre
5bc0: 61 64 20 42 2c 20 77 65 20 68 61 76 65 20 74 6f  ad B, we have to
5bd0: 20 6b 65 65 70 20 74 72 61 63 6b 20 6f 66 20 77   keep track of w
5be0: 68 69 63 68 20 74 68 72 65 61 64 20 63 72 65 61  hich thread crea
5bf0: 74 65 64 20 65 61 63 68 0a 2a 2a 20 6c 6f 63 6b  ted each.** lock
5c00: 2e 20 20 48 65 6e 63 65 20 74 68 65 72 65 20 69  .  Hence there i
5c10: 73 20 61 6e 20 65 78 74 72 61 20 66 69 65 6c 64  s an extra field
5c20: 20 69 6e 20 74 68 65 20 6b 65 79 20 74 6f 20 74   in the key to t
5c30: 68 65 20 75 6e 69 78 4c 6f 63 6b 49 6e 66 6f 0a  he unixLockInfo.
5c40: 2a 2a 20 73 74 72 75 63 74 75 72 65 20 74 6f 20  ** structure to 
5c50: 72 65 63 6f 72 64 20 74 68 69 73 20 69 6e 66 6f  record this info
5c60: 72 6d 61 74 69 6f 6e 2e 20 20 41 6e 64 20 6f 6e  rmation.  And on
5c70: 20 74 68 6f 73 65 20 73 79 73 74 65 6d 73 20 69   those systems i
5c80: 74 0a 2a 2a 20 69 73 20 69 6c 6c 65 67 61 6c 20  t.** is illegal 
5c90: 74 6f 20 62 65 67 69 6e 20 61 20 74 72 61 6e 73  to begin a trans
5ca0: 61 63 74 69 6f 6e 20 69 6e 20 6f 6e 65 20 74 68  action in one th
5cb0: 72 65 61 64 20 61 6e 64 20 66 69 6e 69 73 68 20  read and finish 
5cc0: 69 74 0a 2a 2a 20 69 6e 20 61 6e 6f 74 68 65 72  it.** in another
5cd0: 2e 20 20 46 6f 72 20 74 68 69 73 20 6c 61 74 74  .  For this latt
5ce0: 65 72 20 72 65 73 74 72 69 63 74 69 6f 6e 2c 20  er restriction, 
5cf0: 74 68 65 72 65 20 69 73 20 6e 6f 20 77 6f 72 6b  there is no work
5d00: 2d 61 72 6f 75 6e 64 2e 0a 2a 2a 20 49 74 20 69  -around..** It i
5d10: 73 20 61 20 6c 69 6d 69 74 61 74 69 6f 6e 20 6f  s a limitation o
5d20: 66 20 4c 69 6e 75 78 54 68 72 65 61 64 73 2e 0a  f LinuxThreads..
5d30: 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 6f 72  */../*.** Set or
5d40: 20 63 68 65 63 6b 20 74 68 65 20 75 6e 69 78 46   check the unixF
5d50: 69 6c 65 2e 74 69 64 20 66 69 65 6c 64 2e 20 20  ile.tid field.  
5d60: 54 68 69 73 20 66 69 65 6c 64 20 69 73 20 73 65  This field is se
5d70: 74 20 77 68 65 6e 20 61 6e 20 75 6e 69 78 46 69  t when an unixFi
5d80: 6c 65 0a 2a 2a 20 69 73 20 66 69 72 73 74 20 6f  le.** is first o
5d90: 70 65 6e 65 64 2e 20 20 41 6c 6c 20 73 75 62 73  pened.  All subs
5da0: 65 71 75 65 6e 74 20 75 73 65 73 20 6f 66 20 74  equent uses of t
5db0: 68 65 20 75 6e 69 78 46 69 6c 65 20 76 65 72 69  he unixFile veri
5dc0: 66 79 20 74 68 61 74 20 74 68 65 0a 2a 2a 20 73  fy that the.** s
5dd0: 61 6d 65 20 74 68 72 65 61 64 20 69 73 20 6f 70  ame thread is op
5de0: 65 72 61 74 69 6e 67 20 6f 6e 20 74 68 65 20 75  erating on the u
5df0: 6e 69 78 46 69 6c 65 2e 20 20 53 6f 6d 65 20 6f  nixFile.  Some o
5e00: 70 65 72 61 74 69 6e 67 20 73 79 73 74 65 6d 73  perating systems
5e10: 20 64 6f 0a 2a 2a 20 6e 6f 74 20 61 6c 6c 6f 77   do.** not allow
5e20: 20 6c 6f 63 6b 73 20 74 6f 20 62 65 20 6f 76 65   locks to be ove
5e30: 72 72 69 64 64 65 6e 20 62 79 20 6f 74 68 65 72  rridden by other
5e40: 20 74 68 72 65 61 64 73 20 61 6e 64 20 74 68 61   threads and tha
5e50: 74 20 72 65 73 74 72 69 63 74 69 6f 6e 0a 2a 2a  t restriction.**
5e60: 20 6d 65 61 6e 73 20 74 68 61 74 20 73 71 6c 69   means that sqli
5e70: 74 65 33 2a 20 64 61 74 61 62 61 73 65 20 68 61  te3* database ha
5e80: 6e 64 6c 65 73 20 63 61 6e 6e 6f 74 20 62 65 20  ndles cannot be 
5e90: 6d 6f 76 65 64 20 66 72 6f 6d 20 6f 6e 65 20 74  moved from one t
5ea0: 68 72 65 61 64 0a 2a 2a 20 74 6f 20 61 6e 6f 74  hread.** to anot
5eb0: 68 65 72 20 77 68 69 6c 65 20 6c 6f 63 6b 73 20  her while locks 
5ec0: 61 72 65 20 68 65 6c 64 2e 0a 2a 2a 0a 2a 2a 20  are held..**.** 
5ed0: 56 65 72 73 69 6f 6e 20 33 2e 33 2e 31 20 28 32  Version 3.3.1 (2
5ee0: 30 30 36 2d 30 31 2d 31 35 29 3a 20 20 75 6e 69  006-01-15):  uni
5ef0: 78 46 69 6c 65 20 63 61 6e 20 62 65 20 6d 6f 76  xFile can be mov
5f00: 65 64 20 66 72 6f 6d 20 6f 6e 65 20 74 68 72 65  ed from one thre
5f10: 61 64 20 74 6f 0a 2a 2a 20 61 6e 6f 74 68 65 72  ad to.** another
5f20: 20 61 73 20 6c 6f 6e 67 20 61 73 20 77 65 20 61   as long as we a
5f30: 72 65 20 72 75 6e 6e 69 6e 67 20 6f 6e 20 61 20  re running on a 
5f40: 73 79 73 74 65 6d 20 74 68 61 74 20 73 75 70 70  system that supp
5f50: 6f 72 74 73 20 74 68 72 65 61 64 73 0a 2a 2a 20  orts threads.** 
5f60: 6f 76 65 72 72 69 64 69 6e 67 20 65 61 63 68 20  overriding each 
5f70: 6f 74 68 65 72 73 20 6c 6f 63 6b 73 20 28 77 68  others locks (wh
5f80: 69 63 68 20 69 73 20 6e 6f 77 20 74 68 65 20 6d  ich is now the m
5f90: 6f 73 74 20 63 6f 6d 6d 6f 6e 20 62 65 68 61 76  ost common behav
5fa0: 69 6f 72 29 0a 2a 2a 20 6f 72 20 69 66 20 6e 6f  ior).** or if no
5fb0: 20 6c 6f 63 6b 73 20 61 72 65 20 68 65 6c 64 2e   locks are held.
5fc0: 20 20 42 75 74 20 74 68 65 20 75 6e 69 78 46 69    But the unixFi
5fd0: 6c 65 2e 70 4c 6f 63 6b 20 66 69 65 6c 64 20 6e  le.pLock field n
5fe0: 65 65 64 73 20 74 6f 20 62 65 0a 2a 2a 20 72 65  eeds to be.** re
5ff0: 63 6f 6d 70 75 74 65 64 20 62 65 63 61 75 73 65  computed because
6000: 20 69 74 73 20 6b 65 79 20 69 6e 63 6c 75 64 65   its key include
6010: 73 20 74 68 65 20 74 68 72 65 61 64 2d 69 64 2e  s the thread-id.
6020: 20 20 53 65 65 20 74 68 65 20 0a 2a 2a 20 74 72    See the .** tr
6030: 61 6e 73 66 65 72 4f 77 6e 65 72 73 68 69 70 28  ansferOwnership(
6040: 29 20 66 75 6e 63 74 69 6f 6e 20 62 65 6c 6f 77  ) function below
6050: 20 66 6f 72 20 61 64 64 69 74 69 6f 6e 61 6c 20   for additional 
6060: 69 6e 66 6f 72 6d 61 74 69 6f 6e 0a 2a 2f 0a 23  information.*/.#
6070: 69 66 20 53 51 4c 49 54 45 5f 54 48 52 45 41 44  if SQLITE_THREAD
6080: 53 41 46 45 20 26 26 20 64 65 66 69 6e 65 64 28  SAFE && defined(
6090: 5f 5f 6c 69 6e 75 78 5f 5f 29 0a 23 20 64 65 66  __linux__).# def
60a0: 69 6e 65 20 53 45 54 5f 54 48 52 45 41 44 49 44  ine SET_THREADID
60b0: 28 58 29 20 20 20 28 58 29 2d 3e 74 69 64 20 3d  (X)   (X)->tid =
60c0: 20 70 74 68 72 65 61 64 5f 73 65 6c 66 28 29 0a   pthread_self().
60d0: 23 20 64 65 66 69 6e 65 20 43 48 45 43 4b 5f 54  # define CHECK_T
60e0: 48 52 45 41 44 49 44 28 58 29 20 28 74 68 72 65  HREADID(X) (thre
60f0: 61 64 73 4f 76 65 72 72 69 64 65 45 61 63 68 4f  adsOverrideEachO
6100: 74 68 65 72 73 4c 6f 63 6b 73 3d 3d 30 20 26 26  thersLocks==0 &&
6110: 20 5c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   \.             
6120: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 21                 !
6130: 70 74 68 72 65 61 64 5f 65 71 75 61 6c 28 28 58  pthread_equal((X
6140: 29 2d 3e 74 69 64 2c 20 70 74 68 72 65 61 64 5f  )->tid, pthread_
6150: 73 65 6c 66 28 29 29 29 0a 23 65 6c 73 65 0a 23  self())).#else.#
6160: 20 64 65 66 69 6e 65 20 53 45 54 5f 54 48 52 45   define SET_THRE
6170: 41 44 49 44 28 58 29 0a 23 20 64 65 66 69 6e 65  ADID(X).# define
6180: 20 43 48 45 43 4b 5f 54 48 52 45 41 44 49 44 28   CHECK_THREADID(
6190: 58 29 20 30 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  X) 0.#endif../*.
61a0: 2a 2a 20 41 6e 20 69 6e 73 74 61 6e 63 65 20 6f  ** An instance o
61b0: 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  f the following 
61c0: 73 74 72 75 63 74 75 72 65 20 73 65 72 76 65 73  structure serves
61d0: 20 61 73 20 74 68 65 20 6b 65 79 20 75 73 65 64   as the key used
61e0: 0a 2a 2a 20 74 6f 20 6c 6f 63 61 74 65 20 61 20  .** to locate a 
61f0: 70 61 72 74 69 63 75 6c 61 72 20 75 6e 69 78 4f  particular unixO
6200: 70 65 6e 43 6e 74 20 73 74 72 75 63 74 75 72 65  penCnt structure
6210: 20 67 69 76 65 6e 20 69 74 73 20 69 6e 6f 64 65   given its inode
6220: 2e 20 20 54 68 69 73 0a 2a 2a 20 69 73 20 74 68  .  This.** is th
6230: 65 20 73 61 6d 65 20 61 73 20 74 68 65 20 75 6e  e same as the un
6240: 69 78 4c 6f 63 6b 4b 65 79 20 65 78 63 65 70 74  ixLockKey except
6250: 20 74 68 61 74 20 74 68 65 20 74 68 72 65 61 64   that the thread
6260: 20 49 44 20 69 73 20 6f 6d 69 74 74 65 64 2e 0a   ID is omitted..
6270: 2a 2f 0a 73 74 72 75 63 74 20 75 6e 69 78 46 69  */.struct unixFi
6280: 6c 65 49 64 20 7b 0a 20 20 64 65 76 5f 74 20 64  leId {.  dev_t d
6290: 65 76 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ev;             
62a0: 20 20 20 20 20 2f 2a 20 44 65 76 69 63 65 20 6e       /* Device n
62b0: 75 6d 62 65 72 20 2a 2f 0a 23 69 66 20 4f 53 5f  umber */.#if OS_
62c0: 56 58 57 4f 52 4b 53 0a 20 20 73 74 72 75 63 74  VXWORKS.  struct
62d0: 20 76 78 77 6f 72 6b 73 46 69 6c 65 49 64 20 2a   vxworksFileId *
62e0: 70 49 64 3b 20 20 2f 2a 20 55 6e 69 71 75 65 20  pId;  /* Unique 
62f0: 66 69 6c 65 20 49 44 20 66 6f 72 20 76 78 77 6f  file ID for vxwo
6300: 72 6b 73 2e 20 2a 2f 0a 23 65 6c 73 65 0a 20 20  rks. */.#else.  
6310: 69 6e 6f 5f 74 20 69 6e 6f 3b 20 20 20 20 20 20  ino_t ino;      
6320: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
6330: 6e 6f 64 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 23  node number */.#
6340: 65 6e 64 69 66 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20  endif.};../*.** 
6350: 41 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74  An instance of t
6360: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72  he following str
6370: 75 63 74 75 72 65 20 73 65 72 76 65 73 20 61 73  ucture serves as
6380: 20 74 68 65 20 6b 65 79 20 75 73 65 64 0a 2a 2a   the key used.**
6390: 20 74 6f 20 6c 6f 63 61 74 65 20 61 20 70 61 72   to locate a par
63a0: 74 69 63 75 6c 61 72 20 75 6e 69 78 4c 6f 63 6b  ticular unixLock
63b0: 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20 67  Info structure g
63c0: 69 76 65 6e 20 69 74 73 20 69 6e 6f 64 65 2e 0a  iven its inode..
63d0: 2a 2a 0a 2a 2a 20 49 66 20 74 68 72 65 61 64 73  **.** If threads
63e0: 20 63 61 6e 6e 6f 74 20 6f 76 65 72 72 69 64 65   cannot override
63f0: 20 65 61 63 68 20 6f 74 68 65 72 73 20 6c 6f 63   each others loc
6400: 6b 73 20 28 4c 69 6e 75 78 54 68 72 65 61 64 73  ks (LinuxThreads
6410: 29 2c 20 74 68 65 6e 20 77 65 0a 2a 2a 20 73 65  ), then we.** se
6420: 74 20 74 68 65 20 75 6e 69 78 4c 6f 63 6b 4b 65  t the unixLockKe
6430: 79 2e 74 69 64 20 66 69 65 6c 64 20 74 6f 20 74  y.tid field to t
6440: 68 65 20 74 68 72 65 61 64 20 49 44 2e 20 20 49  he thread ID.  I
6450: 66 20 74 68 72 65 61 64 73 20 63 61 6e 20 6f 76  f threads can ov
6460: 65 72 72 69 64 65 0a 2a 2a 20 65 61 63 68 20 6f  erride.** each o
6470: 74 68 65 72 73 20 6c 6f 63 6b 73 20 28 50 6f 73  thers locks (Pos
6480: 69 78 20 61 6e 64 20 4e 50 54 4c 29 20 74 68 65  ix and NPTL) the
6490: 6e 20 74 69 64 20 69 73 20 61 6c 77 61 79 73 20  n tid is always 
64a0: 73 65 74 20 74 6f 20 7a 65 72 6f 2e 0a 2a 2a 20  set to zero..** 
64b0: 74 69 64 20 69 73 20 6f 6d 69 74 74 65 64 20 69  tid is omitted i
64c0: 66 20 77 65 20 63 6f 6d 70 69 6c 65 20 77 69 74  f we compile wit
64d0: 68 6f 75 74 20 74 68 72 65 61 64 69 6e 67 20 73  hout threading s
64e0: 75 70 70 6f 72 74 20 6f 72 20 6f 6e 20 61 6e 20  upport or on an 
64f0: 4f 53 0a 2a 2a 20 6f 74 68 65 72 20 74 68 61 6e  OS.** other than
6500: 20 6c 69 6e 75 78 2e 0a 2a 2f 0a 73 74 72 75 63   linux..*/.struc
6510: 74 20 75 6e 69 78 4c 6f 63 6b 4b 65 79 20 7b 0a  t unixLockKey {.
6520: 20 20 73 74 72 75 63 74 20 75 6e 69 78 46 69 6c    struct unixFil
6530: 65 49 64 20 66 69 64 3b 20 20 2f 2a 20 55 6e 69  eId fid;  /* Uni
6540: 71 75 65 20 69 64 65 6e 74 69 66 69 65 72 20 66  que identifier f
6550: 6f 72 20 74 68 65 20 66 69 6c 65 20 2a 2f 0a 23  or the file */.#
6560: 69 66 20 53 51 4c 49 54 45 5f 54 48 52 45 41 44  if SQLITE_THREAD
6570: 53 41 46 45 20 26 26 20 64 65 66 69 6e 65 64 28  SAFE && defined(
6580: 5f 5f 6c 69 6e 75 78 5f 5f 29 0a 20 20 70 74 68  __linux__).  pth
6590: 72 65 61 64 5f 74 20 74 69 64 3b 20 20 2f 2a 20  read_t tid;  /* 
65a0: 54 68 72 65 61 64 20 49 44 20 6f 66 20 6c 6f 63  Thread ID of loc
65b0: 6b 20 6f 77 6e 65 72 2e 20 5a 65 72 6f 20 69 66  k owner. Zero if
65c0: 20 6e 6f 74 20 75 73 69 6e 67 20 4c 69 6e 75 78   not using Linux
65d0: 54 68 72 65 61 64 73 20 2a 2f 0a 23 65 6e 64 69  Threads */.#endi
65e0: 66 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 69  f.};../*.** An i
65f0: 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20 66  nstance of the f
6600: 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63 74 75  ollowing structu
6610: 72 65 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 20  re is allocated 
6620: 66 6f 72 20 65 61 63 68 20 6f 70 65 6e 0a 2a 2a  for each open.**
6630: 20 69 6e 6f 64 65 2e 20 20 4f 72 2c 20 6f 6e 20   inode.  Or, on 
6640: 4c 69 6e 75 78 54 68 72 65 61 64 73 2c 20 74 68  LinuxThreads, th
6650: 65 72 65 20 69 73 20 6f 6e 65 20 6f 66 20 74 68  ere is one of th
6660: 65 73 65 20 73 74 72 75 63 74 75 72 65 73 20 66  ese structures f
6670: 6f 72 0a 2a 2a 20 65 61 63 68 20 69 6e 6f 64 65  or.** each inode
6680: 20 6f 70 65 6e 65 64 20 62 79 20 65 61 63 68 20   opened by each 
6690: 74 68 72 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 41 20  thread..**.** A 
66a0: 73 69 6e 67 6c 65 20 69 6e 6f 64 65 20 63 61 6e  single inode can
66b0: 20 68 61 76 65 20 6d 75 6c 74 69 70 6c 65 20 66   have multiple f
66c0: 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 73 2c  ile descriptors,
66d0: 20 73 6f 20 65 61 63 68 20 75 6e 69 78 46 69 6c   so each unixFil
66e0: 65 0a 2a 2a 20 73 74 72 75 63 74 75 72 65 20 63  e.** structure c
66f0: 6f 6e 74 61 69 6e 73 20 61 20 70 6f 69 6e 74 65  ontains a pointe
6700: 72 20 74 6f 20 61 6e 20 69 6e 73 74 61 6e 63 65  r to an instance
6710: 20 6f 66 20 74 68 69 73 20 6f 62 6a 65 63 74 20   of this object 
6720: 61 6e 64 20 74 68 69 73 0a 2a 2a 20 6f 62 6a 65  and this.** obje
6730: 63 74 20 6b 65 65 70 73 20 61 20 63 6f 75 6e 74  ct keeps a count
6740: 20 6f 66 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   of the number o
6750: 66 20 75 6e 69 78 46 69 6c 65 20 70 6f 69 6e 74  f unixFile point
6760: 69 6e 67 20 74 6f 20 69 74 2e 0a 2a 2f 0a 73 74  ing to it..*/.st
6770: 72 75 63 74 20 75 6e 69 78 4c 6f 63 6b 49 6e 66  ruct unixLockInf
6780: 6f 20 7b 0a 20 20 73 74 72 75 63 74 20 75 6e 69  o {.  struct uni
6790: 78 4c 6f 63 6b 4b 65 79 20 6c 6f 63 6b 4b 65 79  xLockKey lockKey
67a0: 3b 20 20 20 20 20 2f 2a 20 54 68 65 20 6c 6f 6f  ;     /* The loo
67b0: 6b 75 70 20 6b 65 79 20 2a 2f 0a 20 20 69 6e 74  kup key */.  int
67c0: 20 63 6e 74 3b 20 20 20 20 20 20 20 20 20 20 20   cnt;           
67d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
67e0: 4e 75 6d 62 65 72 20 6f 66 20 53 48 41 52 45 44  Number of SHARED
67f0: 20 6c 6f 63 6b 73 20 68 65 6c 64 20 2a 2f 0a 20   locks held */. 
6800: 20 69 6e 74 20 6c 6f 63 6b 74 79 70 65 3b 20 20   int locktype;  
6810: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6820: 20 2f 2a 20 4f 6e 65 20 6f 66 20 53 48 41 52 45   /* One of SHARE
6830: 44 5f 4c 4f 43 4b 2c 20 52 45 53 45 52 56 45 44  D_LOCK, RESERVED
6840: 5f 4c 4f 43 4b 20 65 74 63 2e 20 2a 2f 0a 20 20  _LOCK etc. */.  
6850: 69 6e 74 20 6e 52 65 66 3b 20 20 20 20 20 20 20  int nRef;       
6860: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6870: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 6f 69  /* Number of poi
6880: 6e 74 65 72 73 20 74 6f 20 74 68 69 73 20 73 74  nters to this st
6890: 72 75 63 74 75 72 65 20 2a 2f 0a 23 69 66 20 64  ructure */.#if d
68a0: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e  efined(SQLITE_EN
68b0: 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59  ABLE_LOCKING_STY
68c0: 4c 45 29 0a 20 20 75 6e 73 69 67 6e 65 64 20 6c  LE).  unsigned l
68d0: 6f 6e 67 20 6c 6f 6e 67 20 73 68 61 72 65 64 42  ong long sharedB
68e0: 79 74 65 3b 20 20 2f 2a 20 66 6f 72 20 41 46 50  yte;  /* for AFP
68f0: 20 73 69 6d 75 6c 61 74 65 64 20 73 68 61 72 65   simulated share
6900: 64 20 6c 6f 63 6b 20 2a 2f 0a 23 65 6e 64 69 66  d lock */.#endif
6910: 0a 20 20 73 74 72 75 63 74 20 75 6e 69 78 4c 6f  .  struct unixLo
6920: 63 6b 49 6e 66 6f 20 2a 70 4e 65 78 74 3b 20 20  ckInfo *pNext;  
6930: 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 61 6c     /* List of al
6940: 6c 20 75 6e 69 78 4c 6f 63 6b 49 6e 66 6f 20 6f  l unixLockInfo o
6950: 62 6a 65 63 74 73 20 2a 2f 0a 20 20 73 74 72 75  bjects */.  stru
6960: 63 74 20 75 6e 69 78 4c 6f 63 6b 49 6e 66 6f 20  ct unixLockInfo 
6970: 2a 70 50 72 65 76 3b 20 20 20 20 20 2f 2a 20 20  *pPrev;     /*  
6980: 20 20 2e 2e 2e 2e 20 64 6f 75 62 6c 79 20 6c 69    .... doubly li
6990: 6e 6b 65 64 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a  nked */.};../*.*
69a0: 2a 20 41 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66  * An instance of
69b0: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73   the following s
69c0: 74 72 75 63 74 75 72 65 20 69 73 20 61 6c 6c 6f  tructure is allo
69d0: 63 61 74 65 64 20 66 6f 72 20 65 61 63 68 20 6f  cated for each o
69e0: 70 65 6e 0a 2a 2a 20 69 6e 6f 64 65 2e 20 20 54  pen.** inode.  T
69f0: 68 69 73 20 73 74 72 75 63 74 75 72 65 20 6b 65  his structure ke
6a00: 65 70 73 20 74 72 61 63 6b 20 6f 66 20 74 68 65  eps track of the
6a10: 20 6e 75 6d 62 65 72 20 6f 66 20 6c 6f 63 6b 73   number of locks
6a20: 20 6f 6e 20 74 68 61 74 0a 2a 2a 20 69 6e 6f 64   on that.** inod
6a30: 65 2e 20 20 49 66 20 61 20 63 6c 6f 73 65 20 69  e.  If a close i
6a40: 73 20 61 74 74 65 6d 70 74 65 64 20 61 67 61 69  s attempted agai
6a50: 6e 73 74 20 61 6e 20 69 6e 6f 64 65 20 74 68 61  nst an inode tha
6a60: 74 20 69 73 20 68 6f 6c 64 69 6e 67 0a 2a 2a 20  t is holding.** 
6a70: 6c 6f 63 6b 73 2c 20 74 68 65 20 63 6c 6f 73 65  locks, the close
6a80: 20 69 73 20 64 65 66 65 72 72 65 64 20 75 6e 74   is deferred unt
6a90: 69 6c 20 61 6c 6c 20 6c 6f 63 6b 73 20 63 6c 65  il all locks cle
6aa0: 61 72 20 62 79 20 61 64 64 69 6e 67 20 74 68 65  ar by adding the
6ab0: 0a 2a 2a 20 66 69 6c 65 20 64 65 73 63 72 69 70  .** file descrip
6ac0: 74 6f 72 20 74 6f 20 62 65 20 63 6c 6f 73 65 64  tor to be closed
6ad0: 20 74 6f 20 74 68 65 20 70 65 6e 64 69 6e 67 20   to the pending 
6ae0: 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 54 4f 44 4f  list..**.** TODO
6af0: 3a 20 20 43 6f 6e 73 69 64 65 72 20 63 68 61 6e  :  Consider chan
6b00: 67 69 6e 67 20 74 68 69 73 20 73 6f 20 74 68 61  ging this so tha
6b10: 74 20 74 68 65 72 65 20 69 73 20 6f 6e 6c 79 20  t there is only 
6b20: 61 20 73 69 6e 67 6c 65 20 66 69 6c 65 0a 2a 2a  a single file.**
6b30: 20 64 65 73 63 72 69 70 74 6f 72 20 66 6f 72 20   descriptor for 
6b40: 65 61 63 68 20 6f 70 65 6e 20 66 69 6c 65 2c 20  each open file, 
6b50: 65 76 65 6e 20 77 68 65 6e 20 69 74 20 69 73 20  even when it is 
6b60: 6f 70 65 6e 65 64 20 6d 75 6c 74 69 70 6c 65 20  opened multiple 
6b70: 74 69 6d 65 73 2e 0a 2a 2a 20 54 68 65 20 63 6c  times..** The cl
6b80: 6f 73 65 28 29 20 73 79 73 74 65 6d 20 63 61 6c  ose() system cal
6b90: 6c 20 77 6f 75 6c 64 20 6f 6e 6c 79 20 6f 63 63  l would only occ
6ba0: 75 72 20 77 68 65 6e 20 74 68 65 20 6c 61 73 74  ur when the last
6bb0: 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 75 73 69   database.** usi
6bc0: 6e 67 20 74 68 65 20 66 69 6c 65 20 63 6c 6f 73  ng the file clos
6bd0: 65 73 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 75 6e  es..*/.struct un
6be0: 69 78 4f 70 65 6e 43 6e 74 20 7b 0a 20 20 73 74  ixOpenCnt {.  st
6bf0: 72 75 63 74 20 75 6e 69 78 46 69 6c 65 49 64 20  ruct unixFileId 
6c00: 66 69 6c 65 49 64 3b 20 20 20 2f 2a 20 54 68 65  fileId;   /* The
6c10: 20 6c 6f 6f 6b 75 70 20 6b 65 79 20 2a 2f 0a 20   lookup key */. 
6c20: 20 69 6e 74 20 6e 52 65 66 3b 20 20 20 20 20 20   int nRef;      
6c30: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
6c40: 4e 75 6d 62 65 72 20 6f 66 20 70 6f 69 6e 74 65  Number of pointe
6c50: 72 73 20 74 6f 20 74 68 69 73 20 73 74 72 75 63  rs to this struc
6c60: 74 75 72 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 4c  ture */.  int nL
6c70: 6f 63 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20  ock;            
6c80: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
6c90: 6f 66 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 6c  of outstanding l
6ca0: 6f 63 6b 73 20 2a 2f 0a 20 20 55 6e 69 78 55 6e  ocks */.  UnixUn
6cb0: 75 73 65 64 46 64 20 2a 70 55 6e 75 73 65 64 3b  usedFd *pUnused;
6cc0: 20 20 20 20 20 20 2f 2a 20 55 6e 75 73 65 64 20        /* Unused 
6cd0: 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 73  file descriptors
6ce0: 20 74 6f 20 63 6c 6f 73 65 20 2a 2f 0a 23 69 66   to close */.#if
6cf0: 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20 73 65   OS_VXWORKS.  se
6d00: 6d 5f 74 20 2a 70 53 65 6d 3b 20 20 20 20 20 20  m_t *pSem;      
6d10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
6d20: 2a 20 4e 61 6d 65 64 20 50 4f 53 49 58 20 73 65  * Named POSIX se
6d30: 6d 61 70 68 6f 72 65 20 2a 2f 0a 20 20 63 68 61  maphore */.  cha
6d40: 72 20 61 53 65 6d 4e 61 6d 65 5b 4d 41 58 5f 50  r aSemName[MAX_P
6d50: 41 54 48 4e 41 4d 45 2b 32 5d 3b 20 20 20 2f 2a  ATHNAME+2];   /*
6d60: 20 4e 61 6d 65 20 6f 66 20 74 68 61 74 20 73 65   Name of that se
6d70: 6d 61 70 68 6f 72 65 20 2a 2f 0a 23 65 6e 64 69  maphore */.#endi
6d80: 66 0a 20 20 73 74 72 75 63 74 20 75 6e 69 78 4f  f.  struct unixO
6d90: 70 65 6e 43 6e 74 20 2a 70 4e 65 78 74 2c 20 2a  penCnt *pNext, *
6da0: 70 50 72 65 76 3b 20 20 20 2f 2a 20 4c 69 73 74  pPrev;   /* List
6db0: 20 6f 66 20 61 6c 6c 20 75 6e 69 78 4f 70 65 6e   of all unixOpen
6dc0: 43 6e 74 20 6f 62 6a 65 63 74 73 20 2a 2f 0a 7d  Cnt objects */.}
6dd0: 3b 0a 0a 2f 2a 0a 2a 2a 20 4c 69 73 74 73 20 6f  ;../*.** Lists o
6de0: 66 20 61 6c 6c 20 75 6e 69 78 4c 6f 63 6b 49 6e  f all unixLockIn
6df0: 66 6f 20 61 6e 64 20 75 6e 69 78 4f 70 65 6e 43  fo and unixOpenC
6e00: 6e 74 20 6f 62 6a 65 63 74 73 2e 20 20 54 68 65  nt objects.  The
6e10: 73 65 20 75 73 65 64 20 74 6f 20 62 65 20 68 61  se used to be ha
6e20: 73 68 0a 2a 2a 20 74 61 62 6c 65 73 2e 20 20 42  sh.** tables.  B
6e30: 75 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  ut the number of
6e40: 20 6f 62 6a 65 63 74 73 20 69 73 20 72 61 72 65   objects is rare
6e50: 6c 79 20 6d 6f 72 65 20 74 68 61 6e 20 61 20 64  ly more than a d
6e60: 6f 7a 65 6e 20 61 6e 64 0a 2a 2a 20 6e 65 76 65  ozen and.** neve
6e70: 72 20 65 78 63 65 65 64 73 20 61 20 66 65 77 20  r exceeds a few 
6e80: 74 68 6f 75 73 61 6e 64 2e 20 20 41 6e 64 20 6c  thousand.  And l
6e90: 6f 6f 6b 75 70 20 69 73 20 6e 6f 74 20 6f 6e 20  ookup is not on 
6ea0: 61 20 63 72 69 74 69 63 61 6c 0a 2a 2a 20 70 61  a critical.** pa
6eb0: 74 68 20 73 6f 20 61 20 73 69 6d 70 6c 65 20 6c  th so a simple l
6ec0: 69 6e 6b 65 64 20 6c 69 73 74 20 77 69 6c 6c 20  inked list will 
6ed0: 73 75 66 66 69 63 65 2e 0a 2a 2f 0a 73 74 61 74  suffice..*/.stat
6ee0: 69 63 20 73 74 72 75 63 74 20 75 6e 69 78 4c 6f  ic struct unixLo
6ef0: 63 6b 49 6e 66 6f 20 2a 6c 6f 63 6b 4c 69 73 74  ckInfo *lockList
6f00: 20 3d 20 30 3b 0a 73 74 61 74 69 63 20 73 74 72   = 0;.static str
6f10: 75 63 74 20 75 6e 69 78 4f 70 65 6e 43 6e 74 20  uct unixOpenCnt 
6f20: 2a 6f 70 65 6e 4c 69 73 74 20 3d 20 30 3b 0a 0a  *openList = 0;..
6f30: 2f 2a 0a 2a 2a 20 54 68 69 73 20 76 61 72 69 61  /*.** This varia
6f40: 62 6c 65 20 72 65 6d 65 6d 62 65 72 73 20 77 68  ble remembers wh
6f50: 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 74 68 72  ether or not thr
6f60: 65 61 64 73 20 63 61 6e 20 6f 76 65 72 72 69 64  eads can overrid
6f70: 65 20 65 61 63 68 20 6f 74 68 65 72 73 0a 2a 2a  e each others.**
6f80: 20 6c 6f 63 6b 73 2e 0a 2a 2a 0a 2a 2a 20 20 20   locks..**.**   
6f90: 20 30 3a 20 20 4e 6f 2e 20 20 54 68 72 65 61 64   0:  No.  Thread
6fa0: 73 20 63 61 6e 6e 6f 74 20 6f 76 65 72 72 69 64  s cannot overrid
6fb0: 65 20 65 61 63 68 20 6f 74 68 65 72 73 20 6c 6f  e each others lo
6fc0: 63 6b 73 2e 20 20 28 4c 69 6e 75 78 54 68 72 65  cks.  (LinuxThre
6fd0: 61 64 73 29 0a 2a 2a 20 20 20 20 31 3a 20 20 59  ads).**    1:  Y
6fe0: 65 73 2e 20 20 54 68 72 65 61 64 73 20 63 61 6e  es.  Threads can
6ff0: 20 6f 76 65 72 72 69 64 65 20 65 61 63 68 20 6f   override each o
7000: 74 68 65 72 73 20 6c 6f 63 6b 73 2e 20 20 28 50  thers locks.  (P
7010: 6f 73 69 78 20 26 20 4e 4c 50 54 29 0a 2a 2a 20  osix & NLPT).** 
7020: 20 20 2d 31 3a 20 20 57 65 20 64 6f 6e 27 74 20    -1:  We don't 
7030: 6b 6e 6f 77 20 79 65 74 2e 0a 2a 2a 0a 2a 2a 20  know yet..**.** 
7040: 4f 6e 20 73 6f 6d 65 20 73 79 73 74 65 6d 73 2c  On some systems,
7050: 20 77 65 20 6b 6e 6f 77 20 61 74 20 63 6f 6d 70   we know at comp
7060: 69 6c 65 2d 74 69 6d 65 20 69 66 20 74 68 72 65  ile-time if thre
7070: 61 64 73 20 63 61 6e 20 6f 76 65 72 72 69 64 65  ads can override
7080: 20 65 61 63 68 0a 2a 2a 20 6f 74 68 65 72 73 20   each.** others 
7090: 6c 6f 63 6b 73 2e 20 20 4f 6e 20 74 68 6f 73 65  locks.  On those
70a0: 20 73 79 73 74 65 6d 73 2c 20 74 68 65 20 53 51   systems, the SQ
70b0: 4c 49 54 45 5f 54 48 52 45 41 44 5f 4f 56 45 52  LITE_THREAD_OVER
70c0: 52 49 44 45 5f 4c 4f 43 4b 20 6d 61 63 72 6f 0a  RIDE_LOCK macro.
70d0: 2a 2a 20 77 69 6c 6c 20 62 65 20 73 65 74 20 61  ** will be set a
70e0: 70 70 72 6f 70 72 69 61 74 65 6c 79 2e 20 20 4f  ppropriately.  O
70f0: 6e 20 6f 74 68 65 72 20 73 79 73 74 65 6d 73 2c  n other systems,
7100: 20 77 65 20 68 61 76 65 20 74 6f 20 63 68 65 63   we have to chec
7110: 6b 20 61 74 0a 2a 2a 20 72 75 6e 74 69 6d 65 2e  k at.** runtime.
7120: 20 20 4f 6e 20 74 68 65 73 65 20 6c 61 74 74 65    On these latte
7130: 72 20 73 79 73 74 65 6d 73 2c 20 53 51 4c 54 49  r systems, SQLTI
7140: 45 5f 54 48 52 45 41 44 5f 4f 56 45 52 52 49 44  E_THREAD_OVERRID
7150: 45 5f 4c 4f 43 4b 20 69 73 0a 2a 2a 20 75 6e 64  E_LOCK is.** und
7160: 65 66 69 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68  efined..**.** Th
7170: 69 73 20 76 61 72 69 61 62 6c 65 20 6e 6f 72 6d  is variable norm
7180: 61 6c 6c 79 20 68 61 73 20 66 69 6c 65 20 73 63  ally has file sc
7190: 6f 70 65 20 6f 6e 6c 79 2e 20 20 42 75 74 20 64  ope only.  But d
71a0: 75 72 69 6e 67 20 74 65 73 74 69 6e 67 2c 20 77  uring testing, w
71b0: 65 20 6d 61 6b 65 0a 2a 2a 20 69 74 20 61 20 67  e make.** it a g
71c0: 6c 6f 62 61 6c 20 73 6f 20 74 68 61 74 20 74 68  lobal so that th
71d0: 65 20 74 65 73 74 20 63 6f 64 65 20 63 61 6e 20  e test code can 
71e0: 63 68 61 6e 67 65 20 69 74 73 20 76 61 6c 75 65  change its value
71f0: 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 76 65 72   in order to ver
7200: 69 66 79 0a 2a 2a 20 74 68 61 74 20 74 68 65 20  ify.** that the 
7210: 72 69 67 68 74 20 73 74 75 66 66 20 68 61 70 70  right stuff happ
7220: 65 6e 73 20 69 6e 20 65 69 74 68 65 72 20 63 61  ens in either ca
7230: 73 65 2e 0a 2a 2f 0a 23 69 66 20 53 51 4c 49 54  se..*/.#if SQLIT
7240: 45 5f 54 48 52 45 41 44 53 41 46 45 20 26 26 20  E_THREADSAFE && 
7250: 64 65 66 69 6e 65 64 28 5f 5f 6c 69 6e 75 78 5f  defined(__linux_
7260: 5f 29 0a 23 20 20 69 66 6e 64 65 66 20 53 51 4c  _).#  ifndef SQL
7270: 49 54 45 5f 54 48 52 45 41 44 5f 4f 56 45 52 52  ITE_THREAD_OVERR
7280: 49 44 45 5f 4c 4f 43 4b 0a 23 20 20 20 20 64 65  IDE_LOCK.#    de
7290: 66 69 6e 65 20 53 51 4c 49 54 45 5f 54 48 52 45  fine SQLITE_THRE
72a0: 41 44 5f 4f 56 45 52 52 49 44 45 5f 4c 4f 43 4b  AD_OVERRIDE_LOCK
72b0: 20 2d 31 0a 23 20 20 65 6e 64 69 66 0a 23 20 20   -1.#  endif.#  
72c0: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53  ifdef SQLITE_TES
72d0: 54 0a 69 6e 74 20 74 68 72 65 61 64 73 4f 76 65  T.int threadsOve
72e0: 72 72 69 64 65 45 61 63 68 4f 74 68 65 72 73 4c  rrideEachOthersL
72f0: 6f 63 6b 73 20 3d 20 53 51 4c 49 54 45 5f 54 48  ocks = SQLITE_TH
7300: 52 45 41 44 5f 4f 56 45 52 52 49 44 45 5f 4c 4f  READ_OVERRIDE_LO
7310: 43 4b 3b 0a 23 20 20 65 6c 73 65 0a 73 74 61 74  CK;.#  else.stat
7320: 69 63 20 69 6e 74 20 74 68 72 65 61 64 73 4f 76  ic int threadsOv
7330: 65 72 72 69 64 65 45 61 63 68 4f 74 68 65 72 73  errideEachOthers
7340: 4c 6f 63 6b 73 20 3d 20 53 51 4c 49 54 45 5f 54  Locks = SQLITE_T
7350: 48 52 45 41 44 5f 4f 56 45 52 52 49 44 45 5f 4c  HREAD_OVERRIDE_L
7360: 4f 43 4b 3b 0a 23 20 20 65 6e 64 69 66 0a 23 65  OCK;.#  endif.#e
7370: 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  ndif../*.** This
7380: 20 73 74 72 75 63 74 75 72 65 20 68 6f 6c 64 73   structure holds
7390: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 70 61 73   information pas
73a0: 73 65 64 20 69 6e 74 6f 20 69 6e 64 69 76 69 64  sed into individ
73b0: 75 61 6c 20 74 65 73 74 0a 2a 2a 20 74 68 72 65  ual test.** thre
73c0: 61 64 73 20 62 79 20 74 68 65 20 74 65 73 74 54  ads by the testT
73d0: 68 72 65 61 64 4c 6f 63 6b 69 6e 67 42 65 68 61  hreadLockingBeha
73e0: 76 69 6f 72 28 29 20 72 6f 75 74 69 6e 65 2e 0a  vior() routine..
73f0: 2a 2f 0a 73 74 72 75 63 74 20 74 68 72 65 61 64  */.struct thread
7400: 54 65 73 74 44 61 74 61 20 7b 0a 20 20 69 6e 74  TestData {.  int
7410: 20 66 64 3b 20 20 20 20 20 20 20 20 20 20 20 20   fd;            
7420: 20 20 20 20 2f 2a 20 46 69 6c 65 20 74 6f 20 62      /* File to b
7430: 65 20 6c 6f 63 6b 65 64 20 2a 2f 0a 20 20 73 74  e locked */.  st
7440: 72 75 63 74 20 66 6c 6f 63 6b 20 6c 6f 63 6b 3b  ruct flock lock;
7450: 20 20 20 20 20 2f 2a 20 54 68 65 20 6c 6f 63 6b       /* The lock
7460: 69 6e 67 20 6f 70 65 72 61 74 69 6f 6e 20 2a 2f  ing operation */
7470: 0a 20 20 69 6e 74 20 72 65 73 75 6c 74 3b 20 20  .  int result;  
7480: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73            /* Res
7490: 75 6c 74 20 6f 66 20 74 68 65 20 6c 6f 63 6b 69  ult of the locki
74a0: 6e 67 20 6f 70 65 72 61 74 69 6f 6e 20 2a 2f 0a  ng operation */.
74b0: 7d 3b 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 54  };..#if SQLITE_T
74c0: 48 52 45 41 44 53 41 46 45 20 26 26 20 64 65 66  HREADSAFE && def
74d0: 69 6e 65 64 28 5f 5f 6c 69 6e 75 78 5f 5f 29 0a  ined(__linux__).
74e0: 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
74f0: 69 6f 6e 20 69 73 20 75 73 65 64 20 61 73 20 74  ion is used as t
7500: 68 65 20 6d 61 69 6e 20 72 6f 75 74 69 6e 65 20  he main routine 
7510: 66 6f 72 20 61 20 74 68 72 65 61 64 20 6c 61 75  for a thread lau
7520: 6e 63 68 65 64 20 62 79 0a 2a 2a 20 74 65 73 74  nched by.** test
7530: 54 68 72 65 61 64 4c 6f 63 6b 69 6e 67 42 65 68  ThreadLockingBeh
7540: 61 76 69 6f 72 28 29 2e 20 49 74 20 74 65 73 74  avior(). It test
7550: 73 20 77 68 65 74 68 65 72 20 74 68 65 20 73 68  s whether the sh
7560: 61 72 65 64 2d 6c 6f 63 6b 20 6f 62 74 61 69 6e  ared-lock obtain
7570: 65 64 0a 2a 2a 20 62 79 20 74 68 65 20 6d 61 69  ed.** by the mai
7580: 6e 20 74 68 72 65 61 64 20 69 6e 20 74 65 73 74  n thread in test
7590: 54 68 72 65 61 64 4c 6f 63 6b 69 6e 67 42 65 68  ThreadLockingBeh
75a0: 61 76 69 6f 72 28 29 20 63 6f 6e 66 6c 69 63 74  avior() conflict
75b0: 73 20 77 69 74 68 20 61 0a 2a 2a 20 68 79 70 6f  s with a.** hypo
75c0: 74 68 65 74 69 63 61 6c 20 77 72 69 74 65 2d 6c  thetical write-l
75d0: 6f 63 6b 20 6f 62 74 61 69 6e 65 64 20 62 79 20  ock obtained by 
75e0: 74 68 69 73 20 74 68 72 65 61 64 20 6f 6e 20 74  this thread on t
75f0: 68 65 20 73 61 6d 65 20 66 69 6c 65 2e 0a 2a 2a  he same file..**
7600: 0a 2a 2a 20 54 68 65 20 77 72 69 74 65 2d 6c 6f  .** The write-lo
7610: 63 6b 20 69 73 20 6e 6f 74 20 61 63 74 75 61 6c  ck is not actual
7620: 6c 79 20 61 63 71 75 69 72 65 64 2c 20 61 73 20  ly acquired, as 
7630: 74 68 69 73 20 69 73 20 6e 6f 74 20 70 6f 73 73  this is not poss
7640: 69 62 6c 65 20 69 66 20 0a 2a 2a 20 74 68 65 20  ible if .** the 
7650: 66 69 6c 65 20 69 73 20 6f 70 65 6e 20 69 6e 20  file is open in 
7660: 72 65 61 64 2d 6f 6e 6c 79 20 6d 6f 64 65 20 28  read-only mode (
7670: 73 65 65 20 74 69 63 6b 65 74 20 23 33 34 37 32  see ticket #3472
7680: 29 2e 0a 2a 2f 20 0a 73 74 61 74 69 63 20 76 6f  )..*/ .static vo
7690: 69 64 20 2a 74 68 72 65 61 64 4c 6f 63 6b 69 6e  id *threadLockin
76a0: 67 54 65 73 74 28 76 6f 69 64 20 2a 70 41 72 67  gTest(void *pArg
76b0: 29 7b 0a 20 20 73 74 72 75 63 74 20 74 68 72 65  ){.  struct thre
76c0: 61 64 54 65 73 74 44 61 74 61 20 2a 70 44 61 74  adTestData *pDat
76d0: 61 20 3d 20 28 73 74 72 75 63 74 20 74 68 72 65  a = (struct thre
76e0: 61 64 54 65 73 74 44 61 74 61 2a 29 70 41 72 67  adTestData*)pArg
76f0: 3b 0a 20 20 70 44 61 74 61 2d 3e 72 65 73 75 6c  ;.  pData->resul
7700: 74 20 3d 20 66 63 6e 74 6c 28 70 44 61 74 61 2d  t = fcntl(pData-
7710: 3e 66 64 2c 20 46 5f 47 45 54 4c 4b 2c 20 26 70  >fd, F_GETLK, &p
7720: 44 61 74 61 2d 3e 6c 6f 63 6b 29 3b 0a 20 20 72  Data->lock);.  r
7730: 65 74 75 72 6e 20 70 41 72 67 3b 0a 7d 0a 23 65  eturn pArg;.}.#e
7740: 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 54  ndif /* SQLITE_T
7750: 48 52 45 41 44 53 41 46 45 20 26 26 20 64 65 66  HREADSAFE && def
7760: 69 6e 65 64 28 5f 5f 6c 69 6e 75 78 5f 5f 29 20  ined(__linux__) 
7770: 2a 2f 0a 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f  */...#if SQLITE_
7780: 54 48 52 45 41 44 53 41 46 45 20 26 26 20 64 65  THREADSAFE && de
7790: 66 69 6e 65 64 28 5f 5f 6c 69 6e 75 78 5f 5f 29  fined(__linux__)
77a0: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 70 72 6f 63  ./*.** This proc
77b0: 65 64 75 72 65 20 61 74 74 65 6d 70 74 73 20 74  edure attempts t
77c0: 6f 20 64 65 74 65 72 6d 69 6e 65 20 77 68 65 74  o determine whet
77d0: 68 65 72 20 6f 72 20 6e 6f 74 20 74 68 72 65 61  her or not threa
77e0: 64 73 0a 2a 2a 20 63 61 6e 20 6f 76 65 72 72 69  ds.** can overri
77f0: 64 65 20 65 61 63 68 20 6f 74 68 65 72 73 20 6c  de each others l
7800: 6f 63 6b 73 20 74 68 65 6e 20 73 65 74 73 20 74  ocks then sets t
7810: 68 65 20 0a 2a 2a 20 74 68 72 65 61 64 73 4f 76  he .** threadsOv
7820: 65 72 72 69 64 65 45 61 63 68 4f 74 68 65 72 73  errideEachOthers
7830: 4c 6f 63 6b 73 20 76 61 72 69 61 62 6c 65 20 61  Locks variable a
7840: 70 70 72 6f 70 72 69 61 74 65 6c 79 2e 0a 2a 2f  ppropriately..*/
7850: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 74 65 73  .static void tes
7860: 74 54 68 72 65 61 64 4c 6f 63 6b 69 6e 67 42 65  tThreadLockingBe
7870: 68 61 76 69 6f 72 28 69 6e 74 20 66 64 5f 6f 72  havior(int fd_or
7880: 69 67 29 7b 0a 20 20 69 6e 74 20 66 64 3b 0a 20  ig){.  int fd;. 
7890: 20 69 6e 74 20 72 63 3b 0a 20 20 73 74 72 75 63   int rc;.  struc
78a0: 74 20 74 68 72 65 61 64 54 65 73 74 44 61 74 61  t threadTestData
78b0: 20 64 3b 0a 20 20 73 74 72 75 63 74 20 66 6c 6f   d;.  struct flo
78c0: 63 6b 20 6c 3b 0a 20 20 70 74 68 72 65 61 64 5f  ck l;.  pthread_
78d0: 74 20 74 3b 0a 0a 20 20 66 64 20 3d 20 64 75 70  t t;..  fd = dup
78e0: 28 66 64 5f 6f 72 69 67 29 3b 0a 20 20 69 66 28  (fd_orig);.  if(
78f0: 20 66 64 3c 30 20 29 20 72 65 74 75 72 6e 3b 0a   fd<0 ) return;.
7900: 20 20 6d 65 6d 73 65 74 28 26 6c 2c 20 30 2c 20    memset(&l, 0, 
7910: 73 69 7a 65 6f 66 28 6c 29 29 3b 0a 20 20 6c 2e  sizeof(l));.  l.
7920: 6c 5f 74 79 70 65 20 3d 20 46 5f 52 44 4c 43 4b  l_type = F_RDLCK
7930: 3b 0a 20 20 6c 2e 6c 5f 6c 65 6e 20 3d 20 31 3b  ;.  l.l_len = 1;
7940: 0a 20 20 6c 2e 6c 5f 73 74 61 72 74 20 3d 20 30  .  l.l_start = 0
7950: 3b 0a 20 20 6c 2e 6c 5f 77 68 65 6e 63 65 20 3d  ;.  l.l_whence =
7960: 20 53 45 45 4b 5f 53 45 54 3b 0a 20 20 72 63 20   SEEK_SET;.  rc 
7970: 3d 20 66 63 6e 74 6c 28 66 64 5f 6f 72 69 67 2c  = fcntl(fd_orig,
7980: 20 46 5f 53 45 54 4c 4b 2c 20 26 6c 29 3b 0a 20   F_SETLK, &l);. 
7990: 20 69 66 28 20 72 63 21 3d 30 20 29 20 72 65 74   if( rc!=0 ) ret
79a0: 75 72 6e 3b 0a 20 20 6d 65 6d 73 65 74 28 26 64  urn;.  memset(&d
79b0: 2c 20 30 2c 20 73 69 7a 65 6f 66 28 64 29 29 3b  , 0, sizeof(d));
79c0: 0a 20 20 64 2e 66 64 20 3d 20 66 64 3b 0a 20 20  .  d.fd = fd;.  
79d0: 64 2e 6c 6f 63 6b 20 3d 20 6c 3b 0a 20 20 64 2e  d.lock = l;.  d.
79e0: 6c 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d 20 46 5f  lock.l_type = F_
79f0: 57 52 4c 43 4b 3b 0a 20 20 69 66 28 20 70 74 68  WRLCK;.  if( pth
7a00: 72 65 61 64 5f 63 72 65 61 74 65 28 26 74 2c 20  read_create(&t, 
7a10: 30 2c 20 74 68 72 65 61 64 4c 6f 63 6b 69 6e 67  0, threadLocking
7a20: 54 65 73 74 2c 20 26 64 29 3d 3d 30 20 29 7b 0a  Test, &d)==0 ){.
7a30: 20 20 20 20 70 74 68 72 65 61 64 5f 6a 6f 69 6e      pthread_join
7a40: 28 74 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 63 6c  (t, 0);.  }.  cl
7a50: 6f 73 65 28 66 64 29 3b 0a 20 20 69 66 28 20 64  ose(fd);.  if( d
7a60: 2e 72 65 73 75 6c 74 21 3d 30 20 29 20 72 65 74  .result!=0 ) ret
7a70: 75 72 6e 3b 0a 20 20 74 68 72 65 61 64 73 4f 76  urn;.  threadsOv
7a80: 65 72 72 69 64 65 45 61 63 68 4f 74 68 65 72 73  errideEachOthers
7a90: 4c 6f 63 6b 73 20 3d 20 28 64 2e 6c 6f 63 6b 2e  Locks = (d.lock.
7aa0: 6c 5f 74 79 70 65 3d 3d 46 5f 55 4e 4c 43 4b 29  l_type==F_UNLCK)
7ab0: 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  ;.}.#endif /* SQ
7ac0: 4c 49 54 45 5f 54 48 52 45 41 44 53 41 46 45 20  LITE_THREADSAFE 
7ad0: 26 26 20 64 65 66 69 6e 65 64 28 5f 5f 6c 69 6e  && defined(__lin
7ae0: 75 78 5f 5f 29 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  ux__) */../*.** 
7af0: 52 65 6c 65 61 73 65 20 61 20 75 6e 69 78 4c 6f  Release a unixLo
7b00: 63 6b 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65  ckInfo structure
7b10: 20 70 72 65 76 69 6f 75 73 6c 79 20 61 6c 6c 6f   previously allo
7b20: 63 61 74 65 64 20 62 79 20 66 69 6e 64 4c 6f 63  cated by findLoc
7b30: 6b 49 6e 66 6f 28 29 2e 0a 2a 2a 0a 2a 2a 20 54  kInfo()..**.** T
7b40: 68 65 20 6d 75 74 65 78 20 65 6e 74 65 72 65 64  he mutex entered
7b50: 20 75 73 69 6e 67 20 74 68 65 20 75 6e 69 78 45   using the unixE
7b60: 6e 74 65 72 4d 75 74 65 78 28 29 20 66 75 6e 63  nterMutex() func
7b70: 74 69 6f 6e 20 6d 75 73 74 20 62 65 20 68 65 6c  tion must be hel
7b80: 64 0a 2a 2a 20 77 68 65 6e 20 74 68 69 73 20 66  d.** when this f
7b90: 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65  unction is calle
7ba0: 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  d..*/.static voi
7bb0: 64 20 72 65 6c 65 61 73 65 4c 6f 63 6b 49 6e 66  d releaseLockInf
7bc0: 6f 28 73 74 72 75 63 74 20 75 6e 69 78 4c 6f 63  o(struct unixLoc
7bd0: 6b 49 6e 66 6f 20 2a 70 4c 6f 63 6b 29 7b 0a 20  kInfo *pLock){. 
7be0: 20 61 73 73 65 72 74 28 20 75 6e 69 78 4d 75 74   assert( unixMut
7bf0: 65 78 48 65 6c 64 28 29 20 29 3b 0a 20 20 69 66  exHeld() );.  if
7c00: 28 20 70 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 70  ( pLock ){.    p
7c10: 4c 6f 63 6b 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20  Lock->nRef--;.  
7c20: 20 20 69 66 28 20 70 4c 6f 63 6b 2d 3e 6e 52 65    if( pLock->nRe
7c30: 66 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66  f==0 ){.      if
7c40: 28 20 70 4c 6f 63 6b 2d 3e 70 50 72 65 76 20 29  ( pLock->pPrev )
7c50: 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  {.        assert
7c60: 28 20 70 4c 6f 63 6b 2d 3e 70 50 72 65 76 2d 3e  ( pLock->pPrev->
7c70: 70 4e 65 78 74 3d 3d 70 4c 6f 63 6b 20 29 3b 0a  pNext==pLock );.
7c80: 20 20 20 20 20 20 20 20 70 4c 6f 63 6b 2d 3e 70          pLock->p
7c90: 50 72 65 76 2d 3e 70 4e 65 78 74 20 3d 20 70 4c  Prev->pNext = pL
7ca0: 6f 63 6b 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20  ock->pNext;.    
7cb0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
7cc0: 20 61 73 73 65 72 74 28 20 6c 6f 63 6b 4c 69 73   assert( lockLis
7cd0: 74 3d 3d 70 4c 6f 63 6b 20 29 3b 0a 20 20 20 20  t==pLock );.    
7ce0: 20 20 20 20 6c 6f 63 6b 4c 69 73 74 20 3d 20 70      lockList = p
7cf0: 4c 6f 63 6b 2d 3e 70 4e 65 78 74 3b 0a 20 20 20  Lock->pNext;.   
7d00: 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70     }.      if( p
7d10: 4c 6f 63 6b 2d 3e 70 4e 65 78 74 20 29 7b 0a 20  Lock->pNext ){. 
7d20: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
7d30: 4c 6f 63 6b 2d 3e 70 4e 65 78 74 2d 3e 70 50 72  Lock->pNext->pPr
7d40: 65 76 3d 3d 70 4c 6f 63 6b 20 29 3b 0a 20 20 20  ev==pLock );.   
7d50: 20 20 20 20 20 70 4c 6f 63 6b 2d 3e 70 4e 65 78       pLock->pNex
7d60: 74 2d 3e 70 50 72 65 76 20 3d 20 70 4c 6f 63 6b  t->pPrev = pLock
7d70: 2d 3e 70 50 72 65 76 3b 0a 20 20 20 20 20 20 7d  ->pPrev;.      }
7d80: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66  .      sqlite3_f
7d90: 72 65 65 28 70 4c 6f 63 6b 29 3b 0a 20 20 20 20  ree(pLock);.    
7da0: 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  }.  }.}../*.** R
7db0: 65 6c 65 61 73 65 20 61 20 75 6e 69 78 4f 70 65  elease a unixOpe
7dc0: 6e 43 6e 74 20 73 74 72 75 63 74 75 72 65 20 70  nCnt structure p
7dd0: 72 65 76 69 6f 75 73 6c 79 20 61 6c 6c 6f 63 61  reviously alloca
7de0: 74 65 64 20 62 79 20 66 69 6e 64 4c 6f 63 6b 49  ted by findLockI
7df0: 6e 66 6f 28 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  nfo()..**.** The
7e00: 20 6d 75 74 65 78 20 65 6e 74 65 72 65 64 20 75   mutex entered u
7e10: 73 69 6e 67 20 74 68 65 20 75 6e 69 78 45 6e 74  sing the unixEnt
7e20: 65 72 4d 75 74 65 78 28 29 20 66 75 6e 63 74 69  erMutex() functi
7e30: 6f 6e 20 6d 75 73 74 20 62 65 20 68 65 6c 64 0a  on must be held.
7e40: 2a 2a 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e  ** when this fun
7e50: 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2e  ction is called.
7e60: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
7e70: 72 65 6c 65 61 73 65 4f 70 65 6e 43 6e 74 28 73  releaseOpenCnt(s
7e80: 74 72 75 63 74 20 75 6e 69 78 4f 70 65 6e 43 6e  truct unixOpenCn
7e90: 74 20 2a 70 4f 70 65 6e 29 7b 0a 20 20 61 73 73  t *pOpen){.  ass
7ea0: 65 72 74 28 20 75 6e 69 78 4d 75 74 65 78 48 65  ert( unixMutexHe
7eb0: 6c 64 28 29 20 29 3b 0a 20 20 69 66 28 20 70 4f  ld() );.  if( pO
7ec0: 70 65 6e 20 29 7b 0a 20 20 20 20 70 4f 70 65 6e  pen ){.    pOpen
7ed0: 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20 20 20 69 66  ->nRef--;.    if
7ee0: 28 20 70 4f 70 65 6e 2d 3e 6e 52 65 66 3d 3d 30  ( pOpen->nRef==0
7ef0: 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 4f   ){.      if( pO
7f00: 70 65 6e 2d 3e 70 50 72 65 76 20 29 7b 0a 20 20  pen->pPrev ){.  
7f10: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4f        assert( pO
7f20: 70 65 6e 2d 3e 70 50 72 65 76 2d 3e 70 4e 65 78  pen->pPrev->pNex
7f30: 74 3d 3d 70 4f 70 65 6e 20 29 3b 0a 20 20 20 20  t==pOpen );.    
7f40: 20 20 20 20 70 4f 70 65 6e 2d 3e 70 50 72 65 76      pOpen->pPrev
7f50: 2d 3e 70 4e 65 78 74 20 3d 20 70 4f 70 65 6e 2d  ->pNext = pOpen-
7f60: 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d 65  >pNext;.      }e
7f70: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 61 73 73  lse{.        ass
7f80: 65 72 74 28 20 6f 70 65 6e 4c 69 73 74 3d 3d 70  ert( openList==p
7f90: 4f 70 65 6e 20 29 3b 0a 20 20 20 20 20 20 20 20  Open );.        
7fa0: 6f 70 65 6e 4c 69 73 74 20 3d 20 70 4f 70 65 6e  openList = pOpen
7fb0: 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d  ->pNext;.      }
7fc0: 0a 20 20 20 20 20 20 69 66 28 20 70 4f 70 65 6e  .      if( pOpen
7fd0: 2d 3e 70 4e 65 78 74 20 29 7b 0a 20 20 20 20 20  ->pNext ){.     
7fe0: 20 20 20 61 73 73 65 72 74 28 20 70 4f 70 65 6e     assert( pOpen
7ff0: 2d 3e 70 4e 65 78 74 2d 3e 70 50 72 65 76 3d 3d  ->pNext->pPrev==
8000: 70 4f 70 65 6e 20 29 3b 0a 20 20 20 20 20 20 20  pOpen );.       
8010: 20 70 4f 70 65 6e 2d 3e 70 4e 65 78 74 2d 3e 70   pOpen->pNext->p
8020: 50 72 65 76 20 3d 20 70 4f 70 65 6e 2d 3e 70 50  Prev = pOpen->pP
8030: 72 65 76 3b 0a 20 20 20 20 20 20 7d 0a 23 69 66  rev;.      }.#if
8040: 20 53 51 4c 49 54 45 5f 54 48 52 45 41 44 53 41   SQLITE_THREADSA
8050: 46 45 20 26 26 20 64 65 66 69 6e 65 64 28 5f 5f  FE && defined(__
8060: 6c 69 6e 75 78 5f 5f 29 0a 20 20 20 20 20 20 61  linux__).      a
8070: 73 73 65 72 74 28 20 21 70 4f 70 65 6e 2d 3e 70  ssert( !pOpen->p
8080: 55 6e 75 73 65 64 20 7c 7c 20 74 68 72 65 61 64  Unused || thread
8090: 73 4f 76 65 72 72 69 64 65 45 61 63 68 4f 74 68  sOverrideEachOth
80a0: 65 72 73 4c 6f 63 6b 73 3d 3d 30 20 29 3b 0a 23  ersLocks==0 );.#
80b0: 65 6e 64 69 66 0a 0a 20 20 20 20 20 20 2f 2a 20  endif..      /* 
80c0: 49 66 20 70 4f 70 65 6e 2d 3e 70 55 6e 75 73 65  If pOpen->pUnuse
80d0: 64 20 69 73 20 6e 6f 74 20 6e 75 6c 6c 2c 20 74  d is not null, t
80e0: 68 65 6e 20 6d 65 6d 6f 72 79 20 61 6e 64 20 66  hen memory and f
80f0: 69 6c 65 2d 64 65 73 63 72 69 70 74 6f 72 73 0a  ile-descriptors.
8100: 20 20 20 20 20 20 2a 2a 20 61 72 65 20 6c 65 61        ** are lea
8110: 6b 65 64 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20  ked..      **.  
8120: 20 20 20 20 2a 2a 20 54 68 69 73 20 77 69 6c 6c      ** This will
8130: 20 6f 6e 6c 79 20 68 61 70 70 65 6e 20 69 66 2c   only happen if,
8140: 20 75 6e 64 65 72 20 4c 69 6e 75 78 74 68 72 65   under Linuxthre
8150: 61 64 73 2c 20 74 68 65 20 75 73 65 72 20 68 61  ads, the user ha
8160: 73 20 6f 70 65 6e 65 64 0a 20 20 20 20 20 20 2a  s opened.      *
8170: 2a 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  * a transaction 
8180: 69 6e 20 6f 6e 65 20 74 68 72 65 61 64 2c 20 74  in one thread, t
8190: 68 65 6e 20 61 74 74 65 6d 70 74 73 20 74 6f 20  hen attempts to 
81a0: 63 6c 6f 73 65 20 74 68 65 20 64 61 74 61 62 61  close the databa
81b0: 73 65 0a 20 20 20 20 20 20 2a 2a 20 68 61 6e 64  se.      ** hand
81c0: 6c 65 20 66 72 6f 6d 20 61 6e 6f 74 68 65 72 20  le from another 
81d0: 74 68 72 65 61 64 20 28 77 69 74 68 6f 75 74 20  thread (without 
81e0: 66 69 72 73 74 20 75 6e 6c 6f 63 6b 69 6e 67 20  first unlocking 
81f0: 74 68 65 20 64 62 20 66 69 6c 65 29 2e 0a 20 20  the db file)..  
8200: 20 20 20 20 2a 2a 20 54 68 69 73 20 69 73 20 61      ** This is a
8210: 20 6d 69 73 75 73 65 2e 20 20 2a 2f 0a 20 20 20   misuse.  */.   
8220: 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
8230: 70 4f 70 65 6e 29 3b 0a 20 20 20 20 7d 0a 20 20  pOpen);.    }.  
8240: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e  }.}../*.** Given
8250: 20 61 20 66 69 6c 65 20 64 65 73 63 72 69 70 74   a file descript
8260: 6f 72 2c 20 6c 6f 63 61 74 65 20 75 6e 69 78 4c  or, locate unixL
8270: 6f 63 6b 49 6e 66 6f 20 61 6e 64 20 75 6e 69 78  ockInfo and unix
8280: 4f 70 65 6e 43 6e 74 20 73 74 72 75 63 74 75 72  OpenCnt structur
8290: 65 73 20 74 68 61 74 0a 2a 2a 20 64 65 73 63 72  es that.** descr
82a0: 69 62 65 73 20 74 68 61 74 20 66 69 6c 65 20 64  ibes that file d
82b0: 65 73 63 72 69 70 74 6f 72 2e 20 20 43 72 65 61  escriptor.  Crea
82c0: 74 65 20 6e 65 77 20 6f 6e 65 73 20 69 66 20 6e  te new ones if n
82d0: 65 63 65 73 73 61 72 79 2e 20 20 54 68 65 0a 2a  ecessary.  The.*
82e0: 2a 20 72 65 74 75 72 6e 20 76 61 6c 75 65 73 20  * return values 
82f0: 6d 69 67 68 74 20 62 65 20 75 6e 69 6e 69 74 69  might be uniniti
8300: 61 6c 69 7a 65 64 20 69 66 20 61 6e 20 65 72 72  alized if an err
8310: 6f 72 20 6f 63 63 75 72 73 2e 0a 2a 2a 0a 2a 2a  or occurs..**.**
8320: 20 54 68 65 20 6d 75 74 65 78 20 65 6e 74 65 72   The mutex enter
8330: 65 64 20 75 73 69 6e 67 20 74 68 65 20 75 6e 69  ed using the uni
8340: 78 45 6e 74 65 72 4d 75 74 65 78 28 29 20 66 75  xEnterMutex() fu
8350: 6e 63 74 69 6f 6e 20 6d 75 73 74 20 62 65 20 68  nction must be h
8360: 65 6c 64 0a 2a 2a 20 77 68 65 6e 20 74 68 69 73  eld.** when this
8370: 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c   function is cal
8380: 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72  led..**.** Retur
8390: 6e 20 61 6e 20 61 70 70 72 6f 70 72 69 61 74 65  n an appropriate
83a0: 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a 2a 2f 0a   error code..*/.
83b0: 73 74 61 74 69 63 20 69 6e 74 20 66 69 6e 64 4c  static int findL
83c0: 6f 63 6b 49 6e 66 6f 28 0a 20 20 75 6e 69 78 46  ockInfo(.  unixF
83d0: 69 6c 65 20 2a 70 46 69 6c 65 2c 20 20 20 20 20  ile *pFile,     
83e0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55 6e 69            /* Uni
83f0: 78 20 66 69 6c 65 20 77 69 74 68 20 66 69 6c 65  x file with file
8400: 20 64 65 73 63 20 75 73 65 64 20 69 6e 20 74 68   desc used in th
8410: 65 20 6b 65 79 20 2a 2f 0a 20 20 73 74 72 75 63  e key */.  struc
8420: 74 20 75 6e 69 78 4c 6f 63 6b 49 6e 66 6f 20 2a  t unixLockInfo *
8430: 2a 70 70 4c 6f 63 6b 2c 20 20 2f 2a 20 52 65 74  *ppLock,  /* Ret
8440: 75 72 6e 20 74 68 65 20 75 6e 69 78 4c 6f 63 6b  urn the unixLock
8450: 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20 68  Info structure h
8460: 65 72 65 20 2a 2f 0a 20 20 73 74 72 75 63 74 20  ere */.  struct 
8470: 75 6e 69 78 4f 70 65 6e 43 6e 74 20 2a 2a 70 70  unixOpenCnt **pp
8480: 4f 70 65 6e 20 20 20 20 2f 2a 20 52 65 74 75 72  Open    /* Retur
8490: 6e 20 74 68 65 20 75 6e 69 78 4f 70 65 6e 43 6e  n the unixOpenCn
84a0: 74 20 73 74 72 75 63 74 75 72 65 20 68 65 72 65  t structure here
84b0: 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b   */.){.  int rc;
84c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
84d0: 20 20 20 20 20 20 20 20 2f 2a 20 53 79 73 74 65          /* Syste
84e0: 6d 20 63 61 6c 6c 20 72 65 74 75 72 6e 20 63 6f  m call return co
84f0: 64 65 20 2a 2f 0a 20 20 69 6e 74 20 66 64 3b 20  de */.  int fd; 
8500: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8510: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 66 69         /* The fi
8520: 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 66 6f  le descriptor fo
8530: 72 20 70 46 69 6c 65 20 2a 2f 0a 20 20 73 74 72  r pFile */.  str
8540: 75 63 74 20 75 6e 69 78 4c 6f 63 6b 4b 65 79 20  uct unixLockKey 
8550: 6c 6f 63 6b 4b 65 79 3b 20 20 20 20 2f 2a 20 4c  lockKey;    /* L
8560: 6f 6f 6b 75 70 20 6b 65 79 20 66 6f 72 20 74 68  ookup key for th
8570: 65 20 75 6e 69 78 4c 6f 63 6b 49 6e 66 6f 20 73  e unixLockInfo s
8580: 74 72 75 63 74 75 72 65 20 2a 2f 0a 20 20 73 74  tructure */.  st
8590: 72 75 63 74 20 75 6e 69 78 46 69 6c 65 49 64 20  ruct unixFileId 
85a0: 66 69 6c 65 49 64 3b 20 20 20 20 20 20 2f 2a 20  fileId;      /* 
85b0: 4c 6f 6f 6b 75 70 20 6b 65 79 20 66 6f 72 20 74  Lookup key for t
85c0: 68 65 20 75 6e 69 78 4f 70 65 6e 43 6e 74 20 73  he unixOpenCnt s
85d0: 74 72 75 63 74 20 2a 2f 0a 20 20 73 74 72 75 63  truct */.  struc
85e0: 74 20 73 74 61 74 20 73 74 61 74 62 75 66 3b 20  t stat statbuf; 
85f0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 77            /* Low
8600: 2d 6c 65 76 65 6c 20 66 69 6c 65 20 69 6e 66 6f  -level file info
8610: 72 6d 61 74 69 6f 6e 20 2a 2f 0a 20 20 73 74 72  rmation */.  str
8620: 75 63 74 20 75 6e 69 78 4c 6f 63 6b 49 6e 66 6f  uct unixLockInfo
8630: 20 2a 70 4c 6f 63 6b 20 3d 20 30 3b 2f 2a 20 43   *pLock = 0;/* C
8640: 61 6e 64 69 64 61 74 65 20 75 6e 69 78 4c 6f 63  andidate unixLoc
8650: 6b 49 6e 66 6f 20 6f 62 6a 65 63 74 20 2a 2f 0a  kInfo object */.
8660: 20 20 73 74 72 75 63 74 20 75 6e 69 78 4f 70 65    struct unixOpe
8670: 6e 43 6e 74 20 2a 70 4f 70 65 6e 3b 20 20 20 20  nCnt *pOpen;    
8680: 20 2f 2a 20 43 61 6e 64 69 64 61 74 65 20 75 6e   /* Candidate un
8690: 69 78 4f 70 65 6e 43 6e 74 20 6f 62 6a 65 63 74  ixOpenCnt object
86a0: 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 75   */..  assert( u
86b0: 6e 69 78 4d 75 74 65 78 48 65 6c 64 28 29 20 29  nixMutexHeld() )
86c0: 3b 0a 0a 20 20 2f 2a 20 47 65 74 20 6c 6f 77 2d  ;..  /* Get low-
86d0: 6c 65 76 65 6c 20 69 6e 66 6f 72 6d 61 74 69 6f  level informatio
86e0: 6e 20 61 62 6f 75 74 20 74 68 65 20 66 69 6c 65  n about the file
86f0: 20 74 68 61 74 20 77 65 20 63 61 6e 20 75 73 65   that we can use
8700: 64 20 74 6f 0a 20 20 2a 2a 20 63 72 65 61 74 65  d to.  ** create
8710: 20 61 20 75 6e 69 71 75 65 20 6e 61 6d 65 20 66   a unique name f
8720: 6f 72 20 74 68 65 20 66 69 6c 65 2e 0a 20 20 2a  or the file..  *
8730: 2f 0a 20 20 66 64 20 3d 20 70 46 69 6c 65 2d 3e  /.  fd = pFile->
8740: 68 3b 0a 20 20 72 63 20 3d 20 66 73 74 61 74 28  h;.  rc = fstat(
8750: 66 64 2c 20 26 73 74 61 74 62 75 66 29 3b 0a 20  fd, &statbuf);. 
8760: 20 69 66 28 20 72 63 21 3d 30 20 29 7b 0a 20 20   if( rc!=0 ){.  
8770: 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72    pFile->lastErr
8780: 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 23 69 66 64  no = errno;.#ifd
8790: 65 66 20 45 4f 56 45 52 46 4c 4f 57 0a 20 20 20  ef EOVERFLOW.   
87a0: 20 69 66 28 20 70 46 69 6c 65 2d 3e 6c 61 73 74   if( pFile->last
87b0: 45 72 72 6e 6f 3d 3d 45 4f 56 45 52 46 4c 4f 57  Errno==EOVERFLOW
87c0: 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
87d0: 5f 4e 4f 4c 46 53 3b 0a 23 65 6e 64 69 66 0a 20  _NOLFS;.#endif. 
87e0: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
87f0: 5f 49 4f 45 52 52 3b 0a 20 20 7d 0a 0a 23 69 66  _IOERR;.  }..#if
8800: 64 65 66 20 5f 5f 41 50 50 4c 45 5f 5f 0a 20 20  def __APPLE__.  
8810: 2f 2a 20 4f 6e 20 4f 53 20 58 20 6f 6e 20 61 6e  /* On OS X on an
8820: 20 6d 73 64 6f 73 20 66 69 6c 65 73 79 73 74 65   msdos filesyste
8830: 6d 2c 20 74 68 65 20 69 6e 6f 64 65 20 6e 75 6d  m, the inode num
8840: 62 65 72 20 69 73 20 72 65 70 6f 72 74 65 64 0a  ber is reported.
8850: 20 20 2a 2a 20 69 6e 63 6f 72 72 65 63 74 6c 79    ** incorrectly
8860: 20 66 6f 72 20 7a 65 72 6f 2d 73 69 7a 65 20 66   for zero-size f
8870: 69 6c 65 73 2e 20 20 53 65 65 20 74 69 63 6b 65  iles.  See ticke
8880: 74 20 23 33 32 36 30 2e 20 20 54 6f 20 77 6f 72  t #3260.  To wor
8890: 6b 0a 20 20 2a 2a 20 61 72 6f 75 6e 64 20 74 68  k.  ** around th
88a0: 69 73 20 70 72 6f 62 6c 65 6d 20 28 77 65 20 63  is problem (we c
88b0: 6f 6e 73 69 64 65 72 20 69 74 20 61 20 62 75 67  onsider it a bug
88c0: 20 69 6e 20 4f 53 20 58 2c 20 6e 6f 74 20 53 51   in OS X, not SQ
88d0: 4c 69 74 65 29 0a 20 20 2a 2a 20 77 65 20 61 6c  Lite).  ** we al
88e0: 77 61 79 73 20 69 6e 63 72 65 61 73 65 20 74 68  ways increase th
88f0: 65 20 66 69 6c 65 20 73 69 7a 65 20 74 6f 20 31  e file size to 1
8900: 20 62 79 20 77 72 69 74 69 6e 67 20 61 20 73 69   by writing a si
8910: 6e 67 6c 65 20 62 79 74 65 0a 20 20 2a 2a 20 70  ngle byte.  ** p
8920: 72 69 6f 72 20 74 6f 20 61 63 63 65 73 73 69 6e  rior to accessin
8930: 67 20 74 68 65 20 69 6e 6f 64 65 20 6e 75 6d 62  g the inode numb
8940: 65 72 2e 20 20 54 68 65 20 6f 6e 65 20 62 79 74  er.  The one byt
8950: 65 20 77 72 69 74 74 65 6e 20 69 73 0a 20 20 2a  e written is.  *
8960: 2a 20 61 6e 20 41 53 43 49 49 20 27 53 27 20 63  * an ASCII 'S' c
8970: 68 61 72 61 63 74 65 72 20 77 68 69 63 68 20 61  haracter which a
8980: 6c 73 6f 20 68 61 70 70 65 6e 73 20 74 6f 20 62  lso happens to b
8990: 65 20 74 68 65 20 66 69 72 73 74 20 62 79 74 65  e the first byte
89a0: 0a 20 20 2a 2a 20 69 6e 20 74 68 65 20 68 65 61  .  ** in the hea
89b0: 64 65 72 20 6f 66 20 65 76 65 72 79 20 53 51 4c  der of every SQL
89c0: 69 74 65 20 64 61 74 61 62 61 73 65 2e 20 20 49  ite database.  I
89d0: 6e 20 74 68 69 73 20 77 61 79 2c 20 69 66 20 74  n this way, if t
89e0: 68 65 72 65 0a 20 20 2a 2a 20 69 73 20 61 20 72  here.  ** is a r
89f0: 61 63 65 20 63 6f 6e 64 69 74 69 6f 6e 20 73 75  ace condition su
8a00: 63 68 20 74 68 61 74 20 61 6e 6f 74 68 65 72 20  ch that another 
8a10: 74 68 72 65 61 64 20 68 61 73 20 61 6c 72 65 61  thread has alrea
8a20: 64 79 20 70 6f 70 75 6c 61 74 65 64 0a 20 20 2a  dy populated.  *
8a30: 2a 20 74 68 65 20 66 69 72 73 74 20 70 61 67 65  * the first page
8a40: 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
8a50: 2c 20 6e 6f 20 64 61 6d 61 67 65 20 69 73 20 64  , no damage is d
8a60: 6f 6e 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  one..  */.  if( 
8a70: 73 74 61 74 62 75 66 2e 73 74 5f 73 69 7a 65 3d  statbuf.st_size=
8a80: 3d 30 20 26 26 20 28 70 46 69 6c 65 2d 3e 66 73  =0 && (pFile->fs
8a90: 46 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 46  Flags & SQLITE_F
8aa0: 53 46 4c 41 47 53 5f 49 53 5f 4d 53 44 4f 53 29  SFLAGS_IS_MSDOS)
8ab0: 21 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  !=0 ){.    rc = 
8ac0: 77 72 69 74 65 28 66 64 2c 20 22 53 22 2c 20 31  write(fd, "S", 1
8ad0: 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 31  );.    if( rc!=1
8ae0: 20 29 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d   ){.      pFile-
8af0: 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 65 72 72  >lastErrno = err
8b00: 6e 6f 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  no;.      return
8b10: 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 3b 0a 20   SQLITE_IOERR;. 
8b20: 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 66 73     }.    rc = fs
8b30: 74 61 74 28 66 64 2c 20 26 73 74 61 74 62 75 66  tat(fd, &statbuf
8b40: 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 30  );.    if( rc!=0
8b50: 20 29 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d   ){.      pFile-
8b60: 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 65 72 72  >lastErrno = err
8b70: 6e 6f 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  no;.      return
8b80: 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 3b 0a 20   SQLITE_IOERR;. 
8b90: 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a     }.  }.#endif.
8ba0: 0a 20 20 6d 65 6d 73 65 74 28 26 6c 6f 63 6b 4b  .  memset(&lockK
8bb0: 65 79 2c 20 30 2c 20 73 69 7a 65 6f 66 28 6c 6f  ey, 0, sizeof(lo
8bc0: 63 6b 4b 65 79 29 29 3b 0a 20 20 6c 6f 63 6b 4b  ckKey));.  lockK
8bd0: 65 79 2e 66 69 64 2e 64 65 76 20 3d 20 73 74 61  ey.fid.dev = sta
8be0: 74 62 75 66 2e 73 74 5f 64 65 76 3b 0a 23 69 66  tbuf.st_dev;.#if
8bf0: 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20 6c 6f   OS_VXWORKS.  lo
8c00: 63 6b 4b 65 79 2e 66 69 64 2e 70 49 64 20 3d 20  ckKey.fid.pId = 
8c10: 70 46 69 6c 65 2d 3e 70 49 64 3b 0a 23 65 6c 73  pFile->pId;.#els
8c20: 65 0a 20 20 6c 6f 63 6b 4b 65 79 2e 66 69 64 2e  e.  lockKey.fid.
8c30: 69 6e 6f 20 3d 20 73 74 61 74 62 75 66 2e 73 74  ino = statbuf.st
8c40: 5f 69 6e 6f 3b 0a 23 65 6e 64 69 66 0a 23 69 66  _ino;.#endif.#if
8c50: 20 53 51 4c 49 54 45 5f 54 48 52 45 41 44 53 41   SQLITE_THREADSA
8c60: 46 45 20 26 26 20 64 65 66 69 6e 65 64 28 5f 5f  FE && defined(__
8c70: 6c 69 6e 75 78 5f 5f 29 0a 20 20 69 66 28 20 74  linux__).  if( t
8c80: 68 72 65 61 64 73 4f 76 65 72 72 69 64 65 45 61  hreadsOverrideEa
8c90: 63 68 4f 74 68 65 72 73 4c 6f 63 6b 73 3c 30 20  chOthersLocks<0 
8ca0: 29 7b 0a 20 20 20 20 74 65 73 74 54 68 72 65 61  ){.    testThrea
8cb0: 64 4c 6f 63 6b 69 6e 67 42 65 68 61 76 69 6f 72  dLockingBehavior
8cc0: 28 66 64 29 3b 0a 20 20 7d 0a 20 20 6c 6f 63 6b  (fd);.  }.  lock
8cd0: 4b 65 79 2e 74 69 64 20 3d 20 74 68 72 65 61 64  Key.tid = thread
8ce0: 73 4f 76 65 72 72 69 64 65 45 61 63 68 4f 74 68  sOverrideEachOth
8cf0: 65 72 73 4c 6f 63 6b 73 20 3f 20 30 20 3a 20 70  ersLocks ? 0 : p
8d00: 74 68 72 65 61 64 5f 73 65 6c 66 28 29 3b 0a 23  thread_self();.#
8d10: 65 6e 64 69 66 0a 20 20 66 69 6c 65 49 64 20 3d  endif.  fileId =
8d20: 20 6c 6f 63 6b 4b 65 79 2e 66 69 64 3b 0a 20 20   lockKey.fid;.  
8d30: 69 66 28 20 70 70 4c 6f 63 6b 21 3d 30 20 29 7b  if( ppLock!=0 ){
8d40: 0a 20 20 20 20 70 4c 6f 63 6b 20 3d 20 6c 6f 63  .    pLock = loc
8d50: 6b 4c 69 73 74 3b 0a 20 20 20 20 77 68 69 6c 65  kList;.    while
8d60: 28 20 70 4c 6f 63 6b 20 26 26 20 6d 65 6d 63 6d  ( pLock && memcm
8d70: 70 28 26 6c 6f 63 6b 4b 65 79 2c 20 26 70 4c 6f  p(&lockKey, &pLo
8d80: 63 6b 2d 3e 6c 6f 63 6b 4b 65 79 2c 20 73 69 7a  ck->lockKey, siz
8d90: 65 6f 66 28 6c 6f 63 6b 4b 65 79 29 29 20 29 7b  eof(lockKey)) ){
8da0: 0a 20 20 20 20 20 20 70 4c 6f 63 6b 20 3d 20 70  .      pLock = p
8db0: 4c 6f 63 6b 2d 3e 70 4e 65 78 74 3b 0a 20 20 20  Lock->pNext;.   
8dc0: 20 7d 0a 20 20 20 20 69 66 28 20 70 4c 6f 63 6b   }.    if( pLock
8dd0: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 4c 6f  ==0 ){.      pLo
8de0: 63 6b 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c  ck = sqlite3_mal
8df0: 6c 6f 63 28 20 73 69 7a 65 6f 66 28 2a 70 4c 6f  loc( sizeof(*pLo
8e00: 63 6b 29 20 29 3b 0a 20 20 20 20 20 20 69 66 28  ck) );.      if(
8e10: 20 70 4c 6f 63 6b 3d 3d 30 20 29 7b 0a 20 20 20   pLock==0 ){.   
8e20: 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
8e30: 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 20 20  _NOMEM;.        
8e40: 67 6f 74 6f 20 65 78 69 74 5f 66 69 6e 64 6c 6f  goto exit_findlo
8e50: 63 6b 69 6e 66 6f 3b 0a 20 20 20 20 20 20 7d 0a  ckinfo;.      }.
8e60: 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 70 4c        memcpy(&pL
8e70: 6f 63 6b 2d 3e 6c 6f 63 6b 4b 65 79 2c 26 6c 6f  ock->lockKey,&lo
8e80: 63 6b 4b 65 79 2c 73 69 7a 65 6f 66 28 6c 6f 63  ckKey,sizeof(loc
8e90: 6b 4b 65 79 29 29 3b 0a 20 20 20 20 20 20 70 4c  kKey));.      pL
8ea0: 6f 63 6b 2d 3e 6e 52 65 66 20 3d 20 31 3b 0a 20  ock->nRef = 1;. 
8eb0: 20 20 20 20 20 70 4c 6f 63 6b 2d 3e 63 6e 74 20       pLock->cnt 
8ec0: 3d 20 30 3b 0a 20 20 20 20 20 20 70 4c 6f 63 6b  = 0;.      pLock
8ed0: 2d 3e 6c 6f 63 6b 74 79 70 65 20 3d 20 30 3b 0a  ->locktype = 0;.
8ee0: 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49  #if defined(SQLI
8ef0: 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e  TE_ENABLE_LOCKIN
8f00: 47 5f 53 54 59 4c 45 29 0a 20 20 20 20 20 20 70  G_STYLE).      p
8f10: 4c 6f 63 6b 2d 3e 73 68 61 72 65 64 42 79 74 65  Lock->sharedByte
8f20: 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 20 20 20   = 0;.#endif.   
8f30: 20 20 20 70 4c 6f 63 6b 2d 3e 70 4e 65 78 74 20     pLock->pNext 
8f40: 3d 20 6c 6f 63 6b 4c 69 73 74 3b 0a 20 20 20 20  = lockList;.    
8f50: 20 20 70 4c 6f 63 6b 2d 3e 70 50 72 65 76 20 3d    pLock->pPrev =
8f60: 20 30 3b 0a 20 20 20 20 20 20 69 66 28 20 6c 6f   0;.      if( lo
8f70: 63 6b 4c 69 73 74 20 29 20 6c 6f 63 6b 4c 69 73  ckList ) lockLis
8f80: 74 2d 3e 70 50 72 65 76 20 3d 20 70 4c 6f 63 6b  t->pPrev = pLock
8f90: 3b 0a 20 20 20 20 20 20 6c 6f 63 6b 4c 69 73 74  ;.      lockList
8fa0: 20 3d 20 70 4c 6f 63 6b 3b 0a 20 20 20 20 7d 65   = pLock;.    }e
8fb0: 6c 73 65 7b 0a 20 20 20 20 20 20 70 4c 6f 63 6b  lse{.      pLock
8fc0: 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 20 20 7d 0a  ->nRef++;.    }.
8fd0: 20 20 20 20 2a 70 70 4c 6f 63 6b 20 3d 20 70 4c      *ppLock = pL
8fe0: 6f 63 6b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  ock;.  }.  if( p
8ff0: 70 4f 70 65 6e 21 3d 30 20 29 7b 0a 20 20 20 20  pOpen!=0 ){.    
9000: 70 4f 70 65 6e 20 3d 20 6f 70 65 6e 4c 69 73 74  pOpen = openList
9010: 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 70 4f 70  ;.    while( pOp
9020: 65 6e 20 26 26 20 6d 65 6d 63 6d 70 28 26 66 69  en && memcmp(&fi
9030: 6c 65 49 64 2c 20 26 70 4f 70 65 6e 2d 3e 66 69  leId, &pOpen->fi
9040: 6c 65 49 64 2c 20 73 69 7a 65 6f 66 28 66 69 6c  leId, sizeof(fil
9050: 65 49 64 29 29 20 29 7b 0a 20 20 20 20 20 20 70  eId)) ){.      p
9060: 4f 70 65 6e 20 3d 20 70 4f 70 65 6e 2d 3e 70 4e  Open = pOpen->pN
9070: 65 78 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  ext;.    }.    i
9080: 66 28 20 70 4f 70 65 6e 3d 3d 30 20 29 7b 0a 20  f( pOpen==0 ){. 
9090: 20 20 20 20 20 70 4f 70 65 6e 20 3d 20 73 71 6c       pOpen = sql
90a0: 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 20 73 69 7a  ite3_malloc( siz
90b0: 65 6f 66 28 2a 70 4f 70 65 6e 29 20 29 3b 0a 20  eof(*pOpen) );. 
90c0: 20 20 20 20 20 69 66 28 20 70 4f 70 65 6e 3d 3d       if( pOpen==
90d0: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 6c  0 ){.        rel
90e0: 65 61 73 65 4c 6f 63 6b 49 6e 66 6f 28 70 4c 6f  easeLockInfo(pLo
90f0: 63 6b 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20  ck);.        rc 
9100: 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  = SQLITE_NOMEM;.
9110: 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69          goto exi
9120: 74 5f 66 69 6e 64 6c 6f 63 6b 69 6e 66 6f 3b 0a  t_findlockinfo;.
9130: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6d 65        }.      me
9140: 6d 73 65 74 28 70 4f 70 65 6e 2c 20 30 2c 20 73  mset(pOpen, 0, s
9150: 69 7a 65 6f 66 28 2a 70 4f 70 65 6e 29 29 3b 0a  izeof(*pOpen));.
9160: 20 20 20 20 20 20 70 4f 70 65 6e 2d 3e 66 69 6c        pOpen->fil
9170: 65 49 64 20 3d 20 66 69 6c 65 49 64 3b 0a 20 20  eId = fileId;.  
9180: 20 20 20 20 70 4f 70 65 6e 2d 3e 6e 52 65 66 20      pOpen->nRef 
9190: 3d 20 31 3b 0a 20 20 20 20 20 20 70 4f 70 65 6e  = 1;.      pOpen
91a0: 2d 3e 70 4e 65 78 74 20 3d 20 6f 70 65 6e 4c 69  ->pNext = openLi
91b0: 73 74 3b 0a 20 20 20 20 20 20 69 66 28 20 6f 70  st;.      if( op
91c0: 65 6e 4c 69 73 74 20 29 20 6f 70 65 6e 4c 69 73  enList ) openLis
91d0: 74 2d 3e 70 50 72 65 76 20 3d 20 70 4f 70 65 6e  t->pPrev = pOpen
91e0: 3b 0a 20 20 20 20 20 20 6f 70 65 6e 4c 69 73 74  ;.      openList
91f0: 20 3d 20 70 4f 70 65 6e 3b 0a 20 20 20 20 7d 65   = pOpen;.    }e
9200: 6c 73 65 7b 0a 20 20 20 20 20 20 70 4f 70 65 6e  lse{.      pOpen
9210: 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 20 20 7d 0a  ->nRef++;.    }.
9220: 20 20 20 20 2a 70 70 4f 70 65 6e 20 3d 20 70 4f      *ppOpen = pO
9230: 70 65 6e 3b 0a 20 20 7d 0a 0a 65 78 69 74 5f 66  pen;.  }..exit_f
9240: 69 6e 64 6c 6f 63 6b 69 6e 66 6f 3a 0a 20 20 72  indlockinfo:.  r
9250: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
9260: 2a 2a 20 49 66 20 77 65 20 61 72 65 20 63 75 72  ** If we are cur
9270: 72 65 6e 74 6c 79 20 69 6e 20 61 20 64 69 66 66  rently in a diff
9280: 65 72 65 6e 74 20 74 68 72 65 61 64 20 74 68 61  erent thread tha
9290: 6e 20 74 68 65 20 74 68 72 65 61 64 20 74 68 61  n the thread tha
92a0: 74 20 74 68 65 0a 2a 2a 20 75 6e 69 78 46 69 6c  t the.** unixFil
92b0: 65 20 61 72 67 75 6d 65 6e 74 20 62 65 6c 6f 6e  e argument belon
92c0: 67 73 20 74 6f 2c 20 74 68 65 6e 20 74 72 61 6e  gs to, then tran
92d0: 73 66 65 72 20 6f 77 6e 65 72 73 68 69 70 20 6f  sfer ownership o
92e0: 66 20 74 68 65 20 75 6e 69 78 46 69 6c 65 0a 2a  f the unixFile.*
92f0: 2a 20 6f 76 65 72 20 74 6f 20 74 68 65 20 63 75  * over to the cu
9300: 72 72 65 6e 74 20 74 68 72 65 61 64 2e 0a 2a 2a  rrent thread..**
9310: 0a 2a 2a 20 41 20 75 6e 69 78 46 69 6c 65 20 69  .** A unixFile i
9320: 73 20 6f 6e 6c 79 20 6f 77 6e 65 64 20 62 79 20  s only owned by 
9330: 61 20 74 68 72 65 61 64 20 6f 6e 20 73 79 73 74  a thread on syst
9340: 65 6d 73 20 74 68 61 74 20 75 73 65 20 4c 69 6e  ems that use Lin
9350: 75 78 54 68 72 65 61 64 73 2e 0a 2a 2a 0a 2a 2a  uxThreads..**.**
9360: 20 4f 77 6e 65 72 73 68 69 70 20 74 72 61 6e 73   Ownership trans
9370: 66 65 72 20 69 73 20 6f 6e 6c 79 20 61 6c 6c 6f  fer is only allo
9380: 77 65 64 20 69 66 20 74 68 65 20 75 6e 69 78 46  wed if the unixF
9390: 69 6c 65 20 69 73 20 63 75 72 72 65 6e 74 6c 79  ile is currently
93a0: 20 75 6e 6c 6f 63 6b 65 64 2e 0a 2a 2a 20 49 66   unlocked..** If
93b0: 20 74 68 65 20 75 6e 69 78 46 69 6c 65 20 69 73   the unixFile is
93c0: 20 6c 6f 63 6b 65 64 20 61 6e 64 20 61 6e 20 6f   locked and an o
93d0: 77 6e 65 72 73 68 69 70 20 69 73 20 77 72 6f 6e  wnership is wron
93e0: 67 2c 20 74 68 65 6e 20 72 65 74 75 72 6e 0a 2a  g, then return.*
93f0: 2a 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 2e  * SQLITE_MISUSE.
9400: 20 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72    SQLITE_OK is r
9410: 65 74 75 72 6e 65 64 20 69 66 20 65 76 65 72 79  eturned if every
9420: 74 68 69 6e 67 20 77 6f 72 6b 73 2e 0a 2a 2f 0a  thing works..*/.
9430: 23 69 66 20 53 51 4c 49 54 45 5f 54 48 52 45 41  #if SQLITE_THREA
9440: 44 53 41 46 45 20 26 26 20 64 65 66 69 6e 65 64  DSAFE && defined
9450: 28 5f 5f 6c 69 6e 75 78 5f 5f 29 0a 73 74 61 74  (__linux__).stat
9460: 69 63 20 69 6e 74 20 74 72 61 6e 73 66 65 72 4f  ic int transferO
9470: 77 6e 65 72 73 68 69 70 28 75 6e 69 78 46 69 6c  wnership(unixFil
9480: 65 20 2a 70 46 69 6c 65 29 7b 0a 20 20 69 6e 74  e *pFile){.  int
9490: 20 72 63 3b 0a 20 20 70 74 68 72 65 61 64 5f 74   rc;.  pthread_t
94a0: 20 68 53 65 6c 66 3b 0a 20 20 69 66 28 20 74 68   hSelf;.  if( th
94b0: 72 65 61 64 73 4f 76 65 72 72 69 64 65 45 61 63  readsOverrideEac
94c0: 68 4f 74 68 65 72 73 4c 6f 63 6b 73 20 29 7b 0a  hOthersLocks ){.
94d0: 20 20 20 20 2f 2a 20 4f 77 6e 65 72 73 68 69 70      /* Ownership
94e0: 20 74 72 61 6e 73 66 65 72 73 20 6e 6f 74 20 6e   transfers not n
94f0: 65 65 64 65 64 20 6f 6e 20 74 68 69 73 20 73 79  eeded on this sy
9500: 73 74 65 6d 20 2a 2f 0a 20 20 20 20 72 65 74 75  stem */.    retu
9510: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
9520: 7d 0a 20 20 68 53 65 6c 66 20 3d 20 70 74 68 72  }.  hSelf = pthr
9530: 65 61 64 5f 73 65 6c 66 28 29 3b 0a 20 20 69 66  ead_self();.  if
9540: 28 20 70 74 68 72 65 61 64 5f 65 71 75 61 6c 28  ( pthread_equal(
9550: 70 46 69 6c 65 2d 3e 74 69 64 2c 20 68 53 65 6c  pFile->tid, hSel
9560: 66 29 20 29 7b 0a 20 20 20 20 2f 2a 20 57 65 20  f) ){.    /* We 
9570: 61 72 65 20 73 74 69 6c 6c 20 69 6e 20 74 68 65  are still in the
9580: 20 73 61 6d 65 20 74 68 72 65 61 64 20 2a 2f 0a   same thread */.
9590: 20 20 20 20 4f 53 54 52 41 43 45 31 28 22 4e 6f      OSTRACE1("No
95a0: 2d 74 72 61 6e 73 66 65 72 2c 20 73 61 6d 65 20  -transfer, same 
95b0: 74 68 72 65 61 64 5c 6e 22 29 3b 0a 20 20 20 20  thread\n");.    
95c0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
95d0: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 46 69 6c  ;.  }.  if( pFil
95e0: 65 2d 3e 6c 6f 63 6b 74 79 70 65 21 3d 4e 4f 5f  e->locktype!=NO_
95f0: 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 2f 2a 20 57  LOCK ){.    /* W
9600: 65 20 63 61 6e 6e 6f 74 20 63 68 61 6e 67 65 20  e cannot change 
9610: 6f 77 6e 65 72 73 68 69 70 20 77 68 69 6c 65 20  ownership while 
9620: 77 65 20 61 72 65 20 68 6f 6c 64 69 6e 67 20 61  we are holding a
9630: 20 6c 6f 63 6b 21 20 2a 2f 0a 20 20 20 20 72 65   lock! */.    re
9640: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55  turn SQLITE_MISU
9650: 53 45 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 4f  SE_BKPT;.  }.  O
9660: 53 54 52 41 43 45 34 28 22 54 72 61 6e 73 66 65  STRACE4("Transfe
9670: 72 20 6f 77 6e 65 72 73 68 69 70 20 6f 66 20 25  r ownership of %
9680: 64 20 66 72 6f 6d 20 25 64 20 74 6f 20 25 64 5c  d from %d to %d\
9690: 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  n",.            
96a0: 70 46 69 6c 65 2d 3e 68 2c 20 70 46 69 6c 65 2d  pFile->h, pFile-
96b0: 3e 74 69 64 2c 20 68 53 65 6c 66 29 3b 0a 20 20  >tid, hSelf);.  
96c0: 70 46 69 6c 65 2d 3e 74 69 64 20 3d 20 68 53 65  pFile->tid = hSe
96d0: 6c 66 3b 0a 20 20 69 66 20 28 70 46 69 6c 65 2d  lf;.  if (pFile-
96e0: 3e 70 4c 6f 63 6b 20 21 3d 20 4e 55 4c 4c 29 20  >pLock != NULL) 
96f0: 7b 0a 20 20 20 20 72 65 6c 65 61 73 65 4c 6f 63  {.    releaseLoc
9700: 6b 49 6e 66 6f 28 70 46 69 6c 65 2d 3e 70 4c 6f  kInfo(pFile->pLo
9710: 63 6b 29 3b 0a 20 20 20 20 72 63 20 3d 20 66 69  ck);.    rc = fi
9720: 6e 64 4c 6f 63 6b 49 6e 66 6f 28 70 46 69 6c 65  ndLockInfo(pFile
9730: 2c 20 26 70 46 69 6c 65 2d 3e 70 4c 6f 63 6b 2c  , &pFile->pLock,
9740: 20 30 29 3b 0a 20 20 20 20 4f 53 54 52 41 43 45   0);.    OSTRACE
9750: 35 28 22 4c 4f 43 4b 20 20 20 20 25 64 20 69 73  5("LOCK    %d is
9760: 20 6e 6f 77 20 25 73 28 25 73 2c 25 64 29 5c 6e   now %s(%s,%d)\n
9770: 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 0a 20 20 20  ", pFile->h,.   
9780: 20 20 20 20 20 20 20 20 6c 6f 63 6b 74 79 70 65          locktype
9790: 4e 61 6d 65 28 70 46 69 6c 65 2d 3e 6c 6f 63 6b  Name(pFile->lock
97a0: 74 79 70 65 29 2c 0a 20 20 20 20 20 20 20 20 20  type),.         
97b0: 20 20 6c 6f 63 6b 74 79 70 65 4e 61 6d 65 28 70    locktypeName(p
97c0: 46 69 6c 65 2d 3e 70 4c 6f 63 6b 2d 3e 6c 6f 63  File->pLock->loc
97d0: 6b 74 79 70 65 29 2c 20 70 46 69 6c 65 2d 3e 70  ktype), pFile->p
97e0: 4c 6f 63 6b 2d 3e 63 6e 74 29 3b 0a 20 20 20 20  Lock->cnt);.    
97f0: 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 20 65  return rc;.  } e
9800: 6c 73 65 20 7b 0a 20 20 20 20 72 65 74 75 72 6e  lse {.    return
9810: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
9820: 7d 0a 23 65 6c 73 65 20 20 2f 2a 20 69 66 20 6e  }.#else  /* if n
9830: 6f 74 20 53 51 4c 49 54 45 5f 54 48 52 45 41 44  ot SQLITE_THREAD
9840: 53 41 46 45 20 2a 2f 0a 20 20 2f 2a 20 4f 6e 20  SAFE */.  /* On 
9850: 73 69 6e 67 6c 65 2d 74 68 72 65 61 64 65 64 20  single-threaded 
9860: 62 75 69 6c 64 73 2c 20 6f 77 6e 65 72 73 68 69  builds, ownershi
9870: 70 20 74 72 61 6e 73 66 65 72 20 69 73 20 61 20  p transfer is a 
9880: 6e 6f 2d 6f 70 20 2a 2f 0a 23 20 64 65 66 69 6e  no-op */.# defin
9890: 65 20 74 72 61 6e 73 66 65 72 4f 77 6e 65 72 73  e transferOwners
98a0: 68 69 70 28 58 29 20 53 51 4c 49 54 45 5f 4f 4b  hip(X) SQLITE_OK
98b0: 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
98c0: 45 5f 54 48 52 45 41 44 53 41 46 45 20 2a 2f 0a  E_THREADSAFE */.
98d0: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
98e0: 74 69 6e 65 20 63 68 65 63 6b 73 20 69 66 20 74  tine checks if t
98f0: 68 65 72 65 20 69 73 20 61 20 52 45 53 45 52 56  here is a RESERV
9900: 45 44 20 6c 6f 63 6b 20 68 65 6c 64 20 6f 6e 20  ED lock held on 
9910: 74 68 65 20 73 70 65 63 69 66 69 65 64 0a 2a 2a  the specified.**
9920: 20 66 69 6c 65 20 62 79 20 74 68 69 73 20 6f 72   file by this or
9930: 20 61 6e 79 20 6f 74 68 65 72 20 70 72 6f 63 65   any other proce
9940: 73 73 2e 20 49 66 20 73 75 63 68 20 61 20 6c 6f  ss. If such a lo
9950: 63 6b 20 69 73 20 68 65 6c 64 2c 20 73 65 74 20  ck is held, set 
9960: 2a 70 52 65 73 4f 75 74 0a 2a 2a 20 74 6f 20 61  *pResOut.** to a
9970: 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75 65 20   non-zero value 
9980: 6f 74 68 65 72 77 69 73 65 20 2a 70 52 65 73 4f  otherwise *pResO
9990: 75 74 20 69 73 20 73 65 74 20 74 6f 20 7a 65 72  ut is set to zer
99a0: 6f 2e 20 20 54 68 65 20 72 65 74 75 72 6e 20 76  o.  The return v
99b0: 61 6c 75 65 0a 2a 2a 20 69 73 20 73 65 74 20 74  alue.** is set t
99c0: 6f 20 53 51 4c 49 54 45 5f 4f 4b 20 75 6e 6c 65  o SQLITE_OK unle
99d0: 73 73 20 61 6e 20 49 2f 4f 20 65 72 72 6f 72 20  ss an I/O error 
99e0: 6f 63 63 75 72 73 20 64 75 72 69 6e 67 20 6c 6f  occurs during lo
99f0: 63 6b 20 63 68 65 63 6b 69 6e 67 2e 0a 2a 2f 0a  ck checking..*/.
9a00: 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 43  static int unixC
9a10: 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b  heckReservedLock
9a20: 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69  (sqlite3_file *i
9a30: 64 2c 20 69 6e 74 20 2a 70 52 65 73 4f 75 74 29  d, int *pResOut)
9a40: 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
9a50: 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 72 65  ITE_OK;.  int re
9a60: 73 65 72 76 65 64 20 3d 20 30 3b 0a 20 20 75 6e  served = 0;.  un
9a70: 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20  ixFile *pFile = 
9a80: 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 0a  (unixFile*)id;..
9a90: 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f    SimulateIOErro
9aa0: 72 28 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  r( return SQLITE
9ab0: 5f 49 4f 45 52 52 5f 43 48 45 43 4b 52 45 53 45  _IOERR_CHECKRESE
9ac0: 52 56 45 44 4c 4f 43 4b 3b 20 29 3b 0a 0a 20 20  RVEDLOCK; );..  
9ad0: 61 73 73 65 72 74 28 20 70 46 69 6c 65 20 29 3b  assert( pFile );
9ae0: 0a 20 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65  .  unixEnterMute
9af0: 78 28 29 3b 20 2f 2a 20 42 65 63 61 75 73 65 20  x(); /* Because 
9b00: 70 46 69 6c 65 2d 3e 70 4c 6f 63 6b 20 69 73 20  pFile->pLock is 
9b10: 73 68 61 72 65 64 20 61 63 72 6f 73 73 20 74 68  shared across th
9b20: 72 65 61 64 73 20 2a 2f 0a 0a 20 20 2f 2a 20 43  reads */..  /* C
9b30: 68 65 63 6b 20 69 66 20 61 20 74 68 72 65 61 64  heck if a thread
9b40: 20 69 6e 20 74 68 69 73 20 70 72 6f 63 65 73 73   in this process
9b50: 20 68 6f 6c 64 73 20 73 75 63 68 20 61 20 6c 6f   holds such a lo
9b60: 63 6b 20 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c  ck */.  if( pFil
9b70: 65 2d 3e 70 4c 6f 63 6b 2d 3e 6c 6f 63 6b 74 79  e->pLock->lockty
9b80: 70 65 3e 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29  pe>SHARED_LOCK )
9b90: 7b 0a 20 20 20 20 72 65 73 65 72 76 65 64 20 3d  {.    reserved =
9ba0: 20 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4f 74   1;.  }..  /* Ot
9bb0: 68 65 72 77 69 73 65 20 73 65 65 20 69 66 20 73  herwise see if s
9bc0: 6f 6d 65 20 6f 74 68 65 72 20 70 72 6f 63 65 73  ome other proces
9bd0: 73 20 68 6f 6c 64 73 20 69 74 2e 0a 20 20 2a 2f  s holds it..  */
9be0: 0a 23 69 66 6e 64 65 66 20 5f 5f 44 4a 47 50 50  .#ifndef __DJGPP
9bf0: 5f 5f 0a 20 20 69 66 28 20 21 72 65 73 65 72 76  __.  if( !reserv
9c00: 65 64 20 29 7b 0a 20 20 20 20 73 74 72 75 63 74  ed ){.    struct
9c10: 20 66 6c 6f 63 6b 20 6c 6f 63 6b 3b 0a 20 20 20   flock lock;.   
9c20: 20 6c 6f 63 6b 2e 6c 5f 77 68 65 6e 63 65 20 3d   lock.l_whence =
9c30: 20 53 45 45 4b 5f 53 45 54 3b 0a 20 20 20 20 6c   SEEK_SET;.    l
9c40: 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 52 45  ock.l_start = RE
9c50: 53 45 52 56 45 44 5f 42 59 54 45 3b 0a 20 20 20  SERVED_BYTE;.   
9c60: 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 31 3b   lock.l_len = 1;
9c70: 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65  .    lock.l_type
9c80: 20 3d 20 46 5f 57 52 4c 43 4b 3b 0a 20 20 20 20   = F_WRLCK;.    
9c90: 69 66 20 28 2d 31 20 3d 3d 20 66 63 6e 74 6c 28  if (-1 == fcntl(
9ca0: 70 46 69 6c 65 2d 3e 68 2c 20 46 5f 47 45 54 4c  pFile->h, F_GETL
9cb0: 4b 2c 20 26 6c 6f 63 6b 29 29 20 7b 0a 20 20 20  K, &lock)) {.   
9cc0: 20 20 20 69 6e 74 20 74 45 72 72 6e 6f 20 3d 20     int tErrno = 
9cd0: 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20 72 63 20  errno;.      rc 
9ce0: 3d 20 73 71 6c 69 74 65 45 72 72 6f 72 46 72 6f  = sqliteErrorFro
9cf0: 6d 50 6f 73 69 78 45 72 72 6f 72 28 74 45 72 72  mPosixError(tErr
9d00: 6e 6f 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  no, SQLITE_IOERR
9d10: 5f 43 48 45 43 4b 52 45 53 45 52 56 45 44 4c 4f  _CHECKRESERVEDLO
9d20: 43 4b 29 3b 0a 20 20 20 20 20 20 70 46 69 6c 65  CK);.      pFile
9d30: 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 74 45  ->lastErrno = tE
9d40: 72 72 6e 6f 3b 0a 20 20 20 20 7d 20 65 6c 73 65  rrno;.    } else
9d50: 20 69 66 28 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65   if( lock.l_type
9d60: 21 3d 46 5f 55 4e 4c 43 4b 20 29 7b 0a 20 20 20  !=F_UNLCK ){.   
9d70: 20 20 20 72 65 73 65 72 76 65 64 20 3d 20 31 3b     reserved = 1;
9d80: 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69  .    }.  }.#endi
9d90: 66 0a 20 20 0a 20 20 75 6e 69 78 4c 65 61 76 65  f.  .  unixLeave
9da0: 4d 75 74 65 78 28 29 3b 0a 20 20 4f 53 54 52 41  Mutex();.  OSTRA
9db0: 43 45 34 28 22 54 45 53 54 20 57 52 2d 4c 4f 43  CE4("TEST WR-LOC
9dc0: 4b 20 25 64 20 25 64 20 25 64 20 28 75 6e 69 78  K %d %d %d (unix
9dd0: 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20  )\n", pFile->h, 
9de0: 72 63 2c 20 72 65 73 65 72 76 65 64 29 3b 0a 0a  rc, reserved);..
9df0: 20 20 2a 70 52 65 73 4f 75 74 20 3d 20 72 65 73    *pResOut = res
9e00: 65 72 76 65 64 3b 0a 20 20 72 65 74 75 72 6e 20  erved;.  return 
9e10: 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63  rc;.}../*.** Loc
9e20: 6b 20 74 68 65 20 66 69 6c 65 20 77 69 74 68 20  k the file with 
9e30: 74 68 65 20 6c 6f 63 6b 20 73 70 65 63 69 66 69  the lock specifi
9e40: 65 64 20 62 79 20 70 61 72 61 6d 65 74 65 72 20  ed by parameter 
9e50: 6c 6f 63 6b 74 79 70 65 20 2d 20 6f 6e 65 0a 2a  locktype - one.*
9e60: 2a 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  * of the followi
9e70: 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28 31  ng:.**.**     (1
9e80: 29 20 53 48 41 52 45 44 5f 4c 4f 43 4b 0a 2a 2a  ) SHARED_LOCK.**
9e90: 20 20 20 20 20 28 32 29 20 52 45 53 45 52 56 45       (2) RESERVE
9ea0: 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 33  D_LOCK.**     (3
9eb0: 29 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 0a 2a  ) PENDING_LOCK.*
9ec0: 2a 20 20 20 20 20 28 34 29 20 45 58 43 4c 55 53  *     (4) EXCLUS
9ed0: 49 56 45 5f 4c 4f 43 4b 0a 2a 2a 0a 2a 2a 20 53  IVE_LOCK.**.** S
9ee0: 6f 6d 65 74 69 6d 65 73 20 77 68 65 6e 20 72 65  ometimes when re
9ef0: 71 75 65 73 74 69 6e 67 20 6f 6e 65 20 6c 6f 63  questing one loc
9f00: 6b 20 73 74 61 74 65 2c 20 61 64 64 69 74 69 6f  k state, additio
9f10: 6e 61 6c 20 6c 6f 63 6b 20 73 74 61 74 65 73 0a  nal lock states.
9f20: 2a 2a 20 61 72 65 20 69 6e 73 65 72 74 65 64 20  ** are inserted 
9f30: 69 6e 20 62 65 74 77 65 65 6e 2e 20 20 54 68 65  in between.  The
9f40: 20 6c 6f 63 6b 69 6e 67 20 6d 69 67 68 74 20 66   locking might f
9f50: 61 69 6c 20 6f 6e 20 6f 6e 65 20 6f 66 20 74 68  ail on one of th
9f60: 65 20 6c 61 74 65 72 0a 2a 2a 20 74 72 61 6e 73  e later.** trans
9f70: 69 74 69 6f 6e 73 20 6c 65 61 76 69 6e 67 20 74  itions leaving t
9f80: 68 65 20 6c 6f 63 6b 20 73 74 61 74 65 20 64 69  he lock state di
9f90: 66 66 65 72 65 6e 74 20 66 72 6f 6d 20 77 68 61  fferent from wha
9fa0: 74 20 69 74 20 73 74 61 72 74 65 64 20 62 75 74  t it started but
9fb0: 0a 2a 2a 20 73 74 69 6c 6c 20 73 68 6f 72 74 20  .** still short 
9fc0: 6f 66 20 69 74 73 20 67 6f 61 6c 2e 20 20 54 68  of its goal.  Th
9fd0: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 68 61 72  e following char
9fe0: 74 20 73 68 6f 77 73 20 74 68 65 20 61 6c 6c 6f  t shows the allo
9ff0: 77 65 64 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f  wed.** transitio
a000: 6e 73 20 61 6e 64 20 74 68 65 20 69 6e 73 65 72  ns and the inser
a010: 74 65 64 20 69 6e 74 65 72 6d 65 64 69 61 74 65  ted intermediate
a020: 20 73 74 61 74 65 73 3a 0a 2a 2a 0a 2a 2a 20 20   states:.**.**  
a030: 20 20 55 4e 4c 4f 43 4b 45 44 20 2d 3e 20 53 48    UNLOCKED -> SH
a040: 41 52 45 44 0a 2a 2a 20 20 20 20 53 48 41 52 45  ARED.**    SHARE
a050: 44 20 2d 3e 20 52 45 53 45 52 56 45 44 0a 2a 2a  D -> RESERVED.**
a060: 20 20 20 20 53 48 41 52 45 44 20 2d 3e 20 28 50      SHARED -> (P
a070: 45 4e 44 49 4e 47 29 20 2d 3e 20 45 58 43 4c 55  ENDING) -> EXCLU
a080: 53 49 56 45 0a 2a 2a 20 20 20 20 52 45 53 45 52  SIVE.**    RESER
a090: 56 45 44 20 2d 3e 20 28 50 45 4e 44 49 4e 47 29  VED -> (PENDING)
a0a0: 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a   -> EXCLUSIVE.**
a0b0: 20 20 20 20 50 45 4e 44 49 4e 47 20 2d 3e 20 45      PENDING -> E
a0c0: 58 43 4c 55 53 49 56 45 0a 2a 2a 0a 2a 2a 20 54  XCLUSIVE.**.** T
a0d0: 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c  his routine will
a0e0: 20 6f 6e 6c 79 20 69 6e 63 72 65 61 73 65 20 61   only increase a
a0f0: 20 6c 6f 63 6b 2e 20 20 55 73 65 20 74 68 65 20   lock.  Use the 
a100: 73 71 6c 69 74 65 33 4f 73 55 6e 6c 6f 63 6b 28  sqlite3OsUnlock(
a110: 29 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 74 6f 20  ).** routine to 
a120: 6c 6f 77 65 72 20 61 20 6c 6f 63 6b 69 6e 67 20  lower a locking 
a130: 6c 65 76 65 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63  level..*/.static
a140: 20 69 6e 74 20 75 6e 69 78 4c 6f 63 6b 28 73 71   int unixLock(sq
a150: 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20  lite3_file *id, 
a160: 69 6e 74 20 6c 6f 63 6b 74 79 70 65 29 7b 0a 20  int locktype){. 
a170: 20 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e   /* The followin
a180: 67 20 64 65 73 63 72 69 62 65 73 20 74 68 65 20  g describes the 
a190: 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f  implementation o
a1a0: 66 20 74 68 65 20 76 61 72 69 6f 75 73 20 6c 6f  f the various lo
a1b0: 63 6b 73 20 61 6e 64 0a 20 20 2a 2a 20 6c 6f 63  cks and.  ** loc
a1c0: 6b 20 74 72 61 6e 73 69 74 69 6f 6e 73 20 69 6e  k transitions in
a1d0: 20 74 65 72 6d 73 20 6f 66 20 74 68 65 20 50 4f   terms of the PO
a1e0: 53 49 58 20 61 64 76 69 73 6f 72 79 20 73 68 61  SIX advisory sha
a1f0: 72 65 64 20 61 6e 64 20 65 78 63 6c 75 73 69 76  red and exclusiv
a200: 65 0a 20 20 2a 2a 20 6c 6f 63 6b 20 70 72 69 6d  e.  ** lock prim
a210: 69 74 69 76 65 73 20 28 63 61 6c 6c 65 64 20 72  itives (called r
a220: 65 61 64 2d 6c 6f 63 6b 73 20 61 6e 64 20 77 72  ead-locks and wr
a230: 69 74 65 2d 6c 6f 63 6b 73 20 62 65 6c 6f 77 2c  ite-locks below,
a240: 20 74 6f 20 61 76 6f 69 64 0a 20 20 2a 2a 20 63   to avoid.  ** c
a250: 6f 6e 66 75 73 69 6f 6e 20 77 69 74 68 20 53 51  onfusion with SQ
a260: 4c 69 74 65 20 6c 6f 63 6b 20 6e 61 6d 65 73 29  Lite lock names)
a270: 2e 20 54 68 65 20 61 6c 67 6f 72 69 74 68 6d 73  . The algorithms
a280: 20 61 72 65 20 63 6f 6d 70 6c 69 63 61 74 65 64   are complicated
a290: 0a 20 20 2a 2a 20 73 6c 69 67 68 74 6c 79 20 69  .  ** slightly i
a2a0: 6e 20 6f 72 64 65 72 20 74 6f 20 62 65 20 63 6f  n order to be co
a2b0: 6d 70 61 74 69 62 6c 65 20 77 69 74 68 20 77 69  mpatible with wi
a2c0: 6e 64 6f 77 73 20 73 79 73 74 65 6d 73 20 73 69  ndows systems si
a2d0: 6d 75 6c 74 61 6e 65 6f 75 73 6c 79 0a 20 20 2a  multaneously.  *
a2e0: 2a 20 61 63 63 65 73 73 69 6e 67 20 74 68 65 20  * accessing the 
a2f0: 73 61 6d 65 20 64 61 74 61 62 61 73 65 20 66 69  same database fi
a300: 6c 65 2c 20 69 6e 20 63 61 73 65 20 74 68 61 74  le, in case that
a310: 20 69 73 20 65 76 65 72 20 72 65 71 75 69 72 65   is ever require
a320: 64 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 53 79 6d  d..  **.  ** Sym
a330: 62 6f 6c 73 20 64 65 66 69 6e 65 64 20 69 6e 20  bols defined in 
a340: 6f 73 2e 68 20 69 6e 64 65 6e 74 69 66 79 20 74  os.h indentify t
a350: 68 65 20 27 70 65 6e 64 69 6e 67 20 62 79 74 65  he 'pending byte
a360: 27 20 61 6e 64 20 74 68 65 20 27 72 65 73 65 72  ' and the 'reser
a370: 76 65 64 0a 20 20 2a 2a 20 62 79 74 65 27 2c 20  ved.  ** byte', 
a380: 65 61 63 68 20 73 69 6e 67 6c 65 20 62 79 74 65  each single byte
a390: 73 20 61 74 20 77 65 6c 6c 20 6b 6e 6f 77 6e 20  s at well known 
a3a0: 6f 66 66 73 65 74 73 2c 20 61 6e 64 20 74 68 65  offsets, and the
a3b0: 20 27 73 68 61 72 65 64 20 62 79 74 65 0a 20 20   'shared byte.  
a3c0: 2a 2a 20 72 61 6e 67 65 27 2c 20 61 20 72 61 6e  ** range', a ran
a3d0: 67 65 20 6f 66 20 35 31 30 20 62 79 74 65 73 20  ge of 510 bytes 
a3e0: 61 74 20 61 20 77 65 6c 6c 20 6b 6e 6f 77 6e 20  at a well known 
a3f0: 6f 66 66 73 65 74 2e 0a 20 20 2a 2a 0a 20 20 2a  offset..  **.  *
a400: 2a 20 54 6f 20 6f 62 74 61 69 6e 20 61 20 53 48  * To obtain a SH
a410: 41 52 45 44 20 6c 6f 63 6b 2c 20 61 20 72 65 61  ARED lock, a rea
a420: 64 2d 6c 6f 63 6b 20 69 73 20 6f 62 74 61 69 6e  d-lock is obtain
a430: 65 64 20 6f 6e 20 74 68 65 20 27 70 65 6e 64 69  ed on the 'pendi
a440: 6e 67 0a 20 20 2a 2a 20 62 79 74 65 27 2e 20 20  ng.  ** byte'.  
a450: 49 66 20 74 68 69 73 20 69 73 20 73 75 63 63 65  If this is succe
a460: 73 73 66 75 6c 2c 20 61 20 72 61 6e 64 6f 6d 20  ssful, a random 
a470: 62 79 74 65 20 66 72 6f 6d 20 74 68 65 20 27 73  byte from the 's
a480: 68 61 72 65 64 20 62 79 74 65 0a 20 20 2a 2a 20  hared byte.  ** 
a490: 72 61 6e 67 65 27 20 69 73 20 72 65 61 64 2d 6c  range' is read-l
a4a0: 6f 63 6b 65 64 20 61 6e 64 20 74 68 65 20 6c 6f  ocked and the lo
a4b0: 63 6b 20 6f 6e 20 74 68 65 20 27 70 65 6e 64 69  ck on the 'pendi
a4c0: 6e 67 20 62 79 74 65 27 20 72 65 6c 65 61 73 65  ng byte' release
a4d0: 64 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 20 70  d..  **.  ** A p
a4e0: 72 6f 63 65 73 73 20 6d 61 79 20 6f 6e 6c 79 20  rocess may only 
a4f0: 6f 62 74 61 69 6e 20 61 20 52 45 53 45 52 56 45  obtain a RESERVE
a500: 44 20 6c 6f 63 6b 20 61 66 74 65 72 20 69 74 20  D lock after it 
a510: 68 61 73 20 61 20 53 48 41 52 45 44 20 6c 6f 63  has a SHARED loc
a520: 6b 2e 0a 20 20 2a 2a 20 41 20 52 45 53 45 52 56  k..  ** A RESERV
a530: 45 44 20 6c 6f 63 6b 20 69 73 20 69 6d 70 6c 65  ED lock is imple
a540: 6d 65 6e 74 65 64 20 62 79 20 67 72 61 62 62 69  mented by grabbi
a550: 6e 67 20 61 20 77 72 69 74 65 2d 6c 6f 63 6b 20  ng a write-lock 
a560: 6f 6e 20 74 68 65 0a 20 20 2a 2a 20 27 72 65 73  on the.  ** 'res
a570: 65 72 76 65 64 20 62 79 74 65 27 2e 20 0a 20 20  erved byte'. .  
a580: 2a 2a 0a 20 20 2a 2a 20 41 20 70 72 6f 63 65 73  **.  ** A proces
a590: 73 20 6d 61 79 20 6f 6e 6c 79 20 6f 62 74 61 69  s may only obtai
a5a0: 6e 20 61 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b  n a PENDING lock
a5b0: 20 61 66 74 65 72 20 69 74 20 68 61 73 20 6f 62   after it has ob
a5c0: 74 61 69 6e 65 64 20 61 0a 20 20 2a 2a 20 53 48  tained a.  ** SH
a5d0: 41 52 45 44 20 6c 6f 63 6b 2e 20 41 20 50 45 4e  ARED lock. A PEN
a5e0: 44 49 4e 47 20 6c 6f 63 6b 20 69 73 20 69 6d 70  DING lock is imp
a5f0: 6c 65 6d 65 6e 74 65 64 20 62 79 20 6f 62 74 61  lemented by obta
a600: 69 6e 69 6e 67 20 61 20 77 72 69 74 65 2d 6c 6f  ining a write-lo
a610: 63 6b 0a 20 20 2a 2a 20 6f 6e 20 74 68 65 20 27  ck.  ** on the '
a620: 70 65 6e 64 69 6e 67 20 62 79 74 65 27 2e 20 54  pending byte'. T
a630: 68 69 73 20 65 6e 73 75 72 65 73 20 74 68 61 74  his ensures that
a640: 20 6e 6f 20 6e 65 77 20 53 48 41 52 45 44 20 6c   no new SHARED l
a650: 6f 63 6b 73 20 63 61 6e 20 62 65 0a 20 20 2a 2a  ocks can be.  **
a660: 20 6f 62 74 61 69 6e 65 64 2c 20 62 75 74 20 65   obtained, but e
a670: 78 69 73 74 69 6e 67 20 53 48 41 52 45 44 20 6c  xisting SHARED l
a680: 6f 63 6b 73 20 61 72 65 20 61 6c 6c 6f 77 65 64  ocks are allowed
a690: 20 74 6f 20 70 65 72 73 69 73 74 2e 20 41 20 70   to persist. A p
a6a0: 72 6f 63 65 73 73 0a 20 20 2a 2a 20 64 6f 65 73  rocess.  ** does
a6b0: 20 6e 6f 74 20 68 61 76 65 20 74 6f 20 6f 62 74   not have to obt
a6c0: 61 69 6e 20 61 20 52 45 53 45 52 56 45 44 20 6c  ain a RESERVED l
a6d0: 6f 63 6b 20 6f 6e 20 74 68 65 20 77 61 79 20 74  ock on the way t
a6e0: 6f 20 61 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b  o a PENDING lock
a6f0: 2e 0a 20 20 2a 2a 20 54 68 69 73 20 70 72 6f 70  ..  ** This prop
a700: 65 72 74 79 20 69 73 20 75 73 65 64 20 62 79 20  erty is used by 
a710: 74 68 65 20 61 6c 67 6f 72 69 74 68 6d 20 66 6f  the algorithm fo
a720: 72 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 61  r rolling back a
a730: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 20 20   journal file.  
a740: 2a 2a 20 61 66 74 65 72 20 61 20 63 72 61 73 68  ** after a crash
a750: 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 6e 20 45  ..  **.  ** An E
a760: 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2c 20 6f  XCLUSIVE lock, o
a770: 62 74 61 69 6e 65 64 20 61 66 74 65 72 20 61 20  btained after a 
a780: 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 20 69 73 20  PENDING lock is 
a790: 68 65 6c 64 2c 20 69 73 0a 20 20 2a 2a 20 69 6d  held, is.  ** im
a7a0: 70 6c 65 6d 65 6e 74 65 64 20 62 79 20 6f 62 74  plemented by obt
a7b0: 61 69 6e 69 6e 67 20 61 20 77 72 69 74 65 2d 6c  aining a write-l
a7c0: 6f 63 6b 20 6f 6e 20 74 68 65 20 65 6e 74 69 72  ock on the entir
a7d0: 65 20 27 73 68 61 72 65 64 20 62 79 74 65 0a 20  e 'shared byte. 
a7e0: 20 2a 2a 20 72 61 6e 67 65 27 2e 20 53 69 6e 63   ** range'. Sinc
a7f0: 65 20 61 6c 6c 20 6f 74 68 65 72 20 6c 6f 63 6b  e all other lock
a800: 73 20 72 65 71 75 69 72 65 20 61 20 72 65 61 64  s require a read
a810: 2d 6c 6f 63 6b 20 6f 6e 20 6f 6e 65 20 6f 66 20  -lock on one of 
a820: 74 68 65 20 62 79 74 65 73 0a 20 20 2a 2a 20 77  the bytes.  ** w
a830: 69 74 68 69 6e 20 74 68 69 73 20 72 61 6e 67 65  ithin this range
a840: 2c 20 74 68 69 73 20 65 6e 73 75 72 65 73 20 74  , this ensures t
a850: 68 61 74 20 6e 6f 20 6f 74 68 65 72 20 6c 6f 63  hat no other loc
a860: 6b 73 20 61 72 65 20 68 65 6c 64 20 6f 6e 20 74  ks are held on t
a870: 68 65 0a 20 20 2a 2a 20 64 61 74 61 62 61 73 65  he.  ** database
a880: 2e 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65  . .  **.  ** The
a890: 20 72 65 61 73 6f 6e 20 61 20 73 69 6e 67 6c 65   reason a single
a8a0: 20 62 79 74 65 20 63 61 6e 6e 6f 74 20 62 65 20   byte cannot be 
a8b0: 75 73 65 64 20 69 6e 73 74 65 61 64 20 6f 66 20  used instead of 
a8c0: 74 68 65 20 27 73 68 61 72 65 64 20 62 79 74 65  the 'shared byte
a8d0: 0a 20 20 2a 2a 20 72 61 6e 67 65 27 20 69 73 20  .  ** range' is 
a8e0: 74 68 61 74 20 73 6f 6d 65 20 76 65 72 73 69 6f  that some versio
a8f0: 6e 73 20 6f 66 20 77 69 6e 64 6f 77 73 20 64 6f  ns of windows do
a900: 20 6e 6f 74 20 73 75 70 70 6f 72 74 20 72 65 61   not support rea
a910: 64 2d 6c 6f 63 6b 73 2e 20 42 79 0a 20 20 2a 2a  d-locks. By.  **
a920: 20 6c 6f 63 6b 69 6e 67 20 61 20 72 61 6e 64 6f   locking a rando
a930: 6d 20 62 79 74 65 20 66 72 6f 6d 20 61 20 72 61  m byte from a ra
a940: 6e 67 65 2c 20 63 6f 6e 63 75 72 72 65 6e 74 20  nge, concurrent 
a950: 53 48 41 52 45 44 20 6c 6f 63 6b 73 20 6d 61 79  SHARED locks may
a960: 20 65 78 69 73 74 0a 20 20 2a 2a 20 65 76 65 6e   exist.  ** even
a970: 20 69 66 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20   if the locking 
a980: 70 72 69 6d 69 74 69 76 65 20 75 73 65 64 20 69  primitive used i
a990: 73 20 61 6c 77 61 79 73 20 61 20 77 72 69 74 65  s always a write
a9a0: 2d 6c 6f 63 6b 2e 0a 20 20 2a 2f 0a 20 20 69 6e  -lock..  */.  in
a9b0: 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
a9c0: 3b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46  ;.  unixFile *pF
a9d0: 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a  ile = (unixFile*
a9e0: 29 69 64 3b 0a 20 20 73 74 72 75 63 74 20 75 6e  )id;.  struct un
a9f0: 69 78 4c 6f 63 6b 49 6e 66 6f 20 2a 70 4c 6f 63  ixLockInfo *pLoc
aa00: 6b 20 3d 20 70 46 69 6c 65 2d 3e 70 4c 6f 63 6b  k = pFile->pLock
aa10: 3b 0a 20 20 73 74 72 75 63 74 20 66 6c 6f 63 6b  ;.  struct flock
aa20: 20 6c 6f 63 6b 3b 0a 20 20 69 6e 74 20 73 20 3d   lock;.  int s =
aa30: 20 30 3b 0a 20 20 69 6e 74 20 74 45 72 72 6e 6f   0;.  int tErrno
aa40: 20 3d 20 30 3b 0a 0a 20 20 61 73 73 65 72 74 28   = 0;..  assert(
aa50: 20 70 46 69 6c 65 20 29 3b 0a 20 20 4f 53 54 52   pFile );.  OSTR
aa60: 41 43 45 37 28 22 4c 4f 43 4b 20 20 20 20 25 64  ACE7("LOCK    %d
aa70: 20 25 73 20 77 61 73 20 25 73 28 25 73 2c 25 64   %s was %s(%s,%d
aa80: 29 20 70 69 64 3d 25 64 20 28 75 6e 69 78 29 5c  ) pid=%d (unix)\
aa90: 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 0a 20 20  n", pFile->h,.  
aaa0: 20 20 20 20 6c 6f 63 6b 74 79 70 65 4e 61 6d 65      locktypeName
aab0: 28 6c 6f 63 6b 74 79 70 65 29 2c 20 6c 6f 63 6b  (locktype), lock
aac0: 74 79 70 65 4e 61 6d 65 28 70 46 69 6c 65 2d 3e  typeName(pFile->
aad0: 6c 6f 63 6b 74 79 70 65 29 2c 0a 20 20 20 20 20  locktype),.     
aae0: 20 6c 6f 63 6b 74 79 70 65 4e 61 6d 65 28 70 4c   locktypeName(pL
aaf0: 6f 63 6b 2d 3e 6c 6f 63 6b 74 79 70 65 29 2c 20  ock->locktype), 
ab00: 70 4c 6f 63 6b 2d 3e 63 6e 74 20 2c 20 67 65 74  pLock->cnt , get
ab10: 70 69 64 28 29 29 3b 0a 0a 20 20 2f 2a 20 49 66  pid());..  /* If
ab20: 20 74 68 65 72 65 20 69 73 20 61 6c 72 65 61 64   there is alread
ab30: 79 20 61 20 6c 6f 63 6b 20 6f 66 20 74 68 69 73  y a lock of this
ab40: 20 74 79 70 65 20 6f 72 20 6d 6f 72 65 20 72 65   type or more re
ab50: 73 74 72 69 63 74 69 76 65 20 6f 6e 20 74 68 65  strictive on the
ab60: 0a 20 20 2a 2a 20 75 6e 69 78 46 69 6c 65 2c 20  .  ** unixFile, 
ab70: 64 6f 20 6e 6f 74 68 69 6e 67 2e 20 44 6f 6e 27  do nothing. Don'
ab80: 74 20 75 73 65 20 74 68 65 20 65 6e 64 5f 6c 6f  t use the end_lo
ab90: 63 6b 3a 20 65 78 69 74 20 70 61 74 68 2c 20 61  ck: exit path, a
aba0: 73 0a 20 20 2a 2a 20 75 6e 69 78 45 6e 74 65 72  s.  ** unixEnter
abb0: 4d 75 74 65 78 28 29 20 68 61 73 6e 27 74 20 62  Mutex() hasn't b
abc0: 65 65 6e 20 63 61 6c 6c 65 64 20 79 65 74 2e 0a  een called yet..
abd0: 20 20 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c 65    */.  if( pFile
abe0: 2d 3e 6c 6f 63 6b 74 79 70 65 3e 3d 6c 6f 63 6b  ->locktype>=lock
abf0: 74 79 70 65 20 29 7b 0a 20 20 20 20 4f 53 54 52  type ){.    OSTR
ac00: 41 43 45 33 28 22 4c 4f 43 4b 20 20 20 20 25 64  ACE3("LOCK    %d
ac10: 20 25 73 20 6f 6b 20 28 61 6c 72 65 61 64 79 20   %s ok (already 
ac20: 68 65 6c 64 29 20 28 75 6e 69 78 29 5c 6e 22 2c  held) (unix)\n",
ac30: 20 70 46 69 6c 65 2d 3e 68 2c 0a 20 20 20 20 20   pFile->h,.     
ac40: 20 20 20 20 20 20 20 6c 6f 63 6b 74 79 70 65 4e         locktypeN
ac50: 61 6d 65 28 6c 6f 63 6b 74 79 70 65 29 29 3b 0a  ame(locktype));.
ac60: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
ac70: 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  E_OK;.  }..  /* 
ac80: 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20 6c 6f  Make sure the lo
ac90: 63 6b 69 6e 67 20 73 65 71 75 65 6e 63 65 20 69  cking sequence i
aca0: 73 20 63 6f 72 72 65 63 74 2e 0a 20 20 2a 2a 20  s correct..  ** 
acb0: 20 28 31 29 20 57 65 20 6e 65 76 65 72 20 6d 6f   (1) We never mo
acc0: 76 65 20 66 72 6f 6d 20 75 6e 6c 6f 63 6b 65 64  ve from unlocked
acd0: 20 74 6f 20 61 6e 79 74 68 69 6e 67 20 68 69 67   to anything hig
ace0: 68 65 72 20 74 68 61 6e 20 73 68 61 72 65 64 20  her than shared 
acf0: 6c 6f 63 6b 2e 0a 20 20 2a 2a 20 20 28 32 29 20  lock..  **  (2) 
ad00: 53 51 4c 69 74 65 20 6e 65 76 65 72 20 65 78 70  SQLite never exp
ad10: 6c 69 63 69 74 6c 79 20 72 65 71 75 65 73 74 73  licitly requests
ad20: 20 61 20 70 65 6e 64 69 67 20 6c 6f 63 6b 2e 0a   a pendig lock..
ad30: 20 20 2a 2a 20 20 28 33 29 20 41 20 73 68 61 72    **  (3) A shar
ad40: 65 64 20 6c 6f 63 6b 20 69 73 20 61 6c 77 61 79  ed lock is alway
ad50: 73 20 68 65 6c 64 20 77 68 65 6e 20 61 20 72 65  s held when a re
ad60: 73 65 72 76 65 20 6c 6f 63 6b 20 69 73 20 72 65  serve lock is re
ad70: 71 75 65 73 74 65 64 2e 0a 20 20 2a 2f 0a 20 20  quested..  */.  
ad80: 61 73 73 65 72 74 28 20 70 46 69 6c 65 2d 3e 6c  assert( pFile->l
ad90: 6f 63 6b 74 79 70 65 21 3d 4e 4f 5f 4c 4f 43 4b  ocktype!=NO_LOCK
ada0: 20 7c 7c 20 6c 6f 63 6b 74 79 70 65 3d 3d 53 48   || locktype==SH
adb0: 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61  ARED_LOCK );.  a
adc0: 73 73 65 72 74 28 20 6c 6f 63 6b 74 79 70 65 21  ssert( locktype!
add0: 3d 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 20 29 3b  =PENDING_LOCK );
ade0: 0a 20 20 61 73 73 65 72 74 28 20 6c 6f 63 6b 74  .  assert( lockt
adf0: 79 70 65 21 3d 52 45 53 45 52 56 45 44 5f 4c 4f  ype!=RESERVED_LO
ae00: 43 4b 20 7c 7c 20 70 46 69 6c 65 2d 3e 6c 6f 63  CK || pFile->loc
ae10: 6b 74 79 70 65 3d 3d 53 48 41 52 45 44 5f 4c 4f  ktype==SHARED_LO
ae20: 43 4b 20 29 3b 0a 0a 20 20 2f 2a 20 54 68 69 73  CK );..  /* This
ae30: 20 6d 75 74 65 78 20 69 73 20 6e 65 65 64 65 64   mutex is needed
ae40: 20 62 65 63 61 75 73 65 20 70 46 69 6c 65 2d 3e   because pFile->
ae50: 70 4c 6f 63 6b 20 69 73 20 73 68 61 72 65 64 20  pLock is shared 
ae60: 61 63 72 6f 73 73 20 74 68 72 65 61 64 73 0a 20  across threads. 
ae70: 20 2a 2f 0a 20 20 75 6e 69 78 45 6e 74 65 72 4d   */.  unixEnterM
ae80: 75 74 65 78 28 29 3b 0a 0a 20 20 2f 2a 20 4d 61  utex();..  /* Ma
ae90: 6b 65 20 73 75 72 65 20 74 68 65 20 63 75 72 72  ke sure the curr
aea0: 65 6e 74 20 74 68 72 65 61 64 20 6f 77 6e 73 20  ent thread owns 
aeb0: 74 68 65 20 70 46 69 6c 65 2e 0a 20 20 2a 2f 0a  the pFile..  */.
aec0: 20 20 72 63 20 3d 20 74 72 61 6e 73 66 65 72 4f    rc = transferO
aed0: 77 6e 65 72 73 68 69 70 28 70 46 69 6c 65 29 3b  wnership(pFile);
aee0: 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
aef0: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 75 6e 69 78  E_OK ){.    unix
af00: 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 20 20  LeaveMutex();.  
af10: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d    return rc;.  }
af20: 0a 20 20 70 4c 6f 63 6b 20 3d 20 70 46 69 6c 65  .  pLock = pFile
af30: 2d 3e 70 4c 6f 63 6b 3b 0a 0a 20 20 2f 2a 20 49  ->pLock;..  /* I
af40: 66 20 73 6f 6d 65 20 74 68 72 65 61 64 20 75 73  f some thread us
af50: 69 6e 67 20 74 68 69 73 20 50 49 44 20 68 61 73  ing this PID has
af60: 20 61 20 6c 6f 63 6b 20 76 69 61 20 61 20 64 69   a lock via a di
af70: 66 66 65 72 65 6e 74 20 75 6e 69 78 46 69 6c 65  fferent unixFile
af80: 2a 0a 20 20 2a 2a 20 68 61 6e 64 6c 65 20 74 68  *.  ** handle th
af90: 61 74 20 70 72 65 63 6c 75 64 65 73 20 74 68 65  at precludes the
afa0: 20 72 65 71 75 65 73 74 65 64 20 6c 6f 63 6b 2c   requested lock,
afb0: 20 72 65 74 75 72 6e 20 42 55 53 59 2e 0a 20 20   return BUSY..  
afc0: 2a 2f 0a 20 20 69 66 28 20 28 70 46 69 6c 65 2d  */.  if( (pFile-
afd0: 3e 6c 6f 63 6b 74 79 70 65 21 3d 70 4c 6f 63 6b  >locktype!=pLock
afe0: 2d 3e 6c 6f 63 6b 74 79 70 65 20 26 26 20 0a 20  ->locktype && . 
aff0: 20 20 20 20 20 20 20 20 20 28 70 4c 6f 63 6b 2d           (pLock-
b000: 3e 6c 6f 63 6b 74 79 70 65 3e 3d 50 45 4e 44 49  >locktype>=PENDI
b010: 4e 47 5f 4c 4f 43 4b 20 7c 7c 20 6c 6f 63 6b 74  NG_LOCK || lockt
b020: 79 70 65 3e 53 48 41 52 45 44 5f 4c 4f 43 4b 29  ype>SHARED_LOCK)
b030: 29 0a 20 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  ).  ){.    rc = 
b040: 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20  SQLITE_BUSY;.   
b050: 20 67 6f 74 6f 20 65 6e 64 5f 6c 6f 63 6b 3b 0a   goto end_lock;.
b060: 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 61 20 53    }..  /* If a S
b070: 48 41 52 45 44 20 6c 6f 63 6b 20 69 73 20 72 65  HARED lock is re
b080: 71 75 65 73 74 65 64 2c 20 61 6e 64 20 73 6f 6d  quested, and som
b090: 65 20 74 68 72 65 61 64 20 75 73 69 6e 67 20 74  e thread using t
b0a0: 68 69 73 20 50 49 44 20 61 6c 72 65 61 64 79 0a  his PID already.
b0b0: 20 20 2a 2a 20 68 61 73 20 61 20 53 48 41 52 45    ** has a SHARE
b0c0: 44 20 6f 72 20 52 45 53 45 52 56 45 44 20 6c 6f  D or RESERVED lo
b0d0: 63 6b 2c 20 74 68 65 6e 20 69 6e 63 72 65 6d 65  ck, then increme
b0e0: 6e 74 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75  nt reference cou
b0f0: 6e 74 73 20 61 6e 64 0a 20 20 2a 2a 20 72 65 74  nts and.  ** ret
b100: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 20  urn SQLITE_OK.. 
b110: 20 2a 2f 0a 20 20 69 66 28 20 6c 6f 63 6b 74 79   */.  if( lockty
b120: 70 65 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20  pe==SHARED_LOCK 
b130: 26 26 20 0a 20 20 20 20 20 20 28 70 4c 6f 63 6b  && .      (pLock
b140: 2d 3e 6c 6f 63 6b 74 79 70 65 3d 3d 53 48 41 52  ->locktype==SHAR
b150: 45 44 5f 4c 4f 43 4b 20 7c 7c 20 70 4c 6f 63 6b  ED_LOCK || pLock
b160: 2d 3e 6c 6f 63 6b 74 79 70 65 3d 3d 52 45 53 45  ->locktype==RESE
b170: 52 56 45 44 5f 4c 4f 43 4b 29 20 29 7b 0a 20 20  RVED_LOCK) ){.  
b180: 20 20 61 73 73 65 72 74 28 20 6c 6f 63 6b 74 79    assert( lockty
b190: 70 65 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20  pe==SHARED_LOCK 
b1a0: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
b1b0: 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3d 3d  File->locktype==
b1c0: 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  0 );.    assert(
b1d0: 20 70 4c 6f 63 6b 2d 3e 63 6e 74 3e 30 20 29 3b   pLock->cnt>0 );
b1e0: 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b  .    pFile->lock
b1f0: 74 79 70 65 20 3d 20 53 48 41 52 45 44 5f 4c 4f  type = SHARED_LO
b200: 43 4b 3b 0a 20 20 20 20 70 4c 6f 63 6b 2d 3e 63  CK;.    pLock->c
b210: 6e 74 2b 2b 3b 0a 20 20 20 20 70 46 69 6c 65 2d  nt++;.    pFile-
b220: 3e 70 4f 70 65 6e 2d 3e 6e 4c 6f 63 6b 2b 2b 3b  >pOpen->nLock++;
b230: 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 6c 6f  .    goto end_lo
b240: 63 6b 3b 0a 20 20 7d 0a 0a 0a 20 20 2f 2a 20 41  ck;.  }...  /* A
b250: 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 20 69 73   PENDING lock is
b260: 20 6e 65 65 64 65 64 20 62 65 66 6f 72 65 20 61   needed before a
b270: 63 71 75 69 72 69 6e 67 20 61 20 53 48 41 52 45  cquiring a SHARE
b280: 44 20 6c 6f 63 6b 20 61 6e 64 20 62 65 66 6f 72  D lock and befor
b290: 65 0a 20 20 2a 2a 20 61 63 71 75 69 72 69 6e 67  e.  ** acquiring
b2a0: 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f   an EXCLUSIVE lo
b2b0: 63 6b 2e 20 20 46 6f 72 20 74 68 65 20 53 48 41  ck.  For the SHA
b2c0: 52 45 44 20 6c 6f 63 6b 2c 20 74 68 65 20 50 45  RED lock, the PE
b2d0: 4e 44 49 4e 47 20 77 69 6c 6c 0a 20 20 2a 2a 20  NDING will.  ** 
b2e0: 62 65 20 72 65 6c 65 61 73 65 64 2e 0a 20 20 2a  be released..  *
b2f0: 2f 0a 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d  /.  lock.l_len =
b300: 20 31 4c 3b 0a 20 20 6c 6f 63 6b 2e 6c 5f 77 68   1L;.  lock.l_wh
b310: 65 6e 63 65 20 3d 20 53 45 45 4b 5f 53 45 54 3b  ence = SEEK_SET;
b320: 0a 20 20 69 66 28 20 6c 6f 63 6b 74 79 70 65 3d  .  if( locktype=
b330: 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 0a 20 20  =SHARED_LOCK .  
b340: 20 20 20 20 7c 7c 20 28 6c 6f 63 6b 74 79 70 65      || (locktype
b350: 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b  ==EXCLUSIVE_LOCK
b360: 20 26 26 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74   && pFile->lockt
b370: 79 70 65 3c 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b  ype<PENDING_LOCK
b380: 29 0a 20 20 29 7b 0a 20 20 20 20 6c 6f 63 6b 2e  ).  ){.    lock.
b390: 6c 5f 74 79 70 65 20 3d 20 28 6c 6f 63 6b 74 79  l_type = (lockty
b3a0: 70 65 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 3f  pe==SHARED_LOCK?
b3b0: 46 5f 52 44 4c 43 4b 3a 46 5f 57 52 4c 43 4b 29  F_RDLCK:F_WRLCK)
b3c0: 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61  ;.    lock.l_sta
b3d0: 72 74 20 3d 20 50 45 4e 44 49 4e 47 5f 42 59 54  rt = PENDING_BYT
b3e0: 45 3b 0a 20 20 20 20 73 20 3d 20 66 63 6e 74 6c  E;.    s = fcntl
b3f0: 28 70 46 69 6c 65 2d 3e 68 2c 20 46 5f 53 45 54  (pFile->h, F_SET
b400: 4c 4b 2c 20 26 6c 6f 63 6b 29 3b 0a 20 20 20 20  LK, &lock);.    
b410: 69 66 28 20 73 3d 3d 28 2d 31 29 20 29 7b 0a 20  if( s==(-1) ){. 
b420: 20 20 20 20 20 74 45 72 72 6e 6f 20 3d 20 65 72       tErrno = er
b430: 72 6e 6f 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  rno;.      rc = 
b440: 73 71 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d 50  sqliteErrorFromP
b450: 6f 73 69 78 45 72 72 6f 72 28 74 45 72 72 6e 6f  osixError(tErrno
b460: 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4c  , SQLITE_IOERR_L
b470: 4f 43 4b 29 3b 0a 20 20 20 20 20 20 69 66 28 20  OCK);.      if( 
b480: 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 72 63  IS_LOCK_ERROR(rc
b490: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 70 46 69  ) ){.        pFi
b4a0: 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20  le->lastErrno = 
b4b0: 74 45 72 72 6e 6f 3b 0a 20 20 20 20 20 20 7d 0a  tErrno;.      }.
b4c0: 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 6c        goto end_l
b4d0: 6f 63 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  ock;.    }.  }..
b4e0: 0a 20 20 2f 2a 20 49 66 20 63 6f 6e 74 72 6f 6c  .  /* If control
b4f0: 20 67 65 74 73 20 74 6f 20 74 68 69 73 20 70 6f   gets to this po
b500: 69 6e 74 2c 20 74 68 65 6e 20 61 63 74 75 61 6c  int, then actual
b510: 6c 79 20 67 6f 20 61 68 65 61 64 20 61 6e 64 20  ly go ahead and 
b520: 6d 61 6b 65 0a 20 20 2a 2a 20 6f 70 65 72 61 74  make.  ** operat
b530: 69 6e 67 20 73 79 73 74 65 6d 20 63 61 6c 6c 73  ing system calls
b540: 20 66 6f 72 20 74 68 65 20 73 70 65 63 69 66 69   for the specifi
b550: 65 64 20 6c 6f 63 6b 2e 0a 20 20 2a 2f 0a 20 20  ed lock..  */.  
b560: 69 66 28 20 6c 6f 63 6b 74 79 70 65 3d 3d 53 48  if( locktype==SH
b570: 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20  ARED_LOCK ){.   
b580: 20 61 73 73 65 72 74 28 20 70 4c 6f 63 6b 2d 3e   assert( pLock->
b590: 63 6e 74 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73  cnt==0 );.    as
b5a0: 73 65 72 74 28 20 70 4c 6f 63 6b 2d 3e 6c 6f 63  sert( pLock->loc
b5b0: 6b 74 79 70 65 3d 3d 30 20 29 3b 0a 0a 20 20 20  ktype==0 );..   
b5c0: 20 2f 2a 20 4e 6f 77 20 67 65 74 20 74 68 65 20   /* Now get the 
b5d0: 72 65 61 64 2d 6c 6f 63 6b 20 2a 2f 0a 20 20 20  read-lock */.   
b5e0: 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20   lock.l_start = 
b5f0: 53 48 41 52 45 44 5f 46 49 52 53 54 3b 0a 20 20  SHARED_FIRST;.  
b600: 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 53    lock.l_len = S
b610: 48 41 52 45 44 5f 53 49 5a 45 3b 0a 20 20 20 20  HARED_SIZE;.    
b620: 69 66 28 20 28 73 20 3d 20 66 63 6e 74 6c 28 70  if( (s = fcntl(p
b630: 46 69 6c 65 2d 3e 68 2c 20 46 5f 53 45 54 4c 4b  File->h, F_SETLK
b640: 2c 20 26 6c 6f 63 6b 29 29 3d 3d 28 2d 31 29 20  , &lock))==(-1) 
b650: 29 7b 0a 20 20 20 20 20 20 74 45 72 72 6e 6f 20  ){.      tErrno 
b660: 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 7d 0a 20  = errno;.    }. 
b670: 20 20 20 2f 2a 20 44 72 6f 70 20 74 68 65 20 74     /* Drop the t
b680: 65 6d 70 6f 72 61 72 79 20 50 45 4e 44 49 4e 47  emporary PENDING
b690: 20 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20 6c 6f 63   lock */.    loc
b6a0: 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 50 45 4e 44  k.l_start = PEND
b6b0: 49 4e 47 5f 42 59 54 45 3b 0a 20 20 20 20 6c 6f  ING_BYTE;.    lo
b6c0: 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 31 4c 3b 0a 20  ck.l_len = 1L;. 
b6d0: 20 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d     lock.l_type =
b6e0: 20 46 5f 55 4e 4c 43 4b 3b 0a 20 20 20 20 69 66   F_UNLCK;.    if
b6f0: 28 20 66 63 6e 74 6c 28 70 46 69 6c 65 2d 3e 68  ( fcntl(pFile->h
b700: 2c 20 46 5f 53 45 54 4c 4b 2c 20 26 6c 6f 63 6b  , F_SETLK, &lock
b710: 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66  )!=0 ){.      if
b720: 28 20 73 20 21 3d 20 2d 31 20 29 7b 0a 20 20 20  ( s != -1 ){.   
b730: 20 20 20 20 20 2f 2a 20 54 68 69 73 20 63 6f 75       /* This cou
b740: 6c 64 20 68 61 70 70 65 6e 20 77 69 74 68 20 61  ld happen with a
b750: 20 6e 65 74 77 6f 72 6b 20 6d 6f 75 6e 74 20 2a   network mount *
b760: 2f 0a 20 20 20 20 20 20 20 20 74 45 72 72 6e 6f  /.        tErrno
b770: 20 3d 20 65 72 72 6e 6f 3b 20 0a 20 20 20 20 20   = errno; .     
b780: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 45 72     rc = sqliteEr
b790: 72 6f 72 46 72 6f 6d 50 6f 73 69 78 45 72 72 6f  rorFromPosixErro
b7a0: 72 28 74 45 72 72 6e 6f 2c 20 53 51 4c 49 54 45  r(tErrno, SQLITE
b7b0: 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 29 3b 20  _IOERR_UNLOCK); 
b7c0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 49 53 5f  .        if( IS_
b7d0: 4c 4f 43 4b 5f 45 52 52 4f 52 28 72 63 29 20 29  LOCK_ERROR(rc) )
b7e0: 7b 0a 20 20 20 20 20 20 20 20 20 20 70 46 69 6c  {.          pFil
b7f0: 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 74  e->lastErrno = t
b800: 45 72 72 6e 6f 3b 0a 20 20 20 20 20 20 20 20 7d  Errno;.        }
b810: 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e  .        goto en
b820: 64 5f 6c 6f 63 6b 3b 0a 20 20 20 20 20 20 7d 0a  d_lock;.      }.
b830: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 73 3d      }.    if( s=
b840: 3d 28 2d 31 29 20 29 7b 0a 20 20 20 20 20 20 72  =(-1) ){.      r
b850: 63 20 3d 20 73 71 6c 69 74 65 45 72 72 6f 72 46  c = sqliteErrorF
b860: 72 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28 74 45  romPosixError(tE
b870: 72 72 6e 6f 2c 20 53 51 4c 49 54 45 5f 49 4f 45  rrno, SQLITE_IOE
b880: 52 52 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20  RR_LOCK);.      
b890: 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f  if( IS_LOCK_ERRO
b8a0: 52 28 72 63 29 20 29 7b 0a 20 20 20 20 20 20 20  R(rc) ){.       
b8b0: 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e   pFile->lastErrn
b8c0: 6f 20 3d 20 74 45 72 72 6e 6f 3b 0a 20 20 20 20  o = tErrno;.    
b8d0: 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20    }.    }else{. 
b8e0: 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b       pFile->lock
b8f0: 74 79 70 65 20 3d 20 53 48 41 52 45 44 5f 4c 4f  type = SHARED_LO
b900: 43 4b 3b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d  CK;.      pFile-
b910: 3e 70 4f 70 65 6e 2d 3e 6e 4c 6f 63 6b 2b 2b 3b  >pOpen->nLock++;
b920: 0a 20 20 20 20 20 20 70 4c 6f 63 6b 2d 3e 63 6e  .      pLock->cn
b930: 74 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d  t = 1;.    }.  }
b940: 65 6c 73 65 20 69 66 28 20 6c 6f 63 6b 74 79 70  else if( locktyp
b950: 65 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43  e==EXCLUSIVE_LOC
b960: 4b 20 26 26 20 70 4c 6f 63 6b 2d 3e 63 6e 74 3e  K && pLock->cnt>
b970: 31 20 29 7b 0a 20 20 20 20 2f 2a 20 57 65 20 61  1 ){.    /* We a
b980: 72 65 20 74 72 79 69 6e 67 20 66 6f 72 20 61 6e  re trying for an
b990: 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20   exclusive lock 
b9a0: 62 75 74 20 61 6e 6f 74 68 65 72 20 74 68 72 65  but another thre
b9b0: 61 64 20 69 6e 20 74 68 69 73 0a 20 20 20 20 2a  ad in this.    *
b9c0: 2a 20 73 61 6d 65 20 70 72 6f 63 65 73 73 20 69  * same process i
b9d0: 73 20 73 74 69 6c 6c 20 68 6f 6c 64 69 6e 67 20  s still holding 
b9e0: 61 20 73 68 61 72 65 64 20 6c 6f 63 6b 2e 20 2a  a shared lock. *
b9f0: 2f 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  /.    rc = SQLIT
ba00: 45 5f 42 55 53 59 3b 0a 20 20 7d 65 6c 73 65 7b  E_BUSY;.  }else{
ba10: 0a 20 20 20 20 2f 2a 20 54 68 65 20 72 65 71 75  .    /* The requ
ba20: 65 73 74 20 77 61 73 20 66 6f 72 20 61 20 52 45  est was for a RE
ba30: 53 45 52 56 45 44 20 6f 72 20 45 58 43 4c 55 53  SERVED or EXCLUS
ba40: 49 56 45 20 6c 6f 63 6b 2e 20 20 49 74 20 69 73  IVE lock.  It is
ba50: 0a 20 20 20 20 2a 2a 20 61 73 73 75 6d 65 64 20  .    ** assumed 
ba60: 74 68 61 74 20 74 68 65 72 65 20 69 73 20 61 20  that there is a 
ba70: 53 48 41 52 45 44 20 6f 72 20 67 72 65 61 74 65  SHARED or greate
ba80: 72 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 66 69  r lock on the fi
ba90: 6c 65 0a 20 20 20 20 2a 2a 20 61 6c 72 65 61 64  le.    ** alread
baa0: 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73  y..    */.    as
bab0: 73 65 72 74 28 20 30 21 3d 70 46 69 6c 65 2d 3e  sert( 0!=pFile->
bac0: 6c 6f 63 6b 74 79 70 65 20 29 3b 0a 20 20 20 20  locktype );.    
bad0: 6c 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d 20 46 5f  lock.l_type = F_
bae0: 57 52 4c 43 4b 3b 0a 20 20 20 20 73 77 69 74 63  WRLCK;.    switc
baf0: 68 28 20 6c 6f 63 6b 74 79 70 65 20 29 7b 0a 20  h( locktype ){. 
bb00: 20 20 20 20 20 63 61 73 65 20 52 45 53 45 52 56       case RESERV
bb10: 45 44 5f 4c 4f 43 4b 3a 0a 20 20 20 20 20 20 20  ED_LOCK:.       
bb20: 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20   lock.l_start = 
bb30: 52 45 53 45 52 56 45 44 5f 42 59 54 45 3b 0a 20  RESERVED_BYTE;. 
bb40: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
bb50: 20 20 20 20 63 61 73 65 20 45 58 43 4c 55 53 49      case EXCLUSI
bb60: 56 45 5f 4c 4f 43 4b 3a 0a 20 20 20 20 20 20 20  VE_LOCK:.       
bb70: 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20   lock.l_start = 
bb80: 53 48 41 52 45 44 5f 46 49 52 53 54 3b 0a 20 20  SHARED_FIRST;.  
bb90: 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e        lock.l_len
bba0: 20 3d 20 53 48 41 52 45 44 5f 53 49 5a 45 3b 0a   = SHARED_SIZE;.
bbb0: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
bbc0: 20 20 20 20 20 64 65 66 61 75 6c 74 3a 0a 20 20       default:.  
bbd0: 20 20 20 20 20 20 61 73 73 65 72 74 28 30 29 3b        assert(0);
bbe0: 0a 20 20 20 20 7d 0a 20 20 20 20 73 20 3d 20 66  .    }.    s = f
bbf0: 63 6e 74 6c 28 70 46 69 6c 65 2d 3e 68 2c 20 46  cntl(pFile->h, F
bc00: 5f 53 45 54 4c 4b 2c 20 26 6c 6f 63 6b 29 3b 0a  _SETLK, &lock);.
bc10: 20 20 20 20 69 66 28 20 73 3d 3d 28 2d 31 29 20      if( s==(-1) 
bc20: 29 7b 0a 20 20 20 20 20 20 74 45 72 72 6e 6f 20  ){.      tErrno 
bc30: 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20 72  = errno;.      r
bc40: 63 20 3d 20 73 71 6c 69 74 65 45 72 72 6f 72 46  c = sqliteErrorF
bc50: 72 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28 74 45  romPosixError(tE
bc60: 72 72 6e 6f 2c 20 53 51 4c 49 54 45 5f 49 4f 45  rrno, SQLITE_IOE
bc70: 52 52 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20  RR_LOCK);.      
bc80: 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f  if( IS_LOCK_ERRO
bc90: 52 28 72 63 29 20 29 7b 0a 20 20 20 20 20 20 20  R(rc) ){.       
bca0: 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e   pFile->lastErrn
bcb0: 6f 20 3d 20 74 45 72 72 6e 6f 3b 0a 20 20 20 20  o = tErrno;.    
bcc0: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20    }.    }.  }.  
bcd0: 0a 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47  ..#ifndef NDEBUG
bce0: 0a 20 20 2f 2a 20 53 65 74 20 75 70 20 74 68 65  .  /* Set up the
bcf0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 2d 63 6f 75   transaction-cou
bd00: 6e 74 65 72 20 63 68 61 6e 67 65 20 63 68 65 63  nter change chec
bd10: 6b 69 6e 67 20 66 6c 61 67 73 20 77 68 65 6e 0a  king flags when.
bd20: 20 20 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e 69    ** transitioni
bd30: 6e 67 20 66 72 6f 6d 20 61 20 53 48 41 52 45 44  ng from a SHARED
bd40: 20 74 6f 20 61 20 52 45 53 45 52 56 45 44 20 6c   to a RESERVED l
bd50: 6f 63 6b 2e 20 20 54 68 65 20 63 68 61 6e 67 65  ock.  The change
bd60: 0a 20 20 2a 2a 20 66 72 6f 6d 20 53 48 41 52 45  .  ** from SHARE
bd70: 44 20 74 6f 20 52 45 53 45 52 56 45 44 20 6d 61  D to RESERVED ma
bd80: 72 6b 73 20 74 68 65 20 62 65 67 69 6e 6e 69 6e  rks the beginnin
bd90: 67 20 6f 66 20 61 20 6e 6f 72 6d 61 6c 0a 20 20  g of a normal.  
bda0: 2a 2a 20 77 72 69 74 65 20 6f 70 65 72 61 74 69  ** write operati
bdb0: 6f 6e 20 28 6e 6f 74 20 61 20 68 6f 74 20 6a 6f  on (not a hot jo
bdc0: 75 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 29 2e  urnal rollback).
bdd0: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 72 63 3d 3d  .  */.  if( rc==
bde0: 53 51 4c 49 54 45 5f 4f 4b 0a 20 20 20 26 26 20  SQLITE_OK.   && 
bdf0: 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3c  pFile->locktype<
be00: 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 0a 20 20 20  =SHARED_LOCK.   
be10: 26 26 20 6c 6f 63 6b 74 79 70 65 3d 3d 52 45 53  && locktype==RES
be20: 45 52 56 45 44 5f 4c 4f 43 4b 0a 20 20 29 7b 0a  ERVED_LOCK.  ){.
be30: 20 20 20 20 70 46 69 6c 65 2d 3e 74 72 61 6e 73      pFile->trans
be40: 43 6e 74 72 43 68 6e 67 20 3d 20 30 3b 0a 20 20  CntrChng = 0;.  
be50: 20 20 70 46 69 6c 65 2d 3e 64 62 55 70 64 61 74    pFile->dbUpdat
be60: 65 20 3d 20 30 3b 0a 20 20 20 20 70 46 69 6c 65  e = 0;.    pFile
be70: 2d 3e 69 6e 4e 6f 72 6d 61 6c 57 72 69 74 65 20  ->inNormalWrite 
be80: 3d 20 31 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  = 1;.  }.#endif.
be90: 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ..  if( rc==SQLI
bea0: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 46 69  TE_OK ){.    pFi
beb0: 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 20 3d 20 6c  le->locktype = l
bec0: 6f 63 6b 74 79 70 65 3b 0a 20 20 20 20 70 4c 6f  ocktype;.    pLo
bed0: 63 6b 2d 3e 6c 6f 63 6b 74 79 70 65 20 3d 20 6c  ck->locktype = l
bee0: 6f 63 6b 74 79 70 65 3b 0a 20 20 7d 65 6c 73 65  ocktype;.  }else
bef0: 20 69 66 28 20 6c 6f 63 6b 74 79 70 65 3d 3d 45   if( locktype==E
bf00: 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 29 7b  XCLUSIVE_LOCK ){
bf10: 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b  .    pFile->lock
bf20: 74 79 70 65 20 3d 20 50 45 4e 44 49 4e 47 5f 4c  type = PENDING_L
bf30: 4f 43 4b 3b 0a 20 20 20 20 70 4c 6f 63 6b 2d 3e  OCK;.    pLock->
bf40: 6c 6f 63 6b 74 79 70 65 20 3d 20 50 45 4e 44 49  locktype = PENDI
bf50: 4e 47 5f 4c 4f 43 4b 3b 0a 20 20 7d 0a 0a 65 6e  NG_LOCK;.  }..en
bf60: 64 5f 6c 6f 63 6b 3a 0a 20 20 75 6e 69 78 4c 65  d_lock:.  unixLe
bf70: 61 76 65 4d 75 74 65 78 28 29 3b 0a 20 20 4f 53  aveMutex();.  OS
bf80: 54 52 41 43 45 34 28 22 4c 4f 43 4b 20 20 20 20  TRACE4("LOCK    
bf90: 25 64 20 25 73 20 25 73 20 28 75 6e 69 78 29 5c  %d %s %s (unix)\
bfa0: 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 6c 6f  n", pFile->h, lo
bfb0: 63 6b 74 79 70 65 4e 61 6d 65 28 6c 6f 63 6b 74  cktypeName(lockt
bfc0: 79 70 65 29 2c 20 0a 20 20 20 20 20 20 72 63 3d  ype), .      rc=
bfd0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 3f 20 22 6f 6b  =SQLITE_OK ? "ok
bfe0: 22 20 3a 20 22 66 61 69 6c 65 64 22 29 3b 0a 20  " : "failed");. 
bff0: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
c000: 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 6c 6c 20 66  *.** Close all f
c010: 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 73 20  ile descriptors 
c020: 61 63 63 75 6d 75 61 74 65 64 20 69 6e 20 74 68  accumuated in th
c030: 65 20 75 6e 69 78 4f 70 65 6e 43 6e 74 2d 3e 70  e unixOpenCnt->p
c040: 55 6e 75 73 65 64 20 6c 69 73 74 2e 0a 2a 2a 20  Unused list..** 
c050: 49 66 20 61 6c 6c 20 73 75 63 68 20 66 69 6c 65  If all such file
c060: 20 64 65 73 63 72 69 70 74 6f 72 73 20 61 72 65   descriptors are
c070: 20 63 6c 6f 73 65 64 20 77 69 74 68 6f 75 74 20   closed without 
c080: 65 72 72 6f 72 2c 20 74 68 65 20 6c 69 73 74 20  error, the list 
c090: 69 73 0a 2a 2a 20 63 6c 65 61 72 65 64 20 61 6e  is.** cleared an
c0a0: 64 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75  d SQLITE_OK retu
c0b0: 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65  rned..**.** Othe
c0c0: 72 77 69 73 65 2c 20 69 66 20 61 6e 20 65 72 72  rwise, if an err
c0d0: 6f 72 20 6f 63 63 75 72 73 2c 20 74 68 65 6e 20  or occurs, then 
c0e0: 73 75 63 63 65 73 73 66 75 6c 6c 79 20 63 6c 6f  successfully clo
c0f0: 73 65 64 20 66 69 6c 65 20 64 65 73 63 72 69 70  sed file descrip
c100: 74 6f 72 0a 2a 2a 20 65 6e 74 72 69 65 73 20 61  tor.** entries a
c110: 72 65 20 72 65 6d 6f 76 65 64 20 66 72 6f 6d 20  re removed from 
c120: 74 68 65 20 6c 69 73 74 2c 20 61 6e 64 20 53 51  the list, and SQ
c130: 4c 49 54 45 5f 49 4f 45 52 52 5f 43 4c 4f 53 45  LITE_IOERR_CLOSE
c140: 20 72 65 74 75 72 6e 65 64 2e 20 0a 2a 2a 20 6e   returned. .** n
c150: 6f 74 20 64 65 6c 65 74 65 64 20 61 6e 64 20 53  ot deleted and S
c160: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43 4c 4f 53  QLITE_IOERR_CLOS
c170: 45 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 20 0a  E returned..*/ .
c180: 73 74 61 74 69 63 20 69 6e 74 20 63 6c 6f 73 65  static int close
c190: 50 65 6e 64 69 6e 67 46 64 73 28 75 6e 69 78 46  PendingFds(unixF
c1a0: 69 6c 65 20 2a 70 46 69 6c 65 29 7b 0a 20 20 69  ile *pFile){.  i
c1b0: 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
c1c0: 4b 3b 0a 20 20 73 74 72 75 63 74 20 75 6e 69 78  K;.  struct unix
c1d0: 4f 70 65 6e 43 6e 74 20 2a 70 4f 70 65 6e 20 3d  OpenCnt *pOpen =
c1e0: 20 70 46 69 6c 65 2d 3e 70 4f 70 65 6e 3b 0a 20   pFile->pOpen;. 
c1f0: 20 55 6e 69 78 55 6e 75 73 65 64 46 64 20 2a 70   UnixUnusedFd *p
c200: 45 72 72 6f 72 20 3d 20 30 3b 0a 20 20 55 6e 69  Error = 0;.  Uni
c210: 78 55 6e 75 73 65 64 46 64 20 2a 70 3b 0a 20 20  xUnusedFd *p;.  
c220: 55 6e 69 78 55 6e 75 73 65 64 46 64 20 2a 70 4e  UnixUnusedFd *pN
c230: 65 78 74 3b 0a 20 20 66 6f 72 28 70 3d 70 4f 70  ext;.  for(p=pOp
c240: 65 6e 2d 3e 70 55 6e 75 73 65 64 3b 20 70 3b 20  en->pUnused; p; 
c250: 70 3d 70 4e 65 78 74 29 7b 0a 20 20 20 20 70 4e  p=pNext){.    pN
c260: 65 78 74 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a  ext = p->pNext;.
c270: 20 20 20 20 69 66 28 20 63 6c 6f 73 65 28 70 2d      if( close(p-
c280: 3e 66 64 29 20 29 7b 0a 20 20 20 20 20 20 70 46  >fd) ){.      pF
c290: 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d  ile->lastErrno =
c2a0: 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20 72 63   errno;.      rc
c2b0: 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f   = SQLITE_IOERR_
c2c0: 43 4c 4f 53 45 3b 0a 20 20 20 20 20 20 70 2d 3e  CLOSE;.      p->
c2d0: 70 4e 65 78 74 20 3d 20 70 45 72 72 6f 72 3b 0a  pNext = pError;.
c2e0: 20 20 20 20 20 20 70 45 72 72 6f 72 20 3d 20 70        pError = p
c2f0: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
c300: 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
c310: 70 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  p);.    }.  }.  
c320: 70 4f 70 65 6e 2d 3e 70 55 6e 75 73 65 64 20 3d  pOpen->pUnused =
c330: 20 70 45 72 72 6f 72 3b 0a 20 20 72 65 74 75 72   pError;.  retur
c340: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  n rc;.}../*.** A
c350: 64 64 20 74 68 65 20 66 69 6c 65 20 64 65 73 63  dd the file desc
c360: 72 69 70 74 6f 72 20 75 73 65 64 20 62 79 20 66  riptor used by f
c370: 69 6c 65 20 68 61 6e 64 6c 65 20 70 46 69 6c 65  ile handle pFile
c380: 20 74 6f 20 74 68 65 20 63 6f 72 72 65 73 70 6f   to the correspo
c390: 6e 64 69 6e 67 0a 2a 2a 20 70 55 6e 75 73 65 64  nding.** pUnused
c3a0: 20 6c 69 73 74 2e 0a 2a 2f 0a 73 74 61 74 69 63   list..*/.static
c3b0: 20 76 6f 69 64 20 73 65 74 50 65 6e 64 69 6e 67   void setPending
c3c0: 46 64 28 75 6e 69 78 46 69 6c 65 20 2a 70 46 69  Fd(unixFile *pFi
c3d0: 6c 65 29 7b 0a 20 20 73 74 72 75 63 74 20 75 6e  le){.  struct un
c3e0: 69 78 4f 70 65 6e 43 6e 74 20 2a 70 4f 70 65 6e  ixOpenCnt *pOpen
c3f0: 20 3d 20 70 46 69 6c 65 2d 3e 70 4f 70 65 6e 3b   = pFile->pOpen;
c400: 0a 20 20 55 6e 69 78 55 6e 75 73 65 64 46 64 20  .  UnixUnusedFd 
c410: 2a 70 20 3d 20 70 46 69 6c 65 2d 3e 70 55 6e 75  *p = pFile->pUnu
c420: 73 65 64 3b 0a 20 20 70 2d 3e 70 4e 65 78 74 20  sed;.  p->pNext 
c430: 3d 20 70 4f 70 65 6e 2d 3e 70 55 6e 75 73 65 64  = pOpen->pUnused
c440: 3b 0a 20 20 70 4f 70 65 6e 2d 3e 70 55 6e 75 73  ;.  pOpen->pUnus
c450: 65 64 20 3d 20 70 3b 0a 20 20 70 46 69 6c 65 2d  ed = p;.  pFile-
c460: 3e 68 20 3d 20 2d 31 3b 0a 20 20 70 46 69 6c 65  >h = -1;.  pFile
c470: 2d 3e 70 55 6e 75 73 65 64 20 3d 20 30 3b 0a 7d  ->pUnused = 0;.}
c480: 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 77 65 72 20 74 68  ../*.** Lower th
c490: 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20  e locking level 
c4a0: 6f 6e 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  on file descript
c4b0: 6f 72 20 70 46 69 6c 65 20 74 6f 20 6c 6f 63 6b  or pFile to lock
c4c0: 74 79 70 65 2e 20 20 6c 6f 63 6b 74 79 70 65 0a  type.  locktype.
c4d0: 2a 2a 20 6d 75 73 74 20 62 65 20 65 69 74 68 65  ** must be eithe
c4e0: 72 20 4e 4f 5f 4c 4f 43 4b 20 6f 72 20 53 48 41  r NO_LOCK or SHA
c4f0: 52 45 44 5f 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20  RED_LOCK..**.** 
c500: 49 66 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c  If the locking l
c510: 65 76 65 6c 20 6f 66 20 74 68 65 20 66 69 6c 65  evel of the file
c520: 20 64 65 73 63 72 69 70 74 6f 72 20 69 73 20 61   descriptor is a
c530: 6c 72 65 61 64 79 20 61 74 20 6f 72 20 62 65 6c  lready at or bel
c540: 6f 77 0a 2a 2a 20 74 68 65 20 72 65 71 75 65 73  ow.** the reques
c550: 74 65 64 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65  ted locking leve
c560: 6c 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  l, this routine 
c570: 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 20 0a  is a no-op..** .
c580: 2a 2a 20 49 66 20 68 61 6e 64 6c 65 4e 46 53 55  ** If handleNFSU
c590: 6e 6c 6f 63 6b 20 69 73 20 74 72 75 65 2c 20 74  nlock is true, t
c5a0: 68 65 6e 20 6f 6e 20 64 6f 77 6e 67 72 61 64 69  hen on downgradi
c5b0: 6e 67 20 61 6e 20 45 58 43 4c 55 53 49 56 45 5f  ng an EXCLUSIVE_
c5c0: 4c 4f 43 4b 20 74 6f 20 53 48 41 52 45 44 0a 2a  LOCK to SHARED.*
c5d0: 2a 20 74 68 65 20 62 79 74 65 20 72 61 6e 67 65  * the byte range
c5e0: 20 69 73 20 64 69 76 69 64 65 64 20 69 6e 74 6f   is divided into
c5f0: 20 32 20 70 61 72 74 73 20 61 6e 64 20 74 68 65   2 parts and the
c600: 20 66 69 72 73 74 20 70 61 72 74 20 69 73 20 75   first part is u
c610: 6e 6c 6f 63 6b 65 64 20 74 68 65 6e 0a 2a 2a 20  nlocked then.** 
c620: 73 65 74 20 74 6f 20 61 20 72 65 61 64 20 6c 6f  set to a read lo
c630: 63 6b 2c 20 74 68 65 6e 20 74 68 65 20 6f 74 68  ck, then the oth
c640: 65 72 20 70 61 72 74 20 69 73 20 73 69 6d 70 6c  er part is simpl
c650: 79 20 75 6e 6c 6f 63 6b 65 64 2e 20 20 54 68 69  y unlocked.  Thi
c660: 73 20 77 6f 72 6b 73 20 0a 2a 2a 20 61 72 6f 75  s works .** arou
c670: 6e 64 20 61 20 62 75 67 20 69 6e 20 42 53 44 20  nd a bug in BSD 
c680: 4e 46 53 20 6c 6f 63 6b 64 20 28 61 6c 73 6f 20  NFS lockd (also 
c690: 73 65 65 6e 20 6f 6e 20 4d 61 63 4f 53 58 20 31  seen on MacOSX 1
c6a0: 30 2e 33 2b 29 20 74 68 61 74 20 66 61 69 6c 73  0.3+) that fails
c6b0: 20 74 6f 20 0a 2a 2a 20 72 65 6d 6f 76 65 20 74   to .** remove t
c6c0: 68 65 20 77 72 69 74 65 20 6c 6f 63 6b 20 6f 6e  he write lock on
c6d0: 20 61 20 72 65 67 69 6f 6e 20 77 68 65 6e 20 61   a region when a
c6e0: 20 72 65 61 64 20 6c 6f 63 6b 20 69 73 20 73 65   read lock is se
c6f0: 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  t..*/.static int
c700: 20 5f 70 6f 73 69 78 55 6e 6c 6f 63 6b 28 73 71   _posixUnlock(sq
c710: 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20  lite3_file *id, 
c720: 69 6e 74 20 6c 6f 63 6b 74 79 70 65 2c 20 69 6e  int locktype, in
c730: 74 20 68 61 6e 64 6c 65 4e 46 53 55 6e 6c 6f 63  t handleNFSUnloc
c740: 6b 29 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a  k){.  unixFile *
c750: 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c  pFile = (unixFil
c760: 65 2a 29 69 64 3b 0a 20 20 73 74 72 75 63 74 20  e*)id;.  struct 
c770: 75 6e 69 78 4c 6f 63 6b 49 6e 66 6f 20 2a 70 4c  unixLockInfo *pL
c780: 6f 63 6b 3b 0a 20 20 73 74 72 75 63 74 20 66 6c  ock;.  struct fl
c790: 6f 63 6b 20 6c 6f 63 6b 3b 0a 20 20 69 6e 74 20  ock lock;.  int 
c7a0: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
c7b0: 20 20 69 6e 74 20 68 3b 0a 20 20 69 6e 74 20 74    int h;.  int t
c7c0: 45 72 72 6e 6f 3b 20 20 20 20 20 20 20 20 20 20  Errno;          
c7d0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45              /* E
c7e0: 72 72 6f 72 20 63 6f 64 65 20 66 72 6f 6d 20 73  rror code from s
c7f0: 79 73 74 65 6d 20 63 61 6c 6c 20 65 72 72 6f 72  ystem call error
c800: 73 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20  s */..  assert( 
c810: 70 46 69 6c 65 20 29 3b 0a 20 20 4f 53 54 52 41  pFile );.  OSTRA
c820: 43 45 37 28 22 55 4e 4c 4f 43 4b 20 20 25 64 20  CE7("UNLOCK  %d 
c830: 25 64 20 77 61 73 20 25 64 28 25 64 2c 25 64 29  %d was %d(%d,%d)
c840: 20 70 69 64 3d 25 64 20 28 75 6e 69 78 29 5c 6e   pid=%d (unix)\n
c850: 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 6c 6f 63  ", pFile->h, loc
c860: 6b 74 79 70 65 2c 0a 20 20 20 20 20 20 70 46 69  ktype,.      pFi
c870: 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 2c 20 70 46  le->locktype, pF
c880: 69 6c 65 2d 3e 70 4c 6f 63 6b 2d 3e 6c 6f 63 6b  ile->pLock->lock
c890: 74 79 70 65 2c 20 70 46 69 6c 65 2d 3e 70 4c 6f  type, pFile->pLo
c8a0: 63 6b 2d 3e 63 6e 74 2c 20 67 65 74 70 69 64 28  ck->cnt, getpid(
c8b0: 29 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 6c  ));..  assert( l
c8c0: 6f 63 6b 74 79 70 65 3c 3d 53 48 41 52 45 44 5f  ocktype<=SHARED_
c8d0: 4c 4f 43 4b 20 29 3b 0a 20 20 69 66 28 20 70 46  LOCK );.  if( pF
c8e0: 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3c 3d 6c  ile->locktype<=l
c8f0: 6f 63 6b 74 79 70 65 20 29 7b 0a 20 20 20 20 72  ocktype ){.    r
c900: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
c910: 0a 20 20 7d 0a 20 20 69 66 28 20 43 48 45 43 4b  .  }.  if( CHECK
c920: 5f 54 48 52 45 41 44 49 44 28 70 46 69 6c 65 29  _THREADID(pFile)
c930: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
c940: 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50  QLITE_MISUSE_BKP
c950: 54 3b 0a 20 20 7d 0a 20 20 75 6e 69 78 45 6e 74  T;.  }.  unixEnt
c960: 65 72 4d 75 74 65 78 28 29 3b 0a 20 20 68 20 3d  erMutex();.  h =
c970: 20 70 46 69 6c 65 2d 3e 68 3b 0a 20 20 70 4c 6f   pFile->h;.  pLo
c980: 63 6b 20 3d 20 70 46 69 6c 65 2d 3e 70 4c 6f 63  ck = pFile->pLoc
c990: 6b 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4c 6f  k;.  assert( pLo
c9a0: 63 6b 2d 3e 63 6e 74 21 3d 30 20 29 3b 0a 20 20  ck->cnt!=0 );.  
c9b0: 69 66 28 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74  if( pFile->lockt
c9c0: 79 70 65 3e 53 48 41 52 45 44 5f 4c 4f 43 4b 20  ype>SHARED_LOCK 
c9d0: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
c9e0: 4c 6f 63 6b 2d 3e 6c 6f 63 6b 74 79 70 65 3d 3d  Lock->locktype==
c9f0: 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 20  pFile->locktype 
ca00: 29 3b 0a 20 20 20 20 53 69 6d 75 6c 61 74 65 49  );.    SimulateI
ca10: 4f 45 72 72 6f 72 42 65 6e 69 67 6e 28 31 29 3b  OErrorBenign(1);
ca20: 0a 20 20 20 20 53 69 6d 75 6c 61 74 65 49 4f 45  .    SimulateIOE
ca30: 72 72 6f 72 28 20 68 3d 28 2d 31 29 20 29 0a 20  rror( h=(-1) ). 
ca40: 20 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72     SimulateIOErr
ca50: 6f 72 42 65 6e 69 67 6e 28 30 29 3b 0a 0a 23 69  orBenign(0);..#i
ca60: 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 20 20 20  fndef NDEBUG.   
ca70: 20 2f 2a 20 57 68 65 6e 20 72 65 64 75 63 69 6e   /* When reducin
ca80: 67 20 61 20 6c 6f 63 6b 20 73 75 63 68 20 74 68  g a lock such th
ca90: 61 74 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73  at other process
caa0: 65 73 20 63 61 6e 20 73 74 61 72 74 0a 20 20 20  es can start.   
cab0: 20 2a 2a 20 72 65 61 64 69 6e 67 20 74 68 65 20   ** reading the 
cac0: 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 61 67  database file ag
cad0: 61 69 6e 2c 20 6d 61 6b 65 20 73 75 72 65 20 74  ain, make sure t
cae0: 68 61 74 20 74 68 65 0a 20 20 20 20 2a 2a 20 74  hat the.    ** t
caf0: 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f 75 6e 74  ransaction count
cb00: 65 72 20 77 61 73 20 75 70 64 61 74 65 64 20 69  er was updated i
cb10: 66 20 61 6e 79 20 70 61 72 74 20 6f 66 20 74 68  f any part of th
cb20: 65 20 64 61 74 61 62 61 73 65 0a 20 20 20 20 2a  e database.    *
cb30: 2a 20 66 69 6c 65 20 63 68 61 6e 67 65 64 2e 20  * file changed. 
cb40: 20 49 66 20 74 68 65 20 74 72 61 6e 73 61 63 74   If the transact
cb50: 69 6f 6e 20 63 6f 75 6e 74 65 72 20 69 73 20 6e  ion counter is n
cb60: 6f 74 20 75 70 64 61 74 65 64 2c 0a 20 20 20 20  ot updated,.    
cb70: 2a 2a 20 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74  ** other connect
cb80: 69 6f 6e 73 20 74 6f 20 74 68 65 20 73 61 6d 65  ions to the same
cb90: 20 66 69 6c 65 20 6d 69 67 68 74 20 6e 6f 74 20   file might not 
cba0: 72 65 61 6c 69 7a 65 20 74 68 61 74 0a 20 20 20  realize that.   
cbb0: 20 2a 2a 20 74 68 65 20 66 69 6c 65 20 68 61 73   ** the file has
cbc0: 20 63 68 61 6e 67 65 64 20 61 6e 64 20 68 65 6e   changed and hen
cbd0: 63 65 20 6d 69 67 68 74 20 6e 6f 74 20 6b 6e 6f  ce might not kno
cbe0: 77 20 74 6f 20 66 6c 75 73 68 20 74 68 65 69 72  w to flush their
cbf0: 0a 20 20 20 20 2a 2a 20 63 61 63 68 65 2e 20 20  .    ** cache.  
cc00: 54 68 65 20 75 73 65 20 6f 66 20 61 20 73 74 61  The use of a sta
cc10: 6c 65 20 63 61 63 68 65 20 63 61 6e 20 6c 65 61  le cache can lea
cc20: 64 20 74 6f 20 64 61 74 61 62 61 73 65 20 63 6f  d to database co
cc30: 72 72 75 70 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f  rruption..    */
cc40: 0a 23 69 66 20 30 0a 20 20 20 20 61 73 73 65 72  .#if 0.    asser
cc50: 74 28 20 70 46 69 6c 65 2d 3e 69 6e 4e 6f 72 6d  t( pFile->inNorm
cc60: 61 6c 57 72 69 74 65 3d 3d 30 0a 20 20 20 20 20  alWrite==0.     
cc70: 20 20 20 20 7c 7c 20 70 46 69 6c 65 2d 3e 64 62      || pFile->db
cc80: 55 70 64 61 74 65 3d 3d 30 0a 20 20 20 20 20 20  Update==0.      
cc90: 20 20 20 7c 7c 20 70 46 69 6c 65 2d 3e 74 72 61     || pFile->tra
cca0: 6e 73 43 6e 74 72 43 68 6e 67 3d 3d 31 20 29 3b  nsCntrChng==1 );
ccb0: 0a 23 65 6e 64 69 66 0a 20 20 20 20 70 46 69 6c  .#endif.    pFil
ccc0: 65 2d 3e 69 6e 4e 6f 72 6d 61 6c 57 72 69 74 65  e->inNormalWrite
ccd0: 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 0a 20 20   = 0;.#endif..  
cce0: 20 20 2f 2a 20 64 6f 77 6e 67 72 61 64 69 6e 67    /* downgrading
ccf0: 20 74 6f 20 61 20 73 68 61 72 65 64 20 6c 6f 63   to a shared loc
cd00: 6b 20 6f 6e 20 4e 46 53 20 69 6e 76 6f 6c 76 65  k on NFS involve
cd10: 73 20 63 6c 65 61 72 69 6e 67 20 74 68 65 20 77  s clearing the w
cd20: 72 69 74 65 20 6c 6f 63 6b 0a 20 20 20 20 2a 2a  rite lock.    **
cd30: 20 62 65 66 6f 72 65 20 65 73 74 61 62 6c 69 73   before establis
cd40: 68 69 6e 67 20 74 68 65 20 72 65 61 64 6c 6f 63  hing the readloc
cd50: 6b 20 2d 20 74 6f 20 61 76 6f 69 64 20 61 20 72  k - to avoid a r
cd60: 61 63 65 20 63 6f 6e 64 69 74 69 6f 6e 20 77 65  ace condition we
cd70: 20 64 6f 77 6e 67 72 61 64 65 0a 20 20 20 20 2a   downgrade.    *
cd80: 2a 20 74 68 65 20 6c 6f 63 6b 20 69 6e 20 32 20  * the lock in 2 
cd90: 62 6c 6f 63 6b 73 2c 20 73 6f 20 74 68 61 74 20  blocks, so that 
cda0: 70 61 72 74 20 6f 66 20 74 68 65 20 72 61 6e 67  part of the rang
cdb0: 65 20 77 69 6c 6c 20 62 65 20 63 6f 76 65 72 65  e will be covere
cdc0: 64 20 62 79 20 61 20 0a 20 20 20 20 2a 2a 20 77  d by a .    ** w
cdd0: 72 69 74 65 20 6c 6f 63 6b 20 75 6e 74 69 6c 20  rite lock until 
cde0: 74 68 65 20 72 65 73 74 20 69 73 20 63 6f 76 65  the rest is cove
cdf0: 72 65 64 20 62 79 20 61 20 72 65 61 64 20 6c 6f  red by a read lo
ce00: 63 6b 3a 0a 20 20 20 20 2a 2a 20 20 31 3a 20 20  ck:.    **  1:  
ce10: 20 5b 57 57 57 57 57 5d 0a 20 20 20 20 2a 2a 20   [WWWWW].    ** 
ce20: 20 32 3a 20 20 20 5b 2e 2e 2e 2e 57 5d 0a 20 20   2:   [....W].  
ce30: 20 20 2a 2a 20 20 33 3a 20 20 20 5b 52 52 52 52    **  3:   [RRRR
ce40: 57 5d 0a 20 20 20 20 2a 2a 20 20 34 3a 20 20 20  W].    **  4:   
ce50: 5b 52 52 52 52 2e 5d 0a 20 20 20 20 2a 2f 0a 20  [RRRR.].    */. 
ce60: 20 20 20 69 66 28 20 6c 6f 63 6b 74 79 70 65 3d     if( locktype=
ce70: 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a  =SHARED_LOCK ){.
ce80: 20 20 20 20 20 20 69 66 28 20 68 61 6e 64 6c 65        if( handle
ce90: 4e 46 53 55 6e 6c 6f 63 6b 20 29 7b 0a 20 20 20  NFSUnlock ){.   
cea0: 20 20 20 20 20 6f 66 66 5f 74 20 64 69 76 53 69       off_t divSi
ceb0: 7a 65 20 3d 20 53 48 41 52 45 44 5f 53 49 5a 45  ze = SHARED_SIZE
cec0: 20 2d 20 31 3b 0a 20 20 20 20 20 20 20 20 0a 20   - 1;.        . 
ced0: 20 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74 79         lock.l_ty
cee0: 70 65 20 3d 20 46 5f 55 4e 4c 43 4b 3b 0a 20 20  pe = F_UNLCK;.  
cef0: 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 77 68 65        lock.l_whe
cf00: 6e 63 65 20 3d 20 53 45 45 4b 5f 53 45 54 3b 0a  nce = SEEK_SET;.
cf10: 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73          lock.l_s
cf20: 74 61 72 74 20 3d 20 53 48 41 52 45 44 5f 46 49  tart = SHARED_FI
cf30: 52 53 54 3b 0a 20 20 20 20 20 20 20 20 6c 6f 63  RST;.        loc
cf40: 6b 2e 6c 5f 6c 65 6e 20 3d 20 64 69 76 53 69 7a  k.l_len = divSiz
cf50: 65 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 66  e;.        if( f
cf60: 63 6e 74 6c 28 68 2c 20 46 5f 53 45 54 4c 4b 2c  cntl(h, F_SETLK,
cf70: 20 26 6c 6f 63 6b 29 3d 3d 28 2d 31 29 20 29 7b   &lock)==(-1) ){
cf80: 0a 20 20 20 20 20 20 20 20 20 20 74 45 72 72 6e  .          tErrn
cf90: 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20  o = errno;.     
cfa0: 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
cfb0: 45 72 72 6f 72 46 72 6f 6d 50 6f 73 69 78 45 72  ErrorFromPosixEr
cfc0: 72 6f 72 28 74 45 72 72 6e 6f 2c 20 53 51 4c 49  ror(tErrno, SQLI
cfd0: 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 29  TE_IOERR_UNLOCK)
cfe0: 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
cff0: 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 72 63  IS_LOCK_ERROR(rc
d000: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ) ){.           
d010: 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e   pFile->lastErrn
d020: 6f 20 3d 20 74 45 72 72 6e 6f 3b 0a 20 20 20 20  o = tErrno;.    
d030: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
d040: 20 20 67 6f 74 6f 20 65 6e 64 5f 75 6e 6c 6f 63    goto end_unloc
d050: 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  k;.        }.   
d060: 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65       lock.l_type
d070: 20 3d 20 46 5f 52 44 4c 43 4b 3b 0a 20 20 20 20   = F_RDLCK;.    
d080: 20 20 20 20 6c 6f 63 6b 2e 6c 5f 77 68 65 6e 63      lock.l_whenc
d090: 65 20 3d 20 53 45 45 4b 5f 53 45 54 3b 0a 20 20  e = SEEK_SET;.  
d0a0: 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61        lock.l_sta
d0b0: 72 74 20 3d 20 53 48 41 52 45 44 5f 46 49 52 53  rt = SHARED_FIRS
d0c0: 54 3b 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e  T;.        lock.
d0d0: 6c 5f 6c 65 6e 20 3d 20 64 69 76 53 69 7a 65 3b  l_len = divSize;
d0e0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 66 63 6e  .        if( fcn
d0f0: 74 6c 28 68 2c 20 46 5f 53 45 54 4c 4b 2c 20 26  tl(h, F_SETLK, &
d100: 6c 6f 63 6b 29 3d 3d 28 2d 31 29 20 29 7b 0a 20  lock)==(-1) ){. 
d110: 20 20 20 20 20 20 20 20 20 74 45 72 72 6e 6f 20           tErrno 
d120: 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20 20  = errno;.       
d130: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 45 72     rc = sqliteEr
d140: 72 6f 72 46 72 6f 6d 50 6f 73 69 78 45 72 72 6f  rorFromPosixErro
d150: 72 28 74 45 72 72 6e 6f 2c 20 53 51 4c 49 54 45  r(tErrno, SQLITE
d160: 5f 49 4f 45 52 52 5f 52 44 4c 4f 43 4b 29 3b 0a  _IOERR_RDLOCK);.
d170: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 49 53            if( IS
d180: 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 72 63 29 20  _LOCK_ERROR(rc) 
d190: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  ){.            p
d1a0: 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20  File->lastErrno 
d1b0: 3d 20 74 45 72 72 6e 6f 3b 0a 20 20 20 20 20 20  = tErrno;.      
d1c0: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
d1d0: 67 6f 74 6f 20 65 6e 64 5f 75 6e 6c 6f 63 6b 3b  goto end_unlock;
d1e0: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
d1f0: 20 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d     lock.l_type =
d200: 20 46 5f 55 4e 4c 43 4b 3b 0a 20 20 20 20 20 20   F_UNLCK;.      
d210: 20 20 6c 6f 63 6b 2e 6c 5f 77 68 65 6e 63 65 20    lock.l_whence 
d220: 3d 20 53 45 45 4b 5f 53 45 54 3b 0a 20 20 20 20  = SEEK_SET;.    
d230: 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74      lock.l_start
d240: 20 3d 20 53 48 41 52 45 44 5f 46 49 52 53 54 2b   = SHARED_FIRST+
d250: 64 69 76 53 69 7a 65 3b 0a 20 20 20 20 20 20 20  divSize;.       
d260: 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 53 48   lock.l_len = SH
d270: 41 52 45 44 5f 53 49 5a 45 2d 64 69 76 53 69 7a  ARED_SIZE-divSiz
d280: 65 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 66  e;.        if( f
d290: 63 6e 74 6c 28 68 2c 20 46 5f 53 45 54 4c 4b 2c  cntl(h, F_SETLK,
d2a0: 20 26 6c 6f 63 6b 29 3d 3d 28 2d 31 29 20 29 7b   &lock)==(-1) ){
d2b0: 0a 20 20 20 20 20 20 20 20 20 20 74 45 72 72 6e  .          tErrn
d2c0: 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20  o = errno;.     
d2d0: 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
d2e0: 45 72 72 6f 72 46 72 6f 6d 50 6f 73 69 78 45 72  ErrorFromPosixEr
d2f0: 72 6f 72 28 74 45 72 72 6e 6f 2c 20 53 51 4c 49  ror(tErrno, SQLI
d300: 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 29  TE_IOERR_UNLOCK)
d310: 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
d320: 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 72 63  IS_LOCK_ERROR(rc
d330: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ) ){.           
d340: 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e   pFile->lastErrn
d350: 6f 20 3d 20 74 45 72 72 6e 6f 3b 0a 20 20 20 20  o = tErrno;.    
d360: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
d370: 20 20 67 6f 74 6f 20 65 6e 64 5f 75 6e 6c 6f 63    goto end_unloc
d380: 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  k;.        }.   
d390: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
d3a0: 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d 20    lock.l_type = 
d3b0: 46 5f 52 44 4c 43 4b 3b 0a 20 20 20 20 20 20 20  F_RDLCK;.       
d3c0: 20 6c 6f 63 6b 2e 6c 5f 77 68 65 6e 63 65 20 3d   lock.l_whence =
d3d0: 20 53 45 45 4b 5f 53 45 54 3b 0a 20 20 20 20 20   SEEK_SET;.     
d3e0: 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20     lock.l_start 
d3f0: 3d 20 53 48 41 52 45 44 5f 46 49 52 53 54 3b 0a  = SHARED_FIRST;.
d400: 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 6c          lock.l_l
d410: 65 6e 20 3d 20 53 48 41 52 45 44 5f 53 49 5a 45  en = SHARED_SIZE
d420: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 66 63  ;.        if( fc
d430: 6e 74 6c 28 68 2c 20 46 5f 53 45 54 4c 4b 2c 20  ntl(h, F_SETLK, 
d440: 26 6c 6f 63 6b 29 3d 3d 28 2d 31 29 20 29 7b 0a  &lock)==(-1) ){.
d450: 20 20 20 20 20 20 20 20 20 20 74 45 72 72 6e 6f            tErrno
d460: 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20   = errno;.      
d470: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 45      rc = sqliteE
d480: 72 72 6f 72 46 72 6f 6d 50 6f 73 69 78 45 72 72  rrorFromPosixErr
d490: 6f 72 28 74 45 72 72 6e 6f 2c 20 53 51 4c 49 54  or(tErrno, SQLIT
d4a0: 45 5f 49 4f 45 52 52 5f 52 44 4c 4f 43 4b 29 3b  E_IOERR_RDLOCK);
d4b0: 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 49  .          if( I
d4c0: 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 72 63 29  S_LOCK_ERROR(rc)
d4d0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
d4e0: 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f  pFile->lastErrno
d4f0: 20 3d 20 74 45 72 72 6e 6f 3b 0a 20 20 20 20 20   = tErrno;.     
d500: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
d510: 20 67 6f 74 6f 20 65 6e 64 5f 75 6e 6c 6f 63 6b   goto end_unlock
d520: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
d530: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 6c 6f    }.    }.    lo
d540: 63 6b 2e 6c 5f 74 79 70 65 20 3d 20 46 5f 55 4e  ck.l_type = F_UN
d550: 4c 43 4b 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f  LCK;.    lock.l_
d560: 77 68 65 6e 63 65 20 3d 20 53 45 45 4b 5f 53 45  whence = SEEK_SE
d570: 54 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74  T;.    lock.l_st
d580: 61 72 74 20 3d 20 50 45 4e 44 49 4e 47 5f 42 59  art = PENDING_BY
d590: 54 45 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 6c  TE;.    lock.l_l
d5a0: 65 6e 20 3d 20 32 4c 3b 20 20 61 73 73 65 72 74  en = 2L;  assert
d5b0: 28 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 2b 31  ( PENDING_BYTE+1
d5c0: 3d 3d 52 45 53 45 52 56 45 44 5f 42 59 54 45 20  ==RESERVED_BYTE 
d5d0: 29 3b 0a 20 20 20 20 69 66 28 20 66 63 6e 74 6c  );.    if( fcntl
d5e0: 28 68 2c 20 46 5f 53 45 54 4c 4b 2c 20 26 6c 6f  (h, F_SETLK, &lo
d5f0: 63 6b 29 21 3d 28 2d 31 29 20 29 7b 0a 20 20 20  ck)!=(-1) ){.   
d600: 20 20 20 70 4c 6f 63 6b 2d 3e 6c 6f 63 6b 74 79     pLock->lockty
d610: 70 65 20 3d 20 53 48 41 52 45 44 5f 4c 4f 43 4b  pe = SHARED_LOCK
d620: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
d630: 20 20 20 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e     tErrno = errn
d640: 6f 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  o;.      rc = sq
d650: 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d 50 6f 73  liteErrorFromPos
d660: 69 78 45 72 72 6f 72 28 74 45 72 72 6e 6f 2c 20  ixError(tErrno, 
d670: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c  SQLITE_IOERR_UNL
d680: 4f 43 4b 29 3b 0a 20 20 20 20 20 20 69 66 28 20  OCK);.      if( 
d690: 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 72 63  IS_LOCK_ERROR(rc
d6a0: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 70 46 69  ) ){.        pFi
d6b0: 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20  le->lastErrno = 
d6c0: 74 45 72 72 6e 6f 3b 0a 20 20 20 20 20 20 7d 0a  tErrno;.      }.
d6d0: 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 75        goto end_u
d6e0: 6e 6c 6f 63 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d  nlock;.    }.  }
d6f0: 0a 20 20 69 66 28 20 6c 6f 63 6b 74 79 70 65 3d  .  if( locktype=
d700: 3d 4e 4f 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20  =NO_LOCK ){.    
d710: 73 74 72 75 63 74 20 75 6e 69 78 4f 70 65 6e 43  struct unixOpenC
d720: 6e 74 20 2a 70 4f 70 65 6e 3b 0a 0a 20 20 20 20  nt *pOpen;..    
d730: 2f 2a 20 44 65 63 72 65 6d 65 6e 74 20 74 68 65  /* Decrement the
d740: 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 63 6f 75   shared lock cou
d750: 6e 74 65 72 2e 20 20 52 65 6c 65 61 73 65 20 74  nter.  Release t
d760: 68 65 20 6c 6f 63 6b 20 75 73 69 6e 67 20 61 6e  he lock using an
d770: 0a 20 20 20 20 2a 2a 20 4f 53 20 63 61 6c 6c 20  .    ** OS call 
d780: 6f 6e 6c 79 20 77 68 65 6e 20 61 6c 6c 20 74 68  only when all th
d790: 72 65 61 64 73 20 69 6e 20 74 68 69 73 20 73 61  reads in this sa
d7a0: 6d 65 20 70 72 6f 63 65 73 73 20 68 61 76 65 20  me process have 
d7b0: 72 65 6c 65 61 73 65 64 0a 20 20 20 20 2a 2a 20  released.    ** 
d7c0: 74 68 65 20 6c 6f 63 6b 2e 0a 20 20 20 20 2a 2f  the lock..    */
d7d0: 0a 20 20 20 20 70 4c 6f 63 6b 2d 3e 63 6e 74 2d  .    pLock->cnt-
d7e0: 2d 3b 0a 20 20 20 20 69 66 28 20 70 4c 6f 63 6b  -;.    if( pLock
d7f0: 2d 3e 63 6e 74 3d 3d 30 20 29 7b 0a 20 20 20 20  ->cnt==0 ){.    
d800: 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d 20    lock.l_type = 
d810: 46 5f 55 4e 4c 43 4b 3b 0a 20 20 20 20 20 20 6c  F_UNLCK;.      l
d820: 6f 63 6b 2e 6c 5f 77 68 65 6e 63 65 20 3d 20 53  ock.l_whence = S
d830: 45 45 4b 5f 53 45 54 3b 0a 20 20 20 20 20 20 6c  EEK_SET;.      l
d840: 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 6c 6f  ock.l_start = lo
d850: 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 30 4c 3b 0a 20  ck.l_len = 0L;. 
d860: 20 20 20 20 20 53 69 6d 75 6c 61 74 65 49 4f 45       SimulateIOE
d870: 72 72 6f 72 42 65 6e 69 67 6e 28 31 29 3b 0a 20  rrorBenign(1);. 
d880: 20 20 20 20 20 53 69 6d 75 6c 61 74 65 49 4f 45       SimulateIOE
d890: 72 72 6f 72 28 20 68 3d 28 2d 31 29 20 29 0a 20  rror( h=(-1) ). 
d8a0: 20 20 20 20 20 53 69 6d 75 6c 61 74 65 49 4f 45       SimulateIOE
d8b0: 72 72 6f 72 42 65 6e 69 67 6e 28 30 29 3b 0a 20  rrorBenign(0);. 
d8c0: 20 20 20 20 20 69 66 28 20 66 63 6e 74 6c 28 68       if( fcntl(h
d8d0: 2c 20 46 5f 53 45 54 4c 4b 2c 20 26 6c 6f 63 6b  , F_SETLK, &lock
d8e0: 29 21 3d 28 2d 31 29 20 29 7b 0a 20 20 20 20 20  )!=(-1) ){.     
d8f0: 20 20 20 70 4c 6f 63 6b 2d 3e 6c 6f 63 6b 74 79     pLock->lockty
d900: 70 65 20 3d 20 4e 4f 5f 4c 4f 43 4b 3b 0a 20 20  pe = NO_LOCK;.  
d910: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
d920: 20 20 20 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e     tErrno = errn
d930: 6f 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  o;.        rc = 
d940: 73 71 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d 50  sqliteErrorFromP
d950: 6f 73 69 78 45 72 72 6f 72 28 74 45 72 72 6e 6f  osixError(tErrno
d960: 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55  , SQLITE_IOERR_U
d970: 4e 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 20 20  NLOCK);.        
d980: 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f  if( IS_LOCK_ERRO
d990: 52 28 72 63 29 20 29 7b 0a 20 20 20 20 20 20 20  R(rc) ){.       
d9a0: 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72     pFile->lastEr
d9b0: 72 6e 6f 20 3d 20 74 45 72 72 6e 6f 3b 0a 20 20  rno = tErrno;.  
d9c0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
d9d0: 70 4c 6f 63 6b 2d 3e 6c 6f 63 6b 74 79 70 65 20  pLock->locktype 
d9e0: 3d 20 4e 4f 5f 4c 4f 43 4b 3b 0a 20 20 20 20 20  = NO_LOCK;.     
d9f0: 20 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79     pFile->lockty
da00: 70 65 20 3d 20 4e 4f 5f 4c 4f 43 4b 3b 0a 20 20  pe = NO_LOCK;.  
da10: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20      }.    }..   
da20: 20 2f 2a 20 44 65 63 72 65 6d 65 6e 74 20 74 68   /* Decrement th
da30: 65 20 63 6f 75 6e 74 20 6f 66 20 6c 6f 63 6b 73  e count of locks
da40: 20 61 67 61 69 6e 73 74 20 74 68 69 73 20 73 61   against this sa
da50: 6d 65 20 66 69 6c 65 2e 20 20 57 68 65 6e 20 74  me file.  When t
da60: 68 65 0a 20 20 20 20 2a 2a 20 63 6f 75 6e 74 20  he.    ** count 
da70: 72 65 61 63 68 65 73 20 7a 65 72 6f 2c 20 63 6c  reaches zero, cl
da80: 6f 73 65 20 61 6e 79 20 6f 74 68 65 72 20 66 69  ose any other fi
da90: 6c 65 20 64 65 73 63 72 69 70 74 6f 72 73 20 77  le descriptors w
daa0: 68 6f 73 65 20 63 6c 6f 73 65 0a 20 20 20 20 2a  hose close.    *
dab0: 2a 20 77 61 73 20 64 65 66 65 72 72 65 64 20 62  * was deferred b
dac0: 65 63 61 75 73 65 20 6f 66 20 6f 75 74 73 74 61  ecause of outsta
dad0: 6e 64 69 6e 67 20 6c 6f 63 6b 73 2e 0a 20 20 20  nding locks..   
dae0: 20 2a 2f 0a 20 20 20 20 70 4f 70 65 6e 20 3d 20   */.    pOpen = 
daf0: 70 46 69 6c 65 2d 3e 70 4f 70 65 6e 3b 0a 20 20  pFile->pOpen;.  
db00: 20 20 70 4f 70 65 6e 2d 3e 6e 4c 6f 63 6b 2d 2d    pOpen->nLock--
db10: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4f  ;.    assert( pO
db20: 70 65 6e 2d 3e 6e 4c 6f 63 6b 3e 3d 30 20 29 3b  pen->nLock>=0 );
db30: 0a 20 20 20 20 69 66 28 20 70 4f 70 65 6e 2d 3e  .    if( pOpen->
db40: 6e 4c 6f 63 6b 3d 3d 30 20 29 7b 0a 20 20 20 20  nLock==0 ){.    
db50: 20 20 69 6e 74 20 72 63 32 20 3d 20 63 6c 6f 73    int rc2 = clos
db60: 65 50 65 6e 64 69 6e 67 46 64 73 28 70 46 69 6c  ePendingFds(pFil
db70: 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  e);.      if( rc
db80: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
db90: 20 20 20 20 20 20 20 72 63 20 3d 20 72 63 32 3b         rc = rc2;
dba0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
dbb0: 20 7d 0a 09 0a 65 6e 64 5f 75 6e 6c 6f 63 6b 3a   }...end_unlock:
dbc0: 0a 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65  .  unixLeaveMute
dbd0: 78 28 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53  x();.  if( rc==S
dbe0: 51 4c 49 54 45 5f 4f 4b 20 29 20 70 46 69 6c 65  QLITE_OK ) pFile
dbf0: 2d 3e 6c 6f 63 6b 74 79 70 65 20 3d 20 6c 6f 63  ->locktype = loc
dc00: 6b 74 79 70 65 3b 0a 20 20 72 65 74 75 72 6e 20  ktype;.  return 
dc10: 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 77  rc;.}../*.** Low
dc20: 65 72 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c  er the locking l
dc30: 65 76 65 6c 20 6f 6e 20 66 69 6c 65 20 64 65 73  evel on file des
dc40: 63 72 69 70 74 6f 72 20 70 46 69 6c 65 20 74 6f  criptor pFile to
dc50: 20 6c 6f 63 6b 74 79 70 65 2e 20 20 6c 6f 63 6b   locktype.  lock
dc60: 74 79 70 65 0a 2a 2a 20 6d 75 73 74 20 62 65 20  type.** must be 
dc70: 65 69 74 68 65 72 20 4e 4f 5f 4c 4f 43 4b 20 6f  either NO_LOCK o
dc80: 72 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2e 0a 2a  r SHARED_LOCK..*
dc90: 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6c 6f 63 6b  *.** If the lock
dca0: 69 6e 67 20 6c 65 76 65 6c 20 6f 66 20 74 68 65  ing level of the
dcb0: 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
dcc0: 20 69 73 20 61 6c 72 65 61 64 79 20 61 74 20 6f   is already at o
dcd0: 72 20 62 65 6c 6f 77 0a 2a 2a 20 74 68 65 20 72  r below.** the r
dce0: 65 71 75 65 73 74 65 64 20 6c 6f 63 6b 69 6e 67  equested locking
dcf0: 20 6c 65 76 65 6c 2c 20 74 68 69 73 20 72 6f 75   level, this rou
dd00: 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e  tine is a no-op.
dd10: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75  .*/.static int u
dd20: 6e 69 78 55 6e 6c 6f 63 6b 28 73 71 6c 69 74 65  nixUnlock(sqlite
dd30: 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20  3_file *id, int 
dd40: 6c 6f 63 6b 74 79 70 65 29 7b 0a 20 20 72 65 74  locktype){.  ret
dd50: 75 72 6e 20 5f 70 6f 73 69 78 55 6e 6c 6f 63 6b  urn _posixUnlock
dd60: 28 69 64 2c 20 6c 6f 63 6b 74 79 70 65 2c 20 30  (id, locktype, 0
dd70: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  );.}../*.** This
dd80: 20 66 75 6e 63 74 69 6f 6e 20 70 65 72 66 6f 72   function perfor
dd90: 6d 73 20 74 68 65 20 70 61 72 74 73 20 6f 66 20  ms the parts of 
dda0: 74 68 65 20 22 63 6c 6f 73 65 20 66 69 6c 65 22  the "close file"
ddb0: 20 6f 70 65 72 61 74 69 6f 6e 20 0a 2a 2a 20 63   operation .** c
ddc0: 6f 6d 6d 6f 6e 20 74 6f 20 61 6c 6c 20 6c 6f 63  ommon to all loc
ddd0: 6b 69 6e 67 20 73 63 68 65 6d 65 73 2e 20 49 74  king schemes. It
dde0: 20 63 6c 6f 73 65 73 20 74 68 65 20 64 69 72 65   closes the dire
ddf0: 63 74 6f 72 79 20 61 6e 64 20 66 69 6c 65 0a 2a  ctory and file.*
de00: 2a 20 68 61 6e 64 6c 65 73 2c 20 69 66 20 74 68  * handles, if th
de10: 65 79 20 61 72 65 20 76 61 6c 69 64 2c 20 61 6e  ey are valid, an
de20: 64 20 73 65 74 73 20 61 6c 6c 20 66 69 65 6c 64  d sets all field
de30: 73 20 6f 66 20 74 68 65 20 75 6e 69 78 46 69 6c  s of the unixFil
de40: 65 0a 2a 2a 20 73 74 72 75 63 74 75 72 65 20 74  e.** structure t
de50: 6f 20 30 2e 0a 2a 2a 0a 2a 2a 20 49 74 20 69 73  o 0..**.** It is
de60: 20 2a 6e 6f 74 2a 20 6e 65 63 65 73 73 61 72 79   *not* necessary
de70: 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 6d 75 74   to hold the mut
de80: 65 78 20 77 68 65 6e 20 74 68 69 73 20 72 6f 75  ex when this rou
de90: 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2c 0a  tine is called,.
dea0: 2a 2a 20 65 76 65 6e 20 6f 6e 20 56 78 57 6f 72  ** even on VxWor
deb0: 6b 73 2e 20 20 41 20 6d 75 74 65 78 20 77 69 6c  ks.  A mutex wil
dec0: 6c 20 62 65 20 61 63 71 75 69 72 65 64 20 6f 6e  l be acquired on
ded0: 20 56 78 57 6f 72 6b 73 20 62 79 20 74 68 65 0a   VxWorks by the.
dee0: 2a 2a 20 76 78 77 6f 72 6b 73 52 65 6c 65 61 73  ** vxworksReleas
def0: 65 46 69 6c 65 49 64 28 29 20 72 6f 75 74 69 6e  eFileId() routin
df00: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
df10: 20 63 6c 6f 73 65 55 6e 69 78 46 69 6c 65 28 73   closeUnixFile(s
df20: 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 29  qlite3_file *id)
df30: 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46  {.  unixFile *pF
df40: 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a  ile = (unixFile*
df50: 29 69 64 3b 0a 20 20 69 66 28 20 70 46 69 6c 65  )id;.  if( pFile
df60: 20 29 7b 0a 20 20 20 20 69 66 28 20 70 46 69 6c   ){.    if( pFil
df70: 65 2d 3e 64 69 72 66 64 3e 3d 30 20 29 7b 0a 20  e->dirfd>=0 ){. 
df80: 20 20 20 20 20 69 6e 74 20 65 72 72 20 3d 20 63       int err = c
df90: 6c 6f 73 65 28 70 46 69 6c 65 2d 3e 64 69 72 66  lose(pFile->dirf
dfa0: 64 29 3b 0a 20 20 20 20 20 20 69 66 28 20 65 72  d);.      if( er
dfb0: 72 20 29 7b 0a 20 20 20 20 20 20 20 20 70 46 69  r ){.        pFi
dfc0: 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20  le->lastErrno = 
dfd0: 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20 20 20 72  errno;.        r
dfe0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45  eturn SQLITE_IOE
dff0: 52 52 5f 44 49 52 5f 43 4c 4f 53 45 3b 0a 20 20  RR_DIR_CLOSE;.  
e000: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
e010: 20 20 20 70 46 69 6c 65 2d 3e 64 69 72 66 64 3d     pFile->dirfd=
e020: 2d 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  -1;.      }.    
e030: 7d 0a 20 20 20 20 69 66 28 20 70 46 69 6c 65 2d  }.    if( pFile-
e040: 3e 68 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 69  >h>=0 ){.      i
e050: 6e 74 20 65 72 72 20 3d 20 63 6c 6f 73 65 28 70  nt err = close(p
e060: 46 69 6c 65 2d 3e 68 29 3b 0a 20 20 20 20 20 20  File->h);.      
e070: 69 66 28 20 65 72 72 20 29 7b 0a 20 20 20 20 20  if( err ){.     
e080: 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72     pFile->lastEr
e090: 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20  rno = errno;.   
e0a0: 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
e0b0: 54 45 5f 49 4f 45 52 52 5f 43 4c 4f 53 45 3b 0a  TE_IOERR_CLOSE;.
e0c0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23 69        }.    }.#i
e0d0: 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20 20  f OS_VXWORKS.   
e0e0: 20 69 66 28 20 70 46 69 6c 65 2d 3e 70 49 64 20   if( pFile->pId 
e0f0: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 46 69  ){.      if( pFi
e100: 6c 65 2d 3e 69 73 44 65 6c 65 74 65 20 29 7b 0a  le->isDelete ){.
e110: 20 20 20 20 20 20 20 20 75 6e 6c 69 6e 6b 28 70          unlink(p
e120: 46 69 6c 65 2d 3e 70 49 64 2d 3e 7a 43 61 6e 6f  File->pId->zCano
e130: 6e 69 63 61 6c 4e 61 6d 65 29 3b 0a 20 20 20 20  nicalName);.    
e140: 20 20 7d 0a 20 20 20 20 20 20 76 78 77 6f 72 6b    }.      vxwork
e150: 73 52 65 6c 65 61 73 65 46 69 6c 65 49 64 28 70  sReleaseFileId(p
e160: 46 69 6c 65 2d 3e 70 49 64 29 3b 0a 20 20 20 20  File->pId);.    
e170: 20 20 70 46 69 6c 65 2d 3e 70 49 64 20 3d 20 30    pFile->pId = 0
e180: 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20  ;.    }.#endif. 
e190: 20 20 20 4f 53 54 52 41 43 45 32 28 22 43 4c 4f     OSTRACE2("CLO
e1a0: 53 45 20 20 20 25 2d 33 64 5c 6e 22 2c 20 70 46  SE   %-3d\n", pF
e1b0: 69 6c 65 2d 3e 68 29 3b 0a 20 20 20 20 4f 70 65  ile->h);.    Ope
e1c0: 6e 43 6f 75 6e 74 65 72 28 2d 31 29 3b 0a 20 20  nCounter(-1);.  
e1d0: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
e1e0: 46 69 6c 65 2d 3e 70 55 6e 75 73 65 64 29 3b 0a  File->pUnused);.
e1f0: 20 20 20 20 6d 65 6d 73 65 74 28 70 46 69 6c 65      memset(pFile
e200: 2c 20 30 2c 20 73 69 7a 65 6f 66 28 75 6e 69 78  , 0, sizeof(unix
e210: 46 69 6c 65 29 29 3b 0a 20 20 7d 0a 20 20 72 65  File));.  }.  re
e220: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
e230: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61  }../*.** Close a
e240: 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63   file..*/.static
e250: 20 69 6e 74 20 75 6e 69 78 43 6c 6f 73 65 28 73   int unixClose(s
e260: 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 29  qlite3_file *id)
e270: 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
e280: 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 69 64  ITE_OK;.  if( id
e290: 20 29 7b 0a 20 20 20 20 75 6e 69 78 46 69 6c 65   ){.    unixFile
e2a0: 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46   *pFile = (unixF
e2b0: 69 6c 65 20 2a 29 69 64 3b 0a 20 20 20 20 75 6e  ile *)id;.    un
e2c0: 69 78 55 6e 6c 6f 63 6b 28 69 64 2c 20 4e 4f 5f  ixUnlock(id, NO_
e2d0: 4c 4f 43 4b 29 3b 0a 20 20 20 20 75 6e 69 78 45  LOCK);.    unixE
e2e0: 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 20 20 20  nterMutex();.   
e2f0: 20 69 66 28 20 70 46 69 6c 65 2d 3e 70 4f 70 65   if( pFile->pOpe
e300: 6e 20 26 26 20 70 46 69 6c 65 2d 3e 70 4f 70 65  n && pFile->pOpe
e310: 6e 2d 3e 6e 4c 6f 63 6b 20 29 7b 0a 20 20 20 20  n->nLock ){.    
e320: 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 61 72    /* If there ar
e330: 65 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 6c 6f  e outstanding lo
e340: 63 6b 73 2c 20 64 6f 20 6e 6f 74 20 61 63 74 75  cks, do not actu
e350: 61 6c 6c 79 20 63 6c 6f 73 65 20 74 68 65 20 66  ally close the f
e360: 69 6c 65 20 6a 75 73 74 0a 20 20 20 20 20 20 2a  ile just.      *
e370: 2a 20 79 65 74 20 62 65 63 61 75 73 65 20 74 68  * yet because th
e380: 61 74 20 77 6f 75 6c 64 20 63 6c 65 61 72 20 74  at would clear t
e390: 68 6f 73 65 20 6c 6f 63 6b 73 2e 20 20 49 6e 73  hose locks.  Ins
e3a0: 74 65 61 64 2c 20 61 64 64 20 74 68 65 20 66 69  tead, add the fi
e3b0: 6c 65 0a 20 20 20 20 20 20 2a 2a 20 64 65 73 63  le.      ** desc
e3c0: 72 69 70 74 6f 72 20 74 6f 20 70 4f 70 65 6e 2d  riptor to pOpen-
e3d0: 3e 70 55 6e 75 73 65 64 20 6c 69 73 74 2e 20 20  >pUnused list.  
e3e0: 49 74 20 77 69 6c 6c 20 62 65 20 61 75 74 6f 6d  It will be autom
e3f0: 61 74 69 63 61 6c 6c 79 20 63 6c 6f 73 65 64 20  atically closed 
e400: 0a 20 20 20 20 20 20 2a 2a 20 77 68 65 6e 20 74  .      ** when t
e410: 68 65 20 6c 61 73 74 20 6c 6f 63 6b 20 69 73 20  he last lock is 
e420: 63 6c 65 61 72 65 64 2e 0a 20 20 20 20 20 20 2a  cleared..      *
e430: 2f 0a 20 20 20 20 20 20 73 65 74 50 65 6e 64 69  /.      setPendi
e440: 6e 67 46 64 28 70 46 69 6c 65 29 3b 0a 20 20 20  ngFd(pFile);.   
e450: 20 7d 0a 20 20 20 20 72 65 6c 65 61 73 65 4c 6f   }.    releaseLo
e460: 63 6b 49 6e 66 6f 28 70 46 69 6c 65 2d 3e 70 4c  ckInfo(pFile->pL
e470: 6f 63 6b 29 3b 0a 20 20 20 20 72 65 6c 65 61 73  ock);.    releas
e480: 65 4f 70 65 6e 43 6e 74 28 70 46 69 6c 65 2d 3e  eOpenCnt(pFile->
e490: 70 4f 70 65 6e 29 3b 0a 20 20 20 20 72 63 20 3d  pOpen);.    rc =
e4a0: 20 63 6c 6f 73 65 55 6e 69 78 46 69 6c 65 28 69   closeUnixFile(i
e4b0: 64 29 3b 0a 20 20 20 20 75 6e 69 78 4c 65 61 76  d);.    unixLeav
e4c0: 65 4d 75 74 65 78 28 29 3b 0a 20 20 7d 0a 20 20  eMutex();.  }.  
e4d0: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
e4e0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e  ************* En
e4f0: 64 20 6f 66 20 74 68 65 20 70 6f 73 69 78 20 61  d of the posix a
e500: 64 76 69 73 6f 72 79 20 6c 6f 63 6b 20 69 6d 70  dvisory lock imp
e510: 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 2a 2a 2a 2a  lementation ****
e520: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a  *************.**
e530: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
e540: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
e550: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
e560: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
e570: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f  ************/../
e580: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
e590: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
e5a0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
e5b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
e5c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a  **************.*
e5d0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
e5e0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 4e 6f  ************* No
e5f0: 2d 6f 70 20 4c 6f 63 6b 69 6e 67 20 2a 2a 2a 2a  -op Locking ****
e600: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
e610: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a  **************.*
e620: 2a 0a 2a 2a 20 4f 66 20 74 68 65 20 76 61 72 69  *.** Of the vari
e630: 6f 75 73 20 6c 6f 63 6b 69 6e 67 20 69 6d 70 6c  ous locking impl
e640: 65 6d 65 6e 74 61 74 69 6f 6e 73 20 61 76 61 69  ementations avai
e650: 6c 61 62 6c 65 2c 20 74 68 69 73 20 69 73 20 62  lable, this is b
e660: 79 20 66 61 72 20 74 68 65 0a 2a 2a 20 73 69 6d  y far the.** sim
e670: 70 6c 65 73 74 3a 20 20 6c 6f 63 6b 69 6e 67 20  plest:  locking 
e680: 69 73 20 69 67 6e 6f 72 65 64 2e 20 20 4e 6f 20  is ignored.  No 
e690: 61 74 74 65 6d 70 74 20 69 73 20 6d 61 64 65 20  attempt is made 
e6a0: 74 6f 20 6c 6f 63 6b 20 74 68 65 20 64 61 74 61  to lock the data
e6b0: 62 61 73 65 0a 2a 2a 20 66 69 6c 65 20 66 6f 72  base.** file for
e6c0: 20 72 65 61 64 69 6e 67 20 6f 72 20 77 72 69 74   reading or writ
e6d0: 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ing..**.** This 
e6e0: 6c 6f 63 6b 69 6e 67 20 6d 6f 64 65 20 69 73 20  locking mode is 
e6f0: 61 70 70 72 6f 70 72 69 61 74 65 20 66 6f 72 20  appropriate for 
e700: 75 73 65 20 6f 6e 20 72 65 61 64 2d 6f 6e 6c 79  use on read-only
e710: 20 64 61 74 61 62 61 73 65 73 0a 2a 2a 20 28 65   databases.** (e
e720: 78 3a 20 64 61 74 61 62 61 73 65 73 20 74 68 61  x: databases tha
e730: 74 20 61 72 65 20 62 75 72 6e 65 64 20 69 6e 74  t are burned int
e740: 6f 20 43 44 2d 52 4f 4d 2c 20 66 6f 72 20 65 78  o CD-ROM, for ex
e750: 61 6d 70 6c 65 2e 29 20 20 49 74 20 63 61 6e 0a  ample.)  It can.
e760: 2a 2a 20 61 6c 73 6f 20 62 65 20 75 73 65 64 20  ** also be used 
e770: 69 66 20 74 68 65 20 61 70 70 6c 69 63 61 74 69  if the applicati
e780: 6f 6e 20 65 6d 70 6c 6f 79 73 20 73 6f 6d 65 20  on employs some 
e790: 65 78 74 65 72 6e 61 6c 20 6d 65 63 68 61 6e 69  external mechani
e7a0: 73 6d 20 74 6f 0a 2a 2a 20 70 72 65 76 65 6e 74  sm to.** prevent
e7b0: 20 73 69 6d 75 6c 74 61 6e 65 6f 75 73 20 61 63   simultaneous ac
e7c0: 63 65 73 73 20 6f 66 20 74 68 65 20 73 61 6d 65  cess of the same
e7d0: 20 64 61 74 61 62 61 73 65 20 62 79 20 74 77 6f   database by two
e7e0: 20 6f 72 20 6d 6f 72 65 0a 2a 2a 20 64 61 74 61   or more.** data
e7f0: 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73  base connections
e800: 2e 20 20 42 75 74 20 74 68 65 72 65 20 69 73 20  .  But there is 
e810: 61 20 73 65 72 69 6f 75 73 20 72 69 73 6b 20 6f  a serious risk o
e820: 66 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 63 6f  f database.** co
e830: 72 72 75 70 74 69 6f 6e 20 69 66 20 74 68 69 73  rruption if this
e840: 20 6c 6f 63 6b 69 6e 67 20 6d 6f 64 65 20 69 73   locking mode is
e850: 20 75 73 65 64 20 69 6e 20 73 69 74 75 61 74 69   used in situati
e860: 6f 6e 73 20 77 68 65 72 65 20 6d 75 6c 74 69 70  ons where multip
e870: 6c 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 63  le.** database c
e880: 6f 6e 6e 65 63 74 69 6f 6e 73 20 61 72 65 20 61  onnections are a
e890: 63 63 65 73 73 69 6e 67 20 74 68 65 20 73 61 6d  ccessing the sam
e8a0: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
e8b0: 61 74 20 74 68 65 20 73 61 6d 65 0a 2a 2a 20 74  at the same.** t
e8c0: 69 6d 65 20 61 6e 64 20 6f 6e 65 20 6f 72 20 6d  ime and one or m
e8d0: 6f 72 65 20 6f 66 20 74 68 6f 73 65 20 63 6f 6e  ore of those con
e8e0: 6e 65 63 74 69 6f 6e 73 20 61 72 65 20 77 72 69  nections are wri
e8f0: 74 69 6e 67 2e 0a 2a 2f 0a 0a 73 74 61 74 69 63  ting..*/..static
e900: 20 69 6e 74 20 6e 6f 6c 6f 63 6b 43 68 65 63 6b   int nolockCheck
e910: 52 65 73 65 72 76 65 64 4c 6f 63 6b 28 73 71 6c  ReservedLock(sql
e920: 69 74 65 33 5f 66 69 6c 65 20 2a 4e 6f 74 55 73  ite3_file *NotUs
e930: 65 64 2c 20 69 6e 74 20 2a 70 52 65 73 4f 75 74  ed, int *pResOut
e940: 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  ){.  UNUSED_PARA
e950: 4d 45 54 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a  METER(NotUsed);.
e960: 20 20 2a 70 52 65 73 4f 75 74 20 3d 20 30 3b 0a    *pResOut = 0;.
e970: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
e980: 4f 4b 3b 0a 7d 0a 73 74 61 74 69 63 20 69 6e 74  OK;.}.static int
e990: 20 6e 6f 6c 6f 63 6b 4c 6f 63 6b 28 73 71 6c 69   nolockLock(sqli
e9a0: 74 65 33 5f 66 69 6c 65 20 2a 4e 6f 74 55 73 65  te3_file *NotUse
e9b0: 64 2c 20 69 6e 74 20 4e 6f 74 55 73 65 64 32 29  d, int NotUsed2)
e9c0: 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  {.  UNUSED_PARAM
e9d0: 45 54 45 52 32 28 4e 6f 74 55 73 65 64 2c 20 4e  ETER2(NotUsed, N
e9e0: 6f 74 55 73 65 64 32 29 3b 0a 20 20 72 65 74 75  otUsed2);.  retu
e9f0: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
ea00: 73 74 61 74 69 63 20 69 6e 74 20 6e 6f 6c 6f 63  static int noloc
ea10: 6b 55 6e 6c 6f 63 6b 28 73 71 6c 69 74 65 33 5f  kUnlock(sqlite3_
ea20: 66 69 6c 65 20 2a 4e 6f 74 55 73 65 64 2c 20 69  file *NotUsed, i
ea30: 6e 74 20 4e 6f 74 55 73 65 64 32 29 7b 0a 20 20  nt NotUsed2){.  
ea40: 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
ea50: 32 28 4e 6f 74 55 73 65 64 2c 20 4e 6f 74 55 73  2(NotUsed, NotUs
ea60: 65 64 32 29 3b 0a 20 20 72 65 74 75 72 6e 20 53  ed2);.  return S
ea70: 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
ea80: 2a 2a 20 43 6c 6f 73 65 20 74 68 65 20 66 69 6c  ** Close the fil
ea90: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
eaa0: 20 6e 6f 6c 6f 63 6b 43 6c 6f 73 65 28 73 71 6c   nolockClose(sql
eab0: 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 29 20 7b  ite3_file *id) {
eac0: 0a 20 20 72 65 74 75 72 6e 20 63 6c 6f 73 65 55  .  return closeU
ead0: 6e 69 78 46 69 6c 65 28 69 64 29 3b 0a 7d 0a 0a  nixFile(id);.}..
eae0: 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  /***************
eaf0: 2a 2a 2a 2a 20 45 6e 64 20 6f 66 20 74 68 65 20  **** End of the 
eb00: 6e 6f 2d 6f 70 20 6c 6f 63 6b 20 69 6d 70 6c 65  no-op lock imple
eb10: 6d 65 6e 74 61 74 69 6f 6e 20 2a 2a 2a 2a 2a 2a  mentation ******
eb20: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a  ***************.
eb30: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
eb40: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
eb50: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
eb60: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
eb70: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a  **************/.
eb80: 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ./**************
eb90: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
eba0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
ebb0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
ebc0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
ebd0: 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .***************
ebe0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 42 65 67 69 6e  ********** Begin
ebf0: 20 64 6f 74 2d 66 69 6c 65 20 4c 6f 63 6b 69 6e   dot-file Lockin
ec00: 67 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  g **************
ec10: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
ec20: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64 6f 74 66 69  .**.** The dotfi
ec30: 6c 65 20 6c 6f 63 6b 69 6e 67 20 69 6d 70 6c 65  le locking imple
ec40: 6d 65 6e 74 61 74 69 6f 6e 20 75 73 65 73 20 74  mentation uses t
ec50: 68 65 20 65 78 69 73 74 61 6e 63 65 20 6f 66 20  he existance of 
ec60: 73 65 70 61 72 61 74 65 20 6c 6f 63 6b 0a 2a 2a  separate lock.**
ec70: 20 66 69 6c 65 73 20 69 6e 20 6f 72 64 65 72 20   files in order 
ec80: 74 6f 20 63 6f 6e 74 72 6f 6c 20 61 63 63 65 73  to control acces
ec90: 73 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  s to the databas
eca0: 65 2e 20 20 54 68 69 73 20 77 6f 72 6b 73 20 6f  e.  This works o
ecb0: 6e 20 6a 75 73 74 0a 2a 2a 20 61 62 6f 75 74 20  n just.** about 
ecc0: 65 76 65 72 79 20 66 69 6c 65 73 79 73 74 65 6d  every filesystem
ecd0: 20 69 6d 61 67 69 6e 61 62 6c 65 2e 20 20 42 75   imaginable.  Bu
ece0: 74 20 74 68 65 72 65 20 61 72 65 20 73 65 72 69  t there are seri
ecf0: 6f 75 73 20 64 6f 77 6e 73 69 64 65 73 3a 0a 2a  ous downsides:.*
ed00: 2a 0a 2a 2a 20 20 20 20 28 31 29 20 20 54 68 65  *.**    (1)  The
ed10: 72 65 20 69 73 20 7a 65 72 6f 20 63 6f 6e 63 75  re is zero concu
ed20: 72 72 65 6e 63 79 2e 20 20 41 20 73 69 6e 67 6c  rrency.  A singl
ed30: 65 20 72 65 61 64 65 72 20 62 6c 6f 63 6b 73 20  e reader blocks 
ed40: 61 6c 6c 20 6f 74 68 65 72 0a 2a 2a 20 20 20 20  all other.**    
ed50: 20 20 20 20 20 63 6f 6e 6e 65 63 74 69 6f 6e 73       connections
ed60: 20 66 72 6f 6d 20 72 65 61 64 69 6e 67 20 6f 72   from reading or
ed70: 20 77 72 69 74 69 6e 67 20 74 68 65 20 64 61 74   writing the dat
ed80: 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 20  abase..**.**    
ed90: 28 32 29 20 20 41 6e 20 61 70 70 6c 69 63 61 74  (2)  An applicat
eda0: 69 6f 6e 20 63 72 61 73 68 20 6f 72 20 70 6f 77  ion crash or pow
edb0: 65 72 20 6c 6f 73 73 20 63 61 6e 20 6c 65 61 76  er loss can leav
edc0: 65 20 73 74 61 6c 65 20 6c 6f 63 6b 20 66 69 6c  e stale lock fil
edd0: 65 73 0a 2a 2a 20 20 20 20 20 20 20 20 20 73 69  es.**         si
ede0: 74 74 69 6e 67 20 61 72 6f 75 6e 64 20 74 68 61  tting around tha
edf0: 74 20 6e 65 65 64 20 74 6f 20 62 65 20 63 6c 65  t need to be cle
ee00: 61 72 65 64 20 6d 61 6e 75 61 6c 6c 79 2e 0a 2a  ared manually..*
ee10: 2a 0a 2a 2a 20 4e 65 76 65 72 74 68 65 6c 65 73  *.** Nevertheles
ee20: 73 2c 20 61 20 64 6f 74 6c 6f 63 6b 20 69 73 20  s, a dotlock is 
ee30: 61 6e 20 61 70 70 72 6f 70 72 69 61 74 65 20 6c  an appropriate l
ee40: 6f 63 6b 69 6e 67 20 6d 6f 64 65 20 66 6f 72 20  ocking mode for 
ee50: 75 73 65 20 69 66 20 6e 6f 0a 2a 2a 20 6f 74 68  use if no.** oth
ee60: 65 72 20 6c 6f 63 6b 69 6e 67 20 73 74 72 61 74  er locking strat
ee70: 65 67 79 20 69 73 20 61 76 61 69 6c 61 62 6c 65  egy is available
ee80: 2e 0a 2a 2a 0a 2a 2a 20 44 6f 74 66 69 6c 65 20  ..**.** Dotfile 
ee90: 6c 6f 63 6b 69 6e 67 20 77 6f 72 6b 73 20 62 79  locking works by
eea0: 20 63 72 65 61 74 69 6e 67 20 61 20 66 69 6c 65   creating a file
eeb0: 20 69 6e 20 74 68 65 20 73 61 6d 65 20 64 69 72   in the same dir
eec0: 65 63 74 6f 72 79 20 61 73 20 74 68 65 0a 2a 2a  ectory as the.**
eed0: 20 64 61 74 61 62 61 73 65 20 61 6e 64 20 77 69   database and wi
eee0: 74 68 20 74 68 65 20 73 61 6d 65 20 6e 61 6d 65  th the same name
eef0: 20 62 75 74 20 77 69 74 68 20 61 20 22 2e 6c 6f   but with a ".lo
ef00: 63 6b 22 20 65 78 74 65 6e 73 69 6f 6e 20 61 64  ck" extension ad
ef10: 64 65 64 2e 0a 2a 2a 20 54 68 65 20 65 78 69 73  ded..** The exis
ef20: 74 61 6e 63 65 20 6f 66 20 61 20 6c 6f 63 6b 20  tance of a lock 
ef30: 66 69 6c 65 20 69 6d 70 6c 69 65 73 20 61 6e 20  file implies an 
ef40: 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 20  EXCLUSIVE lock. 
ef50: 20 41 6c 6c 20 6f 74 68 65 72 20 6c 6f 63 6b 0a   All other lock.
ef60: 2a 2a 20 74 79 70 65 73 20 28 53 48 41 52 45 44  ** types (SHARED
ef70: 2c 20 52 45 53 45 52 56 45 44 2c 20 50 45 4e 44  , RESERVED, PEND
ef80: 49 4e 47 29 20 61 72 65 20 6d 61 70 70 65 64 20  ING) are mapped 
ef90: 69 6e 74 6f 20 45 58 43 4c 55 53 49 56 45 2e 0a  into EXCLUSIVE..
efa0: 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 69  */../*.** The fi
efb0: 6c 65 20 73 75 66 66 69 78 20 61 64 64 65 64 20  le suffix added 
efc0: 74 6f 20 74 68 65 20 64 61 74 61 20 62 61 73 65  to the data base
efd0: 20 66 69 6c 65 6e 61 6d 65 20 69 6e 20 6f 72 64   filename in ord
efe0: 65 72 20 74 6f 20 63 72 65 61 74 65 20 74 68 65  er to create the
eff0: 0a 2a 2a 20 6c 6f 63 6b 20 66 69 6c 65 2e 0a 2a  .** lock file..*
f000: 2f 0a 23 64 65 66 69 6e 65 20 44 4f 54 4c 4f 43  /.#define DOTLOC
f010: 4b 5f 53 55 46 46 49 58 20 22 2e 6c 6f 63 6b 22  K_SUFFIX ".lock"
f020: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
f030: 74 69 6e 65 20 63 68 65 63 6b 73 20 69 66 20 74  tine checks if t
f040: 68 65 72 65 20 69 73 20 61 20 52 45 53 45 52 56  here is a RESERV
f050: 45 44 20 6c 6f 63 6b 20 68 65 6c 64 20 6f 6e 20  ED lock held on 
f060: 74 68 65 20 73 70 65 63 69 66 69 65 64 0a 2a 2a  the specified.**
f070: 20 66 69 6c 65 20 62 79 20 74 68 69 73 20 6f 72   file by this or
f080: 20 61 6e 79 20 6f 74 68 65 72 20 70 72 6f 63 65   any other proce
f090: 73 73 2e 20 49 66 20 73 75 63 68 20 61 20 6c 6f  ss. If such a lo
f0a0: 63 6b 20 69 73 20 68 65 6c 64 2c 20 73 65 74 20  ck is held, set 
f0b0: 2a 70 52 65 73 4f 75 74 0a 2a 2a 20 74 6f 20 61  *pResOut.** to a
f0c0: 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75 65 20   non-zero value 
f0d0: 6f 74 68 65 72 77 69 73 65 20 2a 70 52 65 73 4f  otherwise *pResO
f0e0: 75 74 20 69 73 20 73 65 74 20 74 6f 20 7a 65 72  ut is set to zer
f0f0: 6f 2e 20 20 54 68 65 20 72 65 74 75 72 6e 20 76  o.  The return v
f100: 61 6c 75 65 0a 2a 2a 20 69 73 20 73 65 74 20 74  alue.** is set t
f110: 6f 20 53 51 4c 49 54 45 5f 4f 4b 20 75 6e 6c 65  o SQLITE_OK unle
f120: 73 73 20 61 6e 20 49 2f 4f 20 65 72 72 6f 72 20  ss an I/O error 
f130: 6f 63 63 75 72 73 20 64 75 72 69 6e 67 20 6c 6f  occurs during lo
f140: 63 6b 20 63 68 65 63 6b 69 6e 67 2e 0a 2a 2a 0a  ck checking..**.
f150: 2a 2a 20 49 6e 20 64 6f 74 66 69 6c 65 20 6c 6f  ** In dotfile lo
f160: 63 6b 69 6e 67 2c 20 65 69 74 68 65 72 20 61 20  cking, either a 
f170: 6c 6f 63 6b 20 65 78 69 73 74 73 20 6f 72 20 69  lock exists or i
f180: 74 20 64 6f 65 73 20 6e 6f 74 2e 20 20 53 6f 20  t does not.  So 
f190: 69 6e 20 74 68 69 73 0a 2a 2a 20 76 61 72 69 61  in this.** varia
f1a0: 74 69 6f 6e 20 6f 66 20 43 68 65 63 6b 52 65 73  tion of CheckRes
f1b0: 65 72 76 65 64 4c 6f 63 6b 28 29 2c 20 2a 70 52  ervedLock(), *pR
f1c0: 65 73 4f 75 74 20 69 73 20 73 65 74 20 74 6f 20  esOut is set to 
f1d0: 74 72 75 65 20 69 66 20 61 6e 79 20 6c 6f 63 6b  true if any lock
f1e0: 0a 2a 2a 20 69 73 20 68 65 6c 64 20 6f 6e 20 74  .** is held on t
f1f0: 68 65 20 66 69 6c 65 20 61 6e 64 20 66 61 6c 73  he file and fals
f200: 65 20 69 66 20 74 68 65 20 66 69 6c 65 20 69 73  e if the file is
f210: 20 75 6e 6c 6f 63 6b 65 64 2e 0a 2a 2f 0a 73 74   unlocked..*/.st
f220: 61 74 69 63 20 69 6e 74 20 64 6f 74 6c 6f 63 6b  atic int dotlock
f230: 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63  CheckReservedLoc
f240: 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  k(sqlite3_file *
f250: 69 64 2c 20 69 6e 74 20 2a 70 52 65 73 4f 75 74  id, int *pResOut
f260: 29 20 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  ) {.  int rc = S
f270: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20  QLITE_OK;.  int 
f280: 72 65 73 65 72 76 65 64 20 3d 20 30 3b 0a 20 20  reserved = 0;.  
f290: 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20  unixFile *pFile 
f2a0: 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b  = (unixFile*)id;
f2b0: 0a 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72  ..  SimulateIOEr
f2c0: 72 6f 72 28 20 72 65 74 75 72 6e 20 53 51 4c 49  ror( return SQLI
f2d0: 54 45 5f 49 4f 45 52 52 5f 43 48 45 43 4b 52 45  TE_IOERR_CHECKRE
f2e0: 53 45 52 56 45 44 4c 4f 43 4b 3b 20 29 3b 0a 20  SERVEDLOCK; );. 
f2f0: 20 0a 20 20 61 73 73 65 72 74 28 20 70 46 69 6c   .  assert( pFil
f300: 65 20 29 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b  e );..  /* Check
f310: 20 69 66 20 61 20 74 68 72 65 61 64 20 69 6e 20   if a thread in 
f320: 74 68 69 73 20 70 72 6f 63 65 73 73 20 68 6f 6c  this process hol
f330: 64 73 20 73 75 63 68 20 61 20 6c 6f 63 6b 20 2a  ds such a lock *
f340: 2f 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 6c  /.  if( pFile->l
f350: 6f 63 6b 74 79 70 65 3e 53 48 41 52 45 44 5f 4c  ocktype>SHARED_L
f360: 4f 43 4b 20 29 7b 0a 20 20 20 20 2f 2a 20 45 69  OCK ){.    /* Ei
f370: 74 68 65 72 20 74 68 69 73 20 63 6f 6e 6e 65 63  ther this connec
f380: 74 69 6f 6e 20 6f 72 20 73 6f 6d 65 20 6f 74 68  tion or some oth
f390: 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 6e  er connection in
f3a0: 20 74 68 65 20 73 61 6d 65 20 70 72 6f 63 65 73   the same proces
f3b0: 73 0a 20 20 20 20 2a 2a 20 68 6f 6c 64 73 20 61  s.    ** holds a
f3c0: 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 66 69 6c   lock on the fil
f3d0: 65 2e 20 20 4e 6f 20 6e 65 65 64 20 74 6f 20 63  e.  No need to c
f3e0: 68 65 63 6b 20 66 75 72 74 68 65 72 2e 20 2a 2f  heck further. */
f3f0: 0a 20 20 20 20 72 65 73 65 72 76 65 64 20 3d 20  .    reserved = 
f400: 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  1;.  }else{.    
f410: 2f 2a 20 54 68 65 20 6c 6f 63 6b 20 69 73 20 68  /* The lock is h
f420: 65 6c 64 20 69 66 20 61 6e 64 20 6f 6e 6c 79 20  eld if and only 
f430: 69 66 20 74 68 65 20 6c 6f 63 6b 66 69 6c 65 20  if the lockfile 
f440: 65 78 69 73 74 73 20 2a 2f 0a 20 20 20 20 63 6f  exists */.    co
f450: 6e 73 74 20 63 68 61 72 20 2a 7a 4c 6f 63 6b 46  nst char *zLockF
f460: 69 6c 65 20 3d 20 28 63 6f 6e 73 74 20 63 68 61  ile = (const cha
f470: 72 2a 29 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e  r*)pFile->lockin
f480: 67 43 6f 6e 74 65 78 74 3b 0a 20 20 20 20 72 65  gContext;.    re
f490: 73 65 72 76 65 64 20 3d 20 61 63 63 65 73 73 28  served = access(
f4a0: 7a 4c 6f 63 6b 46 69 6c 65 2c 20 30 29 3d 3d 30  zLockFile, 0)==0
f4b0: 3b 0a 20 20 7d 0a 20 20 4f 53 54 52 41 43 45 34  ;.  }.  OSTRACE4
f4c0: 28 22 54 45 53 54 20 57 52 2d 4c 4f 43 4b 20 25  ("TEST WR-LOCK %
f4d0: 64 20 25 64 20 25 64 20 28 64 6f 74 6c 6f 63 6b  d %d %d (dotlock
f4e0: 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20  )\n", pFile->h, 
f4f0: 72 63 2c 20 72 65 73 65 72 76 65 64 29 3b 0a 20  rc, reserved);. 
f500: 20 2a 70 52 65 73 4f 75 74 20 3d 20 72 65 73 65   *pResOut = rese
f510: 72 76 65 64 3b 0a 20 20 72 65 74 75 72 6e 20 72  rved;.  return r
f520: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 6b  c;.}../*.** Lock
f530: 20 74 68 65 20 66 69 6c 65 20 77 69 74 68 20 74   the file with t
f540: 68 65 20 6c 6f 63 6b 20 73 70 65 63 69 66 69 65  he lock specifie
f550: 64 20 62 79 20 70 61 72 61 6d 65 74 65 72 20 6c  d by parameter l
f560: 6f 63 6b 74 79 70 65 20 2d 20 6f 6e 65 0a 2a 2a  ocktype - one.**
f570: 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   of the followin
f580: 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28 31 29  g:.**.**     (1)
f590: 20 53 48 41 52 45 44 5f 4c 4f 43 4b 0a 2a 2a 20   SHARED_LOCK.** 
f5a0: 20 20 20 20 28 32 29 20 52 45 53 45 52 56 45 44      (2) RESERVED
f5b0: 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 33 29  _LOCK.**     (3)
f5c0: 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 0a 2a 2a   PENDING_LOCK.**
f5d0: 20 20 20 20 20 28 34 29 20 45 58 43 4c 55 53 49       (4) EXCLUSI
f5e0: 56 45 5f 4c 4f 43 4b 0a 2a 2a 0a 2a 2a 20 53 6f  VE_LOCK.**.** So
f5f0: 6d 65 74 69 6d 65 73 20 77 68 65 6e 20 72 65 71  metimes when req
f600: 75 65 73 74 69 6e 67 20 6f 6e 65 20 6c 6f 63 6b  uesting one lock
f610: 20 73 74 61 74 65 2c 20 61 64 64 69 74 69 6f 6e   state, addition
f620: 61 6c 20 6c 6f 63 6b 20 73 74 61 74 65 73 0a 2a  al lock states.*
f630: 2a 20 61 72 65 20 69 6e 73 65 72 74 65 64 20 69  * are inserted i
f640: 6e 20 62 65 74 77 65 65 6e 2e 20 20 54 68 65 20  n between.  The 
f650: 6c 6f 63 6b 69 6e 67 20 6d 69 67 68 74 20 66 61  locking might fa
f660: 69 6c 20 6f 6e 20 6f 6e 65 20 6f 66 20 74 68 65  il on one of the
f670: 20 6c 61 74 65 72 0a 2a 2a 20 74 72 61 6e 73 69   later.** transi
f680: 74 69 6f 6e 73 20 6c 65 61 76 69 6e 67 20 74 68  tions leaving th
f690: 65 20 6c 6f 63 6b 20 73 74 61 74 65 20 64 69 66  e lock state dif
f6a0: 66 65 72 65 6e 74 20 66 72 6f 6d 20 77 68 61 74  ferent from what
f6b0: 20 69 74 20 73 74 61 72 74 65 64 20 62 75 74 0a   it started but.
f6c0: 2a 2a 20 73 74 69 6c 6c 20 73 68 6f 72 74 20 6f  ** still short o
f6d0: 66 20 69 74 73 20 67 6f 61 6c 2e 20 20 54 68 65  f its goal.  The
f6e0: 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 68 61 72 74   following chart
f6f0: 20 73 68 6f 77 73 20 74 68 65 20 61 6c 6c 6f 77   shows the allow
f700: 65 64 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e  ed.** transition
f710: 73 20 61 6e 64 20 74 68 65 20 69 6e 73 65 72 74  s and the insert
f720: 65 64 20 69 6e 74 65 72 6d 65 64 69 61 74 65 20  ed intermediate 
f730: 73 74 61 74 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  states:.**.**   
f740: 20 55 4e 4c 4f 43 4b 45 44 20 2d 3e 20 53 48 41   UNLOCKED -> SHA
f750: 52 45 44 0a 2a 2a 20 20 20 20 53 48 41 52 45 44  RED.**    SHARED
f760: 20 2d 3e 20 52 45 53 45 52 56 45 44 0a 2a 2a 20   -> RESERVED.** 
f770: 20 20 20 53 48 41 52 45 44 20 2d 3e 20 28 50 45     SHARED -> (PE
f780: 4e 44 49 4e 47 29 20 2d 3e 20 45 58 43 4c 55 53  NDING) -> EXCLUS
f790: 49 56 45 0a 2a 2a 20 20 20 20 52 45 53 45 52 56  IVE.**    RESERV
f7a0: 45 44 20 2d 3e 20 28 50 45 4e 44 49 4e 47 29 20  ED -> (PENDING) 
f7b0: 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20  -> EXCLUSIVE.** 
f7c0: 20 20 20 50 45 4e 44 49 4e 47 20 2d 3e 20 45 58     PENDING -> EX
f7d0: 43 4c 55 53 49 56 45 0a 2a 2a 0a 2a 2a 20 54 68  CLUSIVE.**.** Th
f7e0: 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20  is routine will 
f7f0: 6f 6e 6c 79 20 69 6e 63 72 65 61 73 65 20 61 20  only increase a 
f800: 6c 6f 63 6b 2e 20 20 55 73 65 20 74 68 65 20 73  lock.  Use the s
f810: 71 6c 69 74 65 33 4f 73 55 6e 6c 6f 63 6b 28 29  qlite3OsUnlock()
f820: 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 74 6f 20 6c  .** routine to l
f830: 6f 77 65 72 20 61 20 6c 6f 63 6b 69 6e 67 20 6c  ower a locking l
f840: 65 76 65 6c 2e 0a 2a 2a 0a 2a 2a 20 57 69 74 68  evel..**.** With
f850: 20 64 6f 74 66 69 6c 65 20 6c 6f 63 6b 69 6e 67   dotfile locking
f860: 2c 20 77 65 20 72 65 61 6c 6c 79 20 6f 6e 6c 79  , we really only
f870: 20 73 75 70 70 6f 72 74 20 73 74 61 74 65 20 28   support state (
f880: 34 29 3a 20 45 58 43 4c 55 53 49 56 45 2e 0a 2a  4): EXCLUSIVE..*
f890: 2a 20 42 75 74 20 77 65 20 74 72 61 63 6b 20 74  * But we track t
f8a0: 68 65 20 6f 74 68 65 72 20 6c 6f 63 6b 69 6e 67  he other locking
f8b0: 20 6c 65 76 65 6c 73 20 69 6e 74 65 72 6e 61 6c   levels internal
f8c0: 6c 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ly..*/.static in
f8d0: 74 20 64 6f 74 6c 6f 63 6b 4c 6f 63 6b 28 73 71  t dotlockLock(sq
f8e0: 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20  lite3_file *id, 
f8f0: 69 6e 74 20 6c 6f 63 6b 74 79 70 65 29 20 7b 0a  int locktype) {.
f900: 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c    unixFile *pFil
f910: 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69  e = (unixFile*)i
f920: 64 3b 0a 20 20 69 6e 74 20 66 64 3b 0a 20 20 63  d;.  int fd;.  c
f930: 68 61 72 20 2a 7a 4c 6f 63 6b 46 69 6c 65 20 3d  har *zLockFile =
f940: 20 28 63 68 61 72 20 2a 29 70 46 69 6c 65 2d 3e   (char *)pFile->
f950: 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 0a  lockingContext;.
f960: 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
f970: 45 5f 4f 4b 3b 0a 0a 0a 20 20 2f 2a 20 49 66 20  E_OK;...  /* If 
f980: 77 65 20 68 61 76 65 20 61 6e 79 20 6c 6f 63 6b  we have any lock
f990: 2c 20 74 68 65 6e 20 74 68 65 20 6c 6f 63 6b 20  , then the lock 
f9a0: 66 69 6c 65 20 61 6c 72 65 61 64 79 20 65 78 69  file already exi
f9b0: 73 74 73 2e 20 20 41 6c 6c 20 77 65 20 68 61 76  sts.  All we hav
f9c0: 65 0a 20 20 2a 2a 20 74 6f 20 64 6f 20 69 73 20  e.  ** to do is 
f9d0: 61 64 6a 75 73 74 20 6f 75 72 20 69 6e 74 65 72  adjust our inter
f9e0: 6e 61 6c 20 72 65 63 6f 72 64 20 6f 66 20 74 68  nal record of th
f9f0: 65 20 6c 6f 63 6b 20 6c 65 76 65 6c 2e 0a 20 20  e lock level..  
fa00: 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e  */.  if( pFile->
fa10: 6c 6f 63 6b 74 79 70 65 20 3e 20 4e 4f 5f 4c 4f  locktype > NO_LO
fa20: 43 4b 20 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d  CK ){.    pFile-
fa30: 3e 6c 6f 63 6b 74 79 70 65 20 3d 20 6c 6f 63 6b  >locktype = lock
fa40: 74 79 70 65 3b 0a 23 69 66 20 21 4f 53 5f 56 58  type;.#if !OS_VX
fa50: 57 4f 52 4b 53 0a 20 20 20 20 2f 2a 20 41 6c 77  WORKS.    /* Alw
fa60: 61 79 73 20 75 70 64 61 74 65 20 74 68 65 20 74  ays update the t
fa70: 69 6d 65 73 74 61 6d 70 20 6f 6e 20 74 68 65 20  imestamp on the 
fa80: 6f 6c 64 20 66 69 6c 65 20 2a 2f 0a 20 20 20 20  old file */.    
fa90: 75 74 69 6d 65 73 28 7a 4c 6f 63 6b 46 69 6c 65  utimes(zLockFile
faa0: 2c 20 4e 55 4c 4c 29 3b 0a 23 65 6e 64 69 66 0a  , NULL);.#endif.
fab0: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
fac0: 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f  E_OK;.  }.  .  /
fad0: 2a 20 67 72 61 62 20 61 6e 20 65 78 63 6c 75 73  * grab an exclus
fae0: 69 76 65 20 6c 6f 63 6b 20 2a 2f 0a 20 20 66 64  ive lock */.  fd
faf0: 20 3d 20 6f 70 65 6e 28 7a 4c 6f 63 6b 46 69 6c   = open(zLockFil
fb00: 65 2c 4f 5f 52 44 4f 4e 4c 59 7c 4f 5f 43 52 45  e,O_RDONLY|O_CRE
fb10: 41 54 7c 4f 5f 45 58 43 4c 2c 30 36 30 30 29 3b  AT|O_EXCL,0600);
fb20: 0a 20 20 69 66 28 20 66 64 3c 30 20 29 7b 0a 20  .  if( fd<0 ){. 
fb30: 20 20 20 2f 2a 20 66 61 69 6c 65 64 20 74 6f 20     /* failed to 
fb40: 6f 70 65 6e 2f 63 72 65 61 74 65 20 74 68 65 20  open/create the 
fb50: 66 69 6c 65 2c 20 73 6f 6d 65 6f 6e 65 20 65 6c  file, someone el
fb60: 73 65 20 6d 61 79 20 68 61 76 65 20 73 74 6f 6c  se may have stol
fb70: 65 6e 20 74 68 65 20 6c 6f 63 6b 20 2a 2f 0a 20  en the lock */. 
fb80: 20 20 20 69 6e 74 20 74 45 72 72 6e 6f 20 3d 20     int tErrno = 
fb90: 65 72 72 6e 6f 3b 0a 20 20 20 20 69 66 28 20 45  errno;.    if( E
fba0: 45 58 49 53 54 20 3d 3d 20 74 45 72 72 6e 6f 20  EXIST == tErrno 
fbb0: 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  ){.      rc = SQ
fbc0: 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 7d  LITE_BUSY;.    }
fbd0: 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 72 63   else {.      rc
fbe0: 20 3d 20 73 71 6c 69 74 65 45 72 72 6f 72 46 72   = sqliteErrorFr
fbf0: 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28 74 45 72  omPosixError(tEr
fc00: 72 6e 6f 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52  rno, SQLITE_IOER
fc10: 52 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 69  R_LOCK);.      i
fc20: 66 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52  f( IS_LOCK_ERROR
fc30: 28 72 63 29 20 29 7b 0a 20 20 20 20 20 20 20 20  (rc) ){.        
fc40: 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f  pFile->lastErrno
fc50: 20 3d 20 74 45 72 72 6e 6f 3b 0a 20 20 20 20 20   = tErrno;.     
fc60: 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74   }.    }.    ret
fc70: 75 72 6e 20 72 63 3b 0a 20 20 7d 20 0a 20 20 69  urn rc;.  } .  i
fc80: 66 28 20 63 6c 6f 73 65 28 66 64 29 20 29 7b 0a  f( close(fd) ){.
fc90: 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45      pFile->lastE
fca0: 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20  rrno = errno;.  
fcb0: 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f    rc = SQLITE_IO
fcc0: 45 52 52 5f 43 4c 4f 53 45 3b 0a 20 20 7d 0a 20  ERR_CLOSE;.  }. 
fcd0: 20 0a 20 20 2f 2a 20 67 6f 74 20 69 74 2c 20 73   .  /* got it, s
fce0: 65 74 20 74 68 65 20 74 79 70 65 20 61 6e 64 20  et the type and 
fcf0: 72 65 74 75 72 6e 20 6f 6b 20 2a 2f 0a 20 20 70  return ok */.  p
fd00: 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 20 3d  File->locktype =
fd10: 20 6c 6f 63 6b 74 79 70 65 3b 0a 20 20 72 65 74   locktype;.  ret
fd20: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
fd30: 20 4c 6f 77 65 72 20 74 68 65 20 6c 6f 63 6b 69   Lower the locki
fd40: 6e 67 20 6c 65 76 65 6c 20 6f 6e 20 66 69 6c 65  ng level on file
fd50: 20 64 65 73 63 72 69 70 74 6f 72 20 70 46 69 6c   descriptor pFil
fd60: 65 20 74 6f 20 6c 6f 63 6b 74 79 70 65 2e 20 20  e to locktype.  
fd70: 6c 6f 63 6b 74 79 70 65 0a 2a 2a 20 6d 75 73 74  locktype.** must
fd80: 20 62 65 20 65 69 74 68 65 72 20 4e 4f 5f 4c 4f   be either NO_LO
fd90: 43 4b 20 6f 72 20 53 48 41 52 45 44 5f 4c 4f 43  CK or SHARED_LOC
fda0: 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  K..**.** If the 
fdb0: 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 66  locking level of
fdc0: 20 74 68 65 20 66 69 6c 65 20 64 65 73 63 72 69   the file descri
fdd0: 70 74 6f 72 20 69 73 20 61 6c 72 65 61 64 79 20  ptor is already 
fde0: 61 74 20 6f 72 20 62 65 6c 6f 77 0a 2a 2a 20 74  at or below.** t
fdf0: 68 65 20 72 65 71 75 65 73 74 65 64 20 6c 6f 63  he requested loc
fe00: 6b 69 6e 67 20 6c 65 76 65 6c 2c 20 74 68 69 73  king level, this
fe10: 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f   routine is a no
fe20: 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20  -op..**.** When 
fe30: 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65  the locking leve
fe40: 6c 20 72 65 61 63 68 65 73 20 4e 4f 5f 4c 4f 43  l reaches NO_LOC
fe50: 4b 2c 20 64 65 6c 65 74 65 20 74 68 65 20 6c 6f  K, delete the lo
fe60: 63 6b 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74  ck file..*/.stat
fe70: 69 63 20 69 6e 74 20 64 6f 74 6c 6f 63 6b 55 6e  ic int dotlockUn
fe80: 6c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c  lock(sqlite3_fil
fe90: 65 20 2a 69 64 2c 20 69 6e 74 20 6c 6f 63 6b 74  e *id, int lockt
fea0: 79 70 65 29 20 7b 0a 20 20 75 6e 69 78 46 69 6c  ype) {.  unixFil
feb0: 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78  e *pFile = (unix
fec0: 46 69 6c 65 2a 29 69 64 3b 0a 20 20 63 68 61 72  File*)id;.  char
fed0: 20 2a 7a 4c 6f 63 6b 46 69 6c 65 20 3d 20 28 63   *zLockFile = (c
fee0: 68 61 72 20 2a 29 70 46 69 6c 65 2d 3e 6c 6f 63  har *)pFile->loc
fef0: 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 0a 0a 20 20  kingContext;..  
ff00: 61 73 73 65 72 74 28 20 70 46 69 6c 65 20 29 3b  assert( pFile );
ff10: 0a 20 20 4f 53 54 52 41 43 45 35 28 22 55 4e 4c  .  OSTRACE5("UNL
ff20: 4f 43 4b 20 20 25 64 20 25 64 20 77 61 73 20 25  OCK  %d %d was %
ff30: 64 20 70 69 64 3d 25 64 20 28 64 6f 74 6c 6f 63  d pid=%d (dotloc
ff40: 6b 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c  k)\n", pFile->h,
ff50: 20 6c 6f 63 6b 74 79 70 65 2c 0a 09 20 20 20 70   locktype,..   p
ff60: 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 2c 20  File->locktype, 
ff70: 67 65 74 70 69 64 28 29 29 3b 0a 20 20 61 73 73  getpid());.  ass
ff80: 65 72 74 28 20 6c 6f 63 6b 74 79 70 65 3c 3d 53  ert( locktype<=S
ff90: 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20  HARED_LOCK );.  
ffa0: 0a 20 20 2f 2a 20 6e 6f 2d 6f 70 20 69 66 20 70  .  /* no-op if p
ffb0: 6f 73 73 69 62 6c 65 20 2a 2f 0a 20 20 69 66 28  ossible */.  if(
ffc0: 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65   pFile->locktype
ffd0: 3d 3d 6c 6f 63 6b 74 79 70 65 20 29 7b 0a 20 20  ==locktype ){.  
ffe0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
fff0: 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 6f  OK;.  }..  /* To
10000 20 64 6f 77 6e 67 72 61 64 65 20 74 6f 20 73 68   downgrade to sh
10010 61 72 65 64 2c 20 73 69 6d 70 6c 79 20 75 70 64  ared, simply upd
10020 61 74 65 20 6f 75 72 20 69 6e 74 65 72 6e 61 6c  ate our internal
10030 20 6e 6f 74 69 6f 6e 20 6f 66 20 74 68 65 0a 20   notion of the. 
10040 20 2a 2a 20 6c 6f 63 6b 20 73 74 61 74 65 2e 20   ** lock state. 
10050 20 4e 6f 20 6e 65 65 64 20 74 6f 20 6d 65 73 73   No need to mess
10060 20 77 69 74 68 20 74 68 65 20 66 69 6c 65 20 6f   with the file o
10070 6e 20 64 69 73 6b 2e 0a 20 20 2a 2f 0a 20 20 69  n disk..  */.  i
10080 66 28 20 6c 6f 63 6b 74 79 70 65 3d 3d 53 48 41  f( locktype==SHA
10090 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20  RED_LOCK ){.    
100a0 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 20  pFile->locktype 
100b0 3d 20 53 48 41 52 45 44 5f 4c 4f 43 4b 3b 0a 20  = SHARED_LOCK;. 
100c0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
100d0 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a  _OK;.  }.  .  /*
100e0 20 54 6f 20 66 75 6c 6c 79 20 75 6e 6c 6f 63 6b   To fully unlock
100f0 20 74 68 65 20 64 61 74 61 62 61 73 65 2c 20 64   the database, d
10100 65 6c 65 74 65 20 74 68 65 20 6c 6f 63 6b 20 66  elete the lock f
10110 69 6c 65 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ile */.  assert(
10120 20 6c 6f 63 6b 74 79 70 65 3d 3d 4e 4f 5f 4c 4f   locktype==NO_LO
10130 43 4b 20 29 3b 0a 20 20 69 66 28 20 75 6e 6c 69  CK );.  if( unli
10140 6e 6b 28 7a 4c 6f 63 6b 46 69 6c 65 29 20 29 7b  nk(zLockFile) ){
10150 0a 20 20 20 20 69 6e 74 20 72 63 20 3d 20 30 3b  .    int rc = 0;
10160 0a 20 20 20 20 69 6e 74 20 74 45 72 72 6e 6f 20  .    int tErrno 
10170 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 69 66 28  = errno;.    if(
10180 20 45 4e 4f 45 4e 54 20 21 3d 20 74 45 72 72 6e   ENOENT != tErrn
10190 6f 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  o ){.      rc = 
101a0 73 71 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d 50  sqliteErrorFromP
101b0 6f 73 69 78 45 72 72 6f 72 28 74 45 72 72 6e 6f  osixError(tErrno
101c0 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55  , SQLITE_IOERR_U
101d0 4e 4c 4f 43 4b 29 3b 0a 20 20 20 20 7d 0a 20 20  NLOCK);.    }.  
101e0 20 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45 52    if( IS_LOCK_ER
101f0 52 4f 52 28 72 63 29 20 29 7b 0a 20 20 20 20 20  ROR(rc) ){.     
10200 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e   pFile->lastErrn
10210 6f 20 3d 20 74 45 72 72 6e 6f 3b 0a 20 20 20 20  o = tErrno;.    
10220 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b  }.    return rc;
10230 20 0a 20 20 7d 0a 20 20 70 46 69 6c 65 2d 3e 6c   .  }.  pFile->l
10240 6f 63 6b 74 79 70 65 20 3d 20 4e 4f 5f 4c 4f 43  ocktype = NO_LOC
10250 4b 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  K;.  return SQLI
10260 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
10270 43 6c 6f 73 65 20 61 20 66 69 6c 65 2e 20 20 4d  Close a file.  M
10280 61 6b 65 20 73 75 72 65 20 74 68 65 20 6c 6f 63  ake sure the loc
10290 6b 20 68 61 73 20 62 65 65 6e 20 72 65 6c 65 61  k has been relea
102a0 73 65 64 20 62 65 66 6f 72 65 20 63 6c 6f 73 69  sed before closi
102b0 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ng..*/.static in
102c0 74 20 64 6f 74 6c 6f 63 6b 43 6c 6f 73 65 28 73  t dotlockClose(s
102d0 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 29  qlite3_file *id)
102e0 20 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69   {.  int rc;.  i
102f0 66 28 20 69 64 20 29 7b 0a 20 20 20 20 75 6e 69  f( id ){.    uni
10300 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28  xFile *pFile = (
10310 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20  unixFile*)id;.  
10320 20 20 64 6f 74 6c 6f 63 6b 55 6e 6c 6f 63 6b 28    dotlockUnlock(
10330 69 64 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20 20  id, NO_LOCK);.  
10340 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
10350 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e  File->lockingCon
10360 74 65 78 74 29 3b 0a 20 20 7d 0a 20 20 72 63 20  text);.  }.  rc 
10370 3d 20 63 6c 6f 73 65 55 6e 69 78 46 69 6c 65 28  = closeUnixFile(
10380 69 64 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  id);.  return rc
10390 3b 0a 7d 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ;.}./***********
103a0 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64 20 6f 66 20 74  ******* End of t
103b0 68 65 20 64 6f 74 2d 66 69 6c 65 20 6c 6f 63 6b  he dot-file lock
103c0 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   implementation 
103d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
103e0 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ***.************
103f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10400 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10410 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10420 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10430 2a 2a 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  **/../**********
10440 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10450 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10460 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10470 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10480 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****.***********
10490 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20  *************** 
104a0 42 65 67 69 6e 20 66 6c 6f 63 6b 20 4c 6f 63 6b  Begin flock Lock
104b0 69 6e 67 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ing ************
104c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
104d0 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 55 73 65 20 74  ****.**.** Use t
104e0 68 65 20 66 6c 6f 63 6b 28 29 20 73 79 73 74 65  he flock() syste
104f0 6d 20 63 61 6c 6c 20 74 6f 20 64 6f 20 66 69 6c  m call to do fil
10500 65 20 6c 6f 63 6b 69 6e 67 2e 0a 2a 2a 0a 2a 2a  e locking..**.**
10510 20 66 6c 6f 63 6b 28 29 20 6c 6f 63 6b 69 6e 67   flock() locking
10520 20 69 73 20 6c 69 6b 65 20 64 6f 74 2d 66 69 6c   is like dot-fil
10530 65 20 6c 6f 63 6b 69 6e 67 20 69 6e 20 74 68 61  e locking in tha
10540 74 20 74 68 65 20 76 61 72 69 6f 75 73 0a 2a 2a  t the various.**
10550 20 66 69 6e 65 2d 67 72 61 69 6e 20 6c 6f 63 6b   fine-grain lock
10560 69 6e 67 20 6c 65 76 65 6c 73 20 73 75 70 70 6f  ing levels suppo
10570 72 74 65 64 20 62 79 20 53 51 4c 69 74 65 20 61  rted by SQLite a
10580 72 65 20 63 6f 6c 6c 61 70 73 65 64 20 69 6e 74  re collapsed int
10590 6f 0a 2a 2a 20 61 20 73 69 6e 67 6c 65 20 65 78  o.** a single ex
105a0 63 6c 75 73 69 76 65 20 6c 6f 63 6b 2e 20 20 49  clusive lock.  I
105b0 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 53  n other words, S
105c0 48 41 52 45 44 2c 20 52 45 53 45 52 56 45 44 2c  HARED, RESERVED,
105d0 20 61 6e 64 0a 2a 2a 20 50 45 4e 44 49 4e 47 20   and.** PENDING 
105e0 6c 6f 63 6b 73 20 61 72 65 20 74 68 65 20 73 61  locks are the sa
105f0 6d 65 20 74 68 69 6e 67 20 61 73 20 61 6e 20 45  me thing as an E
10600 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 20 20  XCLUSIVE lock.  
10610 53 51 4c 69 74 65 0a 2a 2a 20 73 74 69 6c 6c 20  SQLite.** still 
10620 77 6f 72 6b 73 20 77 68 65 6e 20 79 6f 75 20 64  works when you d
10630 6f 20 74 68 69 73 2c 20 62 75 74 20 63 6f 6e 63  o this, but conc
10640 75 72 72 65 6e 63 79 20 69 73 20 72 65 64 75 63  urrency is reduc
10650 65 64 20 73 69 6e 63 65 0a 2a 2a 20 6f 6e 6c 79  ed since.** only
10660 20 61 20 73 69 6e 67 6c 65 20 70 72 6f 63 65 73   a single proces
10670 73 20 63 61 6e 20 62 65 20 72 65 61 64 69 6e 67  s can be reading
10680 20 74 68 65 20 64 61 74 61 62 61 73 65 20 61 74   the database at
10690 20 61 20 74 69 6d 65 2e 0a 2a 2a 0a 2a 2a 20 4f   a time..**.** O
106a0 6d 69 74 20 74 68 69 73 20 73 65 63 74 69 6f 6e  mit this section
106b0 20 69 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c   if SQLITE_ENABL
106c0 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20  E_LOCKING_STYLE 
106d0 69 73 20 74 75 72 6e 65 64 20 6f 66 66 20 6f 72  is turned off or
106e0 20 69 66 0a 2a 2a 20 63 6f 6d 70 69 6c 69 6e 67   if.** compiling
106f0 20 66 6f 72 20 56 58 57 4f 52 4b 53 2e 0a 2a 2f   for VXWORKS..*/
10700 0a 23 69 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  .#if SQLITE_ENAB
10710 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45  LE_LOCKING_STYLE
10720 20 26 26 20 21 4f 53 5f 56 58 57 4f 52 4b 53 0a   && !OS_VXWORKS.
10730 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
10740 69 6e 65 20 63 68 65 63 6b 73 20 69 66 20 74 68  ine checks if th
10750 65 72 65 20 69 73 20 61 20 52 45 53 45 52 56 45  ere is a RESERVE
10760 44 20 6c 6f 63 6b 20 68 65 6c 64 20 6f 6e 20 74  D lock held on t
10770 68 65 20 73 70 65 63 69 66 69 65 64 0a 2a 2a 20  he specified.** 
10780 66 69 6c 65 20 62 79 20 74 68 69 73 20 6f 72 20  file by this or 
10790 61 6e 79 20 6f 74 68 65 72 20 70 72 6f 63 65 73  any other proces
107a0 73 2e 20 49 66 20 73 75 63 68 20 61 20 6c 6f 63  s. If such a loc
107b0 6b 20 69 73 20 68 65 6c 64 2c 20 73 65 74 20 2a  k is held, set *
107c0 70 52 65 73 4f 75 74 0a 2a 2a 20 74 6f 20 61 20  pResOut.** to a 
107d0 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75 65 20 6f  non-zero value o
107e0 74 68 65 72 77 69 73 65 20 2a 70 52 65 73 4f 75  therwise *pResOu
107f0 74 20 69 73 20 73 65 74 20 74 6f 20 7a 65 72 6f  t is set to zero
10800 2e 20 20 54 68 65 20 72 65 74 75 72 6e 20 76 61  .  The return va
10810 6c 75 65 0a 2a 2a 20 69 73 20 73 65 74 20 74 6f  lue.** is set to
10820 20 53 51 4c 49 54 45 5f 4f 4b 20 75 6e 6c 65 73   SQLITE_OK unles
10830 73 20 61 6e 20 49 2f 4f 20 65 72 72 6f 72 20 6f  s an I/O error o
10840 63 63 75 72 73 20 64 75 72 69 6e 67 20 6c 6f 63  ccurs during loc
10850 6b 20 63 68 65 63 6b 69 6e 67 2e 0a 2a 2f 0a 73  k checking..*/.s
10860 74 61 74 69 63 20 69 6e 74 20 66 6c 6f 63 6b 43  tatic int flockC
10870 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b  heckReservedLock
10880 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69  (sqlite3_file *i
10890 64 2c 20 69 6e 74 20 2a 70 52 65 73 4f 75 74 29  d, int *pResOut)
108a0 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
108b0 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 72 65  ITE_OK;.  int re
108c0 73 65 72 76 65 64 20 3d 20 30 3b 0a 20 20 75 6e  served = 0;.  un
108d0 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20  ixFile *pFile = 
108e0 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20  (unixFile*)id;. 
108f0 20 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72   .  SimulateIOEr
10900 72 6f 72 28 20 72 65 74 75 72 6e 20 53 51 4c 49  ror( return SQLI
10910 54 45 5f 49 4f 45 52 52 5f 43 48 45 43 4b 52 45  TE_IOERR_CHECKRE
10920 53 45 52 56 45 44 4c 4f 43 4b 3b 20 29 3b 0a 20  SERVEDLOCK; );. 
10930 20 0a 20 20 61 73 73 65 72 74 28 20 70 46 69 6c   .  assert( pFil
10940 65 20 29 3b 0a 20 20 0a 20 20 2f 2a 20 43 68 65  e );.  .  /* Che
10950 63 6b 20 69 66 20 61 20 74 68 72 65 61 64 20 69  ck if a thread i
10960 6e 20 74 68 69 73 20 70 72 6f 63 65 73 73 20 68  n this process h
10970 6f 6c 64 73 20 73 75 63 68 20 61 20 6c 6f 63 6b  olds such a lock
10980 20 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c 65 2d   */.  if( pFile-
10990 3e 6c 6f 63 6b 74 79 70 65 3e 53 48 41 52 45 44  >locktype>SHARED
109a0 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 72 65 73  _LOCK ){.    res
109b0 65 72 76 65 64 20 3d 20 31 3b 0a 20 20 7d 0a 20  erved = 1;.  }. 
109c0 20 0a 20 20 2f 2a 20 4f 74 68 65 72 77 69 73 65   .  /* Otherwise
109d0 20 73 65 65 20 69 66 20 73 6f 6d 65 20 6f 74 68   see if some oth
109e0 65 72 20 70 72 6f 63 65 73 73 20 68 6f 6c 64 73  er process holds
109f0 20 69 74 2e 20 2a 2f 0a 20 20 69 66 28 20 21 72   it. */.  if( !r
10a00 65 73 65 72 76 65 64 20 29 7b 0a 20 20 20 20 2f  eserved ){.    /
10a10 2a 20 61 74 74 65 6d 70 74 20 74 6f 20 67 65 74  * attempt to get
10a20 20 74 68 65 20 6c 6f 63 6b 20 2a 2f 0a 20 20 20   the lock */.   
10a30 20 69 6e 74 20 6c 72 63 20 3d 20 66 6c 6f 63 6b   int lrc = flock
10a40 28 70 46 69 6c 65 2d 3e 68 2c 20 4c 4f 43 4b 5f  (pFile->h, LOCK_
10a50 45 58 20 7c 20 4c 4f 43 4b 5f 4e 42 29 3b 0a 20  EX | LOCK_NB);. 
10a60 20 20 20 69 66 28 20 21 6c 72 63 20 29 7b 0a 20     if( !lrc ){. 
10a70 20 20 20 20 20 2f 2a 20 67 6f 74 20 74 68 65 20       /* got the 
10a80 6c 6f 63 6b 2c 20 75 6e 6c 6f 63 6b 20 69 74 20  lock, unlock it 
10a90 2a 2f 0a 20 20 20 20 20 20 6c 72 63 20 3d 20 66  */.      lrc = f
10aa0 6c 6f 63 6b 28 70 46 69 6c 65 2d 3e 68 2c 20 4c  lock(pFile->h, L
10ab0 4f 43 4b 5f 55 4e 29 3b 0a 20 20 20 20 20 20 69  OCK_UN);.      i
10ac0 66 20 28 20 6c 72 63 20 29 20 7b 0a 20 20 20 20  f ( lrc ) {.    
10ad0 20 20 20 20 69 6e 74 20 74 45 72 72 6e 6f 20 3d      int tErrno =
10ae0 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20 20 20   errno;.        
10af0 2f 2a 20 75 6e 6c 6f 63 6b 20 66 61 69 6c 65 64  /* unlock failed
10b00 20 77 69 74 68 20 61 6e 20 65 72 72 6f 72 20 2a   with an error *
10b10 2f 0a 20 20 20 20 20 20 20 20 6c 72 63 20 3d 20  /.        lrc = 
10b20 73 71 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d 50  sqliteErrorFromP
10b30 6f 73 69 78 45 72 72 6f 72 28 74 45 72 72 6e 6f  osixError(tErrno
10b40 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55  , SQLITE_IOERR_U
10b50 4e 4c 4f 43 4b 29 3b 20 0a 20 20 20 20 20 20 20  NLOCK); .       
10b60 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52   if( IS_LOCK_ERR
10b70 4f 52 28 6c 72 63 29 20 29 7b 0a 20 20 20 20 20  OR(lrc) ){.     
10b80 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74       pFile->last
10b90 45 72 72 6e 6f 20 3d 20 74 45 72 72 6e 6f 3b 0a  Errno = tErrno;.
10ba0 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 6c            rc = l
10bb0 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  rc;.        }.  
10bc0 20 20 20 20 7d 0a 20 20 20 20 7d 20 65 6c 73 65      }.    } else
10bd0 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 74 45 72   {.      int tEr
10be0 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20  rno = errno;.   
10bf0 20 20 20 72 65 73 65 72 76 65 64 20 3d 20 31 3b     reserved = 1;
10c00 0a 20 20 20 20 20 20 2f 2a 20 73 6f 6d 65 6f 6e  .      /* someon
10c10 65 20 65 6c 73 65 20 6d 69 67 68 74 20 68 61 76  e else might hav
10c20 65 20 69 74 20 72 65 73 65 72 76 65 64 20 2a 2f  e it reserved */
10c30 0a 20 20 20 20 20 20 6c 72 63 20 3d 20 73 71 6c  .      lrc = sql
10c40 69 74 65 45 72 72 6f 72 46 72 6f 6d 50 6f 73 69  iteErrorFromPosi
10c50 78 45 72 72 6f 72 28 74 45 72 72 6e 6f 2c 20 53  xError(tErrno, S
10c60 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b  QLITE_IOERR_LOCK
10c70 29 3b 20 0a 20 20 20 20 20 20 69 66 28 20 49 53  ); .      if( IS
10c80 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 6c 72 63 29  _LOCK_ERROR(lrc)
10c90 20 29 7b 0a 20 20 20 20 20 20 20 20 70 46 69 6c   ){.        pFil
10ca0 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 74  e->lastErrno = t
10cb0 45 72 72 6e 6f 3b 0a 20 20 20 20 20 20 20 20 72  Errno;.        r
10cc0 63 20 3d 20 6c 72 63 3b 0a 20 20 20 20 20 20 7d  c = lrc;.      }
10cd0 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 4f 53 54  .    }.  }.  OST
10ce0 52 41 43 45 34 28 22 54 45 53 54 20 57 52 2d 4c  RACE4("TEST WR-L
10cf0 4f 43 4b 20 25 64 20 25 64 20 25 64 20 28 66 6c  OCK %d %d %d (fl
10d00 6f 63 6b 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e  ock)\n", pFile->
10d10 68 2c 20 72 63 2c 20 72 65 73 65 72 76 65 64 29  h, rc, reserved)
10d20 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  ;..#ifdef SQLITE
10d30 5f 49 47 4e 4f 52 45 5f 46 4c 4f 43 4b 5f 4c 4f  _IGNORE_FLOCK_LO
10d40 43 4b 5f 45 52 52 4f 52 53 0a 20 20 69 66 28 20  CK_ERRORS.  if( 
10d50 28 72 63 20 26 20 53 51 4c 49 54 45 5f 49 4f 45  (rc & SQLITE_IOE
10d60 52 52 29 20 3d 3d 20 53 51 4c 49 54 45 5f 49 4f  RR) == SQLITE_IO
10d70 45 52 52 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  ERR ){.    rc = 
10d80 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 72  SQLITE_OK;.    r
10d90 65 73 65 72 76 65 64 3d 31 3b 0a 20 20 7d 0a 23  eserved=1;.  }.#
10da0 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
10db0 49 47 4e 4f 52 45 5f 46 4c 4f 43 4b 5f 4c 4f 43  IGNORE_FLOCK_LOC
10dc0 4b 5f 45 52 52 4f 52 53 20 2a 2f 0a 20 20 2a 70  K_ERRORS */.  *p
10dd0 52 65 73 4f 75 74 20 3d 20 72 65 73 65 72 76 65  ResOut = reserve
10de0 64 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  d;.  return rc;.
10df0 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 6b 20 74 68  }../*.** Lock th
10e00 65 20 66 69 6c 65 20 77 69 74 68 20 74 68 65 20  e file with the 
10e10 6c 6f 63 6b 20 73 70 65 63 69 66 69 65 64 20 62  lock specified b
10e20 79 20 70 61 72 61 6d 65 74 65 72 20 6c 6f 63 6b  y parameter lock
10e30 74 79 70 65 20 2d 20 6f 6e 65 0a 2a 2a 20 6f 66  type - one.** of
10e40 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a   the following:.
10e50 2a 2a 0a 2a 2a 20 20 20 20 20 28 31 29 20 53 48  **.**     (1) SH
10e60 41 52 45 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20  ARED_LOCK.**    
10e70 20 28 32 29 20 52 45 53 45 52 56 45 44 5f 4c 4f   (2) RESERVED_LO
10e80 43 4b 0a 2a 2a 20 20 20 20 20 28 33 29 20 50 45  CK.**     (3) PE
10e90 4e 44 49 4e 47 5f 4c 4f 43 4b 0a 2a 2a 20 20 20  NDING_LOCK.**   
10ea0 20 20 28 34 29 20 45 58 43 4c 55 53 49 56 45 5f    (4) EXCLUSIVE_
10eb0 4c 4f 43 4b 0a 2a 2a 0a 2a 2a 20 53 6f 6d 65 74  LOCK.**.** Somet
10ec0 69 6d 65 73 20 77 68 65 6e 20 72 65 71 75 65 73  imes when reques
10ed0 74 69 6e 67 20 6f 6e 65 20 6c 6f 63 6b 20 73 74  ting one lock st
10ee0 61 74 65 2c 20 61 64 64 69 74 69 6f 6e 61 6c 20  ate, additional 
10ef0 6c 6f 63 6b 20 73 74 61 74 65 73 0a 2a 2a 20 61  lock states.** a
10f00 72 65 20 69 6e 73 65 72 74 65 64 20 69 6e 20 62  re inserted in b
10f10 65 74 77 65 65 6e 2e 20 20 54 68 65 20 6c 6f 63  etween.  The loc
10f20 6b 69 6e 67 20 6d 69 67 68 74 20 66 61 69 6c 20  king might fail 
10f30 6f 6e 20 6f 6e 65 20 6f 66 20 74 68 65 20 6c 61  on one of the la
10f40 74 65 72 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f  ter.** transitio
10f50 6e 73 20 6c 65 61 76 69 6e 67 20 74 68 65 20 6c  ns leaving the l
10f60 6f 63 6b 20 73 74 61 74 65 20 64 69 66 66 65 72  ock state differ
10f70 65 6e 74 20 66 72 6f 6d 20 77 68 61 74 20 69 74  ent from what it
10f80 20 73 74 61 72 74 65 64 20 62 75 74 0a 2a 2a 20   started but.** 
10f90 73 74 69 6c 6c 20 73 68 6f 72 74 20 6f 66 20 69  still short of i
10fa0 74 73 20 67 6f 61 6c 2e 20 20 54 68 65 20 66 6f  ts goal.  The fo
10fb0 6c 6c 6f 77 69 6e 67 20 63 68 61 72 74 20 73 68  llowing chart sh
10fc0 6f 77 73 20 74 68 65 20 61 6c 6c 6f 77 65 64 0a  ows the allowed.
10fd0 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e 73 20 61  ** transitions a
10fe0 6e 64 20 74 68 65 20 69 6e 73 65 72 74 65 64 20  nd the inserted 
10ff0 69 6e 74 65 72 6d 65 64 69 61 74 65 20 73 74 61  intermediate sta
11000 74 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 55 4e  tes:.**.**    UN
11010 4c 4f 43 4b 45 44 20 2d 3e 20 53 48 41 52 45 44  LOCKED -> SHARED
11020 0a 2a 2a 20 20 20 20 53 48 41 52 45 44 20 2d 3e  .**    SHARED ->
11030 20 52 45 53 45 52 56 45 44 0a 2a 2a 20 20 20 20   RESERVED.**    
11040 53 48 41 52 45 44 20 2d 3e 20 28 50 45 4e 44 49  SHARED -> (PENDI
11050 4e 47 29 20 2d 3e 20 45 58 43 4c 55 53 49 56 45  NG) -> EXCLUSIVE
11060 0a 2a 2a 20 20 20 20 52 45 53 45 52 56 45 44 20  .**    RESERVED 
11070 2d 3e 20 28 50 45 4e 44 49 4e 47 29 20 2d 3e 20  -> (PENDING) -> 
11080 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20 20 20 20  EXCLUSIVE.**    
11090 50 45 4e 44 49 4e 47 20 2d 3e 20 45 58 43 4c 55  PENDING -> EXCLU
110a0 53 49 56 45 0a 2a 2a 0a 2a 2a 20 66 6c 6f 63 6b  SIVE.**.** flock
110b0 28 29 20 6f 6e 6c 79 20 72 65 61 6c 6c 79 20 73  () only really s
110c0 75 70 70 6f 72 74 20 45 58 43 4c 55 53 49 56 45  upport EXCLUSIVE
110d0 20 6c 6f 63 6b 73 2e 20 20 57 65 20 74 72 61 63   locks.  We trac
110e0 6b 20 69 6e 74 65 72 6d 65 64 69 61 74 65 0a 2a  k intermediate.*
110f0 2a 20 6c 6f 63 6b 20 73 74 61 74 65 73 20 69 6e  * lock states in
11100 20 74 68 65 20 73 71 6c 69 74 65 33 5f 66 69 6c   the sqlite3_fil
11110 65 20 73 74 72 75 63 74 75 72 65 2c 20 62 75 74  e structure, but
11120 20 61 6c 6c 20 6c 6f 63 6b 73 20 53 48 41 52 45   all locks SHARE
11130 44 20 6f 72 0a 2a 2a 20 61 62 6f 76 65 20 61 72  D or.** above ar
11140 65 20 72 65 61 6c 6c 79 20 45 58 43 4c 55 53 49  e really EXCLUSI
11150 56 45 20 6c 6f 63 6b 73 20 61 6e 64 20 65 78 63  VE locks and exc
11160 6c 75 64 65 20 61 6c 6c 20 6f 74 68 65 72 20 70  lude all other p
11170 72 6f 63 65 73 73 65 73 20 66 72 6f 6d 0a 2a 2a  rocesses from.**
11180 20 61 63 63 65 73 73 20 74 68 65 20 66 69 6c 65   access the file
11190 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
111a0 74 69 6e 65 20 77 69 6c 6c 20 6f 6e 6c 79 20 69  tine will only i
111b0 6e 63 72 65 61 73 65 20 61 20 6c 6f 63 6b 2e 20  ncrease a lock. 
111c0 20 55 73 65 20 74 68 65 20 73 71 6c 69 74 65 33   Use the sqlite3
111d0 4f 73 55 6e 6c 6f 63 6b 28 29 0a 2a 2a 20 72 6f  OsUnlock().** ro
111e0 75 74 69 6e 65 20 74 6f 20 6c 6f 77 65 72 20 61  utine to lower a
111f0 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 2e 0a   locking level..
11200 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 6c  */.static int fl
11210 6f 63 6b 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f  ockLock(sqlite3_
11220 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 6c 6f  file *id, int lo
11230 63 6b 74 79 70 65 29 20 7b 0a 20 20 69 6e 74 20  cktype) {.  int 
11240 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
11250 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c    unixFile *pFil
11260 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69  e = (unixFile*)i
11270 64 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 46  d;..  assert( pF
11280 69 6c 65 20 29 3b 0a 0a 20 20 2f 2a 20 69 66 20  ile );..  /* if 
11290 77 65 20 61 6c 72 65 61 64 79 20 68 61 76 65 20  we already have 
112a0 61 20 6c 6f 63 6b 2c 20 69 74 20 69 73 20 65 78  a lock, it is ex
112b0 63 6c 75 73 69 76 65 2e 20 20 0a 20 20 2a 2a 20  clusive.  .  ** 
112c0 4a 75 73 74 20 61 64 6a 75 73 74 20 6c 65 76 65  Just adjust leve
112d0 6c 20 61 6e 64 20 70 75 6e 74 20 6f 6e 20 6f 75  l and punt on ou
112e0 74 74 61 20 68 65 72 65 2e 20 2a 2f 0a 20 20 69  tta here. */.  i
112f0 66 20 28 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79  f (pFile->lockty
11300 70 65 20 3e 20 4e 4f 5f 4c 4f 43 4b 29 20 7b 0a  pe > NO_LOCK) {.
11310 20 20 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74      pFile->lockt
11320 79 70 65 20 3d 20 6c 6f 63 6b 74 79 70 65 3b 0a  ype = locktype;.
11330 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
11340 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f  E_OK;.  }.  .  /
11350 2a 20 67 72 61 62 20 61 6e 20 65 78 63 6c 75 73  * grab an exclus
11360 69 76 65 20 6c 6f 63 6b 20 2a 2f 0a 20 20 0a 20  ive lock */.  . 
11370 20 69 66 20 28 66 6c 6f 63 6b 28 70 46 69 6c 65   if (flock(pFile
11380 2d 3e 68 2c 20 4c 4f 43 4b 5f 45 58 20 7c 20 4c  ->h, LOCK_EX | L
11390 4f 43 4b 5f 4e 42 29 29 20 7b 0a 20 20 20 20 69  OCK_NB)) {.    i
113a0 6e 74 20 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e  nt tErrno = errn
113b0 6f 3b 0a 20 20 20 20 2f 2a 20 64 69 64 6e 27 74  o;.    /* didn't
113c0 20 67 65 74 2c 20 6d 75 73 74 20 62 65 20 62 75   get, must be bu
113d0 73 79 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73  sy */.    rc = s
113e0 71 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d 50 6f  qliteErrorFromPo
113f0 73 69 78 45 72 72 6f 72 28 74 45 72 72 6e 6f 2c  sixError(tErrno,
11400 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4c 4f   SQLITE_IOERR_LO
11410 43 4b 29 3b 0a 20 20 20 20 69 66 28 20 49 53 5f  CK);.    if( IS_
11420 4c 4f 43 4b 5f 45 52 52 4f 52 28 72 63 29 20 29  LOCK_ERROR(rc) )
11430 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c  {.      pFile->l
11440 61 73 74 45 72 72 6e 6f 20 3d 20 74 45 72 72 6e  astErrno = tErrn
11450 6f 3b 0a 20 20 20 20 7d 0a 20 20 7d 20 65 6c 73  o;.    }.  } els
11460 65 20 7b 0a 20 20 20 20 2f 2a 20 67 6f 74 20 69  e {.    /* got i
11470 74 2c 20 73 65 74 20 74 68 65 20 74 79 70 65 20  t, set the type 
11480 61 6e 64 20 72 65 74 75 72 6e 20 6f 6b 20 2a 2f  and return ok */
11490 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b  .    pFile->lock
114a0 74 79 70 65 20 3d 20 6c 6f 63 6b 74 79 70 65 3b  type = locktype;
114b0 0a 20 20 7d 0a 20 20 4f 53 54 52 41 43 45 34 28  .  }.  OSTRACE4(
114c0 22 4c 4f 43 4b 20 20 20 20 25 64 20 25 73 20 25  "LOCK    %d %s %
114d0 73 20 28 66 6c 6f 63 6b 29 5c 6e 22 2c 20 70 46  s (flock)\n", pF
114e0 69 6c 65 2d 3e 68 2c 20 6c 6f 63 6b 74 79 70 65  ile->h, locktype
114f0 4e 61 6d 65 28 6c 6f 63 6b 74 79 70 65 29 2c 20  Name(locktype), 
11500 0a 20 20 20 20 20 20 20 20 20 20 20 72 63 3d 3d  .           rc==
11510 53 51 4c 49 54 45 5f 4f 4b 20 3f 20 22 6f 6b 22  SQLITE_OK ? "ok"
11520 20 3a 20 22 66 61 69 6c 65 64 22 29 3b 0a 23 69   : "failed");.#i
11530 66 64 65 66 20 53 51 4c 49 54 45 5f 49 47 4e 4f  fdef SQLITE_IGNO
11540 52 45 5f 46 4c 4f 43 4b 5f 4c 4f 43 4b 5f 45 52  RE_FLOCK_LOCK_ER
11550 52 4f 52 53 0a 20 20 69 66 28 20 28 72 63 20 26  RORS.  if( (rc &
11560 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 29 20 3d   SQLITE_IOERR) =
11570 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 20 29  = SQLITE_IOERR )
11580 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  {.    rc = SQLIT
11590 45 5f 42 55 53 59 3b 0a 20 20 7d 0a 23 65 6e 64  E_BUSY;.  }.#end
115a0 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 49 47 4e  if /* SQLITE_IGN
115b0 4f 52 45 5f 46 4c 4f 43 4b 5f 4c 4f 43 4b 5f 45  ORE_FLOCK_LOCK_E
115c0 52 52 4f 52 53 20 2a 2f 0a 20 20 72 65 74 75 72  RRORS */.  retur
115d0 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  n rc;.}.../*.** 
115e0 4c 6f 77 65 72 20 74 68 65 20 6c 6f 63 6b 69 6e  Lower the lockin
115f0 67 20 6c 65 76 65 6c 20 6f 6e 20 66 69 6c 65 20  g level on file 
11600 64 65 73 63 72 69 70 74 6f 72 20 70 46 69 6c 65  descriptor pFile
11610 20 74 6f 20 6c 6f 63 6b 74 79 70 65 2e 20 20 6c   to locktype.  l
11620 6f 63 6b 74 79 70 65 0a 2a 2a 20 6d 75 73 74 20  ocktype.** must 
11630 62 65 20 65 69 74 68 65 72 20 4e 4f 5f 4c 4f 43  be either NO_LOC
11640 4b 20 6f 72 20 53 48 41 52 45 44 5f 4c 4f 43 4b  K or SHARED_LOCK
11650 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6c  ..**.** If the l
11660 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 66 20  ocking level of 
11670 74 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70  the file descrip
11680 74 6f 72 20 69 73 20 61 6c 72 65 61 64 79 20 61  tor is already a
11690 74 20 6f 72 20 62 65 6c 6f 77 0a 2a 2a 20 74 68  t or below.** th
116a0 65 20 72 65 71 75 65 73 74 65 64 20 6c 6f 63 6b  e requested lock
116b0 69 6e 67 20 6c 65 76 65 6c 2c 20 74 68 69 73 20  ing level, this 
116c0 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d  routine is a no-
116d0 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  op..*/.static in
116e0 74 20 66 6c 6f 63 6b 55 6e 6c 6f 63 6b 28 73 71  t flockUnlock(sq
116f0 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20  lite3_file *id, 
11700 69 6e 74 20 6c 6f 63 6b 74 79 70 65 29 20 7b 0a  int locktype) {.
11710 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c    unixFile *pFil
11720 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69  e = (unixFile*)i
11730 64 3b 0a 20 20 0a 20 20 61 73 73 65 72 74 28 20  d;.  .  assert( 
11740 70 46 69 6c 65 20 29 3b 0a 20 20 4f 53 54 52 41  pFile );.  OSTRA
11750 43 45 35 28 22 55 4e 4c 4f 43 4b 20 20 25 64 20  CE5("UNLOCK  %d 
11760 25 64 20 77 61 73 20 25 64 20 70 69 64 3d 25 64  %d was %d pid=%d
11770 20 28 66 6c 6f 63 6b 29 5c 6e 22 2c 20 70 46 69   (flock)\n", pFi
11780 6c 65 2d 3e 68 2c 20 6c 6f 63 6b 74 79 70 65 2c  le->h, locktype,
11790 0a 20 20 20 20 20 20 20 20 20 20 20 70 46 69 6c  .           pFil
117a0 65 2d 3e 6c 6f 63 6b 74 79 70 65 2c 20 67 65 74  e->locktype, get
117b0 70 69 64 28 29 29 3b 0a 20 20 61 73 73 65 72 74  pid());.  assert
117c0 28 20 6c 6f 63 6b 74 79 70 65 3c 3d 53 48 41 52  ( locktype<=SHAR
117d0 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 0a 20 20  ED_LOCK );.  .  
117e0 2f 2a 20 6e 6f 2d 6f 70 20 69 66 20 70 6f 73 73  /* no-op if poss
117f0 69 62 6c 65 20 2a 2f 0a 20 20 69 66 28 20 70 46  ible */.  if( pF
11800 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3d 3d 6c  ile->locktype==l
11810 6f 63 6b 74 79 70 65 20 29 7b 0a 20 20 20 20 72  ocktype ){.    r
11820 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
11830 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 73 68 61  .  }.  .  /* sha
11840 72 65 64 20 63 61 6e 20 6a 75 73 74 20 62 65 20  red can just be 
11850 73 65 74 20 62 65 63 61 75 73 65 20 77 65 20 61  set because we a
11860 6c 77 61 79 73 20 68 61 76 65 20 61 6e 20 65 78  lways have an ex
11870 63 6c 75 73 69 76 65 20 2a 2f 0a 20 20 69 66 20  clusive */.  if 
11880 28 6c 6f 63 6b 74 79 70 65 3d 3d 53 48 41 52 45  (locktype==SHARE
11890 44 5f 4c 4f 43 4b 29 20 7b 0a 20 20 20 20 70 46  D_LOCK) {.    pF
118a0 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 20 3d 20  ile->locktype = 
118b0 6c 6f 63 6b 74 79 70 65 3b 0a 20 20 20 20 72 65  locktype;.    re
118c0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
118d0 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 6e 6f 2c 20    }.  .  /* no, 
118e0 72 65 61 6c 6c 79 2c 20 75 6e 6c 6f 63 6b 2e 20  really, unlock. 
118f0 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 66 6c  */.  int rc = fl
11900 6f 63 6b 28 70 46 69 6c 65 2d 3e 68 2c 20 4c 4f  ock(pFile->h, LO
11910 43 4b 5f 55 4e 29 3b 0a 20 20 69 66 20 28 72 63  CK_UN);.  if (rc
11920 29 20 7b 0a 20 20 20 20 69 6e 74 20 72 2c 20 74  ) {.    int r, t
11930 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20  Errno = errno;. 
11940 20 20 20 72 20 3d 20 73 71 6c 69 74 65 45 72 72     r = sqliteErr
11950 6f 72 46 72 6f 6d 50 6f 73 69 78 45 72 72 6f 72  orFromPosixError
11960 28 74 45 72 72 6e 6f 2c 20 53 51 4c 49 54 45 5f  (tErrno, SQLITE_
11970 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 29 3b 0a 20  IOERR_UNLOCK);. 
11980 20 20 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45     if( IS_LOCK_E
11990 52 52 4f 52 28 72 29 20 29 7b 0a 20 20 20 20 20  RROR(r) ){.     
119a0 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e   pFile->lastErrn
119b0 6f 20 3d 20 74 45 72 72 6e 6f 3b 0a 20 20 20 20  o = tErrno;.    
119c0 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  }.#ifdef SQLITE_
119d0 49 47 4e 4f 52 45 5f 46 4c 4f 43 4b 5f 4c 4f 43  IGNORE_FLOCK_LOC
119e0 4b 5f 45 52 52 4f 52 53 0a 20 20 20 20 69 66 28  K_ERRORS.    if(
119f0 20 28 72 20 26 20 53 51 4c 49 54 45 5f 49 4f 45   (r & SQLITE_IOE
11a00 52 52 29 20 3d 3d 20 53 51 4c 49 54 45 5f 49 4f  RR) == SQLITE_IO
11a10 45 52 52 20 29 7b 0a 20 20 20 20 20 20 72 20 3d  ERR ){.      r =
11a20 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20   SQLITE_BUSY;.  
11a30 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51    }.#endif /* SQ
11a40 4c 49 54 45 5f 49 47 4e 4f 52 45 5f 46 4c 4f 43  LITE_IGNORE_FLOC
11a50 4b 5f 4c 4f 43 4b 5f 45 52 52 4f 52 53 20 2a 2f  K_LOCK_ERRORS */
11a60 0a 20 20 20 20 0a 20 20 20 20 72 65 74 75 72 6e  .    .    return
11a70 20 72 3b 0a 20 20 7d 20 65 6c 73 65 20 7b 0a 20   r;.  } else {. 
11a80 20 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79     pFile->lockty
11a90 70 65 20 3d 20 4e 4f 5f 4c 4f 43 4b 3b 0a 20 20  pe = NO_LOCK;.  
11aa0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
11ab0 4f 4b 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  OK;.  }.}../*.**
11ac0 20 43 6c 6f 73 65 20 61 20 66 69 6c 65 2e 0a 2a   Close a file..*
11ad0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 6c 6f  /.static int flo
11ae0 63 6b 43 6c 6f 73 65 28 73 71 6c 69 74 65 33 5f  ckClose(sqlite3_
11af0 66 69 6c 65 20 2a 69 64 29 20 7b 0a 20 20 69 66  file *id) {.  if
11b00 28 20 69 64 20 29 7b 0a 20 20 20 20 66 6c 6f 63  ( id ){.    floc
11b10 6b 55 6e 6c 6f 63 6b 28 69 64 2c 20 4e 4f 5f 4c  kUnlock(id, NO_L
11b20 4f 43 4b 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  OCK);.  }.  retu
11b30 72 6e 20 63 6c 6f 73 65 55 6e 69 78 46 69 6c 65  rn closeUnixFile
11b40 28 69 64 29 3b 0a 7d 0a 0a 23 65 6e 64 69 66 20  (id);.}..#endif 
11b50 2f 2a 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  /* SQLITE_ENABLE
11b60 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 26  _LOCKING_STYLE &
11b70 26 20 21 4f 53 5f 56 58 57 4f 52 4b 20 2a 2f 0a  & !OS_VXWORK */.
11b80 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ./**************
11b90 2a 2a 2a 2a 2a 20 45 6e 64 20 6f 66 20 74 68 65  ***** End of the
11ba0 20 66 6c 6f 63 6b 20 6c 6f 63 6b 20 69 6d 70 6c   flock lock impl
11bb0 65 6d 65 6e 74 61 74 69 6f 6e 20 2a 2a 2a 2a 2a  ementation *****
11bc0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11bd0 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .***************
11be0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11bf0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11c00 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11c10 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f  ***************/
11c20 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ../*************
11c30 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11c40 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11c50 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11c60 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11c70 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  *.**************
11c80 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 42 65 67 69 6e  ********** Begin
11c90 20 4e 61 6d 65 64 20 53 65 6d 61 70 68 6f 72 65   Named Semaphore
11ca0 20 4c 6f 63 6b 69 6e 67 20 2a 2a 2a 2a 2a 2a 2a   Locking *******
11cb0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11cc0 2a 0a 2a 2a 0a 2a 2a 20 4e 61 6d 65 64 20 73 65  *.**.** Named se
11cd0 6d 61 70 68 6f 72 65 20 6c 6f 63 6b 69 6e 67 20  maphore locking 
11ce0 69 73 20 6f 6e 6c 79 20 73 75 70 70 6f 72 74 65  is only supporte
11cf0 64 20 6f 6e 20 56 78 57 6f 72 6b 73 2e 0a 2a 2a  d on VxWorks..**
11d00 0a 2a 2a 20 53 65 6d 61 70 68 6f 72 65 20 6c 6f  .** Semaphore lo
11d10 63 6b 69 6e 67 20 69 73 20 6c 69 6b 65 20 64 6f  cking is like do
11d20 74 2d 6c 6f 63 6b 20 61 6e 64 20 66 6c 6f 63 6b  t-lock and flock
11d30 20 69 6e 20 74 68 61 74 20 69 74 20 72 65 61 6c   in that it real
11d40 6c 79 20 6f 6e 6c 79 0a 2a 2a 20 73 75 70 70 6f  ly only.** suppo
11d50 72 74 73 20 45 58 43 4c 55 53 49 56 45 20 6c 6f  rts EXCLUSIVE lo
11d60 63 6b 69 6e 67 2e 20 20 4f 6e 6c 79 20 61 20 73  cking.  Only a s
11d70 69 6e 67 6c 65 20 70 72 6f 63 65 73 73 20 63 61  ingle process ca
11d80 6e 20 72 65 61 64 20 6f 72 20 77 72 69 74 65 0a  n read or write.
11d90 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ** the database 
11da0 66 69 6c 65 20 61 74 20 61 20 74 69 6d 65 2e 20  file at a time. 
11db0 20 54 68 69 73 20 72 65 64 75 63 65 73 20 70 6f   This reduces po
11dc0 74 65 6e 74 69 61 6c 20 63 6f 6e 63 75 72 72 65  tential concurre
11dd0 6e 63 79 2c 20 62 75 74 0a 2a 2a 20 6d 61 6b 65  ncy, but.** make
11de0 73 20 74 68 65 20 6c 6f 63 6b 20 69 6d 70 6c 65  s the lock imple
11df0 6d 65 6e 74 61 74 69 6f 6e 20 6d 75 63 68 20 65  mentation much e
11e00 61 73 69 65 72 2e 0a 2a 2f 0a 23 69 66 20 4f 53  asier..*/.#if OS
11e10 5f 56 58 57 4f 52 4b 53 0a 0a 2f 2a 0a 2a 2a 20  _VXWORKS../*.** 
11e20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63 68 65  This routine che
11e30 63 6b 73 20 69 66 20 74 68 65 72 65 20 69 73 20  cks if there is 
11e40 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20  a RESERVED lock 
11e50 68 65 6c 64 20 6f 6e 20 74 68 65 20 73 70 65 63  held on the spec
11e60 69 66 69 65 64 0a 2a 2a 20 66 69 6c 65 20 62 79  ified.** file by
11e70 20 74 68 69 73 20 6f 72 20 61 6e 79 20 6f 74 68   this or any oth
11e80 65 72 20 70 72 6f 63 65 73 73 2e 20 49 66 20 73  er process. If s
11e90 75 63 68 20 61 20 6c 6f 63 6b 20 69 73 20 68 65  uch a lock is he
11ea0 6c 64 2c 20 73 65 74 20 2a 70 52 65 73 4f 75 74  ld, set *pResOut
11eb0 0a 2a 2a 20 74 6f 20 61 20 6e 6f 6e 2d 7a 65 72  .** to a non-zer
11ec0 6f 20 76 61 6c 75 65 20 6f 74 68 65 72 77 69 73  o value otherwis
11ed0 65 20 2a 70 52 65 73 4f 75 74 20 69 73 20 73 65  e *pResOut is se
11ee0 74 20 74 6f 20 7a 65 72 6f 2e 20 20 54 68 65 20  t to zero.  The 
11ef0 72 65 74 75 72 6e 20 76 61 6c 75 65 0a 2a 2a 20  return value.** 
11f00 69 73 20 73 65 74 20 74 6f 20 53 51 4c 49 54 45  is set to SQLITE
11f10 5f 4f 4b 20 75 6e 6c 65 73 73 20 61 6e 20 49 2f  _OK unless an I/
11f20 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 64  O error occurs d
11f30 75 72 69 6e 67 20 6c 6f 63 6b 20 63 68 65 63 6b  uring lock check
11f40 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ing..*/.static i
11f50 6e 74 20 73 65 6d 43 68 65 63 6b 52 65 73 65 72  nt semCheckReser
11f60 76 65 64 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f  vedLock(sqlite3_
11f70 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 2a 70  file *id, int *p
11f80 52 65 73 4f 75 74 29 20 7b 0a 20 20 69 6e 74 20  ResOut) {.  int 
11f90 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
11fa0 20 20 69 6e 74 20 72 65 73 65 72 76 65 64 20 3d    int reserved =
11fb0 20 30 3b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a   0;.  unixFile *
11fc0 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c  pFile = (unixFil
11fd0 65 2a 29 69 64 3b 0a 0a 20 20 53 69 6d 75 6c 61  e*)id;..  Simula
11fe0 74 65 49 4f 45 72 72 6f 72 28 20 72 65 74 75 72  teIOError( retur
11ff0 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43  n SQLITE_IOERR_C
12000 48 45 43 4b 52 45 53 45 52 56 45 44 4c 4f 43 4b  HECKRESERVEDLOCK
12010 3b 20 29 3b 0a 20 20 0a 20 20 61 73 73 65 72 74  ; );.  .  assert
12020 28 20 70 46 69 6c 65 20 29 3b 0a 0a 20 20 2f 2a  ( pFile );..  /*
12030 20 43 68 65 63 6b 20 69 66 20 61 20 74 68 72 65   Check if a thre
12040 61 64 20 69 6e 20 74 68 69 73 20 70 72 6f 63 65  ad in this proce
12050 73 73 20 68 6f 6c 64 73 20 73 75 63 68 20 61 20  ss holds such a 
12060 6c 6f 63 6b 20 2a 2f 0a 20 20 69 66 28 20 70 46  lock */.  if( pF
12070 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3e 53 48  ile->locktype>SH
12080 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20  ARED_LOCK ){.   
12090 20 72 65 73 65 72 76 65 64 20 3d 20 31 3b 0a 20   reserved = 1;. 
120a0 20 7d 0a 20 20 0a 20 20 2f 2a 20 4f 74 68 65 72   }.  .  /* Other
120b0 77 69 73 65 20 73 65 65 20 69 66 20 73 6f 6d 65  wise see if some
120c0 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20 68   other process h
120d0 6f 6c 64 73 20 69 74 2e 20 2a 2f 0a 20 20 69 66  olds it. */.  if
120e0 28 20 21 72 65 73 65 72 76 65 64 20 29 7b 0a 20  ( !reserved ){. 
120f0 20 20 20 73 65 6d 5f 74 20 2a 70 53 65 6d 20 3d     sem_t *pSem =
12100 20 70 46 69 6c 65 2d 3e 70 4f 70 65 6e 2d 3e 70   pFile->pOpen->p
12110 53 65 6d 3b 0a 20 20 20 20 73 74 72 75 63 74 20  Sem;.    struct 
12120 73 74 61 74 20 73 74 61 74 42 75 66 3b 0a 0a 20  stat statBuf;.. 
12130 20 20 20 69 66 28 20 73 65 6d 5f 74 72 79 77 61     if( sem_trywa
12140 69 74 28 70 53 65 6d 29 3d 3d 2d 31 20 29 7b 0a  it(pSem)==-1 ){.
12150 20 20 20 20 20 20 69 6e 74 20 74 45 72 72 6e 6f        int tErrno
12160 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20   = errno;.      
12170 69 66 28 20 45 41 47 41 49 4e 20 21 3d 20 74 45  if( EAGAIN != tE
12180 72 72 6e 6f 20 29 7b 0a 20 20 20 20 20 20 20 20  rrno ){.        
12190 72 63 20 3d 20 73 71 6c 69 74 65 45 72 72 6f 72  rc = sqliteError
121a0 46 72 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28 74  FromPosixError(t
121b0 45 72 72 6e 6f 2c 20 53 51 4c 49 54 45 5f 49 4f  Errno, SQLITE_IO
121c0 45 52 52 5f 43 48 45 43 4b 52 45 53 45 52 56 45  ERR_CHECKRESERVE
121d0 44 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 20 20  DLOCK);.        
121e0 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f  pFile->lastErrno
121f0 20 3d 20 74 45 72 72 6e 6f 3b 0a 20 20 20 20 20   = tErrno;.     
12200 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20   } else {.      
12210 20 20 2f 2a 20 73 6f 6d 65 6f 6e 65 20 65 6c 73    /* someone els
12220 65 20 68 61 73 20 74 68 65 20 6c 6f 63 6b 20 77  e has the lock w
12230 68 65 6e 20 77 65 20 61 72 65 20 69 6e 20 4e 4f  hen we are in NO
12240 5f 4c 4f 43 4b 20 2a 2f 0a 20 20 20 20 20 20 20  _LOCK */.       
12250 20 72 65 73 65 72 76 65 64 20 3d 20 28 70 46 69   reserved = (pFi
12260 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 20 3c 20 53  le->locktype < S
12270 48 41 52 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20  HARED_LOCK);.   
12280 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a     }.    }else{.
12290 20 20 20 20 20 20 2f 2a 20 77 65 20 63 6f 75 6c        /* we coul
122a0 64 20 68 61 76 65 20 69 74 20 69 66 20 77 65 20  d have it if we 
122b0 77 61 6e 74 20 69 74 20 2a 2f 0a 20 20 20 20 20  want it */.     
122c0 20 73 65 6d 5f 70 6f 73 74 28 70 53 65 6d 29 3b   sem_post(pSem);
122d0 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 4f 53 54  .    }.  }.  OST
122e0 52 41 43 45 34 28 22 54 45 53 54 20 57 52 2d 4c  RACE4("TEST WR-L
122f0 4f 43 4b 20 25 64 20 25 64 20 25 64 20 28 73 65  OCK %d %d %d (se
12300 6d 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c  m)\n", pFile->h,
12310 20 72 63 2c 20 72 65 73 65 72 76 65 64 29 3b 0a   rc, reserved);.
12320 0a 20 20 2a 70 52 65 73 4f 75 74 20 3d 20 72 65  .  *pResOut = re
12330 73 65 72 76 65 64 3b 0a 20 20 72 65 74 75 72 6e  served;.  return
12340 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f   rc;.}../*.** Lo
12350 63 6b 20 74 68 65 20 66 69 6c 65 20 77 69 74 68  ck the file with
12360 20 74 68 65 20 6c 6f 63 6b 20 73 70 65 63 69 66   the lock specif
12370 69 65 64 20 62 79 20 70 61 72 61 6d 65 74 65 72  ied by parameter
12380 20 6c 6f 63 6b 74 79 70 65 20 2d 20 6f 6e 65 0a   locktype - one.
12390 2a 2a 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77  ** of the follow
123a0 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28  ing:.**.**     (
123b0 31 29 20 53 48 41 52 45 44 5f 4c 4f 43 4b 0a 2a  1) SHARED_LOCK.*
123c0 2a 20 20 20 20 20 28 32 29 20 52 45 53 45 52 56  *     (2) RESERV
123d0 45 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28  ED_LOCK.**     (
123e0 33 29 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 0a  3) PENDING_LOCK.
123f0 2a 2a 20 20 20 20 20 28 34 29 20 45 58 43 4c 55  **     (4) EXCLU
12400 53 49 56 45 5f 4c 4f 43 4b 0a 2a 2a 0a 2a 2a 20  SIVE_LOCK.**.** 
12410 53 6f 6d 65 74 69 6d 65 73 20 77 68 65 6e 20 72  Sometimes when r
12420 65 71 75 65 73 74 69 6e 67 20 6f 6e 65 20 6c 6f  equesting one lo
12430 63 6b 20 73 74 61 74 65 2c 20 61 64 64 69 74 69  ck state, additi
12440 6f 6e 61 6c 20 6c 6f 63 6b 20 73 74 61 74 65 73  onal lock states
12450 0a 2a 2a 20 61 72 65 20 69 6e 73 65 72 74 65 64  .** are inserted
12460 20 69 6e 20 62 65 74 77 65 65 6e 2e 20 20 54 68   in between.  Th
12470 65 20 6c 6f 63 6b 69 6e 67 20 6d 69 67 68 74 20  e locking might 
12480 66 61 69 6c 20 6f 6e 20 6f 6e 65 20 6f 66 20 74  fail on one of t
12490 68 65 20 6c 61 74 65 72 0a 2a 2a 20 74 72 61 6e  he later.** tran
124a0 73 69 74 69 6f 6e 73 20 6c 65 61 76 69 6e 67 20  sitions leaving 
124b0 74 68 65 20 6c 6f 63 6b 20 73 74 61 74 65 20 64  the lock state d
124c0 69 66 66 65 72 65 6e 74 20 66 72 6f 6d 20 77 68  ifferent from wh
124d0 61 74 20 69 74 20 73 74 61 72 74 65 64 20 62 75  at it started bu
124e0 74 0a 2a 2a 20 73 74 69 6c 6c 20 73 68 6f 72 74  t.** still short
124f0 20 6f 66 20 69 74 73 20 67 6f 61 6c 2e 20 20 54   of its goal.  T
12500 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 68 61  he following cha
12510 72 74 20 73 68 6f 77 73 20 74 68 65 20 61 6c 6c  rt shows the all
12520 6f 77 65 64 0a 2a 2a 20 74 72 61 6e 73 69 74 69  owed.** transiti
12530 6f 6e 73 20 61 6e 64 20 74 68 65 20 69 6e 73 65  ons and the inse
12540 72 74 65 64 20 69 6e 74 65 72 6d 65 64 69 61 74  rted intermediat
12550 65 20 73 74 61 74 65 73 3a 0a 2a 2a 0a 2a 2a 20  e states:.**.** 
12560 20 20 20 55 4e 4c 4f 43 4b 45 44 20 2d 3e 20 53     UNLOCKED -> S
12570 48 41 52 45 44 0a 2a 2a 20 20 20 20 53 48 41 52  HARED.**    SHAR
12580 45 44 20 2d 3e 20 52 45 53 45 52 56 45 44 0a 2a  ED -> RESERVED.*
12590 2a 20 20 20 20 53 48 41 52 45 44 20 2d 3e 20 28  *    SHARED -> (
125a0 50 45 4e 44 49 4e 47 29 20 2d 3e 20 45 58 43 4c  PENDING) -> EXCL
125b0 55 53 49 56 45 0a 2a 2a 20 20 20 20 52 45 53 45  USIVE.**    RESE
125c0 52 56 45 44 20 2d 3e 20 28 50 45 4e 44 49 4e 47  RVED -> (PENDING
125d0 29 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a  ) -> EXCLUSIVE.*
125e0 2a 20 20 20 20 50 45 4e 44 49 4e 47 20 2d 3e 20  *    PENDING -> 
125f0 45 58 43 4c 55 53 49 56 45 0a 2a 2a 0a 2a 2a 20  EXCLUSIVE.**.** 
12600 53 65 6d 61 70 68 6f 72 65 20 6c 6f 63 6b 73 20  Semaphore locks 
12610 6f 6e 6c 79 20 72 65 61 6c 6c 79 20 73 75 70 70  only really supp
12620 6f 72 74 20 45 58 43 4c 55 53 49 56 45 20 6c 6f  ort EXCLUSIVE lo
12630 63 6b 73 2e 20 20 57 65 20 74 72 61 63 6b 20 69  cks.  We track i
12640 6e 74 65 72 6d 65 64 69 61 74 65 0a 2a 2a 20 6c  ntermediate.** l
12650 6f 63 6b 20 73 74 61 74 65 73 20 69 6e 20 74 68  ock states in th
12660 65 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 73  e sqlite3_file s
12670 74 72 75 63 74 75 72 65 2c 20 62 75 74 20 61 6c  tructure, but al
12680 6c 20 6c 6f 63 6b 73 20 53 48 41 52 45 44 20 6f  l locks SHARED o
12690 72 0a 2a 2a 20 61 62 6f 76 65 20 61 72 65 20 72  r.** above are r
126a0 65 61 6c 6c 79 20 45 58 43 4c 55 53 49 56 45 20  eally EXCLUSIVE 
126b0 6c 6f 63 6b 73 20 61 6e 64 20 65 78 63 6c 75 64  locks and exclud
126c0 65 20 61 6c 6c 20 6f 74 68 65 72 20 70 72 6f 63  e all other proc
126d0 65 73 73 65 73 20 66 72 6f 6d 0a 2a 2a 20 61 63  esses from.** ac
126e0 63 65 73 73 20 74 68 65 20 66 69 6c 65 2e 0a 2a  cess the file..*
126f0 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
12700 65 20 77 69 6c 6c 20 6f 6e 6c 79 20 69 6e 63 72  e will only incr
12710 65 61 73 65 20 61 20 6c 6f 63 6b 2e 20 20 55 73  ease a lock.  Us
12720 65 20 74 68 65 20 73 71 6c 69 74 65 33 4f 73 55  e the sqlite3OsU
12730 6e 6c 6f 63 6b 28 29 0a 2a 2a 20 72 6f 75 74 69  nlock().** routi
12740 6e 65 20 74 6f 20 6c 6f 77 65 72 20 61 20 6c 6f  ne to lower a lo
12750 63 6b 69 6e 67 20 6c 65 76 65 6c 2e 0a 2a 2f 0a  cking level..*/.
12760 73 74 61 74 69 63 20 69 6e 74 20 73 65 6d 4c 6f  static int semLo
12770 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  ck(sqlite3_file 
12780 2a 69 64 2c 20 69 6e 74 20 6c 6f 63 6b 74 79 70  *id, int locktyp
12790 65 29 20 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20  e) {.  unixFile 
127a0 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69  *pFile = (unixFi
127b0 6c 65 2a 29 69 64 3b 0a 20 20 69 6e 74 20 66 64  le*)id;.  int fd
127c0 3b 0a 20 20 73 65 6d 5f 74 20 2a 70 53 65 6d 20  ;.  sem_t *pSem 
127d0 3d 20 70 46 69 6c 65 2d 3e 70 4f 70 65 6e 2d 3e  = pFile->pOpen->
127e0 70 53 65 6d 3b 0a 20 20 69 6e 74 20 72 63 20 3d  pSem;.  int rc =
127f0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f   SQLITE_OK;..  /
12800 2a 20 69 66 20 77 65 20 61 6c 72 65 61 64 79 20  * if we already 
12810 68 61 76 65 20 61 20 6c 6f 63 6b 2c 20 69 74 20  have a lock, it 
12820 69 73 20 65 78 63 6c 75 73 69 76 65 2e 20 20 0a  is exclusive.  .
12830 20 20 2a 2a 20 4a 75 73 74 20 61 64 6a 75 73 74    ** Just adjust
12840 20 6c 65 76 65 6c 20 61 6e 64 20 70 75 6e 74 20   level and punt 
12850 6f 6e 20 6f 75 74 74 61 20 68 65 72 65 2e 20 2a  on outta here. *
12860 2f 0a 20 20 69 66 20 28 70 46 69 6c 65 2d 3e 6c  /.  if (pFile->l
12870 6f 63 6b 74 79 70 65 20 3e 20 4e 4f 5f 4c 4f 43  ocktype > NO_LOC
12880 4b 29 20 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e  K) {.    pFile->
12890 6c 6f 63 6b 74 79 70 65 20 3d 20 6c 6f 63 6b 74  locktype = lockt
128a0 79 70 65 3b 0a 20 20 20 20 72 63 20 3d 20 53 51  ype;.    rc = SQ
128b0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 67 6f 74  LITE_OK;.    got
128c0 6f 20 73 65 6d 5f 65 6e 64 5f 6c 6f 63 6b 3b 0a  o sem_end_lock;.
128d0 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 6c 6f 63 6b    }.  .  /* lock
128e0 20 73 65 6d 61 70 68 6f 72 65 20 6e 6f 77 20 62   semaphore now b
128f0 75 74 20 62 61 69 6c 20 6f 75 74 20 77 68 65 6e  ut bail out when
12900 20 61 6c 72 65 61 64 79 20 6c 6f 63 6b 65 64 2e   already locked.
12910 20 2a 2f 0a 20 20 69 66 28 20 73 65 6d 5f 74 72   */.  if( sem_tr
12920 79 77 61 69 74 28 70 53 65 6d 29 3d 3d 2d 31 20  ywait(pSem)==-1 
12930 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  ){.    rc = SQLI
12940 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 67 6f 74  TE_BUSY;.    got
12950 6f 20 73 65 6d 5f 65 6e 64 5f 6c 6f 63 6b 3b 0a  o sem_end_lock;.
12960 20 20 7d 0a 0a 20 20 2f 2a 20 67 6f 74 20 69 74    }..  /* got it
12970 2c 20 73 65 74 20 74 68 65 20 74 79 70 65 20 61  , set the type a
12980 6e 64 20 72 65 74 75 72 6e 20 6f 6b 20 2a 2f 0a  nd return ok */.
12990 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70    pFile->locktyp
129a0 65 20 3d 20 6c 6f 63 6b 74 79 70 65 3b 0a 0a 20  e = locktype;.. 
129b0 73 65 6d 5f 65 6e 64 5f 6c 6f 63 6b 3a 0a 20 20  sem_end_lock:.  
129c0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
129d0 0a 2a 2a 20 4c 6f 77 65 72 20 74 68 65 20 6c 6f  .** Lower the lo
129e0 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 6e 20 66  cking level on f
129f0 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 70  ile descriptor p
12a00 46 69 6c 65 20 74 6f 20 6c 6f 63 6b 74 79 70 65  File to locktype
12a10 2e 20 20 6c 6f 63 6b 74 79 70 65 0a 2a 2a 20 6d  .  locktype.** m
12a20 75 73 74 20 62 65 20 65 69 74 68 65 72 20 4e 4f  ust be either NO
12a30 5f 4c 4f 43 4b 20 6f 72 20 53 48 41 52 45 44 5f  _LOCK or SHARED_
12a40 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  LOCK..**.** If t
12a50 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c  he locking level
12a60 20 6f 66 20 74 68 65 20 66 69 6c 65 20 64 65 73   of the file des
12a70 63 72 69 70 74 6f 72 20 69 73 20 61 6c 72 65 61  criptor is alrea
12a80 64 79 20 61 74 20 6f 72 20 62 65 6c 6f 77 0a 2a  dy at or below.*
12a90 2a 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20  * the requested 
12aa0 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 2c 20 74  locking level, t
12ab0 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61  his routine is a
12ac0 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69   no-op..*/.stati
12ad0 63 20 69 6e 74 20 73 65 6d 55 6e 6c 6f 63 6b 28  c int semUnlock(
12ae0 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64  sqlite3_file *id
12af0 2c 20 69 6e 74 20 6c 6f 63 6b 74 79 70 65 29 20  , int locktype) 
12b00 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46  {.  unixFile *pF
12b10 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a  ile = (unixFile*
12b20 29 69 64 3b 0a 20 20 73 65 6d 5f 74 20 2a 70 53  )id;.  sem_t *pS
12b30 65 6d 20 3d 20 70 46 69 6c 65 2d 3e 70 4f 70 65  em = pFile->pOpe
12b40 6e 2d 3e 70 53 65 6d 3b 0a 0a 20 20 61 73 73 65  n->pSem;..  asse
12b50 72 74 28 20 70 46 69 6c 65 20 29 3b 0a 20 20 61  rt( pFile );.  a
12b60 73 73 65 72 74 28 20 70 53 65 6d 20 29 3b 0a 20  ssert( pSem );. 
12b70 20 4f 53 54 52 41 43 45 35 28 22 55 4e 4c 4f 43   OSTRACE5("UNLOC
12b80 4b 20 20 25 64 20 25 64 20 77 61 73 20 25 64 20  K  %d %d was %d 
12b90 70 69 64 3d 25 64 20 28 73 65 6d 29 5c 6e 22 2c  pid=%d (sem)\n",
12ba0 20 70 46 69 6c 65 2d 3e 68 2c 20 6c 6f 63 6b 74   pFile->h, lockt
12bb0 79 70 65 2c 0a 09 20 20 20 70 46 69 6c 65 2d 3e  ype,..   pFile->
12bc0 6c 6f 63 6b 74 79 70 65 2c 20 67 65 74 70 69 64  locktype, getpid
12bd0 28 29 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6c  ());.  assert( l
12be0 6f 63 6b 74 79 70 65 3c 3d 53 48 41 52 45 44 5f  ocktype<=SHARED_
12bf0 4c 4f 43 4b 20 29 3b 0a 20 20 0a 20 20 2f 2a 20  LOCK );.  .  /* 
12c00 6e 6f 2d 6f 70 20 69 66 20 70 6f 73 73 69 62 6c  no-op if possibl
12c10 65 20 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c 65  e */.  if( pFile
12c20 2d 3e 6c 6f 63 6b 74 79 70 65 3d 3d 6c 6f 63 6b  ->locktype==lock
12c30 74 79 70 65 20 29 7b 0a 20 20 20 20 72 65 74 75  type ){.    retu
12c40 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
12c50 7d 0a 20 20 0a 20 20 2f 2a 20 73 68 61 72 65 64  }.  .  /* shared
12c60 20 63 61 6e 20 6a 75 73 74 20 62 65 20 73 65 74   can just be set
12c70 20 62 65 63 61 75 73 65 20 77 65 20 61 6c 77 61   because we alwa
12c80 79 73 20 68 61 76 65 20 61 6e 20 65 78 63 6c 75  ys have an exclu
12c90 73 69 76 65 20 2a 2f 0a 20 20 69 66 20 28 6c 6f  sive */.  if (lo
12ca0 63 6b 74 79 70 65 3d 3d 53 48 41 52 45 44 5f 4c  cktype==SHARED_L
12cb0 4f 43 4b 29 20 7b 0a 20 20 20 20 70 46 69 6c 65  OCK) {.    pFile
12cc0 2d 3e 6c 6f 63 6b 74 79 70 65 20 3d 20 6c 6f 63  ->locktype = loc
12cd0 6b 74 79 70 65 3b 0a 20 20 20 20 72 65 74 75 72  ktype;.    retur
12ce0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
12cf0 0a 20 20 0a 20 20 2f 2a 20 6e 6f 2c 20 72 65 61  .  .  /* no, rea
12d00 6c 6c 79 20 75 6e 6c 6f 63 6b 2e 20 2a 2f 0a 20  lly unlock. */. 
12d10 20 69 66 20 28 20 73 65 6d 5f 70 6f 73 74 28 70   if ( sem_post(p
12d20 53 65 6d 29 3d 3d 2d 31 20 29 20 7b 0a 20 20 20  Sem)==-1 ) {.   
12d30 20 69 6e 74 20 72 63 2c 20 74 45 72 72 6e 6f 20   int rc, tErrno 
12d40 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 72 63 20  = errno;.    rc 
12d50 3d 20 73 71 6c 69 74 65 45 72 72 6f 72 46 72 6f  = sqliteErrorFro
12d60 6d 50 6f 73 69 78 45 72 72 6f 72 28 74 45 72 72  mPosixError(tErr
12d70 6e 6f 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  no, SQLITE_IOERR
12d80 5f 55 4e 4c 4f 43 4b 29 3b 0a 20 20 20 20 69 66  _UNLOCK);.    if
12d90 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28  ( IS_LOCK_ERROR(
12da0 72 63 29 20 29 7b 0a 20 20 20 20 20 20 70 46 69  rc) ){.      pFi
12db0 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20  le->lastErrno = 
12dc0 74 45 72 72 6e 6f 3b 0a 20 20 20 20 7d 0a 20 20  tErrno;.    }.  
12dd0 20 20 72 65 74 75 72 6e 20 72 63 3b 20 0a 20 20    return rc; .  
12de0 7d 0a 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74  }.  pFile->lockt
12df0 79 70 65 20 3d 20 4e 4f 5f 4c 4f 43 4b 3b 0a 20  ype = NO_LOCK;. 
12e00 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
12e10 4b 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2a 20 43 6c 6f  K;.}../*. ** Clo
12e20 73 65 20 61 20 66 69 6c 65 2e 0a 20 2a 2f 0a 73  se a file.. */.s
12e30 74 61 74 69 63 20 69 6e 74 20 73 65 6d 43 6c 6f  tatic int semClo
12e40 73 65 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  se(sqlite3_file 
12e50 2a 69 64 29 20 7b 0a 20 20 69 66 28 20 69 64 20  *id) {.  if( id 
12e60 29 7b 0a 20 20 20 20 75 6e 69 78 46 69 6c 65 20  ){.    unixFile 
12e70 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69  *pFile = (unixFi
12e80 6c 65 2a 29 69 64 3b 0a 20 20 20 20 73 65 6d 55  le*)id;.    semU
12e90 6e 6c 6f 63 6b 28 69 64 2c 20 4e 4f 5f 4c 4f 43  nlock(id, NO_LOC
12ea0 4b 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  K);.    assert( 
12eb0 70 46 69 6c 65 20 29 3b 0a 20 20 20 20 75 6e 69  pFile );.    uni
12ec0 78 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 20  xEnterMutex();. 
12ed0 20 20 20 72 65 6c 65 61 73 65 4c 6f 63 6b 49 6e     releaseLockIn
12ee0 66 6f 28 70 46 69 6c 65 2d 3e 70 4c 6f 63 6b 29  fo(pFile->pLock)
12ef0 3b 0a 20 20 20 20 72 65 6c 65 61 73 65 4f 70 65  ;.    releaseOpe
12f00 6e 43 6e 74 28 70 46 69 6c 65 2d 3e 70 4f 70 65  nCnt(pFile->pOpe
12f10 6e 29 3b 0a 20 20 20 20 75 6e 69 78 4c 65 61 76  n);.    unixLeav
12f20 65 4d 75 74 65 78 28 29 3b 0a 20 20 20 20 63 6c  eMutex();.    cl
12f30 6f 73 65 55 6e 69 78 46 69 6c 65 28 69 64 29 3b  oseUnixFile(id);
12f40 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51  .  }.  return SQ
12f50 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 65 6e 64  LITE_OK;.}..#end
12f60 69 66 20 2f 2a 20 4f 53 5f 56 58 57 4f 52 4b 53  if /* OS_VXWORKS
12f70 20 2a 2f 0a 2f 2a 0a 2a 2a 20 4e 61 6d 65 64 20   */./*.** Named 
12f80 73 65 6d 61 70 68 6f 72 65 20 6c 6f 63 6b 69 6e  semaphore lockin
12f90 67 20 69 73 20 6f 6e 6c 79 20 61 76 61 69 6c 61  g is only availa
12fa0 62 6c 65 20 6f 6e 20 56 78 57 6f 72 6b 73 2e 0a  ble on VxWorks..
12fb0 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  **.*************
12fc0 2a 2a 20 45 6e 64 20 6f 66 20 74 68 65 20 6e 61  ** End of the na
12fd0 6d 65 64 20 73 65 6d 61 70 68 6f 72 65 20 6c 6f  med semaphore lo
12fe0 63 6b 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  ck implementatio
12ff0 6e 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  n **************
13000 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  **.*************
13010 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13020 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13030 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13040 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13050 2a 2f 0a 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  */.../**********
13060 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13070 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13080 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13090 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
130a0 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****.***********
130b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
130c0 20 42 65 67 69 6e 20 41 46 50 20 4c 6f 63 6b 69   Begin AFP Locki
130d0 6e 67 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ng *************
130e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
130f0 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 41 46 50 20 69  ****.**.** AFP i
13100 73 20 74 68 65 20 41 70 70 6c 65 20 46 69 6c 69  s the Apple Fili
13110 6e 67 20 50 72 6f 74 6f 63 6f 6c 2e 20 20 41 46  ng Protocol.  AF
13120 50 20 69 73 20 61 20 6e 65 74 77 6f 72 6b 20 66  P is a network f
13130 69 6c 65 73 79 73 74 65 6d 20 66 6f 75 6e 64 0a  ilesystem found.
13140 2a 2a 20 6f 6e 20 41 70 70 6c 65 20 4d 61 63 69  ** on Apple Maci
13150 6e 74 6f 73 68 20 63 6f 6d 70 75 74 65 72 73 20  ntosh computers 
13160 2d 20 62 6f 74 68 20 4f 53 39 20 61 6e 64 20 4f  - both OS9 and O
13170 53 58 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 72 64 2d  SX..**.** Third-
13180 70 61 72 74 79 20 69 6d 70 6c 65 6d 65 6e 74 61  party implementa
13190 74 69 6f 6e 73 20 6f 66 20 41 46 50 20 61 72 65  tions of AFP are
131a0 20 61 76 61 69 6c 61 62 6c 65 2e 20 20 42 75 74   available.  But
131b0 20 74 68 69 73 20 63 6f 64 65 20 68 65 72 65 0a   this code here.
131c0 2a 2a 20 6f 6e 6c 79 20 77 6f 72 6b 73 20 6f 6e  ** only works on
131d0 20 4f 53 58 2e 0a 2a 2f 0a 0a 23 69 66 20 64 65   OSX..*/..#if de
131e0 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29  fined(__APPLE__)
131f0 20 26 26 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c   && SQLITE_ENABL
13200 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a  E_LOCKING_STYLE.
13210 2f 2a 0a 2a 2a 20 54 68 65 20 61 66 70 4c 6f 63  /*.** The afpLoc
13220 6b 69 6e 67 43 6f 6e 74 65 78 74 20 73 74 72 75  kingContext stru
13230 63 74 75 72 65 20 63 6f 6e 74 61 69 6e 73 20 61  cture contains a
13240 6c 6c 20 61 66 70 20 6c 6f 63 6b 20 73 70 65 63  ll afp lock spec
13250 69 66 69 63 20 73 74 61 74 65 0a 2a 2f 0a 74 79  ific state.*/.ty
13260 70 65 64 65 66 20 73 74 72 75 63 74 20 61 66 70  pedef struct afp
13270 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 61  LockingContext a
13280 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  fpLockingContext
13290 3b 0a 73 74 72 75 63 74 20 61 66 70 4c 6f 63 6b  ;.struct afpLock
132a0 69 6e 67 43 6f 6e 74 65 78 74 20 7b 0a 20 20 69  ingContext {.  i
132b0 6e 74 20 72 65 73 65 72 76 65 64 3b 0a 20 20 63  nt reserved;.  c
132c0 6f 6e 73 74 20 63 68 61 72 20 2a 64 62 50 61 74  onst char *dbPat
132d0 68 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  h;             /
132e0 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 6f 70  * Name of the op
132f0 65 6e 20 66 69 6c 65 20 2a 2f 0a 7d 3b 0a 0a 73  en file */.};..s
13300 74 72 75 63 74 20 42 79 74 65 52 61 6e 67 65 4c  truct ByteRangeL
13310 6f 63 6b 50 42 32 0a 7b 0a 20 20 75 6e 73 69 67  ockPB2.{.  unsig
13320 6e 65 64 20 6c 6f 6e 67 20 6c 6f 6e 67 20 6f 66  ned long long of
13330 66 73 65 74 3b 20 20 20 20 20 20 20 20 2f 2a 20  fset;        /* 
13340 6f 66 66 73 65 74 20 74 6f 20 66 69 72 73 74 20  offset to first 
13350 62 79 74 65 20 74 6f 20 6c 6f 63 6b 20 2a 2f 0a  byte to lock */.
13360 20 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20    unsigned long 
13370 6c 6f 6e 67 20 6c 65 6e 67 74 68 3b 20 20 20 20  long length;    
13380 20 20 20 20 2f 2a 20 6e 62 72 20 6f 66 20 62 79      /* nbr of by
13390 74 65 73 20 74 6f 20 6c 6f 63 6b 20 2a 2f 0a 20  tes to lock */. 
133a0 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6c   unsigned long l
133b0 6f 6e 67 20 72 65 74 52 61 6e 67 65 53 74 61 72  ong retRangeStar
133c0 74 3b 20 2f 2a 20 6e 62 72 20 6f 66 20 31 73 74  t; /* nbr of 1st
133d0 20 62 79 74 65 20 6c 6f 63 6b 65 64 20 69 66 20   byte locked if 
133e0 73 75 63 63 65 73 73 66 75 6c 20 2a 2f 0a 20 20  successful */.  
133f0 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 75 6e  unsigned char un
13400 4c 6f 63 6b 46 6c 61 67 3b 20 20 20 20 20 20 20  LockFlag;       
13410 20 20 2f 2a 20 31 20 3d 20 75 6e 6c 6f 63 6b 2c    /* 1 = unlock,
13420 20 30 20 3d 20 6c 6f 63 6b 20 2a 2f 0a 20 20 75   0 = lock */.  u
13430 6e 73 69 67 6e 65 64 20 63 68 61 72 20 73 74 61  nsigned char sta
13440 72 74 45 6e 64 46 6c 61 67 3b 20 20 20 20 20 20  rtEndFlag;      
13450 20 2f 2a 20 31 3d 72 65 6c 20 74 6f 20 65 6e 64   /* 1=rel to end
13460 20 6f 66 20 66 6f 72 6b 2c 20 30 3d 72 65 6c 20   of fork, 0=rel 
13470 74 6f 20 73 74 61 72 74 20 2a 2f 0a 20 20 69 6e  to start */.  in
13480 74 20 66 64 3b 20 20 20 20 20 20 20 20 20 20 20  t fd;           
13490 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
134a0 2f 2a 20 66 69 6c 65 20 64 65 73 63 20 74 6f 20  /* file desc to 
134b0 61 73 73 6f 63 20 74 68 69 73 20 6c 6f 63 6b 20  assoc this lock 
134c0 77 69 74 68 20 2a 2f 0a 7d 3b 0a 0a 23 64 65 66  with */.};..#def
134d0 69 6e 65 20 61 66 70 66 73 42 79 74 65 52 61 6e  ine afpfsByteRan
134e0 67 65 4c 6f 63 6b 32 46 53 43 54 4c 20 20 20 20  geLock2FSCTL    
134f0 20 20 20 20 5f 49 4f 57 52 28 27 7a 27 2c 20 32      _IOWR('z', 2
13500 33 2c 20 73 74 72 75 63 74 20 42 79 74 65 52 61  3, struct ByteRa
13510 6e 67 65 4c 6f 63 6b 50 42 32 29 0a 0a 2f 2a 0a  ngeLockPB2)../*.
13520 2a 2a 20 54 68 69 73 20 69 73 20 61 20 75 74 69  ** This is a uti
13530 6c 69 74 79 20 66 6f 72 20 73 65 74 74 69 6e 67  lity for setting
13540 20 6f 72 20 63 6c 65 61 72 69 6e 67 20 61 20 62   or clearing a b
13550 69 74 2d 72 61 6e 67 65 20 6c 6f 63 6b 20 6f 6e  it-range lock on
13560 20 61 6e 0a 2a 2a 20 41 46 50 20 66 69 6c 65 73   an.** AFP files
13570 79 73 74 65 6d 2e 0a 2a 2a 20 0a 2a 2a 20 52 65  ystem..** .** Re
13580 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f  turn SQLITE_OK o
13590 6e 20 73 75 63 63 65 73 73 2c 20 53 51 4c 49 54  n success, SQLIT
135a0 45 5f 42 55 53 59 20 6f 6e 20 66 61 69 6c 75 72  E_BUSY on failur
135b0 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
135c0 20 61 66 70 53 65 74 4c 6f 63 6b 28 0a 20 20 63   afpSetLock(.  c
135d0 6f 6e 73 74 20 63 68 61 72 20 2a 70 61 74 68 2c  onst char *path,
135e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
135f0 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 66 69 6c   Name of the fil
13600 65 20 74 6f 20 62 65 20 6c 6f 63 6b 65 64 20 6f  e to be locked o
13610 72 20 75 6e 6c 6f 63 6b 65 64 20 2a 2f 0a 20 20  r unlocked */.  
13620 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 2c  unixFile *pFile,
13630 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
13640 2a 20 4f 70 65 6e 20 66 69 6c 65 20 64 65 73 63  * Open file desc
13650 72 69 70 74 6f 72 20 6f 6e 20 70 61 74 68 20 2a  riptor on path *
13660 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  /.  unsigned lon
13670 67 20 6c 6f 6e 67 20 6f 66 66 73 65 74 2c 20 20  g long offset,  
13680 20 20 20 2f 2a 20 46 69 72 73 74 20 62 79 74 65     /* First byte
13690 20 74 6f 20 62 65 20 6c 6f 63 6b 65 64 20 2a 2f   to be locked */
136a0 0a 20 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  .  unsigned long
136b0 20 6c 6f 6e 67 20 6c 65 6e 67 74 68 2c 20 20 20   long length,   
136c0 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62    /* Number of b
136d0 79 74 65 73 20 74 6f 20 6c 6f 63 6b 20 2a 2f 0a  ytes to lock */.
136e0 20 20 69 6e 74 20 73 65 74 4c 6f 63 6b 46 6c 61    int setLockFla
136f0 67 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  g               
13700 20 2f 2a 20 54 72 75 65 20 74 6f 20 73 65 74 20   /* True to set 
13710 6c 6f 63 6b 2e 20 20 46 61 6c 73 65 20 74 6f 20  lock.  False to 
13720 63 6c 65 61 72 20 6c 6f 63 6b 20 2a 2f 0a 29 7b  clear lock */.){
13730 0a 20 20 73 74 72 75 63 74 20 42 79 74 65 52 61  .  struct ByteRa
13740 6e 67 65 4c 6f 63 6b 50 42 32 20 70 62 3b 0a 20  ngeLockPB2 pb;. 
13750 20 69 6e 74 20 65 72 72 3b 0a 20 20 0a 20 20 70   int err;.  .  p
13760 62 2e 75 6e 4c 6f 63 6b 46 6c 61 67 20 3d 20 73  b.unLockFlag = s
13770 65 74 4c 6f 63 6b 46 6c 61 67 20 3f 20 30 20 3a  etLockFlag ? 0 :
13780 20 31 3b 0a 20 20 70 62 2e 73 74 61 72 74 45 6e   1;.  pb.startEn
13790 64 46 6c 61 67 20 3d 20 30 3b 0a 20 20 70 62 2e  dFlag = 0;.  pb.
137a0 6f 66 66 73 65 74 20 3d 20 6f 66 66 73 65 74 3b  offset = offset;
137b0 0a 20 20 70 62 2e 6c 65 6e 67 74 68 20 3d 20 6c  .  pb.length = l
137c0 65 6e 67 74 68 3b 20 0a 20 20 70 62 2e 66 64 20  ength; .  pb.fd 
137d0 3d 20 70 46 69 6c 65 2d 3e 68 3b 0a 20 20 0a 20  = pFile->h;.  . 
137e0 20 4f 53 54 52 41 43 45 36 28 22 41 46 50 53 45   OSTRACE6("AFPSE
137f0 54 4c 4f 43 4b 20 5b 25 73 5d 20 66 6f 72 20 25  TLOCK [%s] for %
13800 64 25 73 20 69 6e 20 72 61 6e 67 65 20 25 6c 6c  d%s in range %ll
13810 78 3a 25 6c 6c 78 5c 6e 22 2c 20 0a 20 20 20 20  x:%llx\n", .    
13820 28 73 65 74 4c 6f 63 6b 46 6c 61 67 3f 22 4f 4e  (setLockFlag?"ON
13830 22 3a 22 4f 46 46 22 29 2c 20 70 46 69 6c 65 2d  ":"OFF"), pFile-
13840 3e 68 2c 20 28 70 62 2e 66 64 3d 3d 2d 31 3f 22  >h, (pb.fd==-1?"
13850 5b 74 65 73 74 76 61 6c 2d 31 5d 22 3a 22 22 29  [testval-1]":"")
13860 2c 0a 20 20 20 20 6f 66 66 73 65 74 2c 20 6c 65  ,.    offset, le
13870 6e 67 74 68 29 3b 0a 20 20 65 72 72 20 3d 20 66  ngth);.  err = f
13880 73 63 74 6c 28 70 61 74 68 2c 20 61 66 70 66 73  sctl(path, afpfs
13890 42 79 74 65 52 61 6e 67 65 4c 6f 63 6b 32 46 53  ByteRangeLock2FS
138a0 43 54 4c 2c 20 26 70 62 2c 20 30 29 3b 0a 20 20  CTL, &pb, 0);.  
138b0 69 66 20 28 20 65 72 72 3d 3d 2d 31 20 29 20 7b  if ( err==-1 ) {
138c0 0a 20 20 20 20 69 6e 74 20 72 63 3b 0a 20 20 20  .    int rc;.   
138d0 20 69 6e 74 20 74 45 72 72 6e 6f 20 3d 20 65 72   int tErrno = er
138e0 72 6e 6f 3b 0a 20 20 20 20 4f 53 54 52 41 43 45  rno;.    OSTRACE
138f0 34 28 22 41 46 50 53 45 54 4c 4f 43 4b 20 66 61  4("AFPSETLOCK fa
13900 69 6c 65 64 20 74 6f 20 66 73 63 74 6c 28 29 20  iled to fsctl() 
13910 27 25 73 27 20 25 64 20 25 73 5c 6e 22 2c 0a 20  '%s' %d %s\n",. 
13920 20 20 20 20 20 20 20 20 20 20 20 20 70 61 74 68              path
13930 2c 20 74 45 72 72 6e 6f 2c 20 73 74 72 65 72 72  , tErrno, strerr
13940 6f 72 28 74 45 72 72 6e 6f 29 29 3b 0a 23 69 66  or(tErrno));.#if
13950 64 65 66 20 53 51 4c 49 54 45 5f 49 47 4e 4f 52  def SQLITE_IGNOR
13960 45 5f 41 46 50 5f 4c 4f 43 4b 5f 45 52 52 4f 52  E_AFP_LOCK_ERROR
13970 53 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  S.    rc = SQLIT
13980 45 5f 42 55 53 59 3b 0a 23 65 6c 73 65 0a 20 20  E_BUSY;.#else.  
13990 20 20 72 63 20 3d 20 73 71 6c 69 74 65 45 72 72    rc = sqliteErr
139a0 6f 72 46 72 6f 6d 50 6f 73 69 78 45 72 72 6f 72  orFromPosixError
139b0 28 74 45 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20  (tErrno,.       
139c0 20 20 20 20 20 20 20 20 20 20 20 20 20 73 65 74               set
139d0 4c 6f 63 6b 46 6c 61 67 20 3f 20 53 51 4c 49 54  LockFlag ? SQLIT
139e0 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b 20 3a 20 53  E_IOERR_LOCK : S
139f0 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f  QLITE_IOERR_UNLO
13a00 43 4b 29 3b 0a 23 65 6e 64 69 66 20 2f 2a 20 53  CK);.#endif /* S
13a10 51 4c 49 54 45 5f 49 47 4e 4f 52 45 5f 41 46 50  QLITE_IGNORE_AFP
13a20 5f 4c 4f 43 4b 5f 45 52 52 4f 52 53 20 2a 2f 0a  _LOCK_ERRORS */.
13a30 20 20 20 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f      if( IS_LOCK_
13a40 45 52 52 4f 52 28 72 63 29 20 29 7b 0a 20 20 20  ERROR(rc) ){.   
13a50 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72     pFile->lastEr
13a60 72 6e 6f 20 3d 20 74 45 72 72 6e 6f 3b 0a 20 20  rno = tErrno;.  
13a70 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 72    }.    return r
13a80 63 3b 0a 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20  c;.  } else {.  
13a90 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
13aa0 4f 4b 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  OK;.  }.}../*.**
13ab0 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63 68   This routine ch
13ac0 65 63 6b 73 20 69 66 20 74 68 65 72 65 20 69 73  ecks if there is
13ad0 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b   a RESERVED lock
13ae0 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 73 70 65   held on the spe
13af0 63 69 66 69 65 64 0a 2a 2a 20 66 69 6c 65 20 62  cified.** file b
13b00 79 20 74 68 69 73 20 6f 72 20 61 6e 79 20 6f 74  y this or any ot
13b10 68 65 72 20 70 72 6f 63 65 73 73 2e 20 49 66 20  her process. If 
13b20 73 75 63 68 20 61 20 6c 6f 63 6b 20 69 73 20 68  such a lock is h
13b30 65 6c 64 2c 20 73 65 74 20 2a 70 52 65 73 4f 75  eld, set *pResOu
13b40 74 0a 2a 2a 20 74 6f 20 61 20 6e 6f 6e 2d 7a 65  t.** to a non-ze
13b50 72 6f 20 76 61 6c 75 65 20 6f 74 68 65 72 77 69  ro value otherwi
13b60 73 65 20 2a 70 52 65 73 4f 75 74 20 69 73 20 73  se *pResOut is s
13b70 65 74 20 74 6f 20 7a 65 72 6f 2e 20 20 54 68 65  et to zero.  The
13b80 20 72 65 74 75 72 6e 20 76 61 6c 75 65 0a 2a 2a   return value.**
13b90 20 69 73 20 73 65 74 20 74 6f 20 53 51 4c 49 54   is set to SQLIT
13ba0 45 5f 4f 4b 20 75 6e 6c 65 73 73 20 61 6e 20 49  E_OK unless an I
13bb0 2f 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20  /O error occurs 
13bc0 64 75 72 69 6e 67 20 6c 6f 63 6b 20 63 68 65 63  during lock chec
13bd0 6b 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  king..*/.static 
13be0 69 6e 74 20 61 66 70 43 68 65 63 6b 52 65 73 65  int afpCheckRese
13bf0 72 76 65 64 4c 6f 63 6b 28 73 71 6c 69 74 65 33  rvedLock(sqlite3
13c00 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 2a  _file *id, int *
13c10 70 52 65 73 4f 75 74 29 7b 0a 20 20 69 6e 74 20  pResOut){.  int 
13c20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
13c30 20 20 69 6e 74 20 72 65 73 65 72 76 65 64 20 3d    int reserved =
13c40 20 30 3b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a   0;.  unixFile *
13c50 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c  pFile = (unixFil
13c60 65 2a 29 69 64 3b 0a 20 20 0a 20 20 53 69 6d 75  e*)id;.  .  Simu
13c70 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 72 65 74  lateIOError( ret
13c80 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  urn SQLITE_IOERR
13c90 5f 43 48 45 43 4b 52 45 53 45 52 56 45 44 4c 4f  _CHECKRESERVEDLO
13ca0 43 4b 3b 20 29 3b 0a 20 20 0a 20 20 61 73 73 65  CK; );.  .  asse
13cb0 72 74 28 20 70 46 69 6c 65 20 29 3b 0a 20 20 61  rt( pFile );.  a
13cc0 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  fpLockingContext
13cd0 20 2a 63 6f 6e 74 65 78 74 20 3d 20 28 61 66 70   *context = (afp
13ce0 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a  LockingContext *
13cf0 29 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67  ) pFile->locking
13d00 43 6f 6e 74 65 78 74 3b 0a 20 20 69 66 28 20 63  Context;.  if( c
13d10 6f 6e 74 65 78 74 2d 3e 72 65 73 65 72 76 65 64  ontext->reserved
13d20 20 29 7b 0a 20 20 20 20 2a 70 52 65 73 4f 75 74   ){.    *pResOut
13d30 20 3d 20 31 3b 0a 20 20 20 20 72 65 74 75 72 6e   = 1;.    return
13d40 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
13d50 20 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78    unixEnterMutex
13d60 28 29 3b 20 2f 2a 20 42 65 63 61 75 73 65 20 70  (); /* Because p
13d70 46 69 6c 65 2d 3e 70 4c 6f 63 6b 20 69 73 20 73  File->pLock is s
13d80 68 61 72 65 64 20 61 63 72 6f 73 73 20 74 68 72  hared across thr
13d90 65 61 64 73 20 2a 2f 0a 20 20 0a 20 20 2f 2a 20  eads */.  .  /* 
13da0 43 68 65 63 6b 20 69 66 20 61 20 74 68 72 65 61  Check if a threa
13db0 64 20 69 6e 20 74 68 69 73 20 70 72 6f 63 65 73  d in this proces
13dc0 73 20 68 6f 6c 64 73 20 73 75 63 68 20 61 20 6c  s holds such a l
13dd0 6f 63 6b 20 2a 2f 0a 20 20 69 66 28 20 70 46 69  ock */.  if( pFi
13de0 6c 65 2d 3e 70 4c 6f 63 6b 2d 3e 6c 6f 63 6b 74  le->pLock->lockt
13df0 79 70 65 3e 53 48 41 52 45 44 5f 4c 4f 43 4b 20  ype>SHARED_LOCK 
13e00 29 7b 0a 20 20 20 20 72 65 73 65 72 76 65 64 20  ){.    reserved 
13e10 3d 20 31 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a  = 1;.  }.  .  /*
13e20 20 4f 74 68 65 72 77 69 73 65 20 73 65 65 20 69   Otherwise see i
13e30 66 20 73 6f 6d 65 20 6f 74 68 65 72 20 70 72 6f  f some other pro
13e40 63 65 73 73 20 68 6f 6c 64 73 20 69 74 2e 0a 20  cess holds it.. 
13e50 20 20 2a 2f 0a 20 20 69 66 28 20 21 72 65 73 65    */.  if( !rese
13e60 72 76 65 64 20 29 7b 0a 20 20 20 20 2f 2a 20 6c  rved ){.    /* l
13e70 6f 63 6b 20 74 68 65 20 52 45 53 45 52 56 45 44  ock the RESERVED
13e80 20 62 79 74 65 20 2a 2f 0a 20 20 20 20 69 6e 74   byte */.    int
13e90 20 6c 72 63 20 3d 20 61 66 70 53 65 74 4c 6f 63   lrc = afpSetLoc
13ea0 6b 28 63 6f 6e 74 65 78 74 2d 3e 64 62 50 61 74  k(context->dbPat
13eb0 68 2c 20 70 46 69 6c 65 2c 20 52 45 53 45 52 56  h, pFile, RESERV
13ec0 45 44 5f 42 59 54 45 2c 20 31 2c 31 29 3b 20 20  ED_BYTE, 1,1);  
13ed0 0a 20 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f  .    if( SQLITE_
13ee0 4f 4b 3d 3d 6c 72 63 20 29 7b 0a 20 20 20 20 20  OK==lrc ){.     
13ef0 20 2f 2a 20 69 66 20 77 65 20 73 75 63 63 65 65   /* if we succee
13f00 64 65 64 20 69 6e 20 74 61 6b 69 6e 67 20 74 68  ded in taking th
13f10 65 20 72 65 73 65 72 76 65 64 20 6c 6f 63 6b 2c  e reserved lock,
13f20 20 75 6e 6c 6f 63 6b 20 69 74 20 74 6f 20 72 65   unlock it to re
13f30 73 74 6f 72 65 0a 20 20 20 20 20 20 2a 2a 20 74  store.      ** t
13f40 68 65 20 6f 72 69 67 69 6e 61 6c 20 73 74 61 74  he original stat
13f50 65 20 2a 2f 0a 20 20 20 20 20 20 6c 72 63 20 3d  e */.      lrc =
13f60 20 61 66 70 53 65 74 4c 6f 63 6b 28 63 6f 6e 74   afpSetLock(cont
13f70 65 78 74 2d 3e 64 62 50 61 74 68 2c 20 70 46 69  ext->dbPath, pFi
13f80 6c 65 2c 20 52 45 53 45 52 56 45 44 5f 42 59 54  le, RESERVED_BYT
13f90 45 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 7d 20  E, 1, 0);.    } 
13fa0 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 2f 2a 20  else {.      /* 
13fb0 69 66 20 77 65 20 66 61 69 6c 65 64 20 74 6f 20  if we failed to 
13fc0 67 65 74 20 74 68 65 20 6c 6f 63 6b 20 74 68 65  get the lock the
13fd0 6e 20 73 6f 6d 65 6f 6e 65 20 65 6c 73 65 20 6d  n someone else m
13fe0 75 73 74 20 68 61 76 65 20 69 74 20 2a 2f 0a 20  ust have it */. 
13ff0 20 20 20 20 20 72 65 73 65 72 76 65 64 20 3d 20       reserved = 
14000 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  1;.    }.    if(
14010 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 6c   IS_LOCK_ERROR(l
14020 72 63 29 20 29 7b 0a 20 20 20 20 20 20 72 63 3d  rc) ){.      rc=
14030 6c 72 63 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  lrc;.    }.  }. 
14040 20 0a 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74   .  unixLeaveMut
14050 65 78 28 29 3b 0a 20 20 4f 53 54 52 41 43 45 34  ex();.  OSTRACE4
14060 28 22 54 45 53 54 20 57 52 2d 4c 4f 43 4b 20 25  ("TEST WR-LOCK %
14070 64 20 25 64 20 25 64 20 28 61 66 70 29 5c 6e 22  d %d %d (afp)\n"
14080 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 72 63 2c 20  , pFile->h, rc, 
14090 72 65 73 65 72 76 65 64 29 3b 0a 20 20 0a 20 20  reserved);.  .  
140a0 2a 70 52 65 73 4f 75 74 20 3d 20 72 65 73 65 72  *pResOut = reser
140b0 76 65 64 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  ved;.  return rc
140c0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 6b 20  ;.}../*.** Lock 
140d0 74 68 65 20 66 69 6c 65 20 77 69 74 68 20 74 68  the file with th
140e0 65 20 6c 6f 63 6b 20 73 70 65 63 69 66 69 65 64  e lock specified
140f0 20 62 79 20 70 61 72 61 6d 65 74 65 72 20 6c 6f   by parameter lo
14100 63 6b 74 79 70 65 20 2d 20 6f 6e 65 0a 2a 2a 20  cktype - one.** 
14110 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  of the following
14120 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28 31 29 20  :.**.**     (1) 
14130 53 48 41 52 45 44 5f 4c 4f 43 4b 0a 2a 2a 20 20  SHARED_LOCK.**  
14140 20 20 20 28 32 29 20 52 45 53 45 52 56 45 44 5f     (2) RESERVED_
14150 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 33 29 20  LOCK.**     (3) 
14160 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 0a 2a 2a 20  PENDING_LOCK.** 
14170 20 20 20 20 28 34 29 20 45 58 43 4c 55 53 49 56      (4) EXCLUSIV
14180 45 5f 4c 4f 43 4b 0a 2a 2a 0a 2a 2a 20 53 6f 6d  E_LOCK.**.** Som
14190 65 74 69 6d 65 73 20 77 68 65 6e 20 72 65 71 75  etimes when requ
141a0 65 73 74 69 6e 67 20 6f 6e 65 20 6c 6f 63 6b 20  esting one lock 
141b0 73 74 61 74 65 2c 20 61 64 64 69 74 69 6f 6e 61  state, additiona
141c0 6c 20 6c 6f 63 6b 20 73 74 61 74 65 73 0a 2a 2a  l lock states.**
141d0 20 61 72 65 20 69 6e 73 65 72 74 65 64 20 69 6e   are inserted in
141e0 20 62 65 74 77 65 65 6e 2e 20 20 54 68 65 20 6c   between.  The l
141f0 6f 63 6b 69 6e 67 20 6d 69 67 68 74 20 66 61 69  ocking might fai
14200 6c 20 6f 6e 20 6f 6e 65 20 6f 66 20 74 68 65 20  l on one of the 
14210 6c 61 74 65 72 0a 2a 2a 20 74 72 61 6e 73 69 74  later.** transit
14220 69 6f 6e 73 20 6c 65 61 76 69 6e 67 20 74 68 65  ions leaving the
14230 20 6c 6f 63 6b 20 73 74 61 74 65 20 64 69 66 66   lock state diff
14240 65 72 65 6e 74 20 66 72 6f 6d 20 77 68 61 74 20  erent from what 
14250 69 74 20 73 74 61 72 74 65 64 20 62 75 74 0a 2a  it started but.*
14260 2a 20 73 74 69 6c 6c 20 73 68 6f 72 74 20 6f 66  * still short of
14270 20 69 74 73 20 67 6f 61 6c 2e 20 20 54 68 65 20   its goal.  The 
14280 66 6f 6c 6c 6f 77 69 6e 67 20 63 68 61 72 74 20  following chart 
14290 73 68 6f 77 73 20 74 68 65 20 61 6c 6c 6f 77 65  shows the allowe
142a0 64 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e 73  d.** transitions
142b0 20 61 6e 64 20 74 68 65 20 69 6e 73 65 72 74 65   and the inserte
142c0 64 20 69 6e 74 65 72 6d 65 64 69 61 74 65 20 73  d intermediate s
142d0 74 61 74 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  tates:.**.**    
142e0 55 4e 4c 4f 43 4b 45 44 20 2d 3e 20 53 48 41 52  UNLOCKED -> SHAR
142f0 45 44 0a 2a 2a 20 20 20 20 53 48 41 52 45 44 20  ED.**    SHARED 
14300 2d 3e 20 52 45 53 45 52 56 45 44 0a 2a 2a 20 20  -> RESERVED.**  
14310 20 20 53 48 41 52 45 44 20 2d 3e 20 28 50 45 4e    SHARED -> (PEN
14320 44 49 4e 47 29 20 2d 3e 20 45 58 43 4c 55 53 49  DING) -> EXCLUSI
14330 56 45 0a 2a 2a 20 20 20 20 52 45 53 45 52 56 45  VE.**    RESERVE
14340 44 20 2d 3e 20 28 50 45 4e 44 49 4e 47 29 20 2d  D -> (PENDING) -
14350 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20 20  > EXCLUSIVE.**  
14360 20 20 50 45 4e 44 49 4e 47 20 2d 3e 20 45 58 43    PENDING -> EXC
14370 4c 55 53 49 56 45 0a 2a 2a 0a 2a 2a 20 54 68 69  LUSIVE.**.** Thi
14380 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 6f  s routine will o
14390 6e 6c 79 20 69 6e 63 72 65 61 73 65 20 61 20 6c  nly increase a l
143a0 6f 63 6b 2e 20 20 55 73 65 20 74 68 65 20 73 71  ock.  Use the sq
143b0 6c 69 74 65 33 4f 73 55 6e 6c 6f 63 6b 28 29 0a  lite3OsUnlock().
143c0 2a 2a 20 72 6f 75 74 69 6e 65 20 74 6f 20 6c 6f  ** routine to lo
143d0 77 65 72 20 61 20 6c 6f 63 6b 69 6e 67 20 6c 65  wer a locking le
143e0 76 65 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  vel..*/.static i
143f0 6e 74 20 61 66 70 4c 6f 63 6b 28 73 71 6c 69 74  nt afpLock(sqlit
14400 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74  e3_file *id, int
14410 20 6c 6f 63 6b 74 79 70 65 29 7b 0a 20 20 69 6e   locktype){.  in
14420 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
14430 3b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46  ;.  unixFile *pF
14440 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a  ile = (unixFile*
14450 29 69 64 3b 0a 20 20 73 74 72 75 63 74 20 75 6e  )id;.  struct un
14460 69 78 4c 6f 63 6b 49 6e 66 6f 20 2a 70 4c 6f 63  ixLockInfo *pLoc
14470 6b 20 3d 20 70 46 69 6c 65 2d 3e 70 4c 6f 63 6b  k = pFile->pLock
14480 3b 0a 20 20 61 66 70 4c 6f 63 6b 69 6e 67 43 6f  ;.  afpLockingCo
14490 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 20 3d  ntext *context =
144a0 20 28 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74   (afpLockingCont
144b0 65 78 74 20 2a 29 20 70 46 69 6c 65 2d 3e 6c 6f  ext *) pFile->lo
144c0 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 0a 20 20  ckingContext;.  
144d0 0a 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65  .  assert( pFile
144e0 20 29 3b 0a 20 20 4f 53 54 52 41 43 45 37 28 22   );.  OSTRACE7("
144f0 4c 4f 43 4b 20 20 20 20 25 64 20 25 73 20 77 61  LOCK    %d %s wa
14500 73 20 25 73 28 25 73 2c 25 64 29 20 70 69 64 3d  s %s(%s,%d) pid=
14510 25 64 20 28 61 66 70 29 5c 6e 22 2c 20 70 46 69  %d (afp)\n", pFi
14520 6c 65 2d 3e 68 2c 0a 20 20 20 20 20 20 20 20 20  le->h,.         
14530 20 20 6c 6f 63 6b 74 79 70 65 4e 61 6d 65 28 6c    locktypeName(l
14540 6f 63 6b 74 79 70 65 29 2c 20 6c 6f 63 6b 74 79  ocktype), lockty
14550 70 65 4e 61 6d 65 28 70 46 69 6c 65 2d 3e 6c 6f  peName(pFile->lo
14560 63 6b 74 79 70 65 29 2c 0a 20 20 20 20 20 20 20  cktype),.       
14570 20 20 20 20 6c 6f 63 6b 74 79 70 65 4e 61 6d 65      locktypeName
14580 28 70 4c 6f 63 6b 2d 3e 6c 6f 63 6b 74 79 70 65  (pLock->locktype
14590 29 2c 20 70 4c 6f 63 6b 2d 3e 63 6e 74 20 2c 20  ), pLock->cnt , 
145a0 67 65 74 70 69 64 28 29 29 3b 0a 0a 20 20 2f 2a  getpid());..  /*
145b0 20 49 66 20 74 68 65 72 65 20 69 73 20 61 6c 72   If there is alr
145c0 65 61 64 79 20 61 20 6c 6f 63 6b 20 6f 66 20 74  eady a lock of t
145d0 68 69 73 20 74 79 70 65 20 6f 72 20 6d 6f 72 65  his type or more
145e0 20 72 65 73 74 72 69 63 74 69 76 65 20 6f 6e 20   restrictive on 
145f0 74 68 65 0a 20 20 2a 2a 20 75 6e 69 78 46 69 6c  the.  ** unixFil
14600 65 2c 20 64 6f 20 6e 6f 74 68 69 6e 67 2e 20 44  e, do nothing. D
14610 6f 6e 27 74 20 75 73 65 20 74 68 65 20 61 66 70  on't use the afp
14620 5f 65 6e 64 5f 6c 6f 63 6b 3a 20 65 78 69 74 20  _end_lock: exit 
14630 70 61 74 68 2c 20 61 73 0a 20 20 2a 2a 20 75 6e  path, as.  ** un
14640 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29 20 68  ixEnterMutex() h
14650 61 73 6e 27 74 20 62 65 65 6e 20 63 61 6c 6c 65  asn't been calle
14660 64 20 79 65 74 2e 0a 20 20 2a 2f 0a 20 20 69 66  d yet..  */.  if
14670 28 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70  ( pFile->locktyp
14680 65 3e 3d 6c 6f 63 6b 74 79 70 65 20 29 7b 0a 20  e>=locktype ){. 
14690 20 20 20 4f 53 54 52 41 43 45 33 28 22 4c 4f 43     OSTRACE3("LOC
146a0 4b 20 20 20 20 25 64 20 25 73 20 6f 6b 20 28 61  K    %d %s ok (a
146b0 6c 72 65 61 64 79 20 68 65 6c 64 29 20 28 61 66  lready held) (af
146c0 70 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c  p)\n", pFile->h,
146d0 0a 20 20 20 20 20 20 20 20 20 20 20 6c 6f 63 6b  .           lock
146e0 74 79 70 65 4e 61 6d 65 28 6c 6f 63 6b 74 79 70  typeName(locktyp
146f0 65 29 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  e));.    return 
14700 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a  SQLITE_OK;.  }..
14710 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74    /* Make sure t
14720 68 65 20 6c 6f 63 6b 69 6e 67 20 73 65 71 75 65  he locking seque
14730 6e 63 65 20 69 73 20 63 6f 72 72 65 63 74 0a 20  nce is correct. 
14740 20 2a 2a 20 20 28 31 29 20 57 65 20 6e 65 76 65   **  (1) We neve
14750 72 20 6d 6f 76 65 20 66 72 6f 6d 20 75 6e 6c 6f  r move from unlo
14760 63 6b 65 64 20 74 6f 20 61 6e 79 74 68 69 6e 67  cked to anything
14770 20 68 69 67 68 65 72 20 74 68 61 6e 20 73 68 61   higher than sha
14780 72 65 64 20 6c 6f 63 6b 2e 0a 20 20 2a 2a 20 20  red lock..  **  
14790 28 32 29 20 53 51 4c 69 74 65 20 6e 65 76 65 72  (2) SQLite never
147a0 20 65 78 70 6c 69 63 69 74 6c 79 20 72 65 71 75   explicitly requ
147b0 65 73 74 73 20 61 20 70 65 6e 64 69 67 20 6c 6f  ests a pendig lo
147c0 63 6b 2e 0a 20 20 2a 2a 20 20 28 33 29 20 41 20  ck..  **  (3) A 
147d0 73 68 61 72 65 64 20 6c 6f 63 6b 20 69 73 20 61  shared lock is a
147e0 6c 77 61 79 73 20 68 65 6c 64 20 77 68 65 6e 20  lways held when 
147f0 61 20 72 65 73 65 72 76 65 20 6c 6f 63 6b 20 69  a reserve lock i
14800 73 20 72 65 71 75 65 73 74 65 64 2e 0a 20 20 2a  s requested..  *
14810 2f 0a 20 20 61 73 73 65 72 74 28 20 70 46 69 6c  /.  assert( pFil
14820 65 2d 3e 6c 6f 63 6b 74 79 70 65 21 3d 4e 4f 5f  e->locktype!=NO_
14830 4c 4f 43 4b 20 7c 7c 20 6c 6f 63 6b 74 79 70 65  LOCK || locktype
14840 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b  ==SHARED_LOCK );
14850 0a 20 20 61 73 73 65 72 74 28 20 6c 6f 63 6b 74  .  assert( lockt
14860 79 70 65 21 3d 50 45 4e 44 49 4e 47 5f 4c 4f 43  ype!=PENDING_LOC
14870 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6c  K );.  assert( l
14880 6f 63 6b 74 79 70 65 21 3d 52 45 53 45 52 56 45  ocktype!=RESERVE
14890 44 5f 4c 4f 43 4b 20 7c 7c 20 70 46 69 6c 65 2d  D_LOCK || pFile-
148a0 3e 6c 6f 63 6b 74 79 70 65 3d 3d 53 48 41 52 45  >locktype==SHARE
148b0 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 0a 20 20 2f  D_LOCK );.  .  /
148c0 2a 20 54 68 69 73 20 6d 75 74 65 78 20 69 73 20  * This mutex is 
148d0 6e 65 65 64 65 64 20 62 65 63 61 75 73 65 20 70  needed because p
148e0 46 69 6c 65 2d 3e 70 4c 6f 63 6b 20 69 73 20 73  File->pLock is s
148f0 68 61 72 65 64 20 61 63 72 6f 73 73 20 74 68 72  hared across thr
14900 65 61 64 73 0a 20 20 2a 2f 0a 20 20 75 6e 69 78  eads.  */.  unix
14910 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 0a 20  EnterMutex();.. 
14920 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68   /* Make sure th
14930 65 20 63 75 72 72 65 6e 74 20 74 68 72 65 61 64  e current thread
14940 20 6f 77 6e 73 20 74 68 65 20 70 46 69 6c 65 2e   owns the pFile.
14950 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 74 72 61  .  */.  rc = tra
14960 6e 73 66 65 72 4f 77 6e 65 72 73 68 69 70 28 70  nsferOwnership(p
14970 46 69 6c 65 29 3b 0a 20 20 69 66 28 20 72 63 21  File);.  if( rc!
14980 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
14990 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78    unixLeaveMutex
149a0 28 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 72  ();.    return r
149b0 63 3b 0a 20 20 7d 0a 20 20 70 4c 6f 63 6b 20 3d  c;.  }.  pLock =
149c0 20 70 46 69 6c 65 2d 3e 70 4c 6f 63 6b 3b 0a 0a   pFile->pLock;..
149d0 20 20 2f 2a 20 49 66 20 73 6f 6d 65 20 74 68 72    /* If some thr
149e0 65 61 64 20 75 73 69 6e 67 20 74 68 69 73 20 50  ead using this P
149f0 49 44 20 68 61 73 20 61 20 6c 6f 63 6b 20 76 69  ID has a lock vi
14a00 61 20 61 20 64 69 66 66 65 72 65 6e 74 20 75 6e  a a different un
14a10 69 78 46 69 6c 65 2a 0a 20 20 2a 2a 20 68 61 6e  ixFile*.  ** han
14a20 64 6c 65 20 74 68 61 74 20 70 72 65 63 6c 75 64  dle that preclud
14a30 65 73 20 74 68 65 20 72 65 71 75 65 73 74 65 64  es the requested
14a40 20 6c 6f 63 6b 2c 20 72 65 74 75 72 6e 20 42 55   lock, return BU
14a50 53 59 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 28  SY..  */.  if( (
14a60 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 21  pFile->locktype!
14a70 3d 70 4c 6f 63 6b 2d 3e 6c 6f 63 6b 74 79 70 65  =pLock->locktype
14a80 20 26 26 20 0a 20 20 20 20 20 20 20 28 70 4c 6f   && .       (pLo
14a90 63 6b 2d 3e 6c 6f 63 6b 74 79 70 65 3e 3d 50 45  ck->locktype>=PE
14aa0 4e 44 49 4e 47 5f 4c 4f 43 4b 20 7c 7c 20 6c 6f  NDING_LOCK || lo
14ab0 63 6b 74 79 70 65 3e 53 48 41 52 45 44 5f 4c 4f  cktype>SHARED_LO
14ac0 43 4b 29 29 0a 20 20 20 20 20 29 7b 0a 20 20 20  CK)).     ){.   
14ad0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53   rc = SQLITE_BUS
14ae0 59 3b 0a 20 20 20 20 67 6f 74 6f 20 61 66 70 5f  Y;.    goto afp_
14af0 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 7d 0a 20 20  end_lock;.  }.  
14b00 0a 20 20 2f 2a 20 49 66 20 61 20 53 48 41 52 45  .  /* If a SHARE
14b10 44 20 6c 6f 63 6b 20 69 73 20 72 65 71 75 65 73  D lock is reques
14b20 74 65 64 2c 20 61 6e 64 20 73 6f 6d 65 20 74 68  ted, and some th
14b30 72 65 61 64 20 75 73 69 6e 67 20 74 68 69 73 20  read using this 
14b40 50 49 44 20 61 6c 72 65 61 64 79 0a 20 20 2a 2a  PID already.  **
14b50 20 68 61 73 20 61 20 53 48 41 52 45 44 20 6f 72   has a SHARED or
14b60 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 2c 20   RESERVED lock, 
14b70 74 68 65 6e 20 69 6e 63 72 65 6d 65 6e 74 20 72  then increment r
14b80 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 73 20  eference counts 
14b90 61 6e 64 0a 20 20 2a 2a 20 72 65 74 75 72 6e 20  and.  ** return 
14ba0 53 51 4c 49 54 45 5f 4f 4b 2e 0a 20 20 2a 2f 0a  SQLITE_OK..  */.
14bb0 20 20 69 66 28 20 6c 6f 63 6b 74 79 70 65 3d 3d    if( locktype==
14bc0 53 48 41 52 45 44 5f 4c 4f 43 4b 20 26 26 20 0a  SHARED_LOCK && .
14bd0 20 20 20 20 20 28 70 4c 6f 63 6b 2d 3e 6c 6f 63       (pLock->loc
14be0 6b 74 79 70 65 3d 3d 53 48 41 52 45 44 5f 4c 4f  ktype==SHARED_LO
14bf0 43 4b 20 7c 7c 20 70 4c 6f 63 6b 2d 3e 6c 6f 63  CK || pLock->loc
14c00 6b 74 79 70 65 3d 3d 52 45 53 45 52 56 45 44 5f  ktype==RESERVED_
14c10 4c 4f 43 4b 29 20 29 7b 0a 20 20 20 20 61 73 73  LOCK) ){.    ass
14c20 65 72 74 28 20 6c 6f 63 6b 74 79 70 65 3d 3d 53  ert( locktype==S
14c30 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20  HARED_LOCK );.  
14c40 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 2d    assert( pFile-
14c50 3e 6c 6f 63 6b 74 79 70 65 3d 3d 30 20 29 3b 0a  >locktype==0 );.
14c60 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 6f 63      assert( pLoc
14c70 6b 2d 3e 63 6e 74 3e 30 20 29 3b 0a 20 20 20 20  k->cnt>0 );.    
14c80 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 20  pFile->locktype 
14c90 3d 20 53 48 41 52 45 44 5f 4c 4f 43 4b 3b 0a 20  = SHARED_LOCK;. 
14ca0 20 20 20 70 4c 6f 63 6b 2d 3e 63 6e 74 2b 2b 3b     pLock->cnt++;
14cb0 0a 20 20 20 20 70 46 69 6c 65 2d 3e 70 4f 70 65  .    pFile->pOpe
14cc0 6e 2d 3e 6e 4c 6f 63 6b 2b 2b 3b 0a 20 20 20 20  n->nLock++;.    
14cd0 67 6f 74 6f 20 61 66 70 5f 65 6e 64 5f 6c 6f 63  goto afp_end_loc
14ce0 6b 3b 0a 20 20 7d 0a 20 20 20 20 0a 20 20 2f 2a  k;.  }.    .  /*
14cf0 20 41 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 20   A PENDING lock 
14d00 69 73 20 6e 65 65 64 65 64 20 62 65 66 6f 72 65  is needed before
14d10 20 61 63 71 75 69 72 69 6e 67 20 61 20 53 48 41   acquiring a SHA
14d20 52 45 44 20 6c 6f 63 6b 20 61 6e 64 20 62 65 66  RED lock and bef
14d30 6f 72 65 0a 20 20 2a 2a 20 61 63 71 75 69 72 69  ore.  ** acquiri
14d40 6e 67 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20  ng an EXCLUSIVE 
14d50 6c 6f 63 6b 2e 20 20 46 6f 72 20 74 68 65 20 53  lock.  For the S
14d60 48 41 52 45 44 20 6c 6f 63 6b 2c 20 74 68 65 20  HARED lock, the 
14d70 50 45 4e 44 49 4e 47 20 77 69 6c 6c 0a 20 20 2a  PENDING will.  *
14d80 2a 20 62 65 20 72 65 6c 65 61 73 65 64 2e 0a 20  * be released.. 
14d90 20 2a 2f 0a 20 20 69 66 28 20 6c 6f 63 6b 74 79   */.  if( lockty
14da0 70 65 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20  pe==SHARED_LOCK 
14db0 0a 20 20 20 20 20 20 7c 7c 20 28 6c 6f 63 6b 74  .      || (lockt
14dc0 79 70 65 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c  ype==EXCLUSIVE_L
14dd0 4f 43 4b 20 26 26 20 70 46 69 6c 65 2d 3e 6c 6f  OCK && pFile->lo
14de0 63 6b 74 79 70 65 3c 50 45 4e 44 49 4e 47 5f 4c  cktype<PENDING_L
14df0 4f 43 4b 29 0a 20 20 29 7b 0a 20 20 20 20 69 6e  OCK).  ){.    in
14e00 74 20 66 61 69 6c 65 64 3b 0a 20 20 20 20 66 61  t failed;.    fa
14e10 69 6c 65 64 20 3d 20 61 66 70 53 65 74 4c 6f 63  iled = afpSetLoc
14e20 6b 28 63 6f 6e 74 65 78 74 2d 3e 64 62 50 61 74  k(context->dbPat
14e30 68 2c 20 70 46 69 6c 65 2c 20 50 45 4e 44 49 4e  h, pFile, PENDIN
14e40 47 5f 42 59 54 45 2c 20 31 2c 20 31 29 3b 0a 20  G_BYTE, 1, 1);. 
14e50 20 20 20 69 66 20 28 66 61 69 6c 65 64 29 20 7b     if (failed) {
14e60 0a 20 20 20 20 20 20 72 63 20 3d 20 66 61 69 6c  .      rc = fail
14e70 65 64 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 61  ed;.      goto a
14e80 66 70 5f 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 20  fp_end_lock;.   
14e90 20 7d 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 49   }.  }.  .  /* I
14ea0 66 20 63 6f 6e 74 72 6f 6c 20 67 65 74 73 20 74  f control gets t
14eb0 6f 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 74 68  o this point, th
14ec0 65 6e 20 61 63 74 75 61 6c 6c 79 20 67 6f 20 61  en actually go a
14ed0 68 65 61 64 20 61 6e 64 20 6d 61 6b 65 0a 20 20  head and make.  
14ee0 2a 2a 20 6f 70 65 72 61 74 69 6e 67 20 73 79 73  ** operating sys
14ef0 74 65 6d 20 63 61 6c 6c 73 20 66 6f 72 20 74 68  tem calls for th
14f00 65 20 73 70 65 63 69 66 69 65 64 20 6c 6f 63 6b  e specified lock
14f10 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6c 6f 63  ..  */.  if( loc
14f20 6b 74 79 70 65 3d 3d 53 48 41 52 45 44 5f 4c 4f  ktype==SHARED_LO
14f30 43 4b 20 29 7b 0a 20 20 20 20 69 6e 74 20 6c 72  CK ){.    int lr
14f40 63 31 2c 20 6c 72 63 32 2c 20 6c 72 63 31 45 72  c1, lrc2, lrc1Er
14f50 72 6e 6f 3b 0a 20 20 20 20 6c 6f 6e 67 20 6c 6b  rno;.    long lk
14f60 2c 20 6d 61 73 6b 3b 0a 20 20 20 20 0a 20 20 20  , mask;.    .   
14f70 20 61 73 73 65 72 74 28 20 70 4c 6f 63 6b 2d 3e   assert( pLock->
14f80 63 6e 74 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73  cnt==0 );.    as
14f90 73 65 72 74 28 20 70 4c 6f 63 6b 2d 3e 6c 6f 63  sert( pLock->loc
14fa0 6b 74 79 70 65 3d 3d 30 20 29 3b 0a 20 20 20 20  ktype==0 );.    
14fb0 20 20 20 20 0a 20 20 20 20 6d 61 73 6b 20 3d 20      .    mask = 
14fc0 28 73 69 7a 65 6f 66 28 6c 6f 6e 67 29 3d 3d 38  (sizeof(long)==8
14fd0 29 20 3f 20 4c 41 52 47 45 53 54 5f 49 4e 54 36  ) ? LARGEST_INT6
14fe0 34 20 3a 20 30 78 37 66 66 66 66 66 66 66 3b 0a  4 : 0x7fffffff;.
14ff0 20 20 20 20 2f 2a 20 4e 6f 77 20 67 65 74 20 74      /* Now get t
15000 68 65 20 72 65 61 64 2d 6c 6f 63 6b 20 53 48 41  he read-lock SHA
15010 52 45 44 5f 4c 4f 43 4b 20 2a 2f 0a 20 20 20 20  RED_LOCK */.    
15020 2f 2a 20 6e 6f 74 65 20 74 68 61 74 20 74 68 65  /* note that the
15030 20 71 75 61 6c 69 74 79 20 6f 66 20 74 68 65 20   quality of the 
15040 72 61 6e 64 6f 6d 6e 65 73 73 20 64 6f 65 73 6e  randomness doesn
15050 27 74 20 6d 61 74 74 65 72 20 74 68 61 74 20 6d  't matter that m
15060 75 63 68 20 2a 2f 0a 20 20 20 20 6c 6b 20 3d 20  uch */.    lk = 
15070 72 61 6e 64 6f 6d 28 29 3b 20 0a 20 20 20 20 70  random(); .    p
15080 4c 6f 63 6b 2d 3e 73 68 61 72 65 64 42 79 74 65  Lock->sharedByte
15090 20 3d 20 28 6c 6b 20 26 20 6d 61 73 6b 29 25 28   = (lk & mask)%(
150a0 53 48 41 52 45 44 5f 53 49 5a 45 20 2d 20 31 29  SHARED_SIZE - 1)
150b0 3b 0a 20 20 20 20 6c 72 63 31 20 3d 20 61 66 70  ;.    lrc1 = afp
150c0 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74 2d  SetLock(context-
150d0 3e 64 62 50 61 74 68 2c 20 70 46 69 6c 65 2c 20  >dbPath, pFile, 
150e0 0a 20 20 20 20 20 20 20 20 20 20 53 48 41 52 45  .          SHARE
150f0 44 5f 46 49 52 53 54 2b 70 4c 6f 63 6b 2d 3e 73  D_FIRST+pLock->s
15100 68 61 72 65 64 42 79 74 65 2c 20 31 2c 20 31 29  haredByte, 1, 1)
15110 3b 0a 20 20 20 20 69 66 28 20 49 53 5f 4c 4f 43  ;.    if( IS_LOC
15120 4b 5f 45 52 52 4f 52 28 6c 72 63 31 29 20 29 7b  K_ERROR(lrc1) ){
15130 0a 20 20 20 20 20 20 6c 72 63 31 45 72 72 6e 6f  .      lrc1Errno
15140 20 3d 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72   = pFile->lastEr
15150 72 6e 6f 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2f  rno;.    }.    /
15160 2a 20 44 72 6f 70 20 74 68 65 20 74 65 6d 70 6f  * Drop the tempo
15170 72 61 72 79 20 50 45 4e 44 49 4e 47 20 6c 6f 63  rary PENDING loc
15180 6b 20 2a 2f 0a 20 20 20 20 6c 72 63 32 20 3d 20  k */.    lrc2 = 
15190 61 66 70 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65  afpSetLock(conte
151a0 78 74 2d 3e 64 62 50 61 74 68 2c 20 70 46 69 6c  xt->dbPath, pFil
151b0 65 2c 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 2c  e, PENDING_BYTE,
151c0 20 31 2c 20 30 29 3b 0a 20 20 20 20 0a 20 20 20   1, 0);.    .   
151d0 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52   if( IS_LOCK_ERR
151e0 4f 52 28 6c 72 63 31 29 20 29 20 7b 0a 20 20 20  OR(lrc1) ) {.   
151f0 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72     pFile->lastEr
15200 72 6e 6f 20 3d 20 6c 72 63 31 45 72 72 6e 6f 3b  rno = lrc1Errno;
15210 0a 20 20 20 20 20 20 72 63 20 3d 20 6c 72 63 31  .      rc = lrc1
15220 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 61 66 70  ;.      goto afp
15230 5f 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 20 20 7d  _end_lock;.    }
15240 20 65 6c 73 65 20 69 66 28 20 49 53 5f 4c 4f 43   else if( IS_LOC
15250 4b 5f 45 52 52 4f 52 28 6c 72 63 32 29 20 29 7b  K_ERROR(lrc2) ){
15260 0a 20 20 20 20 20 20 72 63 20 3d 20 6c 72 63 32  .      rc = lrc2
15270 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 61 66 70  ;.      goto afp
15280 5f 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 20 20 7d  _end_lock;.    }
15290 20 65 6c 73 65 20 69 66 28 20 6c 72 63 31 20 21   else if( lrc1 !
152a0 3d 20 53 51 4c 49 54 45 5f 4f 4b 20 29 20 7b 0a  = SQLITE_OK ) {.
152b0 20 20 20 20 20 20 72 63 20 3d 20 6c 72 63 31 3b        rc = lrc1;
152c0 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20  .    } else {.  
152d0 20 20 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74      pFile->lockt
152e0 79 70 65 20 3d 20 53 48 41 52 45 44 5f 4c 4f 43  ype = SHARED_LOC
152f0 4b 3b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e  K;.      pFile->
15300 70 4f 70 65 6e 2d 3e 6e 4c 6f 63 6b 2b 2b 3b 0a  pOpen->nLock++;.
15310 20 20 20 20 20 20 70 4c 6f 63 6b 2d 3e 63 6e 74        pLock->cnt
15320 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 65   = 1;.    }.  }e
15330 6c 73 65 20 69 66 28 20 6c 6f 63 6b 74 79 70 65  lse if( locktype
15340 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b  ==EXCLUSIVE_LOCK
15350 20 26 26 20 70 4c 6f 63 6b 2d 3e 63 6e 74 3e 31   && pLock->cnt>1
15360 20 29 7b 0a 20 20 20 20 2f 2a 20 57 65 20 61 72   ){.    /* We ar
15370 65 20 74 72 79 69 6e 67 20 66 6f 72 20 61 6e 20  e trying for an 
15380 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20 62  exclusive lock b
15390 75 74 20 61 6e 6f 74 68 65 72 20 74 68 72 65 61  ut another threa
153a0 64 20 69 6e 20 74 68 69 73 0a 20 20 20 20 20 2a  d in this.     *
153b0 2a 20 73 61 6d 65 20 70 72 6f 63 65 73 73 20 69  * same process i
153c0 73 20 73 74 69 6c 6c 20 68 6f 6c 64 69 6e 67 20  s still holding 
153d0 61 20 73 68 61 72 65 64 20 6c 6f 63 6b 2e 20 2a  a shared lock. *
153e0 2f 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  /.    rc = SQLIT
153f0 45 5f 42 55 53 59 3b 0a 20 20 7d 65 6c 73 65 7b  E_BUSY;.  }else{
15400 0a 20 20 20 20 2f 2a 20 54 68 65 20 72 65 71 75  .    /* The requ
15410 65 73 74 20 77 61 73 20 66 6f 72 20 61 20 52 45  est was for a RE
15420 53 45 52 56 45 44 20 6f 72 20 45 58 43 4c 55 53  SERVED or EXCLUS
15430 49 56 45 20 6c 6f 63 6b 2e 20 20 49 74 20 69 73  IVE lock.  It is
15440 0a 20 20 20 20 2a 2a 20 61 73 73 75 6d 65 64 20  .    ** assumed 
15450 74 68 61 74 20 74 68 65 72 65 20 69 73 20 61 20  that there is a 
15460 53 48 41 52 45 44 20 6f 72 20 67 72 65 61 74 65  SHARED or greate
15470 72 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 66 69  r lock on the fi
15480 6c 65 0a 20 20 20 20 2a 2a 20 61 6c 72 65 61 64  le.    ** alread
15490 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 6e  y..    */.    in
154a0 74 20 66 61 69 6c 65 64 20 3d 20 30 3b 0a 20 20  t failed = 0;.  
154b0 20 20 61 73 73 65 72 74 28 20 30 21 3d 70 46 69    assert( 0!=pFi
154c0 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 20 29 3b 0a  le->locktype );.
154d0 20 20 20 20 69 66 20 28 6c 6f 63 6b 74 79 70 65      if (locktype
154e0 20 3e 3d 20 52 45 53 45 52 56 45 44 5f 4c 4f 43   >= RESERVED_LOC
154f0 4b 20 26 26 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b  K && pFile->lock
15500 74 79 70 65 20 3c 20 52 45 53 45 52 56 45 44 5f  type < RESERVED_
15510 4c 4f 43 4b 29 20 7b 0a 20 20 20 20 20 20 20 20  LOCK) {.        
15520 2f 2a 20 41 63 71 75 69 72 65 20 61 20 52 45 53  /* Acquire a RES
15530 45 52 56 45 44 20 6c 6f 63 6b 20 2a 2f 0a 20 20  ERVED lock */.  
15540 20 20 20 20 20 20 66 61 69 6c 65 64 20 3d 20 61        failed = a
15550 66 70 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65 78  fpSetLock(contex
15560 74 2d 3e 64 62 50 61 74 68 2c 20 70 46 69 6c 65  t->dbPath, pFile
15570 2c 20 52 45 53 45 52 56 45 44 5f 42 59 54 45 2c  , RESERVED_BYTE,
15580 20 31 2c 31 29 3b 0a 20 20 20 20 20 20 69 66 28   1,1);.      if(
15590 20 21 66 61 69 6c 65 64 20 29 7b 0a 20 20 20 20   !failed ){.    
155a0 20 20 20 20 63 6f 6e 74 65 78 74 2d 3e 72 65 73      context->res
155b0 65 72 76 65 64 20 3d 20 31 3b 0a 20 20 20 20 20  erved = 1;.     
155c0 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20   }.    }.    if 
155d0 28 21 66 61 69 6c 65 64 20 26 26 20 6c 6f 63 6b  (!failed && lock
155e0 74 79 70 65 20 3d 3d 20 45 58 43 4c 55 53 49 56  type == EXCLUSIV
155f0 45 5f 4c 4f 43 4b 29 20 7b 0a 20 20 20 20 20 20  E_LOCK) {.      
15600 2f 2a 20 41 63 71 75 69 72 65 20 61 6e 20 45 58  /* Acquire an EX
15610 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 2a 2f 0a  CLUSIVE lock */.
15620 20 20 20 20 20 20 20 20 0a 20 20 20 20 20 20 2f          .      /
15630 2a 20 52 65 6d 6f 76 65 20 74 68 65 20 73 68 61  * Remove the sha
15640 72 65 64 20 6c 6f 63 6b 20 62 65 66 6f 72 65 20  red lock before 
15650 74 72 79 69 6e 67 20 74 68 65 20 72 61 6e 67 65  trying the range
15660 2e 20 20 77 65 27 6c 6c 20 6e 65 65 64 20 74 6f  .  we'll need to
15670 20 0a 20 20 20 20 20 20 2a 2a 20 72 65 65 73 74   .      ** reest
15680 61 62 6c 69 73 68 20 74 68 65 20 73 68 61 72 65  ablish the share
15690 64 20 6c 6f 63 6b 20 69 66 20 77 65 20 63 61 6e  d lock if we can
156a0 27 74 20 67 65 74 20 74 68 65 20 20 61 66 70 55  't get the  afpU
156b0 6e 6c 6f 63 6b 0a 20 20 20 20 20 20 2a 2f 0a 20  nlock.      */. 
156c0 20 20 20 20 20 69 66 28 20 21 28 66 61 69 6c 65       if( !(faile
156d0 64 20 3d 20 61 66 70 53 65 74 4c 6f 63 6b 28 63  d = afpSetLock(c
156e0 6f 6e 74 65 78 74 2d 3e 64 62 50 61 74 68 2c 20  ontext->dbPath, 
156f0 70 46 69 6c 65 2c 20 53 48 41 52 45 44 5f 46 49  pFile, SHARED_FI
15700 52 53 54 20 2b 0a 20 20 20 20 20 20 20 20 20 20  RST +.          
15710 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
15720 4c 6f 63 6b 2d 3e 73 68 61 72 65 64 42 79 74 65  Lock->sharedByte
15730 2c 20 31 2c 20 30 29 29 20 29 7b 0a 20 20 20 20  , 1, 0)) ){.    
15740 20 20 20 20 69 6e 74 20 66 61 69 6c 65 64 32 20      int failed2 
15750 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  = SQLITE_OK;.   
15760 20 20 20 20 20 2f 2a 20 6e 6f 77 20 61 74 74 65       /* now atte
15770 6d 6d 70 74 20 74 6f 20 67 65 74 20 74 68 65 20  mmpt to get the 
15780 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20 72  exclusive lock r
15790 61 6e 67 65 20 2a 2f 0a 20 20 20 20 20 20 20 20  ange */.        
157a0 66 61 69 6c 65 64 20 3d 20 61 66 70 53 65 74 4c  failed = afpSetL
157b0 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 64 62 50  ock(context->dbP
157c0 61 74 68 2c 20 70 46 69 6c 65 2c 20 53 48 41 52  ath, pFile, SHAR
157d0 45 44 5f 46 49 52 53 54 2c 20 0a 20 20 20 20 20  ED_FIRST, .     
157e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
157f0 20 20 20 20 20 20 20 20 20 20 53 48 41 52 45 44            SHARED
15800 5f 53 49 5a 45 2c 20 31 29 3b 0a 20 20 20 20 20  _SIZE, 1);.     
15810 20 20 20 69 66 28 20 66 61 69 6c 65 64 20 26 26     if( failed &&
15820 20 28 66 61 69 6c 65 64 32 20 3d 20 61 66 70 53   (failed2 = afpS
15830 65 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e  etLock(context->
15840 64 62 50 61 74 68 2c 20 70 46 69 6c 65 2c 20 0a  dbPath, pFile, .
15850 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15860 20 20 20 20 20 20 20 53 48 41 52 45 44 5f 46 49         SHARED_FI
15870 52 53 54 20 2b 20 70 4c 6f 63 6b 2d 3e 73 68 61  RST + pLock->sha
15880 72 65 64 42 79 74 65 2c 20 31 2c 20 31 29 29 20  redByte, 1, 1)) 
15890 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ){.          /* 
158a0 43 61 6e 27 74 20 72 65 65 73 74 61 62 6c 69 73  Can't reestablis
158b0 68 20 74 68 65 20 73 68 61 72 65 64 20 6c 6f 63  h the shared loc
158c0 6b 2e 20 20 53 71 6c 69 74 65 20 63 61 6e 27 74  k.  Sqlite can't
158d0 20 64 65 61 6c 2c 20 74 68 69 73 20 69 73 0a 20   deal, this is. 
158e0 20 20 20 20 20 20 20 20 20 2a 2a 20 61 20 63 72           ** a cr
158f0 69 74 69 63 61 6c 20 49 2f 4f 20 65 72 72 6f 72  itical I/O error
15900 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  .          */.  
15910 20 20 20 20 20 20 20 20 72 63 20 3d 20 28 28 66          rc = ((f
15920 61 69 6c 65 64 20 26 20 53 51 4c 49 54 45 5f 49  ailed & SQLITE_I
15930 4f 45 52 52 29 20 3d 3d 20 53 51 4c 49 54 45 5f  OERR) == SQLITE_
15940 49 4f 45 52 52 29 20 3f 20 66 61 69 6c 65 64 32  IOERR) ? failed2
15950 20 3a 20 0a 20 20 20 20 20 20 20 20 20 20 20 20   : .            
15960 20 20 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f     SQLITE_IOERR_
15970 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 20 20 20 20  LOCK;.          
15980 67 6f 74 6f 20 61 66 70 5f 65 6e 64 5f 6c 6f 63  goto afp_end_loc
15990 6b 3b 0a 20 20 20 20 20 20 20 20 7d 20 0a 20 20  k;.        } .  
159a0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
159b0 20 20 20 72 63 20 3d 20 66 61 69 6c 65 64 3b 20     rc = failed; 
159c0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
159d0 20 20 20 69 66 28 20 66 61 69 6c 65 64 20 29 7b     if( failed ){
159e0 0a 20 20 20 20 20 20 72 63 20 3d 20 66 61 69 6c  .      rc = fail
159f0 65 64 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  ed;.    }.  }.  
15a00 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
15a10 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 46 69 6c  E_OK ){.    pFil
15a20 65 2d 3e 6c 6f 63 6b 74 79 70 65 20 3d 20 6c 6f  e->locktype = lo
15a30 63 6b 74 79 70 65 3b 0a 20 20 20 20 70 4c 6f 63  cktype;.    pLoc
15a40 6b 2d 3e 6c 6f 63 6b 74 79 70 65 20 3d 20 6c 6f  k->locktype = lo
15a50 63 6b 74 79 70 65 3b 0a 20 20 7d 65 6c 73 65 20  cktype;.  }else 
15a60 69 66 28 20 6c 6f 63 6b 74 79 70 65 3d 3d 45 58  if( locktype==EX
15a70 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 29 7b 0a  CLUSIVE_LOCK ){.
15a80 20 20 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74      pFile->lockt
15a90 79 70 65 20 3d 20 50 45 4e 44 49 4e 47 5f 4c 4f  ype = PENDING_LO
15aa0 43 4b 3b 0a 20 20 20 20 70 4c 6f 63 6b 2d 3e 6c  CK;.    pLock->l
15ab0 6f 63 6b 74 79 70 65 20 3d 20 50 45 4e 44 49 4e  ocktype = PENDIN
15ac0 47 5f 4c 4f 43 4b 3b 0a 20 20 7d 0a 20 20 0a 61  G_LOCK;.  }.  .a
15ad0 66 70 5f 65 6e 64 5f 6c 6f 63 6b 3a 0a 20 20 75  fp_end_lock:.  u
15ae0 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b  nixLeaveMutex();
15af0 0a 20 20 4f 53 54 52 41 43 45 34 28 22 4c 4f 43  .  OSTRACE4("LOC
15b00 4b 20 20 20 20 25 64 20 25 73 20 25 73 20 28 61  K    %d %s %s (a
15b10 66 70 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68  fp)\n", pFile->h
15b20 2c 20 6c 6f 63 6b 74 79 70 65 4e 61 6d 65 28 6c  , locktypeName(l
15b30 6f 63 6b 74 79 70 65 29 2c 20 0a 20 20 20 20 20  ocktype), .     
15b40 20 20 20 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f      rc==SQLITE_O
15b50 4b 20 3f 20 22 6f 6b 22 20 3a 20 22 66 61 69 6c  K ? "ok" : "fail
15b60 65 64 22 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  ed");.  return r
15b70 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 77 65  c;.}../*.** Lowe
15b80 72 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65  r the locking le
15b90 76 65 6c 20 6f 6e 20 66 69 6c 65 20 64 65 73 63  vel on file desc
15ba0 72 69 70 74 6f 72 20 70 46 69 6c 65 20 74 6f 20  riptor pFile to 
15bb0 6c 6f 63 6b 74 79 70 65 2e 20 20 6c 6f 63 6b 74  locktype.  lockt
15bc0 79 70 65 0a 2a 2a 20 6d 75 73 74 20 62 65 20 65  ype.** must be e
15bd0 69 74 68 65 72 20 4e 4f 5f 4c 4f 43 4b 20 6f 72  ither NO_LOCK or
15be0 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2e 0a 2a 2a   SHARED_LOCK..**
15bf0 0a 2a 2a 20 49 66 20 74 68 65 20 6c 6f 63 6b 69  .** If the locki
15c00 6e 67 20 6c 65 76 65 6c 20 6f 66 20 74 68 65 20  ng level of the 
15c10 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
15c20 69 73 20 61 6c 72 65 61 64 79 20 61 74 20 6f 72  is already at or
15c30 20 62 65 6c 6f 77 0a 2a 2a 20 74 68 65 20 72 65   below.** the re
15c40 71 75 65 73 74 65 64 20 6c 6f 63 6b 69 6e 67 20  quested locking 
15c50 6c 65 76 65 6c 2c 20 74 68 69 73 20 72 6f 75 74  level, this rout
15c60 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a  ine is a no-op..
15c70 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 66  */.static int af
15c80 70 55 6e 6c 6f 63 6b 28 73 71 6c 69 74 65 33 5f  pUnlock(sqlite3_
15c90 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 6c 6f  file *id, int lo
15ca0 63 6b 74 79 70 65 29 20 7b 0a 20 20 69 6e 74 20  cktype) {.  int 
15cb0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
15cc0 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c    unixFile *pFil
15cd0 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69  e = (unixFile*)i
15ce0 64 3b 0a 20 20 73 74 72 75 63 74 20 75 6e 69 78  d;.  struct unix
15cf0 4c 6f 63 6b 49 6e 66 6f 20 2a 70 4c 6f 63 6b 3b  LockInfo *pLock;
15d00 0a 20 20 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e  .  afpLockingCon
15d10 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 20 3d 20  text *context = 
15d20 28 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65  (afpLockingConte
15d30 78 74 20 2a 29 20 70 46 69 6c 65 2d 3e 6c 6f 63  xt *) pFile->loc
15d40 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 0a 20 20 69  kingContext;.  i
15d50 6e 74 20 73 6b 69 70 53 68 61 72 65 64 20 3d 20  nt skipShared = 
15d60 30 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  0;.#ifdef SQLITE
15d70 5f 54 45 53 54 0a 20 20 69 6e 74 20 68 20 3d 20  _TEST.  int h = 
15d80 70 46 69 6c 65 2d 3e 68 3b 0a 23 65 6e 64 69 66  pFile->h;.#endif
15d90 0a 0a 20 20 61 73 73 65 72 74 28 20 70 46 69 6c  ..  assert( pFil
15da0 65 20 29 3b 0a 20 20 4f 53 54 52 41 43 45 37 28  e );.  OSTRACE7(
15db0 22 55 4e 4c 4f 43 4b 20 20 25 64 20 25 64 20 77  "UNLOCK  %d %d w
15dc0 61 73 20 25 64 28 25 64 2c 25 64 29 20 70 69 64  as %d(%d,%d) pid
15dd0 3d 25 64 20 28 61 66 70 29 5c 6e 22 2c 20 70 46  =%d (afp)\n", pF
15de0 69 6c 65 2d 3e 68 2c 20 6c 6f 63 6b 74 79 70 65  ile->h, locktype
15df0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70 46 69  ,.           pFi
15e00 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 2c 20 70 46  le->locktype, pF
15e10 69 6c 65 2d 3e 70 4c 6f 63 6b 2d 3e 6c 6f 63 6b  ile->pLock->lock
15e20 74 79 70 65 2c 20 70 46 69 6c 65 2d 3e 70 4c 6f  type, pFile->pLo
15e30 63 6b 2d 3e 63 6e 74 2c 20 67 65 74 70 69 64 28  ck->cnt, getpid(
15e40 29 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 6c  ));..  assert( l
15e50 6f 63 6b 74 79 70 65 3c 3d 53 48 41 52 45 44 5f  ocktype<=SHARED_
15e60 4c 4f 43 4b 20 29 3b 0a 20 20 69 66 28 20 70 46  LOCK );.  if( pF
15e70 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3c 3d 6c  ile->locktype<=l
15e80 6f 63 6b 74 79 70 65 20 29 7b 0a 20 20 20 20 72  ocktype ){.    r
15e90 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
15ea0 0a 20 20 7d 0a 20 20 69 66 28 20 43 48 45 43 4b  .  }.  if( CHECK
15eb0 5f 54 48 52 45 41 44 49 44 28 70 46 69 6c 65 29  _THREADID(pFile)
15ec0 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
15ed0 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50  QLITE_MISUSE_BKP
15ee0 54 3b 0a 20 20 7d 0a 20 20 75 6e 69 78 45 6e 74  T;.  }.  unixEnt
15ef0 65 72 4d 75 74 65 78 28 29 3b 0a 20 20 70 4c 6f  erMutex();.  pLo
15f00 63 6b 20 3d 20 70 46 69 6c 65 2d 3e 70 4c 6f 63  ck = pFile->pLoc
15f10 6b 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4c 6f  k;.  assert( pLo
15f20 63 6b 2d 3e 63 6e 74 21 3d 30 20 29 3b 0a 20 20  ck->cnt!=0 );.  
15f30 69 66 28 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74  if( pFile->lockt
15f40 79 70 65 3e 53 48 41 52 45 44 5f 4c 4f 43 4b 20  ype>SHARED_LOCK 
15f50 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
15f60 4c 6f 63 6b 2d 3e 6c 6f 63 6b 74 79 70 65 3d 3d  Lock->locktype==
15f70 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 20  pFile->locktype 
15f80 29 3b 0a 20 20 20 20 53 69 6d 75 6c 61 74 65 49  );.    SimulateI
15f90 4f 45 72 72 6f 72 42 65 6e 69 67 6e 28 31 29 3b  OErrorBenign(1);
15fa0 0a 20 20 20 20 53 69 6d 75 6c 61 74 65 49 4f 45  .    SimulateIOE
15fb0 72 72 6f 72 28 20 68 3d 28 2d 31 29 20 29 0a 20  rror( h=(-1) ). 
15fc0 20 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72     SimulateIOErr
15fd0 6f 72 42 65 6e 69 67 6e 28 30 29 3b 0a 20 20 20  orBenign(0);.   
15fe0 20 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47   .#ifndef NDEBUG
15ff0 0a 20 20 20 20 2f 2a 20 57 68 65 6e 20 72 65 64  .    /* When red
16000 75 63 69 6e 67 20 61 20 6c 6f 63 6b 20 73 75 63  ucing a lock suc
16010 68 20 74 68 61 74 20 6f 74 68 65 72 20 70 72 6f  h that other pro
16020 63 65 73 73 65 73 20 63 61 6e 20 73 74 61 72 74  cesses can start
16030 0a 20 20 20 20 2a 2a 20 72 65 61 64 69 6e 67 20  .    ** reading 
16040 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
16050 65 20 61 67 61 69 6e 2c 20 6d 61 6b 65 20 73 75  e again, make su
16060 72 65 20 74 68 61 74 20 74 68 65 0a 20 20 20 20  re that the.    
16070 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63  ** transaction c
16080 6f 75 6e 74 65 72 20 77 61 73 20 75 70 64 61 74  ounter was updat
16090 65 64 20 69 66 20 61 6e 79 20 70 61 72 74 20 6f  ed if any part o
160a0 66 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 20  f the database. 
160b0 20 20 20 2a 2a 20 66 69 6c 65 20 63 68 61 6e 67     ** file chang
160c0 65 64 2e 20 20 49 66 20 74 68 65 20 74 72 61 6e  ed.  If the tran
160d0 73 61 63 74 69 6f 6e 20 63 6f 75 6e 74 65 72 20  saction counter 
160e0 69 73 20 6e 6f 74 20 75 70 64 61 74 65 64 2c 0a  is not updated,.
160f0 20 20 20 20 2a 2a 20 6f 74 68 65 72 20 63 6f 6e      ** other con
16100 6e 65 63 74 69 6f 6e 73 20 74 6f 20 74 68 65 20  nections to the 
16110 73 61 6d 65 20 66 69 6c 65 20 6d 69 67 68 74 20  same file might 
16120 6e 6f 74 20 72 65 61 6c 69 7a 65 20 74 68 61 74  not realize that
16130 0a 20 20 20 20 2a 2a 20 74 68 65 20 66 69 6c 65  .    ** the file
16140 20 68 61 73 20 63 68 61 6e 67 65 64 20 61 6e 64   has changed and
16150 20 68 65 6e 63 65 20 6d 69 67 68 74 20 6e 6f 74   hence might not
16160 20 6b 6e 6f 77 20 74 6f 20 66 6c 75 73 68 20 74   know to flush t
16170 68 65 69 72 0a 20 20 20 20 2a 2a 20 63 61 63 68  heir.    ** cach
16180 65 2e 20 20 54 68 65 20 75 73 65 20 6f 66 20 61  e.  The use of a
16190 20 73 74 61 6c 65 20 63 61 63 68 65 20 63 61 6e   stale cache can
161a0 20 6c 65 61 64 20 74 6f 20 64 61 74 61 62 61 73   lead to databas
161b0 65 20 63 6f 72 72 75 70 74 69 6f 6e 2e 0a 20 20  e corruption..  
161c0 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28    */.    assert(
161d0 20 70 46 69 6c 65 2d 3e 69 6e 4e 6f 72 6d 61 6c   pFile->inNormal
161e0 57 72 69 74 65 3d 3d 30 0a 20 20 20 20 20 20 20  Write==0.       
161f0 20 20 20 20 7c 7c 20 70 46 69 6c 65 2d 3e 64 62      || pFile->db
16200 55 70 64 61 74 65 3d 3d 30 0a 20 20 20 20 20 20  Update==0.      
16210 20 20 20 20 20 7c 7c 20 70 46 69 6c 65 2d 3e 74       || pFile->t
16220 72 61 6e 73 43 6e 74 72 43 68 6e 67 3d 3d 31 20  ransCntrChng==1 
16230 29 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 69 6e  );.    pFile->in
16240 4e 6f 72 6d 61 6c 57 72 69 74 65 20 3d 20 30 3b  NormalWrite = 0;
16250 0a 23 65 6e 64 69 66 0a 20 20 20 20 0a 20 20 20  .#endif.    .   
16260 20 69 66 28 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b   if( pFile->lock
16270 74 79 70 65 3d 3d 45 58 43 4c 55 53 49 56 45 5f  type==EXCLUSIVE_
16280 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 20 20 72 63  LOCK ){.      rc
16290 20 3d 20 61 66 70 53 65 74 4c 6f 63 6b 28 63 6f   = afpSetLock(co
162a0 6e 74 65 78 74 2d 3e 64 62 50 61 74 68 2c 20 70  ntext->dbPath, p
162b0 46 69 6c 65 2c 20 53 48 41 52 45 44 5f 46 49 52  File, SHARED_FIR
162c0 53 54 2c 20 53 48 41 52 45 44 5f 53 49 5a 45 2c  ST, SHARED_SIZE,
162d0 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72   0);.      if( r
162e0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
162f0 28 6c 6f 63 6b 74 79 70 65 3d 3d 53 48 41 52 45  (locktype==SHARE
16300 44 5f 4c 4f 43 4b 20 7c 7c 20 70 4c 6f 63 6b 2d  D_LOCK || pLock-
16310 3e 63 6e 74 3e 31 29 20 29 7b 0a 20 20 20 20 20  >cnt>1) ){.     
16320 20 20 20 2f 2a 20 6f 6e 6c 79 20 72 65 2d 65 73     /* only re-es
16330 74 61 62 6c 69 73 68 20 74 68 65 20 73 68 61 72  tablish the shar
16340 65 64 20 6c 6f 63 6b 20 69 66 20 6e 65 63 65 73  ed lock if neces
16350 73 61 72 79 20 2a 2f 0a 20 20 20 20 20 20 20 20  sary */.        
16360 69 6e 74 20 73 68 61 72 65 64 4c 6f 63 6b 42 79  int sharedLockBy
16370 74 65 20 3d 20 53 48 41 52 45 44 5f 46 49 52 53  te = SHARED_FIRS
16380 54 2b 70 4c 6f 63 6b 2d 3e 73 68 61 72 65 64 42  T+pLock->sharedB
16390 79 74 65 3b 0a 20 20 20 20 20 20 20 20 72 63 20  yte;.        rc 
163a0 3d 20 61 66 70 53 65 74 4c 6f 63 6b 28 63 6f 6e  = afpSetLock(con
163b0 74 65 78 74 2d 3e 64 62 50 61 74 68 2c 20 70 46  text->dbPath, pF
163c0 69 6c 65 2c 20 73 68 61 72 65 64 4c 6f 63 6b 42  ile, sharedLockB
163d0 79 74 65 2c 20 31 2c 20 31 29 3b 0a 20 20 20 20  yte, 1, 1);.    
163e0 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 20    } else {.     
163f0 20 20 20 73 6b 69 70 53 68 61 72 65 64 20 3d 20     skipShared = 
16400 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  1;.      }.    }
16410 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
16420 49 54 45 5f 4f 4b 20 26 26 20 70 46 69 6c 65 2d  ITE_OK && pFile-
16430 3e 6c 6f 63 6b 74 79 70 65 3e 3d 50 45 4e 44 49  >locktype>=PENDI
16440 4e 47 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 20  NG_LOCK ){.     
16450 20 72 63 20 3d 20 61 66 70 53 65 74 4c 6f 63 6b   rc = afpSetLock
16460 28 63 6f 6e 74 65 78 74 2d 3e 64 62 50 61 74 68  (context->dbPath
16470 2c 20 70 46 69 6c 65 2c 20 50 45 4e 44 49 4e 47  , pFile, PENDING
16480 5f 42 59 54 45 2c 20 31 2c 20 30 29 3b 0a 20 20  _BYTE, 1, 0);.  
16490 20 20 7d 20 0a 20 20 20 20 69 66 28 20 72 63 3d    } .    if( rc=
164a0 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 46  =SQLITE_OK && pF
164b0 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3e 3d 52  ile->locktype>=R
164c0 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 26 26 20  ESERVED_LOCK && 
164d0 63 6f 6e 74 65 78 74 2d 3e 72 65 73 65 72 76 65  context->reserve
164e0 64 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  d ){.      rc = 
164f0 61 66 70 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65  afpSetLock(conte
16500 78 74 2d 3e 64 62 50 61 74 68 2c 20 70 46 69 6c  xt->dbPath, pFil
16510 65 2c 20 52 45 53 45 52 56 45 44 5f 42 59 54 45  e, RESERVED_BYTE
16520 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 69  , 1, 0);.      i
16530 66 28 20 21 72 63 20 29 7b 20 0a 20 20 20 20 20  f( !rc ){ .     
16540 20 20 20 63 6f 6e 74 65 78 74 2d 3e 72 65 73 65     context->rese
16550 72 76 65 64 20 3d 20 30 3b 20 0a 20 20 20 20 20  rved = 0; .     
16560 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28   }.    }.    if(
16570 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
16580 26 20 28 6c 6f 63 6b 74 79 70 65 3d 3d 53 48 41  & (locktype==SHA
16590 52 45 44 5f 4c 4f 43 4b 20 7c 7c 20 70 4c 6f 63  RED_LOCK || pLoc
165a0 6b 2d 3e 63 6e 74 3e 31 29 29 7b 0a 20 20 20 20  k->cnt>1)){.    
165b0 20 20 70 4c 6f 63 6b 2d 3e 6c 6f 63 6b 74 79 70    pLock->locktyp
165c0 65 20 3d 20 53 48 41 52 45 44 5f 4c 4f 43 4b 3b  e = SHARED_LOCK;
165d0 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
165e0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
165f0 26 20 6c 6f 63 6b 74 79 70 65 3d 3d 4e 4f 5f 4c  & locktype==NO_L
16600 4f 43 4b 20 29 7b 0a 0a 20 20 20 20 2f 2a 20 44  OCK ){..    /* D
16610 65 63 72 65 6d 65 6e 74 20 74 68 65 20 73 68 61  ecrement the sha
16620 72 65 64 20 6c 6f 63 6b 20 63 6f 75 6e 74 65 72  red lock counter
16630 2e 20 20 52 65 6c 65 61 73 65 20 74 68 65 20 6c  .  Release the l
16640 6f 63 6b 20 75 73 69 6e 67 20 61 6e 0a 20 20 20  ock using an.   
16650 20 2a 2a 20 4f 53 20 63 61 6c 6c 20 6f 6e 6c 79   ** OS call only
16660 20 77 68 65 6e 20 61 6c 6c 20 74 68 72 65 61 64   when all thread
16670 73 20 69 6e 20 74 68 69 73 20 73 61 6d 65 20 70  s in this same p
16680 72 6f 63 65 73 73 20 68 61 76 65 20 72 65 6c 65  rocess have rele
16690 61 73 65 64 0a 20 20 20 20 2a 2a 20 74 68 65 20  ased.    ** the 
166a0 6c 6f 63 6b 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  lock..    */.   
166b0 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6c   unsigned long l
166c0 6f 6e 67 20 73 68 61 72 65 64 4c 6f 63 6b 42 79  ong sharedLockBy
166d0 74 65 20 3d 20 53 48 41 52 45 44 5f 46 49 52 53  te = SHARED_FIRS
166e0 54 2b 70 4c 6f 63 6b 2d 3e 73 68 61 72 65 64 42  T+pLock->sharedB
166f0 79 74 65 3b 0a 20 20 20 20 70 4c 6f 63 6b 2d 3e  yte;.    pLock->
16700 63 6e 74 2d 2d 3b 0a 20 20 20 20 69 66 28 20 70  cnt--;.    if( p
16710 4c 6f 63 6b 2d 3e 63 6e 74 3d 3d 30 20 29 7b 0a  Lock->cnt==0 ){.
16720 20 20 20 20 20 20 53 69 6d 75 6c 61 74 65 49 4f        SimulateIO
16730 45 72 72 6f 72 42 65 6e 69 67 6e 28 31 29 3b 0a  ErrorBenign(1);.
16740 20 20 20 20 20 20 53 69 6d 75 6c 61 74 65 49 4f        SimulateIO
16750 45 72 72 6f 72 28 20 68 3d 28 2d 31 29 20 29 0a  Error( h=(-1) ).
16760 20 20 20 20 20 20 53 69 6d 75 6c 61 74 65 49 4f        SimulateIO
16770 45 72 72 6f 72 42 65 6e 69 67 6e 28 30 29 3b 0a  ErrorBenign(0);.
16780 20 20 20 20 20 20 69 66 28 20 21 73 6b 69 70 53        if( !skipS
16790 68 61 72 65 64 20 29 7b 0a 20 20 20 20 20 20 20  hared ){.       
167a0 20 72 63 20 3d 20 61 66 70 53 65 74 4c 6f 63 6b   rc = afpSetLock
167b0 28 63 6f 6e 74 65 78 74 2d 3e 64 62 50 61 74 68  (context->dbPath
167c0 2c 20 70 46 69 6c 65 2c 20 73 68 61 72 65 64 4c  , pFile, sharedL
167d0 6f 63 6b 42 79 74 65 2c 20 31 2c 20 30 29 3b 0a  ockByte, 1, 0);.
167e0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
167f0 28 20 21 72 63 20 29 7b 0a 20 20 20 20 20 20 20  ( !rc ){.       
16800 20 70 4c 6f 63 6b 2d 3e 6c 6f 63 6b 74 79 70 65   pLock->locktype
16810 20 3d 20 4e 4f 5f 4c 4f 43 4b 3b 0a 20 20 20 20   = NO_LOCK;.    
16820 20 20 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74      pFile->lockt
16830 79 70 65 20 3d 20 4e 4f 5f 4c 4f 43 4b 3b 0a 20  ype = NO_LOCK;. 
16840 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
16850 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
16860 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73 74 72 75  OK ){.      stru
16870 63 74 20 75 6e 69 78 4f 70 65 6e 43 6e 74 20 2a  ct unixOpenCnt *
16880 70 4f 70 65 6e 20 3d 20 70 46 69 6c 65 2d 3e 70  pOpen = pFile->p
16890 4f 70 65 6e 3b 0a 20 20 20 20 20 20 20 20 0a 20  Open;.        . 
168a0 20 20 20 20 20 70 4f 70 65 6e 2d 3e 6e 4c 6f 63       pOpen->nLoc
168b0 6b 2d 2d 3b 0a 20 20 20 20 20 20 61 73 73 65 72  k--;.      asser
168c0 74 28 20 70 4f 70 65 6e 2d 3e 6e 4c 6f 63 6b 3e  t( pOpen->nLock>
168d0 3d 30 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  =0 );.      if( 
168e0 70 4f 70 65 6e 2d 3e 6e 4c 6f 63 6b 3d 3d 30 20  pOpen->nLock==0 
168f0 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
16900 63 6c 6f 73 65 50 65 6e 64 69 6e 67 46 64 73 28  closePendingFds(
16910 70 46 69 6c 65 29 3b 0a 20 20 20 20 20 20 7d 0a  pFile);.      }.
16920 20 20 20 20 7d 0a 20 20 7d 0a 20 20 0a 20 20 75      }.  }.  .  u
16930 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b  nixLeaveMutex();
16940 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
16950 45 5f 4f 4b 20 29 20 70 46 69 6c 65 2d 3e 6c 6f  E_OK ) pFile->lo
16960 63 6b 74 79 70 65 20 3d 20 6c 6f 63 6b 74 79 70  cktype = locktyp
16970 65 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  e;.  return rc;.
16980 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61  }../*.** Close a
16990 20 66 69 6c 65 20 26 20 63 6c 65 61 6e 75 70 20   file & cleanup 
169a0 41 46 50 20 73 70 65 63 69 66 69 63 20 6c 6f 63  AFP specific loc
169b0 6b 69 6e 67 20 63 6f 6e 74 65 78 74 20 0a 2a 2f  king context .*/
169c0 0a 73 74 61 74 69 63 20 69 6e 74 20 61 66 70 43  .static int afpC
169d0 6c 6f 73 65 28 73 71 6c 69 74 65 33 5f 66 69 6c  lose(sqlite3_fil
169e0 65 20 2a 69 64 29 20 7b 0a 20 20 69 6e 74 20 72  e *id) {.  int r
169f0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
16a00 20 69 66 28 20 69 64 20 29 7b 0a 20 20 20 20 75   if( id ){.    u
16a10 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d  nixFile *pFile =
16a20 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a   (unixFile*)id;.
16a30 20 20 20 20 61 66 70 55 6e 6c 6f 63 6b 28 69 64      afpUnlock(id
16a40 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20  , NO_LOCK);.    
16a50 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29  unixEnterMutex()
16a60 3b 0a 20 20 20 20 69 66 28 20 70 46 69 6c 65 2d  ;.    if( pFile-
16a70 3e 70 4f 70 65 6e 20 26 26 20 70 46 69 6c 65 2d  >pOpen && pFile-
16a80 3e 70 4f 70 65 6e 2d 3e 6e 4c 6f 63 6b 20 29 7b  >pOpen->nLock ){
16a90 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65  .      /* If the
16aa0 72 65 20 61 72 65 20 6f 75 74 73 74 61 6e 64 69  re are outstandi
16ab0 6e 67 20 6c 6f 63 6b 73 2c 20 64 6f 20 6e 6f 74  ng locks, do not
16ac0 20 61 63 74 75 61 6c 6c 79 20 63 6c 6f 73 65 20   actually close 
16ad0 74 68 65 20 66 69 6c 65 20 6a 75 73 74 0a 20 20  the file just.  
16ae0 20 20 20 20 2a 2a 20 79 65 74 20 62 65 63 61 75      ** yet becau
16af0 73 65 20 74 68 61 74 20 77 6f 75 6c 64 20 63 6c  se that would cl
16b00 65 61 72 20 74 68 6f 73 65 20 6c 6f 63 6b 73 2e  ear those locks.
16b10 20 20 49 6e 73 74 65 61 64 2c 20 61 64 64 20 74    Instead, add t
16b20 68 65 20 66 69 6c 65 0a 20 20 20 20 20 20 2a 2a  he file.      **
16b30 20 64 65 73 63 72 69 70 74 6f 72 20 74 6f 20 70   descriptor to p
16b40 4f 70 65 6e 2d 3e 61 50 65 6e 64 69 6e 67 2e 20  Open->aPending. 
16b50 20 49 74 20 77 69 6c 6c 20 62 65 20 61 75 74 6f   It will be auto
16b60 6d 61 74 69 63 61 6c 6c 79 20 63 6c 6f 73 65 64  matically closed
16b70 20 77 68 65 6e 0a 20 20 20 20 20 20 2a 2a 20 74   when.      ** t
16b80 68 65 20 6c 61 73 74 20 6c 6f 63 6b 20 69 73 20  he last lock is 
16b90 63 6c 65 61 72 65 64 2e 0a 20 20 20 20 20 20 2a  cleared..      *
16ba0 2f 0a 20 20 20 20 20 20 73 65 74 50 65 6e 64 69  /.      setPendi
16bb0 6e 67 46 64 28 70 46 69 6c 65 29 3b 0a 20 20 20  ngFd(pFile);.   
16bc0 20 7d 0a 20 20 20 20 72 65 6c 65 61 73 65 4c 6f   }.    releaseLo
16bd0 63 6b 49 6e 66 6f 28 70 46 69 6c 65 2d 3e 70 4c  ckInfo(pFile->pL
16be0 6f 63 6b 29 3b 0a 20 20 20 20 72 65 6c 65 61 73  ock);.    releas
16bf0 65 4f 70 65 6e 43 6e 74 28 70 46 69 6c 65 2d 3e  eOpenCnt(pFile->
16c00 70 4f 70 65 6e 29 3b 0a 20 20 20 20 73 71 6c 69  pOpen);.    sqli
16c10 74 65 33 5f 66 72 65 65 28 70 46 69 6c 65 2d 3e  te3_free(pFile->
16c20 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 29 3b  lockingContext);
16c30 0a 20 20 20 20 72 63 20 3d 20 63 6c 6f 73 65 55  .    rc = closeU
16c40 6e 69 78 46 69 6c 65 28 69 64 29 3b 0a 20 20 20  nixFile(id);.   
16c50 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28   unixLeaveMutex(
16c60 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
16c70 72 63 3b 0a 7d 0a 0a 23 65 6e 64 69 66 20 2f 2a  rc;.}..#endif /*
16c80 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45   defined(__APPLE
16c90 5f 5f 29 20 26 26 20 53 51 4c 49 54 45 5f 45 4e  __) && SQLITE_EN
16ca0 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59  ABLE_LOCKING_STY
16cb0 4c 45 20 2a 2f 0a 2f 2a 0a 2a 2a 20 54 68 65 20  LE */./*.** The 
16cc0 63 6f 64 65 20 61 62 6f 76 65 20 69 73 20 74 68  code above is th
16cd0 65 20 41 46 50 20 6c 6f 63 6b 20 69 6d 70 6c 65  e AFP lock imple
16ce0 6d 65 6e 74 61 74 69 6f 6e 2e 20 20 54 68 65 20  mentation.  The 
16cf0 63 6f 64 65 20 69 73 20 73 70 65 63 69 66 69 63  code is specific
16d00 0a 2a 2a 20 74 6f 20 4d 61 63 4f 53 58 20 61 6e  .** to MacOSX an
16d10 64 20 64 6f 65 73 20 6e 6f 74 20 77 6f 72 6b 20  d does not work 
16d20 6f 6e 20 6f 74 68 65 72 20 75 6e 69 78 20 70 6c  on other unix pl
16d30 61 74 66 6f 72 6d 73 2e 20 20 4e 6f 20 61 6c 74  atforms.  No alt
16d40 65 72 6e 61 74 69 76 65 0a 2a 2a 20 69 73 20 61  ernative.** is a
16d50 76 61 69 6c 61 62 6c 65 2e 20 20 49 66 20 79 6f  vailable.  If yo
16d60 75 20 64 6f 6e 27 74 20 63 6f 6d 70 69 6c 65 20  u don't compile 
16d70 66 6f 72 20 61 20 6d 61 63 2c 20 74 68 65 6e 20  for a mac, then 
16d80 74 68 65 20 22 75 6e 69 78 2d 61 66 70 22 0a 2a  the "unix-afp".*
16d90 2a 20 56 46 53 20 69 73 20 6e 6f 74 20 61 76 61  * VFS is not ava
16da0 69 6c 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a  ilable..**.*****
16db0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
16dc0 20 45 6e 64 20 6f 66 20 74 68 65 20 41 46 50 20   End of the AFP 
16dd0 6c 6f 63 6b 20 69 6d 70 6c 65 6d 65 6e 74 61 74  lock implementat
16de0 69 6f 6e 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ion ************
16df0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a  **********.*****
16e00 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
16e10 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
16e20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
16e30 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
16e40 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 2a 2a  *********/../***
16e50 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
16e60 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
16e70 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
16e80 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
16e90 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a  ***********.****
16ea0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
16eb0 2a 2a 2a 2a 2a 2a 2a 20 42 65 67 69 6e 20 4e 46  ******* Begin NF
16ec0 53 20 4c 6f 63 6b 69 6e 67 20 2a 2a 2a 2a 2a 2a  S Locking ******
16ed0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
16ee0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 23 69 66  **********/..#if
16ef0 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45   defined(__APPLE
16f00 5f 5f 29 20 26 26 20 53 51 4c 49 54 45 5f 45 4e  __) && SQLITE_EN
16f10 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59  ABLE_LOCKING_STY
16f20 4c 45 0a 2f 2a 0a 20 2a 2a 20 4c 6f 77 65 72 20  LE./*. ** Lower 
16f30 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65  the locking leve
16f40 6c 20 6f 6e 20 66 69 6c 65 20 64 65 73 63 72 69  l on file descri
16f50 70 74 6f 72 20 70 46 69 6c 65 20 74 6f 20 6c 6f  ptor pFile to lo
16f60 63 6b 74 79 70 65 2e 20 20 6c 6f 63 6b 74 79 70  cktype.  locktyp
16f70 65 0a 20 2a 2a 20 6d 75 73 74 20 62 65 20 65 69  e. ** must be ei
16f80 74 68 65 72 20 4e 4f 5f 4c 4f 43 4b 20 6f 72 20  ther NO_LOCK or 
16f90 53 48 41 52 45 44 5f 4c 4f 43 4b 2e 0a 20 2a 2a  SHARED_LOCK.. **
16fa0 0a 20 2a 2a 20 49 66 20 74 68 65 20 6c 6f 63 6b  . ** If the lock
16fb0 69 6e 67 20 6c 65 76 65 6c 20 6f 66 20 74 68 65  ing level of the
16fc0 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
16fd0 20 69 73 20 61 6c 72 65 61 64 79 20 61 74 20 6f   is already at o
16fe0 72 20 62 65 6c 6f 77 0a 20 2a 2a 20 74 68 65 20  r below. ** the 
16ff0 72 65 71 75 65 73 74 65 64 20 6c 6f 63 6b 69 6e  requested lockin
17000 67 20 6c 65 76 65 6c 2c 20 74 68 69 73 20 72 6f  g level, this ro
17010 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70  utine is a no-op
17020 2e 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  .. */.static int
17030 20 6e 66 73 55 6e 6c 6f 63 6b 28 73 71 6c 69 74   nfsUnlock(sqlit
17040 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74  e3_file *id, int
17050 20 6c 6f 63 6b 74 79 70 65 29 7b 0a 20 20 72 65   locktype){.  re
17060 74 75 72 6e 20 5f 70 6f 73 69 78 55 6e 6c 6f 63  turn _posixUnloc
17070 6b 28 69 64 2c 20 6c 6f 63 6b 74 79 70 65 2c 20  k(id, locktype, 
17080 31 29 3b 0a 7d 0a 0a 23 65 6e 64 69 66 20 2f 2a  1);.}..#endif /*
17090 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45   defined(__APPLE
170a0 5f 5f 29 20 26 26 20 53 51 4c 49 54 45 5f 45 4e  __) && SQLITE_EN
170b0 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59  ABLE_LOCKING_STY
170c0 4c 45 20 2a 2f 0a 2f 2a 0a 2a 2a 20 54 68 65 20  LE */./*.** The 
170d0 63 6f 64 65 20 61 62 6f 76 65 20 69 73 20 74 68  code above is th
170e0 65 20 4e 46 53 20 6c 6f 63 6b 20 69 6d 70 6c 65  e NFS lock imple
170f0 6d 65 6e 74 61 74 69 6f 6e 2e 20 20 54 68 65 20  mentation.  The 
17100 63 6f 64 65 20 69 73 20 73 70 65 63 69 66 69 63  code is specific
17110 0a 2a 2a 20 74 6f 20 4d 61 63 4f 53 58 20 61 6e  .** to MacOSX an
17120 64 20 64 6f 65 73 20 6e 6f 74 20 77 6f 72 6b 20  d does not work 
17130 6f 6e 20 6f 74 68 65 72 20 75 6e 69 78 20 70 6c  on other unix pl
17140 61 74 66 6f 72 6d 73 2e 20 20 4e 6f 20 61 6c 74  atforms.  No alt
17150 65 72 6e 61 74 69 76 65 0a 2a 2a 20 69 73 20 61  ernative.** is a
17160 76 61 69 6c 61 62 6c 65 2e 20 20 0a 2a 2a 0a 2a  vailable.  .**.*
17170 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
17180 2a 2a 2a 2a 20 45 6e 64 20 6f 66 20 74 68 65 20  **** End of the 
17190 4e 46 53 20 6c 6f 63 6b 20 69 6d 70 6c 65 6d 65  NFS lock impleme
171a0 6e 74 61 74 69 6f 6e 20 2a 2a 2a 2a 2a 2a 2a 2a  ntation ********
171b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a  **************.*
171c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
171d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
171e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
171f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
17200 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a  *************/..
17210 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  /***************
17220 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
17230 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
17240 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
17250 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a  ***************.
17260 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
17270 20 4e 6f 6e 2d 6c 6f 63 6b 69 6e 67 20 73 71 6c   Non-locking sql
17280 69 74 65 33 5f 66 69 6c 65 20 6d 65 74 68 6f 64  ite3_file method
17290 73 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  s **************
172a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a  ***************.
172b0 2a 2a 0a 2a 2a 20 54 68 65 20 6e 65 78 74 20 64  **.** The next d
172c0 69 76 69 73 69 6f 6e 20 63 6f 6e 74 61 69 6e 73  ivision contains
172d0 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 73   implementations
172e0 20 66 6f 72 20 61 6c 6c 20 6d 65 74 68 6f 64 73   for all methods
172f0 20 6f 66 20 74 68 65 20 0a 2a 2a 20 73 71 6c 69   of the .** sqli
17300 74 65 33 5f 66 69 6c 65 20 6f 62 6a 65 63 74 20  te3_file object 
17310 6f 74 68 65 72 20 74 68 61 6e 20 74 68 65 20 6c  other than the l
17320 6f 63 6b 69 6e 67 20 6d 65 74 68 6f 64 73 2e 20  ocking methods. 
17330 20 54 68 65 20 6c 6f 63 6b 69 6e 67 0a 2a 2a 20   The locking.** 
17340 6d 65 74 68 6f 64 73 20 77 65 72 65 20 64 65 66  methods were def
17350 69 6e 65 64 20 69 6e 20 64 69 76 69 73 69 6f 6e  ined in division
17360 73 20 61 62 6f 76 65 20 28 6f 6e 65 20 6c 6f 63  s above (one loc
17370 6b 69 6e 67 20 6d 65 74 68 6f 64 20 70 65 72 0a  king method per.
17380 2a 2a 20 64 69 76 69 73 69 6f 6e 29 2e 20 20 54  ** division).  T
17390 68 6f 73 65 20 6d 65 74 68 6f 64 73 20 74 68 61  hose methods tha
173a0 74 20 61 72 65 20 63 6f 6d 6d 6f 6e 20 74 6f 20  t are common to 
173b0 61 6c 6c 20 6c 6f 63 6b 69 6e 67 20 6d 6f 64 65  all locking mode
173c0 73 0a 2a 2a 20 61 72 65 20 67 61 74 68 65 72 20  s.** are gather 
173d0 74 6f 67 65 74 68 65 72 20 69 6e 74 6f 20 74 68  together into th
173e0 69 73 20 64 69 76 69 73 69 6f 6e 2e 0a 2a 2f 0a  is division..*/.
173f0 0a 2f 2a 0a 2a 2a 20 53 65 65 6b 20 74 6f 20 74  ./*.** Seek to t
17400 68 65 20 6f 66 66 73 65 74 20 70 61 73 73 65 64  he offset passed
17410 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61   as the second a
17420 72 67 75 6d 65 6e 74 2c 20 74 68 65 6e 20 72 65  rgument, then re
17430 61 64 20 63 6e 74 20 0a 2a 2a 20 62 79 74 65 73  ad cnt .** bytes
17440 20 69 6e 74 6f 20 70 42 75 66 2e 20 52 65 74 75   into pBuf. Retu
17450 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  rn the number of
17460 20 62 79 74 65 73 20 61 63 74 75 61 6c 6c 79 20   bytes actually 
17470 72 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 4e 42 3a 20  read..**.** NB: 
17480 20 49 66 20 79 6f 75 20 64 65 66 69 6e 65 20 55   If you define U
17490 53 45 5f 50 52 45 41 44 20 6f 72 20 55 53 45 5f  SE_PREAD or USE_
174a0 50 52 45 41 44 36 34 2c 20 74 68 65 6e 20 69 74  PREAD64, then it
174b0 20 6d 69 67 68 74 20 61 6c 73 6f 0a 2a 2a 20 62   might also.** b
174c0 65 20 6e 65 63 65 73 73 61 72 79 20 74 6f 20 64  e necessary to d
174d0 65 66 69 6e 65 20 5f 58 4f 50 45 4e 5f 53 4f 55  efine _XOPEN_SOU
174e0 52 43 45 20 74 6f 20 62 65 20 35 30 30 2e 20 20  RCE to be 500.  
174f0 54 68 69 73 20 76 61 72 69 65 73 20 66 72 6f 6d  This varies from
17500 0a 2a 2a 20 6f 6e 65 20 73 79 73 74 65 6d 20 74  .** one system t
17510 6f 20 61 6e 6f 74 68 65 72 2e 20 20 53 69 6e 63  o another.  Sinc
17520 65 20 53 51 4c 69 74 65 20 64 6f 65 73 20 6e 6f  e SQLite does no
17530 74 20 64 65 66 69 6e 65 20 55 53 45 5f 50 52 45  t define USE_PRE
17540 41 44 0a 2a 2a 20 61 6e 79 20 61 6e 79 20 66 6f  AD.** any any fo
17550 72 6d 20 62 79 20 64 65 66 61 75 6c 74 2c 20 77  rm by default, w
17560 65 20 77 69 6c 6c 20 6e 6f 74 20 61 74 74 65 6d  e will not attem
17570 70 74 20 74 6f 20 64 65 66 69 6e 65 20 5f 58 4f  pt to define _XO
17580 50 45 4e 5f 53 4f 55 52 43 45 2e 0a 2a 2a 20 53  PEN_SOURCE..** S
17590 65 65 20 74 69 63 6b 65 74 73 20 23 32 37 34 31  ee tickets #2741
175a0 20 61 6e 64 20 23 32 36 38 31 2e 0a 2a 2a 0a 2a   and #2681..**.*
175b0 2a 20 54 6f 20 61 76 6f 69 64 20 73 74 6f 6d 70  * To avoid stomp
175c0 69 6e 67 20 74 68 65 20 65 72 72 6e 6f 20 76 61  ing the errno va
175d0 6c 75 65 20 6f 6e 20 61 20 66 61 69 6c 65 64 20  lue on a failed 
175e0 72 65 61 64 20 74 68 65 20 6c 61 73 74 45 72 72  read the lastErr
175f0 6e 6f 20 76 61 6c 75 65 0a 2a 2a 20 69 73 20 73  no value.** is s
17600 65 74 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e  et before return
17610 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ing..*/.static i
17620 6e 74 20 73 65 65 6b 41 6e 64 52 65 61 64 28 75  nt seekAndRead(u
17630 6e 69 78 46 69 6c 65 20 2a 69 64 2c 20 73 71 6c  nixFile *id, sql
17640 69 74 65 33 5f 69 6e 74 36 34 20 6f 66 66 73 65  ite3_int64 offse
17650 74 2c 20 76 6f 69 64 20 2a 70 42 75 66 2c 20 69  t, void *pBuf, i
17660 6e 74 20 63 6e 74 29 7b 0a 20 20 69 6e 74 20 67  nt cnt){.  int g
17670 6f 74 3b 0a 23 69 66 20 28 21 64 65 66 69 6e 65  ot;.#if (!define
17680 64 28 55 53 45 5f 50 52 45 41 44 29 20 26 26 20  d(USE_PREAD) && 
17690 21 64 65 66 69 6e 65 64 28 55 53 45 5f 50 52 45  !defined(USE_PRE
176a0 41 44 36 34 29 29 0a 20 20 69 36 34 20 6e 65 77  AD64)).  i64 new
176b0 4f 66 66 73 65 74 3b 0a 23 65 6e 64 69 66 0a 20  Offset;.#endif. 
176c0 20 54 49 4d 45 52 5f 53 54 41 52 54 3b 0a 23 69   TIMER_START;.#i
176d0 66 20 64 65 66 69 6e 65 64 28 55 53 45 5f 50 52  f defined(USE_PR
176e0 45 41 44 29 0a 20 20 67 6f 74 20 3d 20 70 72 65  EAD).  got = pre
176f0 61 64 28 69 64 2d 3e 68 2c 20 70 42 75 66 2c 20  ad(id->h, pBuf, 
17700 63 6e 74 2c 20 6f 66 66 73 65 74 29 3b 0a 20 20  cnt, offset);.  
17710 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28  SimulateIOError(
17720 20 67 6f 74 20 3d 20 2d 31 20 29 3b 0a 23 65 6c   got = -1 );.#el
17730 69 66 20 64 65 66 69 6e 65 64 28 55 53 45 5f 50  if defined(USE_P
17740 52 45 41 44 36 34 29 0a 20 20 67 6f 74 20 3d 20  READ64).  got = 
17750 70 72 65 61 64 36 34 28 69 64 2d 3e 68 2c 20 70  pread64(id->h, p
17760 42 75 66 2c 20 63 6e 74 2c 20 6f 66 66 73 65 74  Buf, cnt, offset
17770 29 3b 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45  );.  SimulateIOE
17780 72 72 6f 72 28 20 67 6f 74 20 3d 20 2d 31 20 29  rror( got = -1 )
17790 3b 0a 23 65 6c 73 65 0a 20 20 6e 65 77 4f 66 66  ;.#else.  newOff
177a0 73 65 74 20 3d 20 6c 73 65 65 6b 28 69 64 2d 3e  set = lseek(id->
177b0 68 2c 20 6f 66 66 73 65 74 2c 20 53 45 45 4b 5f  h, offset, SEEK_
177c0 53 45 54 29 3b 0a 20 20 53 69 6d 75 6c 61 74 65  SET);.  Simulate
177d0 49 4f 45 72 72 6f 72 28 20 6e 65 77 4f 66 66 73  IOError( newOffs
177e0 65 74 2d 2d 20 29 3b 0a 20 20 69 66 28 20 6e 65  et-- );.  if( ne
177f0 77 4f 66 66 73 65 74 21 3d 6f 66 66 73 65 74 20  wOffset!=offset 
17800 29 7b 0a 20 20 20 20 69 66 28 20 6e 65 77 4f 66  ){.    if( newOf
17810 66 73 65 74 20 3d 3d 20 2d 31 20 29 7b 0a 20 20  fset == -1 ){.  
17820 20 20 20 20 28 28 75 6e 69 78 46 69 6c 65 2a 29      ((unixFile*)
17830 69 64 29 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d  id)->lastErrno =
17840 20 65 72 72 6e 6f 3b 0a 20 20 20 20 7d 65 6c 73   errno;.    }els
17850 65 7b 0a 20 20 20 20 20 20 28 28 75 6e 69 78 46  e{.      ((unixF
17860 69 6c 65 2a 29 69 64 29 2d 3e 6c 61 73 74 45 72  ile*)id)->lastEr
17870 72 6e 6f 20 3d 20 30 3b 09 09 09 0a 20 20 20 20  rno = 0;....    
17880 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 2d 31 3b  }.    return -1;
17890 0a 20 20 7d 0a 20 20 67 6f 74 20 3d 20 72 65 61  .  }.  got = rea
178a0 64 28 69 64 2d 3e 68 2c 20 70 42 75 66 2c 20 63  d(id->h, pBuf, c
178b0 6e 74 29 3b 0a 23 65 6e 64 69 66 0a 20 20 54 49  nt);.#endif.  TI
178c0 4d 45 52 5f 45 4e 44 3b 0a 20 20 69 66 28 20 67  MER_END;.  if( g
178d0 6f 74 3c 30 20 29 7b 0a 20 20 20 20 28 28 75 6e  ot<0 ){.    ((un
178e0 69 78 46 69 6c 65 2a 29 69 64 29 2d 3e 6c 61 73  ixFile*)id)->las
178f0 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a  tErrno = errno;.
17900 20 20 7d 0a 20 20 4f 53 54 52 41 43 45 35 28 22    }.  OSTRACE5("
17910 52 45 41 44 20 20 20 20 25 2d 33 64 20 25 35 64  READ    %-3d %5d
17920 20 25 37 6c 6c 64 20 25 6c 6c 75 5c 6e 22 2c 20   %7lld %llu\n", 
17930 69 64 2d 3e 68 2c 20 67 6f 74 2c 20 6f 66 66 73  id->h, got, offs
17940 65 74 2c 20 54 49 4d 45 52 5f 45 4c 41 50 53 45  et, TIMER_ELAPSE
17950 44 29 3b 0a 20 20 72 65 74 75 72 6e 20 67 6f 74  D);.  return got
17960 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20  ;.}../*.** Read 
17970 64 61 74 61 20 66 72 6f 6d 20 61 20 66 69 6c 65  data from a file
17980 20 69 6e 74 6f 20 61 20 62 75 66 66 65 72 2e 20   into a buffer. 
17990 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   Return SQLITE_O
179a0 4b 20 69 66 20 61 6c 6c 0a 2a 2a 20 62 79 74 65  K if all.** byte
179b0 73 20 77 65 72 65 20 72 65 61 64 20 73 75 63 63  s were read succ
179c0 65 73 73 66 75 6c 6c 79 20 61 6e 64 20 53 51 4c  essfully and SQL
179d0 49 54 45 5f 49 4f 45 52 52 20 69 66 20 61 6e 79  ITE_IOERR if any
179e0 74 68 69 6e 67 20 67 6f 65 73 0a 2a 2a 20 77 72  thing goes.** wr
179f0 6f 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ong..*/.static i
17a00 6e 74 20 75 6e 69 78 52 65 61 64 28 0a 20 20 73  nt unixRead(.  s
17a10 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c  qlite3_file *id,
17a20 20 0a 20 20 76 6f 69 64 20 2a 70 42 75 66 2c 20   .  void *pBuf, 
17a30 0a 20 20 69 6e 74 20 61 6d 74 2c 0a 20 20 73 71  .  int amt,.  sq
17a40 6c 69 74 65 33 5f 69 6e 74 36 34 20 6f 66 66 73  lite3_int64 offs
17a50 65 74 0a 29 7b 0a 20 20 75 6e 69 78 46 69 6c 65  et.){.  unixFile
17a60 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46   *pFile = (unixF
17a70 69 6c 65 20 2a 29 69 64 3b 0a 20 20 69 6e 74 20  ile *)id;.  int 
17a80 67 6f 74 3b 0a 20 20 61 73 73 65 72 74 28 20 69  got;.  assert( i
17a90 64 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68  d );..  /* If th
17aa0 69 73 20 69 73 20 61 20 64 61 74 61 62 61 73 65  is is a database
17ab0 20 66 69 6c 65 20 28 6e 6f 74 20 61 20 6a 6f 75   file (not a jou
17ac0 72 6e 61 6c 2c 20 6d 61 73 74 65 72 2d 6a 6f 75  rnal, master-jou
17ad0 72 6e 61 6c 20 6f 72 20 74 65 6d 70 0a 20 20 2a  rnal or temp.  *
17ae0 2a 20 66 69 6c 65 29 2c 20 74 68 65 20 62 79 74  * file), the byt
17af0 65 73 20 69 6e 20 74 68 65 20 6c 6f 63 6b 69 6e  es in the lockin
17b00 67 20 72 61 6e 67 65 20 73 68 6f 75 6c 64 20 6e  g range should n
17b10 65 76 65 72 20 62 65 20 72 65 61 64 20 6f 72 20  ever be read or 
17b20 77 72 69 74 74 65 6e 2e 20 2a 2f 0a 23 69 66 20  written. */.#if 
17b30 30 0a 20 20 61 73 73 65 72 74 28 20 70 46 69 6c  0.  assert( pFil
17b40 65 2d 3e 70 55 6e 75 73 65 64 3d 3d 30 0a 20 20  e->pUnused==0.  
17b50 20 20 20 20 20 7c 7c 20 6f 66 66 73 65 74 3e 3d       || offset>=
17b60 50 45 4e 44 49 4e 47 5f 42 59 54 45 2b 35 31 32  PENDING_BYTE+512
17b70 0a 20 20 20 20 20 20 20 7c 7c 20 6f 66 66 73 65  .       || offse
17b80 74 2b 61 6d 74 3c 3d 50 45 4e 44 49 4e 47 5f 42  t+amt<=PENDING_B
17b90 59 54 45 20 0a 20 20 29 3b 0a 23 65 6e 64 69 66  YTE .  );.#endif
17ba0 0a 0a 20 20 67 6f 74 20 3d 20 73 65 65 6b 41 6e  ..  got = seekAn
17bb0 64 52 65 61 64 28 70 46 69 6c 65 2c 20 6f 66 66  dRead(pFile, off
17bc0 73 65 74 2c 20 70 42 75 66 2c 20 61 6d 74 29 3b  set, pBuf, amt);
17bd0 0a 20 20 69 66 28 20 67 6f 74 3d 3d 61 6d 74 20  .  if( got==amt 
17be0 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
17bf0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65  LITE_OK;.  }else
17c00 20 69 66 28 20 67 6f 74 3c 30 20 29 7b 0a 20 20   if( got<0 ){.  
17c10 20 20 2f 2a 20 6c 61 73 74 45 72 72 6e 6f 20 73    /* lastErrno s
17c20 65 74 20 62 79 20 73 65 65 6b 41 6e 64 52 65 61  et by seekAndRea
17c30 64 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20  d */.    return 
17c40 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 52 45 41  SQLITE_IOERR_REA
17c50 44 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  D;.  }else{.    
17c60 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f  pFile->lastErrno
17c70 20 3d 20 30 3b 20 2f 2a 20 6e 6f 74 20 61 20 73   = 0; /* not a s
17c80 79 73 74 65 6d 20 65 72 72 6f 72 20 2a 2f 0a 20  ystem error */. 
17c90 20 20 20 2f 2a 20 55 6e 72 65 61 64 20 70 61 72     /* Unread par
17ca0 74 73 20 6f 66 20 74 68 65 20 62 75 66 66 65 72  ts of the buffer
17cb0 20 6d 75 73 74 20 62 65 20 7a 65 72 6f 2d 66 69   must be zero-fi
17cc0 6c 6c 65 64 20 2a 2f 0a 20 20 20 20 6d 65 6d 73  lled */.    mems
17cd0 65 74 28 26 28 28 63 68 61 72 2a 29 70 42 75 66  et(&((char*)pBuf
17ce0 29 5b 67 6f 74 5d 2c 20 30 2c 20 61 6d 74 2d 67  )[got], 0, amt-g
17cf0 6f 74 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  ot);.    return 
17d00 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f  SQLITE_IOERR_SHO
17d10 52 54 5f 52 45 41 44 3b 0a 20 20 7d 0a 7d 0a 0a  RT_READ;.  }.}..
17d20 2f 2a 0a 2a 2a 20 53 65 65 6b 20 74 6f 20 74 68  /*.** Seek to th
17d30 65 20 6f 66 66 73 65 74 20 69 6e 20 69 64 2d 3e  e offset in id->
17d40 6f 66 66 73 65 74 20 74 68 65 6e 20 72 65 61 64  offset then read
17d50 20 63 6e 74 20 62 79 74 65 73 20 69 6e 74 6f 20   cnt bytes into 
17d60 70 42 75 66 2e 0a 2a 2a 20 52 65 74 75 72 6e 20  pBuf..** Return 
17d70 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79  the number of by
17d80 74 65 73 20 61 63 74 75 61 6c 6c 79 20 72 65 61  tes actually rea
17d90 64 2e 20 20 55 70 64 61 74 65 20 74 68 65 20 6f  d.  Update the o
17da0 66 66 73 65 74 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20  ffset..**.** To 
17db0 61 76 6f 69 64 20 73 74 6f 6d 70 69 6e 67 20 74  avoid stomping t
17dc0 68 65 20 65 72 72 6e 6f 20 76 61 6c 75 65 20 6f  he errno value o
17dd0 6e 20 61 20 66 61 69 6c 65 64 20 77 72 69 74 65  n a failed write
17de0 20 74 68 65 20 6c 61 73 74 45 72 72 6e 6f 20 76   the lastErrno v
17df0 61 6c 75 65 0a 2a 2a 20 69 73 20 73 65 74 20 62  alue.** is set b
17e00 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e  efore returning.
17e10 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73  .*/.static int s
17e20 65 65 6b 41 6e 64 57 72 69 74 65 28 75 6e 69 78  eekAndWrite(unix
17e30 46 69 6c 65 20 2a 69 64 2c 20 69 36 34 20 6f 66  File *id, i64 of
17e40 66 73 65 74 2c 20 63 6f 6e 73 74 20 76 6f 69 64  fset, const void
17e50 20 2a 70 42 75 66 2c 20 69 6e 74 20 63 6e 74 29   *pBuf, int cnt)
17e60 7b 0a 20 20 69 6e 74 20 67 6f 74 3b 0a 23 69 66  {.  int got;.#if
17e70 20 28 21 64 65 66 69 6e 65 64 28 55 53 45 5f 50   (!defined(USE_P
17e80 52 45 41 44 29 20 26 26 20 21 64 65 66 69 6e 65  READ) && !define
17e90 64 28 55 53 45 5f 50 52 45 41 44 36 34 29 29 0a  d(USE_PREAD64)).
17ea0 20 20 69 36 34 20 6e 65 77 4f 66 66 73 65 74 3b    i64 newOffset;
17eb0 0a 23 65 6e 64 69 66 0a 20 20 54 49 4d 45 52 5f  .#endif.  TIMER_
17ec0 53 54 41 52 54 3b 0a 23 69 66 20 64 65 66 69 6e  START;.#if defin
17ed0 65 64 28 55 53 45 5f 50 52 45 41 44 29 0a 20 20  ed(USE_PREAD).  
17ee0 67 6f 74 20 3d 20 70 77 72 69 74 65 28 69 64 2d  got = pwrite(id-
17ef0 3e 68 2c 20 70 42 75 66 2c 20 63 6e 74 2c 20 6f  >h, pBuf, cnt, o
17f00 66 66 73 65 74 29 3b 0a 23 65 6c 69 66 20 64 65  ffset);.#elif de
17f10 66 69 6e 65 64 28 55 53 45 5f 50 52 45 41 44 36  fined(USE_PREAD6
17f20 34 29 0a 20 20 67 6f 74 20 3d 20 70 77 72 69 74  4).  got = pwrit
17f30 65 36 34 28 69 64 2d 3e 68 2c 20 70 42 75 66 2c  e64(id->h, pBuf,
17f40 20 63 6e 74 2c 20 6f 66 66 73 65 74 29 3b 0a 23   cnt, offset);.#
17f50 65 6c 73 65 0a 20 20 6e 65 77 4f 66 66 73 65 74  else.  newOffset
17f60 20 3d 20 6c 73 65 65 6b 28 69 64 2d 3e 68 2c 20   = lseek(id->h, 
17f70 6f 66 66 73 65 74 2c 20 53 45 45 4b 5f 53 45 54  offset, SEEK_SET
17f80 29 3b 0a 20 20 69 66 28 20 6e 65 77 4f 66 66 73  );.  if( newOffs
17f90 65 74 21 3d 6f 66 66 73 65 74 20 29 7b 0a 20 20  et!=offset ){.  
17fa0 20 20 69 66 28 20 6e 65 77 4f 66 66 73 65 74 20    if( newOffset 
17fb0 3d 3d 20 2d 31 20 29 7b 0a 20 20 20 20 20 20 28  == -1 ){.      (
17fc0 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 29 2d 3e  (unixFile*)id)->
17fd0 6c 61 73 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e  lastErrno = errn
17fe0 6f 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  o;.    }else{.  
17ff0 20 20 20 20 28 28 75 6e 69 78 46 69 6c 65 2a 29      ((unixFile*)
18000 69 64 29 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d  id)->lastErrno =
18010 20 30 3b 09 09 09 0a 20 20 20 20 7d 0a 20 20 20   0;....    }.   
18020 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 7d 0a   return -1;.  }.
18030 20 20 67 6f 74 20 3d 20 77 72 69 74 65 28 69 64    got = write(id
18040 2d 3e 68 2c 20 70 42 75 66 2c 20 63 6e 74 29 3b  ->h, pBuf, cnt);
18050 0a 23 65 6e 64 69 66 0a 20 20 54 49 4d 45 52 5f  .#endif.  TIMER_
18060 45 4e 44 3b 0a 20 20 69 66 28 20 67 6f 74 3c 30  END;.  if( got<0
18070 20 29 7b 0a 20 20 20 20 28 28 75 6e 69 78 46 69   ){.    ((unixFi
18080 6c 65 2a 29 69 64 29 2d 3e 6c 61 73 74 45 72 72  le*)id)->lastErr
18090 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 7d 0a  no = errno;.  }.
180a0 0a 20 20 4f 53 54 52 41 43 45 35 28 22 57 52 49  .  OSTRACE5("WRI
180b0 54 45 20 20 20 25 2d 33 64 20 25 35 64 20 25 37  TE   %-3d %5d %7
180c0 6c 6c 64 20 25 6c 6c 75 5c 6e 22 2c 20 69 64 2d  lld %llu\n", id-
180d0 3e 68 2c 20 67 6f 74 2c 20 6f 66 66 73 65 74 2c  >h, got, offset,
180e0 20 54 49 4d 45 52 5f 45 4c 41 50 53 45 44 29 3b   TIMER_ELAPSED);
180f0 0a 20 20 72 65 74 75 72 6e 20 67 6f 74 3b 0a 7d  .  return got;.}
18100 0a 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 64  .../*.** Write d
18110 61 74 61 20 66 72 6f 6d 20 61 20 62 75 66 66 65  ata from a buffe
18120 72 20 69 6e 74 6f 20 61 20 66 69 6c 65 2e 20 20  r into a file.  
18130 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  Return SQLITE_OK
18140 20 6f 6e 20 73 75 63 63 65 73 73 0a 2a 2a 20 6f   on success.** o
18150 72 20 73 6f 6d 65 20 6f 74 68 65 72 20 65 72 72  r some other err
18160 6f 72 20 63 6f 64 65 20 6f 6e 20 66 61 69 6c 75  or code on failu
18170 72 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  re..*/.static in
18180 74 20 75 6e 69 78 57 72 69 74 65 28 0a 20 20 73  t unixWrite(.  s
18190 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c  qlite3_file *id,
181a0 20 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a   .  const void *
181b0 70 42 75 66 2c 20 0a 20 20 69 6e 74 20 61 6d 74  pBuf, .  int amt
181c0 2c 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36  ,.  sqlite3_int6
181d0 34 20 6f 66 66 73 65 74 20 0a 29 7b 0a 20 20 75  4 offset .){.  u
181e0 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d  nixFile *pFile =
181f0 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a   (unixFile*)id;.
18200 20 20 69 6e 74 20 77 72 6f 74 65 20 3d 20 30 3b    int wrote = 0;
18210 0a 20 20 61 73 73 65 72 74 28 20 69 64 20 29 3b  .  assert( id );
18220 0a 20 20 61 73 73 65 72 74 28 20 61 6d 74 3e 30  .  assert( amt>0
18230 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69   );..  /* If thi
18240 73 20 69 73 20 61 20 64 61 74 61 62 61 73 65 20  s is a database 
18250 66 69 6c 65 20 28 6e 6f 74 20 61 20 6a 6f 75 72  file (not a jour
18260 6e 61 6c 2c 20 6d 61 73 74 65 72 2d 6a 6f 75 72  nal, master-jour
18270 6e 61 6c 20 6f 72 20 74 65 6d 70 0a 20 20 2a 2a  nal or temp.  **
18280 20 66 69 6c 65 29 2c 20 74 68 65 20 62 79 74 65   file), the byte
18290 73 20 69 6e 20 74 68 65 20 6c 6f 63 6b 69 6e 67  s in the locking
182a0 20 72 61 6e 67 65 20 73 68 6f 75 6c 64 20 6e 65   range should ne
182b0 76 65 72 20 62 65 20 72 65 61 64 20 6f 72 20 77  ver be read or w
182c0 72 69 74 74 65 6e 2e 20 2a 2f 0a 23 69 66 20 30  ritten. */.#if 0
182d0 0a 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65  .  assert( pFile
182e0 2d 3e 70 55 6e 75 73 65 64 3d 3d 30 0a 20 20 20  ->pUnused==0.   
182f0 20 20 20 20 7c 7c 20 6f 66 66 73 65 74 3e 3d 50      || offset>=P
18300 45 4e 44 49 4e 47 5f 42 59 54 45 2b 35 31 32 0a  ENDING_BYTE+512.
18310 20 20 20 20 20 20 20 7c 7c 20 6f 66 66 73 65 74         || offset
18320 2b 61 6d 74 3c 3d 50 45 4e 44 49 4e 47 5f 42 59  +amt<=PENDING_BY
18330 54 45 20 0a 20 20 29 3b 0a 23 65 6e 64 69 66 0a  TE .  );.#endif.
18340 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a  .#ifndef NDEBUG.
18350 20 20 2f 2a 20 49 66 20 77 65 20 61 72 65 20 64    /* If we are d
18360 6f 69 6e 67 20 61 20 6e 6f 72 6d 61 6c 20 77 72  oing a normal wr
18370 69 74 65 20 74 6f 20 61 20 64 61 74 61 62 61 73  ite to a databas
18380 65 20 66 69 6c 65 20 28 61 73 20 6f 70 70 6f 73  e file (as oppos
18390 65 64 20 74 6f 0a 20 20 2a 2a 20 64 6f 69 6e 67  ed to.  ** doing
183a0 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72   a hot-journal r
183b0 6f 6c 6c 62 61 63 6b 20 6f 72 20 61 20 77 72 69  ollback or a wri
183c0 74 65 20 74 6f 20 73 6f 6d 65 20 66 69 6c 65 20  te to some file 
183d0 6f 74 68 65 72 20 74 68 61 6e 20 61 0a 20 20 2a  other than a.  *
183e0 2a 20 6e 6f 72 6d 61 6c 20 64 61 74 61 62 61 73  * normal databas
183f0 65 20 66 69 6c 65 29 20 74 68 65 6e 20 72 65 63  e file) then rec
18400 6f 72 64 20 74 68 65 20 66 61 63 74 20 74 68 61  ord the fact tha
18410 74 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 20  t the database. 
18420 20 2a 2a 20 68 61 73 20 63 68 61 6e 67 65 64 2e   ** has changed.
18430 20 20 49 66 20 74 68 65 20 74 72 61 6e 73 61 63    If the transac
18440 74 69 6f 6e 20 63 6f 75 6e 74 65 72 20 69 73 20  tion counter is 
18450 6d 6f 64 69 66 69 65 64 2c 20 72 65 63 6f 72 64  modified, record
18460 20 74 68 61 74 0a 20 20 2a 2a 20 66 61 63 74 20   that.  ** fact 
18470 74 6f 6f 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  too..  */.  if( 
18480 70 46 69 6c 65 2d 3e 69 6e 4e 6f 72 6d 61 6c 57  pFile->inNormalW
18490 72 69 74 65 20 29 7b 0a 20 20 20 20 70 46 69 6c  rite ){.    pFil
184a0 65 2d 3e 64 62 55 70 64 61 74 65 20 3d 20 31 3b  e->dbUpdate = 1;
184b0 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73    /* The databas
184c0 65 20 68 61 73 20 62 65 65 6e 20 6d 6f 64 69 66  e has been modif
184d0 69 65 64 20 2a 2f 0a 20 20 20 20 69 66 28 20 6f  ied */.    if( o
184e0 66 66 73 65 74 3c 3d 32 34 20 26 26 20 6f 66 66  ffset<=24 && off
184f0 73 65 74 2b 61 6d 74 3e 3d 32 37 20 29 7b 0a 20  set+amt>=27 ){. 
18500 20 20 20 20 20 69 6e 74 20 72 63 3b 0a 20 20 20       int rc;.   
18510 20 20 20 63 68 61 72 20 6f 6c 64 43 6e 74 72 5b     char oldCntr[
18520 34 5d 3b 0a 20 20 20 20 20 20 53 69 6d 75 6c 61  4];.      Simula
18530 74 65 49 4f 45 72 72 6f 72 42 65 6e 69 67 6e 28  teIOErrorBenign(
18540 31 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73  1);.      rc = s
18550 65 65 6b 41 6e 64 52 65 61 64 28 70 46 69 6c 65  eekAndRead(pFile
18560 2c 20 32 34 2c 20 6f 6c 64 43 6e 74 72 2c 20 34  , 24, oldCntr, 4
18570 29 3b 0a 20 20 20 20 20 20 53 69 6d 75 6c 61 74  );.      Simulat
18580 65 49 4f 45 72 72 6f 72 42 65 6e 69 67 6e 28 30  eIOErrorBenign(0
18590 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21  );.      if( rc!
185a0 3d 34 20 7c 7c 20 6d 65 6d 63 6d 70 28 6f 6c 64  =4 || memcmp(old
185b0 43 6e 74 72 2c 20 26 28 28 63 68 61 72 2a 29 70  Cntr, &((char*)p
185c0 42 75 66 29 5b 32 34 2d 6f 66 66 73 65 74 5d 2c  Buf)[24-offset],
185d0 20 34 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20   4)!=0 ){.      
185e0 20 20 70 46 69 6c 65 2d 3e 74 72 61 6e 73 43 6e    pFile->transCn
185f0 74 72 43 68 6e 67 20 3d 20 31 3b 20 20 2f 2a 20  trChng = 1;  /* 
18600 54 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  The transaction 
18610 63 6f 75 6e 74 65 72 20 68 61 73 20 63 68 61 6e  counter has chan
18620 67 65 64 20 2a 2f 0a 20 20 20 20 20 20 7d 0a 20  ged */.      }. 
18630 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a     }.  }.#endif.
18640 0a 20 20 77 68 69 6c 65 28 20 61 6d 74 3e 30 20  .  while( amt>0 
18650 26 26 20 28 77 72 6f 74 65 20 3d 20 73 65 65 6b  && (wrote = seek
18660 41 6e 64 57 72 69 74 65 28 70 46 69 6c 65 2c 20  AndWrite(pFile, 
18670 6f 66 66 73 65 74 2c 20 70 42 75 66 2c 20 61 6d  offset, pBuf, am
18680 74 29 29 3e 30 20 29 7b 0a 20 20 20 20 61 6d 74  t))>0 ){.    amt
18690 20 2d 3d 20 77 72 6f 74 65 3b 0a 20 20 20 20 6f   -= wrote;.    o
186a0 66 66 73 65 74 20 2b 3d 20 77 72 6f 74 65 3b 0a  ffset += wrote;.
186b0 20 20 20 20 70 42 75 66 20 3d 20 26 28 28 63 68      pBuf = &((ch
186c0 61 72 2a 29 70 42 75 66 29 5b 77 72 6f 74 65 5d  ar*)pBuf)[wrote]
186d0 3b 0a 20 20 7d 0a 20 20 53 69 6d 75 6c 61 74 65  ;.  }.  Simulate
186e0 49 4f 45 72 72 6f 72 28 28 20 77 72 6f 74 65 3d  IOError(( wrote=
186f0 28 2d 31 29 2c 20 61 6d 74 3d 31 20 29 29 3b 0a  (-1), amt=1 ));.
18700 20 20 53 69 6d 75 6c 61 74 65 44 69 73 6b 66 75    SimulateDiskfu
18710 6c 6c 45 72 72 6f 72 28 28 20 77 72 6f 74 65 3d  llError(( wrote=
18720 30 2c 20 61 6d 74 3d 31 20 29 29 3b 0a 20 20 69  0, amt=1 ));.  i
18730 66 28 20 61 6d 74 3e 30 20 29 7b 0a 20 20 20 20  f( amt>0 ){.    
18740 69 66 28 20 77 72 6f 74 65 3c 30 20 29 7b 0a 20  if( wrote<0 ){. 
18750 20 20 20 20 20 2f 2a 20 6c 61 73 74 45 72 72 6e       /* lastErrn
18760 6f 20 73 65 74 20 62 79 20 73 65 65 6b 41 6e 64  o set by seekAnd
18770 57 72 69 74 65 20 2a 2f 0a 20 20 20 20 20 20 72  Write */.      r
18780 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45  eturn SQLITE_IOE
18790 52 52 5f 57 52 49 54 45 3b 0a 20 20 20 20 7d 65  RR_WRITE;.    }e
187a0 6c 73 65 7b 0a 20 20 20 20 20 20 70 46 69 6c 65  lse{.      pFile
187b0 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 30 3b  ->lastErrno = 0;
187c0 20 2f 2a 20 6e 6f 74 20 61 20 73 79 73 74 65 6d   /* not a system
187d0 20 65 72 72 6f 72 20 2a 2f 0a 20 20 20 20 20 20   error */.      
187e0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 46 55  return SQLITE_FU
187f0 4c 4c 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  LL;.    }.  }.  
18800 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
18810 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  ;.}..#ifdef SQLI
18820 54 45 5f 54 45 53 54 0a 2f 2a 0a 2a 2a 20 43 6f  TE_TEST./*.** Co
18830 75 6e 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  unt the number o
18840 66 20 66 75 6c 6c 73 79 6e 63 73 20 61 6e 64 20  f fullsyncs and 
18850 6e 6f 72 6d 61 6c 20 73 79 6e 63 73 2e 20 20 54  normal syncs.  T
18860 68 69 73 20 69 73 20 75 73 65 64 20 74 6f 20 74  his is used to t
18870 65 73 74 0a 2a 2a 20 74 68 61 74 20 73 79 6e 63  est.** that sync
18880 73 20 61 6e 64 20 66 75 6c 6c 73 79 6e 63 73 20  s and fullsyncs 
18890 61 72 65 20 6f 63 63 75 72 72 69 6e 67 20 61 74  are occurring at
188a0 20 74 68 65 20 72 69 67 68 74 20 74 69 6d 65 73   the right times
188b0 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
188c0 5f 73 79 6e 63 5f 63 6f 75 6e 74 20 3d 20 30 3b  _sync_count = 0;
188d0 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 66 75 6c  .int sqlite3_ful
188e0 6c 73 79 6e 63 5f 63 6f 75 6e 74 20 3d 20 30 3b  lsync_count = 0;
188f0 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 57  .#endif../*.** W
18900 65 20 64 6f 20 6e 6f 74 20 74 72 75 73 74 20 73  e do not trust s
18910 79 73 74 65 6d 73 20 74 6f 20 70 72 6f 76 69 64  ystems to provid
18920 65 20 61 20 77 6f 72 6b 69 6e 67 20 66 64 61 74  e a working fdat
18930 61 73 79 6e 63 28 29 2e 20 20 53 6f 6d 65 20 64  async().  Some d
18940 6f 2e 0a 2a 2a 20 4f 74 68 65 72 73 20 64 6f 20  o..** Others do 
18950 6e 6f 2e 20 20 54 6f 20 62 65 20 73 61 66 65 2c  no.  To be safe,
18960 20 77 65 20 77 69 6c 6c 20 73 74 69 63 6b 20 77   we will stick w
18970 69 74 68 20 74 68 65 20 28 73 6c 6f 77 65 72 29  ith the (slower)
18980 20 66 73 79 6e 63 28 29 2e 0a 2a 2a 20 49 66 20   fsync()..** If 
18990 79 6f 75 20 6b 6e 6f 77 20 74 68 61 74 20 79 6f  you know that yo
189a0 75 72 20 73 79 73 74 65 6d 20 64 6f 65 73 20 73  ur system does s
189b0 75 70 70 6f 72 74 20 66 64 61 74 61 73 79 6e 63  upport fdatasync
189c0 28 29 20 63 6f 72 72 65 63 74 6c 79 2c 0a 2a 2a  () correctly,.**
189d0 20 74 68 65 6e 20 73 69 6d 70 6c 79 20 63 6f 6d   then simply com
189e0 70 69 6c 65 20 77 69 74 68 20 2d 44 66 64 61 74  pile with -Dfdat
189f0 61 73 79 6e 63 3d 66 64 61 74 61 73 79 6e 63 0a  async=fdatasync.
18a00 2a 2f 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  */.#if !defined(
18a10 66 64 61 74 61 73 79 6e 63 29 20 26 26 20 21 64  fdatasync) && !d
18a20 65 66 69 6e 65 64 28 5f 5f 6c 69 6e 75 78 5f 5f  efined(__linux__
18a30 29 0a 23 20 64 65 66 69 6e 65 20 66 64 61 74 61  ).# define fdata
18a40 73 79 6e 63 20 66 73 79 6e 63 0a 23 65 6e 64 69  sync fsync.#endi
18a50 66 0a 0a 2f 2a 0a 2a 2a 20 44 65 66 69 6e 65 20  f../*.** Define 
18a60 48 41 56 45 5f 46 55 4c 4c 46 53 59 4e 43 20 74  HAVE_FULLFSYNC t
18a70 6f 20 30 20 6f 72 20 31 20 64 65 70 65 6e 64 69  o 0 or 1 dependi
18a80 6e 67 20 6f 6e 20 77 68 65 74 68 65 72 20 6f 72  ng on whether or
18a90 20 6e 6f 74 0a 2a 2a 20 74 68 65 20 46 5f 46 55   not.** the F_FU
18aa0 4c 4c 46 53 59 4e 43 20 6d 61 63 72 6f 20 69 73  LLFSYNC macro is
18ab0 20 64 65 66 69 6e 65 64 2e 20 20 46 5f 46 55 4c   defined.  F_FUL
18ac0 4c 46 53 59 4e 43 20 69 73 20 63 75 72 72 65 6e  LFSYNC is curren
18ad0 74 6c 79 0a 2a 2a 20 6f 6e 6c 79 20 61 76 61 69  tly.** only avai
18ae0 6c 61 62 6c 65 20 6f 6e 20 4d 61 63 20 4f 53 20  lable on Mac OS 
18af0 58 2e 20 20 42 75 74 20 74 68 61 74 20 63 6f 75  X.  But that cou
18b00 6c 64 20 63 68 61 6e 67 65 2e 0a 2a 2f 0a 23 69  ld change..*/.#i
18b10 66 64 65 66 20 46 5f 46 55 4c 4c 46 53 59 4e 43  fdef F_FULLFSYNC
18b20 0a 23 20 64 65 66 69 6e 65 20 48 41 56 45 5f 46  .# define HAVE_F
18b30 55 4c 4c 46 53 59 4e 43 20 31 0a 23 65 6c 73 65  ULLFSYNC 1.#else
18b40 0a 23 20 64 65 66 69 6e 65 20 48 41 56 45 5f 46  .# define HAVE_F
18b50 55 4c 4c 46 53 59 4e 43 20 30 0a 23 65 6e 64 69  ULLFSYNC 0.#endi
18b60 66 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 73  f.../*.** The fs
18b70 79 6e 63 28 29 20 73 79 73 74 65 6d 20 63 61 6c  ync() system cal
18b80 6c 20 64 6f 65 73 20 6e 6f 74 20 77 6f 72 6b 20  l does not work 
18b90 61 73 20 61 64 76 65 72 74 69 73 65 64 20 6f 6e  as advertised on
18ba0 20 6d 61 6e 79 0a 2a 2a 20 75 6e 69 78 20 73 79   many.** unix sy
18bb0 73 74 65 6d 73 2e 20 20 54 68 65 20 66 6f 6c 6c  stems.  The foll
18bc0 6f 77 69 6e 67 20 70 72 6f 63 65 64 75 72 65 20  owing procedure 
18bd0 69 73 20 61 6e 20 61 74 74 65 6d 70 74 20 74 6f  is an attempt to
18be0 20 6d 61 6b 65 0a 2a 2a 20 69 74 20 77 6f 72 6b   make.** it work
18bf0 20 62 65 74 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 54   better..**.** T
18c00 68 65 20 53 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e  he SQLITE_NO_SYN
18c10 43 20 6d 61 63 72 6f 20 64 69 73 61 62 6c 65 73  C macro disables
18c20 20 61 6c 6c 20 66 73 79 6e 63 28 29 73 2e 20 20   all fsync()s.  
18c30 54 68 69 73 20 69 73 20 75 73 65 66 75 6c 0a 2a  This is useful.*
18c40 2a 20 66 6f 72 20 74 65 73 74 69 6e 67 20 77 68  * for testing wh
18c50 65 6e 20 77 65 20 77 61 6e 74 20 74 6f 20 72 75  en we want to ru
18c60 6e 20 74 68 72 6f 75 67 68 20 74 68 65 20 74 65  n through the te
18c70 73 74 20 73 75 69 74 65 20 71 75 69 63 6b 6c 79  st suite quickly
18c80 2e 0a 2a 2a 20 59 6f 75 20 61 72 65 20 73 74 72  ..** You are str
18c90 6f 6e 67 6c 79 20 61 64 76 69 73 65 64 20 2a 6e  ongly advised *n
18ca0 6f 74 2a 20 74 6f 20 64 65 70 6c 6f 79 20 77 69  ot* to deploy wi
18cb0 74 68 20 53 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e  th SQLITE_NO_SYN
18cc0 43 0a 2a 2a 20 65 6e 61 62 6c 65 64 2c 20 68 6f  C.** enabled, ho
18cd0 77 65 76 65 72 2c 20 73 69 6e 63 65 20 77 69 74  wever, since wit
18ce0 68 20 53 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e 43  h SQLITE_NO_SYNC
18cf0 20 65 6e 61 62 6c 65 64 2c 20 61 6e 20 4f 53 20   enabled, an OS 
18d00 63 72 61 73 68 0a 2a 2a 20 6f 72 20 70 6f 77 65  crash.** or powe
18d10 72 20 66 61 69 6c 75 72 65 20 77 69 6c 6c 20 6c  r failure will l
18d20 69 6b 65 6c 79 20 63 6f 72 72 75 70 74 20 74 68  ikely corrupt th
18d30 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
18d40 0a 2a 2a 0a 2a 2a 20 53 51 4c 69 74 65 20 73 65  .**.** SQLite se
18d50 74 73 20 74 68 65 20 64 61 74 61 4f 6e 6c 79 20  ts the dataOnly 
18d60 66 6c 61 67 20 69 66 20 74 68 65 20 73 69 7a 65  flag if the size
18d70 20 6f 66 20 74 68 65 20 66 69 6c 65 20 69 73 20   of the file is 
18d80 75 6e 63 68 61 6e 67 65 64 2e 0a 2a 2a 20 54 68  unchanged..** Th
18d90 65 20 69 64 65 61 20 62 65 68 69 6e 64 20 64 61  e idea behind da
18da0 74 61 4f 6e 6c 79 20 69 73 20 74 68 61 74 20 69  taOnly is that i
18db0 74 20 73 68 6f 75 6c 64 20 6f 6e 6c 79 20 77 72  t should only wr
18dc0 69 74 65 20 74 68 65 20 66 69 6c 65 20 63 6f 6e  ite the file con
18dd0 74 65 6e 74 0a 2a 2a 20 74 6f 20 64 69 73 6b 2c  tent.** to disk,
18de0 20 6e 6f 74 20 74 68 65 20 69 6e 6f 64 65 2e 20   not the inode. 
18df0 20 57 65 20 6f 6e 6c 79 20 73 65 74 20 64 61 74   We only set dat
18e00 61 4f 6e 6c 79 20 69 66 20 74 68 65 20 66 69 6c  aOnly if the fil
18e10 65 20 73 69 7a 65 20 69 73 20 0a 2a 2a 20 75 6e  e size is .** un
18e20 63 68 61 6e 67 65 64 20 73 69 6e 63 65 20 74 68  changed since th
18e30 65 20 66 69 6c 65 20 73 69 7a 65 20 69 73 20 70  e file size is p
18e40 61 72 74 20 6f 66 20 74 68 65 20 69 6e 6f 64 65  art of the inode
18e50 2e 20 20 48 6f 77 65 76 65 72 2c 20 0a 2a 2a 20  .  However, .** 
18e60 54 65 64 20 54 73 27 6f 20 74 65 6c 6c 73 20 75  Ted Ts'o tells u
18e70 73 20 74 68 61 74 20 66 64 61 74 61 73 79 6e 63  s that fdatasync
18e80 28 29 20 77 69 6c 6c 20 61 6c 73 6f 20 77 72 69  () will also wri
18e90 74 65 20 74 68 65 20 69 6e 6f 64 65 20 69 66 20  te the inode if 
18ea0 74 68 65 0a 2a 2a 20 66 69 6c 65 20 73 69 7a 65  the.** file size
18eb0 20 68 61 73 20 63 68 61 6e 67 65 64 2e 20 20 54   has changed.  T
18ec0 68 65 20 6f 6e 6c 79 20 72 65 61 6c 20 64 69 66  he only real dif
18ed0 66 65 72 65 6e 63 65 20 62 65 74 77 65 65 6e 20  ference between 
18ee0 66 64 61 74 61 73 79 6e 63 28 29 0a 2a 2a 20 61  fdatasync().** a
18ef0 6e 64 20 66 73 79 6e 63 28 29 2c 20 54 65 64 20  nd fsync(), Ted 
18f00 74 65 6c 6c 73 20 75 73 2c 20 69 73 20 74 68 61  tells us, is tha
18f10 74 20 66 64 61 74 61 73 79 6e 63 28 29 20 77 69  t fdatasync() wi
18f20 6c 6c 20 6e 6f 74 20 66 6c 75 73 68 20 74 68 65  ll not flush the
18f30 0a 2a 2a 20 69 6e 6f 64 65 20 69 66 20 74 68 65  .** inode if the
18f40 20 6d 74 69 6d 65 20 6f 72 20 6f 77 6e 65 72 20   mtime or owner 
18f50 6f 72 20 6f 74 68 65 72 20 69 6e 6f 64 65 20 61  or other inode a
18f60 74 74 72 69 62 75 74 65 73 20 68 61 76 65 20 63  ttributes have c
18f70 68 61 6e 67 65 64 2e 0a 2a 2a 20 57 65 20 6f 6e  hanged..** We on
18f80 6c 79 20 63 61 72 65 20 61 62 6f 75 74 20 74 68  ly care about th
18f90 65 20 66 69 6c 65 20 73 69 7a 65 2c 20 6e 6f 74  e file size, not
18fa0 20 74 68 65 20 6f 74 68 65 72 20 66 69 6c 65 20   the other file 
18fb0 61 74 74 72 69 62 75 74 65 73 2c 20 73 6f 0a 2a  attributes, so.*
18fc0 2a 20 61 73 20 66 61 72 20 61 73 20 53 51 4c 69  * as far as SQLi
18fd0 74 65 20 69 73 20 63 6f 6e 63 65 72 6e 65 64 2c  te is concerned,
18fe0 20 61 6e 20 66 64 61 74 61 73 79 6e 63 28 29 20   an fdatasync() 
18ff0 69 73 20 61 6c 77 61 79 73 20 61 64 65 71 75 61  is always adequa
19000 74 65 2e 0a 2a 2a 20 53 6f 2c 20 77 65 20 61 6c  te..** So, we al
19010 77 61 79 73 20 75 73 65 20 66 64 61 74 61 73 79  ways use fdatasy
19020 6e 63 28 29 20 69 66 20 69 74 20 69 73 20 61 76  nc() if it is av
19030 61 69 6c 61 62 6c 65 2c 20 72 65 67 61 72 64 6c  ailable, regardl
19040 65 73 73 20 6f 66 0a 2a 2a 20 74 68 65 20 76 61  ess of.** the va
19050 6c 75 65 20 6f 66 20 74 68 65 20 64 61 74 61 4f  lue of the dataO
19060 6e 6c 79 20 66 6c 61 67 2e 0a 2a 2f 0a 73 74 61  nly flag..*/.sta
19070 74 69 63 20 69 6e 74 20 66 75 6c 6c 5f 66 73 79  tic int full_fsy
19080 6e 63 28 69 6e 74 20 66 64 2c 20 69 6e 74 20 66  nc(int fd, int f
19090 75 6c 6c 53 79 6e 63 2c 20 69 6e 74 20 64 61 74  ullSync, int dat
190a0 61 4f 6e 6c 79 29 7b 0a 20 20 69 6e 74 20 72 63  aOnly){.  int rc
190b0 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c  ;..  /* The foll
190c0 6f 77 69 6e 67 20 22 69 66 64 65 66 2f 65 6c 69  owing "ifdef/eli
190d0 66 2f 65 6c 73 65 2f 22 20 62 6c 6f 63 6b 20 68  f/else/" block h
190e0 61 73 20 74 68 65 20 73 61 6d 65 20 73 74 72 75  as the same stru
190f0 63 74 75 72 65 20 61 73 0a 20 20 2a 2a 20 74 68  cture as.  ** th
19100 65 20 6f 6e 65 20 62 65 6c 6f 77 2e 20 49 74 20  e one below. It 
19110 69 73 20 72 65 70 6c 69 63 61 74 65 64 20 68 65  is replicated he
19120 72 65 20 73 6f 6c 65 6c 79 20 74 6f 20 61 76 6f  re solely to avo
19130 69 64 20 63 6c 75 74 74 65 72 69 6e 67 20 0a 20  id cluttering . 
19140 20 2a 2a 20 75 70 20 74 68 65 20 72 65 61 6c 20   ** up the real 
19150 63 6f 64 65 20 77 69 74 68 20 74 68 65 20 55 4e  code with the UN
19160 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 29  USED_PARAMETER()
19170 20 6d 61 63 72 6f 73 2e 0a 20 20 2a 2f 0a 23 69   macros..  */.#i
19180 66 64 65 66 20 53 51 4c 49 54 45 5f 4e 4f 5f 53  fdef SQLITE_NO_S
19190 59 4e 43 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  YNC.  UNUSED_PAR
191a0 41 4d 45 54 45 52 28 66 64 29 3b 0a 20 20 55 4e  AMETER(fd);.  UN
191b0 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 66  USED_PARAMETER(f
191c0 75 6c 6c 53 79 6e 63 29 3b 0a 20 20 55 4e 55 53  ullSync);.  UNUS
191d0 45 44 5f 50 41 52 41 4d 45 54 45 52 28 64 61 74  ED_PARAMETER(dat
191e0 61 4f 6e 6c 79 29 3b 0a 23 65 6c 69 66 20 48 41  aOnly);.#elif HA
191f0 56 45 5f 46 55 4c 4c 46 53 59 4e 43 0a 20 20 55  VE_FULLFSYNC.  U
19200 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
19210 64 61 74 61 4f 6e 6c 79 29 3b 0a 23 65 6c 73 65  dataOnly);.#else
19220 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
19230 54 45 52 28 66 75 6c 6c 53 79 6e 63 29 3b 0a 20  TER(fullSync);. 
19240 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
19250 52 28 64 61 74 61 4f 6e 6c 79 29 3b 0a 23 65 6e  R(dataOnly);.#en
19260 64 69 66 0a 0a 20 20 2f 2a 20 52 65 63 6f 72 64  dif..  /* Record
19270 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 74   the number of t
19280 69 6d 65 73 20 74 68 61 74 20 77 65 20 64 6f 20  imes that we do 
19290 61 20 6e 6f 72 6d 61 6c 20 66 73 79 6e 63 28 29  a normal fsync()
192a0 20 61 6e 64 20 0a 20 20 2a 2a 20 46 55 4c 4c 53   and .  ** FULLS
192b0 59 4e 43 2e 20 20 54 68 69 73 20 69 73 20 75 73  YNC.  This is us
192c0 65 64 20 64 75 72 69 6e 67 20 74 65 73 74 69 6e  ed during testin
192d0 67 20 74 6f 20 76 65 72 69 66 79 20 74 68 61 74  g to verify that
192e0 20 74 68 69 73 20 70 72 6f 63 65 64 75 72 65 0a   this procedure.
192f0 20 20 2a 2a 20 67 65 74 73 20 63 61 6c 6c 65 64    ** gets called
19300 20 77 69 74 68 20 74 68 65 20 63 6f 72 72 65 63   with the correc
19310 74 20 61 72 67 75 6d 65 6e 74 73 2e 0a 20 20 2a  t arguments..  *
19320 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /.#ifdef SQLITE_
19330 54 45 53 54 0a 20 20 69 66 28 20 66 75 6c 6c 53  TEST.  if( fullS
19340 79 6e 63 20 29 20 73 71 6c 69 74 65 33 5f 66 75  ync ) sqlite3_fu
19350 6c 6c 73 79 6e 63 5f 63 6f 75 6e 74 2b 2b 3b 0a  llsync_count++;.
19360 20 20 73 71 6c 69 74 65 33 5f 73 79 6e 63 5f 63    sqlite3_sync_c
19370 6f 75 6e 74 2b 2b 3b 0a 23 65 6e 64 69 66 0a 0a  ount++;.#endif..
19380 20 20 2f 2a 20 49 66 20 77 65 20 63 6f 6d 70 69    /* If we compi
19390 6c 65 64 20 77 69 74 68 20 74 68 65 20 53 51 4c  led with the SQL
193a0 49 54 45 5f 4e 4f 5f 53 59 4e 43 20 66 6c 61 67  ITE_NO_SYNC flag
193b0 2c 20 74 68 65 6e 20 73 79 6e 63 69 6e 67 20 69  , then syncing i
193c0 73 20 61 0a 20 20 2a 2a 20 6e 6f 2d 6f 70 0a 20  s a.  ** no-op. 
193d0 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54   */.#ifdef SQLIT
193e0 45 5f 4e 4f 5f 53 59 4e 43 0a 20 20 72 63 20 3d  E_NO_SYNC.  rc =
193f0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 23 65 6c 69   SQLITE_OK;.#eli
19400 66 20 48 41 56 45 5f 46 55 4c 4c 46 53 59 4e 43  f HAVE_FULLFSYNC
19410 0a 20 20 69 66 28 20 66 75 6c 6c 53 79 6e 63 20  .  if( fullSync 
19420 29 7b 0a 20 20 20 20 72 63 20 3d 20 66 63 6e 74  ){.    rc = fcnt
19430 6c 28 66 64 2c 20 46 5f 46 55 4c 4c 46 53 59 4e  l(fd, F_FULLFSYN
19440 43 2c 20 30 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  C, 0);.  }else{.
19450 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 7d 0a      rc = 1;.  }.
19460 20 20 2f 2a 20 49 66 20 74 68 65 20 46 55 4c 4c    /* If the FULL
19470 46 53 59 4e 43 20 66 61 69 6c 65 64 2c 20 66 61  FSYNC failed, fa
19480 6c 6c 20 62 61 63 6b 20 74 6f 20 61 74 74 65 6d  ll back to attem
19490 70 74 69 6e 67 20 61 6e 20 66 73 79 6e 63 28 29  pting an fsync()
194a0 2e 0a 20 20 2a 2a 20 49 74 20 73 68 6f 75 6c 64  ..  ** It should
194b0 6e 27 74 20 62 65 20 70 6f 73 73 69 62 6c 65 20  n't be possible 
194c0 66 6f 72 20 66 75 6c 6c 66 73 79 6e 63 20 74 6f  for fullfsync to
194d0 20 66 61 69 6c 20 6f 6e 20 74 68 65 20 6c 6f 63   fail on the loc
194e0 61 6c 20 0a 20 20 2a 2a 20 66 69 6c 65 20 73 79  al .  ** file sy
194f0 73 74 65 6d 20 28 6f 6e 20 4f 53 58 29 2c 20 73  stem (on OSX), s
19500 6f 20 66 61 69 6c 75 72 65 20 69 6e 64 69 63 61  o failure indica
19510 74 65 73 20 74 68 61 74 20 46 55 4c 4c 46 53 59  tes that FULLFSY
19520 4e 43 0a 20 20 2a 2a 20 69 73 6e 27 74 20 73 75  NC.  ** isn't su
19530 70 70 6f 72 74 65 64 20 66 6f 72 20 74 68 69 73  pported for this
19540 20 66 69 6c 65 20 73 79 73 74 65 6d 2e 20 53 6f   file system. So
19550 2c 20 61 74 74 65 6d 70 74 20 61 6e 20 66 73 79  , attempt an fsy
19560 6e 63 20 0a 20 20 2a 2a 20 61 6e 64 20 28 66 6f  nc .  ** and (fo
19570 72 20 6e 6f 77 29 20 69 67 6e 6f 72 65 20 74 68  r now) ignore th
19580 65 20 6f 76 65 72 68 65 61 64 20 6f 66 20 61 20  e overhead of a 
19590 73 75 70 65 72 66 6c 75 6f 75 73 20 66 63 6e 74  superfluous fcnt
195a0 6c 20 63 61 6c 6c 2e 20 20 0a 20 20 2a 2a 20 49  l call.  .  ** I
195b0 74 27 64 20 62 65 20 62 65 74 74 65 72 20 74 6f  t'd be better to
195c0 20 64 65 74 65 63 74 20 66 75 6c 6c 66 73 79 6e   detect fullfsyn
195d0 63 20 73 75 70 70 6f 72 74 20 6f 6e 63 65 20 61  c support once a
195e0 6e 64 20 61 76 6f 69 64 20 0a 20 20 2a 2a 20 74  nd avoid .  ** t
195f0 68 65 20 66 63 6e 74 6c 20 63 61 6c 6c 20 65 76  he fcntl call ev
19600 65 72 79 20 74 69 6d 65 20 73 79 6e 63 20 69 73  ery time sync is
19610 20 63 61 6c 6c 65 64 2e 0a 20 20 2a 2f 0a 20 20   called..  */.  
19620 69 66 28 20 72 63 20 29 20 72 63 20 3d 20 66 73  if( rc ) rc = fs
19630 79 6e 63 28 66 64 29 3b 0a 0a 23 65 6c 69 66 20  ync(fd);..#elif 
19640 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f  defined(__APPLE_
19650 5f 29 0a 20 20 2f 2a 20 66 64 61 74 61 73 79 6e  _).  /* fdatasyn
19660 63 28 29 20 6f 6e 20 48 46 53 2b 20 64 6f 65 73  c() on HFS+ does
19670 6e 27 74 20 79 65 74 20 66 6c 75 73 68 20 74 68  n't yet flush th
19680 65 20 66 69 6c 65 20 73 69 7a 65 20 69 66 20 69  e file size if i
19690 74 20 63 68 61 6e 67 65 64 20 63 6f 72 72 65 63  t changed correc
196a0 74 6c 79 0a 20 20 2a 2a 20 73 6f 20 63 75 72 72  tly.  ** so curr
196b0 65 6e 74 6c 79 20 77 65 20 64 65 66 61 75 6c 74  ently we default
196c0 20 74 6f 20 74 68 65 20 6d 61 63 72 6f 20 74 68   to the macro th
196d0 61 74 20 72 65 64 65 66 69 6e 65 73 20 66 64 61  at redefines fda
196e0 74 61 73 79 6e 63 20 74 6f 20 66 73 79 6e 63 0a  tasync to fsync.
196f0 20 20 2a 2f 0a 20 20 72 63 20 3d 20 66 73 79 6e    */.  rc = fsyn
19700 63 28 66 64 29 3b 0a 23 65 6c 73 65 20 0a 20 20  c(fd);.#else .  
19710 72 63 20 3d 20 66 64 61 74 61 73 79 6e 63 28 66  rc = fdatasync(f
19720 64 29 3b 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52  d);.#if OS_VXWOR
19730 4b 53 0a 20 20 69 66 28 20 72 63 3d 3d 2d 31 20  KS.  if( rc==-1 
19740 26 26 20 65 72 72 6e 6f 3d 3d 45 4e 4f 54 53 55  && errno==ENOTSU
19750 50 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 66 73  P ){.    rc = fs
19760 79 6e 63 28 66 64 29 3b 0a 20 20 7d 0a 23 65 6e  ync(fd);.  }.#en
19770 64 69 66 20 2f 2a 20 4f 53 5f 56 58 57 4f 52 4b  dif /* OS_VXWORK
19780 53 20 2a 2f 0a 23 65 6e 64 69 66 20 2f 2a 20 69  S */.#endif /* i
19790 66 64 65 66 20 53 51 4c 49 54 45 5f 4e 4f 5f 53  fdef SQLITE_NO_S
197a0 59 4e 43 20 65 6c 69 66 20 48 41 56 45 5f 46 55  YNC elif HAVE_FU
197b0 4c 4c 46 53 59 4e 43 20 2a 2f 0a 0a 20 20 69 66  LLFSYNC */..  if
197c0 28 20 4f 53 5f 56 58 57 4f 52 4b 53 20 26 26 20  ( OS_VXWORKS && 
197d0 72 63 21 3d 20 2d 31 20 29 7b 0a 20 20 20 20 72  rc!= -1 ){.    r
197e0 63 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74  c = 0;.  }.  ret
197f0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
19800 20 4d 61 6b 65 20 73 75 72 65 20 61 6c 6c 20 77   Make sure all w
19810 72 69 74 65 73 20 74 6f 20 61 20 70 61 72 74 69  rites to a parti
19820 63 75 6c 61 72 20 66 69 6c 65 20 61 72 65 20 63  cular file are c
19830 6f 6d 6d 69 74 74 65 64 20 74 6f 20 64 69 73 6b  ommitted to disk
19840 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 64 61 74 61 4f  ..**.** If dataO
19850 6e 6c 79 3d 3d 30 20 74 68 65 6e 20 62 6f 74 68  nly==0 then both
19860 20 74 68 65 20 66 69 6c 65 20 69 74 73 65 6c 66   the file itself
19870 20 61 6e 64 20 69 74 73 20 6d 65 74 61 64 61 74   and its metadat
19880 61 20 28 66 69 6c 65 0a 2a 2a 20 73 69 7a 65 2c  a (file.** size,
19890 20 61 63 63 65 73 73 20 74 69 6d 65 2c 20 65 74   access time, et
198a0 63 29 20 61 72 65 20 73 79 6e 63 65 64 2e 20 20  c) are synced.  
198b0 49 66 20 64 61 74 61 4f 6e 6c 79 21 3d 30 20 74  If dataOnly!=0 t
198c0 68 65 6e 20 6f 6e 6c 79 20 74 68 65 0a 2a 2a 20  hen only the.** 
198d0 66 69 6c 65 20 64 61 74 61 20 69 73 20 73 79 6e  file data is syn
198e0 63 65 64 2e 0a 2a 2a 0a 2a 2a 20 55 6e 64 65 72  ced..**.** Under
198f0 20 55 6e 69 78 2c 20 61 6c 73 6f 20 6d 61 6b 65   Unix, also make
19900 20 73 75 72 65 20 74 68 61 74 20 74 68 65 20 64   sure that the d
19910 69 72 65 63 74 6f 72 79 20 65 6e 74 72 79 20 66  irectory entry f
19920 6f 72 20 74 68 65 20 66 69 6c 65 0a 2a 2a 20 68  or the file.** h
19930 61 73 20 62 65 65 6e 20 63 72 65 61 74 65 64 20  as been created 
19940 62 79 20 66 73 79 6e 63 2d 69 6e 67 20 74 68 65  by fsync-ing the
19950 20 64 69 72 65 63 74 6f 72 79 20 74 68 61 74 20   directory that 
19960 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 66 69 6c  contains the fil
19970 65 2e 0a 2a 2a 20 49 66 20 77 65 20 64 6f 20 6e  e..** If we do n
19980 6f 74 20 64 6f 20 74 68 69 73 20 61 6e 64 20 77  ot do this and w
19990 65 20 65 6e 63 6f 75 6e 74 65 72 20 61 20 70 6f  e encounter a po
199a0 77 65 72 20 66 61 69 6c 75 72 65 2c 20 74 68 65  wer failure, the
199b0 20 64 69 72 65 63 74 6f 72 79 0a 2a 2a 20 65 6e   directory.** en
199c0 74 72 79 20 66 6f 72 20 74 68 65 20 6a 6f 75 72  try for the jour
199d0 6e 61 6c 20 6d 69 67 68 74 20 6e 6f 74 20 65 78  nal might not ex
199e0 69 73 74 20 61 66 74 65 72 20 77 65 20 72 65 62  ist after we reb
199f0 6f 6f 74 2e 20 20 54 68 65 20 6e 65 78 74 0a 2a  oot.  The next.*
19a00 2a 20 53 51 4c 69 74 65 20 74 6f 20 61 63 63 65  * SQLite to acce
19a10 73 73 20 74 68 65 20 66 69 6c 65 20 77 69 6c 6c  ss the file will
19a20 20 6e 6f 74 20 6b 6e 6f 77 20 74 68 61 74 20 74   not know that t
19a30 68 65 20 6a 6f 75 72 6e 61 6c 20 65 78 69 73 74  he journal exist
19a40 73 20 28 62 65 63 61 75 73 65 0a 2a 2a 20 74 68  s (because.** th
19a50 65 20 64 69 72 65 63 74 6f 72 79 20 65 6e 74 72  e directory entr
19a60 79 20 66 6f 72 20 74 68 65 20 6a 6f 75 72 6e 61  y for the journa
19a70 6c 20 77 61 73 20 6e 65 76 65 72 20 63 72 65 61  l was never crea
19a80 74 65 64 29 20 61 6e 64 20 74 68 65 20 74 72 61  ted) and the tra
19a90 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 77 69 6c 6c  nsaction.** will
19aa0 20 6e 6f 74 20 72 6f 6c 6c 20 62 61 63 6b 20 2d   not roll back -
19ab0 20 70 6f 73 73 69 62 6c 79 20 6c 65 61 64 69 6e   possibly leadin
19ac0 67 20 74 6f 20 64 61 74 61 62 61 73 65 20 63 6f  g to database co
19ad0 72 72 75 70 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61  rruption..*/.sta
19ae0 74 69 63 20 69 6e 74 20 75 6e 69 78 53 79 6e 63  tic int unixSync
19af0 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69  (sqlite3_file *i
19b00 64 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20  d, int flags){. 
19b10 20 69 6e 74 20 72 63 3b 0a 20 20 75 6e 69 78 46   int rc;.  unixF
19b20 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e  ile *pFile = (un
19b30 69 78 46 69 6c 65 2a 29 69 64 3b 0a 0a 20 20 69  ixFile*)id;..  i
19b40 6e 74 20 69 73 44 61 74 61 4f 6e 6c 79 20 3d 20  nt isDataOnly = 
19b50 28 66 6c 61 67 73 26 53 51 4c 49 54 45 5f 53 59  (flags&SQLITE_SY
19b60 4e 43 5f 44 41 54 41 4f 4e 4c 59 29 3b 0a 20 20  NC_DATAONLY);.  
19b70 69 6e 74 20 69 73 46 75 6c 6c 73 79 6e 63 20 3d  int isFullsync =
19b80 20 28 66 6c 61 67 73 26 30 78 30 46 29 3d 3d 53   (flags&0x0F)==S
19b90 51 4c 49 54 45 5f 53 59 4e 43 5f 46 55 4c 4c 3b  QLITE_SYNC_FULL;
19ba0 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74 68 61  ..  /* Check tha
19bb0 74 20 6f 6e 65 20 6f 66 20 53 51 4c 49 54 45 5f  t one of SQLITE_
19bc0 53 59 4e 43 5f 4e 4f 52 4d 41 4c 20 6f 72 20 46  SYNC_NORMAL or F
19bd0 55 4c 4c 20 77 61 73 20 70 61 73 73 65 64 20 2a  ULL was passed *
19be0 2f 0a 20 20 61 73 73 65 72 74 28 28 66 6c 61 67  /.  assert((flag
19bf0 73 26 30 78 30 46 29 3d 3d 53 51 4c 49 54 45 5f  s&0x0F)==SQLITE_
19c00 53 59 4e 43 5f 4e 4f 52 4d 41 4c 0a 20 20 20 20  SYNC_NORMAL.    
19c10 20 20 7c 7c 20 28 66 6c 61 67 73 26 30 78 30 46    || (flags&0x0F
19c20 29 3d 3d 53 51 4c 49 54 45 5f 53 59 4e 43 5f 46  )==SQLITE_SYNC_F
19c30 55 4c 4c 0a 20 20 29 3b 0a 0a 20 20 2f 2a 20 55  ULL.  );..  /* U
19c40 6e 69 78 20 63 61 6e 6e 6f 74 2c 20 62 75 74 20  nix cannot, but 
19c50 73 6f 6d 65 20 73 79 73 74 65 6d 73 20 6d 61 79  some systems may
19c60 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 46   return SQLITE_F
19c70 55 4c 4c 20 66 72 6f 6d 20 68 65 72 65 2e 20 54  ULL from here. T
19c80 68 69 73 0a 20 20 2a 2a 20 6c 69 6e 65 20 69 73  his.  ** line is
19c90 20 74 6f 20 74 65 73 74 20 74 68 61 74 20 64 6f   to test that do
19ca0 69 6e 67 20 73 6f 20 64 6f 65 73 20 6e 6f 74 20  ing so does not 
19cb0 63 61 75 73 65 20 61 6e 79 20 70 72 6f 62 6c 65  cause any proble
19cc0 6d 73 2e 0a 20 20 2a 2f 0a 20 20 53 69 6d 75 6c  ms..  */.  Simul
19cd0 61 74 65 44 69 73 6b 66 75 6c 6c 45 72 72 6f 72  ateDiskfullError
19ce0 28 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ( return SQLITE_
19cf0 46 55 4c 4c 20 29 3b 0a 0a 20 20 61 73 73 65 72  FULL );..  asser
19d00 74 28 20 70 46 69 6c 65 20 29 3b 0a 20 20 4f 53  t( pFile );.  OS
19d10 54 52 41 43 45 32 28 22 53 59 4e 43 20 20 20 20  TRACE2("SYNC    
19d20 25 2d 33 64 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e  %-3d\n", pFile->
19d30 68 29 3b 0a 20 20 72 63 20 3d 20 66 75 6c 6c 5f  h);.  rc = full_
19d40 66 73 79 6e 63 28 70 46 69 6c 65 2d 3e 68 2c 20  fsync(pFile->h, 
19d50 69 73 46 75 6c 6c 73 79 6e 63 2c 20 69 73 44 61  isFullsync, isDa
19d60 74 61 4f 6e 6c 79 29 3b 0a 20 20 53 69 6d 75 6c  taOnly);.  Simul
19d70 61 74 65 49 4f 45 72 72 6f 72 28 20 72 63 3d 31  ateIOError( rc=1
19d80 20 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a   );.  if( rc ){.
19d90 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45      pFile->lastE
19da0 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20  rrno = errno;.  
19db0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
19dc0 49 4f 45 52 52 5f 46 53 59 4e 43 3b 0a 20 20 7d  IOERR_FSYNC;.  }
19dd0 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 64 69  .  if( pFile->di
19de0 72 66 64 3e 3d 30 20 29 7b 0a 20 20 20 20 69 6e  rfd>=0 ){.    in
19df0 74 20 65 72 72 3b 0a 20 20 20 20 4f 53 54 52 41  t err;.    OSTRA
19e00 43 45 34 28 22 44 49 52 53 59 4e 43 20 25 2d 33  CE4("DIRSYNC %-3
19e10 64 20 28 68 61 76 65 5f 66 75 6c 6c 66 73 79 6e  d (have_fullfsyn
19e20 63 3d 25 64 20 66 75 6c 6c 73 79 6e 63 3d 25 64  c=%d fullsync=%d
19e30 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 64 69 72  )\n", pFile->dir
19e40 66 64 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  fd,.            
19e50 48 41 56 45 5f 46 55 4c 4c 46 53 59 4e 43 2c 20  HAVE_FULLFSYNC, 
19e60 69 73 46 75 6c 6c 73 79 6e 63 29 3b 0a 23 69 66  isFullsync);.#if
19e70 6e 64 65 66 20 53 51 4c 49 54 45 5f 44 49 53 41  ndef SQLITE_DISA
19e80 42 4c 45 5f 44 49 52 53 59 4e 43 0a 20 20 20 20  BLE_DIRSYNC.    
19e90 2f 2a 20 54 68 65 20 64 69 72 65 63 74 6f 72 79  /* The directory
19ea0 20 73 79 6e 63 20 69 73 20 6f 6e 6c 79 20 61 74   sync is only at
19eb0 74 65 6d 70 74 65 64 20 69 66 20 66 75 6c 6c 5f  tempted if full_
19ec0 66 73 79 6e 63 20 69 73 0a 20 20 20 20 2a 2a 20  fsync is.    ** 
19ed0 74 75 72 6e 65 64 20 6f 66 66 20 6f 72 20 75 6e  turned off or un
19ee0 61 76 61 69 6c 61 62 6c 65 2e 20 20 49 66 20 61  available.  If a
19ef0 20 66 75 6c 6c 5f 66 73 79 6e 63 20 6f 63 63 75   full_fsync occu
19f00 72 72 65 64 20 61 62 6f 76 65 2c 0a 20 20 20 20  rred above,.    
19f10 2a 2a 20 74 68 65 6e 20 74 68 65 20 64 69 72 65  ** then the dire
19f20 63 74 6f 72 79 20 73 79 6e 63 20 69 73 20 73 75  ctory sync is su
19f30 70 65 72 66 6c 75 6f 75 73 2e 0a 20 20 20 20 2a  perfluous..    *
19f40 2f 0a 20 20 20 20 69 66 28 20 28 21 48 41 56 45  /.    if( (!HAVE
19f50 5f 46 55 4c 4c 46 53 59 4e 43 20 7c 7c 20 21 69  _FULLFSYNC || !i
19f60 73 46 75 6c 6c 73 79 6e 63 29 20 26 26 20 66 75  sFullsync) && fu
19f70 6c 6c 5f 66 73 79 6e 63 28 70 46 69 6c 65 2d 3e  ll_fsync(pFile->
19f80 64 69 72 66 64 2c 30 2c 30 29 20 29 7b 0a 20 20  dirfd,0,0) ){.  
19f90 20 20 20 20 20 2f 2a 0a 20 20 20 20 20 20 20 2a       /*.       *
19fa0 2a 20 57 65 20 68 61 76 65 20 72 65 63 65 69 76  * We have receiv
19fb0 65 64 20 6d 75 6c 74 69 70 6c 65 20 72 65 70 6f  ed multiple repo
19fc0 72 74 73 20 6f 66 20 66 73 79 6e 63 28 29 20 72  rts of fsync() r
19fd0 65 74 75 72 6e 69 6e 67 0a 20 20 20 20 20 20 20  eturning.       
19fe0 2a 2a 20 65 72 72 6f 72 73 20 77 68 65 6e 20 61  ** errors when a
19ff0 70 70 6c 69 65 64 20 74 6f 20 64 69 72 65 63 74  pplied to direct
1a000 6f 72 69 65 73 20 6f 6e 20 63 65 72 74 61 69 6e  ories on certain
1a010 20 66 69 6c 65 20 73 79 73 74 65 6d 73 2e 0a 20   file systems.. 
1a020 20 20 20 20 20 20 2a 2a 20 41 20 66 61 69 6c 65        ** A faile
1a030 64 20 64 69 72 65 63 74 6f 72 79 20 73 79 6e 63  d directory sync
1a040 20 69 73 20 6e 6f 74 20 61 20 62 69 67 20 64 65   is not a big de
1a050 61 6c 2e 20 20 53 6f 20 69 74 20 73 65 65 6d 73  al.  So it seems
1a060 0a 20 20 20 20 20 20 20 2a 2a 20 62 65 74 74 65  .       ** bette
1a070 72 20 74 6f 20 69 67 6e 6f 72 65 20 74 68 65 20  r to ignore the 
1a080 65 72 72 6f 72 2e 20 20 54 69 63 6b 65 74 20 23  error.  Ticket #
1a090 31 36 35 37 0a 20 20 20 20 20 20 20 2a 2f 0a 20  1657.       */. 
1a0a0 20 20 20 20 20 20 2f 2a 20 70 46 69 6c 65 2d 3e        /* pFile->
1a0b0 6c 61 73 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e  lastErrno = errn
1a0c0 6f 3b 20 2a 2f 0a 20 20 20 20 20 20 20 2f 2a 20  o; */.       /* 
1a0d0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f  return SQLITE_IO
1a0e0 45 52 52 3b 20 2a 2f 0a 20 20 20 20 7d 0a 23 65  ERR; */.    }.#e
1a0f0 6e 64 69 66 0a 20 20 20 20 65 72 72 20 3d 20 63  ndif.    err = c
1a100 6c 6f 73 65 28 70 46 69 6c 65 2d 3e 64 69 72 66  lose(pFile->dirf
1a110 64 29 3b 20 2f 2a 20 4f 6e 6c 79 20 6e 65 65 64  d); /* Only need
1a120 20 74 6f 20 73 79 6e 63 20 6f 6e 63 65 2c 20 73   to sync once, s
1a130 6f 20 63 6c 6f 73 65 20 74 68 65 20 2a 2f 0a 20  o close the */. 
1a140 20 20 20 69 66 28 20 65 72 72 3d 3d 30 20 29 7b     if( err==0 ){
1a150 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1a160 20 64 69 72 65 63 74 6f 72 79 20 77 68 65 6e 20   directory when 
1a170 77 65 20 61 72 65 20 64 6f 6e 65 20 2a 2f 0a 20  we are done */. 
1a180 20 20 20 20 20 70 46 69 6c 65 2d 3e 64 69 72 66       pFile->dirf
1a190 64 20 3d 20 2d 31 3b 0a 20 20 20 20 7d 65 6c 73  d = -1;.    }els
1a1a0 65 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e  e{.      pFile->
1a1b0 6c 61 73 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e  lastErrno = errn
1a1c0 6f 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  o;.      rc = SQ
1a1d0 4c 49 54 45 5f 49 4f 45 52 52 5f 44 49 52 5f 43  LITE_IOERR_DIR_C
1a1e0 4c 4f 53 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  LOSE;.    }.  }.
1a1f0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
1a200 2f 2a 0a 2a 2a 20 54 72 75 6e 63 61 74 65 20 61  /*.** Truncate a
1a210 6e 20 6f 70 65 6e 20 66 69 6c 65 20 74 6f 20 61  n open file to a
1a220 20 73 70 65 63 69 66 69 65 64 20 73 69 7a 65 0a   specified size.
1a230 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e  */.static int un
1a240 69 78 54 72 75 6e 63 61 74 65 28 73 71 6c 69 74  ixTruncate(sqlit
1a250 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 36 34  e3_file *id, i64
1a260 20 6e 42 79 74 65 29 7b 0a 20 20 69 6e 74 20 72   nByte){.  int r
1a270 63 3b 0a 20 20 61 73 73 65 72 74 28 20 69 64 20  c;.  assert( id 
1a280 29 3b 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45  );.  SimulateIOE
1a290 72 72 6f 72 28 20 72 65 74 75 72 6e 20 53 51 4c  rror( return SQL
1a2a0 49 54 45 5f 49 4f 45 52 52 5f 54 52 55 4e 43 41  ITE_IOERR_TRUNCA
1a2b0 54 45 20 29 3b 0a 20 20 72 63 20 3d 20 66 74 72  TE );.  rc = ftr
1a2c0 75 6e 63 61 74 65 28 28 28 75 6e 69 78 46 69 6c  uncate(((unixFil
1a2d0 65 2a 29 69 64 29 2d 3e 68 2c 20 28 6f 66 66 5f  e*)id)->h, (off_
1a2e0 74 29 6e 42 79 74 65 29 3b 0a 20 20 69 66 28 20  t)nByte);.  if( 
1a2f0 72 63 20 29 7b 0a 20 20 20 20 28 28 75 6e 69 78  rc ){.    ((unix
1a300 46 69 6c 65 2a 29 69 64 29 2d 3e 6c 61 73 74 45  File*)id)->lastE
1a310 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20  rrno = errno;.  
1a320 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1a330 49 4f 45 52 52 5f 54 52 55 4e 43 41 54 45 3b 0a  IOERR_TRUNCATE;.
1a340 20 20 7d 65 6c 73 65 7b 0a 23 69 66 6e 64 65 66    }else{.#ifndef
1a350 20 4e 44 45 42 55 47 0a 20 20 20 20 2f 2a 20 49   NDEBUG.    /* I
1a360 66 20 77 65 20 61 72 65 20 64 6f 69 6e 67 20 61  f we are doing a
1a370 20 6e 6f 72 6d 61 6c 20 77 72 69 74 65 20 74 6f   normal write to
1a380 20 61 20 64 61 74 61 62 61 73 65 20 66 69 6c 65   a database file
1a390 20 28 61 73 20 6f 70 70 6f 73 65 64 20 74 6f 0a   (as opposed to.
1a3a0 20 20 20 20 2a 2a 20 64 6f 69 6e 67 20 61 20 68      ** doing a h
1a3b0 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62  ot-journal rollb
1a3c0 61 63 6b 20 6f 72 20 61 20 77 72 69 74 65 20 74  ack or a write t
1a3d0 6f 20 73 6f 6d 65 20 66 69 6c 65 20 6f 74 68 65  o some file othe
1a3e0 72 20 74 68 61 6e 20 61 0a 20 20 20 20 2a 2a 20  r than a.    ** 
1a3f0 6e 6f 72 6d 61 6c 20 64 61 74 61 62 61 73 65 20  normal database 
1a400 66 69 6c 65 29 20 61 6e 64 20 77 65 20 74 72 75  file) and we tru
1a410 6e 63 61 74 65 20 74 68 65 20 66 69 6c 65 20 74  ncate the file t
1a420 6f 20 7a 65 72 6f 20 6c 65 6e 67 74 68 2c 0a 20  o zero length,. 
1a430 20 20 20 2a 2a 20 74 68 61 74 20 65 66 66 65 63     ** that effec
1a440 74 69 76 65 6c 79 20 75 70 64 61 74 65 73 20 74  tively updates t
1a450 68 65 20 63 68 61 6e 67 65 20 63 6f 75 6e 74 65  he change counte
1a460 72 2e 20 20 54 68 69 73 20 6d 69 67 68 74 20 68  r.  This might h
1a470 61 70 70 65 6e 0a 20 20 20 20 2a 2a 20 77 68 65  appen.    ** whe
1a480 6e 20 72 65 73 74 6f 72 69 6e 67 20 61 20 64 61  n restoring a da
1a490 74 61 62 61 73 65 20 75 73 69 6e 67 20 74 68 65  tabase using the
1a4a0 20 62 61 63 6b 75 70 20 41 50 49 20 66 72 6f 6d   backup API from
1a4b0 20 61 20 7a 65 72 6f 2d 6c 65 6e 67 74 68 0a 20   a zero-length. 
1a4c0 20 20 20 2a 2a 20 73 6f 75 72 63 65 2e 0a 20 20     ** source..  
1a4d0 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 28 28 75    */.    if( ((u
1a4e0 6e 69 78 46 69 6c 65 2a 29 69 64 29 2d 3e 69 6e  nixFile*)id)->in
1a4f0 4e 6f 72 6d 61 6c 57 72 69 74 65 20 26 26 20 6e  NormalWrite && n
1a500 42 79 74 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Byte==0 ){.     
1a510 20 28 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 29   ((unixFile*)id)
1a520 2d 3e 74 72 61 6e 73 43 6e 74 72 43 68 6e 67 20  ->transCntrChng 
1a530 3d 20 31 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  = 1;.    }.#endi
1a540 66 0a 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  f..    return SQ
1a550 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 7d 0a 0a  LITE_OK;.  }.}..
1a560 2f 2a 0a 2a 2a 20 44 65 74 65 72 6d 69 6e 65 20  /*.** Determine 
1a570 74 68 65 20 63 75 72 72 65 6e 74 20 73 69 7a 65  the current size
1a580 20 6f 66 20 61 20 66 69 6c 65 20 69 6e 20 62 79   of a file in by
1a590 74 65 73 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  tes.*/.static in
1a5a0 74 20 75 6e 69 78 46 69 6c 65 53 69 7a 65 28 73  t unixFileSize(s
1a5b0 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c  qlite3_file *id,
1a5c0 20 69 36 34 20 2a 70 53 69 7a 65 29 7b 0a 20 20   i64 *pSize){.  
1a5d0 69 6e 74 20 72 63 3b 0a 20 20 73 74 72 75 63 74  int rc;.  struct
1a5e0 20 73 74 61 74 20 62 75 66 3b 0a 20 20 61 73 73   stat buf;.  ass
1a5f0 65 72 74 28 20 69 64 20 29 3b 0a 20 20 72 63 20  ert( id );.  rc 
1a600 3d 20 66 73 74 61 74 28 28 28 75 6e 69 78 46 69  = fstat(((unixFi
1a610 6c 65 2a 29 69 64 29 2d 3e 68 2c 20 26 62 75 66  le*)id)->h, &buf
1a620 29 3b 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45  );.  SimulateIOE
1a630 72 72 6f 72 28 20 72 63 3d 31 20 29 3b 0a 20 20  rror( rc=1 );.  
1a640 69 66 28 20 72 63 21 3d 30 20 29 7b 0a 20 20 20  if( rc!=0 ){.   
1a650 20 28 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 29   ((unixFile*)id)
1a660 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 65 72  ->lastErrno = er
1a670 72 6e 6f 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  rno;.    return 
1a680 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 46 53 54  SQLITE_IOERR_FST
1a690 41 54 3b 0a 20 20 7d 0a 20 20 2a 70 53 69 7a 65  AT;.  }.  *pSize
1a6a0 20 3d 20 62 75 66 2e 73 74 5f 73 69 7a 65 3b 0a   = buf.st_size;.
1a6b0 0a 20 20 2f 2a 20 57 68 65 6e 20 6f 70 65 6e 69  .  /* When openi
1a6c0 6e 67 20 61 20 7a 65 72 6f 2d 73 69 7a 65 20 64  ng a zero-size d
1a6d0 61 74 61 62 61 73 65 2c 20 74 68 65 20 66 69 6e  atabase, the fin
1a6e0 64 4c 6f 63 6b 49 6e 66 6f 28 29 20 70 72 6f 63  dLockInfo() proc
1a6f0 65 64 75 72 65 0a 20 20 2a 2a 20 77 72 69 74 65  edure.  ** write
1a700 73 20 61 20 73 69 6e 67 6c 65 20 62 79 74 65 20  s a single byte 
1a710 69 6e 74 6f 20 74 68 61 74 20 66 69 6c 65 20 69  into that file i
1a720 6e 20 6f 72 64 65 72 20 74 6f 20 77 6f 72 6b 20  n order to work 
1a730 61 72 6f 75 6e 64 20 61 20 62 75 67 0a 20 20 2a  around a bug.  *
1a740 2a 20 69 6e 20 74 68 65 20 4f 53 2d 58 20 6d 73  * in the OS-X ms
1a750 64 6f 73 20 66 69 6c 65 73 79 73 74 65 6d 2e 20  dos filesystem. 
1a760 20 49 6e 20 6f 72 64 65 72 20 74 6f 20 61 76 6f   In order to avo
1a770 69 64 20 70 72 6f 62 6c 65 6d 73 20 77 69 74 68  id problems with
1a780 20 75 70 70 65 72 0a 20 20 2a 2a 20 6c 61 79 65   upper.  ** laye
1a790 72 73 2c 20 77 65 20 6e 65 65 64 20 74 6f 20 72  rs, we need to r
1a7a0 65 70 6f 72 74 20 74 68 69 73 20 66 69 6c 65 20  eport this file 
1a7b0 73 69 7a 65 20 61 73 20 7a 65 72 6f 20 65 76 65  size as zero eve
1a7c0 6e 20 74 68 6f 75 67 68 20 69 74 20 69 73 0a 20  n though it is. 
1a7d0 20 2a 2a 20 72 65 61 6c 6c 79 20 31 2e 20 20 20   ** really 1.   
1a7e0 54 69 63 6b 65 74 20 23 33 32 36 30 2e 0a 20 20  Ticket #3260..  
1a7f0 2a 2f 0a 20 20 69 66 28 20 2a 70 53 69 7a 65 3d  */.  if( *pSize=
1a800 3d 31 20 29 20 2a 70 53 69 7a 65 20 3d 20 30 3b  =1 ) *pSize = 0;
1a810 0a 0a 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  ...  return SQLI
1a820 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 20 53 51  TE_OK;.}..#if SQ
1a830 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b  LITE_ENABLE_LOCK
1a840 49 4e 47 5f 53 54 59 4c 45 20 26 26 20 64 65 66  ING_STYLE && def
1a850 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 0a  ined(__APPLE__).
1a860 2f 2a 0a 2a 2a 20 48 61 6e 64 6c 65 72 20 66 6f  /*.** Handler fo
1a870 72 20 70 72 6f 78 79 2d 6c 6f 63 6b 69 6e 67 20  r proxy-locking 
1a880 66 69 6c 65 2d 63 6f 6e 74 72 6f 6c 20 76 65 72  file-control ver
1a890 62 73 2e 20 20 44 65 66 69 6e 65 64 20 62 65 6c  bs.  Defined bel
1a8a0 6f 77 20 69 6e 20 74 68 65 0a 2a 2a 20 70 72 6f  ow in the.** pro
1a8b0 78 79 69 6e 67 20 6c 6f 63 6b 69 6e 67 20 64 69  xying locking di
1a8c0 76 69 73 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69  vision..*/.stati
1a8d0 63 20 69 6e 74 20 70 72 6f 78 79 46 69 6c 65 43  c int proxyFileC
1a8e0 6f 6e 74 72 6f 6c 28 73 71 6c 69 74 65 33 5f 66  ontrol(sqlite3_f
1a8f0 69 6c 65 2a 2c 69 6e 74 2c 76 6f 69 64 2a 29 3b  ile*,int,void*);
1a900 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20  .#endif.../*.** 
1a910 49 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 6e 64 20  Information and 
1a920 63 6f 6e 74 72 6f 6c 20 6f 66 20 61 6e 20 6f 70  control of an op
1a930 65 6e 20 66 69 6c 65 20 68 61 6e 64 6c 65 2e 0a  en file handle..
1a940 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e  */.static int un
1a950 69 78 46 69 6c 65 43 6f 6e 74 72 6f 6c 28 73 71  ixFileControl(sq
1a960 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20  lite3_file *id, 
1a970 69 6e 74 20 6f 70 2c 20 76 6f 69 64 20 2a 70 41  int op, void *pA
1a980 72 67 29 7b 0a 20 20 73 77 69 74 63 68 28 20 6f  rg){.  switch( o
1a990 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20 53 51  p ){.    case SQ
1a9a0 4c 49 54 45 5f 46 43 4e 54 4c 5f 4c 4f 43 4b 53  LITE_FCNTL_LOCKS
1a9b0 54 41 54 45 3a 20 7b 0a 20 20 20 20 20 20 2a 28  TATE: {.      *(
1a9c0 69 6e 74 2a 29 70 41 72 67 20 3d 20 28 28 75 6e  int*)pArg = ((un
1a9d0 69 78 46 69 6c 65 2a 29 69 64 29 2d 3e 6c 6f 63  ixFile*)id)->loc
1a9e0 6b 74 79 70 65 3b 0a 20 20 20 20 20 20 72 65 74  ktype;.      ret
1a9f0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
1aa00 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53 51     }.    case SQ
1aa10 4c 49 54 45 5f 4c 41 53 54 5f 45 52 52 4e 4f 3a  LITE_LAST_ERRNO:
1aa20 20 7b 0a 20 20 20 20 20 20 2a 28 69 6e 74 2a 29   {.      *(int*)
1aa30 70 41 72 67 20 3d 20 28 28 75 6e 69 78 46 69 6c  pArg = ((unixFil
1aa40 65 2a 29 69 64 29 2d 3e 6c 61 73 74 45 72 72 6e  e*)id)->lastErrn
1aa50 6f 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  o;.      return 
1aa60 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d  SQLITE_OK;.    }
1aa70 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a  .#ifndef NDEBUG.
1aa80 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65 72      /* The pager
1aa90 20 63 61 6c 6c 73 20 74 68 69 73 20 6d 65 74 68   calls this meth
1aaa0 6f 64 20 74 6f 20 73 69 67 6e 61 6c 20 74 68 61  od to signal tha
1aab0 74 20 69 74 20 68 61 73 20 64 6f 6e 65 0a 20 20  t it has done.  
1aac0 20 20 2a 2a 20 61 20 72 6f 6c 6c 62 61 63 6b 20    ** a rollback 
1aad0 61 6e 64 20 74 68 61 74 20 74 68 65 20 64 61 74  and that the dat
1aae0 61 62 61 73 65 20 69 73 20 74 68 65 72 65 66 6f  abase is therefo
1aaf0 72 65 20 75 6e 63 68 61 6e 67 65 64 20 61 6e 64  re unchanged and
1ab00 0a 20 20 20 20 2a 2a 20 69 74 20 68 65 6e 63 65  .    ** it hence
1ab10 20 69 74 20 69 73 20 4f 4b 20 66 6f 72 20 74 68   it is OK for th
1ab20 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 68  e transaction ch
1ab30 61 6e 67 65 20 63 6f 75 6e 74 65 72 20 74 6f 20  ange counter to 
1ab40 62 65 0a 20 20 20 20 2a 2a 20 75 6e 63 68 61 6e  be.    ** unchan
1ab50 67 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ged..    */.    
1ab60 63 61 73 65 20 53 51 4c 49 54 45 5f 46 43 4e 54  case SQLITE_FCNT
1ab70 4c 5f 44 42 5f 55 4e 43 48 41 4e 47 45 44 3a 20  L_DB_UNCHANGED: 
1ab80 7b 0a 20 20 20 20 20 20 28 28 75 6e 69 78 46 69  {.      ((unixFi
1ab90 6c 65 2a 29 69 64 29 2d 3e 64 62 55 70 64 61 74  le*)id)->dbUpdat
1aba0 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 65 74  e = 0;.      ret
1abb0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
1abc0 20 20 20 7d 0a 23 65 6e 64 69 66 0a 23 69 66 20     }.#endif.#if 
1abd0 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f  SQLITE_ENABLE_LO
1abe0 43 4b 49 4e 47 5f 53 54 59 4c 45 20 26 26 20 64  CKING_STYLE && d
1abf0 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f  efined(__APPLE__
1ac00 29 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  ).    case SQLIT
1ac10 45 5f 53 45 54 5f 4c 4f 43 4b 50 52 4f 58 59 46  E_SET_LOCKPROXYF
1ac20 49 4c 45 3a 0a 20 20 20 20 63 61 73 65 20 53 51  ILE:.    case SQ
1ac30 4c 49 54 45 5f 47 45 54 5f 4c 4f 43 4b 50 52 4f  LITE_GET_LOCKPRO
1ac40 58 59 46 49 4c 45 3a 20 7b 0a 20 20 20 20 20 20  XYFILE: {.      
1ac50 72 65 74 75 72 6e 20 70 72 6f 78 79 46 69 6c 65  return proxyFile
1ac60 43 6f 6e 74 72 6f 6c 28 69 64 2c 6f 70 2c 70 41  Control(id,op,pA
1ac70 72 67 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  rg);.    }.#endi
1ac80 66 20 2f 2a 20 53 51 4c 49 54 45 5f 45 4e 41 42  f /* SQLITE_ENAB
1ac90 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45  LE_LOCKING_STYLE
1aca0 20 26 26 20 64 65 66 69 6e 65 64 28 5f 5f 41 50   && defined(__AP
1acb0 50 4c 45 5f 5f 29 20 2a 2f 0a 20 20 7d 0a 20 20  PLE__) */.  }.  
1acc0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52  return SQLITE_ER
1acd0 52 4f 52 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  ROR;.}../*.** Re
1ace0 74 75 72 6e 20 74 68 65 20 73 65 63 74 6f 72 20  turn the sector 
1acf0 73 69 7a 65 20 69 6e 20 62 79 74 65 73 20 6f 66  size in bytes of
1ad00 20 74 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20   the underlying 
1ad10 62 6c 6f 63 6b 20 64 65 76 69 63 65 20 66 6f 72  block device for
1ad20 0a 2a 2a 20 74 68 65 20 73 70 65 63 69 66 69 65  .** the specifie
1ad30 64 20 66 69 6c 65 2e 20 54 68 69 73 20 69 73 20  d file. This is 
1ad40 61 6c 6d 6f 73 74 20 61 6c 77 61 79 73 20 35 31  almost always 51
1ad50 32 20 62 79 74 65 73 2c 20 62 75 74 20 6d 61 79  2 bytes, but may
1ad60 20 62 65 0a 2a 2a 20 6c 61 72 67 65 72 20 66 6f   be.** larger fo
1ad70 72 20 73 6f 6d 65 20 64 65 76 69 63 65 73 2e 0a  r some devices..
1ad80 2a 2a 0a 2a 2a 20 53 51 4c 69 74 65 20 63 6f 64  **.** SQLite cod
1ad90 65 20 61 73 73 75 6d 65 73 20 74 68 69 73 20 66  e assumes this f
1ada0 75 6e 63 74 69 6f 6e 20 63 61 6e 6e 6f 74 20 66  unction cannot f
1adb0 61 69 6c 2e 20 49 74 20 61 6c 73 6f 20 61 73 73  ail. It also ass
1adc0 75 6d 65 73 20 74 68 61 74 0a 2a 2a 20 69 66 20  umes that.** if 
1add0 74 77 6f 20 66 69 6c 65 73 20 61 72 65 20 63 72  two files are cr
1ade0 65 61 74 65 64 20 69 6e 20 74 68 65 20 73 61 6d  eated in the sam
1adf0 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 64 69  e file-system di
1ae00 72 65 63 74 6f 72 79 20 28 69 2e 65 2e 0a 2a 2a  rectory (i.e..**
1ae10 20 61 20 64 61 74 61 62 61 73 65 20 61 6e 64 20   a database and 
1ae20 69 74 73 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  its journal file
1ae30 29 20 74 68 61 74 20 74 68 65 20 73 65 63 74 6f  ) that the secto
1ae40 72 20 73 69 7a 65 20 77 69 6c 6c 20 62 65 20 74  r size will be t
1ae50 68 65 0a 2a 2a 20 73 61 6d 65 20 66 6f 72 20 62  he.** same for b
1ae60 6f 74 68 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  oth..*/.static i
1ae70 6e 74 20 75 6e 69 78 53 65 63 74 6f 72 53 69 7a  nt unixSectorSiz
1ae80 65 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  e(sqlite3_file *
1ae90 4e 6f 74 55 73 65 64 29 7b 0a 20 20 55 4e 55 53  NotUsed){.  UNUS
1aea0 45 44 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f 74  ED_PARAMETER(Not
1aeb0 55 73 65 64 29 3b 0a 20 20 72 65 74 75 72 6e 20  Used);.  return 
1aec0 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 53  SQLITE_DEFAULT_S
1aed0 45 43 54 4f 52 5f 53 49 5a 45 3b 0a 7d 0a 0a 2f  ECTOR_SIZE;.}../
1aee0 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
1aef0 64 65 76 69 63 65 20 63 68 61 72 61 63 74 65 72  device character
1af00 69 73 74 69 63 73 20 66 6f 72 20 74 68 65 20 66  istics for the f
1af10 69 6c 65 2e 20 54 68 69 73 20 69 73 20 61 6c 77  ile. This is alw
1af20 61 79 73 20 30 20 66 6f 72 20 75 6e 69 78 2e 0a  ays 0 for unix..
1af30 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e  */.static int un
1af40 69 78 44 65 76 69 63 65 43 68 61 72 61 63 74 65  ixDeviceCharacte
1af50 72 69 73 74 69 63 73 28 73 71 6c 69 74 65 33 5f  ristics(sqlite3_
1af60 66 69 6c 65 20 2a 4e 6f 74 55 73 65 64 29 7b 0a  file *NotUsed){.
1af70 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
1af80 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20 72  ER(NotUsed);.  r
1af90 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn 0;.}../*.*
1afa0 2a 20 48 65 72 65 20 65 6e 64 73 20 74 68 65 20  * Here ends the 
1afb0 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f  implementation o
1afc0 66 20 61 6c 6c 20 73 71 6c 69 74 65 33 5f 66 69  f all sqlite3_fi
1afd0 6c 65 20 6d 65 74 68 6f 64 73 2e 0a 2a 2a 0a 2a  le methods..**.*
1afe0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1aff0 2a 2a 2a 2a 2a 20 45 6e 64 20 73 71 6c 69 74 65  ***** End sqlite
1b000 33 5f 66 69 6c 65 20 4d 65 74 68 6f 64 73 20 2a  3_file Methods *
1b010 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1b020 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a  **************.*
1b030 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1b040 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1b050 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1b060 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1b070 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a  *************/..
1b080 2f 2a 0a 2a 2a 20 54 68 69 73 20 64 69 76 69 73  /*.** This divis
1b090 69 6f 6e 20 63 6f 6e 74 61 69 6e 73 20 64 65 66  ion contains def
1b0a0 69 6e 69 74 69 6f 6e 73 20 6f 66 20 73 71 6c 69  initions of sqli
1b0b0 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 6f  te3_io_methods o
1b0c0 62 6a 65 63 74 73 20 74 68 61 74 0a 2a 2a 20 69  bjects that.** i
1b0d0 6d 70 6c 65 6d 65 6e 74 20 76 61 72 69 6f 75 73  mplement various
1b0e0 20 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 20 73 74   file locking st
1b0f0 72 61 74 65 67 69 65 73 2e 20 20 49 74 20 61 6c  rategies.  It al
1b100 73 6f 20 63 6f 6e 74 61 69 6e 73 20 64 65 66 69  so contains defi
1b110 6e 69 74 69 6f 6e 73 0a 2a 2a 20 6f 66 20 22 66  nitions.** of "f
1b120 69 6e 64 65 72 22 20 66 75 6e 63 74 69 6f 6e 73  inder" functions
1b130 2e 20 20 41 20 66 69 6e 64 65 72 2d 66 75 6e 63  .  A finder-func
1b140 74 69 6f 6e 20 69 73 20 75 73 65 64 20 74 6f 20  tion is used to 
1b150 6c 6f 63 61 74 65 20 74 68 65 20 61 70 70 72 6f  locate the appro
1b160 70 72 69 61 74 65 0a 2a 2a 20 73 71 6c 69 74 65  priate.** sqlite
1b170 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 6f 62 6a  3_io_methods obj
1b180 65 63 74 20 66 6f 72 20 61 20 70 61 72 74 69 63  ect for a partic
1b190 75 6c 61 72 20 64 61 74 61 62 61 73 65 20 66 69  ular database fi
1b1a0 6c 65 2e 20 20 54 68 65 20 70 41 70 70 44 61 74  le.  The pAppDat
1b1b0 61 0a 2a 2a 20 66 69 65 6c 64 20 6f 66 20 74 68  a.** field of th
1b1c0 65 20 73 71 6c 69 74 65 33 5f 76 66 73 20 56 46  e sqlite3_vfs VF
1b1d0 53 20 6f 62 6a 65 63 74 73 20 61 72 65 20 69 6e  S objects are in
1b1e0 69 74 69 61 6c 69 7a 65 64 20 74 6f 20 62 65 20  itialized to be 
1b1f0 70 6f 69 6e 74 65 72 73 20 74 6f 0a 2a 2a 20 74  pointers to.** t
1b200 68 65 20 63 6f 72 72 65 63 74 20 66 69 6e 64 65  he correct finde
1b210 72 2d 66 75 6e 63 74 69 6f 6e 20 66 6f 72 20 74  r-function for t
1b220 68 61 74 20 56 46 53 2e 0a 2a 2a 0a 2a 2a 20 4d  hat VFS..**.** M
1b230 6f 73 74 20 66 69 6e 64 65 72 20 66 75 6e 63 74  ost finder funct
1b240 69 6f 6e 73 20 72 65 74 75 72 6e 20 61 20 70 6f  ions return a po
1b250 69 6e 74 65 72 20 74 6f 20 61 20 66 69 78 65 64  inter to a fixed
1b260 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68   sqlite3_io_meth
1b270 6f 64 73 0a 2a 2a 20 6f 62 6a 65 63 74 2e 20 20  ods.** object.  
1b280 54 68 65 20 6f 6e 6c 79 20 69 6e 74 65 72 65 73  The only interes
1b290 74 69 6e 67 20 66 69 6e 64 65 72 2d 66 75 6e 63  ting finder-func
1b2a0 74 69 6f 6e 20 69 73 20 61 75 74 6f 6c 6f 63 6b  tion is autolock
1b2b0 49 6f 46 69 6e 64 65 72 2c 20 77 68 69 63 68 0a  IoFinder, which.
1b2c0 2a 2a 20 6c 6f 6f 6b 73 20 61 74 20 74 68 65 20  ** looks at the 
1b2d0 66 69 6c 65 73 79 73 74 65 6d 20 74 79 70 65 20  filesystem type 
1b2e0 61 6e 64 20 74 72 69 65 73 20 74 6f 20 67 75 65  and tries to gue
1b2f0 73 73 20 74 68 65 20 62 65 73 74 20 6c 6f 63 6b  ss the best lock
1b300 69 6e 67 0a 2a 2a 20 73 74 72 61 74 65 67 79 20  ing.** strategy 
1b310 66 72 6f 6d 20 74 68 61 74 2e 0a 2a 2a 0a 2a 2a  from that..**.**
1b320 20 46 6f 72 20 66 69 6e 64 65 72 2d 66 75 6e 74   For finder-funt
1b330 69 6f 6e 20 46 2c 20 74 77 6f 20 6f 62 6a 65 63  ion F, two objec
1b340 74 73 20 61 72 65 20 63 72 65 61 74 65 64 3a 0a  ts are created:.
1b350 2a 2a 0a 2a 2a 20 20 20 20 28 31 29 20 54 68 65  **.**    (1) The
1b360 20 72 65 61 6c 20 66 69 6e 64 65 72 2d 66 75 6e   real finder-fun
1b370 63 74 69 6f 6e 20 6e 61 6d 65 64 20 22 46 49 6d  ction named "FIm
1b380 70 74 28 29 22 2e 0a 2a 2a 0a 2a 2a 20 20 20 20  pt()"..**.**    
1b390 28 32 29 20 41 20 63 6f 6e 73 74 61 6e 74 20 70  (2) A constant p
1b3a0 6f 69 6e 74 65 72 20 74 6f 20 74 68 69 73 20 66  ointer to this f
1b3b0 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 64 20 6a 75  unction named ju
1b3c0 73 74 20 22 46 22 2e 0a 2a 2a 0a 2a 2a 0a 2a 2a  st "F"..**.**.**
1b3d0 20 41 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68   A pointer to th
1b3e0 65 20 46 20 70 6f 69 6e 74 65 72 20 69 73 20 75  e F pointer is u
1b3f0 73 65 64 20 61 73 20 74 68 65 20 70 41 70 70 44  sed as the pAppD
1b400 61 74 61 20 76 61 6c 75 65 20 66 6f 72 20 56 46  ata value for VF
1b410 53 0a 2a 2a 20 6f 62 6a 65 63 74 73 2e 20 20 57  S.** objects.  W
1b420 65 20 68 61 76 65 20 74 6f 20 64 6f 20 74 68 69  e have to do thi
1b430 73 20 69 6e 73 74 65 61 64 20 6f 66 20 6c 65 74  s instead of let
1b440 74 69 6e 67 20 70 41 70 70 44 61 74 61 20 70 6f  ting pAppData po
1b450 69 6e 74 0a 2a 2a 20 64 69 72 65 63 74 6c 79 20  int.** directly 
1b460 61 74 20 74 68 65 20 66 69 6e 64 65 72 2d 66 75  at the finder-fu
1b470 6e 63 74 69 6f 6e 20 73 69 6e 63 65 20 43 39 30  nction since C90
1b480 20 72 75 6c 65 73 20 70 72 65 76 65 6e 74 20 61   rules prevent a
1b490 20 76 6f 69 64 2a 0a 2a 2a 20 66 72 6f 6d 20 62   void*.** from b
1b4a0 65 20 63 61 73 74 20 69 6e 74 6f 20 61 20 66 75  e cast into a fu
1b4b0 6e 63 74 69 6f 6e 20 70 6f 69 6e 74 65 72 2e 0a  nction pointer..
1b4c0 2a 2a 0a 2a 2a 0a 2a 2a 20 45 61 63 68 20 69 6e  **.**.** Each in
1b4d0 73 74 61 6e 63 65 20 6f 66 20 74 68 69 73 20 6d  stance of this m
1b4e0 61 63 72 6f 20 67 65 6e 65 72 61 74 65 73 20 74  acro generates t
1b4f0 77 6f 20 6f 62 6a 65 63 74 73 3a 0a 2a 2a 0a 2a  wo objects:.**.*
1b500 2a 20 20 20 2a 20 20 41 20 63 6f 6e 73 74 61 6e  *   *  A constan
1b510 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74  t sqlite3_io_met
1b520 68 6f 64 73 20 6f 62 6a 65 63 74 20 63 61 6c 6c  hods object call
1b530 20 4d 45 54 48 4f 44 20 74 68 61 74 20 68 61 73   METHOD that has
1b540 20 6c 6f 63 6b 69 6e 67 0a 2a 2a 20 20 20 20 20   locking.**     
1b550 20 6d 65 74 68 6f 64 73 20 43 4c 4f 53 45 2c 20   methods CLOSE, 
1b560 4c 4f 43 4b 2c 20 55 4e 4c 4f 43 4b 2c 20 43 4b  LOCK, UNLOCK, CK
1b570 52 45 53 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 20  RESLOCK..**.**  
1b580 20 2a 20 20 41 6e 20 49 2f 4f 20 6d 65 74 68 6f   *  An I/O metho
1b590 64 20 66 69 6e 64 65 72 20 66 75 6e 63 74 69 6f  d finder functio
1b5a0 6e 20 63 61 6c 6c 65 64 20 46 49 4e 44 45 52 20  n called FINDER 
1b5b0 74 68 61 74 20 72 65 74 75 72 6e 73 20 61 20 70  that returns a p
1b5c0 6f 69 6e 74 65 72 0a 2a 2a 20 20 20 20 20 20 74  ointer.**      t
1b5d0 6f 20 74 68 65 20 4d 45 54 48 4f 44 20 6f 62 6a  o the METHOD obj
1b5e0 65 63 74 20 69 6e 20 74 68 65 20 70 72 65 76 69  ect in the previ
1b5f0 6f 75 73 20 62 75 6c 6c 65 74 2e 0a 2a 2f 0a 23  ous bullet..*/.#
1b600 64 65 66 69 6e 65 20 49 4f 4d 45 54 48 4f 44 53  define IOMETHODS
1b610 28 46 49 4e 44 45 52 2c 20 4d 45 54 48 4f 44 2c  (FINDER, METHOD,
1b620 20 43 4c 4f 53 45 2c 20 4c 4f 43 4b 2c 20 55 4e   CLOSE, LOCK, UN
1b630 4c 4f 43 4b 2c 20 43 4b 4c 4f 43 4b 29 20 20 20  LOCK, CKLOCK)   
1b640 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 73 74              \.st
1b650 61 74 69 63 20 63 6f 6e 73 74 20 73 71 6c 69 74  atic const sqlit
1b660 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 4d 45  e3_io_methods ME
1b670 54 48 4f 44 20 3d 20 7b 20 20 20 20 20 20 20 20  THOD = {        
1b680 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b690 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20             \.   
1b6a0 31 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  1,              
1b6b0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 69              /* i
1b6c0 56 65 72 73 69 6f 6e 20 2a 2f 20 20 20 20 20 20  Version */      
1b6d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b6e0 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 43            \.   C
1b6f0 4c 4f 53 45 2c 20 20 20 20 20 20 20 20 20 20 20  LOSE,           
1b700 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 43             /* xC
1b710 6c 6f 73 65 20 2a 2f 20 20 20 20 20 20 20 20 20  lose */         
1b720 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b730 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 75 6e           \.   un
1b740 69 78 52 65 61 64 2c 20 20 20 20 20 20 20 20 20  ixRead,         
1b750 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 52 65            /* xRe
1b760 61 64 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20  ad */           
1b770 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b780 20 20 20 20 20 20 20 20 5c 0a 20 20 20 75 6e 69          \.   uni
1b790 78 57 72 69 74 65 2c 20 20 20 20 20 20 20 20 20  xWrite,         
1b7a0 20 20 20 20 20 20 20 20 20 2f 2a 20 78 57 72 69           /* xWri
1b7b0 74 65 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20  te */           
1b7c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b7d0 20 20 20 20 20 20 20 5c 0a 20 20 20 75 6e 69 78         \.   unix
1b7e0 54 72 75 6e 63 61 74 65 2c 20 20 20 20 20 20 20  Truncate,       
1b7f0 20 20 20 20 20 20 20 20 2f 2a 20 78 54 72 75 6e          /* xTrun
1b800 63 61 74 65 20 2a 2f 20 20 20 20 20 20 20 20 20  cate */         
1b810 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b820 20 20 20 20 20 20 5c 0a 20 20 20 75 6e 69 78 53        \.   unixS
1b830 79 6e 63 2c 20 20 20 20 20 20 20 20 20 20 20 20  ync,            
1b840 20 20 20 20 20 20 20 2f 2a 20 78 53 79 6e 63 20         /* xSync 
1b850 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20 20 20  */              
1b860 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b870 20 20 20 20 20 5c 0a 20 20 20 75 6e 69 78 46 69       \.   unixFi
1b880 6c 65 53 69 7a 65 2c 20 20 20 20 20 20 20 20 20  leSize,         
1b890 20 20 20 20 20 20 2f 2a 20 78 46 69 6c 65 53 69        /* xFileSi
1b8a0 7a 65 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20  ze */           
1b8b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b8c0 20 20 20 20 5c 0a 20 20 20 4c 4f 43 4b 2c 20 20      \.   LOCK,  
1b8d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b8e0 20 20 20 20 20 2f 2a 20 78 4c 6f 63 6b 20 2a 2f       /* xLock */
1b8f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b900 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b910 20 20 20 5c 0a 20 20 20 55 4e 4c 4f 43 4b 2c 20     \.   UNLOCK, 
1b920 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b930 20 20 20 20 2f 2a 20 78 55 6e 6c 6f 63 6b 20 2a      /* xUnlock *
1b940 2f 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  /               
1b950 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b960 20 20 5c 0a 20 20 20 43 4b 4c 4f 43 4b 2c 20 20    \.   CKLOCK,  
1b970 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b980 20 20 20 2f 2a 20 78 43 68 65 63 6b 52 65 73 65     /* xCheckRese
1b990 72 76 65 64 4c 6f 63 6b 20 2a 2f 20 20 20 20 20  rvedLock */     
1b9a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b9b0 20 5c 0a 20 20 20 75 6e 69 78 46 69 6c 65 43 6f   \.   unixFileCo
1b9c0 6e 74 72 6f 6c 2c 20 20 20 20 20 20 20 20 20 20  ntrol,          
1b9d0 20 20 2f 2a 20 78 46 69 6c 65 43 6f 6e 74 72 6f    /* xFileContro
1b9e0 6c 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20  l */            
1b9f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ba00 5c 0a 20 20 20 75 6e 69 78 53 65 63 74 6f 72 53  \.   unixSectorS
1ba10 69 7a 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  ize,            
1ba20 20 2f 2a 20 78 53 65 63 74 6f 72 53 69 7a 65 20   /* xSectorSize 
1ba30 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20 20 20  */              
1ba40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c                 \
1ba50 0a 20 20 20 75 6e 69 78 44 65 76 69 63 65 43 68  .   unixDeviceCh
1ba60 61 72 61 63 74 65 72 69 73 74 69 63 73 20 20 20  aracteristics   
1ba70 2f 2a 20 78 44 65 76 69 63 65 43 61 70 61 62 69  /* xDeviceCapabi
1ba80 6c 69 74 69 65 73 20 2a 2f 20 20 20 20 20 20 20  lities */       
1ba90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a                \.
1baa0 7d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  };              
1bab0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bac0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bad0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bae0 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 73               \.s
1baf0 74 61 74 69 63 20 63 6f 6e 73 74 20 73 71 6c 69  tatic const sqli
1bb00 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 2a  te3_io_methods *
1bb10 46 49 4e 44 45 52 23 23 49 6d 70 6c 28 63 6f 6e  FINDER##Impl(con
1bb20 73 74 20 63 68 61 72 20 2a 7a 2c 20 75 6e 69 78  st char *z, unix
1bb30 46 69 6c 65 20 2a 70 29 7b 20 20 20 5c 0a 20 20  File *p){   \.  
1bb40 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
1bb50 28 7a 29 3b 20 55 4e 55 53 45 44 5f 50 41 52 41  (z); UNUSED_PARA
1bb60 4d 45 54 45 52 28 70 29 3b 20 20 20 20 20 20 20  METER(p);       
1bb70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bb80 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 72             \.  r
1bb90 65 74 75 72 6e 20 26 4d 45 54 48 4f 44 3b 20 20  eturn &METHOD;  
1bba0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bbb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bbc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bbd0 20 20 20 20 20 20 20 20 20 20 5c 0a 7d 20 20 20            \.}   
1bbe0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bbf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bc00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bc10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bc20 20 20 20 20 20 20 20 20 20 5c 0a 73 74 61 74 69           \.stati
1bc30 63 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f  c const sqlite3_
1bc40 69 6f 5f 6d 65 74 68 6f 64 73 20 2a 28 2a 63 6f  io_methods *(*co
1bc50 6e 73 74 20 46 49 4e 44 45 52 29 28 63 6f 6e 73  nst FINDER)(cons
1bc60 74 20 63 68 61 72 2a 2c 75 6e 69 78 46 69 6c 65  t char*,unixFile
1bc70 20 2a 70 29 20 20 20 20 5c 0a 20 20 20 20 3d 20   *p)    \.    = 
1bc80 46 49 4e 44 45 52 23 23 49 6d 70 6c 3b 0a 0a 2f  FINDER##Impl;../
1bc90 2a 0a 2a 2a 20 48 65 72 65 20 61 72 65 20 61 6c  *.** Here are al
1bca0 6c 20 6f 66 20 74 68 65 20 73 71 6c 69 74 65 33  l of the sqlite3
1bcb0 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 6f 62 6a 65  _io_methods obje
1bcc0 63 74 73 20 66 6f 72 20 65 61 63 68 20 6f 66 20  cts for each of 
1bcd0 74 68 65 0a 2a 2a 20 6c 6f 63 6b 69 6e 67 20 73  the.** locking s
1bce0 74 72 61 74 65 67 69 65 73 2e 20 20 46 75 6e 63  trategies.  Func
1bcf0 74 69 6f 6e 73 20 74 68 61 74 20 72 65 74 75 72  tions that retur
1bd00 6e 20 70 6f 69 6e 74 65 72 73 20 74 6f 20 74 68  n pointers to th
1bd10 65 73 65 20 6d 65 74 68 6f 64 73 0a 2a 2a 20 61  ese methods.** a
1bd20 72 65 20 61 6c 73 6f 20 63 72 65 61 74 65 64 2e  re also created.
1bd30 0a 2a 2f 0a 49 4f 4d 45 54 48 4f 44 53 28 0a 20  .*/.IOMETHODS(. 
1bd40 20 70 6f 73 69 78 49 6f 46 69 6e 64 65 72 2c 20   posixIoFinder, 
1bd50 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69             /* Fi
1bd60 6e 64 65 72 20 66 75 6e 63 74 69 6f 6e 20 6e 61  nder function na
1bd70 6d 65 20 2a 2f 0a 20 20 70 6f 73 69 78 49 6f 4d  me */.  posixIoM
1bd80 65 74 68 6f 64 73 2c 20 20 20 20 20 20 20 20 20  ethods,         
1bd90 20 20 2f 2a 20 73 71 6c 69 74 65 33 5f 69 6f 5f    /* sqlite3_io_
1bda0 6d 65 74 68 6f 64 73 20 6f 62 6a 65 63 74 20 6e  methods object n
1bdb0 61 6d 65 20 2a 2f 0a 20 20 75 6e 69 78 43 6c 6f  ame */.  unixClo
1bdc0 73 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  se,             
1bdd0 20 20 20 2f 2a 20 78 43 6c 6f 73 65 20 6d 65 74     /* xClose met
1bde0 68 6f 64 20 2a 2f 0a 20 20 75 6e 69 78 4c 6f 63  hod */.  unixLoc
1bdf0 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  k,              
1be00 20 20 20 2f 2a 20 78 4c 6f 63 6b 20 6d 65 74 68     /* xLock meth
1be10 6f 64 20 2a 2f 0a 20 20 75 6e 69 78 55 6e 6c 6f  od */.  unixUnlo
1be20 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ck,             
1be30 20 20 2f 2a 20 78 55 6e 6c 6f 63 6b 20 6d 65 74    /* xUnlock met
1be40 68 6f 64 20 2a 2f 0a 20 20 75 6e 69 78 43 68 65  hod */.  unixChe
1be50 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 20 20  ckReservedLock  
1be60 20 20 20 2f 2a 20 78 43 68 65 63 6b 52 65 73 65     /* xCheckRese
1be70 72 76 65 64 4c 6f 63 6b 20 6d 65 74 68 6f 64 20  rvedLock method 
1be80 2a 2f 0a 29 0a 49 4f 4d 45 54 48 4f 44 53 28 0a  */.).IOMETHODS(.
1be90 20 20 6e 6f 6c 6f 63 6b 49 6f 46 69 6e 64 65 72    nolockIoFinder
1bea0 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46  ,           /* F
1beb0 69 6e 64 65 72 20 66 75 6e 63 74 69 6f 6e 20 6e  inder function n
1bec0 61 6d 65 20 2a 2f 0a 20 20 6e 6f 6c 6f 63 6b 49  ame */.  nolockI
1bed0 6f 4d 65 74 68 6f 64 73 2c 20 20 20 20 20 20 20  oMethods,       
1bee0 20 20 20 2f 2a 20 73 71 6c 69 74 65 33 5f 69 6f     /* sqlite3_io
1bef0 5f 6d 65 74 68 6f 64 73 20 6f 62 6a 65 63 74 20  _methods object 
1bf00 6e 61 6d 65 20 2a 2f 0a 20 20 6e 6f 6c 6f 63 6b  name */.  nolock
1bf10 43 6c 6f 73 65 2c 20 20 20 20 20 20 20 20 20 20  Close,          
1bf20 20 20 20 20 2f 2a 20 78 43 6c 6f 73 65 20 6d 65      /* xClose me
1bf30 74 68 6f 64 20 2a 2f 0a 20 20 6e 6f 6c 6f 63 6b  thod */.  nolock
1bf40 4c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20  Lock,           
1bf50 20 20 20 20 2f 2a 20 78 4c 6f 63 6b 20 6d 65 74      /* xLock met
1bf60 68 6f 64 20 2a 2f 0a 20 20 6e 6f 6c 6f 63 6b 55  hod */.  nolockU
1bf70 6e 6c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20  nlock,          
1bf80 20 20 20 2f 2a 20 78 55 6e 6c 6f 63 6b 20 6d 65     /* xUnlock me
1bf90 74 68 6f 64 20 2a 2f 0a 20 20 6e 6f 6c 6f 63 6b  thod */.  nolock
1bfa0 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63  CheckReservedLoc
1bfb0 6b 20 20 20 2f 2a 20 78 43 68 65 63 6b 52 65 73  k   /* xCheckRes
1bfc0 65 72 76 65 64 4c 6f 63 6b 20 6d 65 74 68 6f 64  ervedLock method
1bfd0 20 2a 2f 0a 29 0a 49 4f 4d 45 54 48 4f 44 53 28   */.).IOMETHODS(
1bfe0 0a 20 20 64 6f 74 6c 6f 63 6b 49 6f 46 69 6e 64  .  dotlockIoFind
1bff0 65 72 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  er,          /* 
1c000 46 69 6e 64 65 72 20 66 75 6e 63 74 69 6f 6e 20  Finder function 
1c010 6e 61 6d 65 20 2a 2f 0a 20 20 64 6f 74 6c 6f 63  name */.  dotloc
1c020 6b 49 6f 4d 65 74 68 6f 64 73 2c 20 20 20 20 20  kIoMethods,     
1c030 20 20 20 20 2f 2a 20 73 71 6c 69 74 65 33 5f 69      /* sqlite3_i
1c040 6f 5f 6d 65 74 68 6f 64 73 20 6f 62 6a 65 63 74  o_methods object
1c050 20 6e 61 6d 65 20 2a 2f 0a 20 20 64 6f 74 6c 6f   name */.  dotlo
1c060 63 6b 43 6c 6f 73 65 2c 20 20 20 20 20 20 20 20  ckClose,        
1c070 20 20 20 20 20 2f 2a 20 78 43 6c 6f 73 65 20 6d       /* xClose m
1c080 65 74 68 6f 64 20 2a 2f 0a 20 20 64 6f 74 6c 6f  ethod */.  dotlo
1c090 63 6b 4c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20  ckLock,         
1c0a0 20 20 20 20 20 2f 2a 20 78 4c 6f 63 6b 20 6d 65       /* xLock me
1c0b0 74 68 6f 64 20 2a 2f 0a 20 20 64 6f 74 6c 6f 63  thod */.  dotloc
1c0c0 6b 55 6e 6c 6f 63 6b 2c 20 20 20 20 20 20 20 20  kUnlock,        
1c0d0 20 20 20 20 2f 2a 20 78 55 6e 6c 6f 63 6b 20 6d      /* xUnlock m
1c0e0 65 74 68 6f 64 20 2a 2f 0a 20 20 64 6f 74 6c 6f  ethod */.  dotlo
1c0f0 63 6b 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c  ckCheckReservedL
1c100 6f 63 6b 20 20 2f 2a 20 78 43 68 65 63 6b 52 65  ock  /* xCheckRe
1c110 73 65 72 76 65 64 4c 6f 63 6b 20 6d 65 74 68 6f  servedLock metho
1c120 64 20 2a 2f 0a 29 0a 0a 23 69 66 20 53 51 4c 49  d */.)..#if SQLI
1c130 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e  TE_ENABLE_LOCKIN
1c140 47 5f 53 54 59 4c 45 20 26 26 20 21 4f 53 5f 56  G_STYLE && !OS_V
1c150 58 57 4f 52 4b 53 0a 49 4f 4d 45 54 48 4f 44 53  XWORKS.IOMETHODS
1c160 28 0a 20 20 66 6c 6f 63 6b 49 6f 46 69 6e 64 65  (.  flockIoFinde
1c170 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  r,            /*
1c180 20 46 69 6e 64 65 72 20 66 75 6e 63 74 69 6f 6e   Finder function
1c190 20 6e 61 6d 65 20 2a 2f 0a 20 20 66 6c 6f 63 6b   name */.  flock
1c1a0 49 6f 4d 65 74 68 6f 64 73 2c 20 20 20 20 20 20  IoMethods,      
1c1b0 20 20 20 20 20 2f 2a 20 73 71 6c 69 74 65 33 5f       /* sqlite3_
1c1c0 69 6f 5f 6d 65 74 68 6f 64 73 20 6f 62 6a 65 63  io_methods objec
1c1d0 74 20 6e 61 6d 65 20 2a 2f 0a 20 20 66 6c 6f 63  t name */.  floc
1c1e0 6b 43 6c 6f 73 65 2c 20 20 20 20 20 20 20 20 20  kClose,         
1c1f0 20 20 20 20 20 20 2f 2a 20 78 43 6c 6f 73 65 20        /* xClose 
1c200 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 66 6c 6f 63  method */.  floc
1c210 6b 4c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20  kLock,          
1c220 20 20 20 20 20 20 2f 2a 20 78 4c 6f 63 6b 20 6d        /* xLock m
1c230 65 74 68 6f 64 20 2a 2f 0a 20 20 66 6c 6f 63 6b  ethod */.  flock
1c240 55 6e 6c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20  Unlock,         
1c250 20 20 20 20 20 2f 2a 20 78 55 6e 6c 6f 63 6b 20       /* xUnlock 
1c260 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 66 6c 6f 63  method */.  floc
1c270 6b 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f  kCheckReservedLo
1c280 63 6b 20 20 20 20 2f 2a 20 78 43 68 65 63 6b 52  ck    /* xCheckR
1c290 65 73 65 72 76 65 64 4c 6f 63 6b 20 6d 65 74 68  eservedLock meth
1c2a0 6f 64 20 2a 2f 0a 29 0a 23 65 6e 64 69 66 0a 0a  od */.).#endif..
1c2b0 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 49  #if OS_VXWORKS.I
1c2c0 4f 4d 45 54 48 4f 44 53 28 0a 20 20 73 65 6d 49  OMETHODS(.  semI
1c2d0 6f 46 69 6e 64 65 72 2c 20 20 20 20 20 20 20 20  oFinder,        
1c2e0 20 20 20 20 20 20 2f 2a 20 46 69 6e 64 65 72 20        /* Finder 
1c2f0 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 20 2a 2f  function name */
1c300 0a 20 20 73 65 6d 49 6f 4d 65 74 68 6f 64 73 2c  .  semIoMethods,
1c310 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1c320 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f  sqlite3_io_metho
1c330 64 73 20 6f 62 6a 65 63 74 20 6e 61 6d 65 20 2a  ds object name *
1c340 2f 0a 20 20 73 65 6d 43 6c 6f 73 65 2c 20 20 20  /.  semClose,   
1c350 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1c360 20 78 43 6c 6f 73 65 20 6d 65 74 68 6f 64 20 2a   xClose method *
1c370 2f 0a 20 20 73 65 6d 4c 6f 63 6b 2c 20 20 20 20  /.  semLock,    
1c380 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1c390 20 78 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f   xLock method */
1c3a0 0a 20 20 73 65 6d 55 6e 6c 6f 63 6b 2c 20 20 20  .  semUnlock,   
1c3b0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1c3c0 78 55 6e 6c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a  xUnlock method *
1c3d0 2f 0a 20 20 73 65 6d 43 68 65 63 6b 52 65 73 65  /.  semCheckRese
1c3e0 72 76 65 64 4c 6f 63 6b 20 20 20 20 20 20 2f 2a  rvedLock      /*
1c3f0 20 78 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c   xCheckReservedL
1c400 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 29 0a  ock method */.).
1c410 23 65 6e 64 69 66 0a 0a 23 69 66 20 64 65 66 69  #endif..#if defi
1c420 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 26  ned(__APPLE__) &
1c430 26 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  & SQLITE_ENABLE_
1c440 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 49 4f  LOCKING_STYLE.IO
1c450 4d 45 54 48 4f 44 53 28 0a 20 20 61 66 70 49 6f  METHODS(.  afpIo
1c460 46 69 6e 64 65 72 2c 20 20 20 20 20 20 20 20 20  Finder,         
1c470 20 20 20 20 20 2f 2a 20 46 69 6e 64 65 72 20 66       /* Finder f
1c480 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 20 2a 2f 0a  unction name */.
1c490 20 20 61 66 70 49 6f 4d 65 74 68 6f 64 73 2c 20    afpIoMethods, 
1c4a0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73              /* s
1c4b0 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64  qlite3_io_method
1c4c0 73 20 6f 62 6a 65 63 74 20 6e 61 6d 65 20 2a 2f  s object name */
1c4d0 0a 20 20 61 66 70 43 6c 6f 73 65 2c 20 20 20 20  .  afpClose,    
1c4e0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1c4f0 78 43 6c 6f 73 65 20 6d 65 74 68 6f 64 20 2a 2f  xClose method */
1c500 0a 20 20 61 66 70 4c 6f 63 6b 2c 20 20 20 20 20  .  afpLock,     
1c510 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1c520 78 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a  xLock method */.
1c530 20 20 61 66 70 55 6e 6c 6f 63 6b 2c 20 20 20 20    afpUnlock,    
1c540 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
1c550 55 6e 6c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f  Unlock method */
1c560 0a 20 20 61 66 70 43 68 65 63 6b 52 65 73 65 72  .  afpCheckReser
1c570 76 65 64 4c 6f 63 6b 20 20 20 20 20 20 2f 2a 20  vedLock      /* 
1c580 78 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f  xCheckReservedLo
1c590 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 29 0a 23  ck method */.).#
1c5a0 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  endif../*.** The
1c5b0 20 70 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 20 6d   proxy locking m
1c5c0 65 74 68 6f 64 20 69 73 20 61 20 22 73 75 70 65  ethod is a "supe
1c5d0 72 2d 6d 65 74 68 6f 64 22 20 69 6e 20 74 68 65  r-method" in the
1c5e0 20 73 65 6e 73 65 20 74 68 61 74 20 69 74 0a 2a   sense that it.*
1c5f0 2a 20 6f 70 65 6e 73 20 73 65 63 6f 6e 64 61 72  * opens secondar
1c600 79 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  y file descripto
1c610 72 73 20 66 6f 72 20 74 68 65 20 63 6f 6e 63 68  rs for the conch
1c620 20 61 6e 64 20 6c 6f 63 6b 20 66 69 6c 65 73 20   and lock files 
1c630 61 6e 64 0a 2a 2a 20 69 74 20 75 73 65 73 20 70  and.** it uses p
1c640 72 6f 78 79 2c 20 64 6f 74 2d 66 69 6c 65 2c 20  roxy, dot-file, 
1c650 41 46 50 2c 20 61 6e 64 20 66 6c 6f 63 6b 28 29  AFP, and flock()
1c660 20 6c 6f 63 6b 69 6e 67 20 6d 65 74 68 6f 64 73   locking methods
1c670 20 6f 6e 20 74 68 6f 73 65 0a 2a 2a 20 73 65 63   on those.** sec
1c680 6f 6e 64 61 72 79 20 66 69 6c 65 73 2e 20 20 46  ondary files.  F
1c690 6f 72 20 74 68 69 73 20 72 65 61 73 6f 6e 2c 20  or this reason, 
1c6a0 74 68 65 20 64 69 76 69 73 69 6f 6e 20 74 68 61  the division tha
1c6b0 74 20 69 6d 70 6c 65 6d 65 6e 74 73 0a 2a 2a 20  t implements.** 
1c6c0 70 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 20 69 73  proxy locking is
1c6d0 20 6c 6f 63 61 74 65 64 20 6d 75 63 68 20 66 75   located much fu
1c6e0 72 74 68 65 72 20 64 6f 77 6e 20 69 6e 20 74 68  rther down in th
1c6f0 65 20 66 69 6c 65 2e 20 20 42 75 74 20 77 65 20  e file.  But we 
1c700 6e 65 65 64 0a 2a 2a 20 74 6f 20 67 6f 20 61 68  need.** to go ah
1c710 65 61 64 20 61 6e 64 20 64 65 66 69 6e 65 20 74  ead and define t
1c720 68 65 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65  he sqlite3_io_me
1c730 74 68 6f 64 73 20 61 6e 64 20 66 69 6e 64 65 72  thods and finder
1c740 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 66 6f 72   function.** for
1c750 20 70 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 20 68   proxy locking h
1c760 65 72 65 2e 20 20 53 6f 20 77 65 20 66 6f 72 77  ere.  So we forw
1c770 61 72 64 20 64 65 63 6c 61 72 65 20 74 68 65 20  ard declare the 
1c780 49 2f 4f 20 6d 65 74 68 6f 64 73 2e 0a 2a 2f 0a  I/O methods..*/.
1c790 23 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 41 50  #if defined(__AP
1c7a0 50 4c 45 5f 5f 29 20 26 26 20 53 51 4c 49 54 45  PLE__) && SQLITE
1c7b0 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f  _ENABLE_LOCKING_
1c7c0 53 54 59 4c 45 0a 73 74 61 74 69 63 20 69 6e 74  STYLE.static int
1c7d0 20 70 72 6f 78 79 43 6c 6f 73 65 28 73 71 6c 69   proxyClose(sqli
1c7e0 74 65 33 5f 66 69 6c 65 2a 29 3b 0a 73 74 61 74  te3_file*);.stat
1c7f0 69 63 20 69 6e 74 20 70 72 6f 78 79 4c 6f 63 6b  ic int proxyLock
1c800 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 2c 20  (sqlite3_file*, 
1c810 69 6e 74 29 3b 0a 73 74 61 74 69 63 20 69 6e 74  int);.static int
1c820 20 70 72 6f 78 79 55 6e 6c 6f 63 6b 28 73 71 6c   proxyUnlock(sql
1c830 69 74 65 33 5f 66 69 6c 65 2a 2c 20 69 6e 74 29  ite3_file*, int)
1c840 3b 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72 6f  ;.static int pro
1c850 78 79 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c  xyCheckReservedL
1c860 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  ock(sqlite3_file
1c870 2a 2c 20 69 6e 74 2a 29 3b 0a 49 4f 4d 45 54 48  *, int*);.IOMETH
1c880 4f 44 53 28 0a 20 20 70 72 6f 78 79 49 6f 46 69  ODS(.  proxyIoFi
1c890 6e 64 65 72 2c 20 20 20 20 20 20 20 20 20 20 20  nder,           
1c8a0 20 2f 2a 20 46 69 6e 64 65 72 20 66 75 6e 63 74   /* Finder funct
1c8b0 69 6f 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20 70 72  ion name */.  pr
1c8c0 6f 78 79 49 6f 4d 65 74 68 6f 64 73 2c 20 20 20  oxyIoMethods,   
1c8d0 20 20 20 20 20 20 20 20 2f 2a 20 73 71 6c 69 74          /* sqlit
1c8e0 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 6f 62  e3_io_methods ob
1c8f0 6a 65 63 74 20 6e 61 6d 65 20 2a 2f 0a 20 20 70  ject name */.  p
1c900 72 6f 78 79 43 6c 6f 73 65 2c 20 20 20 20 20 20  roxyClose,      
1c910 20 20 20 20 20 20 20 20 20 2f 2a 20 78 43 6c 6f           /* xClo
1c920 73 65 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 70  se method */.  p
1c930 72 6f 78 79 4c 6f 63 6b 2c 20 20 20 20 20 20 20  roxyLock,       
1c940 20 20 20 20 20 20 20 20 20 2f 2a 20 78 4c 6f 63           /* xLoc
1c950 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 70 72  k method */.  pr
1c960 6f 78 79 55 6e 6c 6f 63 6b 2c 20 20 20 20 20 20  oxyUnlock,      
1c970 20 20 20 20 20 20 20 20 2f 2a 20 78 55 6e 6c 6f          /* xUnlo
1c980 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 70  ck method */.  p
1c990 72 6f 78 79 43 68 65 63 6b 52 65 73 65 72 76 65  roxyCheckReserve
1c9a0 64 4c 6f 63 6b 20 20 20 20 2f 2a 20 78 43 68 65  dLock    /* xChe
1c9b0 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 20 6d  ckReservedLock m
1c9c0 65 74 68 6f 64 20 2a 2f 0a 29 0a 23 65 6e 64 69  ethod */.).#endi
1c9d0 66 0a 0a 2f 2a 20 6e 66 73 20 6c 6f 63 6b 64 20  f../* nfs lockd 
1c9e0 6f 6e 20 4f 53 58 20 31 30 2e 33 2b 20 64 6f 65  on OSX 10.3+ doe
1c9f0 73 6e 27 74 20 63 6c 65 61 72 20 77 72 69 74 65  sn't clear write
1ca00 20 6c 6f 63 6b 73 20 77 68 65 6e 20 61 20 72 65   locks when a re
1ca10 61 64 20 6c 6f 63 6b 20 69 73 20 73 65 74 20 2a  ad lock is set *
1ca20 2f 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f 5f  /.#if defined(__
1ca30 41 50 50 4c 45 5f 5f 29 20 26 26 20 53 51 4c 49  APPLE__) && SQLI
1ca40 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e  TE_ENABLE_LOCKIN
1ca50 47 5f 53 54 59 4c 45 0a 49 4f 4d 45 54 48 4f 44  G_STYLE.IOMETHOD
1ca60 53 28 0a 20 20 6e 66 73 49 6f 46 69 6e 64 65 72  S(.  nfsIoFinder
1ca70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
1ca80 2f 2a 20 46 69 6e 64 65 72 20 66 75 6e 63 74 69  /* Finder functi
1ca90 6f 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20 6e 66 73  on name */.  nfs
1caa0 49 6f 4d 65 74 68 6f 64 73 2c 20 20 20 20 20 20  IoMethods,      
1cab0 20 20 20 20 20 20 20 20 2f 2a 20 73 71 6c 69 74          /* sqlit
1cac0 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 6f 62  e3_io_methods ob
1cad0 6a 65 63 74 20 6e 61 6d 65 20 2a 2f 0a 20 20 75  ject name */.  u
1cae0 6e 69 78 43 6c 6f 73 65 2c 20 20 20 20 20 20 20  nixClose,       
1caf0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 43 6c            /* xCl
1cb00 6f 73 65 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20  ose method */.  
1cb10 75 6e 69 78 4c 6f 63 6b 2c 20 20 20 20 20 20 20  unixLock,       
1cb20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 4c             /* xL
1cb30 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20  ock method */.  
1cb40 6e 66 73 55 6e 6c 6f 63 6b 2c 20 20 20 20 20 20  nfsUnlock,      
1cb50 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 55             /* xU
1cb60 6e 6c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a  nlock method */.
1cb70 20 20 75 6e 69 78 43 68 65 63 6b 52 65 73 65 72    unixCheckReser
1cb80 76 65 64 4c 6f 63 6b 20 20 20 20 20 20 2f 2a 20  vedLock      /* 
1cb90 78 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f  xCheckReservedLo
1cba0 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 29 0a 23  ck method */.).#
1cbb0 65 6e 64 69 66 0a 0a 23 69 66 20 64 65 66 69 6e  endif..#if defin
1cbc0 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 26 26  ed(__APPLE__) &&
1cbd0 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c   SQLITE_ENABLE_L
1cbe0 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 2f 2a 20  OCKING_STYLE./* 
1cbf0 0a 2a 2a 20 54 68 69 73 20 22 66 69 6e 64 65 72  .** This "finder
1cc00 22 20 66 75 6e 63 74 69 6f 6e 20 61 74 74 65 6d  " function attem
1cc10 70 74 73 20 74 6f 20 64 65 74 65 72 6d 69 6e 65  pts to determine
1cc20 20 74 68 65 20 62 65 73 74 20 6c 6f 63 6b 69 6e   the best lockin
1cc30 67 20 73 74 72 61 74 65 67 79 20 0a 2a 2a 20 66  g strategy .** f
1cc40 6f 72 20 74 68 65 20 64 61 74 61 62 61 73 65 20  or the database 
1cc50 66 69 6c 65 20 22 66 69 6c 65 50 61 74 68 22 2e  file "filePath".
1cc60 20 20 49 74 20 74 68 65 6e 20 72 65 74 75 72 6e    It then return
1cc70 73 20 74 68 65 20 73 71 6c 69 74 65 33 5f 69 6f  s the sqlite3_io
1cc80 5f 6d 65 74 68 6f 64 73 0a 2a 2a 20 6f 62 6a 65  _methods.** obje
1cc90 63 74 20 74 68 61 74 20 69 6d 70 6c 65 6d 65 6e  ct that implemen
1cca0 74 73 20 74 68 61 74 20 73 74 72 61 74 65 67 79  ts that strategy
1ccb0 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20  ..**.** This is 
1ccc0 66 6f 72 20 4d 61 63 4f 53 58 20 6f 6e 6c 79 2e  for MacOSX only.
1ccd0 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74  .*/.static const
1cce0 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68   sqlite3_io_meth
1ccf0 6f 64 73 20 2a 61 75 74 6f 6c 6f 63 6b 49 6f 46  ods *autolockIoF
1cd00 69 6e 64 65 72 49 6d 70 6c 28 0a 20 20 63 6f 6e  inderImpl(.  con
1cd10 73 74 20 63 68 61 72 20 2a 66 69 6c 65 50 61 74  st char *filePat
1cd20 68 2c 20 20 20 20 2f 2a 20 6e 61 6d 65 20 6f 66  h,    /* name of
1cd30 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
1cd40 6c 65 20 2a 2f 0a 20 20 75 6e 69 78 46 69 6c 65  le */.  unixFile
1cd50 20 2a 70 4e 65 77 20 20 20 20 20 20 20 20 20 20   *pNew          
1cd60 20 2f 2a 20 6f 70 65 6e 20 66 69 6c 65 20 6f 62   /* open file ob
1cd70 6a 65 63 74 20 66 6f 72 20 74 68 65 20 64 61 74  ject for the dat
1cd80 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 29 7b  abase file */.){
1cd90 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20  .  static const 
1cda0 73 74 72 75 63 74 20 4d 61 70 70 69 6e 67 20 7b  struct Mapping {
1cdb0 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
1cdc0 2a 7a 46 69 6c 65 73 79 73 74 65 6d 3b 20 20 20  *zFilesystem;   
1cdd0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69             /* Fi
1cde0 6c 65 73 79 73 74 65 6d 20 74 79 70 65 20 6e 61  lesystem type na
1cdf0 6d 65 20 2a 2f 0a 20 20 20 20 63 6f 6e 73 74 20  me */.    const 
1ce00 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f  sqlite3_io_metho
1ce10 64 73 20 2a 70 4d 65 74 68 6f 64 73 3b 20 20 20  ds *pMethods;   
1ce20 2f 2a 20 41 70 70 72 6f 70 72 69 61 74 65 20 6c  /* Appropriate l
1ce30 6f 63 6b 69 6e 67 20 6d 65 74 68 6f 64 20 2a 2f  ocking method */
1ce40 0a 20 20 7d 20 61 4d 61 70 5b 5d 20 3d 20 7b 0a  .  } aMap[] = {.
1ce50 20 20 20 20 7b 20 22 68 66 73 22 2c 20 20 20 20      { "hfs",    
1ce60 26 70 6f 73 69 78 49 6f 4d 65 74 68 6f 64 73 20  &posixIoMethods 
1ce70 7d 2c 0a 20 20 20 20 7b 20 22 75 66 73 22 2c 20  },.    { "ufs", 
1ce80 20 20 20 26 70 6f 73 69 78 49 6f 4d 65 74 68 6f     &posixIoMetho
1ce90 64 73 20 7d 2c 0a 20 20 20 20 7b 20 22 61 66 70  ds },.    { "afp
1cea0 66 73 22 2c 20 20 26 61 66 70 49 6f 4d 65 74 68  fs",  &afpIoMeth
1ceb0 6f 64 73 20 7d 2c 0a 20 20 20 20 7b 20 22 73 6d  ods },.    { "sm
1cec0 62 66 73 22 2c 20 20 26 61 66 70 49 6f 4d 65 74  bfs",  &afpIoMet
1ced0 68 6f 64 73 20 7d 2c 0a 20 20 20 20 7b 20 22 77  hods },.    { "w
1cee0 65 62 64 61 76 22 2c 20 26 6e 6f 6c 6f 63 6b 49  ebdav", &nolockI
1cef0 6f 4d 65 74 68 6f 64 73 20 7d 2c 0a 20 20 20 20  oMethods },.    
1cf00 7b 20 30 2c 20 30 20 7d 0a 20 20 7d 3b 0a 20 20  { 0, 0 }.  };.  
1cf10 69 6e 74 20 69 3b 0a 20 20 73 74 72 75 63 74 20  int i;.  struct 
1cf20 73 74 61 74 66 73 20 66 73 49 6e 66 6f 3b 0a 20  statfs fsInfo;. 
1cf30 20 73 74 72 75 63 74 20 66 6c 6f 63 6b 20 6c 6f   struct flock lo
1cf40 63 6b 49 6e 66 6f 3b 0a 0a 20 20 69 66 28 20 21  ckInfo;..  if( !
1cf50 66 69 6c 65 50 61 74 68 20 29 7b 0a 20 20 20 20  filePath ){.    
1cf60 2f 2a 20 49 66 20 66 69 6c 65 50 61 74 68 3d 3d  /* If filePath==
1cf70 4e 55 4c 4c 20 74 68 61 74 20 6d 65 61 6e 73 20  NULL that means 
1cf80 77 65 20 61 72 65 20 64 65 61 6c 69 6e 67 20 77  we are dealing w
1cf90 69 74 68 20 61 20 74 72 61 6e 73 69 65 6e 74 20  ith a transient 
1cfa0 66 69 6c 65 0a 20 20 20 20 2a 2a 20 74 68 61 74  file.    ** that
1cfb0 20 64 6f 65 73 20 6e 6f 74 20 6e 65 65 64 20 74   does not need t
1cfc0 6f 20 62 65 20 6c 6f 63 6b 65 64 2e 20 2a 2f 0a  o be locked. */.
1cfd0 20 20 20 20 72 65 74 75 72 6e 20 26 6e 6f 6c 6f      return &nolo
1cfe0 63 6b 49 6f 4d 65 74 68 6f 64 73 3b 0a 20 20 7d  ckIoMethods;.  }
1cff0 0a 20 20 69 66 28 20 73 74 61 74 66 73 28 66 69  .  if( statfs(fi
1d000 6c 65 50 61 74 68 2c 20 26 66 73 49 6e 66 6f 29  lePath, &fsInfo)
1d010 20 21 3d 20 2d 31 20 29 7b 0a 20 20 20 20 69 66   != -1 ){.    if
1d020 28 20 66 73 49 6e 66 6f 2e 66 5f 66 6c 61 67 73  ( fsInfo.f_flags
1d030 20 26 20 4d 4e 54 5f 52 44 4f 4e 4c 59 20 29 7b   & MNT_RDONLY ){
1d040 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 26 6e  .      return &n
1d050 6f 6c 6f 63 6b 49 6f 4d 65 74 68 6f 64 73 3b 0a  olockIoMethods;.
1d060 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 69 3d      }.    for(i=
1d070 30 3b 20 61 4d 61 70 5b 69 5d 2e 7a 46 69 6c 65  0; aMap[i].zFile
1d080 73 79 73 74 65 6d 3b 20 69 2b 2b 29 7b 0a 20 20  system; i++){.  
1d090 20 20 20 20 69 66 28 20 73 74 72 63 6d 70 28 66      if( strcmp(f
1d0a0 73 49 6e 66 6f 2e 66 5f 66 73 74 79 70 65 6e 61  sInfo.f_fstypena
1d0b0 6d 65 2c 20 61 4d 61 70 5b 69 5d 2e 7a 46 69 6c  me, aMap[i].zFil
1d0c0 65 73 79 73 74 65 6d 29 3d 3d 30 20 29 7b 0a 20  esystem)==0 ){. 
1d0d0 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 61 4d         return aM
1d0e0 61 70 5b 69 5d 2e 70 4d 65 74 68 6f 64 73 3b 0a  ap[i].pMethods;.
1d0f0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
1d100 7d 0a 0a 20 20 2f 2a 20 44 65 66 61 75 6c 74 20  }..  /* Default 
1d110 63 61 73 65 2e 20 48 61 6e 64 6c 65 73 2c 20 61  case. Handles, a
1d120 6d 6f 6e 67 73 74 20 6f 74 68 65 72 73 2c 20 22  mongst others, "
1d130 6e 66 73 22 2e 0a 20 20 2a 2a 20 54 65 73 74 20  nfs"..  ** Test 
1d140 62 79 74 65 2d 72 61 6e 67 65 20 6c 6f 63 6b 20  byte-range lock 
1d150 75 73 69 6e 67 20 66 63 6e 74 6c 28 29 2e 20 49  using fcntl(). I
1d160 66 20 74 68 65 20 63 61 6c 6c 20 73 75 63 63 65  f the call succe
1d170 65 64 73 2c 20 0a 20 20 2a 2a 20 61 73 73 75 6d  eds, .  ** assum
1d180 65 20 74 68 61 74 20 74 68 65 20 66 69 6c 65 2d  e that the file-
1d190 73 79 73 74 65 6d 20 73 75 70 70 6f 72 74 73 20  system supports 
1d1a0 50 4f 53 49 58 20 73 74 79 6c 65 20 6c 6f 63 6b  POSIX style lock
1d1b0 73 2e 20 0a 20 20 2a 2f 0a 20 20 6c 6f 63 6b 49  s. .  */.  lockI
1d1c0 6e 66 6f 2e 6c 5f 6c 65 6e 20 3d 20 31 3b 0a 20  nfo.l_len = 1;. 
1d1d0 20 6c 6f 63 6b 49 6e 66 6f 2e 6c 5f 73 74 61 72   lockInfo.l_star
1d1e0 74 20 3d 20 30 3b 0a 20 20 6c 6f 63 6b 49 6e 66  t = 0;.  lockInf
1d1f0 6f 2e 6c 5f 77 68 65 6e 63 65 20 3d 20 53 45 45  o.l_whence = SEE
1d200 4b 5f 53 45 54 3b 0a 20 20 6c 6f 63 6b 49 6e 66  K_SET;.  lockInf
1d210 6f 2e 6c 5f 74 79 70 65 20 3d 20 46 5f 52 44 4c  o.l_type = F_RDL
1d220 43 4b 3b 0a 20 20 69 66 28 20 66 63 6e 74 6c 28  CK;.  if( fcntl(
1d230 70 4e 65 77 2d 3e 68 2c 20 46 5f 47 45 54 4c 4b  pNew->h, F_GETLK
1d240 2c 20 26 6c 6f 63 6b 49 6e 66 6f 29 21 3d 2d 31  , &lockInfo)!=-1
1d250 20 29 20 7b 0a 20 20 20 20 69 66 28 20 73 74 72   ) {.    if( str
1d260 63 6d 70 28 66 73 49 6e 66 6f 2e 66 5f 66 73 74  cmp(fsInfo.f_fst
1d270 79 70 65 6e 61 6d 65 2c 20 22 6e 66 73 22 29 3d  ypename, "nfs")=
1d280 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  =0 ){.      retu
1d290 72 6e 20 26 6e 66 73 49 6f 4d 65 74 68 6f 64 73  rn &nfsIoMethods
1d2a0 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20  ;.    } else {. 
1d2b0 20 20 20 20 20 72 65 74 75 72 6e 20 26 70 6f 73       return &pos
1d2c0 69 78 49 6f 4d 65 74 68 6f 64 73 3b 0a 20 20 20  ixIoMethods;.   
1d2d0 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20   }.  }else{.    
1d2e0 72 65 74 75 72 6e 20 26 64 6f 74 6c 6f 63 6b 49  return &dotlockI
1d2f0 6f 4d 65 74 68 6f 64 73 3b 0a 20 20 7d 0a 7d 0a  oMethods;.  }.}.
1d300 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73 71 6c  static const sql
1d310 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20  ite3_io_methods 
1d320 0a 20 20 2a 28 2a 63 6f 6e 73 74 20 61 75 74 6f  .  *(*const auto
1d330 6c 6f 63 6b 49 6f 46 69 6e 64 65 72 29 28 63 6f  lockIoFinder)(co
1d340 6e 73 74 20 63 68 61 72 2a 2c 75 6e 69 78 46 69  nst char*,unixFi
1d350 6c 65 2a 29 20 3d 20 61 75 74 6f 6c 6f 63 6b 49  le*) = autolockI
1d360 6f 46 69 6e 64 65 72 49 6d 70 6c 3b 0a 0a 23 65  oFinderImpl;..#e
1d370 6e 64 69 66 20 2f 2a 20 64 65 66 69 6e 65 64 28  ndif /* defined(
1d380 5f 5f 41 50 50 4c 45 5f 5f 29 20 26 26 20 53 51  __APPLE__) && SQ
1d390 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b  LITE_ENABLE_LOCK
1d3a0 49 4e 47 5f 53 54 59 4c 45 20 2a 2f 0a 0a 23 69  ING_STYLE */..#i
1d3b0 66 20 4f 53 5f 56 58 57 4f 52 4b 53 20 26 26 20  f OS_VXWORKS && 
1d3c0 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f  SQLITE_ENABLE_LO
1d3d0 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 2f 2a 20 0a  CKING_STYLE./* .
1d3e0 2a 2a 20 54 68 69 73 20 22 66 69 6e 64 65 72 22  ** This "finder"
1d3f0 20 66 75 6e 63 74 69 6f 6e 20 61 74 74 65 6d 70   function attemp
1d400 74 73 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20  ts to determine 
1d410 74 68 65 20 62 65 73 74 20 6c 6f 63 6b 69 6e 67  the best locking
1d420 20 73 74 72 61 74 65 67 79 20 0a 2a 2a 20 66 6f   strategy .** fo
1d430 72 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  r the database f
1d440 69 6c 65 20 22 66 69 6c 65 50 61 74 68 22 2e 20  ile "filePath". 
1d450 20 49 74 20 74 68 65 6e 20 72 65 74 75 72 6e 73   It then returns
1d460 20 74 68 65 20 73 71 6c 69 74 65 33 5f 69 6f 5f   the sqlite3_io_
1d470 6d 65 74 68 6f 64 73 0a 2a 2a 20 6f 62 6a 65 63  methods.** objec
1d480 74 20 74 68 61 74 20 69 6d 70 6c 65 6d 65 6e 74  t that implement
1d490 73 20 74 68 61 74 20 73 74 72 61 74 65 67 79 2e  s that strategy.
1d4a0 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 66  .**.** This is f
1d4b0 6f 72 20 56 58 57 6f 72 6b 73 20 6f 6e 6c 79 2e  or VXWorks only.
1d4c0 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74  .*/.static const
1d4d0 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68   sqlite3_io_meth
1d4e0 6f 64 73 20 2a 61 75 74 6f 6c 6f 63 6b 49 6f 46  ods *autolockIoF
1d4f0 69 6e 64 65 72 49 6d 70 6c 28 0a 20 20 63 6f 6e  inderImpl(.  con
1d500 73 74 20 63 68 61 72 20 2a 66 69 6c 65 50 61 74  st char *filePat
1d510 68 2c 20 20 20 20 2f 2a 20 6e 61 6d 65 20 6f 66  h,    /* name of
1d520 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
1d530 6c 65 20 2a 2f 0a 20 20 75 6e 69 78 46 69 6c 65  le */.  unixFile
1d540 20 2a 70 4e 65 77 20 20 20 20 20 20 20 20 20 20   *pNew          
1d550 20 2f 2a 20 74 68 65 20 6f 70 65 6e 20 66 69 6c   /* the open fil
1d560 65 20 6f 62 6a 65 63 74 20 2a 2f 0a 29 7b 0a 20  e object */.){. 
1d570 20 73 74 72 75 63 74 20 66 6c 6f 63 6b 20 6c 6f   struct flock lo
1d580 63 6b 49 6e 66 6f 3b 0a 0a 20 20 69 66 28 20 21  ckInfo;..  if( !
1d590 66 69 6c 65 50 61 74 68 20 29 7b 0a 20 20 20 20  filePath ){.    
1d5a0 2f 2a 20 49 66 20 66 69 6c 65 50 61 74 68 3d 3d  /* If filePath==
1d5b0 4e 55 4c 4c 20 74 68 61 74 20 6d 65 61 6e 73 20  NULL that means 
1d5c0 77 65 20 61 72 65 20 64 65 61 6c 69 6e 67 20 77  we are dealing w
1d5d0 69 74 68 20 61 20 74 72 61 6e 73 69 65 6e 74 20  ith a transient 
1d5e0 66 69 6c 65 0a 20 20 20 20 2a 2a 20 74 68 61 74  file.    ** that
1d5f0 20 64 6f 65 73 20 6e 6f 74 20 6e 65 65 64 20 74   does not need t
1d600 6f 20 62 65 20 6c 6f 63 6b 65 64 2e 20 2a 2f 0a  o be locked. */.
1d610 20 20 20 20 72 65 74 75 72 6e 20 26 6e 6f 6c 6f      return &nolo
1d620 63 6b 49 6f 4d 65 74 68 6f 64 73 3b 0a 20 20 7d  ckIoMethods;.  }
1d630 0a 0a 20 20 2f 2a 20 54 65 73 74 20 69 66 20 66  ..  /* Test if f
1d640 63 6e 74 6c 28 29 20 69 73 20 73 75 70 70 6f 72  cntl() is suppor
1d650 74 65 64 20 61 6e 64 20 75 73 65 20 50 4f 53 49  ted and use POSI
1d660 58 20 73 74 79 6c 65 20 6c 6f 63 6b 73 2e 0a 20  X style locks.. 
1d670 20 2a 2a 20 4f 74 68 65 72 77 69 73 65 20 66 61   ** Otherwise fa
1d680 6c 6c 20 62 61 63 6b 20 74 6f 20 74 68 65 20 6e  ll back to the n
1d690 61 6d 65 64 20 73 65 6d 61 70 68 6f 72 65 20 6d  amed semaphore m
1d6a0 65 74 68 6f 64 2e 0a 20 20 2a 2f 0a 20 20 6c 6f  ethod..  */.  lo
1d6b0 63 6b 49 6e 66 6f 2e 6c 5f 6c 65 6e 20 3d 20 31  ckInfo.l_len = 1
1d6c0 3b 0a 20 20 6c 6f 63 6b 49 6e 66 6f 2e 6c 5f 73  ;.  lockInfo.l_s
1d6d0 74 61 72 74 20 3d 20 30 3b 0a 20 20 6c 6f 63 6b  tart = 0;.  lock
1d6e0 49 6e 66 6f 2e 6c 5f 77 68 65 6e 63 65 20 3d 20  Info.l_whence = 
1d6f0 53 45 45 4b 5f 53 45 54 3b 0a 20 20 6c 6f 63 6b  SEEK_SET;.  lock
1d700 49 6e 66 6f 2e 6c 5f 74 79 70 65 20 3d 20 46 5f  Info.l_type = F_
1d710 52 44 4c 43 4b 3b 0a 20 20 69 66 28 20 66 63 6e  RDLCK;.  if( fcn
1d720 74 6c 28 70 4e 65 77 2d 3e 68 2c 20 46 5f 47 45  tl(pNew->h, F_GE
1d730 54 4c 4b 2c 20 26 6c 6f 63 6b 49 6e 66 6f 29 21  TLK, &lockInfo)!
1d740 3d 2d 31 20 29 20 7b 0a 20 20 20 20 72 65 74 75  =-1 ) {.    retu
1d750 72 6e 20 26 70 6f 73 69 78 49 6f 4d 65 74 68 6f  rn &posixIoMetho
1d760 64 73 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ds;.  }else{.   
1d770 20 72 65 74 75 72 6e 20 26 73 65 6d 49 6f 4d 65   return &semIoMe
1d780 74 68 6f 64 73 3b 0a 20 20 7d 0a 7d 0a 73 74 61  thods;.  }.}.sta
1d790 74 69 63 20 63 6f 6e 73 74 20 73 71 6c 69 74 65  tic const sqlite
1d7a0 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 0a 20 20  3_io_methods .  
1d7b0 2a 28 2a 63 6f 6e 73 74 20 61 75 74 6f 6c 6f 63  *(*const autoloc
1d7c0 6b 49 6f 46 69 6e 64 65 72 29 28 63 6f 6e 73 74  kIoFinder)(const
1d7d0 20 63 68 61 72 2a 2c 75 6e 69 78 46 69 6c 65 2a   char*,unixFile*
1d7e0 29 20 3d 20 61 75 74 6f 6c 6f 63 6b 49 6f 46 69  ) = autolockIoFi
1d7f0 6e 64 65 72 49 6d 70 6c 3b 0a 0a 23 65 6e 64 69  nderImpl;..#endi
1d800 66 20 2f 2a 20 4f 53 5f 56 58 57 4f 52 4b 53 20  f /* OS_VXWORKS 
1d810 26 26 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  && SQLITE_ENABLE
1d820 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 2a  _LOCKING_STYLE *
1d830 2f 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 61 62 73 74  /../*.** An abst
1d840 72 61 63 74 20 74 79 70 65 20 66 6f 72 20 61 20  ract type for a 
1d850 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 49 4f 20  pointer to a IO 
1d860 6d 65 74 68 6f 64 20 66 69 6e 64 65 72 20 66 75  method finder fu
1d870 6e 63 74 69 6f 6e 3a 0a 2a 2f 0a 74 79 70 65 64  nction:.*/.typed
1d880 65 66 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33  ef const sqlite3
1d890 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 2a 28 2a 66  _io_methods *(*f
1d8a0 69 6e 64 65 72 5f 74 79 70 65 29 28 63 6f 6e 73  inder_type)(cons
1d8b0 74 20 63 68 61 72 2a 2c 75 6e 69 78 46 69 6c 65  t char*,unixFile
1d8c0 2a 29 3b 0a 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a  *);.../*********
1d8d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1d8e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1d8f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1d900 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1d910 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ***.************
1d920 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1d930 20 73 71 6c 69 74 65 33 5f 76 66 73 20 6d 65 74   sqlite3_vfs met
1d940 68 6f 64 73 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  hods ***********
1d950 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1d960 2a 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 64 69 76  *.**.** This div
1d970 69 73 69 6f 6e 20 63 6f 6e 74 61 69 6e 73 20 74  ision contains t
1d980 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  he implementatio
1d990 6e 20 6f 66 20 6d 65 74 68 6f 64 73 20 6f 6e 20  n of methods on 
1d9a0 74 68 65 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 76  the.** sqlite3_v
1d9b0 66 73 20 6f 62 6a 65 63 74 2e 0a 2a 2f 0a 0a 2f  fs object..*/../
1d9c0 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20  *.** Initialize 
1d9d0 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  the contents of 
1d9e0 74 68 65 20 75 6e 69 78 46 69 6c 65 20 73 74 72  the unixFile str
1d9f0 75 63 74 75 72 65 20 70 6f 69 6e 74 65 64 20 74  ucture pointed t
1da00 6f 20 62 79 20 70 49 64 2e 0a 2a 2f 0a 73 74 61  o by pId..*/.sta
1da10 74 69 63 20 69 6e 74 20 66 69 6c 6c 49 6e 55 6e  tic int fillInUn
1da20 69 78 46 69 6c 65 28 0a 20 20 73 71 6c 69 74 65  ixFile(.  sqlite
1da30 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 20 20 20  3_vfs *pVfs,    
1da40 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20    /* Pointer to 
1da50 76 66 73 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20  vfs object */.  
1da60 69 6e 74 20 68 2c 20 20 20 20 20 20 20 20 20 20  int h,          
1da70 20 20 20 20 20 20 20 20 2f 2a 20 4f 70 65 6e 20          /* Open 
1da80 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
1da90 6f 66 20 66 69 6c 65 20 62 65 69 6e 67 20 6f 70  of file being op
1daa0 65 6e 65 64 20 2a 2f 0a 20 20 69 6e 74 20 64 69  ened */.  int di
1dab0 72 66 64 2c 20 20 20 20 20 20 20 20 20 20 20 20  rfd,            
1dac0 20 20 2f 2a 20 44 69 72 65 63 74 6f 72 79 20 66    /* Directory f
1dad0 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 2a  ile descriptor *
1dae0 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65  /.  sqlite3_file
1daf0 20 2a 70 49 64 2c 20 20 20 20 20 20 2f 2a 20 57   *pId,      /* W
1db00 72 69 74 65 20 74 6f 20 74 68 65 20 75 6e 69 78  rite to the unix
1db10 46 69 6c 65 20 73 74 72 75 63 74 75 72 65 20 68  File structure h
1db20 65 72 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  ere */.  const c
1db30 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20  har *zFilename, 
1db40 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20   /* Name of the 
1db50 66 69 6c 65 20 62 65 69 6e 67 20 6f 70 65 6e 65  file being opene
1db60 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 6f 4c 6f 63  d */.  int noLoc
1db70 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  k,             /
1db80 2a 20 4f 6d 69 74 20 6c 6f 63 6b 69 6e 67 20 69  * Omit locking i
1db90 66 20 74 72 75 65 20 2a 2f 0a 20 20 69 6e 74 20  f true */.  int 
1dba0 69 73 44 65 6c 65 74 65 20 20 20 20 20 20 20 20  isDelete        
1dbb0 20 20 20 20 2f 2a 20 44 65 6c 65 74 65 20 6f 6e      /* Delete on
1dbc0 20 63 6c 6f 73 65 20 69 66 20 74 72 75 65 20 2a   close if true *
1dbd0 2f 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 73 71 6c  /.){.  const sql
1dbe0 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20  ite3_io_methods 
1dbf0 2a 70 4c 6f 63 6b 69 6e 67 53 74 79 6c 65 3b 0a  *pLockingStyle;.
1dc00 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 4e 65 77    unixFile *pNew
1dc10 20 3d 20 28 75 6e 69 78 46 69 6c 65 20 2a 29 70   = (unixFile *)p
1dc20 49 64 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  Id;.  int rc = S
1dc30 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 61 73 73  QLITE_OK;..  ass
1dc40 65 72 74 28 20 70 4e 65 77 2d 3e 70 4c 6f 63 6b  ert( pNew->pLock
1dc50 3d 3d 4e 55 4c 4c 20 29 3b 0a 20 20 61 73 73 65  ==NULL );.  asse
1dc60 72 74 28 20 70 4e 65 77 2d 3e 70 4f 70 65 6e 3d  rt( pNew->pOpen=
1dc70 3d 4e 55 4c 4c 20 29 3b 0a 0a 20 20 2f 2a 20 50  =NULL );..  /* P
1dc80 61 72 61 6d 65 74 65 72 20 69 73 44 65 6c 65 74  arameter isDelet
1dc90 65 20 69 73 20 6f 6e 6c 79 20 75 73 65 64 20 6f  e is only used o
1dca0 6e 20 76 78 77 6f 72 6b 73 2e 20 45 78 70 72 65  n vxworks. Expre
1dcb0 73 73 20 74 68 69 73 20 65 78 70 6c 69 63 69 74  ss this explicit
1dcc0 6c 79 20 0a 20 20 2a 2a 20 68 65 72 65 20 74 6f  ly .  ** here to
1dcd0 20 70 72 65 76 65 6e 74 20 63 6f 6d 70 69 6c 65   prevent compile
1dce0 72 20 77 61 72 6e 69 6e 67 73 20 61 62 6f 75 74  r warnings about
1dcf0 20 75 6e 75 73 65 64 20 70 61 72 61 6d 65 74 65   unused paramete
1dd00 72 73 2e 0a 20 20 2a 2f 0a 20 20 55 4e 55 53 45  rs..  */.  UNUSE
1dd10 44 5f 50 41 52 41 4d 45 54 45 52 28 69 73 44 65  D_PARAMETER(isDe
1dd20 6c 65 74 65 29 3b 0a 0a 20 20 4f 53 54 52 41 43  lete);..  OSTRAC
1dd30 45 33 28 22 4f 50 45 4e 20 20 20 20 25 2d 33 64  E3("OPEN    %-3d
1dd40 20 25 73 5c 6e 22 2c 20 68 2c 20 7a 46 69 6c 65   %s\n", h, zFile
1dd50 6e 61 6d 65 29 3b 20 20 20 20 0a 20 20 70 4e 65  name);    .  pNe
1dd60 77 2d 3e 68 20 3d 20 68 3b 0a 20 20 70 4e 65 77  w->h = h;.  pNew
1dd70 2d 3e 64 69 72 66 64 20 3d 20 64 69 72 66 64 3b  ->dirfd = dirfd;
1dd80 0a 20 20 53 45 54 5f 54 48 52 45 41 44 49 44 28  .  SET_THREADID(
1dd90 70 4e 65 77 29 3b 0a 20 20 70 4e 65 77 2d 3e 66  pNew);.  pNew->f
1dda0 69 6c 65 46 6c 61 67 73 20 3d 20 30 3b 0a 0a 23  ileFlags = 0;..#
1ddb0 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20  if OS_VXWORKS.  
1ddc0 70 4e 65 77 2d 3e 70 49 64 20 3d 20 76 78 77 6f  pNew->pId = vxwo
1ddd0 72 6b 73 46 69 6e 64 46 69 6c 65 49 64 28 7a 46  rksFindFileId(zF
1dde0 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 69 66 28 20  ilename);.  if( 
1ddf0 70 4e 65 77 2d 3e 70 49 64 3d 3d 30 20 29 7b 0a  pNew->pId==0 ){.
1de00 20 20 20 20 6e 6f 4c 6f 63 6b 20 3d 20 31 3b 0a      noLock = 1;.
1de10 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
1de20 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 23 65 6e 64 69  NOMEM;.  }.#endi
1de30 66 0a 0a 20 20 69 66 28 20 6e 6f 4c 6f 63 6b 20  f..  if( noLock 
1de40 29 7b 0a 20 20 20 20 70 4c 6f 63 6b 69 6e 67 53  ){.    pLockingS
1de50 74 79 6c 65 20 3d 20 26 6e 6f 6c 6f 63 6b 49 6f  tyle = &nolockIo
1de60 4d 65 74 68 6f 64 73 3b 0a 20 20 7d 65 6c 73 65  Methods;.  }else
1de70 7b 0a 20 20 20 20 70 4c 6f 63 6b 69 6e 67 53 74  {.    pLockingSt
1de80 79 6c 65 20 3d 20 28 2a 2a 28 66 69 6e 64 65 72  yle = (**(finder
1de90 5f 74 79 70 65 2a 29 70 56 66 73 2d 3e 70 41 70  _type*)pVfs->pAp
1dea0 70 44 61 74 61 29 28 7a 46 69 6c 65 6e 61 6d 65  pData)(zFilename
1deb0 2c 20 70 4e 65 77 29 3b 0a 23 69 66 20 53 51 4c  , pNew);.#if SQL
1dec0 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49  ITE_ENABLE_LOCKI
1ded0 4e 47 5f 53 54 59 4c 45 0a 20 20 20 20 2f 2a 20  NG_STYLE.    /* 
1dee0 43 61 63 68 65 20 7a 46 69 6c 65 6e 61 6d 65 20  Cache zFilename 
1def0 69 6e 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 63  in the locking c
1df00 6f 6e 74 65 78 74 20 28 41 46 50 20 61 6e 64 20  ontext (AFP and 
1df10 64 6f 74 6c 6f 63 6b 20 6f 76 65 72 72 69 64 65  dotlock override
1df20 29 20 66 6f 72 0a 20 20 20 20 2a 2a 20 70 72 6f  ) for.    ** pro
1df30 78 79 4c 6f 63 6b 20 61 63 74 69 76 61 74 69 6f  xyLock activatio
1df40 6e 20 69 73 20 70 6f 73 73 69 62 6c 65 20 28 72  n is possible (r
1df50 65 6d 6f 74 65 20 70 72 6f 78 79 20 69 73 20 62  emote proxy is b
1df60 61 73 65 64 20 6f 6e 20 64 62 20 6e 61 6d 65 29  ased on db name)
1df70 0a 20 20 20 20 2a 2a 20 7a 46 69 6c 65 6e 61 6d  .    ** zFilenam
1df80 65 20 72 65 6d 61 69 6e 73 20 76 61 6c 69 64 20  e remains valid 
1df90 75 6e 74 69 6c 20 66 69 6c 65 20 69 73 20 63 6c  until file is cl
1dfa0 6f 73 65 64 2c 20 74 6f 20 73 75 70 70 6f 72 74  osed, to support
1dfb0 20 2a 2f 0a 20 20 20 20 70 4e 65 77 2d 3e 6c 6f   */.    pNew->lo
1dfc0 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 3d 20 28  ckingContext = (
1dfd0 76 6f 69 64 2a 29 7a 46 69 6c 65 6e 61 6d 65 3b  void*)zFilename;
1dfe0 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 0a 20 20 69  .#endif.  }..  i
1dff0 66 28 20 70 4c 6f 63 6b 69 6e 67 53 74 79 6c 65  f( pLockingStyle
1e000 20 3d 3d 20 26 70 6f 73 69 78 49 6f 4d 65 74 68   == &posixIoMeth
1e010 6f 64 73 0a 23 69 66 20 64 65 66 69 6e 65 64 28  ods.#if defined(
1e020 5f 5f 41 50 50 4c 45 5f 5f 29 20 26 26 20 53 51  __APPLE__) && SQ
1e030 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b  LITE_ENABLE_LOCK
1e040 49 4e 47 5f 53 54 59 4c 45 0a 20 20 20 20 7c 7c  ING_STYLE.    ||
1e050 20 70 4c 6f 63 6b 69 6e 67 53 74 79 6c 65 20 3d   pLockingStyle =
1e060 3d 20 26 6e 66 73 49 6f 4d 65 74 68 6f 64 73 0a  = &nfsIoMethods.
1e070 23 65 6e 64 69 66 0a 20 20 29 7b 0a 20 20 20 20  #endif.  ){.    
1e080 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29  unixEnterMutex()
1e090 3b 0a 20 20 20 20 72 63 20 3d 20 66 69 6e 64 4c  ;.    rc = findL
1e0a0 6f 63 6b 49 6e 66 6f 28 70 4e 65 77 2c 20 26 70  ockInfo(pNew, &p
1e0b0 4e 65 77 2d 3e 70 4c 6f 63 6b 2c 20 26 70 4e 65  New->pLock, &pNe
1e0c0 77 2d 3e 70 4f 70 65 6e 29 3b 0a 20 20 20 20 69  w->pOpen);.    i
1e0d0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
1e0e0 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20   ){.      /* If 
1e0f0 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 65 64  an error occured
1e100 20 69 6e 20 66 69 6e 64 4c 6f 63 6b 49 6e 66 6f   in findLockInfo
1e110 28 29 2c 20 63 6c 6f 73 65 20 74 68 65 20 66 69  (), close the fi
1e120 6c 65 20 64 65 73 63 72 69 70 74 6f 72 0a 20 20  le descriptor.  
1e130 20 20 20 20 2a 2a 20 69 6d 6d 65 64 69 61 74 65      ** immediate
1e140 6c 79 2c 20 62 65 66 6f 72 65 20 72 65 6c 65 61  ly, before relea
1e150 73 69 6e 67 20 74 68 65 20 6d 75 74 65 78 2e 20  sing the mutex. 
1e160 66 69 6e 64 4c 6f 63 6b 49 6e 66 6f 28 29 20 6d  findLockInfo() m
1e170 61 79 20 66 61 69 6c 0a 20 20 20 20 20 20 2a 2a  ay fail.      **
1e180 20 69 6e 20 74 77 6f 20 73 63 65 6e 61 72 69 6f   in two scenario
1e190 73 3a 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  s:.      **.    
1e1a0 20 20 2a 2a 20 20 20 28 61 29 20 41 20 63 61 6c    **   (a) A cal
1e1b0 6c 20 74 6f 20 66 73 74 61 74 28 29 20 66 61 69  l to fstat() fai
1e1c0 6c 65 64 2e 0a 20 20 20 20 20 20 2a 2a 20 20 20  led..      **   
1e1d0 28 62 29 20 41 20 6d 61 6c 6c 6f 63 20 66 61 69  (b) A malloc fai
1e1e0 6c 65 64 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20  led..      **.  
1e1f0 20 20 20 20 2a 2a 20 53 63 65 6e 61 72 69 6f 20      ** Scenario 
1e200 28 62 29 20 6d 61 79 20 6f 6e 6c 79 20 6f 63 63  (b) may only occ
1e210 75 72 20 69 66 20 74 68 65 20 70 72 6f 63 65 73  ur if the proces
1e220 73 20 69 73 20 68 6f 6c 64 69 6e 67 20 6e 6f 20  s is holding no 
1e230 6f 74 68 65 72 0a 20 20 20 20 20 20 2a 2a 20 66  other.      ** f
1e240 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 73 20  ile descriptors 
1e250 6f 70 65 6e 20 6f 6e 20 74 68 65 20 73 61 6d 65  open on the same
1e260 20 66 69 6c 65 2e 20 49 66 20 74 68 65 72 65 20   file. If there 
1e270 77 65 72 65 20 6f 74 68 65 72 20 66 69 6c 65 0a  were other file.
1e280 20 20 20 20 20 20 2a 2a 20 64 65 73 63 72 69 70        ** descrip
1e290 74 6f 72 73 20 6f 6e 20 74 68 69 73 20 66 69 6c  tors on this fil
1e2a0 65 2c 20 74 68 65 6e 20 6e 6f 20 6d 61 6c 6c 6f  e, then no mallo
1e2b0 63 20 77 6f 75 6c 64 20 62 65 20 72 65 71 75 69  c would be requi
1e2c0 72 65 64 20 62 79 0a 20 20 20 20 20 20 2a 2a 20  red by.      ** 
1e2d0 66 69 6e 64 4c 6f 63 6b 49 6e 66 6f 28 29 2e 20  findLockInfo(). 
1e2e0 49 66 20 74 68 69 73 20 69 73 20 74 68 65 20 63  If this is the c
1e2f0 61 73 65 2c 20 69 74 20 69 73 20 71 75 69 74 65  ase, it is quite
1e300 20 73 61 66 65 20 74 6f 20 63 6c 6f 73 65 0a 20   safe to close. 
1e310 20 20 20 20 20 2a 2a 20 68 61 6e 64 6c 65 20 68       ** handle h
1e320 20 2d 20 61 73 20 69 74 20 69 73 20 67 75 61 72   - as it is guar
1e330 61 6e 74 65 65 64 20 74 68 61 74 20 6e 6f 20 70  anteed that no p
1e340 6f 73 69 78 20 6c 6f 63 6b 73 20 77 69 6c 6c 20  osix locks will 
1e350 62 65 20 72 65 6c 65 61 73 65 64 0a 20 20 20 20  be released.    
1e360 20 20 2a 2a 20 62 79 20 64 6f 69 6e 67 20 73 6f    ** by doing so
1e370 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20  ..      **.     
1e380 20 2a 2a 20 49 66 20 73 63 65 6e 61 72 69 6f 20   ** If scenario 
1e390 28 61 29 20 63 61 75 73 65 64 20 74 68 65 20 65  (a) caused the e
1e3a0 72 72 6f 72 20 74 68 65 6e 20 74 68 69 6e 67 73  rror then things
1e3b0 20 61 72 65 20 6e 6f 74 20 73 6f 20 73 61 66 65   are not so safe
1e3c0 2e 20 54 68 65 0a 20 20 20 20 20 20 2a 2a 20 69  . The.      ** i
1e3d0 6d 70 6c 69 63 69 74 20 61 73 73 75 6d 70 74 69  mplicit assumpti
1e3e0 6f 6e 20 68 65 72 65 20 69 73 20 74 68 61 74 20  on here is that 
1e3f0 69 66 20 66 73 74 61 74 28 29 20 66 61 69 6c 73  if fstat() fails
1e400 2c 20 74 68 69 6e 67 73 20 61 72 65 20 69 6e 0a  , things are in.
1e410 20 20 20 20 20 20 2a 2a 20 73 75 63 68 20 62 61        ** such ba
1e420 64 20 73 68 61 70 65 20 74 68 61 74 20 64 72 6f  d shape that dro
1e430 70 70 69 6e 67 20 61 20 6c 6f 63 6b 20 6f 72 20  pping a lock or 
1e440 74 77 6f 20 64 6f 65 73 6e 27 74 20 6d 61 74 74  two doesn't matt
1e450 65 72 20 6d 75 63 68 2e 0a 20 20 20 20 20 20 2a  er much..      *
1e460 2f 0a 20 20 20 20 20 20 63 6c 6f 73 65 28 68 29  /.      close(h)
1e470 3b 0a 20 20 20 20 20 20 68 20 3d 20 2d 31 3b 0a  ;.      h = -1;.
1e480 20 20 20 20 7d 0a 20 20 20 20 75 6e 69 78 4c 65      }.    unixLe
1e490 61 76 65 4d 75 74 65 78 28 29 3b 0a 20 20 7d 0a  aveMutex();.  }.
1e4a0 0a 23 69 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  .#if SQLITE_ENAB
1e4b0 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45  LE_LOCKING_STYLE
1e4c0 20 26 26 20 64 65 66 69 6e 65 64 28 5f 5f 41 50   && defined(__AP
1e4d0 50 4c 45 5f 5f 29 0a 20 20 65 6c 73 65 20 69 66  PLE__).  else if
1e4e0 28 20 70 4c 6f 63 6b 69 6e 67 53 74 79 6c 65 20  ( pLockingStyle 
1e4f0 3d 3d 20 26 61 66 70 49 6f 4d 65 74 68 6f 64 73  == &afpIoMethods
1e500 20 29 7b 0a 20 20 20 20 2f 2a 20 41 46 50 20 6c   ){.    /* AFP l
1e510 6f 63 6b 69 6e 67 20 75 73 65 73 20 74 68 65 20  ocking uses the 
1e520 66 69 6c 65 20 70 61 74 68 20 73 6f 20 69 74 20  file path so it 
1e530 6e 65 65 64 73 20 74 6f 20 62 65 20 69 6e 63 6c  needs to be incl
1e540 75 64 65 64 20 69 6e 0a 20 20 20 20 2a 2a 20 74  uded in.    ** t
1e550 68 65 20 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e  he afpLockingCon
1e560 74 65 78 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  text..    */.   
1e570 20 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65   afpLockingConte
1e580 78 74 20 2a 70 43 74 78 3b 0a 20 20 20 20 70 4e  xt *pCtx;.    pN
1e590 65 77 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65  ew->lockingConte
1e5a0 78 74 20 3d 20 70 43 74 78 20 3d 20 73 71 6c 69  xt = pCtx = sqli
1e5b0 74 65 33 5f 6d 61 6c 6c 6f 63 28 20 73 69 7a 65  te3_malloc( size
1e5c0 6f 66 28 2a 70 43 74 78 29 20 29 3b 0a 20 20 20  of(*pCtx) );.   
1e5d0 20 69 66 28 20 70 43 74 78 3d 3d 30 20 29 7b 0a   if( pCtx==0 ){.
1e5e0 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
1e5f0 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 65 6c  E_NOMEM;.    }el
1e600 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 4e 42 3a  se{.      /* NB:
1e610 20 7a 46 69 6c 65 6e 61 6d 65 20 65 78 69 73 74   zFilename exist
1e620 73 20 61 6e 64 20 72 65 6d 61 69 6e 73 20 76 61  s and remains va
1e630 6c 69 64 20 75 6e 74 69 6c 20 74 68 65 20 66 69  lid until the fi
1e640 6c 65 20 69 73 20 63 6c 6f 73 65 64 0a 20 20 20  le is closed.   
1e650 20 20 20 2a 2a 20 61 63 63 6f 72 64 69 6e 67 20     ** according 
1e660 74 6f 20 72 65 71 75 69 72 65 6d 65 6e 74 20 46  to requirement F
1e670 31 31 31 34 31 2e 20 20 53 6f 20 77 65 20 64 6f  11141.  So we do
1e680 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20 6d 61 6b   not need to mak
1e690 65 20 61 0a 20 20 20 20 20 20 2a 2a 20 63 6f 70  e a.      ** cop
1e6a0 79 20 6f 66 20 74 68 65 20 66 69 6c 65 6e 61 6d  y of the filenam
1e6b0 65 2e 20 2a 2f 0a 20 20 20 20 20 20 70 43 74 78  e. */.      pCtx
1e6c0 2d 3e 64 62 50 61 74 68 20 3d 20 7a 46 69 6c 65  ->dbPath = zFile
1e6d0 6e 61 6d 65 3b 0a 20 20 20 20 20 20 70 43 74 78  name;.      pCtx
1e6e0 2d 3e 72 65 73 65 72 76 65 64 20 3d 20 30 3b 0a  ->reserved = 0;.
1e6f0 20 20 20 20 20 20 73 72 61 6e 64 6f 6d 64 65 76        srandomdev
1e700 28 29 3b 0a 20 20 20 20 20 20 75 6e 69 78 45 6e  ();.      unixEn
1e710 74 65 72 4d 75 74 65 78 28 29 3b 0a 20 20 20 20  terMutex();.    
1e720 20 20 72 63 20 3d 20 66 69 6e 64 4c 6f 63 6b 49    rc = findLockI
1e730 6e 66 6f 28 70 4e 65 77 2c 20 26 70 4e 65 77 2d  nfo(pNew, &pNew-
1e740 3e 70 4c 6f 63 6b 2c 20 26 70 4e 65 77 2d 3e 70  >pLock, &pNew->p
1e750 4f 70 65 6e 29 3b 0a 20 20 20 20 20 20 69 66 28  Open);.      if(
1e760 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
1e770 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
1e780 33 5f 66 72 65 65 28 70 4e 65 77 2d 3e 6c 6f 63  3_free(pNew->loc
1e790 6b 69 6e 67 43 6f 6e 74 65 78 74 29 3b 0a 20 20  kingContext);.  
1e7a0 20 20 20 20 20 20 63 6c 6f 73 65 28 68 29 3b 0a        close(h);.
1e7b0 20 20 20 20 20 20 20 20 68 20 3d 20 2d 31 3b 0a          h = -1;.
1e7c0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 75 6e        }.      un
1e7d0 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 20  ixLeaveMutex(); 
1e7e0 20 20 20 20 20 20 20 0a 20 20 20 20 7d 0a 20 20         .    }.  
1e7f0 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 65 6c 73 65  }.#endif..  else
1e800 20 69 66 28 20 70 4c 6f 63 6b 69 6e 67 53 74 79   if( pLockingSty
1e810 6c 65 20 3d 3d 20 26 64 6f 74 6c 6f 63 6b 49 6f  le == &dotlockIo
1e820 4d 65 74 68 6f 64 73 20 29 7b 0a 20 20 20 20 2f  Methods ){.    /
1e830 2a 20 44 6f 74 66 69 6c 65 20 6c 6f 63 6b 69 6e  * Dotfile lockin
1e840 67 20 75 73 65 73 20 74 68 65 20 66 69 6c 65 20  g uses the file 
1e850 70 61 74 68 20 73 6f 20 69 74 20 6e 65 65 64 73  path so it needs
1e860 20 74 6f 20 62 65 20 69 6e 63 6c 75 64 65 64 20   to be included 
1e870 69 6e 0a 20 20 20 20 2a 2a 20 74 68 65 20 64 6f  in.    ** the do
1e880 74 6c 6f 63 6b 4c 6f 63 6b 69 6e 67 43 6f 6e 74  tlockLockingCont
1e890 65 78 74 20 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ext .    */.    
1e8a0 63 68 61 72 20 2a 7a 4c 6f 63 6b 46 69 6c 65 3b  char *zLockFile;
1e8b0 0a 20 20 20 20 69 6e 74 20 6e 46 69 6c 65 6e 61  .    int nFilena
1e8c0 6d 65 3b 0a 20 20 20 20 6e 46 69 6c 65 6e 61 6d  me;.    nFilenam
1e8d0 65 20 3d 20 28 69 6e 74 29 73 74 72 6c 65 6e 28  e = (int)strlen(
1e8e0 7a 46 69 6c 65 6e 61 6d 65 29 20 2b 20 36 3b 0a  zFilename) + 6;.
1e8f0 20 20 20 20 7a 4c 6f 63 6b 46 69 6c 65 20 3d 20      zLockFile = 
1e900 28 63 68 61 72 20 2a 29 73 71 6c 69 74 65 33 5f  (char *)sqlite3_
1e910 6d 61 6c 6c 6f 63 28 6e 46 69 6c 65 6e 61 6d 65  malloc(nFilename
1e920 29 3b 0a 20 20 20 20 69 66 28 20 7a 4c 6f 63 6b  );.    if( zLock
1e930 46 69 6c 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20  File==0 ){.     
1e940 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d   rc = SQLITE_NOM
1e950 45 4d 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  EM;.    }else{. 
1e960 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70       sqlite3_snp
1e970 72 69 6e 74 66 28 6e 46 69 6c 65 6e 61 6d 65 2c  rintf(nFilename,
1e980 20 7a 4c 6f 63 6b 46 69 6c 65 2c 20 22 25 73 22   zLockFile, "%s"
1e990 20 44 4f 54 4c 4f 43 4b 5f 53 55 46 46 49 58 2c   DOTLOCK_SUFFIX,
1e9a0 20 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20   zFilename);.   
1e9b0 20 7d 0a 20 20 20 20 70 4e 65 77 2d 3e 6c 6f 63   }.    pNew->loc
1e9c0 6b 69 6e 67 43 6f 6e 74 65 78 74 20 3d 20 7a 4c  kingContext = zL
1e9d0 6f 63 6b 46 69 6c 65 3b 0a 20 20 7d 0a 0a 23 69  ockFile;.  }..#i
1e9e0 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20 65  f OS_VXWORKS.  e
1e9f0 6c 73 65 20 69 66 28 20 70 4c 6f 63 6b 69 6e 67  lse if( pLocking
1ea00 53 74 79 6c 65 20 3d 3d 20 26 73 65 6d 49 6f 4d  Style == &semIoM
1ea10 65 74 68 6f 64 73 20 29 7b 0a 20 20 20 20 2f 2a  ethods ){.    /*
1ea20 20 4e 61 6d 65 64 20 73 65 6d 61 70 68 6f 72 65   Named semaphore
1ea30 20 6c 6f 63 6b 69 6e 67 20 75 73 65 73 20 74 68   locking uses th
1ea40 65 20 66 69 6c 65 20 70 61 74 68 20 73 6f 20 69  e file path so i
1ea50 74 20 6e 65 65 64 73 20 74 6f 20 62 65 0a 20 20  t needs to be.  
1ea60 20 20 2a 2a 20 69 6e 63 6c 75 64 65 64 20 69 6e    ** included in
1ea70 20 74 68 65 20 73 65 6d 4c 6f 63 6b 69 6e 67 43   the semLockingC
1ea80 6f 6e 74 65 78 74 0a 20 20 20 20 2a 2f 0a 20 20  ontext.    */.  
1ea90 20 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78    unixEnterMutex
1eaa0 28 29 3b 0a 20 20 20 20 72 63 20 3d 20 66 69 6e  ();.    rc = fin
1eab0 64 4c 6f 63 6b 49 6e 66 6f 28 70 4e 65 77 2c 20  dLockInfo(pNew, 
1eac0 26 70 4e 65 77 2d 3e 70 4c 6f 63 6b 2c 20 26 70  &pNew->pLock, &p
1ead0 4e 65 77 2d 3e 70 4f 70 65 6e 29 3b 0a 20 20 20  New->pOpen);.   
1eae0 20 69 66 28 20 28 72 63 3d 3d 53 51 4c 49 54 45   if( (rc==SQLITE
1eaf0 5f 4f 4b 29 20 26 26 20 28 70 4e 65 77 2d 3e 70  _OK) && (pNew->p
1eb00 4f 70 65 6e 2d 3e 70 53 65 6d 3d 3d 4e 55 4c 4c  Open->pSem==NULL
1eb10 29 20 29 7b 0a 20 20 20 20 20 20 63 68 61 72 20  ) ){.      char 
1eb20 2a 7a 53 65 6d 4e 61 6d 65 20 3d 20 70 4e 65 77  *zSemName = pNew
1eb30 2d 3e 70 4f 70 65 6e 2d 3e 61 53 65 6d 4e 61 6d  ->pOpen->aSemNam
1eb40 65 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 3b 0a  e;.      int n;.
1eb50 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e        sqlite3_sn
1eb60 70 72 69 6e 74 66 28 4d 41 58 5f 50 41 54 48 4e  printf(MAX_PATHN
1eb70 41 4d 45 2c 20 7a 53 65 6d 4e 61 6d 65 2c 20 22  AME, zSemName, "
1eb80 2f 25 73 2e 73 65 6d 22 2c 0a 20 20 20 20 20 20  /%s.sem",.      
1eb90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1eba0 20 70 4e 65 77 2d 3e 70 49 64 2d 3e 7a 43 61 6e   pNew->pId->zCan
1ebb0 6f 6e 69 63 61 6c 4e 61 6d 65 29 3b 0a 20 20 20  onicalName);.   
1ebc0 20 20 20 66 6f 72 28 20 6e 3d 31 3b 20 7a 53 65     for( n=1; zSe
1ebd0 6d 4e 61 6d 65 5b 6e 5d 3b 20 6e 2b 2b 20 29 0a  mName[n]; n++ ).
1ebe0 20 20 20 20 20 20 20 20 69 66 28 20 7a 53 65 6d          if( zSem
1ebf0 4e 61 6d 65 5b 6e 5d 3d 3d 27 2f 27 20 29 20 7a  Name[n]=='/' ) z
1ec00 53 65 6d 4e 61 6d 65 5b 6e 5d 20 3d 20 27 5f 27  SemName[n] = '_'
1ec10 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 70 4f  ;.      pNew->pO
1ec20 70 65 6e 2d 3e 70 53 65 6d 20 3d 20 73 65 6d 5f  pen->pSem = sem_
1ec30 6f 70 65 6e 28 7a 53 65 6d 4e 61 6d 65 2c 20 4f  open(zSemName, O
1ec40 5f 43 52 45 41 54 2c 20 30 36 36 36 2c 20 31 29  _CREAT, 0666, 1)
1ec50 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4e 65 77  ;.      if( pNew
1ec60 2d 3e 70 4f 70 65 6e 2d 3e 70 53 65 6d 20 3d 3d  ->pOpen->pSem ==
1ec70 20 53 45 4d 5f 46 41 49 4c 45 44 20 29 7b 0a 20   SEM_FAILED ){. 
1ec80 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
1ec90 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20  TE_NOMEM;.      
1eca0 20 20 70 4e 65 77 2d 3e 70 4f 70 65 6e 2d 3e 61    pNew->pOpen->a
1ecb0 53 65 6d 4e 61 6d 65 5b 30 5d 20 3d 20 27 5c 30  SemName[0] = '\0
1ecc0 27 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  ';.      }.    }
1ecd0 0a 20 20 20 20 75 6e 69 78 4c 65 61 76 65 4d 75  .    unixLeaveMu
1ece0 74 65 78 28 29 3b 0a 20 20 7d 0a 23 65 6e 64 69  tex();.  }.#endi
1ecf0 66 0a 20 20 0a 20 20 70 4e 65 77 2d 3e 6c 61 73  f.  .  pNew->las
1ed00 74 45 72 72 6e 6f 20 3d 20 30 3b 0a 23 69 66 20  tErrno = 0;.#if 
1ed10 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20 69 66 28  OS_VXWORKS.  if(
1ed20 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
1ed30 7b 0a 20 20 20 20 69 66 28 20 68 3e 3d 30 20 29  {.    if( h>=0 )
1ed40 20 63 6c 6f 73 65 28 68 29 3b 0a 20 20 20 20 68   close(h);.    h
1ed50 20 3d 20 2d 31 3b 0a 20 20 20 20 75 6e 6c 69 6e   = -1;.    unlin
1ed60 6b 28 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20  k(zFilename);.  
1ed70 20 20 69 73 44 65 6c 65 74 65 20 3d 20 30 3b 0a    isDelete = 0;.
1ed80 20 20 7d 0a 20 20 70 4e 65 77 2d 3e 69 73 44 65    }.  pNew->isDe
1ed90 6c 65 74 65 20 3d 20 69 73 44 65 6c 65 74 65 3b  lete = isDelete;
1eda0 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20 72 63  .#endif.  if( rc
1edb0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
1edc0 20 20 20 69 66 28 20 64 69 72 66 64 3e 3d 30 20     if( dirfd>=0 
1edd0 29 20 63 6c 6f 73 65 28 64 69 72 66 64 29 3b 20  ) close(dirfd); 
1ede0 2f 2a 20 73 69 6c 65 6e 74 20 6c 65 61 6b 20 69  /* silent leak i
1edf0 66 20 66 61 69 6c 2c 20 61 6c 72 65 61 64 79 20  f fail, already 
1ee00 69 6e 20 65 72 72 6f 72 20 2a 2f 0a 20 20 20 20  in error */.    
1ee10 69 66 28 20 68 3e 3d 30 20 29 20 63 6c 6f 73 65  if( h>=0 ) close
1ee20 28 68 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  (h);.  }else{.  
1ee30 20 20 70 4e 65 77 2d 3e 70 4d 65 74 68 6f 64 20    pNew->pMethod 
1ee40 3d 20 70 4c 6f 63 6b 69 6e 67 53 74 79 6c 65 3b  = pLockingStyle;
1ee50 0a 20 20 20 20 4f 70 65 6e 43 6f 75 6e 74 65 72  .    OpenCounter
1ee60 28 2b 31 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  (+1);.  }.  retu
1ee70 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
1ee80 4f 70 65 6e 20 61 20 66 69 6c 65 20 64 65 73 63  Open a file desc
1ee90 72 69 70 74 6f 72 20 74 6f 20 74 68 65 20 64 69  riptor to the di
1eea0 72 65 63 74 6f 72 79 20 63 6f 6e 74 61 69 6e 69  rectory containi
1eeb0 6e 67 20 66 69 6c 65 20 7a 46 69 6c 65 6e 61 6d  ng file zFilenam
1eec0 65 2e 0a 2a 2a 20 49 66 20 73 75 63 63 65 73 73  e..** If success
1eed0 66 75 6c 2c 20 2a 70 46 64 20 69 73 20 73 65 74  ful, *pFd is set
1eee0 20 74 6f 20 74 68 65 20 6f 70 65 6e 65 64 20 66   to the opened f
1eef0 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 61  ile descriptor a
1ef00 6e 64 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20  nd.** SQLITE_OK 
1ef10 69 73 20 72 65 74 75 72 6e 65 64 2e 20 49 66 20  is returned. If 
1ef20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c  an error occurs,
1ef30 20 65 69 74 68 65 72 20 53 51 4c 49 54 45 5f 4e   either SQLITE_N
1ef40 4f 4d 45 4d 0a 2a 2a 20 6f 72 20 53 51 4c 49 54  OMEM.** or SQLIT
1ef50 45 5f 43 41 4e 54 4f 50 45 4e 20 69 73 20 72 65  E_CANTOPEN is re
1ef60 74 75 72 6e 65 64 20 61 6e 64 20 2a 70 46 64 20  turned and *pFd 
1ef70 69 73 20 73 65 74 20 74 6f 20 61 6e 20 75 6e 64  is set to an und
1ef80 65 66 69 6e 65 64 0a 2a 2a 20 76 61 6c 75 65 2e  efined.** value.
1ef90 0a 2a 2a 0a 2a 2a 20 49 66 20 53 51 4c 49 54 45  .**.** If SQLITE
1efa0 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2c  _OK is returned,
1efb0 20 74 68 65 20 63 61 6c 6c 65 72 20 69 73 20 72   the caller is r
1efc0 65 73 70 6f 6e 73 69 62 6c 65 20 66 6f 72 20 63  esponsible for c
1efd0 6c 6f 73 69 6e 67 0a 2a 2a 20 74 68 65 20 66 69  losing.** the fi
1efe0 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 2a 70  le descriptor *p
1eff0 46 64 20 75 73 69 6e 67 20 63 6c 6f 73 65 28 29  Fd using close()
1f000 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1f010 6f 70 65 6e 44 69 72 65 63 74 6f 72 79 28 63 6f  openDirectory(co
1f020 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e  nst char *zFilen
1f030 61 6d 65 2c 20 69 6e 74 20 2a 70 46 64 29 7b 0a  ame, int *pFd){.
1f040 20 20 69 6e 74 20 69 69 3b 0a 20 20 69 6e 74 20    int ii;.  int 
1f050 66 64 20 3d 20 2d 31 3b 0a 20 20 63 68 61 72 20  fd = -1;.  char 
1f060 7a 44 69 72 6e 61 6d 65 5b 4d 41 58 5f 50 41 54  zDirname[MAX_PAT
1f070 48 4e 41 4d 45 2b 31 5d 3b 0a 0a 20 20 73 71 6c  HNAME+1];..  sql
1f080 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 4d 41  ite3_snprintf(MA
1f090 58 5f 50 41 54 48 4e 41 4d 45 2c 20 7a 44 69 72  X_PATHNAME, zDir
1f0a0 6e 61 6d 65 2c 20 22 25 73 22 2c 20 7a 46 69 6c  name, "%s", zFil
1f0b0 65 6e 61 6d 65 29 3b 0a 20 20 66 6f 72 28 69 69  ename);.  for(ii
1f0c0 3d 28 69 6e 74 29 73 74 72 6c 65 6e 28 7a 44 69  =(int)strlen(zDi
1f0d0 72 6e 61 6d 65 29 3b 20 69 69 3e 31 20 26 26 20  rname); ii>1 && 
1f0e0 7a 44 69 72 6e 61 6d 65 5b 69 69 5d 21 3d 27 2f  zDirname[ii]!='/
1f0f0 27 3b 20 69 69 2d 2d 29 3b 0a 20 20 69 66 28 20  '; ii--);.  if( 
1f100 69 69 3e 30 20 29 7b 0a 20 20 20 20 7a 44 69 72  ii>0 ){.    zDir
1f110 6e 61 6d 65 5b 69 69 5d 20 3d 20 27 5c 30 27 3b  name[ii] = '\0';
1f120 0a 20 20 20 20 66 64 20 3d 20 6f 70 65 6e 28 7a  .    fd = open(z
1f130 44 69 72 6e 61 6d 65 2c 20 4f 5f 52 44 4f 4e 4c  Dirname, O_RDONL
1f140 59 7c 4f 5f 42 49 4e 41 52 59 2c 20 30 29 3b 0a  Y|O_BINARY, 0);.
1f150 20 20 20 20 69 66 28 20 66 64 3e 3d 30 20 29 7b      if( fd>=0 ){
1f160 0a 23 69 66 64 65 66 20 46 44 5f 43 4c 4f 45 58  .#ifdef FD_CLOEX
1f170 45 43 0a 20 20 20 20 20 20 66 63 6e 74 6c 28 66  EC.      fcntl(f
1f180 64 2c 20 46 5f 53 45 54 46 44 2c 20 66 63 6e 74  d, F_SETFD, fcnt
1f190 6c 28 66 64 2c 20 46 5f 47 45 54 46 44 2c 20 30  l(fd, F_GETFD, 0
1f1a0 29 20 7c 20 46 44 5f 43 4c 4f 45 58 45 43 29 3b  ) | FD_CLOEXEC);
1f1b0 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 4f 53  .#endif.      OS
1f1c0 54 52 41 43 45 33 28 22 4f 50 45 4e 44 49 52 20  TRACE3("OPENDIR 
1f1d0 25 2d 33 64 20 25 73 5c 6e 22 2c 20 66 64 2c 20  %-3d %s\n", fd, 
1f1e0 7a 44 69 72 6e 61 6d 65 29 3b 0a 20 20 20 20 7d  zDirname);.    }
1f1f0 0a 20 20 7d 0a 20 20 2a 70 46 64 20 3d 20 66 64  .  }.  *pFd = fd
1f200 3b 0a 20 20 72 65 74 75 72 6e 20 28 66 64 3e 3d  ;.  return (fd>=
1f210 30 3f 53 51 4c 49 54 45 5f 4f 4b 3a 53 51 4c 49  0?SQLITE_OK:SQLI
1f220 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 42 4b 50 54  TE_CANTOPEN_BKPT
1f230 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61  );.}../*.** Crea
1f240 74 65 20 61 20 74 65 6d 70 6f 72 61 72 79 20 66  te a temporary f
1f250 69 6c 65 20 6e 61 6d 65 20 69 6e 20 7a 42 75 66  ile name in zBuf
1f260 2e 20 20 7a 42 75 66 20 6d 75 73 74 20 62 65 20  .  zBuf must be 
1f270 61 6c 6c 6f 63 61 74 65 64 0a 2a 2a 20 62 79 20  allocated.** by 
1f280 74 68 65 20 63 61 6c 6c 69 6e 67 20 70 72 6f 63  the calling proc
1f290 65 73 73 20 61 6e 64 20 6d 75 73 74 20 62 65 20  ess and must be 
1f2a0 62 69 67 20 65 6e 6f 75 67 68 20 74 6f 20 68 6f  big enough to ho
1f2b0 6c 64 20 61 74 20 6c 65 61 73 74 0a 2a 2a 20 70  ld at least.** p
1f2c0 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 20  Vfs->mxPathname 
1f2d0 62 79 74 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  bytes..*/.static
1f2e0 20 69 6e 74 20 67 65 74 54 65 6d 70 6e 61 6d 65   int getTempname
1f2f0 28 69 6e 74 20 6e 42 75 66 2c 20 63 68 61 72 20  (int nBuf, char 
1f300 2a 7a 42 75 66 29 7b 0a 20 20 73 74 61 74 69 63  *zBuf){.  static
1f310 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 61 7a 44   const char *azD
1f320 69 72 73 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 30  irs[] = {.     0
1f330 2c 0a 20 20 20 20 20 30 2c 0a 20 20 20 20 20 22  ,.     0,.     "
1f340 2f 76 61 72 2f 74 6d 70 22 2c 0a 20 20 20 20 20  /var/tmp",.     
1f350 22 2f 75 73 72 2f 74 6d 70 22 2c 0a 20 20 20 20  "/usr/tmp",.    
1f360 20 22 2f 74 6d 70 22 2c 0a 20 20 20 20 20 22 2e   "/tmp",.     ".
1f370 22 2c 0a 20 20 7d 3b 0a 20 20 73 74 61 74 69 63  ",.  };.  static
1f380 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20   const unsigned 
1f390 63 68 61 72 20 7a 43 68 61 72 73 5b 5d 20 3d 0a  char zChars[] =.
1f3a0 20 20 20 20 22 61 62 63 64 65 66 67 68 69 6a 6b      "abcdefghijk
1f3b0 6c 6d 6e 6f 70 71 72 73 74 75 76 77 78 79 7a 22  lmnopqrstuvwxyz"
1f3c0 0a 20 20 20 20 22 41 42 43 44 45 46 47 48 49 4a  .    "ABCDEFGHIJ
1f3d0 4b 4c 4d 4e 4f 50 51 52 53 54 55 56 57 58 59 5a  KLMNOPQRSTUVWXYZ
1f3e0 22 0a 20 20 20 20 22 30 31 32 33 34 35 36 37 38  ".    "012345678
1f3f0 39 22 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 69  9";.  unsigned i
1f400 6e 74 20 69 2c 20 6a 3b 0a 20 20 73 74 72 75 63  nt i, j;.  struc
1f410 74 20 73 74 61 74 20 62 75 66 3b 0a 20 20 63 6f  t stat buf;.  co
1f420 6e 73 74 20 63 68 61 72 20 2a 7a 44 69 72 20 3d  nst char *zDir =
1f430 20 22 2e 22 3b 0a 0a 20 20 2f 2a 20 49 74 27 73   ".";..  /* It's
1f440 20 6f 64 64 20 74 6f 20 73 69 6d 75 6c 61 74 65   odd to simulate
1f450 20 61 6e 20 69 6f 2d 65 72 72 6f 72 20 68 65 72   an io-error her
1f460 65 2c 20 62 75 74 20 72 65 61 6c 6c 79 20 74 68  e, but really th
1f470 69 73 20 69 73 20 6a 75 73 74 0a 20 20 2a 2a 20  is is just.  ** 
1f480 75 73 69 6e 67 20 74 68 65 20 69 6f 2d 65 72 72  using the io-err
1f490 6f 72 20 69 6e 66 72 61 73 74 72 75 63 74 75 72  or infrastructur
1f4a0 65 20 74 6f 20 74 65 73 74 20 74 68 61 74 20 53  e to test that S
1f4b0 51 4c 69 74 65 20 68 61 6e 64 6c 65 73 20 74 68  QLite handles th
1f4c0 69 73 0a 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e  is.  ** function
1f4d0 20 66 61 69 6c 69 6e 67 2e 20 0a 20 20 2a 2f 0a   failing. .  */.
1f4e0 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f    SimulateIOErro
1f4f0 72 28 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  r( return SQLITE
1f500 5f 49 4f 45 52 52 20 29 3b 0a 0a 20 20 61 7a 44  _IOERR );..  azD
1f510 69 72 73 5b 30 5d 20 3d 20 73 71 6c 69 74 65 33  irs[0] = sqlite3
1f520 5f 74 65 6d 70 5f 64 69 72 65 63 74 6f 72 79 3b  _temp_directory;
1f530 0a 20 20 69 66 20 28 4e 55 4c 4c 20 3d 3d 20 61  .  if (NULL == a
1f540 7a 44 69 72 73 5b 31 5d 29 20 7b 0a 20 20 20 20  zDirs[1]) {.    
1f550 61 7a 44 69 72 73 5b 31 5d 20 3d 20 67 65 74 65  azDirs[1] = gete
1f560 6e 76 28 22 54 4d 50 44 49 52 22 29 3b 0a 20 20  nv("TMPDIR");.  
1f570 7d 0a 20 20 0a 20 20 66 6f 72 28 69 3d 30 3b 20  }.  .  for(i=0; 
1f580 69 3c 73 69 7a 65 6f 66 28 61 7a 44 69 72 73 29  i<sizeof(azDirs)
1f590 2f 73 69 7a 65 6f 66 28 61 7a 44 69 72 73 5b 30  /sizeof(azDirs[0
1f5a0 5d 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66  ]); i++){.    if
1f5b0 28 20 61 7a 44 69 72 73 5b 69 5d 3d 3d 30 20 29  ( azDirs[i]==0 )
1f5c0 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69   continue;.    i
1f5d0 66 28 20 73 74 61 74 28 61 7a 44 69 72 73 5b 69  f( stat(azDirs[i
1f5e0 5d 2c 20 26 62 75 66 29 20 29 20 63 6f 6e 74 69  ], &buf) ) conti
1f5f0 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 21 53 5f  nue;.    if( !S_
1f600 49 53 44 49 52 28 62 75 66 2e 73 74 5f 6d 6f 64  ISDIR(buf.st_mod
1f610 65 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  e) ) continue;. 
1f620 20 20 20 69 66 28 20 61 63 63 65 73 73 28 61 7a     if( access(az
1f630 44 69 72 73 5b 69 5d 2c 20 30 37 29 20 29 20 63  Dirs[i], 07) ) c
1f640 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7a 44 69  ontinue;.    zDi
1f650 72 20 3d 20 61 7a 44 69 72 73 5b 69 5d 3b 0a 20  r = azDirs[i];. 
1f660 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20     break;.  }.. 
1f670 20 2f 2a 20 43 68 65 63 6b 20 74 68 61 74 20 74   /* Check that t
1f680 68 65 20 6f 75 74 70 75 74 20 62 75 66 66 65 72  he output buffer
1f690 20 69 73 20 6c 61 72 67 65 20 65 6e 6f 75 67 68   is large enough
1f6a0 20 66 6f 72 20 74 68 65 20 74 65 6d 70 6f 72 61   for the tempora
1f6b0 72 79 20 66 69 6c 65 20 0a 20 20 2a 2a 20 6e 61  ry file .  ** na
1f6c0 6d 65 2e 20 49 66 20 69 74 20 69 73 20 6e 6f 74  me. If it is not
1f6d0 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  , return SQLITE_
1f6e0 45 52 52 4f 52 2e 0a 20 20 2a 2f 0a 20 20 69 66  ERROR..  */.  if
1f6f0 28 20 28 73 74 72 6c 65 6e 28 7a 44 69 72 29 20  ( (strlen(zDir) 
1f700 2b 20 73 74 72 6c 65 6e 28 53 51 4c 49 54 45 5f  + strlen(SQLITE_
1f710 54 45 4d 50 5f 46 49 4c 45 5f 50 52 45 46 49 58  TEMP_FILE_PREFIX
1f720 29 20 2b 20 31 37 29 20 3e 3d 20 28 73 69 7a 65  ) + 17) >= (size
1f730 5f 74 29 6e 42 75 66 20 29 7b 0a 20 20 20 20 72  _t)nBuf ){.    r
1f740 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52  eturn SQLITE_ERR
1f750 4f 52 3b 0a 20 20 7d 0a 0a 20 20 64 6f 7b 0a 20  OR;.  }..  do{. 
1f760 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
1f770 6e 74 66 28 6e 42 75 66 2d 31 37 2c 20 7a 42 75  ntf(nBuf-17, zBu
1f780 66 2c 20 22 25 73 2f 22 53 51 4c 49 54 45 5f 54  f, "%s/"SQLITE_T
1f790 45 4d 50 5f 46 49 4c 45 5f 50 52 45 46 49 58 2c  EMP_FILE_PREFIX,
1f7a0 20 7a 44 69 72 29 3b 0a 20 20 20 20 6a 20 3d 20   zDir);.    j = 
1f7b0 28 69 6e 74 29 73 74 72 6c 65 6e 28 7a 42 75 66  (int)strlen(zBuf
1f7c0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72  );.    sqlite3_r
1f7d0 61 6e 64 6f 6d 6e 65 73 73 28 31 35 2c 20 26 7a  andomness(15, &z
1f7e0 42 75 66 5b 6a 5d 29 3b 0a 20 20 20 20 66 6f 72  Buf[j]);.    for
1f7f0 28 69 3d 30 3b 20 69 3c 31 35 3b 20 69 2b 2b 2c  (i=0; i<15; i++,
1f800 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 7a 42 75   j++){.      zBu
1f810 66 5b 6a 5d 20 3d 20 28 63 68 61 72 29 7a 43 68  f[j] = (char)zCh
1f820 61 72 73 5b 20 28 28 75 6e 73 69 67 6e 65 64 20  ars[ ((unsigned 
1f830 63 68 61 72 29 7a 42 75 66 5b 6a 5d 29 25 28 73  char)zBuf[j])%(s
1f840 69 7a 65 6f 66 28 7a 43 68 61 72 73 29 2d 31 29  izeof(zChars)-1)
1f850 20 5d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a 42   ];.    }.    zB
1f860 75 66 5b 6a 5d 20 3d 20 30 3b 0a 20 20 7d 77 68  uf[j] = 0;.  }wh
1f870 69 6c 65 28 20 61 63 63 65 73 73 28 7a 42 75 66  ile( access(zBuf
1f880 2c 30 29 3d 3d 30 20 29 3b 0a 20 20 72 65 74 75  ,0)==0 );.  retu
1f890 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
1f8a0 0a 23 69 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  .#if SQLITE_ENAB
1f8b0 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45  LE_LOCKING_STYLE
1f8c0 20 26 26 20 64 65 66 69 6e 65 64 28 5f 5f 41 50   && defined(__AP
1f8d0 50 4c 45 5f 5f 29 0a 2f 2a 0a 2a 2a 20 52 6f 75  PLE__)./*.** Rou
1f8e0 74 69 6e 65 20 74 6f 20 74 72 61 6e 73 66 6f 72  tine to transfor
1f8f0 6d 20 61 20 75 6e 69 78 46 69 6c 65 20 69 6e 74  m a unixFile int
1f900 6f 20 61 20 70 72 6f 78 79 2d 6c 6f 63 6b 69 6e  o a proxy-lockin
1f910 67 20 75 6e 69 78 46 69 6c 65 2e 0a 2a 2a 20 49  g unixFile..** I
1f920 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 69 6e  mplementation in
1f930 20 74 68 65 20 70 72 6f 78 79 2d 6c 6f 63 6b 20   the proxy-lock 
1f940 64 69 76 69 73 69 6f 6e 2c 20 62 75 74 20 75 73  division, but us
1f950 65 64 20 62 79 20 75 6e 69 78 4f 70 65 6e 28 29  ed by unixOpen()
1f960 0a 2a 2a 20 69 66 20 53 51 4c 49 54 45 5f 50 52  .** if SQLITE_PR
1f970 45 46 45 52 5f 50 52 4f 58 59 5f 4c 4f 43 4b 49  EFER_PROXY_LOCKI
1f980 4e 47 20 69 73 20 64 65 66 69 6e 65 64 2e 0a 2a  NG is defined..*
1f990 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72 6f  /.static int pro
1f9a0 78 79 54 72 61 6e 73 66 6f 72 6d 55 6e 69 78 46  xyTransformUnixF
1f9b0 69 6c 65 28 75 6e 69 78 46 69 6c 65 2a 2c 20 63  ile(unixFile*, c
1f9c0 6f 6e 73 74 20 63 68 61 72 2a 29 3b 0a 23 65 6e  onst char*);.#en
1f9d0 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 53 65 61 72 63  dif../*.** Searc
1f9e0 68 20 66 6f 72 20 61 6e 20 75 6e 75 73 65 64 20  h for an unused 
1f9f0 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
1fa00 74 68 61 74 20 77 61 73 20 6f 70 65 6e 65 64 20  that was opened 
1fa10 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  on the database 
1fa20 0a 2a 2a 20 66 69 6c 65 20 28 6e 6f 74 20 61 20  .** file (not a 
1fa30 6a 6f 75 72 6e 61 6c 20 6f 72 20 6d 61 73 74 65  journal or maste
1fa40 72 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 29 20  r-journal file) 
1fa50 69 64 65 6e 74 69 66 69 65 64 20 62 79 20 70 61  identified by pa
1fa60 74 68 6e 61 6d 65 0a 2a 2a 20 7a 50 61 74 68 20  thname.** zPath 
1fa70 77 69 74 68 20 53 51 4c 49 54 45 5f 4f 50 45 4e  with SQLITE_OPEN
1fa80 5f 58 58 58 20 66 6c 61 67 73 20 6d 61 74 63 68  _XXX flags match
1fa90 69 6e 67 20 74 68 6f 73 65 20 70 61 73 73 65 64  ing those passed
1faa0 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64 0a 2a   as the second.*
1fab0 2a 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 74 68  * argument to th
1fac0 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a  is function..**.
1fad0 2a 2a 20 53 75 63 68 20 61 20 66 69 6c 65 20 64  ** Such a file d
1fae0 65 73 63 72 69 70 74 6f 72 20 6d 61 79 20 65 78  escriptor may ex
1faf0 69 73 74 20 69 66 20 61 20 64 61 74 61 62 61 73  ist if a databas
1fb00 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77 61 73  e connection was
1fb10 20 63 6c 6f 73 65 64 0a 2a 2a 20 62 75 74 20 74   closed.** but t
1fb20 68 65 20 61 73 73 6f 63 69 61 74 65 64 20 66 69  he associated fi
1fb30 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 63 6f  le descriptor co
1fb40 75 6c 64 20 6e 6f 74 20 62 65 20 63 6c 6f 73 65  uld not be close
1fb50 64 20 62 65 63 61 75 73 65 20 73 6f 6d 65 0a 2a  d because some.*
1fb60 2a 20 6f 74 68 65 72 20 66 69 6c 65 20 64 65 73  * other file des
1fb70 63 72 69 70 74 6f 72 20 6f 70 65 6e 20 6f 6e 20  criptor open on 
1fb80 74 68 65 20 73 61 6d 65 20 66 69 6c 65 20 69 73  the same file is
1fb90 20 68 6f 6c 64 69 6e 67 20 61 20 66 69 6c 65 2d   holding a file-
1fba0 6c 6f 63 6b 2e 0a 2a 2a 20 52 65 66 65 72 20 74  lock..** Refer t
1fbb0 6f 20 63 6f 6d 6d 65 6e 74 73 20 69 6e 20 74 68  o comments in th
1fbc0 65 20 75 6e 69 78 43 6c 6f 73 65 28 29 20 66 75  e unixClose() fu
1fbd0 6e 63 74 69 6f 6e 20 61 6e 64 20 74 68 65 20 6c  nction and the l
1fbe0 65 6e 67 74 68 79 20 63 6f 6d 6d 65 6e 74 0a 2a  engthy comment.*
1fbf0 2a 20 64 65 73 63 72 69 62 69 6e 67 20 22 50 6f  * describing "Po
1fc00 73 69 78 20 41 64 76 69 73 6f 72 79 20 4c 6f 63  six Advisory Loc
1fc10 6b 69 6e 67 22 20 61 74 20 74 68 65 20 73 74 61  king" at the sta
1fc20 72 74 20 6f 66 20 74 68 69 73 20 66 69 6c 65 20  rt of this file 
1fc30 66 6f 72 20 0a 2a 2a 20 66 75 72 74 68 65 72 20  for .** further 
1fc40 64 65 74 61 69 6c 73 2e 20 41 6c 73 6f 2c 20 74  details. Also, t
1fc50 69 63 6b 65 74 20 23 34 30 31 38 2e 0a 2a 2a 0a  icket #4018..**.
1fc60 2a 2a 20 49 66 20 61 20 73 75 69 74 61 62 6c 65  ** If a suitable
1fc70 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
1fc80 20 69 73 20 66 6f 75 6e 64 2c 20 74 68 65 6e 20   is found, then 
1fc90 69 74 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20  it is returned. 
1fca0 49 66 20 6e 6f 0a 2a 2a 20 73 75 63 68 20 66 69  If no.** such fi
1fcb0 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 69 73  le descriptor is
1fcc0 20 6c 6f 63 61 74 65 64 2c 20 2d 31 20 69 73 20   located, -1 is 
1fcd0 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61  returned..*/.sta
1fce0 74 69 63 20 55 6e 69 78 55 6e 75 73 65 64 46 64  tic UnixUnusedFd
1fcf0 20 2a 66 69 6e 64 52 65 75 73 61 62 6c 65 46 64   *findReusableFd
1fd00 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 61  (const char *zPa
1fd10 74 68 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a  th, int flags){.
1fd20 20 20 55 6e 69 78 55 6e 75 73 65 64 46 64 20 2a    UnixUnusedFd *
1fd30 70 55 6e 75 73 65 64 20 3d 20 30 3b 0a 0a 20 20  pUnused = 0;..  
1fd40 2f 2a 20 44 6f 20 6e 6f 74 20 73 65 61 72 63 68  /* Do not search
1fd50 20 66 6f 72 20 61 6e 20 75 6e 75 73 65 64 20 66   for an unused f
1fd60 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 6f  ile descriptor o
1fd70 6e 20 76 78 77 6f 72 6b 73 2e 20 4e 6f 74 20 62  n vxworks. Not b
1fd80 65 63 61 75 73 65 0a 20 20 2a 2a 20 76 78 77 6f  ecause.  ** vxwo
1fd90 72 6b 73 20 77 6f 75 6c 64 20 6e 6f 74 20 62 65  rks would not be
1fda0 6e 65 66 69 74 20 66 72 6f 6d 20 74 68 65 20 63  nefit from the c
1fdb0 68 61 6e 67 65 20 28 69 74 20 6d 69 67 68 74 2c  hange (it might,
1fdc0 20 77 65 27 72 65 20 6e 6f 74 20 73 75 72 65 29   we're not sure)
1fdd0 2c 0a 20 20 2a 2a 20 62 75 74 20 62 65 63 61 75  ,.  ** but becau
1fde0 73 65 20 6e 6f 20 77 61 79 20 74 6f 20 74 65 73  se no way to tes
1fdf0 74 20 69 74 20 69 73 20 63 75 72 72 65 6e 74 6c  t it is currentl
1fe00 79 20 61 76 61 69 6c 61 62 6c 65 2e 20 49 74 20  y available. It 
1fe10 69 73 20 62 65 74 74 65 72 20 0a 20 20 2a 2a 20  is better .  ** 
1fe20 6e 6f 74 20 74 6f 20 72 69 73 6b 20 62 72 65 61  not to risk brea
1fe30 6b 69 6e 67 20 76 78 77 6f 72 6b 73 20 73 75 70  king vxworks sup
1fe40 70 6f 72 74 20 66 6f 72 20 74 68 65 20 73 61 6b  port for the sak
1fe50 65 20 6f 66 20 73 75 63 68 20 61 6e 20 6f 62 73  e of such an obs
1fe60 63 75 72 65 20 0a 20 20 2a 2a 20 66 65 61 74 75  cure .  ** featu
1fe70 72 65 2e 20 20 2a 2f 0a 23 69 66 20 21 4f 53 5f  re.  */.#if !OS_
1fe80 56 58 57 4f 52 4b 53 0a 20 20 73 74 72 75 63 74  VXWORKS.  struct
1fe90 20 73 74 61 74 20 73 53 74 61 74 3b 20 20 20 20   stat sStat;    
1fea0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1feb0 2a 20 52 65 73 75 6c 74 73 20 6f 66 20 73 74 61  * Results of sta
1fec0 74 28 29 20 63 61 6c 6c 20 2a 2f 0a 0a 20 20 2f  t() call */..  /
1fed0 2a 20 41 20 73 74 61 74 28 29 20 63 61 6c 6c 20  * A stat() call 
1fee0 6d 61 79 20 66 61 69 6c 20 66 6f 72 20 76 61 72  may fail for var
1fef0 69 6f 75 73 20 72 65 61 73 6f 6e 73 2e 20 49 66  ious reasons. If
1ff00 20 74 68 69 73 20 68 61 70 70 65 6e 73 2c 20 69   this happens, i
1ff10 74 20 69 73 0a 20 20 2a 2a 20 61 6c 6d 6f 73 74  t is.  ** almost
1ff20 20 63 65 72 74 61 69 6e 20 74 68 61 74 20 61 6e   certain that an
1ff30 20 6f 70 65 6e 28 29 20 63 61 6c 6c 20 6f 6e 20   open() call on 
1ff40 74 68 65 20 73 61 6d 65 20 70 61 74 68 20 77 69  the same path wi
1ff50 6c 6c 20 61 6c 73 6f 20 66 61 69 6c 2e 0a 20 20  ll also fail..  
1ff60 2a 2a 20 46 6f 72 20 74 68 69 73 20 72 65 61 73  ** For this reas
1ff70 6f 6e 2c 20 69 66 20 61 6e 20 65 72 72 6f 72 20  on, if an error 
1ff80 6f 63 63 75 72 73 20 69 6e 20 74 68 65 20 73 74  occurs in the st
1ff90 61 74 28 29 20 63 61 6c 6c 20 68 65 72 65 2c 20  at() call here, 
1ffa0 69 74 20 69 73 0a 20 20 2a 2a 20 69 67 6e 6f 72  it is.  ** ignor
1ffb0 65 64 20 61 6e 64 20 2d 31 20 69 73 20 72 65 74  ed and -1 is ret
1ffc0 75 72 6e 65 64 2e 20 54 68 65 20 63 61 6c 6c 65  urned. The calle
1ffd0 72 20 77 69 6c 6c 20 74 72 79 20 74 6f 20 6f 70  r will try to op
1ffe0 65 6e 20 61 20 6e 65 77 20 66 69 6c 65 0a 20 20  en a new file.  
1fff0 2a 2a 20 64 65 73 63 72 69 70 74 6f 72 20 6f 6e  ** descriptor on
20000 20 74 68 65 20 73 61 6d 65 20 70 61 74 68 2c 20   the same path, 
20010 66 61 69 6c 2c 20 61 6e 64 20 72 65 74 75 72 6e  fail, and return
20020 20 61 6e 20 65 72 72 6f 72 20 74 6f 20 53 51 4c   an error to SQL
20030 69 74 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 45  ite..  **.  ** E
20040 76 65 6e 20 69 66 20 61 20 73 75 62 73 65 71 75  ven if a subsequ
20050 65 6e 74 20 6f 70 65 6e 28 29 20 63 61 6c 6c 20  ent open() call 
20060 64 6f 65 73 20 73 75 63 63 65 65 64 2c 20 74 68  does succeed, th
20070 65 20 63 6f 6e 73 65 71 75 65 6e 63 65 73 20 6f  e consequences o
20080 66 0a 20 20 2a 2a 20 6e 6f 74 20 73 65 61 72 63  f.  ** not searc
20090 68 69 6e 67 20 66 6f 72 20 61 20 72 65 73 75 73  hing for a resus
200a0 61 62 6c 65 20 66 69 6c 65 20 64 65 73 63 72 69  able file descri
200b0 70 74 6f 72 20 61 72 65 20 6e 6f 74 20 64 69 72  ptor are not dir
200c0 65 2e 20 20 2a 2f 0a 20 20 69 66 28 20 30 3d 3d  e.  */.  if( 0==
200d0 73 74 61 74 28 7a 50 61 74 68 2c 20 26 73 53 74  stat(zPath, &sSt
200e0 61 74 29 20 29 7b 0a 20 20 20 20 73 74 72 75 63  at) ){.    struc
200f0 74 20 75 6e 69 78 4f 70 65 6e 43 6e 74 20 2a 70  t unixOpenCnt *p
20100 4f 70 65 6e 3b 0a 0a 20 20 20 20 75 6e 69 78 45  Open;..    unixE
20110 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 20 20 20  nterMutex();.   
20120 20 70 4f 70 65 6e 20 3d 20 6f 70 65 6e 4c 69 73   pOpen = openLis
20130 74 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 70 4f  t;.    while( pO
20140 70 65 6e 20 26 26 20 28 70 4f 70 65 6e 2d 3e 66  pen && (pOpen->f
20150 69 6c 65 49 64 2e 64 65 76 21 3d 73 53 74 61 74  ileId.dev!=sStat
20160 2e 73 74 5f 64 65 76 0a 20 20 20 20 20 20 20 20  .st_dev.        
20170 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20               || 
20180 70 4f 70 65 6e 2d 3e 66 69 6c 65 49 64 2e 69 6e  pOpen->fileId.in
20190 6f 21 3d 73 53 74 61 74 2e 73 74 5f 69 6e 6f 29  o!=sStat.st_ino)
201a0 20 29 7b 0a 20 20 20 20 20 20 20 70 4f 70 65 6e   ){.       pOpen
201b0 20 3d 20 70 4f 70 65 6e 2d 3e 70 4e 65 78 74 3b   = pOpen->pNext;
201c0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70  .    }.    if( p
201d0 4f 70 65 6e 20 29 7b 0a 20 20 20 20 20 20 55 6e  Open ){.      Un
201e0 69 78 55 6e 75 73 65 64 46 64 20 2a 2a 70 70 3b  ixUnusedFd **pp;
201f0 0a 20 20 20 20 20 20 66 6f 72 28 70 70 3d 26 70  .      for(pp=&p
20200 4f 70 65 6e 2d 3e 70 55 6e 75 73 65 64 3b 20 2a  Open->pUnused; *
20210 70 70 20 26 26 20 28 2a 70 70 29 2d 3e 66 6c 61  pp && (*pp)->fla
20220 67 73 21 3d 66 6c 61 67 73 3b 20 70 70 3d 26 28  gs!=flags; pp=&(
20230 28 2a 70 70 29 2d 3e 70 4e 65 78 74 29 29 3b 0a  (*pp)->pNext));.
20240 20 20 20 20 20 20 70 55 6e 75 73 65 64 20 3d 20        pUnused = 
20250 2a 70 70 3b 0a 20 20 20 20 20 20 69 66 28 20 70  *pp;.      if( p
20260 55 6e 75 73 65 64 20 29 7b 0a 20 20 20 20 20 20  Unused ){.      
20270 20 20 2a 70 70 20 3d 20 70 55 6e 75 73 65 64 2d    *pp = pUnused-
20280 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d 0a  >pNext;.      }.
20290 20 20 20 20 7d 0a 20 20 20 20 75 6e 69 78 4c 65      }.    unixLe
202a0 61 76 65 4d 75 74 65 78 28 29 3b 0a 20 20 7d 0a  aveMutex();.  }.
202b0 23 65 6e 64 69 66 20 20 20 20 2f 2a 20 69 66 20  #endif    /* if 
202c0 21 4f 53 5f 56 58 57 4f 52 4b 53 20 2a 2f 0a 20  !OS_VXWORKS */. 
202d0 20 72 65 74 75 72 6e 20 70 55 6e 75 73 65 64 3b   return pUnused;
202e0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 74  .}../*.** Open t
202f0 68 65 20 66 69 6c 65 20 7a 50 61 74 68 2e 0a 2a  he file zPath..*
20300 2a 20 0a 2a 2a 20 50 72 65 76 69 6f 75 73 6c 79  * .** Previously
20310 2c 20 74 68 65 20 53 51 4c 69 74 65 20 4f 53 20  , the SQLite OS 
20320 6c 61 79 65 72 20 75 73 65 64 20 74 68 72 65 65  layer used three
20330 20 66 75 6e 63 74 69 6f 6e 73 20 69 6e 20 70 6c   functions in pl
20340 61 63 65 20 6f 66 20 74 68 69 73 0a 2a 2a 20 6f  ace of this.** o
20350 6e 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 73 71  ne:.**.**     sq
20360 6c 69 74 65 33 4f 73 4f 70 65 6e 52 65 61 64 57  lite3OsOpenReadW
20370 72 69 74 65 28 29 3b 0a 2a 2a 20 20 20 20 20 73  rite();.**     s
20380 71 6c 69 74 65 33 4f 73 4f 70 65 6e 52 65 61 64  qlite3OsOpenRead
20390 4f 6e 6c 79 28 29 3b 0a 2a 2a 20 20 20 20 20 73  Only();.**     s
203a0 71 6c 69 74 65 33 4f 73 4f 70 65 6e 45 78 63 6c  qlite3OsOpenExcl
203b0 75 73 69 76 65 28 29 3b 0a 2a 2a 0a 2a 2a 20 54  usive();.**.** T
203c0 68 65 73 65 20 63 61 6c 6c 73 20 63 6f 72 72 65  hese calls corre
203d0 73 70 6f 6e 64 20 74 6f 20 74 68 65 20 66 6f 6c  spond to the fol
203e0 6c 6f 77 69 6e 67 20 63 6f 6d 62 69 6e 61 74 69  lowing combinati
203f0 6f 6e 73 20 6f 66 20 66 6c 61 67 73 3a 0a 2a 2a  ons of flags:.**
20400 0a 2a 2a 20 20 20 20 20 52 65 61 64 57 72 69 74  .**     ReadWrit
20410 65 28 29 20 2d 3e 20 20 20 20 20 28 52 45 41 44  e() ->     (READ
20420 57 52 49 54 45 20 7c 20 43 52 45 41 54 45 29 0a  WRITE | CREATE).
20430 2a 2a 20 20 20 20 20 52 65 61 64 4f 6e 6c 79 28  **     ReadOnly(
20440 29 20 20 2d 3e 20 20 20 20 20 28 52 45 41 44 4f  )  ->     (READO
20450 4e 4c 59 29 20 0a 2a 2a 20 20 20 20 20 4f 70 65  NLY) .**     Ope
20460 6e 45 78 63 6c 75 73 69 76 65 28 29 20 2d 3e 20  nExclusive() -> 
20470 28 52 45 41 44 57 52 49 54 45 20 7c 20 43 52 45  (READWRITE | CRE
20480 41 54 45 20 7c 20 45 58 43 4c 55 53 49 56 45 29  ATE | EXCLUSIVE)
20490 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6f 6c 64 20 4f  .**.** The old O
204a0 70 65 6e 45 78 63 6c 75 73 69 76 65 28 29 20 61  penExclusive() a
204b0 63 63 65 70 74 65 64 20 61 20 62 6f 6f 6c 65 61  ccepted a boolea
204c0 6e 20 61 72 67 75 6d 65 6e 74 20 2d 20 22 64 65  n argument - "de
204d0 6c 46 6c 61 67 22 2e 20 49 66 0a 2a 2a 20 74 72  lFlag". If.** tr
204e0 75 65 2c 20 74 68 65 20 66 69 6c 65 20 77 61 73  ue, the file was
204f0 20 63 6f 6e 66 69 67 75 72 65 64 20 74 6f 20 62   configured to b
20500 65 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20  e automatically 
20510 64 65 6c 65 74 65 64 20 77 68 65 6e 20 74 68 65  deleted when the
20520 0a 2a 2a 20 66 69 6c 65 20 68 61 6e 64 6c 65 20  .** file handle 
20530 63 6c 6f 73 65 64 2e 20 54 6f 20 61 63 68 69 65  closed. To achie
20540 76 65 20 74 68 65 20 73 61 6d 65 20 65 66 66 65  ve the same effe
20550 63 74 20 75 73 69 6e 67 20 74 68 69 73 20 6e 65  ct using this ne
20560 77 20 0a 2a 2a 20 69 6e 74 65 72 66 61 63 65 2c  w .** interface,
20570 20 61 64 64 20 74 68 65 20 44 45 4c 45 54 45 4f   add the DELETEO
20580 4e 43 4c 4f 53 45 20 66 6c 61 67 20 74 6f 20 74  NCLOSE flag to t
20590 68 6f 73 65 20 73 70 65 63 69 66 69 65 64 20 61  hose specified a
205a0 62 6f 76 65 20 66 6f 72 20 0a 2a 2a 20 4f 70 65  bove for .** Ope
205b0 6e 45 78 63 6c 75 73 69 76 65 28 29 2e 0a 2a 2f  nExclusive()..*/
205c0 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78  .static int unix
205d0 4f 70 65 6e 28 0a 20 20 73 71 6c 69 74 65 33 5f  Open(.  sqlite3_
205e0 76 66 73 20 2a 70 56 66 73 2c 20 20 20 20 20 20  vfs *pVfs,      
205f0 20 20 20 20 20 2f 2a 20 54 68 65 20 56 46 53 20       /* The VFS 
20600 66 6f 72 20 77 68 69 63 68 20 74 68 69 73 20 69  for which this i
20610 73 20 74 68 65 20 78 4f 70 65 6e 20 6d 65 74 68  s the xOpen meth
20620 6f 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  od */.  const ch
20630 61 72 20 2a 7a 50 61 74 68 2c 20 20 20 20 20 20  ar *zPath,      
20640 20 20 20 20 20 2f 2a 20 50 61 74 68 6e 61 6d 65       /* Pathname
20650 20 6f 66 20 66 69 6c 65 20 74 6f 20 62 65 20 6f   of file to be o
20660 70 65 6e 65 64 20 2a 2f 0a 20 20 73 71 6c 69 74  pened */.  sqlit
20670 65 33 5f 66 69 6c 65 20 2a 70 46 69 6c 65 2c 20  e3_file *pFile, 
20680 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 66          /* The f
20690 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 74  ile descriptor t
206a0 6f 20 62 65 20 66 69 6c 6c 65 64 20 69 6e 20 2a  o be filled in *
206b0 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 2c 20 20  /.  int flags,  
206c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
206d0 20 2f 2a 20 49 6e 70 75 74 20 66 6c 61 67 73 20   /* Input flags 
206e0 74 6f 20 63 6f 6e 74 72 6f 6c 20 74 68 65 20 6f  to control the o
206f0 70 65 6e 69 6e 67 20 2a 2f 0a 20 20 69 6e 74 20  pening */.  int 
20700 2a 70 4f 75 74 46 6c 61 67 73 20 20 20 20 20 20  *pOutFlags      
20710 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 75 74 70           /* Outp
20720 75 74 20 66 6c 61 67 73 20 72 65 74 75 72 6e 65  ut flags returne
20730 64 20 74 6f 20 53 51 4c 69 74 65 20 63 6f 72 65  d to SQLite core
20740 20 2a 2f 0a 29 7b 0a 20 20 75 6e 69 78 46 69 6c   */.){.  unixFil
20750 65 20 2a 70 20 3d 20 28 75 6e 69 78 46 69 6c 65  e *p = (unixFile
20760 20 2a 29 70 46 69 6c 65 3b 0a 20 20 69 6e 74 20   *)pFile;.  int 
20770 66 64 20 3d 20 2d 31 3b 20 20 20 20 20 20 20 20  fd = -1;        
20780 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69             /* Fi
20790 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 72 65  le descriptor re
207a0 74 75 72 6e 65 64 20 62 79 20 6f 70 65 6e 28 29  turned by open()
207b0 20 2a 2f 0a 20 20 69 6e 74 20 64 69 72 66 64 20   */.  int dirfd 
207c0 3d 20 2d 31 3b 20 20 20 20 20 20 20 20 20 20 20  = -1;           
207d0 20 20 20 20 20 2f 2a 20 44 69 72 65 63 74 6f 72       /* Director
207e0 79 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  y file descripto
207f0 72 20 2a 2f 0a 20 20 69 6e 74 20 6f 70 65 6e 46  r */.  int openF
20800 6c 61 67 73 20 3d 20 30 3b 20 20 20 20 20 20 20  lags = 0;       
20810 20 20 20 20 20 20 2f 2a 20 46 6c 61 67 73 20 74        /* Flags t
20820 6f 20 70 61 73 73 20 74 6f 20 6f 70 65 6e 28 29  o pass to open()
20830 20 2a 2f 0a 20 20 69 6e 74 20 65 54 79 70 65 20   */.  int eType 
20840 3d 20 66 6c 61 67 73 26 30 78 46 46 46 46 46 46  = flags&0xFFFFFF
20850 30 30 3b 20 20 2f 2a 20 54 79 70 65 20 6f 66 20  00;  /* Type of 
20860 66 69 6c 65 20 74 6f 20 6f 70 65 6e 20 2a 2f 0a  file to open */.
20870 20 20 69 6e 74 20 6e 6f 4c 6f 63 6b 3b 20 20 20    int noLock;   
20880 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20890 20 2f 2a 20 54 72 75 65 20 74 6f 20 6f 6d 69 74   /* True to omit
208a0 20 6c 6f 63 6b 69 6e 67 20 70 72 69 6d 69 74 69   locking primiti
208b0 76 65 73 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20  ves */.  int rc 
208c0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20  = SQLITE_OK;    
208d0 20 20 20 20 20 20 20 20 2f 2a 20 46 75 6e 63 74          /* Funct
208e0 69 6f 6e 20 52 65 74 75 72 6e 20 43 6f 64 65 20  ion Return Code 
208f0 2a 2f 0a 0a 20 20 69 6e 74 20 69 73 45 78 63 6c  */..  int isExcl
20900 75 73 69 76 65 20 20 3d 20 28 66 6c 61 67 73 20  usive  = (flags 
20910 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 45 58  & SQLITE_OPEN_EX
20920 43 4c 55 53 49 56 45 29 3b 0a 20 20 69 6e 74 20  CLUSIVE);.  int 
20930 69 73 44 65 6c 65 74 65 20 20 20 20 20 3d 20 28  isDelete     = (
20940 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f  flags & SQLITE_O
20950 50 45 4e 5f 44 45 4c 45 54 45 4f 4e 43 4c 4f 53  PEN_DELETEONCLOS
20960 45 29 3b 0a 20 20 69 6e 74 20 69 73 43 72 65 61  E);.  int isCrea
20970 74 65 20 20 20 20 20 3d 20 28 66 6c 61 67 73 20  te     = (flags 
20980 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52  & SQLITE_OPEN_CR
20990 45 41 54 45 29 3b 0a 20 20 69 6e 74 20 69 73 52  EATE);.  int isR
209a0 65 61 64 6f 6e 6c 79 20 20 20 3d 20 28 66 6c 61  eadonly   = (fla
209b0 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e  gs & SQLITE_OPEN
209c0 5f 52 45 41 44 4f 4e 4c 59 29 3b 0a 20 20 69 6e  _READONLY);.  in
209d0 74 20 69 73 52 65 61 64 57 72 69 74 65 20 20 3d  t isReadWrite  =
209e0 20 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45   (flags & SQLITE
209f0 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45 29  _OPEN_READWRITE)
20a00 3b 0a 23 69 66 20 53 51 4c 49 54 45 5f 45 4e 41  ;.#if SQLITE_ENA
20a10 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c  BLE_LOCKING_STYL
20a20 45 0a 20 20 69 6e 74 20 69 73 41 75 74 6f 50 72  E.  int isAutoPr
20a30 6f 78 79 20 20 3d 20 28 66 6c 61 67 73 20 26 20  oxy  = (flags & 
20a40 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 41 55 54 4f  SQLITE_OPEN_AUTO
20a50 50 52 4f 58 59 29 3b 0a 23 65 6e 64 69 66 0a 0a  PROXY);.#endif..
20a60 20 20 2f 2a 20 49 66 20 63 72 65 61 74 69 6e 67    /* If creating
20a70 20 61 20 6d 61 73 74 65 72 20 6f 72 20 6d 61 69   a master or mai
20a80 6e 2d 66 69 6c 65 20 6a 6f 75 72 6e 61 6c 2c 20  n-file journal, 
20a90 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 77 69  this function wi
20aa0 6c 6c 20 6f 70 65 6e 0a 20 20 2a 2a 20 61 20 66  ll open.  ** a f
20ab0 69 6c 65 2d 64 65 73 63 72 69 70 74 6f 72 20 6f  ile-descriptor o
20ac0 6e 20 74 68 65 20 64 69 72 65 63 74 6f 72 79 20  n the directory 
20ad0 74 6f 6f 2e 20 54 68 65 20 66 69 72 73 74 20 74  too. The first t
20ae0 69 6d 65 20 75 6e 69 78 53 79 6e 63 28 29 0a 20  ime unixSync(). 
20af0 20 2a 2a 20 69 73 20 63 61 6c 6c 65 64 20 74 68   ** is called th
20b00 65 20 64 69 72 65 63 74 6f 72 79 20 66 69 6c 65  e directory file
20b10 20 64 65 73 63 72 69 70 74 6f 72 20 77 69 6c 6c   descriptor will
20b20 20 62 65 20 66 73 79 6e 63 28 29 65 64 20 61 6e   be fsync()ed an
20b30 64 20 63 6c 6f 73 65 28 29 64 2e 0a 20 20 2a 2f  d close()d..  */
20b40 0a 20 20 69 6e 74 20 69 73 4f 70 65 6e 44 69 72  .  int isOpenDir
20b50 65 63 74 6f 72 79 20 3d 20 28 69 73 43 72 65 61  ectory = (isCrea
20b60 74 65 20 26 26 20 0a 20 20 20 20 20 20 28 65 54  te && .      (eT
20b70 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e  ype==SQLITE_OPEN
20b80 5f 4d 41 53 54 45 52 5f 4a 4f 55 52 4e 41 4c 20  _MASTER_JOURNAL 
20b90 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45  || eType==SQLITE
20ba0 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e  _OPEN_MAIN_JOURN
20bb0 41 4c 29 0a 20 20 29 3b 0a 0a 20 20 2f 2a 20 49  AL).  );..  /* I
20bc0 66 20 61 72 67 75 6d 65 6e 74 20 7a 50 61 74 68  f argument zPath
20bd0 20 69 73 20 61 20 4e 55 4c 4c 20 70 6f 69 6e 74   is a NULL point
20be0 65 72 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f  er, this functio
20bf0 6e 20 69 73 20 72 65 71 75 69 72 65 64 20 74 6f  n is required to
20c00 20 6f 70 65 6e 0a 20 20 2a 2a 20 61 20 74 65 6d   open.  ** a tem
20c10 70 6f 72 61 72 79 20 66 69 6c 65 2e 20 55 73 65  porary file. Use
20c20 20 74 68 69 73 20 62 75 66 66 65 72 20 74 6f 20   this buffer to 
20c30 73 74 6f 72 65 20 74 68 65 20 66 69 6c 65 20 6e  store the file n
20c40 61 6d 65 20 69 6e 2e 0a 20 20 2a 2f 0a 20 20 63  ame in..  */.  c
20c50 68 61 72 20 7a 54 6d 70 6e 61 6d 65 5b 4d 41 58  har zTmpname[MAX
20c60 5f 50 41 54 48 4e 41 4d 45 2b 31 5d 3b 0a 20 20  _PATHNAME+1];.  
20c70 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d  const char *zNam
20c80 65 20 3d 20 7a 50 61 74 68 3b 0a 0a 20 20 2f 2a  e = zPath;..  /*
20c90 20 43 68 65 63 6b 20 74 68 65 20 66 6f 6c 6c 6f   Check the follo
20ca0 77 69 6e 67 20 73 74 61 74 65 6d 65 6e 74 73 20  wing statements 
20cb0 61 72 65 20 74 72 75 65 3a 20 0a 20 20 2a 2a 0a  are true: .  **.
20cc0 20 20 2a 2a 20 20 20 28 61 29 20 45 78 61 63 74    **   (a) Exact
20cd0 6c 79 20 6f 6e 65 20 6f 66 20 74 68 65 20 52 45  ly one of the RE
20ce0 41 44 57 52 49 54 45 20 61 6e 64 20 52 45 41 44  ADWRITE and READ
20cf0 4f 4e 4c 59 20 66 6c 61 67 73 20 6d 75 73 74 20  ONLY flags must 
20d00 62 65 20 73 65 74 2c 20 61 6e 64 20 0a 20 20 2a  be set, and .  *
20d10 2a 20 20 20 28 62 29 20 69 66 20 43 52 45 41 54  *   (b) if CREAT
20d20 45 20 69 73 20 73 65 74 2c 20 74 68 65 6e 20 52  E is set, then R
20d30 45 41 44 57 52 49 54 45 20 6d 75 73 74 20 61 6c  EADWRITE must al
20d40 73 6f 20 62 65 20 73 65 74 2c 20 61 6e 64 0a 20  so be set, and. 
20d50 20 2a 2a 20 20 20 28 63 29 20 69 66 20 45 58 43   **   (c) if EXC
20d60 4c 55 53 49 56 45 20 69 73 20 73 65 74 2c 20 74  LUSIVE is set, t
20d70 68 65 6e 20 43 52 45 41 54 45 20 6d 75 73 74 20  hen CREATE must 
20d80 61 6c 73 6f 20 62 65 20 73 65 74 2e 0a 20 20 2a  also be set..  *
20d90 2a 20 20 20 28 64 29 20 69 66 20 44 45 4c 45 54  *   (d) if DELET
20da0 45 4f 4e 43 4c 4f 53 45 20 69 73 20 73 65 74 2c  EONCLOSE is set,
20db0 20 74 68 65 6e 20 43 52 45 41 54 45 20 6d 75 73   then CREATE mus
20dc0 74 20 61 6c 73 6f 20 62 65 20 73 65 74 2e 0a 20  t also be set.. 
20dd0 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 28 69 73   */.  assert((is
20de0 52 65 61 64 6f 6e 6c 79 3d 3d 30 20 7c 7c 20 69  Readonly==0 || i
20df0 73 52 65 61 64 57 72 69 74 65 3d 3d 30 29 20 26  sReadWrite==0) &
20e00 26 20 28 69 73 52 65 61 64 57 72 69 74 65 20 7c  & (isReadWrite |
20e10 7c 20 69 73 52 65 61 64 6f 6e 6c 79 29 29 3b 0a  | isReadonly));.
20e20 20 20 61 73 73 65 72 74 28 69 73 43 72 65 61 74    assert(isCreat
20e30 65 3d 3d 30 20 7c 7c 20 69 73 52 65 61 64 57 72  e==0 || isReadWr
20e40 69 74 65 29 3b 0a 20 20 61 73 73 65 72 74 28 69  ite);.  assert(i
20e50 73 45 78 63 6c 75 73 69 76 65 3d 3d 30 20 7c 7c  sExclusive==0 ||
20e60 20 69 73 43 72 65 61 74 65 29 3b 0a 20 20 61 73   isCreate);.  as
20e70 73 65 72 74 28 69 73 44 65 6c 65 74 65 3d 3d 30  sert(isDelete==0
20e80 20 7c 7c 20 69 73 43 72 65 61 74 65 29 3b 0a 0a   || isCreate);..
20e90 20 20 2f 2a 20 54 68 65 20 6d 61 69 6e 20 44 42    /* The main DB
20ea0 2c 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 2c 20  , main journal, 
20eb0 61 6e 64 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  and master journ
20ec0 61 6c 20 61 72 65 20 6e 65 76 65 72 20 61 75 74  al are never aut
20ed0 6f 6d 61 74 69 63 61 6c 6c 79 0a 20 20 2a 2a 20  omatically.  ** 
20ee0 64 65 6c 65 74 65 64 2e 20 4e 6f 72 20 61 72 65  deleted. Nor are
20ef0 20 74 68 65 79 20 65 76 65 72 20 74 65 6d 70 6f   they ever tempo
20f00 72 61 72 79 20 66 69 6c 65 73 2e 20 20 2a 2f 0a  rary files.  */.
20f10 20 20 61 73 73 65 72 74 28 20 28 21 69 73 44 65    assert( (!isDe
20f20 6c 65 74 65 20 26 26 20 7a 4e 61 6d 65 29 20 7c  lete && zName) |
20f30 7c 20 65 54 79 70 65 21 3d 53 51 4c 49 54 45 5f  | eType!=SQLITE_
20f40 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42 20 29 3b 0a  OPEN_MAIN_DB );.
20f50 20 20 61 73 73 65 72 74 28 20 28 21 69 73 44 65    assert( (!isDe
20f60 6c 65 74 65 20 26 26 20 7a 4e 61 6d 65 29 20 7c  lete && zName) |
20f70 7c 20 65 54 79 70 65 21 3d 53 51 4c 49 54 45 5f  | eType!=SQLITE_
20f80 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41  OPEN_MAIN_JOURNA
20f90 4c 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28  L );.  assert( (
20fa0 21 69 73 44 65 6c 65 74 65 20 26 26 20 7a 4e 61  !isDelete && zNa
20fb0 6d 65 29 20 7c 7c 20 65 54 79 70 65 21 3d 53 51  me) || eType!=SQ
20fc0 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 53 54 45 52  LITE_OPEN_MASTER
20fd0 5f 4a 4f 55 52 4e 41 4c 20 29 3b 0a 0a 20 20 2f  _JOURNAL );..  /
20fe0 2a 20 41 73 73 65 72 74 20 74 68 61 74 20 74 68  * Assert that th
20ff0 65 20 75 70 70 65 72 20 6c 61 79 65 72 20 68 61  e upper layer ha
21000 73 20 73 65 74 20 6f 6e 65 20 6f 66 20 74 68 65  s set one of the
21010 20 22 66 69 6c 65 2d 74 79 70 65 22 20 66 6c 61   "file-type" fla
21020 67 73 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  gs. */.  assert(
21030 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f   eType==SQLITE_O
21040 50 45 4e 5f 4d 41 49 4e 5f 44 42 20 20 20 20 20  PEN_MAIN_DB     
21050 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49 54   || eType==SQLIT
21060 45 5f 4f 50 45 4e 5f 54 45 4d 50 5f 44 42 20 0a  E_OPEN_TEMP_DB .
21070 20 20 20 20 20 20 20 7c 7c 20 65 54 79 70 65 3d         || eType=
21080 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49  =SQLITE_OPEN_MAI
21090 4e 5f 4a 4f 55 52 4e 41 4c 20 7c 7c 20 65 54 79  N_JOURNAL || eTy
210a0 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  pe==SQLITE_OPEN_
210b0 54 45 4d 50 5f 4a 4f 55 52 4e 41 4c 20 0a 20 20  TEMP_JOURNAL .  
210c0 20 20 20 20 20 7c 7c 20 65 54 79 70 65 3d 3d 53       || eType==S
210d0 51 4c 49 54 45 5f 4f 50 45 4e 5f 53 55 42 4a 4f  QLITE_OPEN_SUBJO
210e0 55 52 4e 41 4c 20 20 20 7c 7c 20 65 54 79 70 65  URNAL   || eType
210f0 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41  ==SQLITE_OPEN_MA
21100 53 54 45 52 5f 4a 4f 55 52 4e 41 4c 20 0a 20 20  STER_JOURNAL .  
21110 20 20 20 20 20 7c 7c 20 65 54 79 70 65 3d 3d 53       || eType==S
21120 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 52 41 4e 53  QLITE_OPEN_TRANS
21130 49 45 4e 54 5f 44 42 0a 20 20 29 3b 0a 0a 20 20  IENT_DB.  );..  
21140 6d 65 6d 73 65 74 28 70 2c 20 30 2c 20 73 69 7a  memset(p, 0, siz
21150 65 6f 66 28 75 6e 69 78 46 69 6c 65 29 29 3b 0a  eof(unixFile));.
21160 0a 20 20 69 66 28 20 65 54 79 70 65 3d 3d 53 51  .  if( eType==SQ
21170 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44  LITE_OPEN_MAIN_D
21180 42 20 29 7b 0a 20 20 20 20 55 6e 69 78 55 6e 75  B ){.    UnixUnu
21190 73 65 64 46 64 20 2a 70 55 6e 75 73 65 64 3b 0a  sedFd *pUnused;.
211a0 20 20 20 20 70 55 6e 75 73 65 64 20 3d 20 66 69      pUnused = fi
211b0 6e 64 52 65 75 73 61 62 6c 65 46 64 28 7a 4e 61  ndReusableFd(zNa
211c0 6d 65 2c 20 66 6c 61 67 73 29 3b 0a 20 20 20 20  me, flags);.    
211d0 69 66 28 20 70 55 6e 75 73 65 64 20 29 7b 0a 20  if( pUnused ){. 
211e0 20 20 20 20 20 66 64 20 3d 20 70 55 6e 75 73 65       fd = pUnuse
211f0 64 2d 3e 66 64 3b 0a 20 20 20 20 7d 65 6c 73 65  d->fd;.    }else
21200 7b 0a 20 20 20 20 20 20 70 55 6e 75 73 65 64 20  {.      pUnused 
21210 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63  = sqlite3_malloc
21220 28 73 69 7a 65 6f 66 28 2a 70 55 6e 75 73 65 64  (sizeof(*pUnused
21230 29 29 3b 0a 20 20 20 20 20 20 69 66 28 20 21 70  ));.      if( !p
21240 55 6e 75 73 65 64 20 29 7b 0a 20 20 20 20 20 20  Unused ){.      
21250 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
21260 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 7d 0a 20  NOMEM;.      }. 
21270 20 20 20 7d 0a 20 20 20 20 70 2d 3e 70 55 6e 75     }.    p->pUnu
21280 73 65 64 20 3d 20 70 55 6e 75 73 65 64 3b 0a 20  sed = pUnused;. 
21290 20 7d 65 6c 73 65 20 69 66 28 20 21 7a 4e 61 6d   }else if( !zNam
212a0 65 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 7a  e ){.    /* If z
212b0 4e 61 6d 65 20 69 73 20 4e 55 4c 4c 2c 20 74 68  Name is NULL, th
212c0 65 20 75 70 70 65 72 20 6c 61 79 65 72 20 69 73  e upper layer is
212d0 20 72 65 71 75 65 73 74 69 6e 67 20 61 20 74 65   requesting a te
212e0 6d 70 20 66 69 6c 65 2e 20 2a 2f 0a 20 20 20 20  mp file. */.    
212f0 61 73 73 65 72 74 28 69 73 44 65 6c 65 74 65 20  assert(isDelete 
21300 26 26 20 21 69 73 4f 70 65 6e 44 69 72 65 63 74  && !isOpenDirect
21310 6f 72 79 29 3b 0a 20 20 20 20 72 63 20 3d 20 67  ory);.    rc = g
21320 65 74 54 65 6d 70 6e 61 6d 65 28 4d 41 58 5f 50  etTempname(MAX_P
21330 41 54 48 4e 41 4d 45 2b 31 2c 20 7a 54 6d 70 6e  ATHNAME+1, zTmpn
21340 61 6d 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63  ame);.    if( rc
21350 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
21360 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
21370 20 20 20 20 7d 0a 20 20 20 20 7a 4e 61 6d 65 20      }.    zName 
21380 3d 20 7a 54 6d 70 6e 61 6d 65 3b 0a 20 20 7d 0a  = zTmpname;.  }.
21390 0a 20 20 2f 2a 20 44 65 74 65 72 6d 69 6e 65 20  .  /* Determine 
213a0 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65  the value of the
213b0 20 66 6c 61 67 73 20 70 61 72 61 6d 65 74 65 72   flags parameter
213c0 20 70 61 73 73 65 64 20 74 6f 20 50 4f 53 49 58   passed to POSIX
213d0 20 66 75 6e 63 74 69 6f 6e 0a 20 20 2a 2a 20 6f   function.  ** o
213e0 70 65 6e 28 29 2e 20 54 68 65 73 65 20 6d 75 73  pen(). These mus
213f0 74 20 62 65 20 63 61 6c 63 75 6c 61 74 65 64 20  t be calculated 
21400 65 76 65 6e 20 69 66 20 6f 70 65 6e 28 29 20 69  even if open() i
21410 73 20 6e 6f 74 20 63 61 6c 6c 65 64 2c 20 61 73  s not called, as
21420 0a 20 20 2a 2a 20 74 68 65 79 20 6d 61 79 20 62  .  ** they may b
21430 65 20 73 74 6f 72 65 64 20 61 73 20 70 61 72 74  e stored as part
21440 20 6f 66 20 74 68 65 20 66 69 6c 65 20 68 61 6e   of the file han
21450 64 6c 65 20 61 6e 64 20 75 73 65 64 20 62 79 20  dle and used by 
21460 74 68 65 20 0a 20 20 2a 2a 20 27 63 6f 6e 63 68  the .  ** 'conch
21470 20 66 69 6c 65 27 20 6c 6f 63 6b 69 6e 67 20 66   file' locking f
21480 75 6e 63 74 69 6f 6e 73 20 6c 61 74 65 72 20 6f  unctions later o
21490 6e 2e 20 20 2a 2f 0a 20 20 69 66 28 20 69 73 52  n.  */.  if( isR
214a0 65 61 64 6f 6e 6c 79 20 29 20 20 6f 70 65 6e 46  eadonly )  openF
214b0 6c 61 67 73 20 7c 3d 20 4f 5f 52 44 4f 4e 4c 59  lags |= O_RDONLY
214c0 3b 0a 20 20 69 66 28 20 69 73 52 65 61 64 57 72  ;.  if( isReadWr
214d0 69 74 65 20 29 20 6f 70 65 6e 46 6c 61 67 73 20  ite ) openFlags 
214e0 7c 3d 20 4f 5f 52 44 57 52 3b 0a 20 20 69 66 28  |= O_RDWR;.  if(
214f0 20 69 73 43 72 65 61 74 65 20 29 20 20 20 20 6f   isCreate )    o
21500 70 65 6e 46 6c 61 67 73 20 7c 3d 20 4f 5f 43 52  penFlags |= O_CR
21510 45 41 54 3b 0a 20 20 69 66 28 20 69 73 45 78 63  EAT;.  if( isExc
21520 6c 75 73 69 76 65 20 29 20 6f 70 65 6e 46 6c 61  lusive ) openFla
21530 67 73 20 7c 3d 20 28 4f 5f 45 58 43 4c 7c 4f 5f  gs |= (O_EXCL|O_
21540 4e 4f 46 4f 4c 4c 4f 57 29 3b 0a 20 20 6f 70 65  NOFOLLOW);.  ope
21550 6e 46 6c 61 67 73 20 7c 3d 20 28 4f 5f 4c 41 52  nFlags |= (O_LAR
21560 47 45 46 49 4c 45 7c 4f 5f 42 49 4e 41 52 59 29  GEFILE|O_BINARY)
21570 3b 0a 0a 20 20 69 66 28 20 66 64 3c 30 20 29 7b  ;..  if( fd<0 ){
21580 0a 20 20 20 20 6d 6f 64 65 5f 74 20 6f 70 65 6e  .    mode_t open
21590 4d 6f 64 65 20 3d 20 28 69 73 44 65 6c 65 74 65  Mode = (isDelete
215a0 3f 30 36 30 30 3a 53 51 4c 49 54 45 5f 44 45 46  ?0600:SQLITE_DEF
215b0 41 55 4c 54 5f 46 49 4c 45 5f 50 45 52 4d 49 53  AULT_FILE_PERMIS
215c0 53 49 4f 4e 53 29 3b 0a 20 20 20 20 66 64 20 3d  SIONS);.    fd =
215d0 20 6f 70 65 6e 28 7a 4e 61 6d 65 2c 20 6f 70 65   open(zName, ope
215e0 6e 46 6c 61 67 73 2c 20 6f 70 65 6e 4d 6f 64 65  nFlags, openMode
215f0 29 3b 0a 20 20 20 20 4f 53 54 52 41 43 45 34 28  );.    OSTRACE4(
21600 22 4f 50 45 4e 58 20 20 20 25 2d 33 64 20 25 73  "OPENX   %-3d %s
21610 20 30 25 6f 5c 6e 22 2c 20 66 64 2c 20 7a 4e 61   0%o\n", fd, zNa
21620 6d 65 2c 20 6f 70 65 6e 46 6c 61 67 73 29 3b 0a  me, openFlags);.
21630 20 20 20 20 69 66 28 20 66 64 3c 30 20 26 26 20      if( fd<0 && 
21640 65 72 72 6e 6f 21 3d 45 49 53 44 49 52 20 26 26  errno!=EISDIR &&
21650 20 69 73 52 65 61 64 57 72 69 74 65 20 26 26 20   isReadWrite && 
21660 21 69 73 45 78 63 6c 75 73 69 76 65 20 29 7b 0a  !isExclusive ){.
21670 20 20 20 20 20 20 2f 2a 20 46 61 69 6c 65 64 20        /* Failed 
21680 74 6f 20 6f 70 65 6e 20 74 68 65 20 66 69 6c 65  to open the file
21690 20 66 6f 72 20 72 65 61 64 2f 77 72 69 74 65 20   for read/write 
216a0 61 63 63 65 73 73 2e 20 54 72 79 20 72 65 61 64  access. Try read
216b0 2d 6f 6e 6c 79 2e 20 2a 2f 0a 20 20 20 20 20 20  -only. */.      
216c0 66 6c 61 67 73 20 26 3d 20 7e 28 53 51 4c 49 54  flags &= ~(SQLIT
216d0 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45  E_OPEN_READWRITE
216e0 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45  |SQLITE_OPEN_CRE
216f0 41 54 45 29 3b 0a 20 20 20 20 20 20 6f 70 65 6e  ATE);.      open
21700 46 6c 61 67 73 20 26 3d 20 7e 28 4f 5f 52 44 57  Flags &= ~(O_RDW
21710 52 7c 4f 5f 43 52 45 41 54 29 3b 0a 20 20 20 20  R|O_CREAT);.    
21720 20 20 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54    flags |= SQLIT
21730 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 3b  E_OPEN_READONLY;
21740 0a 20 20 20 20 20 20 6f 70 65 6e 46 6c 61 67 73  .      openFlags
21750 20 7c 3d 20 4f 5f 52 44 4f 4e 4c 59 3b 0a 20 20   |= O_RDONLY;.  
21760 20 20 20 20 66 64 20 3d 20 6f 70 65 6e 28 7a 4e      fd = open(zN
21770 61 6d 65 2c 20 6f 70 65 6e 46 6c 61 67 73 2c 20  ame, openFlags, 
21780 6f 70 65 6e 4d 6f 64 65 29 3b 0a 20 20 20 20 7d  openMode);.    }
21790 0a 20 20 20 20 69 66 28 20 66 64 3c 30 20 29 7b  .    if( fd<0 ){
217a0 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
217b0 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 42 4b 50 54  TE_CANTOPEN_BKPT
217c0 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 6f 70 65  ;.      goto ope
217d0 6e 5f 66 69 6e 69 73 68 65 64 3b 0a 20 20 20 20  n_finished;.    
217e0 7d 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  }.  }.  assert( 
217f0 66 64 3e 3d 30 20 29 3b 0a 20 20 69 66 28 20 70  fd>=0 );.  if( p
21800 4f 75 74 46 6c 61 67 73 20 29 7b 0a 20 20 20 20  OutFlags ){.    
21810 2a 70 4f 75 74 46 6c 61 67 73 20 3d 20 66 6c 61  *pOutFlags = fla
21820 67 73 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70  gs;.  }..  if( p
21830 2d 3e 70 55 6e 75 73 65 64 20 29 7b 0a 20 20 20  ->pUnused ){.   
21840 20 70 2d 3e 70 55 6e 75 73 65 64 2d 3e 66 64 20   p->pUnused->fd 
21850 3d 20 66 64 3b 0a 20 20 20 20 70 2d 3e 70 55 6e  = fd;.    p->pUn
21860 75 73 65 64 2d 3e 66 6c 61 67 73 20 3d 20 66 6c  used->flags = fl
21870 61 67 73 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20  ags;.  }..  if( 
21880 69 73 44 65 6c 65 74 65 20 29 7b 0a 23 69 66 20  isDelete ){.#if 
21890 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20 20 20 7a  OS_VXWORKS.    z
218a0 50 61 74 68 20 3d 20 7a 4e 61 6d 65 3b 0a 23 65  Path = zName;.#e
218b0 6c 73 65 0a 20 20 20 20 75 6e 6c 69 6e 6b 28 7a  lse.    unlink(z
218c0 4e 61 6d 65 29 3b 0a 23 65 6e 64 69 66 0a 20 20  Name);.#endif.  
218d0 7d 0a 23 69 66 20 53 51 4c 49 54 45 5f 45 4e 41  }.#if SQLITE_ENA
218e0 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c  BLE_LOCKING_STYL
218f0 45 0a 20 20 65 6c 73 65 7b 0a 20 20 20 20 70 2d  E.  else{.    p-
21900 3e 6f 70 65 6e 46 6c 61 67 73 20 3d 20 6f 70 65  >openFlags = ope
21910 6e 46 6c 61 67 73 3b 0a 20 20 7d 0a 23 65 6e 64  nFlags;.  }.#end
21920 69 66 0a 0a 20 20 69 66 28 20 69 73 4f 70 65 6e  if..  if( isOpen
21930 44 69 72 65 63 74 6f 72 79 20 29 7b 0a 20 20 20  Directory ){.   
21940 20 72 63 20 3d 20 6f 70 65 6e 44 69 72 65 63 74   rc = openDirect
21950 6f 72 79 28 7a 50 61 74 68 2c 20 26 64 69 72 66  ory(zPath, &dirf
21960 64 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  d);.    if( rc!=
21970 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
21980 20 20 20 2f 2a 20 49 74 20 69 73 20 73 61 66 65     /* It is safe
21990 20 74 6f 20 63 6c 6f 73 65 20 66 64 20 61 74 20   to close fd at 
219a0 74 68 69 73 20 70 6f 69 6e 74 2c 20 62 65 63 61  this point, beca
219b0 75 73 65 20 69 74 20 69 73 20 67 75 61 72 61 6e  use it is guaran
219c0 74 65 65 64 20 6e 6f 74 0a 20 20 20 20 20 20 2a  teed not.      *
219d0 2a 20 74 6f 20 62 65 20 6f 70 65 6e 20 6f 6e 20  * to be open on 
219e0 61 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  a database file.
219f0 20 49 66 20 69 74 20 77 65 72 65 20 6f 70 65 6e   If it were open
21a00 20 6f 6e 20 61 20 64 61 74 61 62 61 73 65 20 66   on a database f
21a10 69 6c 65 2c 0a 20 20 20 20 20 20 2a 2a 20 69 74  ile,.      ** it
21a20 20 77 6f 75 6c 64 20 6e 6f 74 20 62 65 20 73 61   would not be sa
21a30 66 65 20 74 6f 20 63 6c 6f 73 65 20 61 73 20 74  fe to close as t
21a40 68 69 73 20 77 6f 75 6c 64 20 72 65 6c 65 61 73  his would releas
21a50 65 20 61 6e 79 20 6c 6f 63 6b 73 20 68 65 6c 64  e any locks held
21a60 0a 20 20 20 20 20 20 2a 2a 20 6f 6e 20 74 68 65  .      ** on the
21a70 20 66 69 6c 65 20 62 79 20 74 68 69 73 20 70 72   file by this pr
21a80 6f 63 65 73 73 2e 20 20 2a 2f 0a 20 20 20 20 20  ocess.  */.     
21a90 20 61 73 73 65 72 74 28 20 65 54 79 70 65 21 3d   assert( eType!=
21aa0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e  SQLITE_OPEN_MAIN
21ab0 5f 44 42 20 29 3b 0a 20 20 20 20 20 20 63 6c 6f  _DB );.      clo
21ac0 73 65 28 66 64 29 3b 20 20 20 20 20 20 20 20 20  se(fd);         
21ad0 20 20 20 20 2f 2a 20 73 69 6c 65 6e 74 6c 79 20      /* silently 
21ae0 6c 65 61 6b 20 69 66 20 66 61 69 6c 2c 20 61 6c  leak if fail, al
21af0 72 65 61 64 79 20 69 6e 20 65 72 72 6f 72 20 2a  ready in error *
21b00 2f 0a 20 20 20 20 20 20 67 6f 74 6f 20 6f 70 65  /.      goto ope
21b10 6e 5f 66 69 6e 69 73 68 65 64 3b 0a 20 20 20 20  n_finished;.    
21b20 7d 0a 20 20 7d 0a 0a 23 69 66 64 65 66 20 46 44  }.  }..#ifdef FD
21b30 5f 43 4c 4f 45 58 45 43 0a 20 20 66 63 6e 74 6c  _CLOEXEC.  fcntl
21b40 28 66 64 2c 20 46 5f 53 45 54 46 44 2c 20 66 63  (fd, F_SETFD, fc
21b50 6e 74 6c 28 66 64 2c 20 46 5f 47 45 54 46 44 2c  ntl(fd, F_GETFD,
21b60 20 30 29 20 7c 20 46 44 5f 43 4c 4f 45 58 45 43   0) | FD_CLOEXEC
21b70 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 6e 6f 4c  );.#endif..  noL
21b80 6f 63 6b 20 3d 20 65 54 79 70 65 21 3d 53 51 4c  ock = eType!=SQL
21b90 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42  ITE_OPEN_MAIN_DB
21ba0 3b 0a 0a 20 20 0a 23 69 66 20 64 65 66 69 6e 65  ;..  .#if define
21bb0 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 7c 7c 20  d(__APPLE__) || 
21bc0 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f  SQLITE_ENABLE_LO
21bd0 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 20 20 73 74  CKING_STYLE.  st
21be0 72 75 63 74 20 73 74 61 74 66 73 20 66 73 49 6e  ruct statfs fsIn
21bf0 66 6f 3b 0a 20 20 69 66 28 20 66 73 74 61 74 66  fo;.  if( fstatf
21c00 73 28 66 64 2c 20 26 66 73 49 6e 66 6f 29 20 3d  s(fd, &fsInfo) =
21c10 3d 20 2d 31 20 29 7b 0a 20 20 20 20 28 28 75 6e  = -1 ){.    ((un
21c20 69 78 46 69 6c 65 2a 29 70 46 69 6c 65 29 2d 3e  ixFile*)pFile)->
21c30 6c 61 73 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e  lastErrno = errn
21c40 6f 3b 0a 20 20 20 20 69 66 28 20 64 69 72 66 64  o;.    if( dirfd
21c50 3e 3d 30 20 29 20 63 6c 6f 73 65 28 64 69 72 66  >=0 ) close(dirf
21c60 64 29 3b 20 2f 2a 20 73 69 6c 65 6e 74 6c 79 20  d); /* silently 
21c70 6c 65 61 6b 20 69 66 20 66 61 69 6c 2c 20 69 6e  leak if fail, in
21c80 20 65 72 72 6f 72 20 2a 2f 0a 20 20 20 20 63 6c   error */.    cl
21c90 6f 73 65 28 66 64 29 3b 20 2f 2a 20 73 69 6c 65  ose(fd); /* sile
21ca0 6e 74 6c 79 20 6c 65 61 6b 20 69 66 20 66 61 69  ntly leak if fai
21cb0 6c 2c 20 69 6e 20 65 72 72 6f 72 20 2a 2f 0a 20  l, in error */. 
21cc0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
21cd0 5f 49 4f 45 52 52 5f 41 43 43 45 53 53 3b 0a 20  _IOERR_ACCESS;. 
21ce0 20 7d 0a 20 20 69 66 20 28 30 20 3d 3d 20 73 74   }.  if (0 == st
21cf0 72 6e 63 6d 70 28 22 6d 73 64 6f 73 22 2c 20 66  rncmp("msdos", f
21d00 73 49 6e 66 6f 2e 66 5f 66 73 74 79 70 65 6e 61  sInfo.f_fstypena
21d10 6d 65 2c 20 35 29 29 20 7b 0a 20 20 20 20 28 28  me, 5)) {.    ((
21d20 75 6e 69 78 46 69 6c 65 2a 29 70 46 69 6c 65 29  unixFile*)pFile)
21d30 2d 3e 66 73 46 6c 61 67 73 20 7c 3d 20 53 51 4c  ->fsFlags |= SQL
21d40 49 54 45 5f 46 53 46 4c 41 47 53 5f 49 53 5f 4d  ITE_FSFLAGS_IS_M
21d50 53 44 4f 53 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  SDOS;.  }.#endif
21d60 0a 20 20 0a 23 69 66 20 53 51 4c 49 54 45 5f 45  .  .#if SQLITE_E
21d70 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54  NABLE_LOCKING_ST
21d80 59 4c 45 0a 23 69 66 20 53 51 4c 49 54 45 5f 50  YLE.#if SQLITE_P
21d90 52 45 46 45 52 5f 50 52 4f 58 59 5f 4c 4f 43 4b  REFER_PROXY_LOCK
21da0 49 4e 47 0a 20 20 69 73 41 75 74 6f 50 72 6f 78  ING.  isAutoProx
21db0 79 20 3d 20 31 3b 0a 23 65 6e 64 69 66 0a 20 20  y = 1;.#endif.  
21dc0 69 66 28 20 69 73 41 75 74 6f 50 72 6f 78 79 20  if( isAutoProxy 
21dd0 26 26 20 28 7a 50 61 74 68 21 3d 4e 55 4c 4c 29  && (zPath!=NULL)
21de0 20 26 26 20 28 21 6e 6f 4c 6f 63 6b 29 20 26 26   && (!noLock) &&
21df0 20 70 56 66 73 2d 3e 78 4f 70 65 6e 20 29 7b 0a   pVfs->xOpen ){.
21e00 20 20 20 20 63 68 61 72 20 2a 65 6e 76 66 6f 72      char *envfor
21e10 63 65 20 3d 20 67 65 74 65 6e 76 28 22 53 51 4c  ce = getenv("SQL
21e20 49 54 45 5f 46 4f 52 43 45 5f 50 52 4f 58 59 5f  ITE_FORCE_PROXY_
21e30 4c 4f 43 4b 49 4e 47 22 29 3b 0a 20 20 20 20 69  LOCKING");.    i
21e40 6e 74 20 75 73 65 50 72 6f 78 79 20 3d 20 30 3b  nt useProxy = 0;
21e50 0a 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f  ..    /* SQLITE_
21e60 46 4f 52 43 45 5f 50 52 4f 58 59 5f 4c 4f 43 4b  FORCE_PROXY_LOCK
21e70 49 4e 47 3d 3d 31 20 6d 65 61 6e 73 20 66 6f 72  ING==1 means for
21e80 63 65 20 61 6c 77 61 79 73 20 75 73 65 20 70 72  ce always use pr
21e90 6f 78 79 2c 20 30 20 6d 65 61 6e 73 20 0a 20 20  oxy, 0 means .  
21ea0 20 20 2a 2a 20 6e 65 76 65 72 20 75 73 65 20 70    ** never use p
21eb0 72 6f 78 79 2c 20 4e 55 4c 4c 20 6d 65 61 6e 73  roxy, NULL means
21ec0 20 75 73 65 20 70 72 6f 78 79 20 66 6f 72 20 6e   use proxy for n
21ed0 6f 6e 2d 6c 6f 63 61 6c 20 66 69 6c 65 73 20 6f  on-local files o
21ee0 6e 6c 79 2e 20 20 2a 2f 0a 20 20 20 20 69 66 28  nly.  */.    if(
21ef0 20 65 6e 76 66 6f 72 63 65 21 3d 4e 55 4c 4c 20   envforce!=NULL 
21f00 29 7b 0a 20 20 20 20 20 20 75 73 65 50 72 6f 78  ){.      useProx
21f10 79 20 3d 20 61 74 6f 69 28 65 6e 76 66 6f 72 63  y = atoi(envforc
21f20 65 29 3e 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  e)>0;.    }else{
21f30 0a 20 20 20 20 20 20 73 74 72 75 63 74 20 73 74  .      struct st
21f40 61 74 66 73 20 66 73 49 6e 66 6f 3b 0a 20 20 20  atfs fsInfo;.   
21f50 20 20 20 69 66 28 20 73 74 61 74 66 73 28 7a 50     if( statfs(zP
21f60 61 74 68 2c 20 26 66 73 49 6e 66 6f 29 20 3d 3d  ath, &fsInfo) ==
21f70 20 2d 31 20 29 7b 0a 20 20 20 20 20 20 20 20 2f   -1 ){.        /
21f80 2a 20 49 6e 20 74 68 65 6f 72 79 2c 20 74 68 65  * In theory, the
21f90 20 63 6c 6f 73 65 28 66 64 29 20 63 61 6c 6c 20   close(fd) call 
21fa0 69 73 20 73 75 62 2d 6f 70 74 69 6d 61 6c 2e 20  is sub-optimal. 
21fb0 49 66 20 74 68 65 20 66 69 6c 65 20 6f 70 65 6e  If the file open
21fc0 65 64 0a 20 20 20 20 20 20 20 20 2a 2a 20 77 69  ed.        ** wi
21fd0 74 68 20 66 64 20 69 73 20 61 20 64 61 74 61 62  th fd is a datab
21fe0 61 73 65 20 66 69 6c 65 2c 20 61 6e 64 20 74 68  ase file, and th
21ff0 65 72 65 20 61 72 65 20 6f 74 68 65 72 20 63 6f  ere are other co
22000 6e 6e 65 63 74 69 6f 6e 73 20 6f 70 65 6e 0a 20  nnections open. 
22010 20 20 20 20 20 20 20 2a 2a 20 6f 6e 20 74 68 61         ** on tha
22020 74 20 66 69 6c 65 20 74 68 61 74 20 61 72 65 20  t file that are 
22030 63 75 72 72 65 6e 74 6c 79 20 68 6f 6c 64 69 6e  currently holdin
22040 67 20 61 64 76 69 73 6f 72 79 20 6c 6f 63 6b 73  g advisory locks
22050 20 6f 6e 20 69 74 2c 0a 20 20 20 20 20 20 20 20   on it,.        
22060 2a 2a 20 74 68 65 6e 20 74 68 65 20 63 61 6c 6c  ** then the call
22070 20 74 6f 20 63 6c 6f 73 65 28 29 20 77 69 6c 6c   to close() will
22080 20 63 61 6e 63 65 6c 20 74 68 6f 73 65 20 6c 6f   cancel those lo
22090 63 6b 73 2e 20 49 6e 20 70 72 61 63 74 69 63 65  cks. In practice
220a0 2c 0a 20 20 20 20 20 20 20 20 2a 2a 20 77 65 27  ,.        ** we'
220b0 72 65 20 61 73 73 75 6d 69 6e 67 20 74 68 61 74  re assuming that
220c0 20 73 74 61 74 66 73 28 29 20 64 6f 65 73 6e 27   statfs() doesn'
220d0 74 20 66 61 69 6c 20 76 65 72 79 20 6f 66 74 65  t fail very ofte
220e0 6e 2e 20 41 74 20 6c 65 61 73 74 0a 20 20 20 20  n. At least.    
220f0 20 20 20 20 2a 2a 20 6e 6f 74 20 77 68 69 6c 65      ** not while
22100 20 6f 74 68 65 72 20 66 69 6c 65 20 64 65 73 63   other file desc
22110 72 69 70 74 6f 72 73 20 6f 70 65 6e 65 64 20 62  riptors opened b
22120 79 20 74 68 65 20 73 61 6d 65 20 70 72 6f 63 65  y the same proce
22130 73 73 20 6f 6e 0a 20 20 20 20 20 20 20 20 2a 2a  ss on.        **
22140 20 74 68 65 20 73 61 6d 65 20 66 69 6c 65 20 61   the same file a
22150 72 65 20 77 6f 72 6b 69 6e 67 2e 20 20 2a 2f 0a  re working.  */.
22160 20 20 20 20 20 20 20 20 70 2d 3e 6c 61 73 74 45          p->lastE
22170 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20  rrno = errno;.  
22180 20 20 20 20 20 20 69 66 28 20 64 69 72 66 64 3e        if( dirfd>
22190 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
221a0 63 6c 6f 73 65 28 64 69 72 66 64 29 3b 20 2f 2a  close(dirfd); /*
221b0 20 73 69 6c 65 6e 74 6c 79 20 6c 65 61 6b 20 69   silently leak i
221c0 66 20 66 61 69 6c 2c 20 69 6e 20 65 72 72 6f 72  f fail, in error
221d0 20 2a 2f 0a 20 20 20 20 20 20 20 20 7d 0a 20 20   */.        }.  
221e0 20 20 20 20 20 20 63 6c 6f 73 65 28 66 64 29 3b        close(fd);
221f0 20 2f 2a 20 73 69 6c 65 6e 74 6c 79 20 6c 65 61   /* silently lea
22200 6b 20 69 66 20 66 61 69 6c 2c 20 69 6e 20 65 72  k if fail, in er
22210 72 6f 72 20 2a 2f 0a 20 20 20 20 20 20 20 20 72  ror */.        r
22220 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  c = SQLITE_IOERR
22230 5f 41 43 43 45 53 53 3b 0a 20 20 20 20 20 20 20  _ACCESS;.       
22240 20 67 6f 74 6f 20 6f 70 65 6e 5f 66 69 6e 69 73   goto open_finis
22250 68 65 64 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  hed;.      }.   
22260 20 20 20 75 73 65 50 72 6f 78 79 20 3d 20 21 28     useProxy = !(
22270 66 73 49 6e 66 6f 2e 66 5f 66 6c 61 67 73 26 4d  fsInfo.f_flags&M
22280 4e 54 5f 4c 4f 43 41 4c 29 3b 0a 20 20 20 20 7d  NT_LOCAL);.    }
22290 0a 20 20 20 20 69 66 28 20 75 73 65 50 72 6f 78  .    if( useProx
222a0 79 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  y ){.      rc = 
222b0 66 69 6c 6c 49 6e 55 6e 69 78 46 69 6c 65 28 70  fillInUnixFile(p
222c0 56 66 73 2c 20 66 64 2c 20 64 69 72 66 64 2c 20  Vfs, fd, dirfd, 
222d0 70 46 69 6c 65 2c 20 7a 50 61 74 68 2c 20 6e 6f  pFile, zPath, no
222e0 4c 6f 63 6b 2c 20 69 73 44 65 6c 65 74 65 29 3b  Lock, isDelete);
222f0 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53  .      if( rc==S
22300 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
22310 20 20 20 20 72 63 20 3d 20 70 72 6f 78 79 54 72      rc = proxyTr
22320 61 6e 73 66 6f 72 6d 55 6e 69 78 46 69 6c 65 28  ansformUnixFile(
22330 28 75 6e 69 78 46 69 6c 65 2a 29 70 46 69 6c 65  (unixFile*)pFile
22340 2c 20 22 3a 61 75 74 6f 3a 22 29 3b 0a 20 20 20  , ":auto:");.   
22350 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
22360 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
22370 20 20 20 20 2f 2a 20 55 73 65 20 75 6e 69 78 43      /* Use unixC
22380 6c 6f 73 65 20 74 6f 20 63 6c 65 61 6e 20 75 70  lose to clean up
22390 20 74 68 65 20 72 65 73 6f 75 72 63 65 73 20 61   the resources a
223a0 64 64 65 64 20 69 6e 20 66 69 6c 6c 49 6e 55 6e  dded in fillInUn
223b0 69 78 46 69 6c 65 20 0a 20 20 20 20 20 20 20 20  ixFile .        
223c0 20 20 2a 2a 20 61 6e 64 20 63 6c 65 61 72 20 61    ** and clear a
223d0 6c 6c 20 74 68 65 20 73 74 72 75 63 74 75 72 65  ll the structure
223e0 27 73 20 72 65 66 65 72 65 6e 63 65 73 2e 20 20  's references.  
223f0 53 70 65 63 69 66 69 63 61 6c 6c 79 2c 20 0a 20  Specifically, . 
22400 20 20 20 20 20 20 20 20 20 2a 2a 20 70 46 69 6c           ** pFil
22410 65 2d 3e 70 4d 65 74 68 6f 64 73 20 77 69 6c 6c  e->pMethods will
22420 20 62 65 20 4e 55 4c 4c 20 73 6f 20 73 71 6c 69   be NULL so sqli
22430 74 65 33 4f 73 43 6c 6f 73 65 20 77 69 6c 6c 20  te3OsClose will 
22440 62 65 20 61 20 6e 6f 2d 6f 70 20 0a 20 20 20 20  be a no-op .    
22450 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
22460 20 20 20 75 6e 69 78 43 6c 6f 73 65 28 70 46 69     unixClose(pFi
22470 6c 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72  le);.          r
22480 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
22490 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
224a0 20 20 67 6f 74 6f 20 6f 70 65 6e 5f 66 69 6e 69    goto open_fini
224b0 73 68 65 64 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  shed;.    }.  }.
224c0 23 65 6e 64 69 66 0a 20 20 0a 20 20 72 63 20 3d  #endif.  .  rc =
224d0 20 66 69 6c 6c 49 6e 55 6e 69 78 46 69 6c 65 28   fillInUnixFile(
224e0 70 56 66 73 2c 20 66 64 2c 20 64 69 72 66 64 2c  pVfs, fd, dirfd,
224f0 20 70 46 69 6c 65 2c 20 7a 50 61 74 68 2c 20 6e   pFile, zPath, n
22500 6f 4c 6f 63 6b 2c 20 69 73 44 65 6c 65 74 65 29  oLock, isDelete)
22510 3b 0a 6f 70 65 6e 5f 66 69 6e 69 73 68 65 64 3a  ;.open_finished:
22520 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
22530 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69  E_OK ){.    sqli
22540 74 65 33 5f 66 72 65 65 28 70 2d 3e 70 55 6e 75  te3_free(p->pUnu
22550 73 65 64 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  sed);.  }.  retu
22560 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  rn rc;.}.../*.**
22570 20 44 65 6c 65 74 65 20 74 68 65 20 66 69 6c 65   Delete the file
22580 20 61 74 20 7a 50 61 74 68 2e 20 49 66 20 74 68   at zPath. If th
22590 65 20 64 69 72 53 79 6e 63 20 61 72 67 75 6d 65  e dirSync argume
225a0 6e 74 20 69 73 20 74 72 75 65 2c 20 66 73 79 6e  nt is true, fsyn
225b0 63 28 29 0a 2a 2a 20 74 68 65 20 64 69 72 65 63  c().** the direc
225c0 74 6f 72 79 20 61 66 74 65 72 20 64 65 6c 65 74  tory after delet
225d0 69 6e 67 20 74 68 65 20 66 69 6c 65 2e 0a 2a 2f  ing the file..*/
225e0 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78  .static int unix
225f0 44 65 6c 65 74 65 28 0a 20 20 73 71 6c 69 74 65  Delete(.  sqlite
22600 33 5f 76 66 73 20 2a 4e 6f 74 55 73 65 64 2c 20  3_vfs *NotUsed, 
22610 20 20 20 20 2f 2a 20 56 46 53 20 63 6f 6e 74 61      /* VFS conta
22620 69 6e 69 6e 67 20 74 68 69 73 20 61 73 20 74 68  ining this as th
22630 65 20 78 44 65 6c 65 74 65 20 6d 65 74 68 6f 64  e xDelete method
22640 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
22650 20 2a 7a 50 61 74 68 2c 20 20 20 20 20 20 20 20   *zPath,        
22660 2f 2a 20 4e 61 6d 65 20 6f 66 20 66 69 6c 65 20  /* Name of file 
22670 74 6f 20 62 65 20 64 65 6c 65 74 65 64 20 2a 2f  to be deleted */
22680 0a 20 20 69 6e 74 20 64 69 72 53 79 6e 63 20 20  .  int dirSync  
22690 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
226a0 49 66 20 74 72 75 65 2c 20 66 73 79 6e 63 28 29  If true, fsync()
226b0 20 64 69 72 65 63 74 6f 72 79 20 61 66 74 65 72   directory after
226c0 20 64 65 6c 65 74 69 6e 67 20 66 69 6c 65 20 2a   deleting file *
226d0 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  /.){.  int rc = 
226e0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 55 4e 55  SQLITE_OK;.  UNU
226f0 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f  SED_PARAMETER(No
22700 74 55 73 65 64 29 3b 0a 20 20 53 69 6d 75 6c 61  tUsed);.  Simula
22710 74 65 49 4f 45 72 72 6f 72 28 72 65 74 75 72 6e  teIOError(return
22720 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 44 45   SQLITE_IOERR_DE
22730 4c 45 54 45 29 3b 0a 20 20 75 6e 6c 69 6e 6b 28  LETE);.  unlink(
22740 7a 50 61 74 68 29 3b 0a 23 69 66 6e 64 65 66 20  zPath);.#ifndef 
22750 53 51 4c 49 54 45 5f 44 49 53 41 42 4c 45 5f 44  SQLITE_DISABLE_D
22760 49 52 53 59 4e 43 0a 20 20 69 66 28 20 64 69 72  IRSYNC.  if( dir
22770 53 79 6e 63 20 29 7b 0a 20 20 20 20 69 6e 74 20  Sync ){.    int 
22780 66 64 3b 0a 20 20 20 20 72 63 20 3d 20 6f 70 65  fd;.    rc = ope
22790 6e 44 69 72 65 63 74 6f 72 79 28 7a 50 61 74 68  nDirectory(zPath
227a0 2c 20 26 66 64 29 3b 0a 20 20 20 20 69 66 28 20  , &fd);.    if( 
227b0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
227c0 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a  .#if OS_VXWORKS.
227d0 20 20 20 20 20 20 69 66 28 20 66 73 79 6e 63 28        if( fsync(
227e0 66 64 29 3d 3d 2d 31 20 29 0a 23 65 6c 73 65 0a  fd)==-1 ).#else.
227f0 20 20 20 20 20 20 69 66 28 20 66 73 79 6e 63 28        if( fsync(
22800 66 64 29 20 29 0a 23 65 6e 64 69 66 0a 20 20 20  fd) ).#endif.   
22810 20 20 20 7b 0a 20 20 20 20 20 20 20 20 72 63 20     {.        rc 
22820 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 44  = SQLITE_IOERR_D
22830 49 52 5f 46 53 59 4e 43 3b 0a 20 20 20 20 20 20  IR_FSYNC;.      
22840 7d 0a 20 20 20 20 20 20 69 66 28 20 63 6c 6f 73  }.      if( clos
22850 65 28 66 64 29 26 26 21 72 63 20 29 7b 0a 20 20  e(fd)&&!rc ){.  
22860 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
22870 45 5f 49 4f 45 52 52 5f 44 49 52 5f 43 4c 4f 53  E_IOERR_DIR_CLOS
22880 45 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  E;.      }.    }
22890 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 72 65  .  }.#endif.  re
228a0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
228b0 2a 20 54 65 73 74 20 74 68 65 20 65 78 69 73 74  * Test the exist
228c0 61 6e 63 65 20 6f 66 20 6f 72 20 61 63 63 65 73  ance of or acces
228d0 73 20 70 65 72 6d 69 73 73 69 6f 6e 73 20 6f 66  s permissions of
228e0 20 66 69 6c 65 20 7a 50 61 74 68 2e 20 54 68 65   file zPath. The
228f0 0a 2a 2a 20 74 65 73 74 20 70 65 72 66 6f 72 6d  .** test perform
22900 65 64 20 64 65 70 65 6e 64 73 20 6f 6e 20 74 68  ed depends on th
22910 65 20 76 61 6c 75 65 20 6f 66 20 66 6c 61 67 73  e value of flags
22920 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 51 4c 49  :.**.**     SQLI
22930 54 45 5f 41 43 43 45 53 53 5f 45 58 49 53 54 53  TE_ACCESS_EXISTS
22940 3a 20 52 65 74 75 72 6e 20 31 20 69 66 20 74 68  : Return 1 if th
22950 65 20 66 69 6c 65 20 65 78 69 73 74 73 0a 2a 2a  e file exists.**
22960 20 20 20 20 20 53 51 4c 49 54 45 5f 41 43 43 45       SQLITE_ACCE
22970 53 53 5f 52 45 41 44 57 52 49 54 45 3a 20 52 65  SS_READWRITE: Re
22980 74 75 72 6e 20 31 20 69 66 20 74 68 65 20 66 69  turn 1 if the fi
22990 6c 65 20 69 73 20 72 65 61 64 20 61 6e 64 20 77  le is read and w
229a0 72 69 74 61 62 6c 65 2e 0a 2a 2a 20 20 20 20 20  ritable..**     
229b0 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 52 45  SQLITE_ACCESS_RE
229c0 41 44 4f 4e 4c 59 3a 20 52 65 74 75 72 6e 20 31  ADONLY: Return 1
229d0 20 69 66 20 74 68 65 20 66 69 6c 65 20 69 73 20   if the file is 
229e0 72 65 61 64 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20  readable..**.** 
229f0 4f 74 68 65 72 77 69 73 65 20 72 65 74 75 72 6e  Otherwise return
22a00 20 30 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e   0..*/.static in
22a10 74 20 75 6e 69 78 41 63 63 65 73 73 28 0a 20 20  t unixAccess(.  
22a20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 4e 6f 74  sqlite3_vfs *Not
22a30 55 73 65 64 2c 20 20 20 2f 2a 20 54 68 65 20 56  Used,   /* The V
22a40 46 53 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68  FS containing th
22a50 69 73 20 78 41 63 63 65 73 73 20 6d 65 74 68 6f  is xAccess metho
22a60 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  d */.  const cha
22a70 72 20 2a 7a 50 61 74 68 2c 20 20 20 20 20 20 2f  r *zPath,      /
22a80 2a 20 50 61 74 68 20 6f 66 20 74 68 65 20 66 69  * Path of the fi
22a90 6c 65 20 74 6f 20 65 78 61 6d 69 6e 65 20 2a 2f  le to examine */
22aa0 0a 20 20 69 6e 74 20 66 6c 61 67 73 2c 20 20 20  .  int flags,   
22ab0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 68             /* Wh
22ac0 61 74 20 64 6f 20 77 65 20 77 61 6e 74 20 74 6f  at do we want to
22ad0 20 6c 65 61 72 6e 20 61 62 6f 75 74 20 74 68 65   learn about the
22ae0 20 7a 50 61 74 68 20 66 69 6c 65 3f 20 2a 2f 0a   zPath file? */.
22af0 20 20 69 6e 74 20 2a 70 52 65 73 4f 75 74 20 20    int *pResOut  
22b00 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69            /* Wri
22b10 74 65 20 72 65 73 75 6c 74 20 62 6f 6f 6c 65 61  te result boolea
22b20 6e 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69  n here */.){.  i
22b30 6e 74 20 61 6d 6f 64 65 20 3d 20 30 3b 0a 20 20  nt amode = 0;.  
22b40 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
22b50 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20 53 69 6d  (NotUsed);.  Sim
22b60 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 72 65  ulateIOError( re
22b70 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52  turn SQLITE_IOER
22b80 52 5f 41 43 43 45 53 53 3b 20 29 3b 0a 20 20 73  R_ACCESS; );.  s
22b90 77 69 74 63 68 28 20 66 6c 61 67 73 20 29 7b 0a  witch( flags ){.
22ba0 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
22bb0 41 43 43 45 53 53 5f 45 58 49 53 54 53 3a 0a 20  ACCESS_EXISTS:. 
22bc0 20 20 20 20 20 61 6d 6f 64 65 20 3d 20 46 5f 4f       amode = F_O
22bd0 4b 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  K;.      break;.
22be0 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
22bf0 41 43 43 45 53 53 5f 52 45 41 44 57 52 49 54 45  ACCESS_READWRITE
22c00 3a 0a 20 20 20 20 20 20 61 6d 6f 64 65 20 3d 20  :.      amode = 
22c10 57 5f 4f 4b 7c 52 5f 4f 4b 3b 0a 20 20 20 20 20  W_OK|R_OK;.     
22c20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
22c30 20 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 52   SQLITE_ACCESS_R
22c40 45 41 44 3a 0a 20 20 20 20 20 20 61 6d 6f 64 65  EAD:.      amode
22c50 20 3d 20 52 5f 4f 4b 3b 0a 20 20 20 20 20 20 62   = R_OK;.      b
22c60 72 65 61 6b 3b 0a 0a 20 20 20 20 64 65 66 61 75  reak;..    defau
22c70 6c 74 3a 0a 20 20 20 20 20 20 61 73 73 65 72 74  lt:.      assert
22c80 28 21 22 49 6e 76 61 6c 69 64 20 66 6c 61 67 73  (!"Invalid flags
22c90 20 61 72 67 75 6d 65 6e 74 22 29 3b 0a 20 20 7d   argument");.  }
22ca0 0a 20 20 2a 70 52 65 73 4f 75 74 20 3d 20 28 61  .  *pResOut = (a
22cb0 63 63 65 73 73 28 7a 50 61 74 68 2c 20 61 6d 6f  ccess(zPath, amo
22cc0 64 65 29 3d 3d 30 29 3b 0a 20 20 72 65 74 75 72  de)==0);.  retur
22cd0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
22ce0 0a 2f 2a 0a 2a 2a 20 54 75 72 6e 20 61 20 72 65  ./*.** Turn a re
22cf0 6c 61 74 69 76 65 20 70 61 74 68 6e 61 6d 65 20  lative pathname 
22d00 69 6e 74 6f 20 61 20 66 75 6c 6c 20 70 61 74 68  into a full path
22d10 6e 61 6d 65 2e 20 54 68 65 20 72 65 6c 61 74 69  name. The relati
22d20 76 65 20 70 61 74 68 0a 2a 2a 20 69 73 20 73 74  ve path.** is st
22d30 6f 72 65 64 20 61 73 20 61 20 6e 75 6c 2d 74 65  ored as a nul-te
22d40 72 6d 69 6e 61 74 65 64 20 73 74 72 69 6e 67 20  rminated string 
22d50 69 6e 20 74 68 65 20 62 75 66 66 65 72 20 70 6f  in the buffer po
22d60 69 6e 74 65 64 20 74 6f 20 62 79 0a 2a 2a 20 7a  inted to by.** z
22d70 50 61 74 68 2e 20 0a 2a 2a 0a 2a 2a 20 7a 4f 75  Path. .**.** zOu
22d80 74 20 70 6f 69 6e 74 73 20 74 6f 20 61 20 62 75  t points to a bu
22d90 66 66 65 72 20 6f 66 20 61 74 20 6c 65 61 73 74  ffer of at least
22da0 20 73 71 6c 69 74 65 33 5f 76 66 73 2e 6d 78 50   sqlite3_vfs.mxP
22db0 61 74 68 6e 61 6d 65 20 62 79 74 65 73 20 0a 2a  athname bytes .*
22dc0 2a 20 28 69 6e 20 74 68 69 73 20 63 61 73 65 2c  * (in this case,
22dd0 20 4d 41 58 5f 50 41 54 48 4e 41 4d 45 20 62 79   MAX_PATHNAME by
22de0 74 65 73 29 2e 20 54 68 65 20 66 75 6c 6c 2d 70  tes). The full-p
22df0 61 74 68 20 69 73 20 77 72 69 74 74 65 6e 20 74  ath is written t
22e00 6f 0a 2a 2a 20 74 68 69 73 20 62 75 66 66 65 72  o.** this buffer
22e10 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e   before returnin
22e20 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  g..*/.static int
22e30 20 75 6e 69 78 46 75 6c 6c 50 61 74 68 6e 61 6d   unixFullPathnam
22e40 65 28 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73  e(.  sqlite3_vfs
22e50 20 2a 70 56 66 73 2c 20 20 20 20 20 20 20 20 20   *pVfs,         
22e60 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f     /* Pointer to
22e70 20 76 66 73 20 6f 62 6a 65 63 74 20 2a 2f 0a 20   vfs object */. 
22e80 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 61   const char *zPa
22e90 74 68 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f  th,            /
22ea0 2a 20 50 6f 73 73 69 62 6c 79 20 72 65 6c 61 74  * Possibly relat
22eb0 69 76 65 20 69 6e 70 75 74 20 70 61 74 68 20 2a  ive input path *
22ec0 2f 0a 20 20 69 6e 74 20 6e 4f 75 74 2c 20 20 20  /.  int nOut,   
22ed0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22ee0 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 6f 75 74    /* Size of out
22ef0 70 75 74 20 62 75 66 66 65 72 20 69 6e 20 62 79  put buffer in by
22f00 74 65 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a  tes */.  char *z
22f10 4f 75 74 20 20 20 20 20 20 20 20 20 20 20 20 20  Out             
22f20 20 20 20 20 20 20 20 2f 2a 20 4f 75 74 70 75 74         /* Output
22f30 20 62 75 66 66 65 72 20 2a 2f 0a 29 7b 0a 0a 20   buffer */.){.. 
22f40 20 2f 2a 20 49 74 27 73 20 6f 64 64 20 74 6f 20   /* It's odd to 
22f50 73 69 6d 75 6c 61 74 65 20 61 6e 20 69 6f 2d 65  simulate an io-e
22f60 72 72 6f 72 20 68 65 72 65 2c 20 62 75 74 20 72  rror here, but r
22f70 65 61 6c 6c 79 20 74 68 69 73 20 69 73 20 6a 75  eally this is ju
22f80 73 74 0a 20 20 2a 2a 20 75 73 69 6e 67 20 74 68  st.  ** using th
22f90 65 20 69 6f 2d 65 72 72 6f 72 20 69 6e 66 72 61  e io-error infra
22fa0 73 74 72 75 63 74 75 72 65 20 74 6f 20 74 65 73  structure to tes
22fb0 74 20 74 68 61 74 20 53 51 4c 69 74 65 20 68 61  t that SQLite ha
22fc0 6e 64 6c 65 73 20 74 68 69 73 0a 20 20 2a 2a 20  ndles this.  ** 
22fd0 66 75 6e 63 74 69 6f 6e 20 66 61 69 6c 69 6e 67  function failing
22fe0 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  . This function 
22ff0 63 6f 75 6c 64 20 66 61 69 6c 20 69 66 2c 20 66  could fail if, f
23000 6f 72 20 65 78 61 6d 70 6c 65 2c 20 74 68 65 0a  or example, the.
23010 20 20 2a 2a 20 63 75 72 72 65 6e 74 20 77 6f 72    ** current wor
23020 6b 69 6e 67 20 64 69 72 65 63 74 6f 72 79 20 68  king directory h
23030 61 73 20 62 65 65 6e 20 75 6e 6c 69 6e 6b 65 64  as been unlinked
23040 2e 0a 20 20 2a 2f 0a 20 20 53 69 6d 75 6c 61 74  ..  */.  Simulat
23050 65 49 4f 45 72 72 6f 72 28 20 72 65 74 75 72 6e  eIOError( return
23060 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 20 29 3b   SQLITE_ERROR );
23070 0a 0a 20 20 61 73 73 65 72 74 28 20 70 56 66 73  ..  assert( pVfs
23080 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 3d 3d 4d 41  ->mxPathname==MA
23090 58 5f 50 41 54 48 4e 41 4d 45 20 29 3b 0a 20 20  X_PATHNAME );.  
230a0 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
230b0 28 70 56 66 73 29 3b 0a 0a 20 20 7a 4f 75 74 5b  (pVfs);..  zOut[
230c0 6e 4f 75 74 2d 31 5d 20 3d 20 27 5c 30 27 3b 0a  nOut-1] = '\0';.
230d0 20 20 69 66 28 20 7a 50 61 74 68 5b 30 5d 3d 3d    if( zPath[0]==
230e0 27 2f 27 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  '/' ){.    sqlit
230f0 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 4f 75 74  e3_snprintf(nOut
23100 2c 20 7a 4f 75 74 2c 20 22 25 73 22 2c 20 7a 50  , zOut, "%s", zP
23110 61 74 68 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  ath);.  }else{. 
23120 20 20 20 69 6e 74 20 6e 43 77 64 3b 0a 20 20 20     int nCwd;.   
23130 20 69 66 28 20 67 65 74 63 77 64 28 7a 4f 75 74   if( getcwd(zOut
23140 2c 20 6e 4f 75 74 2d 31 29 3d 3d 30 20 29 7b 0a  , nOut-1)==0 ){.
23150 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
23160 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 42 4b 50  ITE_CANTOPEN_BKP
23170 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e 43 77  T;.    }.    nCw
23180 64 20 3d 20 28 69 6e 74 29 73 74 72 6c 65 6e 28  d = (int)strlen(
23190 7a 4f 75 74 29 3b 0a 20 20 20 20 73 71 6c 69 74  zOut);.    sqlit
231a0 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 4f 75 74  e3_snprintf(nOut
231b0 2d 6e 43 77 64 2c 20 26 7a 4f 75 74 5b 6e 43 77  -nCwd, &zOut[nCw
231c0 64 5d 2c 20 22 2f 25 73 22 2c 20 7a 50 61 74 68  d], "/%s", zPath
231d0 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
231e0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 23  SQLITE_OK;.}...#
231f0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
23200 49 54 5f 4c 4f 41 44 5f 45 58 54 45 4e 53 49 4f  IT_LOAD_EXTENSIO
23210 4e 0a 2f 2a 0a 2a 2a 20 49 6e 74 65 72 66 61 63  N./*.** Interfac
23220 65 73 20 66 6f 72 20 6f 70 65 6e 69 6e 67 20 61  es for opening a
23230 20 73 68 61 72 65 64 20 6c 69 62 72 61 72 79 2c   shared library,
23240 20 66 69 6e 64 69 6e 67 20 65 6e 74 72 79 20 70   finding entry p
23250 6f 69 6e 74 73 0a 2a 2a 20 77 69 74 68 69 6e 20  oints.** within 
23260 74 68 65 20 73 68 61 72 65 64 20 6c 69 62 72 61  the shared libra
23270 72 79 2c 20 61 6e 64 20 63 6c 6f 73 69 6e 67 20  ry, and closing 
23280 74 68 65 20 73 68 61 72 65 64 20 6c 69 62 72 61  the shared libra
23290 72 79 2e 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65 20  ry..*/.#include 
232a0 3c 64 6c 66 63 6e 2e 68 3e 0a 73 74 61 74 69 63  <dlfcn.h>.static
232b0 20 76 6f 69 64 20 2a 75 6e 69 78 44 6c 4f 70 65   void *unixDlOpe
232c0 6e 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 4e  n(sqlite3_vfs *N
232d0 6f 74 55 73 65 64 2c 20 63 6f 6e 73 74 20 63 68  otUsed, const ch
232e0 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 29 7b 0a  ar *zFilename){.
232f0 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
23300 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20 72  ER(NotUsed);.  r
23310 65 74 75 72 6e 20 64 6c 6f 70 65 6e 28 7a 46 69  eturn dlopen(zFi
23320 6c 65 6e 61 6d 65 2c 20 52 54 4c 44 5f 4e 4f 57  lename, RTLD_NOW
23330 20 7c 20 52 54 4c 44 5f 47 4c 4f 42 41 4c 29 3b   | RTLD_GLOBAL);
23340 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 51 4c 69 74 65  .}../*.** SQLite
23350 20 63 61 6c 6c 73 20 74 68 69 73 20 66 75 6e 63   calls this func
23360 74 69 6f 6e 20 69 6d 6d 65 64 69 61 74 65 6c 79  tion immediately
23370 20 61 66 74 65 72 20 61 20 63 61 6c 6c 20 74 6f   after a call to
23380 20 75 6e 69 78 44 6c 53 79 6d 28 29 20 6f 72 0a   unixDlSym() or.
23390 2a 2a 20 75 6e 69 78 44 6c 4f 70 65 6e 28 29 20  ** unixDlOpen() 
233a0 66 61 69 6c 73 20 28 72 65 74 75 72 6e 73 20 61  fails (returns a
233b0 20 6e 75 6c 6c 20 70 6f 69 6e 74 65 72 29 2e 20   null pointer). 
233c0 49 66 20 61 20 6d 6f 72 65 20 64 65 74 61 69 6c  If a more detail
233d0 65 64 20 65 72 72 6f 72 0a 2a 2a 20 6d 65 73 73  ed error.** mess
233e0 61 67 65 20 69 73 20 61 76 61 69 6c 61 62 6c 65  age is available
233f0 2c 20 69 74 20 69 73 20 77 72 69 74 74 65 6e 20  , it is written 
23400 74 6f 20 7a 42 75 66 4f 75 74 2e 20 49 66 20 6e  to zBufOut. If n
23410 6f 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 0a  o error message.
23420 2a 2a 20 69 73 20 61 76 61 69 6c 61 62 6c 65 2c  ** is available,
23430 20 7a 42 75 66 4f 75 74 20 69 73 20 6c 65 66 74   zBufOut is left
23440 20 75 6e 6d 6f 64 69 66 69 65 64 20 61 6e 64 20   unmodified and 
23450 53 51 4c 69 74 65 20 75 73 65 73 20 61 20 64 65  SQLite uses a de
23460 66 61 75 6c 74 0a 2a 2a 20 65 72 72 6f 72 20 6d  fault.** error m
23470 65 73 73 61 67 65 2e 0a 2a 2f 0a 73 74 61 74 69  essage..*/.stati
23480 63 20 76 6f 69 64 20 75 6e 69 78 44 6c 45 72 72  c void unixDlErr
23490 6f 72 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a  or(sqlite3_vfs *
234a0 4e 6f 74 55 73 65 64 2c 20 69 6e 74 20 6e 42 75  NotUsed, int nBu
234b0 66 2c 20 63 68 61 72 20 2a 7a 42 75 66 4f 75 74  f, char *zBufOut
234c0 29 7b 0a 20 20 63 68 61 72 20 2a 7a 45 72 72 3b  ){.  char *zErr;
234d0 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
234e0 54 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20  TER(NotUsed);.  
234f0 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29  unixEnterMutex()
23500 3b 0a 20 20 7a 45 72 72 20 3d 20 64 6c 65 72 72  ;.  zErr = dlerr
23510 6f 72 28 29 3b 0a 20 20 69 66 28 20 7a 45 72 72  or();.  if( zErr
23520 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
23530 73 6e 70 72 69 6e 74 66 28 6e 42 75 66 2c 20 7a  snprintf(nBuf, z
23540 42 75 66 4f 75 74 2c 20 22 25 73 22 2c 20 7a 45  BufOut, "%s", zE
23550 72 72 29 3b 0a 20 20 7d 0a 20 20 75 6e 69 78 4c  rr);.  }.  unixL
23560 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 7d 0a 73  eaveMutex();.}.s
23570 74 61 74 69 63 20 76 6f 69 64 20 28 2a 75 6e 69  tatic void (*uni
23580 78 44 6c 53 79 6d 28 73 71 6c 69 74 65 33 5f 76  xDlSym(sqlite3_v
23590 66 73 20 2a 4e 6f 74 55 73 65 64 2c 20 76 6f 69  fs *NotUsed, voi
235a0 64 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61 72  d *p, const char
235b0 2a 7a 53 79 6d 29 29 28 76 6f 69 64 29 7b 0a 20  *zSym))(void){. 
235c0 20 2f 2a 20 0a 20 20 2a 2a 20 47 43 43 20 77 69   /* .  ** GCC wi
235d0 74 68 20 2d 70 65 64 61 6e 74 69 63 2d 65 72 72  th -pedantic-err
235e0 6f 72 73 20 73 61 79 73 20 74 68 61 74 20 43 39  ors says that C9
235f0 30 20 64 6f 65 73 20 6e 6f 74 20 61 6c 6c 6f 77  0 does not allow
23600 20 61 20 76 6f 69 64 2a 20 74 6f 20 62 65 0a 20   a void* to be. 
23610 20 2a 2a 20 63 61 73 74 20 69 6e 74 6f 20 61 20   ** cast into a 
23620 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 66 75 6e  pointer to a fun
23630 63 74 69 6f 6e 2e 20 20 41 6e 64 20 79 65 74 20  ction.  And yet 
23640 74 68 65 20 6c 69 62 72 61 72 79 20 64 6c 73 79  the library dlsy
23650 6d 28 29 20 72 6f 75 74 69 6e 65 0a 20 20 2a 2a  m() routine.  **
23660 20 72 65 74 75 72 6e 73 20 61 20 76 6f 69 64 2a   returns a void*
23670 20 77 68 69 63 68 20 69 73 20 72 65 61 6c 6c 79   which is really
23680 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20   a pointer to a 
23690 66 75 6e 63 74 69 6f 6e 2e 20 20 53 6f 20 68 6f  function.  So ho
236a0 77 20 64 6f 20 77 65 0a 20 20 2a 2a 20 75 73 65  w do we.  ** use
236b0 20 64 6c 73 79 6d 28 29 20 77 69 74 68 20 2d 70   dlsym() with -p
236c0 65 64 61 6e 74 69 63 2d 65 72 72 6f 72 73 3f 0a  edantic-errors?.
236d0 20 20 2a 2a 0a 20 20 2a 2a 20 56 61 72 69 61 62    **.  ** Variab
236e0 6c 65 20 78 20 62 65 6c 6f 77 20 69 73 20 64 65  le x below is de
236f0 66 69 6e 65 64 20 74 6f 20 62 65 20 61 20 70 6f  fined to be a po
23700 69 6e 74 65 72 20 74 6f 20 61 20 66 75 6e 63 74  inter to a funct
23710 69 6f 6e 20 74 61 6b 69 6e 67 0a 20 20 2a 2a 20  ion taking.  ** 
23720 70 61 72 61 6d 65 74 65 72 73 20 76 6f 69 64 2a  parameters void*
23730 20 61 6e 64 20 63 6f 6e 73 74 20 63 68 61 72 2a   and const char*
23740 20 61 6e 64 20 72 65 74 75 72 6e 69 6e 67 20 61   and returning a
23750 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 66 75   pointer to a fu
23760 6e 63 74 69 6f 6e 2e 0a 20 20 2a 2a 20 57 65 20  nction..  ** We 
23770 69 6e 69 74 69 61 6c 69 7a 65 20 78 20 62 79 20  initialize x by 
23780 61 73 73 69 67 6e 69 6e 67 20 69 74 20 61 20 70  assigning it a p
23790 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 64 6c  ointer to the dl
237a0 73 79 6d 28 29 20 66 75 6e 63 74 69 6f 6e 2e 0a  sym() function..
237b0 20 20 2a 2a 20 28 54 68 61 74 20 61 73 73 69 67    ** (That assig
237c0 6e 6d 65 6e 74 20 72 65 71 75 69 72 65 73 20 61  nment requires a
237d0 20 63 61 73 74 2e 29 20 20 54 68 65 6e 20 77 65   cast.)  Then we
237e0 20 63 61 6c 6c 20 74 68 65 20 66 75 6e 63 74 69   call the functi
237f0 6f 6e 20 74 68 61 74 0a 20 20 2a 2a 20 78 20 70  on that.  ** x p
23800 6f 69 6e 74 73 20 74 6f 2e 20 20 0a 20 20 2a 2a  oints to.  .  **
23810 0a 20 20 2a 2a 20 54 68 69 73 20 77 6f 72 6b 2d  .  ** This work-
23820 61 72 6f 75 6e 64 20 69 73 20 75 6e 6c 69 6b 65  around is unlike
23830 6c 79 20 74 6f 20 77 6f 72 6b 20 63 6f 72 72 65  ly to work corre
23840 63 74 6c 79 20 6f 6e 20 61 6e 79 20 73 79 73 74  ctly on any syst
23850 65 6d 20 77 68 65 72 65 0a 20 20 2a 2a 20 79 6f  em where.  ** yo
23860 75 20 72 65 61 6c 6c 79 20 63 61 6e 6e 6f 74 20  u really cannot 
23870 63 61 73 74 20 61 20 66 75 6e 63 74 69 6f 6e 20  cast a function 
23880 70 6f 69 6e 74 65 72 20 69 6e 74 6f 20 76 6f 69  pointer into voi
23890 64 2a 2e 20 20 42 75 74 20 74 68 65 6e 2c 20 6f  d*.  But then, o
238a0 6e 20 74 68 65 0a 20 20 2a 2a 20 6f 74 68 65 72  n the.  ** other
238b0 20 68 61 6e 64 2c 20 64 6c 73 79 6d 28 29 20 77   hand, dlsym() w
238c0 69 6c 6c 20 6e 6f 74 20 77 6f 72 6b 20 6f 6e 20  ill not work on 
238d0 73 75 63 68 20 61 20 73 79 73 74 65 6d 20 65 69  such a system ei
238e0 74 68 65 72 2c 20 73 6f 20 77 65 20 68 61 76 65  ther, so we have
238f0 0a 20 20 2a 2a 20 6e 6f 74 20 72 65 61 6c 6c 79  .  ** not really
23900 20 6c 6f 73 74 20 61 6e 79 74 68 69 6e 67 2e 0a   lost anything..
23910 20 20 2a 2f 0a 20 20 76 6f 69 64 20 28 2a 28 2a    */.  void (*(*
23920 78 29 28 76 6f 69 64 2a 2c 63 6f 6e 73 74 20 63  x)(void*,const c
23930 68 61 72 2a 29 29 28 76 6f 69 64 29 3b 0a 20 20  har*))(void);.  
23940 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
23950 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20 78 20 3d  (NotUsed);.  x =
23960 20 28 76 6f 69 64 28 2a 28 2a 29 28 76 6f 69 64   (void(*(*)(void
23970 2a 2c 63 6f 6e 73 74 20 63 68 61 72 2a 29 29 28  *,const char*))(
23980 76 6f 69 64 29 29 64 6c 73 79 6d 3b 0a 20 20 72  void))dlsym;.  r
23990 65 74 75 72 6e 20 28 2a 78 29 28 70 2c 20 7a 53  eturn (*x)(p, zS
239a0 79 6d 29 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f  ym);.}.static vo
239b0 69 64 20 75 6e 69 78 44 6c 43 6c 6f 73 65 28 73  id unixDlClose(s
239c0 71 6c 69 74 65 33 5f 76 66 73 20 2a 4e 6f 74 55  qlite3_vfs *NotU
239d0 73 65 64 2c 20 76 6f 69 64 20 2a 70 48 61 6e 64  sed, void *pHand
239e0 6c 65 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41  le){.  UNUSED_PA
239f0 52 41 4d 45 54 45 52 28 4e 6f 74 55 73 65 64 29  RAMETER(NotUsed)
23a00 3b 0a 20 20 64 6c 63 6c 6f 73 65 28 70 48 61 6e  ;.  dlclose(pHan
23a10 64 6c 65 29 3b 0a 7d 0a 23 65 6c 73 65 20 2f 2a  dle);.}.#else /*
23a20 20 69 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   if SQLITE_OMIT_
23a30 4c 4f 41 44 5f 45 58 54 45 4e 53 49 4f 4e 20 69  LOAD_EXTENSION i
23a40 73 20 64 65 66 69 6e 65 64 3a 20 2a 2f 0a 20 20  s defined: */.  
23a50 23 64 65 66 69 6e 65 20 75 6e 69 78 44 6c 4f 70  #define unixDlOp
23a60 65 6e 20 20 30 0a 20 20 23 64 65 66 69 6e 65 20  en  0.  #define 
23a70 75 6e 69 78 44 6c 45 72 72 6f 72 20 30 0a 20 20  unixDlError 0.  
23a80 23 64 65 66 69 6e 65 20 75 6e 69 78 44 6c 53 79  #define unixDlSy
23a90 6d 20 20 20 30 0a 20 20 23 64 65 66 69 6e 65 20  m   0.  #define 
23aa0 75 6e 69 78 44 6c 43 6c 6f 73 65 20 30 0a 23 65  unixDlClose 0.#e
23ab0 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74  ndif../*.** Writ
23ac0 65 20 6e 42 75 66 20 62 79 74 65 73 20 6f 66 20  e nBuf bytes of 
23ad0 72 61 6e 64 6f 6d 20 64 61 74 61 20 74 6f 20 74  random data to t
23ae0 68 65 20 73 75 70 70 6c 69 65 64 20 62 75 66 66  he supplied buff
23af0 65 72 20 7a 42 75 66 2e 0a 2a 2f 0a 73 74 61 74  er zBuf..*/.stat
23b00 69 63 20 69 6e 74 20 75 6e 69 78 52 61 6e 64 6f  ic int unixRando
23b10 6d 6e 65 73 73 28 73 71 6c 69 74 65 33 5f 76 66  mness(sqlite3_vf
23b20 73 20 2a 4e 6f 74 55 73 65 64 2c 20 69 6e 74 20  s *NotUsed, int 
23b30 6e 42 75 66 2c 20 63 68 61 72 20 2a 7a 42 75 66  nBuf, char *zBuf
23b40 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  ){.  UNUSED_PARA
23b50 4d 45 54 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a  METER(NotUsed);.
23b60 20 20 61 73 73 65 72 74 28 28 73 69 7a 65 5f 74    assert((size_t
23b70 29 6e 42 75 66 3e 3d 28 73 69 7a 65 6f 66 28 74  )nBuf>=(sizeof(t
23b80 69 6d 65 5f 74 29 2b 73 69 7a 65 6f 66 28 69 6e  ime_t)+sizeof(in
23b90 74 29 29 29 3b 0a 0a 20 20 2f 2a 20 57 65 20 68  t)));..  /* We h
23ba0 61 76 65 20 74 6f 20 69 6e 69 74 69 61 6c 69 7a  ave to initializ
23bb0 65 20 7a 42 75 66 20 74 6f 20 70 72 65 76 65 6e  e zBuf to preven
23bc0 74 20 76 61 6c 67 72 69 6e 64 20 66 72 6f 6d 20  t valgrind from 
23bd0 72 65 70 6f 72 74 69 6e 67 0a 20 20 2a 2a 20 65  reporting.  ** e
23be0 72 72 6f 72 73 2e 20 20 54 68 65 20 72 65 70 6f  rrors.  The repo
23bf0 72 74 73 20 69 73 73 75 65 64 20 62 79 20 76 61  rts issued by va
23c00 6c 67 72 69 6e 64 20 61 72 65 20 69 6e 63 6f 72  lgrind are incor
23c10 72 65 63 74 20 2d 20 77 65 20 77 6f 75 6c 64 0a  rect - we would.
23c20 20 20 2a 2a 20 70 72 65 66 65 72 20 74 68 61 74    ** prefer that
23c30 20 74 68 65 20 72 61 6e 64 6f 6d 6e 65 73 73 20   the randomness 
23c40 62 65 20 69 6e 63 72 65 61 73 65 64 20 62 79 20  be increased by 
23c50 6d 61 6b 69 6e 67 20 75 73 65 20 6f 66 20 74 68  making use of th
23c60 65 0a 20 20 2a 2a 20 75 6e 69 6e 69 74 69 61 6c  e.  ** uninitial
23c70 69 7a 65 64 20 73 70 61 63 65 20 69 6e 20 7a 42  ized space in zB
23c80 75 66 20 2d 20 62 75 74 20 76 61 6c 67 72 69 6e  uf - but valgrin
23c90 64 20 65 72 72 6f 72 73 20 74 65 6e 64 20 74 6f  d errors tend to
23ca0 20 77 6f 72 72 79 0a 20 20 2a 2a 20 73 6f 6d 65   worry.  ** some
23cb0 20 75 73 65 72 73 2e 20 20 52 61 74 68 65 72 20   users.  Rather 
23cc0 74 68 61 6e 20 61 72 67 75 65 2c 20 69 74 20 73  than argue, it s
23cd0 65 65 6d 73 20 65 61 73 69 65 72 20 6a 75 73 74  eems easier just
23ce0 20 74 6f 20 69 6e 69 74 69 61 6c 69 7a 65 0a 20   to initialize. 
23cf0 20 2a 2a 20 74 68 65 20 77 68 6f 6c 65 20 61 72   ** the whole ar
23d00 72 61 79 20 61 6e 64 20 73 69 6c 65 6e 63 65 20  ray and silence 
23d10 76 61 6c 67 72 69 6e 64 2c 20 65 76 65 6e 20 69  valgrind, even i
23d20 66 20 74 68 61 74 20 6d 65 61 6e 73 20 6c 65 73  f that means les
23d30 73 20 72 61 6e 64 6f 6d 6e 65 73 73 0a 20 20 2a  s randomness.  *
23d40 2a 20 69 6e 20 74 68 65 20 72 61 6e 64 6f 6d 20  * in the random 
23d50 73 65 65 64 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  seed..  **.  ** 
23d60 57 68 65 6e 20 74 65 73 74 69 6e 67 2c 20 69 6e  When testing, in
23d70 69 74 69 61 6c 69 7a 69 6e 67 20 7a 42 75 66 5b  itializing zBuf[
23d80 5d 20 74 6f 20 7a 65 72 6f 20 69 73 20 61 6c 6c  ] to zero is all
23d90 20 77 65 20 64 6f 2e 20 20 54 68 61 74 20 6d 65   we do.  That me
23da0 61 6e 73 0a 20 20 2a 2a 20 74 68 61 74 20 77 65  ans.  ** that we
23db0 20 61 6c 77 61 79 73 20 75 73 65 20 74 68 65 20   always use the 
23dc0 73 61 6d 65 20 72 61 6e 64 6f 6d 20 6e 75 6d 62  same random numb
23dd0 65 72 20 73 65 71 75 65 6e 63 65 2e 20 20 54 68  er sequence.  Th
23de0 69 73 20 6d 61 6b 65 73 20 74 68 65 0a 20 20 2a  is makes the.  *
23df0 2a 20 74 65 73 74 73 20 72 65 70 65 61 74 61 62  * tests repeatab
23e00 6c 65 2e 0a 20 20 2a 2f 0a 20 20 6d 65 6d 73 65  le..  */.  memse
23e10 74 28 7a 42 75 66 2c 20 30 2c 20 6e 42 75 66 29  t(zBuf, 0, nBuf)
23e20 3b 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53  ;.#if !defined(S
23e30 51 4c 49 54 45 5f 54 45 53 54 29 0a 20 20 7b 0a  QLITE_TEST).  {.
23e40 20 20 20 20 69 6e 74 20 70 69 64 2c 20 66 64 3b      int pid, fd;
23e50 0a 20 20 20 20 66 64 20 3d 20 6f 70 65 6e 28 22  .    fd = open("
23e60 2f 64 65 76 2f 75 72 61 6e 64 6f 6d 22 2c 20 4f  /dev/urandom", O
23e70 5f 52 44 4f 4e 4c 59 29 3b 0a 20 20 20 20 69 66  _RDONLY);.    if
23e80 28 20 66 64 3c 30 20 29 7b 0a 20 20 20 20 20 20  ( fd<0 ){.      
23e90 74 69 6d 65 5f 74 20 74 3b 0a 20 20 20 20 20 20  time_t t;.      
23ea0 74 69 6d 65 28 26 74 29 3b 0a 20 20 20 20 20 20  time(&t);.      
23eb0 6d 65 6d 63 70 79 28 7a 42 75 66 2c 20 26 74 2c  memcpy(zBuf, &t,
23ec0 20 73 69 7a 65 6f 66 28 74 29 29 3b 0a 20 20 20   sizeof(t));.   
23ed0 20 20 20 70 69 64 20 3d 20 67 65 74 70 69 64 28     pid = getpid(
23ee0 29 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28  );.      memcpy(
23ef0 26 7a 42 75 66 5b 73 69 7a 65 6f 66 28 74 29 5d  &zBuf[sizeof(t)]
23f00 2c 20 26 70 69 64 2c 20 73 69 7a 65 6f 66 28 70  , &pid, sizeof(p
23f10 69 64 29 29 3b 0a 20 20 20 20 20 20 61 73 73 65  id));.      asse
23f20 72 74 28 20 73 69 7a 65 6f 66 28 74 29 2b 73 69  rt( sizeof(t)+si
23f30 7a 65 6f 66 28 70 69 64 29 3c 3d 28 73 69 7a 65  zeof(pid)<=(size
23f40 5f 74 29 6e 42 75 66 20 29 3b 0a 20 20 20 20 20  _t)nBuf );.     
23f50 20 6e 42 75 66 20 3d 20 73 69 7a 65 6f 66 28 74   nBuf = sizeof(t
23f60 29 20 2b 20 73 69 7a 65 6f 66 28 70 69 64 29 3b  ) + sizeof(pid);
23f70 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
23f80 20 20 6e 42 75 66 20 3d 20 72 65 61 64 28 66 64    nBuf = read(fd
23f90 2c 20 7a 42 75 66 2c 20 6e 42 75 66 29 3b 0a 20  , zBuf, nBuf);. 
23fa0 20 20 20 20 20 63 6c 6f 73 65 28 66 64 29 3b 0a       close(fd);.
23fb0 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66      }.  }.#endif
23fc0 0a 20 20 72 65 74 75 72 6e 20 6e 42 75 66 3b 0a  .  return nBuf;.
23fd0 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 53 6c 65 65 70 20  }.../*.** Sleep 
23fe0 66 6f 72 20 61 20 6c 69 74 74 6c 65 20 77 68 69  for a little whi
23ff0 6c 65 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20  le.  Return the 
24000 61 6d 6f 75 6e 74 20 6f 66 20 74 69 6d 65 20 73  amount of time s
24010 6c 65 70 74 2e 0a 2a 2a 20 54 68 65 20 61 72 67  lept..** The arg
24020 75 6d 65 6e 74 20 69 73 20 74 68 65 20 6e 75 6d  ument is the num
24030 62 65 72 20 6f 66 20 6d 69 63 72 6f 73 65 63 6f  ber of microseco
24040 6e 64 73 20 77 65 20 77 61 6e 74 20 74 6f 20 73  nds we want to s
24050 6c 65 65 70 2e 0a 2a 2a 20 54 68 65 20 72 65 74  leep..** The ret
24060 75 72 6e 20 76 61 6c 75 65 20 69 73 20 74 68 65  urn value is the
24070 20 6e 75 6d 62 65 72 20 6f 66 20 6d 69 63 72 6f   number of micro
24080 73 65 63 6f 6e 64 73 20 6f 66 20 73 6c 65 65 70  seconds of sleep
24090 20 61 63 74 75 61 6c 6c 79 0a 2a 2a 20 72 65 71   actually.** req
240a0 75 65 73 74 65 64 20 66 72 6f 6d 20 74 68 65 20  uested from the 
240b0 75 6e 64 65 72 6c 79 69 6e 67 20 6f 70 65 72 61  underlying opera
240c0 74 69 6e 67 20 73 79 73 74 65 6d 2c 20 61 20 6e  ting system, a n
240d0 75 6d 62 65 72 20 77 68 69 63 68 0a 2a 2a 20 6d  umber which.** m
240e0 69 67 68 74 20 62 65 20 67 72 65 61 74 65 72 20  ight be greater 
240f0 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f  than or equal to
24100 20 74 68 65 20 61 72 67 75 6d 65 6e 74 2c 20 62   the argument, b
24110 75 74 20 6e 6f 74 20 6c 65 73 73 0a 2a 2a 20 74  ut not less.** t
24120 68 61 6e 20 74 68 65 20 61 72 67 75 6d 65 6e 74  han the argument
24130 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
24140 75 6e 69 78 53 6c 65 65 70 28 73 71 6c 69 74 65  unixSleep(sqlite
24150 33 5f 76 66 73 20 2a 4e 6f 74 55 73 65 64 2c 20  3_vfs *NotUsed, 
24160 69 6e 74 20 6d 69 63 72 6f 73 65 63 6f 6e 64 73  int microseconds
24170 29 7b 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b  ){.#if OS_VXWORK
24180 53 0a 20 20 73 74 72 75 63 74 20 74 69 6d 65 73  S.  struct times
24190 70 65 63 20 73 70 3b 0a 0a 20 20 73 70 2e 74 76  pec sp;..  sp.tv
241a0 5f 73 65 63 20 3d 20 6d 69 63 72 6f 73 65 63 6f  _sec = microseco
241b0 6e 64 73 20 2f 20 31 30 30 30 30 30 30 3b 0a 20  nds / 1000000;. 
241c0 20 73 70 2e 74 76 5f 6e 73 65 63 20 3d 20 28 6d   sp.tv_nsec = (m
241d0 69 63 72 6f 73 65 63 6f 6e 64 73 20 25 20 31 30  icroseconds % 10
241e0 30 30 30 30 30 29 20 2a 20 31 30 30 30 3b 0a 20  00000) * 1000;. 
241f0 20 6e 61 6e 6f 73 6c 65 65 70 28 26 73 70 2c 20   nanosleep(&sp, 
24200 4e 55 4c 4c 29 3b 0a 20 20 55 4e 55 53 45 44 5f  NULL);.  UNUSED_
24210 50 41 52 41 4d 45 54 45 52 28 4e 6f 74 55 73 65  PARAMETER(NotUse
24220 64 29 3b 0a 20 20 72 65 74 75 72 6e 20 6d 69 63  d);.  return mic
24230 72 6f 73 65 63 6f 6e 64 73 3b 0a 23 65 6c 69 66  roseconds;.#elif
24240 20 64 65 66 69 6e 65 64 28 48 41 56 45 5f 55 53   defined(HAVE_US
24250 4c 45 45 50 29 20 26 26 20 48 41 56 45 5f 55 53  LEEP) && HAVE_US
24260 4c 45 45 50 0a 20 20 75 73 6c 65 65 70 28 6d 69  LEEP.  usleep(mi
24270 63 72 6f 73 65 63 6f 6e 64 73 29 3b 0a 20 20 55  croseconds);.  U
24280 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
24290 4e 6f 74 55 73 65 64 29 3b 0a 20 20 72 65 74 75  NotUsed);.  retu
242a0 72 6e 20 6d 69 63 72 6f 73 65 63 6f 6e 64 73 3b  rn microseconds;
242b0 0a 23 65 6c 73 65 0a 20 20 69 6e 74 20 73 65 63  .#else.  int sec
242c0 6f 6e 64 73 20 3d 20 28 6d 69 63 72 6f 73 65 63  onds = (microsec
242d0 6f 6e 64 73 2b 39 39 39 39 39 39 29 2f 31 30 30  onds+999999)/100
242e0 30 30 30 30 3b 0a 20 20 73 6c 65 65 70 28 73 65  0000;.  sleep(se
242f0 63 6f 6e 64 73 29 3b 0a 20 20 55 4e 55 53 45 44  conds);.  UNUSED
24300 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f 74 55 73  _PARAMETER(NotUs
24310 65 64 29 3b 0a 20 20 72 65 74 75 72 6e 20 73 65  ed);.  return se
24320 63 6f 6e 64 73 2a 31 30 30 30 30 30 30 3b 0a 23  conds*1000000;.#
24330 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  endif.}../*.** T
24340 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 76 61 72  he following var
24350 69 61 62 6c 65 2c 20 69 66 20 73 65 74 20 74 6f  iable, if set to
24360 20 61 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75   a non-zero valu
24370 65 2c 20 69 73 20 69 6e 74 65 72 70 72 65 74 65  e, is interprete
24380 64 20 61 73 0a 2a 2a 20 74 68 65 20 6e 75 6d 62  d as.** the numb
24390 65 72 20 6f 66 20 73 65 63 6f 6e 64 73 20 73 69  er of seconds si
243a0 6e 63 65 20 31 39 37 30 20 61 6e 64 20 69 73 20  nce 1970 and is 
243b0 75 73 65 64 20 74 6f 20 73 65 74 20 74 68 65 20  used to set the 
243c0 72 65 73 75 6c 74 20 6f 66 0a 2a 2a 20 73 71 6c  result of.** sql
243d0 69 74 65 33 4f 73 43 75 72 72 65 6e 74 54 69 6d  ite3OsCurrentTim
243e0 65 28 29 20 64 75 72 69 6e 67 20 74 65 73 74 69  e() during testi
243f0 6e 67 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51  ng..*/.#ifdef SQ
24400 4c 49 54 45 5f 54 45 53 54 0a 69 6e 74 20 73 71  LITE_TEST.int sq
24410 6c 69 74 65 33 5f 63 75 72 72 65 6e 74 5f 74 69  lite3_current_ti
24420 6d 65 20 3d 20 30 3b 20 20 2f 2a 20 46 61 6b 65  me = 0;  /* Fake
24430 20 73 79 73 74 65 6d 20 74 69 6d 65 20 69 6e 20   system time in 
24440 73 65 63 6f 6e 64 73 20 73 69 6e 63 65 20 31 39  seconds since 19
24450 37 30 2e 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a 2f  70. */.#endif../
24460 2a 0a 2a 2a 20 46 69 6e 64 20 74 68 65 20 63 75  *.** Find the cu
24470 72 72 65 6e 74 20 74 69 6d 65 20 28 69 6e 20 55  rrent time (in U
24480 6e 69 76 65 72 73 61 6c 20 43 6f 6f 72 64 69 6e  niversal Coordin
24490 61 74 65 64 20 54 69 6d 65 29 2e 20 20 57 72 69  ated Time).  Wri
244a0 74 65 20 74 68 65 0a 2a 2a 20 63 75 72 72 65 6e  te the.** curren
244b0 74 20 74 69 6d 65 20 61 6e 64 20 64 61 74 65 20  t time and date 
244c0 61 73 20 61 20 4a 75 6c 69 61 6e 20 44 61 79 20  as a Julian Day 
244d0 6e 75 6d 62 65 72 20 69 6e 74 6f 20 2a 70 72 4e  number into *prN
244e0 6f 77 20 61 6e 64 0a 2a 2a 20 72 65 74 75 72 6e  ow and.** return
244f0 20 30 2e 20 20 52 65 74 75 72 6e 20 31 20 69 66   0.  Return 1 if
24500 20 74 68 65 20 74 69 6d 65 20 61 6e 64 20 64 61   the time and da
24510 74 65 20 63 61 6e 6e 6f 74 20 62 65 20 66 6f 75  te cannot be fou
24520 6e 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  nd..*/.static in
24530 74 20 75 6e 69 78 43 75 72 72 65 6e 74 54 69 6d  t unixCurrentTim
24540 65 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 4e  e(sqlite3_vfs *N
24550 6f 74 55 73 65 64 2c 20 64 6f 75 62 6c 65 20 2a  otUsed, double *
24560 70 72 4e 6f 77 29 7b 0a 23 69 66 20 64 65 66 69  prNow){.#if defi
24570 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
24580 46 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e 54 29 0a  FLOATING_POINT).
24590 20 20 74 69 6d 65 5f 74 20 74 3b 0a 20 20 74 69    time_t t;.  ti
245a0 6d 65 28 26 74 29 3b 0a 20 20 2a 70 72 4e 6f 77  me(&t);.  *prNow
245b0 20 3d 20 28 28 28 73 71 6c 69 74 65 33 5f 69 6e   = (((sqlite3_in
245c0 74 36 34 29 74 29 2f 38 36 34 30 20 2b 20 32 34  t64)t)/8640 + 24
245d0 34 30 35 38 37 35 29 2f 31 30 3b 0a 23 65 6c 69  405875)/10;.#eli
245e0 66 20 64 65 66 69 6e 65 64 28 4e 4f 5f 47 45 54  f defined(NO_GET
245f0 54 4f 44 29 0a 20 20 74 69 6d 65 5f 74 20 74 3b  TOD).  time_t t;
24600 0a 20 20 74 69 6d 65 28 26 74 29 3b 0a 20 20 2a  .  time(&t);.  *
24610 70 72 4e 6f 77 20 3d 20 74 2f 38 36 34 30 30 2e  prNow = t/86400.
24620 30 20 2b 20 32 34 34 30 35 38 37 2e 35 3b 0a 23  0 + 2440587.5;.#
24630 65 6c 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a  elif OS_VXWORKS.
24640 20 20 73 74 72 75 63 74 20 74 69 6d 65 73 70 65    struct timespe
24650 63 20 73 4e 6f 77 3b 0a 20 20 63 6c 6f 63 6b 5f  c sNow;.  clock_
24660 67 65 74 74 69 6d 65 28 43 4c 4f 43 4b 5f 52 45  gettime(CLOCK_RE
24670 41 4c 54 49 4d 45 2c 20 26 73 4e 6f 77 29 3b 0a  ALTIME, &sNow);.
24680 20 20 2a 70 72 4e 6f 77 20 3d 20 32 34 34 30 35    *prNow = 24405
24690 38 37 2e 35 20 2b 20 73 4e 6f 77 2e 74 76 5f 73  87.5 + sNow.tv_s
246a0 65 63 2f 38 36 34 30 30 2e 30 20 2b 20 73 4e 6f  ec/86400.0 + sNo
246b0 77 2e 74 76 5f 6e 73 65 63 2f 38 36 34 30 30 30  w.tv_nsec/864000
246c0 30 30 30 30 30 30 30 30 2e 30 3b 0a 23 65 6c 73  00000000.0;.#els
246d0 65 0a 20 20 73 74 72 75 63 74 20 74 69 6d 65 76  e.  struct timev
246e0 61 6c 20 73 4e 6f 77 3b 0a 20 20 67 65 74 74 69  al sNow;.  getti
246f0 6d 65 6f 66 64 61 79 28 26 73 4e 6f 77 2c 20 30  meofday(&sNow, 0
24700 29 3b 0a 20 20 2a 70 72 4e 6f 77 20 3d 20 32 34  );.  *prNow = 24
24710 34 30 35 38 37 2e 35 20 2b 20 73 4e 6f 77 2e 74  40587.5 + sNow.t
24720 76 5f 73 65 63 2f 38 36 34 30 30 2e 30 20 2b 20  v_sec/86400.0 + 
24730 73 4e 6f 77 2e 74 76 5f 75 73 65 63 2f 38 36 34  sNow.tv_usec/864
24740 30 30 30 30 30 30 30 30 2e 30 3b 0a 23 65 6e 64  00000000.0;.#end
24750 69 66 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  if..#ifdef SQLIT
24760 45 5f 54 45 53 54 0a 20 20 69 66 28 20 73 71 6c  E_TEST.  if( sql
24770 69 74 65 33 5f 63 75 72 72 65 6e 74 5f 74 69 6d  ite3_current_tim
24780 65 20 29 7b 0a 20 20 20 20 2a 70 72 4e 6f 77 20  e ){.    *prNow 
24790 3d 20 73 71 6c 69 74 65 33 5f 63 75 72 72 65 6e  = sqlite3_curren
247a0 74 5f 74 69 6d 65 2f 38 36 34 30 30 2e 30 20 2b  t_time/86400.0 +
247b0 20 32 34 34 30 35 38 37 2e 35 3b 0a 20 20 7d 0a   2440587.5;.  }.
247c0 23 65 6e 64 69 66 0a 20 20 55 4e 55 53 45 44 5f  #endif.  UNUSED_
247d0 50 41 52 41 4d 45 54 45 52 28 4e 6f 74 55 73 65  PARAMETER(NotUse
247e0 64 29 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a  d);.  return 0;.
247f0 7d 0a 0a 2f 2a 0a 2a 2a 20 57 65 20 61 64 64 65  }../*.** We adde
24800 64 20 74 68 65 20 78 47 65 74 4c 61 73 74 45 72  d the xGetLastEr
24810 72 6f 72 28 29 20 6d 65 74 68 6f 64 20 77 69 74  ror() method wit
24820 68 20 74 68 65 20 69 6e 74 65 6e 74 69 6f 6e 20  h the intention 
24830 6f 66 20 70 72 6f 76 69 64 69 6e 67 0a 2a 2a 20  of providing.** 
24840 62 65 74 74 65 72 20 6c 6f 77 2d 6c 65 76 65 6c  better low-level
24850 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 73 20   error messages 
24860 77 68 65 6e 20 6f 70 65 72 61 74 69 6e 67 2d 73  when operating-s
24870 79 73 74 65 6d 20 70 72 6f 62 6c 65 6d 73 20 63  ystem problems c
24880 6f 6d 65 20 75 70 0a 2a 2a 20 64 75 72 69 6e 67  ome up.** during
24890 20 53 51 4c 69 74 65 20 6f 70 65 72 61 74 69 6f   SQLite operatio
248a0 6e 2e 20 20 42 75 74 20 73 6f 20 66 61 72 2c 20  n.  But so far, 
248b0 6e 6f 6e 65 20 6f 66 20 74 68 61 74 20 68 61 73  none of that has
248c0 20 62 65 65 6e 20 69 6d 70 6c 65 6d 65 6e 74 65   been implemente
248d0 64 0a 2a 2a 20 69 6e 20 74 68 65 20 63 6f 72 65  d.** in the core
248e0 2e 20 20 53 6f 20 74 68 69 73 20 72 6f 75 74 69  .  So this routi
248f0 6e 65 20 69 73 20 6e 65 76 65 72 20 63 61 6c 6c  ne is never call
24900 65 64 2e 20 20 46 6f 72 20 6e 6f 77 2c 20 69 74  ed.  For now, it
24910 20 69 73 20 6d 65 72 65 6c 79 0a 2a 2a 20 61 20   is merely.** a 
24920 70 6c 61 63 65 2d 68 6f 6c 64 65 72 2e 0a 2a 2f  place-holder..*/
24930 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78  .static int unix
24940 47 65 74 4c 61 73 74 45 72 72 6f 72 28 73 71 6c  GetLastError(sql
24950 69 74 65 33 5f 76 66 73 20 2a 4e 6f 74 55 73 65  ite3_vfs *NotUse
24960 64 2c 20 69 6e 74 20 4e 6f 74 55 73 65 64 32 2c  d, int NotUsed2,
24970 20 63 68 61 72 20 2a 4e 6f 74 55 73 65 64 33 29   char *NotUsed3)
24980 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  {.  UNUSED_PARAM
24990 45 54 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20  ETER(NotUsed);. 
249a0 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
249b0 52 28 4e 6f 74 55 73 65 64 32 29 3b 0a 20 20 55  R(NotUsed2);.  U
249c0 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
249d0 4e 6f 74 55 73 65 64 33 29 3b 0a 20 20 72 65 74  NotUsed3);.  ret
249e0 75 72 6e 20 30 3b 0a 7d 0a 0a 23 69 66 6e 64 65  urn 0;.}..#ifnde
249f0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41  f SQLITE_OMIT_WA
24a00 4c 0a 0a 2f 2a 20 46 6f 72 77 61 72 64 20 72 65  L../* Forward re
24a10 66 65 72 65 6e 63 65 20 2a 2f 0a 74 79 70 65 64  ference */.typed
24a20 65 66 20 73 74 72 75 63 74 20 75 6e 69 78 53 68  ef struct unixSh
24a30 6d 20 75 6e 69 78 53 68 6d 3b 0a 74 79 70 65 64  m unixShm;.typed
24a40 65 66 20 73 74 72 75 63 74 20 75 6e 69 78 53 68  ef struct unixSh
24a50 6d 46 69 6c 65 20 75 6e 69 78 53 68 6d 46 69 6c  mFile unixShmFil
24a60 65 3b 0a 0a 2f 2a 0a 2a 2a 20 4f 62 6a 65 63 74  e;../*.** Object
24a70 20 75 73 65 64 20 74 6f 20 72 65 70 72 65 73 65   used to represe
24a80 6e 74 20 61 20 73 69 6e 67 6c 65 20 66 69 6c 65  nt a single file
24a90 20 6f 70 65 6e 65 64 20 61 6e 64 20 6d 6d 61 70   opened and mmap
24aa0 70 65 64 20 74 6f 20 70 72 6f 76 69 64 65 0a 2a  ped to provide.*
24ab0 2a 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 2e  * shared memory.
24ac0 20 20 57 68 65 6e 20 6d 75 6c 74 69 70 6c 65 20    When multiple 
24ad0 74 68 72 65 61 64 73 20 61 6c 6c 20 72 65 66 65  threads all refe
24ae0 72 65 6e 63 65 20 74 68 65 20 73 61 6d 65 0a 2a  rence the same.*
24af0 2a 20 6c 6f 67 2d 73 75 6d 6d 61 72 79 2c 20 65  * log-summary, e
24b00 61 63 68 20 74 68 72 65 61 64 20 68 61 73 20 69  ach thread has i
24b10 74 73 20 6f 77 6e 20 75 6e 69 78 46 69 6c 65 20  ts own unixFile 
24b20 6f 62 6a 65 63 74 2c 20 62 75 74 20 74 68 65 79  object, but they
24b30 20 61 6c 6c 0a 2a 2a 20 70 6f 69 6e 74 20 74 6f   all.** point to
24b40 20 61 20 73 69 6e 67 6c 65 20 69 6e 73 74 61 6e   a single instan
24b50 63 65 20 6f 66 20 74 68 69 73 20 6f 62 6a 65 63  ce of this objec
24b60 74 2e 20 20 49 6e 20 6f 74 68 65 72 20 77 6f 72  t.  In other wor
24b70 64 73 2c 20 65 61 63 68 0a 2a 2a 20 6c 6f 67 2d  ds, each.** log-
24b80 73 75 6d 6d 61 72 79 20 69 73 20 6f 70 65 6e 65  summary is opene
24b90 64 20 6f 6e 6c 79 20 6f 6e 63 65 20 70 65 72 20  d only once per 
24ba0 70 72 6f 63 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 75  process..**.** u
24bb0 6e 69 78 4d 75 74 65 78 48 65 6c 64 28 29 20 6d  nixMutexHeld() m
24bc0 75 73 74 20 62 65 20 74 72 75 65 20 77 68 65 6e  ust be true when
24bd0 20 63 72 65 61 74 69 6e 67 20 6f 72 20 64 65 73   creating or des
24be0 74 72 6f 79 69 6e 67 0a 2a 2a 20 74 68 69 73 20  troying.** this 
24bf0 6f 62 6a 65 63 74 20 6f 72 20 77 68 69 6c 65 20  object or while 
24c00 72 65 61 64 69 6e 67 20 6f 72 20 77 72 69 74 69  reading or writi
24c10 6e 67 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ng the following
24c20 20 66 69 65 6c 64 73 3a 0a 2a 2a 0a 2a 2a 20 20   fields:.**.**  
24c30 20 20 20 20 6e 52 65 66 0a 2a 2a 20 20 20 20 20      nRef.**     
24c40 20 70 4e 65 78 74 20 0a 2a 2a 0a 2a 2a 20 54 68   pNext .**.** Th
24c50 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 66 69 65 6c  e following fiel
24c60 64 73 20 61 72 65 20 72 65 61 64 2d 6f 6e 6c 79  ds are read-only
24c70 20 61 66 74 65 72 20 74 68 65 20 6f 62 6a 65 63   after the objec
24c80 74 20 69 73 20 63 72 65 61 74 65 64 3a 0a 2a 2a  t is created:.**
24c90 20 0a 2a 2a 20 20 20 20 20 20 66 69 64 0a 2a 2a   .**      fid.**
24ca0 20 20 20 20 20 20 7a 46 69 6c 65 6e 61 6d 65 0a        zFilename.
24cb0 2a 2a 0a 2a 2a 20 45 69 74 68 65 72 20 75 6e 69  **.** Either uni
24cc0 78 53 68 6d 46 69 6c 65 2e 6d 75 74 65 78 20 6d  xShmFile.mutex m
24cd0 75 73 74 20 62 65 20 68 65 6c 64 20 6f 72 20 75  ust be held or u
24ce0 6e 69 78 53 68 6d 46 69 6c 65 2e 6e 52 65 66 3d  nixShmFile.nRef=
24cf0 3d 30 20 61 6e 64 0a 2a 2a 20 75 6e 69 78 4d 75  =0 and.** unixMu
24d00 74 65 78 48 65 6c 64 28 29 20 69 73 20 74 72 75  texHeld() is tru
24d10 65 20 77 68 65 6e 20 72 65 61 64 69 6e 67 20 6f  e when reading o
24d20 72 20 77 72 69 74 69 6e 67 20 61 6e 79 20 6f 74  r writing any ot
24d30 68 65 72 20 66 69 65 6c 64 0a 2a 2a 20 69 6e 20  her field.** in 
24d40 74 68 69 73 20 73 74 72 75 63 74 75 72 65 2e 0a  this structure..
24d50 2a 2f 0a 73 74 72 75 63 74 20 75 6e 69 78 53 68  */.struct unixSh
24d60 6d 46 69 6c 65 20 7b 0a 20 20 73 74 72 75 63 74  mFile {.  struct
24d70 20 75 6e 69 78 46 69 6c 65 49 64 20 66 69 64 3b   unixFileId fid;
24d80 20 20 20 20 20 2f 2a 20 55 6e 69 71 75 65 20 66       /* Unique f
24d90 69 6c 65 20 69 64 65 6e 74 69 66 69 65 72 20 2a  ile identifier *
24da0 2f 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  /.  sqlite3_mute
24db0 78 20 2a 6d 75 74 65 78 3b 20 20 20 20 20 20 2f  x *mutex;      /
24dc0 2a 20 4d 75 74 65 78 20 74 6f 20 61 63 63 65 73  * Mutex to acces
24dd0 73 20 74 68 69 73 20 6f 62 6a 65 63 74 20 2a 2f  s this object */
24de0 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
24df0 20 2a 6d 75 74 65 78 42 75 66 3b 20 20 20 2f 2a   *mutexBuf;   /*
24e00 20 4d 75 74 65 78 20 74 6f 20 61 63 63 65 73 73   Mutex to access
24e10 20 7a 42 75 66 5b 5d 20 2a 2f 0a 20 20 63 68 61   zBuf[] */.  cha
24e20 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 3b 20 20 20  r *zFilename;   
24e30 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20          /* Name 
24e40 6f 66 20 74 68 65 20 66 69 6c 65 20 2a 2f 0a 20  of the file */. 
24e50 20 69 6e 74 20 68 3b 20 20 20 20 20 20 20 20 20   int h;         
24e60 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
24e70 70 65 6e 20 66 69 6c 65 20 64 65 73 63 72 69 70  pen file descrip
24e80 74 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 73 7a 4d  tor */.  int szM
24e90 61 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ap;             
24ea0 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74      /* Size of t
24eb0 68 65 20 6d 61 70 70 69 6e 67 20 6f 66 20 66 69  he mapping of fi
24ec0 6c 65 20 69 6e 74 6f 20 6d 65 6d 6f 72 79 20 2a  le into memory *
24ed0 2f 0a 20 20 63 68 61 72 20 2a 70 4d 4d 61 70 42  /.  char *pMMapB
24ee0 75 66 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  uf;            /
24ef0 2a 20 57 68 65 72 65 20 63 75 72 72 65 6e 74 6c  * Where currentl
24f00 79 20 6d 6d 61 70 70 65 64 28 29 2e 20 20 4e 55  y mmapped().  NU
24f10 4c 4c 20 69 66 20 75 6e 6d 61 70 70 65 64 20 2a  LL if unmapped *
24f20 2f 0a 20 20 69 6e 74 20 6e 52 65 66 3b 20 20 20  /.  int nRef;   
24f30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
24f40 2a 20 4e 75 6d 62 65 72 20 6f 66 20 75 6e 69 78  * Number of unix
24f50 53 68 6d 20 6f 62 6a 65 63 74 73 20 70 6f 69 6e  Shm objects poin
24f60 74 69 6e 67 20 74 6f 20 74 68 69 73 20 2a 2f 0a  ting to this */.
24f70 20 20 75 6e 69 78 53 68 6d 20 2a 70 46 69 72 73    unixShm *pFirs
24f80 74 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  t;           /* 
24f90 41 6c 6c 20 75 6e 69 78 53 68 6d 20 6f 62 6a 65  All unixShm obje
24fa0 63 74 73 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20  cts pointing to 
24fb0 74 68 69 73 20 2a 2f 0a 20 20 75 6e 69 78 53 68  this */.  unixSh
24fc0 6d 46 69 6c 65 20 2a 70 4e 65 78 74 3b 20 20 20  mFile *pNext;   
24fd0 20 20 20 20 20 2f 2a 20 4e 65 78 74 20 69 6e 20       /* Next in 
24fe0 6c 69 73 74 20 6f 66 20 61 6c 6c 20 75 6e 69 78  list of all unix
24ff0 53 68 6d 46 69 6c 65 20 6f 62 6a 65 63 74 73 20  ShmFile objects 
25000 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  */.#ifdef SQLITE
25010 5f 44 45 42 55 47 0a 20 20 75 38 20 65 78 63 6c  _DEBUG.  u8 excl
25020 4d 61 73 6b 3b 20 20 20 20 20 20 20 20 20 20 20  Mask;           
25030 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 65      /* Mask of e
25040 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 73 20 68  xclusive locks h
25050 65 6c 64 20 2a 2f 0a 20 20 75 38 20 73 68 61 72  eld */.  u8 shar
25060 65 64 4d 61 73 6b 3b 20 20 20 20 20 20 20 20 20  edMask;         
25070 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 73      /* Mask of s
25080 68 61 72 65 64 20 6c 6f 63 6b 73 20 68 65 6c 64  hared locks held
25090 20 2a 2f 0a 20 20 75 38 20 6e 65 78 74 53 68 6d   */.  u8 nextShm
250a0 49 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  Id;             
250b0 20 2f 2a 20 4e 65 78 74 20 61 76 61 69 6c 61 62   /* Next availab
250c0 6c 65 20 75 6e 69 78 53 68 6d 2e 69 64 20 76 61  le unixShm.id va
250d0 6c 75 65 20 2a 2f 0a 23 65 6e 64 69 66 0a 7d 3b  lue */.#endif.};
250e0 0a 0a 2f 2a 0a 2a 2a 20 41 20 67 6c 6f 62 61 6c  ../*.** A global
250f0 20 61 72 72 61 79 20 6f 66 20 61 6c 6c 20 75 6e   array of all un
25100 69 78 53 68 6d 46 69 6c 65 20 6f 62 6a 65 63 74  ixShmFile object
25110 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 75 6e 69  s..**.** The uni
25120 78 4d 75 74 65 78 48 65 6c 64 28 29 20 6d 75 73  xMutexHeld() mus
25130 74 20 62 65 20 74 72 75 65 20 77 68 69 6c 65 20  t be true while 
25140 72 65 61 64 69 6e 67 20 6f 72 20 77 72 69 74 69  reading or writi
25150 6e 67 20 74 68 69 73 20 6c 69 73 74 2e 0a 2a 2f  ng this list..*/
25160 0a 73 74 61 74 69 63 20 75 6e 69 78 53 68 6d 46  .static unixShmF
25170 69 6c 65 20 2a 75 6e 69 78 53 68 6d 46 69 6c 65  ile *unixShmFile
25180 4c 69 73 74 20 3d 20 30 3b 0a 0a 2f 2a 0a 2a 2a  List = 0;../*.**
25190 20 53 74 72 75 63 74 75 72 65 20 75 73 65 64 20   Structure used 
251a0 69 6e 74 65 72 6e 61 6c 6c 79 20 62 79 20 74 68  internally by th
251b0 69 73 20 56 46 53 20 74 6f 20 72 65 63 6f 72 64  is VFS to record
251c0 20 74 68 65 20 73 74 61 74 65 20 6f 66 20 61 6e   the state of an
251d0 0a 2a 2a 20 6f 70 65 6e 20 73 68 61 72 65 64 20  .** open shared 
251e0 6d 65 6d 6f 72 79 20 63 6f 6e 6e 65 63 74 69 6f  memory connectio
251f0 6e 2e 0a 2a 2a 0a 2a 2a 20 75 6e 69 78 53 68 6d  n..**.** unixShm
25200 2e 70 46 69 6c 65 2d 3e 6d 75 74 65 78 20 6d 75  .pFile->mutex mu
25210 73 74 20 62 65 20 68 65 6c 64 20 77 68 69 6c 65  st be held while
25220 20 72 65 61 64 69 6e 67 20 6f 72 20 77 72 69 74   reading or writ
25230 69 6e 67 20 74 68 65 0a 2a 2a 20 75 6e 69 78 53  ing the.** unixS
25240 68 6d 2e 70 4e 65 78 74 20 61 6e 64 20 75 6e 69  hm.pNext and uni
25250 78 53 68 6d 2e 6c 6f 63 6b 73 5b 5d 20 65 6c 65  xShm.locks[] ele
25260 6d 65 6e 74 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  ments..**.** The
25270 20 75 6e 69 78 53 68 6d 2e 70 46 69 6c 65 20 65   unixShm.pFile e
25280 6c 65 6d 65 6e 74 20 69 73 20 69 6e 69 74 69 61  lement is initia
25290 6c 69 7a 65 64 20 77 68 65 6e 20 74 68 65 20 6f  lized when the o
252a0 62 6a 65 63 74 20 69 73 20 63 72 65 61 74 65 64  bject is created
252b0 0a 2a 2a 20 61 6e 64 20 69 73 20 72 65 61 64 2d  .** and is read-
252c0 6f 6e 6c 79 20 74 68 65 72 65 61 66 74 65 72 2e  only thereafter.
252d0 0a 2a 2f 0a 73 74 72 75 63 74 20 75 6e 69 78 53  .*/.struct unixS
252e0 68 6d 20 7b 0a 20 20 75 6e 69 78 53 68 6d 46 69  hm {.  unixShmFi
252f0 6c 65 20 2a 70 46 69 6c 65 3b 20 20 20 20 20 20  le *pFile;      
25300 20 20 2f 2a 20 54 68 65 20 75 6e 64 65 72 6c 79    /* The underly
25310 69 6e 67 20 75 6e 69 78 53 68 6d 46 69 6c 65 20  ing unixShmFile 
25320 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 75 6e 69 78  object */.  unix
25330 53 68 6d 20 2a 70 4e 65 78 74 3b 20 20 20 20 20  Shm *pNext;     
25340 20 20 20 20 20 20 20 2f 2a 20 4e 65 78 74 20 75         /* Next u
25350 6e 69 78 53 68 6d 20 77 69 74 68 20 74 68 65 20  nixShm with the 
25360 73 61 6d 65 20 75 6e 69 78 53 68 6d 46 69 6c 65  same unixShmFile
25370 20 2a 2f 0a 20 20 75 38 20 6c 6f 63 6b 53 74 61   */.  u8 lockSta
25380 74 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  te;             
25390 20 2f 2a 20 43 75 72 72 65 6e 74 20 6c 6f 63 6b   /* Current lock
253a0 20 73 74 61 74 65 20 2a 2f 0a 20 20 75 38 20 72   state */.  u8 r
253b0 65 61 64 4c 6f 63 6b 3b 20 20 20 20 20 20 20 20  eadLock;        
253c0 20 20 20 20 20 20 20 2f 2a 20 57 68 69 63 68 20         /* Which 
253d0 6f 66 20 74 68 65 20 74 77 6f 20 72 65 61 64 2d  of the two read-
253e0 6c 6f 63 6b 20 73 74 61 74 65 73 20 74 6f 20 75  lock states to u
253f0 73 65 20 2a 2f 0a 20 20 75 38 20 68 61 73 4d 75  se */.  u8 hasMu
25400 74 65 78 3b 20 20 20 20 20 20 20 20 20 20 20 20  tex;            
25410 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 68 6f     /* True if ho
25420 6c 64 69 6e 67 20 74 68 65 20 75 6e 69 78 53 68  lding the unixSh
25430 6d 46 69 6c 65 20 6d 75 74 65 78 20 2a 2f 0a 20  mFile mutex */. 
25440 20 75 38 20 68 61 73 4d 75 74 65 78 42 75 66 3b   u8 hasMutexBuf;
25450 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
25460 72 75 65 20 69 66 20 68 6f 6c 64 69 6e 67 20 70  rue if holding p
25470 46 69 6c 65 2d 3e 6d 75 74 65 78 42 75 66 20 2a  File->mutexBuf *
25480 2f 0a 20 20 75 38 20 73 68 61 72 65 64 4d 61 73  /.  u8 sharedMas
25490 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  k;             /
254a0 2a 20 4d 61 73 6b 20 6f 66 20 73 68 61 72 65 64  * Mask of shared
254b0 20 6c 6f 63 6b 73 20 68 65 6c 64 20 2a 2f 0a 20   locks held */. 
254c0 20 75 38 20 65 78 63 6c 4d 61 73 6b 3b 20 20 20   u8 exclMask;   
254d0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d              /* M
254e0 61 73 6b 20 6f 66 20 65 78 63 6c 75 73 69 76 65  ask of exclusive
254f0 20 6c 6f 63 6b 73 20 68 65 6c 64 20 2a 2f 0a 23   locks held */.#
25500 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42  ifdef SQLITE_DEB
25510 55 47 0a 20 20 75 38 20 69 64 3b 20 20 20 20 20  UG.  u8 id;     
25520 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25530 2f 2a 20 49 64 20 6f 66 20 74 68 69 73 20 63 6f  /* Id of this co
25540 6e 6e 65 63 74 69 6f 6e 20 77 69 74 68 20 69 74  nnection with it
25550 73 20 75 6e 69 78 53 68 6d 46 69 6c 65 20 2a 2f  s unixShmFile */
25560 0a 23 65 6e 64 69 66 0a 7d 3b 0a 0a 2f 2a 0a 2a  .#endif.};../*.*
25570 2a 20 53 69 7a 65 20 69 6e 63 72 65 6d 65 6e 74  * Size increment
25580 20 62 79 20 77 68 69 63 68 20 73 68 61 72 65 64   by which shared
25590 20 6d 65 6d 6f 72 79 20 67 72 6f 77 73 0a 2a 2f   memory grows.*/
255a0 0a 23 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f  .#define SQLITE_
255b0 55 4e 49 58 5f 53 48 4d 5f 49 4e 43 52 20 20 34  UNIX_SHM_INCR  4
255c0 30 39 36 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 73 74  096../*.** Const
255d0 61 6e 74 73 20 75 73 65 64 20 66 6f 72 20 6c 6f  ants used for lo
255e0 63 6b 69 6e 67 0a 2a 2f 0a 23 64 65 66 69 6e 65  cking.*/.#define
255f0 20 55 4e 49 58 5f 53 48 4d 5f 42 41 53 45 20 20   UNIX_SHM_BASE  
25600 20 20 20 20 33 32 20 20 20 20 20 20 20 20 2f 2a      32        /*
25610 20 42 79 74 65 20 6f 66 66 73 65 74 20 6f 66 20   Byte offset of 
25620 74 68 65 20 66 69 72 73 74 20 6c 6f 63 6b 20 62  the first lock b
25630 79 74 65 20 2a 2f 0a 23 64 65 66 69 6e 65 20 55  yte */.#define U
25640 4e 49 58 5f 53 48 4d 5f 4d 55 54 45 58 20 20 20  NIX_SHM_MUTEX   
25650 20 20 30 78 30 31 20 20 20 20 20 20 2f 2a 20 4d    0x01      /* M
25660 61 73 6b 20 66 6f 72 20 4d 55 54 45 58 20 6c 6f  ask for MUTEX lo
25670 63 6b 20 2a 2f 0a 23 64 65 66 69 6e 65 20 55 4e  ck */.#define UN
25680 49 58 5f 53 48 4d 5f 44 4d 53 20 20 20 20 20 20  IX_SHM_DMS      
25690 20 30 78 30 34 20 20 20 20 20 20 2f 2a 20 4d 61   0x04      /* Ma
256a0 73 6b 20 66 6f 72 20 44 65 61 64 2d 4d 61 6e 2d  sk for Dead-Man-
256b0 53 77 69 74 63 68 20 6c 6f 63 6b 20 2a 2f 0a 23  Switch lock */.#
256c0 64 65 66 69 6e 65 20 55 4e 49 58 5f 53 48 4d 5f  define UNIX_SHM_
256d0 41 20 20 20 20 20 20 20 20 20 30 78 31 30 20 20  A         0x10  
256e0 20 20 20 20 2f 2a 20 4d 61 73 6b 20 66 6f 72 20      /* Mask for 
256f0 72 65 67 69 6f 6e 20 6c 6f 63 6b 73 2e 2e 2e 20  region locks... 
25700 2a 2f 0a 23 64 65 66 69 6e 65 20 55 4e 49 58 5f  */.#define UNIX_
25710 53 48 4d 5f 42 20 20 20 20 20 20 20 20 20 30 78  SHM_B         0x
25720 32 30 0a 23 64 65 66 69 6e 65 20 55 4e 49 58 5f  20.#define UNIX_
25730 53 48 4d 5f 43 20 20 20 20 20 20 20 20 20 30 78  SHM_C         0x
25740 34 30 0a 23 64 65 66 69 6e 65 20 55 4e 49 58 5f  40.#define UNIX_
25750 53 48 4d 5f 44 20 20 20 20 20 20 20 20 20 30 78  SHM_D         0x
25760 38 30 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  80..#ifdef SQLIT
25770 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20 52 65  E_DEBUG./*.** Re
25780 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74  turn a pointer t
25790 6f 20 61 20 6e 75 6c 2d 74 65 72 6d 69 6e 61 74  o a nul-terminat
257a0 65 64 20 73 74 72 69 6e 67 20 69 6e 20 73 74 61  ed string in sta
257b0 74 69 63 20 6d 65 6d 6f 72 79 20 74 68 61 74 0a  tic memory that.
257c0 2a 2a 20 64 65 73 63 72 69 62 65 73 20 61 20 6c  ** describes a l
257d0 6f 63 6b 69 6e 67 20 6d 61 73 6b 2e 20 20 54 68  ocking mask.  Th
257e0 65 20 73 74 72 69 6e 67 20 69 73 20 6f 66 20 74  e string is of t
257f0 68 65 20 66 6f 72 6d 20 22 4d 53 41 42 43 44 22  he form "MSABCD"
25800 20 77 69 74 68 0a 2a 2a 20 65 61 63 68 20 63 68   with.** each ch
25810 61 72 61 63 74 65 72 20 72 65 70 72 65 73 65 6e  aracter represen
25820 74 69 6e 67 20 61 20 6c 6f 63 6b 2e 20 20 22 4d  ting a lock.  "M
25830 22 20 66 6f 72 20 4d 55 54 45 58 2c 20 22 53 22  " for MUTEX, "S"
25840 20 66 6f 72 20 44 4d 53 2c 20 0a 2a 2a 20 61 6e   for DMS, .** an
25850 64 20 22 41 22 20 74 68 72 6f 75 67 68 20 22 44  d "A" through "D
25860 22 20 66 6f 72 20 74 68 65 20 72 65 67 69 6f 6e  " for the region
25870 20 6c 6f 63 6b 73 2e 20 20 49 66 20 61 20 6c 6f   locks.  If a lo
25880 63 6b 20 69 73 20 68 65 6c 64 2c 20 74 68 65 0a  ck is held, the.
25890 2a 2a 20 6c 65 74 74 65 72 20 69 73 20 73 68 6f  ** letter is sho
258a0 77 6e 2e 20 20 49 66 20 74 68 65 20 6c 6f 63 6b  wn.  If the lock
258b0 20 69 73 20 6e 6f 74 20 68 65 6c 64 2c 20 74 68   is not held, th
258c0 65 20 6c 65 74 74 65 72 20 69 73 20 63 6f 6e 76  e letter is conv
258d0 65 72 74 65 64 0a 2a 2a 20 74 6f 20 22 2e 22 2e  erted.** to ".".
258e0 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
258f0 69 6e 65 20 69 73 20 66 6f 72 20 64 65 62 75 67  ine is for debug
25900 67 69 6e 67 20 70 75 72 70 6f 73 65 73 20 6f 6e  ging purposes on
25910 6c 79 20 61 6e 64 20 64 6f 65 73 20 6e 6f 74 20  ly and does not 
25920 61 70 70 65 61 72 0a 2a 2a 20 69 6e 20 61 20 70  appear.** in a p
25930 72 6f 64 75 63 74 69 6f 6e 20 62 75 69 6c 64 2e  roduction build.
25940 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74  .*/.static const
25950 20 63 68 61 72 20 2a 75 6e 69 78 53 68 6d 4c 6f   char *unixShmLo
25960 63 6b 53 74 72 69 6e 67 28 75 38 20 6d 61 73 6b  ckString(u8 mask
25970 29 7b 0a 20 20 73 74 61 74 69 63 20 63 68 61 72  ){.  static char
25980 20 7a 42 75 66 5b 34 38 5d 3b 0a 20 20 73 74 61   zBuf[48];.  sta
25990 74 69 63 20 69 6e 74 20 69 42 75 66 20 3d 20 30  tic int iBuf = 0
259a0 3b 0a 20 20 63 68 61 72 20 2a 7a 3b 0a 0a 20 20  ;.  char *z;..  
259b0 7a 20 3d 20 26 7a 42 75 66 5b 69 42 75 66 5d 3b  z = &zBuf[iBuf];
259c0 0a 20 20 69 42 75 66 20 2b 3d 20 38 3b 0a 20 20  .  iBuf += 8;.  
259d0 69 66 28 20 69 42 75 66 3e 3d 73 69 7a 65 6f 66  if( iBuf>=sizeof
259e0 28 7a 42 75 66 29 20 29 20 69 42 75 66 20 3d 20  (zBuf) ) iBuf = 
259f0 30 3b 0a 0a 20 20 7a 5b 30 5d 20 3d 20 28 6d 61  0;..  z[0] = (ma
25a00 73 6b 20 26 20 55 4e 49 58 5f 53 48 4d 5f 4d 55  sk & UNIX_SHM_MU
25a10 54 45 58 29 20 3f 20 27 4d 27 20 3a 20 27 2e 27  TEX) ? 'M' : '.'
25a20 3b 0a 20 20 7a 5b 31 5d 20 3d 20 28 6d 61 73 6b  ;.  z[1] = (mask
25a30 20 26 20 55 4e 49 58 5f 53 48 4d 5f 44 4d 53 29   & UNIX_SHM_DMS)
25a40 20 20 20 3f 20 27 53 27 20 3a 20 27 2e 27 3b 0a     ? 'S' : '.';.
25a50 20 20 7a 5b 32 5d 20 3d 20 28 6d 61 73 6b 20 26    z[2] = (mask &
25a60 20 55 4e 49 58 5f 53 48 4d 5f 41 29 20 20 20 20   UNIX_SHM_A)    
25a70 20 3f 20 27 41 27 20 3a 20 27 2e 27 3b 0a 20 20   ? 'A' : '.';.  
25a80 7a 5b 33 5d 20 3d 20 28 6d 61 73 6b 20 26 20 55  z[3] = (mask & U
25a90 4e 49 58 5f 53 48 4d 5f 42 29 20 20 20 20 20 3f  NIX_SHM_B)     ?
25aa0 20 27 42 27 20 3a 20 27 2e 27 3b 0a 20 20 7a 5b   'B' : '.';.  z[
25ab0 34 5d 20 3d 20 28 6d 61 73 6b 20 26 20 55 4e 49  4] = (mask & UNI
25ac0 58 5f 53 48 4d 5f 43 29 20 20 20 20 20 3f 20 27  X_SHM_C)     ? '
25ad0 43 27 20 3a 20 27 2e 27 3b 0a 20 20 7a 5b 35 5d  C' : '.';.  z[5]
25ae0 20 3d 20 28 6d 61 73 6b 20 26 20 55 4e 49 58 5f   = (mask & UNIX_
25af0 53 48 4d 5f 44 29 20 20 20 20 20 3f 20 27 44 27  SHM_D)     ? 'D'
25b00 20 3a 20 27 2e 27 3b 0a 20 20 7a 5b 36 5d 20 3d   : '.';.  z[6] =
25b10 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 7a 3b 0a   0;.  return z;.
25b20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
25b30 54 45 5f 44 45 42 55 47 20 2a 2f 0a 0a 2f 2a 0a  TE_DEBUG */../*.
25b40 2a 2a 20 41 70 70 6c 79 20 70 6f 73 69 78 20 61  ** Apply posix a
25b50 64 76 69 73 6f 72 79 20 6c 6f 63 6b 73 20 66 6f  dvisory locks fo
25b60 72 20 61 6c 6c 20 62 79 74 65 73 20 69 64 65 6e  r all bytes iden
25b70 74 69 66 69 65 64 20 69 6e 20 6c 6f 63 6b 4d 61  tified in lockMa
25b80 73 6b 2e 0a 2a 2a 0a 2a 2a 20 6c 6f 63 6b 4d 61  sk..**.** lockMa
25b90 73 6b 20 6d 69 67 68 74 20 63 6f 6e 74 61 69 6e  sk might contain
25ba0 20 6d 75 6c 74 69 70 6c 65 20 62 69 74 73 20 62   multiple bits b
25bb0 75 74 20 61 6c 6c 20 62 69 74 73 20 61 72 65 20  ut all bits are 
25bc0 67 75 61 72 61 6e 74 65 65 64 0a 2a 2a 20 74 6f  guaranteed.** to
25bd0 20 62 65 20 63 6f 6e 74 69 67 75 6f 75 73 2e 0a   be contiguous..
25be0 2a 2a 0a 2a 2a 20 4c 6f 63 6b 73 20 62 6c 6f 63  **.** Locks bloc
25bf0 6b 20 69 66 20 74 68 65 20 55 4e 49 58 5f 53 48  k if the UNIX_SH
25c00 4d 5f 4d 55 54 45 58 20 62 69 74 20 69 73 20 73  M_MUTEX bit is s
25c10 65 74 20 61 6e 64 20 61 72 65 20 6e 6f 6e 2d 62  et and are non-b
25c20 6c 6f 63 6b 69 6e 67 0a 2a 2a 20 6f 74 68 65 72  locking.** other
25c30 77 69 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  wise..*/.static 
25c40 69 6e 74 20 75 6e 69 78 53 68 6d 53 79 73 74 65  int unixShmSyste
25c50 6d 4c 6f 63 6b 28 0a 20 20 75 6e 69 78 53 68 6d  mLock(.  unixShm
25c60 46 69 6c 65 20 2a 70 46 69 6c 65 2c 20 20 20 2f  File *pFile,   /
25c70 2a 20 41 70 70 6c 79 20 6c 6f 63 6b 73 20 74 6f  * Apply locks to
25c80 20 74 68 69 73 20 6f 70 65 6e 20 73 68 61 72 65   this open share
25c90 64 2d 6d 65 6d 6f 72 79 20 73 65 67 6d 65 6e 74  d-memory segment
25ca0 20 2a 2f 0a 20 20 69 6e 74 20 6c 6f 63 6b 54 79   */.  int lockTy
25cb0 70 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 46  pe,         /* F
25cc0 5f 55 4e 4c 43 4b 2c 20 46 5f 52 44 4c 43 4b 2c  _UNLCK, F_RDLCK,
25cd0 20 6f 72 20 46 5f 57 52 4c 43 4b 20 2a 2f 0a 20   or F_WRLCK */. 
25ce0 20 75 38 20 6c 6f 63 6b 4d 61 73 6b 20 20 20 20   u8 lockMask    
25cf0 20 20 20 20 20 20 20 2f 2a 20 57 68 69 63 68 20         /* Which 
25d00 62 79 74 65 73 20 74 6f 20 6c 6f 63 6b 20 6f 72  bytes to lock or
25d10 20 75 6e 6c 6f 63 6b 20 2a 2f 0a 29 7b 0a 20 20   unlock */.){.  
25d20 73 74 72 75 63 74 20 66 6c 6f 63 6b 20 66 3b 20  struct flock f; 
25d30 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 6f 73        /* The pos
25d40 69 78 20 61 64 76 69 73 6f 72 79 20 6c 6f 63 6b  ix advisory lock
25d50 69 6e 67 20 73 74 72 75 63 74 75 72 65 20 2a 2f  ing structure */
25d60 0a 20 20 69 6e 74 20 6c 6f 63 6b 4f 70 3b 20 20  .  int lockOp;  
25d70 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
25d80 6f 70 63 6f 64 65 20 66 6f 72 20 66 63 6e 74 6c  opcode for fcntl
25d90 28 29 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20  () */.  int i;  
25da0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
25db0 20 4f 66 66 73 65 74 20 69 6e 74 6f 20 74 68 65   Offset into the
25dc0 20 6c 6f 63 6b 69 6e 67 20 62 79 74 65 20 72 61   locking byte ra
25dd0 6e 67 65 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b  nge */.  int rc;
25de0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
25df0 2a 20 52 65 73 75 6c 74 20 63 6f 64 65 20 66 6f  * Result code fo
25e00 72 6d 20 66 63 6e 74 6c 28 29 20 2a 2f 0a 20 20  rm fcntl() */.  
25e10 75 38 20 6d 61 73 6b 3b 20 20 20 20 20 20 20 20  u8 mask;        
25e20 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66        /* Mask of
25e30 20 62 69 74 73 20 69 6e 20 6c 6f 63 6b 4d 61 73   bits in lockMas
25e40 6b 20 2a 2f 0a 0a 20 20 2f 2a 20 41 63 63 65 73  k */..  /* Acces
25e50 73 20 74 6f 20 74 68 65 20 75 6e 69 78 53 68 6d  s to the unixShm
25e60 46 69 6c 65 20 6f 62 6a 65 63 74 20 69 73 20 73  File object is s
25e70 65 72 69 61 6c 69 7a 65 64 20 62 79 20 74 68 65  erialized by the
25e80 20 63 61 6c 6c 65 72 20 2a 2f 0a 20 20 61 73 73   caller */.  ass
25e90 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
25ea0 65 78 5f 68 65 6c 64 28 70 46 69 6c 65 2d 3e 6d  ex_held(pFile->m
25eb0 75 74 65 78 29 20 7c 7c 20 70 46 69 6c 65 2d 3e  utex) || pFile->
25ec0 6e 52 65 66 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a  nRef==0 );..  /*
25ed0 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20   Initialize the 
25ee0 6c 6f 63 6b 69 6e 67 20 70 61 72 61 6d 65 74 65  locking paramete
25ef0 72 73 20 2a 2f 0a 20 20 6d 65 6d 73 65 74 28 26  rs */.  memset(&
25f00 66 2c 20 30 2c 20 73 69 7a 65 6f 66 28 66 29 29  f, 0, sizeof(f))
25f10 3b 0a 20 20 66 2e 6c 5f 74 79 70 65 20 3d 20 6c  ;.  f.l_type = l
25f20 6f 63 6b 54 79 70 65 3b 0a 20 20 66 2e 6c 5f 77  ockType;.  f.l_w
25f30 68 65 6e 63 65 20 3d 20 53 45 45 4b 5f 53 45 54  hence = SEEK_SET
25f40 3b 0a 20 20 69 66 28 20 28 6c 6f 63 6b 4d 61 73  ;.  if( (lockMas
25f50 6b 20 26 20 55 4e 49 58 5f 53 48 4d 5f 4d 55 54  k & UNIX_SHM_MUT
25f60 45 58 29 21 3d 30 20 26 26 20 6c 6f 63 6b 54 79  EX)!=0 && lockTy
25f70 70 65 21 3d 46 5f 55 4e 4c 43 4b 20 29 7b 0a 20  pe!=F_UNLCK ){. 
25f80 20 20 20 6c 6f 63 6b 4f 70 20 3d 20 46 5f 53 45     lockOp = F_SE
25f90 54 4c 4b 57 3b 0a 20 20 20 20 4f 53 54 52 41 43  TLKW;.    OSTRAC
25fa0 45 28 28 22 53 48 4d 2d 4c 4f 43 4b 20 72 65 71  E(("SHM-LOCK req
25fb0 75 65 73 74 69 6e 67 20 62 6c 6f 63 6b 69 6e 67  uesting blocking
25fc0 20 6c 6f 63 6b 5c 6e 22 29 29 3b 0a 20 20 7d 65   lock\n"));.  }e
25fd0 6c 73 65 7b 0a 20 20 20 20 6c 6f 63 6b 4f 70 20  lse{.    lockOp 
25fe0 3d 20 46 5f 53 45 54 4c 4b 3b 0a 20 20 7d 0a 0a  = F_SETLK;.  }..
25ff0 20 20 2f 2a 20 46 69 6e 64 20 74 68 65 20 66 69    /* Find the fi
26000 72 73 74 20 62 69 74 20 69 6e 20 6c 6f 63 6b 4d  rst bit in lockM
26010 61 73 6b 20 74 68 61 74 20 69 73 20 73 65 74 20  ask that is set 
26020 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 2c 20 6d 61  */.  for(i=0, ma
26030 73 6b 3d 30 78 30 31 3b 20 6d 61 73 6b 21 3d 30  sk=0x01; mask!=0
26040 20 26 26 20 28 6c 6f 63 6b 4d 61 73 6b 26 6d 61   && (lockMask&ma
26050 73 6b 29 3d 3d 30 3b 20 6d 61 73 6b 20 3c 3c 3d  sk)==0; mask <<=
26060 20 31 2c 20 69 2b 2b 29 7b 7d 0a 20 20 61 73 73   1, i++){}.  ass
26070 65 72 74 28 20 6d 61 73 6b 21 3d 30 20 29 3b 0a  ert( mask!=0 );.
26080 20 20 66 2e 6c 5f 73 74 61 72 74 20 3d 20 69 2b    f.l_start = i+
26090 55 4e 49 58 5f 53 48 4d 5f 42 41 53 45 3b 0a 20  UNIX_SHM_BASE;. 
260a0 20 66 2e 6c 5f 6c 65 6e 20 3d 20 31 3b 0a 0a 20   f.l_len = 1;.. 
260b0 20 2f 2a 20 45 78 74 65 6e 64 20 74 68 65 20 6c   /* Extend the l
260c0 6f 63 6b 69 6e 67 20 72 61 6e 67 65 20 66 6f 72  ocking range for
260d0 20 65 61 63 68 20 61 64 64 69 74 69 6f 6e 61 6c   each additional
260e0 20 62 69 74 20 74 68 61 74 20 69 73 20 73 65 74   bit that is set
260f0 20 2a 2f 0a 20 20 6d 61 73 6b 20 3c 3c 3d 20 31   */.  mask <<= 1
26100 3b 0a 20 20 77 68 69 6c 65 28 20 6d 61 73 6b 21  ;.  while( mask!
26110 3d 30 20 26 26 20 28 6c 6f 63 6b 4d 61 73 6b 20  =0 && (lockMask 
26120 26 20 6d 61 73 6b 29 21 3d 30 20 29 7b 0a 20 20  & mask)!=0 ){.  
26130 20 20 66 2e 6c 5f 6c 65 6e 2b 2b 3b 0a 20 20 20    f.l_len++;.   
26140 20 6d 61 73 6b 20 3c 3c 3d 20 31 3b 0a 20 20 7d   mask <<= 1;.  }
26150 0a 0a 20 20 2f 2a 20 56 65 72 69 66 79 20 74 68  ..  /* Verify th
26160 61 74 20 61 6c 6c 20 62 69 74 73 20 73 65 74 20  at all bits set 
26170 69 6e 20 6c 6f 63 6b 4d 61 73 6b 20 61 72 65 20  in lockMask are 
26180 63 6f 6e 74 69 67 75 6f 75 73 20 2a 2f 0a 20 20  contiguous */.  
26190 61 73 73 65 72 74 28 20 6d 61 73 6b 3d 3d 30 20  assert( mask==0 
261a0 7c 7c 20 28 6c 6f 63 6b 4d 61 73 6b 20 26 20 7e  || (lockMask & ~
261b0 28 6d 61 73 6b 20 7c 20 28 6d 61 73 6b 2d 31 29  (mask | (mask-1)
261c0 29 29 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 41  ))==0 );..  /* A
261d0 63 71 75 69 72 65 20 74 68 65 20 73 79 73 74 65  cquire the syste
261e0 6d 2d 6c 65 76 65 6c 20 6c 6f 63 6b 20 2a 2f 0a  m-level lock */.
261f0 20 20 72 63 20 3d 20 66 63 6e 74 6c 28 70 46 69    rc = fcntl(pFi
26200 6c 65 2d 3e 68 2c 20 6c 6f 63 6b 4f 70 2c 20 26  le->h, lockOp, &
26210 66 29 3b 0a 20 20 72 63 20 3d 20 28 72 63 21 3d  f);.  rc = (rc!=
26220 28 2d 31 29 29 20 3f 20 53 51 4c 49 54 45 5f 4f  (-1)) ? SQLITE_O
26230 4b 20 3a 20 53 51 4c 49 54 45 5f 42 55 53 59 3b  K : SQLITE_BUSY;
26240 0a 0a 20 20 2f 2a 20 55 70 64 61 74 65 20 74 68  ..  /* Update th
26250 65 20 67 6c 6f 62 61 6c 20 6c 6f 63 6b 20 73 74  e global lock st
26260 61 74 65 20 61 6e 64 20 64 6f 20 64 65 62 75 67  ate and do debug
26270 20 74 72 61 63 69 6e 67 20 2a 2f 0a 23 69 66 64   tracing */.#ifd
26280 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
26290 20 20 4f 53 54 52 41 43 45 28 28 22 53 48 4d 2d    OSTRACE(("SHM-
262a0 4c 4f 43 4b 20 22 29 29 3b 0a 20 20 69 66 28 20  LOCK "));.  if( 
262b0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
262c0 0a 20 20 20 20 69 66 28 20 6c 6f 63 6b 54 79 70  .    if( lockTyp
262d0 65 3d 3d 46 5f 55 4e 4c 43 4b 20 29 7b 0a 20 20  e==F_UNLCK ){.  
262e0 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 75 6e      OSTRACE(("un
262f0 6c 6f 63 6b 20 6f 6b 22 29 29 3b 0a 20 20 20 20  lock ok"));.    
26300 20 20 70 46 69 6c 65 2d 3e 65 78 63 6c 4d 61 73    pFile->exclMas
26310 6b 20 26 3d 20 7e 6c 6f 63 6b 4d 61 73 6b 3b 0a  k &= ~lockMask;.
26320 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 73 68 61        pFile->sha
26330 72 65 64 4d 61 73 6b 20 26 3d 20 7e 6c 6f 63 6b  redMask &= ~lock
26340 4d 61 73 6b 3b 0a 20 20 20 20 7d 65 6c 73 65 20  Mask;.    }else 
26350 69 66 28 20 6c 6f 63 6b 54 79 70 65 3d 3d 46 5f  if( lockType==F_
26360 52 44 4c 43 4b 20 29 7b 0a 20 20 20 20 20 20 4f  RDLCK ){.      O
26370 53 54 52 41 43 45 28 28 22 72 65 61 64 2d 6c 6f  STRACE(("read-lo
26380 63 6b 20 6f 6b 22 29 29 3b 0a 20 20 20 20 20 20  ck ok"));.      
26390 70 46 69 6c 65 2d 3e 65 78 63 6c 4d 61 73 6b 20  pFile->exclMask 
263a0 26 3d 20 7e 6c 6f 63 6b 4d 61 73 6b 3b 0a 20 20  &= ~lockMask;.  
263b0 20 20 20 20 70 46 69 6c 65 2d 3e 73 68 61 72 65      pFile->share
263c0 64 4d 61 73 6b 20 7c 3d 20 6c 6f 63 6b 4d 61 73  dMask |= lockMas
263d0 6b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  k;.    }else{.  
263e0 20 20 20 20 61 73 73 65 72 74 28 20 6c 6f 63 6b      assert( lock
263f0 54 79 70 65 3d 3d 46 5f 57 52 4c 43 4b 20 29 3b  Type==F_WRLCK );
26400 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45 28 28  .      OSTRACE((
26410 22 77 72 69 74 65 2d 6c 6f 63 6b 20 6f 6b 22 29  "write-lock ok")
26420 29 3b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e  );.      pFile->
26430 65 78 63 6c 4d 61 73 6b 20 7c 3d 20 6c 6f 63 6b  exclMask |= lock
26440 4d 61 73 6b 3b 0a 20 20 20 20 20 20 70 46 69 6c  Mask;.      pFil
26450 65 2d 3e 73 68 61 72 65 64 4d 61 73 6b 20 26 3d  e->sharedMask &=
26460 20 7e 6c 6f 63 6b 4d 61 73 6b 3b 0a 20 20 20 20   ~lockMask;.    
26470 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69  }.  }else{.    i
26480 66 28 20 6c 6f 63 6b 54 79 70 65 3d 3d 46 5f 55  f( lockType==F_U
26490 4e 4c 43 4b 20 29 7b 0a 20 20 20 20 20 20 4f 53  NLCK ){.      OS
264a0 54 52 41 43 45 28 28 22 75 6e 6c 6f 63 6b 20 66  TRACE(("unlock f
264b0 61 69 6c 65 64 22 29 29 3b 0a 20 20 20 20 7d 65  ailed"));.    }e
264c0 6c 73 65 20 69 66 28 20 6c 6f 63 6b 54 79 70 65  lse if( lockType
264d0 3d 3d 46 5f 52 44 4c 43 4b 20 29 7b 0a 20 20 20  ==F_RDLCK ){.   
264e0 20 20 20 4f 53 54 52 41 43 45 28 28 22 72 65 61     OSTRACE(("rea
264f0 64 2d 6c 6f 63 6b 20 66 61 69 6c 65 64 22 29 29  d-lock failed"))
26500 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
26510 20 20 20 61 73 73 65 72 74 28 20 6c 6f 63 6b 54     assert( lockT
26520 79 70 65 3d 3d 46 5f 57 52 4c 43 4b 20 29 3b 0a  ype==F_WRLCK );.
26530 20 20 20 20 20 20 4f 53 54 52 41 43 45 28 28 22        OSTRACE(("
26540 77 72 69 74 65 2d 6c 6f 63 6b 20 66 61 69 6c 65  write-lock faile
26550 64 22 29 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  d"));.    }.  }.
26560 20 20 4f 53 54 52 41 43 45 28 28 22 20 2d 20 63    OSTRACE((" - c
26570 68 61 6e 67 65 20 72 65 71 75 65 73 74 65 64 20  hange requested 
26580 25 73 20 2d 20 61 66 74 65 72 77 61 72 64 73 20  %s - afterwards 
26590 25 73 3a 25 73 5c 6e 22 2c 0a 20 20 20 20 20 20  %s:%s\n",.      
265a0 20 20 20 20 20 75 6e 69 78 53 68 6d 4c 6f 63 6b       unixShmLock
265b0 53 74 72 69 6e 67 28 6c 6f 63 6b 4d 61 73 6b 29  String(lockMask)
265c0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 75 6e 69  ,.           uni
265d0 78 53 68 6d 4c 6f 63 6b 53 74 72 69 6e 67 28 70  xShmLockString(p
265e0 46 69 6c 65 2d 3e 73 68 61 72 65 64 4d 61 73 6b  File->sharedMask
265f0 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 75 6e  ),.           un
26600 69 78 53 68 6d 4c 6f 63 6b 53 74 72 69 6e 67 28  ixShmLockString(
26610 70 46 69 6c 65 2d 3e 65 78 63 6c 4d 61 73 6b 29  pFile->exclMask)
26620 29 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 72 65  ));.#endif..  re
26630 74 75 72 6e 20 72 63 3b 20 20 20 20 20 20 20 20  turn rc;        
26640 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 6f 72 20 63 6f  .}../*.** For co
26650 6e 6e 65 63 74 69 6f 6e 20 70 2c 20 75 6e 6c 6f  nnection p, unlo
26660 63 6b 20 61 6c 6c 20 6f 66 20 74 68 65 20 6c 6f  ck all of the lo
26670 63 6b 73 20 69 64 65 6e 74 69 66 69 65 64 20 62  cks identified b
26680 79 20 74 68 65 20 75 6e 6c 6f 63 6b 4d 61 73 6b  y the unlockMask
26690 0a 2a 2a 20 70 61 72 61 6d 65 74 65 72 2e 0a 2a  .** parameter..*
266a0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69  /.static int uni
266b0 78 53 68 6d 55 6e 6c 6f 63 6b 28 0a 20 20 75 6e  xShmUnlock(.  un
266c0 69 78 53 68 6d 46 69 6c 65 20 2a 70 46 69 6c 65  ixShmFile *pFile
266d0 2c 20 20 20 2f 2a 20 54 68 65 20 75 6e 64 65 72  ,   /* The under
266e0 6c 79 69 6e 67 20 73 68 61 72 65 64 2d 6d 65 6d  lying shared-mem
266f0 6f 72 79 20 66 69 6c 65 20 2a 2f 0a 20 20 75 6e  ory file */.  un
26700 69 78 53 68 6d 20 2a 70 2c 20 20 20 20 20 20 20  ixShm *p,       
26710 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 6e 6e 65      /* The conne
26720 63 74 69 6f 6e 20 74 6f 20 62 65 20 75 6e 6c 6f  ction to be unlo
26730 63 6b 65 64 20 2a 2f 0a 20 20 75 38 20 75 6e 6c  cked */.  u8 unl
26740 6f 63 6b 4d 61 73 6b 20 20 20 20 20 20 20 20 20  ockMask         
26750 2f 2a 20 4d 61 73 6b 20 6f 66 20 6c 6f 63 6b 73  /* Mask of locks
26760 20 74 6f 20 62 65 20 75 6e 6c 6f 63 6b 65 64 20   to be unlocked 
26770 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20  */.){.  int rc; 
26780 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 20 63       /* Result c
26790 6f 64 65 20 2a 2f 0a 20 20 75 6e 69 78 53 68 6d  ode */.  unixShm
267a0 20 2a 70 58 3b 20 2f 2a 20 46 6f 72 20 6c 6f 6f   *pX; /* For loo
267b0 70 69 6e 67 20 6f 76 65 72 20 61 6c 6c 20 73 69  ping over all si
267c0 62 6c 69 6e 67 20 63 6f 6e 6e 65 63 74 69 6f 6e  bling connection
267d0 73 20 2a 2f 0a 20 20 75 38 20 61 6c 6c 4d 61 73  s */.  u8 allMas
267e0 6b 3b 20 20 2f 2a 20 55 6e 69 6f 6e 20 6f 66 20  k;  /* Union of 
267f0 6c 6f 63 6b 73 20 68 65 6c 64 20 62 79 20 63 6f  locks held by co
26800 6e 6e 65 63 74 69 6f 6e 73 20 6f 74 68 65 72 20  nnections other 
26810 74 68 61 6e 20 22 70 22 20 2a 2f 0a 0a 20 20 2f  than "p" */..  /
26820 2a 20 41 63 63 65 73 73 20 74 6f 20 74 68 65 20  * Access to the 
26830 75 6e 69 78 53 68 6d 46 69 6c 65 20 6f 62 6a 65  unixShmFile obje
26840 63 74 20 69 73 20 73 65 72 69 61 6c 69 7a 65 64  ct is serialized
26850 20 62 79 20 74 68 65 20 63 61 6c 6c 65 72 20 2a   by the caller *
26860 2f 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  /.  assert( sqli
26870 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
26880 46 69 6c 65 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  File->mutex) );.
26890 0a 20 20 2f 2a 20 43 6f 6d 70 75 74 65 20 6c 6f  .  /* Compute lo
268a0 63 6b 73 20 68 65 6c 64 20 62 79 20 73 69 62 6c  cks held by sibl
268b0 69 6e 67 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20  ing connections 
268c0 2a 2f 0a 20 20 61 6c 6c 4d 61 73 6b 20 3d 20 30  */.  allMask = 0
268d0 3b 0a 20 20 66 6f 72 28 70 58 3d 70 46 69 6c 65  ;.  for(pX=pFile
268e0 2d 3e 70 46 69 72 73 74 3b 20 70 58 3b 20 70 58  ->pFirst; pX; pX
268f0 3d 70 58 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20  =pX->pNext){.   
26900 20 69 66 28 20 70 58 3d 3d 70 20 29 20 63 6f 6e   if( pX==p ) con
26910 74 69 6e 75 65 3b 0a 20 20 20 20 61 73 73 65 72  tinue;.    asser
26920 74 28 20 28 70 58 2d 3e 65 78 63 6c 4d 61 73 6b  t( (pX->exclMask
26930 20 26 20 28 70 2d 3e 65 78 63 6c 4d 61 73 6b 7c   & (p->exclMask|
26940 70 2d 3e 73 68 61 72 65 64 4d 61 73 6b 29 29 3d  p->sharedMask))=
26950 3d 30 20 29 3b 0a 20 20 20 20 61 6c 6c 4d 61 73  =0 );.    allMas
26960 6b 20 7c 3d 20 70 58 2d 3e 73 68 61 72 65 64 4d  k |= pX->sharedM
26970 61 73 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 55  ask;.  }..  /* U
26980 6e 6c 6f 63 6b 20 74 68 65 20 73 79 73 74 65 6d  nlock the system
26990 2d 6c 65 76 65 6c 20 6c 6f 63 6b 73 20 2a 2f 0a  -level locks */.
269a0 20 20 69 66 28 20 28 75 6e 6c 6f 63 6b 4d 61 73    if( (unlockMas
269b0 6b 20 26 20 61 6c 6c 4d 61 73 6b 29 21 3d 75 6e  k & allMask)!=un
269c0 6c 6f 63 6b 4d 61 73 6b 20 29 7b 0a 20 20 20 20  lockMask ){.    
269d0 72 63 20 3d 20 75 6e 69 78 53 68 6d 53 79 73 74  rc = unixShmSyst
269e0 65 6d 4c 6f 63 6b 28 70 46 69 6c 65 2c 20 46 5f  emLock(pFile, F_
269f0 55 4e 4c 43 4b 2c 20 75 6e 6c 6f 63 6b 4d 61 73  UNLCK, unlockMas
26a00 6b 20 26 20 7e 61 6c 6c 4d 61 73 6b 29 3b 0a 20  k & ~allMask);. 
26a10 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d   }else{.    rc =
26a20 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
26a30 0a 20 20 2f 2a 20 55 6e 64 6f 20 74 68 65 20 6c  .  /* Undo the l
26a40 6f 63 61 6c 20 6c 6f 63 6b 73 20 2a 2f 0a 20 20  ocal locks */.  
26a50 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
26a60 4b 20 29 7b 0a 20 20 20 20 70 2d 3e 65 78 63 6c  K ){.    p->excl
26a70 4d 61 73 6b 20 26 3d 20 7e 75 6e 6c 6f 63 6b 4d  Mask &= ~unlockM
26a80 61 73 6b 3b 0a 20 20 20 20 70 2d 3e 73 68 61 72  ask;.    p->shar
26a90 65 64 4d 61 73 6b 20 26 3d 20 7e 75 6e 6c 6f 63  edMask &= ~unloc
26aa0 6b 4d 61 73 6b 3b 0a 20 20 7d 20 0a 20 20 72 65  kMask;.  } .  re
26ab0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
26ac0 2a 20 47 65 74 20 72 65 61 64 65 72 20 6c 6f 63  * Get reader loc
26ad0 6b 73 20 66 6f 72 20 63 6f 6e 6e 65 63 74 69 6f  ks for connectio
26ae0 6e 20 70 20 6f 6e 20 61 6c 6c 20 6c 6f 63 6b 73  n p on all locks
26af0 20 69 6e 20 74 68 65 20 72 65 61 64 4d 61 73 6b   in the readMask
26b00 20 70 61 72 61 6d 65 74 65 72 2e 0a 2a 2f 0a 73   parameter..*/.s
26b10 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 53 68  tatic int unixSh
26b20 6d 53 68 61 72 65 64 4c 6f 63 6b 28 0a 20 20 75  mSharedLock(.  u
26b30 6e 69 78 53 68 6d 46 69 6c 65 20 2a 70 46 69 6c  nixShmFile *pFil
26b40 65 2c 20 20 20 2f 2a 20 54 68 65 20 75 6e 64 65  e,   /* The unde
26b50 72 6c 79 69 6e 67 20 73 68 61 72 65 64 2d 6d 65  rlying shared-me
26b60 6d 6f 72 79 20 66 69 6c 65 20 2a 2f 0a 20 20 75  mory file */.  u
26b70 6e 69 78 53 68 6d 20 2a 70 2c 20 20 20 20 20 20  nixShm *p,      
26b80 20 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 6e 6e       /* The conn
26b90 65 63 74 69 6f 6e 20 74 6f 20 67 65 74 20 74 68  ection to get th
26ba0 65 20 73 68 61 72 65 64 20 6c 6f 63 6b 73 20 2a  e shared locks *
26bb0 2f 0a 20 20 75 38 20 72 65 61 64 4d 61 73 6b 20  /.  u8 readMask 
26bc0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 73            /* Mas
26bd0 6b 20 6f 66 20 73 68 61 72 65 64 20 6c 6f 63 6b  k of shared lock
26be0 73 20 74 6f 20 62 65 20 61 63 71 75 69 72 65 64  s to be acquired
26bf0 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b   */.){.  int rc;
26c00 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c          /* Resul
26c10 74 20 63 6f 64 65 20 2a 2f 0a 20 20 75 6e 69 78  t code */.  unix
26c20 53 68 6d 20 2a 70 58 3b 20 20 20 2f 2a 20 46 6f  Shm *pX;   /* Fo
26c30 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72 20 61  r looping over a
26c40 6c 6c 20 73 69 62 6c 69 6e 67 20 63 6f 6e 6e 65  ll sibling conne
26c50 63 74 69 6f 6e 73 20 2a 2f 0a 20 20 75 38 20 61  ctions */.  u8 a
26c60 6c 6c 53 68 61 72 65 64 3b 20 20 2f 2a 20 55 6e  llShared;  /* Un
26c70 69 6f 6e 20 6f 66 20 6c 6f 63 6b 73 20 68 65 6c  ion of locks hel
26c80 64 20 62 79 20 63 6f 6e 6e 65 63 74 69 6f 6e 73  d by connections
26c90 20 6f 74 68 65 72 20 74 68 61 6e 20 22 70 22 20   other than "p" 
26ca0 2a 2f 0a 0a 20 20 2f 2a 20 41 63 63 65 73 73 20  */..  /* Access 
26cb0 74 6f 20 74 68 65 20 75 6e 69 78 53 68 6d 46 69  to the unixShmFi
26cc0 6c 65 20 6f 62 6a 65 63 74 20 69 73 20 73 65 72  le object is ser
26cd0 69 61 6c 69 7a 65 64 20 62 79 20 74 68 65 20 63  ialized by the c
26ce0 61 6c 6c 65 72 20 2a 2f 0a 20 20 61 73 73 65 72  aller */.  asser
26cf0 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
26d00 5f 68 65 6c 64 28 70 46 69 6c 65 2d 3e 6d 75 74  _held(pFile->mut
26d10 65 78 29 20 29 3b 0a 0a 20 20 2f 2a 20 46 69 6e  ex) );..  /* Fin
26d20 64 20 6f 75 74 20 77 68 69 63 68 20 73 68 61 72  d out which shar
26d30 65 64 20 6c 6f 63 6b 73 20 61 72 65 20 61 6c 72  ed locks are alr
26d40 65 61 64 79 20 68 65 6c 64 20 62 79 20 73 69 62  eady held by sib
26d50 6c 69 6e 67 20 63 6f 6e 6e 65 63 74 69 6f 6e 73  ling connections
26d60 2e 0a 20 20 2a 2a 20 49 66 20 61 6e 79 20 73 69  ..  ** If any si
26d70 62 6c 69 6e 67 20 61 6c 72 65 61 64 79 20 68 6f  bling already ho
26d80 6c 64 73 20 61 6e 20 65 78 63 6c 75 73 69 76 65  lds an exclusive
26d90 20 6c 6f 63 6b 2c 20 67 6f 20 61 68 65 61 64 20   lock, go ahead 
26da0 61 6e 64 20 72 65 74 75 72 6e 0a 20 20 2a 2a 20  and return.  ** 
26db0 53 51 4c 49 54 45 5f 42 55 53 59 2e 0a 20 20 2a  SQLITE_BUSY..  *
26dc0 2f 0a 20 20 61 6c 6c 53 68 61 72 65 64 20 3d 20  /.  allShared = 
26dd0 30 3b 0a 20 20 66 6f 72 28 70 58 3d 70 46 69 6c  0;.  for(pX=pFil
26de0 65 2d 3e 70 46 69 72 73 74 3b 20 70 58 3b 20 70  e->pFirst; pX; p
26df0 58 3d 70 58 2d 3e 70 4e 65 78 74 29 7b 0a 20 20  X=pX->pNext){.  
26e00 20 20 69 66 28 20 70 58 3d 3d 70 20 29 20 63 6f    if( pX==p ) co
26e10 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20  ntinue;.    if( 
26e20 28 70 58 2d 3e 65 78 63 6c 4d 61 73 6b 20 26 20  (pX->exclMask & 
26e30 72 65 61 64 4d 61 73 6b 29 21 3d 30 20 29 20 72  readMask)!=0 ) r
26e40 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53  eturn SQLITE_BUS
26e50 59 3b 0a 20 20 20 20 61 6c 6c 53 68 61 72 65 64  Y;.    allShared
26e60 20 7c 3d 20 70 58 2d 3e 73 68 61 72 65 64 4d 61   |= pX->sharedMa
26e70 73 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 47 65  sk;.  }..  /* Ge
26e80 74 20 73 68 61 72 65 64 20 6c 6f 63 6b 73 20 61  t shared locks a
26e90 74 20 74 68 65 20 73 79 73 74 65 6d 20 6c 65 76  t the system lev
26ea0 65 6c 2c 20 69 66 20 6e 65 63 65 73 73 61 72 79  el, if necessary
26eb0 20 2a 2f 0a 20 20 69 66 28 20 28 7e 61 6c 6c 53   */.  if( (~allS
26ec0 68 61 72 65 64 29 20 26 20 72 65 61 64 4d 61 73  hared) & readMas
26ed0 6b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 75 6e  k ){.    rc = un
26ee0 69 78 53 68 6d 53 79 73 74 65 6d 4c 6f 63 6b 28  ixShmSystemLock(
26ef0 70 46 69 6c 65 2c 20 46 5f 52 44 4c 43 4b 2c 20  pFile, F_RDLCK, 
26f00 72 65 61 64 4d 61 73 6b 29 3b 0a 20 20 7d 65 6c  readMask);.  }el
26f10 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c  se{.    rc = SQL
26f20 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 2f  ITE_OK;.  }..  /
26f30 2a 20 47 65 74 20 74 68 65 20 6c 6f 63 61 6c 20  * Get the local 
26f40 73 68 61 72 65 64 20 6c 6f 63 6b 73 20 2a 2f 0a  shared locks */.
26f50 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
26f60 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 2d 3e 73 68  _OK ){.    p->sh
26f70 61 72 65 64 4d 61 73 6b 20 7c 3d 20 72 65 61 64  aredMask |= read
26f80 4d 61 73 6b 3b 0a 20 20 7d 0a 20 20 72 65 74 75  Mask;.  }.  retu
26f90 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
26fa0 46 6f 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 70  For connection p
26fb0 2c 20 67 65 74 20 61 6e 20 65 78 63 6c 75 73 69  , get an exclusi
26fc0 76 65 20 6c 6f 63 6b 20 6f 6e 20 61 6c 6c 20 6c  ve lock on all l
26fd0 6f 63 6b 73 20 69 64 65 6e 74 69 66 69 65 64 20  ocks identified 
26fe0 69 6e 0a 2a 2a 20 74 68 65 20 77 72 69 74 65 4d  in.** the writeM
26ff0 61 73 6b 20 70 61 72 61 6d 65 74 65 72 2e 0a 2a  ask parameter..*
27000 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69  /.static int uni
27010 78 53 68 6d 45 78 63 6c 75 73 69 76 65 4c 6f 63  xShmExclusiveLoc
27020 6b 28 0a 20 20 75 6e 69 78 53 68 6d 46 69 6c 65  k(.  unixShmFile
27030 20 2a 70 46 69 6c 65 2c 20 20 20 20 2f 2a 20 54   *pFile,    /* T
27040 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 73 68  he underlying sh
27050 61 72 65 64 2d 6d 65 6d 6f 72 79 20 66 69 6c 65  ared-memory file
27060 20 2a 2f 0a 20 20 75 6e 69 78 53 68 6d 20 2a 70   */.  unixShm *p
27070 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
27080 54 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74  The connection t
27090 6f 20 67 65 74 20 74 68 65 20 65 78 63 6c 75 73  o get the exclus
270a0 69 76 65 20 6c 6f 63 6b 73 20 2a 2f 0a 20 20 75  ive locks */.  u
270b0 38 20 77 72 69 74 65 4d 61 73 6b 20 20 20 20 20  8 writeMask     
270c0 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66        /* Mask of
270d0 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 73   exclusive locks
270e0 20 74 6f 20 62 65 20 61 63 71 75 69 72 65 64 20   to be acquired 
270f0 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20  */.){.  int rc; 
27100 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74         /* Result
27110 20 63 6f 64 65 20 2a 2f 0a 20 20 75 6e 69 78 53   code */.  unixS
27120 68 6d 20 2a 70 58 3b 20 20 20 2f 2a 20 46 6f 72  hm *pX;   /* For
27130 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72 20 61 6c   looping over al
27140 6c 20 73 69 62 6c 69 6e 67 20 63 6f 6e 6e 65 63  l sibling connec
27150 74 69 6f 6e 73 20 2a 2f 0a 0a 20 20 2f 2a 20 41  tions */..  /* A
27160 63 63 65 73 73 20 74 6f 20 74 68 65 20 75 6e 69  ccess to the uni
27170 78 53 68 6d 46 69 6c 65 20 6f 62 6a 65 63 74 20  xShmFile object 
27180 69 73 20 73 65 72 69 61 6c 69 7a 65 64 20 62 79  is serialized by
27190 20 74 68 65 20 63 61 6c 6c 65 72 20 2a 2f 0a 20   the caller */. 
271a0 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
271b0 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 46 69 6c  _mutex_held(pFil
271c0 65 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 0a 20 20  e->mutex) );..  
271d0 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 6e 6f 20  /* Make sure no 
271e0 73 69 62 6c 69 6e 67 20 63 6f 6e 6e 65 63 74 69  sibling connecti
271f0 6f 6e 73 20 68 6f 6c 64 20 6c 6f 63 6b 73 20 74  ons hold locks t
27200 68 61 74 20 77 69 6c 6c 20 62 6c 6f 63 6b 20 74  hat will block t
27210 68 69 73 0a 20 20 2a 2a 20 6c 6f 63 6b 2e 20 20  his.  ** lock.  
27220 49 66 20 61 6e 79 20 64 6f 2c 20 72 65 74 75 72  If any do, retur
27230 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 20 72 69  n SQLITE_BUSY ri
27240 67 68 74 20 61 77 61 79 2e 0a 20 20 2a 2f 0a 20  ght away..  */. 
27250 20 66 6f 72 28 70 58 3d 70 46 69 6c 65 2d 3e 70   for(pX=pFile->p
27260 46 69 72 73 74 3b 20 70 58 3b 20 70 58 3d 70 58  First; pX; pX=pX
27270 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 69 66  ->pNext){.    if
27280 28 20 70 58 3d 3d 70 20 29 20 63 6f 6e 74 69 6e  ( pX==p ) contin
27290 75 65 3b 0a 20 20 20 20 69 66 28 20 28 70 58 2d  ue;.    if( (pX-
272a0 3e 65 78 63 6c 4d 61 73 6b 20 26 20 77 72 69 74  >exclMask & writ
272b0 65 4d 61 73 6b 29 21 3d 30 20 29 20 72 65 74 75  eMask)!=0 ) retu
272c0 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a  rn SQLITE_BUSY;.
272d0 20 20 20 20 69 66 28 20 28 70 58 2d 3e 73 68 61      if( (pX->sha
272e0 72 65 64 4d 61 73 6b 20 26 20 77 72 69 74 65 4d  redMask & writeM
272f0 61 73 6b 29 21 3d 30 20 29 20 72 65 74 75 72 6e  ask)!=0 ) return
27300 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20   SQLITE_BUSY;.  
27310 7d 0a 0a 20 20 2f 2a 20 47 65 74 20 74 68 65 20  }..  /* Get the 
27320 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 73 20  exclusive locks 
27330 61 74 20 74 68 65 20 73 79 73 74 65 6d 20 6c 65  at the system le
27340 76 65 6c 2e 20 20 54 68 65 6e 20 69 66 20 73 75  vel.  Then if su
27350 63 63 65 73 73 66 75 6c 0a 20 20 2a 2a 20 61 6c  ccessful.  ** al
27360 73 6f 20 6d 61 72 6b 20 74 68 65 20 6c 6f 63 61  so mark the loca
27370 6c 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 61 73 20  l connection as 
27380 62 65 69 6e 67 20 6c 6f 63 6b 65 64 2e 0a 20 20  being locked..  
27390 2a 2f 0a 20 20 72 63 20 3d 20 75 6e 69 78 53 68  */.  rc = unixSh
273a0 6d 53 79 73 74 65 6d 4c 6f 63 6b 28 70 46 69 6c  mSystemLock(pFil
273b0 65 2c 20 46 5f 57 52 4c 43 4b 2c 20 77 72 69 74  e, F_WRLCK, writ
273c0 65 4d 61 73 6b 29 3b 0a 20 20 69 66 28 20 72 63  eMask);.  if( rc
273d0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
273e0 20 20 20 70 2d 3e 73 68 61 72 65 64 4d 61 73 6b     p->sharedMask
273f0 20 26 3d 20 7e 77 72 69 74 65 4d 61 73 6b 3b 0a   &= ~writeMask;.
27400 20 20 20 20 70 2d 3e 65 78 63 6c 4d 61 73 6b 20      p->exclMask 
27410 7c 3d 20 77 72 69 74 65 4d 61 73 6b 3b 0a 20 20  |= writeMask;.  
27420 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
27430 0a 0a 2f 2a 0a 2a 2a 20 50 75 72 67 65 20 74 68  ../*.** Purge th
27440 65 20 75 6e 69 78 53 68 6d 46 69 6c 65 4c 69 73  e unixShmFileLis
27450 74 20 6c 69 73 74 20 6f 66 20 61 6c 6c 20 65 6e  t list of all en
27460 74 72 69 65 73 20 77 69 74 68 20 75 6e 69 78 53  tries with unixS
27470 68 6d 46 69 6c 65 2e 6e 52 65 66 3d 3d 30 2e 0a  hmFile.nRef==0..
27480 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 6e 6f  **.** This is no
27490 74 20 61 20 56 46 53 20 73 68 61 72 65 64 2d 6d  t a VFS shared-m
274a0 65 6d 6f 72 79 20 6d 65 74 68 6f 64 3b 20 69 74  emory method; it
274b0 20 69 73 20 61 20 75 74 69 6c 69 74 79 20 66 75   is a utility fu
274c0 6e 63 74 69 6f 6e 20 63 61 6c 6c 65 64 0a 2a 2a  nction called.**
274d0 20 62 79 20 56 46 53 20 73 68 61 72 65 64 2d 6d   by VFS shared-m
274e0 65 6d 6f 72 79 20 6d 65 74 68 6f 64 73 2e 0a 2a  emory methods..*
274f0 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 75 6e  /.static void un
27500 69 78 53 68 6d 50 75 72 67 65 28 76 6f 69 64 29  ixShmPurge(void)
27510 7b 0a 20 20 75 6e 69 78 53 68 6d 46 69 6c 65 20  {.  unixShmFile 
27520 2a 2a 70 70 3b 0a 20 20 75 6e 69 78 53 68 6d 46  **pp;.  unixShmF
27530 69 6c 65 20 2a 70 3b 0a 20 20 61 73 73 65 72 74  ile *p;.  assert
27540 28 20 75 6e 69 78 4d 75 74 65 78 48 65 6c 64 28  ( unixMutexHeld(
27550 29 20 29 3b 0a 20 20 70 70 20 3d 20 26 75 6e 69  ) );.  pp = &uni
27560 78 53 68 6d 46 69 6c 65 4c 69 73 74 3b 0a 20 20  xShmFileList;.  
27570 77 68 69 6c 65 28 20 28 70 20 3d 20 2a 70 70 29  while( (p = *pp)
27580 21 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 70  !=0 ){.    if( p
27590 2d 3e 6e 52 65 66 3d 3d 30 20 29 7b 0a 20 20 20  ->nRef==0 ){.   
275a0 20 20 20 69 66 28 20 70 2d 3e 6d 75 74 65 78 20     if( p->mutex 
275b0 29 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ) sqlite3_mutex_
275c0 66 72 65 65 28 70 2d 3e 6d 75 74 65 78 29 3b 0a  free(p->mutex);.
275d0 20 20 20 20 20 20 69 66 28 20 70 2d 3e 6d 75 74        if( p->mut
275e0 65 78 42 75 66 20 29 20 73 71 6c 69 74 65 33 5f  exBuf ) sqlite3_
275f0 6d 75 74 65 78 5f 66 72 65 65 28 70 2d 3e 6d 75  mutex_free(p->mu
27600 74 65 78 42 75 66 29 3b 0a 20 20 20 20 20 20 69  texBuf);.      i
27610 66 28 20 70 2d 3e 68 3e 3d 30 20 29 20 63 6c 6f  f( p->h>=0 ) clo
27620 73 65 28 70 2d 3e 68 29 3b 0a 20 20 20 20 20 20  se(p->h);.      
27630 2a 70 70 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a  *pp = p->pNext;.
27640 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
27650 65 65 28 70 29 3b 0a 20 20 20 20 7d 65 6c 73 65  ee(p);.    }else
27660 7b 0a 20 20 20 20 20 20 70 70 20 3d 20 26 70 2d  {.      pp = &p-
27670 3e 70 4e 65 78 74 3b 0a 20 20 20 20 7d 0a 20 20  >pNext;.    }.  
27680 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20  }.}../*.** Open 
27690 61 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20  a shared-memory 
276a0 61 72 65 61 2e 20 20 54 68 69 73 20 69 6d 70 6c  area.  This impl
276b0 65 6d 65 6e 74 61 74 69 6f 6e 20 75 73 65 73 20  ementation uses 
276c0 6d 6d 61 70 70 65 64 20 66 69 6c 65 73 2e 0a 2a  mmapped files..*
276d0 2a 0a 2a 2a 20 57 68 65 6e 20 6f 70 65 6e 69 6e  *.** When openin
276e0 67 20 61 20 6e 65 77 20 73 68 61 72 65 64 2d 6d  g a new shared-m
276f0 65 6d 6f 72 79 20 66 69 6c 65 2c 20 69 66 20 6e  emory file, if n
27700 6f 20 6f 74 68 65 72 20 69 6e 73 74 61 6e 63 65  o other instance
27710 73 20 6f 66 20 74 68 61 74 0a 2a 2a 20 66 69 6c  s of that.** fil
27720 65 20 61 72 65 20 63 75 72 72 65 6e 74 6c 79 20  e are currently 
27730 6f 70 65 6e 2c 20 69 6e 20 74 68 69 73 20 70 72  open, in this pr
27740 6f 63 65 73 73 20 6f 72 20 69 6e 20 6f 74 68 65  ocess or in othe
27750 72 20 70 72 6f 63 65 73 73 65 73 2c 20 74 68 65  r processes, the
27760 6e 0a 2a 2a 20 74 68 65 20 66 69 6c 65 20 6d 75  n.** the file mu
27770 73 74 20 62 65 20 74 72 75 6e 63 61 74 65 64 20  st be truncated 
27780 74 6f 20 7a 65 72 6f 20 6c 65 6e 67 74 68 20 6f  to zero length o
27790 72 20 68 61 76 65 20 69 74 73 20 68 65 61 64 65  r have its heade
277a0 72 20 63 6c 65 61 72 65 64 2e 0a 2a 2f 0a 73 74  r cleared..*/.st
277b0 61 74 69 63 20 69 6e 74 20 75 6e 69 78 53 68 6d  atic int unixShm
277c0 4f 70 65 6e 28 0a 20 20 73 71 6c 69 74 65 33 5f  Open(.  sqlite3_
277d0 76 66 73 20 2a 70 56 66 73 2c 20 20 20 20 2f 2a  vfs *pVfs,    /*
277e0 20 54 68 65 20 56 46 53 20 2a 2f 0a 20 20 63 6f   The VFS */.  co
277f0 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c  nst char *zName,
27800 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 66      /* Name of f
27810 69 6c 65 20 74 6f 20 6d 6d 61 70 20 2a 2f 0a 20  ile to mmap */. 
27820 20 73 71 6c 69 74 65 33 5f 73 68 6d 20 2a 2a 70   sqlite3_shm **p
27830 53 68 6d 20 20 20 20 2f 2a 20 57 72 69 74 65 20  Shm    /* Write 
27840 74 68 65 20 75 6e 69 78 53 68 6d 20 6f 62 6a 65  the unixShm obje
27850 63 74 20 63 72 65 61 74 65 64 20 68 65 72 65 20  ct created here 
27860 2a 2f 0a 29 7b 0a 20 20 73 74 72 75 63 74 20 75  */.){.  struct u
27870 6e 69 78 53 68 6d 20 2a 70 20 3d 20 30 3b 20 20  nixShm *p = 0;  
27880 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
27890 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20  e connection to 
278a0 62 65 20 6f 70 65 6e 65 64 20 2a 2f 0a 20 20 73  be opened */.  s
278b0 74 72 75 63 74 20 75 6e 69 78 53 68 6d 46 69 6c  truct unixShmFil
278c0 65 20 2a 70 46 69 6c 65 20 3d 20 30 3b 20 20 20  e *pFile = 0;   
278d0 20 20 2f 2a 20 54 68 65 20 75 6e 64 65 72 6c 79    /* The underly
278e0 69 6e 67 20 6d 6d 61 70 70 65 64 20 66 69 6c 65  ing mmapped file
278f0 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20   */.  int rc;   
27900 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27910 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75           /* Resu
27920 6c 74 20 63 6f 64 65 20 2a 2f 0a 20 20 73 74 72  lt code */.  str
27930 75 63 74 20 75 6e 69 78 46 69 6c 65 49 64 20 66  uct unixFileId f
27940 69 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  id;             
27950 2f 2a 20 55 6e 69 78 20 66 69 6c 65 20 69 64 65  /* Unix file ide
27960 6e 74 69 66 69 65 72 20 2a 2f 0a 20 20 73 74 72  ntifier */.  str
27970 75 63 74 20 73 74 61 74 20 73 53 74 61 74 3b 20  uct stat sStat; 
27980 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27990 2f 2a 20 52 65 73 75 6c 74 20 66 72 6f 6d 20 73  /* Result from s
279a0 74 61 74 28 29 20 61 6e 20 66 73 74 61 74 28 29  tat() an fstat()
279b0 20 2a 2f 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61   */..  /* Alloca
279c0 74 65 20 73 70 61 63 65 20 66 6f 72 20 74 68 65  te space for the
279d0 20 6e 65 77 20 73 71 6c 69 74 65 33 5f 73 68 6d   new sqlite3_shm
279e0 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 70 20 3d   object */.  p =
279f0 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28   sqlite3_malloc(
27a00 20 73 69 7a 65 6f 66 28 2a 70 29 20 29 3b 0a 20   sizeof(*p) );. 
27a10 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75   if( p==0 ) retu
27a20 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b  rn SQLITE_NOMEM;
27a30 0a 20 20 6d 65 6d 73 65 74 28 70 2c 20 30 2c 20  .  memset(p, 0, 
27a40 73 69 7a 65 6f 66 28 2a 70 29 29 3b 0a 0a 20 20  sizeof(*p));..  
27a50 2f 2a 20 4c 6f 6f 6b 20 74 6f 20 73 65 65 20 69  /* Look to see i
27a60 66 20 74 68 65 72 65 20 69 73 20 61 6e 20 65 78  f there is an ex
27a70 69 73 74 69 6e 67 20 75 6e 69 78 53 68 6d 46 69  isting unixShmFi
27a80 6c 65 20 74 68 61 74 20 63 61 6e 20 62 65 20 75  le that can be u
27a90 73 65 64 2e 0a 20 20 2a 2a 20 49 66 20 6e 6f 20  sed..  ** If no 
27aa0 6d 61 74 63 68 69 6e 67 20 75 6e 69 78 53 68 6d  matching unixShm
27ab0 46 69 6c 65 20 63 75 72 72 65 6e 74 6c 79 20 65  File currently e
27ac0 78 69 73 74 73 2c 20 63 72 65 61 74 65 20 61 20  xists, create a 
27ad0 6e 65 77 20 6f 6e 65 2e 0a 20 20 2a 2f 0a 20 20  new one..  */.  
27ae0 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29  unixEnterMutex()
27af0 3b 0a 20 20 72 63 20 3d 20 73 74 61 74 28 7a 4e  ;.  rc = stat(zN
27b00 61 6d 65 2c 20 26 73 53 74 61 74 29 3b 0a 20 20  ame, &sStat);.  
27b10 69 66 28 20 72 63 3d 3d 30 20 29 7b 0a 20 20 20  if( rc==0 ){.   
27b20 20 6d 65 6d 73 65 74 28 26 66 69 64 2c 20 30 2c   memset(&fid, 0,
27b30 20 73 69 7a 65 6f 66 28 66 69 64 29 29 3b 0a 20   sizeof(fid));. 
27b40 20 20 20 66 69 64 2e 64 65 76 20 3d 20 73 53 74     fid.dev = sSt
27b50 61 74 2e 73 74 5f 64 65 76 3b 0a 20 20 20 20 66  at.st_dev;.    f
27b60 69 64 2e 69 6e 6f 20 3d 20 73 53 74 61 74 2e 73  id.ino = sStat.s
27b70 74 5f 69 6e 6f 3b 0a 20 20 20 20 66 6f 72 28 70  t_ino;.    for(p
27b80 46 69 6c 65 20 3d 20 75 6e 69 78 53 68 6d 46 69  File = unixShmFi
27b90 6c 65 4c 69 73 74 3b 20 70 46 69 6c 65 3b 20 70  leList; pFile; p
27ba0 46 69 6c 65 3d 70 46 69 6c 65 2d 3e 70 4e 65 78  File=pFile->pNex
27bb0 74 29 7b 0a 20 20 20 20 20 20 69 66 28 20 6d 65  t){.      if( me
27bc0 6d 63 6d 70 28 26 70 46 69 6c 65 2d 3e 66 69 64  mcmp(&pFile->fid
27bd0 2c 20 26 66 69 64 2c 20 73 69 7a 65 6f 66 28 66  , &fid, sizeof(f
27be0 69 64 29 29 3d 3d 30 20 29 20 62 72 65 61 6b 3b  id))==0 ) break;
27bf0 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
27c00 20 70 46 69 6c 65 3d 3d 30 20 29 7b 0a 20 20 20   pFile==0 ){.   
27c10 20 69 6e 74 20 6e 4e 61 6d 65 20 3d 20 73 74 72   int nName = str
27c20 6c 65 6e 28 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  len(zName);.    
27c30 70 46 69 6c 65 20 3d 20 73 71 6c 69 74 65 33 5f  pFile = sqlite3_
27c40 6d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 2a  malloc( sizeof(*
27c50 70 46 69 6c 65 29 20 2b 20 6e 4e 61 6d 65 20 2b  pFile) + nName +
27c60 20 31 20 29 3b 0a 20 20 20 20 69 66 28 20 70 46   1 );.    if( pF
27c70 69 6c 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ile==0 ){.      
27c80 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  rc = SQLITE_NOME
27c90 4d 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 73 68  M;.      goto sh
27ca0 6d 5f 6f 70 65 6e 5f 65 72 72 3b 0a 20 20 20 20  m_open_err;.    
27cb0 7d 0a 20 20 20 20 6d 65 6d 73 65 74 28 70 46 69  }.    memset(pFi
27cc0 6c 65 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a 70  le, 0, sizeof(*p
27cd0 46 69 6c 65 29 29 3b 0a 20 20 20 20 70 46 69 6c  File));.    pFil
27ce0 65 2d 3e 7a 46 69 6c 65 6e 61 6d 65 20 3d 20 28  e->zFilename = (
27cf0 63 68 61 72 2a 29 26 70 46 69 6c 65 5b 31 5d 3b  char*)&pFile[1];
27d00 0a 20 20 20 20 6d 65 6d 63 70 79 28 70 46 69 6c  .    memcpy(pFil
27d10 65 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c 20 7a 4e  e->zFilename, zN
27d20 61 6d 65 2c 20 6e 4e 61 6d 65 2b 31 29 3b 0a 20  ame, nName+1);. 
27d30 20 20 20 70 46 69 6c 65 2d 3e 68 20 3d 20 2d 31     pFile->h = -1
27d40 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 70 4e 65  ;.    pFile->pNe
27d50 78 74 20 3d 20 75 6e 69 78 53 68 6d 46 69 6c 65  xt = unixShmFile
27d60 4c 69 73 74 3b 0a 20 20 20 20 75 6e 69 78 53 68  List;.    unixSh
27d70 6d 46 69 6c 65 4c 69 73 74 20 3d 20 70 46 69 6c  mFileList = pFil
27d80 65 3b 0a 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6d  e;..    pFile->m
27d90 75 74 65 78 20 3d 20 73 71 6c 69 74 65 33 5f 6d  utex = sqlite3_m
27da0 75 74 65 78 5f 61 6c 6c 6f 63 28 53 51 4c 49 54  utex_alloc(SQLIT
27db0 45 5f 4d 55 54 45 58 5f 46 41 53 54 29 3b 0a 20  E_MUTEX_FAST);. 
27dc0 20 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 6d 75     if( pFile->mu
27dd0 74 65 78 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  tex==0 ){.      
27de0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  rc = SQLITE_NOME
27df0 4d 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 73 68  M;.      goto sh
27e00 6d 5f 6f 70 65 6e 5f 65 72 72 3b 0a 20 20 20 20  m_open_err;.    
27e10 7d 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6d 75 74  }.    pFile->mut
27e20 65 78 42 75 66 20 3d 20 73 71 6c 69 74 65 33 5f  exBuf = sqlite3_
27e30 6d 75 74 65 78 5f 61 6c 6c 6f 63 28 53 51 4c 49  mutex_alloc(SQLI
27e40 54 45 5f 4d 55 54 45 58 5f 46 41 53 54 29 3b 0a  TE_MUTEX_FAST);.
27e50 20 20 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 6d      if( pFile->m
27e60 75 74 65 78 42 75 66 3d 3d 30 20 29 7b 0a 20 20  utexBuf==0 ){.  
27e70 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
27e80 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 67 6f 74  NOMEM;.      got
27e90 6f 20 73 68 6d 5f 6f 70 65 6e 5f 65 72 72 3b 0a  o shm_open_err;.
27ea0 20 20 20 20 7d 0a 0a 20 20 20 20 70 46 69 6c 65      }..    pFile
27eb0 2d 3e 68 20 3d 20 6f 70 65 6e 28 7a 4e 61 6d 65  ->h = open(zName
27ec0 2c 20 4f 5f 52 44 57 52 7c 4f 5f 43 52 45 41 54  , O_RDWR|O_CREAT
27ed0 2c 20 30 36 36 34 29 3b 0a 20 20 20 20 69 66 28  , 0664);.    if(
27ee0 20 70 46 69 6c 65 2d 3e 68 3c 30 20 29 7b 0a 20   pFile->h<0 ){. 
27ef0 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
27f00 5f 43 41 4e 54 4f 50 45 4e 5f 42 4b 50 54 3b 0a  _CANTOPEN_BKPT;.
27f10 20 20 20 20 20 20 67 6f 74 6f 20 73 68 6d 5f 6f        goto shm_o
27f20 70 65 6e 5f 65 72 72 3b 0a 20 20 20 20 7d 0a 0a  pen_err;.    }..
27f30 20 20 20 20 72 63 20 3d 20 66 73 74 61 74 28 70      rc = fstat(p
27f40 46 69 6c 65 2d 3e 68 2c 20 26 73 53 74 61 74 29  File->h, &sStat)
27f50 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a  ;.    if( rc ){.
27f60 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
27f70 45 5f 43 41 4e 54 4f 50 45 4e 5f 42 4b 50 54 3b  E_CANTOPEN_BKPT;
27f80 0a 20 20 20 20 20 20 67 6f 74 6f 20 73 68 6d 5f  .      goto shm_
27f90 6f 70 65 6e 5f 65 72 72 3b 0a 20 20 20 20 7d 0a  open_err;.    }.
27fa0 20 20 20 20 70 46 69 6c 65 2d 3e 66 69 64 2e 64      pFile->fid.d
27fb0 65 76 20 3d 20 73 53 74 61 74 2e 73 74 5f 64 65  ev = sStat.st_de
27fc0 76 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 66 69  v;.    pFile->fi
27fd0 64 2e 69 6e 6f 20 3d 20 73 53 74 61 74 2e 73 74  d.ino = sStat.st
27fe0 5f 69 6e 6f 3b 0a 0a 20 20 20 20 2f 2a 20 43 68  _ino;..    /* Ch
27ff0 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 61 6e  eck to see if an
28000 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20 69 73  other process is
28010 20 68 6f 6c 64 69 6e 67 20 74 68 65 20 64 65 61   holding the dea
28020 64 2d 6d 61 6e 20 73 77 69 74 63 68 2e 0a 20 20  d-man switch..  
28030 20 20 2a 2a 20 49 66 20 6e 6f 74 2c 20 74 72 75    ** If not, tru
28040 6e 63 61 74 65 20 74 68 65 20 66 69 6c 65 20 74  ncate the file t
28050 6f 20 7a 65 72 6f 20 6c 65 6e 67 74 68 2e 20 0a  o zero length. .
28060 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 75      */.    if( u
28070 6e 69 78 53 68 6d 53 79 73 74 65 6d 4c 6f 63 6b  nixShmSystemLock
28080 28 70 46 69 6c 65 2c 20 46 5f 57 52 4c 43 4b 2c  (pFile, F_WRLCK,
28090 20 55 4e 49 58 5f 53 48 4d 5f 4d 55 54 45 58 29   UNIX_SHM_MUTEX)
280a0 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53   ){.      rc = S
280b0 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b  QLITE_IOERR_LOCK
280c0 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 73 68 6d  ;.      goto shm
280d0 5f 6f 70 65 6e 5f 65 72 72 3b 0a 20 20 20 20 7d  _open_err;.    }
280e0 0a 20 20 20 20 69 66 28 20 75 6e 69 78 53 68 6d  .    if( unixShm
280f0 53 79 73 74 65 6d 4c 6f 63 6b 28 70 46 69 6c 65  SystemLock(pFile
28100 2c 20 46 5f 57 52 4c 43 4b 2c 20 55 4e 49 58 5f  , F_WRLCK, UNIX_
28110 53 48 4d 5f 44 4d 53 29 3d 3d 53 51 4c 49 54 45  SHM_DMS)==SQLITE
28120 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 69 66 28  _OK ){.      if(
28130 20 66 74 72 75 6e 63 61 74 65 28 70 46 69 6c 65   ftruncate(pFile
28140 2d 3e 68 2c 20 30 29 20 29 7b 0a 20 20 20 20 20  ->h, 0) ){.     
28150 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49     rc = SQLITE_I
28160 4f 45 52 52 3b 0a 20 20 20 20 20 20 7d 0a 20 20  OERR;.      }.  
28170 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d    }.    if( rc==
28180 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
28190 20 20 20 72 63 20 3d 20 75 6e 69 78 53 68 6d 53     rc = unixShmS
281a0 79 73 74 65 6d 4c 6f 63 6b 28 70 46 69 6c 65 2c  ystemLock(pFile,
281b0 20 46 5f 52 44 4c 43 4b 2c 20 55 4e 49 58 5f 53   F_RDLCK, UNIX_S
281c0 48 4d 5f 44 4d 53 29 3b 0a 20 20 20 20 7d 0a 20  HM_DMS);.    }. 
281d0 20 20 20 75 6e 69 78 53 68 6d 53 79 73 74 65 6d     unixShmSystem
281e0 4c 6f 63 6b 28 70 46 69 6c 65 2c 20 46 5f 55 4e  Lock(pFile, F_UN
281f0 4c 43 4b 2c 20 55 4e 49 58 5f 53 48 4d 5f 4d 55  LCK, UNIX_SHM_MU
28200 54 45 58 29 3b 0a 20 20 20 20 69 66 28 20 72 63  TEX);.    if( rc
28210 20 29 20 67 6f 74 6f 20 73 68 6d 5f 6f 70 65 6e   ) goto shm_open
28220 5f 65 72 72 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  _err;.  }..  /* 
28230 4d 61 6b 65 20 74 68 65 20 6e 65 77 20 63 6f 6e  Make the new con
28240 6e 65 63 74 69 6f 6e 20 61 20 63 68 69 6c 64 20  nection a child 
28250 6f 66 20 74 68 65 20 75 6e 69 78 53 68 6d 46 69  of the unixShmFi
28260 6c 65 20 2a 2f 0a 20 20 70 2d 3e 70 46 69 6c 65  le */.  p->pFile
28270 20 3d 20 70 46 69 6c 65 3b 0a 20 20 70 2d 3e 70   = pFile;.  p->p
28280 4e 65 78 74 20 3d 20 70 46 69 6c 65 2d 3e 70 46  Next = pFile->pF
28290 69 72 73 74 3b 0a 23 69 66 64 65 66 20 53 51 4c  irst;.#ifdef SQL
282a0 49 54 45 5f 44 45 42 55 47 0a 20 20 70 2d 3e 69  ITE_DEBUG.  p->i
282b0 64 20 3d 20 70 46 69 6c 65 2d 3e 6e 65 78 74 53  d = pFile->nextS
282c0 68 6d 49 64 2b 2b 3b 0a 23 65 6e 64 69 66 0a 20  hmId++;.#endif. 
282d0 20 70 46 69 6c 65 2d 3e 70 46 69 72 73 74 20 3d   pFile->pFirst =
282e0 20 70 3b 0a 20 20 70 46 69 6c 65 2d 3e 6e 52 65   p;.  pFile->nRe
282f0 66 2b 2b 3b 0a 20 20 2a 70 53 68 6d 20 3d 20 28  f++;.  *pShm = (
28300 73 71 6c 69 74 65 33 5f 73 68 6d 2a 29 70 3b 0a  sqlite3_shm*)p;.
28310 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78    unixLeaveMutex
28320 28 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  ();.  return SQL
28330 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 4a 75  ITE_OK;..  /* Ju
28340 6d 70 20 68 65 72 65 20 6f 6e 20 61 6e 79 20 65  mp here on any e
28350 72 72 6f 72 20 2a 2f 0a 73 68 6d 5f 6f 70 65 6e  rror */.shm_open
28360 5f 65 72 72 3a 0a 20 20 75 6e 69 78 53 68 6d 50  _err:.  unixShmP
28370 75 72 67 65 28 29 3b 0a 20 20 73 71 6c 69 74 65  urge();.  sqlite
28380 33 5f 66 72 65 65 28 70 29 3b 0a 20 20 73 71 6c  3_free(p);.  sql
28390 69 74 65 33 5f 66 72 65 65 28 70 46 69 6c 65 29  ite3_free(pFile)
283a0 3b 0a 20 20 2a 70 53 68 6d 20 3d 20 30 3b 0a 20  ;.  *pShm = 0;. 
283b0 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28   unixLeaveMutex(
283c0 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
283d0 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61  }../*.** Close a
283e0 20 63 6f 6e 6e 65 63 74 69 6f 6f 6e 20 74 6f 20   connectioon to 
283f0 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 2e 0a 2a  shared-memory..*
28400 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69  /.static int uni
28410 78 53 68 6d 43 6c 6f 73 65 28 73 71 6c 69 74 65  xShmClose(sqlite
28420 33 5f 73 68 6d 20 2a 70 53 68 61 72 65 64 4d 65  3_shm *pSharedMe
28430 6d 29 7b 0a 20 20 75 6e 69 78 53 68 6d 20 2a 70  m){.  unixShm *p
28440 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
28450 54 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74  The connection t
28460 6f 20 62 65 20 63 6c 6f 73 65 64 20 2a 2f 0a 20  o be closed */. 
28470 20 75 6e 69 78 53 68 6d 46 69 6c 65 20 2a 70 46   unixShmFile *pF
28480 69 6c 65 3b 20 20 20 20 2f 2a 20 54 68 65 20 75  ile;    /* The u
28490 6e 64 65 72 6c 79 69 6e 67 20 73 68 61 72 65 64  nderlying shared
284a0 2d 6d 65 6d 6f 72 79 20 66 69 6c 65 20 2a 2f 0a  -memory file */.
284b0 20 20 75 6e 69 78 53 68 6d 20 2a 2a 70 70 3b 20    unixShm **pp; 
284c0 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6f 72 20           /* For 
284d0 6c 6f 6f 70 69 6e 67 20 6f 76 65 72 20 73 69 62  looping over sib
284e0 6c 69 6e 67 20 63 6f 6e 6e 65 63 74 69 6f 6e 73  ling connections
284f0 20 2a 2f 0a 0a 20 20 69 66 28 20 70 53 68 61 72   */..  if( pShar
28500 65 64 4d 65 6d 3d 3d 30 20 29 20 72 65 74 75 72  edMem==0 ) retur
28510 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 70  n SQLITE_OK;.  p
28520 20 3d 20 28 73 74 72 75 63 74 20 75 6e 69 78 53   = (struct unixS
28530 68 6d 2a 29 70 53 68 61 72 65 64 4d 65 6d 3b 0a  hm*)pSharedMem;.
28540 20 20 70 46 69 6c 65 20 3d 20 70 2d 3e 70 46 69    pFile = p->pFi
28550 6c 65 3b 0a 0a 20 20 2f 2a 20 56 65 72 69 66 79  le;..  /* Verify
28560 20 74 68 61 74 20 74 68 65 20 63 6f 6e 6e 65 63   that the connec
28570 74 69 6f 6e 20 62 65 69 6e 67 20 63 6c 6f 73 65  tion being close
28580 64 20 68 6f 6c 64 73 20 6e 6f 20 6c 6f 63 6b 73  d holds no locks
28590 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 2d   */.  assert( p-
285a0 3e 65 78 63 6c 4d 61 73 6b 3d 3d 30 20 29 3b 0a  >exclMask==0 );.
285b0 20 20 61 73 73 65 72 74 28 20 70 2d 3e 73 68 61    assert( p->sha
285c0 72 65 64 4d 61 73 6b 3d 3d 30 20 29 3b 0a 0a 20  redMask==0 );.. 
285d0 20 2f 2a 20 52 65 6d 6f 76 65 20 63 6f 6e 6e 65   /* Remove conne
285e0 63 74 69 6f 6e 20 70 20 66 72 6f 6d 20 74 68 65  ction p from the
285f0 20 73 65 74 20 6f 66 20 63 6f 6e 6e 65 63 74 69   set of connecti
28600 6f 6e 73 20 61 73 73 6f 63 69 61 74 65 64 20 77  ons associated w
28610 69 74 68 20 70 46 69 6c 65 20 2a 2f 0a 20 20 73  ith pFile */.  s
28620 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74  qlite3_mutex_ent
28630 65 72 28 70 46 69 6c 65 2d 3e 6d 75 74 65 78 29  er(pFile->mutex)
28640 3b 0a 20 20 66 6f 72 28 70 70 3d 26 70 46 69 6c  ;.  for(pp=&pFil
28650 65 2d 3e 70 46 69 72 73 74 3b 20 28 2a 70 70 29  e->pFirst; (*pp)
28660 21 3d 70 3b 20 70 70 20 3d 20 26 28 2a 70 70 29  !=p; pp = &(*pp)
28670 2d 3e 70 4e 65 78 74 29 7b 7d 0a 20 20 2a 70 70  ->pNext){}.  *pp
28680 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a 0a 20 20   = p->pNext;..  
28690 2f 2a 20 46 72 65 65 20 74 68 65 20 63 6f 6e 6e  /* Free the conn
286a0 65 63 74 69 6f 6e 20 70 20 2a 2f 0a 20 20 73 71  ection p */.  sq
286b0 6c 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 20  lite3_free(p);. 
286c0 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c   sqlite3_mutex_l
286d0 65 61 76 65 28 70 46 69 6c 65 2d 3e 6d 75 74 65  eave(pFile->mute
286e0 78 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 70 46 69  x);..  /* If pFi
286f0 6c 65 2d 3e 6e 52 65 66 20 68 61 73 20 72 65 61  le->nRef has rea
28700 63 68 65 64 20 30 2c 20 74 68 65 6e 20 63 6c 6f  ched 0, then clo
28710 73 65 20 74 68 65 20 75 6e 64 65 72 6c 79 69 6e  se the underlyin
28720 67 0a 20 20 2a 2a 20 73 68 61 72 65 64 2d 6d 65  g.  ** shared-me
28730 6d 6f 72 79 20 66 69 6c 65 2c 20 74 6f 6f 20 2a  mory file, too *
28740 2f 0a 20 20 75 6e 69 78 45 6e 74 65 72 4d 75 74  /.  unixEnterMut
28750 65 78 28 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ex();.  assert( 
28760 70 46 69 6c 65 2d 3e 6e 52 65 66 3e 30 20 29 3b  pFile->nRef>0 );
28770 0a 20 20 70 46 69 6c 65 2d 3e 6e 52 65 66 2d 2d  .  pFile->nRef--
28780 3b 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 6e  ;.  if( pFile->n
28790 52 65 66 3d 3d 30 20 29 7b 0a 20 20 20 20 75 6e  Ref==0 ){.    un
287a0 69 78 53 68 6d 50 75 72 67 65 28 29 3b 0a 20 20  ixShmPurge();.  
287b0 7d 0a 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74  }.  unixLeaveMut
287c0 65 78 28 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20  ex();..  return 
287d0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
287e0 0a 2a 2a 20 51 75 65 72 79 20 61 6e 64 2f 6f 72  .** Query and/or
287f0 20 63 68 61 6e 67 65 73 20 74 68 65 20 73 69 7a   changes the siz
28800 65 20 6f 66 20 74 68 65 20 75 6e 64 65 72 6c 79  e of the underly
28810 69 6e 67 20 73 74 6f 72 61 67 65 20 66 6f 72 0a  ing storage for.
28820 2a 2a 20 61 20 73 68 61 72 65 64 2d 6d 65 6d 6f  ** a shared-memo
28830 72 79 20 73 65 67 6d 65 6e 74 2e 20 20 54 68 65  ry segment.  The
28840 20 72 65 71 53 69 7a 65 20 70 61 72 61 6d 65 74   reqSize paramet
28850 65 72 20 69 73 20 74 68 65 20 6e 65 77 20 73 69  er is the new si
28860 7a 65 0a 2a 2a 20 6f 66 20 74 68 65 20 75 6e 64  ze.** of the und
28870 65 72 6c 79 69 6e 67 20 73 74 6f 72 61 67 65 2c  erlying storage,
28880 20 6f 72 20 2d 31 20 74 6f 20 64 6f 20 6a 75 73   or -1 to do jus
28890 74 20 61 20 71 75 65 72 79 2e 20 20 54 68 65 20  t a query.  The 
288a0 73 69 7a 65 0a 2a 2a 20 6f 66 20 74 68 65 20 75  size.** of the u
288b0 6e 64 65 72 6c 79 69 6e 67 20 73 74 6f 72 61 67  nderlying storag
288c0 65 20 28 61 66 74 65 72 20 72 65 73 69 7a 69 6e  e (after resizin
288d0 67 20 69 66 20 72 65 73 69 7a 69 6e 67 20 6f 63  g if resizing oc
288e0 63 75 72 73 29 20 69 73 0a 2a 2a 20 77 72 69 74  curs) is.** writ
288f0 74 65 6e 20 69 6e 74 6f 20 70 4e 65 77 53 69 7a  ten into pNewSiz
28900 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  e..**.** This ro
28910 75 74 69 6e 65 20 64 6f 65 73 20 6e 6f 74 20 28  utine does not (
28920 6e 65 63 65 73 73 61 72 69 6c 79 29 20 63 68 61  necessarily) cha
28930 6e 67 65 20 74 68 65 20 73 69 7a 65 20 6f 66 20  nge the size of 
28940 74 68 65 20 6d 61 70 70 69 6e 67 20 0a 2a 2a 20  the mapping .** 
28950 6f 66 20 74 68 65 20 75 6e 64 65 72 6c 79 69 6e  of the underlyin
28960 67 20 73 74 6f 72 61 67 65 20 69 6e 74 6f 20 6d  g storage into m
28970 65 6d 6f 72 79 2e 20 20 55 73 65 20 78 53 68 6d  emory.  Use xShm
28980 47 65 74 28 29 20 74 6f 20 63 68 61 6e 67 65 0a  Get() to change.
28990 2a 2a 20 74 68 65 20 6d 61 70 70 69 6e 67 20 73  ** the mapping s
289a0 69 7a 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72  ize..**.** The r
289b0 65 71 53 69 7a 65 20 70 61 72 61 6d 65 74 65 72  eqSize parameter
289c0 20 69 73 20 74 68 65 20 6d 69 6e 69 6d 75 6d 20   is the minimum 
289d0 73 69 7a 65 20 72 65 71 75 65 73 74 65 64 2e 20  size requested. 
289e0 20 54 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74   The implementat
289f0 69 6f 6e 0a 2a 2a 20 69 73 20 66 72 65 65 20 74  ion.** is free t
28a00 6f 20 65 78 70 61 6e 64 20 74 68 65 20 73 74 6f  o expand the sto
28a10 72 61 67 65 20 74 6f 20 73 6f 6d 65 20 6c 61 72  rage to some lar
28a20 67 65 72 20 61 6d 6f 75 6e 74 20 69 66 20 69 74  ger amount if it
28a30 20 63 68 6f 6f 73 65 73 2e 0a 2a 2f 0a 73 74 61   chooses..*/.sta
28a40 74 69 63 20 69 6e 74 20 75 6e 69 78 53 68 6d 53  tic int unixShmS
28a50 69 7a 65 28 0a 20 20 73 71 6c 69 74 65 33 5f 73  ize(.  sqlite3_s
28a60 68 6d 20 2a 70 53 68 61 72 65 64 4d 65 6d 2c 20  hm *pSharedMem, 
28a70 20 2f 2a 20 50 6f 69 6e 74 65 72 20 72 65 74 75   /* Pointer retu
28a80 72 6e 65 64 20 62 79 20 75 6e 69 78 53 68 6d 4f  rned by unixShmO
28a90 70 65 6e 28 29 20 2a 2f 0a 20 20 69 6e 74 20 72  pen() */.  int r
28aa0 65 71 53 69 7a 65 2c 20 20 20 20 20 20 20 20 20  eqSize,         
28ab0 20 20 20 20 20 2f 2a 20 52 65 71 75 65 73 74 65       /* Requeste
28ac0 64 20 73 69 7a 65 2e 20 20 2d 31 20 66 6f 72 20  d size.  -1 for 
28ad0 71 75 65 72 79 20 6f 6e 6c 79 20 2a 2f 0a 20 20  query only */.  
28ae0 69 6e 74 20 2a 70 4e 65 77 53 69 7a 65 20 20 20  int *pNewSize   
28af0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69            /* Wri
28b00 74 65 20 6e 65 77 20 73 69 7a 65 20 68 65 72 65  te new size here
28b10 20 2a 2f 0a 29 7b 0a 20 20 75 6e 69 78 53 68 6d   */.){.  unixShm
28b20 20 2a 70 20 3d 20 28 75 6e 69 78 53 68 6d 2a 29   *p = (unixShm*)
28b30 70 53 68 61 72 65 64 4d 65 6d 3b 0a 20 20 75 6e  pSharedMem;.  un
28b40 69 78 53 68 6d 46 69 6c 65 20 2a 70 46 69 6c 65  ixShmFile *pFile
28b50 20 3d 20 70 2d 3e 70 46 69 6c 65 3b 0a 20 20 69   = p->pFile;.  i
28b60 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
28b70 4b 3b 0a 20 20 73 74 72 75 63 74 20 73 74 61 74  K;.  struct stat
28b80 20 73 53 74 61 74 3b 0a 0a 20 20 69 66 28 20 72   sStat;..  if( r
28b90 65 71 53 69 7a 65 3e 3d 30 20 29 7b 0a 20 20 20  eqSize>=0 ){.   
28ba0 20 72 65 71 53 69 7a 65 20 3d 20 28 72 65 71 53   reqSize = (reqS
28bb0 69 7a 65 20 2b 20 53 51 4c 49 54 45 5f 55 4e 49  ize + SQLITE_UNI
28bc0 58 5f 53 48 4d 5f 49 4e 43 52 20 2d 20 31 29 2f  X_SHM_INCR - 1)/
28bd0 53 51 4c 49 54 45 5f 55 4e 49 58 5f 53 48 4d 5f  SQLITE_UNIX_SHM_
28be0 49 4e 43 52 3b 0a 20 20 20 20 72 65 71 53 69 7a  INCR;.    reqSiz
28bf0 65 20 2a 3d 20 53 51 4c 49 54 45 5f 55 4e 49 58  e *= SQLITE_UNIX
28c00 5f 53 48 4d 5f 49 4e 43 52 3b 0a 20 20 20 20 72  _SHM_INCR;.    r
28c10 63 20 3d 20 66 74 72 75 6e 63 61 74 65 28 70 46  c = ftruncate(pF
28c20 69 6c 65 2d 3e 68 2c 20 72 65 71 53 69 7a 65 29  ile->h, reqSize)
28c30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 66 73 74 61  ;.  }.  if( fsta
28c40 74 28 70 46 69 6c 65 2d 3e 68 2c 20 26 73 53 74  t(pFile->h, &sSt
28c50 61 74 29 3d 3d 30 20 29 7b 0a 20 20 20 20 2a 70  at)==0 ){.    *p
28c60 4e 65 77 53 69 7a 65 20 3d 20 28 69 6e 74 29 73  NewSize = (int)s
28c70 53 74 61 74 2e 73 74 5f 73 69 7a 65 3b 0a 20 20  Stat.st_size;.  
28c80 7d 65 6c 73 65 7b 0a 20 20 20 20 2a 70 4e 65 77  }else{.    *pNew
28c90 53 69 7a 65 20 3d 20 30 3b 0a 20 20 20 20 72 63  Size = 0;.    rc
28ca0 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 3b   = SQLITE_IOERR;
28cb0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
28cc0 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 4d 61 70 20  ;.}.../*.** Map 
28cd0 74 68 65 20 73 68 61 72 65 64 20 73 74 6f 72 61  the shared stora
28ce0 67 65 20 69 6e 74 6f 20 6d 65 6d 6f 72 79 2e 20  ge into memory. 
28cf0 20 54 68 65 20 6d 69 6e 69 6d 75 6d 20 73 69 7a   The minimum siz
28d00 65 20 6f 66 20 74 68 65 0a 2a 2a 20 6d 61 70 70  e of the.** mapp
28d10 69 6e 67 20 73 68 6f 75 6c 64 20 62 65 20 72 65  ing should be re
28d20 71 4d 61 70 53 69 7a 65 20 69 66 20 72 65 71 4d  qMapSize if reqM
28d30 61 70 53 69 7a 65 20 69 73 20 70 6f 73 69 74 69  apSize is positi
28d40 76 65 2e 20 20 49 66 0a 2a 2a 20 72 65 71 4d 61  ve.  If.** reqMa
28d50 70 53 69 7a 65 20 69 73 20 7a 65 72 6f 20 6f 72  pSize is zero or
28d60 20 6e 65 67 61 74 69 76 65 2c 20 74 68 65 20 69   negative, the i
28d70 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 63 61  mplementation ca
28d80 6e 20 63 68 6f 6f 73 65 0a 2a 2a 20 77 68 61 74  n choose.** what
28d90 65 76 65 72 20 6d 61 70 70 69 6e 67 20 73 69 7a  ever mapping siz
28da0 65 20 69 73 20 63 6f 6e 76 65 6e 69 65 6e 74 2e  e is convenient.
28db0 0a 2a 2a 0a 2a 2a 20 2a 70 70 42 75 66 20 69 73  .**.** *ppBuf is
28dc0 20 6d 61 64 65 20 74 6f 20 70 6f 69 6e 74 20 74   made to point t
28dd0 6f 20 74 68 65 20 6d 65 6d 6f 72 79 20 77 68 69  o the memory whi
28de0 63 68 20 69 73 20 61 20 6d 61 70 70 69 6e 67 20  ch is a mapping 
28df0 6f 66 20 74 68 65 0a 2a 2a 20 75 6e 64 65 72 6c  of the.** underl
28e00 79 69 6e 67 20 73 74 6f 72 61 67 65 2e 20 20 41  ying storage.  A
28e10 20 6d 75 74 65 78 20 69 73 20 61 63 71 75 69 72   mutex is acquir
28e20 65 64 20 74 6f 20 70 72 65 76 65 6e 74 20 6f 74  ed to prevent ot
28e30 68 65 72 20 74 68 72 65 61 64 73 0a 2a 2a 20 66  her threads.** f
28e40 72 6f 6d 20 72 75 6e 6e 69 6e 67 20 77 68 69 6c  rom running whil
28e50 65 20 2a 70 70 42 75 66 20 69 73 20 69 6e 20 75  e *ppBuf is in u
28e60 73 65 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 70  se in order to p
28e70 72 65 76 65 6e 74 20 6f 74 68 65 72 20 74 68 72  revent other thr
28e80 65 61 64 73 0a 2a 2a 20 72 65 6d 61 70 70 69 6e  eads.** remappin
28e90 67 20 2a 70 70 42 75 66 20 6f 75 74 20 66 72 6f  g *ppBuf out fro
28ea0 6d 20 75 6e 64 65 72 20 74 68 69 73 20 74 68 72  m under this thr
28eb0 65 61 64 2e 20 20 54 68 65 20 75 6e 69 78 53 68  ead.  The unixSh
28ec0 6d 52 65 6c 65 61 73 65 28 29 0a 2a 2a 20 63 61  mRelease().** ca
28ed0 6c 6c 20 77 69 6c 6c 20 72 65 6c 65 61 73 65 20  ll will release 
28ee0 74 68 65 20 6d 75 74 65 78 2e 20 20 48 6f 77 65  the mutex.  Howe
28ef0 76 65 72 2c 20 69 66 20 74 68 65 20 6c 6f 63 6b  ver, if the lock
28f00 20 73 74 61 74 65 20 69 73 20 43 48 45 43 4b 50   state is CHECKP
28f10 4f 49 4e 54 2c 0a 2a 2a 20 74 68 65 20 6d 75 74  OINT,.** the mut
28f20 65 78 20 69 73 20 6e 6f 74 20 61 63 71 75 69 72  ex is not acquir
28f30 65 64 20 62 65 63 61 75 73 65 20 43 48 45 43 4b  ed because CHECK
28f40 50 4f 49 4e 54 20 77 69 6c 6c 20 6e 65 76 65 72  POINT will never
28f50 20 72 65 6d 61 70 20 74 68 65 0a 2a 2a 20 62 75   remap the.** bu
28f60 66 66 65 72 2e 20 20 52 45 43 4f 56 45 52 20 6d  ffer.  RECOVER m
28f70 69 67 68 74 20 72 65 6d 61 70 2c 20 74 68 6f 75  ight remap, thou
28f80 67 68 2c 20 73 6f 20 43 48 45 43 4b 50 4f 49 4e  gh, so CHECKPOIN
28f90 54 20 77 69 6c 6c 20 61 63 71 75 69 72 65 0a 2a  T will acquire.*
28fa0 2a 20 74 68 65 20 6d 75 74 65 78 20 69 66 20 61  * the mutex if a
28fb0 6e 64 20 77 68 65 6e 20 69 74 20 70 72 6f 6d 6f  nd when it promo
28fc0 74 65 73 20 74 6f 20 52 45 43 4f 56 45 52 2e 0a  tes to RECOVER..
28fd0 2a 2a 0a 2a 2a 20 52 45 43 4f 56 45 52 20 6e 65  **.** RECOVER ne
28fe0 65 64 73 20 74 6f 20 62 65 20 61 74 6f 6d 69 63  eds to be atomic
28ff0 2e 20 20 54 68 65 20 73 61 6d 65 20 6d 75 74 65  .  The same mute
29000 78 20 74 68 61 74 20 70 72 65 76 65 6e 74 73 20  x that prevents 
29010 2a 70 70 42 75 66 20 66 72 6f 6d 0a 2a 2a 20 62  *ppBuf from.** b
29020 65 69 6e 67 20 72 65 6d 61 70 70 65 64 20 61 6c  eing remapped al
29030 73 6f 20 70 72 65 76 65 6e 74 73 20 6d 6f 72 65  so prevents more
29040 20 74 68 61 6e 20 6f 6e 65 20 74 68 72 65 61 64   than one thread
29050 20 66 72 6f 6d 20 62 65 69 6e 67 20 69 6e 0a 2a   from being in.*
29060 2a 20 52 45 43 4f 56 45 52 20 61 74 20 61 20 74  * RECOVER at a t
29070 69 6d 65 2e 20 20 42 75 74 2c 20 52 45 43 4f 56  ime.  But, RECOV
29080 45 52 20 73 6f 6d 65 74 69 6d 65 73 20 77 61 6e  ER sometimes wan
29090 74 73 20 74 6f 20 72 65 6d 61 70 20 69 74 73 65  ts to remap itse
290a0 6c 66 2e 0a 2a 2a 20 54 6f 20 70 72 65 76 65 6e  lf..** To preven
290b0 74 20 52 45 43 4f 56 45 52 20 66 72 6f 6d 20 6c  t RECOVER from l
290c0 6f 73 69 6e 67 20 69 74 73 20 6c 6f 63 6b 20 77  osing its lock w
290d0 68 69 6c 65 20 72 65 6d 61 70 70 69 6e 67 2c 20  hile remapping, 
290e0 74 68 65 0a 2a 2a 20 6d 75 74 65 78 20 69 73 20  the.** mutex is 
290f0 6e 6f 74 20 72 65 6c 65 61 73 65 64 20 62 79 20  not released by 
29100 75 6e 69 78 53 68 6d 52 65 6c 65 61 73 65 28 29  unixShmRelease()
29110 20 77 68 65 6e 20 69 6e 20 52 45 43 4f 56 45 52   when in RECOVER
29120 2e 0a 2a 2a 0a 2a 2a 20 2a 70 4e 65 77 4d 61 70  ..**.** *pNewMap
29130 53 69 7a 65 20 69 73 20 73 65 74 20 74 6f 20 74  Size is set to t
29140 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 6d  he size of the m
29150 61 70 70 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 2a 70  apping..**.** *p
29160 70 42 75 66 20 61 6e 64 20 2a 70 4e 65 77 4d 61  pBuf and *pNewMa
29170 70 53 69 7a 65 20 6d 69 67 68 74 20 62 65 20 4e  pSize might be N
29180 55 4c 4c 20 61 6e 64 20 7a 65 72 6f 20 69 66 20  ULL and zero if 
29190 6e 6f 20 73 70 61 63 65 20 68 61 73 0a 2a 2a 20  no space has.** 
291a0 79 65 74 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74  yet been allocat
291b0 65 64 20 74 6f 20 74 68 65 20 75 6e 64 65 72 6c  ed to the underl
291c0 79 69 6e 67 20 73 74 6f 72 61 67 65 2e 0a 2a 2f  ying storage..*/
291d0 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78  .static int unix
291e0 53 68 6d 47 65 74 28 0a 20 20 73 71 6c 69 74 65  ShmGet(.  sqlite
291f0 33 5f 73 68 6d 20 2a 70 53 68 61 72 65 64 4d 65  3_shm *pSharedMe
29200 6d 2c 20 2f 2a 20 50 6f 69 6e 74 65 72 20 72 65  m, /* Pointer re
29210 74 75 72 6e 65 64 20 62 79 20 75 6e 69 78 53 68  turned by unixSh
29220 6d 4f 70 65 6e 28 29 20 2a 2f 0a 20 20 69 6e 74  mOpen() */.  int
29230 20 72 65 71 4d 61 70 53 69 7a 65 2c 20 20 20 20   reqMapSize,    
29240 20 20 20 20 20 20 2f 2a 20 52 65 71 75 65 73 74        /* Request
29250 65 64 20 73 69 7a 65 20 6f 66 20 6d 61 70 70 69  ed size of mappi
29260 6e 67 2e 20 2d 31 20 6d 65 61 6e 73 20 64 6f 6e  ng. -1 means don
29270 27 74 20 63 61 72 65 20 2a 2f 0a 20 20 69 6e 74  't care */.  int
29280 20 2a 70 4e 65 77 4d 61 70 53 69 7a 65 2c 20 20   *pNewMapSize,  
29290 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 6e        /* Write n
292a0 65 77 20 73 69 7a 65 20 6f 66 20 6d 61 70 70 69  ew size of mappi
292b0 6e 67 20 68 65 72 65 20 2a 2f 0a 20 20 76 6f 69  ng here */.  voi
292c0 64 20 2a 2a 70 70 42 75 66 20 20 20 20 20 20 20  d **ppBuf       
292d0 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 6d        /* Write m
292e0 61 70 70 69 6e 67 20 62 75 66 66 65 72 20 6f 72  apping buffer or
292f0 69 67 69 6e 20 68 65 72 65 20 2a 2f 0a 29 7b 0a  igin here */.){.
29300 20 20 75 6e 69 78 53 68 6d 20 2a 70 20 3d 20 28    unixShm *p = (
29310 75 6e 69 78 53 68 6d 2a 29 70 53 68 61 72 65 64  unixShm*)pShared
29320 4d 65 6d 3b 0a 20 20 75 6e 69 78 53 68 6d 46 69  Mem;.  unixShmFi
29330 6c 65 20 2a 70 46 69 6c 65 20 3d 20 70 2d 3e 70  le *pFile = p->p
29340 46 69 6c 65 3b 0a 20 20 69 6e 74 20 72 63 20 3d  File;.  int rc =
29350 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 69   SQLITE_OK;..  i
29360 66 28 20 70 2d 3e 6c 6f 63 6b 53 74 61 74 65 21  f( p->lockState!
29370 3d 53 51 4c 49 54 45 5f 53 48 4d 5f 43 48 45 43  =SQLITE_SHM_CHEC
29380 4b 50 4f 49 4e 54 20 26 26 20 70 2d 3e 68 61 73  KPOINT && p->has
29390 4d 75 74 65 78 42 75 66 3d 3d 30 20 29 7b 0a 20  MutexBuf==0 ){. 
293a0 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78     sqlite3_mutex
293b0 5f 65 6e 74 65 72 28 70 46 69 6c 65 2d 3e 6d 75  _enter(pFile->mu
293c0 74 65 78 42 75 66 29 3b 0a 20 20 20 20 70 2d 3e  texBuf);.    p->
293d0 68 61 73 4d 75 74 65 78 42 75 66 20 3d 20 31 3b  hasMutexBuf = 1;
293e0 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 6d  .  }.  sqlite3_m
293f0 75 74 65 78 5f 65 6e 74 65 72 28 70 46 69 6c 65  utex_enter(pFile
29400 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 69 66 28 20  ->mutex);.  if( 
29410 70 46 69 6c 65 2d 3e 73 7a 4d 61 70 3d 3d 30 20  pFile->szMap==0 
29420 7c 7c 20 72 65 71 4d 61 70 53 69 7a 65 3e 70 46  || reqMapSize>pF
29430 69 6c 65 2d 3e 73 7a 4d 61 70 20 29 7b 0a 20 20  ile->szMap ){.  
29440 20 20 69 6e 74 20 61 63 74 75 61 6c 53 69 7a 65    int actualSize
29450 3b 0a 20 20 20 20 69 66 28 20 75 6e 69 78 53 68  ;.    if( unixSh
29460 6d 53 69 7a 65 28 70 53 68 61 72 65 64 4d 65 6d  mSize(pSharedMem
29470 2c 20 2d 31 2c 20 26 61 63 74 75 61 6c 53 69 7a  , -1, &actualSiz
29480 65 29 3d 3d 53 51 4c 49 54 45 5f 4f 4b 0a 20 20  e)==SQLITE_OK.  
29490 20 20 20 26 26 20 72 65 71 4d 61 70 53 69 7a 65     && reqMapSize
294a0 3c 61 63 74 75 61 6c 53 69 7a 65 0a 20 20 20 20  <actualSize.    
294b0 29 7b 0a 20 20 20 20 20 20 72 65 71 4d 61 70 53  ){.      reqMapS
294c0 69 7a 65 20 3d 20 61 63 74 75 61 6c 53 69 7a 65  ize = actualSize
294d0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
294e0 70 46 69 6c 65 2d 3e 70 4d 4d 61 70 42 75 66 20  pFile->pMMapBuf 
294f0 29 7b 0a 20 20 20 20 20 20 6d 75 6e 6d 61 70 28  ){.      munmap(
29500 70 46 69 6c 65 2d 3e 70 4d 4d 61 70 42 75 66 2c  pFile->pMMapBuf,
29510 20 70 46 69 6c 65 2d 3e 73 7a 4d 61 70 29 3b 0a   pFile->szMap);.
29520 20 20 20 20 7d 0a 20 20 20 20 70 46 69 6c 65 2d      }.    pFile-
29530 3e 70 4d 4d 61 70 42 75 66 20 3d 20 6d 6d 61 70  >pMMapBuf = mmap
29540 28 30 2c 20 72 65 71 4d 61 70 53 69 7a 65 2c 20  (0, reqMapSize, 
29550 50 52 4f 54 5f 52 45 41 44 7c 50 52 4f 54 5f 57  PROT_READ|PROT_W
29560 52 49 54 45 2c 20 4d 41 50 5f 53 48 41 52 45 44  RITE, MAP_SHARED
29570 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
29580 20 20 20 20 20 20 20 20 20 20 20 20 20 70 46 69               pFi
29590 6c 65 2d 3e 68 2c 20 30 29 3b 0a 20 20 20 20 70  le->h, 0);.    p
295a0 46 69 6c 65 2d 3e 73 7a 4d 61 70 20 3d 20 70 46  File->szMap = pF
295b0 69 6c 65 2d 3e 70 4d 4d 61 70 42 75 66 20 3f 20  ile->pMMapBuf ? 
295c0 72 65 71 4d 61 70 53 69 7a 65 20 3a 20 30 3b 0a  reqMapSize : 0;.
295d0 20 20 7d 0a 20 20 2a 70 4e 65 77 4d 61 70 53 69    }.  *pNewMapSi
295e0 7a 65 20 3d 20 70 46 69 6c 65 2d 3e 73 7a 4d 61  ze = pFile->szMa
295f0 70 3b 0a 20 20 2a 70 70 42 75 66 20 3d 20 70 46  p;.  *ppBuf = pF
29600 69 6c 65 2d 3e 70 4d 4d 61 70 42 75 66 3b 0a 20  ile->pMMapBuf;. 
29610 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c   sqlite3_mutex_l
29620 65 61 76 65 28 70 46 69 6c 65 2d 3e 6d 75 74 65  eave(pFile->mute
29630 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  x);.  return rc;
29640 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73  .}../*.** Releas
29650 65 20 74 68 65 20 6c 6f 63 6b 20 68 65 6c 64 20  e the lock held 
29660 6f 6e 20 74 68 65 20 73 68 61 72 65 64 20 6d 65  on the shared me
29670 6d 6f 72 79 20 73 65 67 6d 65 6e 74 20 74 6f 20  mory segment to 
29680 74 68 61 74 20 6f 74 68 65 72 0a 2a 2a 20 74 68  that other.** th
29690 72 65 61 64 73 20 61 72 65 20 66 72 65 65 20 74  reads are free t
296a0 6f 20 72 65 73 69 7a 65 20 69 74 20 69 66 20 6e  o resize it if n
296b0 65 63 65 73 73 61 72 79 2e 0a 2a 2a 0a 2a 2a 20  ecessary..**.** 
296c0 49 66 20 74 68 65 20 6c 6f 63 6b 20 69 73 20 6e  If the lock is n
296d0 6f 74 20 63 75 72 72 65 6e 74 6c 79 20 68 65 6c  ot currently hel
296e0 64 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  d, this routine 
296f0 69 73 20 61 20 68 61 72 6d 6c 65 73 73 20 6e 6f  is a harmless no
29700 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  -op..**.** If th
29710 65 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20  e shared-memory 
29720 6f 62 6a 65 63 74 20 69 73 20 69 6e 20 6c 6f 63  object is in loc
29730 6b 20 73 74 61 74 65 20 52 45 43 4f 56 45 52 2c  k state RECOVER,
29740 20 74 68 65 6e 20 77 65 20 64 6f 20 6e 6f 74 0a   then we do not.
29750 2a 2a 20 72 65 61 6c 6c 79 20 77 61 6e 74 20 74  ** really want t
29760 6f 20 72 65 6c 65 61 73 65 20 74 68 65 20 6c 6f  o release the lo
29770 63 6b 2c 20 73 6f 20 69 6e 20 74 68 61 74 20 63  ck, so in that c
29780 61 73 65 20 74 6f 6f 2c 20 74 68 69 73 20 72 6f  ase too, this ro
29790 75 74 69 6e 65 0a 2a 2a 20 69 73 20 61 20 6e 6f  utine.** is a no
297a0 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  -op..*/.static i
297b0 6e 74 20 75 6e 69 78 53 68 6d 52 65 6c 65 61 73  nt unixShmReleas
297c0 65 28 73 71 6c 69 74 65 33 5f 73 68 6d 20 2a 70  e(sqlite3_shm *p
297d0 53 68 61 72 65 64 4d 65 6d 29 7b 0a 20 20 75 6e  SharedMem){.  un
297e0 69 78 53 68 6d 20 2a 70 20 3d 20 28 75 6e 69 78  ixShm *p = (unix
297f0 53 68 6d 2a 29 70 53 68 61 72 65 64 4d 65 6d 3b  Shm*)pSharedMem;
29800 0a 20 20 69 66 28 20 70 2d 3e 68 61 73 4d 75 74  .  if( p->hasMut
29810 65 78 42 75 66 20 26 26 20 70 2d 3e 6c 6f 63 6b  exBuf && p->lock
29820 53 74 61 74 65 21 3d 53 51 4c 49 54 45 5f 53 48  State!=SQLITE_SH
29830 4d 5f 52 45 43 4f 56 45 52 20 29 7b 0a 20 20 20  M_RECOVER ){.   
29840 20 75 6e 69 78 53 68 6d 46 69 6c 65 20 2a 70 46   unixShmFile *pF
29850 69 6c 65 20 3d 20 70 2d 3e 70 46 69 6c 65 3b 0a  ile = p->pFile;.
29860 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65      sqlite3_mute
29870 78 5f 6c 65 61 76 65 28 70 46 69 6c 65 2d 3e 6d  x_leave(pFile->m
29880 75 74 65 78 42 75 66 29 3b 0a 20 20 20 20 70 2d  utexBuf);.    p-
29890 3e 68 61 73 4d 75 74 65 78 42 75 66 20 3d 20 30  >hasMutexBuf = 0
298a0 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53  ;.  }.  return S
298b0 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
298c0 2a 2a 20 53 79 6d 62 6f 6c 69 63 20 6e 61 6d 65  ** Symbolic name
298d0 73 20 66 6f 72 20 4c 4f 43 4b 20 73 74 61 74 65  s for LOCK state
298e0 73 20 75 73 65 64 20 66 6f 72 20 64 65 62 75 67  s used for debug
298f0 67 69 6e 67 2e 0a 2a 2f 0a 23 69 66 64 65 66 20  ging..*/.#ifdef 
29900 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 73 74 61  SQLITE_DEBUG.sta
29910 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  tic const char *
29920 61 7a 4c 6b 4e 61 6d 65 5b 5d 20 3d 20 7b 0a 20  azLkName[] = {. 
29930 20 22 55 4e 4c 4f 43 4b 22 2c 0a 20 20 22 52 45   "UNLOCK",.  "RE
29940 41 44 22 2c 0a 20 20 22 52 45 41 44 5f 46 55 4c  AD",.  "READ_FUL
29950 4c 22 2c 0a 20 20 22 57 52 49 54 45 22 2c 0a 20  L",.  "WRITE",. 
29960 20 22 50 45 4e 44 49 4e 47 22 2c 0a 20 20 22 43   "PENDING",.  "C
29970 48 45 43 4b 50 4f 49 4e 54 22 2c 0a 20 20 22 52  HECKPOINT",.  "R
29980 45 43 4f 56 45 52 22 0a 7d 3b 0a 23 65 6e 64 69  ECOVER".};.#endi
29990 66 0a 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65  f.../*.** Change
299a0 20 74 68 65 20 6c 6f 63 6b 20 73 74 61 74 65 20   the lock state 
299b0 66 6f 72 20 61 20 73 68 61 72 65 64 2d 6d 65 6d  for a shared-mem
299c0 6f 72 79 20 73 65 67 6d 65 6e 74 2e 0a 2a 2f 0a  ory segment..*/.
299d0 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 53  static int unixS
299e0 68 6d 4c 6f 63 6b 28 0a 20 20 73 71 6c 69 74 65  hmLock(.  sqlite
299f0 33 5f 73 68 6d 20 2a 70 53 68 61 72 65 64 4d 65  3_shm *pSharedMe
29a00 6d 2c 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20  m,   /* Pointer 
29a10 66 72 6f 6d 20 75 6e 69 78 53 68 6d 4f 70 65 6e  from unixShmOpen
29a20 28 29 20 2a 2f 0a 20 20 69 6e 74 20 64 65 73 69  () */.  int desi
29a30 72 65 64 4c 6f 63 6b 2c 20 20 20 20 20 20 20 20  redLock,        
29a40 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 53 51 4c     /* One of SQL
29a50 49 54 45 5f 53 48 4d 5f 78 78 78 78 78 20 6c 6f  ITE_SHM_xxxxx lo
29a60 63 6b 69 6e 67 20 73 74 61 74 65 73 20 2a 2f 0a  cking states */.
29a70 20 20 69 6e 74 20 2a 70 47 6f 74 4c 6f 63 6b 20    int *pGotLock 
29a80 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
29a90 54 68 65 20 6c 6f 63 6b 20 79 6f 75 20 61 63 74  The lock you act
29aa0 75 61 6c 6c 79 20 67 6f 74 20 2a 2f 0a 29 7b 0a  ually got */.){.
29ab0 20 20 75 6e 69 78 53 68 6d 20 2a 70 20 3d 20 28    unixShm *p = (
29ac0 75 6e 69 78 53 68 6d 2a 29 70 53 68 61 72 65 64  unixShm*)pShared
29ad0 4d 65 6d 3b 0a 20 20 75 6e 69 78 53 68 6d 46 69  Mem;.  unixShmFi
29ae0 6c 65 20 2a 70 46 69 6c 65 20 3d 20 70 2d 3e 70  le *pFile = p->p
29af0 46 69 6c 65 3b 0a 20 20 69 6e 74 20 72 63 20 3d  File;.  int rc =
29b00 20 53 51 4c 49 54 45 5f 50 52 4f 54 4f 43 4f 4c   SQLITE_PROTOCOL
29b10 3b 0a 0a 20 20 2f 2a 20 4e 6f 74 65 20 74 68 61  ;..  /* Note tha
29b20 74 20 53 51 4c 49 54 45 5f 53 48 4d 5f 52 45 41  t SQLITE_SHM_REA
29b30 44 5f 46 55 4c 4c 20 61 6e 64 20 53 51 4c 49 54  D_FULL and SQLIT
29b40 45 5f 53 48 4d 5f 50 45 4e 44 49 4e 47 20 61 72  E_SHM_PENDING ar
29b50 65 20 6e 65 76 65 72 0a 20 20 2a 2a 20 64 69 72  e never.  ** dir
29b60 65 63 74 6c 79 20 72 65 71 75 65 73 74 65 64 3b  ectly requested;
29b70 20 74 68 65 79 20 61 72 65 20 73 69 64 65 20 65   they are side e
29b80 66 66 65 63 74 73 20 66 72 6f 6d 20 72 65 71 75  ffects from requ
29b90 65 73 74 69 6e 67 0a 20 20 2a 2a 20 53 51 4c 49  esting.  ** SQLI
29ba0 54 45 5f 53 48 4d 5f 52 45 41 44 20 61 6e 64 20  TE_SHM_READ and 
29bb0 53 51 4c 49 54 45 5f 53 48 4d 5f 43 48 45 43 4b  SQLITE_SHM_CHECK
29bc0 50 4f 49 4e 54 2c 20 72 65 73 70 65 63 74 69 76  POINT, respectiv
29bd0 65 6c 79 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65  ely..  */.  asse
29be0 72 74 28 20 64 65 73 69 72 65 64 4c 6f 63 6b 3d  rt( desiredLock=
29bf0 3d 53 51 4c 49 54 45 5f 53 48 4d 5f 51 55 45 52  =SQLITE_SHM_QUER
29c00 59 0a 20 20 20 20 20 20 20 7c 7c 20 64 65 73 69  Y.       || desi
29c10 72 65 64 4c 6f 63 6b 3d 3d 53 51 4c 49 54 45 5f  redLock==SQLITE_
29c20 53 48 4d 5f 55 4e 4c 4f 43 4b 0a 20 20 20 20 20  SHM_UNLOCK.     
29c30 20 20 7c 7c 20 64 65 73 69 72 65 64 4c 6f 63 6b    || desiredLock
29c40 3d 3d 53 51 4c 49 54 45 5f 53 48 4d 5f 52 45 41  ==SQLITE_SHM_REA
29c50 44 0a 20 20 20 20 20 20 20 7c 7c 20 64 65 73 69  D.       || desi
29c60 72 65 64 4c 6f 63 6b 3d 3d 53 51 4c 49 54 45 5f  redLock==SQLITE_
29c70 53 48 4d 5f 57 52 49 54 45 0a 20 20 20 20 20 20  SHM_WRITE.      
29c80 20 7c 7c 20 64 65 73 69 72 65 64 4c 6f 63 6b 3d   || desiredLock=
29c90 3d 53 51 4c 49 54 45 5f 53 48 4d 5f 43 48 45 43  =SQLITE_SHM_CHEC
29ca0 4b 50 4f 49 4e 54 0a 20 20 20 20 20 20 20 7c 7c  KPOINT.       ||
29cb0 20 64 65 73 69 72 65 64 4c 6f 63 6b 3d 3d 53 51   desiredLock==SQ
29cc0 4c 49 54 45 5f 53 48 4d 5f 52 45 43 4f 56 45 52  LITE_SHM_RECOVER
29cd0 20 29 3b 0a 0a 20 20 2f 2a 20 52 65 74 75 72 6e   );..  /* Return
29ce0 20 64 69 72 65 63 74 6c 79 20 69 66 20 74 68 69   directly if thi
29cf0 73 20 69 73 20 6a 75 73 74 20 61 20 6c 6f 63 6b  s is just a lock
29d00 20 73 74 61 74 65 20 71 75 65 72 79 2c 20 6f 72   state query, or
29d10 20 69 66 0a 20 20 2a 2a 20 74 68 65 20 63 6f 6e   if.  ** the con
29d20 6e 65 63 74 69 6f 6e 20 69 73 20 61 6c 72 65 61  nection is alrea
29d30 64 79 20 69 6e 20 74 68 65 20 64 65 73 69 72 65  dy in the desire
29d40 64 20 6c 6f 63 6b 69 6e 67 20 73 74 61 74 65 2e  d locking state.
29d50 0a 20 20 2a 2f 0a 20 20 69 66 28 20 64 65 73 69  .  */.  if( desi
29d60 72 65 64 4c 6f 63 6b 3d 3d 53 51 4c 49 54 45 5f  redLock==SQLITE_
29d70 53 48 4d 5f 51 55 45 52 59 0a 20 20 20 7c 7c 20  SHM_QUERY.   || 
29d80 64 65 73 69 72 65 64 4c 6f 63 6b 3d 3d 70 2d 3e  desiredLock==p->
29d90 6c 6f 63 6b 53 74 61 74 65 0a 20 20 20 7c 7c 20  lockState.   || 
29da0 28 64 65 73 69 72 65 64 4c 6f 63 6b 3d 3d 53 51  (desiredLock==SQ
29db0 4c 49 54 45 5f 53 48 4d 5f 52 45 41 44 20 26 26  LITE_SHM_READ &&
29dc0 20 70 2d 3e 6c 6f 63 6b 53 74 61 74 65 3d 3d 53   p->lockState==S
29dd0 51 4c 49 54 45 5f 53 48 4d 5f 52 45 41 44 5f 46  QLITE_SHM_READ_F
29de0 55 4c 4c 29 0a 20 20 29 7b 0a 20 20 20 20 4f 53  ULL).  ){.    OS
29df0 54 52 41 43 45 28 28 22 53 48 4d 2d 4c 4f 43 4b  TRACE(("SHM-LOCK
29e00 20 73 68 6d 69 64 2d 25 64 2c 20 70 69 64 2d 25   shmid-%d, pid-%
29e10 64 20 72 65 71 75 65 73 74 20 25 73 20 61 6e 64  d request %s and
29e20 20 67 6f 74 20 25 73 5c 6e 22 2c 0a 20 20 20 20   got %s\n",.    
29e30 20 20 20 20 20 20 20 20 20 70 2d 3e 69 64 2c 20           p->id, 
29e40 67 65 74 70 69 64 28 29 2c 20 61 7a 4c 6b 4e 61  getpid(), azLkNa
29e50 6d 65 5b 64 65 73 69 72 65 64 4c 6f 63 6b 5d 2c  me[desiredLock],
29e60 20 61 7a 4c 6b 4e 61 6d 65 5b 70 2d 3e 6c 6f 63   azLkName[p->loc
29e70 6b 53 74 61 74 65 5d 29 29 3b 0a 20 20 20 20 69  kState]));.    i
29e80 66 28 20 70 47 6f 74 4c 6f 63 6b 20 29 20 2a 70  f( pGotLock ) *p
29e90 47 6f 74 4c 6f 63 6b 20 3d 20 70 2d 3e 6c 6f 63  GotLock = p->loc
29ea0 6b 53 74 61 74 65 3b 0a 20 20 20 20 72 65 74 75  kState;.    retu
29eb0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
29ec0 7d 0a 0a 20 20 4f 53 54 52 41 43 45 28 28 22 53  }..  OSTRACE(("S
29ed0 48 4d 2d 4c 4f 43 4b 20 73 68 6d 69 64 2d 25 64  HM-LOCK shmid-%d
29ee0 2c 20 70 69 64 2d 25 64 20 72 65 71 75 65 73 74  , pid-%d request
29ef0 20 25 73 2d 3e 25 73 5c 6e 22 2c 0a 20 20 20 20   %s->%s\n",.    
29f00 20 20 20 20 20 20 20 20 70 2d 3e 69 64 2c 20 67          p->id, g
29f10 65 74 70 69 64 28 29 2c 20 61 7a 4c 6b 4e 61 6d  etpid(), azLkNam
29f20 65 5b 70 2d 3e 6c 6f 63 6b 53 74 61 74 65 5d 2c  e[p->lockState],
29f30 20 61 7a 4c 6b 4e 61 6d 65 5b 64 65 73 69 72 65   azLkName[desire
29f40 64 4c 6f 63 6b 5d 29 29 3b 0a 20 20 0a 20 20 69  dLock]));.  .  i
29f50 66 28 20 64 65 73 69 72 65 64 4c 6f 63 6b 3d 3d  f( desiredLock==
29f60 53 51 4c 49 54 45 5f 53 48 4d 5f 52 45 43 4f 56  SQLITE_SHM_RECOV
29f70 45 52 20 26 26 20 21 70 2d 3e 68 61 73 4d 75 74  ER && !p->hasMut
29f80 65 78 42 75 66 20 29 7b 0a 20 20 20 20 73 71 6c  exBuf ){.    sql
29f90 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72  ite3_mutex_enter
29fa0 28 70 46 69 6c 65 2d 3e 6d 75 74 65 78 42 75 66  (pFile->mutexBuf
29fb0 29 3b 0a 20 20 20 20 70 2d 3e 68 61 73 4d 75 74  );.    p->hasMut
29fc0 65 78 42 75 66 20 3d 20 31 3b 0a 20 20 7d 0a 20  exBuf = 1;.  }. 
29fd0 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65   sqlite3_mutex_e
29fe0 6e 74 65 72 28 70 46 69 6c 65 2d 3e 6d 75 74 65  nter(pFile->mute
29ff0 78 29 3b 0a 20 20 73 77 69 74 63 68 28 20 64 65  x);.  switch( de
2a000 73 69 72 65 64 4c 6f 63 6b 20 29 7b 0a 20 20 20  siredLock ){.   
2a010 20 63 61 73 65 20 53 51 4c 49 54 45 5f 53 48 4d   case SQLITE_SHM
2a020 5f 55 4e 4c 4f 43 4b 3a 20 7b 0a 20 20 20 20 20  _UNLOCK: {.     
2a030 20 61 73 73 65 72 74 28 20 70 2d 3e 6c 6f 63 6b   assert( p->lock
2a040 53 74 61 74 65 21 3d 53 51 4c 49 54 45 5f 53 48  State!=SQLITE_SH
2a050 4d 5f 52 45 43 4f 56 45 52 20 29 3b 0a 20 20 20  M_RECOVER );.   
2a060 20 20 20 75 6e 69 78 53 68 6d 55 6e 6c 6f 63 6b     unixShmUnlock
2a070 28 70 46 69 6c 65 2c 20 70 2c 20 55 4e 49 58 5f  (pFile, p, UNIX_
2a080 53 48 4d 5f 41 7c 55 4e 49 58 5f 53 48 4d 5f 42  SHM_A|UNIX_SHM_B
2a090 7c 55 4e 49 58 5f 53 48 4d 5f 43 7c 55 4e 49 58  |UNIX_SHM_C|UNIX
2a0a0 5f 53 48 4d 5f 44 29 3b 0a 20 20 20 20 20 20 72  _SHM_D);.      r
2a0b0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
2a0c0 20 20 20 20 20 70 2d 3e 6c 6f 63 6b 53 74 61 74       p->lockStat
2a0d0 65 20 3d 20 53 51 4c 49 54 45 5f 53 48 4d 5f 55  e = SQLITE_SHM_U
2a0e0 4e 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 62 72 65  NLOCK;.      bre
2a0f0 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
2a100 73 65 20 53 51 4c 49 54 45 5f 53 48 4d 5f 52 45  se SQLITE_SHM_RE
2a110 41 44 3a 20 7b 0a 20 20 20 20 20 20 69 66 28 20  AD: {.      if( 
2a120 70 2d 3e 6c 6f 63 6b 53 74 61 74 65 3d 3d 53 51  p->lockState==SQ
2a130 4c 49 54 45 5f 53 48 4d 5f 55 4e 4c 4f 43 4b 20  LITE_SHM_UNLOCK 
2a140 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e  ){.        int n
2a150 41 74 74 65 6d 70 74 3b 0a 20 20 20 20 20 20 20  Attempt;.       
2a160 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53   rc = SQLITE_BUS
2a170 59 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  Y;.        asser
2a180 74 28 20 70 2d 3e 6c 6f 63 6b 53 74 61 74 65 3d  t( p->lockState=
2a190 3d 53 51 4c 49 54 45 5f 53 48 4d 5f 55 4e 4c 4f  =SQLITE_SHM_UNLO
2a1a0 43 4b 20 29 3b 0a 20 20 20 20 20 20 20 20 66 6f  CK );.        fo
2a1b0 72 28 6e 41 74 74 65 6d 70 74 3d 30 3b 20 6e 41  r(nAttempt=0; nA
2a1c0 74 74 65 6d 70 74 3c 35 20 26 26 20 72 63 3d 3d  ttempt<5 && rc==
2a1d0 53 51 4c 49 54 45 5f 42 55 53 59 3b 20 6e 41 74  SQLITE_BUSY; nAt
2a1e0 74 65 6d 70 74 2b 2b 29 7b 0a 20 20 20 20 20 20  tempt++){.      
2a1f0 20 20 20 20 72 63 20 3d 20 75 6e 69 78 53 68 6d      rc = unixShm
2a200 53 68 61 72 65 64 4c 6f 63 6b 28 70 46 69 6c 65  SharedLock(pFile
2a210 2c 20 70 2c 20 55 4e 49 58 5f 53 48 4d 5f 41 7c  , p, UNIX_SHM_A|
2a220 55 4e 49 58 5f 53 48 4d 5f 42 29 3b 0a 20 20 20  UNIX_SHM_B);.   
2a230 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53         if( rc==S
2a240 51 4c 49 54 45 5f 42 55 53 59 20 29 7b 0a 20 20  QLITE_BUSY ){.  
2a250 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 75            rc = u
2a260 6e 69 78 53 68 6d 53 68 61 72 65 64 4c 6f 63 6b  nixShmSharedLock
2a270 28 70 46 69 6c 65 2c 20 70 2c 20 55 4e 49 58 5f  (pFile, p, UNIX_
2a280 53 48 4d 5f 44 29 3b 0a 20 20 20 20 20 20 20 20  SHM_D);.        
2a290 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
2a2a0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
2a2b0 20 20 20 20 20 20 20 70 2d 3e 6c 6f 63 6b 53 74         p->lockSt
2a2c0 61 74 65 20 3d 20 70 2d 3e 72 65 61 64 4c 6f 63  ate = p->readLoc
2a2d0 6b 20 3d 20 53 51 4c 49 54 45 5f 53 48 4d 5f 52  k = SQLITE_SHM_R
2a2e0 45 41 44 5f 46 55 4c 4c 3b 0a 20 20 20 20 20 20  EAD_FULL;.      
2a2f0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
2a300 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
2a310 20 20 20 20 20 75 6e 69 78 53 68 6d 55 6e 6c 6f       unixShmUnlo
2a320 63 6b 28 70 46 69 6c 65 2c 20 70 2c 20 55 4e 49  ck(pFile, p, UNI
2a330 58 5f 53 48 4d 5f 42 29 3b 0a 20 20 20 20 20 20  X_SHM_B);.      
2a340 20 20 20 20 20 20 70 2d 3e 6c 6f 63 6b 53 74 61        p->lockSta
2a350 74 65 20 3d 20 70 2d 3e 72 65 61 64 4c 6f 63 6b  te = p->readLock
2a360 20 3d 20 53 51 4c 49 54 45 5f 53 48 4d 5f 52 45   = SQLITE_SHM_RE
2a370 41 44 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  AD;.          }.
2a380 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2a390 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e 6c 6f 63  }else if( p->loc
2a3a0 6b 53 74 61 74 65 3d 3d 53 51 4c 49 54 45 5f 53  kState==SQLITE_S
2a3b0 48 4d 5f 57 52 49 54 45 20 29 7b 0a 20 20 20 20  HM_WRITE ){.    
2a3c0 20 20 20 20 72 63 20 3d 20 75 6e 69 78 53 68 6d      rc = unixShm
2a3d0 53 68 61 72 65 64 4c 6f 63 6b 28 70 46 69 6c 65  SharedLock(pFile
2a3e0 2c 20 70 2c 20 55 4e 49 58 5f 53 48 4d 5f 41 29  , p, UNIX_SHM_A)
2a3f0 3b 0a 20 20 20 20 20 20 20 20 75 6e 69 78 53 68  ;.        unixSh
2a400 6d 55 6e 6c 6f 63 6b 28 70 46 69 6c 65 2c 20 70  mUnlock(pFile, p
2a410 2c 20 55 4e 49 58 5f 53 48 4d 5f 43 7c 55 4e 49  , UNIX_SHM_C|UNI
2a420 58 5f 53 48 4d 5f 44 29 3b 0a 20 20 20 20 20 20  X_SHM_D);.      
2a430 20 20 70 2d 3e 6c 6f 63 6b 53 74 61 74 65 20 3d    p->lockState =
2a440 20 70 2d 3e 72 65 61 64 4c 6f 63 6b 20 3d 20 53   p->readLock = S
2a450 51 4c 49 54 45 5f 53 48 4d 5f 52 45 41 44 3b 0a  QLITE_SHM_READ;.
2a460 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
2a470 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e       assert( p->
2a480 6c 6f 63 6b 53 74 61 74 65 3d 3d 53 51 4c 49 54  lockState==SQLIT
2a490 45 5f 53 48 4d 5f 52 45 43 4f 56 45 52 20 29 3b  E_SHM_RECOVER );
2a4a0 0a 20 20 20 20 20 20 20 20 75 6e 69 78 53 68 6d  .        unixShm
2a4b0 55 6e 6c 6f 63 6b 28 70 46 69 6c 65 2c 20 70 2c  Unlock(pFile, p,
2a4c0 20 55 4e 49 58 5f 53 48 4d 5f 4d 55 54 45 58 29   UNIX_SHM_MUTEX)
2a4d0 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 6c 6f 63  ;.        p->loc
2a4e0 6b 53 74 61 74 65 20 3d 20 70 2d 3e 72 65 61 64  kState = p->read
2a4f0 4c 6f 63 6b 3b 0a 20 20 20 20 20 20 20 20 72 63  Lock;.        rc
2a500 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
2a510 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61      }.      brea
2a520 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
2a530 65 20 53 51 4c 49 54 45 5f 53 48 4d 5f 57 52 49  e SQLITE_SHM_WRI
2a540 54 45 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65  TE: {.      asse
2a550 72 74 28 20 70 2d 3e 6c 6f 63 6b 53 74 61 74 65  rt( p->lockState
2a560 3d 3d 53 51 4c 49 54 45 5f 53 48 4d 5f 52 45 41  ==SQLITE_SHM_REA
2a570 44 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  D .             
2a580 20 7c 7c 20 70 2d 3e 6c 6f 63 6b 53 74 61 74 65   || p->lockState
2a590 3d 3d 53 51 4c 49 54 45 5f 53 48 4d 5f 52 45 41  ==SQLITE_SHM_REA
2a5a0 44 5f 46 55 4c 4c 20 29 3b 0a 20 20 20 20 20 20  D_FULL );.      
2a5b0 72 63 20 3d 20 75 6e 69 78 53 68 6d 45 78 63 6c  rc = unixShmExcl
2a5c0 75 73 69 76 65 4c 6f 63 6b 28 70 46 69 6c 65 2c  usiveLock(pFile,
2a5d0 20 70 2c 20 55 4e 49 58 5f 53 48 4d 5f 43 7c 55   p, UNIX_SHM_C|U
2a5e0 4e 49 58 5f 53 48 4d 5f 44 29 3b 0a 20 20 20 20  NIX_SHM_D);.    
2a5f0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
2a600 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 70  _OK ){.        p
2a610 2d 3e 6c 6f 63 6b 53 74 61 74 65 20 3d 20 53 51  ->lockState = SQ
2a620 4c 49 54 45 5f 53 48 4d 5f 57 52 49 54 45 3b 0a  LITE_SHM_WRITE;.
2a630 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72        }.      br
2a640 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
2a650 61 73 65 20 53 51 4c 49 54 45 5f 53 48 4d 5f 43  ase SQLITE_SHM_C
2a660 48 45 43 4b 50 4f 49 4e 54 3a 20 7b 0a 20 20 20  HECKPOINT: {.   
2a670 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6c 6f     assert( p->lo
2a680 63 6b 53 74 61 74 65 3d 3d 53 51 4c 49 54 45 5f  ckState==SQLITE_
2a690 53 48 4d 5f 55 4e 4c 4f 43 4b 0a 20 20 20 20 20  SHM_UNLOCK.     
2a6a0 20 20 20 20 20 20 7c 7c 20 70 2d 3e 6c 6f 63 6b        || p->lock
2a6b0 53 74 61 74 65 3d 3d 53 51 4c 49 54 45 5f 53 48  State==SQLITE_SH
2a6c0 4d 5f 50 45 4e 44 49 4e 47 0a 20 20 20 20 20 20  M_PENDING.      
2a6d0 20 20 20 20 20 7c 7c 20 70 2d 3e 6c 6f 63 6b 53       || p->lockS
2a6e0 74 61 74 65 3d 3d 53 51 4c 49 54 45 5f 53 48 4d  tate==SQLITE_SHM
2a6f0 5f 52 45 43 4f 56 45 52 20 29 3b 0a 20 20 20 20  _RECOVER );.    
2a700 20 20 69 66 28 20 70 2d 3e 6c 6f 63 6b 53 74 61    if( p->lockSta
2a710 74 65 3d 3d 53 51 4c 49 54 45 5f 53 48 4d 5f 52  te==SQLITE_SHM_R
2a720 45 43 4f 56 45 52 20 29 7b 0a 20 20 20 20 20 20  ECOVER ){.      
2a730 20 20 75 6e 69 78 53 68 6d 55 6e 6c 6f 63 6b 28    unixShmUnlock(
2a740 70 46 69 6c 65 2c 20 70 2c 20 55 4e 49 58 5f 53  pFile, p, UNIX_S
2a750 48 4d 5f 4d 55 54 45 58 29 3b 0a 20 20 20 20 20  HM_MUTEX);.     
2a760 20 20 20 70 2d 3e 6c 6f 63 6b 53 74 61 74 65 20     p->lockState 
2a770 3d 20 53 51 4c 49 54 45 5f 53 48 4d 5f 43 48 45  = SQLITE_SHM_CHE
2a780 43 4b 50 4f 49 4e 54 3b 0a 20 20 20 20 20 20 20  CKPOINT;.       
2a790 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
2a7a0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
2a7b0 66 28 20 70 2d 3e 6c 6f 63 6b 53 74 61 74 65 3d  f( p->lockState=
2a7c0 3d 53 51 4c 49 54 45 5f 53 48 4d 5f 55 4e 4c 4f  =SQLITE_SHM_UNLO
2a7d0 43 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  CK ){.        rc
2a7e0 20 3d 20 75 6e 69 78 53 68 6d 45 78 63 6c 75 73   = unixShmExclus
2a7f0 69 76 65 4c 6f 63 6b 28 70 46 69 6c 65 2c 20 70  iveLock(pFile, p
2a800 2c 20 55 4e 49 58 5f 53 48 4d 5f 42 7c 55 4e 49  , UNIX_SHM_B|UNI
2a810 58 5f 53 48 4d 5f 43 29 3b 0a 20 20 20 20 20 20  X_SHM_C);.      
2a820 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
2a830 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
2a840 20 70 2d 3e 6c 6f 63 6b 53 74 61 74 65 20 3d 20   p->lockState = 
2a850 53 51 4c 49 54 45 5f 53 48 4d 5f 50 45 4e 44 49  SQLITE_SHM_PENDI
2a860 4e 47 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  NG;.        }.  
2a870 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
2a880 70 2d 3e 6c 6f 63 6b 53 74 61 74 65 3d 3d 53 51  p->lockState==SQ
2a890 4c 49 54 45 5f 53 48 4d 5f 50 45 4e 44 49 4e 47  LITE_SHM_PENDING
2a8a0 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
2a8b0 20 75 6e 69 78 53 68 6d 45 78 63 6c 75 73 69 76   unixShmExclusiv
2a8c0 65 4c 6f 63 6b 28 70 46 69 6c 65 2c 20 70 2c 20  eLock(pFile, p, 
2a8d0 55 4e 49 58 5f 53 48 4d 5f 41 29 3b 0a 20 20 20  UNIX_SHM_A);.   
2a8e0 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
2a8f0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
2a900 20 20 20 20 70 2d 3e 6c 6f 63 6b 53 74 61 74 65      p->lockState
2a910 20 3d 20 53 51 4c 49 54 45 5f 53 48 4d 5f 43 48   = SQLITE_SHM_CH
2a920 45 43 4b 50 4f 49 4e 54 3b 0a 20 20 20 20 20 20  ECKPOINT;.      
2a930 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
2a940 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
2a950 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20     default: {.  
2a960 20 20 20 20 61 73 73 65 72 74 28 20 64 65 73 69      assert( desi
2a970 72 65 64 4c 6f 63 6b 3d 3d 53 51 4c 49 54 45 5f  redLock==SQLITE_
2a980 53 48 4d 5f 52 45 43 4f 56 45 52 20 29 3b 0a 20  SHM_RECOVER );. 
2a990 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e       assert( p->
2a9a0 6c 6f 63 6b 53 74 61 74 65 3d 3d 53 51 4c 49 54  lockState==SQLIT
2a9b0 45 5f 53 48 4d 5f 52 45 41 44 0a 20 20 20 20 20  E_SHM_READ.     
2a9c0 20 20 20 20 20 20 7c 7c 20 70 2d 3e 6c 6f 63 6b        || p->lock
2a9d0 53 74 61 74 65 3d 3d 53 51 4c 49 54 45 5f 53 48  State==SQLITE_SH
2a9e0 4d 5f 52 45 41 44 5f 46 55 4c 4c 0a 20 20 20 20  M_READ_FULL.    
2a9f0 20 20 20 20 20 20 20 7c 7c 20 70 2d 3e 6c 6f 63         || p->loc
2aa00 6b 53 74 61 74 65 3d 3d 53 51 4c 49 54 45 5f 53  kState==SQLITE_S
2aa10 48 4d 5f 43 48 45 43 4b 50 4f 49 4e 54 20 29 3b  HM_CHECKPOINT );
2aa20 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 73  .      assert( s
2aa30 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
2aa40 64 28 70 46 69 6c 65 2d 3e 6d 75 74 65 78 42 75  d(pFile->mutexBu
2aa50 66 29 20 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  f) );.      rc =
2aa60 20 75 6e 69 78 53 68 6d 45 78 63 6c 75 73 69 76   unixShmExclusiv
2aa70 65 4c 6f 63 6b 28 70 46 69 6c 65 2c 20 70 2c 20  eLock(pFile, p, 
2aa80 55 4e 49 58 5f 53 48 4d 5f 4d 55 54 45 58 29 3b  UNIX_SHM_MUTEX);
2aa90 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53  .      if( rc==S
2aaa0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
2aab0 20 20 20 20 70 2d 3e 6c 6f 63 6b 53 74 61 74 65      p->lockState
2aac0 20 3d 20 53 51 4c 49 54 45 5f 53 48 4d 5f 52 45   = SQLITE_SHM_RE
2aad0 43 4f 56 45 52 3b 0a 20 20 20 20 20 20 7d 0a 20  COVER;.      }. 
2aae0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
2aaf0 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f  }.  }.  sqlite3_
2ab00 6d 75 74 65 78 5f 6c 65 61 76 65 28 70 46 69 6c  mutex_leave(pFil
2ab10 65 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 4f 53 54  e->mutex);.  OST
2ab20 52 41 43 45 28 28 22 53 48 4d 2d 4c 4f 43 4b 20  RACE(("SHM-LOCK 
2ab30 73 68 6d 69 64 2d 25 64 2c 20 70 69 64 2d 25 64  shmid-%d, pid-%d
2ab40 20 67 6f 74 20 25 73 5c 6e 22 2c 0a 20 20 20 20   got %s\n",.    
2ab50 20 20 20 20 20 20 20 70 2d 3e 69 64 2c 20 67 65         p->id, ge
2ab60 74 70 69 64 28 29 2c 20 61 7a 4c 6b 4e 61 6d 65  tpid(), azLkName
2ab70 5b 70 2d 3e 6c 6f 63 6b 53 74 61 74 65 5d 29 29  [p->lockState]))
2ab80 3b 0a 20 20 69 66 28 20 70 47 6f 74 4c 6f 63 6b  ;.  if( pGotLock
2ab90 20 29 20 2a 70 47 6f 74 4c 6f 63 6b 20 3d 20 70   ) *pGotLock = p
2aba0 2d 3e 6c 6f 63 6b 53 74 61 74 65 3b 0a 20 20 72  ->lockState;.  r
2abb0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
2abc0 2a 2a 20 44 65 6c 65 74 65 20 61 20 73 68 61 72  ** Delete a shar
2abd0 65 64 2d 6d 65 6d 6f 72 79 20 73 65 67 6d 65 6e  ed-memory segmen
2abe0 74 20 66 72 6f 6d 20 74 68 65 20 73 79 73 74 65  t from the syste
2abf0 6d 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  m..*/.static int
2ac00 20 75 6e 69 78 53 68 6d 44 65 6c 65 74 65 28 73   unixShmDelete(s
2ac10 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73  qlite3_vfs *pVfs
2ac20 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e  , const char *zN
2ac30 61 6d 65 29 7b 0a 20 20 72 65 74 75 72 6e 20 70  ame){.  return p
2ac40 56 66 73 2d 3e 78 44 65 6c 65 74 65 28 70 56 66  Vfs->xDelete(pVf
2ac50 73 2c 20 7a 4e 61 6d 65 2c 20 30 29 3b 0a 7d 0a  s, zName, 0);.}.
2ac60 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20  .#else.# define 
2ac70 75 6e 69 78 53 68 6d 4f 70 65 6e 20 20 20 20 30  unixShmOpen    0
2ac80 0a 23 20 64 65 66 69 6e 65 20 75 6e 69 78 53 68  .# define unixSh
2ac90 6d 53 69 7a 65 20 20 20 20 30 0a 23 20 64 65 66  mSize    0.# def
2aca0 69 6e 65 20 75 6e 69 78 53 68 6d 47 65 74 20 20  ine unixShmGet  
2acb0 20 20 20 30 0a 23 20 64 65 66 69 6e 65 20 75 6e     0.# define un
2acc0 69 78 53 68 6d 52 65 6c 65 61 73 65 20 30 0a 23  ixShmRelease 0.#
2acd0 20 64 65 66 69 6e 65 20 75 6e 69 78 53 68 6d 4c   define unixShmL
2ace0 6f 63 6b 20 20 20 20 30 0a 23 20 64 65 66 69 6e  ock    0.# defin
2acf0 65 20 75 6e 69 78 53 68 6d 43 6c 6f 73 65 20 20  e unixShmClose  
2ad00 20 30 0a 23 20 64 65 66 69 6e 65 20 75 6e 69 78   0.# define unix
2ad10 53 68 6d 44 65 6c 65 74 65 20 20 30 0a 23 65 6e  ShmDelete  0.#en
2ad20 64 69 66 20 2f 2a 20 23 69 66 6e 64 65 66 20 53  dif /* #ifndef S
2ad30 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 20 2a  QLITE_OMIT_WAL *
2ad40 2f 0a 0a 2f 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  /../*.**********
2ad50 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45  ************** E
2ad60 6e 64 20 6f 66 20 73 71 6c 69 74 65 33 5f 76 66  nd of sqlite3_vf
2ad70 73 20 6d 65 74 68 6f 64 73 20 2a 2a 2a 2a 2a 2a  s methods ******
2ad80 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2ad90 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  *****.**********
2ada0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2adb0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2adc0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2add0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2ade0 2a 2a 2a 2a 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a  ****/../********
2adf0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2ae00 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2ae10 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2ae20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2ae30 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ******.*********
2ae40 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2ae50 2a 20 42 65 67 69 6e 20 50 72 6f 78 79 20 4c 6f  * Begin Proxy Lo
2ae60 63 6b 69 6e 67 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  cking **********
2ae70 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2ae80 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 50 72 6f  ******.**.** Pro
2ae90 78 79 20 6c 6f 63 6b 69 6e 67 20 69 73 20 61 20  xy locking is a 
2aea0 22 75 62 65 72 2d 6c 6f 63 6b 69 6e 67 2d 6d 65  "uber-locking-me
2aeb0 74 68 6f 64 22 20 69 6e 20 74 68 69 73 20 73 65  thod" in this se
2aec0 6e 73 65 3a 20 20 49 74 20 75 73 65 73 20 74 68  nse:  It uses th
2aed0 65 0a 2a 2a 20 6f 74 68 65 72 20 6c 6f 63 6b 69  e.** other locki
2aee0 6e 67 20 6d 65 74 68 6f 64 73 20 6f 6e 20 73 65  ng methods on se
2aef0 63 6f 6e 64 61 72 79 20 6c 6f 63 6b 20 66 69 6c  condary lock fil
2af00 65 73 2e 20 20 50 72 6f 78 79 20 6c 6f 63 6b 69  es.  Proxy locki
2af10 6e 67 20 69 73 20 61 0a 2a 2a 20 6d 65 74 61 2d  ng is a.** meta-
2af20 6c 61 79 65 72 20 6f 76 65 72 20 74 6f 70 20 6f  layer over top o
2af30 66 20 74 68 65 20 70 72 69 6d 69 74 69 76 65 20  f the primitive 
2af40 6c 6f 63 6b 69 6e 67 20 69 6d 70 6c 65 6d 65 6e  locking implemen
2af50 74 65 64 20 61 62 6f 76 65 2e 20 20 46 6f 72 0a  ted above.  For.
2af60 2a 2a 20 74 68 69 73 20 72 65 61 73 6f 6e 2c 20  ** this reason, 
2af70 74 68 65 20 64 69 76 69 73 69 6f 6e 20 74 68 61  the division tha
2af80 74 20 69 6d 70 6c 65 6d 65 6e 74 73 20 6f 66 20  t implements of 
2af90 70 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 20 69 73  proxy locking is
2afa0 20 64 65 66 65 72 72 65 64 0a 2a 2a 20 75 6e 74   deferred.** unt
2afb0 69 6c 20 6c 61 74 65 20 69 6e 20 74 68 65 20 66  il late in the f
2afc0 69 6c 65 20 28 68 65 72 65 29 20 61 66 74 65 72  ile (here) after
2afd0 20 61 6c 6c 20 6f 66 20 74 68 65 20 6f 74 68 65   all of the othe
2afe0 72 20 49 2f 4f 20 6d 65 74 68 6f 64 73 20 68 61  r I/O methods ha
2aff0 76 65 0a 2a 2a 20 62 65 65 6e 20 64 65 66 69 6e  ve.** been defin
2b000 65 64 20 2d 20 73 6f 20 74 68 61 74 20 74 68 65  ed - so that the
2b010 20 70 72 69 6d 69 74 69 76 65 20 6c 6f 63 6b 69   primitive locki
2b020 6e 67 20 6d 65 74 68 6f 64 73 20 61 72 65 20 61  ng methods are a
2b030 76 61 69 6c 61 62 6c 65 0a 2a 2a 20 61 73 20 73  vailable.** as s
2b040 65 72 76 69 63 65 73 20 74 6f 20 68 65 6c 70 20  ervices to help 
2b050 77 69 74 68 20 74 68 65 20 69 6d 70 6c 65 6d 65  with the impleme
2b060 6e 74 61 74 69 6f 6e 20 6f 66 20 70 72 6f 78 79  ntation of proxy
2b070 20 6c 6f 63 6b 69 6e 67 2e 0a 2a 2a 0a 2a 2a 2a   locking..**.***
2b080 2a 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64 65 66 61  *.**.** The defa
2b090 75 6c 74 20 6c 6f 63 6b 69 6e 67 20 73 63 68 65  ult locking sche
2b0a0 6d 65 73 20 69 6e 20 53 51 4c 69 74 65 20 75 73  mes in SQLite us
2b0b0 65 20 62 79 74 65 2d 72 61 6e 67 65 20 6c 6f 63  e byte-range loc
2b0c0 6b 73 20 6f 6e 20 74 68 65 0a 2a 2a 20 64 61 74  ks on the.** dat
2b0d0 61 62 61 73 65 20 66 69 6c 65 20 74 6f 20 63 6f  abase file to co
2b0e0 6f 72 64 69 6e 61 74 65 20 73 61 66 65 2c 20 63  ordinate safe, c
2b0f0 6f 6e 63 75 72 72 65 6e 74 20 61 63 63 65 73 73  oncurrent access
2b100 20 62 79 20 6d 75 6c 74 69 70 6c 65 20 72 65 61   by multiple rea
2b110 64 65 72 73 0a 2a 2a 20 61 6e 64 20 77 72 69 74  ders.** and writ
2b120 65 72 73 20 5b 68 74 74 70 3a 2f 2f 73 71 6c 69  ers [http://sqli
2b130 74 65 2e 6f 72 67 2f 6c 6f 63 6b 69 6e 67 76 33  te.org/lockingv3
2b140 2e 68 74 6d 6c 5d 2e 20 20 54 68 65 20 66 69 76  .html].  The fiv
2b150 65 20 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 0a 2a  e file locking.*
2b160 2a 20 73 74 61 74 65 73 20 28 55 4e 4c 4f 43 4b  * states (UNLOCK
2b170 45 44 2c 20 50 45 4e 44 49 4e 47 2c 20 53 48 41  ED, PENDING, SHA
2b180 52 45 44 2c 20 52 45 53 45 52 56 45 44 2c 20 45  RED, RESERVED, E
2b190 58 43 4c 55 53 49 56 45 29 20 61 72 65 20 69 6d  XCLUSIVE) are im
2b1a0 70 6c 65 6d 65 6e 74 65 64 0a 2a 2a 20 61 73 20  plemented.** as 
2b1b0 50 4f 53 49 58 20 72 65 61 64 20 26 20 77 72 69  POSIX read & wri
2b1c0 74 65 20 6c 6f 63 6b 73 20 6f 76 65 72 20 66 69  te locks over fi
2b1d0 78 65 64 20 73 65 74 20 6f 66 20 6c 6f 63 61 74  xed set of locat
2b1e0 69 6f 6e 73 20 28 76 69 61 20 66 73 63 74 6c 29  ions (via fsctl)
2b1f0 2c 0a 2a 2a 20 6f 6e 20 41 46 50 20 61 6e 64 20  ,.** on AFP and 
2b200 53 4d 42 20 6f 6e 6c 79 20 65 78 63 6c 75 73 69  SMB only exclusi
2b210 76 65 20 62 79 74 65 2d 72 61 6e 67 65 20 6c 6f  ve byte-range lo
2b220 63 6b 73 20 61 72 65 20 61 76 61 69 6c 61 62 6c  cks are availabl
2b230 65 20 76 69 61 20 66 73 63 74 6c 0a 2a 2a 20 77  e via fsctl.** w
2b240 69 74 68 20 5f 49 4f 57 52 28 27 7a 27 2c 20 32  ith _IOWR('z', 2
2b250 33 2c 20 73 74 72 75 63 74 20 42 79 74 65 52 61  3, struct ByteRa
2b260 6e 67 65 4c 6f 63 6b 50 42 32 29 20 74 6f 20 74  ngeLockPB2) to t
2b270 72 61 63 6b 20 74 68 65 20 73 61 6d 65 20 35 20  rack the same 5 
2b280 73 74 61 74 65 73 2e 0a 2a 2a 20 54 6f 20 73 69  states..** To si
2b290 6d 75 6c 61 74 65 20 61 20 46 5f 52 44 4c 43 4b  mulate a F_RDLCK
2b2a0 20 6f 6e 20 74 68 65 20 73 68 61 72 65 64 20 72   on the shared r
2b2b0 61 6e 67 65 2c 20 6f 6e 20 41 46 50 20 61 20 72  ange, on AFP a r
2b2c0 61 6e 64 6f 6d 6c 79 20 73 65 6c 65 63 74 65 64  andomly selected
2b2d0 0a 2a 2a 20 61 64 64 72 65 73 73 20 69 6e 20 74  .** address in t
2b2e0 68 65 20 73 68 61 72 65 64 20 72 61 6e 67 65 20  he shared range 
2b2f0 69 73 20 74 61 6b 65 6e 20 66 6f 72 20 61 20 53  is taken for a S
2b300 48 41 52 45 44 20 6c 6f 63 6b 2c 20 74 68 65 20  HARED lock, the 
2b310 65 6e 74 69 72 65 0a 2a 2a 20 73 68 61 72 65 64  entire.** shared
2b320 20 72 61 6e 67 65 20 69 73 20 74 61 6b 65 6e 20   range is taken 
2b330 66 6f 72 20 61 6e 20 45 58 43 4c 55 53 49 56 45  for an EXCLUSIVE
2b340 20 6c 6f 63 6b 29 3a 0a 2a 2a 0a 2a 2a 20 20 20   lock):.**.**   
2b350 20 20 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 20     PENDING_BYTE 
2b360 20 20 20 20 20 20 20 30 78 34 30 30 30 30 30 30         0x4000000
2b370 30 09 09 20 20 20 09 0a 2a 2a 20 20 20 20 20 20  0..   ..**      
2b380 52 45 53 45 52 56 45 44 5f 42 59 54 45 20 20 20  RESERVED_BYTE   
2b390 20 20 20 20 30 78 34 30 30 30 30 30 30 31 0a 2a      0x40000001.*
2b3a0 2a 20 20 20 20 20 20 53 48 41 52 45 44 5f 52 41  *      SHARED_RA
2b3b0 4e 47 45 20 20 20 20 20 20 20 20 30 78 34 30 30  NGE        0x400
2b3c0 30 30 30 30 32 20 2d 3e 20 30 78 34 30 30 30 30  00002 -> 0x40000
2b3d0 32 30 30 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 77  200.**.** This w
2b3e0 6f 72 6b 73 20 77 65 6c 6c 20 6f 6e 20 74 68 65  orks well on the
2b3f0 20 6c 6f 63 61 6c 20 66 69 6c 65 20 73 79 73 74   local file syst
2b400 65 6d 2c 20 62 75 74 20 73 68 6f 77 73 20 61 20  em, but shows a 
2b410 6e 65 61 72 6c 79 20 31 30 30 78 0a 2a 2a 20 73  nearly 100x.** s
2b420 6c 6f 77 64 6f 77 6e 20 69 6e 20 72 65 61 64 20  lowdown in read 
2b430 70 65 72 66 6f 72 6d 61 6e 63 65 20 6f 6e 20 41  performance on A
2b440 46 50 20 62 65 63 61 75 73 65 20 74 68 65 20 41  FP because the A
2b450 46 50 20 63 6c 69 65 6e 74 20 64 69 73 61 62 6c  FP client disabl
2b460 65 73 0a 2a 2a 20 74 68 65 20 72 65 61 64 20 63  es.** the read c
2b470 61 63 68 65 20 77 68 65 6e 20 62 79 74 65 2d 72  ache when byte-r
2b480 61 6e 67 65 20 6c 6f 63 6b 73 20 61 72 65 20 70  ange locks are p
2b490 72 65 73 65 6e 74 2e 20 20 45 6e 61 62 6c 69 6e  resent.  Enablin
2b4a0 67 20 74 68 65 20 72 65 61 64 0a 2a 2a 20 63 61  g the read.** ca
2b4b0 63 68 65 20 65 78 70 6f 73 65 73 20 61 20 63 61  che exposes a ca
2b4c0 63 68 65 20 63 6f 68 65 72 65 6e 63 79 20 70 72  che coherency pr
2b4d0 6f 62 6c 65 6d 20 74 68 61 74 20 69 73 20 70 72  oblem that is pr
2b4e0 65 73 65 6e 74 20 6f 6e 20 61 6c 6c 20 4f 53 20  esent on all OS 
2b4f0 58 0a 2a 2a 20 73 75 70 70 6f 72 74 65 64 20 6e  X.** supported n
2b500 65 74 77 6f 72 6b 20 66 69 6c 65 20 73 79 73 74  etwork file syst
2b510 65 6d 73 2e 20 20 4e 46 53 20 61 6e 64 20 41 46  ems.  NFS and AF
2b520 50 20 62 6f 74 68 20 6f 62 73 65 72 76 65 20 74  P both observe t
2b530 68 65 0a 2a 2a 20 63 6c 6f 73 65 2d 74 6f 2d 6f  he.** close-to-o
2b540 70 65 6e 20 73 65 6d 61 6e 74 69 63 73 20 66 6f  pen semantics fo
2b550 72 20 65 6e 73 75 72 69 6e 67 20 63 61 63 68 65  r ensuring cache
2b560 20 63 6f 68 65 72 65 6e 63 79 0a 2a 2a 20 5b 68   coherency.** [h
2b570 74 74 70 3a 2f 2f 6e 66 73 2e 73 6f 75 72 63 65  ttp://nfs.source
2b580 66 6f 72 67 65 2e 6e 65 74 2f 23 66 61 71 5f 61  forge.net/#faq_a
2b590 38 5d 2c 20 77 68 69 63 68 20 64 6f 65 73 20 6e  8], which does n
2b5a0 6f 74 20 65 66 66 65 63 74 69 76 65 6c 79 0a 2a  ot effectively.*
2b5b0 2a 20 61 64 64 72 65 73 73 20 74 68 65 20 72 65  * address the re
2b5c0 71 75 69 72 65 6d 65 6e 74 73 20 66 6f 72 20 63  quirements for c
2b5d0 6f 6e 63 75 72 72 65 6e 74 20 64 61 74 61 62 61  oncurrent databa
2b5e0 73 65 20 61 63 63 65 73 73 20 62 79 20 6d 75 6c  se access by mul
2b5f0 74 69 70 6c 65 0a 2a 2a 20 72 65 61 64 65 72 73  tiple.** readers
2b600 20 61 6e 64 20 77 72 69 74 65 72 73 0a 2a 2a 20   and writers.** 
2b610 5b 68 74 74 70 3a 2f 2f 77 77 77 2e 6e 61 62 62  [http://www.nabb
2b620 6c 65 2e 63 6f 6d 2f 53 51 4c 69 74 65 2d 6f 6e  le.com/SQLite-on
2b630 2d 4e 46 53 2d 63 61 63 68 65 2d 63 6f 68 65 72  -NFS-cache-coher
2b640 65 6e 63 79 2d 74 64 31 35 36 35 35 37 30 31 2e  ency-td15655701.
2b650 68 74 6d 6c 5d 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20  html]..**.** To 
2b660 61 64 64 72 65 73 73 20 74 68 65 20 70 65 72 66  address the perf
2b670 6f 72 6d 61 6e 63 65 20 61 6e 64 20 63 61 63 68  ormance and cach
2b680 65 20 63 6f 68 65 72 65 6e 63 79 20 69 73 73 75  e coherency issu
2b690 65 73 2c 20 70 72 6f 78 79 20 66 69 6c 65 20 6c  es, proxy file l
2b6a0 6f 63 6b 69 6e 67 0a 2a 2a 20 63 68 61 6e 67 65  ocking.** change
2b6b0 73 20 74 68 65 20 77 61 79 20 64 61 74 61 62 61  s the way databa
2b6c0 73 65 20 61 63 63 65 73 73 20 69 73 20 63 6f 6e  se access is con
2b6d0 74 72 6f 6c 6c 65 64 20 62 79 20 6c 69 6d 69 74  trolled by limit
2b6e0 69 6e 67 20 61 63 63 65 73 73 20 74 6f 20 61 0a  ing access to a.
2b6f0 2a 2a 20 73 69 6e 67 6c 65 20 68 6f 73 74 20 61  ** single host a
2b700 74 20 61 20 74 69 6d 65 20 61 6e 64 20 6d 6f 76  t a time and mov
2b710 69 6e 67 20 66 69 6c 65 20 6c 6f 63 6b 73 20 6f  ing file locks o
2b720 66 66 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  ff of the databa
2b730 73 65 20 66 69 6c 65 0a 2a 2a 20 61 6e 64 20 6f  se file.** and o
2b740 6e 74 6f 20 61 20 70 72 6f 78 79 20 66 69 6c 65  nto a proxy file
2b750 20 6f 6e 20 74 68 65 20 6c 6f 63 61 6c 20 66 69   on the local fi
2b760 6c 65 20 73 79 73 74 65 6d 2e 20 20 0a 2a 2a 0a  le system.  .**.
2b770 2a 2a 0a 2a 2a 20 55 73 69 6e 67 20 70 72 6f 78  **.** Using prox
2b780 79 20 6c 6f 63 6b 73 0a 2a 2a 20 2d 2d 2d 2d 2d  y locks.** -----
2b790 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 0a  ------------.**.
2b7a0 2a 2a 20 43 20 41 50 49 73 0a 2a 2a 0a 2a 2a 20  ** C APIs.**.** 
2b7b0 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 5f 63 6f   sqlite3_file_co
2b7c0 6e 74 72 6f 6c 28 64 62 2c 20 64 62 6e 61 6d 65  ntrol(db, dbname
2b7d0 2c 20 53 51 4c 49 54 45 5f 53 45 54 5f 4c 4f 43  , SQLITE_SET_LOC
2b7e0 4b 50 52 4f 58 59 46 49 4c 45 2c 0a 2a 2a 20 20  KPROXYFILE,.**  
2b7f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b800 20 20 20 20 20 3c 70 72 6f 78 79 5f 70 61 74 68       <proxy_path
2b810 3e 20 7c 20 22 3a 61 75 74 6f 3a 22 29 3b 0a 2a  > | ":auto:");.*
2b820 2a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 5f  *  sqlite3_file_
2b830 63 6f 6e 74 72 6f 6c 28 64 62 2c 20 64 62 6e 61  control(db, dbna
2b840 6d 65 2c 20 53 51 4c 49 54 45 5f 47 45 54 5f 4c  me, SQLITE_GET_L
2b850 4f 43 4b 50 52 4f 58 59 46 49 4c 45 2c 20 26 3c  OCKPROXYFILE, &<
2b860 70 72 6f 78 79 5f 70 61 74 68 3e 29 3b 0a 2a 2a  proxy_path>);.**
2b870 0a 2a 2a 0a 2a 2a 20 53 51 4c 20 70 72 61 67 6d  .**.** SQL pragm
2b880 61 73 0a 2a 2a 0a 2a 2a 20 20 50 52 41 47 4d 41  as.**.**  PRAGMA
2b890 20 5b 64 61 74 61 62 61 73 65 2e 5d 6c 6f 63 6b   [database.]lock
2b8a0 5f 70 72 6f 78 79 5f 66 69 6c 65 3d 3c 70 72 6f  _proxy_file=<pro
2b8b0 78 79 5f 70 61 74 68 3e 20 7c 20 3a 61 75 74 6f  xy_path> | :auto
2b8c0 3a 0a 2a 2a 20 20 50 52 41 47 4d 41 20 5b 64 61  :.**  PRAGMA [da
2b8d0 74 61 62 61 73 65 2e 5d 6c 6f 63 6b 5f 70 72 6f  tabase.]lock_pro
2b8e0 78 79 5f 66 69 6c 65 0a 2a 2a 0a 2a 2a 20 53 70  xy_file.**.** Sp
2b8f0 65 63 69 66 79 69 6e 67 20 22 3a 61 75 74 6f 3a  ecifying ":auto:
2b900 22 20 6d 65 61 6e 73 20 74 68 61 74 20 69 66 20  " means that if 
2b910 74 68 65 72 65 20 69 73 20 61 20 63 6f 6e 63 68  there is a conch
2b920 20 66 69 6c 65 20 77 69 74 68 20 61 20 6d 61 74   file with a mat
2b930 63 68 69 6e 67 0a 2a 2a 20 68 6f 73 74 20 49 44  ching.** host ID
2b940 20 69 6e 20 69 74 2c 20 74 68 65 20 70 72 6f 78   in it, the prox
2b950 79 20 70 61 74 68 20 69 6e 20 74 68 65 20 63 6f  y path in the co
2b960 6e 63 68 20 66 69 6c 65 20 77 69 6c 6c 20 62 65  nch file will be
2b970 20 75 73 65 64 2c 20 6f 74 68 65 72 77 69 73 65   used, otherwise
2b980 0a 2a 2a 20 61 20 70 72 6f 78 79 20 70 61 74 68  .** a proxy path
2b990 20 62 61 73 65 64 20 6f 6e 20 74 68 65 20 75 73   based on the us
2b9a0 65 72 27 73 20 74 65 6d 70 20 64 69 72 0a 2a 2a  er's temp dir.**
2b9b0 20 28 76 69 61 20 63 6f 6e 66 73 74 72 28 5f 43   (via confstr(_C
2b9c0 53 5f 44 41 52 57 49 4e 5f 55 53 45 52 5f 54 45  S_DARWIN_USER_TE
2b9d0 4d 50 5f 44 49 52 2c 2e 2e 2e 29 29 20 77 69 6c  MP_DIR,...)) wil
2b9e0 6c 20 62 65 20 75 73 65 64 20 61 6e 64 20 74 68  l be used and th
2b9f0 65 0a 2a 2a 20 61 63 74 75 61 6c 20 70 72 6f 78  e.** actual prox
2ba00 79 20 66 69 6c 65 20 6e 61 6d 65 20 69 73 20 67  y file name is g
2ba10 65 6e 65 72 61 74 65 64 20 66 72 6f 6d 20 74 68  enerated from th
2ba20 65 20 6e 61 6d 65 20 61 6e 64 20 70 61 74 68 20  e name and path 
2ba30 6f 66 20 74 68 65 0a 2a 2a 20 64 61 74 61 62 61  of the.** databa
2ba40 73 65 20 66 69 6c 65 2e 20 20 46 6f 72 20 65 78  se file.  For ex
2ba50 61 6d 70 6c 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  ample:.**.**    
2ba60 20 20 20 46 6f 72 20 64 61 74 61 62 61 73 65 20     For database 
2ba70 70 61 74 68 20 22 2f 55 73 65 72 73 2f 6d 65 2f  path "/Users/me/
2ba80 66 6f 6f 2e 64 62 22 20 0a 2a 2a 20 20 20 20 20  foo.db" .**     
2ba90 20 20 54 68 65 20 6c 6f 63 6b 20 70 61 74 68 20    The lock path 
2baa0 77 69 6c 6c 20 62 65 20 22 3c 74 6d 70 64 69 72  will be "<tmpdir
2bab0 3e 2f 73 71 6c 69 74 65 70 6c 6f 63 6b 73 2f 5f  >/sqliteplocks/_
2bac0 55 73 65 72 73 5f 6d 65 5f 66 6f 6f 2e 64 62 3a  Users_me_foo.db:
2bad0 61 75 74 6f 3a 22 29 0a 2a 2a 0a 2a 2a 20 4f 6e  auto:").**.** On
2bae0 63 65 20 61 20 6c 6f 63 6b 20 70 72 6f 78 79 20  ce a lock proxy 
2baf0 69 73 20 63 6f 6e 66 69 67 75 72 65 64 20 66 6f  is configured fo
2bb00 72 20 61 20 64 61 74 61 62 61 73 65 20 63 6f 6e  r a database con
2bb10 6e 65 63 74 69 6f 6e 2c 20 69 74 20 63 61 6e 20  nection, it can 
2bb20 6e 6f 74 0a 2a 2a 20 62 65 20 72 65 6d 6f 76 65  not.** be remove
2bb30 64 2c 20 68 6f 77 65 76 65 72 20 69 74 20 6d 61  d, however it ma
2bb40 79 20 62 65 20 73 77 69 74 63 68 65 64 20 74 6f  y be switched to
2bb50 20 61 20 64 69 66 66 65 72 65 6e 74 20 70 72 6f   a different pro
2bb60 78 79 20 70 61 74 68 20 76 69 61 0a 2a 2a 20 74  xy path via.** t
2bb70 68 65 20 61 62 6f 76 65 20 41 50 49 73 20 28 61  he above APIs (a
2bb80 73 73 75 6d 69 6e 67 20 74 68 65 20 63 6f 6e 63  ssuming the conc
2bb90 68 20 66 69 6c 65 20 69 73 20 6e 6f 74 20 62 65  h file is not be
2bba0 69 6e 67 20 68 65 6c 64 20 62 79 20 61 6e 6f 74  ing held by anot
2bbb0 68 65 72 0a 2a 2a 20 63 6f 6e 6e 65 63 74 69 6f  her.** connectio
2bbc0 6e 20 6f 72 20 70 72 6f 63 65 73 73 29 2e 20 0a  n or process). .
2bbd0 2a 2a 0a 2a 2a 0a 2a 2a 20 48 6f 77 20 70 72 6f  **.**.** How pro
2bbe0 78 79 20 6c 6f 63 6b 69 6e 67 20 77 6f 72 6b 73  xy locking works
2bbf0 0a 2a 2a 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  .** ------------
2bc00 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 0a 2a  -----------.**.*
2bc10 2a 20 50 72 6f 78 79 20 66 69 6c 65 20 6c 6f 63  * Proxy file loc
2bc20 6b 69 6e 67 20 72 65 6c 69 65 73 20 70 72 69 6d  king relies prim
2bc30 61 72 69 6c 79 20 6f 6e 20 74 77 6f 20 6e 65 77  arily on two new
2bc40 20 73 75 70 70 6f 72 74 69 6e 67 20 66 69 6c 65   supporting file
2bc50 73 3a 20 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 20 63  s: .**.**   *  c
2bc60 6f 6e 63 68 20 66 69 6c 65 20 74 6f 20 6c 69 6d  onch file to lim
2bc70 69 74 20 61 63 63 65 73 73 20 74 6f 20 74 68 65  it access to the
2bc80 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 74   database file t
2bc90 6f 20 61 20 73 69 6e 67 6c 65 20 68 6f 73 74 0a  o a single host.
2bca0 2a 2a 20 20 20 20 20 20 61 74 20 61 20 74 69 6d  **      at a tim
2bcb0 65 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 20 70 72 6f  e.**.**   *  pro
2bcc0 78 79 20 66 69 6c 65 20 74 6f 20 61 63 74 20 61  xy file to act a
2bcd0 73 20 61 20 70 72 6f 78 79 20 66 6f 72 20 74 68  s a proxy for th
2bce0 65 20 61 64 76 69 73 6f 72 79 20 6c 6f 63 6b 73  e advisory locks
2bcf0 20 6e 6f 72 6d 61 6c 6c 79 0a 2a 2a 20 20 20 20   normally.**    
2bd00 20 20 74 61 6b 65 6e 20 6f 6e 20 74 68 65 20 64    taken on the d
2bd10 61 74 61 62 61 73 65 0a 2a 2a 0a 2a 2a 20 54 68  atabase.**.** Th
2bd20 65 20 63 6f 6e 63 68 20 66 69 6c 65 20 2d 20 74  e conch file - t
2bd30 6f 20 75 73 65 20 61 20 70 72 6f 78 79 20 66 69  o use a proxy fi
2bd40 6c 65 2c 20 73 71 6c 69 74 65 20 6d 75 73 74 20  le, sqlite must 
2bd50 66 69 72 73 74 20 22 68 6f 6c 64 20 74 68 65 20  first "hold the 
2bd60 63 6f 6e 63 68 22 0a 2a 2a 20 62 79 20 74 61 6b  conch".** by tak
2bd70 69 6e 67 20 61 6e 20 73 71 6c 69 74 65 2d 73 74  ing an sqlite-st
2bd80 79 6c 65 20 73 68 61 72 65 64 20 6c 6f 63 6b 20  yle shared lock 
2bd90 6f 6e 20 74 68 65 20 63 6f 6e 63 68 20 66 69 6c  on the conch fil
2bda0 65 2c 20 72 65 61 64 69 6e 67 20 74 68 65 0a 2a  e, reading the.*
2bdb0 2a 20 63 6f 6e 74 65 6e 74 73 20 61 6e 64 20 63  * contents and c
2bdc0 6f 6d 70 61 72 69 6e 67 20 74 68 65 20 68 6f 73  omparing the hos
2bdd0 74 27 73 20 75 6e 69 71 75 65 20 68 6f 73 74 20  t's unique host 
2bde0 49 44 20 28 73 65 65 20 62 65 6c 6f 77 29 20 61  ID (see below) a
2bdf0 6e 64 20 6c 6f 63 6b 0a 2a 2a 20 70 72 6f 78 79  nd lock.** proxy
2be00 20 70 61 74 68 20 61 67 61 69 6e 73 74 20 74 68   path against th
2be10 65 20 76 61 6c 75 65 73 20 73 74 6f 72 65 64 20  e values stored 
2be20 69 6e 20 74 68 65 20 63 6f 6e 63 68 2e 20 20 54  in the conch.  T
2be30 68 65 20 63 6f 6e 63 68 20 66 69 6c 65 20 69 73  he conch file is
2be40 0a 2a 2a 20 73 74 6f 72 65 64 20 69 6e 20 74 68  .** stored in th
2be50 65 20 73 61 6d 65 20 64 69 72 65 63 74 6f 72 79  e same directory
2be60 20 61 73 20 74 68 65 20 64 61 74 61 62 61 73 65   as the database
2be70 20 66 69 6c 65 20 61 6e 64 20 74 68 65 20 66 69   file and the fi
2be80 6c 65 20 6e 61 6d 65 0a 2a 2a 20 69 73 20 70 61  le name.** is pa
2be90 74 74 65 72 6e 65 64 20 61 66 74 65 72 20 74 68  tterned after th
2bea0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
2beb0 6e 61 6d 65 20 61 73 20 22 2e 3c 64 61 74 61 62  name as ".<datab
2bec0 61 73 65 6e 61 6d 65 3e 2d 63 6f 6e 63 68 22 2e  asename>-conch".
2bed0 0a 2a 2a 20 49 66 20 74 68 65 20 63 6f 6e 63 68  .** If the conch
2bee0 20 66 69 6c 65 20 64 6f 65 73 20 6e 6f 74 20 65   file does not e
2bef0 78 69 73 74 2c 20 6f 72 20 69 74 27 73 20 63 6f  xist, or it's co
2bf00 6e 74 65 6e 74 73 20 64 6f 20 6e 6f 74 20 6d 61  ntents do not ma
2bf10 74 63 68 20 74 68 65 0a 2a 2a 20 68 6f 73 74 20  tch the.** host 
2bf20 49 44 20 61 6e 64 2f 6f 72 20 70 72 6f 78 79 20  ID and/or proxy 
2bf30 70 61 74 68 2c 20 74 68 65 6e 20 74 68 65 20 6c  path, then the l
2bf40 6f 63 6b 20 69 73 20 65 73 63 61 6c 61 74 65 64  ock is escalated
2bf50 20 74 6f 20 61 6e 20 65 78 63 6c 75 73 69 76 65   to an exclusive
2bf60 0a 2a 2a 20 6c 6f 63 6b 20 61 6e 64 20 74 68 65  .** lock and the
2bf70 20 63 6f 6e 63 68 20 66 69 6c 65 20 63 6f 6e 74   conch file cont
2bf80 65 6e 74 73 20 69 73 20 75 70 64 61 74 65 64 20  ents is updated 
2bf90 77 69 74 68 20 74 68 65 20 68 6f 73 74 20 49 44  with the host ID
2bfa0 20 61 6e 64 20 70 72 6f 78 79 0a 2a 2a 20 70 61   and proxy.** pa
2bfb0 74 68 20 61 6e 64 20 74 68 65 20 6c 6f 63 6b 20  th and the lock 
2bfc0 69 73 20 64 6f 77 6e 67 72 61 64 65 64 20 74 6f  is downgraded to
2bfd0 20 61 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 61   a shared lock a
2bfe0 67 61 69 6e 2e 20 20 49 66 20 74 68 65 20 63 6f  gain.  If the co
2bff0 6e 63 68 0a 2a 2a 20 69 73 20 68 65 6c 64 20 62  nch.** is held b
2c000 79 20 61 6e 6f 74 68 65 72 20 70 72 6f 63 65 73  y another proces
2c010 73 20 28 77 69 74 68 20 61 20 73 68 61 72 65 64  s (with a shared
2c020 20 6c 6f 63 6b 29 2c 20 74 68 65 20 65 78 63 6c   lock), the excl
2c030 75 73 69 76 65 20 6c 6f 63 6b 0a 2a 2a 20 77 69  usive lock.** wi
2c040 6c 6c 20 66 61 69 6c 20 61 6e 64 20 53 51 4c 49  ll fail and SQLI
2c050 54 45 5f 42 55 53 59 20 69 73 20 72 65 74 75 72  TE_BUSY is retur
2c060 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70  ned..**.** The p
2c070 72 6f 78 79 20 66 69 6c 65 20 2d 20 61 20 73 69  roxy file - a si
2c080 6e 67 6c 65 2d 62 79 74 65 20 66 69 6c 65 20 75  ngle-byte file u
2c090 73 65 64 20 66 6f 72 20 61 6c 6c 20 61 64 76 69  sed for all advi
2c0a0 73 6f 72 79 20 66 69 6c 65 20 6c 6f 63 6b 73 0a  sory file locks.
2c0b0 2a 2a 20 6e 6f 72 6d 61 6c 6c 79 20 74 61 6b 65  ** normally take
2c0c0 6e 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  n on the databas
2c0d0 65 20 66 69 6c 65 2e 20 20 20 54 68 69 73 20 61  e file.   This a
2c0e0 6c 6c 6f 77 73 20 66 6f 72 20 73 61 66 65 20 73  llows for safe s
2c0f0 68 61 72 69 6e 67 0a 2a 2a 20 6f 66 20 74 68 65  haring.** of the
2c100 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 66   database file f
2c110 6f 72 20 6d 75 6c 74 69 70 6c 65 20 72 65 61 64  or multiple read
2c120 65 72 73 20 61 6e 64 20 77 72 69 74 65 72 73 20  ers and writers 
2c130 6f 6e 20 74 68 65 20 73 61 6d 65 0a 2a 2a 20 68  on the same.** h
2c140 6f 73 74 20 28 74 68 65 20 63 6f 6e 63 68 20 65  ost (the conch e
2c150 6e 73 75 72 65 73 20 74 68 61 74 20 74 68 65 79  nsures that they
2c160 20 61 6c 6c 20 75 73 65 20 74 68 65 20 73 61 6d   all use the sam
2c170 65 20 6c 6f 63 61 6c 20 6c 6f 63 6b 20 66 69 6c  e local lock fil
2c180 65 29 2e 0a 2a 2a 0a 2a 2a 20 52 65 71 75 65 73  e)..**.** Reques
2c190 74 69 6e 67 20 74 68 65 20 6c 6f 63 6b 20 70 72  ting the lock pr
2c1a0 6f 78 79 20 64 6f 65 73 20 6e 6f 74 20 69 6d 6d  oxy does not imm
2c1b0 65 64 69 61 74 65 6c 79 20 74 61 6b 65 20 74 68  ediately take th
2c1c0 65 20 63 6f 6e 63 68 2c 20 69 74 20 69 73 0a 2a  e conch, it is.*
2c1d0 2a 20 6f 6e 6c 79 20 74 61 6b 65 6e 20 77 68 65  * only taken whe
2c1e0 6e 20 74 68 65 20 66 69 72 73 74 20 72 65 71 75  n the first requ
2c1f0 65 73 74 20 74 6f 20 6c 6f 63 6b 20 64 61 74 61  est to lock data
2c200 62 61 73 65 20 66 69 6c 65 20 69 73 20 6d 61 64  base file is mad
2c210 65 2e 20 20 0a 2a 2a 20 54 68 69 73 20 6d 61 74  e.  .** This mat
2c220 63 68 65 73 20 74 68 65 20 73 65 6d 61 6e 74 69  ches the semanti
2c230 63 73 20 6f 66 20 74 68 65 20 74 72 61 64 69 74  cs of the tradit
2c240 69 6f 6e 61 6c 20 6c 6f 63 6b 69 6e 67 20 62 65  ional locking be
2c250 68 61 76 69 6f 72 2c 20 77 68 65 72 65 0a 2a 2a  havior, where.**
2c260 20 6f 70 65 6e 69 6e 67 20 61 20 63 6f 6e 6e 65   opening a conne
2c270 63 74 69 6f 6e 20 74 6f 20 61 20 64 61 74 61 62  ction to a datab
2c280 61 73 65 20 66 69 6c 65 20 64 6f 65 73 20 6e 6f  ase file does no
2c290 74 20 74 61 6b 65 20 61 20 6c 6f 63 6b 20 6f 6e  t take a lock on
2c2a0 20 69 74 2e 0a 2a 2a 20 54 68 65 20 73 68 61 72   it..** The shar
2c2b0 65 64 20 6c 6f 63 6b 20 61 6e 64 20 61 6e 20 6f  ed lock and an o
2c2c0 70 65 6e 20 66 69 6c 65 20 64 65 73 63 72 69 70  pen file descrip
2c2d0 74 6f 72 20 61 72 65 20 6d 61 69 6e 74 61 69 6e  tor are maintain
2c2e0 65 64 20 75 6e 74 69 6c 20 0a 2a 2a 20 74 68 65  ed until .** the
2c2f0 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 74   connection to t
2c300 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20 63  he database is c
2c310 6c 6f 73 65 64 2e 20 0a 2a 2a 0a 2a 2a 20 54 68  losed. .**.** Th
2c320 65 20 70 72 6f 78 79 20 66 69 6c 65 20 61 6e 64  e proxy file and
2c330 20 74 68 65 20 6c 6f 63 6b 20 66 69 6c 65 20 61   the lock file a
2c340 72 65 20 6e 65 76 65 72 20 64 65 6c 65 74 65 64  re never deleted
2c350 20 73 6f 20 74 68 65 79 20 6f 6e 6c 79 20 6e 65   so they only ne
2c360 65 64 0a 2a 2a 20 74 6f 20 62 65 20 63 72 65 61  ed.** to be crea
2c370 74 65 64 20 74 68 65 20 66 69 72 73 74 20 74 69  ted the first ti
2c380 6d 65 20 74 68 65 79 20 61 72 65 20 75 73 65 64  me they are used
2c390 2e 0a 2a 2a 0a 2a 2a 20 43 6f 6e 66 69 67 75 72  ..**.** Configur
2c3a0 61 74 69 6f 6e 20 6f 70 74 69 6f 6e 73 0a 2a 2a  ation options.**
2c3b0 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   ---------------
2c3c0 2d 2d 2d 2d 2d 2d 0a 2a 2a 0a 2a 2a 20 20 53 51  ------.**.**  SQ
2c3d0 4c 49 54 45 5f 50 52 45 46 45 52 5f 50 52 4f 58  LITE_PREFER_PROX
2c3e0 59 5f 4c 4f 43 4b 49 4e 47 0a 2a 2a 0a 2a 2a 20  Y_LOCKING.**.** 
2c3f0 20 20 20 20 20 20 44 61 74 61 62 61 73 65 20 66        Database f
2c400 69 6c 65 73 20 61 63 63 65 73 73 65 64 20 6f 6e  iles accessed on
2c410 20 6e 6f 6e 2d 6c 6f 63 61 6c 20 66 69 6c 65 20   non-local file 
2c420 73 79 73 74 65 6d 73 20 61 72 65 0a 2a 2a 20 20  systems are.**  
2c430 20 20 20 20 20 61 75 74 6f 6d 61 74 69 63 61 6c       automatical
2c440 6c 79 20 63 6f 6e 66 69 67 75 72 65 64 20 66 6f  ly configured fo
2c450 72 20 70 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 2c  r proxy locking,
2c460 20 6c 6f 63 6b 20 66 69 6c 65 73 20 61 72 65 0a   lock files are.
2c470 2a 2a 20 20 20 20 20 20 20 6e 61 6d 65 64 20 61  **       named a
2c480 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 75 73 69  utomatically usi
2c490 6e 67 20 74 68 65 20 73 61 6d 65 20 6c 6f 67 69  ng the same logi
2c4a0 63 20 61 73 0a 2a 2a 20 20 20 20 20 20 20 50 52  c as.**       PR
2c4b0 41 47 4d 41 20 6c 6f 63 6b 5f 70 72 6f 78 79 5f  AGMA lock_proxy_
2c4c0 66 69 6c 65 3d 22 3a 61 75 74 6f 3a 22 0a 2a 2a  file=":auto:".**
2c4d0 20 20 20 20 0a 2a 2a 20 20 53 51 4c 49 54 45 5f      .**  SQLITE_
2c4e0 50 52 4f 58 59 5f 44 45 42 55 47 0a 2a 2a 0a 2a  PROXY_DEBUG.**.*
2c4f0 2a 20 20 20 20 20 20 20 45 6e 61 62 6c 65 73 20  *       Enables 
2c500 74 68 65 20 6c 6f 67 67 69 6e 67 20 6f 66 20 65  the logging of e
2c510 72 72 6f 72 20 6d 65 73 73 61 67 65 73 20 64 75  rror messages du
2c520 72 69 6e 67 20 68 6f 73 74 20 69 64 20 66 69 6c  ring host id fil
2c530 65 0a 2a 2a 20 20 20 20 20 20 20 72 65 74 72 69  e.**       retri
2c540 65 76 61 6c 20 61 6e 64 20 63 72 65 61 74 69 6f  eval and creatio
2c550 6e 0a 2a 2a 0a 2a 2a 20 20 4c 4f 43 4b 50 52 4f  n.**.**  LOCKPRO
2c560 58 59 44 49 52 0a 2a 2a 0a 2a 2a 20 20 20 20 20  XYDIR.**.**     
2c570 20 20 4f 76 65 72 72 69 64 65 73 20 74 68 65 20    Overrides the 
2c580 64 65 66 61 75 6c 74 20 64 69 72 65 63 74 6f 72  default director
2c590 79 20 75 73 65 64 20 66 6f 72 20 6c 6f 63 6b 20  y used for lock 
2c5a0 70 72 6f 78 79 20 66 69 6c 65 73 20 74 68 61 74  proxy files that
2c5b0 0a 2a 2a 20 20 20 20 20 20 20 61 72 65 20 6e 61  .**       are na
2c5c0 6d 65 64 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c  med automaticall
2c5d0 79 20 76 69 61 20 74 68 65 20 22 3a 61 75 74 6f  y via the ":auto
2c5e0 3a 22 20 73 65 74 74 69 6e 67 0a 2a 2a 0a 2a 2a  :" setting.**.**
2c5f0 20 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54    SQLITE_DEFAULT
2c600 5f 50 52 4f 58 59 44 49 52 5f 50 45 52 4d 49 53  _PROXYDIR_PERMIS
2c610 53 49 4f 4e 53 0a 2a 2a 0a 2a 2a 20 20 20 20 20  SIONS.**.**     
2c620 20 20 50 65 72 6d 69 73 73 69 6f 6e 73 20 74 6f    Permissions to
2c630 20 75 73 65 20 77 68 65 6e 20 63 72 65 61 74 69   use when creati
2c640 6e 67 20 61 20 64 69 72 65 63 74 6f 72 79 20 66  ng a directory f
2c650 6f 72 20 73 74 6f 72 69 6e 67 20 74 68 65 0a 2a  or storing the.*
2c660 2a 20 20 20 20 20 20 20 6c 6f 63 6b 20 70 72 6f  *       lock pro
2c670 78 79 20 66 69 6c 65 73 2c 20 6f 6e 6c 79 20 75  xy files, only u
2c680 73 65 64 20 77 68 65 6e 20 4c 4f 43 4b 50 52 4f  sed when LOCKPRO
2c690 58 59 44 49 52 20 69 73 20 6e 6f 74 20 73 65 74  XYDIR is not set
2c6a0 2e 0a 2a 2a 20 20 20 20 0a 2a 2a 20 20 20 20 0a  ..**    .**    .
2c6b0 2a 2a 20 41 73 20 6d 65 6e 74 69 6f 6e 65 64 20  ** As mentioned 
2c6c0 61 62 6f 76 65 2c 20 77 68 65 6e 20 63 6f 6d 70  above, when comp
2c6d0 69 6c 65 64 20 77 69 74 68 20 53 51 4c 49 54 45  iled with SQLITE
2c6e0 5f 50 52 45 46 45 52 5f 50 52 4f 58 59 5f 4c 4f  _PREFER_PROXY_LO
2c6f0 43 4b 49 4e 47 2c 0a 2a 2a 20 73 65 74 74 69 6e  CKING,.** settin
2c700 67 20 74 68 65 20 65 6e 76 69 72 6f 6e 6d 65 6e  g the environmen
2c710 74 20 76 61 72 69 61 62 6c 65 20 53 51 4c 49 54  t variable SQLIT
2c720 45 5f 46 4f 52 43 45 5f 50 52 4f 58 59 5f 4c 4f  E_FORCE_PROXY_LO
2c730 43 4b 49 4e 47 20 74 6f 20 31 20 77 69 6c 6c 0a  CKING to 1 will.
2c740 2a 2a 20 66 6f 72 63 65 20 70 72 6f 78 79 20 6c  ** force proxy l
2c750 6f 63 6b 69 6e 67 20 74 6f 20 62 65 20 75 73 65  ocking to be use
2c760 64 20 66 6f 72 20 65 76 65 72 79 20 64 61 74 61  d for every data
2c770 62 61 73 65 20 66 69 6c 65 20 6f 70 65 6e 65 64  base file opened
2c780 2c 20 61 6e 64 20 30 0a 2a 2a 20 77 69 6c 6c 20  , and 0.** will 
2c790 66 6f 72 63 65 20 61 75 74 6f 6d 61 74 69 63 20  force automatic 
2c7a0 70 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 20 74 6f  proxy locking to
2c7b0 20 62 65 20 64 69 73 61 62 6c 65 64 20 66 6f 72   be disabled for
2c7c0 20 61 6c 6c 20 64 61 74 61 62 61 73 65 0a 2a 2a   all database.**
2c7d0 20 66 69 6c 65 73 20 28 65 78 70 6c 69 63 69 74   files (explicit
2c7e0 79 20 63 61 6c 6c 69 6e 67 20 74 68 65 20 53 51  y calling the SQ
2c7f0 4c 49 54 45 5f 53 45 54 5f 4c 4f 43 4b 50 52 4f  LITE_SET_LOCKPRO
2c800 58 59 46 49 4c 45 20 70 72 61 67 6d 61 20 6f 72  XYFILE pragma or
2c810 0a 2a 2a 20 73 71 6c 69 74 65 5f 66 69 6c 65 5f  .** sqlite_file_
2c820 63 6f 6e 74 72 6f 6c 20 41 50 49 20 69 73 20 6e  control API is n
2c830 6f 74 20 61 66 66 65 63 74 65 64 20 62 79 20 53  ot affected by S
2c840 51 4c 49 54 45 5f 46 4f 52 43 45 5f 50 52 4f 58  QLITE_FORCE_PROX
2c850 59 5f 4c 4f 43 4b 49 4e 47 29 2e 0a 2a 2f 0a 0a  Y_LOCKING)..*/..
2c860 2f 2a 0a 2a 2a 20 50 72 6f 78 79 20 6c 6f 63 6b  /*.** Proxy lock
2c870 69 6e 67 20 69 73 20 6f 6e 6c 79 20 61 76 61 69  ing is only avai
2c880 6c 61 62 6c 65 20 6f 6e 20 4d 61 63 4f 53 58 20  lable on MacOSX 
2c890 0a 2a 2f 0a 23 69 66 20 64 65 66 69 6e 65 64 28  .*/.#if defined(
2c8a0 5f 5f 41 50 50 4c 45 5f 5f 29 20 26 26 20 53 51  __APPLE__) && SQ
2c8b0 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b  LITE_ENABLE_LOCK
2c8c0 49 4e 47 5f 53 54 59 4c 45 0a 0a 2f 2a 0a 2a 2a  ING_STYLE../*.**
2c8d0 20 54 68 65 20 70 72 6f 78 79 4c 6f 63 6b 69 6e   The proxyLockin
2c8e0 67 43 6f 6e 74 65 78 74 20 68 61 73 20 74 68 65  gContext has the
2c8f0 20 70 61 74 68 20 61 6e 64 20 66 69 6c 65 20 73   path and file s
2c900 74 72 75 63 74 75 72 65 73 20 66 6f 72 20 74 68  tructures for th
2c910 65 20 72 65 6d 6f 74 65 20 0a 2a 2a 20 61 6e 64  e remote .** and
2c920 20 6c 6f 63 61 6c 20 70 72 6f 78 79 20 66 69 6c   local proxy fil
2c930 65 73 20 69 6e 20 69 74 0a 2a 2f 0a 74 79 70 65  es in it.*/.type
2c940 64 65 66 20 73 74 72 75 63 74 20 70 72 6f 78 79  def struct proxy
2c950 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 70  LockingContext p
2c960 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65  roxyLockingConte
2c970 78 74 3b 0a 73 74 72 75 63 74 20 70 72 6f 78 79  xt;.struct proxy
2c980 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 7b  LockingContext {
2c990 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 63 6f 6e  .  unixFile *con
2c9a0 63 68 46 69 6c 65 3b 20 20 20 20 20 20 20 20 20  chFile;         
2c9b0 2f 2a 20 4f 70 65 6e 20 63 6f 6e 63 68 20 66 69  /* Open conch fi
2c9c0 6c 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 63 6f  le */.  char *co
2c9d0 6e 63 68 46 69 6c 65 50 61 74 68 3b 20 20 20 20  nchFilePath;    
2c9e0 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20       /* Name of 
2c9f0 74 68 65 20 63 6f 6e 63 68 20 66 69 6c 65 20 2a  the conch file *
2ca00 2f 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 6c 6f  /.  unixFile *lo
2ca10 63 6b 50 72 6f 78 79 3b 20 20 20 20 20 20 20 20  ckProxy;        
2ca20 20 2f 2a 20 4f 70 65 6e 20 70 72 6f 78 79 20 6c   /* Open proxy l
2ca30 6f 63 6b 20 66 69 6c 65 20 2a 2f 0a 20 20 63 68  ock file */.  ch
2ca40 61 72 20 2a 6c 6f 63 6b 50 72 6f 78 79 50 61 74  ar *lockProxyPat
2ca50 68 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61  h;         /* Na
2ca60 6d 65 20 6f 66 20 74 68 65 20 70 72 6f 78 79 20  me of the proxy 
2ca70 6c 6f 63 6b 20 66 69 6c 65 20 2a 2f 0a 20 20 63  lock file */.  c
2ca80 68 61 72 20 2a 64 62 50 61 74 68 3b 20 20 20 20  har *dbPath;    
2ca90 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
2caa0 61 6d 65 20 6f 66 20 74 68 65 20 6f 70 65 6e 20  ame of the open 
2cab0 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 63 6f  file */.  int co
2cac0 6e 63 68 48 65 6c 64 3b 20 20 20 20 20 20 20 20  nchHeld;        
2cad0 20 20 20 20 20 20 20 2f 2a 20 31 20 69 66 20 74         /* 1 if t
2cae0 68 65 20 63 6f 6e 63 68 20 69 73 20 68 65 6c 64  he conch is held
2caf0 2c 20 2d 31 20 69 66 20 6c 6f 63 6b 6c 65 73 73  , -1 if lockless
2cb00 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 6f 6c 64 4c   */.  void *oldL
2cb10 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 20 20  ockingContext;  
2cb20 20 20 20 2f 2a 20 4f 72 69 67 69 6e 61 6c 20 6c     /* Original l
2cb30 6f 63 6b 69 6e 67 63 6f 6e 74 65 78 74 20 74 6f  ockingcontext to
2cb40 20 72 65 73 74 6f 72 65 20 6f 6e 20 63 6c 6f 73   restore on clos
2cb50 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 69  e */.  sqlite3_i
2cb60 6f 5f 6d 65 74 68 6f 64 73 20 63 6f 6e 73 74 20  o_methods const 
2cb70 2a 70 4f 6c 64 4d 65 74 68 6f 64 3b 20 20 20 20  *pOldMethod;    
2cb80 20 2f 2a 20 4f 72 69 67 69 6e 61 6c 20 49 2f 4f   /* Original I/O
2cb90 20 6d 65 74 68 6f 64 73 20 66 6f 72 20 63 6c 6f   methods for clo
2cba0 73 65 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 20 0a 2a 2a  se */.};../* .**
2cbb0 20 54 68 65 20 70 72 6f 78 79 20 6c 6f 63 6b 20   The proxy lock 
2cbc0 66 69 6c 65 20 70 61 74 68 20 66 6f 72 20 74 68  file path for th
2cbd0 65 20 64 61 74 61 62 61 73 65 20 61 74 20 64 62  e database at db
2cbe0 50 61 74 68 20 69 73 20 77 72 69 74 74 65 6e 20  Path is written 
2cbf0 69 6e 74 6f 20 6c 50 61 74 68 2c 20 0a 2a 2a 20  into lPath, .** 
2cc00 77 68 69 63 68 20 6d 75 73 74 20 70 6f 69 6e 74  which must point
2cc10 20 74 6f 20 76 61 6c 69 64 2c 20 77 72 69 74 61   to valid, writa
2cc20 62 6c 65 20 6d 65 6d 6f 72 79 20 6c 61 72 67 65  ble memory large
2cc30 20 65 6e 6f 75 67 68 20 66 6f 72 20 61 20 6d 61   enough for a ma
2cc40 78 4c 65 6e 20 6c 65 6e 67 74 68 0a 2a 2a 20 66  xLen length.** f
2cc50 69 6c 65 20 70 61 74 68 2e 20 0a 2a 2f 0a 73 74  ile path. .*/.st
2cc60 61 74 69 63 20 69 6e 74 20 70 72 6f 78 79 47 65  atic int proxyGe
2cc70 74 4c 6f 63 6b 50 61 74 68 28 63 6f 6e 73 74 20  tLockPath(const 
2cc80 63 68 61 72 20 2a 64 62 50 61 74 68 2c 20 63 68  char *dbPath, ch
2cc90 61 72 20 2a 6c 50 61 74 68 2c 20 73 69 7a 65 5f  ar *lPath, size_
2cca0 74 20 6d 61 78 4c 65 6e 29 7b 0a 20 20 69 6e 74  t maxLen){.  int
2ccb0 20 6c 65 6e 3b 0a 20 20 69 6e 74 20 64 62 4c 65   len;.  int dbLe
2ccc0 6e 3b 0a 20 20 69 6e 74 20 69 3b 0a 0a 23 69 66  n;.  int i;..#if
2ccd0 64 65 66 20 4c 4f 43 4b 50 52 4f 58 59 44 49 52  def LOCKPROXYDIR
2cce0 0a 20 20 6c 65 6e 20 3d 20 73 74 72 6c 63 70 79  .  len = strlcpy
2ccf0 28 6c 50 61 74 68 2c 20 4c 4f 43 4b 50 52 4f 58  (lPath, LOCKPROX
2cd00 59 44 49 52 2c 20 6d 61 78 4c 65 6e 29 3b 0a 23  YDIR, maxLen);.#
2cd10 65 6c 73 65 0a 23 20 69 66 64 65 66 20 5f 43 53  else.# ifdef _CS
2cd20 5f 44 41 52 57 49 4e 5f 55 53 45 52 5f 54 45 4d  _DARWIN_USER_TEM
2cd30 50 5f 44 49 52 0a 20 20 7b 0a 20 20 20 20 69 66  P_DIR.  {.    if
2cd40 28 20 21 63 6f 6e 66 73 74 72 28 5f 43 53 5f 44  ( !confstr(_CS_D
2cd50 41 52 57 49 4e 5f 55 53 45 52 5f 54 45 4d 50 5f  ARWIN_USER_TEMP_
2cd60 44 49 52 2c 20 6c 50 61 74 68 2c 20 6d 61 78 4c  DIR, lPath, maxL
2cd70 65 6e 29 20 29 7b 0a 20 20 20 20 20 20 4f 53 54  en) ){.      OST
2cd80 52 41 43 45 34 28 22 47 45 54 4c 4f 43 4b 50 41  RACE4("GETLOCKPA
2cd90 54 48 20 20 66 61 69 6c 65 64 20 25 73 20 65 72  TH  failed %s er
2cda0 72 6e 6f 3d 25 64 20 70 69 64 3d 25 64 5c 6e 22  rno=%d pid=%d\n"
2cdb0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
2cdc0 20 6c 50 61 74 68 2c 20 65 72 72 6e 6f 2c 20 67   lPath, errno, g
2cdd0 65 74 70 69 64 28 29 29 3b 0a 20 20 20 20 20 20  etpid());.      
2cde0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f  return SQLITE_IO
2cdf0 45 52 52 5f 4c 4f 43 4b 3b 0a 20 20 20 20 7d 0a  ERR_LOCK;.    }.
2ce00 20 20 20 20 6c 65 6e 20 3d 20 73 74 72 6c 63 61      len = strlca
2ce10 74 28 6c 50 61 74 68 2c 20 22 73 71 6c 69 74 65  t(lPath, "sqlite
2ce20 70 6c 6f 63 6b 73 22 2c 20 6d 61 78 4c 65 6e 29  plocks", maxLen)
2ce30 3b 20 20 20 20 0a 20 20 7d 0a 23 20 65 6c 73 65  ;    .  }.# else
2ce40 0a 20 20 6c 65 6e 20 3d 20 73 74 72 6c 63 70 79  .  len = strlcpy
2ce50 28 6c 50 61 74 68 2c 20 22 2f 74 6d 70 2f 22 2c  (lPath, "/tmp/",
2ce60 20 6d 61 78 4c 65 6e 29 3b 0a 23 20 65 6e 64 69   maxLen);.# endi
2ce70 66 0a 23 65 6e 64 69 66 0a 0a 20 20 69 66 28 20  f.#endif..  if( 
2ce80 6c 50 61 74 68 5b 6c 65 6e 2d 31 5d 21 3d 27 2f  lPath[len-1]!='/
2ce90 27 20 29 7b 0a 20 20 20 20 6c 65 6e 20 3d 20 73  ' ){.    len = s
2cea0 74 72 6c 63 61 74 28 6c 50 61 74 68 2c 20 22 2f  trlcat(lPath, "/
2ceb0 22 2c 20 6d 61 78 4c 65 6e 29 3b 0a 20 20 7d 0a  ", maxLen);.  }.
2cec0 20 20 0a 20 20 2f 2a 20 74 72 61 6e 73 66 6f 72    .  /* transfor
2ced0 6d 20 74 68 65 20 64 62 20 70 61 74 68 20 74 6f  m the db path to
2cee0 20 61 20 75 6e 69 71 75 65 20 63 61 63 68 65 20   a unique cache 
2cef0 6e 61 6d 65 20 2a 2f 0a 20 20 64 62 4c 65 6e 20  name */.  dbLen 
2cf00 3d 20 28 69 6e 74 29 73 74 72 6c 65 6e 28 64 62  = (int)strlen(db
2cf10 50 61 74 68 29 3b 0a 20 20 66 6f 72 28 20 69 3d  Path);.  for( i=
2cf20 30 3b 20 69 3c 64 62 4c 65 6e 20 26 26 20 28 69  0; i<dbLen && (i
2cf30 2b 6c 65 6e 2b 37 29 3c 6d 61 78 4c 65 6e 3b 20  +len+7)<maxLen; 
2cf40 69 2b 2b 29 7b 0a 20 20 20 20 63 68 61 72 20 63  i++){.    char c
2cf50 20 3d 20 64 62 50 61 74 68 5b 69 5d 3b 0a 20 20   = dbPath[i];.  
2cf60 20 20 6c 50 61 74 68 5b 69 2b 6c 65 6e 5d 20 3d    lPath[i+len] =
2cf70 20 28 63 3d 3d 27 2f 27 29 3f 27 5f 27 3a 63 3b   (c=='/')?'_':c;
2cf80 0a 20 20 7d 0a 20 20 6c 50 61 74 68 5b 69 2b 6c  .  }.  lPath[i+l
2cf90 65 6e 5d 3d 27 5c 30 27 3b 0a 20 20 73 74 72 6c  en]='\0';.  strl
2cfa0 63 61 74 28 6c 50 61 74 68 2c 20 22 3a 61 75 74  cat(lPath, ":aut
2cfb0 6f 3a 22 2c 20 6d 61 78 4c 65 6e 29 3b 0a 20 20  o:", maxLen);.  
2cfc0 4f 53 54 52 41 43 45 33 28 22 47 45 54 4c 4f 43  OSTRACE3("GETLOC
2cfd0 4b 50 41 54 48 20 20 70 72 6f 78 79 20 6c 6f 63  KPATH  proxy loc
2cfe0 6b 20 70 61 74 68 3d 25 73 20 70 69 64 3d 25 64  k path=%s pid=%d
2cff0 5c 6e 22 2c 20 6c 50 61 74 68 2c 20 67 65 74 70  \n", lPath, getp
2d000 69 64 28 29 29 3b 0a 20 20 72 65 74 75 72 6e 20  id());.  return 
2d010 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
2d020 20 0a 20 2a 2a 20 43 72 65 61 74 65 73 20 74 68   . ** Creates th
2d030 65 20 6c 6f 63 6b 20 66 69 6c 65 20 61 6e 64 20  e lock file and 
2d040 61 6e 79 20 6d 69 73 73 69 6e 67 20 64 69 72 65  any missing dire
2d050 63 74 6f 72 69 65 73 20 69 6e 20 6c 6f 63 6b 50  ctories in lockP
2d060 61 74 68 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69  ath. */.static i
2d070 6e 74 20 70 72 6f 78 79 43 72 65 61 74 65 4c 6f  nt proxyCreateLo
2d080 63 6b 50 61 74 68 28 63 6f 6e 73 74 20 63 68 61  ckPath(const cha
2d090 72 20 2a 6c 6f 63 6b 50 61 74 68 29 7b 0a 20 20  r *lockPath){.  
2d0a0 69 6e 74 20 69 2c 20 6c 65 6e 3b 0a 20 20 63 68  int i, len;.  ch
2d0b0 61 72 20 62 75 66 5b 4d 41 58 50 41 54 48 4c 45  ar buf[MAXPATHLE
2d0c0 4e 5d 3b 0a 20 20 69 6e 74 20 73 74 61 72 74 20  N];.  int start 
2d0d0 3d 20 30 3b 0a 20 20 0a 20 20 61 73 73 65 72 74  = 0;.  .  assert
2d0e0 28 6c 6f 63 6b 50 61 74 68 21 3d 4e 55 4c 4c 29  (lockPath!=NULL)
2d0f0 3b 0a 20 20 2f 2a 20 74 72 79 20 74 6f 20 63 72  ;.  /* try to cr
2d100 65 61 74 65 20 61 6c 6c 20 74 68 65 20 69 6e 74  eate all the int
2d110 65 72 6d 65 64 69 61 74 65 20 64 69 72 65 63 74  ermediate direct
2d120 6f 72 69 65 73 20 2a 2f 0a 20 20 6c 65 6e 20 3d  ories */.  len =
2d130 20 28 69 6e 74 29 73 74 72 6c 65 6e 28 6c 6f 63   (int)strlen(loc
2d140 6b 50 61 74 68 29 3b 0a 20 20 62 75 66 5b 30 5d  kPath);.  buf[0]
2d150 20 3d 20 6c 6f 63 6b 50 61 74 68 5b 30 5d 3b 0a   = lockPath[0];.
2d160 20 20 66 6f 72 28 20 69 3d 31 3b 20 69 3c 6c 65    for( i=1; i<le
2d170 6e 3b 20 69 2b 2b 20 29 7b 0a 20 20 20 20 69 66  n; i++ ){.    if
2d180 28 20 6c 6f 63 6b 50 61 74 68 5b 69 5d 20 3d 3d  ( lockPath[i] ==
2d190 20 27 2f 27 20 26 26 20 28 69 20 2d 20 73 74 61   '/' && (i - sta
2d1a0 72 74 20 3e 20 30 29 20 29 7b 0a 20 20 20 20 20  rt > 0) ){.     
2d1b0 20 2f 2a 20 6f 6e 6c 79 20 6d 6b 64 69 72 20 69   /* only mkdir i
2d1c0 66 20 6c 65 61 66 20 64 69 72 20 21 3d 20 22 2e  f leaf dir != ".
2d1d0 22 20 6f 72 20 22 2f 22 20 6f 72 20 22 2e 2e 22  " or "/" or ".."
2d1e0 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 69 2d   */.      if( i-
2d1f0 73 74 61 72 74 3e 32 20 7c 7c 20 28 69 2d 73 74  start>2 || (i-st
2d200 61 72 74 3d 3d 31 20 26 26 20 62 75 66 5b 73 74  art==1 && buf[st
2d210 61 72 74 5d 20 21 3d 20 27 2e 27 20 26 26 20 62  art] != '.' && b
2d220 75 66 5b 73 74 61 72 74 5d 20 21 3d 20 27 2f 27  uf[start] != '/'
2d230 29 20 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 28  ) .         || (
2d240 69 2d 73 74 61 72 74 3d 3d 32 20 26 26 20 62 75  i-start==2 && bu
2d250 66 5b 73 74 61 72 74 5d 20 21 3d 20 27 2e 27 20  f[start] != '.' 
2d260 26 26 20 62 75 66 5b 73 74 61 72 74 2b 31 5d 20  && buf[start+1] 
2d270 21 3d 20 27 2e 27 29 20 29 7b 0a 20 20 20 20 20  != '.') ){.     
2d280 20 20 20 62 75 66 5b 69 5d 3d 27 5c 30 27 3b 0a     buf[i]='\0';.
2d290 20 20 20 20 20 20 20 20 69 66 28 20 6d 6b 64 69          if( mkdi
2d2a0 72 28 62 75 66 2c 20 53 51 4c 49 54 45 5f 44 45  r(buf, SQLITE_DE
2d2b0 46 41 55 4c 54 5f 50 52 4f 58 59 44 49 52 5f 50  FAULT_PROXYDIR_P
2d2c0 45 52 4d 49 53 53 49 4f 4e 53 29 20 29 7b 0a 20  ERMISSIONS) ){. 
2d2d0 20 20 20 20 20 20 20 20 20 69 6e 74 20 65 72 72           int err
2d2e0 3d 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20 20 20  =errno;.        
2d2f0 20 20 69 66 28 20 65 72 72 21 3d 45 45 58 49 53    if( err!=EEXIS
2d300 54 20 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20  T ) {.          
2d310 20 20 4f 53 54 52 41 43 45 35 28 22 43 52 45 41    OSTRACE5("CREA
2d320 54 45 4c 4f 43 4b 50 41 54 48 20 20 46 41 49 4c  TELOCKPATH  FAIL
2d330 45 44 20 63 72 65 61 74 69 6e 67 20 25 73 2c 20  ED creating %s, 
2d340 22 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ".              
2d350 20 20 20 20 20 20 20 22 27 25 73 27 20 70 72 6f         "'%s' pro
2d360 78 79 20 6c 6f 63 6b 20 70 61 74 68 3d 25 73 20  xy lock path=%s 
2d370 70 69 64 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20  pid=%d\n",.     
2d380 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d390 62 75 66 2c 20 73 74 72 65 72 72 6f 72 28 65 72  buf, strerror(er
2d3a0 72 29 2c 20 6c 6f 63 6b 50 61 74 68 2c 20 67 65  r), lockPath, ge
2d3b0 74 70 69 64 28 29 29 3b 0a 20 20 20 20 20 20 20  tpid());.       
2d3c0 20 20 20 20 20 72 65 74 75 72 6e 20 65 72 72 3b       return err;
2d3d0 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
2d3e0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
2d3f0 20 20 20 20 20 73 74 61 72 74 3d 69 2b 31 3b 0a       start=i+1;.
2d400 20 20 20 20 7d 0a 20 20 20 20 62 75 66 5b 69 5d      }.    buf[i]
2d410 20 3d 20 6c 6f 63 6b 50 61 74 68 5b 69 5d 3b 0a   = lockPath[i];.
2d420 20 20 7d 0a 20 20 4f 53 54 52 41 43 45 33 28 22    }.  OSTRACE3("
2d430 43 52 45 41 54 45 4c 4f 43 4b 50 41 54 48 20 20  CREATELOCKPATH  
2d440 70 72 6f 78 79 20 6c 6f 63 6b 20 70 61 74 68 3d  proxy lock path=
2d450 25 73 20 70 69 64 3d 25 64 5c 6e 22 2c 20 6c 6f  %s pid=%d\n", lo
2d460 63 6b 50 61 74 68 2c 20 67 65 74 70 69 64 28 29  ckPath, getpid()
2d470 29 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d  );.  return 0;.}
2d480 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61  ../*.** Create a
2d490 20 6e 65 77 20 56 46 53 20 66 69 6c 65 20 64 65   new VFS file de
2d4a0 73 63 72 69 70 74 6f 72 20 28 73 74 6f 72 65 64  scriptor (stored
2d4b0 20 69 6e 20 6d 65 6d 6f 72 79 20 6f 62 74 61 69   in memory obtai
2d4c0 6e 65 64 20 66 72 6f 6d 0a 2a 2a 20 73 71 6c 69  ned from.** sqli
2d4d0 74 65 33 5f 6d 61 6c 6c 6f 63 29 20 61 6e 64 20  te3_malloc) and 
2d4e0 6f 70 65 6e 20 74 68 65 20 66 69 6c 65 20 6e 61  open the file na
2d4f0 6d 65 64 20 22 70 61 74 68 22 20 69 6e 20 74 68  med "path" in th
2d500 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  e file descripto
2d510 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 61 6c  r..**.** The cal
2d520 6c 65 72 20 69 73 20 72 65 73 70 6f 6e 73 69 62  ler is responsib
2d530 6c 65 20 6e 6f 74 20 6f 6e 6c 79 20 66 6f 72 20  le not only for 
2d540 63 6c 6f 73 69 6e 67 20 74 68 65 20 66 69 6c 65  closing the file
2d550 20 64 65 73 63 72 69 70 74 6f 72 0a 2a 2a 20 62   descriptor.** b
2d560 75 74 20 61 6c 73 6f 20 66 6f 72 20 66 72 65 65  ut also for free
2d570 69 6e 67 20 74 68 65 20 6d 65 6d 6f 72 79 20 61  ing the memory a
2d580 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74  ssociated with t
2d590 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  he file descript
2d5a0 6f 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  or..*/.static in
2d5b0 74 20 70 72 6f 78 79 43 72 65 61 74 65 55 6e 69  t proxyCreateUni
2d5c0 78 46 69 6c 65 28 0a 20 20 20 20 63 6f 6e 73 74  xFile(.    const
2d5d0 20 63 68 61 72 20 2a 70 61 74 68 2c 20 20 20 20   char *path,    
2d5e0 20 20 20 20 2f 2a 20 70 61 74 68 20 66 6f 72 20      /* path for 
2d5f0 74 68 65 20 6e 65 77 20 75 6e 69 78 46 69 6c 65  the new unixFile
2d600 20 2a 2f 0a 20 20 20 20 75 6e 69 78 46 69 6c 65   */.    unixFile
2d610 20 2a 2a 70 70 46 69 6c 65 2c 20 20 20 20 20 20   **ppFile,      
2d620 20 2f 2a 20 75 6e 69 78 46 69 6c 65 20 63 72 65   /* unixFile cre
2d630 61 74 65 64 20 61 6e 64 20 72 65 74 75 72 6e 65  ated and returne
2d640 64 20 62 79 20 72 65 66 20 2a 2f 0a 20 20 20 20  d by ref */.    
2d650 69 6e 74 20 69 73 6c 6f 63 6b 66 69 6c 65 20 20  int islockfile  
2d660 20 20 20 20 20 20 20 20 20 2f 2a 20 69 66 20 6e           /* if n
2d670 6f 6e 20 7a 65 72 6f 20 6d 69 73 73 69 6e 67 20  on zero missing 
2d680 64 69 72 73 20 77 69 6c 6c 20 62 65 20 63 72 65  dirs will be cre
2d690 61 74 65 64 20 2a 2f 0a 29 20 7b 0a 20 20 69 6e  ated */.) {.  in
2d6a0 74 20 66 64 20 3d 20 2d 31 3b 0a 20 20 69 6e 74  t fd = -1;.  int
2d6b0 20 64 69 72 66 64 20 3d 20 2d 31 3b 0a 20 20 75   dirfd = -1;.  u
2d6c0 6e 69 78 46 69 6c 65 20 2a 70 4e 65 77 3b 0a 20  nixFile *pNew;. 
2d6d0 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
2d6e0 5f 4f 4b 3b 0a 20 20 69 6e 74 20 6f 70 65 6e 46  _OK;.  int openF
2d6f0 6c 61 67 73 20 3d 20 4f 5f 52 44 57 52 20 7c 20  lags = O_RDWR | 
2d700 4f 5f 43 52 45 41 54 3b 0a 20 20 73 71 6c 69 74  O_CREAT;.  sqlit
2d710 65 33 5f 76 66 73 20 64 75 6d 6d 79 56 66 73 3b  e3_vfs dummyVfs;
2d720 0a 20 20 69 6e 74 20 74 65 72 72 6e 6f 20 3d 20  .  int terrno = 
2d730 30 3b 0a 20 20 55 6e 69 78 55 6e 75 73 65 64 46  0;.  UnixUnusedF
2d740 64 20 2a 70 55 6e 75 73 65 64 20 3d 20 4e 55 4c  d *pUnused = NUL
2d750 4c 3b 0a 0a 20 20 2f 2a 20 31 2e 20 66 69 72 73  L;..  /* 1. firs
2d760 74 20 74 72 79 20 74 6f 20 6f 70 65 6e 2f 63 72  t try to open/cr
2d770 65 61 74 65 20 74 68 65 20 66 69 6c 65 0a 20 20  eate the file.  
2d780 2a 2a 20 32 2e 20 69 66 20 74 68 61 74 20 66 61  ** 2. if that fa
2d790 69 6c 73 2c 20 61 6e 64 20 74 68 69 73 20 69 73  ils, and this is
2d7a0 20 61 20 6c 6f 63 6b 20 66 69 6c 65 20 28 6e 6f   a lock file (no
2d7b0 74 2d 63 6f 6e 63 68 29 2c 20 74 72 79 20 63 72  t-conch), try cr
2d7c0 65 61 74 69 6e 67 0a 20 20 2a 2a 20 74 68 65 20  eating.  ** the 
2d7d0 70 61 72 65 6e 74 20 64 69 72 65 63 74 6f 72 69  parent directori
2d7e0 65 73 20 61 6e 64 20 74 68 65 6e 20 74 72 79 20  es and then try 
2d7f0 61 67 61 69 6e 2e 0a 20 20 2a 2a 20 33 2e 20 69  again..  ** 3. i
2d800 66 20 74 68 61 74 20 66 61 69 6c 73 2c 20 74 72  f that fails, tr
2d810 79 20 74 6f 20 6f 70 65 6e 20 74 68 65 20 66 69  y to open the fi
2d820 6c 65 20 72 65 61 64 2d 6f 6e 6c 79 0a 20 20 2a  le read-only.  *
2d830 2a 20 6f 74 68 65 72 77 69 73 65 20 72 65 74 75  * otherwise retu
2d840 72 6e 20 42 55 53 59 20 28 69 66 20 6c 6f 63 6b  rn BUSY (if lock
2d850 20 66 69 6c 65 29 20 6f 72 20 43 41 4e 54 4f 50   file) or CANTOP
2d860 45 4e 20 66 6f 72 20 74 68 65 20 63 6f 6e 63 68  EN for the conch
2d870 20 66 69 6c 65 0a 20 20 2a 2f 0a 20 20 70 55 6e   file.  */.  pUn
2d880 75 73 65 64 20 3d 20 66 69 6e 64 52 65 75 73 61  used = findReusa
2d890 62 6c 65 46 64 28 70 61 74 68 2c 20 6f 70 65 6e  bleFd(path, open
2d8a0 46 6c 61 67 73 29 3b 0a 20 20 69 66 28 20 70 55  Flags);.  if( pU
2d8b0 6e 75 73 65 64 20 29 7b 0a 20 20 20 20 66 64 20  nused ){.    fd 
2d8c0 3d 20 70 55 6e 75 73 65 64 2d 3e 66 64 3b 0a 20  = pUnused->fd;. 
2d8d0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 55 6e 75   }else{.    pUnu
2d8e0 73 65 64 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61  sed = sqlite3_ma
2d8f0 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 2a 70 55 6e  lloc(sizeof(*pUn
2d900 75 73 65 64 29 29 3b 0a 20 20 20 20 69 66 28 20  used));.    if( 
2d910 21 70 55 6e 75 73 65 64 20 29 7b 0a 20 20 20 20  !pUnused ){.    
2d920 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
2d930 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 7d  NOMEM;.    }.  }
2d940 0a 20 20 69 66 28 20 66 64 3c 30 20 29 7b 0a 20  .  if( fd<0 ){. 
2d950 20 20 20 66 64 20 3d 20 6f 70 65 6e 28 70 61 74     fd = open(pat
2d960 68 2c 20 6f 70 65 6e 46 6c 61 67 73 2c 20 53 51  h, openFlags, SQ
2d970 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 46 49 4c  LITE_DEFAULT_FIL
2d980 45 5f 50 45 52 4d 49 53 53 49 4f 4e 53 29 3b 0a  E_PERMISSIONS);.
2d990 20 20 20 20 74 65 72 72 6e 6f 20 3d 20 65 72 72      terrno = err
2d9a0 6e 6f 3b 0a 20 20 20 20 69 66 28 20 66 64 3c 30  no;.    if( fd<0
2d9b0 20 26 26 20 65 72 72 6e 6f 3d 3d 45 4e 4f 45 4e   && errno==ENOEN
2d9c0 54 20 26 26 20 69 73 6c 6f 63 6b 66 69 6c 65 20  T && islockfile 
2d9d0 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 72 6f  ){.      if( pro
2d9e0 78 79 43 72 65 61 74 65 4c 6f 63 6b 50 61 74 68  xyCreateLockPath
2d9f0 28 70 61 74 68 29 20 3d 3d 20 53 51 4c 49 54 45  (path) == SQLITE
2da00 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 66  _OK ){.        f
2da10 64 20 3d 20 6f 70 65 6e 28 70 61 74 68 2c 20 6f  d = open(path, o
2da20 70 65 6e 46 6c 61 67 73 2c 20 53 51 4c 49 54 45  penFlags, SQLITE
2da30 5f 44 45 46 41 55 4c 54 5f 46 49 4c 45 5f 50 45  _DEFAULT_FILE_PE
2da40 52 4d 49 53 53 49 4f 4e 53 29 3b 0a 20 20 20 20  RMISSIONS);.    
2da50 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20    }.    }.  }.  
2da60 69 66 28 20 66 64 3c 30 20 29 7b 0a 20 20 20 20  if( fd<0 ){.    
2da70 6f 70 65 6e 46 6c 61 67 73 20 3d 20 4f 5f 52 44  openFlags = O_RD
2da80 4f 4e 4c 59 3b 0a 20 20 20 20 66 64 20 3d 20 6f  ONLY;.    fd = o
2da90 70 65 6e 28 70 61 74 68 2c 20 6f 70 65 6e 46 6c  pen(path, openFl
2daa0 61 67 73 2c 20 53 51 4c 49 54 45 5f 44 45 46 41  ags, SQLITE_DEFA
2dab0 55 4c 54 5f 46 49 4c 45 5f 50 45 52 4d 49 53 53  ULT_FILE_PERMISS
2dac0 49 4f 4e 53 29 3b 0a 20 20 20 20 74 65 72 72 6e  IONS);.    terrn
2dad0 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 7d 0a 20  o = errno;.  }. 
2dae0 20 69 66 28 20 66 64 3c 30 20 29 7b 0a 20 20 20   if( fd<0 ){.   
2daf0 20 69 66 28 20 69 73 6c 6f 63 6b 66 69 6c 65 20   if( islockfile 
2db00 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
2db10 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20  SQLITE_BUSY;.   
2db20 20 7d 0a 20 20 20 20 73 77 69 74 63 68 20 28 74   }.    switch (t
2db30 65 72 72 6e 6f 29 20 7b 0a 20 20 20 20 20 20 63  errno) {.      c
2db40 61 73 65 20 45 41 43 43 45 53 3a 0a 20 20 20 20  ase EACCES:.    
2db50 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
2db60 45 5f 50 45 52 4d 3b 0a 20 20 20 20 20 20 63 61  E_PERM;.      ca
2db70 73 65 20 45 49 4f 3a 20 0a 20 20 20 20 20 20 20  se EIO: .       
2db80 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49   return SQLITE_I
2db90 4f 45 52 52 5f 4c 4f 43 4b 3b 20 2f 2a 20 65 76  OERR_LOCK; /* ev
2dba0 65 6e 20 74 68 6f 75 67 68 20 69 74 20 69 73 20  en though it is 
2dbb0 74 68 65 20 63 6f 6e 63 68 20 2a 2f 0a 20 20 20  the conch */.   
2dbc0 20 20 20 64 65 66 61 75 6c 74 3a 0a 20 20 20 20     default:.    
2dbd0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
2dbe0 45 5f 43 41 4e 54 4f 50 45 4e 5f 42 4b 50 54 3b  E_CANTOPEN_BKPT;
2dbf0 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 0a 20 20  .    }.  }.  .  
2dc00 70 4e 65 77 20 3d 20 28 75 6e 69 78 46 69 6c 65  pNew = (unixFile
2dc10 20 2a 29 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f   *)sqlite3_mallo
2dc20 63 28 73 69 7a 65 6f 66 28 2a 70 4e 65 77 29 29  c(sizeof(*pNew))
2dc30 3b 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d 4e 55  ;.  if( pNew==NU
2dc40 4c 4c 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53  LL ){.    rc = S
2dc50 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
2dc60 20 67 6f 74 6f 20 65 6e 64 5f 63 72 65 61 74 65   goto end_create
2dc70 5f 70 72 6f 78 79 3b 0a 20 20 7d 0a 20 20 6d 65  _proxy;.  }.  me
2dc80 6d 73 65 74 28 70 4e 65 77 2c 20 30 2c 20 73 69  mset(pNew, 0, si
2dc90 7a 65 6f 66 28 75 6e 69 78 46 69 6c 65 29 29 3b  zeof(unixFile));
2dca0 0a 20 20 70 4e 65 77 2d 3e 6f 70 65 6e 46 6c 61  .  pNew->openFla
2dcb0 67 73 20 3d 20 6f 70 65 6e 46 6c 61 67 73 3b 0a  gs = openFlags;.
2dcc0 20 20 64 75 6d 6d 79 56 66 73 2e 70 41 70 70 44    dummyVfs.pAppD
2dcd0 61 74 61 20 3d 20 28 76 6f 69 64 2a 29 26 61 75  ata = (void*)&au
2dce0 74 6f 6c 6f 63 6b 49 6f 46 69 6e 64 65 72 3b 0a  tolockIoFinder;.
2dcf0 20 20 70 55 6e 75 73 65 64 2d 3e 66 64 20 3d 20    pUnused->fd = 
2dd00 66 64 3b 0a 20 20 70 55 6e 75 73 65 64 2d 3e 66  fd;.  pUnused->f
2dd10 6c 61 67 73 20 3d 20 6f 70 65 6e 46 6c 61 67 73  lags = openFlags
2dd20 3b 0a 20 20 70 4e 65 77 2d 3e 70 55 6e 75 73 65  ;.  pNew->pUnuse
2dd30 64 20 3d 20 70 55 6e 75 73 65 64 3b 0a 20 20 0a  d = pUnused;.  .
2dd40 20 20 72 63 20 3d 20 66 69 6c 6c 49 6e 55 6e 69    rc = fillInUni
2dd50 78 46 69 6c 65 28 26 64 75 6d 6d 79 56 66 73 2c  xFile(&dummyVfs,
2dd60 20 66 64 2c 20 64 69 72 66 64 2c 20 28 73 71 6c   fd, dirfd, (sql
2dd70 69 74 65 33 5f 66 69 6c 65 2a 29 70 4e 65 77 2c  ite3_file*)pNew,
2dd80 20 70 61 74 68 2c 20 30 2c 20 30 29 3b 0a 20 20   path, 0, 0);.  
2dd90 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
2dda0 4b 20 29 7b 0a 20 20 20 20 2a 70 70 46 69 6c 65  K ){.    *ppFile
2ddb0 20 3d 20 70 4e 65 77 3b 0a 20 20 20 20 72 65 74   = pNew;.    ret
2ddc0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
2ddd0 20 7d 0a 65 6e 64 5f 63 72 65 61 74 65 5f 70 72   }.end_create_pr
2dde0 6f 78 79 3a 20 20 20 20 0a 20 20 63 6c 6f 73 65  oxy:    .  close
2ddf0 28 66 64 29 3b 20 2f 2a 20 73 69 6c 65 6e 74 6c  (fd); /* silentl
2de00 79 20 6c 65 61 6b 20 66 64 20 69 66 20 65 72 72  y leak fd if err
2de10 6f 72 2c 20 77 65 27 72 65 20 61 6c 72 65 61 64  or, we're alread
2de20 79 20 69 6e 20 65 72 72 6f 72 20 2a 2f 0a 20 20  y in error */.  
2de30 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 4e 65  sqlite3_free(pNe
2de40 77 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72  w);.  sqlite3_fr
2de50 65 65 28 70 55 6e 75 73 65 64 29 3b 0a 20 20 72  ee(pUnused);.  r
2de60 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66  eturn rc;.}..#if
2de70 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a  def SQLITE_TEST.
2de80 2f 2a 20 73 69 6d 75 6c 61 74 65 20 6d 75 6c 74  /* simulate mult
2de90 69 70 6c 65 20 68 6f 73 74 73 20 62 79 20 63 72  iple hosts by cr
2dea0 65 61 74 69 6e 67 20 75 6e 69 71 75 65 20 68 6f  eating unique ho
2deb0 73 74 69 64 20 66 69 6c 65 20 70 61 74 68 73 20  stid file paths 
2dec0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 68  */.int sqlite3_h
2ded0 6f 73 74 69 64 5f 6e 75 6d 20 3d 20 30 3b 0a 23  ostid_num = 0;.#
2dee0 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 50  endif..#define P
2def0 52 4f 58 59 5f 48 4f 53 54 49 44 4c 45 4e 20 20  ROXY_HOSTIDLEN  
2df00 20 20 31 36 20 20 2f 2a 20 63 6f 6e 63 68 20 66    16  /* conch f
2df10 69 6c 65 20 68 6f 73 74 20 69 64 20 6c 65 6e 67  ile host id leng
2df20 74 68 20 2a 2f 0a 0a 2f 2a 20 67 65 74 20 74 68  th */../* get th
2df30 65 20 68 6f 73 74 20 49 44 20 76 69 61 20 67 65  e host ID via ge
2df40 74 68 6f 73 74 75 75 69 64 28 29 2c 20 70 48 6f  thostuuid(), pHo
2df50 73 74 49 44 20 6d 75 73 74 20 70 6f 69 6e 74 20  stID must point 
2df60 74 6f 20 50 52 4f 58 59 5f 48 4f 53 54 49 44 4c  to PROXY_HOSTIDL
2df70 45 4e 20 0a 2a 2a 20 62 79 74 65 73 20 6f 66 20  EN .** bytes of 
2df80 77 72 69 74 61 62 6c 65 20 6d 65 6d 6f 72 79 2e  writable memory.
2df90 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
2dfa0 72 6f 78 79 47 65 74 48 6f 73 74 49 44 28 75 6e  roxyGetHostID(un
2dfb0 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 48 6f  signed char *pHo
2dfc0 73 74 49 44 2c 20 69 6e 74 20 2a 70 45 72 72 6f  stID, int *pErro
2dfd0 72 29 7b 0a 20 20 73 74 72 75 63 74 20 74 69 6d  r){.  struct tim
2dfe0 65 73 70 65 63 20 74 69 6d 65 6f 75 74 20 3d 20  espec timeout = 
2dff0 7b 31 2c 20 30 7d 3b 20 2f 2a 20 31 20 73 65 63  {1, 0}; /* 1 sec
2e000 20 74 69 6d 65 6f 75 74 20 2a 2f 0a 20 20 0a 20   timeout */.  . 
2e010 20 61 73 73 65 72 74 28 50 52 4f 58 59 5f 48 4f   assert(PROXY_HO
2e020 53 54 49 44 4c 45 4e 20 3d 3d 20 73 69 7a 65 6f  STIDLEN == sizeo
2e030 66 28 75 75 69 64 5f 74 29 29 3b 0a 20 20 6d 65  f(uuid_t));.  me
2e040 6d 73 65 74 28 70 48 6f 73 74 49 44 2c 20 30 2c  mset(pHostID, 0,
2e050 20 50 52 4f 58 59 5f 48 4f 53 54 49 44 4c 45 4e   PROXY_HOSTIDLEN
2e060 29 3b 0a 20 20 69 66 28 20 67 65 74 68 6f 73 74  );.  if( gethost
2e070 75 75 69 64 28 70 48 6f 73 74 49 44 2c 20 26 74  uuid(pHostID, &t
2e080 69 6d 65 6f 75 74 29 20 29 7b 0a 20 20 20 20 69  imeout) ){.    i
2e090 6e 74 20 65 72 72 20 3d 20 65 72 72 6e 6f 3b 0a  nt err = errno;.
2e0a0 20 20 20 20 69 66 28 20 70 45 72 72 6f 72 20 29      if( pError )
2e0b0 7b 0a 20 20 20 20 20 20 2a 70 45 72 72 6f 72 20  {.      *pError 
2e0c0 3d 20 65 72 72 3b 0a 20 20 20 20 7d 0a 20 20 20  = err;.    }.   
2e0d0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49   return SQLITE_I
2e0e0 4f 45 52 52 3b 0a 20 20 7d 0a 23 69 66 64 65 66  OERR;.  }.#ifdef
2e0f0 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20 20 2f   SQLITE_TEST.  /
2e100 2a 20 73 69 6d 75 6c 61 74 65 20 6d 75 6c 74 69  * simulate multi
2e110 70 6c 65 20 68 6f 73 74 73 20 62 79 20 63 72 65  ple hosts by cre
2e120 61 74 69 6e 67 20 75 6e 69 71 75 65 20 68 6f 73  ating unique hos
2e130 74 69 64 20 66 69 6c 65 20 70 61 74 68 73 20 2a  tid file paths *
2e140 2f 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f  /.  if( sqlite3_
2e150 68 6f 73 74 69 64 5f 6e 75 6d 20 21 3d 20 30 29  hostid_num != 0)
2e160 7b 0a 20 20 20 20 70 48 6f 73 74 49 44 5b 30 5d  {.    pHostID[0]
2e170 20 3d 20 28 63 68 61 72 29 28 70 48 6f 73 74 49   = (char)(pHostI
2e180 44 5b 30 5d 20 2b 20 28 63 68 61 72 29 28 73 71  D[0] + (char)(sq
2e190 6c 69 74 65 33 5f 68 6f 73 74 69 64 5f 6e 75 6d  lite3_hostid_num
2e1a0 20 26 20 30 78 46 46 29 29 3b 0a 20 20 7d 0a 23   & 0xFF));.  }.#
2e1b0 65 6e 64 69 66 0a 20 20 0a 20 20 72 65 74 75 72  endif.  .  retur
2e1c0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
2e1d0 2f 2a 20 54 68 65 20 63 6f 6e 63 68 20 66 69 6c  /* The conch fil
2e1e0 65 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 68  e contains the h
2e1f0 65 61 64 65 72 2c 20 68 6f 73 74 20 69 64 20 61  eader, host id a
2e200 6e 64 20 6c 6f 63 6b 20 66 69 6c 65 20 70 61 74  nd lock file pat
2e210 68 0a 20 2a 2f 0a 23 64 65 66 69 6e 65 20 50 52  h. */.#define PR
2e220 4f 58 59 5f 43 4f 4e 43 48 56 45 52 53 49 4f 4e  OXY_CONCHVERSION
2e230 20 32 20 20 20 2f 2a 20 31 2d 62 79 74 65 20 68   2   /* 1-byte h
2e240 65 61 64 65 72 2c 20 31 36 2d 62 79 74 65 20 68  eader, 16-byte h
2e250 6f 73 74 20 69 64 2c 20 70 61 74 68 20 2a 2f 0a  ost id, path */.
2e260 23 64 65 66 69 6e 65 20 50 52 4f 58 59 5f 48 45  #define PROXY_HE
2e270 41 44 45 52 4c 45 4e 20 20 20 20 31 20 20 20 2f  ADERLEN    1   /
2e280 2a 20 63 6f 6e 63 68 20 66 69 6c 65 20 68 65 61  * conch file hea
2e290 64 65 72 20 6c 65 6e 67 74 68 20 2a 2f 0a 23 64  der length */.#d
2e2a0 65 66 69 6e 65 20 50 52 4f 58 59 5f 50 41 54 48  efine PROXY_PATH
2e2b0 49 4e 44 45 58 20 20 20 20 28 50 52 4f 58 59 5f  INDEX    (PROXY_
2e2c0 48 45 41 44 45 52 4c 45 4e 2b 50 52 4f 58 59 5f  HEADERLEN+PROXY_
2e2d0 48 4f 53 54 49 44 4c 45 4e 29 0a 23 64 65 66 69  HOSTIDLEN).#defi
2e2e0 6e 65 20 50 52 4f 58 59 5f 4d 41 58 43 4f 4e 43  ne PROXY_MAXCONC
2e2f0 48 4c 45 4e 20 20 28 50 52 4f 58 59 5f 48 45 41  HLEN  (PROXY_HEA
2e300 44 45 52 4c 45 4e 2b 50 52 4f 58 59 5f 48 4f 53  DERLEN+PROXY_HOS
2e310 54 49 44 4c 45 4e 2b 4d 41 58 50 41 54 48 4c 45  TIDLEN+MAXPATHLE
2e320 4e 29 0a 0a 2f 2a 20 0a 2a 2a 20 54 61 6b 65 73  N)../* .** Takes
2e330 20 61 6e 20 6f 70 65 6e 20 63 6f 6e 63 68 20 66   an open conch f
2e340 69 6c 65 2c 20 63 6f 70 69 65 73 20 74 68 65 20  ile, copies the 
2e350 63 6f 6e 74 65 6e 74 73 20 74 6f 20 61 20 6e 65  contents to a ne
2e360 77 20 70 61 74 68 20 61 6e 64 20 74 68 65 6e 20  w path and then 
2e370 6d 6f 76 65 73 20 0a 2a 2a 20 69 74 20 62 61 63  moves .** it bac
2e380 6b 2e 20 20 54 68 65 20 6e 65 77 6c 79 20 63 72  k.  The newly cr
2e390 65 61 74 65 64 20 66 69 6c 65 27 73 20 66 69 6c  eated file's fil
2e3a0 65 20 64 65 73 63 72 69 70 74 6f 72 20 69 73 20  e descriptor is 
2e3b0 61 73 73 69 67 6e 65 64 20 74 6f 20 74 68 65 0a  assigned to the.
2e3c0 2a 2a 20 63 6f 6e 63 68 20 66 69 6c 65 20 73 74  ** conch file st
2e3d0 72 75 63 74 75 72 65 20 61 6e 64 20 66 69 6e 61  ructure and fina
2e3e0 6c 6c 79 20 74 68 65 20 6f 72 69 67 69 6e 61 6c  lly the original
2e3f0 20 63 6f 6e 63 68 20 66 69 6c 65 20 64 65 73 63   conch file desc
2e400 72 69 70 74 6f 72 20 69 73 20 0a 2a 2a 20 63 6c  riptor is .** cl
2e410 6f 73 65 64 2e 20 20 52 65 74 75 72 6e 73 20 7a  osed.  Returns z
2e420 65 72 6f 20 69 66 20 73 75 63 63 65 73 73 66 75  ero if successfu
2e430 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  l..*/.static int
2e440 20 70 72 6f 78 79 42 72 65 61 6b 43 6f 6e 63 68   proxyBreakConch
2e450 4c 6f 63 6b 28 75 6e 69 78 46 69 6c 65 20 2a 70  Lock(unixFile *p
2e460 46 69 6c 65 2c 20 75 75 69 64 5f 74 20 6d 79 48  File, uuid_t myH
2e470 6f 73 74 49 44 29 7b 0a 20 20 70 72 6f 78 79 4c  ostID){.  proxyL
2e480 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 70  ockingContext *p
2e490 43 74 78 20 3d 20 28 70 72 6f 78 79 4c 6f 63 6b  Ctx = (proxyLock
2e4a0 69 6e 67 43 6f 6e 74 65 78 74 20 2a 29 70 46 69  ingContext *)pFi
2e4b0 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65  le->lockingConte
2e4c0 78 74 3b 20 0a 20 20 75 6e 69 78 46 69 6c 65 20  xt; .  unixFile 
2e4d0 2a 63 6f 6e 63 68 46 69 6c 65 20 3d 20 70 43 74  *conchFile = pCt
2e4e0 78 2d 3e 63 6f 6e 63 68 46 69 6c 65 3b 0a 20 20  x->conchFile;.  
2e4f0 63 68 61 72 20 74 50 61 74 68 5b 4d 41 58 50 41  char tPath[MAXPA
2e500 54 48 4c 45 4e 5d 3b 0a 20 20 63 68 61 72 20 62  THLEN];.  char b
2e510 75 66 5b 50 52 4f 58 59 5f 4d 41 58 43 4f 4e 43  uf[PROXY_MAXCONC
2e520 48 4c 45 4e 5d 3b 0a 20 20 63 68 61 72 20 2a 63  HLEN];.  char *c
2e530 50 61 74 68 20 3d 20 70 43 74 78 2d 3e 63 6f 6e  Path = pCtx->con
2e540 63 68 46 69 6c 65 50 61 74 68 3b 0a 20 20 73 69  chFilePath;.  si
2e550 7a 65 5f 74 20 72 65 61 64 4c 65 6e 20 3d 20 30  ze_t readLen = 0
2e560 3b 0a 20 20 73 69 7a 65 5f 74 20 70 61 74 68 4c  ;.  size_t pathL
2e570 65 6e 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 65  en = 0;.  char e
2e580 72 72 6d 73 67 5b 36 34 5d 20 3d 20 22 22 3b 0a  rrmsg[64] = "";.
2e590 20 20 69 6e 74 20 66 64 20 3d 20 2d 31 3b 0a 20    int fd = -1;. 
2e5a0 20 69 6e 74 20 72 63 20 3d 20 2d 31 3b 0a 0a 20   int rc = -1;.. 
2e5b0 20 2f 2a 20 63 72 65 61 74 65 20 61 20 6e 65 77   /* create a new
2e5c0 20 70 61 74 68 20 62 79 20 72 65 70 6c 61 63 65   path by replace
2e5d0 20 74 68 65 20 74 72 61 69 6c 69 6e 67 20 27 2d   the trailing '-
2e5e0 63 6f 6e 63 68 27 20 77 69 74 68 20 27 2d 62 72  conch' with '-br
2e5f0 65 61 6b 27 20 2a 2f 0a 20 20 70 61 74 68 4c 65  eak' */.  pathLe
2e600 6e 20 3d 20 73 74 72 6c 63 70 79 28 74 50 61 74  n = strlcpy(tPat
2e610 68 2c 20 63 50 61 74 68 2c 20 4d 41 58 50 41 54  h, cPath, MAXPAT
2e620 48 4c 45 4e 29 3b 0a 20 20 69 66 28 20 70 61 74  HLEN);.  if( pat
2e630 68 4c 65 6e 3e 4d 41 58 50 41 54 48 4c 45 4e 20  hLen>MAXPATHLEN 
2e640 7c 7c 20 70 61 74 68 4c 65 6e 3c 36 20 7c 7c 20  || pathLen<6 || 
2e650 0a 20 20 20 20 20 28 73 74 72 6c 63 70 79 28 26  .     (strlcpy(&
2e660 74 50 61 74 68 5b 70 61 74 68 4c 65 6e 2d 35 5d  tPath[pathLen-5]
2e670 2c 20 22 62 72 65 61 6b 22 2c 20 36 29 20 21 3d  , "break", 6) !=
2e680 20 35 29 20 29 7b 0a 20 20 20 20 73 70 72 69 6e   5) ){.    sprin
2e690 74 66 28 65 72 72 6d 73 67 2c 20 22 70 61 74 68  tf(errmsg, "path
2e6a0 20 65 72 72 6f 72 20 28 6c 65 6e 20 25 64 29 22   error (len %d)"
2e6b0 2c 20 28 69 6e 74 29 70 61 74 68 4c 65 6e 29 3b  , (int)pathLen);
2e6c0 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 62 72  .    goto end_br
2e6d0 65 61 6b 6c 6f 63 6b 3b 0a 20 20 7d 0a 20 20 2f  eaklock;.  }.  /
2e6e0 2a 20 72 65 61 64 20 74 68 65 20 63 6f 6e 63 68  * read the conch
2e6f0 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a 20 20 72 65   content */.  re
2e700 61 64 4c 65 6e 20 3d 20 70 72 65 61 64 28 63 6f  adLen = pread(co
2e710 6e 63 68 46 69 6c 65 2d 3e 68 2c 20 62 75 66 2c  nchFile->h, buf,
2e720 20 50 52 4f 58 59 5f 4d 41 58 43 4f 4e 43 48 4c   PROXY_MAXCONCHL
2e730 45 4e 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 65  EN, 0);.  if( re
2e740 61 64 4c 65 6e 3c 50 52 4f 58 59 5f 50 41 54 48  adLen<PROXY_PATH
2e750 49 4e 44 45 58 20 29 7b 0a 20 20 20 20 73 70 72  INDEX ){.    spr
2e760 69 6e 74 66 28 65 72 72 6d 73 67 2c 20 22 72 65  intf(errmsg, "re
2e770 61 64 20 65 72 72 6f 72 20 28 6c 65 6e 20 25 64  ad error (len %d
2e780 29 22 2c 20 28 69 6e 74 29 72 65 61 64 4c 65 6e  )", (int)readLen
2e790 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f  );.    goto end_
2e7a0 62 72 65 61 6b 6c 6f 63 6b 3b 0a 20 20 7d 0a 20  breaklock;.  }. 
2e7b0 20 2f 2a 20 77 72 69 74 65 20 69 74 20 6f 75 74   /* write it out
2e7c0 20 74 6f 20 74 68 65 20 74 65 6d 70 6f 72 61 72   to the temporar
2e7d0 79 20 62 72 65 61 6b 20 66 69 6c 65 20 2a 2f 0a  y break file */.
2e7e0 20 20 66 64 20 3d 20 6f 70 65 6e 28 74 50 61 74    fd = open(tPat
2e7f0 68 2c 20 28 4f 5f 52 44 57 52 7c 4f 5f 43 52 45  h, (O_RDWR|O_CRE
2e800 41 54 7c 4f 5f 45 58 43 4c 29 2c 20 53 51 4c 49  AT|O_EXCL), SQLI
2e810 54 45 5f 44 45 46 41 55 4c 54 5f 46 49 4c 45 5f  TE_DEFAULT_FILE_
2e820 50 45 52 4d 49 53 53 49 4f 4e 53 29 3b 0a 20 20  PERMISSIONS);.  
2e830 69 66 28 20 66 64 3c 30 20 29 7b 0a 20 20 20 20  if( fd<0 ){.    
2e840 73 70 72 69 6e 74 66 28 65 72 72 6d 73 67 2c 20  sprintf(errmsg, 
2e850 22 63 72 65 61 74 65 20 66 61 69 6c 65 64 20 28  "create failed (
2e860 25 64 29 22 2c 20 65 72 72 6e 6f 29 3b 0a 20 20  %d)", errno);.  
2e870 20 20 67 6f 74 6f 20 65 6e 64 5f 62 72 65 61 6b    goto end_break
2e880 6c 6f 63 6b 3b 0a 20 20 7d 0a 20 20 69 66 28 20  lock;.  }.  if( 
2e890 70 77 72 69 74 65 28 66 64 2c 20 62 75 66 2c 20  pwrite(fd, buf, 
2e8a0 72 65 61 64 4c 65 6e 2c 20 30 29 20 21 3d 20 72  readLen, 0) != r
2e8b0 65 61 64 4c 65 6e 20 29 7b 0a 20 20 20 20 73 70  eadLen ){.    sp
2e8c0 72 69 6e 74 66 28 65 72 72 6d 73 67 2c 20 22 77  rintf(errmsg, "w
2e8d0 72 69 74 65 20 66 61 69 6c 65 64 20 28 25 64 29  rite failed (%d)
2e8e0 22 2c 20 65 72 72 6e 6f 29 3b 0a 20 20 20 20 67  ", errno);.    g
2e8f0 6f 74 6f 20 65 6e 64 5f 62 72 65 61 6b 6c 6f 63  oto end_breakloc
2e900 6b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 65 6e  k;.  }.  if( ren
2e910 61 6d 65 28 74 50 61 74 68 2c 20 63 50 61 74 68  ame(tPath, cPath
2e920 29 20 29 7b 0a 20 20 20 20 73 70 72 69 6e 74 66  ) ){.    sprintf
2e930 28 65 72 72 6d 73 67 2c 20 22 72 65 6e 61 6d 65  (errmsg, "rename
2e940 20 66 61 69 6c 65 64 20 28 25 64 29 22 2c 20 65   failed (%d)", e
2e950 72 72 6e 6f 29 3b 0a 20 20 20 20 67 6f 74 6f 20  rrno);.    goto 
2e960 65 6e 64 5f 62 72 65 61 6b 6c 6f 63 6b 3b 0a 20  end_breaklock;. 
2e970 20 7d 0a 20 20 72 63 20 3d 20 30 3b 0a 20 20 66   }.  rc = 0;.  f
2e980 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22  printf(stderr, "
2e990 62 72 6f 6b 65 20 73 74 61 6c 65 20 6c 6f 63 6b  broke stale lock
2e9a0 20 6f 6e 20 25 73 5c 6e 22 2c 20 63 50 61 74 68   on %s\n", cPath
2e9b0 29 3b 0a 20 20 63 6c 6f 73 65 28 63 6f 6e 63 68  );.  close(conch
2e9c0 46 69 6c 65 2d 3e 68 29 3b 0a 20 20 63 6f 6e 63  File->h);.  conc
2e9d0 68 46 69 6c 65 2d 3e 68 20 3d 20 66 64 3b 0a 20  hFile->h = fd;. 
2e9e0 20 63 6f 6e 63 68 46 69 6c 65 2d 3e 6f 70 65 6e   conchFile->open
2e9f0 46 6c 61 67 73 20 3d 20 4f 5f 52 44 57 52 20 7c  Flags = O_RDWR |
2ea00 20 4f 5f 43 52 45 41 54 3b 0a 0a 65 6e 64 5f 62   O_CREAT;..end_b
2ea10 72 65 61 6b 6c 6f 63 6b 3a 0a 20 20 69 66 28 20  reaklock:.  if( 
2ea20 72 63 20 29 7b 0a 20 20 20 20 69 66 28 20 66 64  rc ){.    if( fd
2ea30 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 75 6e 6c  >=0 ){.      unl
2ea40 69 6e 6b 28 74 50 61 74 68 29 3b 0a 20 20 20 20  ink(tPath);.    
2ea50 20 20 63 6c 6f 73 65 28 66 64 29 3b 0a 20 20 20    close(fd);.   
2ea60 20 7d 0a 20 20 20 20 66 70 72 69 6e 74 66 28 73   }.    fprintf(s
2ea70 74 64 65 72 72 2c 20 22 66 61 69 6c 65 64 20 74  tderr, "failed t
2ea80 6f 20 62 72 65 61 6b 20 73 74 61 6c 65 20 6c 6f  o break stale lo
2ea90 63 6b 20 6f 6e 20 25 73 2c 20 25 73 5c 6e 22 2c  ck on %s, %s\n",
2eaa0 20 63 50 61 74 68 2c 20 65 72 72 6d 73 67 29 3b   cPath, errmsg);
2eab0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
2eac0 3b 0a 7d 0a 0a 2f 2a 20 54 61 6b 65 20 74 68 65  ;.}../* Take the
2ead0 20 72 65 71 75 65 73 74 65 64 20 6c 6f 63 6b 20   requested lock 
2eae0 6f 6e 20 74 68 65 20 63 6f 6e 63 68 20 66 69 6c  on the conch fil
2eaf0 65 20 61 6e 64 20 62 72 65 61 6b 20 61 20 73 74  e and break a st
2eb00 61 6c 65 20 6c 6f 63 6b 20 69 66 20 74 68 65 20  ale lock if the 
2eb10 0a 2a 2a 20 68 6f 73 74 20 69 64 20 6d 61 74 63  .** host id matc
2eb20 68 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  hes..*/.static i
2eb30 6e 74 20 70 72 6f 78 79 43 6f 6e 63 68 4c 6f 63  nt proxyConchLoc
2eb40 6b 28 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c  k(unixFile *pFil
2eb50 65 2c 20 75 75 69 64 5f 74 20 6d 79 48 6f 73 74  e, uuid_t myHost
2eb60 49 44 2c 20 69 6e 74 20 6c 6f 63 6b 54 79 70 65  ID, int lockType
2eb70 29 7b 0a 20 20 70 72 6f 78 79 4c 6f 63 6b 69 6e  ){.  proxyLockin
2eb80 67 43 6f 6e 74 65 78 74 20 2a 70 43 74 78 20 3d  gContext *pCtx =
2eb90 20 28 70 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f   (proxyLockingCo
2eba0 6e 74 65 78 74 20 2a 29 70 46 69 6c 65 2d 3e 6c  ntext *)pFile->l
2ebb0 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 20 0a  ockingContext; .
2ebc0 20 20 75 6e 69 78 46 69 6c 65 20 2a 63 6f 6e 63    unixFile *conc
2ebd0 68 46 69 6c 65 20 3d 20 70 43 74 78 2d 3e 63 6f  hFile = pCtx->co
2ebe0 6e 63 68 46 69 6c 65 3b 0a 20 20 69 6e 74 20 72  nchFile;.  int r
2ebf0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
2ec00 20 69 6e 74 20 6e 54 72 69 65 73 20 3d 20 30 3b   int nTries = 0;
2ec10 0a 20 20 73 74 72 75 63 74 20 74 69 6d 65 73 70  .  struct timesp
2ec20 65 63 20 63 6f 6e 63 68 4d 6f 64 54 69 6d 65 3b  ec conchModTime;
2ec30 0a 20 20 0a 20 20 64 6f 20 7b 0a 20 20 20 20 72  .  .  do {.    r
2ec40 63 20 3d 20 63 6f 6e 63 68 46 69 6c 65 2d 3e 70  c = conchFile->p
2ec50 4d 65 74 68 6f 64 2d 3e 78 4c 6f 63 6b 28 28 73  Method->xLock((s
2ec60 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29 63 6f 6e  qlite3_file*)con
2ec70 63 68 46 69 6c 65 2c 20 6c 6f 63 6b 54 79 70 65  chFile, lockType
2ec80 29 3b 0a 20 20 20 20 6e 54 72 69 65 73 20 2b 2b  );.    nTries ++
2ec90 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  ;.    if( rc==SQ
2eca0 4c 49 54 45 5f 42 55 53 59 20 29 7b 0a 20 20 20  LITE_BUSY ){.   
2ecb0 20 20 20 2f 2a 20 49 66 20 74 68 65 20 6c 6f 63     /* If the loc
2ecc0 6b 20 66 61 69 6c 65 64 20 28 62 75 73 79 29 3a  k failed (busy):
2ecd0 0a 20 20 20 20 20 20 20 2a 20 31 73 74 20 74 72  .       * 1st tr
2ece0 79 3a 20 67 65 74 20 74 68 65 20 6d 6f 64 20 74  y: get the mod t
2ecf0 69 6d 65 20 6f 66 20 74 68 65 20 63 6f 6e 63 68  ime of the conch
2ed00 2c 20 77 61 69 74 20 30 2e 35 73 20 61 6e 64 20  , wait 0.5s and 
2ed10 74 72 79 20 61 67 61 69 6e 2e 20 0a 20 20 20 20  try again. .    
2ed20 20 20 20 2a 20 32 6e 64 20 74 72 79 3a 20 66 61     * 2nd try: fa
2ed30 69 6c 20 69 66 20 74 68 65 20 6d 6f 64 20 74 69  il if the mod ti
2ed40 6d 65 20 63 68 61 6e 67 65 64 20 6f 72 20 68 6f  me changed or ho
2ed50 73 74 20 69 64 20 69 73 20 64 69 66 66 65 72 65  st id is differe
2ed60 6e 74 2c 20 77 61 69 74 20 0a 20 20 20 20 20 20  nt, wait .      
2ed70 20 2a 20 20 20 20 20 20 20 20 20 20 20 31 30 20   *           10 
2ed80 73 65 63 20 61 6e 64 20 74 72 79 20 61 67 61 69  sec and try agai
2ed90 6e 0a 20 20 20 20 20 20 20 2a 20 33 72 64 20 74  n.       * 3rd t
2eda0 72 79 3a 20 62 72 65 61 6b 20 74 68 65 20 6c 6f  ry: break the lo
2edb0 63 6b 20 75 6e 6c 65 73 73 20 74 68 65 20 6d 6f  ck unless the mo
2edc0 64 20 74 69 6d 65 20 68 61 73 20 63 68 61 6e 67  d time has chang
2edd0 65 64 2e 0a 20 20 20 20 20 20 20 2a 2f 0a 20 20  ed..       */.  
2ede0 20 20 20 20 73 74 72 75 63 74 20 73 74 61 74 20      struct stat 
2edf0 62 75 66 3b 0a 20 20 20 20 20 20 69 66 28 20 66  buf;.      if( f
2ee00 73 74 61 74 28 63 6f 6e 63 68 46 69 6c 65 2d 3e  stat(conchFile->
2ee10 68 2c 20 26 62 75 66 29 20 29 7b 0a 20 20 20 20  h, &buf) ){.    
2ee20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45      pFile->lastE
2ee30 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20  rrno = errno;.  
2ee40 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
2ee50 49 54 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b 3b 0a  ITE_IOERR_LOCK;.
2ee60 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 0a 20        }.      . 
2ee70 20 20 20 20 20 69 66 28 20 6e 54 72 69 65 73 3d       if( nTries=
2ee80 3d 31 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6f  =1 ){.        co
2ee90 6e 63 68 4d 6f 64 54 69 6d 65 20 3d 20 62 75 66  nchModTime = buf
2eea0 2e 73 74 5f 6d 74 69 6d 65 73 70 65 63 3b 0a 20  .st_mtimespec;. 
2eeb0 20 20 20 20 20 20 20 75 73 6c 65 65 70 28 35 30         usleep(50
2eec0 30 30 30 30 29 3b 20 2f 2a 20 77 61 69 74 20 30  0000); /* wait 0
2eed0 2e 35 20 73 65 63 20 61 6e 64 20 74 72 79 20 74  .5 sec and try t
2eee0 68 65 20 6c 6f 63 6b 20 61 67 61 69 6e 2a 2f 0a  he lock again*/.
2eef0 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65          continue
2ef00 3b 20 20 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20  ;  .      }..   
2ef10 20 20 20 61 73 73 65 72 74 28 20 6e 54 72 69 65     assert( nTrie
2ef20 73 3e 31 20 29 3b 0a 20 20 20 20 20 20 69 66 28  s>1 );.      if(
2ef30 20 63 6f 6e 63 68 4d 6f 64 54 69 6d 65 2e 74 76   conchModTime.tv
2ef40 5f 73 65 63 20 21 3d 20 62 75 66 2e 73 74 5f 6d  _sec != buf.st_m
2ef50 74 69 6d 65 73 70 65 63 2e 74 76 5f 73 65 63 20  timespec.tv_sec 
2ef60 7c 7c 20 0a 20 20 20 20 20 20 20 20 20 63 6f 6e  || .         con
2ef70 63 68 4d 6f 64 54 69 6d 65 2e 74 76 5f 6e 73 65  chModTime.tv_nse
2ef80 63 20 21 3d 20 62 75 66 2e 73 74 5f 6d 74 69 6d  c != buf.st_mtim
2ef90 65 73 70 65 63 2e 74 76 5f 6e 73 65 63 20 29 7b  espec.tv_nsec ){
2efa0 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
2efb0 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20  SQLITE_BUSY;.   
2efc0 20 20 20 7d 0a 20 20 20 20 20 20 0a 20 20 20 20     }.      .    
2efd0 20 20 69 66 28 20 6e 54 72 69 65 73 3d 3d 32 20    if( nTries==2 
2efe0 29 7b 20 20 0a 20 20 20 20 20 20 20 20 63 68 61  ){  .        cha
2eff0 72 20 74 42 75 66 5b 50 52 4f 58 59 5f 4d 41 58  r tBuf[PROXY_MAX
2f000 43 4f 4e 43 48 4c 45 4e 5d 3b 0a 20 20 20 20 20  CONCHLEN];.     
2f010 20 20 20 69 6e 74 20 6c 65 6e 20 3d 20 70 72 65     int len = pre
2f020 61 64 28 63 6f 6e 63 68 46 69 6c 65 2d 3e 68 2c  ad(conchFile->h,
2f030 20 74 42 75 66 2c 20 50 52 4f 58 59 5f 4d 41 58   tBuf, PROXY_MAX
2f040 43 4f 4e 43 48 4c 45 4e 2c 20 30 29 3b 0a 20 20  CONCHLEN, 0);.  
2f050 20 20 20 20 20 20 69 66 28 20 6c 65 6e 3c 30 20        if( len<0 
2f060 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 46 69  ){.          pFi
2f070 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20  le->lastErrno = 
2f080 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20 20 20 20  errno;.         
2f090 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49   return SQLITE_I
2f0a0 4f 45 52 52 5f 4c 4f 43 4b 3b 0a 20 20 20 20 20  OERR_LOCK;.     
2f0b0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28     }.        if(
2f0c0 20 6c 65 6e 3e 50 52 4f 58 59 5f 50 41 54 48 49   len>PROXY_PATHI
2f0d0 4e 44 45 58 20 26 26 20 74 42 75 66 5b 30 5d 3d  NDEX && tBuf[0]=
2f0e0 3d 28 63 68 61 72 29 50 52 4f 58 59 5f 43 4f 4e  =(char)PROXY_CON
2f0f0 43 48 56 45 52 53 49 4f 4e 29 7b 0a 20 20 20 20  CHVERSION){.    
2f100 20 20 20 20 20 20 2f 2a 20 64 6f 6e 27 74 20 62        /* don't b
2f110 72 65 61 6b 20 74 68 65 20 6c 6f 63 6b 20 69 66  reak the lock if
2f120 20 74 68 65 20 68 6f 73 74 20 69 64 20 64 6f 65   the host id doe
2f130 73 6e 27 74 20 6d 61 74 63 68 20 2a 2f 0a 20 20  sn't match */.  
2f140 20 20 20 20 20 20 20 20 69 66 28 20 30 21 3d 6d          if( 0!=m
2f150 65 6d 63 6d 70 28 26 74 42 75 66 5b 50 52 4f 58  emcmp(&tBuf[PROX
2f160 59 5f 48 45 41 44 45 52 4c 45 4e 5d 2c 20 6d 79  Y_HEADERLEN], my
2f170 48 6f 73 74 49 44 2c 20 50 52 4f 58 59 5f 48 4f  HostID, PROXY_HO
2f180 53 54 49 44 4c 45 4e 29 20 29 7b 0a 20 20 20 20  STIDLEN) ){.    
2f190 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53          return S
2f1a0 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20  QLITE_BUSY;.    
2f1b0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
2f1c0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
2f1d0 20 2f 2a 20 64 6f 6e 27 74 20 62 72 65 61 6b 20   /* don't break 
2f1e0 74 68 65 20 6c 6f 63 6b 20 6f 6e 20 73 68 6f 72  the lock on shor
2f1f0 74 20 72 65 61 64 20 6f 72 20 61 20 76 65 72 73  t read or a vers
2f200 69 6f 6e 20 6d 69 73 6d 61 74 63 68 20 2a 2f 0a  ion mismatch */.
2f210 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
2f220 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20   SQLITE_BUSY;.  
2f230 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
2f240 75 73 6c 65 65 70 28 31 30 30 30 30 30 30 30 29  usleep(10000000)
2f250 3b 20 2f 2a 20 77 61 69 74 20 31 30 20 73 65 63  ; /* wait 10 sec
2f260 20 61 6e 64 20 74 72 79 20 74 68 65 20 6c 6f 63   and try the loc
2f270 6b 20 61 67 61 69 6e 20 2a 2f 0a 20 20 20 20 20  k again */.     
2f280 20 20 20 63 6f 6e 74 69 6e 75 65 3b 20 0a 20 20     continue; .  
2f290 20 20 20 20 7d 0a 20 20 20 20 20 20 0a 20 20 20      }.      .   
2f2a0 20 20 20 61 73 73 65 72 74 28 20 6e 54 72 69 65     assert( nTrie
2f2b0 73 3d 3d 33 20 29 3b 0a 20 20 20 20 20 20 69 66  s==3 );.      if
2f2c0 28 20 30 3d 3d 70 72 6f 78 79 42 72 65 61 6b 43  ( 0==proxyBreakC
2f2d0 6f 6e 63 68 4c 6f 63 6b 28 70 46 69 6c 65 2c 20  onchLock(pFile, 
2f2e0 6d 79 48 6f 73 74 49 44 29 20 29 7b 0a 20 20 20  myHostID) ){.   
2f2f0 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
2f300 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 69 66 28  _OK;.        if(
2f310 20 6c 6f 63 6b 54 79 70 65 3d 3d 45 58 43 4c 55   lockType==EXCLU
2f320 53 49 56 45 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20  SIVE_LOCK ){.   
2f330 20 20 20 20 20 20 20 72 63 20 3d 20 63 6f 6e 63         rc = conc
2f340 68 46 69 6c 65 2d 3e 70 4d 65 74 68 6f 64 2d 3e  hFile->pMethod->
2f350 78 4c 6f 63 6b 28 28 73 71 6c 69 74 65 33 5f 66  xLock((sqlite3_f
2f360 69 6c 65 2a 29 63 6f 6e 63 68 46 69 6c 65 2c 20  ile*)conchFile, 
2f370 53 48 41 52 45 44 5f 4c 4f 43 4b 29 3b 20 20 20  SHARED_LOCK);   
2f380 20 20 20 20 20 20 20 0a 20 20 20 20 20 20 20 20         .        
2f390 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 21 72  }.        if( !r
2f3a0 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  c ){.          r
2f3b0 63 20 3d 20 63 6f 6e 63 68 46 69 6c 65 2d 3e 70  c = conchFile->p
2f3c0 4d 65 74 68 6f 64 2d 3e 78 4c 6f 63 6b 28 28 73  Method->xLock((s
2f3d0 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29 63 6f 6e  qlite3_file*)con
2f3e0 63 68 46 69 6c 65 2c 20 6c 6f 63 6b 54 79 70 65  chFile, lockType
2f3f0 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
2f400 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 20 77     }.    }.  } w
2f410 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54 45  hile( rc==SQLITE
2f420 5f 42 55 53 59 20 26 26 20 6e 54 72 69 65 73 3c  _BUSY && nTries<
2f430 33 20 29 3b 0a 20 20 0a 20 20 72 65 74 75 72 6e  3 );.  .  return
2f440 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 54 61 6b 65 73   rc;.}../* Takes
2f450 20 74 68 65 20 63 6f 6e 63 68 20 62 79 20 74 61   the conch by ta
2f460 6b 69 6e 67 20 61 20 73 68 61 72 65 64 20 6c 6f  king a shared lo
2f470 63 6b 20 61 6e 64 20 72 65 61 64 20 74 68 65 20  ck and read the 
2f480 63 6f 6e 74 65 6e 74 73 20 63 6f 6e 63 68 2c 20  contents conch, 
2f490 69 66 20 0a 2a 2a 20 6c 6f 63 6b 50 61 74 68 20  if .** lockPath 
2f4a0 69 73 20 6e 6f 6e 2d 4e 55 4c 4c 2c 20 74 68 65  is non-NULL, the
2f4b0 20 68 6f 73 74 20 49 44 20 61 6e 64 20 6c 6f 63   host ID and loc
2f4c0 6b 20 66 69 6c 65 20 70 61 74 68 20 6d 75 73 74  k file path must
2f4d0 20 6d 61 74 63 68 2e 20 20 41 20 4e 55 4c 4c 20   match.  A NULL 
2f4e0 0a 2a 2a 20 6c 6f 63 6b 50 61 74 68 20 6d 65 61  .** lockPath mea
2f4f0 6e 73 20 74 68 61 74 20 74 68 65 20 6c 6f 63 6b  ns that the lock
2f500 50 61 74 68 20 69 6e 20 74 68 65 20 63 6f 6e 63  Path in the conc
2f510 68 20 66 69 6c 65 20 77 69 6c 6c 20 62 65 20 75  h file will be u
2f520 73 65 64 20 69 66 20 74 68 65 20 0a 2a 2a 20 68  sed if the .** h
2f530 6f 73 74 20 49 44 73 20 6d 61 74 63 68 2c 20 6f  ost IDs match, o
2f540 72 20 61 20 6e 65 77 20 6c 6f 63 6b 20 70 61 74  r a new lock pat
2f550 68 20 77 69 6c 6c 20 62 65 20 67 65 6e 65 72 61  h will be genera
2f560 74 65 64 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c  ted automaticall
2f570 79 20 0a 2a 2a 20 61 6e 64 20 77 72 69 74 74 65  y .** and writte
2f580 6e 20 74 6f 20 74 68 65 20 63 6f 6e 63 68 20 66  n to the conch f
2f590 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ile..*/.static i
2f5a0 6e 74 20 70 72 6f 78 79 54 61 6b 65 43 6f 6e 63  nt proxyTakeConc
2f5b0 68 28 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c  h(unixFile *pFil
2f5c0 65 29 7b 0a 20 20 70 72 6f 78 79 4c 6f 63 6b 69  e){.  proxyLocki
2f5d0 6e 67 43 6f 6e 74 65 78 74 20 2a 70 43 74 78 20  ngContext *pCtx 
2f5e0 3d 20 28 70 72 6f 78 79 4c 6f 63 6b 69 6e 67 43  = (proxyLockingC
2f5f0 6f 6e 74 65 78 74 20 2a 29 70 46 69 6c 65 2d 3e  ontext *)pFile->
2f600 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 20  lockingContext; 
2f610 0a 20 20 0a 20 20 69 66 28 20 70 43 74 78 2d 3e  .  .  if( pCtx->
2f620 63 6f 6e 63 68 48 65 6c 64 21 3d 30 20 29 7b 0a  conchHeld!=0 ){.
2f630 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
2f640 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  E_OK;.  }else{. 
2f650 20 20 20 75 6e 69 78 46 69 6c 65 20 2a 63 6f 6e     unixFile *con
2f660 63 68 46 69 6c 65 20 3d 20 70 43 74 78 2d 3e 63  chFile = pCtx->c
2f670 6f 6e 63 68 46 69 6c 65 3b 0a 20 20 20 20 75 75  onchFile;.    uu
2f680 69 64 5f 74 20 6d 79 48 6f 73 74 49 44 3b 0a 20  id_t myHostID;. 
2f690 20 20 20 69 6e 74 20 70 45 72 72 6f 72 20 3d 20     int pError = 
2f6a0 30 3b 0a 20 20 20 20 63 68 61 72 20 72 65 61 64  0;.    char read
2f6b0 42 75 66 5b 50 52 4f 58 59 5f 4d 41 58 43 4f 4e  Buf[PROXY_MAXCON
2f6c0 43 48 4c 45 4e 5d 3b 0a 20 20 20 20 63 68 61 72  CHLEN];.    char
2f6d0 20 6c 6f 63 6b 50 61 74 68 5b 4d 41 58 50 41 54   lockPath[MAXPAT
2f6e0 48 4c 45 4e 5d 3b 0a 20 20 20 20 63 68 61 72 20  HLEN];.    char 
2f6f0 2a 74 65 6d 70 4c 6f 63 6b 50 61 74 68 20 3d 20  *tempLockPath = 
2f700 4e 55 4c 4c 3b 0a 20 20 20 20 69 6e 74 20 72 63  NULL;.    int rc
2f710 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
2f720 20 20 69 6e 74 20 63 72 65 61 74 65 43 6f 6e 63    int createConc
2f730 68 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 68  h = 0;.    int h
2f740 6f 73 74 49 64 4d 61 74 63 68 20 3d 20 30 3b 0a  ostIdMatch = 0;.
2f750 20 20 20 20 69 6e 74 20 72 65 61 64 4c 65 6e 20      int readLen 
2f760 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 74 72 79  = 0;.    int try
2f770 4f 6c 64 4c 6f 63 6b 50 61 74 68 20 3d 20 30 3b  OldLockPath = 0;
2f780 0a 20 20 20 20 69 6e 74 20 66 6f 72 63 65 4e 65  .    int forceNe
2f790 77 4c 6f 63 6b 50 61 74 68 20 3d 20 30 3b 0a 20  wLockPath = 0;. 
2f7a0 20 20 20 0a 20 20 20 20 4f 53 54 52 41 43 45 34     .    OSTRACE4
2f7b0 28 22 54 41 4b 45 43 4f 4e 43 48 20 20 25 64 20  ("TAKECONCH  %d 
2f7c0 66 6f 72 20 25 73 20 70 69 64 3d 25 64 5c 6e 22  for %s pid=%d\n"
2f7d0 2c 20 63 6f 6e 63 68 46 69 6c 65 2d 3e 68 2c 0a  , conchFile->h,.
2f7e0 20 20 20 20 20 20 20 20 20 20 20 20 20 28 70 43               (pC
2f7f0 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 50 61 74  tx->lockProxyPat
2f800 68 20 3f 20 70 43 74 78 2d 3e 6c 6f 63 6b 50 72  h ? pCtx->lockPr
2f810 6f 78 79 50 61 74 68 20 3a 20 22 3a 61 75 74 6f  oxyPath : ":auto
2f820 3a 22 29 2c 20 67 65 74 70 69 64 28 29 29 3b 0a  :"), getpid());.
2f830 0a 20 20 20 20 72 63 20 3d 20 70 72 6f 78 79 47  .    rc = proxyG
2f840 65 74 48 6f 73 74 49 44 28 6d 79 48 6f 73 74 49  etHostID(myHostI
2f850 44 2c 20 26 70 45 72 72 6f 72 29 3b 0a 20 20 20  D, &pError);.   
2f860 20 69 66 28 20 28 72 63 26 30 78 66 66 29 3d 3d   if( (rc&0xff)==
2f870 53 51 4c 49 54 45 5f 49 4f 45 52 52 20 29 7b 0a  SQLITE_IOERR ){.
2f880 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73        pFile->las
2f890 74 45 72 72 6e 6f 20 3d 20 70 45 72 72 6f 72 3b  tErrno = pError;
2f8a0 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f  .      goto end_
2f8b0 74 61 6b 65 63 6f 6e 63 68 3b 0a 20 20 20 20 7d  takeconch;.    }
2f8c0 0a 20 20 20 20 72 63 20 3d 20 70 72 6f 78 79 43  .    rc = proxyC
2f8d0 6f 6e 63 68 4c 6f 63 6b 28 70 46 69 6c 65 2c 20  onchLock(pFile, 
2f8e0 6d 79 48 6f 73 74 49 44 2c 20 53 48 41 52 45 44  myHostID, SHARED
2f8f0 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 69 66 28 20  _LOCK);.    if( 
2f900 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
2f910 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f  .      goto end_
2f920 74 61 6b 65 63 6f 6e 63 68 3b 0a 20 20 20 20 7d  takeconch;.    }
2f930 0a 20 20 20 20 2f 2a 20 72 65 61 64 20 74 68 65  .    /* read the
2f940 20 65 78 69 73 74 69 6e 67 20 63 6f 6e 63 68 20   existing conch 
2f950 66 69 6c 65 20 2a 2f 0a 20 20 20 20 72 65 61 64  file */.    read
2f960 4c 65 6e 20 3d 20 73 65 65 6b 41 6e 64 52 65 61  Len = seekAndRea
2f970 64 28 28 75 6e 69 78 46 69 6c 65 2a 29 63 6f 6e  d((unixFile*)con
2f980 63 68 46 69 6c 65 2c 20 30 2c 20 72 65 61 64 42  chFile, 0, readB
2f990 75 66 2c 20 50 52 4f 58 59 5f 4d 41 58 43 4f 4e  uf, PROXY_MAXCON
2f9a0 43 48 4c 45 4e 29 3b 0a 20 20 20 20 69 66 28 20  CHLEN);.    if( 
2f9b0 72 65 61 64 4c 65 6e 3c 30 20 29 7b 0a 20 20 20  readLen<0 ){.   
2f9c0 20 20 20 2f 2a 20 49 2f 4f 20 65 72 72 6f 72 3a     /* I/O error:
2f9d0 20 6c 61 73 74 45 72 72 6e 6f 20 73 65 74 20 62   lastErrno set b
2f9e0 79 20 73 65 65 6b 41 6e 64 52 65 61 64 20 2a 2f  y seekAndRead */
2f9f0 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61  .      pFile->la
2fa00 73 74 45 72 72 6e 6f 20 3d 20 63 6f 6e 63 68 46  stErrno = conchF
2fa10 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 3b 0a  ile->lastErrno;.
2fa20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
2fa30 45 5f 49 4f 45 52 52 5f 52 45 41 44 3b 0a 20 20  E_IOERR_READ;.  
2fa40 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 74 61 6b      goto end_tak
2fa50 65 63 6f 6e 63 68 3b 0a 20 20 20 20 7d 65 6c 73  econch;.    }els
2fa60 65 20 69 66 28 20 72 65 61 64 4c 65 6e 3c 3d 28  e if( readLen<=(
2fa70 50 52 4f 58 59 5f 48 45 41 44 45 52 4c 45 4e 2b  PROXY_HEADERLEN+
2fa80 50 52 4f 58 59 5f 48 4f 53 54 49 44 4c 45 4e 29  PROXY_HOSTIDLEN)
2fa90 20 7c 7c 20 0a 20 20 20 20 20 20 20 20 20 20 20   || .           
2faa0 20 20 72 65 61 64 42 75 66 5b 30 5d 21 3d 28 63    readBuf[0]!=(c
2fab0 68 61 72 29 50 52 4f 58 59 5f 43 4f 4e 43 48 56  har)PROXY_CONCHV
2fac0 45 52 53 49 4f 4e 20 29 7b 0a 20 20 20 20 20 20  ERSION ){.      
2fad0 2f 2a 20 61 20 73 68 6f 72 74 20 72 65 61 64 20  /* a short read 
2fae0 6f 72 20 76 65 72 73 69 6f 6e 20 66 6f 72 6d 61  or version forma
2faf0 74 20 6d 69 73 6d 61 74 63 68 20 6d 65 61 6e 73  t mismatch means
2fb00 20 77 65 20 6e 65 65 64 20 74 6f 20 63 72 65 61   we need to crea
2fb10 74 65 20 61 20 6e 65 77 20 0a 20 20 20 20 20 20  te a new .      
2fb20 2a 2a 20 63 6f 6e 63 68 20 66 69 6c 65 2e 20 0a  ** conch file. .
2fb30 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 63        */.      c
2fb40 72 65 61 74 65 43 6f 6e 63 68 20 3d 20 31 3b 0a  reateConch = 1;.
2fb50 20 20 20 20 7d 0a 20 20 20 20 2f 2a 20 69 66 20      }.    /* if 
2fb60 74 68 65 20 68 6f 73 74 20 69 64 20 6d 61 74 63  the host id matc
2fb70 68 65 73 20 61 6e 64 20 74 68 65 20 6c 6f 63 6b  hes and the lock
2fb80 20 70 61 74 68 20 61 6c 72 65 61 64 79 20 65 78   path already ex
2fb90 69 73 74 73 20 69 6e 20 74 68 65 20 63 6f 6e 63  ists in the conc
2fba0 68 0a 20 20 20 20 2a 2a 20 77 65 27 6c 6c 20 74  h.    ** we'll t
2fbb0 72 79 20 74 6f 20 75 73 65 20 74 68 65 20 70 61  ry to use the pa
2fbc0 74 68 20 74 68 65 72 65 2c 20 69 66 20 77 65 20  th there, if we 
2fbd0 63 61 6e 27 74 20 6f 70 65 6e 20 74 68 61 74 20  can't open that 
2fbe0 70 61 74 68 2c 20 77 65 27 6c 6c 20 0a 20 20 20  path, we'll .   
2fbf0 20 2a 2a 20 72 65 74 72 79 20 77 69 74 68 20 61   ** retry with a
2fc00 20 6e 65 77 20 61 75 74 6f 2d 67 65 6e 65 72 61   new auto-genera
2fc10 74 65 64 20 70 61 74 68 20 0a 20 20 20 20 2a 2f  ted path .    */
2fc20 0a 20 20 20 20 64 6f 20 7b 20 2f 2a 20 69 6e 20  .    do { /* in 
2fc30 63 61 73 65 20 77 65 20 6e 65 65 64 20 74 6f 20  case we need to 
2fc40 74 72 79 20 61 67 61 69 6e 20 66 6f 72 20 61 6e  try again for an
2fc50 20 3a 61 75 74 6f 3a 20 6e 61 6d 65 64 20 6c 6f   :auto: named lo
2fc60 63 6b 20 66 69 6c 65 20 2a 2f 0a 0a 20 20 20 20  ck file */..    
2fc70 20 20 69 66 28 20 21 63 72 65 61 74 65 43 6f 6e    if( !createCon
2fc80 63 68 20 26 26 20 21 66 6f 72 63 65 4e 65 77 4c  ch && !forceNewL
2fc90 6f 63 6b 50 61 74 68 20 29 7b 0a 20 20 20 20 20  ockPath ){.     
2fca0 20 20 20 68 6f 73 74 49 64 4d 61 74 63 68 20 3d     hostIdMatch =
2fcb0 20 21 6d 65 6d 63 6d 70 28 26 72 65 61 64 42 75   !memcmp(&readBu
2fcc0 66 5b 50 52 4f 58 59 5f 48 45 41 44 45 52 4c 45  f[PROXY_HEADERLE
2fcd0 4e 5d 2c 20 6d 79 48 6f 73 74 49 44 2c 20 0a 20  N], myHostID, . 
2fce0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2fcf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2fd00 20 50 52 4f 58 59 5f 48 4f 53 54 49 44 4c 45 4e   PROXY_HOSTIDLEN
2fd10 29 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20 69 66  );.        /* if
2fd20 20 74 68 65 20 63 6f 6e 63 68 20 68 61 73 20 64   the conch has d
2fd30 61 74 61 20 63 6f 6d 70 61 72 65 20 74 68 65 20  ata compare the 
2fd40 63 6f 6e 74 65 6e 74 73 20 2a 2f 0a 20 20 20 20  contents */.    
2fd50 20 20 20 20 69 66 28 20 21 70 43 74 78 2d 3e 6c      if( !pCtx->l
2fd60 6f 63 6b 50 72 6f 78 79 50 61 74 68 20 29 7b 0a  ockProxyPath ){.
2fd70 20 20 20 20 20 20 20 20 20 20 2f 2a 20 66 6f 72            /* for
2fd80 20 61 75 74 6f 2d 6e 61 6d 65 64 20 6c 6f 63 61   auto-named loca
2fd90 6c 20 6c 6f 63 6b 20 66 69 6c 65 2c 20 6a 75 73  l lock file, jus
2fda0 74 20 63 68 65 63 6b 20 74 68 65 20 68 6f 73 74  t check the host
2fdb0 20 49 44 20 61 6e 64 20 77 65 27 6c 6c 0a 20 20   ID and we'll.  
2fdc0 20 20 20 20 20 20 20 20 20 2a 2a 20 75 73 65 20           ** use 
2fdd0 74 68 65 20 6c 6f 63 61 6c 20 6c 6f 63 6b 20 66  the local lock f
2fde0 69 6c 65 20 70 61 74 68 20 74 68 61 74 27 73 20  ile path that's 
2fdf0 61 6c 72 65 61 64 79 20 69 6e 20 74 68 65 72 65  already in there
2fe00 0a 20 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20  .           */. 
2fe10 20 20 20 20 20 20 20 20 20 69 66 28 20 68 6f 73           if( hos
2fe20 74 49 64 4d 61 74 63 68 20 29 7b 0a 20 20 20 20  tIdMatch ){.    
2fe30 20 20 20 20 20 20 20 20 73 69 7a 65 5f 74 20 70          size_t p
2fe40 61 74 68 4c 65 6e 20 3d 20 28 72 65 61 64 4c 65  athLen = (readLe
2fe50 6e 20 2d 20 50 52 4f 58 59 5f 50 41 54 48 49 4e  n - PROXY_PATHIN
2fe60 44 45 58 29 3b 0a 20 20 20 20 20 20 20 20 20 20  DEX);.          
2fe70 20 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 69    .            i
2fe80 66 28 20 70 61 74 68 4c 65 6e 3e 3d 4d 41 58 50  f( pathLen>=MAXP
2fe90 41 54 48 4c 45 4e 20 29 7b 0a 20 20 20 20 20 20  ATHLEN ){.      
2fea0 20 20 20 20 20 20 20 20 70 61 74 68 4c 65 6e 3d          pathLen=
2feb0 4d 41 58 50 41 54 48 4c 45 4e 2d 31 3b 0a 20 20  MAXPATHLEN-1;.  
2fec0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
2fed0 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 6c          memcpy(l
2fee0 6f 63 6b 50 61 74 68 2c 20 26 72 65 61 64 42 75  ockPath, &readBu
2fef0 66 5b 50 52 4f 58 59 5f 50 41 54 48 49 4e 44 45  f[PROXY_PATHINDE
2ff00 58 5d 2c 20 70 61 74 68 4c 65 6e 29 3b 0a 20 20  X], pathLen);.  
2ff10 20 20 20 20 20 20 20 20 20 20 6c 6f 63 6b 50 61            lockPa
2ff20 74 68 5b 70 61 74 68 4c 65 6e 5d 20 3d 20 30 3b  th[pathLen] = 0;
2ff30 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 65 6d  .            tem
2ff40 70 4c 6f 63 6b 50 61 74 68 20 3d 20 6c 6f 63 6b  pLockPath = lock
2ff50 50 61 74 68 3b 0a 20 20 20 20 20 20 20 20 20 20  Path;.          
2ff60 20 20 74 72 79 4f 6c 64 4c 6f 63 6b 50 61 74 68    tryOldLockPath
2ff70 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20   = 1;.          
2ff80 20 20 2f 2a 20 63 72 65 61 74 65 20 61 20 63 6f    /* create a co
2ff90 70 79 20 6f 66 20 74 68 65 20 6c 6f 63 6b 20 70  py of the lock p
2ffa0 61 74 68 20 69 66 20 74 68 65 20 63 6f 6e 63 68  ath if the conch
2ffb0 20 69 73 20 74 61 6b 65 6e 20 2a 2f 0a 20 20 20   is taken */.   
2ffc0 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e           goto en
2ffd0 64 5f 74 61 6b 65 63 6f 6e 63 68 3b 0a 20 20 20  d_takeconch;.   
2ffe0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2fff0 20 7d 65 6c 73 65 20 69 66 28 20 68 6f 73 74 49   }else if( hostI
30000 64 4d 61 74 63 68 0a 20 20 20 20 20 20 20 20 20  dMatch.         
30010 20 20 20 20 20 20 26 26 20 21 73 74 72 6e 63 6d        && !strncm
30020 70 28 70 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78  p(pCtx->lockProx
30030 79 50 61 74 68 2c 20 26 72 65 61 64 42 75 66 5b  yPath, &readBuf[
30040 50 52 4f 58 59 5f 50 41 54 48 49 4e 44 45 58 5d  PROXY_PATHINDEX]
30050 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
30060 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65 61               rea
30070 64 4c 65 6e 2d 50 52 4f 58 59 5f 50 41 54 48 49  dLen-PROXY_PATHI
30080 4e 44 45 58 29 0a 20 20 20 20 20 20 20 20 29 7b  NDEX).        ){
30090 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 63 6f  .          /* co
300a0 6e 63 68 20 68 6f 73 74 20 61 6e 64 20 6c 6f 63  nch host and loc
300b0 6b 20 70 61 74 68 20 6d 61 74 63 68 20 2a 2f 0a  k path match */.
300c0 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65            goto e
300d0 6e 64 5f 74 61 6b 65 63 6f 6e 63 68 3b 20 0a 20  nd_takeconch; . 
300e0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
300f0 0a 20 20 20 20 20 20 0a 20 20 20 20 20 20 2f 2a  .      .      /*
30100 20 69 66 20 74 68 65 20 63 6f 6e 63 68 20 69 73   if the conch is
30110 6e 27 74 20 77 72 69 74 61 62 6c 65 20 61 6e 64  n't writable and
30120 20 64 6f 65 73 6e 27 74 20 6d 61 74 63 68 2c 20   doesn't match, 
30130 77 65 20 63 61 6e 27 74 20 74 61 6b 65 20 69 74  we can't take it
30140 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 28 63   */.      if( (c
30150 6f 6e 63 68 46 69 6c 65 2d 3e 6f 70 65 6e 46 6c  onchFile->openFl
30160 61 67 73 26 4f 5f 52 44 57 52 29 20 3d 3d 20 30  ags&O_RDWR) == 0
30170 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
30180 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20   SQLITE_BUSY;.  
30190 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 74        goto end_t
301a0 61 6b 65 63 6f 6e 63 68 3b 0a 20 20 20 20 20 20  akeconch;.      
301b0 7d 0a 20 20 20 20 20 20 0a 20 20 20 20 20 20 2f  }.      .      /
301c0 2a 20 65 69 74 68 65 72 20 74 68 65 20 63 6f 6e  * either the con
301d0 63 68 20 64 69 64 6e 27 74 20 6d 61 74 63 68 20  ch didn't match 
301e0 6f 72 20 77 65 20 6e 65 65 64 20 74 6f 20 63 72  or we need to cr
301f0 65 61 74 65 20 61 20 6e 65 77 20 6f 6e 65 20 2a  eate a new one *
30200 2f 0a 20 20 20 20 20 20 69 66 28 20 21 70 43 74  /.      if( !pCt
30210 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 50 61 74 68  x->lockProxyPath
30220 20 29 7b 0a 20 20 20 20 20 20 20 20 70 72 6f 78   ){.        prox
30230 79 47 65 74 4c 6f 63 6b 50 61 74 68 28 70 43 74  yGetLockPath(pCt
30240 78 2d 3e 64 62 50 61 74 68 2c 20 6c 6f 63 6b 50  x->dbPath, lockP
30250 61 74 68 2c 20 4d 41 58 50 41 54 48 4c 45 4e 29  ath, MAXPATHLEN)
30260 3b 0a 20 20 20 20 20 20 20 20 74 65 6d 70 4c 6f  ;.        tempLo
30270 63 6b 50 61 74 68 20 3d 20 6c 6f 63 6b 50 61 74  ckPath = lockPat
30280 68 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20 63 72  h;.        /* cr
30290 65 61 74 65 20 61 20 63 6f 70 79 20 6f 66 20 74  eate a copy of t
302a0 68 65 20 6c 6f 63 6b 20 70 61 74 68 20 5f 6f 6e  he lock path _on
302b0 6c 79 5f 20 69 66 20 74 68 65 20 63 6f 6e 63 68  ly_ if the conch
302c0 20 69 73 20 74 61 6b 65 6e 20 2a 2f 0a 20 20 20   is taken */.   
302d0 20 20 20 7d 0a 20 20 20 20 20 20 0a 20 20 20 20     }.      .    
302e0 20 20 2f 2a 20 75 70 64 61 74 65 20 63 6f 6e 63    /* update conc
302f0 68 20 77 69 74 68 20 68 6f 73 74 20 61 6e 64 20  h with host and 
30300 70 61 74 68 20 28 74 68 69 73 20 77 69 6c 6c 20  path (this will 
30310 66 61 69 6c 20 69 66 20 6f 74 68 65 72 20 70 72  fail if other pr
30320 6f 63 65 73 73 0a 20 20 20 20 20 20 2a 2a 20 68  ocess.      ** h
30330 61 73 20 61 20 73 68 61 72 65 64 20 6c 6f 63 6b  as a shared lock
30340 20 61 6c 72 65 61 64 79 29 2c 20 69 66 20 74 68   already), if th
30350 65 20 68 6f 73 74 20 69 64 20 6d 61 74 63 68 65  e host id matche
30360 73 2c 20 75 73 65 20 74 68 65 20 62 69 67 0a 20  s, use the big. 
30370 20 20 20 20 20 2a 2a 20 73 74 69 63 6b 2e 0a 20       ** stick.. 
30380 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 66 75       */.      fu
30390 74 69 6d 65 73 28 63 6f 6e 63 68 46 69 6c 65 2d  times(conchFile-
303a0 3e 68 2c 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 20  >h, NULL);.     
303b0 20 69 66 28 20 68 6f 73 74 49 64 4d 61 74 63 68   if( hostIdMatch
303c0 20 26 26 20 21 63 72 65 61 74 65 43 6f 6e 63 68   && !createConch
303d0 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20   ){.        if( 
303e0 63 6f 6e 63 68 46 69 6c 65 2d 3e 70 4c 6f 63 6b  conchFile->pLock
303f0 20 26 26 20 63 6f 6e 63 68 46 69 6c 65 2d 3e 70   && conchFile->p
30400 4c 6f 63 6b 2d 3e 63 6e 74 3e 31 20 29 7b 0a 20  Lock->cnt>1 ){. 
30410 20 20 20 20 20 20 20 20 20 2f 2a 20 57 65 20 61           /* We a
30420 72 65 20 74 72 79 69 6e 67 20 66 6f 72 20 61 6e  re trying for an
30430 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20   exclusive lock 
30440 62 75 74 20 61 6e 6f 74 68 65 72 20 74 68 72 65  but another thre
30450 61 64 20 69 6e 20 74 68 69 73 0a 20 20 20 20 20  ad in this.     
30460 20 20 20 20 20 20 2a 2a 20 73 61 6d 65 20 70 72        ** same pr
30470 6f 63 65 73 73 20 69 73 20 73 74 69 6c 6c 20 68  ocess is still h
30480 6f 6c 64 69 6e 67 20 61 20 73 68 61 72 65 64 20  olding a shared 
30490 6c 6f 63 6b 2e 20 2a 2f 0a 20 20 20 20 20 20 20  lock. */.       
304a0 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42     rc = SQLITE_B
304b0 55 53 59 3b 0a 20 20 20 20 20 20 20 20 7d 20 65  USY;.        } e
304c0 6c 73 65 20 7b 20 20 20 20 20 20 20 20 20 20 0a  lse {          .
304d0 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 70            rc = p
304e0 72 6f 78 79 43 6f 6e 63 68 4c 6f 63 6b 28 70 46  roxyConchLock(pF
304f0 69 6c 65 2c 20 6d 79 48 6f 73 74 49 44 2c 20 45  ile, myHostID, E
30500 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 3b 0a  XCLUSIVE_LOCK);.
30510 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
30520 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72  }else{.        r
30530 63 20 3d 20 63 6f 6e 63 68 46 69 6c 65 2d 3e 70  c = conchFile->p
30540 4d 65 74 68 6f 64 2d 3e 78 4c 6f 63 6b 28 28 73  Method->xLock((s
30550 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29 63 6f 6e  qlite3_file*)con
30560 63 68 46 69 6c 65 2c 20 45 58 43 4c 55 53 49 56  chFile, EXCLUSIV
30570 45 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 7d  E_LOCK);.      }
30580 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53  .      if( rc==S
30590 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
305a0 20 20 20 20 63 68 61 72 20 77 72 69 74 65 42 75      char writeBu
305b0 66 66 65 72 5b 50 52 4f 58 59 5f 4d 41 58 43 4f  ffer[PROXY_MAXCO
305c0 4e 43 48 4c 45 4e 5d 3b 0a 20 20 20 20 20 20 20  NCHLEN];.       
305d0 20 69 6e 74 20 77 72 69 74 65 53 69 7a 65 20 3d   int writeSize =
305e0 20 30 3b 0a 20 20 20 20 20 20 20 20 0a 20 20 20   0;.        .   
305f0 20 20 20 20 20 77 72 69 74 65 42 75 66 66 65 72       writeBuffer
30600 5b 30 5d 20 3d 20 28 63 68 61 72 29 50 52 4f 58  [0] = (char)PROX
30610 59 5f 43 4f 4e 43 48 56 45 52 53 49 4f 4e 3b 0a  Y_CONCHVERSION;.
30620 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26          memcpy(&
30630 77 72 69 74 65 42 75 66 66 65 72 5b 50 52 4f 58  writeBuffer[PROX
30640 59 5f 48 45 41 44 45 52 4c 45 4e 5d 2c 20 6d 79  Y_HEADERLEN], my
30650 48 6f 73 74 49 44 2c 20 50 52 4f 58 59 5f 48 4f  HostID, PROXY_HO
30660 53 54 49 44 4c 45 4e 29 3b 0a 20 20 20 20 20 20  STIDLEN);.      
30670 20 20 69 66 28 20 70 43 74 78 2d 3e 6c 6f 63 6b    if( pCtx->lock
30680 50 72 6f 78 79 50 61 74 68 21 3d 4e 55 4c 4c 20  ProxyPath!=NULL 
30690 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 74 72  ){.          str
306a0 6c 63 70 79 28 26 77 72 69 74 65 42 75 66 66 65  lcpy(&writeBuffe
306b0 72 5b 50 52 4f 58 59 5f 50 41 54 48 49 4e 44 45  r[PROXY_PATHINDE
306c0 58 5d 2c 20 70 43 74 78 2d 3e 6c 6f 63 6b 50 72  X], pCtx->lockPr
306d0 6f 78 79 50 61 74 68 2c 20 4d 41 58 50 41 54 48  oxyPath, MAXPATH
306e0 4c 45 4e 29 3b 0a 20 20 20 20 20 20 20 20 7d 65  LEN);.        }e
306f0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 73  lse{.          s
30700 74 72 6c 63 70 79 28 26 77 72 69 74 65 42 75 66  trlcpy(&writeBuf
30710 66 65 72 5b 50 52 4f 58 59 5f 50 41 54 48 49 4e  fer[PROXY_PATHIN
30720 44 45 58 5d 2c 20 74 65 6d 70 4c 6f 63 6b 50 61  DEX], tempLockPa
30730 74 68 2c 20 4d 41 58 50 41 54 48 4c 45 4e 29 3b  th, MAXPATHLEN);
30740 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
30750 20 20 20 77 72 69 74 65 53 69 7a 65 20 3d 20 50     writeSize = P
30760 52 4f 58 59 5f 50 41 54 48 49 4e 44 45 58 20 2b  ROXY_PATHINDEX +
30770 20 73 74 72 6c 65 6e 28 26 77 72 69 74 65 42 75   strlen(&writeBu
30780 66 66 65 72 5b 50 52 4f 58 59 5f 50 41 54 48 49  ffer[PROXY_PATHI
30790 4e 44 45 58 5d 29 3b 0a 20 20 20 20 20 20 20 20  NDEX]);.        
307a0 66 74 72 75 6e 63 61 74 65 28 63 6f 6e 63 68 46  ftruncate(conchF
307b0 69 6c 65 2d 3e 68 2c 20 77 72 69 74 65 53 69 7a  ile->h, writeSiz
307c0 65 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d  e);.        rc =
307d0 20 75 6e 69 78 57 72 69 74 65 28 28 73 71 6c 69   unixWrite((sqli
307e0 74 65 33 5f 66 69 6c 65 20 2a 29 63 6f 6e 63 68  te3_file *)conch
307f0 46 69 6c 65 2c 20 77 72 69 74 65 42 75 66 66 65  File, writeBuffe
30800 72 2c 20 77 72 69 74 65 53 69 7a 65 2c 20 30 29  r, writeSize, 0)
30810 3b 0a 20 20 20 20 20 20 20 20 66 73 79 6e 63 28  ;.        fsync(
30820 63 6f 6e 63 68 46 69 6c 65 2d 3e 68 29 3b 0a 20  conchFile->h);. 
30830 20 20 20 20 20 20 20 2f 2a 20 49 66 20 77 65 20         /* If we 
30840 63 72 65 61 74 65 64 20 61 20 6e 65 77 20 63 6f  created a new co
30850 6e 63 68 20 66 69 6c 65 20 28 6e 6f 74 20 6a 75  nch file (not ju
30860 73 74 20 75 70 64 61 74 65 64 20 74 68 65 20 63  st updated the c
30870 6f 6e 74 65 6e 74 73 20 6f 66 20 61 20 0a 20 20  ontents of a .  
30880 20 20 20 20 20 20 20 2a 2a 20 76 61 6c 69 64 20         ** valid 
30890 63 6f 6e 63 68 20 66 69 6c 65 29 2c 20 74 72 79  conch file), try
308a0 20 74 6f 20 6d 61 74 63 68 20 74 68 65 20 70 65   to match the pe
308b0 72 6d 69 73 73 69 6f 6e 73 20 6f 66 20 74 68 65  rmissions of the
308c0 20 64 61 74 61 62 61 73 65 20 0a 20 20 20 20 20   database .     
308d0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69      */.        i
308e0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
308f0 20 26 26 20 63 72 65 61 74 65 43 6f 6e 63 68 20   && createConch 
30900 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 74 72  ){.          str
30910 75 63 74 20 73 74 61 74 20 62 75 66 3b 0a 20 20  uct stat buf;.  
30920 20 20 20 20 20 20 20 20 69 6e 74 20 65 72 72 20          int err 
30930 3d 20 66 73 74 61 74 28 70 46 69 6c 65 2d 3e 68  = fstat(pFile->h
30940 2c 20 26 62 75 66 29 3b 0a 20 20 20 20 20 20 20  , &buf);.       
30950 20 20 20 69 66 28 20 65 72 72 3d 3d 30 20 29 7b     if( err==0 ){
30960 0a 20 20 20 20 20 20 20 20 20 20 20 20 6d 6f 64  .            mod
30970 65 5f 74 20 63 6d 6f 64 65 20 3d 20 62 75 66 2e  e_t cmode = buf.
30980 73 74 5f 6d 6f 64 65 26 28 53 5f 49 52 55 53 52  st_mode&(S_IRUSR
30990 7c 53 5f 49 57 55 53 52 20 7c 20 53 5f 49 52 47  |S_IWUSR | S_IRG
309a0 52 50 7c 53 5f 49 57 47 52 50 20 7c 0a 20 20 20  RP|S_IWGRP |.   
309b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
309c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
309d0 20 20 20 20 20 53 5f 49 52 4f 54 48 7c 53 5f 49       S_IROTH|S_I
309e0 57 4f 54 48 29 3b 0a 20 20 20 20 20 20 20 20 20  WOTH);.         
309f0 20 20 20 2f 2a 20 74 72 79 20 74 6f 20 6d 61 74     /* try to mat
30a00 63 68 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ch the database 
30a10 66 69 6c 65 20 52 2f 57 20 70 65 72 6d 69 73 73  file R/W permiss
30a20 69 6f 6e 73 2c 20 69 67 6e 6f 72 65 20 66 61 69  ions, ignore fai
30a30 6c 75 72 65 20 2a 2f 0a 23 69 66 6e 64 65 66 20  lure */.#ifndef 
30a40 53 51 4c 49 54 45 5f 50 52 4f 58 59 5f 44 45 42  SQLITE_PROXY_DEB
30a50 55 47 0a 20 20 20 20 20 20 20 20 20 20 20 20 66  UG.            f
30a60 63 68 6d 6f 64 28 63 6f 6e 63 68 46 69 6c 65 2d  chmod(conchFile-
30a70 3e 68 2c 20 63 6d 6f 64 65 29 3b 0a 23 65 6c 73  >h, cmode);.#els
30a80 65 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  e.            if
30a90 28 20 66 63 68 6d 6f 64 28 63 6f 6e 63 68 46 69  ( fchmod(conchFi
30aa0 6c 65 2d 3e 68 2c 20 63 6d 6f 64 65 29 21 3d 30  le->h, cmode)!=0
30ab0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
30ac0 20 20 69 6e 74 20 63 6f 64 65 20 3d 20 65 72 72    int code = err
30ad0 6e 6f 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  no;.            
30ae0 20 20 66 70 72 69 6e 74 66 28 73 74 64 65 72 72    fprintf(stderr
30af0 2c 20 22 66 63 68 6d 6f 64 20 25 6f 20 46 41 49  , "fchmod %o FAI
30b00 4c 45 44 20 77 69 74 68 20 25 64 20 25 73 5c 6e  LED with %d %s\n
30b10 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
30b20 20 20 20 20 20 20 20 20 20 63 6d 6f 64 65 2c 20           cmode, 
30b30 63 6f 64 65 2c 20 73 74 72 65 72 72 6f 72 28 63  code, strerror(c
30b40 6f 64 65 29 29 3b 0a 20 20 20 20 20 20 20 20 20  ode));.         
30b50 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20     } else {.    
30b60 20 20 20 20 20 20 20 20 20 20 66 70 72 69 6e 74            fprint
30b70 66 28 73 74 64 65 72 72 2c 20 22 66 63 68 6d 6f  f(stderr, "fchmo
30b80 64 20 25 6f 20 53 55 43 43 45 44 45 44 5c 6e 22  d %o SUCCEDED\n"
30b90 2c 63 6d 6f 64 65 29 3b 0a 20 20 20 20 20 20 20  ,cmode);.       
30ba0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
30bb0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
30bc0 20 20 20 20 69 6e 74 20 63 6f 64 65 20 3d 20 65      int code = e
30bd0 72 72 6e 6f 3b 0a 20 20 20 20 20 20 20 20 20 20  rrno;.          
30be0 20 20 66 70 72 69 6e 74 66 28 73 74 64 65 72 72    fprintf(stderr
30bf0 2c 20 22 53 54 41 54 20 46 41 49 4c 45 44 5b 25  , "STAT FAILED[%
30c00 64 5d 20 77 69 74 68 20 25 64 20 25 73 5c 6e 22  d] with %d %s\n"
30c10 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  , .             
30c20 20 20 20 20 20 20 20 65 72 72 2c 20 63 6f 64 65         err, code
30c30 2c 20 73 74 72 65 72 72 6f 72 28 63 6f 64 65 29  , strerror(code)
30c40 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20  );.#endif.      
30c50 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
30c60 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 63 6f        }.      co
30c70 6e 63 68 46 69 6c 65 2d 3e 70 4d 65 74 68 6f 64  nchFile->pMethod
30c80 2d 3e 78 55 6e 6c 6f 63 6b 28 28 73 71 6c 69 74  ->xUnlock((sqlit
30c90 65 33 5f 66 69 6c 65 2a 29 63 6f 6e 63 68 46 69  e3_file*)conchFi
30ca0 6c 65 2c 20 53 48 41 52 45 44 5f 4c 4f 43 4b 29  le, SHARED_LOCK)
30cb0 3b 0a 20 20 20 20 20 20 0a 20 20 20 20 65 6e 64  ;.      .    end
30cc0 5f 74 61 6b 65 63 6f 6e 63 68 3a 0a 20 20 20 20  _takeconch:.    
30cd0 20 20 4f 53 54 52 41 43 45 32 28 22 54 52 41 4e    OSTRACE2("TRAN
30ce0 53 50 52 4f 58 59 3a 20 43 4c 4f 53 45 20 20 25  SPROXY: CLOSE  %
30cf0 64 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 29 3b  d\n", pFile->h);
30d00 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53  .      if( rc==S
30d10 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 46 69 6c  QLITE_OK && pFil
30d20 65 2d 3e 6f 70 65 6e 46 6c 61 67 73 20 29 7b 0a  e->openFlags ){.
30d30 20 20 20 20 20 20 20 20 69 66 28 20 70 46 69 6c          if( pFil
30d40 65 2d 3e 68 3e 3d 30 20 29 7b 0a 23 69 66 64 65  e->h>=0 ){.#ifde
30d50 66 20 53 54 52 49 43 54 5f 43 4c 4f 53 45 5f 45  f STRICT_CLOSE_E
30d60 52 52 4f 52 0a 20 20 20 20 20 20 20 20 20 20 69  RROR.          i
30d70 66 28 20 63 6c 6f 73 65 28 70 46 69 6c 65 2d 3e  f( close(pFile->
30d80 68 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  h) ){.          
30d90 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72    pFile->lastErr
30da0 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20  no = errno;.    
30db0 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53          return S
30dc0 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43 4c 4f 53  QLITE_IOERR_CLOS
30dd0 45 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 23  E;.          }.#
30de0 65 6c 73 65 0a 20 20 20 20 20 20 20 20 20 20 63  else.          c
30df0 6c 6f 73 65 28 70 46 69 6c 65 2d 3e 68 29 3b 20  lose(pFile->h); 
30e00 2f 2a 20 73 69 6c 65 6e 74 6c 79 20 6c 65 61 6b  /* silently leak
30e10 20 66 64 20 69 66 20 66 61 69 6c 20 2a 2f 0a 23   fd if fail */.#
30e20 65 6e 64 69 66 0a 20 20 20 20 20 20 20 20 7d 0a  endif.        }.
30e30 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 68          pFile->h
30e40 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 20 20 69   = -1;.        i
30e50 6e 74 20 66 64 20 3d 20 6f 70 65 6e 28 70 43 74  nt fd = open(pCt
30e60 78 2d 3e 64 62 50 61 74 68 2c 20 70 46 69 6c 65  x->dbPath, pFile
30e70 2d 3e 6f 70 65 6e 46 6c 61 67 73 2c 0a 20 20 20  ->openFlags,.   
30e80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30e90 20 20 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c     SQLITE_DEFAUL
30ea0 54 5f 46 49 4c 45 5f 50 45 52 4d 49 53 53 49 4f  T_FILE_PERMISSIO
30eb0 4e 53 29 3b 0a 20 20 20 20 20 20 20 20 4f 53 54  NS);.        OST
30ec0 52 41 43 45 32 28 22 54 52 41 4e 53 50 52 4f 58  RACE2("TRANSPROX
30ed0 59 3a 20 4f 50 45 4e 20 20 25 64 5c 6e 22 2c 20  Y: OPEN  %d\n", 
30ee0 66 64 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  fd);.        if(
30ef0 20 66 64 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20   fd>=0 ){.      
30f00 20 20 20 20 70 46 69 6c 65 2d 3e 68 20 3d 20 66      pFile->h = f
30f10 64 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  d;.        }else
30f20 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 3d 53  {.          rc=S
30f30 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 42  QLITE_CANTOPEN_B
30f40 4b 50 54 3b 20 2f 2a 20 53 51 4c 49 54 45 5f 42  KPT; /* SQLITE_B
30f50 55 53 59 3f 20 70 72 6f 78 79 54 61 6b 65 43 6f  USY? proxyTakeCo
30f60 6e 63 68 20 63 61 6c 6c 65 64 0a 20 20 20 20 20  nch called.     
30f70 20 20 20 20 20 20 64 75 72 69 6e 67 20 6c 6f 63        during loc
30f80 6b 69 6e 67 20 2a 2f 0a 20 20 20 20 20 20 20 20  king */.        
30f90 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
30fa0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
30fb0 4b 20 26 26 20 21 70 43 74 78 2d 3e 6c 6f 63 6b  K && !pCtx->lock
30fc0 50 72 6f 78 79 20 29 7b 0a 20 20 20 20 20 20 20  Proxy ){.       
30fd0 20 63 68 61 72 20 2a 70 61 74 68 20 3d 20 74 65   char *path = te
30fe0 6d 70 4c 6f 63 6b 50 61 74 68 20 3f 20 74 65 6d  mpLockPath ? tem
30ff0 70 4c 6f 63 6b 50 61 74 68 20 3a 20 70 43 74 78  pLockPath : pCtx
31000 2d 3e 6c 6f 63 6b 50 72 6f 78 79 50 61 74 68 3b  ->lockProxyPath;
31010 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 70 72  .        rc = pr
31020 6f 78 79 43 72 65 61 74 65 55 6e 69 78 46 69 6c  oxyCreateUnixFil
31030 65 28 70 61 74 68 2c 20 26 70 43 74 78 2d 3e 6c  e(path, &pCtx->l
31040 6f 63 6b 50 72 6f 78 79 2c 20 31 29 3b 0a 20 20  ockProxy, 1);.  
31050 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
31060 4c 49 54 45 5f 4f 4b 20 26 26 20 72 63 21 3d 53  LITE_OK && rc!=S
31070 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 26 26 20 74  QLITE_NOMEM && t
31080 72 79 4f 6c 64 4c 6f 63 6b 50 61 74 68 20 29 7b  ryOldLockPath ){
31090 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 77 65  .          /* we
310a0 20 63 6f 75 6c 64 6e 27 74 20 63 72 65 61 74 65   couldn't create
310b0 20 74 68 65 20 70 72 6f 78 79 20 6c 6f 63 6b 20   the proxy lock 
310c0 66 69 6c 65 20 77 69 74 68 20 74 68 65 20 6f 6c  file with the ol
310d0 64 20 6c 6f 63 6b 20 66 69 6c 65 20 70 61 74 68  d lock file path
310e0 0a 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 73  .           ** s
310f0 6f 20 74 72 79 20 61 67 61 69 6e 20 76 69 61 20  o try again via 
31100 61 75 74 6f 2d 6e 61 6d 69 6e 67 20 0a 20 20 20  auto-naming .   
31110 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
31120 20 20 20 20 20 66 6f 72 63 65 4e 65 77 4c 6f 63       forceNewLoc
31130 6b 50 61 74 68 20 3d 20 31 3b 0a 20 20 20 20 20  kPath = 1;.     
31140 20 20 20 20 20 74 72 79 4f 6c 64 4c 6f 63 6b 50       tryOldLockP
31150 61 74 68 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  ath = 0;.       
31160 20 20 20 63 6f 6e 74 69 6e 75 65 3b 20 2f 2a 20     continue; /* 
31170 67 6f 20 62 61 63 6b 20 74 6f 20 74 68 65 20 64  go back to the d
31180 6f 20 7b 7d 20 77 68 69 6c 65 20 73 74 61 72 74  o {} while start
31190 20 70 6f 69 6e 74 2c 20 74 72 79 20 61 67 61 69   point, try agai
311a0 6e 20 2a 2f 0a 20 20 20 20 20 20 20 20 7d 0a 20  n */.        }. 
311b0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
311c0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
311d0 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 65  {.        /* Nee
311e0 64 20 74 6f 20 6d 61 6b 65 20 61 20 63 6f 70 79  d to make a copy
311f0 20 6f 66 20 70 61 74 68 20 69 66 20 77 65 20 65   of path if we e
31200 78 74 72 61 63 74 65 64 20 74 68 65 20 76 61 6c  xtracted the val
31210 75 65 0a 20 20 20 20 20 20 20 20 20 2a 2a 20 66  ue.         ** f
31220 72 6f 6d 20 74 68 65 20 63 6f 6e 63 68 20 66 69  rom the conch fi
31230 6c 65 20 6f 72 20 74 68 65 20 70 61 74 68 20 77  le or the path w
31240 61 73 20 61 6c 6c 6f 63 61 74 65 64 20 6f 6e 20  as allocated on 
31250 74 68 65 20 73 74 61 63 6b 0a 20 20 20 20 20 20  the stack.      
31260 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66     */.        if
31270 28 20 74 65 6d 70 4c 6f 63 6b 50 61 74 68 20 29  ( tempLockPath )
31280 7b 0a 20 20 20 20 20 20 20 20 20 20 70 43 74 78  {.          pCtx
31290 2d 3e 6c 6f 63 6b 50 72 6f 78 79 50 61 74 68 20  ->lockProxyPath 
312a0 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72 44 75  = sqlite3DbStrDu
312b0 70 28 30 2c 20 74 65 6d 70 4c 6f 63 6b 50 61 74  p(0, tempLockPat
312c0 68 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  h);.          if
312d0 28 20 21 70 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f  ( !pCtx->lockPro
312e0 78 79 50 61 74 68 20 29 7b 0a 20 20 20 20 20 20  xyPath ){.      
312f0 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
31300 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 20  E_NOMEM;.       
31310 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
31320 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
31330 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
31340 7b 0a 20 20 20 20 20 20 20 20 70 43 74 78 2d 3e  {.        pCtx->
31350 63 6f 6e 63 68 48 65 6c 64 20 3d 20 31 3b 0a 20  conchHeld = 1;. 
31360 20 20 20 20 20 20 20 0a 20 20 20 20 20 20 20 20         .        
31370 69 66 28 20 70 43 74 78 2d 3e 6c 6f 63 6b 50 72  if( pCtx->lockPr
31380 6f 78 79 2d 3e 70 4d 65 74 68 6f 64 20 3d 3d 20  oxy->pMethod == 
31390 26 61 66 70 49 6f 4d 65 74 68 6f 64 73 20 29 7b  &afpIoMethods ){
313a0 0a 20 20 20 20 20 20 20 20 20 20 61 66 70 4c 6f  .          afpLo
313b0 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 61 66  ckingContext *af
313c0 70 43 74 78 3b 0a 20 20 20 20 20 20 20 20 20 20  pCtx;.          
313d0 61 66 70 43 74 78 20 3d 20 28 61 66 70 4c 6f 63  afpCtx = (afpLoc
313e0 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 29 70 43  kingContext *)pC
313f0 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 2d 3e 6c  tx->lockProxy->l
31400 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 0a 20  ockingContext;. 
31410 20 20 20 20 20 20 20 20 20 61 66 70 43 74 78 2d           afpCtx-
31420 3e 64 62 50 61 74 68 20 3d 20 70 43 74 78 2d 3e  >dbPath = pCtx->
31430 6c 6f 63 6b 50 72 6f 78 79 50 61 74 68 3b 0a 20  lockProxyPath;. 
31440 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
31450 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 20 20   else {.        
31460 63 6f 6e 63 68 46 69 6c 65 2d 3e 70 4d 65 74 68  conchFile->pMeth
31470 6f 64 2d 3e 78 55 6e 6c 6f 63 6b 28 28 73 71 6c  od->xUnlock((sql
31480 69 74 65 33 5f 66 69 6c 65 2a 29 63 6f 6e 63 68  ite3_file*)conch
31490 46 69 6c 65 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a  File, NO_LOCK);.
314a0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 4f 53        }.      OS
314b0 54 52 41 43 45 33 28 22 54 41 4b 45 43 4f 4e 43  TRACE3("TAKECONC
314c0 48 20 20 25 64 20 25 73 5c 6e 22 2c 20 63 6f 6e  H  %d %s\n", con
314d0 63 68 46 69 6c 65 2d 3e 68 2c 20 72 63 3d 3d 53  chFile->h, rc==S
314e0 51 4c 49 54 45 5f 4f 4b 3f 22 6f 6b 22 3a 22 66  QLITE_OK?"ok":"f
314f0 61 69 6c 65 64 22 29 3b 0a 20 20 20 20 20 20 72  ailed");.      r
31500 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 20  eturn rc;.    } 
31510 77 68 69 6c 65 20 28 31 29 3b 20 2f 2a 20 69 6e  while (1); /* in
31520 20 63 61 73 65 20 77 65 20 6e 65 65 64 20 74 6f   case we need to
31530 20 72 65 74 72 79 20 74 68 65 20 3a 61 75 74 6f   retry the :auto
31540 3a 20 6c 6f 63 6b 20 66 69 6c 65 20 2d 20 77 65  : lock file - we
31550 20 73 68 6f 75 6c 64 20 6e 65 76 65 72 20 67 65   should never ge
31560 74 20 68 65 72 65 20 65 78 63 65 70 74 20 76 69  t here except vi
31570 61 20 74 68 65 20 27 63 6f 6e 74 69 6e 75 65 27  a the 'continue'
31580 20 63 61 6c 6c 2e 20 2a 2f 0a 20 20 7d 0a 7d 0a   call. */.  }.}.
31590 0a 2f 2a 0a 2a 2a 20 49 66 20 70 46 69 6c 65 20  ./*.** If pFile 
315a0 68 6f 6c 64 73 20 61 20 6c 6f 63 6b 20 6f 6e 20  holds a lock on 
315b0 61 20 63 6f 6e 63 68 20 66 69 6c 65 2c 20 74 68  a conch file, th
315c0 65 6e 20 72 65 6c 65 61 73 65 20 74 68 61 74 20  en release that 
315d0 6c 6f 63 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  lock..*/.static 
315e0 69 6e 74 20 70 72 6f 78 79 52 65 6c 65 61 73 65  int proxyRelease
315f0 43 6f 6e 63 68 28 75 6e 69 78 46 69 6c 65 20 2a  Conch(unixFile *
31600 70 46 69 6c 65 29 7b 0a 20 20 69 6e 74 20 72 63  pFile){.  int rc
31610 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
31620 20 20 20 20 20 20 2f 2a 20 53 75 62 72 6f 75 74        /* Subrout
31630 69 6e 65 20 72 65 74 75 72 6e 20 63 6f 64 65 20  ine return code 
31640 2a 2f 0a 20 20 70 72 6f 78 79 4c 6f 63 6b 69 6e  */.  proxyLockin
31650 67 43 6f 6e 74 65 78 74 20 2a 70 43 74 78 3b 20  gContext *pCtx; 
31660 20 2f 2a 20 54 68 65 20 6c 6f 63 6b 69 6e 67 20   /* The locking 
31670 63 6f 6e 74 65 78 74 20 66 6f 72 20 74 68 65 20  context for the 
31680 70 72 6f 78 79 20 6c 6f 63 6b 20 2a 2f 0a 20 20  proxy lock */.  
31690 75 6e 69 78 46 69 6c 65 20 2a 63 6f 6e 63 68 46  unixFile *conchF
316a0 69 6c 65 3b 20 20 20 20 20 20 20 20 2f 2a 20 4e  ile;        /* N
316b0 61 6d 65 20 6f 66 20 74 68 65 20 63 6f 6e 63 68  ame of the conch
316c0 20 66 69 6c 65 20 2a 2f 0a 0a 20 20 70 43 74 78   file */..  pCtx
316d0 20 3d 20 28 70 72 6f 78 79 4c 6f 63 6b 69 6e 67   = (proxyLocking
316e0 43 6f 6e 74 65 78 74 20 2a 29 70 46 69 6c 65 2d  Context *)pFile-
316f0 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b  >lockingContext;
31700 0a 20 20 63 6f 6e 63 68 46 69 6c 65 20 3d 20 70  .  conchFile = p
31710 43 74 78 2d 3e 63 6f 6e 63 68 46 69 6c 65 3b 0a  Ctx->conchFile;.
31720 20 20 4f 53 54 52 41 43 45 34 28 22 52 45 4c 45    OSTRACE4("RELE
31730 41 53 45 43 4f 4e 43 48 20 20 25 64 20 66 6f 72  ASECONCH  %d for
31740 20 25 73 20 70 69 64 3d 25 64 5c 6e 22 2c 20 63   %s pid=%d\n", c
31750 6f 6e 63 68 46 69 6c 65 2d 3e 68 2c 0a 20 20 20  onchFile->h,.   
31760 20 20 20 20 20 20 20 20 28 70 43 74 78 2d 3e 6c          (pCtx->l
31770 6f 63 6b 50 72 6f 78 79 50 61 74 68 20 3f 20 70  ockProxyPath ? p
31780 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 50 61  Ctx->lockProxyPa
31790 74 68 20 3a 20 22 3a 61 75 74 6f 3a 22 29 2c 20  th : ":auto:"), 
317a0 0a 20 20 20 20 20 20 20 20 20 20 20 67 65 74 70  .           getp
317b0 69 64 28 29 29 3b 0a 20 20 69 66 28 20 70 43 74  id());.  if( pCt
317c0 78 2d 3e 63 6f 6e 63 68 48 65 6c 64 3e 30 20 29  x->conchHeld>0 )
317d0 7b 0a 20 20 20 20 72 63 20 3d 20 63 6f 6e 63 68  {.    rc = conch
317e0 46 69 6c 65 2d 3e 70 4d 65 74 68 6f 64 2d 3e 78  File->pMethod->x
317f0 55 6e 6c 6f 63 6b 28 28 73 71 6c 69 74 65 33 5f  Unlock((sqlite3_
31800 66 69 6c 65 2a 29 63 6f 6e 63 68 46 69 6c 65 2c  file*)conchFile,
31810 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20 20 7d 0a 20   NO_LOCK);.  }. 
31820 20 70 43 74 78 2d 3e 63 6f 6e 63 68 48 65 6c 64   pCtx->conchHeld
31830 20 3d 20 30 3b 0a 20 20 4f 53 54 52 41 43 45 33   = 0;.  OSTRACE3
31840 28 22 52 45 4c 45 41 53 45 43 4f 4e 43 48 20 20  ("RELEASECONCH  
31850 25 64 20 25 73 5c 6e 22 2c 20 63 6f 6e 63 68 46  %d %s\n", conchF
31860 69 6c 65 2d 3e 68 2c 0a 20 20 20 20 20 20 20 20  ile->h,.        
31870 20 20 20 28 72 63 3d 3d 53 51 4c 49 54 45 5f 4f     (rc==SQLITE_O
31880 4b 20 3f 20 22 6f 6b 22 20 3a 20 22 66 61 69 6c  K ? "ok" : "fail
31890 65 64 22 29 29 3b 0a 20 20 72 65 74 75 72 6e 20  ed"));.  return 
318a0 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76  rc;.}../*.** Giv
318b0 65 6e 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61  en the name of a
318c0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20   database file, 
318d0 63 6f 6d 70 75 74 65 20 74 68 65 20 6e 61 6d 65  compute the name
318e0 20 6f 66 20 69 74 73 20 63 6f 6e 63 68 20 66 69   of its conch fi
318f0 6c 65 2e 0a 2a 2a 20 53 74 6f 72 65 20 74 68 65  le..** Store the
31900 20 63 6f 6e 63 68 20 66 69 6c 65 6e 61 6d 65 20   conch filename 
31910 69 6e 20 6d 65 6d 6f 72 79 20 6f 62 74 61 69 6e  in memory obtain
31920 65 64 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 5f  ed from sqlite3_
31930 6d 61 6c 6c 6f 63 28 29 2e 0a 2a 2a 20 4d 61 6b  malloc()..** Mak
31940 65 20 2a 70 43 6f 6e 63 68 50 61 74 68 20 70 6f  e *pConchPath po
31950 69 6e 74 20 74 6f 20 74 68 65 20 6e 65 77 20 6e  int to the new n
31960 61 6d 65 2e 20 20 52 65 74 75 72 6e 20 53 51 4c  ame.  Return SQL
31970 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73  ITE_OK on succes
31980 73 0a 2a 2a 20 6f 72 20 53 51 4c 49 54 45 5f 4e  s.** or SQLITE_N
31990 4f 4d 45 4d 20 69 66 20 75 6e 61 62 6c 65 20 74  OMEM if unable t
319a0 6f 20 6f 62 74 61 69 6e 20 6d 65 6d 6f 72 79 2e  o obtain memory.
319b0 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 65  .**.** The calle
319c0 72 20 69 73 20 72 65 73 70 6f 6e 73 69 62 6c 65  r is responsible
319d0 20 66 6f 72 20 65 6e 73 75 72 69 6e 67 20 74 68   for ensuring th
319e0 61 74 20 74 68 65 20 61 6c 6c 6f 63 61 74 65 64  at the allocated
319f0 20 6d 65 6d 6f 72 79 0a 2a 2a 20 73 70 61 63 65   memory.** space
31a00 20 69 73 20 65 76 65 6e 74 75 61 6c 6c 79 20 66   is eventually f
31a10 72 65 65 64 2e 0a 2a 2a 0a 2a 2a 20 2a 70 43 6f  reed..**.** *pCo
31a20 6e 63 68 50 61 74 68 20 69 73 20 73 65 74 20 74  nchPath is set t
31a30 6f 20 4e 55 4c 4c 20 69 66 20 61 20 6d 65 6d 6f  o NULL if a memo
31a40 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 65 72  ry allocation er
31a50 72 6f 72 20 6f 63 63 75 72 73 2e 0a 2a 2f 0a 73  ror occurs..*/.s
31a60 74 61 74 69 63 20 69 6e 74 20 70 72 6f 78 79 43  tatic int proxyC
31a70 72 65 61 74 65 43 6f 6e 63 68 50 61 74 68 6e 61  reateConchPathna
31a80 6d 65 28 63 68 61 72 20 2a 64 62 50 61 74 68 2c  me(char *dbPath,
31a90 20 63 68 61 72 20 2a 2a 70 43 6f 6e 63 68 50 61   char **pConchPa
31aa0 74 68 29 7b 0a 20 20 69 6e 74 20 69 3b 20 20 20  th){.  int i;   
31ab0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31ac0 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75       /* Loop cou
31ad0 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 6c 65  nter */.  int le
31ae0 6e 20 3d 20 28 69 6e 74 29 73 74 72 6c 65 6e 28  n = (int)strlen(
31af0 64 62 50 61 74 68 29 3b 20 2f 2a 20 4c 65 6e 67  dbPath); /* Leng
31b00 74 68 20 6f 66 20 64 61 74 61 62 61 73 65 20 66  th of database f
31b10 69 6c 65 6e 61 6d 65 20 2d 20 64 62 50 61 74 68  ilename - dbPath
31b20 20 2a 2f 0a 20 20 63 68 61 72 20 2a 63 6f 6e 63   */.  char *conc
31b30 68 50 61 74 68 3b 20 20 20 20 20 20 20 20 20 20  hPath;          
31b40 20 20 20 20 2f 2a 20 62 75 66 66 65 72 20 69 6e      /* buffer in
31b50 20 77 68 69 63 68 20 74 6f 20 63 6f 6e 73 74 72   which to constr
31b60 75 63 74 20 63 6f 6e 63 68 20 6e 61 6d 65 20 2a  uct conch name *
31b70 2f 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65  /..  /* Allocate
31b80 20 73 70 61 63 65 20 66 6f 72 20 74 68 65 20 63   space for the c
31b90 6f 6e 63 68 20 66 69 6c 65 6e 61 6d 65 20 61 6e  onch filename an
31ba0 64 20 69 6e 69 74 69 61 6c 69 7a 65 20 74 68 65  d initialize the
31bb0 20 6e 61 6d 65 20 74 6f 0a 20 20 2a 2a 20 74 68   name to.  ** th
31bc0 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 6f 72  e name of the or
31bd0 69 67 69 6e 61 6c 20 64 61 74 61 62 61 73 65 20  iginal database 
31be0 66 69 6c 65 2e 20 2a 2f 20 20 0a 20 20 2a 70 43  file. */  .  *pC
31bf0 6f 6e 63 68 50 61 74 68 20 3d 20 63 6f 6e 63 68  onchPath = conch
31c00 50 61 74 68 20 3d 20 28 63 68 61 72 20 2a 29 73  Path = (char *)s
31c10 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 6c 65  qlite3_malloc(le
31c20 6e 20 2b 20 38 29 3b 0a 20 20 69 66 28 20 63 6f  n + 8);.  if( co
31c30 6e 63 68 50 61 74 68 3d 3d 30 20 29 7b 0a 20 20  nchPath==0 ){.  
31c40 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
31c50 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 6d 65 6d  NOMEM;.  }.  mem
31c60 63 70 79 28 63 6f 6e 63 68 50 61 74 68 2c 20 64  cpy(conchPath, d
31c70 62 50 61 74 68 2c 20 6c 65 6e 2b 31 29 3b 0a 20  bPath, len+1);. 
31c80 20 0a 20 20 2f 2a 20 6e 6f 77 20 69 6e 73 65 72   .  /* now inser
31c90 74 20 61 20 22 2e 22 20 62 65 66 6f 72 65 20 74  t a "." before t
31ca0 68 65 20 6c 61 73 74 20 2f 20 63 68 61 72 61 63  he last / charac
31cb0 74 65 72 20 2a 2f 0a 20 20 66 6f 72 28 20 69 3d  ter */.  for( i=
31cc0 28 6c 65 6e 2d 31 29 3b 20 69 3e 3d 30 3b 20 69  (len-1); i>=0; i
31cd0 2d 2d 20 29 7b 0a 20 20 20 20 69 66 28 20 63 6f  -- ){.    if( co
31ce0 6e 63 68 50 61 74 68 5b 69 5d 3d 3d 27 2f 27 20  nchPath[i]=='/' 
31cf0 29 7b 0a 20 20 20 20 20 20 69 2b 2b 3b 0a 20 20  ){.      i++;.  
31d00 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
31d10 0a 20 20 7d 0a 20 20 63 6f 6e 63 68 50 61 74 68  .  }.  conchPath
31d20 5b 69 5d 3d 27 2e 27 3b 0a 20 20 77 68 69 6c 65  [i]='.';.  while
31d30 20 28 20 69 3c 6c 65 6e 20 29 7b 0a 20 20 20 20   ( i<len ){.    
31d40 63 6f 6e 63 68 50 61 74 68 5b 69 2b 31 5d 3d 64  conchPath[i+1]=d
31d50 62 50 61 74 68 5b 69 5d 3b 0a 20 20 20 20 69 2b  bPath[i];.    i+
31d60 2b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 61 70 70  +;.  }..  /* app
31d70 65 6e 64 20 74 68 65 20 22 2d 63 6f 6e 63 68 22  end the "-conch"
31d80 20 73 75 66 66 69 78 20 74 6f 20 74 68 65 20 66   suffix to the f
31d90 69 6c 65 20 2a 2f 0a 20 20 6d 65 6d 63 70 79 28  ile */.  memcpy(
31da0 26 63 6f 6e 63 68 50 61 74 68 5b 69 2b 31 5d 2c  &conchPath[i+1],
31db0 20 22 2d 63 6f 6e 63 68 22 2c 20 37 29 3b 0a 20   "-conch", 7);. 
31dc0 20 61 73 73 65 72 74 28 20 28 69 6e 74 29 73 74   assert( (int)st
31dd0 72 6c 65 6e 28 63 6f 6e 63 68 50 61 74 68 29 20  rlen(conchPath) 
31de0 3d 3d 20 6c 65 6e 2b 37 20 29 3b 0a 0a 20 20 72  == len+7 );..  r
31df0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
31e00 0a 7d 0a 0a 0a 2f 2a 20 54 61 6b 65 73 20 61 20  .}.../* Takes a 
31e10 66 75 6c 6c 79 20 63 6f 6e 66 69 67 75 72 65 64  fully configured
31e20 20 70 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 2d 73   proxy locking-s
31e30 74 79 6c 65 20 75 6e 69 78 20 66 69 6c 65 20 61  tyle unix file a
31e40 6e 64 20 73 77 69 74 63 68 65 73 0a 2a 2a 20 74  nd switches.** t
31e50 68 65 20 6c 6f 63 61 6c 20 6c 6f 63 6b 20 66 69  he local lock fi
31e60 6c 65 20 70 61 74 68 20 0a 2a 2f 0a 73 74 61 74  le path .*/.stat
31e70 69 63 20 69 6e 74 20 73 77 69 74 63 68 4c 6f 63  ic int switchLoc
31e80 6b 50 72 6f 78 79 50 61 74 68 28 75 6e 69 78 46  kProxyPath(unixF
31e90 69 6c 65 20 2a 70 46 69 6c 65 2c 20 63 6f 6e 73  ile *pFile, cons
31ea0 74 20 63 68 61 72 20 2a 70 61 74 68 29 20 7b 0a  t char *path) {.
31eb0 20 20 70 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f    proxyLockingCo
31ec0 6e 74 65 78 74 20 2a 70 43 74 78 20 3d 20 28 70  ntext *pCtx = (p
31ed0 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65  roxyLockingConte
31ee0 78 74 2a 29 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69  xt*)pFile->locki
31ef0 6e 67 43 6f 6e 74 65 78 74 3b 0a 20 20 63 68 61  ngContext;.  cha
31f00 72 20 2a 6f 6c 64 50 61 74 68 20 3d 20 70 43 74  r *oldPath = pCt
31f10 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 50 61 74 68  x->lockProxyPath
31f20 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  ;.  int rc = SQL
31f30 49 54 45 5f 4f 4b 3b 0a 0a 20 20 69 66 28 20 70  ITE_OK;..  if( p
31f40 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 21 3d  File->locktype!=
31f50 4e 4f 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 72  NO_LOCK ){.    r
31f60 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53  eturn SQLITE_BUS
31f70 59 3b 0a 20 20 7d 20 20 0a 0a 20 20 2f 2a 20 6e  Y;.  }  ..  /* n
31f80 6f 74 68 69 6e 67 20 74 6f 20 64 6f 20 69 66 20  othing to do if 
31f90 74 68 65 20 70 61 74 68 20 69 73 20 4e 55 4c 4c  the path is NULL
31fa0 2c 20 3a 61 75 74 6f 3a 20 6f 72 20 6d 61 74 63  , :auto: or matc
31fb0 68 65 73 20 74 68 65 20 65 78 69 73 74 69 6e 67  hes the existing
31fc0 20 70 61 74 68 20 2a 2f 0a 20 20 69 66 28 20 21   path */.  if( !
31fd0 70 61 74 68 20 7c 7c 20 70 61 74 68 5b 30 5d 3d  path || path[0]=
31fe0 3d 27 5c 30 27 20 7c 7c 20 21 73 74 72 63 6d 70  ='\0' || !strcmp
31ff0 28 70 61 74 68 2c 20 22 3a 61 75 74 6f 3a 22 29  (path, ":auto:")
32000 20 7c 7c 0a 20 20 20 20 28 6f 6c 64 50 61 74 68   ||.    (oldPath
32010 20 26 26 20 21 73 74 72 6e 63 6d 70 28 6f 6c 64   && !strncmp(old
32020 50 61 74 68 2c 20 70 61 74 68 2c 20 4d 41 58 50  Path, path, MAXP
32030 41 54 48 4c 45 4e 29 29 20 29 7b 0a 20 20 20 20  ATHLEN)) ){.    
32040 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
32050 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 75  ;.  }else{.    u
32060 6e 69 78 46 69 6c 65 20 2a 6c 6f 63 6b 50 72 6f  nixFile *lockPro
32070 78 79 20 3d 20 70 43 74 78 2d 3e 6c 6f 63 6b 50  xy = pCtx->lockP
32080 72 6f 78 79 3b 0a 20 20 20 20 70 43 74 78 2d 3e  roxy;.    pCtx->
32090 6c 6f 63 6b 50 72 6f 78 79 3d 4e 55 4c 4c 3b 0a  lockProxy=NULL;.
320a0 20 20 20 20 70 43 74 78 2d 3e 63 6f 6e 63 68 48      pCtx->conchH
320b0 65 6c 64 20 3d 20 30 3b 0a 20 20 20 20 69 66 28  eld = 0;.    if(
320c0 20 6c 6f 63 6b 50 72 6f 78 79 21 3d 4e 55 4c 4c   lockProxy!=NULL
320d0 20 29 7b 0a 20 20 20 20 20 20 72 63 3d 6c 6f 63   ){.      rc=loc
320e0 6b 50 72 6f 78 79 2d 3e 70 4d 65 74 68 6f 64 2d  kProxy->pMethod-
320f0 3e 78 43 6c 6f 73 65 28 28 73 71 6c 69 74 65 33  >xClose((sqlite3
32100 5f 66 69 6c 65 20 2a 29 6c 6f 63 6b 50 72 6f 78  _file *)lockProx
32110 79 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  y);.      if( rc
32120 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
32130 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
32140 28 6c 6f 63 6b 50 72 6f 78 79 29 3b 0a 20 20 20  (lockProxy);.   
32150 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66   }.    sqlite3_f
32160 72 65 65 28 6f 6c 64 50 61 74 68 29 3b 0a 20 20  ree(oldPath);.  
32170 20 20 70 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78    pCtx->lockProx
32180 79 50 61 74 68 20 3d 20 73 71 6c 69 74 65 33 44  yPath = sqlite3D
32190 62 53 74 72 44 75 70 28 30 2c 20 70 61 74 68 29  bStrDup(0, path)
321a0 3b 0a 20 20 7d 0a 20 20 0a 20 20 72 65 74 75 72  ;.  }.  .  retur
321b0 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 70  n rc;.}../*.** p
321c0 46 69 6c 65 20 69 73 20 61 20 66 69 6c 65 20 74  File is a file t
321d0 68 61 74 20 68 61 73 20 62 65 65 6e 20 6f 70 65  hat has been ope
321e0 6e 65 64 20 62 79 20 61 20 70 72 69 6f 72 20 78  ned by a prior x
321f0 4f 70 65 6e 20 63 61 6c 6c 2e 20 20 64 62 50 61  Open call.  dbPa
32200 74 68 0a 2a 2a 20 69 73 20 61 20 73 74 72 69 6e  th.** is a strin
32210 67 20 62 75 66 66 65 72 20 61 74 20 6c 65 61 73  g buffer at leas
32220 74 20 4d 41 58 50 41 54 48 4c 45 4e 2b 31 20 63  t MAXPATHLEN+1 c
32230 68 61 72 61 63 74 65 72 73 20 69 6e 20 73 69 7a  haracters in siz
32240 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  e..**.** This ro
32250 75 74 69 6e 65 20 66 69 6e 64 20 74 68 65 20 66  utine find the f
32260 69 6c 65 6e 61 6d 65 20 61 73 73 6f 63 69 61 74  ilename associat
32270 65 64 20 77 69 74 68 20 70 46 69 6c 65 20 61 6e  ed with pFile an
32280 64 20 77 72 69 74 65 73 20 69 74 0a 2a 2a 20 69  d writes it.** i
32290 6e 74 20 64 62 50 61 74 68 2e 0a 2a 2f 0a 73 74  nt dbPath..*/.st
322a0 61 74 69 63 20 69 6e 74 20 70 72 6f 78 79 47 65  atic int proxyGe
322b0 74 44 62 50 61 74 68 46 6f 72 55 6e 69 78 46 69  tDbPathForUnixFi
322c0 6c 65 28 75 6e 69 78 46 69 6c 65 20 2a 70 46 69  le(unixFile *pFi
322d0 6c 65 2c 20 63 68 61 72 20 2a 64 62 50 61 74 68  le, char *dbPath
322e0 29 7b 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f  ){.#if defined(_
322f0 5f 41 50 50 4c 45 5f 5f 29 0a 20 20 69 66 28 20  _APPLE__).  if( 
32300 70 46 69 6c 65 2d 3e 70 4d 65 74 68 6f 64 20 3d  pFile->pMethod =
32310 3d 20 26 61 66 70 49 6f 4d 65 74 68 6f 64 73 20  = &afpIoMethods 
32320 29 7b 0a 20 20 20 20 2f 2a 20 61 66 70 20 73 74  ){.    /* afp st
32330 79 6c 65 20 6b 65 65 70 73 20 61 20 72 65 66 65  yle keeps a refe
32340 72 65 6e 63 65 20 74 6f 20 74 68 65 20 64 62 20  rence to the db 
32350 70 61 74 68 20 69 6e 20 74 68 65 20 66 69 6c 65  path in the file
32360 50 61 74 68 20 66 69 65 6c 64 20 0a 20 20 20 20  Path field .    
32370 2a 2a 20 6f 66 20 74 68 65 20 73 74 72 75 63 74  ** of the struct
32380 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20   */.    assert( 
32390 28 69 6e 74 29 73 74 72 6c 65 6e 28 28 63 68 61  (int)strlen((cha
323a0 72 2a 29 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e  r*)pFile->lockin
323b0 67 43 6f 6e 74 65 78 74 29 3c 3d 4d 41 58 50 41  gContext)<=MAXPA
323c0 54 48 4c 45 4e 20 29 3b 0a 20 20 20 20 73 74 72  THLEN );.    str
323d0 6c 63 70 79 28 64 62 50 61 74 68 2c 20 28 28 61  lcpy(dbPath, ((a
323e0 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  fpLockingContext
323f0 20 2a 29 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e   *)pFile->lockin
32400 67 43 6f 6e 74 65 78 74 29 2d 3e 64 62 50 61 74  gContext)->dbPat
32410 68 2c 20 4d 41 58 50 41 54 48 4c 45 4e 29 3b 0a  h, MAXPATHLEN);.
32420 20 20 7d 20 65 6c 73 65 0a 23 65 6e 64 69 66 0a    } else.#endif.
32430 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 70 4d 65    if( pFile->pMe
32440 74 68 6f 64 20 3d 3d 20 26 64 6f 74 6c 6f 63 6b  thod == &dotlock
32450 49 6f 4d 65 74 68 6f 64 73 20 29 7b 0a 20 20 20  IoMethods ){.   
32460 20 2f 2a 20 64 6f 74 20 6c 6f 63 6b 20 73 74 79   /* dot lock sty
32470 6c 65 20 75 73 65 73 20 74 68 65 20 6c 6f 63 6b  le uses the lock
32480 69 6e 67 20 63 6f 6e 74 65 78 74 20 74 6f 20 73  ing context to s
32490 74 6f 72 65 20 74 68 65 20 64 6f 74 20 6c 6f 63  tore the dot loc
324a0 6b 0a 20 20 20 20 2a 2a 20 66 69 6c 65 20 70 61  k.    ** file pa
324b0 74 68 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6c 65  th */.    int le
324c0 6e 20 3d 20 73 74 72 6c 65 6e 28 28 63 68 61 72  n = strlen((char
324d0 20 2a 29 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e   *)pFile->lockin
324e0 67 43 6f 6e 74 65 78 74 29 20 2d 20 73 74 72 6c  gContext) - strl
324f0 65 6e 28 44 4f 54 4c 4f 43 4b 5f 53 55 46 46 49  en(DOTLOCK_SUFFI
32500 58 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 64  X);.    memcpy(d
32510 62 50 61 74 68 2c 20 28 63 68 61 72 20 2a 29 70  bPath, (char *)p
32520 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e  File->lockingCon
32530 74 65 78 74 2c 20 6c 65 6e 20 2b 20 31 29 3b 0a  text, len + 1);.
32540 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20    }else{.    /* 
32550 61 6c 6c 20 6f 74 68 65 72 20 73 74 79 6c 65 73  all other styles
32560 20 75 73 65 20 74 68 65 20 6c 6f 63 6b 69 6e 67   use the locking
32570 20 63 6f 6e 74 65 78 74 20 74 6f 20 73 74 6f 72   context to stor
32580 65 20 74 68 65 20 64 62 20 66 69 6c 65 20 70 61  e the db file pa
32590 74 68 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74  th */.    assert
325a0 28 20 73 74 72 6c 65 6e 28 28 63 68 61 72 2a 29  ( strlen((char*)
325b0 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f  pFile->lockingCo
325c0 6e 74 65 78 74 29 3c 3d 4d 41 58 50 41 54 48 4c  ntext)<=MAXPATHL
325d0 45 4e 20 29 3b 0a 20 20 20 20 73 74 72 6c 63 70  EN );.    strlcp
325e0 79 28 64 62 50 61 74 68 2c 20 28 63 68 61 72 20  y(dbPath, (char 
325f0 2a 29 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67  *)pFile->locking
32600 43 6f 6e 74 65 78 74 2c 20 4d 41 58 50 41 54 48  Context, MAXPATH
32610 4c 45 4e 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  LEN);.  }.  retu
32620 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
32630 0a 2f 2a 0a 2a 2a 20 54 61 6b 65 73 20 61 6e 20  ./*.** Takes an 
32640 61 6c 72 65 61 64 79 20 66 69 6c 6c 65 64 20 69  already filled i
32650 6e 20 75 6e 69 78 20 66 69 6c 65 20 61 6e 64 20  n unix file and 
32660 61 6c 74 65 72 73 20 69 74 20 73 6f 20 61 6c 6c  alters it so all
32670 20 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 20 0a 2a   file locking .*
32680 2a 20 77 69 6c 6c 20 62 65 20 70 65 72 66 6f 72  * will be perfor
32690 6d 65 64 20 6f 6e 20 74 68 65 20 6c 6f 63 61 6c  med on the local
326a0 20 70 72 6f 78 79 20 6c 6f 63 6b 20 66 69 6c 65   proxy lock file
326b0 2e 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  .  The following
326c0 20 66 69 65 6c 64 73 0a 2a 2a 20 61 72 65 20 70   fields.** are p
326d0 72 65 73 65 72 76 65 64 20 69 6e 20 74 68 65 20  reserved in the 
326e0 6c 6f 63 6b 69 6e 67 20 63 6f 6e 74 65 78 74 20  locking context 
326f0 73 6f 20 74 68 61 74 20 74 68 65 79 20 63 61 6e  so that they can
32700 20 62 65 20 72 65 73 74 6f 72 65 64 20 61 6e 64   be restored and
32710 20 0a 2a 2a 20 74 68 65 20 75 6e 69 78 20 73 74   .** the unix st
32720 72 75 63 74 75 72 65 20 70 72 6f 70 65 72 6c 79  ructure properly
32730 20 63 6c 65 61 6e 65 64 20 75 70 20 61 74 20 63   cleaned up at c
32740 6c 6f 73 65 20 74 69 6d 65 3a 0a 2a 2a 20 20 2d  lose time:.**  -
32750 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 0a  >lockingContext.
32760 2a 2a 20 20 2d 3e 70 4d 65 74 68 6f 64 0a 2a 2f  **  ->pMethod.*/
32770 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72 6f 78  .static int prox
32780 79 54 72 61 6e 73 66 6f 72 6d 55 6e 69 78 46 69  yTransformUnixFi
32790 6c 65 28 75 6e 69 78 46 69 6c 65 20 2a 70 46 69  le(unixFile *pFi
327a0 6c 65 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  le, const char *
327b0 70 61 74 68 29 20 7b 0a 20 20 70 72 6f 78 79 4c  path) {.  proxyL
327c0 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 70  ockingContext *p
327d0 43 74 78 3b 0a 20 20 63 68 61 72 20 64 62 50 61  Ctx;.  char dbPa
327e0 74 68 5b 4d 41 58 50 41 54 48 4c 45 4e 2b 31 5d  th[MAXPATHLEN+1]
327f0 3b 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20  ;       /* Name 
32800 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
32810 66 69 6c 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a  file */.  char *
32820 6c 6f 63 6b 50 61 74 68 3d 4e 55 4c 4c 3b 0a 20  lockPath=NULL;. 
32830 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
32840 5f 4f 4b 3b 0a 20 20 0a 20 20 69 66 28 20 70 46  _OK;.  .  if( pF
32850 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 21 3d 4e  ile->locktype!=N
32860 4f 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 72 65  O_LOCK ){.    re
32870 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59  turn SQLITE_BUSY
32880 3b 0a 20 20 7d 0a 20 20 70 72 6f 78 79 47 65 74  ;.  }.  proxyGet
32890 44 62 50 61 74 68 46 6f 72 55 6e 69 78 46 69 6c  DbPathForUnixFil
328a0 65 28 70 46 69 6c 65 2c 20 64 62 50 61 74 68 29  e(pFile, dbPath)
328b0 3b 0a 20 20 69 66 28 20 21 70 61 74 68 20 7c 7c  ;.  if( !path ||
328c0 20 70 61 74 68 5b 30 5d 3d 3d 27 5c 30 27 20 7c   path[0]=='\0' |
328d0 7c 20 21 73 74 72 63 6d 70 28 70 61 74 68 2c 20  | !strcmp(path, 
328e0 22 3a 61 75 74 6f 3a 22 29 20 29 7b 0a 20 20 20  ":auto:") ){.   
328f0 20 6c 6f 63 6b 50 61 74 68 3d 4e 55 4c 4c 3b 0a   lockPath=NULL;.
32900 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6c 6f 63    }else{.    loc
32910 6b 50 61 74 68 3d 28 63 68 61 72 20 2a 29 70 61  kPath=(char *)pa
32920 74 68 3b 0a 20 20 7d 0a 20 20 0a 20 20 4f 53 54  th;.  }.  .  OST
32930 52 41 43 45 34 28 22 54 52 41 4e 53 50 52 4f 58  RACE4("TRANSPROX
32940 59 20 20 25 64 20 66 6f 72 20 25 73 20 70 69 64  Y  %d for %s pid
32950 3d 25 64 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68  =%d\n", pFile->h
32960 2c 0a 20 20 20 20 20 20 20 20 20 20 20 28 6c 6f  ,.           (lo
32970 63 6b 50 61 74 68 20 3f 20 6c 6f 63 6b 50 61 74  ckPath ? lockPat
32980 68 20 3a 20 22 3a 61 75 74 6f 3a 22 29 2c 20 67  h : ":auto:"), g
32990 65 74 70 69 64 28 29 29 3b 0a 0a 20 20 70 43 74  etpid());..  pCt
329a0 78 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c  x = sqlite3_mall
329b0 6f 63 28 20 73 69 7a 65 6f 66 28 2a 70 43 74 78  oc( sizeof(*pCtx
329c0 29 20 29 3b 0a 20 20 69 66 28 20 70 43 74 78 3d  ) );.  if( pCtx=
329d0 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  =0 ){.    return
329e0 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
329f0 20 7d 0a 20 20 6d 65 6d 73 65 74 28 70 43 74 78   }.  memset(pCtx
32a00 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a 70 43 74  , 0, sizeof(*pCt
32a10 78 29 29 3b 0a 0a 20 20 72 63 20 3d 20 70 72 6f  x));..  rc = pro
32a20 78 79 43 72 65 61 74 65 43 6f 6e 63 68 50 61 74  xyCreateConchPat
32a30 68 6e 61 6d 65 28 64 62 50 61 74 68 2c 20 26 70  hname(dbPath, &p
32a40 43 74 78 2d 3e 63 6f 6e 63 68 46 69 6c 65 50 61  Ctx->conchFilePa
32a50 74 68 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53  th);.  if( rc==S
32a60 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
32a70 72 63 20 3d 20 70 72 6f 78 79 43 72 65 61 74 65  rc = proxyCreate
32a80 55 6e 69 78 46 69 6c 65 28 70 43 74 78 2d 3e 63  UnixFile(pCtx->c
32a90 6f 6e 63 68 46 69 6c 65 50 61 74 68 2c 20 26 70  onchFilePath, &p
32aa0 43 74 78 2d 3e 63 6f 6e 63 68 46 69 6c 65 2c 20  Ctx->conchFile, 
32ab0 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d  0);.    if( rc==
32ac0 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 20  SQLITE_CANTOPEN 
32ad0 26 26 20 28 28 70 46 69 6c 65 2d 3e 6f 70 65 6e  && ((pFile->open
32ae0 46 6c 61 67 73 26 4f 5f 52 44 57 52 29 20 3d 3d  Flags&O_RDWR) ==
32af0 20 30 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20   0) ){.      /* 
32b00 69 66 20 28 61 29 20 74 68 65 20 6f 70 65 6e 20  if (a) the open 
32b10 66 6c 61 67 73 20 61 72 65 20 6e 6f 74 20 4f 5f  flags are not O_
32b20 52 44 57 52 2c 20 28 62 29 20 74 68 65 20 63 6f  RDWR, (b) the co
32b30 6e 63 68 20 69 73 6e 27 74 20 74 68 65 72 65 2c  nch isn't there,
32b40 20 61 6e 64 0a 20 20 20 20 20 20 2a 2a 20 28 63   and.      ** (c
32b50 29 20 74 68 65 20 66 69 6c 65 20 73 79 73 74 65  ) the file syste
32b60 6d 20 69 73 20 72 65 61 64 2d 6f 6e 6c 79 2c 20  m is read-only, 
32b70 74 68 65 6e 20 65 6e 61 62 6c 65 20 6e 6f 2d 6c  then enable no-l
32b80 6f 63 6b 69 6e 67 20 61 63 63 65 73 73 2e 0a 20  ocking access.. 
32b90 20 20 20 20 20 2a 2a 20 55 67 68 2c 20 73 69 6e       ** Ugh, sin
32ba0 63 65 20 4f 5f 52 44 4f 4e 4c 59 3d 3d 30 78 30  ce O_RDONLY==0x0
32bb0 30 30 30 20 77 65 20 74 65 73 74 20 66 6f 72 20  000 we test for 
32bc0 21 4f 5f 52 44 57 52 20 73 69 6e 63 65 20 75 6e  !O_RDWR since un
32bd0 69 78 4f 70 65 6e 20 61 73 73 65 72 74 73 0a 20  ixOpen asserts. 
32be0 20 20 20 20 20 2a 2a 20 74 68 61 74 20 6f 70 65       ** that ope
32bf0 6e 46 6c 61 67 73 20 77 69 6c 6c 20 68 61 76 65  nFlags will have
32c00 20 6f 6e 6c 79 20 6f 6e 65 20 6f 66 20 4f 5f 52   only one of O_R
32c10 44 4f 4e 4c 59 20 6f 72 20 4f 5f 52 44 57 52 2e  DONLY or O_RDWR.
32c20 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
32c30 73 74 72 75 63 74 20 73 74 61 74 66 73 20 66 73  struct statfs fs
32c40 49 6e 66 6f 3b 0a 20 20 20 20 20 20 73 74 72 75  Info;.      stru
32c50 63 74 20 73 74 61 74 20 63 6f 6e 63 68 49 6e 66  ct stat conchInf
32c60 6f 3b 0a 20 20 20 20 20 20 69 6e 74 20 67 6f 4c  o;.      int goL
32c70 6f 63 6b 6c 65 73 73 20 3d 20 30 3b 0a 0a 20 20  ockless = 0;..  
32c80 20 20 20 20 69 66 28 20 73 74 61 74 28 70 43 74      if( stat(pCt
32c90 78 2d 3e 63 6f 6e 63 68 46 69 6c 65 50 61 74 68  x->conchFilePath
32ca0 2c 20 26 63 6f 6e 63 68 49 6e 66 6f 29 20 3d 3d  , &conchInfo) ==
32cb0 20 2d 31 20 29 20 7b 0a 20 20 20 20 20 20 20 20   -1 ) {.        
32cc0 69 6e 74 20 65 72 72 20 3d 20 65 72 72 6e 6f 3b  int err = errno;
32cd0 0a 20 20 20 20 20 20 20 20 69 66 28 20 28 65 72  .        if( (er
32ce0 72 3d 3d 45 4e 4f 45 4e 54 29 20 26 26 20 28 73  r==ENOENT) && (s
32cf0 74 61 74 66 73 28 64 62 50 61 74 68 2c 20 26 66  tatfs(dbPath, &f
32d00 73 49 6e 66 6f 29 20 21 3d 20 2d 31 29 20 29 7b  sInfo) != -1) ){
32d10 0a 20 20 20 20 20 20 20 20 20 20 67 6f 4c 6f 63  .          goLoc
32d20 6b 6c 65 73 73 20 3d 20 28 66 73 49 6e 66 6f 2e  kless = (fsInfo.
32d30 66 5f 66 6c 61 67 73 26 4d 4e 54 5f 52 44 4f 4e  f_flags&MNT_RDON
32d40 4c 59 29 20 3d 3d 20 4d 4e 54 5f 52 44 4f 4e 4c  LY) == MNT_RDONL
32d50 59 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  Y;.        }.   
32d60 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 67     }.      if( g
32d70 6f 4c 6f 63 6b 6c 65 73 73 20 29 7b 0a 20 20 20  oLockless ){.   
32d80 20 20 20 20 20 70 43 74 78 2d 3e 63 6f 6e 63 68       pCtx->conch
32d90 48 65 6c 64 20 3d 20 2d 31 3b 20 2f 2a 20 72 65  Held = -1; /* re
32da0 61 64 20 6f 6e 6c 79 20 46 53 2f 20 6c 6f 63 6b  ad only FS/ lock
32db0 6c 65 73 73 20 2a 2f 0a 20 20 20 20 20 20 20 20  less */.        
32dc0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
32dd0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
32de0 7d 20 20 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  }  .  if( rc==SQ
32df0 4c 49 54 45 5f 4f 4b 20 26 26 20 6c 6f 63 6b 50  LITE_OK && lockP
32e00 61 74 68 20 29 7b 0a 20 20 20 20 70 43 74 78 2d  ath ){.    pCtx-
32e10 3e 6c 6f 63 6b 50 72 6f 78 79 50 61 74 68 20 3d  >lockProxyPath =
32e20 20 73 71 6c 69 74 65 33 44 62 53 74 72 44 75 70   sqlite3DbStrDup
32e30 28 30 2c 20 6c 6f 63 6b 50 61 74 68 29 3b 0a 20  (0, lockPath);. 
32e40 20 7d 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51   }..  if( rc==SQ
32e50 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70  LITE_OK ){.    p
32e60 43 74 78 2d 3e 64 62 50 61 74 68 20 3d 20 73 71  Ctx->dbPath = sq
32e70 6c 69 74 65 33 44 62 53 74 72 44 75 70 28 30 2c  lite3DbStrDup(0,
32e80 20 64 62 50 61 74 68 29 3b 0a 20 20 20 20 69 66   dbPath);.    if
32e90 28 20 70 43 74 78 2d 3e 64 62 50 61 74 68 3d 3d  ( pCtx->dbPath==
32ea0 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 20 20 72 63  NULL ){.      rc
32eb0 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b   = SQLITE_NOMEM;
32ec0 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
32ed0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
32ee0 7b 0a 20 20 20 20 2f 2a 20 61 6c 6c 20 6d 65 6d  {.    /* all mem
32ef0 6f 72 79 20 69 73 20 61 6c 6c 6f 63 61 74 65 64  ory is allocated
32f00 2c 20 70 72 6f 78 79 73 20 61 72 65 20 63 72 65  , proxys are cre
32f10 61 74 65 64 20 61 6e 64 20 61 73 73 69 67 6e 65  ated and assigne
32f20 64 2c 20 0a 20 20 20 20 2a 2a 20 73 77 69 74 63  d, .    ** switc
32f30 68 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 63 6f  h the locking co
32f40 6e 74 65 78 74 20 61 6e 64 20 70 4d 65 74 68 6f  ntext and pMetho
32f50 64 20 74 68 65 6e 20 72 65 74 75 72 6e 2e 0a 20  d then return.. 
32f60 20 20 20 2a 2f 0a 20 20 20 20 70 43 74 78 2d 3e     */.    pCtx->
32f70 6f 6c 64 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78  oldLockingContex
32f80 74 20 3d 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69  t = pFile->locki
32f90 6e 67 43 6f 6e 74 65 78 74 3b 0a 20 20 20 20 70  ngContext;.    p
32fa0 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e  File->lockingCon
32fb0 74 65 78 74 20 3d 20 70 43 74 78 3b 0a 20 20 20  text = pCtx;.   
32fc0 20 70 43 74 78 2d 3e 70 4f 6c 64 4d 65 74 68 6f   pCtx->pOldMetho
32fd0 64 20 3d 20 70 46 69 6c 65 2d 3e 70 4d 65 74 68  d = pFile->pMeth
32fe0 6f 64 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 70  od;.    pFile->p
32ff0 4d 65 74 68 6f 64 20 3d 20 26 70 72 6f 78 79 49  Method = &proxyI
33000 6f 4d 65 74 68 6f 64 73 3b 0a 20 20 7d 65 6c 73  oMethods;.  }els
33010 65 7b 0a 20 20 20 20 69 66 28 20 70 43 74 78 2d  e{.    if( pCtx-
33020 3e 63 6f 6e 63 68 46 69 6c 65 20 29 7b 20 0a 20  >conchFile ){ . 
33030 20 20 20 20 20 70 43 74 78 2d 3e 63 6f 6e 63 68       pCtx->conch
33040 46 69 6c 65 2d 3e 70 4d 65 74 68 6f 64 2d 3e 78  File->pMethod->x
33050 43 6c 6f 73 65 28 28 73 71 6c 69 74 65 33 5f 66  Close((sqlite3_f
33060 69 6c 65 20 2a 29 70 43 74 78 2d 3e 63 6f 6e 63  ile *)pCtx->conc
33070 68 46 69 6c 65 29 3b 0a 20 20 20 20 20 20 73 71  hFile);.      sq
33080 6c 69 74 65 33 5f 66 72 65 65 28 70 43 74 78 2d  lite3_free(pCtx-
33090 3e 63 6f 6e 63 68 46 69 6c 65 29 3b 0a 20 20 20  >conchFile);.   
330a0 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66   }.    sqlite3_f
330b0 72 65 65 28 70 43 74 78 2d 3e 6c 6f 63 6b 50 72  ree(pCtx->lockPr
330c0 6f 78 79 50 61 74 68 29 3b 0a 20 20 20 20 73 71  oxyPath);.    sq
330d0 6c 69 74 65 33 5f 66 72 65 65 28 70 43 74 78 2d  lite3_free(pCtx-
330e0 3e 63 6f 6e 63 68 46 69 6c 65 50 61 74 68 29 3b  >conchFilePath);
330f0 20 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72   .    sqlite3_fr
33100 65 65 28 70 43 74 78 29 3b 0a 20 20 7d 0a 20 20  ee(pCtx);.  }.  
33110 4f 53 54 52 41 43 45 33 28 22 54 52 41 4e 53 50  OSTRACE3("TRANSP
33120 52 4f 58 59 20 20 25 64 20 25 73 5c 6e 22 2c 20  ROXY  %d %s\n", 
33130 70 46 69 6c 65 2d 3e 68 2c 0a 20 20 20 20 20 20  pFile->h,.      
33140 20 20 20 20 20 28 72 63 3d 3d 53 51 4c 49 54 45       (rc==SQLITE
33150 5f 4f 4b 20 3f 20 22 6f 6b 22 20 3a 20 22 66 61  _OK ? "ok" : "fa
33160 69 6c 65 64 22 29 29 3b 0a 20 20 72 65 74 75 72  iled"));.  retur
33170 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  n rc;.}.../*.** 
33180 54 68 69 73 20 72 6f 75 74 69 6e 65 20 68 61 6e  This routine han
33190 64 6c 65 73 20 73 71 6c 69 74 65 33 5f 66 69 6c  dles sqlite3_fil
331a0 65 5f 63 6f 6e 74 72 6f 6c 28 29 20 63 61 6c 6c  e_control() call
331b0 73 20 74 68 61 74 20 61 72 65 20 73 70 65 63 69  s that are speci
331c0 66 69 63 0a 2a 2a 20 74 6f 20 70 72 6f 78 79 20  fic.** to proxy 
331d0 6c 6f 63 6b 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74  locking..*/.stat
331e0 69 63 20 69 6e 74 20 70 72 6f 78 79 46 69 6c 65  ic int proxyFile
331f0 43 6f 6e 74 72 6f 6c 28 73 71 6c 69 74 65 33 5f  Control(sqlite3_
33200 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 6f 70  file *id, int op
33210 2c 20 76 6f 69 64 20 2a 70 41 72 67 29 7b 0a 20  , void *pArg){. 
33220 20 73 77 69 74 63 68 28 20 6f 70 20 29 7b 0a 20   switch( op ){. 
33230 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 47     case SQLITE_G
33240 45 54 5f 4c 4f 43 4b 50 52 4f 58 59 46 49 4c 45  ET_LOCKPROXYFILE
33250 3a 20 7b 0a 20 20 20 20 20 20 75 6e 69 78 46 69  : {.      unixFi
33260 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69  le *pFile = (uni
33270 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 20 20 20  xFile*)id;.     
33280 20 69 66 28 20 70 46 69 6c 65 2d 3e 70 4d 65 74   if( pFile->pMet
33290 68 6f 64 20 3d 3d 20 26 70 72 6f 78 79 49 6f 4d  hod == &proxyIoM
332a0 65 74 68 6f 64 73 20 29 7b 0a 20 20 20 20 20 20  ethods ){.      
332b0 20 20 70 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f    proxyLockingCo
332c0 6e 74 65 78 74 20 2a 70 43 74 78 20 3d 20 28 70  ntext *pCtx = (p
332d0 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65  roxyLockingConte
332e0 78 74 2a 29 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69  xt*)pFile->locki
332f0 6e 67 43 6f 6e 74 65 78 74 3b 0a 20 20 20 20 20  ngContext;.     
33300 20 20 20 70 72 6f 78 79 54 61 6b 65 43 6f 6e 63     proxyTakeConc
33310 68 28 70 46 69 6c 65 29 3b 0a 20 20 20 20 20 20  h(pFile);.      
33320 20 20 69 66 28 20 70 43 74 78 2d 3e 6c 6f 63 6b    if( pCtx->lock
33330 50 72 6f 78 79 50 61 74 68 20 29 7b 0a 20 20 20  ProxyPath ){.   
33340 20 20 20 20 20 20 20 2a 28 63 6f 6e 73 74 20 63         *(const c
33350 68 61 72 20 2a 2a 29 70 41 72 67 20 3d 20 70 43  har **)pArg = pC
33360 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 50 61 74  tx->lockProxyPat
33370 68 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  h;.        }else
33380 7b 0a 20 20 20 20 20 20 20 20 20 20 2a 28 63 6f  {.          *(co
33390 6e 73 74 20 63 68 61 72 20 2a 2a 29 70 41 72 67  nst char **)pArg
333a0 20 3d 20 22 3a 61 75 74 6f 3a 20 28 6e 6f 74 20   = ":auto: (not 
333b0 68 65 6c 64 29 22 3b 0a 20 20 20 20 20 20 20 20  held)";.        
333c0 7d 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b  }.      } else {
333d0 0a 20 20 20 20 20 20 20 20 2a 28 63 6f 6e 73 74  .        *(const
333e0 20 63 68 61 72 20 2a 2a 29 70 41 72 67 20 3d 20   char **)pArg = 
333f0 4e 55 4c 4c 3b 0a 20 20 20 20 20 20 7d 0a 20 20  NULL;.      }.  
33400 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
33410 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  E_OK;.    }.    
33420 63 61 73 65 20 53 51 4c 49 54 45 5f 53 45 54 5f  case SQLITE_SET_
33430 4c 4f 43 4b 50 52 4f 58 59 46 49 4c 45 3a 20 7b  LOCKPROXYFILE: {
33440 0a 20 20 20 20 20 20 75 6e 69 78 46 69 6c 65 20  .      unixFile 
33450 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69  *pFile = (unixFi
33460 6c 65 2a 29 69 64 3b 0a 20 20 20 20 20 20 69 6e  le*)id;.      in
33470 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
33480 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 73 50 72  ;.      int isPr
33490 6f 78 79 53 74 79 6c 65 20 3d 20 28 70 46 69 6c  oxyStyle = (pFil
334a0 65 2d 3e 70 4d 65 74 68 6f 64 20 3d 3d 20 26 70  e->pMethod == &p
334b0 72 6f 78 79 49 6f 4d 65 74 68 6f 64 73 29 3b 0a  roxyIoMethods);.
334c0 20 20 20 20 20 20 69 66 28 20 70 41 72 67 3d 3d        if( pArg==
334d0 4e 55 4c 4c 20 7c 7c 20 28 63 6f 6e 73 74 20 63  NULL || (const c
334e0 68 61 72 20 2a 29 70 41 72 67 3d 3d 30 20 29 7b  har *)pArg==0 ){
334f0 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 73 50  .        if( isP
33500 72 6f 78 79 53 74 79 6c 65 20 29 7b 0a 20 20 20  roxyStyle ){.   
33510 20 20 20 20 20 20 20 2f 2a 20 74 75 72 6e 20 6f         /* turn o
33520 66 66 20 70 72 6f 78 79 20 6c 6f 63 6b 69 6e 67  ff proxy locking
33530 20 2d 20 6e 6f 74 20 73 75 70 70 6f 72 74 65 64   - not supported
33540 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 72 63   */.          rc
33550 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 20   = SQLITE_ERROR 
33560 2f 2a 53 51 4c 49 54 45 5f 50 52 4f 54 4f 43 4f  /*SQLITE_PROTOCO
33570 4c 3f 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45  L? SQLITE_MISUSE
33580 3f 2a 2f 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  ?*/;.        }el
33590 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a  se{.          /*
335a0 20 74 75 72 6e 20 6f 66 66 20 70 72 6f 78 79 20   turn off proxy 
335b0 6c 6f 63 6b 69 6e 67 20 2d 20 61 6c 72 65 61 64  locking - alread
335c0 79 20 6f 66 66 20 2d 20 4e 4f 4f 50 20 2a 2f 0a  y off - NOOP */.
335d0 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53            rc = S
335e0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20  QLITE_OK;.      
335f0 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b    }.      }else{
33600 0a 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20 63  .        const c
33610 68 61 72 20 2a 70 72 6f 78 79 50 61 74 68 20 3d  har *proxyPath =
33620 20 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 29 70   (const char *)p
33630 41 72 67 3b 0a 20 20 20 20 20 20 20 20 69 66 28  Arg;.        if(
33640 20 69 73 50 72 6f 78 79 53 74 79 6c 65 20 29 7b   isProxyStyle ){
33650 0a 20 20 20 20 20 20 20 20 20 20 70 72 6f 78 79  .          proxy
33660 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a  LockingContext *
33670 70 43 74 78 20 3d 20 0a 20 20 20 20 20 20 20 20  pCtx = .        
33680 20 20 20 20 28 70 72 6f 78 79 4c 6f 63 6b 69 6e      (proxyLockin
33690 67 43 6f 6e 74 65 78 74 2a 29 70 46 69 6c 65 2d  gContext*)pFile-
336a0 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b  >lockingContext;
336b0 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 21  .          if( !
336c0 73 74 72 63 6d 70 28 70 41 72 67 2c 20 22 3a 61  strcmp(pArg, ":a
336d0 75 74 6f 3a 22 29 20 0a 20 20 20 20 20 20 20 20  uto:") .        
336e0 20 20 20 7c 7c 20 28 70 43 74 78 2d 3e 6c 6f 63     || (pCtx->loc
336f0 6b 50 72 6f 78 79 50 61 74 68 20 26 26 0a 20 20  kProxyPath &&.  
33700 20 20 20 20 20 20 20 20 20 20 20 20 20 21 73 74               !st
33710 72 6e 63 6d 70 28 70 43 74 78 2d 3e 6c 6f 63 6b  rncmp(pCtx->lock
33720 50 72 6f 78 79 50 61 74 68 2c 20 70 72 6f 78 79  ProxyPath, proxy
33730 50 61 74 68 2c 20 4d 41 58 50 41 54 48 4c 45 4e  Path, MAXPATHLEN
33740 29 29 0a 20 20 20 20 20 20 20 20 20 20 29 7b 0a  )).          ){.
33750 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d              rc =
33760 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
33770 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
33780 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 77           rc = sw
33790 69 74 63 68 4c 6f 63 6b 50 72 6f 78 79 50 61 74  itchLockProxyPat
337a0 68 28 70 46 69 6c 65 2c 20 70 72 6f 78 79 50 61  h(pFile, proxyPa
337b0 74 68 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  th);.          }
337c0 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
337d0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 74 75 72            /* tur
337e0 6e 20 6f 6e 20 70 72 6f 78 79 20 66 69 6c 65 20  n on proxy file 
337f0 6c 6f 63 6b 69 6e 67 20 2a 2f 0a 20 20 20 20 20  locking */.     
33800 20 20 20 20 20 72 63 20 3d 20 70 72 6f 78 79 54       rc = proxyT
33810 72 61 6e 73 66 6f 72 6d 55 6e 69 78 46 69 6c 65  ransformUnixFile
33820 28 70 46 69 6c 65 2c 20 70 72 6f 78 79 50 61 74  (pFile, proxyPat
33830 68 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  h);.        }.  
33840 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65 74 75      }.      retu
33850 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20  rn rc;.    }.   
33860 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20   default: {.    
33870 20 20 61 73 73 65 72 74 28 20 30 20 29 3b 20 20    assert( 0 );  
33880 2f 2a 20 54 68 65 20 63 61 6c 6c 20 61 73 73 75  /* The call assu
33890 72 65 73 20 74 68 61 74 20 6f 6e 6c 79 20 76 61  res that only va
338a0 6c 69 64 20 6f 70 63 6f 64 65 73 20 61 72 65 20  lid opcodes are 
338b0 73 65 6e 74 20 2a 2f 0a 20 20 20 20 7d 0a 20 20  sent */.    }.  
338c0 7d 0a 20 20 2f 2a 4e 4f 54 52 45 41 43 48 45 44  }.  /*NOTREACHED
338d0 2a 2f 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  */.  return SQLI
338e0 54 45 5f 45 52 52 4f 52 3b 0a 7d 0a 0a 2f 2a 0a  TE_ERROR;.}../*.
338f0 2a 2a 20 57 69 74 68 69 6e 20 74 68 69 73 20 64  ** Within this d
33900 69 76 69 73 69 6f 6e 20 28 74 68 65 20 70 72 6f  ivision (the pro
33910 78 79 69 6e 67 20 6c 6f 63 6b 69 6e 67 20 69 6d  xying locking im
33920 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 29 20 74 68  plementation) th
33930 65 20 70 72 6f 63 65 64 75 72 65 73 0a 2a 2a 20  e procedures.** 
33940 61 62 6f 76 65 20 74 68 69 73 20 70 6f 69 6e 74  above this point
33950 20 61 72 65 20 61 6c 6c 20 75 74 69 6c 69 74 69   are all utiliti
33960 65 73 2e 20 20 54 68 65 20 6c 6f 63 6b 2d 72 65  es.  The lock-re
33970 6c 61 74 65 64 20 6d 65 74 68 6f 64 73 20 6f 66  lated methods of
33980 20 74 68 65 0a 2a 2a 20 70 72 6f 78 79 2d 6c 6f   the.** proxy-lo
33990 63 6b 69 6e 67 20 73 71 6c 69 74 65 33 5f 69 6f  cking sqlite3_io
339a0 5f 6d 65 74 68 6f 64 20 6f 62 6a 65 63 74 20 66  _method object f
339b0 6f 6c 6c 6f 77 2e 0a 2a 2f 0a 0a 0a 2f 2a 0a 2a  ollow..*/.../*.*
339c0 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63  * This routine c
339d0 68 65 63 6b 73 20 69 66 20 74 68 65 72 65 20 69  hecks if there i
339e0 73 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63  s a RESERVED loc
339f0 6b 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 73 70  k held on the sp
33a00 65 63 69 66 69 65 64 0a 2a 2a 20 66 69 6c 65 20  ecified.** file 
33a10 62 79 20 74 68 69 73 20 6f 72 20 61 6e 79 20 6f  by this or any o
33a20 74 68 65 72 20 70 72 6f 63 65 73 73 2e 20 49 66  ther process. If
33a30 20 73 75 63 68 20 61 20 6c 6f 63 6b 20 69 73 20   such a lock is 
33a40 68 65 6c 64 2c 20 73 65 74 20 2a 70 52 65 73 4f  held, set *pResO
33a50 75 74 0a 2a 2a 20 74 6f 20 61 20 6e 6f 6e 2d 7a  ut.** to a non-z
33a60 65 72 6f 20 76 61 6c 75 65 20 6f 74 68 65 72 77  ero value otherw
33a70 69 73 65 20 2a 70 52 65 73 4f 75 74 20 69 73 20  ise *pResOut is 
33a80 73 65 74 20 74 6f 20 7a 65 72 6f 2e 20 20 54 68  set to zero.  Th
33a90 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 0a 2a  e return value.*
33aa0 2a 20 69 73 20 73 65 74 20 74 6f 20 53 51 4c 49  * is set to SQLI
33ab0 54 45 5f 4f 4b 20 75 6e 6c 65 73 73 20 61 6e 20  TE_OK unless an 
33ac0 49 2f 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73  I/O error occurs
33ad0 20 64 75 72 69 6e 67 20 6c 6f 63 6b 20 63 68 65   during lock che
33ae0 63 6b 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63  cking..*/.static
33af0 20 69 6e 74 20 70 72 6f 78 79 43 68 65 63 6b 52   int proxyCheckR
33b00 65 73 65 72 76 65 64 4c 6f 63 6b 28 73 71 6c 69  eservedLock(sqli
33b10 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e  te3_file *id, in
33b20 74 20 2a 70 52 65 73 4f 75 74 29 20 7b 0a 20 20  t *pResOut) {.  
33b30 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20  unixFile *pFile 
33b40 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b  = (unixFile*)id;
33b50 0a 20 20 69 6e 74 20 72 63 20 3d 20 70 72 6f 78  .  int rc = prox
33b60 79 54 61 6b 65 43 6f 6e 63 68 28 70 46 69 6c 65  yTakeConch(pFile
33b70 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  );.  if( rc==SQL
33b80 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 72  ITE_OK ){.    pr
33b90 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78  oxyLockingContex
33ba0 74 20 2a 70 43 74 78 20 3d 20 28 70 72 6f 78 79  t *pCtx = (proxy
33bb0 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a  LockingContext *
33bc0 29 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43  )pFile->lockingC
33bd0 6f 6e 74 65 78 74 3b 0a 20 20 20 20 69 66 28 20  ontext;.    if( 
33be0 70 43 74 78 2d 3e 63 6f 6e 63 68 48 65 6c 64 3e  pCtx->conchHeld>
33bf0 30 20 29 7b 0a 20 20 20 20 20 20 75 6e 69 78 46  0 ){.      unixF
33c00 69 6c 65 20 2a 70 72 6f 78 79 20 3d 20 70 43 74  ile *proxy = pCt
33c10 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 3b 0a 20 20  x->lockProxy;.  
33c20 20 20 20 20 72 65 74 75 72 6e 20 70 72 6f 78 79      return proxy
33c30 2d 3e 70 4d 65 74 68 6f 64 2d 3e 78 43 68 65 63  ->pMethod->xChec
33c40 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 28 28 73  kReservedLock((s
33c50 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29 70 72 6f  qlite3_file*)pro
33c60 78 79 2c 20 70 52 65 73 4f 75 74 29 3b 0a 20 20  xy, pResOut);.  
33c70 20 20 7d 65 6c 73 65 7b 20 2f 2a 20 63 6f 6e 63    }else{ /* conc
33c80 68 48 65 6c 64 20 3c 20 30 20 69 73 20 6c 6f 63  hHeld < 0 is loc
33c90 6b 6c 65 73 73 20 2a 2f 0a 20 20 20 20 20 20 70  kless */.      p
33ca0 52 65 73 4f 75 74 3d 30 3b 0a 20 20 20 20 7d 0a  ResOut=0;.    }.
33cb0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
33cc0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 6b 20 74  .}../*.** Lock t
33cd0 68 65 20 66 69 6c 65 20 77 69 74 68 20 74 68 65  he file with the
33ce0 20 6c 6f 63 6b 20 73 70 65 63 69 66 69 65 64 20   lock specified 
33cf0 62 79 20 70 61 72 61 6d 65 74 65 72 20 6c 6f 63  by parameter loc
33d00 6b 74 79 70 65 20 2d 20 6f 6e 65 0a 2a 2a 20 6f  ktype - one.** o
33d10 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a  f the following:
33d20 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28 31 29 20 53  .**.**     (1) S
33d30 48 41 52 45 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20  HARED_LOCK.**   
33d40 20 20 28 32 29 20 52 45 53 45 52 56 45 44 5f 4c    (2) RESERVED_L
33d50 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 33 29 20 50  OCK.**     (3) P
33d60 45 4e 44 49 4e 47 5f 4c 4f 43 4b 0a 2a 2a 20 20  ENDING_LOCK.**  
33d70 20 20 20 28 34 29 20 45 58 43 4c 55 53 49 56 45     (4) EXCLUSIVE
33d80 5f 4c 4f 43 4b 0a 2a 2a 0a 2a 2a 20 53 6f 6d 65  _LOCK.**.** Some
33d90 74 69 6d 65 73 20 77 68 65 6e 20 72 65 71 75 65  times when reque
33da0 73 74 69 6e 67 20 6f 6e 65 20 6c 6f 63 6b 20 73  sting one lock s
33db0 74 61 74 65 2c 20 61 64 64 69 74 69 6f 6e 61 6c  tate, additional
33dc0 20 6c 6f 63 6b 20 73 74 61 74 65 73 0a 2a 2a 20   lock states.** 
33dd0 61 72 65 20 69 6e 73 65 72 74 65 64 20 69 6e 20  are inserted in 
33de0 62 65 74 77 65 65 6e 2e 20 20 54 68 65 20 6c 6f  between.  The lo
33df0 63 6b 69 6e 67 20 6d 69 67 68 74 20 66 61 69 6c  cking might fail
33e00 20 6f 6e 20 6f 6e 65 20 6f 66 20 74 68 65 20 6c   on one of the l
33e10 61 74 65 72 0a 2a 2a 20 74 72 61 6e 73 69 74 69  ater.** transiti
33e20 6f 6e 73 20 6c 65 61 76 69 6e 67 20 74 68 65 20  ons leaving the 
33e30 6c 6f 63 6b 20 73 74 61 74 65 20 64 69 66 66 65  lock state diffe
33e40 72 65 6e 74 20 66 72 6f 6d 20 77 68 61 74 20 69  rent from what i
33e50 74 20 73 74 61 72 74 65 64 20 62 75 74 0a 2a 2a  t started but.**
33e60 20 73 74 69 6c 6c 20 73 68 6f 72 74 20 6f 66 20   still short of 
33e70 69 74 73 20 67 6f 61 6c 2e 20 20 54 68 65 20 66  its goal.  The f
33e80 6f 6c 6c 6f 77 69 6e 67 20 63 68 61 72 74 20 73  ollowing chart s
33e90 68 6f 77 73 20 74 68 65 20 61 6c 6c 6f 77 65 64  hows the allowed
33ea0 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e 73 20  .** transitions 
33eb0 61 6e 64 20 74 68 65 20 69 6e 73 65 72 74 65 64  and the inserted
33ec0 20 69 6e 74 65 72 6d 65 64 69 61 74 65 20 73 74   intermediate st
33ed0 61 74 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 55  ates:.**.**    U
33ee0 4e 4c 4f 43 4b 45 44 20 2d 3e 20 53 48 41 52 45  NLOCKED -> SHARE
33ef0 44 0a 2a 2a 20 20 20 20 53 48 41 52 45 44 20 2d  D.**    SHARED -
33f00 3e 20 52 45 53 45 52 56 45 44 0a 2a 2a 20 20 20  > RESERVED.**   
33f10 20 53 48 41 52 45 44 20 2d 3e 20 28 50 45 4e 44   SHARED -> (PEND
33f20 49 4e 47 29 20 2d 3e 20 45 58 43 4c 55 53 49 56  ING) -> EXCLUSIV
33f30 45 0a 2a 2a 20 20 20 20 52 45 53 45 52 56 45 44  E.**    RESERVED
33f40 20 2d 3e 20 28 50 45 4e 44 49 4e 47 29 20 2d 3e   -> (PENDING) ->
33f50 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20 20 20   EXCLUSIVE.**   
33f60 20 50 45 4e 44 49 4e 47 20 2d 3e 20 45 58 43 4c   PENDING -> EXCL
33f70 55 53 49 56 45 0a 2a 2a 0a 2a 2a 20 54 68 69 73  USIVE.**.** This
33f80 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 6f 6e   routine will on
33f90 6c 79 20 69 6e 63 72 65 61 73 65 20 61 20 6c 6f  ly increase a lo
33fa0 63 6b 2e 20 20 55 73 65 20 74 68 65 20 73 71 6c  ck.  Use the sql
33fb0 69 74 65 33 4f 73 55 6e 6c 6f 63 6b 28 29 0a 2a  ite3OsUnlock().*
33fc0 2a 20 72 6f 75 74 69 6e 65 20 74 6f 20 6c 6f 77  * routine to low
33fd0 65 72 20 61 20 6c 6f 63 6b 69 6e 67 20 6c 65 76  er a locking lev
33fe0 65 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  el..*/.static in
33ff0 74 20 70 72 6f 78 79 4c 6f 63 6b 28 73 71 6c 69  t proxyLock(sqli
34000 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e  te3_file *id, in
34010 74 20 6c 6f 63 6b 74 79 70 65 29 20 7b 0a 20 20  t locktype) {.  
34020 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20  unixFile *pFile 
34030 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b  = (unixFile*)id;
34040 0a 20 20 69 6e 74 20 72 63 20 3d 20 70 72 6f 78  .  int rc = prox
34050 79 54 61 6b 65 43 6f 6e 63 68 28 70 46 69 6c 65  yTakeConch(pFile
34060 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  );.  if( rc==SQL
34070 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 72  ITE_OK ){.    pr
34080 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78  oxyLockingContex
34090 74 20 2a 70 43 74 78 20 3d 20 28 70 72 6f 78 79  t *pCtx = (proxy
340a0 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a  LockingContext *
340b0 29 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43  )pFile->lockingC
340c0 6f 6e 74 65 78 74 3b 0a 20 20 20 20 69 66 28 20  ontext;.    if( 
340d0 70 43 74 78 2d 3e 63 6f 6e 63 68 48 65 6c 64 3e  pCtx->conchHeld>
340e0 30 20 29 7b 0a 20 20 20 20 20 20 75 6e 69 78 46  0 ){.      unixF
340f0 69 6c 65 20 2a 70 72 6f 78 79 20 3d 20 70 43 74  ile *proxy = pCt
34100 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 3b 0a 20 20  x->lockProxy;.  
34110 20 20 20 20 72 63 20 3d 20 70 72 6f 78 79 2d 3e      rc = proxy->
34120 70 4d 65 74 68 6f 64 2d 3e 78 4c 6f 63 6b 28 28  pMethod->xLock((
34130 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29 70 72  sqlite3_file*)pr
34140 6f 78 79 2c 20 6c 6f 63 6b 74 79 70 65 29 3b 0a  oxy, locktype);.
34150 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 6f 63        pFile->loc
34160 6b 74 79 70 65 20 3d 20 70 72 6f 78 79 2d 3e 6c  ktype = proxy->l
34170 6f 63 6b 74 79 70 65 3b 0a 20 20 20 20 7d 65 6c  ocktype;.    }el
34180 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 63 6f 6e  se{.      /* con
34190 63 68 48 65 6c 64 20 3c 20 30 20 69 73 20 6c 6f  chHeld < 0 is lo
341a0 63 6b 6c 65 73 73 20 2a 2f 0a 20 20 20 20 7d 0a  ckless */.    }.
341b0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
341c0 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 77 65 72  .}.../*.** Lower
341d0 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76   the locking lev
341e0 65 6c 20 6f 6e 20 66 69 6c 65 20 64 65 73 63 72  el on file descr
341f0 69 70 74 6f 72 20 70 46 69 6c 65 20 74 6f 20 6c  iptor pFile to l
34200 6f 63 6b 74 79 70 65 2e 20 20 6c 6f 63 6b 74 79  ocktype.  lockty
34210 70 65 0a 2a 2a 20 6d 75 73 74 20 62 65 20 65 69  pe.** must be ei
34220 74 68 65 72 20 4e 4f 5f 4c 4f 43 4b 20 6f 72 20  ther NO_LOCK or 
34230 53 48 41 52 45 44 5f 4c 4f 43 4b 2e 0a 2a 2a 0a  SHARED_LOCK..**.
34240 2a 2a 20 49 66 20 74 68 65 20 6c 6f 63 6b 69 6e  ** If the lockin
34250 67 20 6c 65 76 65 6c 20 6f 66 20 74 68 65 20 66  g level of the f
34260 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 69  ile descriptor i
34270 73 20 61 6c 72 65 61 64 79 20 61 74 20 6f 72 20  s already at or 
34280 62 65 6c 6f 77 0a 2a 2a 20 74 68 65 20 72 65 71  below.** the req
34290 75 65 73 74 65 64 20 6c 6f 63 6b 69 6e 67 20 6c  uested locking l
342a0 65 76 65 6c 2c 20 74 68 69 73 20 72 6f 75 74 69  evel, this routi
342b0 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a  ne is a no-op..*
342c0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72 6f  /.static int pro
342d0 78 79 55 6e 6c 6f 63 6b 28 73 71 6c 69 74 65 33  xyUnlock(sqlite3
342e0 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 6c  _file *id, int l
342f0 6f 63 6b 74 79 70 65 29 20 7b 0a 20 20 75 6e 69  ocktype) {.  uni
34300 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28  xFile *pFile = (
34310 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20  unixFile*)id;.  
34320 69 6e 74 20 72 63 20 3d 20 70 72 6f 78 79 54 61  int rc = proxyTa
34330 6b 65 43 6f 6e 63 68 28 70 46 69 6c 65 29 3b 0a  keConch(pFile);.
34340 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
34350 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 72 6f 78 79  _OK ){.    proxy
34360 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a  LockingContext *
34370 70 43 74 78 20 3d 20 28 70 72 6f 78 79 4c 6f 63  pCtx = (proxyLoc
34380 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 29 70 46  kingContext *)pF
34390 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74  ile->lockingCont
343a0 65 78 74 3b 0a 20 20 20 20 69 66 28 20 70 43 74  ext;.    if( pCt
343b0 78 2d 3e 63 6f 6e 63 68 48 65 6c 64 3e 30 20 29  x->conchHeld>0 )
343c0 7b 0a 20 20 20 20 20 20 75 6e 69 78 46 69 6c 65  {.      unixFile
343d0 20 2a 70 72 6f 78 79 20 3d 20 70 43 74 78 2d 3e   *proxy = pCtx->
343e0 6c 6f 63 6b 50 72 6f 78 79 3b 0a 20 20 20 20 20  lockProxy;.     
343f0 20 72 63 20 3d 20 70 72 6f 78 79 2d 3e 70 4d 65   rc = proxy->pMe
34400 74 68 6f 64 2d 3e 78 55 6e 6c 6f 63 6b 28 28 73  thod->xUnlock((s
34410 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29 70 72 6f  qlite3_file*)pro
34420 78 79 2c 20 6c 6f 63 6b 74 79 70 65 29 3b 0a 20  xy, locktype);. 
34430 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b       pFile->lock
34440 74 79 70 65 20 3d 20 70 72 6f 78 79 2d 3e 6c 6f  type = proxy->lo
34450 63 6b 74 79 70 65 3b 0a 20 20 20 20 7d 65 6c 73  cktype;.    }els
34460 65 7b 0a 20 20 20 20 20 20 2f 2a 20 63 6f 6e 63  e{.      /* conc
34470 68 48 65 6c 64 20 3c 20 30 20 69 73 20 6c 6f 63  hHeld < 0 is loc
34480 6b 6c 65 73 73 20 2a 2f 0a 20 20 20 20 7d 0a 20  kless */.    }. 
34490 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
344a0 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61  }../*.** Close a
344b0 20 66 69 6c 65 20 74 68 61 74 20 75 73 65 73 20   file that uses 
344c0 70 72 6f 78 79 20 6c 6f 63 6b 73 2e 0a 2a 2f 0a  proxy locks..*/.
344d0 73 74 61 74 69 63 20 69 6e 74 20 70 72 6f 78 79  static int proxy
344e0 43 6c 6f 73 65 28 73 71 6c 69 74 65 33 5f 66 69  Close(sqlite3_fi
344f0 6c 65 20 2a 69 64 29 20 7b 0a 20 20 69 66 28 20  le *id) {.  if( 
34500 69 64 20 29 7b 0a 20 20 20 20 75 6e 69 78 46 69  id ){.    unixFi
34510 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69  le *pFile = (uni
34520 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 20 20 70  xFile*)id;.    p
34530 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65  roxyLockingConte
34540 78 74 20 2a 70 43 74 78 20 3d 20 28 70 72 6f 78  xt *pCtx = (prox
34550 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20  yLockingContext 
34560 2a 29 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67  *)pFile->locking
34570 43 6f 6e 74 65 78 74 3b 0a 20 20 20 20 75 6e 69  Context;.    uni
34580 78 46 69 6c 65 20 2a 6c 6f 63 6b 50 72 6f 78 79  xFile *lockProxy
34590 20 3d 20 70 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f   = pCtx->lockPro
345a0 78 79 3b 0a 20 20 20 20 75 6e 69 78 46 69 6c 65  xy;.    unixFile
345b0 20 2a 63 6f 6e 63 68 46 69 6c 65 20 3d 20 70 43   *conchFile = pC
345c0 74 78 2d 3e 63 6f 6e 63 68 46 69 6c 65 3b 0a 20  tx->conchFile;. 
345d0 20 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49     int rc = SQLI
345e0 54 45 5f 4f 4b 3b 0a 20 20 20 20 0a 20 20 20 20  TE_OK;.    .    
345f0 69 66 28 20 6c 6f 63 6b 50 72 6f 78 79 20 29 7b  if( lockProxy ){
34600 0a 20 20 20 20 20 20 72 63 20 3d 20 6c 6f 63 6b  .      rc = lock
34610 50 72 6f 78 79 2d 3e 70 4d 65 74 68 6f 64 2d 3e  Proxy->pMethod->
34620 78 55 6e 6c 6f 63 6b 28 28 73 71 6c 69 74 65 33  xUnlock((sqlite3
34630 5f 66 69 6c 65 2a 29 6c 6f 63 6b 50 72 6f 78 79  _file*)lockProxy
34640 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20  , NO_LOCK);.    
34650 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
34660 6e 20 72 63 3b 0a 20 20 20 20 20 20 72 63 20 3d  n rc;.      rc =
34670 20 6c 6f 63 6b 50 72 6f 78 79 2d 3e 70 4d 65 74   lockProxy->pMet
34680 68 6f 64 2d 3e 78 43 6c 6f 73 65 28 28 73 71 6c  hod->xClose((sql
34690 69 74 65 33 5f 66 69 6c 65 2a 29 6c 6f 63 6b 50  ite3_file*)lockP
346a0 72 6f 78 79 29 3b 0a 20 20 20 20 20 20 69 66 28  roxy);.      if(
346b0 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
346c0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66  .      sqlite3_f
346d0 72 65 65 28 6c 6f 63 6b 50 72 6f 78 79 29 3b 0a  ree(lockProxy);.
346e0 20 20 20 20 20 20 70 43 74 78 2d 3e 6c 6f 63 6b        pCtx->lock
346f0 50 72 6f 78 79 20 3d 20 30 3b 0a 20 20 20 20 7d  Proxy = 0;.    }
34700 0a 20 20 20 20 69 66 28 20 63 6f 6e 63 68 46 69  .    if( conchFi
34710 6c 65 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  le ){.      if( 
34720 70 43 74 78 2d 3e 63 6f 6e 63 68 48 65 6c 64 20  pCtx->conchHeld 
34730 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
34740 70 72 6f 78 79 52 65 6c 65 61 73 65 43 6f 6e 63  proxyReleaseConc
34750 68 28 70 46 69 6c 65 29 3b 0a 20 20 20 20 20 20  h(pFile);.      
34760 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
34770 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20  n rc;.      }.  
34780 20 20 20 20 72 63 20 3d 20 63 6f 6e 63 68 46 69      rc = conchFi
34790 6c 65 2d 3e 70 4d 65 74 68 6f 64 2d 3e 78 43 6c  le->pMethod->xCl
347a0 6f 73 65 28 28 73 71 6c 69 74 65 33 5f 66 69 6c  ose((sqlite3_fil
347b0 65 2a 29 63 6f 6e 63 68 46 69 6c 65 29 3b 0a 20  e*)conchFile);. 
347c0 20 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65       if( rc ) re
347d0 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 73  turn rc;.      s
347e0 71 6c 69 74 65 33 5f 66 72 65 65 28 63 6f 6e 63  qlite3_free(conc
347f0 68 46 69 6c 65 29 3b 0a 20 20 20 20 7d 0a 20 20  hFile);.    }.  
34800 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
34810 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 50 61  Ctx->lockProxyPa
34820 74 68 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  th);.    sqlite3
34830 5f 66 72 65 65 28 70 43 74 78 2d 3e 63 6f 6e 63  _free(pCtx->conc
34840 68 46 69 6c 65 50 61 74 68 29 3b 0a 20 20 20 20  hFilePath);.    
34850 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 43 74  sqlite3_free(pCt
34860 78 2d 3e 64 62 50 61 74 68 29 3b 0a 20 20 20 20  x->dbPath);.    
34870 2f 2a 20 72 65 73 74 6f 72 65 20 74 68 65 20 6f  /* restore the o
34880 72 69 67 69 6e 61 6c 20 6c 6f 63 6b 69 6e 67 20  riginal locking 
34890 63 6f 6e 74 65 78 74 20 61 6e 64 20 70 4d 65 74  context and pMet
348a0 68 6f 64 20 74 68 65 6e 20 63 6c 6f 73 65 20 69  hod then close i
348b0 74 20 2a 2f 0a 20 20 20 20 70 46 69 6c 65 2d 3e  t */.    pFile->
348c0 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 3d  lockingContext =
348d0 20 70 43 74 78 2d 3e 6f 6c 64 4c 6f 63 6b 69 6e   pCtx->oldLockin
348e0 67 43 6f 6e 74 65 78 74 3b 0a 20 20 20 20 70 46  gContext;.    pF
348f0 69 6c 65 2d 3e 70 4d 65 74 68 6f 64 20 3d 20 70  ile->pMethod = p
34900 43 74 78 2d 3e 70 4f 6c 64 4d 65 74 68 6f 64 3b  Ctx->pOldMethod;
34910 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
34920 65 28 70 43 74 78 29 3b 0a 20 20 20 20 72 65 74  e(pCtx);.    ret
34930 75 72 6e 20 70 46 69 6c 65 2d 3e 70 4d 65 74 68  urn pFile->pMeth
34940 6f 64 2d 3e 78 43 6c 6f 73 65 28 69 64 29 3b 0a  od->xClose(id);.
34950 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c    }.  return SQL
34960 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 0a 23 65 6e  ITE_OK;.}....#en
34970 64 69 66 20 2f 2a 20 64 65 66 69 6e 65 64 28 5f  dif /* defined(_
34980 5f 41 50 50 4c 45 5f 5f 29 20 26 26 20 53 51 4c  _APPLE__) && SQL
34990 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49  ITE_ENABLE_LOCKI
349a0 4e 47 5f 53 54 59 4c 45 20 2a 2f 0a 2f 2a 0a 2a  NG_STYLE */./*.*
349b0 2a 20 54 68 65 20 70 72 6f 78 79 20 6c 6f 63 6b  * The proxy lock
349c0 69 6e 67 20 73 74 79 6c 65 20 69 73 20 69 6e 74  ing style is int
349d0 65 6e 64 65 64 20 66 6f 72 20 75 73 65 20 77 69  ended for use wi
349e0 74 68 20 41 46 50 20 66 69 6c 65 73 79 73 74 65  th AFP filesyste
349f0 6d 73 2e 0a 2a 2a 20 41 6e 64 20 73 69 6e 63 65  ms..** And since
34a00 20 41 46 50 20 69 73 20 6f 6e 6c 79 20 73 75 70   AFP is only sup
34a10 70 6f 72 74 65 64 20 6f 6e 20 4d 61 63 4f 53 58  ported on MacOSX
34a20 2c 20 74 68 65 20 70 72 6f 78 79 20 6c 6f 63 6b  , the proxy lock
34a30 69 6e 67 20 69 73 20 61 6c 73 6f 0a 2a 2a 20 72  ing is also.** r
34a40 65 73 74 72 69 63 74 65 64 20 74 6f 20 4d 61 63  estricted to Mac
34a50 4f 53 58 2e 0a 2a 2a 20 0a 2a 2a 0a 2a 2a 2a 2a  OSX..** .**.****
34a60 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20  *************** 
34a70 45 6e 64 20 6f 66 20 74 68 65 20 70 72 6f 78 79  End of the proxy
34a80 20 6c 6f 63 6b 20 69 6d 70 6c 65 6d 65 6e 74 61   lock implementa
34a90 74 69 6f 6e 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  tion ***********
34aa0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a  ***********.****
34ab0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
34ac0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
34ad0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
34ae0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
34af0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 0a  **********/../*.
34b00 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68  ** Initialize th
34b10 65 20 6f 70 65 72 61 74 69 6e 67 20 73 79 73 74  e operating syst
34b20 65 6d 20 69 6e 74 65 72 66 61 63 65 2e 0a 2a 2a  em interface..**
34b30 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
34b40 20 72 65 67 69 73 74 65 72 73 20 61 6c 6c 20 56   registers all V
34b50 46 53 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  FS implementatio
34b60 6e 73 20 66 6f 72 20 75 6e 69 78 2d 6c 69 6b 65  ns for unix-like
34b70 20 6f 70 65 72 61 74 69 6e 67 0a 2a 2a 20 73 79   operating.** sy
34b80 73 74 65 6d 73 2e 20 20 54 68 69 73 20 72 6f 75  stems.  This rou
34b90 74 69 6e 65 2c 20 61 6e 64 20 74 68 65 20 73 71  tine, and the sq
34ba0 6c 69 74 65 33 5f 6f 73 5f 65 6e 64 28 29 20 72  lite3_os_end() r
34bb0 6f 75 74 69 6e 65 20 74 68 61 74 20 66 6f 6c 6c  outine that foll
34bc0 6f 77 73 2c 0a 2a 2a 20 73 68 6f 75 6c 64 20 62  ows,.** should b
34bd0 65 20 74 68 65 20 6f 6e 6c 79 20 72 6f 75 74 69  e the only routi
34be0 6e 65 73 20 69 6e 20 74 68 69 73 20 66 69 6c 65  nes in this file
34bf0 20 74 68 61 74 20 61 72 65 20 76 69 73 69 62 6c   that are visibl
34c00 65 20 66 72 6f 6d 20 6f 74 68 65 72 0a 2a 2a 20  e from other.** 
34c10 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  files..**.** Thi
34c20 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
34c30 6c 65 64 20 6f 6e 63 65 20 64 75 72 69 6e 67 20  led once during 
34c40 53 51 4c 69 74 65 20 69 6e 69 74 69 61 6c 69 7a  SQLite initializ
34c50 61 74 69 6f 6e 20 61 6e 64 20 62 79 20 61 0a 2a  ation and by a.*
34c60 2a 20 73 69 6e 67 6c 65 20 74 68 72 65 61 64 2e  * single thread.
34c70 20 20 54 68 65 20 6d 65 6d 6f 72 79 20 61 6c 6c    The memory all
34c80 6f 63 61 74 69 6f 6e 20 61 6e 64 20 6d 75 74 65  ocation and mute
34c90 78 20 73 75 62 73 79 73 74 65 6d 73 20 68 61 76  x subsystems hav
34ca0 65 20 6e 6f 74 0a 2a 2a 20 6e 65 63 65 73 73 61  e not.** necessa
34cb0 72 69 6c 79 20 62 65 65 6e 20 69 6e 69 74 69 61  rily been initia
34cc0 6c 69 7a 65 64 20 77 68 65 6e 20 74 68 69 73 20  lized when this 
34cd0 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
34ce0 64 2c 20 61 6e 64 20 73 6f 20 74 68 65 79 0a 2a  d, and so they.*
34cf0 2a 20 73 68 6f 75 6c 64 20 6e 6f 74 20 62 65 20  * should not be 
34d00 75 73 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  used..*/.int sql
34d10 69 74 65 33 5f 6f 73 5f 69 6e 69 74 28 76 6f 69  ite3_os_init(voi
34d20 64 29 7b 20 0a 20 20 2f 2a 20 0a 20 20 2a 2a 20  d){ .  /* .  ** 
34d30 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 6d 61  The following ma
34d40 63 72 6f 20 64 65 66 69 6e 65 73 20 61 6e 20 69  cro defines an i
34d50 6e 69 74 69 61 6c 69 7a 65 72 20 66 6f 72 20 61  nitializer for a
34d60 6e 20 73 71 6c 69 74 65 33 5f 76 66 73 20 6f 62  n sqlite3_vfs ob
34d70 6a 65 63 74 2e 0a 20 20 2a 2a 20 54 68 65 20 6e  ject..  ** The n
34d80 61 6d 65 20 6f 66 20 74 68 65 20 56 46 53 20 69  ame of the VFS i
34d90 73 20 4e 41 4d 45 2e 20 20 54 68 65 20 70 41 70  s NAME.  The pAp
34da0 70 44 61 74 61 20 69 73 20 61 20 70 6f 69 6e 74  pData is a point
34db0 65 72 20 74 6f 20 61 20 70 6f 69 6e 74 65 72 0a  er to a pointer.
34dc0 20 20 2a 2a 20 74 6f 20 74 68 65 20 22 66 69 6e    ** to the "fin
34dd0 64 65 72 22 20 66 75 6e 63 74 69 6f 6e 2e 20 20  der" function.  
34de0 28 70 41 70 70 44 61 74 61 20 69 73 20 61 20 70  (pAppData is a p
34df0 6f 69 6e 74 65 72 20 74 6f 20 61 20 70 6f 69 6e  ointer to a poin
34e00 74 65 72 20 62 65 63 61 75 73 65 0a 20 20 2a 2a  ter because.  **
34e10 20 73 69 6c 6c 79 20 43 39 30 20 72 75 6c 65 73   silly C90 rules
34e20 20 70 72 6f 68 69 62 69 74 20 61 20 76 6f 69 64   prohibit a void
34e30 2a 20 66 72 6f 6d 20 62 65 69 6e 67 20 63 61 73  * from being cas
34e40 74 20 74 6f 20 61 20 66 75 6e 63 74 69 6f 6e 20  t to a function 
34e50 70 6f 69 6e 74 65 72 0a 20 20 2a 2a 20 61 6e 64  pointer.  ** and
34e60 20 73 6f 20 77 65 20 68 61 76 65 20 74 6f 20 67   so we have to g
34e70 6f 20 74 68 72 6f 75 67 68 20 74 68 65 20 69 6e  o through the in
34e80 74 65 72 6d 65 64 69 61 74 65 20 70 6f 69 6e 74  termediate point
34e90 65 72 20 74 6f 20 61 76 6f 69 64 20 70 72 6f 62  er to avoid prob
34ea0 6c 65 6d 73 0a 20 20 2a 2a 20 77 68 65 6e 20 63  lems.  ** when c
34eb0 6f 6d 70 69 6c 69 6e 67 20 77 69 74 68 20 2d 70  ompiling with -p
34ec0 65 64 61 6e 74 69 63 2d 65 72 72 6f 72 73 20 6f  edantic-errors o
34ed0 6e 20 47 43 43 2e 29 0a 20 20 2a 2a 0a 20 20 2a  n GCC.).  **.  *
34ee0 2a 20 54 68 65 20 46 49 4e 44 45 52 20 70 61 72  * The FINDER par
34ef0 61 6d 65 74 65 72 20 74 6f 20 74 68 69 73 20 6d  ameter to this m
34f00 61 63 72 6f 20 69 73 20 74 68 65 20 6e 61 6d 65  acro is the name
34f10 20 6f 66 20 74 68 65 20 70 6f 69 6e 74 65 72 20   of the pointer 
34f20 74 6f 20 74 68 65 0a 20 20 2a 2a 20 66 69 6e 64  to the.  ** find
34f30 65 72 2d 66 75 6e 63 74 69 6f 6e 2e 20 20 54 68  er-function.  Th
34f40 65 20 66 69 6e 64 65 72 2d 66 75 6e 63 74 69 6f  e finder-functio
34f50 6e 20 72 65 74 75 72 6e 73 20 61 20 70 6f 69 6e  n returns a poin
34f60 74 65 72 20 74 6f 20 74 68 65 0a 20 20 2a 2a 20  ter to the.  ** 
34f70 73 71 6c 69 74 65 5f 69 6f 5f 6d 65 74 68 6f 64  sqlite_io_method
34f80 73 20 6f 62 6a 65 63 74 20 74 68 61 74 20 69 6d  s object that im
34f90 70 6c 65 6d 65 6e 74 73 20 74 68 65 20 64 65 73  plements the des
34fa0 69 72 65 64 20 6c 6f 63 6b 69 6e 67 0a 20 20 2a  ired locking.  *
34fb0 2a 20 62 65 68 61 76 69 6f 72 73 2e 20 20 53 65  * behaviors.  Se
34fc0 65 20 74 68 65 20 64 69 76 69 73 69 6f 6e 20 61  e the division a
34fd0 62 6f 76 65 20 74 68 61 74 20 63 6f 6e 74 61 69  bove that contai
34fe0 6e 73 20 74 68 65 20 49 4f 4d 45 54 48 4f 44 53  ns the IOMETHODS
34ff0 0a 20 20 2a 2a 20 6d 61 63 72 6f 20 66 6f 72 20  .  ** macro for 
35000 61 64 64 69 74 69 6f 6e 20 69 6e 66 6f 72 6d 61  addition informa
35010 74 69 6f 6e 20 6f 6e 20 66 69 6e 64 65 72 2d 66  tion on finder-f
35020 75 6e 63 74 69 6f 6e 73 2e 0a 20 20 2a 2a 0a 20  unctions..  **. 
35030 20 2a 2a 20 4d 6f 73 74 20 66 69 6e 64 65 72 73   ** Most finders
35040 20 73 69 6d 70 6c 79 20 72 65 74 75 72 6e 20 61   simply return a
35050 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 66 69   pointer to a fi
35060 78 65 64 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d  xed sqlite3_io_m
35070 65 74 68 6f 64 73 0a 20 20 2a 2a 20 6f 62 6a 65  ethods.  ** obje
35080 63 74 2e 20 20 42 75 74 20 74 68 65 20 22 61 75  ct.  But the "au
35090 74 6f 6c 6f 63 6b 49 6f 46 69 6e 64 65 72 22 20  tolockIoFinder" 
350a0 61 76 61 69 6c 61 62 6c 65 20 6f 6e 20 4d 61 63  available on Mac
350b0 4f 53 58 20 64 6f 65 73 20 61 20 6c 69 74 74 6c  OSX does a littl
350c0 65 0a 20 20 2a 2a 20 6d 6f 72 65 20 74 68 61 6e  e.  ** more than
350d0 20 74 68 61 74 3b 20 69 74 20 6c 6f 6f 6b 73 20   that; it looks 
350e0 61 74 20 74 68 65 20 66 69 6c 65 73 79 73 74 65  at the filesyste
350f0 6d 20 74 79 70 65 20 74 68 61 74 20 68 6f 73 74  m type that host
35100 73 20 74 68 65 20 0a 20 20 2a 2a 20 64 61 74 61  s the .  ** data
35110 62 61 73 65 20 66 69 6c 65 20 61 6e 64 20 74 72  base file and tr
35120 69 65 73 20 74 6f 20 63 68 6f 6f 73 65 20 61 6e  ies to choose an
35130 20 6c 6f 63 6b 69 6e 67 20 6d 65 74 68 6f 64 20   locking method 
35140 61 70 70 72 6f 70 72 69 61 74 65 20 66 6f 72 0a  appropriate for.
35150 20 20 2a 2a 20 74 68 61 74 20 66 69 6c 65 73 79    ** that filesy
35160 73 74 65 6d 20 74 69 6d 65 2e 0a 20 20 2a 2f 0a  stem time..  */.
35170 20 20 23 64 65 66 69 6e 65 20 55 4e 49 58 56 46    #define UNIXVF
35180 53 28 56 46 53 4e 41 4d 45 2c 20 46 49 4e 44 45  S(VFSNAME, FINDE
35190 52 29 20 7b 20 20 20 20 20 20 20 20 20 20 20 20  R) {            
351a0 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20              \.  
351b0 20 20 32 2c 20 20 20 20 20 20 20 20 20 20 20 20    2,            
351c0 20 20 20 20 20 20 20 20 2f 2a 20 69 56 65 72 73          /* iVers
351d0 69 6f 6e 20 2a 2f 20 20 20 20 20 20 20 20 20 20  ion */          
351e0 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 20            \.    
351f0 73 69 7a 65 6f 66 28 75 6e 69 78 46 69 6c 65 29  sizeof(unixFile)
35200 2c 20 20 20 20 20 2f 2a 20 73 7a 4f 73 46 69 6c  ,     /* szOsFil
35210 65 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20  e */            
35220 20 20 20 20 20 20 20 20 5c 0a 20 20 20 20 4d 41          \.    MA
35230 58 5f 50 41 54 48 4e 41 4d 45 2c 20 20 20 20 20  X_PATHNAME,     
35240 20 20 20 20 2f 2a 20 6d 78 50 61 74 68 6e 61 6d      /* mxPathnam
35250 65 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20  e */            
35260 20 20 20 20 20 20 5c 0a 20 20 20 20 30 2c 20 20        \.    0,  
35270 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35280 20 20 2f 2a 20 70 4e 65 78 74 20 2a 2f 20 20 20    /* pNext */   
35290 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
352a0 20 20 20 20 5c 0a 20 20 20 20 56 46 53 4e 41 4d      \.    VFSNAM
352b0 45 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  E,              
352c0 2f 2a 20 7a 4e 61 6d 65 20 2a 2f 20 20 20 20 20  /* zName */     
352d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
352e0 20 20 5c 0a 20 20 20 20 28 76 6f 69 64 2a 29 26    \.    (void*)&
352f0 46 49 4e 44 45 52 2c 20 20 20 20 20 20 20 2f 2a  FINDER,       /*
35300 20 70 41 70 70 44 61 74 61 20 2a 2f 20 20 20 20   pAppData */    
35310 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35320 5c 0a 20 20 20 20 75 6e 69 78 4f 70 65 6e 2c 20  \.    unixOpen, 
35330 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
35340 4f 70 65 6e 20 2a 2f 20 20 20 20 20 20 20 20 20  Open */         
35350 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a                \.
35360 20 20 20 20 75 6e 69 78 44 65 6c 65 74 65 2c 20      unixDelete, 
35370 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 44 65            /* xDe
35380 6c 65 74 65 20 2a 2f 20 20 20 20 20 20 20 20 20  lete */         
35390 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20              \.  
353a0 20 20 75 6e 69 78 41 63 63 65 73 73 2c 20 20 20    unixAccess,   
353b0 20 20 20 20 20 20 20 20 2f 2a 20 78 41 63 63 65          /* xAcce
353c0 73 73 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20  ss */           
353d0 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 20            \.    
353e0 75 6e 69 78 46 75 6c 6c 50 61 74 68 6e 61 6d 65  unixFullPathname
353f0 2c 20 20 20 20 20 2f 2a 20 78 46 75 6c 6c 50 61  ,     /* xFullPa
35400 74 68 6e 61 6d 65 20 2a 2f 20 20 20 20 20 20 20  thname */       
35410 20 20 20 20 20 20 20 20 5c 0a 20 20 20 20 75 6e          \.    un
35420 69 78 44 6c 4f 70 65 6e 2c 20 20 20 20 20 20 20  ixDlOpen,       
35430 20 20 20 20 2f 2a 20 78 44 6c 4f 70 65 6e 20 2a      /* xDlOpen *
35440 2f 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  /               
35450 20 20 20 20 20 20 5c 0a 20 20 20 20 75 6e 69 78        \.    unix
35460 44 6c 45 72 72 6f 72 2c 20 20 20 20 20 20 20 20  DlError,        
35470 20 20 2f 2a 20 78 44 6c 45 72 72 6f 72 20 2a 2f    /* xDlError */
35480 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35490 20 20 20 20 5c 0a 20 20 20 20 75 6e 69 78 44 6c      \.    unixDl
354a0 53 79 6d 2c 20 20 20 20 20 20 20 20 20 20 20 20  Sym,            
354b0 2f 2a 20 78 44 6c 53 79 6d 20 2a 2f 20 20 20 20  /* xDlSym */    
354c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
354d0 20 20 5c 0a 20 20 20 20 75 6e 69 78 44 6c 43 6c    \.    unixDlCl
354e0 6f 73 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  ose,          /*
354f0 20 78 44 6c 43 6c 6f 73 65 20 2a 2f 20 20 20 20   xDlClose */    
35500 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35510 5c 0a 20 20 20 20 75 6e 69 78 52 61 6e 64 6f 6d  \.    unixRandom
35520 6e 65 73 73 2c 20 20 20 20 20 20 20 2f 2a 20 78  ness,       /* x
35530 52 61 6e 64 6f 6d 6e 65 73 73 20 2a 2f 20 20 20  Randomness */   
35540 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a                \.
35550 20 20 20 20 75 6e 69 78 53 6c 65 65 70 2c 20 20      unixSleep,  
35560 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53 6c            /* xSl
35570 65 65 70 20 2a 2f 20 20 20 20 20 20 20 20 20 20  eep */          
35580 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20              \.  
35590 20 20 75 6e 69 78 43 75 72 72 65 6e 74 54 69 6d    unixCurrentTim
355a0 65 2c 20 20 20 20 20 20 2f 2a 20 78 43 75 72 72  e,      /* xCurr
355b0 65 6e 74 54 69 6d 65 20 2a 2f 20 20 20 20 20 20  entTime */      
355c0 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 20            \.    
355d0 75 6e 69 78 47 65 74 4c 61 73 74 45 72 72 6f 72  unixGetLastError
355e0 2c 20 20 20 20 20 2f 2a 20 78 47 65 74 4c 61 73  ,     /* xGetLas
355f0 74 45 72 72 6f 72 20 2a 2f 20 20 20 20 20 20 20  tError */       
35600 20 20 20 20 20 20 20 20 5c 0a 20 20 20 20 75 6e          \.    un
35610 69 78 53 68 6d 4f 70 65 6e 2c 20 20 20 20 20 20  ixShmOpen,      
35620 20 20 20 20 2f 2a 20 78 53 68 6d 4f 70 65 6e 20      /* xShmOpen 
35630 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20 20 20  */              
35640 20 20 20 20 20 20 5c 0a 20 20 20 20 75 6e 69 78        \.    unix
35650 53 68 6d 53 69 7a 65 2c 20 20 20 20 20 20 20 20  ShmSize,        
35660 20 20 2f 2a 20 78 53 68 6d 53 69 7a 65 20 2a 2f    /* xShmSize */
35670 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35680 20 20 20 20 5c 0a 20 20 20 20 75 6e 69 78 53 68      \.    unixSh
35690 6d 47 65 74 2c 20 20 20 20 20 20 20 20 20 20 20  mGet,           
356a0 2f 2a 20 78 53 68 6d 47 65 74 20 2a 2f 20 20 20  /* xShmGet */   
356b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
356c0 20 20 5c 0a 20 20 20 20 75 6e 69 78 53 68 6d 52    \.    unixShmR
356d0 65 6c 65 61 73 65 2c 20 20 20 20 20 20 20 2f 2a  elease,       /*
356e0 20 78 53 68 6d 52 65 6c 65 61 73 65 20 2a 2f 20   xShmRelease */ 
356f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35700 5c 0a 20 20 20 20 30 2c 20 20 20 20 20 20 20 20  \.    0,        
35710 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
35720 53 68 6d 50 75 73 68 20 2a 2f 20 20 20 20 20 20  ShmPush */      
35730 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a                \.
35740 20 20 20 20 30 2c 20 20 20 20 20 20 20 20 20 20      0,          
35750 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53 68            /* xSh
35760 6d 50 75 6c 6c 20 2a 2f 20 20 20 20 20 20 20 20  mPull */        
35770 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20              \.  
35780 20 20 75 6e 69 78 53 68 6d 4c 6f 63 6b 2c 20 20    unixShmLock,  
35790 20 20 20 20 20 20 20 20 2f 2a 20 78 53 68 6d 4c          /* xShmL
357a0 6f 63 6b 20 2a 2f 20 20 20 20 20 20 20 20 20 20  ock */          
357b0 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 20            \.    
357c0 75 6e 69 78 53 68 6d 43 6c 6f 73 65 2c 20 20 20  unixShmClose,   
357d0 20 20 20 20 20 20 2f 2a 20 78 53 68 6d 43 6c 6f        /* xShmClo
357e0 73 65 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20  se */           
357f0 20 20 20 20 20 20 20 20 5c 0a 20 20 20 20 75 6e          \.    un
35800 69 78 53 68 6d 44 65 6c 65 74 65 2c 20 20 20 20  ixShmDelete,    
35810 20 20 20 20 2f 2a 20 78 53 68 6d 44 65 6c 65 74      /* xShmDelet
35820 65 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20  e */            
35830 20 20 20 20 20 20 5c 0a 20 20 20 20 30 2c 20 20        \.    0,  
35840 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35850 20 20 2f 2a 20 78 52 65 6e 61 6d 65 20 2a 2f 20    /* xRename */ 
35860 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35870 20 20 20 20 5c 0a 20 20 20 20 30 2c 20 20 20 20      \.    0,    
35880 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35890 2f 2a 20 78 43 75 72 72 65 6e 74 54 69 6d 65 49  /* xCurrentTimeI
358a0 6e 74 36 34 20 2a 2f 20 20 20 20 20 20 20 20 20  nt64 */         
358b0 20 20 5c 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20    \.  }..  /*.  
358c0 2a 2a 20 41 6c 6c 20 64 65 66 61 75 6c 74 20 56  ** All default V
358d0 46 53 65 73 20 66 6f 72 20 75 6e 69 78 20 61 72  FSes for unix ar
358e0 65 20 63 6f 6e 74 61 69 6e 65 64 20 69 6e 20 74  e contained in t
358f0 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 72 72  he following arr
35900 61 79 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4e 6f  ay..  **.  ** No
35910 74 65 20 74 68 61 74 20 74 68 65 20 73 71 6c 69  te that the sqli
35920 74 65 33 5f 76 66 73 2e 70 4e 65 78 74 20 66 69  te3_vfs.pNext fi
35930 65 6c 64 20 6f 66 20 74 68 65 20 56 46 53 20 6f  eld of the VFS o
35940 62 6a 65 63 74 20 69 73 20 6d 6f 64 69 66 69 65  bject is modifie
35950 64 0a 20 20 2a 2a 20 62 79 20 74 68 65 20 53 51  d.  ** by the SQ
35960 4c 69 74 65 20 63 6f 72 65 20 77 68 65 6e 20 74  Lite core when t
35970 68 65 20 56 46 53 20 69 73 20 72 65 67 69 73 74  he VFS is regist
35980 65 72 65 64 2e 20 20 53 6f 20 74 68 65 20 66 6f  ered.  So the fo
35990 6c 6c 6f 77 69 6e 67 0a 20 20 2a 2a 20 61 72 72  llowing.  ** arr
359a0 61 79 20 63 61 6e 6e 6f 74 20 62 65 20 63 6f 6e  ay cannot be con
359b0 73 74 2e 0a 20 20 2a 2f 0a 20 20 73 74 61 74 69  st..  */.  stati
359c0 63 20 73 71 6c 69 74 65 33 5f 76 66 73 20 61 56  c sqlite3_vfs aV
359d0 66 73 5b 5d 20 3d 20 7b 0a 23 69 66 20 53 51 4c  fs[] = {.#if SQL
359e0 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49  ITE_ENABLE_LOCKI
359f0 4e 47 5f 53 54 59 4c 45 20 26 26 20 28 4f 53 5f  NG_STYLE && (OS_
35a00 56 58 57 4f 52 4b 53 20 7c 7c 20 64 65 66 69 6e  VXWORKS || defin
35a10 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 29 0a 20  ed(__APPLE__)). 
35a20 20 20 20 55 4e 49 58 56 46 53 28 22 75 6e 69 78     UNIXVFS("unix
35a30 22 2c 20 20 20 20 20 20 20 20 20 20 61 75 74 6f  ",          auto
35a40 6c 6f 63 6b 49 6f 46 69 6e 64 65 72 20 29 2c 0a  lockIoFinder ),.
35a50 23 65 6c 73 65 0a 20 20 20 20 55 4e 49 58 56 46  #else.    UNIXVF
35a60 53 28 22 75 6e 69 78 22 2c 20 20 20 20 20 20 20  S("unix",       
35a70 20 20 20 70 6f 73 69 78 49 6f 46 69 6e 64 65 72     posixIoFinder
35a80 20 29 2c 0a 23 65 6e 64 69 66 0a 20 20 20 20 55   ),.#endif.    U
35a90 4e 49 58 56 46 53 28 22 75 6e 69 78 2d 6e 6f 6e  NIXVFS("unix-non
35aa0 65 22 2c 20 20 20 20 20 6e 6f 6c 6f 63 6b 49 6f  e",     nolockIo
35ab0 46 69 6e 64 65 72 20 29 2c 0a 20 20 20 20 55 4e  Finder ),.    UN
35ac0 49 58 56 46 53 28 22 75 6e 69 78 2d 64 6f 74 66  IXVFS("unix-dotf
35ad0 69 6c 65 22 2c 20 20 64 6f 74 6c 6f 63 6b 49 6f  ile",  dotlockIo
35ae0 46 69 6e 64 65 72 20 29 2c 0a 23 69 66 20 4f 53  Finder ),.#if OS
35af0 5f 56 58 57 4f 52 4b 53 0a 20 20 20 20 55 4e 49  _VXWORKS.    UNI
35b00 58 56 46 53 28 22 75 6e 69 78 2d 6e 61 6d 65 64  XVFS("unix-named
35b10 73 65 6d 22 2c 20 73 65 6d 49 6f 46 69 6e 64 65  sem", semIoFinde
35b20 72 20 29 2c 0a 23 65 6e 64 69 66 0a 23 69 66 20  r ),.#endif.#if 
35b30 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f  SQLITE_ENABLE_LO
35b40 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 20 20 20 20  CKING_STYLE.    
35b50 55 4e 49 58 56 46 53 28 22 75 6e 69 78 2d 70 6f  UNIXVFS("unix-po
35b60 73 69 78 22 2c 20 20 20 20 70 6f 73 69 78 49 6f  six",    posixIo
35b70 46 69 6e 64 65 72 20 29 2c 0a 23 69 66 20 21 4f  Finder ),.#if !O
35b80 53 5f 56 58 57 4f 52 4b 53 0a 20 20 20 20 55 4e  S_VXWORKS.    UN
35b90 49 58 56 46 53 28 22 75 6e 69 78 2d 66 6c 6f 63  IXVFS("unix-floc
35ba0 6b 22 2c 20 20 20 20 66 6c 6f 63 6b 49 6f 46 69  k",    flockIoFi
35bb0 6e 64 65 72 20 29 2c 0a 23 65 6e 64 69 66 0a 23  nder ),.#endif.#
35bc0 65 6e 64 69 66 0a 23 69 66 20 53 51 4c 49 54 45  endif.#if SQLITE
35bd0 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f  _ENABLE_LOCKING_
35be0 53 54 59 4c 45 20 26 26 20 64 65 66 69 6e 65 64  STYLE && defined
35bf0 28 5f 5f 41 50 50 4c 45 5f 5f 29 0a 20 20 20 20  (__APPLE__).    
35c00 55 4e 49 58 56 46 53 28 22 75 6e 69 78 2d 61 66  UNIXVFS("unix-af
35c10 70 22 2c 20 20 20 20 20 20 61 66 70 49 6f 46 69  p",      afpIoFi
35c20 6e 64 65 72 20 29 2c 0a 20 20 20 20 55 4e 49 58  nder ),.    UNIX
35c30 56 46 53 28 22 75 6e 69 78 2d 6e 66 73 22 2c 20  VFS("unix-nfs", 
35c40 20 20 20 20 20 6e 66 73 49 6f 46 69 6e 64 65 72       nfsIoFinder
35c50 20 29 2c 0a 20 20 20 20 55 4e 49 58 56 46 53 28   ),.    UNIXVFS(
35c60 22 75 6e 69 78 2d 70 72 6f 78 79 22 2c 20 20 20  "unix-proxy",   
35c70 20 70 72 6f 78 79 49 6f 46 69 6e 64 65 72 20 29   proxyIoFinder )
35c80 2c 0a 23 65 6e 64 69 66 0a 20 20 7d 3b 0a 20 20  ,.#endif.  };.  
35c90 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 69 3b 20  unsigned int i; 
35ca0 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70           /* Loop
35cb0 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 0a 20 20 2f   counter */..  /
35cc0 2a 20 52 65 67 69 73 74 65 72 20 61 6c 6c 20 56  * Register all V
35cd0 46 53 65 73 20 64 65 66 69 6e 65 64 20 69 6e 20  FSes defined in 
35ce0 74 68 65 20 61 56 66 73 5b 5d 20 61 72 72 61 79  the aVfs[] array
35cf0 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69   */.  for(i=0; i
35d00 3c 28 73 69 7a 65 6f 66 28 61 56 66 73 29 2f 73  <(sizeof(aVfs)/s
35d10 69 7a 65 6f 66 28 73 71 6c 69 74 65 33 5f 76 66  izeof(sqlite3_vf
35d20 73 29 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73  s)); i++){.    s
35d30 71 6c 69 74 65 33 5f 76 66 73 5f 72 65 67 69 73  qlite3_vfs_regis
35d40 74 65 72 28 26 61 56 66 73 5b 69 5d 2c 20 69 3d  ter(&aVfs[i], i=
35d50 3d 30 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  =0);.  }.  retur
35d60 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 0a 7d 0a  n SQLITE_OK; .}.
35d70 0a 2f 2a 0a 2a 2a 20 53 68 75 74 64 6f 77 6e 20  ./*.** Shutdown 
35d80 74 68 65 20 6f 70 65 72 61 74 69 6e 67 20 73 79  the operating sy
35d90 73 74 65 6d 20 69 6e 74 65 72 66 61 63 65 2e 0a  stem interface..
35da0 2a 2a 0a 2a 2a 20 53 6f 6d 65 20 6f 70 65 72 61  **.** Some opera
35db0 74 69 6e 67 20 73 79 73 74 65 6d 73 20 6d 69 67  ting systems mig
35dc0 68 74 20 6e 65 65 64 20 74 6f 20 64 6f 20 73 6f  ht need to do so
35dd0 6d 65 20 63 6c 65 61 6e 75 70 20 69 6e 20 74 68  me cleanup in th
35de0 69 73 20 72 6f 75 74 69 6e 65 2c 0a 2a 2a 20 74  is routine,.** t
35df0 6f 20 72 65 6c 65 61 73 65 20 64 79 6e 61 6d 69  o release dynami
35e00 63 61 6c 6c 79 20 61 6c 6c 6f 63 61 74 65 64 20  cally allocated 
35e10 6f 62 6a 65 63 74 73 2e 20 20 42 75 74 20 6e 6f  objects.  But no
35e20 74 20 6f 6e 20 75 6e 69 78 2e 0a 2a 2a 20 54 68  t on unix..** Th
35e30 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20  is routine is a 
35e40 6e 6f 2d 6f 70 20 66 6f 72 20 75 6e 69 78 2e 0a  no-op for unix..
35e50 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 6f  */.int sqlite3_o
35e60 73 5f 65 6e 64 28 76 6f 69 64 29 7b 20 0a 20 20  s_end(void){ .  
35e70 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
35e80 3b 20 0a 7d 0a 20 0a 23 65 6e 64 69 66 20 2f 2a  ; .}. .#endif /*
35e90 20 53 51 4c 49 54 45 5f 4f 53 5f 55 4e 49 58 20   SQLITE_OS_UNIX 
35ea0 2a 2f 0a                                         */.