/ Hex Artifact Content
Login

Artifact f3c0faad1c6de4f06f5ec30d586a4e62a980dc6f:


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 69 6e 74 6f 20 2a 70 69 4e 6f 77 0a 2a  te into *piNow.*
244b0 2a 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 69  * the current ti
244c0 6d 65 20 61 6e 64 20 64 61 74 65 20 61 73 20 61  me and date as a
244d0 20 4a 75 6c 69 61 6e 20 44 61 79 20 6e 75 6d 62   Julian Day numb
244e0 65 72 20 74 69 6d 65 73 20 38 36 5f 34 30 30 5f  er times 86_400_
244f0 30 30 30 2e 20 20 49 6e 0a 2a 2a 20 6f 74 68 65  000.  In.** othe
24500 72 20 77 6f 72 64 73 2c 20 77 72 69 74 65 20 69  r words, write i
24510 6e 74 6f 20 2a 70 69 4e 6f 77 20 74 68 65 20 6e  nto *piNow the n
24520 75 6d 62 65 72 20 6f 66 20 6d 69 6c 6c 69 73 65  umber of millise
24530 63 6f 6e 64 73 20 73 69 6e 63 65 20 74 68 65 20  conds since the 
24540 4a 75 6c 69 61 6e 0a 2a 2a 20 65 70 6f 63 68 20  Julian.** epoch 
24550 6f 66 20 6e 6f 6f 6e 20 69 6e 20 47 72 65 65 6e  of noon in Green
24560 77 69 63 68 20 6f 6e 20 4e 6f 76 65 6d 62 65 72  wich on November
24570 20 32 34 2c 20 34 37 31 34 20 42 2e 43 20 61 63   24, 4714 B.C ac
24580 63 6f 72 64 69 6e 67 20 74 6f 20 74 68 65 0a 2a  cording to the.*
24590 2a 20 70 72 6f 6c 65 70 74 69 63 20 47 72 65 67  * proleptic Greg
245a0 6f 72 69 61 6e 20 63 61 6c 65 6e 64 61 72 2e 0a  orian calendar..
245b0 2a 2a 0a 2a 2a 20 4f 6e 20 73 75 63 63 65 73 73  **.** On success
245c0 2c 20 72 65 74 75 72 6e 20 30 2e 20 20 52 65 74  , return 0.  Ret
245d0 75 72 6e 20 31 20 69 66 20 74 68 65 20 74 69 6d  urn 1 if the tim
245e0 65 20 61 6e 64 20 64 61 74 65 20 63 61 6e 6e 6f  e and date canno
245f0 74 20 62 65 20 66 6f 75 6e 64 2e 0a 2a 2f 0a 73  t be found..*/.s
24600 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 43 75  tatic int unixCu
24610 72 72 65 6e 74 54 69 6d 65 49 6e 74 36 34 28 73  rrentTimeInt64(s
24620 71 6c 69 74 65 33 5f 76 66 73 20 2a 4e 6f 74 55  qlite3_vfs *NotU
24630 73 65 64 2c 20 73 71 6c 69 74 65 33 5f 69 6e 74  sed, sqlite3_int
24640 36 34 20 2a 70 69 4e 6f 77 29 7b 0a 20 20 73 74  64 *piNow){.  st
24650 61 74 69 63 20 63 6f 6e 73 74 20 73 71 6c 69 74  atic const sqlit
24660 65 33 5f 69 6e 74 36 34 20 75 6e 69 78 45 70 6f  e3_int64 unixEpo
24670 63 68 20 3d 20 32 34 34 30 35 38 37 35 2a 28 73  ch = 24405875*(s
24680 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 38 36 34  qlite3_int64)864
24690 30 30 30 30 3b 0a 23 69 66 20 64 65 66 69 6e 65  0000;.#if define
246a0 64 28 4e 4f 5f 47 45 54 54 4f 44 29 0a 20 20 74  d(NO_GETTOD).  t
246b0 69 6d 65 5f 74 20 74 3b 0a 20 20 74 69 6d 65 28  ime_t t;.  time(
246c0 26 74 29 3b 0a 20 20 2a 70 69 4e 6f 77 20 3d 20  &t);.  *piNow = 
246d0 28 28 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 29  ((sqlite3_int64)
246e0 69 29 2a 31 30 30 30 20 2b 20 75 6e 69 78 45 70  i)*1000 + unixEp
246f0 6f 63 68 3b 0a 23 65 6c 69 66 20 4f 53 5f 56 58  och;.#elif OS_VX
24700 57 4f 52 4b 53 0a 20 20 73 74 72 75 63 74 20 74  WORKS.  struct t
24710 69 6d 65 73 70 65 63 20 73 4e 6f 77 3b 0a 20 20  imespec sNow;.  
24720 63 6c 6f 63 6b 5f 67 65 74 74 69 6d 65 28 43 4c  clock_gettime(CL
24730 4f 43 4b 5f 52 45 41 4c 54 49 4d 45 2c 20 26 73  OCK_REALTIME, &s
24740 4e 6f 77 29 3b 0a 20 20 2a 70 69 4e 6f 77 20 3d  Now);.  *piNow =
24750 20 75 6e 69 78 45 70 6f 63 68 20 2b 20 31 30 30   unixEpoch + 100
24760 30 2a 28 73 71 6c 69 74 65 33 5f 69 6e 74 36 34  0*(sqlite3_int64
24770 29 73 4e 6f 77 2e 74 76 5f 73 65 63 20 2b 20 73  )sNow.tv_sec + s
24780 4e 6f 77 2e 74 76 5f 6e 73 65 63 2f 31 30 30 30  Now.tv_nsec/1000
24790 30 30 30 3b 0a 23 65 6c 73 65 0a 20 20 73 74 72  000;.#else.  str
247a0 75 63 74 20 74 69 6d 65 76 61 6c 20 73 4e 6f 77  uct timeval sNow
247b0 3b 0a 20 20 67 65 74 74 69 6d 65 6f 66 64 61 79  ;.  gettimeofday
247c0 28 26 73 4e 6f 77 2c 20 30 29 3b 0a 20 20 2a 70  (&sNow, 0);.  *p
247d0 69 4e 6f 77 20 3d 20 75 6e 69 78 45 70 6f 63 68  iNow = unixEpoch
247e0 20 2b 20 31 30 30 30 2a 28 73 71 6c 69 74 65 33   + 1000*(sqlite3
247f0 5f 69 6e 74 36 34 29 73 4e 6f 77 2e 74 76 5f 73  _int64)sNow.tv_s
24800 65 63 20 2b 20 73 4e 6f 77 2e 74 76 5f 75 73 65  ec + sNow.tv_use
24810 63 2f 31 30 30 30 3b 0a 23 65 6e 64 69 66 0a 0a  c/1000;.#endif..
24820 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45  #ifdef SQLITE_TE
24830 53 54 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  ST.  if( sqlite3
24840 5f 63 75 72 72 65 6e 74 5f 74 69 6d 65 20 29 7b  _current_time ){
24850 0a 20 20 20 20 2a 70 69 4e 6f 77 20 3d 20 31 30  .    *piNow = 10
24860 30 30 2a 28 73 71 6c 69 74 65 33 5f 69 6e 74 36  00*(sqlite3_int6
24870 34 29 73 71 6c 69 74 65 33 5f 63 75 72 72 65 6e  4)sqlite3_curren
24880 74 5f 74 69 6d 65 20 2b 20 75 6e 69 78 45 70 6f  t_time + unixEpo
24890 63 68 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20  ch;.  }.#endif. 
248a0 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
248b0 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20 72 65  R(NotUsed);.  re
248c0 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn 0;.}../*.**
248d0 20 46 69 6e 64 20 74 68 65 20 63 75 72 72 65 6e   Find the curren
248e0 74 20 74 69 6d 65 20 28 69 6e 20 55 6e 69 76 65  t time (in Unive
248f0 72 73 61 6c 20 43 6f 6f 72 64 69 6e 61 74 65 64  rsal Coordinated
24900 20 54 69 6d 65 29 2e 20 20 57 72 69 74 65 20 74   Time).  Write t
24910 68 65 0a 2a 2a 20 63 75 72 72 65 6e 74 20 74 69  he.** current ti
24920 6d 65 20 61 6e 64 20 64 61 74 65 20 61 73 20 61  me and date as a
24930 20 4a 75 6c 69 61 6e 20 44 61 79 20 6e 75 6d 62   Julian Day numb
24940 65 72 20 69 6e 74 6f 20 2a 70 72 4e 6f 77 20 61  er into *prNow a
24950 6e 64 0a 2a 2a 20 72 65 74 75 72 6e 20 30 2e 20  nd.** return 0. 
24960 20 52 65 74 75 72 6e 20 31 20 69 66 20 74 68 65   Return 1 if the
24970 20 74 69 6d 65 20 61 6e 64 20 64 61 74 65 20 63   time and date c
24980 61 6e 6e 6f 74 20 62 65 20 66 6f 75 6e 64 2e 0a  annot be found..
24990 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e  */.static int un
249a0 69 78 43 75 72 72 65 6e 74 54 69 6d 65 28 73 71  ixCurrentTime(sq
249b0 6c 69 74 65 33 5f 76 66 73 20 2a 4e 6f 74 55 73  lite3_vfs *NotUs
249c0 65 64 2c 20 64 6f 75 62 6c 65 20 2a 70 72 4e 6f  ed, double *prNo
249d0 77 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e  w){.  sqlite3_in
249e0 74 36 34 20 69 3b 0a 20 20 75 6e 69 78 43 75 72  t64 i;.  unixCur
249f0 72 65 6e 74 54 69 6d 65 49 6e 74 36 34 28 30 2c  rentTimeInt64(0,
24a00 20 26 69 29 3b 0a 20 20 2a 70 72 4e 6f 77 20 3d   &i);.  *prNow =
24a10 20 69 2a 38 36 34 30 30 30 30 30 2e 30 3b 0a 20   i*86400000.0;. 
24a20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a   return 0;.}../*
24a30 0a 2a 2a 20 57 65 20 61 64 64 65 64 20 74 68 65  .** We added the
24a40 20 78 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29   xGetLastError()
24a50 20 6d 65 74 68 6f 64 20 77 69 74 68 20 74 68 65   method with the
24a60 20 69 6e 74 65 6e 74 69 6f 6e 20 6f 66 20 70 72   intention of pr
24a70 6f 76 69 64 69 6e 67 0a 2a 2a 20 62 65 74 74 65  oviding.** bette
24a80 72 20 6c 6f 77 2d 6c 65 76 65 6c 20 65 72 72 6f  r low-level erro
24a90 72 20 6d 65 73 73 61 67 65 73 20 77 68 65 6e 20  r messages when 
24aa0 6f 70 65 72 61 74 69 6e 67 2d 73 79 73 74 65 6d  operating-system
24ab0 20 70 72 6f 62 6c 65 6d 73 20 63 6f 6d 65 20 75   problems come u
24ac0 70 0a 2a 2a 20 64 75 72 69 6e 67 20 53 51 4c 69  p.** during SQLi
24ad0 74 65 20 6f 70 65 72 61 74 69 6f 6e 2e 20 20 42  te operation.  B
24ae0 75 74 20 73 6f 20 66 61 72 2c 20 6e 6f 6e 65 20  ut so far, none 
24af0 6f 66 20 74 68 61 74 20 68 61 73 20 62 65 65 6e  of that has been
24b00 20 69 6d 70 6c 65 6d 65 6e 74 65 64 0a 2a 2a 20   implemented.** 
24b10 69 6e 20 74 68 65 20 63 6f 72 65 2e 20 20 53 6f  in the core.  So
24b20 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
24b30 20 6e 65 76 65 72 20 63 61 6c 6c 65 64 2e 20 20   never called.  
24b40 46 6f 72 20 6e 6f 77 2c 20 69 74 20 69 73 20 6d  For now, it is m
24b50 65 72 65 6c 79 0a 2a 2a 20 61 20 70 6c 61 63 65  erely.** a place
24b60 2d 68 6f 6c 64 65 72 2e 0a 2a 2f 0a 73 74 61 74  -holder..*/.stat
24b70 69 63 20 69 6e 74 20 75 6e 69 78 47 65 74 4c 61  ic int unixGetLa
24b80 73 74 45 72 72 6f 72 28 73 71 6c 69 74 65 33 5f  stError(sqlite3_
24b90 76 66 73 20 2a 4e 6f 74 55 73 65 64 2c 20 69 6e  vfs *NotUsed, in
24ba0 74 20 4e 6f 74 55 73 65 64 32 2c 20 63 68 61 72  t NotUsed2, char
24bb0 20 2a 4e 6f 74 55 73 65 64 33 29 7b 0a 20 20 55   *NotUsed3){.  U
24bc0 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
24bd0 4e 6f 74 55 73 65 64 29 3b 0a 20 20 55 4e 55 53  NotUsed);.  UNUS
24be0 45 44 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f 74  ED_PARAMETER(Not
24bf0 55 73 65 64 32 29 3b 0a 20 20 55 4e 55 53 45 44  Used2);.  UNUSED
24c00 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f 74 55 73  _PARAMETER(NotUs
24c10 65 64 33 29 3b 0a 20 20 72 65 74 75 72 6e 20 30  ed3);.  return 0
24c20 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  ;.}..#ifndef SQL
24c30 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 0a 2f 2a  ITE_OMIT_WAL../*
24c40 20 46 6f 72 77 61 72 64 20 72 65 66 65 72 65 6e   Forward referen
24c50 63 65 20 2a 2f 0a 74 79 70 65 64 65 66 20 73 74  ce */.typedef st
24c60 72 75 63 74 20 75 6e 69 78 53 68 6d 20 75 6e 69  ruct unixShm uni
24c70 78 53 68 6d 3b 0a 74 79 70 65 64 65 66 20 73 74  xShm;.typedef st
24c80 72 75 63 74 20 75 6e 69 78 53 68 6d 46 69 6c 65  ruct unixShmFile
24c90 20 75 6e 69 78 53 68 6d 46 69 6c 65 3b 0a 0a 2f   unixShmFile;../
24ca0 2a 0a 2a 2a 20 4f 62 6a 65 63 74 20 75 73 65 64  *.** Object used
24cb0 20 74 6f 20 72 65 70 72 65 73 65 6e 74 20 61 20   to represent a 
24cc0 73 69 6e 67 6c 65 20 66 69 6c 65 20 6f 70 65 6e  single file open
24cd0 65 64 20 61 6e 64 20 6d 6d 61 70 70 65 64 20 74  ed and mmapped t
24ce0 6f 20 70 72 6f 76 69 64 65 0a 2a 2a 20 73 68 61  o provide.** sha
24cf0 72 65 64 20 6d 65 6d 6f 72 79 2e 20 20 57 68 65  red memory.  Whe
24d00 6e 20 6d 75 6c 74 69 70 6c 65 20 74 68 72 65 61  n multiple threa
24d10 64 73 20 61 6c 6c 20 72 65 66 65 72 65 6e 63 65  ds all reference
24d20 20 74 68 65 20 73 61 6d 65 0a 2a 2a 20 6c 6f 67   the same.** log
24d30 2d 73 75 6d 6d 61 72 79 2c 20 65 61 63 68 20 74  -summary, each t
24d40 68 72 65 61 64 20 68 61 73 20 69 74 73 20 6f 77  hread has its ow
24d50 6e 20 75 6e 69 78 46 69 6c 65 20 6f 62 6a 65 63  n unixFile objec
24d60 74 2c 20 62 75 74 20 74 68 65 79 20 61 6c 6c 0a  t, but they all.
24d70 2a 2a 20 70 6f 69 6e 74 20 74 6f 20 61 20 73 69  ** point to a si
24d80 6e 67 6c 65 20 69 6e 73 74 61 6e 63 65 20 6f 66  ngle instance of
24d90 20 74 68 69 73 20 6f 62 6a 65 63 74 2e 20 20 49   this object.  I
24da0 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 65  n other words, e
24db0 61 63 68 0a 2a 2a 20 6c 6f 67 2d 73 75 6d 6d 61  ach.** log-summa
24dc0 72 79 20 69 73 20 6f 70 65 6e 65 64 20 6f 6e 6c  ry is opened onl
24dd0 79 20 6f 6e 63 65 20 70 65 72 20 70 72 6f 63 65  y once per proce
24de0 73 73 2e 0a 2a 2a 0a 2a 2a 20 75 6e 69 78 4d 75  ss..**.** unixMu
24df0 74 65 78 48 65 6c 64 28 29 20 6d 75 73 74 20 62  texHeld() must b
24e00 65 20 74 72 75 65 20 77 68 65 6e 20 63 72 65 61  e true when crea
24e10 74 69 6e 67 20 6f 72 20 64 65 73 74 72 6f 79 69  ting or destroyi
24e20 6e 67 0a 2a 2a 20 74 68 69 73 20 6f 62 6a 65 63  ng.** this objec
24e30 74 20 6f 72 20 77 68 69 6c 65 20 72 65 61 64 69  t or while readi
24e40 6e 67 20 6f 72 20 77 72 69 74 69 6e 67 20 74 68  ng or writing th
24e50 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 66 69 65 6c  e following fiel
24e60 64 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 6e  ds:.**.**      n
24e70 52 65 66 0a 2a 2a 20 20 20 20 20 20 70 4e 65 78  Ref.**      pNex
24e80 74 20 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c  t .**.** The fol
24e90 6c 6f 77 69 6e 67 20 66 69 65 6c 64 73 20 61 72  lowing fields ar
24ea0 65 20 72 65 61 64 2d 6f 6e 6c 79 20 61 66 74 65  e read-only afte
24eb0 72 20 74 68 65 20 6f 62 6a 65 63 74 20 69 73 20  r the object is 
24ec0 63 72 65 61 74 65 64 3a 0a 2a 2a 20 0a 2a 2a 20  created:.** .** 
24ed0 20 20 20 20 20 66 69 64 0a 2a 2a 20 20 20 20 20       fid.**     
24ee0 20 7a 46 69 6c 65 6e 61 6d 65 0a 2a 2a 0a 2a 2a   zFilename.**.**
24ef0 20 45 69 74 68 65 72 20 75 6e 69 78 53 68 6d 46   Either unixShmF
24f00 69 6c 65 2e 6d 75 74 65 78 20 6d 75 73 74 20 62  ile.mutex must b
24f10 65 20 68 65 6c 64 20 6f 72 20 75 6e 69 78 53 68  e held or unixSh
24f20 6d 46 69 6c 65 2e 6e 52 65 66 3d 3d 30 20 61 6e  mFile.nRef==0 an
24f30 64 0a 2a 2a 20 75 6e 69 78 4d 75 74 65 78 48 65  d.** unixMutexHe
24f40 6c 64 28 29 20 69 73 20 74 72 75 65 20 77 68 65  ld() is true whe
24f50 6e 20 72 65 61 64 69 6e 67 20 6f 72 20 77 72 69  n reading or wri
24f60 74 69 6e 67 20 61 6e 79 20 6f 74 68 65 72 20 66  ting any other f
24f70 69 65 6c 64 0a 2a 2a 20 69 6e 20 74 68 69 73 20  ield.** in this 
24f80 73 74 72 75 63 74 75 72 65 2e 0a 2a 2a 0a 2a 2a  structure..**.**
24f90 20 54 6f 20 61 76 6f 69 64 20 64 65 61 64 6c 6f   To avoid deadlo
24fa0 63 6b 73 2c 20 6d 75 74 65 78 20 61 6e 64 20 6d  cks, mutex and m
24fb0 75 74 65 78 42 75 66 20 61 72 65 20 61 6c 77 61  utexBuf are alwa
24fc0 79 73 20 72 65 6c 65 61 73 65 64 20 69 6e 20 74  ys released in t
24fd0 68 65 0a 2a 2a 20 72 65 76 65 72 73 65 20 6f 72  he.** reverse or
24fe0 64 65 72 20 74 68 61 74 20 74 68 65 79 20 61 72  der that they ar
24ff0 65 20 61 63 71 75 69 72 65 64 2e 20 20 6d 75 74  e acquired.  mut
25000 65 78 42 75 66 20 69 73 20 61 6c 77 61 79 73 20  exBuf is always 
25010 61 63 71 75 69 72 65 64 0a 2a 2a 20 66 69 72 73  acquired.** firs
25020 74 20 61 6e 64 20 72 65 6c 65 61 73 65 64 20 6c  t and released l
25030 61 73 74 2e 20 20 54 68 69 73 20 69 6e 76 61 72  ast.  This invar
25040 69 61 6e 74 20 69 73 20 63 68 65 63 6b 20 62 79  iant is check by
25050 20 61 73 73 65 72 74 69 6e 67 0a 2a 2a 20 73 71   asserting.** sq
25060 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6e 6f 74 68  lite3_mutex_noth
25070 65 6c 64 28 29 20 6f 6e 20 6d 75 74 65 78 20 77  eld() on mutex w
25080 68 65 6e 65 76 65 72 20 6d 75 74 65 78 42 75 66  henever mutexBuf
25090 20 69 73 20 61 63 71 75 69 72 65 64 20 6f 72 0a   is acquired or.
250a0 2a 2a 20 72 65 6c 65 61 73 65 64 2e 0a 2a 2f 0a  ** released..*/.
250b0 73 74 72 75 63 74 20 75 6e 69 78 53 68 6d 46 69  struct unixShmFi
250c0 6c 65 20 7b 0a 20 20 73 74 72 75 63 74 20 75 6e  le {.  struct un
250d0 69 78 46 69 6c 65 49 64 20 66 69 64 3b 20 20 20  ixFileId fid;   
250e0 20 20 2f 2a 20 55 6e 69 71 75 65 20 66 69 6c 65    /* Unique file
250f0 20 69 64 65 6e 74 69 66 69 65 72 20 2a 2f 0a 20   identifier */. 
25100 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 20 2a   sqlite3_mutex *
25110 6d 75 74 65 78 3b 20 20 20 20 20 20 2f 2a 20 4d  mutex;      /* M
25120 75 74 65 78 20 74 6f 20 61 63 63 65 73 73 20 74  utex to access t
25130 68 69 73 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20  his object */.  
25140 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 20 2a 6d  sqlite3_mutex *m
25150 75 74 65 78 42 75 66 3b 20 20 20 2f 2a 20 4d 75  utexBuf;   /* Mu
25160 74 65 78 20 74 6f 20 61 63 63 65 73 73 20 7a 42  tex to access zB
25170 75 66 5b 5d 20 2a 2f 0a 20 20 63 68 61 72 20 2a  uf[] */.  char *
25180 7a 46 69 6c 65 6e 61 6d 65 3b 20 20 20 20 20 20  zFilename;      
25190 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20       /* Name of 
251a0 74 68 65 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e  the file */.  in
251b0 74 20 68 3b 20 20 20 20 20 20 20 20 20 20 20 20  t h;            
251c0 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 70 65 6e           /* Open
251d0 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
251e0 20 2a 2f 0a 20 20 69 6e 74 20 73 7a 4d 61 70 3b   */.  int szMap;
251f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25200 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68 65 20   /* Size of the 
25210 6d 61 70 70 69 6e 67 20 6f 66 20 66 69 6c 65 20  mapping of file 
25220 69 6e 74 6f 20 6d 65 6d 6f 72 79 20 2a 2f 0a 20  into memory */. 
25230 20 63 68 61 72 20 2a 70 4d 4d 61 70 42 75 66 3b   char *pMMapBuf;
25240 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57              /* W
25250 68 65 72 65 20 63 75 72 72 65 6e 74 6c 79 20 6d  here currently m
25260 6d 61 70 70 65 64 28 29 2e 20 20 4e 55 4c 4c 20  mapped().  NULL 
25270 69 66 20 75 6e 6d 61 70 70 65 64 20 2a 2f 0a 20  if unmapped */. 
25280 20 69 6e 74 20 6e 52 65 66 3b 20 20 20 20 20 20   int nRef;      
25290 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
252a0 75 6d 62 65 72 20 6f 66 20 75 6e 69 78 53 68 6d  umber of unixShm
252b0 20 6f 62 6a 65 63 74 73 20 70 6f 69 6e 74 69 6e   objects pointin
252c0 67 20 74 6f 20 74 68 69 73 20 2a 2f 0a 20 20 75  g to this */.  u
252d0 6e 69 78 53 68 6d 20 2a 70 46 69 72 73 74 3b 20  nixShm *pFirst; 
252e0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c            /* All
252f0 20 75 6e 69 78 53 68 6d 20 6f 62 6a 65 63 74 73   unixShm objects
25300 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68 69   pointing to thi
25310 73 20 2a 2f 0a 20 20 75 6e 69 78 53 68 6d 46 69  s */.  unixShmFi
25320 6c 65 20 2a 70 4e 65 78 74 3b 20 20 20 20 20 20  le *pNext;      
25330 20 20 2f 2a 20 4e 65 78 74 20 69 6e 20 6c 69 73    /* Next in lis
25340 74 20 6f 66 20 61 6c 6c 20 75 6e 69 78 53 68 6d  t of all unixShm
25350 46 69 6c 65 20 6f 62 6a 65 63 74 73 20 2a 2f 0a  File objects */.
25360 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45  #ifdef SQLITE_DE
25370 42 55 47 0a 20 20 75 38 20 65 78 63 6c 4d 61 73  BUG.  u8 exclMas
25380 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  k;              
25390 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 65 78 63 6c   /* Mask of excl
253a0 75 73 69 76 65 20 6c 6f 63 6b 73 20 68 65 6c 64  usive locks held
253b0 20 2a 2f 0a 20 20 75 38 20 73 68 61 72 65 64 4d   */.  u8 sharedM
253c0 61 73 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20  ask;            
253d0 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 73 68 61 72   /* Mask of shar
253e0 65 64 20 6c 6f 63 6b 73 20 68 65 6c 64 20 2a 2f  ed locks held */
253f0 0a 20 20 75 38 20 6e 65 78 74 53 68 6d 49 64 3b  .  u8 nextShmId;
25400 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
25410 20 4e 65 78 74 20 61 76 61 69 6c 61 62 6c 65 20   Next available 
25420 75 6e 69 78 53 68 6d 2e 69 64 20 76 61 6c 75 65  unixShm.id value
25430 20 2a 2f 0a 23 65 6e 64 69 66 0a 7d 3b 0a 0a 2f   */.#endif.};../
25440 2a 0a 2a 2a 20 41 20 67 6c 6f 62 61 6c 20 61 72  *.** A global ar
25450 72 61 79 20 6f 66 20 61 6c 6c 20 75 6e 69 78 53  ray of all unixS
25460 68 6d 46 69 6c 65 20 6f 62 6a 65 63 74 73 2e 0a  hmFile objects..
25470 2a 2a 0a 2a 2a 20 54 68 65 20 75 6e 69 78 4d 75  **.** The unixMu
25480 74 65 78 48 65 6c 64 28 29 20 6d 75 73 74 20 62  texHeld() must b
25490 65 20 74 72 75 65 20 77 68 69 6c 65 20 72 65 61  e true while rea
254a0 64 69 6e 67 20 6f 72 20 77 72 69 74 69 6e 67 20  ding or writing 
254b0 74 68 69 73 20 6c 69 73 74 2e 0a 2a 2f 0a 73 74  this list..*/.st
254c0 61 74 69 63 20 75 6e 69 78 53 68 6d 46 69 6c 65  atic unixShmFile
254d0 20 2a 75 6e 69 78 53 68 6d 46 69 6c 65 4c 69 73   *unixShmFileLis
254e0 74 20 3d 20 30 3b 0a 0a 2f 2a 0a 2a 2a 20 53 74  t = 0;../*.** St
254f0 72 75 63 74 75 72 65 20 75 73 65 64 20 69 6e 74  ructure used int
25500 65 72 6e 61 6c 6c 79 20 62 79 20 74 68 69 73 20  ernally by this 
25510 56 46 53 20 74 6f 20 72 65 63 6f 72 64 20 74 68  VFS to record th
25520 65 20 73 74 61 74 65 20 6f 66 20 61 6e 0a 2a 2a  e state of an.**
25530 20 6f 70 65 6e 20 73 68 61 72 65 64 20 6d 65 6d   open shared mem
25540 6f 72 79 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a  ory connection..
25550 2a 2a 0a 2a 2a 20 75 6e 69 78 53 68 6d 2e 70 46  **.** unixShm.pF
25560 69 6c 65 2d 3e 6d 75 74 65 78 20 6d 75 73 74 20  ile->mutex must 
25570 62 65 20 68 65 6c 64 20 77 68 69 6c 65 20 72 65  be held while re
25580 61 64 69 6e 67 20 6f 72 20 77 72 69 74 69 6e 67  ading or writing
25590 20 74 68 65 0a 2a 2a 20 75 6e 69 78 53 68 6d 2e   the.** unixShm.
255a0 70 4e 65 78 74 20 61 6e 64 20 75 6e 69 78 53 68  pNext and unixSh
255b0 6d 2e 6c 6f 63 6b 73 5b 5d 20 65 6c 65 6d 65 6e  m.locks[] elemen
255c0 74 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 75 6e  ts..**.** The un
255d0 69 78 53 68 6d 2e 70 46 69 6c 65 20 65 6c 65 6d  ixShm.pFile elem
255e0 65 6e 74 20 69 73 20 69 6e 69 74 69 61 6c 69 7a  ent is initializ
255f0 65 64 20 77 68 65 6e 20 74 68 65 20 6f 62 6a 65  ed when the obje
25600 63 74 20 69 73 20 63 72 65 61 74 65 64 0a 2a 2a  ct is created.**
25610 20 61 6e 64 20 69 73 20 72 65 61 64 2d 6f 6e 6c   and is read-onl
25620 79 20 74 68 65 72 65 61 66 74 65 72 2e 0a 2a 2f  y thereafter..*/
25630 0a 73 74 72 75 63 74 20 75 6e 69 78 53 68 6d 20  .struct unixShm 
25640 7b 0a 20 20 75 6e 69 78 53 68 6d 46 69 6c 65 20  {.  unixShmFile 
25650 2a 70 46 69 6c 65 3b 20 20 20 20 20 20 20 20 2f  *pFile;        /
25660 2a 20 54 68 65 20 75 6e 64 65 72 6c 79 69 6e 67  * The underlying
25670 20 75 6e 69 78 53 68 6d 46 69 6c 65 20 6f 62 6a   unixShmFile obj
25680 65 63 74 20 2a 2f 0a 20 20 75 6e 69 78 53 68 6d  ect */.  unixShm
25690 20 2a 70 4e 65 78 74 3b 20 20 20 20 20 20 20 20   *pNext;        
256a0 20 20 20 20 2f 2a 20 4e 65 78 74 20 75 6e 69 78      /* Next unix
256b0 53 68 6d 20 77 69 74 68 20 74 68 65 20 73 61 6d  Shm with the sam
256c0 65 20 75 6e 69 78 53 68 6d 46 69 6c 65 20 2a 2f  e unixShmFile */
256d0 0a 20 20 75 38 20 6c 6f 63 6b 53 74 61 74 65 3b  .  u8 lockState;
256e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
256f0 20 43 75 72 72 65 6e 74 20 6c 6f 63 6b 20 73 74   Current lock st
25700 61 74 65 20 2a 2f 0a 20 20 75 38 20 72 65 61 64  ate */.  u8 read
25710 4c 6f 63 6b 3b 20 20 20 20 20 20 20 20 20 20 20  Lock;           
25720 20 20 20 20 2f 2a 20 57 68 69 63 68 20 6f 66 20      /* Which of 
25730 74 68 65 20 74 77 6f 20 72 65 61 64 2d 6c 6f 63  the two read-loc
25740 6b 20 73 74 61 74 65 73 20 74 6f 20 75 73 65 20  k states to use 
25750 2a 2f 0a 20 20 75 38 20 68 61 73 4d 75 74 65 78  */.  u8 hasMutex
25760 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
25770 2f 2a 20 54 72 75 65 20 69 66 20 68 6f 6c 64 69  /* True if holdi
25780 6e 67 20 74 68 65 20 75 6e 69 78 53 68 6d 46 69  ng the unixShmFi
25790 6c 65 20 6d 75 74 65 78 20 2a 2f 0a 20 20 75 38  le mutex */.  u8
257a0 20 68 61 73 4d 75 74 65 78 42 75 66 3b 20 20 20   hasMutexBuf;   
257b0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
257c0 20 69 66 20 68 6f 6c 64 69 6e 67 20 70 46 69 6c   if holding pFil
257d0 65 2d 3e 6d 75 74 65 78 42 75 66 20 2a 2f 0a 20  e->mutexBuf */. 
257e0 20 75 38 20 73 68 61 72 65 64 4d 61 73 6b 3b 20   u8 sharedMask; 
257f0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d              /* M
25800 61 73 6b 20 6f 66 20 73 68 61 72 65 64 20 6c 6f  ask of shared lo
25810 63 6b 73 20 68 65 6c 64 20 2a 2f 0a 20 20 75 38  cks held */.  u8
25820 20 65 78 63 6c 4d 61 73 6b 3b 20 20 20 20 20 20   exclMask;      
25830 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b           /* Mask
25840 20 6f 66 20 65 78 63 6c 75 73 69 76 65 20 6c 6f   of exclusive lo
25850 63 6b 73 20 68 65 6c 64 20 2a 2f 0a 23 69 66 64  cks held */.#ifd
25860 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
25870 20 20 75 38 20 69 64 3b 20 20 20 20 20 20 20 20    u8 id;        
25880 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
25890 49 64 20 6f 66 20 74 68 69 73 20 63 6f 6e 6e 65  Id of this conne
258a0 63 74 69 6f 6e 20 77 69 74 68 20 69 74 73 20 75  ction with its u
258b0 6e 69 78 53 68 6d 46 69 6c 65 20 2a 2f 0a 23 65  nixShmFile */.#e
258c0 6e 64 69 66 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 53  ndif.};../*.** S
258d0 69 7a 65 20 69 6e 63 72 65 6d 65 6e 74 20 62 79  ize increment by
258e0 20 77 68 69 63 68 20 73 68 61 72 65 64 20 6d 65   which shared me
258f0 6d 6f 72 79 20 67 72 6f 77 73 0a 2a 2f 0a 23 64  mory grows.*/.#d
25900 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 55 4e 49  efine SQLITE_UNI
25910 58 5f 53 48 4d 5f 49 4e 43 52 20 20 34 30 39 36  X_SHM_INCR  4096
25920 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 73 74 61 6e 74  ../*.** Constant
25930 73 20 75 73 65 64 20 66 6f 72 20 6c 6f 63 6b 69  s used for locki
25940 6e 67 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 55 4e  ng.*/.#define UN
25950 49 58 5f 53 48 4d 5f 42 41 53 45 20 20 20 20 20  IX_SHM_BASE     
25960 20 33 32 20 20 20 20 20 20 20 20 2f 2a 20 42 79   32        /* By
25970 74 65 20 6f 66 66 73 65 74 20 6f 66 20 74 68 65  te offset of the
25980 20 66 69 72 73 74 20 6c 6f 63 6b 20 62 79 74 65   first lock byte
25990 20 2a 2f 0a 23 64 65 66 69 6e 65 20 55 4e 49 58   */.#define UNIX
259a0 5f 53 48 4d 5f 4d 55 54 45 58 20 20 20 20 20 30  _SHM_MUTEX     0
259b0 78 30 31 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b  x01      /* Mask
259c0 20 66 6f 72 20 4d 55 54 45 58 20 6c 6f 63 6b 20   for MUTEX lock 
259d0 2a 2f 0a 23 64 65 66 69 6e 65 20 55 4e 49 58 5f  */.#define UNIX_
259e0 53 48 4d 5f 44 4d 53 20 20 20 20 20 20 20 30 78  SHM_DMS       0x
259f0 30 34 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20  04      /* Mask 
25a00 66 6f 72 20 44 65 61 64 2d 4d 61 6e 2d 53 77 69  for Dead-Man-Swi
25a10 74 63 68 20 6c 6f 63 6b 20 2a 2f 0a 23 64 65 66  tch lock */.#def
25a20 69 6e 65 20 55 4e 49 58 5f 53 48 4d 5f 41 20 20  ine UNIX_SHM_A  
25a30 20 20 20 20 20 20 20 30 78 31 30 20 20 20 20 20         0x10     
25a40 20 2f 2a 20 4d 61 73 6b 20 66 6f 72 20 72 65 67   /* Mask for reg
25a50 69 6f 6e 20 6c 6f 63 6b 73 2e 2e 2e 20 2a 2f 0a  ion locks... */.
25a60 23 64 65 66 69 6e 65 20 55 4e 49 58 5f 53 48 4d  #define UNIX_SHM
25a70 5f 42 20 20 20 20 20 20 20 20 20 30 78 32 30 0a  _B         0x20.
25a80 23 64 65 66 69 6e 65 20 55 4e 49 58 5f 53 48 4d  #define UNIX_SHM
25a90 5f 43 20 20 20 20 20 20 20 20 20 30 78 34 30 0a  _C         0x40.
25aa0 23 64 65 66 69 6e 65 20 55 4e 49 58 5f 53 48 4d  #define UNIX_SHM
25ab0 5f 44 20 20 20 20 20 20 20 20 20 30 78 38 30 0a  _D         0x80.
25ac0 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
25ad0 45 42 55 47 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  EBUG./*.** Retur
25ae0 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61  n a pointer to a
25af0 20 6e 75 6c 2d 74 65 72 6d 69 6e 61 74 65 64 20   nul-terminated 
25b00 73 74 72 69 6e 67 20 69 6e 20 73 74 61 74 69 63  string in static
25b10 20 6d 65 6d 6f 72 79 20 74 68 61 74 0a 2a 2a 20   memory that.** 
25b20 64 65 73 63 72 69 62 65 73 20 61 20 6c 6f 63 6b  describes a lock
25b30 69 6e 67 20 6d 61 73 6b 2e 20 20 54 68 65 20 73  ing mask.  The s
25b40 74 72 69 6e 67 20 69 73 20 6f 66 20 74 68 65 20  tring is of the 
25b50 66 6f 72 6d 20 22 4d 53 41 42 43 44 22 20 77 69  form "MSABCD" wi
25b60 74 68 0a 2a 2a 20 65 61 63 68 20 63 68 61 72 61  th.** each chara
25b70 63 74 65 72 20 72 65 70 72 65 73 65 6e 74 69 6e  cter representin
25b80 67 20 61 20 6c 6f 63 6b 2e 20 20 22 4d 22 20 66  g a lock.  "M" f
25b90 6f 72 20 4d 55 54 45 58 2c 20 22 53 22 20 66 6f  or MUTEX, "S" fo
25ba0 72 20 44 4d 53 2c 20 0a 2a 2a 20 61 6e 64 20 22  r DMS, .** and "
25bb0 41 22 20 74 68 72 6f 75 67 68 20 22 44 22 20 66  A" through "D" f
25bc0 6f 72 20 74 68 65 20 72 65 67 69 6f 6e 20 6c 6f  or the region lo
25bd0 63 6b 73 2e 20 20 49 66 20 61 20 6c 6f 63 6b 20  cks.  If a lock 
25be0 69 73 20 68 65 6c 64 2c 20 74 68 65 0a 2a 2a 20  is held, the.** 
25bf0 6c 65 74 74 65 72 20 69 73 20 73 68 6f 77 6e 2e  letter is shown.
25c00 20 20 49 66 20 74 68 65 20 6c 6f 63 6b 20 69 73    If the lock is
25c10 20 6e 6f 74 20 68 65 6c 64 2c 20 74 68 65 20 6c   not held, the l
25c20 65 74 74 65 72 20 69 73 20 63 6f 6e 76 65 72 74  etter is convert
25c30 65 64 0a 2a 2a 20 74 6f 20 22 2e 22 2e 0a 2a 2a  ed.** to "."..**
25c40 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
25c50 20 69 73 20 66 6f 72 20 64 65 62 75 67 67 69 6e   is for debuggin
25c60 67 20 70 75 72 70 6f 73 65 73 20 6f 6e 6c 79 20  g purposes only 
25c70 61 6e 64 20 64 6f 65 73 20 6e 6f 74 20 61 70 70  and does not app
25c80 65 61 72 0a 2a 2a 20 69 6e 20 61 20 70 72 6f 64  ear.** in a prod
25c90 75 63 74 69 6f 6e 20 62 75 69 6c 64 2e 0a 2a 2f  uction build..*/
25ca0 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68  .static const ch
25cb0 61 72 20 2a 75 6e 69 78 53 68 6d 4c 6f 63 6b 53  ar *unixShmLockS
25cc0 74 72 69 6e 67 28 75 38 20 6d 61 73 6b 29 7b 0a  tring(u8 mask){.
25cd0 20 20 73 74 61 74 69 63 20 63 68 61 72 20 7a 42    static char zB
25ce0 75 66 5b 34 38 5d 3b 0a 20 20 73 74 61 74 69 63  uf[48];.  static
25cf0 20 69 6e 74 20 69 42 75 66 20 3d 20 30 3b 0a 20   int iBuf = 0;. 
25d00 20 63 68 61 72 20 2a 7a 3b 0a 0a 20 20 7a 20 3d   char *z;..  z =
25d10 20 26 7a 42 75 66 5b 69 42 75 66 5d 3b 0a 20 20   &zBuf[iBuf];.  
25d20 69 42 75 66 20 2b 3d 20 38 3b 0a 20 20 69 66 28  iBuf += 8;.  if(
25d30 20 69 42 75 66 3e 3d 73 69 7a 65 6f 66 28 7a 42   iBuf>=sizeof(zB
25d40 75 66 29 20 29 20 69 42 75 66 20 3d 20 30 3b 0a  uf) ) iBuf = 0;.
25d50 0a 20 20 7a 5b 30 5d 20 3d 20 28 6d 61 73 6b 20  .  z[0] = (mask 
25d60 26 20 55 4e 49 58 5f 53 48 4d 5f 4d 55 54 45 58  & UNIX_SHM_MUTEX
25d70 29 20 3f 20 27 4d 27 20 3a 20 27 2e 27 3b 0a 20  ) ? 'M' : '.';. 
25d80 20 7a 5b 31 5d 20 3d 20 28 6d 61 73 6b 20 26 20   z[1] = (mask & 
25d90 55 4e 49 58 5f 53 48 4d 5f 44 4d 53 29 20 20 20  UNIX_SHM_DMS)   
25da0 3f 20 27 53 27 20 3a 20 27 2e 27 3b 0a 20 20 7a  ? 'S' : '.';.  z
25db0 5b 32 5d 20 3d 20 28 6d 61 73 6b 20 26 20 55 4e  [2] = (mask & UN
25dc0 49 58 5f 53 48 4d 5f 41 29 20 20 20 20 20 3f 20  IX_SHM_A)     ? 
25dd0 27 41 27 20 3a 20 27 2e 27 3b 0a 20 20 7a 5b 33  'A' : '.';.  z[3
25de0 5d 20 3d 20 28 6d 61 73 6b 20 26 20 55 4e 49 58  ] = (mask & UNIX
25df0 5f 53 48 4d 5f 42 29 20 20 20 20 20 3f 20 27 42  _SHM_B)     ? 'B
25e00 27 20 3a 20 27 2e 27 3b 0a 20 20 7a 5b 34 5d 20  ' : '.';.  z[4] 
25e10 3d 20 28 6d 61 73 6b 20 26 20 55 4e 49 58 5f 53  = (mask & UNIX_S
25e20 48 4d 5f 43 29 20 20 20 20 20 3f 20 27 43 27 20  HM_C)     ? 'C' 
25e30 3a 20 27 2e 27 3b 0a 20 20 7a 5b 35 5d 20 3d 20  : '.';.  z[5] = 
25e40 28 6d 61 73 6b 20 26 20 55 4e 49 58 5f 53 48 4d  (mask & UNIX_SHM
25e50 5f 44 29 20 20 20 20 20 3f 20 27 44 27 20 3a 20  _D)     ? 'D' : 
25e60 27 2e 27 3b 0a 20 20 7a 5b 36 5d 20 3d 20 30 3b  '.';.  z[6] = 0;
25e70 0a 20 20 72 65 74 75 72 6e 20 7a 3b 0a 7d 0a 23  .  return z;.}.#
25e80 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
25e90 44 45 42 55 47 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  DEBUG */../*.** 
25ea0 41 70 70 6c 79 20 70 6f 73 69 78 20 61 64 76 69  Apply posix advi
25eb0 73 6f 72 79 20 6c 6f 63 6b 73 20 66 6f 72 20 61  sory locks for a
25ec0 6c 6c 20 62 79 74 65 73 20 69 64 65 6e 74 69 66  ll bytes identif
25ed0 69 65 64 20 69 6e 20 6c 6f 63 6b 4d 61 73 6b 2e  ied in lockMask.
25ee0 0a 2a 2a 0a 2a 2a 20 6c 6f 63 6b 4d 61 73 6b 20  .**.** lockMask 
25ef0 6d 69 67 68 74 20 63 6f 6e 74 61 69 6e 20 6d 75  might contain mu
25f00 6c 74 69 70 6c 65 20 62 69 74 73 20 62 75 74 20  ltiple bits but 
25f10 61 6c 6c 20 62 69 74 73 20 61 72 65 20 67 75 61  all bits are gua
25f20 72 61 6e 74 65 65 64 0a 2a 2a 20 74 6f 20 62 65  ranteed.** to be
25f30 20 63 6f 6e 74 69 67 75 6f 75 73 2e 0a 2a 2a 0a   contiguous..**.
25f40 2a 2a 20 4c 6f 63 6b 73 20 62 6c 6f 63 6b 20 69  ** Locks block i
25f50 66 20 74 68 65 20 55 4e 49 58 5f 53 48 4d 5f 4d  f the UNIX_SHM_M
25f60 55 54 45 58 20 62 69 74 20 69 73 20 73 65 74 20  UTEX bit is set 
25f70 61 6e 64 20 61 72 65 20 6e 6f 6e 2d 62 6c 6f 63  and are non-bloc
25f80 6b 69 6e 67 0a 2a 2a 20 6f 74 68 65 72 77 69 73  king.** otherwis
25f90 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
25fa0 20 75 6e 69 78 53 68 6d 53 79 73 74 65 6d 4c 6f   unixShmSystemLo
25fb0 63 6b 28 0a 20 20 75 6e 69 78 53 68 6d 46 69 6c  ck(.  unixShmFil
25fc0 65 20 2a 70 46 69 6c 65 2c 20 20 20 2f 2a 20 41  e *pFile,   /* A
25fd0 70 70 6c 79 20 6c 6f 63 6b 73 20 74 6f 20 74 68  pply locks to th
25fe0 69 73 20 6f 70 65 6e 20 73 68 61 72 65 64 2d 6d  is open shared-m
25ff0 65 6d 6f 72 79 20 73 65 67 6d 65 6e 74 20 2a 2f  emory segment */
26000 0a 20 20 69 6e 74 20 6c 6f 63 6b 54 79 70 65 2c  .  int lockType,
26010 20 20 20 20 20 20 20 20 20 2f 2a 20 46 5f 55 4e           /* F_UN
26020 4c 43 4b 2c 20 46 5f 52 44 4c 43 4b 2c 20 6f 72  LCK, F_RDLCK, or
26030 20 46 5f 57 52 4c 43 4b 20 2a 2f 0a 20 20 75 38   F_WRLCK */.  u8
26040 20 6c 6f 63 6b 4d 61 73 6b 20 20 20 20 20 20 20   lockMask       
26050 20 20 20 20 2f 2a 20 57 68 69 63 68 20 62 79 74      /* Which byt
26060 65 73 20 74 6f 20 6c 6f 63 6b 20 6f 72 20 75 6e  es to lock or un
26070 6c 6f 63 6b 20 2a 2f 0a 29 7b 0a 20 20 73 74 72  lock */.){.  str
26080 75 63 74 20 66 6c 6f 63 6b 20 66 3b 20 20 20 20  uct flock f;    
26090 20 20 20 2f 2a 20 54 68 65 20 70 6f 73 69 78 20     /* The posix 
260a0 61 64 76 69 73 6f 72 79 20 6c 6f 63 6b 69 6e 67  advisory locking
260b0 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 20 20   structure */.  
260c0 69 6e 74 20 6c 6f 63 6b 4f 70 3b 20 20 20 20 20  int lockOp;     
260d0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6f 70 63        /* The opc
260e0 6f 64 65 20 66 6f 72 20 66 63 6e 74 6c 28 29 20  ode for fcntl() 
260f0 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20  */.  int i;     
26100 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66             /* Of
26110 66 73 65 74 20 69 6e 74 6f 20 74 68 65 20 6c 6f  fset into the lo
26120 63 6b 69 6e 67 20 62 79 74 65 20 72 61 6e 67 65  cking byte range
26130 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20   */.  int rc;   
26140 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
26150 65 73 75 6c 74 20 63 6f 64 65 20 66 6f 72 6d 20  esult code form 
26160 66 63 6e 74 6c 28 29 20 2a 2f 0a 20 20 75 38 20  fcntl() */.  u8 
26170 6d 61 73 6b 3b 20 20 20 20 20 20 20 20 20 20 20  mask;           
26180 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 62 69     /* Mask of bi
26190 74 73 20 69 6e 20 6c 6f 63 6b 4d 61 73 6b 20 2a  ts in lockMask *
261a0 2f 0a 0a 20 20 2f 2a 20 41 63 63 65 73 73 20 74  /..  /* Access t
261b0 6f 20 74 68 65 20 75 6e 69 78 53 68 6d 46 69 6c  o the unixShmFil
261c0 65 20 6f 62 6a 65 63 74 20 69 73 20 73 65 72 69  e object is seri
261d0 61 6c 69 7a 65 64 20 62 79 20 74 68 65 20 63 61  alized by the ca
261e0 6c 6c 65 72 20 2a 2f 0a 20 20 61 73 73 65 72 74  ller */.  assert
261f0 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
26200 68 65 6c 64 28 70 46 69 6c 65 2d 3e 6d 75 74 65  held(pFile->mute
26210 78 29 20 7c 7c 20 70 46 69 6c 65 2d 3e 6e 52 65  x) || pFile->nRe
26220 66 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 49 6e  f==0 );..  /* In
26230 69 74 69 61 6c 69 7a 65 20 74 68 65 20 6c 6f 63  itialize the loc
26240 6b 69 6e 67 20 70 61 72 61 6d 65 74 65 72 73 20  king parameters 
26250 2a 2f 0a 20 20 6d 65 6d 73 65 74 28 26 66 2c 20  */.  memset(&f, 
26260 30 2c 20 73 69 7a 65 6f 66 28 66 29 29 3b 0a 20  0, sizeof(f));. 
26270 20 66 2e 6c 5f 74 79 70 65 20 3d 20 6c 6f 63 6b   f.l_type = lock
26280 54 79 70 65 3b 0a 20 20 66 2e 6c 5f 77 68 65 6e  Type;.  f.l_when
26290 63 65 20 3d 20 53 45 45 4b 5f 53 45 54 3b 0a 20  ce = SEEK_SET;. 
262a0 20 69 66 28 20 28 6c 6f 63 6b 4d 61 73 6b 20 26   if( (lockMask &
262b0 20 55 4e 49 58 5f 53 48 4d 5f 4d 55 54 45 58 29   UNIX_SHM_MUTEX)
262c0 21 3d 30 20 26 26 20 6c 6f 63 6b 54 79 70 65 21  !=0 && lockType!
262d0 3d 46 5f 55 4e 4c 43 4b 20 29 7b 0a 20 20 20 20  =F_UNLCK ){.    
262e0 6c 6f 63 6b 4f 70 20 3d 20 46 5f 53 45 54 4c 4b  lockOp = F_SETLK
262f0 57 3b 0a 20 20 20 20 4f 53 54 52 41 43 45 28 28  W;.    OSTRACE((
26300 22 53 48 4d 2d 4c 4f 43 4b 20 72 65 71 75 65 73  "SHM-LOCK reques
26310 74 69 6e 67 20 62 6c 6f 63 6b 69 6e 67 20 6c 6f  ting blocking lo
26320 63 6b 5c 6e 22 29 29 3b 0a 20 20 7d 65 6c 73 65  ck\n"));.  }else
26330 7b 0a 20 20 20 20 6c 6f 63 6b 4f 70 20 3d 20 46  {.    lockOp = F
26340 5f 53 45 54 4c 4b 3b 0a 20 20 7d 0a 0a 20 20 2f  _SETLK;.  }..  /
26350 2a 20 46 69 6e 64 20 74 68 65 20 66 69 72 73 74  * Find the first
26360 20 62 69 74 20 69 6e 20 6c 6f 63 6b 4d 61 73 6b   bit in lockMask
26370 20 74 68 61 74 20 69 73 20 73 65 74 20 2a 2f 0a   that is set */.
26380 20 20 66 6f 72 28 69 3d 30 2c 20 6d 61 73 6b 3d    for(i=0, mask=
26390 30 78 30 31 3b 20 6d 61 73 6b 21 3d 30 20 26 26  0x01; mask!=0 &&
263a0 20 28 6c 6f 63 6b 4d 61 73 6b 26 6d 61 73 6b 29   (lockMask&mask)
263b0 3d 3d 30 3b 20 6d 61 73 6b 20 3c 3c 3d 20 31 2c  ==0; mask <<= 1,
263c0 20 69 2b 2b 29 7b 7d 0a 20 20 61 73 73 65 72 74   i++){}.  assert
263d0 28 20 6d 61 73 6b 21 3d 30 20 29 3b 0a 20 20 66  ( mask!=0 );.  f
263e0 2e 6c 5f 73 74 61 72 74 20 3d 20 69 2b 55 4e 49  .l_start = i+UNI
263f0 58 5f 53 48 4d 5f 42 41 53 45 3b 0a 20 20 66 2e  X_SHM_BASE;.  f.
26400 6c 5f 6c 65 6e 20 3d 20 31 3b 0a 0a 20 20 2f 2a  l_len = 1;..  /*
26410 20 45 78 74 65 6e 64 20 74 68 65 20 6c 6f 63 6b   Extend the lock
26420 69 6e 67 20 72 61 6e 67 65 20 66 6f 72 20 65 61  ing range for ea
26430 63 68 20 61 64 64 69 74 69 6f 6e 61 6c 20 62 69  ch additional bi
26440 74 20 74 68 61 74 20 69 73 20 73 65 74 20 2a 2f  t that is set */
26450 0a 20 20 6d 61 73 6b 20 3c 3c 3d 20 31 3b 0a 20  .  mask <<= 1;. 
26460 20 77 68 69 6c 65 28 20 6d 61 73 6b 21 3d 30 20   while( mask!=0 
26470 26 26 20 28 6c 6f 63 6b 4d 61 73 6b 20 26 20 6d  && (lockMask & m
26480 61 73 6b 29 21 3d 30 20 29 7b 0a 20 20 20 20 66  ask)!=0 ){.    f
26490 2e 6c 5f 6c 65 6e 2b 2b 3b 0a 20 20 20 20 6d 61  .l_len++;.    ma
264a0 73 6b 20 3c 3c 3d 20 31 3b 0a 20 20 7d 0a 0a 20  sk <<= 1;.  }.. 
264b0 20 2f 2a 20 56 65 72 69 66 79 20 74 68 61 74 20   /* Verify that 
264c0 61 6c 6c 20 62 69 74 73 20 73 65 74 20 69 6e 20  all bits set in 
264d0 6c 6f 63 6b 4d 61 73 6b 20 61 72 65 20 63 6f 6e  lockMask are con
264e0 74 69 67 75 6f 75 73 20 2a 2f 0a 20 20 61 73 73  tiguous */.  ass
264f0 65 72 74 28 20 6d 61 73 6b 3d 3d 30 20 7c 7c 20  ert( mask==0 || 
26500 28 6c 6f 63 6b 4d 61 73 6b 20 26 20 7e 28 6d 61  (lockMask & ~(ma
26510 73 6b 20 7c 20 28 6d 61 73 6b 2d 31 29 29 29 3d  sk | (mask-1)))=
26520 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 41 63 71 75  =0 );..  /* Acqu
26530 69 72 65 20 74 68 65 20 73 79 73 74 65 6d 2d 6c  ire the system-l
26540 65 76 65 6c 20 6c 6f 63 6b 20 2a 2f 0a 20 20 72  evel lock */.  r
26550 63 20 3d 20 66 63 6e 74 6c 28 70 46 69 6c 65 2d  c = fcntl(pFile-
26560 3e 68 2c 20 6c 6f 63 6b 4f 70 2c 20 26 66 29 3b  >h, lockOp, &f);
26570 0a 20 20 72 63 20 3d 20 28 72 63 21 3d 28 2d 31  .  rc = (rc!=(-1
26580 29 29 20 3f 20 53 51 4c 49 54 45 5f 4f 4b 20 3a  )) ? SQLITE_OK :
26590 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 0a 20   SQLITE_BUSY;.. 
265a0 20 2f 2a 20 55 70 64 61 74 65 20 74 68 65 20 67   /* Update the g
265b0 6c 6f 62 61 6c 20 6c 6f 63 6b 20 73 74 61 74 65  lobal lock state
265c0 20 61 6e 64 20 64 6f 20 64 65 62 75 67 20 74 72   and do debug tr
265d0 61 63 69 6e 67 20 2a 2f 0a 23 69 66 64 65 66 20  acing */.#ifdef 
265e0 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 4f  SQLITE_DEBUG.  O
265f0 53 54 52 41 43 45 28 28 22 53 48 4d 2d 4c 4f 43  STRACE(("SHM-LOC
26600 4b 20 22 29 29 3b 0a 20 20 69 66 28 20 72 63 3d  K "));.  if( rc=
26610 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
26620 20 20 69 66 28 20 6c 6f 63 6b 54 79 70 65 3d 3d    if( lockType==
26630 46 5f 55 4e 4c 43 4b 20 29 7b 0a 20 20 20 20 20  F_UNLCK ){.     
26640 20 4f 53 54 52 41 43 45 28 28 22 75 6e 6c 6f 63   OSTRACE(("unloc
26650 6b 20 6f 6b 22 29 29 3b 0a 20 20 20 20 20 20 70  k ok"));.      p
26660 46 69 6c 65 2d 3e 65 78 63 6c 4d 61 73 6b 20 26  File->exclMask &
26670 3d 20 7e 6c 6f 63 6b 4d 61 73 6b 3b 0a 20 20 20  = ~lockMask;.   
26680 20 20 20 70 46 69 6c 65 2d 3e 73 68 61 72 65 64     pFile->shared
26690 4d 61 73 6b 20 26 3d 20 7e 6c 6f 63 6b 4d 61 73  Mask &= ~lockMas
266a0 6b 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  k;.    }else if(
266b0 20 6c 6f 63 6b 54 79 70 65 3d 3d 46 5f 52 44 4c   lockType==F_RDL
266c0 43 4b 20 29 7b 0a 20 20 20 20 20 20 4f 53 54 52  CK ){.      OSTR
266d0 41 43 45 28 28 22 72 65 61 64 2d 6c 6f 63 6b 20  ACE(("read-lock 
266e0 6f 6b 22 29 29 3b 0a 20 20 20 20 20 20 70 46 69  ok"));.      pFi
266f0 6c 65 2d 3e 65 78 63 6c 4d 61 73 6b 20 26 3d 20  le->exclMask &= 
26700 7e 6c 6f 63 6b 4d 61 73 6b 3b 0a 20 20 20 20 20  ~lockMask;.     
26710 20 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 4d 61   pFile->sharedMa
26720 73 6b 20 7c 3d 20 6c 6f 63 6b 4d 61 73 6b 3b 0a  sk |= lockMask;.
26730 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
26740 20 61 73 73 65 72 74 28 20 6c 6f 63 6b 54 79 70   assert( lockTyp
26750 65 3d 3d 46 5f 57 52 4c 43 4b 20 29 3b 0a 20 20  e==F_WRLCK );.  
26760 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 77 72      OSTRACE(("wr
26770 69 74 65 2d 6c 6f 63 6b 20 6f 6b 22 29 29 3b 0a  ite-lock ok"));.
26780 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 65 78 63        pFile->exc
26790 6c 4d 61 73 6b 20 7c 3d 20 6c 6f 63 6b 4d 61 73  lMask |= lockMas
267a0 6b 3b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e  k;.      pFile->
267b0 73 68 61 72 65 64 4d 61 73 6b 20 26 3d 20 7e 6c  sharedMask &= ~l
267c0 6f 63 6b 4d 61 73 6b 3b 0a 20 20 20 20 7d 0a 20  ockMask;.    }. 
267d0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 66 28 20   }else{.    if( 
267e0 6c 6f 63 6b 54 79 70 65 3d 3d 46 5f 55 4e 4c 43  lockType==F_UNLC
267f0 4b 20 29 7b 0a 20 20 20 20 20 20 4f 53 54 52 41  K ){.      OSTRA
26800 43 45 28 28 22 75 6e 6c 6f 63 6b 20 66 61 69 6c  CE(("unlock fail
26810 65 64 22 29 29 3b 0a 20 20 20 20 7d 65 6c 73 65  ed"));.    }else
26820 20 69 66 28 20 6c 6f 63 6b 54 79 70 65 3d 3d 46   if( lockType==F
26830 5f 52 44 4c 43 4b 20 29 7b 0a 20 20 20 20 20 20  _RDLCK ){.      
26840 4f 53 54 52 41 43 45 28 28 22 72 65 61 64 2d 6c  OSTRACE(("read-l
26850 6f 63 6b 20 66 61 69 6c 65 64 22 29 29 3b 0a 20  ock failed"));. 
26860 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
26870 61 73 73 65 72 74 28 20 6c 6f 63 6b 54 79 70 65  assert( lockType
26880 3d 3d 46 5f 57 52 4c 43 4b 20 29 3b 0a 20 20 20  ==F_WRLCK );.   
26890 20 20 20 4f 53 54 52 41 43 45 28 28 22 77 72 69     OSTRACE(("wri
268a0 74 65 2d 6c 6f 63 6b 20 66 61 69 6c 65 64 22 29  te-lock failed")
268b0 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 4f  );.    }.  }.  O
268c0 53 54 52 41 43 45 28 28 22 20 2d 20 63 68 61 6e  STRACE((" - chan
268d0 67 65 20 72 65 71 75 65 73 74 65 64 20 25 73 20  ge requested %s 
268e0 2d 20 61 66 74 65 72 77 61 72 64 73 20 25 73 3a  - afterwards %s:
268f0 25 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  %s\n",.         
26900 20 20 75 6e 69 78 53 68 6d 4c 6f 63 6b 53 74 72    unixShmLockStr
26910 69 6e 67 28 6c 6f 63 6b 4d 61 73 6b 29 2c 0a 20  ing(lockMask),. 
26920 20 20 20 20 20 20 20 20 20 20 75 6e 69 78 53 68            unixSh
26930 6d 4c 6f 63 6b 53 74 72 69 6e 67 28 70 46 69 6c  mLockString(pFil
26940 65 2d 3e 73 68 61 72 65 64 4d 61 73 6b 29 2c 0a  e->sharedMask),.
26950 20 20 20 20 20 20 20 20 20 20 20 75 6e 69 78 53             unixS
26960 68 6d 4c 6f 63 6b 53 74 72 69 6e 67 28 70 46 69  hmLockString(pFi
26970 6c 65 2d 3e 65 78 63 6c 4d 61 73 6b 29 29 29 3b  le->exclMask)));
26980 0a 23 65 6e 64 69 66 0a 0a 20 20 72 65 74 75 72  .#endif..  retur
26990 6e 20 72 63 3b 20 20 20 20 20 20 20 20 0a 7d 0a  n rc;        .}.
269a0 0a 2f 2a 0a 2a 2a 20 46 6f 72 20 63 6f 6e 6e 65  ./*.** For conne
269b0 63 74 69 6f 6e 20 70 2c 20 75 6e 6c 6f 63 6b 20  ction p, unlock 
269c0 61 6c 6c 20 6f 66 20 74 68 65 20 6c 6f 63 6b 73  all of the locks
269d0 20 69 64 65 6e 74 69 66 69 65 64 20 62 79 20 74   identified by t
269e0 68 65 20 75 6e 6c 6f 63 6b 4d 61 73 6b 0a 2a 2a  he unlockMask.**
269f0 20 70 61 72 61 6d 65 74 65 72 2e 0a 2a 2f 0a 73   parameter..*/.s
26a00 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 53 68  tatic int unixSh
26a10 6d 55 6e 6c 6f 63 6b 28 0a 20 20 75 6e 69 78 53  mUnlock(.  unixS
26a20 68 6d 46 69 6c 65 20 2a 70 46 69 6c 65 2c 20 20  hmFile *pFile,  
26a30 20 2f 2a 20 54 68 65 20 75 6e 64 65 72 6c 79 69   /* The underlyi
26a40 6e 67 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79  ng shared-memory
26a50 20 66 69 6c 65 20 2a 2f 0a 20 20 75 6e 69 78 53   file */.  unixS
26a60 68 6d 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20  hm *p,          
26a70 20 2f 2a 20 54 68 65 20 63 6f 6e 6e 65 63 74 69   /* The connecti
26a80 6f 6e 20 74 6f 20 62 65 20 75 6e 6c 6f 63 6b 65  on to be unlocke
26a90 64 20 2a 2f 0a 20 20 75 38 20 75 6e 6c 6f 63 6b  d */.  u8 unlock
26aa0 4d 61 73 6b 20 20 20 20 20 20 20 20 20 2f 2a 20  Mask         /* 
26ab0 4d 61 73 6b 20 6f 66 20 6c 6f 63 6b 73 20 74 6f  Mask of locks to
26ac0 20 62 65 20 75 6e 6c 6f 63 6b 65 64 20 2a 2f 0a   be unlocked */.
26ad0 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20  ){.  int rc;    
26ae0 20 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64 65    /* Result code
26af0 20 2a 2f 0a 20 20 75 6e 69 78 53 68 6d 20 2a 70   */.  unixShm *p
26b00 58 3b 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e  X; /* For loopin
26b10 67 20 6f 76 65 72 20 61 6c 6c 20 73 69 62 6c 69  g over all sibli
26b20 6e 67 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 2a  ng connections *
26b30 2f 0a 20 20 75 38 20 61 6c 6c 4d 61 73 6b 3b 20  /.  u8 allMask; 
26b40 20 2f 2a 20 55 6e 69 6f 6e 20 6f 66 20 6c 6f 63   /* Union of loc
26b50 6b 73 20 68 65 6c 64 20 62 79 20 63 6f 6e 6e 65  ks held by conne
26b60 63 74 69 6f 6e 73 20 6f 74 68 65 72 20 74 68 61  ctions other tha
26b70 6e 20 22 70 22 20 2a 2f 0a 0a 20 20 2f 2a 20 41  n "p" */..  /* A
26b80 63 63 65 73 73 20 74 6f 20 74 68 65 20 75 6e 69  ccess to the uni
26b90 78 53 68 6d 46 69 6c 65 20 6f 62 6a 65 63 74 20  xShmFile object 
26ba0 69 73 20 73 65 72 69 61 6c 69 7a 65 64 20 62 79  is serialized by
26bb0 20 74 68 65 20 63 61 6c 6c 65 72 20 2a 2f 0a 20   the caller */. 
26bc0 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
26bd0 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 46 69 6c  _mutex_held(pFil
26be0 65 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 0a 20 20  e->mutex) );..  
26bf0 2f 2a 20 43 6f 6d 70 75 74 65 20 6c 6f 63 6b 73  /* Compute locks
26c00 20 68 65 6c 64 20 62 79 20 73 69 62 6c 69 6e 67   held by sibling
26c10 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 2a 2f 0a   connections */.
26c20 20 20 61 6c 6c 4d 61 73 6b 20 3d 20 30 3b 0a 20    allMask = 0;. 
26c30 20 66 6f 72 28 70 58 3d 70 46 69 6c 65 2d 3e 70   for(pX=pFile->p
26c40 46 69 72 73 74 3b 20 70 58 3b 20 70 58 3d 70 58  First; pX; pX=pX
26c50 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 69 66  ->pNext){.    if
26c60 28 20 70 58 3d 3d 70 20 29 20 63 6f 6e 74 69 6e  ( pX==p ) contin
26c70 75 65 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  ue;.    assert( 
26c80 28 70 58 2d 3e 65 78 63 6c 4d 61 73 6b 20 26 20  (pX->exclMask & 
26c90 28 70 2d 3e 65 78 63 6c 4d 61 73 6b 7c 70 2d 3e  (p->exclMask|p->
26ca0 73 68 61 72 65 64 4d 61 73 6b 29 29 3d 3d 30 20  sharedMask))==0 
26cb0 29 3b 0a 20 20 20 20 61 6c 6c 4d 61 73 6b 20 7c  );.    allMask |
26cc0 3d 20 70 58 2d 3e 73 68 61 72 65 64 4d 61 73 6b  = pX->sharedMask
26cd0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 55 6e 6c 6f  ;.  }..  /* Unlo
26ce0 63 6b 20 74 68 65 20 73 79 73 74 65 6d 2d 6c 65  ck the system-le
26cf0 76 65 6c 20 6c 6f 63 6b 73 20 2a 2f 0a 20 20 69  vel locks */.  i
26d00 66 28 20 28 75 6e 6c 6f 63 6b 4d 61 73 6b 20 26  f( (unlockMask &
26d10 20 61 6c 6c 4d 61 73 6b 29 21 3d 75 6e 6c 6f 63   allMask)!=unloc
26d20 6b 4d 61 73 6b 20 29 7b 0a 20 20 20 20 72 63 20  kMask ){.    rc 
26d30 3d 20 75 6e 69 78 53 68 6d 53 79 73 74 65 6d 4c  = unixShmSystemL
26d40 6f 63 6b 28 70 46 69 6c 65 2c 20 46 5f 55 4e 4c  ock(pFile, F_UNL
26d50 43 4b 2c 20 75 6e 6c 6f 63 6b 4d 61 73 6b 20 26  CK, unlockMask &
26d60 20 7e 61 6c 6c 4d 61 73 6b 29 3b 0a 20 20 7d 65   ~allMask);.  }e
26d70 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 53 51  lse{.    rc = SQ
26d80 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20  LITE_OK;.  }..  
26d90 2f 2a 20 55 6e 64 6f 20 74 68 65 20 6c 6f 63 61  /* Undo the loca
26da0 6c 20 6c 6f 63 6b 73 20 2a 2f 0a 20 20 69 66 28  l locks */.  if(
26db0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
26dc0 7b 0a 20 20 20 20 70 2d 3e 65 78 63 6c 4d 61 73  {.    p->exclMas
26dd0 6b 20 26 3d 20 7e 75 6e 6c 6f 63 6b 4d 61 73 6b  k &= ~unlockMask
26de0 3b 0a 20 20 20 20 70 2d 3e 73 68 61 72 65 64 4d  ;.    p->sharedM
26df0 61 73 6b 20 26 3d 20 7e 75 6e 6c 6f 63 6b 4d 61  ask &= ~unlockMa
26e00 73 6b 3b 0a 20 20 7d 20 0a 20 20 72 65 74 75 72  sk;.  } .  retur
26e10 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47  n rc;.}../*.** G
26e20 65 74 20 72 65 61 64 65 72 20 6c 6f 63 6b 73 20  et reader locks 
26e30 66 6f 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 70  for connection p
26e40 20 6f 6e 20 61 6c 6c 20 6c 6f 63 6b 73 20 69 6e   on all locks in
26e50 20 74 68 65 20 72 65 61 64 4d 61 73 6b 20 70 61   the readMask pa
26e60 72 61 6d 65 74 65 72 2e 0a 2a 2f 0a 73 74 61 74  rameter..*/.stat
26e70 69 63 20 69 6e 74 20 75 6e 69 78 53 68 6d 53 68  ic int unixShmSh
26e80 61 72 65 64 4c 6f 63 6b 28 0a 20 20 75 6e 69 78  aredLock(.  unix
26e90 53 68 6d 46 69 6c 65 20 2a 70 46 69 6c 65 2c 20  ShmFile *pFile, 
26ea0 20 20 2f 2a 20 54 68 65 20 75 6e 64 65 72 6c 79    /* The underly
26eb0 69 6e 67 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72  ing shared-memor
26ec0 79 20 66 69 6c 65 20 2a 2f 0a 20 20 75 6e 69 78  y file */.  unix
26ed0 53 68 6d 20 2a 70 2c 20 20 20 20 20 20 20 20 20  Shm *p,         
26ee0 20 20 2f 2a 20 54 68 65 20 63 6f 6e 6e 65 63 74    /* The connect
26ef0 69 6f 6e 20 74 6f 20 67 65 74 20 74 68 65 20 73  ion to get the s
26f00 68 61 72 65 64 20 6c 6f 63 6b 73 20 2a 2f 0a 20  hared locks */. 
26f10 20 75 38 20 72 65 61 64 4d 61 73 6b 20 20 20 20   u8 readMask    
26f20 20 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f         /* Mask o
26f30 66 20 73 68 61 72 65 64 20 6c 6f 63 6b 73 20 74  f shared locks t
26f40 6f 20 62 65 20 61 63 71 75 69 72 65 64 20 2a 2f  o be acquired */
26f50 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20  .){.  int rc;   
26f60 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 20 63       /* Result c
26f70 6f 64 65 20 2a 2f 0a 20 20 75 6e 69 78 53 68 6d  ode */.  unixShm
26f80 20 2a 70 58 3b 20 20 20 2f 2a 20 46 6f 72 20 6c   *pX;   /* For l
26f90 6f 6f 70 69 6e 67 20 6f 76 65 72 20 61 6c 6c 20  ooping over all 
26fa0 73 69 62 6c 69 6e 67 20 63 6f 6e 6e 65 63 74 69  sibling connecti
26fb0 6f 6e 73 20 2a 2f 0a 20 20 75 38 20 61 6c 6c 53  ons */.  u8 allS
26fc0 68 61 72 65 64 3b 20 20 2f 2a 20 55 6e 69 6f 6e  hared;  /* Union
26fd0 20 6f 66 20 6c 6f 63 6b 73 20 68 65 6c 64 20 62   of locks held b
26fe0 79 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 6f 74  y connections ot
26ff0 68 65 72 20 74 68 61 6e 20 22 70 22 20 2a 2f 0a  her than "p" */.
27000 0a 20 20 2f 2a 20 41 63 63 65 73 73 20 74 6f 20  .  /* Access to 
27010 74 68 65 20 75 6e 69 78 53 68 6d 46 69 6c 65 20  the unixShmFile 
27020 6f 62 6a 65 63 74 20 69 73 20 73 65 72 69 61 6c  object is serial
27030 69 7a 65 64 20 62 79 20 74 68 65 20 63 61 6c 6c  ized by the call
27040 65 72 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  er */.  assert( 
27050 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
27060 6c 64 28 70 46 69 6c 65 2d 3e 6d 75 74 65 78 29  ld(pFile->mutex)
27070 20 29 3b 0a 0a 20 20 2f 2a 20 46 69 6e 64 20 6f   );..  /* Find o
27080 75 74 20 77 68 69 63 68 20 73 68 61 72 65 64 20  ut which shared 
27090 6c 6f 63 6b 73 20 61 72 65 20 61 6c 72 65 61 64  locks are alread
270a0 79 20 68 65 6c 64 20 62 79 20 73 69 62 6c 69 6e  y held by siblin
270b0 67 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 2e 0a 20  g connections.. 
270c0 20 2a 2a 20 49 66 20 61 6e 79 20 73 69 62 6c 69   ** If any sibli
270d0 6e 67 20 61 6c 72 65 61 64 79 20 68 6f 6c 64 73  ng already holds
270e0 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f   an exclusive lo
270f0 63 6b 2c 20 67 6f 20 61 68 65 61 64 20 61 6e 64  ck, go ahead and
27100 20 72 65 74 75 72 6e 0a 20 20 2a 2a 20 53 51 4c   return.  ** SQL
27110 49 54 45 5f 42 55 53 59 2e 0a 20 20 2a 2f 0a 20  ITE_BUSY..  */. 
27120 20 61 6c 6c 53 68 61 72 65 64 20 3d 20 30 3b 0a   allShared = 0;.
27130 20 20 66 6f 72 28 70 58 3d 70 46 69 6c 65 2d 3e    for(pX=pFile->
27140 70 46 69 72 73 74 3b 20 70 58 3b 20 70 58 3d 70  pFirst; pX; pX=p
27150 58 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 69  X->pNext){.    i
27160 66 28 20 70 58 3d 3d 70 20 29 20 63 6f 6e 74 69  f( pX==p ) conti
27170 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 28 70 58  nue;.    if( (pX
27180 2d 3e 65 78 63 6c 4d 61 73 6b 20 26 20 72 65 61  ->exclMask & rea
27190 64 4d 61 73 6b 29 21 3d 30 20 29 20 72 65 74 75  dMask)!=0 ) retu
271a0 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a  rn SQLITE_BUSY;.
271b0 20 20 20 20 61 6c 6c 53 68 61 72 65 64 20 7c 3d      allShared |=
271c0 20 70 58 2d 3e 73 68 61 72 65 64 4d 61 73 6b 3b   pX->sharedMask;
271d0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 47 65 74 20 73  .  }..  /* Get s
271e0 68 61 72 65 64 20 6c 6f 63 6b 73 20 61 74 20 74  hared locks at t
271f0 68 65 20 73 79 73 74 65 6d 20 6c 65 76 65 6c 2c  he system level,
27200 20 69 66 20 6e 65 63 65 73 73 61 72 79 20 2a 2f   if necessary */
27210 0a 20 20 69 66 28 20 28 7e 61 6c 6c 53 68 61 72  .  if( (~allShar
27220 65 64 29 20 26 20 72 65 61 64 4d 61 73 6b 20 29  ed) & readMask )
27230 7b 0a 20 20 20 20 72 63 20 3d 20 75 6e 69 78 53  {.    rc = unixS
27240 68 6d 53 79 73 74 65 6d 4c 6f 63 6b 28 70 46 69  hmSystemLock(pFi
27250 6c 65 2c 20 46 5f 52 44 4c 43 4b 2c 20 72 65 61  le, F_RDLCK, rea
27260 64 4d 61 73 6b 29 3b 0a 20 20 7d 65 6c 73 65 7b  dMask);.  }else{
27270 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
27280 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 47  _OK;.  }..  /* G
27290 65 74 20 74 68 65 20 6c 6f 63 61 6c 20 73 68 61  et the local sha
272a0 72 65 64 20 6c 6f 63 6b 73 20 2a 2f 0a 20 20 69  red locks */.  i
272b0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
272c0 20 29 7b 0a 20 20 20 20 70 2d 3e 73 68 61 72 65   ){.    p->share
272d0 64 4d 61 73 6b 20 7c 3d 20 72 65 61 64 4d 61 73  dMask |= readMas
272e0 6b 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  k;.  }.  return 
272f0 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 6f 72  rc;.}../*.** For
27300 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 70 2c 20 67   connection p, g
27310 65 74 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20  et an exclusive 
27320 6c 6f 63 6b 20 6f 6e 20 61 6c 6c 20 6c 6f 63 6b  lock on all lock
27330 73 20 69 64 65 6e 74 69 66 69 65 64 20 69 6e 0a  s identified in.
27340 2a 2a 20 74 68 65 20 77 72 69 74 65 4d 61 73 6b  ** the writeMask
27350 20 70 61 72 61 6d 65 74 65 72 2e 0a 2a 2f 0a 73   parameter..*/.s
27360 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 53 68  tatic int unixSh
27370 6d 45 78 63 6c 75 73 69 76 65 4c 6f 63 6b 28 0a  mExclusiveLock(.
27380 20 20 75 6e 69 78 53 68 6d 46 69 6c 65 20 2a 70    unixShmFile *p
27390 46 69 6c 65 2c 20 20 20 20 2f 2a 20 54 68 65 20  File,    /* The 
273a0 75 6e 64 65 72 6c 79 69 6e 67 20 73 68 61 72 65  underlying share
273b0 64 2d 6d 65 6d 6f 72 79 20 66 69 6c 65 20 2a 2f  d-memory file */
273c0 0a 20 20 75 6e 69 78 53 68 6d 20 2a 70 2c 20 20  .  unixShm *p,  
273d0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
273e0 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 67   connection to g
273f0 65 74 20 74 68 65 20 65 78 63 6c 75 73 69 76 65  et the exclusive
27400 20 6c 6f 63 6b 73 20 2a 2f 0a 20 20 75 38 20 77   locks */.  u8 w
27410 72 69 74 65 4d 61 73 6b 20 20 20 20 20 20 20 20  riteMask        
27420 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 65 78     /* Mask of ex
27430 63 6c 75 73 69 76 65 20 6c 6f 63 6b 73 20 74 6f  clusive locks to
27440 20 62 65 20 61 63 71 75 69 72 65 64 20 2a 2f 0a   be acquired */.
27450 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20  ){.  int rc;    
27460 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f      /* Result co
27470 64 65 20 2a 2f 0a 20 20 75 6e 69 78 53 68 6d 20  de */.  unixShm 
27480 2a 70 58 3b 20 20 20 2f 2a 20 46 6f 72 20 6c 6f  *pX;   /* For lo
27490 6f 70 69 6e 67 20 6f 76 65 72 20 61 6c 6c 20 73  oping over all s
274a0 69 62 6c 69 6e 67 20 63 6f 6e 6e 65 63 74 69 6f  ibling connectio
274b0 6e 73 20 2a 2f 0a 0a 20 20 2f 2a 20 41 63 63 65  ns */..  /* Acce
274c0 73 73 20 74 6f 20 74 68 65 20 75 6e 69 78 53 68  ss to the unixSh
274d0 6d 46 69 6c 65 20 6f 62 6a 65 63 74 20 69 73 20  mFile object is 
274e0 73 65 72 69 61 6c 69 7a 65 64 20 62 79 20 74 68  serialized by th
274f0 65 20 63 61 6c 6c 65 72 20 2a 2f 0a 20 20 61 73  e caller */.  as
27500 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
27510 74 65 78 5f 68 65 6c 64 28 70 46 69 6c 65 2d 3e  tex_held(pFile->
27520 6d 75 74 65 78 29 20 29 3b 0a 0a 20 20 2f 2a 20  mutex) );..  /* 
27530 4d 61 6b 65 20 73 75 72 65 20 6e 6f 20 73 69 62  Make sure no sib
27540 6c 69 6e 67 20 63 6f 6e 6e 65 63 74 69 6f 6e 73  ling connections
27550 20 68 6f 6c 64 20 6c 6f 63 6b 73 20 74 68 61 74   hold locks that
27560 20 77 69 6c 6c 20 62 6c 6f 63 6b 20 74 68 69 73   will block this
27570 0a 20 20 2a 2a 20 6c 6f 63 6b 2e 20 20 49 66 20  .  ** lock.  If 
27580 61 6e 79 20 64 6f 2c 20 72 65 74 75 72 6e 20 53  any do, return S
27590 51 4c 49 54 45 5f 42 55 53 59 20 72 69 67 68 74  QLITE_BUSY right
275a0 20 61 77 61 79 2e 0a 20 20 2a 2f 0a 20 20 66 6f   away..  */.  fo
275b0 72 28 70 58 3d 70 46 69 6c 65 2d 3e 70 46 69 72  r(pX=pFile->pFir
275c0 73 74 3b 20 70 58 3b 20 70 58 3d 70 58 2d 3e 70  st; pX; pX=pX->p
275d0 4e 65 78 74 29 7b 0a 20 20 20 20 69 66 28 20 70  Next){.    if( p
275e0 58 3d 3d 70 20 29 20 63 6f 6e 74 69 6e 75 65 3b  X==p ) continue;
275f0 0a 20 20 20 20 69 66 28 20 28 70 58 2d 3e 65 78  .    if( (pX->ex
27600 63 6c 4d 61 73 6b 20 26 20 77 72 69 74 65 4d 61  clMask & writeMa
27610 73 6b 29 21 3d 30 20 29 20 72 65 74 75 72 6e 20  sk)!=0 ) return 
27620 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20  SQLITE_BUSY;.   
27630 20 69 66 28 20 28 70 58 2d 3e 73 68 61 72 65 64   if( (pX->shared
27640 4d 61 73 6b 20 26 20 77 72 69 74 65 4d 61 73 6b  Mask & writeMask
27650 29 21 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51  )!=0 ) return SQ
27660 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 7d 0a 0a  LITE_BUSY;.  }..
27670 20 20 2f 2a 20 47 65 74 20 74 68 65 20 65 78 63    /* Get the exc
27680 6c 75 73 69 76 65 20 6c 6f 63 6b 73 20 61 74 20  lusive locks at 
27690 74 68 65 20 73 79 73 74 65 6d 20 6c 65 76 65 6c  the system level
276a0 2e 20 20 54 68 65 6e 20 69 66 20 73 75 63 63 65  .  Then if succe
276b0 73 73 66 75 6c 0a 20 20 2a 2a 20 61 6c 73 6f 20  ssful.  ** also 
276c0 6d 61 72 6b 20 74 68 65 20 6c 6f 63 61 6c 20 63  mark the local c
276d0 6f 6e 6e 65 63 74 69 6f 6e 20 61 73 20 62 65 69  onnection as bei
276e0 6e 67 20 6c 6f 63 6b 65 64 2e 0a 20 20 2a 2f 0a  ng locked..  */.
276f0 20 20 72 63 20 3d 20 75 6e 69 78 53 68 6d 53 79    rc = unixShmSy
27700 73 74 65 6d 4c 6f 63 6b 28 70 46 69 6c 65 2c 20  stemLock(pFile, 
27710 46 5f 57 52 4c 43 4b 2c 20 77 72 69 74 65 4d 61  F_WRLCK, writeMa
27720 73 6b 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53  sk);.  if( rc==S
27730 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
27740 70 2d 3e 73 68 61 72 65 64 4d 61 73 6b 20 26 3d  p->sharedMask &=
27750 20 7e 77 72 69 74 65 4d 61 73 6b 3b 0a 20 20 20   ~writeMask;.   
27760 20 70 2d 3e 65 78 63 6c 4d 61 73 6b 20 7c 3d 20   p->exclMask |= 
27770 77 72 69 74 65 4d 61 73 6b 3b 0a 20 20 7d 0a 20  writeMask;.  }. 
27780 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
27790 2a 0a 2a 2a 20 50 75 72 67 65 20 74 68 65 20 75  *.** Purge the u
277a0 6e 69 78 53 68 6d 46 69 6c 65 4c 69 73 74 20 6c  nixShmFileList l
277b0 69 73 74 20 6f 66 20 61 6c 6c 20 65 6e 74 72 69  ist of all entri
277c0 65 73 20 77 69 74 68 20 75 6e 69 78 53 68 6d 46  es with unixShmF
277d0 69 6c 65 2e 6e 52 65 66 3d 3d 30 2e 0a 2a 2a 0a  ile.nRef==0..**.
277e0 2a 2a 20 54 68 69 73 20 69 73 20 6e 6f 74 20 61  ** This is not a
277f0 20 56 46 53 20 73 68 61 72 65 64 2d 6d 65 6d 6f   VFS shared-memo
27800 72 79 20 6d 65 74 68 6f 64 3b 20 69 74 20 69 73  ry method; it is
27810 20 61 20 75 74 69 6c 69 74 79 20 66 75 6e 63 74   a utility funct
27820 69 6f 6e 20 63 61 6c 6c 65 64 0a 2a 2a 20 62 79  ion called.** by
27830 20 56 46 53 20 73 68 61 72 65 64 2d 6d 65 6d 6f   VFS shared-memo
27840 72 79 20 6d 65 74 68 6f 64 73 2e 0a 2a 2f 0a 73  ry methods..*/.s
27850 74 61 74 69 63 20 76 6f 69 64 20 75 6e 69 78 53  tatic void unixS
27860 68 6d 50 75 72 67 65 28 76 6f 69 64 29 7b 0a 20  hmPurge(void){. 
27870 20 75 6e 69 78 53 68 6d 46 69 6c 65 20 2a 2a 70   unixShmFile **p
27880 70 3b 0a 20 20 75 6e 69 78 53 68 6d 46 69 6c 65  p;.  unixShmFile
27890 20 2a 70 3b 0a 20 20 61 73 73 65 72 74 28 20 75   *p;.  assert( u
278a0 6e 69 78 4d 75 74 65 78 48 65 6c 64 28 29 20 29  nixMutexHeld() )
278b0 3b 0a 20 20 70 70 20 3d 20 26 75 6e 69 78 53 68  ;.  pp = &unixSh
278c0 6d 46 69 6c 65 4c 69 73 74 3b 0a 20 20 77 68 69  mFileList;.  whi
278d0 6c 65 28 20 28 70 20 3d 20 2a 70 70 29 21 3d 30  le( (p = *pp)!=0
278e0 20 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 6e   ){.    if( p->n
278f0 52 65 66 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  Ref==0 ){.      
27900 69 66 28 20 70 2d 3e 6d 75 74 65 78 20 29 20 73  if( p->mutex ) s
27910 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 66 72 65  qlite3_mutex_fre
27920 65 28 70 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 20  e(p->mutex);.   
27930 20 20 20 69 66 28 20 70 2d 3e 6d 75 74 65 78 42     if( p->mutexB
27940 75 66 20 29 20 73 71 6c 69 74 65 33 5f 6d 75 74  uf ) sqlite3_mut
27950 65 78 5f 66 72 65 65 28 70 2d 3e 6d 75 74 65 78  ex_free(p->mutex
27960 42 75 66 29 3b 0a 20 20 20 20 20 20 69 66 28 20  Buf);.      if( 
27970 70 2d 3e 68 3e 3d 30 20 29 20 63 6c 6f 73 65 28  p->h>=0 ) close(
27980 70 2d 3e 68 29 3b 0a 20 20 20 20 20 20 2a 70 70  p->h);.      *pp
27990 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a 20 20 20   = p->pNext;.   
279a0 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
279b0 70 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  p);.    }else{. 
279c0 20 20 20 20 20 70 70 20 3d 20 26 70 2d 3e 70 4e       pp = &p->pN
279d0 65 78 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d  ext;.    }.  }.}
279e0 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20 73  ../*.** Open a s
279f0 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 61 72 65  hared-memory are
27a00 61 2e 20 20 54 68 69 73 20 70 61 72 74 69 63 75  a.  This particu
27a10 6c 61 72 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  lar implementati
27a20 6f 6e 20 75 73 65 73 0a 2a 2a 20 6d 6d 61 70 70  on uses.** mmapp
27a30 65 64 20 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20  ed files..**.** 
27a40 7a 4e 61 6d 65 20 69 73 20 61 20 66 69 6c 65 6e  zName is a filen
27a50 61 6d 65 20 75 73 65 64 20 74 6f 20 69 64 65 6e  ame used to iden
27a60 74 69 66 79 20 74 68 65 20 73 68 61 72 65 64 2d  tify the shared-
27a70 6d 65 6d 6f 72 79 20 61 72 65 61 2e 20 20 54 68  memory area.  Th
27a80 65 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 61 74  e.** implementat
27a90 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 20 28 61 6e  ion does not (an
27aa0 64 20 70 65 72 68 61 70 73 20 73 68 6f 75 6c 64  d perhaps should
27ab0 20 6e 6f 74 29 20 75 73 65 20 74 68 69 73 20 6e   not) use this n
27ac0 61 6d 65 0a 2a 2a 20 64 69 72 65 63 74 6c 79 2c  ame.** directly,
27ad0 20 62 75 74 20 72 61 74 68 65 72 20 75 73 65 20   but rather use 
27ae0 69 74 20 61 73 20 61 20 74 65 6d 70 6c 61 74 65  it as a template
27af0 20 66 6f 72 20 66 69 6e 64 69 6e 67 20 61 6e 20   for finding an 
27b00 61 70 70 72 6f 70 72 69 61 74 65 0a 2a 2a 20 6e  appropriate.** n
27b10 61 6d 65 20 66 6f 72 20 74 68 65 20 73 68 61 72  ame for the shar
27b20 65 64 2d 6d 65 6d 6f 72 79 20 73 74 6f 72 61 67  ed-memory storag
27b30 65 2e 20 20 49 6e 20 74 68 69 73 20 69 6d 70 6c  e.  In this impl
27b40 65 6d 65 6e 74 61 74 69 6f 6e 2c 20 74 68 65 0a  ementation, the.
27b50 2a 2a 20 73 74 72 69 6e 67 20 22 2d 69 6e 64 65  ** string "-inde
27b60 78 22 20 69 73 20 61 70 70 65 6e 64 65 64 20 74  x" is appended t
27b70 6f 20 7a 4e 61 6d 65 20 61 6e 64 20 75 73 65 64  o zName and used
27b80 20 61 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20   as the name of 
27b90 74 68 65 0a 2a 2a 20 6d 6d 61 70 70 65 64 20 66  the.** mmapped f
27ba0 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20  ile..**.** When 
27bb0 6f 70 65 6e 69 6e 67 20 61 20 6e 65 77 20 73 68  opening a new sh
27bc0 61 72 65 64 2d 6d 65 6d 6f 72 79 20 66 69 6c 65  ared-memory file
27bd0 2c 20 69 66 20 6e 6f 20 6f 74 68 65 72 20 69 6e  , if no other in
27be0 73 74 61 6e 63 65 73 20 6f 66 20 74 68 61 74 0a  stances of that.
27bf0 2a 2a 20 66 69 6c 65 20 61 72 65 20 63 75 72 72  ** file are curr
27c00 65 6e 74 6c 79 20 6f 70 65 6e 2c 20 69 6e 20 74  ently open, in t
27c10 68 69 73 20 70 72 6f 63 65 73 73 20 6f 72 20 69  his process or i
27c20 6e 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 65  n other processe
27c30 73 2c 20 74 68 65 6e 0a 2a 2a 20 74 68 65 20 66  s, then.** the f
27c40 69 6c 65 20 6d 75 73 74 20 62 65 20 74 72 75 6e  ile must be trun
27c50 63 61 74 65 64 20 74 6f 20 7a 65 72 6f 20 6c 65  cated to zero le
27c60 6e 67 74 68 20 6f 72 20 68 61 76 65 20 69 74 73  ngth or have its
27c70 20 68 65 61 64 65 72 20 63 6c 65 61 72 65 64 2e   header cleared.
27c80 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75  .*/.static int u
27c90 6e 69 78 53 68 6d 4f 70 65 6e 28 0a 20 20 73 71  nixShmOpen(.  sq
27ca0 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c  lite3_vfs *pVfs,
27cb0 20 20 20 20 2f 2a 20 54 68 65 20 56 46 53 20 2a      /* The VFS *
27cc0 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
27cd0 7a 4e 61 6d 65 2c 20 20 20 20 2f 2a 20 42 61 73  zName,    /* Bas
27ce0 65 20 6e 61 6d 65 20 6f 66 20 66 69 6c 65 20 74  e name of file t
27cf0 6f 20 6d 6d 61 70 20 2a 2f 0a 20 20 73 71 6c 69  o mmap */.  sqli
27d00 74 65 33 5f 73 68 6d 20 2a 2a 70 53 68 6d 20 20  te3_shm **pShm  
27d10 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 75    /* Write the u
27d20 6e 69 78 53 68 6d 20 6f 62 6a 65 63 74 20 63 72  nixShm object cr
27d30 65 61 74 65 64 20 68 65 72 65 20 2a 2f 0a 29 7b  eated here */.){
27d40 0a 20 20 73 74 72 75 63 74 20 75 6e 69 78 53 68  .  struct unixSh
27d50 6d 20 2a 70 20 3d 20 30 3b 20 20 20 20 20 20 20  m *p = 0;       
27d60 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 6e        /* The con
27d70 6e 65 63 74 69 6f 6e 20 74 6f 20 62 65 20 6f 70  nection to be op
27d80 65 6e 65 64 20 2a 2f 0a 20 20 73 74 72 75 63 74  ened */.  struct
27d90 20 75 6e 69 78 53 68 6d 46 69 6c 65 20 2a 70 46   unixShmFile *pF
27da0 69 6c 65 20 3d 20 30 3b 20 20 20 20 20 2f 2a 20  ile = 0;     /* 
27db0 54 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 6d  The underlying m
27dc0 6d 61 70 70 65 64 20 66 69 6c 65 20 2a 2f 0a 20  mapped file */. 
27dd0 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20   int rc;        
27de0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27df0 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f      /* Result co
27e00 64 65 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 75  de */.  struct u
27e10 6e 69 78 46 69 6c 65 49 64 20 66 69 64 3b 20 20  nixFileId fid;  
27e20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55 6e             /* Un
27e30 69 78 20 66 69 6c 65 20 69 64 65 6e 74 69 66 69  ix file identifi
27e40 65 72 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 75  er */.  struct u
27e50 6e 69 78 53 68 6d 46 69 6c 65 20 2a 70 4e 65 77  nixShmFile *pNew
27e60 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65  ;          /* Ne
27e70 77 6c 79 20 61 6c 6c 6f 63 61 74 65 64 20 70 46  wly allocated pF
27e80 69 6c 65 20 2a 2f 0a 20 20 73 74 72 75 63 74 20  ile */.  struct 
27e90 73 74 61 74 20 73 53 74 61 74 3b 20 20 20 20 20  stat sStat;     
27ea0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
27eb0 65 73 75 6c 74 20 66 72 6f 6d 20 73 74 61 74 28  esult from stat(
27ec0 29 20 61 6e 20 66 73 74 61 74 28 29 20 2a 2f 0a  ) an fstat() */.
27ed0 20 20 69 6e 74 20 6e 4e 61 6d 65 3b 20 20 20 20    int nName;    
27ee0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27ef0 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20       /* Size of 
27f00 7a 4e 61 6d 65 20 69 6e 20 62 79 74 65 73 20 2a  zName in bytes *
27f10 2f 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65  /..  /* Allocate
27f20 20 73 70 61 63 65 20 66 6f 72 20 74 68 65 20 6e   space for the n
27f30 65 77 20 73 71 6c 69 74 65 33 5f 73 68 6d 20 6f  ew sqlite3_shm o
27f40 62 6a 65 63 74 2e 20 20 41 6c 73 6f 20 73 70 65  bject.  Also spe
27f50 63 75 6c 61 74 69 76 65 6c 79 0a 20 20 2a 2a 20  culatively.  ** 
27f60 61 6c 6c 6f 63 61 74 65 20 73 70 61 63 65 20 66  allocate space f
27f70 6f 72 20 61 20 6e 65 77 20 75 6e 69 78 53 68 6d  or a new unixShm
27f80 46 69 6c 65 20 61 6e 64 20 66 69 6c 65 6e 61 6d  File and filenam
27f90 65 2e 0a 20 20 2a 2f 0a 20 20 70 20 3d 20 73 71  e..  */.  p = sq
27fa0 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 20 73 69  lite3_malloc( si
27fb0 7a 65 6f 66 28 2a 70 29 20 29 3b 0a 20 20 69 66  zeof(*p) );.  if
27fc0 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  ( p==0 ) return 
27fd0 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
27fe0 6d 65 6d 73 65 74 28 70 2c 20 30 2c 20 73 69 7a  memset(p, 0, siz
27ff0 65 6f 66 28 2a 70 29 29 3b 0a 20 20 6e 4e 61 6d  eof(*p));.  nNam
28000 65 20 3d 20 73 74 72 6c 65 6e 28 7a 4e 61 6d 65  e = strlen(zName
28010 29 3b 0a 20 20 70 4e 65 77 20 3d 20 73 71 6c 69  );.  pNew = sqli
28020 74 65 33 5f 6d 61 6c 6c 6f 63 28 20 73 69 7a 65  te3_malloc( size
28030 6f 66 28 2a 70 46 69 6c 65 29 20 2b 20 6e 4e 61  of(*pFile) + nNa
28040 6d 65 20 2b 20 31 30 20 29 3b 0a 20 20 69 66 28  me + 10 );.  if(
28050 20 70 4e 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20   pNew==0 ){.    
28060 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  rc = SQLITE_NOME
28070 4d 3b 0a 20 20 20 20 67 6f 74 6f 20 73 68 6d 5f  M;.    goto shm_
28080 6f 70 65 6e 5f 65 72 72 3b 0a 20 20 7d 0a 20 20  open_err;.  }.  
28090 6d 65 6d 73 65 74 28 70 4e 65 77 2c 20 30 2c 20  memset(pNew, 0, 
280a0 73 69 7a 65 6f 66 28 2a 70 4e 65 77 29 29 3b 0a  sizeof(*pNew));.
280b0 20 20 70 4e 65 77 2d 3e 7a 46 69 6c 65 6e 61 6d    pNew->zFilenam
280c0 65 20 3d 20 28 63 68 61 72 2a 29 26 70 4e 65 77  e = (char*)&pNew
280d0 5b 31 5d 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73  [1];.  sqlite3_s
280e0 6e 70 72 69 6e 74 66 28 6e 4e 61 6d 65 2b 31 30  nprintf(nName+10
280f0 2c 20 70 4e 65 77 2d 3e 7a 46 69 6c 65 6e 61 6d  , pNew->zFilenam
28100 65 2c 20 22 25 73 2d 69 6e 64 65 78 22 2c 20 7a  e, "%s-index", z
28110 4e 61 6d 65 29 3b 0a 0a 20 20 2f 2a 20 4c 6f 6f  Name);..  /* Loo
28120 6b 20 74 6f 20 73 65 65 20 69 66 20 74 68 65 72  k to see if ther
28130 65 20 69 73 20 61 6e 20 65 78 69 73 74 69 6e 67  e is an existing
28140 20 75 6e 69 78 53 68 6d 46 69 6c 65 20 74 68 61   unixShmFile tha
28150 74 20 63 61 6e 20 62 65 20 75 73 65 64 2e 0a 20  t can be used.. 
28160 20 2a 2a 20 49 66 20 6e 6f 20 6d 61 74 63 68 69   ** If no matchi
28170 6e 67 20 75 6e 69 78 53 68 6d 46 69 6c 65 20 63  ng unixShmFile c
28180 75 72 72 65 6e 74 6c 79 20 65 78 69 73 74 73 2c  urrently exists,
28190 20 63 72 65 61 74 65 20 61 20 6e 65 77 20 6f 6e   create a new on
281a0 65 2e 0a 20 20 2a 2f 0a 20 20 75 6e 69 78 45 6e  e..  */.  unixEn
281b0 74 65 72 4d 75 74 65 78 28 29 3b 0a 20 20 72 63  terMutex();.  rc
281c0 20 3d 20 73 74 61 74 28 70 4e 65 77 2d 3e 7a 46   = stat(pNew->zF
281d0 69 6c 65 6e 61 6d 65 2c 20 26 73 53 74 61 74 29  ilename, &sStat)
281e0 3b 0a 20 20 69 66 28 20 72 63 3d 3d 30 20 29 7b  ;.  if( rc==0 ){
281f0 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 66 69 64  .    memset(&fid
28200 2c 20 30 2c 20 73 69 7a 65 6f 66 28 66 69 64 29  , 0, sizeof(fid)
28210 29 3b 0a 20 20 20 20 66 69 64 2e 64 65 76 20 3d  );.    fid.dev =
28220 20 73 53 74 61 74 2e 73 74 5f 64 65 76 3b 0a 20   sStat.st_dev;. 
28230 20 20 20 66 69 64 2e 69 6e 6f 20 3d 20 73 53 74     fid.ino = sSt
28240 61 74 2e 73 74 5f 69 6e 6f 3b 0a 20 20 20 20 66  at.st_ino;.    f
28250 6f 72 28 70 46 69 6c 65 20 3d 20 75 6e 69 78 53  or(pFile = unixS
28260 68 6d 46 69 6c 65 4c 69 73 74 3b 20 70 46 69 6c  hmFileList; pFil
28270 65 3b 20 70 46 69 6c 65 3d 70 46 69 6c 65 2d 3e  e; pFile=pFile->
28280 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 69 66  pNext){.      if
28290 28 20 6d 65 6d 63 6d 70 28 26 70 46 69 6c 65 2d  ( memcmp(&pFile-
282a0 3e 66 69 64 2c 20 26 66 69 64 2c 20 73 69 7a 65  >fid, &fid, size
282b0 6f 66 28 66 69 64 29 29 3d 3d 30 20 29 20 62 72  of(fid))==0 ) br
282c0 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  eak;.    }.  }. 
282d0 20 69 66 28 20 70 46 69 6c 65 20 29 7b 0a 20 20   if( pFile ){.  
282e0 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
282f0 4e 65 77 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  New);.  }else{. 
28300 20 20 20 70 46 69 6c 65 20 3d 20 70 4e 65 77 3b     pFile = pNew;
28310 0a 20 20 20 20 70 4e 65 77 20 3d 20 30 3b 0a 20  .    pNew = 0;. 
28320 20 20 20 70 46 69 6c 65 2d 3e 68 20 3d 20 2d 31     pFile->h = -1
28330 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 70 4e 65  ;.    pFile->pNe
28340 78 74 20 3d 20 75 6e 69 78 53 68 6d 46 69 6c 65  xt = unixShmFile
28350 4c 69 73 74 3b 0a 20 20 20 20 75 6e 69 78 53 68  List;.    unixSh
28360 6d 46 69 6c 65 4c 69 73 74 20 3d 20 70 46 69 6c  mFileList = pFil
28370 65 3b 0a 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6d  e;..    pFile->m
28380 75 74 65 78 20 3d 20 73 71 6c 69 74 65 33 5f 6d  utex = sqlite3_m
28390 75 74 65 78 5f 61 6c 6c 6f 63 28 53 51 4c 49 54  utex_alloc(SQLIT
283a0 45 5f 4d 55 54 45 58 5f 46 41 53 54 29 3b 0a 20  E_MUTEX_FAST);. 
283b0 20 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 6d 75     if( pFile->mu
283c0 74 65 78 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  tex==0 ){.      
283d0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  rc = SQLITE_NOME
283e0 4d 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 73 68  M;.      goto sh
283f0 6d 5f 6f 70 65 6e 5f 65 72 72 3b 0a 20 20 20 20  m_open_err;.    
28400 7d 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6d 75 74  }.    pFile->mut
28410 65 78 42 75 66 20 3d 20 73 71 6c 69 74 65 33 5f  exBuf = sqlite3_
28420 6d 75 74 65 78 5f 61 6c 6c 6f 63 28 53 51 4c 49  mutex_alloc(SQLI
28430 54 45 5f 4d 55 54 45 58 5f 46 41 53 54 29 3b 0a  TE_MUTEX_FAST);.
28440 20 20 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 6d      if( pFile->m
28450 75 74 65 78 42 75 66 3d 3d 30 20 29 7b 0a 20 20  utexBuf==0 ){.  
28460 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
28470 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 67 6f 74  NOMEM;.      got
28480 6f 20 73 68 6d 5f 6f 70 65 6e 5f 65 72 72 3b 0a  o shm_open_err;.
28490 20 20 20 20 7d 0a 0a 20 20 20 20 70 46 69 6c 65      }..    pFile
284a0 2d 3e 68 20 3d 20 6f 70 65 6e 28 70 46 69 6c 65  ->h = open(pFile
284b0 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c 20 4f 5f 52  ->zFilename, O_R
284c0 44 57 52 7c 4f 5f 43 52 45 41 54 2c 20 30 36 36  DWR|O_CREAT, 066
284d0 34 29 3b 0a 20 20 20 20 69 66 28 20 70 46 69 6c  4);.    if( pFil
284e0 65 2d 3e 68 3c 30 20 29 7b 0a 20 20 20 20 20 20  e->h<0 ){.      
284f0 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 41 4e 54  rc = SQLITE_CANT
28500 4f 50 45 4e 5f 42 4b 50 54 3b 0a 20 20 20 20 20  OPEN_BKPT;.     
28510 20 67 6f 74 6f 20 73 68 6d 5f 6f 70 65 6e 5f 65   goto shm_open_e
28520 72 72 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 72  rr;.    }..    r
28530 63 20 3d 20 66 73 74 61 74 28 70 46 69 6c 65 2d  c = fstat(pFile-
28540 3e 68 2c 20 26 73 53 74 61 74 29 3b 0a 20 20 20  >h, &sStat);.   
28550 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20   if( rc ){.     
28560 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 41 4e   rc = SQLITE_CAN
28570 54 4f 50 45 4e 5f 42 4b 50 54 3b 0a 20 20 20 20  TOPEN_BKPT;.    
28580 20 20 67 6f 74 6f 20 73 68 6d 5f 6f 70 65 6e 5f    goto shm_open_
28590 65 72 72 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  err;.    }.    p
285a0 46 69 6c 65 2d 3e 66 69 64 2e 64 65 76 20 3d 20  File->fid.dev = 
285b0 73 53 74 61 74 2e 73 74 5f 64 65 76 3b 0a 20 20  sStat.st_dev;.  
285c0 20 20 70 46 69 6c 65 2d 3e 66 69 64 2e 69 6e 6f    pFile->fid.ino
285d0 20 3d 20 73 53 74 61 74 2e 73 74 5f 69 6e 6f 3b   = sStat.st_ino;
285e0 0a 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 74  ..    /* Check t
285f0 6f 20 73 65 65 20 69 66 20 61 6e 6f 74 68 65 72  o see if another
28600 20 70 72 6f 63 65 73 73 20 69 73 20 68 6f 6c 64   process is hold
28610 69 6e 67 20 74 68 65 20 64 65 61 64 2d 6d 61 6e  ing the dead-man
28620 20 73 77 69 74 63 68 2e 0a 20 20 20 20 2a 2a 20   switch..    ** 
28630 49 66 20 6e 6f 74 2c 20 74 72 75 6e 63 61 74 65  If not, truncate
28640 20 74 68 65 20 66 69 6c 65 20 74 6f 20 7a 65 72   the file to zer
28650 6f 20 6c 65 6e 67 74 68 2e 20 0a 20 20 20 20 2a  o length. .    *
28660 2f 0a 20 20 20 20 69 66 28 20 75 6e 69 78 53 68  /.    if( unixSh
28670 6d 53 79 73 74 65 6d 4c 6f 63 6b 28 70 46 69 6c  mSystemLock(pFil
28680 65 2c 20 46 5f 57 52 4c 43 4b 2c 20 55 4e 49 58  e, F_WRLCK, UNIX
28690 5f 53 48 4d 5f 4d 55 54 45 58 29 20 29 7b 0a 20  _SHM_MUTEX) ){. 
286a0 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
286b0 5f 49 4f 45 52 52 5f 4c 4f 43 4b 3b 0a 20 20 20  _IOERR_LOCK;.   
286c0 20 20 20 67 6f 74 6f 20 73 68 6d 5f 6f 70 65 6e     goto shm_open
286d0 5f 65 72 72 3b 0a 20 20 20 20 7d 0a 20 20 20 20  _err;.    }.    
286e0 69 66 28 20 75 6e 69 78 53 68 6d 53 79 73 74 65  if( unixShmSyste
286f0 6d 4c 6f 63 6b 28 70 46 69 6c 65 2c 20 46 5f 57  mLock(pFile, F_W
28700 52 4c 43 4b 2c 20 55 4e 49 58 5f 53 48 4d 5f 44  RLCK, UNIX_SHM_D
28710 4d 53 29 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  MS)==SQLITE_OK )
28720 7b 0a 20 20 20 20 20 20 69 66 28 20 66 74 72 75  {.      if( ftru
28730 6e 63 61 74 65 28 70 46 69 6c 65 2d 3e 68 2c 20  ncate(pFile->h, 
28740 30 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  0) ){.        rc
28750 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 3b   = SQLITE_IOERR;
28760 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
28770 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
28780 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63  E_OK ){.      rc
28790 20 3d 20 75 6e 69 78 53 68 6d 53 79 73 74 65 6d   = unixShmSystem
287a0 4c 6f 63 6b 28 70 46 69 6c 65 2c 20 46 5f 52 44  Lock(pFile, F_RD
287b0 4c 43 4b 2c 20 55 4e 49 58 5f 53 48 4d 5f 44 4d  LCK, UNIX_SHM_DM
287c0 53 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 75 6e  S);.    }.    un
287d0 69 78 53 68 6d 53 79 73 74 65 6d 4c 6f 63 6b 28  ixShmSystemLock(
287e0 70 46 69 6c 65 2c 20 46 5f 55 4e 4c 43 4b 2c 20  pFile, F_UNLCK, 
287f0 55 4e 49 58 5f 53 48 4d 5f 4d 55 54 45 58 29 3b  UNIX_SHM_MUTEX);
28800 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 67 6f  .    if( rc ) go
28810 74 6f 20 73 68 6d 5f 6f 70 65 6e 5f 65 72 72 3b  to shm_open_err;
28820 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20  .  }..  /* Make 
28830 74 68 65 20 6e 65 77 20 63 6f 6e 6e 65 63 74 69  the new connecti
28840 6f 6e 20 61 20 63 68 69 6c 64 20 6f 66 20 74 68  on a child of th
28850 65 20 75 6e 69 78 53 68 6d 46 69 6c 65 20 2a 2f  e unixShmFile */
28860 0a 20 20 70 2d 3e 70 46 69 6c 65 20 3d 20 70 46  .  p->pFile = pF
28870 69 6c 65 3b 0a 20 20 70 2d 3e 70 4e 65 78 74 20  ile;.  p->pNext 
28880 3d 20 70 46 69 6c 65 2d 3e 70 46 69 72 73 74 3b  = pFile->pFirst;
28890 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
288a0 45 42 55 47 0a 20 20 70 2d 3e 69 64 20 3d 20 70  EBUG.  p->id = p
288b0 46 69 6c 65 2d 3e 6e 65 78 74 53 68 6d 49 64 2b  File->nextShmId+
288c0 2b 3b 0a 23 65 6e 64 69 66 0a 20 20 70 46 69 6c  +;.#endif.  pFil
288d0 65 2d 3e 70 46 69 72 73 74 20 3d 20 70 3b 0a 20  e->pFirst = p;. 
288e0 20 70 46 69 6c 65 2d 3e 6e 52 65 66 2b 2b 3b 0a   pFile->nRef++;.
288f0 20 20 2a 70 53 68 6d 20 3d 20 28 73 71 6c 69 74    *pShm = (sqlit
28900 65 33 5f 73 68 6d 2a 29 70 3b 0a 20 20 75 6e 69  e3_shm*)p;.  uni
28910 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 20  xLeaveMutex();. 
28920 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
28930 4b 3b 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20 68 65  K;..  /* Jump he
28940 72 65 20 6f 6e 20 61 6e 79 20 65 72 72 6f 72 20  re on any error 
28950 2a 2f 0a 73 68 6d 5f 6f 70 65 6e 5f 65 72 72 3a  */.shm_open_err:
28960 0a 20 20 75 6e 69 78 53 68 6d 50 75 72 67 65 28  .  unixShmPurge(
28970 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65  );.  sqlite3_fre
28980 65 28 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f  e(p);.  sqlite3_
28990 66 72 65 65 28 70 46 69 6c 65 29 3b 0a 20 20 73  free(pFile);.  s
289a0 71 6c 69 74 65 33 5f 66 72 65 65 28 70 4e 65 77  qlite3_free(pNew
289b0 29 3b 0a 20 20 2a 70 53 68 6d 20 3d 20 30 3b 0a  );.  *pShm = 0;.
289c0 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78    unixLeaveMutex
289d0 28 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  ();.  return rc;
289e0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20  .}../*.** Close 
289f0 61 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20  a connection to 
28a00 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 2e 20 20  shared-memory.  
28a10 44 65 6c 65 74 65 20 74 68 65 20 75 6e 64 65 72  Delete the under
28a20 6c 79 69 6e 67 20 0a 2a 2a 20 73 74 6f 72 61 67  lying .** storag
28a30 65 20 69 66 20 64 65 6c 65 74 65 46 6c 61 67 20  e if deleteFlag 
28a40 69 73 20 74 72 75 65 2e 0a 2a 2f 0a 73 74 61 74  is true..*/.stat
28a50 69 63 20 69 6e 74 20 75 6e 69 78 53 68 6d 43 6c  ic int unixShmCl
28a60 6f 73 65 28 73 71 6c 69 74 65 33 5f 73 68 6d 20  ose(sqlite3_shm 
28a70 2a 70 53 68 61 72 65 64 4d 65 6d 2c 20 69 6e 74  *pSharedMem, int
28a80 20 64 65 6c 65 74 65 46 6c 61 67 29 7b 0a 20 20   deleteFlag){.  
28a90 75 6e 69 78 53 68 6d 20 2a 70 3b 20 20 20 20 20  unixShm *p;     
28aa0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 6f         /* The co
28ab0 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 62 65 20 63  nnection to be c
28ac0 6c 6f 73 65 64 20 2a 2f 0a 20 20 75 6e 69 78 53  losed */.  unixS
28ad0 68 6d 46 69 6c 65 20 2a 70 46 69 6c 65 3b 20 20  hmFile *pFile;  
28ae0 20 20 2f 2a 20 54 68 65 20 75 6e 64 65 72 6c 79    /* The underly
28af0 69 6e 67 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72  ing shared-memor
28b00 79 20 66 69 6c 65 20 2a 2f 0a 20 20 75 6e 69 78  y file */.  unix
28b10 53 68 6d 20 2a 2a 70 70 3b 20 20 20 20 20 20 20  Shm **pp;       
28b20 20 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e     /* For loopin
28b30 67 20 6f 76 65 72 20 73 69 62 6c 69 6e 67 20 63  g over sibling c
28b40 6f 6e 6e 65 63 74 69 6f 6e 73 20 2a 2f 0a 0a 20  onnections */.. 
28b50 20 69 66 28 20 70 53 68 61 72 65 64 4d 65 6d 3d   if( pSharedMem=
28b60 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  =0 ) return SQLI
28b70 54 45 5f 4f 4b 3b 0a 20 20 70 20 3d 20 28 73 74  TE_OK;.  p = (st
28b80 72 75 63 74 20 75 6e 69 78 53 68 6d 2a 29 70 53  ruct unixShm*)pS
28b90 68 61 72 65 64 4d 65 6d 3b 0a 20 20 70 46 69 6c  haredMem;.  pFil
28ba0 65 20 3d 20 70 2d 3e 70 46 69 6c 65 3b 0a 0a 20  e = p->pFile;.. 
28bb0 20 2f 2a 20 56 65 72 69 66 79 20 74 68 61 74 20   /* Verify that 
28bc0 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 62  the connection b
28bd0 65 69 6e 67 20 63 6c 6f 73 65 64 20 68 6f 6c 64  eing closed hold
28be0 73 20 6e 6f 20 6c 6f 63 6b 73 20 2a 2f 0a 20 20  s no locks */.  
28bf0 61 73 73 65 72 74 28 20 70 2d 3e 65 78 63 6c 4d  assert( p->exclM
28c00 61 73 6b 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65  ask==0 );.  asse
28c10 72 74 28 20 70 2d 3e 73 68 61 72 65 64 4d 61 73  rt( p->sharedMas
28c20 6b 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 52 65  k==0 );..  /* Re
28c30 6d 6f 76 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  move connection 
28c40 70 20 66 72 6f 6d 20 74 68 65 20 73 65 74 20 6f  p from the set o
28c50 66 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 61 73  f connections as
28c60 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 70 46  sociated with pF
28c70 69 6c 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ile */.  sqlite3
28c80 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 70 46 69  _mutex_enter(pFi
28c90 6c 65 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 66 6f  le->mutex);.  fo
28ca0 72 28 70 70 3d 26 70 46 69 6c 65 2d 3e 70 46 69  r(pp=&pFile->pFi
28cb0 72 73 74 3b 20 28 2a 70 70 29 21 3d 70 3b 20 70  rst; (*pp)!=p; p
28cc0 70 20 3d 20 26 28 2a 70 70 29 2d 3e 70 4e 65 78  p = &(*pp)->pNex
28cd0 74 29 7b 7d 0a 20 20 2a 70 70 20 3d 20 70 2d 3e  t){}.  *pp = p->
28ce0 70 4e 65 78 74 3b 0a 0a 20 20 2f 2a 20 46 72 65  pNext;..  /* Fre
28cf0 65 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  e the connection
28d00 20 70 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f   p */.  sqlite3_
28d10 66 72 65 65 28 70 29 3b 0a 20 20 73 71 6c 69 74  free(p);.  sqlit
28d20 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 70  e3_mutex_leave(p
28d30 46 69 6c 65 2d 3e 6d 75 74 65 78 29 3b 0a 0a 20  File->mutex);.. 
28d40 20 2f 2a 20 49 66 20 70 46 69 6c 65 2d 3e 6e 52   /* If pFile->nR
28d50 65 66 20 68 61 73 20 72 65 61 63 68 65 64 20 30  ef has reached 0
28d60 2c 20 74 68 65 6e 20 63 6c 6f 73 65 20 74 68 65  , then close the
28d70 20 75 6e 64 65 72 6c 79 69 6e 67 0a 20 20 2a 2a   underlying.  **
28d80 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 66   shared-memory f
28d90 69 6c 65 2c 20 74 6f 6f 20 2a 2f 0a 20 20 75 6e  ile, too */.  un
28da0 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a  ixEnterMutex();.
28db0 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 2d    assert( pFile-
28dc0 3e 6e 52 65 66 3e 30 20 29 3b 0a 20 20 70 46 69  >nRef>0 );.  pFi
28dd0 6c 65 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20 69 66  le->nRef--;.  if
28de0 28 20 70 46 69 6c 65 2d 3e 6e 52 65 66 3d 3d 30  ( pFile->nRef==0
28df0 20 29 7b 0a 20 20 20 20 69 66 28 20 64 65 6c 65   ){.    if( dele
28e00 74 65 46 6c 61 67 20 29 20 75 6e 6c 69 6e 6b 28  teFlag ) unlink(
28e10 70 46 69 6c 65 2d 3e 7a 46 69 6c 65 6e 61 6d 65  pFile->zFilename
28e20 29 3b 0a 20 20 20 20 75 6e 69 78 53 68 6d 50 75  );.    unixShmPu
28e30 72 67 65 28 29 3b 0a 20 20 7d 0a 20 20 75 6e 69  rge();.  }.  uni
28e40 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 0a  xLeaveMutex();..
28e50 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
28e60 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 51 75 65  OK;.}../*.** Que
28e70 72 79 20 61 6e 64 2f 6f 72 20 63 68 61 6e 67 65  ry and/or change
28e80 73 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68  s the size of th
28e90 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 73 74 6f  e underlying sto
28ea0 72 61 67 65 20 66 6f 72 0a 2a 2a 20 61 20 73 68  rage for.** a sh
28eb0 61 72 65 64 2d 6d 65 6d 6f 72 79 20 73 65 67 6d  ared-memory segm
28ec0 65 6e 74 2e 20 20 54 68 65 20 72 65 71 53 69 7a  ent.  The reqSiz
28ed0 65 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 74  e parameter is t
28ee0 68 65 20 6e 65 77 20 73 69 7a 65 0a 2a 2a 20 6f  he new size.** o
28ef0 66 20 74 68 65 20 75 6e 64 65 72 6c 79 69 6e 67  f the underlying
28f00 20 73 74 6f 72 61 67 65 2c 20 6f 72 20 2d 31 20   storage, or -1 
28f10 74 6f 20 64 6f 20 6a 75 73 74 20 61 20 71 75 65  to do just a que
28f20 72 79 2e 20 20 54 68 65 20 73 69 7a 65 0a 2a 2a  ry.  The size.**
28f30 20 6f 66 20 74 68 65 20 75 6e 64 65 72 6c 79 69   of the underlyi
28f40 6e 67 20 73 74 6f 72 61 67 65 20 28 61 66 74 65  ng storage (afte
28f50 72 20 72 65 73 69 7a 69 6e 67 20 69 66 20 72 65  r resizing if re
28f60 73 69 7a 69 6e 67 20 6f 63 63 75 72 73 29 20 69  sizing occurs) i
28f70 73 0a 2a 2a 20 77 72 69 74 74 65 6e 20 69 6e 74  s.** written int
28f80 6f 20 70 4e 65 77 53 69 7a 65 2e 0a 2a 2a 0a 2a  o pNewSize..**.*
28f90 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 64  * This routine d
28fa0 6f 65 73 20 6e 6f 74 20 28 6e 65 63 65 73 73 61  oes not (necessa
28fb0 72 69 6c 79 29 20 63 68 61 6e 67 65 20 74 68 65  rily) change the
28fc0 20 73 69 7a 65 20 6f 66 20 74 68 65 20 6d 61 70   size of the map
28fd0 70 69 6e 67 20 0a 2a 2a 20 6f 66 20 74 68 65 20  ping .** of the 
28fe0 75 6e 64 65 72 6c 79 69 6e 67 20 73 74 6f 72 61  underlying stora
28ff0 67 65 20 69 6e 74 6f 20 6d 65 6d 6f 72 79 2e 20  ge into memory. 
29000 20 55 73 65 20 78 53 68 6d 47 65 74 28 29 20 74   Use xShmGet() t
29010 6f 20 63 68 61 6e 67 65 0a 2a 2a 20 74 68 65 20  o change.** the 
29020 6d 61 70 70 69 6e 67 20 73 69 7a 65 2e 0a 2a 2a  mapping size..**
29030 0a 2a 2a 20 54 68 65 20 72 65 71 53 69 7a 65 20  .** The reqSize 
29040 70 61 72 61 6d 65 74 65 72 20 69 73 20 74 68 65  parameter is the
29050 20 6d 69 6e 69 6d 75 6d 20 73 69 7a 65 20 72 65   minimum size re
29060 71 75 65 73 74 65 64 2e 20 20 54 68 65 20 69 6d  quested.  The im
29070 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 0a 2a 2a 20  plementation.** 
29080 69 73 20 66 72 65 65 20 74 6f 20 65 78 70 61 6e  is free to expan
29090 64 20 74 68 65 20 73 74 6f 72 61 67 65 20 74 6f  d the storage to
290a0 20 73 6f 6d 65 20 6c 61 72 67 65 72 20 61 6d 6f   some larger amo
290b0 75 6e 74 20 69 66 20 69 74 20 63 68 6f 6f 73 65  unt if it choose
290c0 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  s..*/.static int
290d0 20 75 6e 69 78 53 68 6d 53 69 7a 65 28 0a 20 20   unixShmSize(.  
290e0 73 71 6c 69 74 65 33 5f 73 68 6d 20 2a 70 53 68  sqlite3_shm *pSh
290f0 61 72 65 64 4d 65 6d 2c 20 20 2f 2a 20 50 6f 69  aredMem,  /* Poi
29100 6e 74 65 72 20 72 65 74 75 72 6e 65 64 20 62 79  nter returned by
29110 20 75 6e 69 78 53 68 6d 4f 70 65 6e 28 29 20 2a   unixShmOpen() *
29120 2f 0a 20 20 69 6e 74 20 72 65 71 53 69 7a 65 2c  /.  int reqSize,
29130 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
29140 20 52 65 71 75 65 73 74 65 64 20 73 69 7a 65 2e   Requested size.
29150 20 20 2d 31 20 66 6f 72 20 71 75 65 72 79 20 6f    -1 for query o
29160 6e 6c 79 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 4e  nly */.  int *pN
29170 65 77 53 69 7a 65 20 20 20 20 20 20 20 20 20 20  ewSize          
29180 20 20 20 2f 2a 20 57 72 69 74 65 20 6e 65 77 20     /* Write new 
29190 73 69 7a 65 20 68 65 72 65 20 2a 2f 0a 29 7b 0a  size here */.){.
291a0 20 20 75 6e 69 78 53 68 6d 20 2a 70 20 3d 20 28    unixShm *p = (
291b0 75 6e 69 78 53 68 6d 2a 29 70 53 68 61 72 65 64  unixShm*)pShared
291c0 4d 65 6d 3b 0a 20 20 75 6e 69 78 53 68 6d 46 69  Mem;.  unixShmFi
291d0 6c 65 20 2a 70 46 69 6c 65 20 3d 20 70 2d 3e 70  le *pFile = p->p
291e0 46 69 6c 65 3b 0a 20 20 69 6e 74 20 72 63 20 3d  File;.  int rc =
291f0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 73 74   SQLITE_OK;.  st
29200 72 75 63 74 20 73 74 61 74 20 73 53 74 61 74 3b  ruct stat sStat;
29210 0a 0a 20 20 69 66 28 20 72 65 71 53 69 7a 65 3e  ..  if( reqSize>
29220 3d 30 20 29 7b 0a 20 20 20 20 72 65 71 53 69 7a  =0 ){.    reqSiz
29230 65 20 3d 20 28 72 65 71 53 69 7a 65 20 2b 20 53  e = (reqSize + S
29240 51 4c 49 54 45 5f 55 4e 49 58 5f 53 48 4d 5f 49  QLITE_UNIX_SHM_I
29250 4e 43 52 20 2d 20 31 29 2f 53 51 4c 49 54 45 5f  NCR - 1)/SQLITE_
29260 55 4e 49 58 5f 53 48 4d 5f 49 4e 43 52 3b 0a 20  UNIX_SHM_INCR;. 
29270 20 20 20 72 65 71 53 69 7a 65 20 2a 3d 20 53 51     reqSize *= SQ
29280 4c 49 54 45 5f 55 4e 49 58 5f 53 48 4d 5f 49 4e  LITE_UNIX_SHM_IN
29290 43 52 3b 0a 20 20 20 20 72 63 20 3d 20 66 74 72  CR;.    rc = ftr
292a0 75 6e 63 61 74 65 28 70 46 69 6c 65 2d 3e 68 2c  uncate(pFile->h,
292b0 20 72 65 71 53 69 7a 65 29 3b 0a 20 20 7d 0a 20   reqSize);.  }. 
292c0 20 69 66 28 20 66 73 74 61 74 28 70 46 69 6c 65   if( fstat(pFile
292d0 2d 3e 68 2c 20 26 73 53 74 61 74 29 3d 3d 30 20  ->h, &sStat)==0 
292e0 29 7b 0a 20 20 20 20 2a 70 4e 65 77 53 69 7a 65  ){.    *pNewSize
292f0 20 3d 20 28 69 6e 74 29 73 53 74 61 74 2e 73 74   = (int)sStat.st
29300 5f 73 69 7a 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a  _size;.  }else{.
29310 20 20 20 20 2a 70 4e 65 77 53 69 7a 65 20 3d 20      *pNewSize = 
29320 30 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  0;.    rc = SQLI
29330 54 45 5f 49 4f 45 52 52 3b 0a 20 20 7d 0a 20 20  TE_IOERR;.  }.  
29340 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f  return rc;.}.../
29350 2a 0a 2a 2a 20 4d 61 70 20 74 68 65 20 73 68 61  *.** Map the sha
29360 72 65 64 20 73 74 6f 72 61 67 65 20 69 6e 74 6f  red storage into
29370 20 6d 65 6d 6f 72 79 2e 20 20 54 68 65 20 6d 69   memory.  The mi
29380 6e 69 6d 75 6d 20 73 69 7a 65 20 6f 66 20 74 68  nimum size of th
29390 65 0a 2a 2a 20 6d 61 70 70 69 6e 67 20 73 68 6f  e.** mapping sho
293a0 75 6c 64 20 62 65 20 72 65 71 4d 61 70 53 69 7a  uld be reqMapSiz
293b0 65 20 69 66 20 72 65 71 4d 61 70 53 69 7a 65 20  e if reqMapSize 
293c0 69 73 20 70 6f 73 69 74 69 76 65 2e 20 20 49 66  is positive.  If
293d0 0a 2a 2a 20 72 65 71 4d 61 70 53 69 7a 65 20 69  .** reqMapSize i
293e0 73 20 7a 65 72 6f 20 6f 72 20 6e 65 67 61 74 69  s zero or negati
293f0 76 65 2c 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e  ve, the implemen
29400 74 61 74 69 6f 6e 20 63 61 6e 20 63 68 6f 6f 73  tation can choos
29410 65 0a 2a 2a 20 77 68 61 74 65 76 65 72 20 6d 61  e.** whatever ma
29420 70 70 69 6e 67 20 73 69 7a 65 20 69 73 20 63 6f  pping size is co
29430 6e 76 65 6e 69 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20  nvenient..**.** 
29440 2a 70 70 42 75 66 20 69 73 20 6d 61 64 65 20 74  *ppBuf is made t
29450 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 6d  o point to the m
29460 65 6d 6f 72 79 20 77 68 69 63 68 20 69 73 20 61  emory which is a
29470 20 6d 61 70 70 69 6e 67 20 6f 66 20 74 68 65 0a   mapping of the.
29480 2a 2a 20 75 6e 64 65 72 6c 79 69 6e 67 20 73 74  ** underlying st
29490 6f 72 61 67 65 2e 20 20 41 20 6d 75 74 65 78 20  orage.  A mutex 
294a0 69 73 20 61 63 71 75 69 72 65 64 20 74 6f 20 70  is acquired to p
294b0 72 65 76 65 6e 74 20 6f 74 68 65 72 20 74 68 72  revent other thr
294c0 65 61 64 73 0a 2a 2a 20 66 72 6f 6d 20 72 75 6e  eads.** from run
294d0 6e 69 6e 67 20 77 68 69 6c 65 20 2a 70 70 42 75  ning while *ppBu
294e0 66 20 69 73 20 69 6e 20 75 73 65 20 69 6e 20 6f  f is in use in o
294f0 72 64 65 72 20 74 6f 20 70 72 65 76 65 6e 74 20  rder to prevent 
29500 6f 74 68 65 72 20 74 68 72 65 61 64 73 0a 2a 2a  other threads.**
29510 20 72 65 6d 61 70 70 69 6e 67 20 2a 70 70 42 75   remapping *ppBu
29520 66 20 6f 75 74 20 66 72 6f 6d 20 75 6e 64 65 72  f out from under
29530 20 74 68 69 73 20 74 68 72 65 61 64 2e 20 20 54   this thread.  T
29540 68 65 20 75 6e 69 78 53 68 6d 52 65 6c 65 61 73  he unixShmReleas
29550 65 28 29 0a 2a 2a 20 63 61 6c 6c 20 77 69 6c 6c  e().** call will
29560 20 72 65 6c 65 61 73 65 20 74 68 65 20 6d 75 74   release the mut
29570 65 78 2e 20 20 48 6f 77 65 76 65 72 2c 20 69 66  ex.  However, if
29580 20 74 68 65 20 6c 6f 63 6b 20 73 74 61 74 65 20   the lock state 
29590 69 73 20 43 48 45 43 4b 50 4f 49 4e 54 2c 0a 2a  is CHECKPOINT,.*
295a0 2a 20 74 68 65 20 6d 75 74 65 78 20 69 73 20 6e  * the mutex is n
295b0 6f 74 20 61 63 71 75 69 72 65 64 20 62 65 63 61  ot acquired beca
295c0 75 73 65 20 43 48 45 43 4b 50 4f 49 4e 54 20 77  use CHECKPOINT w
295d0 69 6c 6c 20 6e 65 76 65 72 20 72 65 6d 61 70 20  ill never remap 
295e0 74 68 65 0a 2a 2a 20 62 75 66 66 65 72 2e 20 20  the.** buffer.  
295f0 52 45 43 4f 56 45 52 20 6d 69 67 68 74 20 72 65  RECOVER might re
29600 6d 61 70 2c 20 74 68 6f 75 67 68 2c 20 73 6f 20  map, though, so 
29610 43 48 45 43 4b 50 4f 49 4e 54 20 77 69 6c 6c 20  CHECKPOINT will 
29620 61 63 71 75 69 72 65 0a 2a 2a 20 74 68 65 20 6d  acquire.** the m
29630 75 74 65 78 20 69 66 20 61 6e 64 20 77 68 65 6e  utex if and when
29640 20 69 74 20 70 72 6f 6d 6f 74 65 73 20 74 6f 20   it promotes to 
29650 52 45 43 4f 56 45 52 2e 0a 2a 2a 0a 2a 2a 20 52  RECOVER..**.** R
29660 45 43 4f 56 45 52 20 6e 65 65 64 73 20 74 6f 20  ECOVER needs to 
29670 62 65 20 61 74 6f 6d 69 63 2e 20 20 54 68 65 20  be atomic.  The 
29680 73 61 6d 65 20 6d 75 74 65 78 20 74 68 61 74 20  same mutex that 
29690 70 72 65 76 65 6e 74 73 20 2a 70 70 42 75 66 20  prevents *ppBuf 
296a0 66 72 6f 6d 0a 2a 2a 20 62 65 69 6e 67 20 72 65  from.** being re
296b0 6d 61 70 70 65 64 20 61 6c 73 6f 20 70 72 65 76  mapped also prev
296c0 65 6e 74 73 20 6d 6f 72 65 20 74 68 61 6e 20 6f  ents more than o
296d0 6e 65 20 74 68 72 65 61 64 20 66 72 6f 6d 20 62  ne thread from b
296e0 65 69 6e 67 20 69 6e 0a 2a 2a 20 52 45 43 4f 56  eing in.** RECOV
296f0 45 52 20 61 74 20 61 20 74 69 6d 65 2e 20 20 42  ER at a time.  B
29700 75 74 2c 20 52 45 43 4f 56 45 52 20 73 6f 6d 65  ut, RECOVER some
29710 74 69 6d 65 73 20 77 61 6e 74 73 20 74 6f 20 72  times wants to r
29720 65 6d 61 70 20 69 74 73 65 6c 66 2e 0a 2a 2a 20  emap itself..** 
29730 54 6f 20 70 72 65 76 65 6e 74 20 52 45 43 4f 56  To prevent RECOV
29740 45 52 20 66 72 6f 6d 20 6c 6f 73 69 6e 67 20 69  ER from losing i
29750 74 73 20 6c 6f 63 6b 20 77 68 69 6c 65 20 72 65  ts lock while re
29760 6d 61 70 70 69 6e 67 2c 20 74 68 65 0a 2a 2a 20  mapping, the.** 
29770 6d 75 74 65 78 20 69 73 20 6e 6f 74 20 72 65 6c  mutex is not rel
29780 65 61 73 65 64 20 62 79 20 75 6e 69 78 53 68 6d  eased by unixShm
29790 52 65 6c 65 61 73 65 28 29 20 77 68 65 6e 20 69  Release() when i
297a0 6e 20 52 45 43 4f 56 45 52 2e 0a 2a 2a 0a 2a 2a  n RECOVER..**.**
297b0 20 2a 70 4e 65 77 4d 61 70 53 69 7a 65 20 69 73   *pNewMapSize is
297c0 20 73 65 74 20 74 6f 20 74 68 65 20 73 69 7a 65   set to the size
297d0 20 6f 66 20 74 68 65 20 6d 61 70 70 69 6e 67 2e   of the mapping.
297e0 0a 2a 2a 0a 2a 2a 20 2a 70 70 42 75 66 20 61 6e  .**.** *ppBuf an
297f0 64 20 2a 70 4e 65 77 4d 61 70 53 69 7a 65 20 6d  d *pNewMapSize m
29800 69 67 68 74 20 62 65 20 4e 55 4c 4c 20 61 6e 64  ight be NULL and
29810 20 7a 65 72 6f 20 69 66 20 6e 6f 20 73 70 61 63   zero if no spac
29820 65 20 68 61 73 0a 2a 2a 20 79 65 74 20 62 65 65  e has.** yet bee
29830 6e 20 61 6c 6c 6f 63 61 74 65 64 20 74 6f 20 74  n allocated to t
29840 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 73 74  he underlying st
29850 6f 72 61 67 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  orage..*/.static
29860 20 69 6e 74 20 75 6e 69 78 53 68 6d 47 65 74 28   int unixShmGet(
29870 0a 20 20 73 71 6c 69 74 65 33 5f 73 68 6d 20 2a  .  sqlite3_shm *
29880 70 53 68 61 72 65 64 4d 65 6d 2c 20 2f 2a 20 50  pSharedMem, /* P
29890 6f 69 6e 74 65 72 20 72 65 74 75 72 6e 65 64 20  ointer returned 
298a0 62 79 20 75 6e 69 78 53 68 6d 4f 70 65 6e 28 29  by unixShmOpen()
298b0 20 2a 2f 0a 20 20 69 6e 74 20 72 65 71 4d 61 70   */.  int reqMap
298c0 53 69 7a 65 2c 20 20 20 20 20 20 20 20 20 20 2f  Size,          /
298d0 2a 20 52 65 71 75 65 73 74 65 64 20 73 69 7a 65  * Requested size
298e0 20 6f 66 20 6d 61 70 70 69 6e 67 2e 20 2d 31 20   of mapping. -1 
298f0 6d 65 61 6e 73 20 64 6f 6e 27 74 20 63 61 72 65  means don't care
29900 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 4e 65 77 4d   */.  int *pNewM
29910 61 70 53 69 7a 65 2c 20 20 20 20 20 20 20 20 2f  apSize,        /
29920 2a 20 57 72 69 74 65 20 6e 65 77 20 73 69 7a 65  * Write new size
29930 20 6f 66 20 6d 61 70 70 69 6e 67 20 68 65 72 65   of mapping here
29940 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 2a 70 70 42   */.  void **ppB
29950 75 66 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  uf             /
29960 2a 20 57 72 69 74 65 20 6d 61 70 70 69 6e 67 20  * Write mapping 
29970 62 75 66 66 65 72 20 6f 72 69 67 69 6e 20 68 65  buffer origin he
29980 72 65 20 2a 2f 0a 29 7b 0a 20 20 75 6e 69 78 53  re */.){.  unixS
29990 68 6d 20 2a 70 20 3d 20 28 75 6e 69 78 53 68 6d  hm *p = (unixShm
299a0 2a 29 70 53 68 61 72 65 64 4d 65 6d 3b 0a 20 20  *)pSharedMem;.  
299b0 75 6e 69 78 53 68 6d 46 69 6c 65 20 2a 70 46 69  unixShmFile *pFi
299c0 6c 65 20 3d 20 70 2d 3e 70 46 69 6c 65 3b 0a 20  le = p->pFile;. 
299d0 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
299e0 5f 4f 4b 3b 0a 0a 20 20 69 66 28 20 70 2d 3e 6c  _OK;..  if( p->l
299f0 6f 63 6b 53 74 61 74 65 21 3d 53 51 4c 49 54 45  ockState!=SQLITE
29a00 5f 53 48 4d 5f 43 48 45 43 4b 50 4f 49 4e 54 20  _SHM_CHECKPOINT 
29a10 26 26 20 70 2d 3e 68 61 73 4d 75 74 65 78 42 75  && p->hasMutexBu
29a20 66 3d 3d 30 20 29 7b 0a 20 20 20 20 61 73 73 65  f==0 ){.    asse
29a30 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
29a40 78 5f 6e 6f 74 68 65 6c 64 28 70 46 69 6c 65 2d  x_notheld(pFile-
29a50 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 20 20 73  >mutex) );.    s
29a60 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74  qlite3_mutex_ent
29a70 65 72 28 70 46 69 6c 65 2d 3e 6d 75 74 65 78 42  er(pFile->mutexB
29a80 75 66 29 3b 0a 20 20 20 20 70 2d 3e 68 61 73 4d  uf);.    p->hasM
29a90 75 74 65 78 42 75 66 20 3d 20 31 3b 0a 20 20 7d  utexBuf = 1;.  }
29aa0 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
29ab0 5f 65 6e 74 65 72 28 70 46 69 6c 65 2d 3e 6d 75  _enter(pFile->mu
29ac0 74 65 78 29 3b 0a 20 20 69 66 28 20 70 46 69 6c  tex);.  if( pFil
29ad0 65 2d 3e 73 7a 4d 61 70 3d 3d 30 20 7c 7c 20 72  e->szMap==0 || r
29ae0 65 71 4d 61 70 53 69 7a 65 3e 70 46 69 6c 65 2d  eqMapSize>pFile-
29af0 3e 73 7a 4d 61 70 20 29 7b 0a 20 20 20 20 69 6e  >szMap ){.    in
29b00 74 20 61 63 74 75 61 6c 53 69 7a 65 3b 0a 20 20  t actualSize;.  
29b10 20 20 69 66 28 20 75 6e 69 78 53 68 6d 53 69 7a    if( unixShmSiz
29b20 65 28 70 53 68 61 72 65 64 4d 65 6d 2c 20 2d 31  e(pSharedMem, -1
29b30 2c 20 26 61 63 74 75 61 6c 53 69 7a 65 29 3d 3d  , &actualSize)==
29b40 53 51 4c 49 54 45 5f 4f 4b 0a 20 20 20 20 20 26  SQLITE_OK.     &
29b50 26 20 72 65 71 4d 61 70 53 69 7a 65 3c 61 63 74  & reqMapSize<act
29b60 75 61 6c 53 69 7a 65 0a 20 20 20 20 29 7b 0a 20  ualSize.    ){. 
29b70 20 20 20 20 20 72 65 71 4d 61 70 53 69 7a 65 20       reqMapSize 
29b80 3d 20 61 63 74 75 61 6c 53 69 7a 65 3b 0a 20 20  = actualSize;.  
29b90 20 20 7d 0a 20 20 20 20 69 66 28 20 70 46 69 6c    }.    if( pFil
29ba0 65 2d 3e 70 4d 4d 61 70 42 75 66 20 29 7b 0a 20  e->pMMapBuf ){. 
29bb0 20 20 20 20 20 6d 75 6e 6d 61 70 28 70 46 69 6c       munmap(pFil
29bc0 65 2d 3e 70 4d 4d 61 70 42 75 66 2c 20 70 46 69  e->pMMapBuf, pFi
29bd0 6c 65 2d 3e 73 7a 4d 61 70 29 3b 0a 20 20 20 20  le->szMap);.    
29be0 7d 0a 20 20 20 20 70 46 69 6c 65 2d 3e 70 4d 4d  }.    pFile->pMM
29bf0 61 70 42 75 66 20 3d 20 6d 6d 61 70 28 30 2c 20  apBuf = mmap(0, 
29c00 72 65 71 4d 61 70 53 69 7a 65 2c 20 50 52 4f 54  reqMapSize, PROT
29c10 5f 52 45 41 44 7c 50 52 4f 54 5f 57 52 49 54 45  _READ|PROT_WRITE
29c20 2c 20 4d 41 50 5f 53 48 41 52 45 44 2c 0a 20 20  , MAP_SHARED,.  
29c30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29c40 20 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e           pFile->
29c50 68 2c 20 30 29 3b 0a 20 20 20 20 70 46 69 6c 65  h, 0);.    pFile
29c60 2d 3e 73 7a 4d 61 70 20 3d 20 70 46 69 6c 65 2d  ->szMap = pFile-
29c70 3e 70 4d 4d 61 70 42 75 66 20 3f 20 72 65 71 4d  >pMMapBuf ? reqM
29c80 61 70 53 69 7a 65 20 3a 20 30 3b 0a 20 20 7d 0a  apSize : 0;.  }.
29c90 20 20 2a 70 4e 65 77 4d 61 70 53 69 7a 65 20 3d    *pNewMapSize =
29ca0 20 70 46 69 6c 65 2d 3e 73 7a 4d 61 70 3b 0a 20   pFile->szMap;. 
29cb0 20 2a 70 70 42 75 66 20 3d 20 70 46 69 6c 65 2d   *ppBuf = pFile-
29cc0 3e 70 4d 4d 61 70 42 75 66 3b 0a 20 20 73 71 6c  >pMMapBuf;.  sql
29cd0 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65  ite3_mutex_leave
29ce0 28 70 46 69 6c 65 2d 3e 6d 75 74 65 78 29 3b 0a  (pFile->mutex);.
29cf0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
29d00 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73 65 20 74 68  /*.** Release th
29d10 65 20 6c 6f 63 6b 20 68 65 6c 64 20 6f 6e 20 74  e lock held on t
29d20 68 65 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79  he shared memory
29d30 20 73 65 67 6d 65 6e 74 20 74 6f 20 74 68 61 74   segment to that
29d40 20 6f 74 68 65 72 0a 2a 2a 20 74 68 72 65 61 64   other.** thread
29d50 73 20 61 72 65 20 66 72 65 65 20 74 6f 20 72 65  s are free to re
29d60 73 69 7a 65 20 69 74 20 69 66 20 6e 65 63 65 73  size it if neces
29d70 73 61 72 79 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  sary..**.** If t
29d80 68 65 20 6c 6f 63 6b 20 69 73 20 6e 6f 74 20 63  he lock is not c
29d90 75 72 72 65 6e 74 6c 79 20 68 65 6c 64 2c 20 74  urrently held, t
29da0 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61  his routine is a
29db0 20 68 61 72 6d 6c 65 73 73 20 6e 6f 2d 6f 70 2e   harmless no-op.
29dc0 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 73 68  .**.** If the sh
29dd0 61 72 65 64 2d 6d 65 6d 6f 72 79 20 6f 62 6a 65  ared-memory obje
29de0 63 74 20 69 73 20 69 6e 20 6c 6f 63 6b 20 73 74  ct is in lock st
29df0 61 74 65 20 52 45 43 4f 56 45 52 2c 20 74 68 65  ate RECOVER, the
29e00 6e 20 77 65 20 64 6f 20 6e 6f 74 0a 2a 2a 20 72  n we do not.** r
29e10 65 61 6c 6c 79 20 77 61 6e 74 20 74 6f 20 72 65  eally want to re
29e20 6c 65 61 73 65 20 74 68 65 20 6c 6f 63 6b 2c 20  lease the lock, 
29e30 73 6f 20 69 6e 20 74 68 61 74 20 63 61 73 65 20  so in that case 
29e40 74 6f 6f 2c 20 74 68 69 73 20 72 6f 75 74 69 6e  too, this routin
29e50 65 0a 2a 2a 20 69 73 20 61 20 6e 6f 2d 6f 70 2e  e.** is a no-op.
29e60 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75  .*/.static int u
29e70 6e 69 78 53 68 6d 52 65 6c 65 61 73 65 28 73 71  nixShmRelease(sq
29e80 6c 69 74 65 33 5f 73 68 6d 20 2a 70 53 68 61 72  lite3_shm *pShar
29e90 65 64 4d 65 6d 29 7b 0a 20 20 75 6e 69 78 53 68  edMem){.  unixSh
29ea0 6d 20 2a 70 20 3d 20 28 75 6e 69 78 53 68 6d 2a  m *p = (unixShm*
29eb0 29 70 53 68 61 72 65 64 4d 65 6d 3b 0a 20 20 69  )pSharedMem;.  i
29ec0 66 28 20 70 2d 3e 68 61 73 4d 75 74 65 78 42 75  f( p->hasMutexBu
29ed0 66 20 26 26 20 70 2d 3e 6c 6f 63 6b 53 74 61 74  f && p->lockStat
29ee0 65 21 3d 53 51 4c 49 54 45 5f 53 48 4d 5f 52 45  e!=SQLITE_SHM_RE
29ef0 43 4f 56 45 52 20 29 7b 0a 20 20 20 20 75 6e 69  COVER ){.    uni
29f00 78 53 68 6d 46 69 6c 65 20 2a 70 46 69 6c 65 20  xShmFile *pFile 
29f10 3d 20 70 2d 3e 70 46 69 6c 65 3b 0a 20 20 20 20  = p->pFile;.    
29f20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
29f30 6d 75 74 65 78 5f 6e 6f 74 68 65 6c 64 28 70 46  mutex_notheld(pF
29f40 69 6c 65 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  ile->mutex) );. 
29f50 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78     sqlite3_mutex
29f60 5f 6c 65 61 76 65 28 70 46 69 6c 65 2d 3e 6d 75  _leave(pFile->mu
29f70 74 65 78 42 75 66 29 3b 0a 20 20 20 20 70 2d 3e  texBuf);.    p->
29f80 68 61 73 4d 75 74 65 78 42 75 66 20 3d 20 30 3b  hasMutexBuf = 0;
29f90 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51  .  }.  return SQ
29fa0 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
29fb0 2a 20 53 79 6d 62 6f 6c 69 63 20 6e 61 6d 65 73  * Symbolic names
29fc0 20 66 6f 72 20 4c 4f 43 4b 20 73 74 61 74 65 73   for LOCK states
29fd0 20 75 73 65 64 20 66 6f 72 20 64 65 62 75 67 67   used for debugg
29fe0 69 6e 67 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53  ing..*/.#ifdef S
29ff0 51 4c 49 54 45 5f 44 45 42 55 47 0a 73 74 61 74  QLITE_DEBUG.stat
2a000 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 61  ic const char *a
2a010 7a 4c 6b 4e 61 6d 65 5b 5d 20 3d 20 7b 0a 20 20  zLkName[] = {.  
2a020 22 55 4e 4c 4f 43 4b 22 2c 0a 20 20 22 52 45 41  "UNLOCK",.  "REA
2a030 44 22 2c 0a 20 20 22 52 45 41 44 5f 46 55 4c 4c  D",.  "READ_FULL
2a040 22 2c 0a 20 20 22 57 52 49 54 45 22 2c 0a 20 20  ",.  "WRITE",.  
2a050 22 50 45 4e 44 49 4e 47 22 2c 0a 20 20 22 43 48  "PENDING",.  "CH
2a060 45 43 4b 50 4f 49 4e 54 22 2c 0a 20 20 22 52 45  ECKPOINT",.  "RE
2a070 43 4f 56 45 52 22 0a 7d 3b 0a 23 65 6e 64 69 66  COVER".};.#endif
2a080 0a 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20  .../*.** Change 
2a090 74 68 65 20 6c 6f 63 6b 20 73 74 61 74 65 20 66  the lock state f
2a0a0 6f 72 20 61 20 73 68 61 72 65 64 2d 6d 65 6d 6f  or a shared-memo
2a0b0 72 79 20 73 65 67 6d 65 6e 74 2e 0a 2a 2f 0a 73  ry segment..*/.s
2a0c0 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 53 68  tatic int unixSh
2a0d0 6d 4c 6f 63 6b 28 0a 20 20 73 71 6c 69 74 65 33  mLock(.  sqlite3
2a0e0 5f 73 68 6d 20 2a 70 53 68 61 72 65 64 4d 65 6d  _shm *pSharedMem
2a0f0 2c 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 66  ,   /* Pointer f
2a100 72 6f 6d 20 75 6e 69 78 53 68 6d 4f 70 65 6e 28  rom unixShmOpen(
2a110 29 20 2a 2f 0a 20 20 69 6e 74 20 64 65 73 69 72  ) */.  int desir
2a120 65 64 4c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20  edLock,         
2a130 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 53 51 4c 49    /* One of SQLI
2a140 54 45 5f 53 48 4d 5f 78 78 78 78 78 20 6c 6f 63  TE_SHM_xxxxx loc
2a150 6b 69 6e 67 20 73 74 61 74 65 73 20 2a 2f 0a 20  king states */. 
2a160 20 69 6e 74 20 2a 70 47 6f 74 4c 6f 63 6b 20 20   int *pGotLock  
2a170 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
2a180 68 65 20 6c 6f 63 6b 20 79 6f 75 20 61 63 74 75  he lock you actu
2a190 61 6c 6c 79 20 67 6f 74 20 2a 2f 0a 29 7b 0a 20  ally got */.){. 
2a1a0 20 75 6e 69 78 53 68 6d 20 2a 70 20 3d 20 28 75   unixShm *p = (u
2a1b0 6e 69 78 53 68 6d 2a 29 70 53 68 61 72 65 64 4d  nixShm*)pSharedM
2a1c0 65 6d 3b 0a 20 20 75 6e 69 78 53 68 6d 46 69 6c  em;.  unixShmFil
2a1d0 65 20 2a 70 46 69 6c 65 20 3d 20 70 2d 3e 70 46  e *pFile = p->pF
2a1e0 69 6c 65 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20  ile;.  int rc = 
2a1f0 53 51 4c 49 54 45 5f 50 52 4f 54 4f 43 4f 4c 3b  SQLITE_PROTOCOL;
2a200 0a 0a 20 20 2f 2a 20 4e 6f 74 65 20 74 68 61 74  ..  /* Note that
2a210 20 53 51 4c 49 54 45 5f 53 48 4d 5f 52 45 41 44   SQLITE_SHM_READ
2a220 5f 46 55 4c 4c 20 61 6e 64 20 53 51 4c 49 54 45  _FULL and SQLITE
2a230 5f 53 48 4d 5f 50 45 4e 44 49 4e 47 20 61 72 65  _SHM_PENDING are
2a240 20 6e 65 76 65 72 0a 20 20 2a 2a 20 64 69 72 65   never.  ** dire
2a250 63 74 6c 79 20 72 65 71 75 65 73 74 65 64 3b 20  ctly requested; 
2a260 74 68 65 79 20 61 72 65 20 73 69 64 65 20 65 66  they are side ef
2a270 66 65 63 74 73 20 66 72 6f 6d 20 72 65 71 75 65  fects from reque
2a280 73 74 69 6e 67 0a 20 20 2a 2a 20 53 51 4c 49 54  sting.  ** SQLIT
2a290 45 5f 53 48 4d 5f 52 45 41 44 20 61 6e 64 20 53  E_SHM_READ and S
2a2a0 51 4c 49 54 45 5f 53 48 4d 5f 43 48 45 43 4b 50  QLITE_SHM_CHECKP
2a2b0 4f 49 4e 54 2c 20 72 65 73 70 65 63 74 69 76 65  OINT, respective
2a2c0 6c 79 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72  ly..  */.  asser
2a2d0 74 28 20 64 65 73 69 72 65 64 4c 6f 63 6b 3d 3d  t( desiredLock==
2a2e0 53 51 4c 49 54 45 5f 53 48 4d 5f 51 55 45 52 59  SQLITE_SHM_QUERY
2a2f0 0a 20 20 20 20 20 20 20 7c 7c 20 64 65 73 69 72  .       || desir
2a300 65 64 4c 6f 63 6b 3d 3d 53 51 4c 49 54 45 5f 53  edLock==SQLITE_S
2a310 48 4d 5f 55 4e 4c 4f 43 4b 0a 20 20 20 20 20 20  HM_UNLOCK.      
2a320 20 7c 7c 20 64 65 73 69 72 65 64 4c 6f 63 6b 3d   || desiredLock=
2a330 3d 53 51 4c 49 54 45 5f 53 48 4d 5f 52 45 41 44  =SQLITE_SHM_READ
2a340 0a 20 20 20 20 20 20 20 7c 7c 20 64 65 73 69 72  .       || desir
2a350 65 64 4c 6f 63 6b 3d 3d 53 51 4c 49 54 45 5f 53  edLock==SQLITE_S
2a360 48 4d 5f 57 52 49 54 45 0a 20 20 20 20 20 20 20  HM_WRITE.       
2a370 7c 7c 20 64 65 73 69 72 65 64 4c 6f 63 6b 3d 3d  || desiredLock==
2a380 53 51 4c 49 54 45 5f 53 48 4d 5f 43 48 45 43 4b  SQLITE_SHM_CHECK
2a390 50 4f 49 4e 54 0a 20 20 20 20 20 20 20 7c 7c 20  POINT.       || 
2a3a0 64 65 73 69 72 65 64 4c 6f 63 6b 3d 3d 53 51 4c  desiredLock==SQL
2a3b0 49 54 45 5f 53 48 4d 5f 52 45 43 4f 56 45 52 20  ITE_SHM_RECOVER 
2a3c0 29 3b 0a 0a 20 20 2f 2a 20 52 65 74 75 72 6e 20  );..  /* Return 
2a3d0 64 69 72 65 63 74 6c 79 20 69 66 20 74 68 69 73  directly if this
2a3e0 20 69 73 20 6a 75 73 74 20 61 20 6c 6f 63 6b 20   is just a lock 
2a3f0 73 74 61 74 65 20 71 75 65 72 79 2c 20 6f 72 20  state query, or 
2a400 69 66 0a 20 20 2a 2a 20 74 68 65 20 63 6f 6e 6e  if.  ** the conn
2a410 65 63 74 69 6f 6e 20 69 73 20 61 6c 72 65 61 64  ection is alread
2a420 79 20 69 6e 20 74 68 65 20 64 65 73 69 72 65 64  y in the desired
2a430 20 6c 6f 63 6b 69 6e 67 20 73 74 61 74 65 2e 0a   locking state..
2a440 20 20 2a 2f 0a 20 20 69 66 28 20 64 65 73 69 72    */.  if( desir
2a450 65 64 4c 6f 63 6b 3d 3d 53 51 4c 49 54 45 5f 53  edLock==SQLITE_S
2a460 48 4d 5f 51 55 45 52 59 0a 20 20 20 7c 7c 20 64  HM_QUERY.   || d
2a470 65 73 69 72 65 64 4c 6f 63 6b 3d 3d 70 2d 3e 6c  esiredLock==p->l
2a480 6f 63 6b 53 74 61 74 65 0a 20 20 20 7c 7c 20 28  ockState.   || (
2a490 64 65 73 69 72 65 64 4c 6f 63 6b 3d 3d 53 51 4c  desiredLock==SQL
2a4a0 49 54 45 5f 53 48 4d 5f 52 45 41 44 20 26 26 20  ITE_SHM_READ && 
2a4b0 70 2d 3e 6c 6f 63 6b 53 74 61 74 65 3d 3d 53 51  p->lockState==SQ
2a4c0 4c 49 54 45 5f 53 48 4d 5f 52 45 41 44 5f 46 55  LITE_SHM_READ_FU
2a4d0 4c 4c 29 0a 20 20 29 7b 0a 20 20 20 20 4f 53 54  LL).  ){.    OST
2a4e0 52 41 43 45 28 28 22 53 48 4d 2d 4c 4f 43 4b 20  RACE(("SHM-LOCK 
2a4f0 73 68 6d 69 64 2d 25 64 2c 20 70 69 64 2d 25 64  shmid-%d, pid-%d
2a500 20 72 65 71 75 65 73 74 20 25 73 20 61 6e 64 20   request %s and 
2a510 67 6f 74 20 25 73 5c 6e 22 2c 0a 20 20 20 20 20  got %s\n",.     
2a520 20 20 20 20 20 20 20 20 70 2d 3e 69 64 2c 20 67          p->id, g
2a530 65 74 70 69 64 28 29 2c 20 61 7a 4c 6b 4e 61 6d  etpid(), azLkNam
2a540 65 5b 64 65 73 69 72 65 64 4c 6f 63 6b 5d 2c 20  e[desiredLock], 
2a550 61 7a 4c 6b 4e 61 6d 65 5b 70 2d 3e 6c 6f 63 6b  azLkName[p->lock
2a560 53 74 61 74 65 5d 29 29 3b 0a 20 20 20 20 69 66  State]));.    if
2a570 28 20 70 47 6f 74 4c 6f 63 6b 20 29 20 2a 70 47  ( pGotLock ) *pG
2a580 6f 74 4c 6f 63 6b 20 3d 20 70 2d 3e 6c 6f 63 6b  otLock = p->lock
2a590 53 74 61 74 65 3b 0a 20 20 20 20 72 65 74 75 72  State;.    retur
2a5a0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
2a5b0 0a 0a 20 20 4f 53 54 52 41 43 45 28 28 22 53 48  ..  OSTRACE(("SH
2a5c0 4d 2d 4c 4f 43 4b 20 73 68 6d 69 64 2d 25 64 2c  M-LOCK shmid-%d,
2a5d0 20 70 69 64 2d 25 64 20 72 65 71 75 65 73 74 20   pid-%d request 
2a5e0 25 73 2d 3e 25 73 5c 6e 22 2c 0a 20 20 20 20 20  %s->%s\n",.     
2a5f0 20 20 20 20 20 20 20 70 2d 3e 69 64 2c 20 67 65         p->id, ge
2a600 74 70 69 64 28 29 2c 20 61 7a 4c 6b 4e 61 6d 65  tpid(), azLkName
2a610 5b 70 2d 3e 6c 6f 63 6b 53 74 61 74 65 5d 2c 20  [p->lockState], 
2a620 61 7a 4c 6b 4e 61 6d 65 5b 64 65 73 69 72 65 64  azLkName[desired
2a630 4c 6f 63 6b 5d 29 29 3b 0a 20 20 0a 20 20 69 66  Lock]));.  .  if
2a640 28 20 64 65 73 69 72 65 64 4c 6f 63 6b 3d 3d 53  ( desiredLock==S
2a650 51 4c 49 54 45 5f 53 48 4d 5f 52 45 43 4f 56 45  QLITE_SHM_RECOVE
2a660 52 20 26 26 20 21 70 2d 3e 68 61 73 4d 75 74 65  R && !p->hasMute
2a670 78 42 75 66 20 29 7b 0a 20 20 20 20 61 73 73 65  xBuf ){.    asse
2a680 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
2a690 78 5f 6e 6f 74 68 65 6c 64 28 70 46 69 6c 65 2d  x_notheld(pFile-
2a6a0 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 20 20 73  >mutex) );.    s
2a6b0 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74  qlite3_mutex_ent
2a6c0 65 72 28 70 46 69 6c 65 2d 3e 6d 75 74 65 78 42  er(pFile->mutexB
2a6d0 75 66 29 3b 0a 20 20 20 20 70 2d 3e 68 61 73 4d  uf);.    p->hasM
2a6e0 75 74 65 78 42 75 66 20 3d 20 31 3b 0a 20 20 7d  utexBuf = 1;.  }
2a6f0 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
2a700 5f 65 6e 74 65 72 28 70 46 69 6c 65 2d 3e 6d 75  _enter(pFile->mu
2a710 74 65 78 29 3b 0a 20 20 73 77 69 74 63 68 28 20  tex);.  switch( 
2a720 64 65 73 69 72 65 64 4c 6f 63 6b 20 29 7b 0a 20  desiredLock ){. 
2a730 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 53     case SQLITE_S
2a740 48 4d 5f 55 4e 4c 4f 43 4b 3a 20 7b 0a 20 20 20  HM_UNLOCK: {.   
2a750 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6c 6f     assert( p->lo
2a760 63 6b 53 74 61 74 65 21 3d 53 51 4c 49 54 45 5f  ckState!=SQLITE_
2a770 53 48 4d 5f 52 45 43 4f 56 45 52 20 29 3b 0a 20  SHM_RECOVER );. 
2a780 20 20 20 20 20 75 6e 69 78 53 68 6d 55 6e 6c 6f       unixShmUnlo
2a790 63 6b 28 70 46 69 6c 65 2c 20 70 2c 20 55 4e 49  ck(pFile, p, UNI
2a7a0 58 5f 53 48 4d 5f 41 7c 55 4e 49 58 5f 53 48 4d  X_SHM_A|UNIX_SHM
2a7b0 5f 42 7c 55 4e 49 58 5f 53 48 4d 5f 43 7c 55 4e  _B|UNIX_SHM_C|UN
2a7c0 49 58 5f 53 48 4d 5f 44 29 3b 0a 20 20 20 20 20  IX_SHM_D);.     
2a7d0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
2a7e0 0a 20 20 20 20 20 20 70 2d 3e 6c 6f 63 6b 53 74  .      p->lockSt
2a7f0 61 74 65 20 3d 20 53 51 4c 49 54 45 5f 53 48 4d  ate = SQLITE_SHM
2a800 5f 55 4e 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 62  _UNLOCK;.      b
2a810 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
2a820 63 61 73 65 20 53 51 4c 49 54 45 5f 53 48 4d 5f  case SQLITE_SHM_
2a830 52 45 41 44 3a 20 7b 0a 20 20 20 20 20 20 69 66  READ: {.      if
2a840 28 20 70 2d 3e 6c 6f 63 6b 53 74 61 74 65 3d 3d  ( p->lockState==
2a850 53 51 4c 49 54 45 5f 53 48 4d 5f 55 4e 4c 4f 43  SQLITE_SHM_UNLOC
2a860 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74  K ){.        int
2a870 20 6e 41 74 74 65 6d 70 74 3b 0a 20 20 20 20 20   nAttempt;.     
2a880 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42     rc = SQLITE_B
2a890 55 53 59 3b 0a 20 20 20 20 20 20 20 20 61 73 73  USY;.        ass
2a8a0 65 72 74 28 20 70 2d 3e 6c 6f 63 6b 53 74 61 74  ert( p->lockStat
2a8b0 65 3d 3d 53 51 4c 49 54 45 5f 53 48 4d 5f 55 4e  e==SQLITE_SHM_UN
2a8c0 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 20 20 20 20  LOCK );.        
2a8d0 66 6f 72 28 6e 41 74 74 65 6d 70 74 3d 30 3b 20  for(nAttempt=0; 
2a8e0 6e 41 74 74 65 6d 70 74 3c 35 20 26 26 20 72 63  nAttempt<5 && rc
2a8f0 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59 3b 20 6e  ==SQLITE_BUSY; n
2a900 41 74 74 65 6d 70 74 2b 2b 29 7b 0a 20 20 20 20  Attempt++){.    
2a910 20 20 20 20 20 20 72 63 20 3d 20 75 6e 69 78 53        rc = unixS
2a920 68 6d 53 68 61 72 65 64 4c 6f 63 6b 28 70 46 69  hmSharedLock(pFi
2a930 6c 65 2c 20 70 2c 20 55 4e 49 58 5f 53 48 4d 5f  le, p, UNIX_SHM_
2a940 41 7c 55 4e 49 58 5f 53 48 4d 5f 42 29 3b 0a 20  A|UNIX_SHM_B);. 
2a950 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d           if( rc=
2a960 3d 53 51 4c 49 54 45 5f 42 55 53 59 20 29 7b 0a  =SQLITE_BUSY ){.
2a970 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d              rc =
2a980 20 75 6e 69 78 53 68 6d 53 68 61 72 65 64 4c 6f   unixShmSharedLo
2a990 63 6b 28 70 46 69 6c 65 2c 20 70 2c 20 55 4e 49  ck(pFile, p, UNI
2a9a0 58 5f 53 48 4d 5f 44 29 3b 0a 20 20 20 20 20 20  X_SHM_D);.      
2a9b0 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
2a9c0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
2a9d0 20 20 20 20 20 20 20 20 20 70 2d 3e 6c 6f 63 6b           p->lock
2a9e0 53 74 61 74 65 20 3d 20 70 2d 3e 72 65 61 64 4c  State = p->readL
2a9f0 6f 63 6b 20 3d 20 53 51 4c 49 54 45 5f 53 48 4d  ock = SQLITE_SHM
2aa00 5f 52 45 41 44 5f 46 55 4c 4c 3b 0a 20 20 20 20  _READ_FULL;.    
2aa10 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2aa20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
2aa30 20 20 20 20 20 20 20 75 6e 69 78 53 68 6d 55 6e         unixShmUn
2aa40 6c 6f 63 6b 28 70 46 69 6c 65 2c 20 70 2c 20 55  lock(pFile, p, U
2aa50 4e 49 58 5f 53 48 4d 5f 42 29 3b 0a 20 20 20 20  NIX_SHM_B);.    
2aa60 20 20 20 20 20 20 20 20 70 2d 3e 6c 6f 63 6b 53          p->lockS
2aa70 74 61 74 65 20 3d 20 70 2d 3e 72 65 61 64 4c 6f  tate = p->readLo
2aa80 63 6b 20 3d 20 53 51 4c 49 54 45 5f 53 48 4d 5f  ck = SQLITE_SHM_
2aa90 52 45 41 44 3b 0a 20 20 20 20 20 20 20 20 20 20  READ;.          
2aaa0 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
2aab0 20 20 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e 6c    }else if( p->l
2aac0 6f 63 6b 53 74 61 74 65 3d 3d 53 51 4c 49 54 45  ockState==SQLITE
2aad0 5f 53 48 4d 5f 57 52 49 54 45 20 29 7b 0a 20 20  _SHM_WRITE ){.  
2aae0 20 20 20 20 20 20 72 63 20 3d 20 75 6e 69 78 53        rc = unixS
2aaf0 68 6d 53 68 61 72 65 64 4c 6f 63 6b 28 70 46 69  hmSharedLock(pFi
2ab00 6c 65 2c 20 70 2c 20 55 4e 49 58 5f 53 48 4d 5f  le, p, UNIX_SHM_
2ab10 41 29 3b 0a 20 20 20 20 20 20 20 20 75 6e 69 78  A);.        unix
2ab20 53 68 6d 55 6e 6c 6f 63 6b 28 70 46 69 6c 65 2c  ShmUnlock(pFile,
2ab30 20 70 2c 20 55 4e 49 58 5f 53 48 4d 5f 43 7c 55   p, UNIX_SHM_C|U
2ab40 4e 49 58 5f 53 48 4d 5f 44 29 3b 0a 20 20 20 20  NIX_SHM_D);.    
2ab50 20 20 20 20 70 2d 3e 6c 6f 63 6b 53 74 61 74 65      p->lockState
2ab60 20 3d 20 70 2d 3e 72 65 61 64 4c 6f 63 6b 20 3d   = p->readLock =
2ab70 20 53 51 4c 49 54 45 5f 53 48 4d 5f 52 45 41 44   SQLITE_SHM_READ
2ab80 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
2ab90 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
2aba0 2d 3e 6c 6f 63 6b 53 74 61 74 65 3d 3d 53 51 4c  ->lockState==SQL
2abb0 49 54 45 5f 53 48 4d 5f 52 45 43 4f 56 45 52 20  ITE_SHM_RECOVER 
2abc0 29 3b 0a 20 20 20 20 20 20 20 20 75 6e 69 78 53  );.        unixS
2abd0 68 6d 55 6e 6c 6f 63 6b 28 70 46 69 6c 65 2c 20  hmUnlock(pFile, 
2abe0 70 2c 20 55 4e 49 58 5f 53 48 4d 5f 4d 55 54 45  p, UNIX_SHM_MUTE
2abf0 58 29 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 6c  X);.        p->l
2ac00 6f 63 6b 53 74 61 74 65 20 3d 20 70 2d 3e 72 65  ockState = p->re
2ac10 61 64 4c 6f 63 6b 3b 0a 20 20 20 20 20 20 20 20  adLock;.        
2ac20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
2ac30 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72        }.      br
2ac40 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
2ac50 61 73 65 20 53 51 4c 49 54 45 5f 53 48 4d 5f 57  ase SQLITE_SHM_W
2ac60 52 49 54 45 3a 20 7b 0a 20 20 20 20 20 20 61 73  RITE: {.      as
2ac70 73 65 72 74 28 20 70 2d 3e 6c 6f 63 6b 53 74 61  sert( p->lockSta
2ac80 74 65 3d 3d 53 51 4c 49 54 45 5f 53 48 4d 5f 52  te==SQLITE_SHM_R
2ac90 45 41 44 20 0a 20 20 20 20 20 20 20 20 20 20 20  EAD .           
2aca0 20 20 20 7c 7c 20 70 2d 3e 6c 6f 63 6b 53 74 61     || p->lockSta
2acb0 74 65 3d 3d 53 51 4c 49 54 45 5f 53 48 4d 5f 52  te==SQLITE_SHM_R
2acc0 45 41 44 5f 46 55 4c 4c 20 29 3b 0a 20 20 20 20  EAD_FULL );.    
2acd0 20 20 72 63 20 3d 20 75 6e 69 78 53 68 6d 45 78    rc = unixShmEx
2ace0 63 6c 75 73 69 76 65 4c 6f 63 6b 28 70 46 69 6c  clusiveLock(pFil
2acf0 65 2c 20 70 2c 20 55 4e 49 58 5f 53 48 4d 5f 43  e, p, UNIX_SHM_C
2ad00 7c 55 4e 49 58 5f 53 48 4d 5f 44 29 3b 0a 20 20  |UNIX_SHM_D);.  
2ad10 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
2ad20 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
2ad30 20 70 2d 3e 6c 6f 63 6b 53 74 61 74 65 20 3d 20   p->lockState = 
2ad40 53 51 4c 49 54 45 5f 53 48 4d 5f 57 52 49 54 45  SQLITE_SHM_WRITE
2ad50 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
2ad60 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
2ad70 20 63 61 73 65 20 53 51 4c 49 54 45 5f 53 48 4d   case SQLITE_SHM
2ad80 5f 43 48 45 43 4b 50 4f 49 4e 54 3a 20 7b 0a 20  _CHECKPOINT: {. 
2ad90 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e       assert( p->
2ada0 6c 6f 63 6b 53 74 61 74 65 3d 3d 53 51 4c 49 54  lockState==SQLIT
2adb0 45 5f 53 48 4d 5f 55 4e 4c 4f 43 4b 0a 20 20 20  E_SHM_UNLOCK.   
2adc0 20 20 20 20 20 20 20 20 7c 7c 20 70 2d 3e 6c 6f          || p->lo
2add0 63 6b 53 74 61 74 65 3d 3d 53 51 4c 49 54 45 5f  ckState==SQLITE_
2ade0 53 48 4d 5f 50 45 4e 44 49 4e 47 0a 20 20 20 20  SHM_PENDING.    
2adf0 20 20 20 20 20 20 20 7c 7c 20 70 2d 3e 6c 6f 63         || p->loc
2ae00 6b 53 74 61 74 65 3d 3d 53 51 4c 49 54 45 5f 53  kState==SQLITE_S
2ae10 48 4d 5f 52 45 43 4f 56 45 52 20 29 3b 0a 20 20  HM_RECOVER );.  
2ae20 20 20 20 20 69 66 28 20 70 2d 3e 6c 6f 63 6b 53      if( p->lockS
2ae30 74 61 74 65 3d 3d 53 51 4c 49 54 45 5f 53 48 4d  tate==SQLITE_SHM
2ae40 5f 52 45 43 4f 56 45 52 20 29 7b 0a 20 20 20 20  _RECOVER ){.    
2ae50 20 20 20 20 75 6e 69 78 53 68 6d 55 6e 6c 6f 63      unixShmUnloc
2ae60 6b 28 70 46 69 6c 65 2c 20 70 2c 20 55 4e 49 58  k(pFile, p, UNIX
2ae70 5f 53 48 4d 5f 4d 55 54 45 58 29 3b 0a 20 20 20  _SHM_MUTEX);.   
2ae80 20 20 20 20 20 70 2d 3e 6c 6f 63 6b 53 74 61 74       p->lockStat
2ae90 65 20 3d 20 53 51 4c 49 54 45 5f 53 48 4d 5f 43  e = SQLITE_SHM_C
2aea0 48 45 43 4b 50 4f 49 4e 54 3b 0a 20 20 20 20 20  HECKPOINT;.     
2aeb0 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f     rc = SQLITE_O
2aec0 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  K;.      }.     
2aed0 20 69 66 28 20 70 2d 3e 6c 6f 63 6b 53 74 61 74   if( p->lockStat
2aee0 65 3d 3d 53 51 4c 49 54 45 5f 53 48 4d 5f 55 4e  e==SQLITE_SHM_UN
2aef0 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  LOCK ){.        
2af00 72 63 20 3d 20 75 6e 69 78 53 68 6d 45 78 63 6c  rc = unixShmExcl
2af10 75 73 69 76 65 4c 6f 63 6b 28 70 46 69 6c 65 2c  usiveLock(pFile,
2af20 20 70 2c 20 55 4e 49 58 5f 53 48 4d 5f 42 7c 55   p, UNIX_SHM_B|U
2af30 4e 49 58 5f 53 48 4d 5f 43 29 3b 0a 20 20 20 20  NIX_SHM_C);.    
2af40 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
2af50 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
2af60 20 20 20 70 2d 3e 6c 6f 63 6b 53 74 61 74 65 20     p->lockState 
2af70 3d 20 53 51 4c 49 54 45 5f 53 48 4d 5f 50 45 4e  = SQLITE_SHM_PEN
2af80 44 49 4e 47 3b 0a 20 20 20 20 20 20 20 20 7d 0a  DING;.        }.
2af90 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
2afa0 28 20 70 2d 3e 6c 6f 63 6b 53 74 61 74 65 3d 3d  ( p->lockState==
2afb0 53 51 4c 49 54 45 5f 53 48 4d 5f 50 45 4e 44 49  SQLITE_SHM_PENDI
2afc0 4e 47 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  NG ){.        rc
2afd0 20 3d 20 75 6e 69 78 53 68 6d 45 78 63 6c 75 73   = unixShmExclus
2afe0 69 76 65 4c 6f 63 6b 28 70 46 69 6c 65 2c 20 70  iveLock(pFile, p
2aff0 2c 20 55 4e 49 58 5f 53 48 4d 5f 41 29 3b 0a 20  , UNIX_SHM_A);. 
2b000 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53         if( rc==S
2b010 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
2b020 20 20 20 20 20 20 70 2d 3e 6c 6f 63 6b 53 74 61        p->lockSta
2b030 74 65 20 3d 20 53 51 4c 49 54 45 5f 53 48 4d 5f  te = SQLITE_SHM_
2b040 43 48 45 43 4b 50 4f 49 4e 54 3b 0a 20 20 20 20  CHECKPOINT;.    
2b050 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
2b060 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
2b070 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a  .    default: {.
2b080 20 20 20 20 20 20 61 73 73 65 72 74 28 20 64 65        assert( de
2b090 73 69 72 65 64 4c 6f 63 6b 3d 3d 53 51 4c 49 54  siredLock==SQLIT
2b0a0 45 5f 53 48 4d 5f 52 45 43 4f 56 45 52 20 29 3b  E_SHM_RECOVER );
2b0b0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
2b0c0 2d 3e 6c 6f 63 6b 53 74 61 74 65 3d 3d 53 51 4c  ->lockState==SQL
2b0d0 49 54 45 5f 53 48 4d 5f 52 45 41 44 0a 20 20 20  ITE_SHM_READ.   
2b0e0 20 20 20 20 20 20 20 20 7c 7c 20 70 2d 3e 6c 6f          || p->lo
2b0f0 63 6b 53 74 61 74 65 3d 3d 53 51 4c 49 54 45 5f  ckState==SQLITE_
2b100 53 48 4d 5f 52 45 41 44 5f 46 55 4c 4c 0a 20 20  SHM_READ_FULL.  
2b110 20 20 20 20 20 20 20 20 20 7c 7c 20 70 2d 3e 6c           || p->l
2b120 6f 63 6b 53 74 61 74 65 3d 3d 53 51 4c 49 54 45  ockState==SQLITE
2b130 5f 53 48 4d 5f 43 48 45 43 4b 50 4f 49 4e 54 20  _SHM_CHECKPOINT 
2b140 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
2b150 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
2b160 65 6c 64 28 70 46 69 6c 65 2d 3e 6d 75 74 65 78  eld(pFile->mutex
2b170 42 75 66 29 20 29 3b 0a 20 20 20 20 20 20 72 63  Buf) );.      rc
2b180 20 3d 20 75 6e 69 78 53 68 6d 45 78 63 6c 75 73   = unixShmExclus
2b190 69 76 65 4c 6f 63 6b 28 70 46 69 6c 65 2c 20 70  iveLock(pFile, p
2b1a0 2c 20 55 4e 49 58 5f 53 48 4d 5f 4d 55 54 45 58  , UNIX_SHM_MUTEX
2b1b0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d  );.      if( rc=
2b1c0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
2b1d0 20 20 20 20 20 20 70 2d 3e 6c 6f 63 6b 53 74 61        p->lockSta
2b1e0 74 65 20 3d 20 53 51 4c 49 54 45 5f 53 48 4d 5f  te = SQLITE_SHM_
2b1f0 52 45 43 4f 56 45 52 3b 0a 20 20 20 20 20 20 7d  RECOVER;.      }
2b200 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
2b210 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65    }.  }.  sqlite
2b220 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 70 46  3_mutex_leave(pF
2b230 69 6c 65 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 4f  ile->mutex);.  O
2b240 53 54 52 41 43 45 28 28 22 53 48 4d 2d 4c 4f 43  STRACE(("SHM-LOC
2b250 4b 20 73 68 6d 69 64 2d 25 64 2c 20 70 69 64 2d  K shmid-%d, pid-
2b260 25 64 20 67 6f 74 20 25 73 5c 6e 22 2c 0a 20 20  %d got %s\n",.  
2b270 20 20 20 20 20 20 20 20 20 70 2d 3e 69 64 2c 20           p->id, 
2b280 67 65 74 70 69 64 28 29 2c 20 61 7a 4c 6b 4e 61  getpid(), azLkNa
2b290 6d 65 5b 70 2d 3e 6c 6f 63 6b 53 74 61 74 65 5d  me[p->lockState]
2b2a0 29 29 3b 0a 20 20 69 66 28 20 70 47 6f 74 4c 6f  ));.  if( pGotLo
2b2b0 63 6b 20 29 20 2a 70 47 6f 74 4c 6f 63 6b 20 3d  ck ) *pGotLock =
2b2c0 20 70 2d 3e 6c 6f 63 6b 53 74 61 74 65 3b 0a 20   p->lockState;. 
2b2d0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23   return rc;.}..#
2b2e0 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 75 6e  else.# define un
2b2f0 69 78 53 68 6d 4f 70 65 6e 20 20 20 20 30 0a 23  ixShmOpen    0.#
2b300 20 64 65 66 69 6e 65 20 75 6e 69 78 53 68 6d 53   define unixShmS
2b310 69 7a 65 20 20 20 20 30 0a 23 20 64 65 66 69 6e  ize    0.# defin
2b320 65 20 75 6e 69 78 53 68 6d 47 65 74 20 20 20 20  e unixShmGet    
2b330 20 30 0a 23 20 64 65 66 69 6e 65 20 75 6e 69 78   0.# define unix
2b340 53 68 6d 52 65 6c 65 61 73 65 20 30 0a 23 20 64  ShmRelease 0.# d
2b350 65 66 69 6e 65 20 75 6e 69 78 53 68 6d 4c 6f 63  efine unixShmLoc
2b360 6b 20 20 20 20 30 0a 23 20 64 65 66 69 6e 65 20  k    0.# define 
2b370 75 6e 69 78 53 68 6d 43 6c 6f 73 65 20 20 20 30  unixShmClose   0
2b380 0a 23 65 6e 64 69 66 20 2f 2a 20 23 69 66 6e 64  .#endif /* #ifnd
2b390 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57  ef SQLITE_OMIT_W
2b3a0 41 4c 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 2a 2a 2a 2a  AL */../*.******
2b3b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2b3c0 2a 2a 20 45 6e 64 20 6f 66 20 73 71 6c 69 74 65  ** End of sqlite
2b3d0 33 5f 76 66 73 20 6d 65 74 68 6f 64 73 20 2a 2a  3_vfs methods **
2b3e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2b3f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a  *********.******
2b400 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2b410 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2b420 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2b430 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2b440 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 2a 2a 2a  ********/../****
2b450 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2b460 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2b470 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2b480 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2b490 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a  **********.*****
2b4a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2b4b0 2a 2a 2a 2a 2a 20 42 65 67 69 6e 20 50 72 6f 78  ***** Begin Prox
2b4c0 79 20 4c 6f 63 6b 69 6e 67 20 2a 2a 2a 2a 2a 2a  y Locking ******
2b4d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2b4e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a  **********.**.**
2b4f0 20 50 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 20 69   Proxy locking i
2b500 73 20 61 20 22 75 62 65 72 2d 6c 6f 63 6b 69 6e  s a "uber-lockin
2b510 67 2d 6d 65 74 68 6f 64 22 20 69 6e 20 74 68 69  g-method" in thi
2b520 73 20 73 65 6e 73 65 3a 20 20 49 74 20 75 73 65  s sense:  It use
2b530 73 20 74 68 65 0a 2a 2a 20 6f 74 68 65 72 20 6c  s the.** other l
2b540 6f 63 6b 69 6e 67 20 6d 65 74 68 6f 64 73 20 6f  ocking methods o
2b550 6e 20 73 65 63 6f 6e 64 61 72 79 20 6c 6f 63 6b  n secondary lock
2b560 20 66 69 6c 65 73 2e 20 20 50 72 6f 78 79 20 6c   files.  Proxy l
2b570 6f 63 6b 69 6e 67 20 69 73 20 61 0a 2a 2a 20 6d  ocking is a.** m
2b580 65 74 61 2d 6c 61 79 65 72 20 6f 76 65 72 20 74  eta-layer over t
2b590 6f 70 20 6f 66 20 74 68 65 20 70 72 69 6d 69 74  op of the primit
2b5a0 69 76 65 20 6c 6f 63 6b 69 6e 67 20 69 6d 70 6c  ive locking impl
2b5b0 65 6d 65 6e 74 65 64 20 61 62 6f 76 65 2e 20 20  emented above.  
2b5c0 46 6f 72 0a 2a 2a 20 74 68 69 73 20 72 65 61 73  For.** this reas
2b5d0 6f 6e 2c 20 74 68 65 20 64 69 76 69 73 69 6f 6e  on, the division
2b5e0 20 74 68 61 74 20 69 6d 70 6c 65 6d 65 6e 74 73   that implements
2b5f0 20 6f 66 20 70 72 6f 78 79 20 6c 6f 63 6b 69 6e   of proxy lockin
2b600 67 20 69 73 20 64 65 66 65 72 72 65 64 0a 2a 2a  g is deferred.**
2b610 20 75 6e 74 69 6c 20 6c 61 74 65 20 69 6e 20 74   until late in t
2b620 68 65 20 66 69 6c 65 20 28 68 65 72 65 29 20 61  he file (here) a
2b630 66 74 65 72 20 61 6c 6c 20 6f 66 20 74 68 65 20  fter all of the 
2b640 6f 74 68 65 72 20 49 2f 4f 20 6d 65 74 68 6f 64  other I/O method
2b650 73 20 68 61 76 65 0a 2a 2a 20 62 65 65 6e 20 64  s have.** been d
2b660 65 66 69 6e 65 64 20 2d 20 73 6f 20 74 68 61 74  efined - so that
2b670 20 74 68 65 20 70 72 69 6d 69 74 69 76 65 20 6c   the primitive l
2b680 6f 63 6b 69 6e 67 20 6d 65 74 68 6f 64 73 20 61  ocking methods a
2b690 72 65 20 61 76 61 69 6c 61 62 6c 65 0a 2a 2a 20  re available.** 
2b6a0 61 73 20 73 65 72 76 69 63 65 73 20 74 6f 20 68  as services to h
2b6b0 65 6c 70 20 77 69 74 68 20 74 68 65 20 69 6d 70  elp with the imp
2b6c0 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 70  lementation of p
2b6d0 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 2e 0a 2a 2a  roxy locking..**
2b6e0 0a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 54 68 65 20  .****.**.** The 
2b6f0 64 65 66 61 75 6c 74 20 6c 6f 63 6b 69 6e 67 20  default locking 
2b700 73 63 68 65 6d 65 73 20 69 6e 20 53 51 4c 69 74  schemes in SQLit
2b710 65 20 75 73 65 20 62 79 74 65 2d 72 61 6e 67 65  e use byte-range
2b720 20 6c 6f 63 6b 73 20 6f 6e 20 74 68 65 0a 2a 2a   locks on the.**
2b730 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 74   database file t
2b740 6f 20 63 6f 6f 72 64 69 6e 61 74 65 20 73 61 66  o coordinate saf
2b750 65 2c 20 63 6f 6e 63 75 72 72 65 6e 74 20 61 63  e, concurrent ac
2b760 63 65 73 73 20 62 79 20 6d 75 6c 74 69 70 6c 65  cess by multiple
2b770 20 72 65 61 64 65 72 73 0a 2a 2a 20 61 6e 64 20   readers.** and 
2b780 77 72 69 74 65 72 73 20 5b 68 74 74 70 3a 2f 2f  writers [http://
2b790 73 71 6c 69 74 65 2e 6f 72 67 2f 6c 6f 63 6b 69  sqlite.org/locki
2b7a0 6e 67 76 33 2e 68 74 6d 6c 5d 2e 20 20 54 68 65  ngv3.html].  The
2b7b0 20 66 69 76 65 20 66 69 6c 65 20 6c 6f 63 6b 69   five file locki
2b7c0 6e 67 0a 2a 2a 20 73 74 61 74 65 73 20 28 55 4e  ng.** states (UN
2b7d0 4c 4f 43 4b 45 44 2c 20 50 45 4e 44 49 4e 47 2c  LOCKED, PENDING,
2b7e0 20 53 48 41 52 45 44 2c 20 52 45 53 45 52 56 45   SHARED, RESERVE
2b7f0 44 2c 20 45 58 43 4c 55 53 49 56 45 29 20 61 72  D, EXCLUSIVE) ar
2b800 65 20 69 6d 70 6c 65 6d 65 6e 74 65 64 0a 2a 2a  e implemented.**
2b810 20 61 73 20 50 4f 53 49 58 20 72 65 61 64 20 26   as POSIX read &
2b820 20 77 72 69 74 65 20 6c 6f 63 6b 73 20 6f 76 65   write locks ove
2b830 72 20 66 69 78 65 64 20 73 65 74 20 6f 66 20 6c  r fixed set of l
2b840 6f 63 61 74 69 6f 6e 73 20 28 76 69 61 20 66 73  ocations (via fs
2b850 63 74 6c 29 2c 0a 2a 2a 20 6f 6e 20 41 46 50 20  ctl),.** on AFP 
2b860 61 6e 64 20 53 4d 42 20 6f 6e 6c 79 20 65 78 63  and SMB only exc
2b870 6c 75 73 69 76 65 20 62 79 74 65 2d 72 61 6e 67  lusive byte-rang
2b880 65 20 6c 6f 63 6b 73 20 61 72 65 20 61 76 61 69  e locks are avai
2b890 6c 61 62 6c 65 20 76 69 61 20 66 73 63 74 6c 0a  lable via fsctl.
2b8a0 2a 2a 20 77 69 74 68 20 5f 49 4f 57 52 28 27 7a  ** with _IOWR('z
2b8b0 27 2c 20 32 33 2c 20 73 74 72 75 63 74 20 42 79  ', 23, struct By
2b8c0 74 65 52 61 6e 67 65 4c 6f 63 6b 50 42 32 29 20  teRangeLockPB2) 
2b8d0 74 6f 20 74 72 61 63 6b 20 74 68 65 20 73 61 6d  to track the sam
2b8e0 65 20 35 20 73 74 61 74 65 73 2e 0a 2a 2a 20 54  e 5 states..** T
2b8f0 6f 20 73 69 6d 75 6c 61 74 65 20 61 20 46 5f 52  o simulate a F_R
2b900 44 4c 43 4b 20 6f 6e 20 74 68 65 20 73 68 61 72  DLCK on the shar
2b910 65 64 20 72 61 6e 67 65 2c 20 6f 6e 20 41 46 50  ed range, on AFP
2b920 20 61 20 72 61 6e 64 6f 6d 6c 79 20 73 65 6c 65   a randomly sele
2b930 63 74 65 64 0a 2a 2a 20 61 64 64 72 65 73 73 20  cted.** address 
2b940 69 6e 20 74 68 65 20 73 68 61 72 65 64 20 72 61  in the shared ra
2b950 6e 67 65 20 69 73 20 74 61 6b 65 6e 20 66 6f 72  nge is taken for
2b960 20 61 20 53 48 41 52 45 44 20 6c 6f 63 6b 2c 20   a SHARED lock, 
2b970 74 68 65 20 65 6e 74 69 72 65 0a 2a 2a 20 73 68  the entire.** sh
2b980 61 72 65 64 20 72 61 6e 67 65 20 69 73 20 74 61  ared range is ta
2b990 6b 65 6e 20 66 6f 72 20 61 6e 20 45 58 43 4c 55  ken for an EXCLU
2b9a0 53 49 56 45 20 6c 6f 63 6b 29 3a 0a 2a 2a 0a 2a  SIVE lock):.**.*
2b9b0 2a 20 20 20 20 20 20 50 45 4e 44 49 4e 47 5f 42  *      PENDING_B
2b9c0 59 54 45 20 20 20 20 20 20 20 20 30 78 34 30 30  YTE        0x400
2b9d0 30 30 30 30 30 09 09 20 20 20 09 0a 2a 2a 20 20  00000..   ..**  
2b9e0 20 20 20 20 52 45 53 45 52 56 45 44 5f 42 59 54      RESERVED_BYT
2b9f0 45 20 20 20 20 20 20 20 30 78 34 30 30 30 30 30  E       0x400000
2ba00 30 31 0a 2a 2a 20 20 20 20 20 20 53 48 41 52 45  01.**      SHARE
2ba10 44 5f 52 41 4e 47 45 20 20 20 20 20 20 20 20 30  D_RANGE        0
2ba20 78 34 30 30 30 30 30 30 32 20 2d 3e 20 30 78 34  x40000002 -> 0x4
2ba30 30 30 30 30 32 30 30 0a 2a 2a 0a 2a 2a 20 54 68  0000200.**.** Th
2ba40 69 73 20 77 6f 72 6b 73 20 77 65 6c 6c 20 6f 6e  is works well on
2ba50 20 74 68 65 20 6c 6f 63 61 6c 20 66 69 6c 65 20   the local file 
2ba60 73 79 73 74 65 6d 2c 20 62 75 74 20 73 68 6f 77  system, but show
2ba70 73 20 61 20 6e 65 61 72 6c 79 20 31 30 30 78 0a  s a nearly 100x.
2ba80 2a 2a 20 73 6c 6f 77 64 6f 77 6e 20 69 6e 20 72  ** slowdown in r
2ba90 65 61 64 20 70 65 72 66 6f 72 6d 61 6e 63 65 20  ead performance 
2baa0 6f 6e 20 41 46 50 20 62 65 63 61 75 73 65 20 74  on AFP because t
2bab0 68 65 20 41 46 50 20 63 6c 69 65 6e 74 20 64 69  he AFP client di
2bac0 73 61 62 6c 65 73 0a 2a 2a 20 74 68 65 20 72 65  sables.** the re
2bad0 61 64 20 63 61 63 68 65 20 77 68 65 6e 20 62 79  ad cache when by
2bae0 74 65 2d 72 61 6e 67 65 20 6c 6f 63 6b 73 20 61  te-range locks a
2baf0 72 65 20 70 72 65 73 65 6e 74 2e 20 20 45 6e 61  re present.  Ena
2bb00 62 6c 69 6e 67 20 74 68 65 20 72 65 61 64 0a 2a  bling the read.*
2bb10 2a 20 63 61 63 68 65 20 65 78 70 6f 73 65 73 20  * cache exposes 
2bb20 61 20 63 61 63 68 65 20 63 6f 68 65 72 65 6e 63  a cache coherenc
2bb30 79 20 70 72 6f 62 6c 65 6d 20 74 68 61 74 20 69  y problem that i
2bb40 73 20 70 72 65 73 65 6e 74 20 6f 6e 20 61 6c 6c  s present on all
2bb50 20 4f 53 20 58 0a 2a 2a 20 73 75 70 70 6f 72 74   OS X.** support
2bb60 65 64 20 6e 65 74 77 6f 72 6b 20 66 69 6c 65 20  ed network file 
2bb70 73 79 73 74 65 6d 73 2e 20 20 4e 46 53 20 61 6e  systems.  NFS an
2bb80 64 20 41 46 50 20 62 6f 74 68 20 6f 62 73 65 72  d AFP both obser
2bb90 76 65 20 74 68 65 0a 2a 2a 20 63 6c 6f 73 65 2d  ve the.** close-
2bba0 74 6f 2d 6f 70 65 6e 20 73 65 6d 61 6e 74 69 63  to-open semantic
2bbb0 73 20 66 6f 72 20 65 6e 73 75 72 69 6e 67 20 63  s for ensuring c
2bbc0 61 63 68 65 20 63 6f 68 65 72 65 6e 63 79 0a 2a  ache coherency.*
2bbd0 2a 20 5b 68 74 74 70 3a 2f 2f 6e 66 73 2e 73 6f  * [http://nfs.so
2bbe0 75 72 63 65 66 6f 72 67 65 2e 6e 65 74 2f 23 66  urceforge.net/#f
2bbf0 61 71 5f 61 38 5d 2c 20 77 68 69 63 68 20 64 6f  aq_a8], which do
2bc00 65 73 20 6e 6f 74 20 65 66 66 65 63 74 69 76 65  es not effective
2bc10 6c 79 0a 2a 2a 20 61 64 64 72 65 73 73 20 74 68  ly.** address th
2bc20 65 20 72 65 71 75 69 72 65 6d 65 6e 74 73 20 66  e requirements f
2bc30 6f 72 20 63 6f 6e 63 75 72 72 65 6e 74 20 64 61  or concurrent da
2bc40 74 61 62 61 73 65 20 61 63 63 65 73 73 20 62 79  tabase access by
2bc50 20 6d 75 6c 74 69 70 6c 65 0a 2a 2a 20 72 65 61   multiple.** rea
2bc60 64 65 72 73 20 61 6e 64 20 77 72 69 74 65 72 73  ders and writers
2bc70 0a 2a 2a 20 5b 68 74 74 70 3a 2f 2f 77 77 77 2e  .** [http://www.
2bc80 6e 61 62 62 6c 65 2e 63 6f 6d 2f 53 51 4c 69 74  nabble.com/SQLit
2bc90 65 2d 6f 6e 2d 4e 46 53 2d 63 61 63 68 65 2d 63  e-on-NFS-cache-c
2bca0 6f 68 65 72 65 6e 63 79 2d 74 64 31 35 36 35 35  oherency-td15655
2bcb0 37 30 31 2e 68 74 6d 6c 5d 2e 0a 2a 2a 0a 2a 2a  701.html]..**.**
2bcc0 20 54 6f 20 61 64 64 72 65 73 73 20 74 68 65 20   To address the 
2bcd0 70 65 72 66 6f 72 6d 61 6e 63 65 20 61 6e 64 20  performance and 
2bce0 63 61 63 68 65 20 63 6f 68 65 72 65 6e 63 79 20  cache coherency 
2bcf0 69 73 73 75 65 73 2c 20 70 72 6f 78 79 20 66 69  issues, proxy fi
2bd00 6c 65 20 6c 6f 63 6b 69 6e 67 0a 2a 2a 20 63 68  le locking.** ch
2bd10 61 6e 67 65 73 20 74 68 65 20 77 61 79 20 64 61  anges the way da
2bd20 74 61 62 61 73 65 20 61 63 63 65 73 73 20 69 73  tabase access is
2bd30 20 63 6f 6e 74 72 6f 6c 6c 65 64 20 62 79 20 6c   controlled by l
2bd40 69 6d 69 74 69 6e 67 20 61 63 63 65 73 73 20 74  imiting access t
2bd50 6f 20 61 0a 2a 2a 20 73 69 6e 67 6c 65 20 68 6f  o a.** single ho
2bd60 73 74 20 61 74 20 61 20 74 69 6d 65 20 61 6e 64  st at a time and
2bd70 20 6d 6f 76 69 6e 67 20 66 69 6c 65 20 6c 6f 63   moving file loc
2bd80 6b 73 20 6f 66 66 20 6f 66 20 74 68 65 20 64 61  ks off of the da
2bd90 74 61 62 61 73 65 20 66 69 6c 65 0a 2a 2a 20 61  tabase file.** a
2bda0 6e 64 20 6f 6e 74 6f 20 61 20 70 72 6f 78 79 20  nd onto a proxy 
2bdb0 66 69 6c 65 20 6f 6e 20 74 68 65 20 6c 6f 63 61  file on the loca
2bdc0 6c 20 66 69 6c 65 20 73 79 73 74 65 6d 2e 20 20  l file system.  
2bdd0 0a 2a 2a 0a 2a 2a 0a 2a 2a 20 55 73 69 6e 67 20  .**.**.** Using 
2bde0 70 72 6f 78 79 20 6c 6f 63 6b 73 0a 2a 2a 20 2d  proxy locks.** -
2bdf0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2be00 0a 2a 2a 0a 2a 2a 20 43 20 41 50 49 73 0a 2a 2a  .**.** C APIs.**
2be10 0a 2a 2a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c  .**  sqlite3_fil
2be20 65 5f 63 6f 6e 74 72 6f 6c 28 64 62 2c 20 64 62  e_control(db, db
2be30 6e 61 6d 65 2c 20 53 51 4c 49 54 45 5f 53 45 54  name, SQLITE_SET
2be40 5f 4c 4f 43 4b 50 52 4f 58 59 46 49 4c 45 2c 0a  _LOCKPROXYFILE,.
2be50 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
2be60 20 20 20 20 20 20 20 20 20 3c 70 72 6f 78 79 5f           <proxy_
2be70 70 61 74 68 3e 20 7c 20 22 3a 61 75 74 6f 3a 22  path> | ":auto:"
2be80 29 3b 0a 2a 2a 20 20 73 71 6c 69 74 65 33 5f 66  );.**  sqlite3_f
2be90 69 6c 65 5f 63 6f 6e 74 72 6f 6c 28 64 62 2c 20  ile_control(db, 
2bea0 64 62 6e 61 6d 65 2c 20 53 51 4c 49 54 45 5f 47  dbname, SQLITE_G
2beb0 45 54 5f 4c 4f 43 4b 50 52 4f 58 59 46 49 4c 45  ET_LOCKPROXYFILE
2bec0 2c 20 26 3c 70 72 6f 78 79 5f 70 61 74 68 3e 29  , &<proxy_path>)
2bed0 3b 0a 2a 2a 0a 2a 2a 0a 2a 2a 20 53 51 4c 20 70  ;.**.**.** SQL p
2bee0 72 61 67 6d 61 73 0a 2a 2a 0a 2a 2a 20 20 50 52  ragmas.**.**  PR
2bef0 41 47 4d 41 20 5b 64 61 74 61 62 61 73 65 2e 5d  AGMA [database.]
2bf00 6c 6f 63 6b 5f 70 72 6f 78 79 5f 66 69 6c 65 3d  lock_proxy_file=
2bf10 3c 70 72 6f 78 79 5f 70 61 74 68 3e 20 7c 20 3a  <proxy_path> | :
2bf20 61 75 74 6f 3a 0a 2a 2a 20 20 50 52 41 47 4d 41  auto:.**  PRAGMA
2bf30 20 5b 64 61 74 61 62 61 73 65 2e 5d 6c 6f 63 6b   [database.]lock
2bf40 5f 70 72 6f 78 79 5f 66 69 6c 65 0a 2a 2a 0a 2a  _proxy_file.**.*
2bf50 2a 20 53 70 65 63 69 66 79 69 6e 67 20 22 3a 61  * Specifying ":a
2bf60 75 74 6f 3a 22 20 6d 65 61 6e 73 20 74 68 61 74  uto:" means that
2bf70 20 69 66 20 74 68 65 72 65 20 69 73 20 61 20 63   if there is a c
2bf80 6f 6e 63 68 20 66 69 6c 65 20 77 69 74 68 20 61  onch file with a
2bf90 20 6d 61 74 63 68 69 6e 67 0a 2a 2a 20 68 6f 73   matching.** hos
2bfa0 74 20 49 44 20 69 6e 20 69 74 2c 20 74 68 65 20  t ID in it, the 
2bfb0 70 72 6f 78 79 20 70 61 74 68 20 69 6e 20 74 68  proxy path in th
2bfc0 65 20 63 6f 6e 63 68 20 66 69 6c 65 20 77 69 6c  e conch file wil
2bfd0 6c 20 62 65 20 75 73 65 64 2c 20 6f 74 68 65 72  l be used, other
2bfe0 77 69 73 65 0a 2a 2a 20 61 20 70 72 6f 78 79 20  wise.** a proxy 
2bff0 70 61 74 68 20 62 61 73 65 64 20 6f 6e 20 74 68  path based on th
2c000 65 20 75 73 65 72 27 73 20 74 65 6d 70 20 64 69  e user's temp di
2c010 72 0a 2a 2a 20 28 76 69 61 20 63 6f 6e 66 73 74  r.** (via confst
2c020 72 28 5f 43 53 5f 44 41 52 57 49 4e 5f 55 53 45  r(_CS_DARWIN_USE
2c030 52 5f 54 45 4d 50 5f 44 49 52 2c 2e 2e 2e 29 29  R_TEMP_DIR,...))
2c040 20 77 69 6c 6c 20 62 65 20 75 73 65 64 20 61 6e   will be used an
2c050 64 20 74 68 65 0a 2a 2a 20 61 63 74 75 61 6c 20  d the.** actual 
2c060 70 72 6f 78 79 20 66 69 6c 65 20 6e 61 6d 65 20  proxy file name 
2c070 69 73 20 67 65 6e 65 72 61 74 65 64 20 66 72 6f  is generated fro
2c080 6d 20 74 68 65 20 6e 61 6d 65 20 61 6e 64 20 70  m the name and p
2c090 61 74 68 20 6f 66 20 74 68 65 0a 2a 2a 20 64 61  ath of the.** da
2c0a0 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20 46 6f  tabase file.  Fo
2c0b0 72 20 65 78 61 6d 70 6c 65 3a 0a 2a 2a 0a 2a 2a  r example:.**.**
2c0c0 20 20 20 20 20 20 20 46 6f 72 20 64 61 74 61 62         For datab
2c0d0 61 73 65 20 70 61 74 68 20 22 2f 55 73 65 72 73  ase path "/Users
2c0e0 2f 6d 65 2f 66 6f 6f 2e 64 62 22 20 0a 2a 2a 20  /me/foo.db" .** 
2c0f0 20 20 20 20 20 20 54 68 65 20 6c 6f 63 6b 20 70        The lock p
2c100 61 74 68 20 77 69 6c 6c 20 62 65 20 22 3c 74 6d  ath will be "<tm
2c110 70 64 69 72 3e 2f 73 71 6c 69 74 65 70 6c 6f 63  pdir>/sqliteploc
2c120 6b 73 2f 5f 55 73 65 72 73 5f 6d 65 5f 66 6f 6f  ks/_Users_me_foo
2c130 2e 64 62 3a 61 75 74 6f 3a 22 29 0a 2a 2a 0a 2a  .db:auto:").**.*
2c140 2a 20 4f 6e 63 65 20 61 20 6c 6f 63 6b 20 70 72  * Once a lock pr
2c150 6f 78 79 20 69 73 20 63 6f 6e 66 69 67 75 72 65  oxy is configure
2c160 64 20 66 6f 72 20 61 20 64 61 74 61 62 61 73 65  d for a database
2c170 20 63 6f 6e 6e 65 63 74 69 6f 6e 2c 20 69 74 20   connection, it 
2c180 63 61 6e 20 6e 6f 74 0a 2a 2a 20 62 65 20 72 65  can not.** be re
2c190 6d 6f 76 65 64 2c 20 68 6f 77 65 76 65 72 20 69  moved, however i
2c1a0 74 20 6d 61 79 20 62 65 20 73 77 69 74 63 68 65  t may be switche
2c1b0 64 20 74 6f 20 61 20 64 69 66 66 65 72 65 6e 74  d to a different
2c1c0 20 70 72 6f 78 79 20 70 61 74 68 20 76 69 61 0a   proxy path via.
2c1d0 2a 2a 20 74 68 65 20 61 62 6f 76 65 20 41 50 49  ** the above API
2c1e0 73 20 28 61 73 73 75 6d 69 6e 67 20 74 68 65 20  s (assuming the 
2c1f0 63 6f 6e 63 68 20 66 69 6c 65 20 69 73 20 6e 6f  conch file is no
2c200 74 20 62 65 69 6e 67 20 68 65 6c 64 20 62 79 20  t being held by 
2c210 61 6e 6f 74 68 65 72 0a 2a 2a 20 63 6f 6e 6e 65  another.** conne
2c220 63 74 69 6f 6e 20 6f 72 20 70 72 6f 63 65 73 73  ction or process
2c230 29 2e 20 0a 2a 2a 0a 2a 2a 0a 2a 2a 20 48 6f 77  ). .**.**.** How
2c240 20 70 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 20 77   proxy locking w
2c250 6f 72 6b 73 0a 2a 2a 20 2d 2d 2d 2d 2d 2d 2d 2d  orks.** --------
2c260 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
2c270 2a 2a 0a 2a 2a 20 50 72 6f 78 79 20 66 69 6c 65  **.** Proxy file
2c280 20 6c 6f 63 6b 69 6e 67 20 72 65 6c 69 65 73 20   locking relies 
2c290 70 72 69 6d 61 72 69 6c 79 20 6f 6e 20 74 77 6f  primarily on two
2c2a0 20 6e 65 77 20 73 75 70 70 6f 72 74 69 6e 67 20   new supporting 
2c2b0 66 69 6c 65 73 3a 20 0a 2a 2a 0a 2a 2a 20 20 20  files: .**.**   
2c2c0 2a 20 20 63 6f 6e 63 68 20 66 69 6c 65 20 74 6f  *  conch file to
2c2d0 20 6c 69 6d 69 74 20 61 63 63 65 73 73 20 74 6f   limit access to
2c2e0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
2c2f0 6c 65 20 74 6f 20 61 20 73 69 6e 67 6c 65 20 68  le to a single h
2c300 6f 73 74 0a 2a 2a 20 20 20 20 20 20 61 74 20 61  ost.**      at a
2c310 20 74 69 6d 65 0a 2a 2a 0a 2a 2a 20 20 20 2a 20   time.**.**   * 
2c320 20 70 72 6f 78 79 20 66 69 6c 65 20 74 6f 20 61   proxy file to a
2c330 63 74 20 61 73 20 61 20 70 72 6f 78 79 20 66 6f  ct as a proxy fo
2c340 72 20 74 68 65 20 61 64 76 69 73 6f 72 79 20 6c  r the advisory l
2c350 6f 63 6b 73 20 6e 6f 72 6d 61 6c 6c 79 0a 2a 2a  ocks normally.**
2c360 20 20 20 20 20 20 74 61 6b 65 6e 20 6f 6e 20 74        taken on t
2c370 68 65 20 64 61 74 61 62 61 73 65 0a 2a 2a 0a 2a  he database.**.*
2c380 2a 20 54 68 65 20 63 6f 6e 63 68 20 66 69 6c 65  * The conch file
2c390 20 2d 20 74 6f 20 75 73 65 20 61 20 70 72 6f 78   - to use a prox
2c3a0 79 20 66 69 6c 65 2c 20 73 71 6c 69 74 65 20 6d  y file, sqlite m
2c3b0 75 73 74 20 66 69 72 73 74 20 22 68 6f 6c 64 20  ust first "hold 
2c3c0 74 68 65 20 63 6f 6e 63 68 22 0a 2a 2a 20 62 79  the conch".** by
2c3d0 20 74 61 6b 69 6e 67 20 61 6e 20 73 71 6c 69 74   taking an sqlit
2c3e0 65 2d 73 74 79 6c 65 20 73 68 61 72 65 64 20 6c  e-style shared l
2c3f0 6f 63 6b 20 6f 6e 20 74 68 65 20 63 6f 6e 63 68  ock on the conch
2c400 20 66 69 6c 65 2c 20 72 65 61 64 69 6e 67 20 74   file, reading t
2c410 68 65 0a 2a 2a 20 63 6f 6e 74 65 6e 74 73 20 61  he.** contents a
2c420 6e 64 20 63 6f 6d 70 61 72 69 6e 67 20 74 68 65  nd comparing the
2c430 20 68 6f 73 74 27 73 20 75 6e 69 71 75 65 20 68   host's unique h
2c440 6f 73 74 20 49 44 20 28 73 65 65 20 62 65 6c 6f  ost ID (see belo
2c450 77 29 20 61 6e 64 20 6c 6f 63 6b 0a 2a 2a 20 70  w) and lock.** p
2c460 72 6f 78 79 20 70 61 74 68 20 61 67 61 69 6e 73  roxy path agains
2c470 74 20 74 68 65 20 76 61 6c 75 65 73 20 73 74 6f  t the values sto
2c480 72 65 64 20 69 6e 20 74 68 65 20 63 6f 6e 63 68  red in the conch
2c490 2e 20 20 54 68 65 20 63 6f 6e 63 68 20 66 69 6c  .  The conch fil
2c4a0 65 20 69 73 0a 2a 2a 20 73 74 6f 72 65 64 20 69  e is.** stored i
2c4b0 6e 20 74 68 65 20 73 61 6d 65 20 64 69 72 65 63  n the same direc
2c4c0 74 6f 72 79 20 61 73 20 74 68 65 20 64 61 74 61  tory as the data
2c4d0 62 61 73 65 20 66 69 6c 65 20 61 6e 64 20 74 68  base file and th
2c4e0 65 20 66 69 6c 65 20 6e 61 6d 65 0a 2a 2a 20 69  e file name.** i
2c4f0 73 20 70 61 74 74 65 72 6e 65 64 20 61 66 74 65  s patterned afte
2c500 72 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  r the database f
2c510 69 6c 65 20 6e 61 6d 65 20 61 73 20 22 2e 3c 64  ile name as ".<d
2c520 61 74 61 62 61 73 65 6e 61 6d 65 3e 2d 63 6f 6e  atabasename>-con
2c530 63 68 22 2e 0a 2a 2a 20 49 66 20 74 68 65 20 63  ch"..** If the c
2c540 6f 6e 63 68 20 66 69 6c 65 20 64 6f 65 73 20 6e  onch file does n
2c550 6f 74 20 65 78 69 73 74 2c 20 6f 72 20 69 74 27  ot exist, or it'
2c560 73 20 63 6f 6e 74 65 6e 74 73 20 64 6f 20 6e 6f  s contents do no
2c570 74 20 6d 61 74 63 68 20 74 68 65 0a 2a 2a 20 68  t match the.** h
2c580 6f 73 74 20 49 44 20 61 6e 64 2f 6f 72 20 70 72  ost ID and/or pr
2c590 6f 78 79 20 70 61 74 68 2c 20 74 68 65 6e 20 74  oxy path, then t
2c5a0 68 65 20 6c 6f 63 6b 20 69 73 20 65 73 63 61 6c  he lock is escal
2c5b0 61 74 65 64 20 74 6f 20 61 6e 20 65 78 63 6c 75  ated to an exclu
2c5c0 73 69 76 65 0a 2a 2a 20 6c 6f 63 6b 20 61 6e 64  sive.** lock and
2c5d0 20 74 68 65 20 63 6f 6e 63 68 20 66 69 6c 65 20   the conch file 
2c5e0 63 6f 6e 74 65 6e 74 73 20 69 73 20 75 70 64 61  contents is upda
2c5f0 74 65 64 20 77 69 74 68 20 74 68 65 20 68 6f 73  ted with the hos
2c600 74 20 49 44 20 61 6e 64 20 70 72 6f 78 79 0a 2a  t ID and proxy.*
2c610 2a 20 70 61 74 68 20 61 6e 64 20 74 68 65 20 6c  * path and the l
2c620 6f 63 6b 20 69 73 20 64 6f 77 6e 67 72 61 64 65  ock is downgrade
2c630 64 20 74 6f 20 61 20 73 68 61 72 65 64 20 6c 6f  d to a shared lo
2c640 63 6b 20 61 67 61 69 6e 2e 20 20 49 66 20 74 68  ck again.  If th
2c650 65 20 63 6f 6e 63 68 0a 2a 2a 20 69 73 20 68 65  e conch.** is he
2c660 6c 64 20 62 79 20 61 6e 6f 74 68 65 72 20 70 72  ld by another pr
2c670 6f 63 65 73 73 20 28 77 69 74 68 20 61 20 73 68  ocess (with a sh
2c680 61 72 65 64 20 6c 6f 63 6b 29 2c 20 74 68 65 20  ared lock), the 
2c690 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 0a 2a  exclusive lock.*
2c6a0 2a 20 77 69 6c 6c 20 66 61 69 6c 20 61 6e 64 20  * will fail and 
2c6b0 53 51 4c 49 54 45 5f 42 55 53 59 20 69 73 20 72  SQLITE_BUSY is r
2c6c0 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 54  eturned..**.** T
2c6d0 68 65 20 70 72 6f 78 79 20 66 69 6c 65 20 2d 20  he proxy file - 
2c6e0 61 20 73 69 6e 67 6c 65 2d 62 79 74 65 20 66 69  a single-byte fi
2c6f0 6c 65 20 75 73 65 64 20 66 6f 72 20 61 6c 6c 20  le used for all 
2c700 61 64 76 69 73 6f 72 79 20 66 69 6c 65 20 6c 6f  advisory file lo
2c710 63 6b 73 0a 2a 2a 20 6e 6f 72 6d 61 6c 6c 79 20  cks.** normally 
2c720 74 61 6b 65 6e 20 6f 6e 20 74 68 65 20 64 61 74  taken on the dat
2c730 61 62 61 73 65 20 66 69 6c 65 2e 20 20 20 54 68  abase file.   Th
2c740 69 73 20 61 6c 6c 6f 77 73 20 66 6f 72 20 73 61  is allows for sa
2c750 66 65 20 73 68 61 72 69 6e 67 0a 2a 2a 20 6f 66  fe sharing.** of
2c760 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
2c770 6c 65 20 66 6f 72 20 6d 75 6c 74 69 70 6c 65 20  le for multiple 
2c780 72 65 61 64 65 72 73 20 61 6e 64 20 77 72 69 74  readers and writ
2c790 65 72 73 20 6f 6e 20 74 68 65 20 73 61 6d 65 0a  ers on the same.
2c7a0 2a 2a 20 68 6f 73 74 20 28 74 68 65 20 63 6f 6e  ** host (the con
2c7b0 63 68 20 65 6e 73 75 72 65 73 20 74 68 61 74 20  ch ensures that 
2c7c0 74 68 65 79 20 61 6c 6c 20 75 73 65 20 74 68 65  they all use the
2c7d0 20 73 61 6d 65 20 6c 6f 63 61 6c 20 6c 6f 63 6b   same local lock
2c7e0 20 66 69 6c 65 29 2e 0a 2a 2a 0a 2a 2a 20 52 65   file)..**.** Re
2c7f0 71 75 65 73 74 69 6e 67 20 74 68 65 20 6c 6f 63  questing the loc
2c800 6b 20 70 72 6f 78 79 20 64 6f 65 73 20 6e 6f 74  k proxy does not
2c810 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 74 61 6b   immediately tak
2c820 65 20 74 68 65 20 63 6f 6e 63 68 2c 20 69 74 20  e the conch, it 
2c830 69 73 0a 2a 2a 20 6f 6e 6c 79 20 74 61 6b 65 6e  is.** only taken
2c840 20 77 68 65 6e 20 74 68 65 20 66 69 72 73 74 20   when the first 
2c850 72 65 71 75 65 73 74 20 74 6f 20 6c 6f 63 6b 20  request to lock 
2c860 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 73  database file is
2c870 20 6d 61 64 65 2e 20 20 0a 2a 2a 20 54 68 69 73   made.  .** This
2c880 20 6d 61 74 63 68 65 73 20 74 68 65 20 73 65 6d   matches the sem
2c890 61 6e 74 69 63 73 20 6f 66 20 74 68 65 20 74 72  antics of the tr
2c8a0 61 64 69 74 69 6f 6e 61 6c 20 6c 6f 63 6b 69 6e  aditional lockin
2c8b0 67 20 62 65 68 61 76 69 6f 72 2c 20 77 68 65 72  g behavior, wher
2c8c0 65 0a 2a 2a 20 6f 70 65 6e 69 6e 67 20 61 20 63  e.** opening a c
2c8d0 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 61 20 64  onnection to a d
2c8e0 61 74 61 62 61 73 65 20 66 69 6c 65 20 64 6f 65  atabase file doe
2c8f0 73 20 6e 6f 74 20 74 61 6b 65 20 61 20 6c 6f 63  s not take a loc
2c900 6b 20 6f 6e 20 69 74 2e 0a 2a 2a 20 54 68 65 20  k on it..** The 
2c910 73 68 61 72 65 64 20 6c 6f 63 6b 20 61 6e 64 20  shared lock and 
2c920 61 6e 20 6f 70 65 6e 20 66 69 6c 65 20 64 65 73  an open file des
2c930 63 72 69 70 74 6f 72 20 61 72 65 20 6d 61 69 6e  criptor are main
2c940 74 61 69 6e 65 64 20 75 6e 74 69 6c 20 0a 2a 2a  tained until .**
2c950 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20   the connection 
2c960 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20  to the database 
2c970 69 73 20 63 6c 6f 73 65 64 2e 20 0a 2a 2a 0a 2a  is closed. .**.*
2c980 2a 20 54 68 65 20 70 72 6f 78 79 20 66 69 6c 65  * The proxy file
2c990 20 61 6e 64 20 74 68 65 20 6c 6f 63 6b 20 66 69   and the lock fi
2c9a0 6c 65 20 61 72 65 20 6e 65 76 65 72 20 64 65 6c  le are never del
2c9b0 65 74 65 64 20 73 6f 20 74 68 65 79 20 6f 6e 6c  eted so they onl
2c9c0 79 20 6e 65 65 64 0a 2a 2a 20 74 6f 20 62 65 20  y need.** to be 
2c9d0 63 72 65 61 74 65 64 20 74 68 65 20 66 69 72 73  created the firs
2c9e0 74 20 74 69 6d 65 20 74 68 65 79 20 61 72 65 20  t time they are 
2c9f0 75 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 43 6f 6e 66  used..**.** Conf
2ca00 69 67 75 72 61 74 69 6f 6e 20 6f 70 74 69 6f 6e  iguration option
2ca10 73 0a 2a 2a 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  s.** -----------
2ca20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 0a 2a 2a  ----------.**.**
2ca30 20 20 53 51 4c 49 54 45 5f 50 52 45 46 45 52 5f    SQLITE_PREFER_
2ca40 50 52 4f 58 59 5f 4c 4f 43 4b 49 4e 47 0a 2a 2a  PROXY_LOCKING.**
2ca50 0a 2a 2a 20 20 20 20 20 20 20 44 61 74 61 62 61  .**       Databa
2ca60 73 65 20 66 69 6c 65 73 20 61 63 63 65 73 73 65  se files accesse
2ca70 64 20 6f 6e 20 6e 6f 6e 2d 6c 6f 63 61 6c 20 66  d on non-local f
2ca80 69 6c 65 20 73 79 73 74 65 6d 73 20 61 72 65 0a  ile systems are.
2ca90 2a 2a 20 20 20 20 20 20 20 61 75 74 6f 6d 61 74  **       automat
2caa0 69 63 61 6c 6c 79 20 63 6f 6e 66 69 67 75 72 65  ically configure
2cab0 64 20 66 6f 72 20 70 72 6f 78 79 20 6c 6f 63 6b  d for proxy lock
2cac0 69 6e 67 2c 20 6c 6f 63 6b 20 66 69 6c 65 73 20  ing, lock files 
2cad0 61 72 65 0a 2a 2a 20 20 20 20 20 20 20 6e 61 6d  are.**       nam
2cae0 65 64 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79  ed automatically
2caf0 20 75 73 69 6e 67 20 74 68 65 20 73 61 6d 65 20   using the same 
2cb00 6c 6f 67 69 63 20 61 73 0a 2a 2a 20 20 20 20 20  logic as.**     
2cb10 20 20 50 52 41 47 4d 41 20 6c 6f 63 6b 5f 70 72    PRAGMA lock_pr
2cb20 6f 78 79 5f 66 69 6c 65 3d 22 3a 61 75 74 6f 3a  oxy_file=":auto:
2cb30 22 0a 2a 2a 20 20 20 20 0a 2a 2a 20 20 53 51 4c  ".**    .**  SQL
2cb40 49 54 45 5f 50 52 4f 58 59 5f 44 45 42 55 47 0a  ITE_PROXY_DEBUG.
2cb50 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 45 6e 61 62  **.**       Enab
2cb60 6c 65 73 20 74 68 65 20 6c 6f 67 67 69 6e 67 20  les the logging 
2cb70 6f 66 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  of error message
2cb80 73 20 64 75 72 69 6e 67 20 68 6f 73 74 20 69 64  s during host id
2cb90 20 66 69 6c 65 0a 2a 2a 20 20 20 20 20 20 20 72   file.**       r
2cba0 65 74 72 69 65 76 61 6c 20 61 6e 64 20 63 72 65  etrieval and cre
2cbb0 61 74 69 6f 6e 0a 2a 2a 0a 2a 2a 20 20 4c 4f 43  ation.**.**  LOC
2cbc0 4b 50 52 4f 58 59 44 49 52 0a 2a 2a 0a 2a 2a 20  KPROXYDIR.**.** 
2cbd0 20 20 20 20 20 20 4f 76 65 72 72 69 64 65 73 20        Overrides 
2cbe0 74 68 65 20 64 65 66 61 75 6c 74 20 64 69 72 65  the default dire
2cbf0 63 74 6f 72 79 20 75 73 65 64 20 66 6f 72 20 6c  ctory used for l
2cc00 6f 63 6b 20 70 72 6f 78 79 20 66 69 6c 65 73 20  ock proxy files 
2cc10 74 68 61 74 0a 2a 2a 20 20 20 20 20 20 20 61 72  that.**       ar
2cc20 65 20 6e 61 6d 65 64 20 61 75 74 6f 6d 61 74 69  e named automati
2cc30 63 61 6c 6c 79 20 76 69 61 20 74 68 65 20 22 3a  cally via the ":
2cc40 61 75 74 6f 3a 22 20 73 65 74 74 69 6e 67 0a 2a  auto:" setting.*
2cc50 2a 0a 2a 2a 20 20 53 51 4c 49 54 45 5f 44 45 46  *.**  SQLITE_DEF
2cc60 41 55 4c 54 5f 50 52 4f 58 59 44 49 52 5f 50 45  AULT_PROXYDIR_PE
2cc70 52 4d 49 53 53 49 4f 4e 53 0a 2a 2a 0a 2a 2a 20  RMISSIONS.**.** 
2cc80 20 20 20 20 20 20 50 65 72 6d 69 73 73 69 6f 6e        Permission
2cc90 73 20 74 6f 20 75 73 65 20 77 68 65 6e 20 63 72  s to use when cr
2cca0 65 61 74 69 6e 67 20 61 20 64 69 72 65 63 74 6f  eating a directo
2ccb0 72 79 20 66 6f 72 20 73 74 6f 72 69 6e 67 20 74  ry for storing t
2ccc0 68 65 0a 2a 2a 20 20 20 20 20 20 20 6c 6f 63 6b  he.**       lock
2ccd0 20 70 72 6f 78 79 20 66 69 6c 65 73 2c 20 6f 6e   proxy files, on
2cce0 6c 79 20 75 73 65 64 20 77 68 65 6e 20 4c 4f 43  ly used when LOC
2ccf0 4b 50 52 4f 58 59 44 49 52 20 69 73 20 6e 6f 74  KPROXYDIR is not
2cd00 20 73 65 74 2e 0a 2a 2a 20 20 20 20 0a 2a 2a 20   set..**    .** 
2cd10 20 20 20 0a 2a 2a 20 41 73 20 6d 65 6e 74 69 6f     .** As mentio
2cd20 6e 65 64 20 61 62 6f 76 65 2c 20 77 68 65 6e 20  ned above, when 
2cd30 63 6f 6d 70 69 6c 65 64 20 77 69 74 68 20 53 51  compiled with SQ
2cd40 4c 49 54 45 5f 50 52 45 46 45 52 5f 50 52 4f 58  LITE_PREFER_PROX
2cd50 59 5f 4c 4f 43 4b 49 4e 47 2c 0a 2a 2a 20 73 65  Y_LOCKING,.** se
2cd60 74 74 69 6e 67 20 74 68 65 20 65 6e 76 69 72 6f  tting the enviro
2cd70 6e 6d 65 6e 74 20 76 61 72 69 61 62 6c 65 20 53  nment variable S
2cd80 51 4c 49 54 45 5f 46 4f 52 43 45 5f 50 52 4f 58  QLITE_FORCE_PROX
2cd90 59 5f 4c 4f 43 4b 49 4e 47 20 74 6f 20 31 20 77  Y_LOCKING to 1 w
2cda0 69 6c 6c 0a 2a 2a 20 66 6f 72 63 65 20 70 72 6f  ill.** force pro
2cdb0 78 79 20 6c 6f 63 6b 69 6e 67 20 74 6f 20 62 65  xy locking to be
2cdc0 20 75 73 65 64 20 66 6f 72 20 65 76 65 72 79 20   used for every 
2cdd0 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 6f 70  database file op
2cde0 65 6e 65 64 2c 20 61 6e 64 20 30 0a 2a 2a 20 77  ened, and 0.** w
2cdf0 69 6c 6c 20 66 6f 72 63 65 20 61 75 74 6f 6d 61  ill force automa
2ce00 74 69 63 20 70 72 6f 78 79 20 6c 6f 63 6b 69 6e  tic proxy lockin
2ce10 67 20 74 6f 20 62 65 20 64 69 73 61 62 6c 65 64  g to be disabled
2ce20 20 66 6f 72 20 61 6c 6c 20 64 61 74 61 62 61 73   for all databas
2ce30 65 0a 2a 2a 20 66 69 6c 65 73 20 28 65 78 70 6c  e.** files (expl
2ce40 69 63 69 74 79 20 63 61 6c 6c 69 6e 67 20 74 68  icity calling th
2ce50 65 20 53 51 4c 49 54 45 5f 53 45 54 5f 4c 4f 43  e SQLITE_SET_LOC
2ce60 4b 50 52 4f 58 59 46 49 4c 45 20 70 72 61 67 6d  KPROXYFILE pragm
2ce70 61 20 6f 72 0a 2a 2a 20 73 71 6c 69 74 65 5f 66  a or.** sqlite_f
2ce80 69 6c 65 5f 63 6f 6e 74 72 6f 6c 20 41 50 49 20  ile_control API 
2ce90 69 73 20 6e 6f 74 20 61 66 66 65 63 74 65 64 20  is not affected 
2cea0 62 79 20 53 51 4c 49 54 45 5f 46 4f 52 43 45 5f  by SQLITE_FORCE_
2ceb0 50 52 4f 58 59 5f 4c 4f 43 4b 49 4e 47 29 2e 0a  PROXY_LOCKING)..
2cec0 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 50 72 6f 78 79 20  */../*.** Proxy 
2ced0 6c 6f 63 6b 69 6e 67 20 69 73 20 6f 6e 6c 79 20  locking is only 
2cee0 61 76 61 69 6c 61 62 6c 65 20 6f 6e 20 4d 61 63  available on Mac
2cef0 4f 53 58 20 0a 2a 2f 0a 23 69 66 20 64 65 66 69  OSX .*/.#if defi
2cf00 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 26  ned(__APPLE__) &
2cf10 26 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  & SQLITE_ENABLE_
2cf20 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 0a 2f  LOCKING_STYLE../
2cf30 2a 0a 2a 2a 20 54 68 65 20 70 72 6f 78 79 4c 6f  *.** The proxyLo
2cf40 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 68 61 73  ckingContext has
2cf50 20 74 68 65 20 70 61 74 68 20 61 6e 64 20 66 69   the path and fi
2cf60 6c 65 20 73 74 72 75 63 74 75 72 65 73 20 66 6f  le structures fo
2cf70 72 20 74 68 65 20 72 65 6d 6f 74 65 20 0a 2a 2a  r the remote .**
2cf80 20 61 6e 64 20 6c 6f 63 61 6c 20 70 72 6f 78 79   and local proxy
2cf90 20 66 69 6c 65 73 20 69 6e 20 69 74 0a 2a 2f 0a   files in it.*/.
2cfa0 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20 70  typedef struct p
2cfb0 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65  roxyLockingConte
2cfc0 78 74 20 70 72 6f 78 79 4c 6f 63 6b 69 6e 67 43  xt proxyLockingC
2cfd0 6f 6e 74 65 78 74 3b 0a 73 74 72 75 63 74 20 70  ontext;.struct p
2cfe0 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65  roxyLockingConte
2cff0 78 74 20 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20  xt {.  unixFile 
2d000 2a 63 6f 6e 63 68 46 69 6c 65 3b 20 20 20 20 20  *conchFile;     
2d010 20 20 20 20 2f 2a 20 4f 70 65 6e 20 63 6f 6e 63      /* Open conc
2d020 68 20 66 69 6c 65 20 2a 2f 0a 20 20 63 68 61 72  h file */.  char
2d030 20 2a 63 6f 6e 63 68 46 69 6c 65 50 61 74 68 3b   *conchFilePath;
2d040 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65           /* Name
2d050 20 6f 66 20 74 68 65 20 63 6f 6e 63 68 20 66 69   of the conch fi
2d060 6c 65 20 2a 2f 0a 20 20 75 6e 69 78 46 69 6c 65  le */.  unixFile
2d070 20 2a 6c 6f 63 6b 50 72 6f 78 79 3b 20 20 20 20   *lockProxy;    
2d080 20 20 20 20 20 2f 2a 20 4f 70 65 6e 20 70 72 6f       /* Open pro
2d090 78 79 20 6c 6f 63 6b 20 66 69 6c 65 20 2a 2f 0a  xy lock file */.
2d0a0 20 20 63 68 61 72 20 2a 6c 6f 63 6b 50 72 6f 78    char *lockProx
2d0b0 79 50 61 74 68 3b 20 20 20 20 20 20 20 20 20 2f  yPath;         /
2d0c0 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 70 72  * Name of the pr
2d0d0 6f 78 79 20 6c 6f 63 6b 20 66 69 6c 65 20 2a 2f  oxy lock file */
2d0e0 0a 20 20 63 68 61 72 20 2a 64 62 50 61 74 68 3b  .  char *dbPath;
2d0f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d100 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 6f  /* Name of the o
2d110 70 65 6e 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e  pen file */.  in
2d120 74 20 63 6f 6e 63 68 48 65 6c 64 3b 20 20 20 20  t conchHeld;    
2d130 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 31 20             /* 1 
2d140 69 66 20 74 68 65 20 63 6f 6e 63 68 20 69 73 20  if the conch is 
2d150 68 65 6c 64 2c 20 2d 31 20 69 66 20 6c 6f 63 6b  held, -1 if lock
2d160 6c 65 73 73 20 2a 2f 0a 20 20 76 6f 69 64 20 2a  less */.  void *
2d170 6f 6c 64 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78  oldLockingContex
2d180 74 3b 20 20 20 20 20 2f 2a 20 4f 72 69 67 69 6e  t;     /* Origin
2d190 61 6c 20 6c 6f 63 6b 69 6e 67 63 6f 6e 74 65 78  al lockingcontex
2d1a0 74 20 74 6f 20 72 65 73 74 6f 72 65 20 6f 6e 20  t to restore on 
2d1b0 63 6c 6f 73 65 20 2a 2f 0a 20 20 73 71 6c 69 74  close */.  sqlit
2d1c0 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 63 6f  e3_io_methods co
2d1d0 6e 73 74 20 2a 70 4f 6c 64 4d 65 74 68 6f 64 3b  nst *pOldMethod;
2d1e0 20 20 20 20 20 2f 2a 20 4f 72 69 67 69 6e 61 6c       /* Original
2d1f0 20 49 2f 4f 20 6d 65 74 68 6f 64 73 20 66 6f 72   I/O methods for
2d200 20 63 6c 6f 73 65 20 2a 2f 0a 7d 3b 0a 0a 2f 2a   close */.};../*
2d210 20 0a 2a 2a 20 54 68 65 20 70 72 6f 78 79 20 6c   .** The proxy l
2d220 6f 63 6b 20 66 69 6c 65 20 70 61 74 68 20 66 6f  ock file path fo
2d230 72 20 74 68 65 20 64 61 74 61 62 61 73 65 20 61  r the database a
2d240 74 20 64 62 50 61 74 68 20 69 73 20 77 72 69 74  t dbPath is writ
2d250 74 65 6e 20 69 6e 74 6f 20 6c 50 61 74 68 2c 20  ten into lPath, 
2d260 0a 2a 2a 20 77 68 69 63 68 20 6d 75 73 74 20 70  .** which must p
2d270 6f 69 6e 74 20 74 6f 20 76 61 6c 69 64 2c 20 77  oint to valid, w
2d280 72 69 74 61 62 6c 65 20 6d 65 6d 6f 72 79 20 6c  ritable memory l
2d290 61 72 67 65 20 65 6e 6f 75 67 68 20 66 6f 72 20  arge enough for 
2d2a0 61 20 6d 61 78 4c 65 6e 20 6c 65 6e 67 74 68 0a  a maxLen length.
2d2b0 2a 2a 20 66 69 6c 65 20 70 61 74 68 2e 20 0a 2a  ** file path. .*
2d2c0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72 6f  /.static int pro
2d2d0 78 79 47 65 74 4c 6f 63 6b 50 61 74 68 28 63 6f  xyGetLockPath(co
2d2e0 6e 73 74 20 63 68 61 72 20 2a 64 62 50 61 74 68  nst char *dbPath
2d2f0 2c 20 63 68 61 72 20 2a 6c 50 61 74 68 2c 20 73  , char *lPath, s
2d300 69 7a 65 5f 74 20 6d 61 78 4c 65 6e 29 7b 0a 20  ize_t maxLen){. 
2d310 20 69 6e 74 20 6c 65 6e 3b 0a 20 20 69 6e 74 20   int len;.  int 
2d320 64 62 4c 65 6e 3b 0a 20 20 69 6e 74 20 69 3b 0a  dbLen;.  int i;.
2d330 0a 23 69 66 64 65 66 20 4c 4f 43 4b 50 52 4f 58  .#ifdef LOCKPROX
2d340 59 44 49 52 0a 20 20 6c 65 6e 20 3d 20 73 74 72  YDIR.  len = str
2d350 6c 63 70 79 28 6c 50 61 74 68 2c 20 4c 4f 43 4b  lcpy(lPath, LOCK
2d360 50 52 4f 58 59 44 49 52 2c 20 6d 61 78 4c 65 6e  PROXYDIR, maxLen
2d370 29 3b 0a 23 65 6c 73 65 0a 23 20 69 66 64 65 66  );.#else.# ifdef
2d380 20 5f 43 53 5f 44 41 52 57 49 4e 5f 55 53 45 52   _CS_DARWIN_USER
2d390 5f 54 45 4d 50 5f 44 49 52 0a 20 20 7b 0a 20 20  _TEMP_DIR.  {.  
2d3a0 20 20 69 66 28 20 21 63 6f 6e 66 73 74 72 28 5f    if( !confstr(_
2d3b0 43 53 5f 44 41 52 57 49 4e 5f 55 53 45 52 5f 54  CS_DARWIN_USER_T
2d3c0 45 4d 50 5f 44 49 52 2c 20 6c 50 61 74 68 2c 20  EMP_DIR, lPath, 
2d3d0 6d 61 78 4c 65 6e 29 20 29 7b 0a 20 20 20 20 20  maxLen) ){.     
2d3e0 20 4f 53 54 52 41 43 45 34 28 22 47 45 54 4c 4f   OSTRACE4("GETLO
2d3f0 43 4b 50 41 54 48 20 20 66 61 69 6c 65 64 20 25  CKPATH  failed %
2d400 73 20 65 72 72 6e 6f 3d 25 64 20 70 69 64 3d 25  s errno=%d pid=%
2d410 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  d\n",.          
2d420 20 20 20 20 20 6c 50 61 74 68 2c 20 65 72 72 6e       lPath, errn
2d430 6f 2c 20 67 65 74 70 69 64 28 29 29 3b 0a 20 20  o, getpid());.  
2d440 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
2d450 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b 3b 0a 20 20  E_IOERR_LOCK;.  
2d460 20 20 7d 0a 20 20 20 20 6c 65 6e 20 3d 20 73 74    }.    len = st
2d470 72 6c 63 61 74 28 6c 50 61 74 68 2c 20 22 73 71  rlcat(lPath, "sq
2d480 6c 69 74 65 70 6c 6f 63 6b 73 22 2c 20 6d 61 78  liteplocks", max
2d490 4c 65 6e 29 3b 20 20 20 20 0a 20 20 7d 0a 23 20  Len);    .  }.# 
2d4a0 65 6c 73 65 0a 20 20 6c 65 6e 20 3d 20 73 74 72  else.  len = str
2d4b0 6c 63 70 79 28 6c 50 61 74 68 2c 20 22 2f 74 6d  lcpy(lPath, "/tm
2d4c0 70 2f 22 2c 20 6d 61 78 4c 65 6e 29 3b 0a 23 20  p/", maxLen);.# 
2d4d0 65 6e 64 69 66 0a 23 65 6e 64 69 66 0a 0a 20 20  endif.#endif..  
2d4e0 69 66 28 20 6c 50 61 74 68 5b 6c 65 6e 2d 31 5d  if( lPath[len-1]
2d4f0 21 3d 27 2f 27 20 29 7b 0a 20 20 20 20 6c 65 6e  !='/' ){.    len
2d500 20 3d 20 73 74 72 6c 63 61 74 28 6c 50 61 74 68   = strlcat(lPath
2d510 2c 20 22 2f 22 2c 20 6d 61 78 4c 65 6e 29 3b 0a  , "/", maxLen);.
2d520 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 74 72 61 6e    }.  .  /* tran
2d530 73 66 6f 72 6d 20 74 68 65 20 64 62 20 70 61 74  sform the db pat
2d540 68 20 74 6f 20 61 20 75 6e 69 71 75 65 20 63 61  h to a unique ca
2d550 63 68 65 20 6e 61 6d 65 20 2a 2f 0a 20 20 64 62  che name */.  db
2d560 4c 65 6e 20 3d 20 28 69 6e 74 29 73 74 72 6c 65  Len = (int)strle
2d570 6e 28 64 62 50 61 74 68 29 3b 0a 20 20 66 6f 72  n(dbPath);.  for
2d580 28 20 69 3d 30 3b 20 69 3c 64 62 4c 65 6e 20 26  ( i=0; i<dbLen &
2d590 26 20 28 69 2b 6c 65 6e 2b 37 29 3c 6d 61 78 4c  & (i+len+7)<maxL
2d5a0 65 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 63 68  en; i++){.    ch
2d5b0 61 72 20 63 20 3d 20 64 62 50 61 74 68 5b 69 5d  ar c = dbPath[i]
2d5c0 3b 0a 20 20 20 20 6c 50 61 74 68 5b 69 2b 6c 65  ;.    lPath[i+le
2d5d0 6e 5d 20 3d 20 28 63 3d 3d 27 2f 27 29 3f 27 5f  n] = (c=='/')?'_
2d5e0 27 3a 63 3b 0a 20 20 7d 0a 20 20 6c 50 61 74 68  ':c;.  }.  lPath
2d5f0 5b 69 2b 6c 65 6e 5d 3d 27 5c 30 27 3b 0a 20 20  [i+len]='\0';.  
2d600 73 74 72 6c 63 61 74 28 6c 50 61 74 68 2c 20 22  strlcat(lPath, "
2d610 3a 61 75 74 6f 3a 22 2c 20 6d 61 78 4c 65 6e 29  :auto:", maxLen)
2d620 3b 0a 20 20 4f 53 54 52 41 43 45 33 28 22 47 45  ;.  OSTRACE3("GE
2d630 54 4c 4f 43 4b 50 41 54 48 20 20 70 72 6f 78 79  TLOCKPATH  proxy
2d640 20 6c 6f 63 6b 20 70 61 74 68 3d 25 73 20 70 69   lock path=%s pi
2d650 64 3d 25 64 5c 6e 22 2c 20 6c 50 61 74 68 2c 20  d=%d\n", lPath, 
2d660 67 65 74 70 69 64 28 29 29 3b 0a 20 20 72 65 74  getpid());.  ret
2d670 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
2d680 0a 0a 2f 2a 20 0a 20 2a 2a 20 43 72 65 61 74 65  ../* . ** Create
2d690 73 20 74 68 65 20 6c 6f 63 6b 20 66 69 6c 65 20  s the lock file 
2d6a0 61 6e 64 20 61 6e 79 20 6d 69 73 73 69 6e 67 20  and any missing 
2d6b0 64 69 72 65 63 74 6f 72 69 65 73 20 69 6e 20 6c  directories in l
2d6c0 6f 63 6b 50 61 74 68 0a 20 2a 2f 0a 73 74 61 74  ockPath. */.stat
2d6d0 69 63 20 69 6e 74 20 70 72 6f 78 79 43 72 65 61  ic int proxyCrea
2d6e0 74 65 4c 6f 63 6b 50 61 74 68 28 63 6f 6e 73 74  teLockPath(const
2d6f0 20 63 68 61 72 20 2a 6c 6f 63 6b 50 61 74 68 29   char *lockPath)
2d700 7b 0a 20 20 69 6e 74 20 69 2c 20 6c 65 6e 3b 0a  {.  int i, len;.
2d710 20 20 63 68 61 72 20 62 75 66 5b 4d 41 58 50 41    char buf[MAXPA
2d720 54 48 4c 45 4e 5d 3b 0a 20 20 69 6e 74 20 73 74  THLEN];.  int st
2d730 61 72 74 20 3d 20 30 3b 0a 20 20 0a 20 20 61 73  art = 0;.  .  as
2d740 73 65 72 74 28 6c 6f 63 6b 50 61 74 68 21 3d 4e  sert(lockPath!=N
2d750 55 4c 4c 29 3b 0a 20 20 2f 2a 20 74 72 79 20 74  ULL);.  /* try t
2d760 6f 20 63 72 65 61 74 65 20 61 6c 6c 20 74 68 65  o create all the
2d770 20 69 6e 74 65 72 6d 65 64 69 61 74 65 20 64 69   intermediate di
2d780 72 65 63 74 6f 72 69 65 73 20 2a 2f 0a 20 20 6c  rectories */.  l
2d790 65 6e 20 3d 20 28 69 6e 74 29 73 74 72 6c 65 6e  en = (int)strlen
2d7a0 28 6c 6f 63 6b 50 61 74 68 29 3b 0a 20 20 62 75  (lockPath);.  bu
2d7b0 66 5b 30 5d 20 3d 20 6c 6f 63 6b 50 61 74 68 5b  f[0] = lockPath[
2d7c0 30 5d 3b 0a 20 20 66 6f 72 28 20 69 3d 31 3b 20  0];.  for( i=1; 
2d7d0 69 3c 6c 65 6e 3b 20 69 2b 2b 20 29 7b 0a 20 20  i<len; i++ ){.  
2d7e0 20 20 69 66 28 20 6c 6f 63 6b 50 61 74 68 5b 69    if( lockPath[i
2d7f0 5d 20 3d 3d 20 27 2f 27 20 26 26 20 28 69 20 2d  ] == '/' && (i -
2d800 20 73 74 61 72 74 20 3e 20 30 29 20 29 7b 0a 20   start > 0) ){. 
2d810 20 20 20 20 20 2f 2a 20 6f 6e 6c 79 20 6d 6b 64       /* only mkd
2d820 69 72 20 69 66 20 6c 65 61 66 20 64 69 72 20 21  ir if leaf dir !
2d830 3d 20 22 2e 22 20 6f 72 20 22 2f 22 20 6f 72 20  = "." or "/" or 
2d840 22 2e 2e 22 20 2a 2f 0a 20 20 20 20 20 20 69 66  ".." */.      if
2d850 28 20 69 2d 73 74 61 72 74 3e 32 20 7c 7c 20 28  ( i-start>2 || (
2d860 69 2d 73 74 61 72 74 3d 3d 31 20 26 26 20 62 75  i-start==1 && bu
2d870 66 5b 73 74 61 72 74 5d 20 21 3d 20 27 2e 27 20  f[start] != '.' 
2d880 26 26 20 62 75 66 5b 73 74 61 72 74 5d 20 21 3d  && buf[start] !=
2d890 20 27 2f 27 29 20 0a 20 20 20 20 20 20 20 20 20   '/') .         
2d8a0 7c 7c 20 28 69 2d 73 74 61 72 74 3d 3d 32 20 26  || (i-start==2 &
2d8b0 26 20 62 75 66 5b 73 74 61 72 74 5d 20 21 3d 20  & buf[start] != 
2d8c0 27 2e 27 20 26 26 20 62 75 66 5b 73 74 61 72 74  '.' && buf[start
2d8d0 2b 31 5d 20 21 3d 20 27 2e 27 29 20 29 7b 0a 20  +1] != '.') ){. 
2d8e0 20 20 20 20 20 20 20 62 75 66 5b 69 5d 3d 27 5c         buf[i]='\
2d8f0 30 27 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  0';.        if( 
2d900 6d 6b 64 69 72 28 62 75 66 2c 20 53 51 4c 49 54  mkdir(buf, SQLIT
2d910 45 5f 44 45 46 41 55 4c 54 5f 50 52 4f 58 59 44  E_DEFAULT_PROXYD
2d920 49 52 5f 50 45 52 4d 49 53 53 49 4f 4e 53 29 20  IR_PERMISSIONS) 
2d930 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74  ){.          int
2d940 20 65 72 72 3d 65 72 72 6e 6f 3b 0a 20 20 20 20   err=errno;.    
2d950 20 20 20 20 20 20 69 66 28 20 65 72 72 21 3d 45        if( err!=E
2d960 45 58 49 53 54 20 29 20 7b 0a 20 20 20 20 20 20  EXIST ) {.      
2d970 20 20 20 20 20 20 4f 53 54 52 41 43 45 35 28 22        OSTRACE5("
2d980 43 52 45 41 54 45 4c 4f 43 4b 50 41 54 48 20 20  CREATELOCKPATH  
2d990 46 41 49 4c 45 44 20 63 72 65 61 74 69 6e 67 20  FAILED creating 
2d9a0 25 73 2c 20 22 0a 20 20 20 20 20 20 20 20 20 20  %s, ".          
2d9b0 20 20 20 20 20 20 20 20 20 20 20 22 27 25 73 27             "'%s'
2d9c0 20 70 72 6f 78 79 20 6c 6f 63 6b 20 70 61 74 68   proxy lock path
2d9d0 3d 25 73 20 70 69 64 3d 25 64 5c 6e 22 2c 0a 20  =%s pid=%d\n",. 
2d9e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d9f0 20 20 20 20 62 75 66 2c 20 73 74 72 65 72 72 6f      buf, strerro
2da00 72 28 65 72 72 29 2c 20 6c 6f 63 6b 50 61 74 68  r(err), lockPath
2da10 2c 20 67 65 74 70 69 64 28 29 29 3b 0a 20 20 20  , getpid());.   
2da20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
2da30 65 72 72 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  err;.          }
2da40 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
2da50 20 7d 0a 20 20 20 20 20 20 73 74 61 72 74 3d 69   }.      start=i
2da60 2b 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 62 75  +1;.    }.    bu
2da70 66 5b 69 5d 20 3d 20 6c 6f 63 6b 50 61 74 68 5b  f[i] = lockPath[
2da80 69 5d 3b 0a 20 20 7d 0a 20 20 4f 53 54 52 41 43  i];.  }.  OSTRAC
2da90 45 33 28 22 43 52 45 41 54 45 4c 4f 43 4b 50 41  E3("CREATELOCKPA
2daa0 54 48 20 20 70 72 6f 78 79 20 6c 6f 63 6b 20 70  TH  proxy lock p
2dab0 61 74 68 3d 25 73 20 70 69 64 3d 25 64 5c 6e 22  ath=%s pid=%d\n"
2dac0 2c 20 6c 6f 63 6b 50 61 74 68 2c 20 67 65 74 70  , lockPath, getp
2dad0 69 64 28 29 29 3b 0a 20 20 72 65 74 75 72 6e 20  id());.  return 
2dae0 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61  0;.}../*.** Crea
2daf0 74 65 20 61 20 6e 65 77 20 56 46 53 20 66 69 6c  te a new VFS fil
2db00 65 20 64 65 73 63 72 69 70 74 6f 72 20 28 73 74  e descriptor (st
2db10 6f 72 65 64 20 69 6e 20 6d 65 6d 6f 72 79 20 6f  ored in memory o
2db20 62 74 61 69 6e 65 64 20 66 72 6f 6d 0a 2a 2a 20  btained from.** 
2db30 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 29 20  sqlite3_malloc) 
2db40 61 6e 64 20 6f 70 65 6e 20 74 68 65 20 66 69 6c  and open the fil
2db50 65 20 6e 61 6d 65 64 20 22 70 61 74 68 22 20 69  e named "path" i
2db60 6e 20 74 68 65 20 66 69 6c 65 20 64 65 73 63 72  n the file descr
2db70 69 70 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  iptor..**.** The
2db80 20 63 61 6c 6c 65 72 20 69 73 20 72 65 73 70 6f   caller is respo
2db90 6e 73 69 62 6c 65 20 6e 6f 74 20 6f 6e 6c 79 20  nsible not only 
2dba0 66 6f 72 20 63 6c 6f 73 69 6e 67 20 74 68 65 20  for closing the 
2dbb0 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 0a  file descriptor.
2dbc0 2a 2a 20 62 75 74 20 61 6c 73 6f 20 66 6f 72 20  ** but also for 
2dbd0 66 72 65 65 69 6e 67 20 74 68 65 20 6d 65 6d 6f  freeing the memo
2dbe0 72 79 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  ry associated wi
2dbf0 74 68 20 74 68 65 20 66 69 6c 65 20 64 65 73 63  th the file desc
2dc00 72 69 70 74 6f 72 2e 0a 2a 2f 0a 73 74 61 74 69  riptor..*/.stati
2dc10 63 20 69 6e 74 20 70 72 6f 78 79 43 72 65 61 74  c int proxyCreat
2dc20 65 55 6e 69 78 46 69 6c 65 28 0a 20 20 20 20 63  eUnixFile(.    c
2dc30 6f 6e 73 74 20 63 68 61 72 20 2a 70 61 74 68 2c  onst char *path,
2dc40 20 20 20 20 20 20 20 20 2f 2a 20 70 61 74 68 20          /* path 
2dc50 66 6f 72 20 74 68 65 20 6e 65 77 20 75 6e 69 78  for the new unix
2dc60 46 69 6c 65 20 2a 2f 0a 20 20 20 20 75 6e 69 78  File */.    unix
2dc70 46 69 6c 65 20 2a 2a 70 70 46 69 6c 65 2c 20 20  File **ppFile,  
2dc80 20 20 20 20 20 2f 2a 20 75 6e 69 78 46 69 6c 65       /* unixFile
2dc90 20 63 72 65 61 74 65 64 20 61 6e 64 20 72 65 74   created and ret
2dca0 75 72 6e 65 64 20 62 79 20 72 65 66 20 2a 2f 0a  urned by ref */.
2dcb0 20 20 20 20 69 6e 74 20 69 73 6c 6f 63 6b 66 69      int islockfi
2dcc0 6c 65 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  le           /* 
2dcd0 69 66 20 6e 6f 6e 20 7a 65 72 6f 20 6d 69 73 73  if non zero miss
2dce0 69 6e 67 20 64 69 72 73 20 77 69 6c 6c 20 62 65  ing dirs will be
2dcf0 20 63 72 65 61 74 65 64 20 2a 2f 0a 29 20 7b 0a   created */.) {.
2dd00 20 20 69 6e 74 20 66 64 20 3d 20 2d 31 3b 0a 20    int fd = -1;. 
2dd10 20 69 6e 74 20 64 69 72 66 64 20 3d 20 2d 31 3b   int dirfd = -1;
2dd20 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 4e 65  .  unixFile *pNe
2dd30 77 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  w;.  int rc = SQ
2dd40 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 6f  LITE_OK;.  int o
2dd50 70 65 6e 46 6c 61 67 73 20 3d 20 4f 5f 52 44 57  penFlags = O_RDW
2dd60 52 20 7c 20 4f 5f 43 52 45 41 54 3b 0a 20 20 73  R | O_CREAT;.  s
2dd70 71 6c 69 74 65 33 5f 76 66 73 20 64 75 6d 6d 79  qlite3_vfs dummy
2dd80 56 66 73 3b 0a 20 20 69 6e 74 20 74 65 72 72 6e  Vfs;.  int terrn
2dd90 6f 20 3d 20 30 3b 0a 20 20 55 6e 69 78 55 6e 75  o = 0;.  UnixUnu
2dda0 73 65 64 46 64 20 2a 70 55 6e 75 73 65 64 20 3d  sedFd *pUnused =
2ddb0 20 4e 55 4c 4c 3b 0a 0a 20 20 2f 2a 20 31 2e 20   NULL;..  /* 1. 
2ddc0 66 69 72 73 74 20 74 72 79 20 74 6f 20 6f 70 65  first try to ope
2ddd0 6e 2f 63 72 65 61 74 65 20 74 68 65 20 66 69 6c  n/create the fil
2dde0 65 0a 20 20 2a 2a 20 32 2e 20 69 66 20 74 68 61  e.  ** 2. if tha
2ddf0 74 20 66 61 69 6c 73 2c 20 61 6e 64 20 74 68 69  t fails, and thi
2de00 73 20 69 73 20 61 20 6c 6f 63 6b 20 66 69 6c 65  s is a lock file
2de10 20 28 6e 6f 74 2d 63 6f 6e 63 68 29 2c 20 74 72   (not-conch), tr
2de20 79 20 63 72 65 61 74 69 6e 67 0a 20 20 2a 2a 20  y creating.  ** 
2de30 74 68 65 20 70 61 72 65 6e 74 20 64 69 72 65 63  the parent direc
2de40 74 6f 72 69 65 73 20 61 6e 64 20 74 68 65 6e 20  tories and then 
2de50 74 72 79 20 61 67 61 69 6e 2e 0a 20 20 2a 2a 20  try again..  ** 
2de60 33 2e 20 69 66 20 74 68 61 74 20 66 61 69 6c 73  3. if that fails
2de70 2c 20 74 72 79 20 74 6f 20 6f 70 65 6e 20 74 68  , try to open th
2de80 65 20 66 69 6c 65 20 72 65 61 64 2d 6f 6e 6c 79  e file read-only
2de90 0a 20 20 2a 2a 20 6f 74 68 65 72 77 69 73 65 20  .  ** otherwise 
2dea0 72 65 74 75 72 6e 20 42 55 53 59 20 28 69 66 20  return BUSY (if 
2deb0 6c 6f 63 6b 20 66 69 6c 65 29 20 6f 72 20 43 41  lock file) or CA
2dec0 4e 54 4f 50 45 4e 20 66 6f 72 20 74 68 65 20 63  NTOPEN for the c
2ded0 6f 6e 63 68 20 66 69 6c 65 0a 20 20 2a 2f 0a 20  onch file.  */. 
2dee0 20 70 55 6e 75 73 65 64 20 3d 20 66 69 6e 64 52   pUnused = findR
2def0 65 75 73 61 62 6c 65 46 64 28 70 61 74 68 2c 20  eusableFd(path, 
2df00 6f 70 65 6e 46 6c 61 67 73 29 3b 0a 20 20 69 66  openFlags);.  if
2df10 28 20 70 55 6e 75 73 65 64 20 29 7b 0a 20 20 20  ( pUnused ){.   
2df20 20 66 64 20 3d 20 70 55 6e 75 73 65 64 2d 3e 66   fd = pUnused->f
2df30 64 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  d;.  }else{.    
2df40 70 55 6e 75 73 65 64 20 3d 20 73 71 6c 69 74 65  pUnused = sqlite
2df50 33 5f 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28  3_malloc(sizeof(
2df60 2a 70 55 6e 75 73 65 64 29 29 3b 0a 20 20 20 20  *pUnused));.    
2df70 69 66 28 20 21 70 55 6e 75 73 65 64 20 29 7b 0a  if( !pUnused ){.
2df80 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
2df90 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d  ITE_NOMEM;.    }
2dfa0 0a 20 20 7d 0a 20 20 69 66 28 20 66 64 3c 30 20  .  }.  if( fd<0 
2dfb0 29 7b 0a 20 20 20 20 66 64 20 3d 20 6f 70 65 6e  ){.    fd = open
2dfc0 28 70 61 74 68 2c 20 6f 70 65 6e 46 6c 61 67 73  (path, openFlags
2dfd0 2c 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54  , SQLITE_DEFAULT
2dfe0 5f 46 49 4c 45 5f 50 45 52 4d 49 53 53 49 4f 4e  _FILE_PERMISSION
2dff0 53 29 3b 0a 20 20 20 20 74 65 72 72 6e 6f 20 3d  S);.    terrno =
2e000 20 65 72 72 6e 6f 3b 0a 20 20 20 20 69 66 28 20   errno;.    if( 
2e010 66 64 3c 30 20 26 26 20 65 72 72 6e 6f 3d 3d 45  fd<0 && errno==E
2e020 4e 4f 45 4e 54 20 26 26 20 69 73 6c 6f 63 6b 66  NOENT && islockf
2e030 69 6c 65 20 29 7b 0a 20 20 20 20 20 20 69 66 28  ile ){.      if(
2e040 20 70 72 6f 78 79 43 72 65 61 74 65 4c 6f 63 6b   proxyCreateLock
2e050 50 61 74 68 28 70 61 74 68 29 20 3d 3d 20 53 51  Path(path) == SQ
2e060 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
2e070 20 20 20 66 64 20 3d 20 6f 70 65 6e 28 70 61 74     fd = open(pat
2e080 68 2c 20 6f 70 65 6e 46 6c 61 67 73 2c 20 53 51  h, openFlags, SQ
2e090 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 46 49 4c  LITE_DEFAULT_FIL
2e0a0 45 5f 50 45 52 4d 49 53 53 49 4f 4e 53 29 3b 0a  E_PERMISSIONS);.
2e0b0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
2e0c0 7d 0a 20 20 69 66 28 20 66 64 3c 30 20 29 7b 0a  }.  if( fd<0 ){.
2e0d0 20 20 20 20 6f 70 65 6e 46 6c 61 67 73 20 3d 20      openFlags = 
2e0e0 4f 5f 52 44 4f 4e 4c 59 3b 0a 20 20 20 20 66 64  O_RDONLY;.    fd
2e0f0 20 3d 20 6f 70 65 6e 28 70 61 74 68 2c 20 6f 70   = open(path, op
2e100 65 6e 46 6c 61 67 73 2c 20 53 51 4c 49 54 45 5f  enFlags, SQLITE_
2e110 44 45 46 41 55 4c 54 5f 46 49 4c 45 5f 50 45 52  DEFAULT_FILE_PER
2e120 4d 49 53 53 49 4f 4e 53 29 3b 0a 20 20 20 20 74  MISSIONS);.    t
2e130 65 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20  errno = errno;. 
2e140 20 7d 0a 20 20 69 66 28 20 66 64 3c 30 20 29 7b   }.  if( fd<0 ){
2e150 0a 20 20 20 20 69 66 28 20 69 73 6c 6f 63 6b 66  .    if( islockf
2e160 69 6c 65 20 29 7b 0a 20 20 20 20 20 20 72 65 74  ile ){.      ret
2e170 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 3b  urn SQLITE_BUSY;
2e180 0a 20 20 20 20 7d 0a 20 20 20 20 73 77 69 74 63  .    }.    switc
2e190 68 20 28 74 65 72 72 6e 6f 29 20 7b 0a 20 20 20  h (terrno) {.   
2e1a0 20 20 20 63 61 73 65 20 45 41 43 43 45 53 3a 0a     case EACCES:.
2e1b0 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53          return S
2e1c0 51 4c 49 54 45 5f 50 45 52 4d 3b 0a 20 20 20 20  QLITE_PERM;.    
2e1d0 20 20 63 61 73 65 20 45 49 4f 3a 20 0a 20 20 20    case EIO: .   
2e1e0 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
2e1f0 54 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b 3b 20 2f  TE_IOERR_LOCK; /
2e200 2a 20 65 76 65 6e 20 74 68 6f 75 67 68 20 69 74  * even though it
2e210 20 69 73 20 74 68 65 20 63 6f 6e 63 68 20 2a 2f   is the conch */
2e220 0a 20 20 20 20 20 20 64 65 66 61 75 6c 74 3a 0a  .      default:.
2e230 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53          return S
2e240 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 42  QLITE_CANTOPEN_B
2e250 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  KPT;.    }.  }. 
2e260 20 0a 20 20 70 4e 65 77 20 3d 20 28 75 6e 69 78   .  pNew = (unix
2e270 46 69 6c 65 20 2a 29 73 71 6c 69 74 65 33 5f 6d  File *)sqlite3_m
2e280 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 2a 70 4e  alloc(sizeof(*pN
2e290 65 77 29 29 3b 0a 20 20 69 66 28 20 70 4e 65 77  ew));.  if( pNew
2e2a0 3d 3d 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 72 63  ==NULL ){.    rc
2e2b0 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b   = SQLITE_NOMEM;
2e2c0 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 63 72  .    goto end_cr
2e2d0 65 61 74 65 5f 70 72 6f 78 79 3b 0a 20 20 7d 0a  eate_proxy;.  }.
2e2e0 20 20 6d 65 6d 73 65 74 28 70 4e 65 77 2c 20 30    memset(pNew, 0
2e2f0 2c 20 73 69 7a 65 6f 66 28 75 6e 69 78 46 69 6c  , sizeof(unixFil
2e300 65 29 29 3b 0a 20 20 70 4e 65 77 2d 3e 6f 70 65  e));.  pNew->ope
2e310 6e 46 6c 61 67 73 20 3d 20 6f 70 65 6e 46 6c 61  nFlags = openFla
2e320 67 73 3b 0a 20 20 64 75 6d 6d 79 56 66 73 2e 70  gs;.  dummyVfs.p
2e330 41 70 70 44 61 74 61 20 3d 20 28 76 6f 69 64 2a  AppData = (void*
2e340 29 26 61 75 74 6f 6c 6f 63 6b 49 6f 46 69 6e 64  )&autolockIoFind
2e350 65 72 3b 0a 20 20 70 55 6e 75 73 65 64 2d 3e 66  er;.  pUnused->f
2e360 64 20 3d 20 66 64 3b 0a 20 20 70 55 6e 75 73 65  d = fd;.  pUnuse
2e370 64 2d 3e 66 6c 61 67 73 20 3d 20 6f 70 65 6e 46  d->flags = openF
2e380 6c 61 67 73 3b 0a 20 20 70 4e 65 77 2d 3e 70 55  lags;.  pNew->pU
2e390 6e 75 73 65 64 20 3d 20 70 55 6e 75 73 65 64 3b  nused = pUnused;
2e3a0 0a 20 20 0a 20 20 72 63 20 3d 20 66 69 6c 6c 49  .  .  rc = fillI
2e3b0 6e 55 6e 69 78 46 69 6c 65 28 26 64 75 6d 6d 79  nUnixFile(&dummy
2e3c0 56 66 73 2c 20 66 64 2c 20 64 69 72 66 64 2c 20  Vfs, fd, dirfd, 
2e3d0 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29 70  (sqlite3_file*)p
2e3e0 4e 65 77 2c 20 70 61 74 68 2c 20 30 2c 20 30 29  New, path, 0, 0)
2e3f0 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ;.  if( rc==SQLI
2e400 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 2a 70 70  TE_OK ){.    *pp
2e410 46 69 6c 65 20 3d 20 70 4e 65 77 3b 0a 20 20 20  File = pNew;.   
2e420 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
2e430 4b 3b 0a 20 20 7d 0a 65 6e 64 5f 63 72 65 61 74  K;.  }.end_creat
2e440 65 5f 70 72 6f 78 79 3a 20 20 20 20 0a 20 20 63  e_proxy:    .  c
2e450 6c 6f 73 65 28 66 64 29 3b 20 2f 2a 20 73 69 6c  lose(fd); /* sil
2e460 65 6e 74 6c 79 20 6c 65 61 6b 20 66 64 20 69 66  ently leak fd if
2e470 20 65 72 72 6f 72 2c 20 77 65 27 72 65 20 61 6c   error, we're al
2e480 72 65 61 64 79 20 69 6e 20 65 72 72 6f 72 20 2a  ready in error *
2e490 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65  /.  sqlite3_free
2e4a0 28 70 4e 65 77 29 3b 0a 20 20 73 71 6c 69 74 65  (pNew);.  sqlite
2e4b0 33 5f 66 72 65 65 28 70 55 6e 75 73 65 64 29 3b  3_free(pUnused);
2e4c0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
2e4d0 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54  .#ifdef SQLITE_T
2e4e0 45 53 54 0a 2f 2a 20 73 69 6d 75 6c 61 74 65 20  EST./* simulate 
2e4f0 6d 75 6c 74 69 70 6c 65 20 68 6f 73 74 73 20 62  multiple hosts b
2e500 79 20 63 72 65 61 74 69 6e 67 20 75 6e 69 71 75  y creating uniqu
2e510 65 20 68 6f 73 74 69 64 20 66 69 6c 65 20 70 61  e hostid file pa
2e520 74 68 73 20 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ths */.int sqlit
2e530 65 33 5f 68 6f 73 74 69 64 5f 6e 75 6d 20 3d 20  e3_hostid_num = 
2e540 30 3b 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69  0;.#endif..#defi
2e550 6e 65 20 50 52 4f 58 59 5f 48 4f 53 54 49 44 4c  ne PROXY_HOSTIDL
2e560 45 4e 20 20 20 20 31 36 20 20 2f 2a 20 63 6f 6e  EN    16  /* con
2e570 63 68 20 66 69 6c 65 20 68 6f 73 74 20 69 64 20  ch file host id 
2e580 6c 65 6e 67 74 68 20 2a 2f 0a 0a 2f 2a 20 67 65  length */../* ge
2e590 74 20 74 68 65 20 68 6f 73 74 20 49 44 20 76 69  t the host ID vi
2e5a0 61 20 67 65 74 68 6f 73 74 75 75 69 64 28 29 2c  a gethostuuid(),
2e5b0 20 70 48 6f 73 74 49 44 20 6d 75 73 74 20 70 6f   pHostID must po
2e5c0 69 6e 74 20 74 6f 20 50 52 4f 58 59 5f 48 4f 53  int to PROXY_HOS
2e5d0 54 49 44 4c 45 4e 20 0a 2a 2a 20 62 79 74 65 73  TIDLEN .** bytes
2e5e0 20 6f 66 20 77 72 69 74 61 62 6c 65 20 6d 65 6d   of writable mem
2e5f0 6f 72 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ory..*/.static i
2e600 6e 74 20 70 72 6f 78 79 47 65 74 48 6f 73 74 49  nt proxyGetHostI
2e610 44 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  D(unsigned char 
2e620 2a 70 48 6f 73 74 49 44 2c 20 69 6e 74 20 2a 70  *pHostID, int *p
2e630 45 72 72 6f 72 29 7b 0a 20 20 73 74 72 75 63 74  Error){.  struct
2e640 20 74 69 6d 65 73 70 65 63 20 74 69 6d 65 6f 75   timespec timeou
2e650 74 20 3d 20 7b 31 2c 20 30 7d 3b 20 2f 2a 20 31  t = {1, 0}; /* 1
2e660 20 73 65 63 20 74 69 6d 65 6f 75 74 20 2a 2f 0a   sec timeout */.
2e670 20 20 0a 20 20 61 73 73 65 72 74 28 50 52 4f 58    .  assert(PROX
2e680 59 5f 48 4f 53 54 49 44 4c 45 4e 20 3d 3d 20 73  Y_HOSTIDLEN == s
2e690 69 7a 65 6f 66 28 75 75 69 64 5f 74 29 29 3b 0a  izeof(uuid_t));.
2e6a0 20 20 6d 65 6d 73 65 74 28 70 48 6f 73 74 49 44    memset(pHostID
2e6b0 2c 20 30 2c 20 50 52 4f 58 59 5f 48 4f 53 54 49  , 0, PROXY_HOSTI
2e6c0 44 4c 45 4e 29 3b 0a 20 20 69 66 28 20 67 65 74  DLEN);.  if( get
2e6d0 68 6f 73 74 75 75 69 64 28 70 48 6f 73 74 49 44  hostuuid(pHostID
2e6e0 2c 20 26 74 69 6d 65 6f 75 74 29 20 29 7b 0a 20  , &timeout) ){. 
2e6f0 20 20 20 69 6e 74 20 65 72 72 20 3d 20 65 72 72     int err = err
2e700 6e 6f 3b 0a 20 20 20 20 69 66 28 20 70 45 72 72  no;.    if( pErr
2e710 6f 72 20 29 7b 0a 20 20 20 20 20 20 2a 70 45 72  or ){.      *pEr
2e720 72 6f 72 20 3d 20 65 72 72 3b 0a 20 20 20 20 7d  ror = err;.    }
2e730 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
2e740 54 45 5f 49 4f 45 52 52 3b 0a 20 20 7d 0a 23 69  TE_IOERR;.  }.#i
2e750 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54  fdef SQLITE_TEST
2e760 0a 20 20 2f 2a 20 73 69 6d 75 6c 61 74 65 20 6d  .  /* simulate m
2e770 75 6c 74 69 70 6c 65 20 68 6f 73 74 73 20 62 79  ultiple hosts by
2e780 20 63 72 65 61 74 69 6e 67 20 75 6e 69 71 75 65   creating unique
2e790 20 68 6f 73 74 69 64 20 66 69 6c 65 20 70 61 74   hostid file pat
2e7a0 68 73 20 2a 2f 0a 20 20 69 66 28 20 73 71 6c 69  hs */.  if( sqli
2e7b0 74 65 33 5f 68 6f 73 74 69 64 5f 6e 75 6d 20 21  te3_hostid_num !
2e7c0 3d 20 30 29 7b 0a 20 20 20 20 70 48 6f 73 74 49  = 0){.    pHostI
2e7d0 44 5b 30 5d 20 3d 20 28 63 68 61 72 29 28 70 48  D[0] = (char)(pH
2e7e0 6f 73 74 49 44 5b 30 5d 20 2b 20 28 63 68 61 72  ostID[0] + (char
2e7f0 29 28 73 71 6c 69 74 65 33 5f 68 6f 73 74 69 64  )(sqlite3_hostid
2e800 5f 6e 75 6d 20 26 20 30 78 46 46 29 29 3b 0a 20  _num & 0xFF));. 
2e810 20 7d 0a 23 65 6e 64 69 66 0a 20 20 0a 20 20 72   }.#endif.  .  r
2e820 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
2e830 0a 7d 0a 0a 2f 2a 20 54 68 65 20 63 6f 6e 63 68  .}../* The conch
2e840 20 66 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 74   file contains t
2e850 68 65 20 68 65 61 64 65 72 2c 20 68 6f 73 74 20  he header, host 
2e860 69 64 20 61 6e 64 20 6c 6f 63 6b 20 66 69 6c 65  id and lock file
2e870 20 70 61 74 68 0a 20 2a 2f 0a 23 64 65 66 69 6e   path. */.#defin
2e880 65 20 50 52 4f 58 59 5f 43 4f 4e 43 48 56 45 52  e PROXY_CONCHVER
2e890 53 49 4f 4e 20 32 20 20 20 2f 2a 20 31 2d 62 79  SION 2   /* 1-by
2e8a0 74 65 20 68 65 61 64 65 72 2c 20 31 36 2d 62 79  te header, 16-by
2e8b0 74 65 20 68 6f 73 74 20 69 64 2c 20 70 61 74 68  te host id, path
2e8c0 20 2a 2f 0a 23 64 65 66 69 6e 65 20 50 52 4f 58   */.#define PROX
2e8d0 59 5f 48 45 41 44 45 52 4c 45 4e 20 20 20 20 31  Y_HEADERLEN    1
2e8e0 20 20 20 2f 2a 20 63 6f 6e 63 68 20 66 69 6c 65     /* conch file
2e8f0 20 68 65 61 64 65 72 20 6c 65 6e 67 74 68 20 2a   header length *
2e900 2f 0a 23 64 65 66 69 6e 65 20 50 52 4f 58 59 5f  /.#define PROXY_
2e910 50 41 54 48 49 4e 44 45 58 20 20 20 20 28 50 52  PATHINDEX    (PR
2e920 4f 58 59 5f 48 45 41 44 45 52 4c 45 4e 2b 50 52  OXY_HEADERLEN+PR
2e930 4f 58 59 5f 48 4f 53 54 49 44 4c 45 4e 29 0a 23  OXY_HOSTIDLEN).#
2e940 64 65 66 69 6e 65 20 50 52 4f 58 59 5f 4d 41 58  define PROXY_MAX
2e950 43 4f 4e 43 48 4c 45 4e 20 20 28 50 52 4f 58 59  CONCHLEN  (PROXY
2e960 5f 48 45 41 44 45 52 4c 45 4e 2b 50 52 4f 58 59  _HEADERLEN+PROXY
2e970 5f 48 4f 53 54 49 44 4c 45 4e 2b 4d 41 58 50 41  _HOSTIDLEN+MAXPA
2e980 54 48 4c 45 4e 29 0a 0a 2f 2a 20 0a 2a 2a 20 54  THLEN)../* .** T
2e990 61 6b 65 73 20 61 6e 20 6f 70 65 6e 20 63 6f 6e  akes an open con
2e9a0 63 68 20 66 69 6c 65 2c 20 63 6f 70 69 65 73 20  ch file, copies 
2e9b0 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 74 6f 20  the contents to 
2e9c0 61 20 6e 65 77 20 70 61 74 68 20 61 6e 64 20 74  a new path and t
2e9d0 68 65 6e 20 6d 6f 76 65 73 20 0a 2a 2a 20 69 74  hen moves .** it
2e9e0 20 62 61 63 6b 2e 20 20 54 68 65 20 6e 65 77 6c   back.  The newl
2e9f0 79 20 63 72 65 61 74 65 64 20 66 69 6c 65 27 73  y created file's
2ea00 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
2ea10 20 69 73 20 61 73 73 69 67 6e 65 64 20 74 6f 20   is assigned to 
2ea20 74 68 65 0a 2a 2a 20 63 6f 6e 63 68 20 66 69 6c  the.** conch fil
2ea30 65 20 73 74 72 75 63 74 75 72 65 20 61 6e 64 20  e structure and 
2ea40 66 69 6e 61 6c 6c 79 20 74 68 65 20 6f 72 69 67  finally the orig
2ea50 69 6e 61 6c 20 63 6f 6e 63 68 20 66 69 6c 65 20  inal conch file 
2ea60 64 65 73 63 72 69 70 74 6f 72 20 69 73 20 0a 2a  descriptor is .*
2ea70 2a 20 63 6c 6f 73 65 64 2e 20 20 52 65 74 75 72  * closed.  Retur
2ea80 6e 73 20 7a 65 72 6f 20 69 66 20 73 75 63 63 65  ns zero if succe
2ea90 73 73 66 75 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63  ssful..*/.static
2eaa0 20 69 6e 74 20 70 72 6f 78 79 42 72 65 61 6b 43   int proxyBreakC
2eab0 6f 6e 63 68 4c 6f 63 6b 28 75 6e 69 78 46 69 6c  onchLock(unixFil
2eac0 65 20 2a 70 46 69 6c 65 2c 20 75 75 69 64 5f 74  e *pFile, uuid_t
2ead0 20 6d 79 48 6f 73 74 49 44 29 7b 0a 20 20 70 72   myHostID){.  pr
2eae0 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78  oxyLockingContex
2eaf0 74 20 2a 70 43 74 78 20 3d 20 28 70 72 6f 78 79  t *pCtx = (proxy
2eb00 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a  LockingContext *
2eb10 29 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43  )pFile->lockingC
2eb20 6f 6e 74 65 78 74 3b 20 0a 20 20 75 6e 69 78 46  ontext; .  unixF
2eb30 69 6c 65 20 2a 63 6f 6e 63 68 46 69 6c 65 20 3d  ile *conchFile =
2eb40 20 70 43 74 78 2d 3e 63 6f 6e 63 68 46 69 6c 65   pCtx->conchFile
2eb50 3b 0a 20 20 63 68 61 72 20 74 50 61 74 68 5b 4d  ;.  char tPath[M
2eb60 41 58 50 41 54 48 4c 45 4e 5d 3b 0a 20 20 63 68  AXPATHLEN];.  ch
2eb70 61 72 20 62 75 66 5b 50 52 4f 58 59 5f 4d 41 58  ar buf[PROXY_MAX
2eb80 43 4f 4e 43 48 4c 45 4e 5d 3b 0a 20 20 63 68 61  CONCHLEN];.  cha
2eb90 72 20 2a 63 50 61 74 68 20 3d 20 70 43 74 78 2d  r *cPath = pCtx-
2eba0 3e 63 6f 6e 63 68 46 69 6c 65 50 61 74 68 3b 0a  >conchFilePath;.
2ebb0 20 20 73 69 7a 65 5f 74 20 72 65 61 64 4c 65 6e    size_t readLen
2ebc0 20 3d 20 30 3b 0a 20 20 73 69 7a 65 5f 74 20 70   = 0;.  size_t p
2ebd0 61 74 68 4c 65 6e 20 3d 20 30 3b 0a 20 20 63 68  athLen = 0;.  ch
2ebe0 61 72 20 65 72 72 6d 73 67 5b 36 34 5d 20 3d 20  ar errmsg[64] = 
2ebf0 22 22 3b 0a 20 20 69 6e 74 20 66 64 20 3d 20 2d  "";.  int fd = -
2ec00 31 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 2d 31  1;.  int rc = -1
2ec10 3b 0a 0a 20 20 2f 2a 20 63 72 65 61 74 65 20 61  ;..  /* create a
2ec20 20 6e 65 77 20 70 61 74 68 20 62 79 20 72 65 70   new path by rep
2ec30 6c 61 63 65 20 74 68 65 20 74 72 61 69 6c 69 6e  lace the trailin
2ec40 67 20 27 2d 63 6f 6e 63 68 27 20 77 69 74 68 20  g '-conch' with 
2ec50 27 2d 62 72 65 61 6b 27 20 2a 2f 0a 20 20 70 61  '-break' */.  pa
2ec60 74 68 4c 65 6e 20 3d 20 73 74 72 6c 63 70 79 28  thLen = strlcpy(
2ec70 74 50 61 74 68 2c 20 63 50 61 74 68 2c 20 4d 41  tPath, cPath, MA
2ec80 58 50 41 54 48 4c 45 4e 29 3b 0a 20 20 69 66 28  XPATHLEN);.  if(
2ec90 20 70 61 74 68 4c 65 6e 3e 4d 41 58 50 41 54 48   pathLen>MAXPATH
2eca0 4c 45 4e 20 7c 7c 20 70 61 74 68 4c 65 6e 3c 36  LEN || pathLen<6
2ecb0 20 7c 7c 20 0a 20 20 20 20 20 28 73 74 72 6c 63   || .     (strlc
2ecc0 70 79 28 26 74 50 61 74 68 5b 70 61 74 68 4c 65  py(&tPath[pathLe
2ecd0 6e 2d 35 5d 2c 20 22 62 72 65 61 6b 22 2c 20 36  n-5], "break", 6
2ece0 29 20 21 3d 20 35 29 20 29 7b 0a 20 20 20 20 73  ) != 5) ){.    s
2ecf0 70 72 69 6e 74 66 28 65 72 72 6d 73 67 2c 20 22  printf(errmsg, "
2ed00 70 61 74 68 20 65 72 72 6f 72 20 28 6c 65 6e 20  path error (len 
2ed10 25 64 29 22 2c 20 28 69 6e 74 29 70 61 74 68 4c  %d)", (int)pathL
2ed20 65 6e 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65 6e  en);.    goto en
2ed30 64 5f 62 72 65 61 6b 6c 6f 63 6b 3b 0a 20 20 7d  d_breaklock;.  }
2ed40 0a 20 20 2f 2a 20 72 65 61 64 20 74 68 65 20 63  .  /* read the c
2ed50 6f 6e 63 68 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a  onch content */.
2ed60 20 20 72 65 61 64 4c 65 6e 20 3d 20 70 72 65 61    readLen = prea
2ed70 64 28 63 6f 6e 63 68 46 69 6c 65 2d 3e 68 2c 20  d(conchFile->h, 
2ed80 62 75 66 2c 20 50 52 4f 58 59 5f 4d 41 58 43 4f  buf, PROXY_MAXCO
2ed90 4e 43 48 4c 45 4e 2c 20 30 29 3b 0a 20 20 69 66  NCHLEN, 0);.  if
2eda0 28 20 72 65 61 64 4c 65 6e 3c 50 52 4f 58 59 5f  ( readLen<PROXY_
2edb0 50 41 54 48 49 4e 44 45 58 20 29 7b 0a 20 20 20  PATHINDEX ){.   
2edc0 20 73 70 72 69 6e 74 66 28 65 72 72 6d 73 67 2c   sprintf(errmsg,
2edd0 20 22 72 65 61 64 20 65 72 72 6f 72 20 28 6c 65   "read error (le
2ede0 6e 20 25 64 29 22 2c 20 28 69 6e 74 29 72 65 61  n %d)", (int)rea
2edf0 64 4c 65 6e 29 3b 0a 20 20 20 20 67 6f 74 6f 20  dLen);.    goto 
2ee00 65 6e 64 5f 62 72 65 61 6b 6c 6f 63 6b 3b 0a 20  end_breaklock;. 
2ee10 20 7d 0a 20 20 2f 2a 20 77 72 69 74 65 20 69 74   }.  /* write it
2ee20 20 6f 75 74 20 74 6f 20 74 68 65 20 74 65 6d 70   out to the temp
2ee30 6f 72 61 72 79 20 62 72 65 61 6b 20 66 69 6c 65  orary break file
2ee40 20 2a 2f 0a 20 20 66 64 20 3d 20 6f 70 65 6e 28   */.  fd = open(
2ee50 74 50 61 74 68 2c 20 28 4f 5f 52 44 57 52 7c 4f  tPath, (O_RDWR|O
2ee60 5f 43 52 45 41 54 7c 4f 5f 45 58 43 4c 29 2c 20  _CREAT|O_EXCL), 
2ee70 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 46  SQLITE_DEFAULT_F
2ee80 49 4c 45 5f 50 45 52 4d 49 53 53 49 4f 4e 53 29  ILE_PERMISSIONS)
2ee90 3b 0a 20 20 69 66 28 20 66 64 3c 30 20 29 7b 0a  ;.  if( fd<0 ){.
2eea0 20 20 20 20 73 70 72 69 6e 74 66 28 65 72 72 6d      sprintf(errm
2eeb0 73 67 2c 20 22 63 72 65 61 74 65 20 66 61 69 6c  sg, "create fail
2eec0 65 64 20 28 25 64 29 22 2c 20 65 72 72 6e 6f 29  ed (%d)", errno)
2eed0 3b 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 62  ;.    goto end_b
2eee0 72 65 61 6b 6c 6f 63 6b 3b 0a 20 20 7d 0a 20 20  reaklock;.  }.  
2eef0 69 66 28 20 70 77 72 69 74 65 28 66 64 2c 20 62  if( pwrite(fd, b
2ef00 75 66 2c 20 72 65 61 64 4c 65 6e 2c 20 30 29 20  uf, readLen, 0) 
2ef10 21 3d 20 72 65 61 64 4c 65 6e 20 29 7b 0a 20 20  != readLen ){.  
2ef20 20 20 73 70 72 69 6e 74 66 28 65 72 72 6d 73 67    sprintf(errmsg
2ef30 2c 20 22 77 72 69 74 65 20 66 61 69 6c 65 64 20  , "write failed 
2ef40 28 25 64 29 22 2c 20 65 72 72 6e 6f 29 3b 0a 20  (%d)", errno);. 
2ef50 20 20 20 67 6f 74 6f 20 65 6e 64 5f 62 72 65 61     goto end_brea
2ef60 6b 6c 6f 63 6b 3b 0a 20 20 7d 0a 20 20 69 66 28  klock;.  }.  if(
2ef70 20 72 65 6e 61 6d 65 28 74 50 61 74 68 2c 20 63   rename(tPath, c
2ef80 50 61 74 68 29 20 29 7b 0a 20 20 20 20 73 70 72  Path) ){.    spr
2ef90 69 6e 74 66 28 65 72 72 6d 73 67 2c 20 22 72 65  intf(errmsg, "re
2efa0 6e 61 6d 65 20 66 61 69 6c 65 64 20 28 25 64 29  name failed (%d)
2efb0 22 2c 20 65 72 72 6e 6f 29 3b 0a 20 20 20 20 67  ", errno);.    g
2efc0 6f 74 6f 20 65 6e 64 5f 62 72 65 61 6b 6c 6f 63  oto end_breakloc
2efd0 6b 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 30 3b  k;.  }.  rc = 0;
2efe0 0a 20 20 66 70 72 69 6e 74 66 28 73 74 64 65 72  .  fprintf(stder
2eff0 72 2c 20 22 62 72 6f 6b 65 20 73 74 61 6c 65 20  r, "broke stale 
2f000 6c 6f 63 6b 20 6f 6e 20 25 73 5c 6e 22 2c 20 63  lock on %s\n", c
2f010 50 61 74 68 29 3b 0a 20 20 63 6c 6f 73 65 28 63  Path);.  close(c
2f020 6f 6e 63 68 46 69 6c 65 2d 3e 68 29 3b 0a 20 20  onchFile->h);.  
2f030 63 6f 6e 63 68 46 69 6c 65 2d 3e 68 20 3d 20 66  conchFile->h = f
2f040 64 3b 0a 20 20 63 6f 6e 63 68 46 69 6c 65 2d 3e  d;.  conchFile->
2f050 6f 70 65 6e 46 6c 61 67 73 20 3d 20 4f 5f 52 44  openFlags = O_RD
2f060 57 52 20 7c 20 4f 5f 43 52 45 41 54 3b 0a 0a 65  WR | O_CREAT;..e
2f070 6e 64 5f 62 72 65 61 6b 6c 6f 63 6b 3a 0a 20 20  nd_breaklock:.  
2f080 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 69 66  if( rc ){.    if
2f090 28 20 66 64 3e 3d 30 20 29 7b 0a 20 20 20 20 20  ( fd>=0 ){.     
2f0a0 20 75 6e 6c 69 6e 6b 28 74 50 61 74 68 29 3b 0a   unlink(tPath);.
2f0b0 20 20 20 20 20 20 63 6c 6f 73 65 28 66 64 29 3b        close(fd);
2f0c0 0a 20 20 20 20 7d 0a 20 20 20 20 66 70 72 69 6e  .    }.    fprin
2f0d0 74 66 28 73 74 64 65 72 72 2c 20 22 66 61 69 6c  tf(stderr, "fail
2f0e0 65 64 20 74 6f 20 62 72 65 61 6b 20 73 74 61 6c  ed to break stal
2f0f0 65 20 6c 6f 63 6b 20 6f 6e 20 25 73 2c 20 25 73  e lock on %s, %s
2f100 5c 6e 22 2c 20 63 50 61 74 68 2c 20 65 72 72 6d  \n", cPath, errm
2f110 73 67 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  sg);.  }.  retur
2f120 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 54 61 6b 65  n rc;.}../* Take
2f130 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20 6c   the requested l
2f140 6f 63 6b 20 6f 6e 20 74 68 65 20 63 6f 6e 63 68  ock on the conch
2f150 20 66 69 6c 65 20 61 6e 64 20 62 72 65 61 6b 20   file and break 
2f160 61 20 73 74 61 6c 65 20 6c 6f 63 6b 20 69 66 20  a stale lock if 
2f170 74 68 65 20 0a 2a 2a 20 68 6f 73 74 20 69 64 20  the .** host id 
2f180 6d 61 74 63 68 65 73 2e 0a 2a 2f 0a 73 74 61 74  matches..*/.stat
2f190 69 63 20 69 6e 74 20 70 72 6f 78 79 43 6f 6e 63  ic int proxyConc
2f1a0 68 4c 6f 63 6b 28 75 6e 69 78 46 69 6c 65 20 2a  hLock(unixFile *
2f1b0 70 46 69 6c 65 2c 20 75 75 69 64 5f 74 20 6d 79  pFile, uuid_t my
2f1c0 48 6f 73 74 49 44 2c 20 69 6e 74 20 6c 6f 63 6b  HostID, int lock
2f1d0 54 79 70 65 29 7b 0a 20 20 70 72 6f 78 79 4c 6f  Type){.  proxyLo
2f1e0 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 70 43  ckingContext *pC
2f1f0 74 78 20 3d 20 28 70 72 6f 78 79 4c 6f 63 6b 69  tx = (proxyLocki
2f200 6e 67 43 6f 6e 74 65 78 74 20 2a 29 70 46 69 6c  ngContext *)pFil
2f210 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78  e->lockingContex
2f220 74 3b 20 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a  t; .  unixFile *
2f230 63 6f 6e 63 68 46 69 6c 65 20 3d 20 70 43 74 78  conchFile = pCtx
2f240 2d 3e 63 6f 6e 63 68 46 69 6c 65 3b 0a 20 20 69  ->conchFile;.  i
2f250 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
2f260 4b 3b 0a 20 20 69 6e 74 20 6e 54 72 69 65 73 20  K;.  int nTries 
2f270 3d 20 30 3b 0a 20 20 73 74 72 75 63 74 20 74 69  = 0;.  struct ti
2f280 6d 65 73 70 65 63 20 63 6f 6e 63 68 4d 6f 64 54  mespec conchModT
2f290 69 6d 65 3b 0a 20 20 0a 20 20 64 6f 20 7b 0a 20  ime;.  .  do {. 
2f2a0 20 20 20 72 63 20 3d 20 63 6f 6e 63 68 46 69 6c     rc = conchFil
2f2b0 65 2d 3e 70 4d 65 74 68 6f 64 2d 3e 78 4c 6f 63  e->pMethod->xLoc
2f2c0 6b 28 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a  k((sqlite3_file*
2f2d0 29 63 6f 6e 63 68 46 69 6c 65 2c 20 6c 6f 63 6b  )conchFile, lock
2f2e0 54 79 70 65 29 3b 0a 20 20 20 20 6e 54 72 69 65  Type);.    nTrie
2f2f0 73 20 2b 2b 3b 0a 20 20 20 20 69 66 28 20 72 63  s ++;.    if( rc
2f300 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59 20 29 7b  ==SQLITE_BUSY ){
2f310 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65  .      /* If the
2f320 20 6c 6f 63 6b 20 66 61 69 6c 65 64 20 28 62 75   lock failed (bu
2f330 73 79 29 3a 0a 20 20 20 20 20 20 20 2a 20 31 73  sy):.       * 1s
2f340 74 20 74 72 79 3a 20 67 65 74 20 74 68 65 20 6d  t try: get the m
2f350 6f 64 20 74 69 6d 65 20 6f 66 20 74 68 65 20 63  od time of the c
2f360 6f 6e 63 68 2c 20 77 61 69 74 20 30 2e 35 73 20  onch, wait 0.5s 
2f370 61 6e 64 20 74 72 79 20 61 67 61 69 6e 2e 20 0a  and try again. .
2f380 20 20 20 20 20 20 20 2a 20 32 6e 64 20 74 72 79         * 2nd try
2f390 3a 20 66 61 69 6c 20 69 66 20 74 68 65 20 6d 6f  : fail if the mo
2f3a0 64 20 74 69 6d 65 20 63 68 61 6e 67 65 64 20 6f  d time changed o
2f3b0 72 20 68 6f 73 74 20 69 64 20 69 73 20 64 69 66  r host id is dif
2f3c0 66 65 72 65 6e 74 2c 20 77 61 69 74 20 0a 20 20  ferent, wait .  
2f3d0 20 20 20 20 20 2a 20 20 20 20 20 20 20 20 20 20       *          
2f3e0 20 31 30 20 73 65 63 20 61 6e 64 20 74 72 79 20   10 sec and try 
2f3f0 61 67 61 69 6e 0a 20 20 20 20 20 20 20 2a 20 33  again.       * 3
2f400 72 64 20 74 72 79 3a 20 62 72 65 61 6b 20 74 68  rd try: break th
2f410 65 20 6c 6f 63 6b 20 75 6e 6c 65 73 73 20 74 68  e lock unless th
2f420 65 20 6d 6f 64 20 74 69 6d 65 20 68 61 73 20 63  e mod time has c
2f430 68 61 6e 67 65 64 2e 0a 20 20 20 20 20 20 20 2a  hanged..       *
2f440 2f 0a 20 20 20 20 20 20 73 74 72 75 63 74 20 73  /.      struct s
2f450 74 61 74 20 62 75 66 3b 0a 20 20 20 20 20 20 69  tat buf;.      i
2f460 66 28 20 66 73 74 61 74 28 63 6f 6e 63 68 46 69  f( fstat(conchFi
2f470 6c 65 2d 3e 68 2c 20 26 62 75 66 29 20 29 7b 0a  le->h, &buf) ){.
2f480 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c          pFile->l
2f490 61 73 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f  astErrno = errno
2f4a0 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
2f4b0 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4c 4f   SQLITE_IOERR_LO
2f4c0 43 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  CK;.      }.    
2f4d0 20 20 0a 20 20 20 20 20 20 69 66 28 20 6e 54 72    .      if( nTr
2f4e0 69 65 73 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20  ies==1 ){.      
2f4f0 20 20 63 6f 6e 63 68 4d 6f 64 54 69 6d 65 20 3d    conchModTime =
2f500 20 62 75 66 2e 73 74 5f 6d 74 69 6d 65 73 70 65   buf.st_mtimespe
2f510 63 3b 0a 20 20 20 20 20 20 20 20 75 73 6c 65 65  c;.        uslee
2f520 70 28 35 30 30 30 30 30 29 3b 20 2f 2a 20 77 61  p(500000); /* wa
2f530 69 74 20 30 2e 35 20 73 65 63 20 61 6e 64 20 74  it 0.5 sec and t
2f540 72 79 20 74 68 65 20 6c 6f 63 6b 20 61 67 61 69  ry the lock agai
2f550 6e 2a 2f 0a 20 20 20 20 20 20 20 20 63 6f 6e 74  n*/.        cont
2f560 69 6e 75 65 3b 20 20 0a 20 20 20 20 20 20 7d 0a  inue;  .      }.
2f570 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e  .      assert( n
2f580 54 72 69 65 73 3e 31 20 29 3b 0a 20 20 20 20 20  Tries>1 );.     
2f590 20 69 66 28 20 63 6f 6e 63 68 4d 6f 64 54 69 6d   if( conchModTim
2f5a0 65 2e 74 76 5f 73 65 63 20 21 3d 20 62 75 66 2e  e.tv_sec != buf.
2f5b0 73 74 5f 6d 74 69 6d 65 73 70 65 63 2e 74 76 5f  st_mtimespec.tv_
2f5c0 73 65 63 20 7c 7c 20 0a 20 20 20 20 20 20 20 20  sec || .        
2f5d0 20 63 6f 6e 63 68 4d 6f 64 54 69 6d 65 2e 74 76   conchModTime.tv
2f5e0 5f 6e 73 65 63 20 21 3d 20 62 75 66 2e 73 74 5f  _nsec != buf.st_
2f5f0 6d 74 69 6d 65 73 70 65 63 2e 74 76 5f 6e 73 65  mtimespec.tv_nse
2f600 63 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74  c ){.        ret
2f610 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 3b  urn SQLITE_BUSY;
2f620 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 0a  .      }.      .
2f630 20 20 20 20 20 20 69 66 28 20 6e 54 72 69 65 73        if( nTries
2f640 3d 3d 32 20 29 7b 20 20 0a 20 20 20 20 20 20 20  ==2 ){  .       
2f650 20 63 68 61 72 20 74 42 75 66 5b 50 52 4f 58 59   char tBuf[PROXY
2f660 5f 4d 41 58 43 4f 4e 43 48 4c 45 4e 5d 3b 0a 20  _MAXCONCHLEN];. 
2f670 20 20 20 20 20 20 20 69 6e 74 20 6c 65 6e 20 3d         int len =
2f680 20 70 72 65 61 64 28 63 6f 6e 63 68 46 69 6c 65   pread(conchFile
2f690 2d 3e 68 2c 20 74 42 75 66 2c 20 50 52 4f 58 59  ->h, tBuf, PROXY
2f6a0 5f 4d 41 58 43 4f 4e 43 48 4c 45 4e 2c 20 30 29  _MAXCONCHLEN, 0)
2f6b0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 6c 65  ;.        if( le
2f6c0 6e 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  n<0 ){.         
2f6d0 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e   pFile->lastErrn
2f6e0 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20  o = errno;.     
2f6f0 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
2f700 54 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b 3b 0a 20  TE_IOERR_LOCK;. 
2f710 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2f720 20 69 66 28 20 6c 65 6e 3e 50 52 4f 58 59 5f 50   if( len>PROXY_P
2f730 41 54 48 49 4e 44 45 58 20 26 26 20 74 42 75 66  ATHINDEX && tBuf
2f740 5b 30 5d 3d 3d 28 63 68 61 72 29 50 52 4f 58 59  [0]==(char)PROXY
2f750 5f 43 4f 4e 43 48 56 45 52 53 49 4f 4e 29 7b 0a  _CONCHVERSION){.
2f760 20 20 20 20 20 20 20 20 20 20 2f 2a 20 64 6f 6e            /* don
2f770 27 74 20 62 72 65 61 6b 20 74 68 65 20 6c 6f 63  't break the loc
2f780 6b 20 69 66 20 74 68 65 20 68 6f 73 74 20 69 64  k if the host id
2f790 20 64 6f 65 73 6e 27 74 20 6d 61 74 63 68 20 2a   doesn't match *
2f7a0 2f 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  /.          if( 
2f7b0 30 21 3d 6d 65 6d 63 6d 70 28 26 74 42 75 66 5b  0!=memcmp(&tBuf[
2f7c0 50 52 4f 58 59 5f 48 45 41 44 45 52 4c 45 4e 5d  PROXY_HEADERLEN]
2f7d0 2c 20 6d 79 48 6f 73 74 49 44 2c 20 50 52 4f 58  , myHostID, PROX
2f7e0 59 5f 48 4f 53 54 49 44 4c 45 4e 29 20 29 7b 0a  Y_HOSTIDLEN) ){.
2f7f0 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75              retu
2f800 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a  rn SQLITE_BUSY;.
2f810 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
2f820 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
2f830 20 20 20 20 20 2f 2a 20 64 6f 6e 27 74 20 62 72       /* don't br
2f840 65 61 6b 20 74 68 65 20 6c 6f 63 6b 20 6f 6e 20  eak the lock on 
2f850 73 68 6f 72 74 20 72 65 61 64 20 6f 72 20 61 20  short read or a 
2f860 76 65 72 73 69 6f 6e 20 6d 69 73 6d 61 74 63 68  version mismatch
2f870 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 72 65   */.          re
2f880 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59  turn SQLITE_BUSY
2f890 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
2f8a0 20 20 20 20 75 73 6c 65 65 70 28 31 30 30 30 30      usleep(10000
2f8b0 30 30 30 29 3b 20 2f 2a 20 77 61 69 74 20 31 30  000); /* wait 10
2f8c0 20 73 65 63 20 61 6e 64 20 74 72 79 20 74 68 65   sec and try the
2f8d0 20 6c 6f 63 6b 20 61 67 61 69 6e 20 2a 2f 0a 20   lock again */. 
2f8e0 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b         continue;
2f8f0 20 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20   .      }.      
2f900 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e  .      assert( n
2f910 54 72 69 65 73 3d 3d 33 20 29 3b 0a 20 20 20 20  Tries==3 );.    
2f920 20 20 69 66 28 20 30 3d 3d 70 72 6f 78 79 42 72    if( 0==proxyBr
2f930 65 61 6b 43 6f 6e 63 68 4c 6f 63 6b 28 70 46 69  eakConchLock(pFi
2f940 6c 65 2c 20 6d 79 48 6f 73 74 49 44 29 20 29 7b  le, myHostID) ){
2f950 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51  .        rc = SQ
2f960 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20  LITE_OK;.       
2f970 20 69 66 28 20 6c 6f 63 6b 54 79 70 65 3d 3d 45   if( lockType==E
2f980 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 29 7b  XCLUSIVE_LOCK ){
2f990 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
2f9a0 63 6f 6e 63 68 46 69 6c 65 2d 3e 70 4d 65 74 68  conchFile->pMeth
2f9b0 6f 64 2d 3e 78 4c 6f 63 6b 28 28 73 71 6c 69 74  od->xLock((sqlit
2f9c0 65 33 5f 66 69 6c 65 2a 29 63 6f 6e 63 68 46 69  e3_file*)conchFi
2f9d0 6c 65 2c 20 53 48 41 52 45 44 5f 4c 4f 43 4b 29  le, SHARED_LOCK)
2f9e0 3b 20 20 20 20 20 20 20 20 20 20 0a 20 20 20 20  ;          .    
2f9f0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66      }.        if
2fa00 28 20 21 72 63 20 29 7b 0a 20 20 20 20 20 20 20  ( !rc ){.       
2fa10 20 20 20 72 63 20 3d 20 63 6f 6e 63 68 46 69 6c     rc = conchFil
2fa20 65 2d 3e 70 4d 65 74 68 6f 64 2d 3e 78 4c 6f 63  e->pMethod->xLoc
2fa30 6b 28 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a  k((sqlite3_file*
2fa40 29 63 6f 6e 63 68 46 69 6c 65 2c 20 6c 6f 63 6b  )conchFile, lock
2fa50 54 79 70 65 29 3b 0a 20 20 20 20 20 20 20 20 7d  Type);.        }
2fa60 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
2fa70 20 7d 20 77 68 69 6c 65 28 20 72 63 3d 3d 53 51   } while( rc==SQ
2fa80 4c 49 54 45 5f 42 55 53 59 20 26 26 20 6e 54 72  LITE_BUSY && nTr
2fa90 69 65 73 3c 33 20 29 3b 0a 20 20 0a 20 20 72 65  ies<3 );.  .  re
2faa0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 54  turn rc;.}../* T
2fab0 61 6b 65 73 20 74 68 65 20 63 6f 6e 63 68 20 62  akes the conch b
2fac0 79 20 74 61 6b 69 6e 67 20 61 20 73 68 61 72 65  y taking a share
2fad0 64 20 6c 6f 63 6b 20 61 6e 64 20 72 65 61 64 20  d lock and read 
2fae0 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 63 6f 6e  the contents con
2faf0 63 68 2c 20 69 66 20 0a 2a 2a 20 6c 6f 63 6b 50  ch, if .** lockP
2fb00 61 74 68 20 69 73 20 6e 6f 6e 2d 4e 55 4c 4c 2c  ath is non-NULL,
2fb10 20 74 68 65 20 68 6f 73 74 20 49 44 20 61 6e 64   the host ID and
2fb20 20 6c 6f 63 6b 20 66 69 6c 65 20 70 61 74 68 20   lock file path 
2fb30 6d 75 73 74 20 6d 61 74 63 68 2e 20 20 41 20 4e  must match.  A N
2fb40 55 4c 4c 20 0a 2a 2a 20 6c 6f 63 6b 50 61 74 68  ULL .** lockPath
2fb50 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65 20   means that the 
2fb60 6c 6f 63 6b 50 61 74 68 20 69 6e 20 74 68 65 20  lockPath in the 
2fb70 63 6f 6e 63 68 20 66 69 6c 65 20 77 69 6c 6c 20  conch file will 
2fb80 62 65 20 75 73 65 64 20 69 66 20 74 68 65 20 0a  be used if the .
2fb90 2a 2a 20 68 6f 73 74 20 49 44 73 20 6d 61 74 63  ** host IDs matc
2fba0 68 2c 20 6f 72 20 61 20 6e 65 77 20 6c 6f 63 6b  h, or a new lock
2fbb0 20 70 61 74 68 20 77 69 6c 6c 20 62 65 20 67 65   path will be ge
2fbc0 6e 65 72 61 74 65 64 20 61 75 74 6f 6d 61 74 69  nerated automati
2fbd0 63 61 6c 6c 79 20 0a 2a 2a 20 61 6e 64 20 77 72  cally .** and wr
2fbe0 69 74 74 65 6e 20 74 6f 20 74 68 65 20 63 6f 6e  itten to the con
2fbf0 63 68 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74  ch file..*/.stat
2fc00 69 63 20 69 6e 74 20 70 72 6f 78 79 54 61 6b 65  ic int proxyTake
2fc10 43 6f 6e 63 68 28 75 6e 69 78 46 69 6c 65 20 2a  Conch(unixFile *
2fc20 70 46 69 6c 65 29 7b 0a 20 20 70 72 6f 78 79 4c  pFile){.  proxyL
2fc30 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 70  ockingContext *p
2fc40 43 74 78 20 3d 20 28 70 72 6f 78 79 4c 6f 63 6b  Ctx = (proxyLock
2fc50 69 6e 67 43 6f 6e 74 65 78 74 20 2a 29 70 46 69  ingContext *)pFi
2fc60 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65  le->lockingConte
2fc70 78 74 3b 20 0a 20 20 0a 20 20 69 66 28 20 70 43  xt; .  .  if( pC
2fc80 74 78 2d 3e 63 6f 6e 63 68 48 65 6c 64 21 3d 30  tx->conchHeld!=0
2fc90 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
2fca0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73  QLITE_OK;.  }els
2fcb0 65 7b 0a 20 20 20 20 75 6e 69 78 46 69 6c 65 20  e{.    unixFile 
2fcc0 2a 63 6f 6e 63 68 46 69 6c 65 20 3d 20 70 43 74  *conchFile = pCt
2fcd0 78 2d 3e 63 6f 6e 63 68 46 69 6c 65 3b 0a 20 20  x->conchFile;.  
2fce0 20 20 75 75 69 64 5f 74 20 6d 79 48 6f 73 74 49    uuid_t myHostI
2fcf0 44 3b 0a 20 20 20 20 69 6e 74 20 70 45 72 72 6f  D;.    int pErro
2fd00 72 20 3d 20 30 3b 0a 20 20 20 20 63 68 61 72 20  r = 0;.    char 
2fd10 72 65 61 64 42 75 66 5b 50 52 4f 58 59 5f 4d 41  readBuf[PROXY_MA
2fd20 58 43 4f 4e 43 48 4c 45 4e 5d 3b 0a 20 20 20 20  XCONCHLEN];.    
2fd30 63 68 61 72 20 6c 6f 63 6b 50 61 74 68 5b 4d 41  char lockPath[MA
2fd40 58 50 41 54 48 4c 45 4e 5d 3b 0a 20 20 20 20 63  XPATHLEN];.    c
2fd50 68 61 72 20 2a 74 65 6d 70 4c 6f 63 6b 50 61 74  har *tempLockPat
2fd60 68 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 69 6e  h = NULL;.    in
2fd70 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
2fd80 3b 0a 20 20 20 20 69 6e 74 20 63 72 65 61 74 65  ;.    int create
2fd90 43 6f 6e 63 68 20 3d 20 30 3b 0a 20 20 20 20 69  Conch = 0;.    i
2fda0 6e 74 20 68 6f 73 74 49 64 4d 61 74 63 68 20 3d  nt hostIdMatch =
2fdb0 20 30 3b 0a 20 20 20 20 69 6e 74 20 72 65 61 64   0;.    int read
2fdc0 4c 65 6e 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74  Len = 0;.    int
2fdd0 20 74 72 79 4f 6c 64 4c 6f 63 6b 50 61 74 68 20   tryOldLockPath 
2fde0 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 66 6f 72  = 0;.    int for
2fdf0 63 65 4e 65 77 4c 6f 63 6b 50 61 74 68 20 3d 20  ceNewLockPath = 
2fe00 30 3b 0a 20 20 20 20 0a 20 20 20 20 4f 53 54 52  0;.    .    OSTR
2fe10 41 43 45 34 28 22 54 41 4b 45 43 4f 4e 43 48 20  ACE4("TAKECONCH 
2fe20 20 25 64 20 66 6f 72 20 25 73 20 70 69 64 3d 25   %d for %s pid=%
2fe30 64 5c 6e 22 2c 20 63 6f 6e 63 68 46 69 6c 65 2d  d\n", conchFile-
2fe40 3e 68 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  >h,.            
2fe50 20 28 70 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78   (pCtx->lockProx
2fe60 79 50 61 74 68 20 3f 20 70 43 74 78 2d 3e 6c 6f  yPath ? pCtx->lo
2fe70 63 6b 50 72 6f 78 79 50 61 74 68 20 3a 20 22 3a  ckProxyPath : ":
2fe80 61 75 74 6f 3a 22 29 2c 20 67 65 74 70 69 64 28  auto:"), getpid(
2fe90 29 29 3b 0a 0a 20 20 20 20 72 63 20 3d 20 70 72  ));..    rc = pr
2fea0 6f 78 79 47 65 74 48 6f 73 74 49 44 28 6d 79 48  oxyGetHostID(myH
2feb0 6f 73 74 49 44 2c 20 26 70 45 72 72 6f 72 29 3b  ostID, &pError);
2fec0 0a 20 20 20 20 69 66 28 20 28 72 63 26 30 78 66  .    if( (rc&0xf
2fed0 66 29 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52  f)==SQLITE_IOERR
2fee0 20 29 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d   ){.      pFile-
2fef0 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 70 45 72  >lastErrno = pEr
2ff00 72 6f 72 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20  ror;.      goto 
2ff10 65 6e 64 5f 74 61 6b 65 63 6f 6e 63 68 3b 0a 20  end_takeconch;. 
2ff20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 70 72     }.    rc = pr
2ff30 6f 78 79 43 6f 6e 63 68 4c 6f 63 6b 28 70 46 69  oxyConchLock(pFi
2ff40 6c 65 2c 20 6d 79 48 6f 73 74 49 44 2c 20 53 48  le, myHostID, SH
2ff50 41 52 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20  ARED_LOCK);.    
2ff60 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
2ff70 4b 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20  K ){.      goto 
2ff80 65 6e 64 5f 74 61 6b 65 63 6f 6e 63 68 3b 0a 20  end_takeconch;. 
2ff90 20 20 20 7d 0a 20 20 20 20 2f 2a 20 72 65 61 64     }.    /* read
2ffa0 20 74 68 65 20 65 78 69 73 74 69 6e 67 20 63 6f   the existing co
2ffb0 6e 63 68 20 66 69 6c 65 20 2a 2f 0a 20 20 20 20  nch file */.    
2ffc0 72 65 61 64 4c 65 6e 20 3d 20 73 65 65 6b 41 6e  readLen = seekAn
2ffd0 64 52 65 61 64 28 28 75 6e 69 78 46 69 6c 65 2a  dRead((unixFile*
2ffe0 29 63 6f 6e 63 68 46 69 6c 65 2c 20 30 2c 20 72  )conchFile, 0, r
2fff0 65 61 64 42 75 66 2c 20 50 52 4f 58 59 5f 4d 41  eadBuf, PROXY_MA
30000 58 43 4f 4e 43 48 4c 45 4e 29 3b 0a 20 20 20 20  XCONCHLEN);.    
30010 69 66 28 20 72 65 61 64 4c 65 6e 3c 30 20 29 7b  if( readLen<0 ){
30020 0a 20 20 20 20 20 20 2f 2a 20 49 2f 4f 20 65 72  .      /* I/O er
30030 72 6f 72 3a 20 6c 61 73 74 45 72 72 6e 6f 20 73  ror: lastErrno s
30040 65 74 20 62 79 20 73 65 65 6b 41 6e 64 52 65 61  et by seekAndRea
30050 64 20 2a 2f 0a 20 20 20 20 20 20 70 46 69 6c 65  d */.      pFile
30060 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 63 6f  ->lastErrno = co
30070 6e 63 68 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72  nchFile->lastErr
30080 6e 6f 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 53  no;.      rc = S
30090 51 4c 49 54 45 5f 49 4f 45 52 52 5f 52 45 41 44  QLITE_IOERR_READ
300a0 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64  ;.      goto end
300b0 5f 74 61 6b 65 63 6f 6e 63 68 3b 0a 20 20 20 20  _takeconch;.    
300c0 7d 65 6c 73 65 20 69 66 28 20 72 65 61 64 4c 65  }else if( readLe
300d0 6e 3c 3d 28 50 52 4f 58 59 5f 48 45 41 44 45 52  n<=(PROXY_HEADER
300e0 4c 45 4e 2b 50 52 4f 58 59 5f 48 4f 53 54 49 44  LEN+PROXY_HOSTID
300f0 4c 45 4e 29 20 7c 7c 20 0a 20 20 20 20 20 20 20  LEN) || .       
30100 20 20 20 20 20 20 72 65 61 64 42 75 66 5b 30 5d        readBuf[0]
30110 21 3d 28 63 68 61 72 29 50 52 4f 58 59 5f 43 4f  !=(char)PROXY_CO
30120 4e 43 48 56 45 52 53 49 4f 4e 20 29 7b 0a 20 20  NCHVERSION ){.  
30130 20 20 20 20 2f 2a 20 61 20 73 68 6f 72 74 20 72      /* a short r
30140 65 61 64 20 6f 72 20 76 65 72 73 69 6f 6e 20 66  ead or version f
30150 6f 72 6d 61 74 20 6d 69 73 6d 61 74 63 68 20 6d  ormat mismatch m
30160 65 61 6e 73 20 77 65 20 6e 65 65 64 20 74 6f 20  eans we need to 
30170 63 72 65 61 74 65 20 61 20 6e 65 77 20 0a 20 20  create a new .  
30180 20 20 20 20 2a 2a 20 63 6f 6e 63 68 20 66 69 6c      ** conch fil
30190 65 2e 20 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  e. .      */.   
301a0 20 20 20 63 72 65 61 74 65 43 6f 6e 63 68 20 3d     createConch =
301b0 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2f 2a   1;.    }.    /*
301c0 20 69 66 20 74 68 65 20 68 6f 73 74 20 69 64 20   if the host id 
301d0 6d 61 74 63 68 65 73 20 61 6e 64 20 74 68 65 20  matches and the 
301e0 6c 6f 63 6b 20 70 61 74 68 20 61 6c 72 65 61 64  lock path alread
301f0 79 20 65 78 69 73 74 73 20 69 6e 20 74 68 65 20  y exists in the 
30200 63 6f 6e 63 68 0a 20 20 20 20 2a 2a 20 77 65 27  conch.    ** we'
30210 6c 6c 20 74 72 79 20 74 6f 20 75 73 65 20 74 68  ll try to use th
30220 65 20 70 61 74 68 20 74 68 65 72 65 2c 20 69 66  e path there, if
30230 20 77 65 20 63 61 6e 27 74 20 6f 70 65 6e 20 74   we can't open t
30240 68 61 74 20 70 61 74 68 2c 20 77 65 27 6c 6c 20  hat path, we'll 
30250 0a 20 20 20 20 2a 2a 20 72 65 74 72 79 20 77 69  .    ** retry wi
30260 74 68 20 61 20 6e 65 77 20 61 75 74 6f 2d 67 65  th a new auto-ge
30270 6e 65 72 61 74 65 64 20 70 61 74 68 20 0a 20 20  nerated path .  
30280 20 20 2a 2f 0a 20 20 20 20 64 6f 20 7b 20 2f 2a    */.    do { /*
30290 20 69 6e 20 63 61 73 65 20 77 65 20 6e 65 65 64   in case we need
302a0 20 74 6f 20 74 72 79 20 61 67 61 69 6e 20 66 6f   to try again fo
302b0 72 20 61 6e 20 3a 61 75 74 6f 3a 20 6e 61 6d 65  r an :auto: name
302c0 64 20 6c 6f 63 6b 20 66 69 6c 65 20 2a 2f 0a 0a  d lock file */..
302d0 20 20 20 20 20 20 69 66 28 20 21 63 72 65 61 74        if( !creat
302e0 65 43 6f 6e 63 68 20 26 26 20 21 66 6f 72 63 65  eConch && !force
302f0 4e 65 77 4c 6f 63 6b 50 61 74 68 20 29 7b 0a 20  NewLockPath ){. 
30300 20 20 20 20 20 20 20 68 6f 73 74 49 64 4d 61 74         hostIdMat
30310 63 68 20 3d 20 21 6d 65 6d 63 6d 70 28 26 72 65  ch = !memcmp(&re
30320 61 64 42 75 66 5b 50 52 4f 58 59 5f 48 45 41 44  adBuf[PROXY_HEAD
30330 45 52 4c 45 4e 5d 2c 20 6d 79 48 6f 73 74 49 44  ERLEN], myHostID
30340 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  , .             
30350 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30360 20 20 20 20 20 50 52 4f 58 59 5f 48 4f 53 54 49       PROXY_HOSTI
30370 44 4c 45 4e 29 3b 0a 20 20 20 20 20 20 20 20 2f  DLEN);.        /
30380 2a 20 69 66 20 74 68 65 20 63 6f 6e 63 68 20 68  * if the conch h
30390 61 73 20 64 61 74 61 20 63 6f 6d 70 61 72 65 20  as data compare 
303a0 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 2a 2f 0a  the contents */.
303b0 20 20 20 20 20 20 20 20 69 66 28 20 21 70 43 74          if( !pCt
303c0 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 50 61 74 68  x->lockProxyPath
303d0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a   ){.          /*
303e0 20 66 6f 72 20 61 75 74 6f 2d 6e 61 6d 65 64 20   for auto-named 
303f0 6c 6f 63 61 6c 20 6c 6f 63 6b 20 66 69 6c 65 2c  local lock file,
30400 20 6a 75 73 74 20 63 68 65 63 6b 20 74 68 65 20   just check the 
30410 68 6f 73 74 20 49 44 20 61 6e 64 20 77 65 27 6c  host ID and we'l
30420 6c 0a 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20  l.           ** 
30430 75 73 65 20 74 68 65 20 6c 6f 63 61 6c 20 6c 6f  use the local lo
30440 63 6b 20 66 69 6c 65 20 70 61 74 68 20 74 68 61  ck file path tha
30450 74 27 73 20 61 6c 72 65 61 64 79 20 69 6e 20 74  t's already in t
30460 68 65 72 65 0a 20 20 20 20 20 20 20 20 20 20 20  here.           
30470 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  */.          if(
30480 20 68 6f 73 74 49 64 4d 61 74 63 68 20 29 7b 0a   hostIdMatch ){.
30490 20 20 20 20 20 20 20 20 20 20 20 20 73 69 7a 65              size
304a0 5f 74 20 70 61 74 68 4c 65 6e 20 3d 20 28 72 65  _t pathLen = (re
304b0 61 64 4c 65 6e 20 2d 20 50 52 4f 58 59 5f 50 41  adLen - PROXY_PA
304c0 54 48 49 4e 44 45 58 29 3b 0a 20 20 20 20 20 20  THINDEX);.      
304d0 20 20 20 20 20 20 0a 20 20 20 20 20 20 20 20 20        .         
304e0 20 20 20 69 66 28 20 70 61 74 68 4c 65 6e 3e 3d     if( pathLen>=
304f0 4d 41 58 50 41 54 48 4c 45 4e 20 29 7b 0a 20 20  MAXPATHLEN ){.  
30500 20 20 20 20 20 20 20 20 20 20 20 20 70 61 74 68              path
30510 4c 65 6e 3d 4d 41 58 50 41 54 48 4c 45 4e 2d 31  Len=MAXPATHLEN-1
30520 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  ;.            }.
30530 20 20 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63              memc
30540 70 79 28 6c 6f 63 6b 50 61 74 68 2c 20 26 72 65  py(lockPath, &re
30550 61 64 42 75 66 5b 50 52 4f 58 59 5f 50 41 54 48  adBuf[PROXY_PATH
30560 49 4e 44 45 58 5d 2c 20 70 61 74 68 4c 65 6e 29  INDEX], pathLen)
30570 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6c 6f  ;.            lo
30580 63 6b 50 61 74 68 5b 70 61 74 68 4c 65 6e 5d 20  ckPath[pathLen] 
30590 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 20  = 0;.           
305a0 20 74 65 6d 70 4c 6f 63 6b 50 61 74 68 20 3d 20   tempLockPath = 
305b0 6c 6f 63 6b 50 61 74 68 3b 0a 20 20 20 20 20 20  lockPath;.      
305c0 20 20 20 20 20 20 74 72 79 4f 6c 64 4c 6f 63 6b        tryOldLock
305d0 50 61 74 68 20 3d 20 31 3b 0a 20 20 20 20 20 20  Path = 1;.      
305e0 20 20 20 20 20 20 2f 2a 20 63 72 65 61 74 65 20        /* create 
305f0 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20 6c 6f  a copy of the lo
30600 63 6b 20 70 61 74 68 20 69 66 20 74 68 65 20 63  ck path if the c
30610 6f 6e 63 68 20 69 73 20 74 61 6b 65 6e 20 2a 2f  onch is taken */
30620 0a 20 20 20 20 20 20 20 20 20 20 20 20 67 6f 74  .            got
30630 6f 20 65 6e 64 5f 74 61 6b 65 63 6f 6e 63 68 3b  o end_takeconch;
30640 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
30650 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 68       }else if( h
30660 6f 73 74 49 64 4d 61 74 63 68 0a 20 20 20 20 20  ostIdMatch.     
30670 20 20 20 20 20 20 20 20 20 20 26 26 20 21 73 74            && !st
30680 72 6e 63 6d 70 28 70 43 74 78 2d 3e 6c 6f 63 6b  rncmp(pCtx->lock
30690 50 72 6f 78 79 50 61 74 68 2c 20 26 72 65 61 64  ProxyPath, &read
306a0 42 75 66 5b 50 52 4f 58 59 5f 50 41 54 48 49 4e  Buf[PROXY_PATHIN
306b0 44 45 58 5d 2c 0a 20 20 20 20 20 20 20 20 20 20  DEX],.          
306c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
306d0 20 72 65 61 64 4c 65 6e 2d 50 52 4f 58 59 5f 50   readLen-PROXY_P
306e0 41 54 48 49 4e 44 45 58 29 0a 20 20 20 20 20 20  ATHINDEX).      
306f0 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f    ){.          /
30700 2a 20 63 6f 6e 63 68 20 68 6f 73 74 20 61 6e 64  * conch host and
30710 20 6c 6f 63 6b 20 70 61 74 68 20 6d 61 74 63 68   lock path match
30720 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 67 6f   */.          go
30730 74 6f 20 65 6e 64 5f 74 61 6b 65 63 6f 6e 63 68  to end_takeconch
30740 3b 20 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  ; .        }.   
30750 20 20 20 7d 0a 20 20 20 20 20 20 0a 20 20 20 20     }.      .    
30760 20 20 2f 2a 20 69 66 20 74 68 65 20 63 6f 6e 63    /* if the conc
30770 68 20 69 73 6e 27 74 20 77 72 69 74 61 62 6c 65  h isn't writable
30780 20 61 6e 64 20 64 6f 65 73 6e 27 74 20 6d 61 74   and doesn't mat
30790 63 68 2c 20 77 65 20 63 61 6e 27 74 20 74 61 6b  ch, we can't tak
307a0 65 20 69 74 20 2a 2f 0a 20 20 20 20 20 20 69 66  e it */.      if
307b0 28 20 28 63 6f 6e 63 68 46 69 6c 65 2d 3e 6f 70  ( (conchFile->op
307c0 65 6e 46 6c 61 67 73 26 4f 5f 52 44 57 52 29 20  enFlags&O_RDWR) 
307d0 3d 3d 20 30 20 29 7b 0a 20 20 20 20 20 20 20 20  == 0 ){.        
307e0 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59  rc = SQLITE_BUSY
307f0 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65  ;.        goto e
30800 6e 64 5f 74 61 6b 65 63 6f 6e 63 68 3b 0a 20 20  nd_takeconch;.  
30810 20 20 20 20 7d 0a 20 20 20 20 20 20 0a 20 20 20      }.      .   
30820 20 20 20 2f 2a 20 65 69 74 68 65 72 20 74 68 65     /* either the
30830 20 63 6f 6e 63 68 20 64 69 64 6e 27 74 20 6d 61   conch didn't ma
30840 74 63 68 20 6f 72 20 77 65 20 6e 65 65 64 20 74  tch or we need t
30850 6f 20 63 72 65 61 74 65 20 61 20 6e 65 77 20 6f  o create a new o
30860 6e 65 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20  ne */.      if( 
30870 21 70 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79  !pCtx->lockProxy
30880 50 61 74 68 20 29 7b 0a 20 20 20 20 20 20 20 20  Path ){.        
30890 70 72 6f 78 79 47 65 74 4c 6f 63 6b 50 61 74 68  proxyGetLockPath
308a0 28 70 43 74 78 2d 3e 64 62 50 61 74 68 2c 20 6c  (pCtx->dbPath, l
308b0 6f 63 6b 50 61 74 68 2c 20 4d 41 58 50 41 54 48  ockPath, MAXPATH
308c0 4c 45 4e 29 3b 0a 20 20 20 20 20 20 20 20 74 65  LEN);.        te
308d0 6d 70 4c 6f 63 6b 50 61 74 68 20 3d 20 6c 6f 63  mpLockPath = loc
308e0 6b 50 61 74 68 3b 0a 20 20 20 20 20 20 20 20 2f  kPath;.        /
308f0 2a 20 63 72 65 61 74 65 20 61 20 63 6f 70 79 20  * create a copy 
30900 6f 66 20 74 68 65 20 6c 6f 63 6b 20 70 61 74 68  of the lock path
30910 20 5f 6f 6e 6c 79 5f 20 69 66 20 74 68 65 20 63   _only_ if the c
30920 6f 6e 63 68 20 69 73 20 74 61 6b 65 6e 20 2a 2f  onch is taken */
30930 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 0a  .      }.      .
30940 20 20 20 20 20 20 2f 2a 20 75 70 64 61 74 65 20        /* update 
30950 63 6f 6e 63 68 20 77 69 74 68 20 68 6f 73 74 20  conch with host 
30960 61 6e 64 20 70 61 74 68 20 28 74 68 69 73 20 77  and path (this w
30970 69 6c 6c 20 66 61 69 6c 20 69 66 20 6f 74 68 65  ill fail if othe
30980 72 20 70 72 6f 63 65 73 73 0a 20 20 20 20 20 20  r process.      
30990 2a 2a 20 68 61 73 20 61 20 73 68 61 72 65 64 20  ** has a shared 
309a0 6c 6f 63 6b 20 61 6c 72 65 61 64 79 29 2c 20 69  lock already), i
309b0 66 20 74 68 65 20 68 6f 73 74 20 69 64 20 6d 61  f the host id ma
309c0 74 63 68 65 73 2c 20 75 73 65 20 74 68 65 20 62  tches, use the b
309d0 69 67 0a 20 20 20 20 20 20 2a 2a 20 73 74 69 63  ig.      ** stic
309e0 6b 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  k..      */.    
309f0 20 20 66 75 74 69 6d 65 73 28 63 6f 6e 63 68 46    futimes(conchF
30a00 69 6c 65 2d 3e 68 2c 20 4e 55 4c 4c 29 3b 0a 20  ile->h, NULL);. 
30a10 20 20 20 20 20 69 66 28 20 68 6f 73 74 49 64 4d       if( hostIdM
30a20 61 74 63 68 20 26 26 20 21 63 72 65 61 74 65 43  atch && !createC
30a30 6f 6e 63 68 20 29 7b 0a 20 20 20 20 20 20 20 20  onch ){.        
30a40 69 66 28 20 63 6f 6e 63 68 46 69 6c 65 2d 3e 70  if( conchFile->p
30a50 4c 6f 63 6b 20 26 26 20 63 6f 6e 63 68 46 69 6c  Lock && conchFil
30a60 65 2d 3e 70 4c 6f 63 6b 2d 3e 63 6e 74 3e 31 20  e->pLock->cnt>1 
30a70 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ){.          /* 
30a80 57 65 20 61 72 65 20 74 72 79 69 6e 67 20 66 6f  We are trying fo
30a90 72 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c  r an exclusive l
30aa0 6f 63 6b 20 62 75 74 20 61 6e 6f 74 68 65 72 20  ock but another 
30ab0 74 68 72 65 61 64 20 69 6e 20 74 68 69 73 0a 20  thread in this. 
30ac0 20 20 20 20 20 20 20 20 20 20 2a 2a 20 73 61 6d            ** sam
30ad0 65 20 70 72 6f 63 65 73 73 20 69 73 20 73 74 69  e process is sti
30ae0 6c 6c 20 68 6f 6c 64 69 6e 67 20 61 20 73 68 61  ll holding a sha
30af0 72 65 64 20 6c 6f 63 6b 2e 20 2a 2f 0a 20 20 20  red lock. */.   
30b00 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
30b10 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 20 20 20  TE_BUSY;.       
30b20 20 7d 20 65 6c 73 65 20 7b 20 20 20 20 20 20 20   } else {       
30b30 20 20 20 0a 20 20 20 20 20 20 20 20 20 20 72 63     .          rc
30b40 20 3d 20 70 72 6f 78 79 43 6f 6e 63 68 4c 6f 63   = proxyConchLoc
30b50 6b 28 70 46 69 6c 65 2c 20 6d 79 48 6f 73 74 49  k(pFile, myHostI
30b60 44 2c 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43  D, EXCLUSIVE_LOC
30b70 4b 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  K);.        }.  
30b80 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
30b90 20 20 20 72 63 20 3d 20 63 6f 6e 63 68 46 69 6c     rc = conchFil
30ba0 65 2d 3e 70 4d 65 74 68 6f 64 2d 3e 78 4c 6f 63  e->pMethod->xLoc
30bb0 6b 28 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a  k((sqlite3_file*
30bc0 29 63 6f 6e 63 68 46 69 6c 65 2c 20 45 58 43 4c  )conchFile, EXCL
30bd0 55 53 49 56 45 5f 4c 4f 43 4b 29 3b 0a 20 20 20  USIVE_LOCK);.   
30be0 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72     }.      if( r
30bf0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
30c00 20 20 20 20 20 20 20 20 63 68 61 72 20 77 72 69          char wri
30c10 74 65 42 75 66 66 65 72 5b 50 52 4f 58 59 5f 4d  teBuffer[PROXY_M
30c20 41 58 43 4f 4e 43 48 4c 45 4e 5d 3b 0a 20 20 20  AXCONCHLEN];.   
30c30 20 20 20 20 20 69 6e 74 20 77 72 69 74 65 53 69       int writeSi
30c40 7a 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  ze = 0;.        
30c50 0a 20 20 20 20 20 20 20 20 77 72 69 74 65 42 75  .        writeBu
30c60 66 66 65 72 5b 30 5d 20 3d 20 28 63 68 61 72 29  ffer[0] = (char)
30c70 50 52 4f 58 59 5f 43 4f 4e 43 48 56 45 52 53 49  PROXY_CONCHVERSI
30c80 4f 4e 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63  ON;.        memc
30c90 70 79 28 26 77 72 69 74 65 42 75 66 66 65 72 5b  py(&writeBuffer[
30ca0 50 52 4f 58 59 5f 48 45 41 44 45 52 4c 45 4e 5d  PROXY_HEADERLEN]
30cb0 2c 20 6d 79 48 6f 73 74 49 44 2c 20 50 52 4f 58  , myHostID, PROX
30cc0 59 5f 48 4f 53 54 49 44 4c 45 4e 29 3b 0a 20 20  Y_HOSTIDLEN);.  
30cd0 20 20 20 20 20 20 69 66 28 20 70 43 74 78 2d 3e        if( pCtx->
30ce0 6c 6f 63 6b 50 72 6f 78 79 50 61 74 68 21 3d 4e  lockProxyPath!=N
30cf0 55 4c 4c 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ULL ){.         
30d00 20 73 74 72 6c 63 70 79 28 26 77 72 69 74 65 42   strlcpy(&writeB
30d10 75 66 66 65 72 5b 50 52 4f 58 59 5f 50 41 54 48  uffer[PROXY_PATH
30d20 49 4e 44 45 58 5d 2c 20 70 43 74 78 2d 3e 6c 6f  INDEX], pCtx->lo
30d30 63 6b 50 72 6f 78 79 50 61 74 68 2c 20 4d 41 58  ckProxyPath, MAX
30d40 50 41 54 48 4c 45 4e 29 3b 0a 20 20 20 20 20 20  PATHLEN);.      
30d50 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
30d60 20 20 20 73 74 72 6c 63 70 79 28 26 77 72 69 74     strlcpy(&writ
30d70 65 42 75 66 66 65 72 5b 50 52 4f 58 59 5f 50 41  eBuffer[PROXY_PA
30d80 54 48 49 4e 44 45 58 5d 2c 20 74 65 6d 70 4c 6f  THINDEX], tempLo
30d90 63 6b 50 61 74 68 2c 20 4d 41 58 50 41 54 48 4c  ckPath, MAXPATHL
30da0 45 4e 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  EN);.        }. 
30db0 20 20 20 20 20 20 20 77 72 69 74 65 53 69 7a 65         writeSize
30dc0 20 3d 20 50 52 4f 58 59 5f 50 41 54 48 49 4e 44   = PROXY_PATHIND
30dd0 45 58 20 2b 20 73 74 72 6c 65 6e 28 26 77 72 69  EX + strlen(&wri
30de0 74 65 42 75 66 66 65 72 5b 50 52 4f 58 59 5f 50  teBuffer[PROXY_P
30df0 41 54 48 49 4e 44 45 58 5d 29 3b 0a 20 20 20 20  ATHINDEX]);.    
30e00 20 20 20 20 66 74 72 75 6e 63 61 74 65 28 63 6f      ftruncate(co
30e10 6e 63 68 46 69 6c 65 2d 3e 68 2c 20 77 72 69 74  nchFile->h, writ
30e20 65 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 20 20  eSize);.        
30e30 72 63 20 3d 20 75 6e 69 78 57 72 69 74 65 28 28  rc = unixWrite((
30e40 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 29 63  sqlite3_file *)c
30e50 6f 6e 63 68 46 69 6c 65 2c 20 77 72 69 74 65 42  onchFile, writeB
30e60 75 66 66 65 72 2c 20 77 72 69 74 65 53 69 7a 65  uffer, writeSize
30e70 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 66 73  , 0);.        fs
30e80 79 6e 63 28 63 6f 6e 63 68 46 69 6c 65 2d 3e 68  ync(conchFile->h
30e90 29 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 66  );.        /* If
30ea0 20 77 65 20 63 72 65 61 74 65 64 20 61 20 6e 65   we created a ne
30eb0 77 20 63 6f 6e 63 68 20 66 69 6c 65 20 28 6e 6f  w conch file (no
30ec0 74 20 6a 75 73 74 20 75 70 64 61 74 65 64 20 74  t just updated t
30ed0 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 61  he contents of a
30ee0 20 0a 20 20 20 20 20 20 20 20 20 2a 2a 20 76 61   .         ** va
30ef0 6c 69 64 20 63 6f 6e 63 68 20 66 69 6c 65 29 2c  lid conch file),
30f00 20 74 72 79 20 74 6f 20 6d 61 74 63 68 20 74 68   try to match th
30f10 65 20 70 65 72 6d 69 73 73 69 6f 6e 73 20 6f 66  e permissions of
30f20 20 74 68 65 20 64 61 74 61 62 61 73 65 20 0a 20   the database . 
30f30 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
30f40 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
30f50 45 5f 4f 4b 20 26 26 20 63 72 65 61 74 65 43 6f  E_OK && createCo
30f60 6e 63 68 20 29 7b 0a 20 20 20 20 20 20 20 20 20  nch ){.         
30f70 20 73 74 72 75 63 74 20 73 74 61 74 20 62 75 66   struct stat buf
30f80 3b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20  ;.          int 
30f90 65 72 72 20 3d 20 66 73 74 61 74 28 70 46 69 6c  err = fstat(pFil
30fa0 65 2d 3e 68 2c 20 26 62 75 66 29 3b 0a 20 20 20  e->h, &buf);.   
30fb0 20 20 20 20 20 20 20 69 66 28 20 65 72 72 3d 3d         if( err==
30fc0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  0 ){.           
30fd0 20 6d 6f 64 65 5f 74 20 63 6d 6f 64 65 20 3d 20   mode_t cmode = 
30fe0 62 75 66 2e 73 74 5f 6d 6f 64 65 26 28 53 5f 49  buf.st_mode&(S_I
30ff0 52 55 53 52 7c 53 5f 49 57 55 53 52 20 7c 20 53  RUSR|S_IWUSR | S
31000 5f 49 52 47 52 50 7c 53 5f 49 57 47 52 50 20 7c  _IRGRP|S_IWGRP |
31010 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
31020 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31030 20 20 20 20 20 20 20 20 20 53 5f 49 52 4f 54 48           S_IROTH
31040 7c 53 5f 49 57 4f 54 48 29 3b 0a 20 20 20 20 20  |S_IWOTH);.     
31050 20 20 20 20 20 20 20 2f 2a 20 74 72 79 20 74 6f         /* try to
31060 20 6d 61 74 63 68 20 74 68 65 20 64 61 74 61 62   match the datab
31070 61 73 65 20 66 69 6c 65 20 52 2f 57 20 70 65 72  ase file R/W per
31080 6d 69 73 73 69 6f 6e 73 2c 20 69 67 6e 6f 72 65  missions, ignore
31090 20 66 61 69 6c 75 72 65 20 2a 2f 0a 23 69 66 6e   failure */.#ifn
310a0 64 65 66 20 53 51 4c 49 54 45 5f 50 52 4f 58 59  def SQLITE_PROXY
310b0 5f 44 45 42 55 47 0a 20 20 20 20 20 20 20 20 20  _DEBUG.         
310c0 20 20 20 66 63 68 6d 6f 64 28 63 6f 6e 63 68 46     fchmod(conchF
310d0 69 6c 65 2d 3e 68 2c 20 63 6d 6f 64 65 29 3b 0a  ile->h, cmode);.
310e0 23 65 6c 73 65 0a 20 20 20 20 20 20 20 20 20 20  #else.          
310f0 20 20 69 66 28 20 66 63 68 6d 6f 64 28 63 6f 6e    if( fchmod(con
31100 63 68 46 69 6c 65 2d 3e 68 2c 20 63 6d 6f 64 65  chFile->h, cmode
31110 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )!=0 ){.        
31120 20 20 20 20 20 20 69 6e 74 20 63 6f 64 65 20 3d        int code =
31130 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20 20 20   errno;.        
31140 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 73 74        fprintf(st
31150 64 65 72 72 2c 20 22 66 63 68 6d 6f 64 20 25 6f  derr, "fchmod %o
31160 20 46 41 49 4c 45 44 20 77 69 74 68 20 25 64 20   FAILED with %d 
31170 25 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  %s\n",.         
31180 20 20 20 20 20 20 20 20 20 20 20 20 20 63 6d 6f               cmo
31190 64 65 2c 20 63 6f 64 65 2c 20 73 74 72 65 72 72  de, code, strerr
311a0 6f 72 28 63 6f 64 65 29 29 3b 0a 20 20 20 20 20  or(code));.     
311b0 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a         } else {.
311c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 66 70                fp
311d0 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 66  rintf(stderr, "f
311e0 63 68 6d 6f 64 20 25 6f 20 53 55 43 43 45 44 45  chmod %o SUCCEDE
311f0 44 5c 6e 22 2c 63 6d 6f 64 65 29 3b 0a 20 20 20  D\n",cmode);.   
31200 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
31210 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
31220 20 20 20 20 20 20 20 20 69 6e 74 20 63 6f 64 65          int code
31230 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20   = errno;.      
31240 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 73 74        fprintf(st
31250 64 65 72 72 2c 20 22 53 54 41 54 20 46 41 49 4c  derr, "STAT FAIL
31260 45 44 5b 25 64 5d 20 77 69 74 68 20 25 64 20 25  ED[%d] with %d %
31270 73 5c 6e 22 2c 20 0a 20 20 20 20 20 20 20 20 20  s\n", .         
31280 20 20 20 20 20 20 20 20 20 20 20 65 72 72 2c 20             err, 
31290 63 6f 64 65 2c 20 73 74 72 65 72 72 6f 72 28 63  code, strerror(c
312a0 6f 64 65 29 29 3b 0a 23 65 6e 64 69 66 0a 20 20  ode));.#endif.  
312b0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
312c0 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
312d0 20 20 63 6f 6e 63 68 46 69 6c 65 2d 3e 70 4d 65    conchFile->pMe
312e0 74 68 6f 64 2d 3e 78 55 6e 6c 6f 63 6b 28 28 73  thod->xUnlock((s
312f0 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29 63 6f 6e  qlite3_file*)con
31300 63 68 46 69 6c 65 2c 20 53 48 41 52 45 44 5f 4c  chFile, SHARED_L
31310 4f 43 4b 29 3b 0a 20 20 20 20 20 20 0a 20 20 20  OCK);.      .   
31320 20 65 6e 64 5f 74 61 6b 65 63 6f 6e 63 68 3a 0a   end_takeconch:.
31330 20 20 20 20 20 20 4f 53 54 52 41 43 45 32 28 22        OSTRACE2("
31340 54 52 41 4e 53 50 52 4f 58 59 3a 20 43 4c 4f 53  TRANSPROXY: CLOS
31350 45 20 20 25 64 5c 6e 22 2c 20 70 46 69 6c 65 2d  E  %d\n", pFile-
31360 3e 68 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  >h);.      if( r
31370 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
31380 70 46 69 6c 65 2d 3e 6f 70 65 6e 46 6c 61 67 73  pFile->openFlags
31390 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20   ){.        if( 
313a0 70 46 69 6c 65 2d 3e 68 3e 3d 30 20 29 7b 0a 23  pFile->h>=0 ){.#
313b0 69 66 64 65 66 20 53 54 52 49 43 54 5f 43 4c 4f  ifdef STRICT_CLO
313c0 53 45 5f 45 52 52 4f 52 0a 20 20 20 20 20 20 20  SE_ERROR.       
313d0 20 20 20 69 66 28 20 63 6c 6f 73 65 28 70 46 69     if( close(pFi
313e0 6c 65 2d 3e 68 29 20 29 7b 0a 20 20 20 20 20 20  le->h) ){.      
313f0 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73        pFile->las
31400 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a  tErrno = errno;.
31410 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75              retu
31420 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  rn SQLITE_IOERR_
31430 43 4c 4f 53 45 3b 0a 20 20 20 20 20 20 20 20 20  CLOSE;.         
31440 20 7d 0a 23 65 6c 73 65 0a 20 20 20 20 20 20 20   }.#else.       
31450 20 20 20 63 6c 6f 73 65 28 70 46 69 6c 65 2d 3e     close(pFile->
31460 68 29 3b 20 2f 2a 20 73 69 6c 65 6e 74 6c 79 20  h); /* silently 
31470 6c 65 61 6b 20 66 64 20 69 66 20 66 61 69 6c 20  leak fd if fail 
31480 2a 2f 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20  */.#endif.      
31490 20 20 7d 0a 20 20 20 20 20 20 20 20 70 46 69 6c    }.        pFil
314a0 65 2d 3e 68 20 3d 20 2d 31 3b 0a 20 20 20 20 20  e->h = -1;.     
314b0 20 20 20 69 6e 74 20 66 64 20 3d 20 6f 70 65 6e     int fd = open
314c0 28 70 43 74 78 2d 3e 64 62 50 61 74 68 2c 20 70  (pCtx->dbPath, p
314d0 46 69 6c 65 2d 3e 6f 70 65 6e 46 6c 61 67 73 2c  File->openFlags,
314e0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
314f0 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 44 45         SQLITE_DE
31500 46 41 55 4c 54 5f 46 49 4c 45 5f 50 45 52 4d 49  FAULT_FILE_PERMI
31510 53 53 49 4f 4e 53 29 3b 0a 20 20 20 20 20 20 20  SSIONS);.       
31520 20 4f 53 54 52 41 43 45 32 28 22 54 52 41 4e 53   OSTRACE2("TRANS
31530 50 52 4f 58 59 3a 20 4f 50 45 4e 20 20 25 64 5c  PROXY: OPEN  %d\
31540 6e 22 2c 20 66 64 29 3b 0a 20 20 20 20 20 20 20  n", fd);.       
31550 20 69 66 28 20 66 64 3e 3d 30 20 29 7b 0a 20 20   if( fd>=0 ){.  
31560 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 68          pFile->h
31570 20 3d 20 66 64 3b 0a 20 20 20 20 20 20 20 20 7d   = fd;.        }
31580 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
31590 72 63 3d 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50  rc=SQLITE_CANTOP
315a0 45 4e 5f 42 4b 50 54 3b 20 2f 2a 20 53 51 4c 49  EN_BKPT; /* SQLI
315b0 54 45 5f 42 55 53 59 3f 20 70 72 6f 78 79 54 61  TE_BUSY? proxyTa
315c0 6b 65 43 6f 6e 63 68 20 63 61 6c 6c 65 64 0a 20  keConch called. 
315d0 20 20 20 20 20 20 20 20 20 20 64 75 72 69 6e 67            during
315e0 20 6c 6f 63 6b 69 6e 67 20 2a 2f 0a 20 20 20 20   locking */.    
315f0 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
31600 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
31610 54 45 5f 4f 4b 20 26 26 20 21 70 43 74 78 2d 3e  TE_OK && !pCtx->
31620 6c 6f 63 6b 50 72 6f 78 79 20 29 7b 0a 20 20 20  lockProxy ){.   
31630 20 20 20 20 20 63 68 61 72 20 2a 70 61 74 68 20       char *path 
31640 3d 20 74 65 6d 70 4c 6f 63 6b 50 61 74 68 20 3f  = tempLockPath ?
31650 20 74 65 6d 70 4c 6f 63 6b 50 61 74 68 20 3a 20   tempLockPath : 
31660 70 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 50  pCtx->lockProxyP
31670 61 74 68 3b 0a 20 20 20 20 20 20 20 20 72 63 20  ath;.        rc 
31680 3d 20 70 72 6f 78 79 43 72 65 61 74 65 55 6e 69  = proxyCreateUni
31690 78 46 69 6c 65 28 70 61 74 68 2c 20 26 70 43 74  xFile(path, &pCt
316a0 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 2c 20 31 29  x->lockProxy, 1)
316b0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
316c0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 72  !=SQLITE_OK && r
316d0 63 21 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20  c!=SQLITE_NOMEM 
316e0 26 26 20 74 72 79 4f 6c 64 4c 6f 63 6b 50 61 74  && tryOldLockPat
316f0 68 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f  h ){.          /
31700 2a 20 77 65 20 63 6f 75 6c 64 6e 27 74 20 63 72  * we couldn't cr
31710 65 61 74 65 20 74 68 65 20 70 72 6f 78 79 20 6c  eate the proxy l
31720 6f 63 6b 20 66 69 6c 65 20 77 69 74 68 20 74 68  ock file with th
31730 65 20 6f 6c 64 20 6c 6f 63 6b 20 66 69 6c 65 20  e old lock file 
31740 70 61 74 68 0a 20 20 20 20 20 20 20 20 20 20 20  path.           
31750 2a 2a 20 73 6f 20 74 72 79 20 61 67 61 69 6e 20  ** so try again 
31760 76 69 61 20 61 75 74 6f 2d 6e 61 6d 69 6e 67 20  via auto-naming 
31770 0a 20 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20  .           */. 
31780 20 20 20 20 20 20 20 20 20 66 6f 72 63 65 4e 65           forceNe
31790 77 4c 6f 63 6b 50 61 74 68 20 3d 20 31 3b 0a 20  wLockPath = 1;. 
317a0 20 20 20 20 20 20 20 20 20 74 72 79 4f 6c 64 4c           tryOldL
317b0 6f 63 6b 50 61 74 68 20 3d 20 30 3b 0a 20 20 20  ockPath = 0;.   
317c0 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b         continue;
317d0 20 2f 2a 20 67 6f 20 62 61 63 6b 20 74 6f 20 74   /* go back to t
317e0 68 65 20 64 6f 20 7b 7d 20 77 68 69 6c 65 20 73  he do {} while s
317f0 74 61 72 74 20 70 6f 69 6e 74 2c 20 74 72 79 20  tart point, try 
31800 61 67 61 69 6e 20 2a 2f 0a 20 20 20 20 20 20 20  again */.       
31810 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
31820 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
31830 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  OK ){.        /*
31840 20 4e 65 65 64 20 74 6f 20 6d 61 6b 65 20 61 20   Need to make a 
31850 63 6f 70 79 20 6f 66 20 70 61 74 68 20 69 66 20  copy of path if 
31860 77 65 20 65 78 74 72 61 63 74 65 64 20 74 68 65  we extracted the
31870 20 76 61 6c 75 65 0a 20 20 20 20 20 20 20 20 20   value.         
31880 2a 2a 20 66 72 6f 6d 20 74 68 65 20 63 6f 6e 63  ** from the conc
31890 68 20 66 69 6c 65 20 6f 72 20 74 68 65 20 70 61  h file or the pa
318a0 74 68 20 77 61 73 20 61 6c 6c 6f 63 61 74 65 64  th was allocated
318b0 20 6f 6e 20 74 68 65 20 73 74 61 63 6b 0a 20 20   on the stack.  
318c0 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
318d0 20 20 69 66 28 20 74 65 6d 70 4c 6f 63 6b 50 61    if( tempLockPa
318e0 74 68 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  th ){.          
318f0 70 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 50  pCtx->lockProxyP
31900 61 74 68 20 3d 20 73 71 6c 69 74 65 33 44 62 53  ath = sqlite3DbS
31910 74 72 44 75 70 28 30 2c 20 74 65 6d 70 4c 6f 63  trDup(0, tempLoc
31920 6b 50 61 74 68 29 3b 0a 20 20 20 20 20 20 20 20  kPath);.        
31930 20 20 69 66 28 20 21 70 43 74 78 2d 3e 6c 6f 63    if( !pCtx->loc
31940 6b 50 72 6f 78 79 50 61 74 68 20 29 7b 0a 20 20  kProxyPath ){.  
31950 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53            rc = S
31960 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
31970 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
31980 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
31990 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
319a0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 70 43  OK ){.        pC
319b0 74 78 2d 3e 63 6f 6e 63 68 48 65 6c 64 20 3d 20  tx->conchHeld = 
319c0 31 3b 0a 20 20 20 20 20 20 20 20 0a 20 20 20 20  1;.        .    
319d0 20 20 20 20 69 66 28 20 70 43 74 78 2d 3e 6c 6f      if( pCtx->lo
319e0 63 6b 50 72 6f 78 79 2d 3e 70 4d 65 74 68 6f 64  ckProxy->pMethod
319f0 20 3d 3d 20 26 61 66 70 49 6f 4d 65 74 68 6f 64   == &afpIoMethod
31a00 73 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61  s ){.          a
31a10 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  fpLockingContext
31a20 20 2a 61 66 70 43 74 78 3b 0a 20 20 20 20 20 20   *afpCtx;.      
31a30 20 20 20 20 61 66 70 43 74 78 20 3d 20 28 61 66      afpCtx = (af
31a40 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20  pLockingContext 
31a50 2a 29 70 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78  *)pCtx->lockProx
31a60 79 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78  y->lockingContex
31a70 74 3b 0a 20 20 20 20 20 20 20 20 20 20 61 66 70  t;.          afp
31a80 43 74 78 2d 3e 64 62 50 61 74 68 20 3d 20 70 43  Ctx->dbPath = pC
31a90 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 50 61 74  tx->lockProxyPat
31aa0 68 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  h;.        }.   
31ab0 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20     } else {.    
31ac0 20 20 20 20 63 6f 6e 63 68 46 69 6c 65 2d 3e 70      conchFile->p
31ad0 4d 65 74 68 6f 64 2d 3e 78 55 6e 6c 6f 63 6b 28  Method->xUnlock(
31ae0 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29 63  (sqlite3_file*)c
31af0 6f 6e 63 68 46 69 6c 65 2c 20 4e 4f 5f 4c 4f 43  onchFile, NO_LOC
31b00 4b 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  K);.      }.    
31b10 20 20 4f 53 54 52 41 43 45 33 28 22 54 41 4b 45    OSTRACE3("TAKE
31b20 43 4f 4e 43 48 20 20 25 64 20 25 73 5c 6e 22 2c  CONCH  %d %s\n",
31b30 20 63 6f 6e 63 68 46 69 6c 65 2d 3e 68 2c 20 72   conchFile->h, r
31b40 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 3f 22 6f 6b  c==SQLITE_OK?"ok
31b50 22 3a 22 66 61 69 6c 65 64 22 29 3b 0a 20 20 20  ":"failed");.   
31b60 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
31b70 20 20 7d 20 77 68 69 6c 65 20 28 31 29 3b 20 2f    } while (1); /
31b80 2a 20 69 6e 20 63 61 73 65 20 77 65 20 6e 65 65  * in case we nee
31b90 64 20 74 6f 20 72 65 74 72 79 20 74 68 65 20 3a  d to retry the :
31ba0 61 75 74 6f 3a 20 6c 6f 63 6b 20 66 69 6c 65 20  auto: lock file 
31bb0 2d 20 77 65 20 73 68 6f 75 6c 64 20 6e 65 76 65  - we should neve
31bc0 72 20 67 65 74 20 68 65 72 65 20 65 78 63 65 70  r get here excep
31bd0 74 20 76 69 61 20 74 68 65 20 27 63 6f 6e 74 69  t via the 'conti
31be0 6e 75 65 27 20 63 61 6c 6c 2e 20 2a 2f 0a 20 20  nue' call. */.  
31bf0 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 70 46  }.}../*.** If pF
31c00 69 6c 65 20 68 6f 6c 64 73 20 61 20 6c 6f 63 6b  ile holds a lock
31c10 20 6f 6e 20 61 20 63 6f 6e 63 68 20 66 69 6c 65   on a conch file
31c20 2c 20 74 68 65 6e 20 72 65 6c 65 61 73 65 20 74  , then release t
31c30 68 61 74 20 6c 6f 63 6b 2e 0a 2a 2f 0a 73 74 61  hat lock..*/.sta
31c40 74 69 63 20 69 6e 74 20 70 72 6f 78 79 52 65 6c  tic int proxyRel
31c50 65 61 73 65 43 6f 6e 63 68 28 75 6e 69 78 46 69  easeConch(unixFi
31c60 6c 65 20 2a 70 46 69 6c 65 29 7b 0a 20 20 69 6e  le *pFile){.  in
31c70 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20  t rc;           
31c80 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 75 62            /* Sub
31c90 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 20 63  routine return c
31ca0 6f 64 65 20 2a 2f 0a 20 20 70 72 6f 78 79 4c 6f  ode */.  proxyLo
31cb0 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 70 43  ckingContext *pC
31cc0 74 78 3b 20 20 2f 2a 20 54 68 65 20 6c 6f 63 6b  tx;  /* The lock
31cd0 69 6e 67 20 63 6f 6e 74 65 78 74 20 66 6f 72 20  ing context for 
31ce0 74 68 65 20 70 72 6f 78 79 20 6c 6f 63 6b 20 2a  the proxy lock *
31cf0 2f 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 63 6f  /.  unixFile *co
31d00 6e 63 68 46 69 6c 65 3b 20 20 20 20 20 20 20 20  nchFile;        
31d10 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 63  /* Name of the c
31d20 6f 6e 63 68 20 66 69 6c 65 20 2a 2f 0a 0a 20 20  onch file */..  
31d30 70 43 74 78 20 3d 20 28 70 72 6f 78 79 4c 6f 63  pCtx = (proxyLoc
31d40 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 29 70 46  kingContext *)pF
31d50 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74  ile->lockingCont
31d60 65 78 74 3b 0a 20 20 63 6f 6e 63 68 46 69 6c 65  ext;.  conchFile
31d70 20 3d 20 70 43 74 78 2d 3e 63 6f 6e 63 68 46 69   = pCtx->conchFi
31d80 6c 65 3b 0a 20 20 4f 53 54 52 41 43 45 34 28 22  le;.  OSTRACE4("
31d90 52 45 4c 45 41 53 45 43 4f 4e 43 48 20 20 25 64  RELEASECONCH  %d
31da0 20 66 6f 72 20 25 73 20 70 69 64 3d 25 64 5c 6e   for %s pid=%d\n
31db0 22 2c 20 63 6f 6e 63 68 46 69 6c 65 2d 3e 68 2c  ", conchFile->h,
31dc0 0a 20 20 20 20 20 20 20 20 20 20 20 28 70 43 74  .           (pCt
31dd0 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 50 61 74 68  x->lockProxyPath
31de0 20 3f 20 70 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f   ? pCtx->lockPro
31df0 78 79 50 61 74 68 20 3a 20 22 3a 61 75 74 6f 3a  xyPath : ":auto:
31e00 22 29 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20  "), .           
31e10 67 65 74 70 69 64 28 29 29 3b 0a 20 20 69 66 28  getpid());.  if(
31e20 20 70 43 74 78 2d 3e 63 6f 6e 63 68 48 65 6c 64   pCtx->conchHeld
31e30 3e 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 63  >0 ){.    rc = c
31e40 6f 6e 63 68 46 69 6c 65 2d 3e 70 4d 65 74 68 6f  onchFile->pMetho
31e50 64 2d 3e 78 55 6e 6c 6f 63 6b 28 28 73 71 6c 69  d->xUnlock((sqli
31e60 74 65 33 5f 66 69 6c 65 2a 29 63 6f 6e 63 68 46  te3_file*)conchF
31e70 69 6c 65 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20  ile, NO_LOCK);. 
31e80 20 7d 0a 20 20 70 43 74 78 2d 3e 63 6f 6e 63 68   }.  pCtx->conch
31e90 48 65 6c 64 20 3d 20 30 3b 0a 20 20 4f 53 54 52  Held = 0;.  OSTR
31ea0 41 43 45 33 28 22 52 45 4c 45 41 53 45 43 4f 4e  ACE3("RELEASECON
31eb0 43 48 20 20 25 64 20 25 73 5c 6e 22 2c 20 63 6f  CH  %d %s\n", co
31ec0 6e 63 68 46 69 6c 65 2d 3e 68 2c 0a 20 20 20 20  nchFile->h,.    
31ed0 20 20 20 20 20 20 20 28 72 63 3d 3d 53 51 4c 49         (rc==SQLI
31ee0 54 45 5f 4f 4b 20 3f 20 22 6f 6b 22 20 3a 20 22  TE_OK ? "ok" : "
31ef0 66 61 69 6c 65 64 22 29 29 3b 0a 20 20 72 65 74  failed"));.  ret
31f00 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
31f10 20 47 69 76 65 6e 20 74 68 65 20 6e 61 6d 65 20   Given the name 
31f20 6f 66 20 61 20 64 61 74 61 62 61 73 65 20 66 69  of a database fi
31f30 6c 65 2c 20 63 6f 6d 70 75 74 65 20 74 68 65 20  le, compute the 
31f40 6e 61 6d 65 20 6f 66 20 69 74 73 20 63 6f 6e 63  name of its conc
31f50 68 20 66 69 6c 65 2e 0a 2a 2a 20 53 74 6f 72 65  h file..** Store
31f60 20 74 68 65 20 63 6f 6e 63 68 20 66 69 6c 65 6e   the conch filen
31f70 61 6d 65 20 69 6e 20 6d 65 6d 6f 72 79 20 6f 62  ame in memory ob
31f80 74 61 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69  tained from sqli
31f90 74 65 33 5f 6d 61 6c 6c 6f 63 28 29 2e 0a 2a 2a  te3_malloc()..**
31fa0 20 4d 61 6b 65 20 2a 70 43 6f 6e 63 68 50 61 74   Make *pConchPat
31fb0 68 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 6e  h point to the n
31fc0 65 77 20 6e 61 6d 65 2e 20 20 52 65 74 75 72 6e  ew name.  Return
31fd0 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75   SQLITE_OK on su
31fe0 63 63 65 73 73 0a 2a 2a 20 6f 72 20 53 51 4c 49  ccess.** or SQLI
31ff0 54 45 5f 4e 4f 4d 45 4d 20 69 66 20 75 6e 61 62  TE_NOMEM if unab
32000 6c 65 20 74 6f 20 6f 62 74 61 69 6e 20 6d 65 6d  le to obtain mem
32010 6f 72 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63  ory..**.** The c
32020 61 6c 6c 65 72 20 69 73 20 72 65 73 70 6f 6e 73  aller is respons
32030 69 62 6c 65 20 66 6f 72 20 65 6e 73 75 72 69 6e  ible for ensurin
32040 67 20 74 68 61 74 20 74 68 65 20 61 6c 6c 6f 63  g that the alloc
32050 61 74 65 64 20 6d 65 6d 6f 72 79 0a 2a 2a 20 73  ated memory.** s
32060 70 61 63 65 20 69 73 20 65 76 65 6e 74 75 61 6c  pace is eventual
32070 6c 79 20 66 72 65 65 64 2e 0a 2a 2a 0a 2a 2a 20  ly freed..**.** 
32080 2a 70 43 6f 6e 63 68 50 61 74 68 20 69 73 20 73  *pConchPath is s
32090 65 74 20 74 6f 20 4e 55 4c 4c 20 69 66 20 61 20  et to NULL if a 
320a0 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f  memory allocatio
320b0 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2e 0a  n error occurs..
320c0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72  */.static int pr
320d0 6f 78 79 43 72 65 61 74 65 43 6f 6e 63 68 50 61  oxyCreateConchPa
320e0 74 68 6e 61 6d 65 28 63 68 61 72 20 2a 64 62 50  thname(char *dbP
320f0 61 74 68 2c 20 63 68 61 72 20 2a 2a 70 43 6f 6e  ath, char **pCon
32100 63 68 50 61 74 68 29 7b 0a 20 20 69 6e 74 20 69  chPath){.  int i
32110 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
32120 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70           /* Loop
32130 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e   counter */.  in
32140 74 20 6c 65 6e 20 3d 20 28 69 6e 74 29 73 74 72  t len = (int)str
32150 6c 65 6e 28 64 62 50 61 74 68 29 3b 20 2f 2a 20  len(dbPath); /* 
32160 4c 65 6e 67 74 68 20 6f 66 20 64 61 74 61 62 61  Length of databa
32170 73 65 20 66 69 6c 65 6e 61 6d 65 20 2d 20 64 62  se filename - db
32180 50 61 74 68 20 2a 2f 0a 20 20 63 68 61 72 20 2a  Path */.  char *
32190 63 6f 6e 63 68 50 61 74 68 3b 20 20 20 20 20 20  conchPath;      
321a0 20 20 20 20 20 20 20 20 2f 2a 20 62 75 66 66 65          /* buffe
321b0 72 20 69 6e 20 77 68 69 63 68 20 74 6f 20 63 6f  r in which to co
321c0 6e 73 74 72 75 63 74 20 63 6f 6e 63 68 20 6e 61  nstruct conch na
321d0 6d 65 20 2a 2f 0a 0a 20 20 2f 2a 20 41 6c 6c 6f  me */..  /* Allo
321e0 63 61 74 65 20 73 70 61 63 65 20 66 6f 72 20 74  cate space for t
321f0 68 65 20 63 6f 6e 63 68 20 66 69 6c 65 6e 61 6d  he conch filenam
32200 65 20 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a 65  e and initialize
32210 20 74 68 65 20 6e 61 6d 65 20 74 6f 0a 20 20 2a   the name to.  *
32220 2a 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68  * the name of th
32230 65 20 6f 72 69 67 69 6e 61 6c 20 64 61 74 61 62  e original datab
32240 61 73 65 20 66 69 6c 65 2e 20 2a 2f 20 20 0a 20  ase file. */  . 
32250 20 2a 70 43 6f 6e 63 68 50 61 74 68 20 3d 20 63   *pConchPath = c
32260 6f 6e 63 68 50 61 74 68 20 3d 20 28 63 68 61 72  onchPath = (char
32270 20 2a 29 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f   *)sqlite3_mallo
32280 63 28 6c 65 6e 20 2b 20 38 29 3b 0a 20 20 69 66  c(len + 8);.  if
32290 28 20 63 6f 6e 63 68 50 61 74 68 3d 3d 30 20 29  ( conchPath==0 )
322a0 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
322b0 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20  ITE_NOMEM;.  }. 
322c0 20 6d 65 6d 63 70 79 28 63 6f 6e 63 68 50 61 74   memcpy(conchPat
322d0 68 2c 20 64 62 50 61 74 68 2c 20 6c 65 6e 2b 31  h, dbPath, len+1
322e0 29 3b 0a 20 20 0a 20 20 2f 2a 20 6e 6f 77 20 69  );.  .  /* now i
322f0 6e 73 65 72 74 20 61 20 22 2e 22 20 62 65 66 6f  nsert a "." befo
32300 72 65 20 74 68 65 20 6c 61 73 74 20 2f 20 63 68  re the last / ch
32310 61 72 61 63 74 65 72 20 2a 2f 0a 20 20 66 6f 72  aracter */.  for
32320 28 20 69 3d 28 6c 65 6e 2d 31 29 3b 20 69 3e 3d  ( i=(len-1); i>=
32330 30 3b 20 69 2d 2d 20 29 7b 0a 20 20 20 20 69 66  0; i-- ){.    if
32340 28 20 63 6f 6e 63 68 50 61 74 68 5b 69 5d 3d 3d  ( conchPath[i]==
32350 27 2f 27 20 29 7b 0a 20 20 20 20 20 20 69 2b 2b  '/' ){.      i++
32360 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
32370 20 20 20 7d 0a 20 20 7d 0a 20 20 63 6f 6e 63 68     }.  }.  conch
32380 50 61 74 68 5b 69 5d 3d 27 2e 27 3b 0a 20 20 77  Path[i]='.';.  w
32390 68 69 6c 65 20 28 20 69 3c 6c 65 6e 20 29 7b 0a  hile ( i<len ){.
323a0 20 20 20 20 63 6f 6e 63 68 50 61 74 68 5b 69 2b      conchPath[i+
323b0 31 5d 3d 64 62 50 61 74 68 5b 69 5d 3b 0a 20 20  1]=dbPath[i];.  
323c0 20 20 69 2b 2b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a    i++;.  }..  /*
323d0 20 61 70 70 65 6e 64 20 74 68 65 20 22 2d 63 6f   append the "-co
323e0 6e 63 68 22 20 73 75 66 66 69 78 20 74 6f 20 74  nch" suffix to t
323f0 68 65 20 66 69 6c 65 20 2a 2f 0a 20 20 6d 65 6d  he file */.  mem
32400 63 70 79 28 26 63 6f 6e 63 68 50 61 74 68 5b 69  cpy(&conchPath[i
32410 2b 31 5d 2c 20 22 2d 63 6f 6e 63 68 22 2c 20 37  +1], "-conch", 7
32420 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28 69 6e  );.  assert( (in
32430 74 29 73 74 72 6c 65 6e 28 63 6f 6e 63 68 50 61  t)strlen(conchPa
32440 74 68 29 20 3d 3d 20 6c 65 6e 2b 37 20 29 3b 0a  th) == len+7 );.
32450 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
32460 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 20 54 61 6b 65  _OK;.}.../* Take
32470 73 20 61 20 66 75 6c 6c 79 20 63 6f 6e 66 69 67  s a fully config
32480 75 72 65 64 20 70 72 6f 78 79 20 6c 6f 63 6b 69  ured proxy locki
32490 6e 67 2d 73 74 79 6c 65 20 75 6e 69 78 20 66 69  ng-style unix fi
324a0 6c 65 20 61 6e 64 20 73 77 69 74 63 68 65 73 0a  le and switches.
324b0 2a 2a 20 74 68 65 20 6c 6f 63 61 6c 20 6c 6f 63  ** the local loc
324c0 6b 20 66 69 6c 65 20 70 61 74 68 20 0a 2a 2f 0a  k file path .*/.
324d0 73 74 61 74 69 63 20 69 6e 74 20 73 77 69 74 63  static int switc
324e0 68 4c 6f 63 6b 50 72 6f 78 79 50 61 74 68 28 75  hLockProxyPath(u
324f0 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 2c 20  nixFile *pFile, 
32500 63 6f 6e 73 74 20 63 68 61 72 20 2a 70 61 74 68  const char *path
32510 29 20 7b 0a 20 20 70 72 6f 78 79 4c 6f 63 6b 69  ) {.  proxyLocki
32520 6e 67 43 6f 6e 74 65 78 74 20 2a 70 43 74 78 20  ngContext *pCtx 
32530 3d 20 28 70 72 6f 78 79 4c 6f 63 6b 69 6e 67 43  = (proxyLockingC
32540 6f 6e 74 65 78 74 2a 29 70 46 69 6c 65 2d 3e 6c  ontext*)pFile->l
32550 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 0a 20  ockingContext;. 
32560 20 63 68 61 72 20 2a 6f 6c 64 50 61 74 68 20 3d   char *oldPath =
32570 20 70 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79   pCtx->lockProxy
32580 50 61 74 68 3b 0a 20 20 69 6e 74 20 72 63 20 3d  Path;.  int rc =
32590 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 69   SQLITE_OK;..  i
325a0 66 28 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79  f( pFile->lockty
325b0 70 65 21 3d 4e 4f 5f 4c 4f 43 4b 20 29 7b 0a 20  pe!=NO_LOCK ){. 
325c0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
325d0 5f 42 55 53 59 3b 0a 20 20 7d 20 20 0a 0a 20 20  _BUSY;.  }  ..  
325e0 2f 2a 20 6e 6f 74 68 69 6e 67 20 74 6f 20 64 6f  /* nothing to do
325f0 20 69 66 20 74 68 65 20 70 61 74 68 20 69 73 20   if the path is 
32600 4e 55 4c 4c 2c 20 3a 61 75 74 6f 3a 20 6f 72 20  NULL, :auto: or 
32610 6d 61 74 63 68 65 73 20 74 68 65 20 65 78 69 73  matches the exis
32620 74 69 6e 67 20 70 61 74 68 20 2a 2f 0a 20 20 69  ting path */.  i
32630 66 28 20 21 70 61 74 68 20 7c 7c 20 70 61 74 68  f( !path || path
32640 5b 30 5d 3d 3d 27 5c 30 27 20 7c 7c 20 21 73 74  [0]=='\0' || !st
32650 72 63 6d 70 28 70 61 74 68 2c 20 22 3a 61 75 74  rcmp(path, ":aut
32660 6f 3a 22 29 20 7c 7c 0a 20 20 20 20 28 6f 6c 64  o:") ||.    (old
32670 50 61 74 68 20 26 26 20 21 73 74 72 6e 63 6d 70  Path && !strncmp
32680 28 6f 6c 64 50 61 74 68 2c 20 70 61 74 68 2c 20  (oldPath, path, 
32690 4d 41 58 50 41 54 48 4c 45 4e 29 29 20 29 7b 0a  MAXPATHLEN)) ){.
326a0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
326b0 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  E_OK;.  }else{. 
326c0 20 20 20 75 6e 69 78 46 69 6c 65 20 2a 6c 6f 63     unixFile *loc
326d0 6b 50 72 6f 78 79 20 3d 20 70 43 74 78 2d 3e 6c  kProxy = pCtx->l
326e0 6f 63 6b 50 72 6f 78 79 3b 0a 20 20 20 20 70 43  ockProxy;.    pC
326f0 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 3d 4e 55  tx->lockProxy=NU
32700 4c 4c 3b 0a 20 20 20 20 70 43 74 78 2d 3e 63 6f  LL;.    pCtx->co
32710 6e 63 68 48 65 6c 64 20 3d 20 30 3b 0a 20 20 20  nchHeld = 0;.   
32720 20 69 66 28 20 6c 6f 63 6b 50 72 6f 78 79 21 3d   if( lockProxy!=
32730 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 20 20 72 63  NULL ){.      rc
32740 3d 6c 6f 63 6b 50 72 6f 78 79 2d 3e 70 4d 65 74  =lockProxy->pMet
32750 68 6f 64 2d 3e 78 43 6c 6f 73 65 28 28 73 71 6c  hod->xClose((sql
32760 69 74 65 33 5f 66 69 6c 65 20 2a 29 6c 6f 63 6b  ite3_file *)lock
32770 50 72 6f 78 79 29 3b 0a 20 20 20 20 20 20 69 66  Proxy);.      if
32780 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
32790 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
327a0 66 72 65 65 28 6c 6f 63 6b 50 72 6f 78 79 29 3b  free(lockProxy);
327b0 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
327c0 65 33 5f 66 72 65 65 28 6f 6c 64 50 61 74 68 29  e3_free(oldPath)
327d0 3b 0a 20 20 20 20 70 43 74 78 2d 3e 6c 6f 63 6b  ;.    pCtx->lock
327e0 50 72 6f 78 79 50 61 74 68 20 3d 20 73 71 6c 69  ProxyPath = sqli
327f0 74 65 33 44 62 53 74 72 44 75 70 28 30 2c 20 70  te3DbStrDup(0, p
32800 61 74 68 29 3b 0a 20 20 7d 0a 20 20 0a 20 20 72  ath);.  }.  .  r
32810 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
32820 2a 2a 20 70 46 69 6c 65 20 69 73 20 61 20 66 69  ** pFile is a fi
32830 6c 65 20 74 68 61 74 20 68 61 73 20 62 65 65 6e  le that has been
32840 20 6f 70 65 6e 65 64 20 62 79 20 61 20 70 72 69   opened by a pri
32850 6f 72 20 78 4f 70 65 6e 20 63 61 6c 6c 2e 20 20  or xOpen call.  
32860 64 62 50 61 74 68 0a 2a 2a 20 69 73 20 61 20 73  dbPath.** is a s
32870 74 72 69 6e 67 20 62 75 66 66 65 72 20 61 74 20  tring buffer at 
32880 6c 65 61 73 74 20 4d 41 58 50 41 54 48 4c 45 4e  least MAXPATHLEN
32890 2b 31 20 63 68 61 72 61 63 74 65 72 73 20 69 6e  +1 characters in
328a0 20 73 69 7a 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69   size..**.** Thi
328b0 73 20 72 6f 75 74 69 6e 65 20 66 69 6e 64 20 74  s routine find t
328c0 68 65 20 66 69 6c 65 6e 61 6d 65 20 61 73 73 6f  he filename asso
328d0 63 69 61 74 65 64 20 77 69 74 68 20 70 46 69 6c  ciated with pFil
328e0 65 20 61 6e 64 20 77 72 69 74 65 73 20 69 74 0a  e and writes it.
328f0 2a 2a 20 69 6e 74 20 64 62 50 61 74 68 2e 0a 2a  ** int dbPath..*
32900 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72 6f  /.static int pro
32910 78 79 47 65 74 44 62 50 61 74 68 46 6f 72 55 6e  xyGetDbPathForUn
32920 69 78 46 69 6c 65 28 75 6e 69 78 46 69 6c 65 20  ixFile(unixFile 
32930 2a 70 46 69 6c 65 2c 20 63 68 61 72 20 2a 64 62  *pFile, char *db
32940 50 61 74 68 29 7b 0a 23 69 66 20 64 65 66 69 6e  Path){.#if defin
32950 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 0a 20 20  ed(__APPLE__).  
32960 69 66 28 20 70 46 69 6c 65 2d 3e 70 4d 65 74 68  if( pFile->pMeth
32970 6f 64 20 3d 3d 20 26 61 66 70 49 6f 4d 65 74 68  od == &afpIoMeth
32980 6f 64 73 20 29 7b 0a 20 20 20 20 2f 2a 20 61 66  ods ){.    /* af
32990 70 20 73 74 79 6c 65 20 6b 65 65 70 73 20 61 20  p style keeps a 
329a0 72 65 66 65 72 65 6e 63 65 20 74 6f 20 74 68 65  reference to the
329b0 20 64 62 20 70 61 74 68 20 69 6e 20 74 68 65 20   db path in the 
329c0 66 69 6c 65 50 61 74 68 20 66 69 65 6c 64 20 0a  filePath field .
329d0 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 73 74      ** of the st
329e0 72 75 63 74 20 2a 2f 0a 20 20 20 20 61 73 73 65  ruct */.    asse
329f0 72 74 28 20 28 69 6e 74 29 73 74 72 6c 65 6e 28  rt( (int)strlen(
32a00 28 63 68 61 72 2a 29 70 46 69 6c 65 2d 3e 6c 6f  (char*)pFile->lo
32a10 63 6b 69 6e 67 43 6f 6e 74 65 78 74 29 3c 3d 4d  ckingContext)<=M
32a20 41 58 50 41 54 48 4c 45 4e 20 29 3b 0a 20 20 20  AXPATHLEN );.   
32a30 20 73 74 72 6c 63 70 79 28 64 62 50 61 74 68 2c   strlcpy(dbPath,
32a40 20 28 28 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e   ((afpLockingCon
32a50 74 65 78 74 20 2a 29 70 46 69 6c 65 2d 3e 6c 6f  text *)pFile->lo
32a60 63 6b 69 6e 67 43 6f 6e 74 65 78 74 29 2d 3e 64  ckingContext)->d
32a70 62 50 61 74 68 2c 20 4d 41 58 50 41 54 48 4c 45  bPath, MAXPATHLE
32a80 4e 29 3b 0a 20 20 7d 20 65 6c 73 65 0a 23 65 6e  N);.  } else.#en
32a90 64 69 66 0a 20 20 69 66 28 20 70 46 69 6c 65 2d  dif.  if( pFile-
32aa0 3e 70 4d 65 74 68 6f 64 20 3d 3d 20 26 64 6f 74  >pMethod == &dot
32ab0 6c 6f 63 6b 49 6f 4d 65 74 68 6f 64 73 20 29 7b  lockIoMethods ){
32ac0 0a 20 20 20 20 2f 2a 20 64 6f 74 20 6c 6f 63 6b  .    /* dot lock
32ad0 20 73 74 79 6c 65 20 75 73 65 73 20 74 68 65 20   style uses the 
32ae0 6c 6f 63 6b 69 6e 67 20 63 6f 6e 74 65 78 74 20  locking context 
32af0 74 6f 20 73 74 6f 72 65 20 74 68 65 20 64 6f 74  to store the dot
32b00 20 6c 6f 63 6b 0a 20 20 20 20 2a 2a 20 66 69 6c   lock.    ** fil
32b10 65 20 70 61 74 68 20 2a 2f 0a 20 20 20 20 69 6e  e path */.    in
32b20 74 20 6c 65 6e 20 3d 20 73 74 72 6c 65 6e 28 28  t len = strlen((
32b30 63 68 61 72 20 2a 29 70 46 69 6c 65 2d 3e 6c 6f  char *)pFile->lo
32b40 63 6b 69 6e 67 43 6f 6e 74 65 78 74 29 20 2d 20  ckingContext) - 
32b50 73 74 72 6c 65 6e 28 44 4f 54 4c 4f 43 4b 5f 53  strlen(DOTLOCK_S
32b60 55 46 46 49 58 29 3b 0a 20 20 20 20 6d 65 6d 63  UFFIX);.    memc
32b70 70 79 28 64 62 50 61 74 68 2c 20 28 63 68 61 72  py(dbPath, (char
32b80 20 2a 29 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e   *)pFile->lockin
32b90 67 43 6f 6e 74 65 78 74 2c 20 6c 65 6e 20 2b 20  gContext, len + 
32ba0 31 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  1);.  }else{.   
32bb0 20 2f 2a 20 61 6c 6c 20 6f 74 68 65 72 20 73 74   /* all other st
32bc0 79 6c 65 73 20 75 73 65 20 74 68 65 20 6c 6f 63  yles use the loc
32bd0 6b 69 6e 67 20 63 6f 6e 74 65 78 74 20 74 6f 20  king context to 
32be0 73 74 6f 72 65 20 74 68 65 20 64 62 20 66 69 6c  store the db fil
32bf0 65 20 70 61 74 68 20 2a 2f 0a 20 20 20 20 61 73  e path */.    as
32c00 73 65 72 74 28 20 73 74 72 6c 65 6e 28 28 63 68  sert( strlen((ch
32c10 61 72 2a 29 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69  ar*)pFile->locki
32c20 6e 67 43 6f 6e 74 65 78 74 29 3c 3d 4d 41 58 50  ngContext)<=MAXP
32c30 41 54 48 4c 45 4e 20 29 3b 0a 20 20 20 20 73 74  ATHLEN );.    st
32c40 72 6c 63 70 79 28 64 62 50 61 74 68 2c 20 28 63  rlcpy(dbPath, (c
32c50 68 61 72 20 2a 29 70 46 69 6c 65 2d 3e 6c 6f 63  har *)pFile->loc
32c60 6b 69 6e 67 43 6f 6e 74 65 78 74 2c 20 4d 41 58  kingContext, MAX
32c70 50 41 54 48 4c 45 4e 29 3b 0a 20 20 7d 0a 20 20  PATHLEN);.  }.  
32c80 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
32c90 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 61 6b 65 73  ;.}../*.** Takes
32ca0 20 61 6e 20 61 6c 72 65 61 64 79 20 66 69 6c 6c   an already fill
32cb0 65 64 20 69 6e 20 75 6e 69 78 20 66 69 6c 65 20  ed in unix file 
32cc0 61 6e 64 20 61 6c 74 65 72 73 20 69 74 20 73 6f  and alters it so
32cd0 20 61 6c 6c 20 66 69 6c 65 20 6c 6f 63 6b 69 6e   all file lockin
32ce0 67 20 0a 2a 2a 20 77 69 6c 6c 20 62 65 20 70 65  g .** will be pe
32cf0 72 66 6f 72 6d 65 64 20 6f 6e 20 74 68 65 20 6c  rformed on the l
32d00 6f 63 61 6c 20 70 72 6f 78 79 20 6c 6f 63 6b 20  ocal proxy lock 
32d10 66 69 6c 65 2e 20 20 54 68 65 20 66 6f 6c 6c 6f  file.  The follo
32d20 77 69 6e 67 20 66 69 65 6c 64 73 0a 2a 2a 20 61  wing fields.** a
32d30 72 65 20 70 72 65 73 65 72 76 65 64 20 69 6e 20  re preserved in 
32d40 74 68 65 20 6c 6f 63 6b 69 6e 67 20 63 6f 6e 74  the locking cont
32d50 65 78 74 20 73 6f 20 74 68 61 74 20 74 68 65 79  ext so that they
32d60 20 63 61 6e 20 62 65 20 72 65 73 74 6f 72 65 64   can be restored
32d70 20 61 6e 64 20 0a 2a 2a 20 74 68 65 20 75 6e 69   and .** the uni
32d80 78 20 73 74 72 75 63 74 75 72 65 20 70 72 6f 70  x structure prop
32d90 65 72 6c 79 20 63 6c 65 61 6e 65 64 20 75 70 20  erly cleaned up 
32da0 61 74 20 63 6c 6f 73 65 20 74 69 6d 65 3a 0a 2a  at close time:.*
32db0 2a 20 20 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74  *  ->lockingCont
32dc0 65 78 74 0a 2a 2a 20 20 2d 3e 70 4d 65 74 68 6f  ext.**  ->pMetho
32dd0 64 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  d.*/.static int 
32de0 70 72 6f 78 79 54 72 61 6e 73 66 6f 72 6d 55 6e  proxyTransformUn
32df0 69 78 46 69 6c 65 28 75 6e 69 78 46 69 6c 65 20  ixFile(unixFile 
32e00 2a 70 46 69 6c 65 2c 20 63 6f 6e 73 74 20 63 68  *pFile, const ch
32e10 61 72 20 2a 70 61 74 68 29 20 7b 0a 20 20 70 72  ar *path) {.  pr
32e20 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78  oxyLockingContex
32e30 74 20 2a 70 43 74 78 3b 0a 20 20 63 68 61 72 20  t *pCtx;.  char 
32e40 64 62 50 61 74 68 5b 4d 41 58 50 41 54 48 4c 45  dbPath[MAXPATHLE
32e50 4e 2b 31 5d 3b 20 20 20 20 20 20 20 2f 2a 20 4e  N+1];       /* N
32e60 61 6d 65 20 6f 66 20 74 68 65 20 64 61 74 61 62  ame of the datab
32e70 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 63 68  ase file */.  ch
32e80 61 72 20 2a 6c 6f 63 6b 50 61 74 68 3d 4e 55 4c  ar *lockPath=NUL
32e90 4c 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  L;.  int rc = SQ
32ea0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 0a 20 20 69 66  LITE_OK;.  .  if
32eb0 28 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70  ( pFile->locktyp
32ec0 65 21 3d 4e 4f 5f 4c 4f 43 4b 20 29 7b 0a 20 20  e!=NO_LOCK ){.  
32ed0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
32ee0 42 55 53 59 3b 0a 20 20 7d 0a 20 20 70 72 6f 78  BUSY;.  }.  prox
32ef0 79 47 65 74 44 62 50 61 74 68 46 6f 72 55 6e 69  yGetDbPathForUni
32f00 78 46 69 6c 65 28 70 46 69 6c 65 2c 20 64 62 50  xFile(pFile, dbP
32f10 61 74 68 29 3b 0a 20 20 69 66 28 20 21 70 61 74  ath);.  if( !pat
32f20 68 20 7c 7c 20 70 61 74 68 5b 30 5d 3d 3d 27 5c  h || path[0]=='\
32f30 30 27 20 7c 7c 20 21 73 74 72 63 6d 70 28 70 61  0' || !strcmp(pa
32f40 74 68 2c 20 22 3a 61 75 74 6f 3a 22 29 20 29 7b  th, ":auto:") ){
32f50 0a 20 20 20 20 6c 6f 63 6b 50 61 74 68 3d 4e 55  .    lockPath=NU
32f60 4c 4c 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  LL;.  }else{.   
32f70 20 6c 6f 63 6b 50 61 74 68 3d 28 63 68 61 72 20   lockPath=(char 
32f80 2a 29 70 61 74 68 3b 0a 20 20 7d 0a 20 20 0a 20  *)path;.  }.  . 
32f90 20 4f 53 54 52 41 43 45 34 28 22 54 52 41 4e 53   OSTRACE4("TRANS
32fa0 50 52 4f 58 59 20 20 25 64 20 66 6f 72 20 25 73  PROXY  %d for %s
32fb0 20 70 69 64 3d 25 64 5c 6e 22 2c 20 70 46 69 6c   pid=%d\n", pFil
32fc0 65 2d 3e 68 2c 0a 20 20 20 20 20 20 20 20 20 20  e->h,.          
32fd0 20 28 6c 6f 63 6b 50 61 74 68 20 3f 20 6c 6f 63   (lockPath ? loc
32fe0 6b 50 61 74 68 20 3a 20 22 3a 61 75 74 6f 3a 22  kPath : ":auto:"
32ff0 29 2c 20 67 65 74 70 69 64 28 29 29 3b 0a 0a 20  ), getpid());.. 
33000 20 70 43 74 78 20 3d 20 73 71 6c 69 74 65 33 5f   pCtx = sqlite3_
33010 6d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 2a  malloc( sizeof(*
33020 70 43 74 78 29 20 29 3b 0a 20 20 69 66 28 20 70  pCtx) );.  if( p
33030 43 74 78 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65  Ctx==0 ){.    re
33040 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
33050 4d 3b 0a 20 20 7d 0a 20 20 6d 65 6d 73 65 74 28  M;.  }.  memset(
33060 70 43 74 78 2c 20 30 2c 20 73 69 7a 65 6f 66 28  pCtx, 0, sizeof(
33070 2a 70 43 74 78 29 29 3b 0a 0a 20 20 72 63 20 3d  *pCtx));..  rc =
33080 20 70 72 6f 78 79 43 72 65 61 74 65 43 6f 6e 63   proxyCreateConc
33090 68 50 61 74 68 6e 61 6d 65 28 64 62 50 61 74 68  hPathname(dbPath
330a0 2c 20 26 70 43 74 78 2d 3e 63 6f 6e 63 68 46 69  , &pCtx->conchFi
330b0 6c 65 50 61 74 68 29 3b 0a 20 20 69 66 28 20 72  lePath);.  if( r
330c0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
330d0 20 20 20 20 72 63 20 3d 20 70 72 6f 78 79 43 72      rc = proxyCr
330e0 65 61 74 65 55 6e 69 78 46 69 6c 65 28 70 43 74  eateUnixFile(pCt
330f0 78 2d 3e 63 6f 6e 63 68 46 69 6c 65 50 61 74 68  x->conchFilePath
33100 2c 20 26 70 43 74 78 2d 3e 63 6f 6e 63 68 46 69  , &pCtx->conchFi
33110 6c 65 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20  le, 0);.    if( 
33120 72 63 3d 3d 53 51 4c 49 54 45 5f 43 41 4e 54 4f  rc==SQLITE_CANTO
33130 50 45 4e 20 26 26 20 28 28 70 46 69 6c 65 2d 3e  PEN && ((pFile->
33140 6f 70 65 6e 46 6c 61 67 73 26 4f 5f 52 44 57 52  openFlags&O_RDWR
33150 29 20 3d 3d 20 30 29 20 29 7b 0a 20 20 20 20 20  ) == 0) ){.     
33160 20 2f 2a 20 69 66 20 28 61 29 20 74 68 65 20 6f   /* if (a) the o
33170 70 65 6e 20 66 6c 61 67 73 20 61 72 65 20 6e 6f  pen flags are no
33180 74 20 4f 5f 52 44 57 52 2c 20 28 62 29 20 74 68  t O_RDWR, (b) th
33190 65 20 63 6f 6e 63 68 20 69 73 6e 27 74 20 74 68  e conch isn't th
331a0 65 72 65 2c 20 61 6e 64 0a 20 20 20 20 20 20 2a  ere, and.      *
331b0 2a 20 28 63 29 20 74 68 65 20 66 69 6c 65 20 73  * (c) the file s
331c0 79 73 74 65 6d 20 69 73 20 72 65 61 64 2d 6f 6e  ystem is read-on
331d0 6c 79 2c 20 74 68 65 6e 20 65 6e 61 62 6c 65 20  ly, then enable 
331e0 6e 6f 2d 6c 6f 63 6b 69 6e 67 20 61 63 63 65 73  no-locking acces
331f0 73 2e 0a 20 20 20 20 20 20 2a 2a 20 55 67 68 2c  s..      ** Ugh,
33200 20 73 69 6e 63 65 20 4f 5f 52 44 4f 4e 4c 59 3d   since O_RDONLY=
33210 3d 30 78 30 30 30 30 20 77 65 20 74 65 73 74 20  =0x0000 we test 
33220 66 6f 72 20 21 4f 5f 52 44 57 52 20 73 69 6e 63  for !O_RDWR sinc
33230 65 20 75 6e 69 78 4f 70 65 6e 20 61 73 73 65 72  e unixOpen asser
33240 74 73 0a 20 20 20 20 20 20 2a 2a 20 74 68 61 74  ts.      ** that
33250 20 6f 70 65 6e 46 6c 61 67 73 20 77 69 6c 6c 20   openFlags will 
33260 68 61 76 65 20 6f 6e 6c 79 20 6f 6e 65 20 6f 66  have only one of
33270 20 4f 5f 52 44 4f 4e 4c 59 20 6f 72 20 4f 5f 52   O_RDONLY or O_R
33280 44 57 52 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  DWR..      */.  
33290 20 20 20 20 73 74 72 75 63 74 20 73 74 61 74 66      struct statf
332a0 73 20 66 73 49 6e 66 6f 3b 0a 20 20 20 20 20 20  s fsInfo;.      
332b0 73 74 72 75 63 74 20 73 74 61 74 20 63 6f 6e 63  struct stat conc
332c0 68 49 6e 66 6f 3b 0a 20 20 20 20 20 20 69 6e 74  hInfo;.      int
332d0 20 67 6f 4c 6f 63 6b 6c 65 73 73 20 3d 20 30 3b   goLockless = 0;
332e0 0a 0a 20 20 20 20 20 20 69 66 28 20 73 74 61 74  ..      if( stat
332f0 28 70 43 74 78 2d 3e 63 6f 6e 63 68 46 69 6c 65  (pCtx->conchFile
33300 50 61 74 68 2c 20 26 63 6f 6e 63 68 49 6e 66 6f  Path, &conchInfo
33310 29 20 3d 3d 20 2d 31 20 29 20 7b 0a 20 20 20 20  ) == -1 ) {.    
33320 20 20 20 20 69 6e 74 20 65 72 72 20 3d 20 65 72      int err = er
33330 72 6e 6f 3b 0a 20 20 20 20 20 20 20 20 69 66 28  rno;.        if(
33340 20 28 65 72 72 3d 3d 45 4e 4f 45 4e 54 29 20 26   (err==ENOENT) &
33350 26 20 28 73 74 61 74 66 73 28 64 62 50 61 74 68  & (statfs(dbPath
33360 2c 20 26 66 73 49 6e 66 6f 29 20 21 3d 20 2d 31  , &fsInfo) != -1
33370 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 67  ) ){.          g
33380 6f 4c 6f 63 6b 6c 65 73 73 20 3d 20 28 66 73 49  oLockless = (fsI
33390 6e 66 6f 2e 66 5f 66 6c 61 67 73 26 4d 4e 54 5f  nfo.f_flags&MNT_
333a0 52 44 4f 4e 4c 59 29 20 3d 3d 20 4d 4e 54 5f 52  RDONLY) == MNT_R
333b0 44 4f 4e 4c 59 3b 0a 20 20 20 20 20 20 20 20 7d  DONLY;.        }
333c0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
333d0 66 28 20 67 6f 4c 6f 63 6b 6c 65 73 73 20 29 7b  f( goLockless ){
333e0 0a 20 20 20 20 20 20 20 20 70 43 74 78 2d 3e 63  .        pCtx->c
333f0 6f 6e 63 68 48 65 6c 64 20 3d 20 2d 31 3b 20 2f  onchHeld = -1; /
33400 2a 20 72 65 61 64 20 6f 6e 6c 79 20 46 53 2f 20  * read only FS/ 
33410 6c 6f 63 6b 6c 65 73 73 20 2a 2f 0a 20 20 20 20  lockless */.    
33420 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
33430 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  OK;.      }.    
33440 7d 0a 20 20 7d 20 20 0a 20 20 69 66 28 20 72 63  }.  }  .  if( rc
33450 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 6c  ==SQLITE_OK && l
33460 6f 63 6b 50 61 74 68 20 29 7b 0a 20 20 20 20 70  ockPath ){.    p
33470 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 50 61  Ctx->lockProxyPa
33480 74 68 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74  th = sqlite3DbSt
33490 72 44 75 70 28 30 2c 20 6c 6f 63 6b 50 61 74 68  rDup(0, lockPath
334a0 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72 63  );.  }..  if( rc
334b0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
334c0 20 20 20 70 43 74 78 2d 3e 64 62 50 61 74 68 20     pCtx->dbPath 
334d0 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72 44 75  = sqlite3DbStrDu
334e0 70 28 30 2c 20 64 62 50 61 74 68 29 3b 0a 20 20  p(0, dbPath);.  
334f0 20 20 69 66 28 20 70 43 74 78 2d 3e 64 62 50 61    if( pCtx->dbPa
33500 74 68 3d 3d 4e 55 4c 4c 20 29 7b 0a 20 20 20 20  th==NULL ){.    
33510 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f    rc = SQLITE_NO
33520 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  MEM;.    }.  }. 
33530 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
33540 4f 4b 20 29 7b 0a 20 20 20 20 2f 2a 20 61 6c 6c  OK ){.    /* all
33550 20 6d 65 6d 6f 72 79 20 69 73 20 61 6c 6c 6f 63   memory is alloc
33560 61 74 65 64 2c 20 70 72 6f 78 79 73 20 61 72 65  ated, proxys are
33570 20 63 72 65 61 74 65 64 20 61 6e 64 20 61 73 73   created and ass
33580 69 67 6e 65 64 2c 20 0a 20 20 20 20 2a 2a 20 73  igned, .    ** s
33590 77 69 74 63 68 20 74 68 65 20 6c 6f 63 6b 69 6e  witch the lockin
335a0 67 20 63 6f 6e 74 65 78 74 20 61 6e 64 20 70 4d  g context and pM
335b0 65 74 68 6f 64 20 74 68 65 6e 20 72 65 74 75 72  ethod then retur
335c0 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 43  n..    */.    pC
335d0 74 78 2d 3e 6f 6c 64 4c 6f 63 6b 69 6e 67 43 6f  tx->oldLockingCo
335e0 6e 74 65 78 74 20 3d 20 70 46 69 6c 65 2d 3e 6c  ntext = pFile->l
335f0 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 0a 20  ockingContext;. 
33600 20 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e     pFile->lockin
33610 67 43 6f 6e 74 65 78 74 20 3d 20 70 43 74 78 3b  gContext = pCtx;
33620 0a 20 20 20 20 70 43 74 78 2d 3e 70 4f 6c 64 4d  .    pCtx->pOldM
33630 65 74 68 6f 64 20 3d 20 70 46 69 6c 65 2d 3e 70  ethod = pFile->p
33640 4d 65 74 68 6f 64 3b 0a 20 20 20 20 70 46 69 6c  Method;.    pFil
33650 65 2d 3e 70 4d 65 74 68 6f 64 20 3d 20 26 70 72  e->pMethod = &pr
33660 6f 78 79 49 6f 4d 65 74 68 6f 64 73 3b 0a 20 20  oxyIoMethods;.  
33670 7d 65 6c 73 65 7b 0a 20 20 20 20 69 66 28 20 70  }else{.    if( p
33680 43 74 78 2d 3e 63 6f 6e 63 68 46 69 6c 65 20 29  Ctx->conchFile )
33690 7b 20 0a 20 20 20 20 20 20 70 43 74 78 2d 3e 63  { .      pCtx->c
336a0 6f 6e 63 68 46 69 6c 65 2d 3e 70 4d 65 74 68 6f  onchFile->pMetho
336b0 64 2d 3e 78 43 6c 6f 73 65 28 28 73 71 6c 69 74  d->xClose((sqlit
336c0 65 33 5f 66 69 6c 65 20 2a 29 70 43 74 78 2d 3e  e3_file *)pCtx->
336d0 63 6f 6e 63 68 46 69 6c 65 29 3b 0a 20 20 20 20  conchFile);.    
336e0 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
336f0 43 74 78 2d 3e 63 6f 6e 63 68 46 69 6c 65 29 3b  Ctx->conchFile);
33700 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
33710 65 33 5f 66 72 65 65 28 70 43 74 78 2d 3e 6c 6f  e3_free(pCtx->lo
33720 63 6b 50 72 6f 78 79 50 61 74 68 29 3b 0a 20 20  ckProxyPath);.  
33730 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
33740 43 74 78 2d 3e 63 6f 6e 63 68 46 69 6c 65 50 61  Ctx->conchFilePa
33750 74 68 29 3b 20 0a 20 20 20 20 73 71 6c 69 74 65  th); .    sqlite
33760 33 5f 66 72 65 65 28 70 43 74 78 29 3b 0a 20 20  3_free(pCtx);.  
33770 7d 0a 20 20 4f 53 54 52 41 43 45 33 28 22 54 52  }.  OSTRACE3("TR
33780 41 4e 53 50 52 4f 58 59 20 20 25 64 20 25 73 5c  ANSPROXY  %d %s\
33790 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 0a 20 20  n", pFile->h,.  
337a0 20 20 20 20 20 20 20 20 20 28 72 63 3d 3d 53 51           (rc==SQ
337b0 4c 49 54 45 5f 4f 4b 20 3f 20 22 6f 6b 22 20 3a  LITE_OK ? "ok" :
337c0 20 22 66 61 69 6c 65 64 22 29 29 3b 0a 20 20 72   "failed"));.  r
337d0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a  eturn rc;.}.../*
337e0 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
337f0 20 68 61 6e 64 6c 65 73 20 73 71 6c 69 74 65 33   handles sqlite3
33800 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 28 29 20  _file_control() 
33810 63 61 6c 6c 73 20 74 68 61 74 20 61 72 65 20 73  calls that are s
33820 70 65 63 69 66 69 63 0a 2a 2a 20 74 6f 20 70 72  pecific.** to pr
33830 6f 78 79 20 6c 6f 63 6b 69 6e 67 2e 0a 2a 2f 0a  oxy locking..*/.
33840 73 74 61 74 69 63 20 69 6e 74 20 70 72 6f 78 79  static int proxy
33850 46 69 6c 65 43 6f 6e 74 72 6f 6c 28 73 71 6c 69  FileControl(sqli
33860 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e  te3_file *id, in
33870 74 20 6f 70 2c 20 76 6f 69 64 20 2a 70 41 72 67  t op, void *pArg
33880 29 7b 0a 20 20 73 77 69 74 63 68 28 20 6f 70 20  ){.  switch( op 
33890 29 7b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  ){.    case SQLI
338a0 54 45 5f 47 45 54 5f 4c 4f 43 4b 50 52 4f 58 59  TE_GET_LOCKPROXY
338b0 46 49 4c 45 3a 20 7b 0a 20 20 20 20 20 20 75 6e  FILE: {.      un
338c0 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20  ixFile *pFile = 
338d0 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20  (unixFile*)id;. 
338e0 20 20 20 20 20 69 66 28 20 70 46 69 6c 65 2d 3e       if( pFile->
338f0 70 4d 65 74 68 6f 64 20 3d 3d 20 26 70 72 6f 78  pMethod == &prox
33900 79 49 6f 4d 65 74 68 6f 64 73 20 29 7b 0a 20 20  yIoMethods ){.  
33910 20 20 20 20 20 20 70 72 6f 78 79 4c 6f 63 6b 69        proxyLocki
33920 6e 67 43 6f 6e 74 65 78 74 20 2a 70 43 74 78 20  ngContext *pCtx 
33930 3d 20 28 70 72 6f 78 79 4c 6f 63 6b 69 6e 67 43  = (proxyLockingC
33940 6f 6e 74 65 78 74 2a 29 70 46 69 6c 65 2d 3e 6c  ontext*)pFile->l
33950 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 0a 20  ockingContext;. 
33960 20 20 20 20 20 20 20 70 72 6f 78 79 54 61 6b 65         proxyTake
33970 43 6f 6e 63 68 28 70 46 69 6c 65 29 3b 0a 20 20  Conch(pFile);.  
33980 20 20 20 20 20 20 69 66 28 20 70 43 74 78 2d 3e        if( pCtx->
33990 6c 6f 63 6b 50 72 6f 78 79 50 61 74 68 20 29 7b  lockProxyPath ){
339a0 0a 20 20 20 20 20 20 20 20 20 20 2a 28 63 6f 6e  .          *(con
339b0 73 74 20 63 68 61 72 20 2a 2a 29 70 41 72 67 20  st char **)pArg 
339c0 3d 20 70 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78  = pCtx->lockProx
339d0 79 50 61 74 68 3b 0a 20 20 20 20 20 20 20 20 7d  yPath;.        }
339e0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
339f0 2a 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 2a 29  *(const char **)
33a00 70 41 72 67 20 3d 20 22 3a 61 75 74 6f 3a 20 28  pArg = ":auto: (
33a10 6e 6f 74 20 68 65 6c 64 29 22 3b 0a 20 20 20 20  not held)";.    
33a20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 20 65 6c      }.      } el
33a30 73 65 20 7b 0a 20 20 20 20 20 20 20 20 2a 28 63  se {.        *(c
33a40 6f 6e 73 74 20 63 68 61 72 20 2a 2a 29 70 41 72  onst char **)pAr
33a50 67 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 20 20  g = NULL;.      
33a60 7d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  }.      return S
33a70 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a  QLITE_OK;.    }.
33a80 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
33a90 53 45 54 5f 4c 4f 43 4b 50 52 4f 58 59 46 49 4c  SET_LOCKPROXYFIL
33aa0 45 3a 20 7b 0a 20 20 20 20 20 20 75 6e 69 78 46  E: {.      unixF
33ab0 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e  ile *pFile = (un
33ac0 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 20 20  ixFile*)id;.    
33ad0 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
33ae0 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 69 6e 74 20  E_OK;.      int 
33af0 69 73 50 72 6f 78 79 53 74 79 6c 65 20 3d 20 28  isProxyStyle = (
33b00 70 46 69 6c 65 2d 3e 70 4d 65 74 68 6f 64 20 3d  pFile->pMethod =
33b10 3d 20 26 70 72 6f 78 79 49 6f 4d 65 74 68 6f 64  = &proxyIoMethod
33b20 73 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 41  s);.      if( pA
33b30 72 67 3d 3d 4e 55 4c 4c 20 7c 7c 20 28 63 6f 6e  rg==NULL || (con
33b40 73 74 20 63 68 61 72 20 2a 29 70 41 72 67 3d 3d  st char *)pArg==
33b50 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  0 ){.        if(
33b60 20 69 73 50 72 6f 78 79 53 74 79 6c 65 20 29 7b   isProxyStyle ){
33b70 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 74 75  .          /* tu
33b80 72 6e 20 6f 66 66 20 70 72 6f 78 79 20 6c 6f 63  rn off proxy loc
33b90 6b 69 6e 67 20 2d 20 6e 6f 74 20 73 75 70 70 6f  king - not suppo
33ba0 72 74 65 64 20 2a 2f 0a 20 20 20 20 20 20 20 20  rted */.        
33bb0 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52    rc = SQLITE_ER
33bc0 52 4f 52 20 2f 2a 53 51 4c 49 54 45 5f 50 52 4f  ROR /*SQLITE_PRO
33bd0 54 4f 43 4f 4c 3f 20 53 51 4c 49 54 45 5f 4d 49  TOCOL? SQLITE_MI
33be0 53 55 53 45 3f 2a 2f 3b 0a 20 20 20 20 20 20 20  SUSE?*/;.       
33bf0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
33c00 20 20 2f 2a 20 74 75 72 6e 20 6f 66 66 20 70 72    /* turn off pr
33c10 6f 78 79 20 6c 6f 63 6b 69 6e 67 20 2d 20 61 6c  oxy locking - al
33c20 72 65 61 64 79 20 6f 66 66 20 2d 20 4e 4f 4f 50  ready off - NOOP
33c30 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 72 63   */.          rc
33c40 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
33c50 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65        }.      }e
33c60 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 63 6f 6e  lse{.        con
33c70 73 74 20 63 68 61 72 20 2a 70 72 6f 78 79 50 61  st char *proxyPa
33c80 74 68 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72  th = (const char
33c90 20 2a 29 70 41 72 67 3b 0a 20 20 20 20 20 20 20   *)pArg;.       
33ca0 20 69 66 28 20 69 73 50 72 6f 78 79 53 74 79 6c   if( isProxyStyl
33cb0 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70  e ){.          p
33cc0 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65  roxyLockingConte
33cd0 78 74 20 2a 70 43 74 78 20 3d 20 0a 20 20 20 20  xt *pCtx = .    
33ce0 20 20 20 20 20 20 20 20 28 70 72 6f 78 79 4c 6f          (proxyLo
33cf0 63 6b 69 6e 67 43 6f 6e 74 65 78 74 2a 29 70 46  ckingContext*)pF
33d00 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74  ile->lockingCont
33d10 65 78 74 3b 0a 20 20 20 20 20 20 20 20 20 20 69  ext;.          i
33d20 66 28 20 21 73 74 72 63 6d 70 28 70 41 72 67 2c  f( !strcmp(pArg,
33d30 20 22 3a 61 75 74 6f 3a 22 29 20 0a 20 20 20 20   ":auto:") .    
33d40 20 20 20 20 20 20 20 7c 7c 20 28 70 43 74 78 2d         || (pCtx-
33d50 3e 6c 6f 63 6b 50 72 6f 78 79 50 61 74 68 20 26  >lockProxyPath &
33d60 26 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  &.              
33d70 20 21 73 74 72 6e 63 6d 70 28 70 43 74 78 2d 3e   !strncmp(pCtx->
33d80 6c 6f 63 6b 50 72 6f 78 79 50 61 74 68 2c 20 70  lockProxyPath, p
33d90 72 6f 78 79 50 61 74 68 2c 20 4d 41 58 50 41 54  roxyPath, MAXPAT
33da0 48 4c 45 4e 29 29 0a 20 20 20 20 20 20 20 20 20  HLEN)).         
33db0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
33dc0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
33dd0 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b            }else{
33de0 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20  .            rc 
33df0 3d 20 73 77 69 74 63 68 4c 6f 63 6b 50 72 6f 78  = switchLockProx
33e00 79 50 61 74 68 28 70 46 69 6c 65 2c 20 70 72 6f  yPath(pFile, pro
33e10 78 79 50 61 74 68 29 3b 0a 20 20 20 20 20 20 20  xyPath);.       
33e20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 65 6c     }.        }el
33e30 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a  se{.          /*
33e40 20 74 75 72 6e 20 6f 6e 20 70 72 6f 78 79 20 66   turn on proxy f
33e50 69 6c 65 20 6c 6f 63 6b 69 6e 67 20 2a 2f 0a 20  ile locking */. 
33e60 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 70 72           rc = pr
33e70 6f 78 79 54 72 61 6e 73 66 6f 72 6d 55 6e 69 78  oxyTransformUnix
33e80 46 69 6c 65 28 70 46 69 6c 65 2c 20 70 72 6f 78  File(pFile, prox
33e90 79 50 61 74 68 29 3b 0a 20 20 20 20 20 20 20 20  yPath);.        
33ea0 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
33eb0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
33ec0 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a  .    default: {.
33ed0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 30 20        assert( 0 
33ee0 29 3b 20 20 2f 2a 20 54 68 65 20 63 61 6c 6c 20  );  /* The call 
33ef0 61 73 73 75 72 65 73 20 74 68 61 74 20 6f 6e 6c  assures that onl
33f00 79 20 76 61 6c 69 64 20 6f 70 63 6f 64 65 73 20  y valid opcodes 
33f10 61 72 65 20 73 65 6e 74 20 2a 2f 0a 20 20 20 20  are sent */.    
33f20 7d 0a 20 20 7d 0a 20 20 2f 2a 4e 4f 54 52 45 41  }.  }.  /*NOTREA
33f30 43 48 45 44 2a 2f 0a 20 20 72 65 74 75 72 6e 20  CHED*/.  return 
33f40 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 7d 0a  SQLITE_ERROR;.}.
33f50 0a 2f 2a 0a 2a 2a 20 57 69 74 68 69 6e 20 74 68  ./*.** Within th
33f60 69 73 20 64 69 76 69 73 69 6f 6e 20 28 74 68 65  is division (the
33f70 20 70 72 6f 78 79 69 6e 67 20 6c 6f 63 6b 69 6e   proxying lockin
33f80 67 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  g implementation
33f90 29 20 74 68 65 20 70 72 6f 63 65 64 75 72 65 73  ) the procedures
33fa0 0a 2a 2a 20 61 62 6f 76 65 20 74 68 69 73 20 70  .** above this p
33fb0 6f 69 6e 74 20 61 72 65 20 61 6c 6c 20 75 74 69  oint are all uti
33fc0 6c 69 74 69 65 73 2e 20 20 54 68 65 20 6c 6f 63  lities.  The loc
33fd0 6b 2d 72 65 6c 61 74 65 64 20 6d 65 74 68 6f 64  k-related method
33fe0 73 20 6f 66 20 74 68 65 0a 2a 2a 20 70 72 6f 78  s of the.** prox
33ff0 79 2d 6c 6f 63 6b 69 6e 67 20 73 71 6c 69 74 65  y-locking sqlite
34000 33 5f 69 6f 5f 6d 65 74 68 6f 64 20 6f 62 6a 65  3_io_method obje
34010 63 74 20 66 6f 6c 6c 6f 77 2e 0a 2a 2f 0a 0a 0a  ct follow..*/...
34020 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
34030 6e 65 20 63 68 65 63 6b 73 20 69 66 20 74 68 65  ne checks if the
34040 72 65 20 69 73 20 61 20 52 45 53 45 52 56 45 44  re is a RESERVED
34050 20 6c 6f 63 6b 20 68 65 6c 64 20 6f 6e 20 74 68   lock held on th
34060 65 20 73 70 65 63 69 66 69 65 64 0a 2a 2a 20 66  e specified.** f
34070 69 6c 65 20 62 79 20 74 68 69 73 20 6f 72 20 61  ile by this or a
34080 6e 79 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73  ny other process
34090 2e 20 49 66 20 73 75 63 68 20 61 20 6c 6f 63 6b  . If such a lock
340a0 20 69 73 20 68 65 6c 64 2c 20 73 65 74 20 2a 70   is held, set *p
340b0 52 65 73 4f 75 74 0a 2a 2a 20 74 6f 20 61 20 6e  ResOut.** to a n
340c0 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75 65 20 6f 74  on-zero value ot
340d0 68 65 72 77 69 73 65 20 2a 70 52 65 73 4f 75 74  herwise *pResOut
340e0 20 69 73 20 73 65 74 20 74 6f 20 7a 65 72 6f 2e   is set to zero.
340f0 20 20 54 68 65 20 72 65 74 75 72 6e 20 76 61 6c    The return val
34100 75 65 0a 2a 2a 20 69 73 20 73 65 74 20 74 6f 20  ue.** is set to 
34110 53 51 4c 49 54 45 5f 4f 4b 20 75 6e 6c 65 73 73  SQLITE_OK unless
34120 20 61 6e 20 49 2f 4f 20 65 72 72 6f 72 20 6f 63   an I/O error oc
34130 63 75 72 73 20 64 75 72 69 6e 67 20 6c 6f 63 6b  curs during lock
34140 20 63 68 65 63 6b 69 6e 67 2e 0a 2a 2f 0a 73 74   checking..*/.st
34150 61 74 69 63 20 69 6e 74 20 70 72 6f 78 79 43 68  atic int proxyCh
34160 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 28  eckReservedLock(
34170 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64  sqlite3_file *id
34180 2c 20 69 6e 74 20 2a 70 52 65 73 4f 75 74 29 20  , int *pResOut) 
34190 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46  {.  unixFile *pF
341a0 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a  ile = (unixFile*
341b0 29 69 64 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20  )id;.  int rc = 
341c0 70 72 6f 78 79 54 61 6b 65 43 6f 6e 63 68 28 70  proxyTakeConch(p
341d0 46 69 6c 65 29 3b 0a 20 20 69 66 28 20 72 63 3d  File);.  if( rc=
341e0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
341f0 20 20 70 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f    proxyLockingCo
34200 6e 74 65 78 74 20 2a 70 43 74 78 20 3d 20 28 70  ntext *pCtx = (p
34210 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65  roxyLockingConte
34220 78 74 20 2a 29 70 46 69 6c 65 2d 3e 6c 6f 63 6b  xt *)pFile->lock
34230 69 6e 67 43 6f 6e 74 65 78 74 3b 0a 20 20 20 20  ingContext;.    
34240 69 66 28 20 70 43 74 78 2d 3e 63 6f 6e 63 68 48  if( pCtx->conchH
34250 65 6c 64 3e 30 20 29 7b 0a 20 20 20 20 20 20 75  eld>0 ){.      u
34260 6e 69 78 46 69 6c 65 20 2a 70 72 6f 78 79 20 3d  nixFile *proxy =
34270 20 70 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79   pCtx->lockProxy
34280 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 70  ;.      return p
34290 72 6f 78 79 2d 3e 70 4d 65 74 68 6f 64 2d 3e 78  roxy->pMethod->x
342a0 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63  CheckReservedLoc
342b0 6b 28 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a  k((sqlite3_file*
342c0 29 70 72 6f 78 79 2c 20 70 52 65 73 4f 75 74 29  )proxy, pResOut)
342d0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 20 2f 2a 20  ;.    }else{ /* 
342e0 63 6f 6e 63 68 48 65 6c 64 20 3c 20 30 20 69 73  conchHeld < 0 is
342f0 20 6c 6f 63 6b 6c 65 73 73 20 2a 2f 0a 20 20 20   lockless */.   
34300 20 20 20 70 52 65 73 4f 75 74 3d 30 3b 0a 20 20     pResOut=0;.  
34310 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
34320 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f   rc;.}../*.** Lo
34330 63 6b 20 74 68 65 20 66 69 6c 65 20 77 69 74 68  ck the file with
34340 20 74 68 65 20 6c 6f 63 6b 20 73 70 65 63 69 66   the lock specif
34350 69 65 64 20 62 79 20 70 61 72 61 6d 65 74 65 72  ied by parameter
34360 20 6c 6f 63 6b 74 79 70 65 20 2d 20 6f 6e 65 0a   locktype - one.
34370 2a 2a 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77  ** of the follow
34380 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28  ing:.**.**     (
34390 31 29 20 53 48 41 52 45 44 5f 4c 4f 43 4b 0a 2a  1) SHARED_LOCK.*
343a0 2a 20 20 20 20 20 28 32 29 20 52 45 53 45 52 56  *     (2) RESERV
343b0 45 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28  ED_LOCK.**     (
343c0 33 29 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 0a  3) PENDING_LOCK.
343d0 2a 2a 20 20 20 20 20 28 34 29 20 45 58 43 4c 55  **     (4) EXCLU
343e0 53 49 56 45 5f 4c 4f 43 4b 0a 2a 2a 0a 2a 2a 20  SIVE_LOCK.**.** 
343f0 53 6f 6d 65 74 69 6d 65 73 20 77 68 65 6e 20 72  Sometimes when r
34400 65 71 75 65 73 74 69 6e 67 20 6f 6e 65 20 6c 6f  equesting one lo
34410 63 6b 20 73 74 61 74 65 2c 20 61 64 64 69 74 69  ck state, additi
34420 6f 6e 61 6c 20 6c 6f 63 6b 20 73 74 61 74 65 73  onal lock states
34430 0a 2a 2a 20 61 72 65 20 69 6e 73 65 72 74 65 64  .** are inserted
34440 20 69 6e 20 62 65 74 77 65 65 6e 2e 20 20 54 68   in between.  Th
34450 65 20 6c 6f 63 6b 69 6e 67 20 6d 69 67 68 74 20  e locking might 
34460 66 61 69 6c 20 6f 6e 20 6f 6e 65 20 6f 66 20 74  fail on one of t
34470 68 65 20 6c 61 74 65 72 0a 2a 2a 20 74 72 61 6e  he later.** tran
34480 73 69 74 69 6f 6e 73 20 6c 65 61 76 69 6e 67 20  sitions leaving 
34490 74 68 65 20 6c 6f 63 6b 20 73 74 61 74 65 20 64  the lock state d
344a0 69 66 66 65 72 65 6e 74 20 66 72 6f 6d 20 77 68  ifferent from wh
344b0 61 74 20 69 74 20 73 74 61 72 74 65 64 20 62 75  at it started bu
344c0 74 0a 2a 2a 20 73 74 69 6c 6c 20 73 68 6f 72 74  t.** still short
344d0 20 6f 66 20 69 74 73 20 67 6f 61 6c 2e 20 20 54   of its goal.  T
344e0 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 68 61  he following cha
344f0 72 74 20 73 68 6f 77 73 20 74 68 65 20 61 6c 6c  rt shows the all
34500 6f 77 65 64 0a 2a 2a 20 74 72 61 6e 73 69 74 69  owed.** transiti
34510 6f 6e 73 20 61 6e 64 20 74 68 65 20 69 6e 73 65  ons and the inse
34520 72 74 65 64 20 69 6e 74 65 72 6d 65 64 69 61 74  rted intermediat
34530 65 20 73 74 61 74 65 73 3a 0a 2a 2a 0a 2a 2a 20  e states:.**.** 
34540 20 20 20 55 4e 4c 4f 43 4b 45 44 20 2d 3e 20 53     UNLOCKED -> S
34550 48 41 52 45 44 0a 2a 2a 20 20 20 20 53 48 41 52  HARED.**    SHAR
34560 45 44 20 2d 3e 20 52 45 53 45 52 56 45 44 0a 2a  ED -> RESERVED.*
34570 2a 20 20 20 20 53 48 41 52 45 44 20 2d 3e 20 28  *    SHARED -> (
34580 50 45 4e 44 49 4e 47 29 20 2d 3e 20 45 58 43 4c  PENDING) -> EXCL
34590 55 53 49 56 45 0a 2a 2a 20 20 20 20 52 45 53 45  USIVE.**    RESE
345a0 52 56 45 44 20 2d 3e 20 28 50 45 4e 44 49 4e 47  RVED -> (PENDING
345b0 29 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a  ) -> EXCLUSIVE.*
345c0 2a 20 20 20 20 50 45 4e 44 49 4e 47 20 2d 3e 20  *    PENDING -> 
345d0 45 58 43 4c 55 53 49 56 45 0a 2a 2a 0a 2a 2a 20  EXCLUSIVE.**.** 
345e0 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c  This routine wil
345f0 6c 20 6f 6e 6c 79 20 69 6e 63 72 65 61 73 65 20  l only increase 
34600 61 20 6c 6f 63 6b 2e 20 20 55 73 65 20 74 68 65  a lock.  Use the
34610 20 73 71 6c 69 74 65 33 4f 73 55 6e 6c 6f 63 6b   sqlite3OsUnlock
34620 28 29 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 74 6f  ().** routine to
34630 20 6c 6f 77 65 72 20 61 20 6c 6f 63 6b 69 6e 67   lower a locking
34640 20 6c 65 76 65 6c 2e 0a 2a 2f 0a 73 74 61 74 69   level..*/.stati
34650 63 20 69 6e 74 20 70 72 6f 78 79 4c 6f 63 6b 28  c int proxyLock(
34660 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64  sqlite3_file *id
34670 2c 20 69 6e 74 20 6c 6f 63 6b 74 79 70 65 29 20  , int locktype) 
34680 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46  {.  unixFile *pF
34690 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a  ile = (unixFile*
346a0 29 69 64 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20  )id;.  int rc = 
346b0 70 72 6f 78 79 54 61 6b 65 43 6f 6e 63 68 28 70  proxyTakeConch(p
346c0 46 69 6c 65 29 3b 0a 20 20 69 66 28 20 72 63 3d  File);.  if( rc=
346d0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
346e0 20 20 70 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f    proxyLockingCo
346f0 6e 74 65 78 74 20 2a 70 43 74 78 20 3d 20 28 70  ntext *pCtx = (p
34700 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65  roxyLockingConte
34710 78 74 20 2a 29 70 46 69 6c 65 2d 3e 6c 6f 63 6b  xt *)pFile->lock
34720 69 6e 67 43 6f 6e 74 65 78 74 3b 0a 20 20 20 20  ingContext;.    
34730 69 66 28 20 70 43 74 78 2d 3e 63 6f 6e 63 68 48  if( pCtx->conchH
34740 65 6c 64 3e 30 20 29 7b 0a 20 20 20 20 20 20 75  eld>0 ){.      u
34750 6e 69 78 46 69 6c 65 20 2a 70 72 6f 78 79 20 3d  nixFile *proxy =
34760 20 70 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79   pCtx->lockProxy
34770 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 72 6f  ;.      rc = pro
34780 78 79 2d 3e 70 4d 65 74 68 6f 64 2d 3e 78 4c 6f  xy->pMethod->xLo
34790 63 6b 28 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  ck((sqlite3_file
347a0 2a 29 70 72 6f 78 79 2c 20 6c 6f 63 6b 74 79 70  *)proxy, locktyp
347b0 65 29 3b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d  e);.      pFile-
347c0 3e 6c 6f 63 6b 74 79 70 65 20 3d 20 70 72 6f 78  >locktype = prox
347d0 79 2d 3e 6c 6f 63 6b 74 79 70 65 3b 0a 20 20 20  y->locktype;.   
347e0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a   }else{.      /*
347f0 20 63 6f 6e 63 68 48 65 6c 64 20 3c 20 30 20 69   conchHeld < 0 i
34800 73 20 6c 6f 63 6b 6c 65 73 73 20 2a 2f 0a 20 20  s lockless */.  
34810 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
34820 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 4c   rc;.}.../*.** L
34830 6f 77 65 72 20 74 68 65 20 6c 6f 63 6b 69 6e 67  ower the locking
34840 20 6c 65 76 65 6c 20 6f 6e 20 66 69 6c 65 20 64   level on file d
34850 65 73 63 72 69 70 74 6f 72 20 70 46 69 6c 65 20  escriptor pFile 
34860 74 6f 20 6c 6f 63 6b 74 79 70 65 2e 20 20 6c 6f  to locktype.  lo
34870 63 6b 74 79 70 65 0a 2a 2a 20 6d 75 73 74 20 62  cktype.** must b
34880 65 20 65 69 74 68 65 72 20 4e 4f 5f 4c 4f 43 4b  e either NO_LOCK
34890 20 6f 72 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2e   or SHARED_LOCK.
348a0 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6c 6f  .**.** If the lo
348b0 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 66 20 74  cking level of t
348c0 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  he file descript
348d0 6f 72 20 69 73 20 61 6c 72 65 61 64 79 20 61 74  or is already at
348e0 20 6f 72 20 62 65 6c 6f 77 0a 2a 2a 20 74 68 65   or below.** the
348f0 20 72 65 71 75 65 73 74 65 64 20 6c 6f 63 6b 69   requested locki
34900 6e 67 20 6c 65 76 65 6c 2c 20 74 68 69 73 20 72  ng level, this r
34910 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f  outine is a no-o
34920 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  p..*/.static int
34930 20 70 72 6f 78 79 55 6e 6c 6f 63 6b 28 73 71 6c   proxyUnlock(sql
34940 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69  ite3_file *id, i
34950 6e 74 20 6c 6f 63 6b 74 79 70 65 29 20 7b 0a 20  nt locktype) {. 
34960 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65   unixFile *pFile
34970 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64   = (unixFile*)id
34980 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 70 72 6f  ;.  int rc = pro
34990 78 79 54 61 6b 65 43 6f 6e 63 68 28 70 46 69 6c  xyTakeConch(pFil
349a0 65 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  e);.  if( rc==SQ
349b0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70  LITE_OK ){.    p
349c0 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65  roxyLockingConte
349d0 78 74 20 2a 70 43 74 78 20 3d 20 28 70 72 6f 78  xt *pCtx = (prox
349e0 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20  yLockingContext 
349f0 2a 29 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67  *)pFile->locking
34a00 43 6f 6e 74 65 78 74 3b 0a 20 20 20 20 69 66 28  Context;.    if(
34a10 20 70 43 74 78 2d 3e 63 6f 6e 63 68 48 65 6c 64   pCtx->conchHeld
34a20 3e 30 20 29 7b 0a 20 20 20 20 20 20 75 6e 69 78  >0 ){.      unix
34a30 46 69 6c 65 20 2a 70 72 6f 78 79 20 3d 20 70 43  File *proxy = pC
34a40 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 3b 0a 20  tx->lockProxy;. 
34a50 20 20 20 20 20 72 63 20 3d 20 70 72 6f 78 79 2d       rc = proxy-
34a60 3e 70 4d 65 74 68 6f 64 2d 3e 78 55 6e 6c 6f 63  >pMethod->xUnloc
34a70 6b 28 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a  k((sqlite3_file*
34a80 29 70 72 6f 78 79 2c 20 6c 6f 63 6b 74 79 70 65  )proxy, locktype
34a90 29 3b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e  );.      pFile->
34aa0 6c 6f 63 6b 74 79 70 65 20 3d 20 70 72 6f 78 79  locktype = proxy
34ab0 2d 3e 6c 6f 63 6b 74 79 70 65 3b 0a 20 20 20 20  ->locktype;.    
34ac0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20  }else{.      /* 
34ad0 63 6f 6e 63 68 48 65 6c 64 20 3c 20 30 20 69 73  conchHeld < 0 is
34ae0 20 6c 6f 63 6b 6c 65 73 73 20 2a 2f 0a 20 20 20   lockless */.   
34af0 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
34b00 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f  rc;.}../*.** Clo
34b10 73 65 20 61 20 66 69 6c 65 20 74 68 61 74 20 75  se a file that u
34b20 73 65 73 20 70 72 6f 78 79 20 6c 6f 63 6b 73 2e  ses proxy locks.
34b30 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
34b40 72 6f 78 79 43 6c 6f 73 65 28 73 71 6c 69 74 65  roxyClose(sqlite
34b50 33 5f 66 69 6c 65 20 2a 69 64 29 20 7b 0a 20 20  3_file *id) {.  
34b60 69 66 28 20 69 64 20 29 7b 0a 20 20 20 20 75 6e  if( id ){.    un
34b70 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20  ixFile *pFile = 
34b80 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20  (unixFile*)id;. 
34b90 20 20 20 70 72 6f 78 79 4c 6f 63 6b 69 6e 67 43     proxyLockingC
34ba0 6f 6e 74 65 78 74 20 2a 70 43 74 78 20 3d 20 28  ontext *pCtx = (
34bb0 70 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74  proxyLockingCont
34bc0 65 78 74 20 2a 29 70 46 69 6c 65 2d 3e 6c 6f 63  ext *)pFile->loc
34bd0 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 0a 20 20 20  kingContext;.   
34be0 20 75 6e 69 78 46 69 6c 65 20 2a 6c 6f 63 6b 50   unixFile *lockP
34bf0 72 6f 78 79 20 3d 20 70 43 74 78 2d 3e 6c 6f 63  roxy = pCtx->loc
34c00 6b 50 72 6f 78 79 3b 0a 20 20 20 20 75 6e 69 78  kProxy;.    unix
34c10 46 69 6c 65 20 2a 63 6f 6e 63 68 46 69 6c 65 20  File *conchFile 
34c20 3d 20 70 43 74 78 2d 3e 63 6f 6e 63 68 46 69 6c  = pCtx->conchFil
34c30 65 3b 0a 20 20 20 20 69 6e 74 20 72 63 20 3d 20  e;.    int rc = 
34c40 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 0a  SQLITE_OK;.    .
34c50 20 20 20 20 69 66 28 20 6c 6f 63 6b 50 72 6f 78      if( lockProx
34c60 79 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  y ){.      rc = 
34c70 6c 6f 63 6b 50 72 6f 78 79 2d 3e 70 4d 65 74 68  lockProxy->pMeth
34c80 6f 64 2d 3e 78 55 6e 6c 6f 63 6b 28 28 73 71 6c  od->xUnlock((sql
34c90 69 74 65 33 5f 66 69 6c 65 2a 29 6c 6f 63 6b 50  ite3_file*)lockP
34ca0 72 6f 78 79 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a  roxy, NO_LOCK);.
34cb0 20 20 20 20 20 20 69 66 28 20 72 63 20 29 20 72        if( rc ) r
34cc0 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
34cd0 72 63 20 3d 20 6c 6f 63 6b 50 72 6f 78 79 2d 3e  rc = lockProxy->
34ce0 70 4d 65 74 68 6f 64 2d 3e 78 43 6c 6f 73 65 28  pMethod->xClose(
34cf0 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29 6c  (sqlite3_file*)l
34d00 6f 63 6b 50 72 6f 78 79 29 3b 0a 20 20 20 20 20  ockProxy);.     
34d10 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
34d20 20 72 63 3b 0a 20 20 20 20 20 20 73 71 6c 69 74   rc;.      sqlit
34d30 65 33 5f 66 72 65 65 28 6c 6f 63 6b 50 72 6f 78  e3_free(lockProx
34d40 79 29 3b 0a 20 20 20 20 20 20 70 43 74 78 2d 3e  y);.      pCtx->
34d50 6c 6f 63 6b 50 72 6f 78 79 20 3d 20 30 3b 0a 20  lockProxy = 0;. 
34d60 20 20 20 7d 0a 20 20 20 20 69 66 28 20 63 6f 6e     }.    if( con
34d70 63 68 46 69 6c 65 20 29 7b 0a 20 20 20 20 20 20  chFile ){.      
34d80 69 66 28 20 70 43 74 78 2d 3e 63 6f 6e 63 68 48  if( pCtx->conchH
34d90 65 6c 64 20 29 7b 0a 20 20 20 20 20 20 20 20 72  eld ){.        r
34da0 63 20 3d 20 70 72 6f 78 79 52 65 6c 65 61 73 65  c = proxyRelease
34db0 43 6f 6e 63 68 28 70 46 69 6c 65 29 3b 0a 20 20  Conch(pFile);.  
34dc0 20 20 20 20 20 20 69 66 28 20 72 63 20 29 20 72        if( rc ) r
34dd0 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
34de0 7d 0a 20 20 20 20 20 20 72 63 20 3d 20 63 6f 6e  }.      rc = con
34df0 63 68 46 69 6c 65 2d 3e 70 4d 65 74 68 6f 64 2d  chFile->pMethod-
34e00 3e 78 43 6c 6f 73 65 28 28 73 71 6c 69 74 65 33  >xClose((sqlite3
34e10 5f 66 69 6c 65 2a 29 63 6f 6e 63 68 46 69 6c 65  _file*)conchFile
34e20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 20  );.      if( rc 
34e30 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20  ) return rc;.   
34e40 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
34e50 63 6f 6e 63 68 46 69 6c 65 29 3b 0a 20 20 20 20  conchFile);.    
34e60 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  }.    sqlite3_fr
34e70 65 65 28 70 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f  ee(pCtx->lockPro
34e80 78 79 50 61 74 68 29 3b 0a 20 20 20 20 73 71 6c  xyPath);.    sql
34e90 69 74 65 33 5f 66 72 65 65 28 70 43 74 78 2d 3e  ite3_free(pCtx->
34ea0 63 6f 6e 63 68 46 69 6c 65 50 61 74 68 29 3b 0a  conchFilePath);.
34eb0 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
34ec0 28 70 43 74 78 2d 3e 64 62 50 61 74 68 29 3b 0a  (pCtx->dbPath);.
34ed0 20 20 20 20 2f 2a 20 72 65 73 74 6f 72 65 20 74      /* restore t
34ee0 68 65 20 6f 72 69 67 69 6e 61 6c 20 6c 6f 63 6b  he original lock
34ef0 69 6e 67 20 63 6f 6e 74 65 78 74 20 61 6e 64 20  ing context and 
34f00 70 4d 65 74 68 6f 64 20 74 68 65 6e 20 63 6c 6f  pMethod then clo
34f10 73 65 20 69 74 20 2a 2f 0a 20 20 20 20 70 46 69  se it */.    pFi
34f20 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65  le->lockingConte
34f30 78 74 20 3d 20 70 43 74 78 2d 3e 6f 6c 64 4c 6f  xt = pCtx->oldLo
34f40 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 0a 20 20  ckingContext;.  
34f50 20 20 70 46 69 6c 65 2d 3e 70 4d 65 74 68 6f 64    pFile->pMethod
34f60 20 3d 20 70 43 74 78 2d 3e 70 4f 6c 64 4d 65 74   = pCtx->pOldMet
34f70 68 6f 64 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  hod;.    sqlite3
34f80 5f 66 72 65 65 28 70 43 74 78 29 3b 0a 20 20 20  _free(pCtx);.   
34f90 20 72 65 74 75 72 6e 20 70 46 69 6c 65 2d 3e 70   return pFile->p
34fa0 4d 65 74 68 6f 64 2d 3e 78 43 6c 6f 73 65 28 69  Method->xClose(i
34fb0 64 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  d);.  }.  return
34fc0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a   SQLITE_OK;.}...
34fd0 0a 23 65 6e 64 69 66 20 2f 2a 20 64 65 66 69 6e  .#endif /* defin
34fe0 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 26 26  ed(__APPLE__) &&
34ff0 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c   SQLITE_ENABLE_L
35000 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 2a 2f 0a  OCKING_STYLE */.
35010 2f 2a 0a 2a 2a 20 54 68 65 20 70 72 6f 78 79 20  /*.** The proxy 
35020 6c 6f 63 6b 69 6e 67 20 73 74 79 6c 65 20 69 73  locking style is
35030 20 69 6e 74 65 6e 64 65 64 20 66 6f 72 20 75 73   intended for us
35040 65 20 77 69 74 68 20 41 46 50 20 66 69 6c 65 73  e with AFP files
35050 79 73 74 65 6d 73 2e 0a 2a 2a 20 41 6e 64 20 73  ystems..** And s
35060 69 6e 63 65 20 41 46 50 20 69 73 20 6f 6e 6c 79  ince AFP is only
35070 20 73 75 70 70 6f 72 74 65 64 20 6f 6e 20 4d 61   supported on Ma
35080 63 4f 53 58 2c 20 74 68 65 20 70 72 6f 78 79 20  cOSX, the proxy 
35090 6c 6f 63 6b 69 6e 67 20 69 73 20 61 6c 73 6f 0a  locking is also.
350a0 2a 2a 20 72 65 73 74 72 69 63 74 65 64 20 74 6f  ** restricted to
350b0 20 4d 61 63 4f 53 58 2e 0a 2a 2a 20 0a 2a 2a 0a   MacOSX..** .**.
350c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
350d0 2a 2a 2a 20 45 6e 64 20 6f 66 20 74 68 65 20 70  *** End of the p
350e0 72 6f 78 79 20 6c 6f 63 6b 20 69 6d 70 6c 65 6d  roxy lock implem
350f0 65 6e 74 61 74 69 6f 6e 20 2a 2a 2a 2a 2a 2a 2a  entation *******
35100 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a  ***************.
35110 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
35120 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
35130 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
35140 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
35150 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a  **************/.
35160 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a  ./*.** Initializ
35170 65 20 74 68 65 20 6f 70 65 72 61 74 69 6e 67 20  e the operating 
35180 73 79 73 74 65 6d 20 69 6e 74 65 72 66 61 63 65  system interface
35190 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
351a0 74 69 6e 65 20 72 65 67 69 73 74 65 72 73 20 61  tine registers a
351b0 6c 6c 20 56 46 53 20 69 6d 70 6c 65 6d 65 6e 74  ll VFS implement
351c0 61 74 69 6f 6e 73 20 66 6f 72 20 75 6e 69 78 2d  ations for unix-
351d0 6c 69 6b 65 20 6f 70 65 72 61 74 69 6e 67 0a 2a  like operating.*
351e0 2a 20 73 79 73 74 65 6d 73 2e 20 20 54 68 69 73  * systems.  This
351f0 20 72 6f 75 74 69 6e 65 2c 20 61 6e 64 20 74 68   routine, and th
35200 65 20 73 71 6c 69 74 65 33 5f 6f 73 5f 65 6e 64  e sqlite3_os_end
35210 28 29 20 72 6f 75 74 69 6e 65 20 74 68 61 74 20  () routine that 
35220 66 6f 6c 6c 6f 77 73 2c 0a 2a 2a 20 73 68 6f 75  follows,.** shou
35230 6c 64 20 62 65 20 74 68 65 20 6f 6e 6c 79 20 72  ld be the only r
35240 6f 75 74 69 6e 65 73 20 69 6e 20 74 68 69 73 20  outines in this 
35250 66 69 6c 65 20 74 68 61 74 20 61 72 65 20 76 69  file that are vi
35260 73 69 62 6c 65 20 66 72 6f 6d 20 6f 74 68 65 72  sible from other
35270 0a 2a 2a 20 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a  .** files..**.**
35280 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
35290 20 63 61 6c 6c 65 64 20 6f 6e 63 65 20 64 75 72   called once dur
352a0 69 6e 67 20 53 51 4c 69 74 65 20 69 6e 69 74 69  ing SQLite initi
352b0 61 6c 69 7a 61 74 69 6f 6e 20 61 6e 64 20 62 79  alization and by
352c0 20 61 0a 2a 2a 20 73 69 6e 67 6c 65 20 74 68 72   a.** single thr
352d0 65 61 64 2e 20 20 54 68 65 20 6d 65 6d 6f 72 79  ead.  The memory
352e0 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 61 6e 64 20   allocation and 
352f0 6d 75 74 65 78 20 73 75 62 73 79 73 74 65 6d 73  mutex subsystems
35300 20 68 61 76 65 20 6e 6f 74 0a 2a 2a 20 6e 65 63   have not.** nec
35310 65 73 73 61 72 69 6c 79 20 62 65 65 6e 20 69 6e  essarily been in
35320 69 74 69 61 6c 69 7a 65 64 20 77 68 65 6e 20 74  itialized when t
35330 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
35340 61 6c 6c 65 64 2c 20 61 6e 64 20 73 6f 20 74 68  alled, and so th
35350 65 79 0a 2a 2a 20 73 68 6f 75 6c 64 20 6e 6f 74  ey.** should not
35360 20 62 65 20 75 73 65 64 2e 0a 2a 2f 0a 69 6e 74   be used..*/.int
35370 20 73 71 6c 69 74 65 33 5f 6f 73 5f 69 6e 69 74   sqlite3_os_init
35380 28 76 6f 69 64 29 7b 20 0a 20 20 2f 2a 20 0a 20  (void){ .  /* . 
35390 20 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e   ** The followin
353a0 67 20 6d 61 63 72 6f 20 64 65 66 69 6e 65 73 20  g macro defines 
353b0 61 6e 20 69 6e 69 74 69 61 6c 69 7a 65 72 20 66  an initializer f
353c0 6f 72 20 61 6e 20 73 71 6c 69 74 65 33 5f 76 66  or an sqlite3_vf
353d0 73 20 6f 62 6a 65 63 74 2e 0a 20 20 2a 2a 20 54  s object..  ** T
353e0 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 56  he name of the V
353f0 46 53 20 69 73 20 4e 41 4d 45 2e 20 20 54 68 65  FS is NAME.  The
35400 20 70 41 70 70 44 61 74 61 20 69 73 20 61 20 70   pAppData is a p
35410 6f 69 6e 74 65 72 20 74 6f 20 61 20 70 6f 69 6e  ointer to a poin
35420 74 65 72 0a 20 20 2a 2a 20 74 6f 20 74 68 65 20  ter.  ** to the 
35430 22 66 69 6e 64 65 72 22 20 66 75 6e 63 74 69 6f  "finder" functio
35440 6e 2e 20 20 28 70 41 70 70 44 61 74 61 20 69 73  n.  (pAppData is
35450 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20   a pointer to a 
35460 70 6f 69 6e 74 65 72 20 62 65 63 61 75 73 65 0a  pointer because.
35470 20 20 2a 2a 20 73 69 6c 6c 79 20 43 39 30 20 72    ** silly C90 r
35480 75 6c 65 73 20 70 72 6f 68 69 62 69 74 20 61 20  ules prohibit a 
35490 76 6f 69 64 2a 20 66 72 6f 6d 20 62 65 69 6e 67  void* from being
354a0 20 63 61 73 74 20 74 6f 20 61 20 66 75 6e 63 74   cast to a funct
354b0 69 6f 6e 20 70 6f 69 6e 74 65 72 0a 20 20 2a 2a  ion pointer.  **
354c0 20 61 6e 64 20 73 6f 20 77 65 20 68 61 76 65 20   and so we have 
354d0 74 6f 20 67 6f 20 74 68 72 6f 75 67 68 20 74 68  to go through th
354e0 65 20 69 6e 74 65 72 6d 65 64 69 61 74 65 20 70  e intermediate p
354f0 6f 69 6e 74 65 72 20 74 6f 20 61 76 6f 69 64 20  ointer to avoid 
35500 70 72 6f 62 6c 65 6d 73 0a 20 20 2a 2a 20 77 68  problems.  ** wh
35510 65 6e 20 63 6f 6d 70 69 6c 69 6e 67 20 77 69 74  en compiling wit
35520 68 20 2d 70 65 64 61 6e 74 69 63 2d 65 72 72 6f  h -pedantic-erro
35530 72 73 20 6f 6e 20 47 43 43 2e 29 0a 20 20 2a 2a  rs on GCC.).  **
35540 0a 20 20 2a 2a 20 54 68 65 20 46 49 4e 44 45 52  .  ** The FINDER
35550 20 70 61 72 61 6d 65 74 65 72 20 74 6f 20 74 68   parameter to th
35560 69 73 20 6d 61 63 72 6f 20 69 73 20 74 68 65 20  is macro is the 
35570 6e 61 6d 65 20 6f 66 20 74 68 65 20 70 6f 69 6e  name of the poin
35580 74 65 72 20 74 6f 20 74 68 65 0a 20 20 2a 2a 20  ter to the.  ** 
35590 66 69 6e 64 65 72 2d 66 75 6e 63 74 69 6f 6e 2e  finder-function.
355a0 20 20 54 68 65 20 66 69 6e 64 65 72 2d 66 75 6e    The finder-fun
355b0 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 61 20  ction returns a 
355c0 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 0a 20  pointer to the. 
355d0 20 2a 2a 20 73 71 6c 69 74 65 5f 69 6f 5f 6d 65   ** sqlite_io_me
355e0 74 68 6f 64 73 20 6f 62 6a 65 63 74 20 74 68 61  thods object tha
355f0 74 20 69 6d 70 6c 65 6d 65 6e 74 73 20 74 68 65  t implements the
35600 20 64 65 73 69 72 65 64 20 6c 6f 63 6b 69 6e 67   desired locking
35610 0a 20 20 2a 2a 20 62 65 68 61 76 69 6f 72 73 2e  .  ** behaviors.
35620 20 20 53 65 65 20 74 68 65 20 64 69 76 69 73 69    See the divisi
35630 6f 6e 20 61 62 6f 76 65 20 74 68 61 74 20 63 6f  on above that co
35640 6e 74 61 69 6e 73 20 74 68 65 20 49 4f 4d 45 54  ntains the IOMET
35650 48 4f 44 53 0a 20 20 2a 2a 20 6d 61 63 72 6f 20  HODS.  ** macro 
35660 66 6f 72 20 61 64 64 69 74 69 6f 6e 20 69 6e 66  for addition inf
35670 6f 72 6d 61 74 69 6f 6e 20 6f 6e 20 66 69 6e 64  ormation on find
35680 65 72 2d 66 75 6e 63 74 69 6f 6e 73 2e 0a 20 20  er-functions..  
35690 2a 2a 0a 20 20 2a 2a 20 4d 6f 73 74 20 66 69 6e  **.  ** Most fin
356a0 64 65 72 73 20 73 69 6d 70 6c 79 20 72 65 74 75  ders simply retu
356b0 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  rn a pointer to 
356c0 61 20 66 69 78 65 64 20 73 71 6c 69 74 65 33 5f  a fixed sqlite3_
356d0 69 6f 5f 6d 65 74 68 6f 64 73 0a 20 20 2a 2a 20  io_methods.  ** 
356e0 6f 62 6a 65 63 74 2e 20 20 42 75 74 20 74 68 65  object.  But the
356f0 20 22 61 75 74 6f 6c 6f 63 6b 49 6f 46 69 6e 64   "autolockIoFind
35700 65 72 22 20 61 76 61 69 6c 61 62 6c 65 20 6f 6e  er" available on
35710 20 4d 61 63 4f 53 58 20 64 6f 65 73 20 61 20 6c   MacOSX does a l
35720 69 74 74 6c 65 0a 20 20 2a 2a 20 6d 6f 72 65 20  ittle.  ** more 
35730 74 68 61 6e 20 74 68 61 74 3b 20 69 74 20 6c 6f  than that; it lo
35740 6f 6b 73 20 61 74 20 74 68 65 20 66 69 6c 65 73  oks at the files
35750 79 73 74 65 6d 20 74 79 70 65 20 74 68 61 74 20  ystem type that 
35760 68 6f 73 74 73 20 74 68 65 20 0a 20 20 2a 2a 20  hosts the .  ** 
35770 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 61 6e  database file an
35780 64 20 74 72 69 65 73 20 74 6f 20 63 68 6f 6f 73  d tries to choos
35790 65 20 61 6e 20 6c 6f 63 6b 69 6e 67 20 6d 65 74  e an locking met
357a0 68 6f 64 20 61 70 70 72 6f 70 72 69 61 74 65 20  hod appropriate 
357b0 66 6f 72 0a 20 20 2a 2a 20 74 68 61 74 20 66 69  for.  ** that fi
357c0 6c 65 73 79 73 74 65 6d 20 74 69 6d 65 2e 0a 20  lesystem time.. 
357d0 20 2a 2f 0a 20 20 23 64 65 66 69 6e 65 20 55 4e   */.  #define UN
357e0 49 58 56 46 53 28 56 46 53 4e 41 4d 45 2c 20 46  IXVFS(VFSNAME, F
357f0 49 4e 44 45 52 29 20 7b 20 20 20 20 20 20 20 20  INDER) {        
35800 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35810 5c 0a 20 20 20 20 32 2c 20 20 20 20 20 20 20 20  \.    2,        
35820 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 69              /* i
35830 56 65 72 73 69 6f 6e 20 2a 2f 20 20 20 20 20 20  Version */      
35840 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a                \.
35850 20 20 20 20 73 69 7a 65 6f 66 28 75 6e 69 78 46      sizeof(unixF
35860 69 6c 65 29 2c 20 20 20 20 20 2f 2a 20 73 7a 4f  ile),     /* szO
35870 73 46 69 6c 65 20 2a 2f 20 20 20 20 20 20 20 20  sFile */        
35880 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20              \.  
35890 20 20 4d 41 58 5f 50 41 54 48 4e 41 4d 45 2c 20    MAX_PATHNAME, 
358a0 20 20 20 20 20 20 20 20 2f 2a 20 6d 78 50 61 74          /* mxPat
358b0 68 6e 61 6d 65 20 2a 2f 20 20 20 20 20 20 20 20  hname */        
358c0 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 20            \.    
358d0 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0,              
358e0 20 20 20 20 20 20 2f 2a 20 70 4e 65 78 74 20 2a        /* pNext *
358f0 2f 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  /               
35900 20 20 20 20 20 20 20 20 5c 0a 20 20 20 20 56 46          \.    VF
35910 53 4e 41 4d 45 2c 20 20 20 20 20 20 20 20 20 20  SNAME,          
35920 20 20 20 20 2f 2a 20 7a 4e 61 6d 65 20 2a 2f 20      /* zName */ 
35930 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35940 20 20 20 20 20 20 5c 0a 20 20 20 20 28 76 6f 69        \.    (voi
35950 64 2a 29 26 46 49 4e 44 45 52 2c 20 20 20 20 20  d*)&FINDER,     
35960 20 20 2f 2a 20 70 41 70 70 44 61 74 61 20 2a 2f    /* pAppData */
35970 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35980 20 20 20 20 5c 0a 20 20 20 20 75 6e 69 78 4f 70      \.    unixOp
35990 65 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  en,             
359a0 2f 2a 20 78 4f 70 65 6e 20 2a 2f 20 20 20 20 20  /* xOpen */     
359b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
359c0 20 20 5c 0a 20 20 20 20 75 6e 69 78 44 65 6c 65    \.    unixDele
359d0 74 65 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  te,           /*
359e0 20 78 44 65 6c 65 74 65 20 2a 2f 20 20 20 20 20   xDelete */     
359f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35a00 5c 0a 20 20 20 20 75 6e 69 78 41 63 63 65 73 73  \.    unixAccess
35a10 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78  ,           /* x
35a20 41 63 63 65 73 73 20 2a 2f 20 20 20 20 20 20 20  Access */       
35a30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a                \.
35a40 20 20 20 20 75 6e 69 78 46 75 6c 6c 50 61 74 68      unixFullPath
35a50 6e 61 6d 65 2c 20 20 20 20 20 2f 2a 20 78 46 75  name,     /* xFu
35a60 6c 6c 50 61 74 68 6e 61 6d 65 20 2a 2f 20 20 20  llPathname */   
35a70 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20              \.  
35a80 20 20 75 6e 69 78 44 6c 4f 70 65 6e 2c 20 20 20    unixDlOpen,   
35a90 20 20 20 20 20 20 20 20 2f 2a 20 78 44 6c 4f 70          /* xDlOp
35aa0 65 6e 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20  en */           
35ab0 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 20            \.    
35ac0 75 6e 69 78 44 6c 45 72 72 6f 72 2c 20 20 20 20  unixDlError,    
35ad0 20 20 20 20 20 20 2f 2a 20 78 44 6c 45 72 72 6f        /* xDlErro
35ae0 72 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20  r */            
35af0 20 20 20 20 20 20 20 20 5c 0a 20 20 20 20 75 6e          \.    un
35b00 69 78 44 6c 53 79 6d 2c 20 20 20 20 20 20 20 20  ixDlSym,        
35b10 20 20 20 20 2f 2a 20 78 44 6c 53 79 6d 20 2a 2f      /* xDlSym */
35b20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35b30 20 20 20 20 20 20 5c 0a 20 20 20 20 75 6e 69 78        \.    unix
35b40 44 6c 43 6c 6f 73 65 2c 20 20 20 20 20 20 20 20  DlClose,        
35b50 20 20 2f 2a 20 78 44 6c 43 6c 6f 73 65 20 2a 2f    /* xDlClose */
35b60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35b70 20 20 20 20 5c 0a 20 20 20 20 75 6e 69 78 52 61      \.    unixRa
35b80 6e 64 6f 6d 6e 65 73 73 2c 20 20 20 20 20 20 20  ndomness,       
35b90 2f 2a 20 78 52 61 6e 64 6f 6d 6e 65 73 73 20 2a  /* xRandomness *
35ba0 2f 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  /               
35bb0 20 20 5c 0a 20 20 20 20 75 6e 69 78 53 6c 65 65    \.    unixSlee
35bc0 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  p,            /*
35bd0 20 78 53 6c 65 65 70 20 2a 2f 20 20 20 20 20 20   xSleep */      
35be0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35bf0 5c 0a 20 20 20 20 75 6e 69 78 43 75 72 72 65 6e  \.    unixCurren
35c00 74 54 69 6d 65 2c 20 20 20 20 20 20 2f 2a 20 78  tTime,      /* x
35c10 43 75 72 72 65 6e 74 54 69 6d 65 20 2a 2f 20 20  CurrentTime */  
35c20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a                \.
35c30 20 20 20 20 75 6e 69 78 47 65 74 4c 61 73 74 45      unixGetLastE
35c40 72 72 6f 72 2c 20 20 20 20 20 2f 2a 20 78 47 65  rror,     /* xGe
35c50 74 4c 61 73 74 45 72 72 6f 72 20 2a 2f 20 20 20  tLastError */   
35c60 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20              \.  
35c70 20 20 75 6e 69 78 53 68 6d 4f 70 65 6e 2c 20 20    unixShmOpen,  
35c80 20 20 20 20 20 20 20 20 2f 2a 20 78 53 68 6d 4f          /* xShmO
35c90 70 65 6e 20 2a 2f 20 20 20 20 20 20 20 20 20 20  pen */          
35ca0 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 20            \.    
35cb0 75 6e 69 78 53 68 6d 53 69 7a 65 2c 20 20 20 20  unixShmSize,    
35cc0 20 20 20 20 20 20 2f 2a 20 78 53 68 6d 53 69 7a        /* xShmSiz
35cd0 65 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20  e */            
35ce0 20 20 20 20 20 20 20 20 5c 0a 20 20 20 20 75 6e          \.    un
35cf0 69 78 53 68 6d 47 65 74 2c 20 20 20 20 20 20 20  ixShmGet,       
35d00 20 20 20 20 2f 2a 20 78 53 68 6d 47 65 74 20 2a      /* xShmGet *
35d10 2f 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  /               
35d20 20 20 20 20 20 20 5c 0a 20 20 20 20 75 6e 69 78        \.    unix
35d30 53 68 6d 52 65 6c 65 61 73 65 2c 20 20 20 20 20  ShmRelease,     
35d40 20 20 2f 2a 20 78 53 68 6d 52 65 6c 65 61 73 65    /* xShmRelease
35d50 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20 20   */             
35d60 20 20 20 20 5c 0a 20 20 20 20 75 6e 69 78 53 68      \.    unixSh
35d70 6d 4c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20  mLock,          
35d80 2f 2a 20 78 53 68 6d 4c 6f 63 6b 20 2a 2f 20 20  /* xShmLock */  
35d90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35da0 20 20 5c 0a 20 20 20 20 75 6e 69 78 53 68 6d 43    \.    unixShmC
35db0 6c 6f 73 65 2c 20 20 20 20 20 20 20 20 20 2f 2a  lose,         /*
35dc0 20 78 53 68 6d 43 6c 6f 73 65 20 2a 2f 20 20 20   xShmClose */   
35dd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35de0 5c 0a 20 20 20 20 30 2c 20 20 20 20 20 20 20 20  \.    0,        
35df0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
35e00 52 65 6e 61 6d 65 20 2a 2f 20 20 20 20 20 20 20  Rename */       
35e10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a                \.
35e20 20 20 20 20 75 6e 69 78 43 75 72 72 65 6e 74 54      unixCurrentT
35e30 69 6d 65 49 6e 74 36 34 2c 20 2f 2a 20 78 43 75  imeInt64, /* xCu
35e40 72 72 65 6e 74 54 69 6d 65 49 6e 74 36 34 20 2a  rrentTimeInt64 *
35e50 2f 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20  /           \.  
35e60 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 41 6c 6c  }..  /*.  ** All
35e70 20 64 65 66 61 75 6c 74 20 56 46 53 65 73 20 66   default VFSes f
35e80 6f 72 20 75 6e 69 78 20 61 72 65 20 63 6f 6e 74  or unix are cont
35e90 61 69 6e 65 64 20 69 6e 20 74 68 65 20 66 6f 6c  ained in the fol
35ea0 6c 6f 77 69 6e 67 20 61 72 72 61 79 2e 0a 20 20  lowing array..  
35eb0 2a 2a 0a 20 20 2a 2a 20 4e 6f 74 65 20 74 68 61  **.  ** Note tha
35ec0 74 20 74 68 65 20 73 71 6c 69 74 65 33 5f 76 66  t the sqlite3_vf
35ed0 73 2e 70 4e 65 78 74 20 66 69 65 6c 64 20 6f 66  s.pNext field of
35ee0 20 74 68 65 20 56 46 53 20 6f 62 6a 65 63 74 20   the VFS object 
35ef0 69 73 20 6d 6f 64 69 66 69 65 64 0a 20 20 2a 2a  is modified.  **
35f00 20 62 79 20 74 68 65 20 53 51 4c 69 74 65 20 63   by the SQLite c
35f10 6f 72 65 20 77 68 65 6e 20 74 68 65 20 56 46 53  ore when the VFS
35f20 20 69 73 20 72 65 67 69 73 74 65 72 65 64 2e 20   is registered. 
35f30 20 53 6f 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   So the followin
35f40 67 0a 20 20 2a 2a 20 61 72 72 61 79 20 63 61 6e  g.  ** array can
35f50 6e 6f 74 20 62 65 20 63 6f 6e 73 74 2e 0a 20 20  not be const..  
35f60 2a 2f 0a 20 20 73 74 61 74 69 63 20 73 71 6c 69  */.  static sqli
35f70 74 65 33 5f 76 66 73 20 61 56 66 73 5b 5d 20 3d  te3_vfs aVfs[] =
35f80 20 7b 0a 23 69 66 20 53 51 4c 49 54 45 5f 45 4e   {.#if SQLITE_EN
35f90 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59  ABLE_LOCKING_STY
35fa0 4c 45 20 26 26 20 28 4f 53 5f 56 58 57 4f 52 4b  LE && (OS_VXWORK
35fb0 53 20 7c 7c 20 64 65 66 69 6e 65 64 28 5f 5f 41  S || defined(__A
35fc0 50 50 4c 45 5f 5f 29 29 0a 20 20 20 20 55 4e 49  PPLE__)).    UNI
35fd0 58 56 46 53 28 22 75 6e 69 78 22 2c 20 20 20 20  XVFS("unix",    
35fe0 20 20 20 20 20 20 61 75 74 6f 6c 6f 63 6b 49 6f        autolockIo
35ff0 46 69 6e 64 65 72 20 29 2c 0a 23 65 6c 73 65 0a  Finder ),.#else.
36000 20 20 20 20 55 4e 49 58 56 46 53 28 22 75 6e 69      UNIXVFS("uni
36010 78 22 2c 20 20 20 20 20 20 20 20 20 20 70 6f 73  x",          pos
36020 69 78 49 6f 46 69 6e 64 65 72 20 29 2c 0a 23 65  ixIoFinder ),.#e
36030 6e 64 69 66 0a 20 20 20 20 55 4e 49 58 56 46 53  ndif.    UNIXVFS
36040 28 22 75 6e 69 78 2d 6e 6f 6e 65 22 2c 20 20 20  ("unix-none",   
36050 20 20 6e 6f 6c 6f 63 6b 49 6f 46 69 6e 64 65 72    nolockIoFinder
36060 20 29 2c 0a 20 20 20 20 55 4e 49 58 56 46 53 28   ),.    UNIXVFS(
36070 22 75 6e 69 78 2d 64 6f 74 66 69 6c 65 22 2c 20  "unix-dotfile", 
36080 20 64 6f 74 6c 6f 63 6b 49 6f 46 69 6e 64 65 72   dotlockIoFinder
36090 20 29 2c 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52   ),.#if OS_VXWOR
360a0 4b 53 0a 20 20 20 20 55 4e 49 58 56 46 53 28 22  KS.    UNIXVFS("
360b0 75 6e 69 78 2d 6e 61 6d 65 64 73 65 6d 22 2c 20  unix-namedsem", 
360c0 73 65 6d 49 6f 46 69 6e 64 65 72 20 29 2c 0a 23  semIoFinder ),.#
360d0 65 6e 64 69 66 0a 23 69 66 20 53 51 4c 49 54 45  endif.#if SQLITE
360e0 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f  _ENABLE_LOCKING_
360f0 53 54 59 4c 45 0a 20 20 20 20 55 4e 49 58 56 46  STYLE.    UNIXVF
36100 53 28 22 75 6e 69 78 2d 70 6f 73 69 78 22 2c 20  S("unix-posix", 
36110 20 20 20 70 6f 73 69 78 49 6f 46 69 6e 64 65 72     posixIoFinder
36120 20 29 2c 0a 23 69 66 20 21 4f 53 5f 56 58 57 4f   ),.#if !OS_VXWO
36130 52 4b 53 0a 20 20 20 20 55 4e 49 58 56 46 53 28  RKS.    UNIXVFS(
36140 22 75 6e 69 78 2d 66 6c 6f 63 6b 22 2c 20 20 20  "unix-flock",   
36150 20 66 6c 6f 63 6b 49 6f 46 69 6e 64 65 72 20 29   flockIoFinder )
36160 2c 0a 23 65 6e 64 69 66 0a 23 65 6e 64 69 66 0a  ,.#endif.#endif.
36170 23 69 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  #if SQLITE_ENABL
36180 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20  E_LOCKING_STYLE 
36190 26 26 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50  && defined(__APP
361a0 4c 45 5f 5f 29 0a 20 20 20 20 55 4e 49 58 56 46  LE__).    UNIXVF
361b0 53 28 22 75 6e 69 78 2d 61 66 70 22 2c 20 20 20  S("unix-afp",   
361c0 20 20 20 61 66 70 49 6f 46 69 6e 64 65 72 20 29     afpIoFinder )
361d0 2c 0a 20 20 20 20 55 4e 49 58 56 46 53 28 22 75  ,.    UNIXVFS("u
361e0 6e 69 78 2d 6e 66 73 22 2c 20 20 20 20 20 20 6e  nix-nfs",      n
361f0 66 73 49 6f 46 69 6e 64 65 72 20 29 2c 0a 20 20  fsIoFinder ),.  
36200 20 20 55 4e 49 58 56 46 53 28 22 75 6e 69 78 2d    UNIXVFS("unix-
36210 70 72 6f 78 79 22 2c 20 20 20 20 70 72 6f 78 79  proxy",    proxy
36220 49 6f 46 69 6e 64 65 72 20 29 2c 0a 23 65 6e 64  IoFinder ),.#end
36230 69 66 0a 20 20 7d 3b 0a 20 20 75 6e 73 69 67 6e  if.  };.  unsign
36240 65 64 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20  ed int i;       
36250 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74     /* Loop count
36260 65 72 20 2a 2f 0a 0a 20 20 2f 2a 20 52 65 67 69  er */..  /* Regi
36270 73 74 65 72 20 61 6c 6c 20 56 46 53 65 73 20 64  ster all VFSes d
36280 65 66 69 6e 65 64 20 69 6e 20 74 68 65 20 61 56  efined in the aV
36290 66 73 5b 5d 20 61 72 72 61 79 20 2a 2f 0a 20 20  fs[] array */.  
362a0 66 6f 72 28 69 3d 30 3b 20 69 3c 28 73 69 7a 65  for(i=0; i<(size
362b0 6f 66 28 61 56 66 73 29 2f 73 69 7a 65 6f 66 28  of(aVfs)/sizeof(
362c0 73 71 6c 69 74 65 33 5f 76 66 73 29 29 3b 20 69  sqlite3_vfs)); i
362d0 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  ++){.    sqlite3
362e0 5f 76 66 73 5f 72 65 67 69 73 74 65 72 28 26 61  _vfs_register(&a
362f0 56 66 73 5b 69 5d 2c 20 69 3d 3d 30 29 3b 0a 20  Vfs[i], i==0);. 
36300 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49   }.  return SQLI
36310 54 45 5f 4f 4b 3b 20 0a 7d 0a 0a 2f 2a 0a 2a 2a  TE_OK; .}../*.**
36320 20 53 68 75 74 64 6f 77 6e 20 74 68 65 20 6f 70   Shutdown the op
36330 65 72 61 74 69 6e 67 20 73 79 73 74 65 6d 20 69  erating system i
36340 6e 74 65 72 66 61 63 65 2e 0a 2a 2a 0a 2a 2a 20  nterface..**.** 
36350 53 6f 6d 65 20 6f 70 65 72 61 74 69 6e 67 20 73  Some operating s
36360 79 73 74 65 6d 73 20 6d 69 67 68 74 20 6e 65 65  ystems might nee
36370 64 20 74 6f 20 64 6f 20 73 6f 6d 65 20 63 6c 65  d to do some cle
36380 61 6e 75 70 20 69 6e 20 74 68 69 73 20 72 6f 75  anup in this rou
36390 74 69 6e 65 2c 0a 2a 2a 20 74 6f 20 72 65 6c 65  tine,.** to rele
363a0 61 73 65 20 64 79 6e 61 6d 69 63 61 6c 6c 79 20  ase dynamically 
363b0 61 6c 6c 6f 63 61 74 65 64 20 6f 62 6a 65 63 74  allocated object
363c0 73 2e 20 20 42 75 74 20 6e 6f 74 20 6f 6e 20 75  s.  But not on u
363d0 6e 69 78 2e 0a 2a 2a 20 54 68 69 73 20 72 6f 75  nix..** This rou
363e0 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 20  tine is a no-op 
363f0 66 6f 72 20 75 6e 69 78 2e 0a 2a 2f 0a 69 6e 74  for unix..*/.int
36400 20 73 71 6c 69 74 65 33 5f 6f 73 5f 65 6e 64 28   sqlite3_os_end(
36410 76 6f 69 64 29 7b 20 0a 20 20 72 65 74 75 72 6e  void){ .  return
36420 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 0a 7d 0a 20   SQLITE_OK; .}. 
36430 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
36440 45 5f 4f 53 5f 55 4e 49 58 20 2a 2f 0a           E_OS_UNIX */.