/ Hex Artifact Content
Login

Artifact 18ed6016685593e23c0e559804dd391a030dfb62:


0000: 2f 2a 0a 2a 2a 20 32 30 30 34 20 4d 61 79 20 32  /*.** 2004 May 2
0010: 32 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 75 74 68  2.**.** The auth
0020: 6f 72 20 64 69 73 63 6c 61 69 6d 73 20 63 6f 70  or disclaims cop
0030: 79 72 69 67 68 74 20 74 6f 20 74 68 69 73 20 73  yright to this s
0040: 6f 75 72 63 65 20 63 6f 64 65 2e 20 20 49 6e 20  ource code.  In 
0050: 70 6c 61 63 65 20 6f 66 0a 2a 2a 20 61 20 6c 65  place of.** a le
0060: 67 61 6c 20 6e 6f 74 69 63 65 2c 20 68 65 72 65  gal notice, here
0070: 20 69 73 20 61 20 62 6c 65 73 73 69 6e 67 3a 0a   is a blessing:.
0080: 2a 2a 0a 2a 2a 20 20 20 20 4d 61 79 20 79 6f 75  **.**    May you
0090: 20 64 6f 20 67 6f 6f 64 20 61 6e 64 20 6e 6f 74   do good and not
00a0: 20 65 76 69 6c 2e 0a 2a 2a 20 20 20 20 4d 61 79   evil..**    May
00b0: 20 79 6f 75 20 66 69 6e 64 20 66 6f 72 67 69 76   you find forgiv
00c0: 65 6e 65 73 73 20 66 6f 72 20 79 6f 75 72 73 65  eness for yourse
00d0: 6c 66 20 61 6e 64 20 66 6f 72 67 69 76 65 20 6f  lf and forgive o
00e0: 74 68 65 72 73 2e 0a 2a 2a 20 20 20 20 4d 61 79  thers..**    May
00f0: 20 79 6f 75 20 73 68 61 72 65 20 66 72 65 65 6c   you share freel
0100: 79 2c 20 6e 65 76 65 72 20 74 61 6b 69 6e 67 20  y, never taking 
0110: 6d 6f 72 65 20 74 68 61 6e 20 79 6f 75 20 67 69  more than you gi
0120: 76 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ve..**.*********
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 54 68 69 73  *****.**.** This
0180: 20 66 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 74   file contains t
0190: 68 65 20 56 46 53 20 69 6d 70 6c 65 6d 65 6e 74  he VFS implement
01a0: 61 74 69 6f 6e 20 66 6f 72 20 75 6e 69 78 2d 6c  ation for unix-l
01b0: 69 6b 65 20 6f 70 65 72 61 74 69 6e 67 20 73 79  ike operating sy
01c0: 73 74 65 6d 73 0a 2a 2a 20 69 6e 63 6c 75 64 65  stems.** include
01d0: 20 4c 69 6e 75 78 2c 20 4d 61 63 4f 53 58 2c 20   Linux, MacOSX, 
01e0: 2a 42 53 44 2c 20 51 4e 58 2c 20 56 78 57 6f 72  *BSD, QNX, VxWor
01f0: 6b 73 2c 20 41 49 58 2c 20 48 50 55 58 2c 20 61  ks, AIX, HPUX, a
0200: 6e 64 20 6f 74 68 65 72 73 2e 0a 2a 2a 0a 2a 2a  nd others..**.**
0210: 20 54 68 65 72 65 20 61 72 65 20 61 63 74 75 61   There are actua
0220: 6c 6c 79 20 73 65 76 65 72 61 6c 20 64 69 66 66  lly several diff
0230: 65 72 65 6e 74 20 56 46 53 20 69 6d 70 6c 65 6d  erent VFS implem
0240: 65 6e 74 61 74 69 6f 6e 73 20 69 6e 20 74 68 69  entations in thi
0250: 73 20 66 69 6c 65 2e 0a 2a 2a 20 54 68 65 20 64  s file..** The d
0260: 69 66 66 65 72 65 6e 63 65 73 20 61 72 65 20 69  ifferences are i
0270: 6e 20 74 68 65 20 77 61 79 20 74 68 61 74 20 66  n the way that f
0280: 69 6c 65 20 6c 6f 63 6b 69 6e 67 20 69 73 20 64  ile locking is d
0290: 6f 6e 65 2e 20 20 54 68 65 20 64 65 66 61 75 6c  one.  The defaul
02a0: 74 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 61 74  t.** implementat
02b0: 69 6f 6e 20 75 73 65 73 20 50 6f 73 69 78 20 41  ion uses Posix A
02c0: 64 76 69 73 6f 72 79 20 4c 6f 63 6b 73 2e 20 20  dvisory Locks.  
02d0: 41 6c 74 65 72 6e 61 74 69 76 65 20 69 6d 70 6c  Alternative impl
02e0: 65 6d 65 6e 74 61 74 69 6f 6e 73 0a 2a 2a 20 75  ementations.** u
02f0: 73 65 20 66 6c 6f 63 6b 28 29 2c 20 64 6f 74 2d  se flock(), dot-
0300: 66 69 6c 65 73 2c 20 76 61 72 69 6f 75 73 20 70  files, various p
0310: 72 6f 70 72 69 65 74 61 72 79 20 6c 6f 63 6b 69  roprietary locki
0320: 6e 67 20 73 63 68 65 6d 61 73 2c 20 6f 72 20 73  ng schemas, or s
0330: 69 6d 70 6c 79 0a 2a 2a 20 73 6b 69 70 20 6c 6f  imply.** skip lo
0340: 63 6b 69 6e 67 20 61 6c 6c 20 74 6f 67 65 74 68  cking all togeth
0350: 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 73  er..**.** This s
0360: 6f 75 72 63 65 20 66 69 6c 65 20 69 73 20 6f 72  ource file is or
0370: 67 61 6e 69 7a 65 64 20 69 6e 74 6f 20 64 69 76  ganized into div
0380: 69 73 69 6f 6e 73 20 77 68 65 72 65 20 74 68 65  isions where the
0390: 20 6c 6f 67 69 63 20 66 6f 72 20 76 61 72 69 6f   logic for vario
03a0: 75 73 0a 2a 2a 20 73 75 62 66 75 6e 63 74 69 6f  us.** subfunctio
03b0: 6e 73 20 69 73 20 63 6f 6e 74 61 69 6e 65 64 20  ns is contained 
03c0: 77 69 74 68 69 6e 20 74 68 65 20 61 70 70 72 6f  within the appro
03d0: 70 72 69 61 74 65 20 64 69 76 69 73 69 6f 6e 2e  priate division.
03e0: 20 20 50 4c 45 41 53 45 0a 2a 2a 20 4b 45 45 50    PLEASE.** KEEP
03f0: 20 54 48 45 20 53 54 52 55 43 54 55 52 45 20 4f   THE STRUCTURE O
0400: 46 20 54 48 49 53 20 46 49 4c 45 20 49 4e 54 41  F THIS FILE INTA
0410: 43 54 2e 20 20 4e 65 77 20 63 6f 64 65 20 73 68  CT.  New code sh
0420: 6f 75 6c 64 20 62 65 20 70 6c 61 63 65 64 0a 2a  ould be placed.*
0430: 2a 20 69 6e 20 74 68 65 20 63 6f 72 72 65 63 74  * in the correct
0440: 20 64 69 76 69 73 69 6f 6e 20 61 6e 64 20 73 68   division and sh
0450: 6f 75 6c 64 20 62 65 20 63 6c 65 61 72 6c 79 20  ould be clearly 
0460: 6c 61 62 65 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 54  labeled..**.** T
0470: 68 65 20 6c 61 79 6f 75 74 20 6f 66 20 64 69 76  he layout of div
0480: 69 73 69 6f 6e 73 20 69 73 20 61 73 20 66 6f 6c  isions is as fol
0490: 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20  lows:.**.**   * 
04a0: 20 47 65 6e 65 72 61 6c 2d 70 75 72 70 6f 73 65   General-purpose
04b0: 20 64 65 63 6c 61 72 61 74 69 6f 6e 73 20 61 6e   declarations an
04c0: 64 20 75 74 69 6c 69 74 79 20 66 75 6e 63 74 69  d utility functi
04d0: 6f 6e 73 2e 0a 2a 2a 20 20 20 2a 20 20 55 6e 69  ons..**   *  Uni
04e0: 71 75 65 20 66 69 6c 65 20 49 44 20 6c 6f 67 69  que file ID logi
04f0: 63 20 75 73 65 64 20 62 79 20 56 78 57 6f 72 6b  c used by VxWork
0500: 73 2e 0a 2a 2a 20 20 20 2a 20 20 56 61 72 69 6f  s..**   *  Vario
0510: 75 73 20 6c 6f 63 6b 69 6e 67 20 70 72 69 6d 69  us locking primi
0520: 74 69 76 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74  tive implementat
0530: 69 6f 6e 73 20 28 61 6c 6c 20 65 78 63 65 70 74  ions (all except
0540: 20 70 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 29 3a   proxy locking):
0550: 0a 2a 2a 20 20 20 20 20 20 2b 20 66 6f 72 20 50  .**      + for P
0560: 6f 73 69 78 20 41 64 76 69 73 6f 72 79 20 4c 6f  osix Advisory Lo
0570: 63 6b 73 0a 2a 2a 20 20 20 20 20 20 2b 20 66 6f  cks.**      + fo
0580: 72 20 6e 6f 2d 6f 70 20 6c 6f 63 6b 73 0a 2a 2a  r no-op locks.**
0590: 20 20 20 20 20 20 2b 20 66 6f 72 20 64 6f 74 2d        + for dot-
05a0: 66 69 6c 65 20 6c 6f 63 6b 73 0a 2a 2a 20 20 20  file locks.**   
05b0: 20 20 20 2b 20 66 6f 72 20 66 6c 6f 63 6b 28 29     + for flock()
05c0: 20 6c 6f 63 6b 69 6e 67 0a 2a 2a 20 20 20 20 20   locking.**     
05d0: 20 2b 20 66 6f 72 20 6e 61 6d 65 64 20 73 65 6d   + for named sem
05e0: 61 70 68 6f 72 65 20 6c 6f 63 6b 73 20 28 56 78  aphore locks (Vx
05f0: 57 6f 72 6b 73 20 6f 6e 6c 79 29 0a 2a 2a 20 20  Works only).**  
0600: 20 20 20 20 2b 20 66 6f 72 20 41 46 50 20 66 69      + for AFP fi
0610: 6c 65 73 79 73 74 65 6d 20 6c 6f 63 6b 73 20 28  lesystem locks (
0620: 4d 61 63 4f 53 58 20 6f 6e 6c 79 29 0a 2a 2a 20  MacOSX only).** 
0630: 20 20 2a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c    *  sqlite3_fil
0640: 65 20 6d 65 74 68 6f 64 73 20 6e 6f 74 20 61 73  e methods not as
0650: 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 6c 6f  sociated with lo
0660: 63 6b 69 6e 67 2e 0a 2a 2a 20 20 20 2a 20 20 44  cking..**   *  D
0670: 65 66 69 6e 69 74 69 6f 6e 73 20 6f 66 20 73 71  efinitions of sq
0680: 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73  lite3_io_methods
0690: 20 6f 62 6a 65 63 74 73 20 66 6f 72 20 61 6c 6c   objects for all
06a0: 20 6c 6f 63 6b 69 6e 67 0a 2a 2a 20 20 20 20 20   locking.**     
06b0: 20 6d 65 74 68 6f 64 73 20 70 6c 75 73 20 22 66   methods plus "f
06c0: 69 6e 64 65 72 22 20 66 75 6e 63 74 69 6f 6e 73  inder" functions
06d0: 20 66 6f 72 20 65 61 63 68 20 6c 6f 63 6b 69 6e   for each lockin
06e0: 67 20 6d 65 74 68 6f 64 2e 0a 2a 2a 20 20 20 2a  g method..**   *
06f0: 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 6d 65    sqlite3_vfs me
0700: 74 68 6f 64 20 69 6d 70 6c 65 6d 65 6e 74 61 74  thod implementat
0710: 69 6f 6e 73 2e 0a 2a 2a 20 20 20 2a 20 20 4c 6f  ions..**   *  Lo
0720: 63 6b 69 6e 67 20 70 72 69 6d 69 74 69 76 65 73  cking primitives
0730: 20 66 6f 72 20 74 68 65 20 70 72 6f 78 79 20 75   for the proxy u
0740: 62 65 72 2d 6c 6f 63 6b 69 6e 67 2d 6d 65 74 68  ber-locking-meth
0750: 6f 64 2e 20 28 4d 61 63 4f 53 58 20 6f 6e 6c 79  od. (MacOSX only
0760: 29 0a 2a 2a 20 20 20 2a 20 20 44 65 66 69 6e 69  ).**   *  Defini
0770: 74 69 6f 6e 73 20 6f 66 20 73 71 6c 69 74 65 33  tions of sqlite3
0780: 5f 76 66 73 20 6f 62 6a 65 63 74 73 20 66 6f 72  _vfs objects for
0790: 20 61 6c 6c 20 6c 6f 63 6b 69 6e 67 20 6d 65 74   all locking met
07a0: 68 6f 64 73 0a 2a 2a 20 20 20 20 20 20 70 6c 75  hods.**      plu
07b0: 73 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  s implementation
07c0: 73 20 6f 66 20 73 71 6c 69 74 65 33 5f 6f 73 5f  s of sqlite3_os_
07d0: 69 6e 69 74 28 29 20 61 6e 64 20 73 71 6c 69 74  init() and sqlit
07e0: 65 33 5f 6f 73 5f 65 6e 64 28 29 2e 0a 2a 2f 0a  e3_os_end()..*/.
07f0: 23 69 6e 63 6c 75 64 65 20 22 73 71 6c 69 74 65  #include "sqlite
0800: 49 6e 74 2e 68 22 0a 23 69 66 20 53 51 4c 49 54  Int.h".#if SQLIT
0810: 45 5f 4f 53 5f 55 4e 49 58 20 20 20 20 20 20 20  E_OS_UNIX       
0820: 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 66         /* This f
0830: 69 6c 65 20 69 73 20 75 73 65 64 20 6f 6e 20 75  ile is used on u
0840: 6e 69 78 20 6f 6e 6c 79 20 2a 2f 0a 0a 2f 2a 0a  nix only */../*.
0850: 2a 2a 20 54 68 65 72 65 20 61 72 65 20 76 61 72  ** There are var
0860: 69 6f 75 73 20 6d 65 74 68 6f 64 73 20 66 6f 72  ious methods for
0870: 20 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 20 75 73   file locking us
0880: 65 64 20 66 6f 72 20 63 6f 6e 63 75 72 72 65 6e  ed for concurren
0890: 63 79 0a 2a 2a 20 63 6f 6e 74 72 6f 6c 3a 0a 2a  cy.** control:.*
08a0: 2a 0a 2a 2a 20 20 20 31 2e 20 50 4f 53 49 58 20  *.**   1. POSIX 
08b0: 6c 6f 63 6b 69 6e 67 20 28 74 68 65 20 64 65 66  locking (the def
08c0: 61 75 6c 74 29 2c 0a 2a 2a 20 20 20 32 2e 20 4e  ault),.**   2. N
08d0: 6f 20 6c 6f 63 6b 69 6e 67 2c 0a 2a 2a 20 20 20  o locking,.**   
08e0: 33 2e 20 44 6f 74 2d 66 69 6c 65 20 6c 6f 63 6b  3. Dot-file lock
08f0: 69 6e 67 2c 0a 2a 2a 20 20 20 34 2e 20 66 6c 6f  ing,.**   4. flo
0900: 63 6b 28 29 20 6c 6f 63 6b 69 6e 67 2c 0a 2a 2a  ck() locking,.**
0910: 20 20 20 35 2e 20 41 46 50 20 6c 6f 63 6b 69 6e     5. AFP lockin
0920: 67 20 28 4f 53 58 20 6f 6e 6c 79 29 2c 0a 2a 2a  g (OSX only),.**
0930: 20 20 20 36 2e 20 4e 61 6d 65 64 20 50 4f 53 49     6. Named POSI
0940: 58 20 73 65 6d 61 70 68 6f 72 65 73 20 28 56 58  X semaphores (VX
0950: 57 6f 72 6b 73 20 6f 6e 6c 79 29 2c 0a 2a 2a 20  Works only),.** 
0960: 20 20 37 2e 20 70 72 6f 78 79 20 6c 6f 63 6b 69    7. proxy locki
0970: 6e 67 2e 20 28 4f 53 58 20 6f 6e 6c 79 29 0a 2a  ng. (OSX only).*
0980: 2a 0a 2a 2a 20 53 74 79 6c 65 73 20 34 2c 20 35  *.** Styles 4, 5
0990: 2c 20 61 6e 64 20 37 20 61 72 65 20 6f 6e 6c 79  , and 7 are only
09a0: 20 61 76 61 69 6c 61 62 6c 65 20 6f 66 20 53 51   available of SQ
09b0: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b  LITE_ENABLE_LOCK
09c0: 49 4e 47 5f 53 54 59 4c 45 0a 2a 2a 20 69 73 20  ING_STYLE.** is 
09d0: 64 65 66 69 6e 65 64 20 74 6f 20 31 2e 20 20 54  defined to 1.  T
09e0: 68 65 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  he SQLITE_ENABLE
09f0: 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 61  _LOCKING_STYLE a
0a00: 6c 73 6f 20 65 6e 61 62 6c 65 73 20 61 75 74 6f  lso enables auto
0a10: 6d 61 74 69 63 0a 2a 2a 20 73 65 6c 65 63 74 69  matic.** selecti
0a20: 6f 6e 20 6f 66 20 74 68 65 20 61 70 70 72 6f 70  on of the approp
0a30: 72 69 61 74 65 20 6c 6f 63 6b 69 6e 67 20 73 74  riate locking st
0a40: 79 6c 65 20 62 61 73 65 64 20 6f 6e 20 74 68 65  yle based on the
0a50: 20 66 69 6c 65 73 79 73 74 65 6d 0a 2a 2a 20 77   filesystem.** w
0a60: 68 65 72 65 20 74 68 65 20 64 61 74 61 62 61 73  here the databas
0a70: 65 20 69 73 20 6c 6f 63 61 74 65 64 2e 20 20 0a  e is located.  .
0a80: 2a 2f 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  */.#if !defined(
0a90: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f  SQLITE_ENABLE_LO
0aa0: 43 4b 49 4e 47 5f 53 54 59 4c 45 29 0a 23 20 20  CKING_STYLE).#  
0ab0: 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50  if defined(__APP
0ac0: 4c 45 5f 5f 29 0a 23 20 20 20 20 64 65 66 69 6e  LE__).#    defin
0ad0: 65 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  e SQLITE_ENABLE_
0ae0: 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 31 0a  LOCKING_STYLE 1.
0af0: 23 20 20 65 6c 73 65 0a 23 20 20 20 20 64 65 66  #  else.#    def
0b00: 69 6e 65 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  ine SQLITE_ENABL
0b10: 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20  E_LOCKING_STYLE 
0b20: 30 0a 23 20 20 65 6e 64 69 66 0a 23 65 6e 64 69  0.#  endif.#endi
0b30: 66 0a 0a 2f 2a 0a 2a 2a 20 44 65 66 69 6e 65 20  f../*.** Define 
0b40: 74 68 65 20 4f 53 5f 56 58 57 4f 52 4b 53 20 70  the OS_VXWORKS p
0b50: 72 65 2d 70 72 6f 63 65 73 73 6f 72 20 6d 61 63  re-processor mac
0b60: 72 6f 20 74 6f 20 31 20 69 66 20 62 75 69 6c 64  ro to 1 if build
0b70: 69 6e 67 20 6f 6e 20 0a 2a 2a 20 76 78 77 6f 72  ing on .** vxwor
0b80: 6b 73 2c 20 6f 72 20 30 20 6f 74 68 65 72 77 69  ks, or 0 otherwi
0b90: 73 65 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 4f  se..*/.#ifndef O
0ba0: 53 5f 56 58 57 4f 52 4b 53 0a 23 20 20 69 66 20  S_VXWORKS.#  if 
0bb0: 64 65 66 69 6e 65 64 28 5f 5f 52 54 50 5f 5f 29  defined(__RTP__)
0bc0: 20 7c 7c 20 64 65 66 69 6e 65 64 28 5f 57 52 53   || defined(_WRS
0bd0: 5f 4b 45 52 4e 45 4c 29 0a 23 20 20 20 20 64 65  _KERNEL).#    de
0be0: 66 69 6e 65 20 4f 53 5f 56 58 57 4f 52 4b 53 20  fine OS_VXWORKS 
0bf0: 31 0a 23 20 20 65 6c 73 65 0a 23 20 20 20 20 64  1.#  else.#    d
0c00: 65 66 69 6e 65 20 4f 53 5f 56 58 57 4f 52 4b 53  efine OS_VXWORKS
0c10: 20 30 0a 23 20 20 65 6e 64 69 66 0a 23 65 6e 64   0.#  endif.#end
0c20: 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 73 65 20  if../*.** These 
0c30: 23 64 65 66 69 6e 65 73 20 73 68 6f 75 6c 64 20  #defines should 
0c40: 65 6e 61 62 6c 65 20 3e 32 47 42 20 66 69 6c 65  enable >2GB file
0c50: 20 73 75 70 70 6f 72 74 20 6f 6e 20 50 6f 73 69   support on Posi
0c60: 78 20 69 66 20 74 68 65 0a 2a 2a 20 75 6e 64 65  x if the.** unde
0c70: 72 6c 79 69 6e 67 20 6f 70 65 72 61 74 69 6e 67  rlying operating
0c80: 20 73 79 73 74 65 6d 20 73 75 70 70 6f 72 74 73   system supports
0c90: 20 69 74 2e 20 20 49 66 20 74 68 65 20 4f 53 20   it.  If the OS 
0ca0: 6c 61 63 6b 73 0a 2a 2a 20 6c 61 72 67 65 20 66  lacks.** large f
0cb0: 69 6c 65 20 73 75 70 70 6f 72 74 2c 20 74 68 65  ile support, the
0cc0: 73 65 20 73 68 6f 75 6c 64 20 62 65 20 6e 6f 2d  se should be no-
0cd0: 6f 70 73 2e 0a 2a 2a 0a 2a 2a 20 4c 61 72 67 65  ops..**.** Large
0ce0: 20 66 69 6c 65 20 73 75 70 70 6f 72 74 20 63 61   file support ca
0cf0: 6e 20 62 65 20 64 69 73 61 62 6c 65 64 20 75 73  n be disabled us
0d00: 69 6e 67 20 74 68 65 20 2d 44 53 51 4c 49 54 45  ing the -DSQLITE
0d10: 5f 44 49 53 41 42 4c 45 5f 4c 46 53 20 73 77 69  _DISABLE_LFS swi
0d20: 74 63 68 0a 2a 2a 20 6f 6e 20 74 68 65 20 63 6f  tch.** on the co
0d30: 6d 70 69 6c 65 72 20 63 6f 6d 6d 61 6e 64 20 6c  mpiler command l
0d40: 69 6e 65 2e 20 20 54 68 69 73 20 69 73 20 6e 65  ine.  This is ne
0d50: 63 65 73 73 61 72 79 20 69 66 20 79 6f 75 20 61  cessary if you a
0d60: 72 65 20 63 6f 6d 70 69 6c 69 6e 67 0a 2a 2a 20  re compiling.** 
0d70: 6f 6e 20 61 20 72 65 63 65 6e 74 20 6d 61 63 68  on a recent mach
0d80: 69 6e 65 20 28 65 78 3a 20 52 65 64 48 61 74 20  ine (ex: RedHat 
0d90: 37 2e 32 29 20 62 75 74 20 79 6f 75 20 77 61 6e  7.2) but you wan
0da0: 74 20 79 6f 75 72 20 63 6f 64 65 20 74 6f 20 77  t your code to w
0db0: 6f 72 6b 0a 2a 2a 20 6f 6e 20 61 6e 20 6f 6c 64  ork.** on an old
0dc0: 65 72 20 6d 61 63 68 69 6e 65 20 28 65 78 3a 20  er machine (ex: 
0dd0: 52 65 64 48 61 74 20 36 2e 30 29 2e 20 20 49 66  RedHat 6.0).  If
0de0: 20 79 6f 75 20 63 6f 6d 70 69 6c 65 20 6f 6e 20   you compile on 
0df0: 52 65 64 48 61 74 20 37 2e 32 0a 2a 2a 20 77 69  RedHat 7.2.** wi
0e00: 74 68 6f 75 74 20 74 68 69 73 20 6f 70 74 69 6f  thout this optio
0e10: 6e 2c 20 4c 46 53 20 69 73 20 65 6e 61 62 6c 65  n, LFS is enable
0e20: 2e 20 20 42 75 74 20 4c 46 53 20 64 6f 65 73 20  .  But LFS does 
0e30: 6e 6f 74 20 65 78 69 73 74 20 69 6e 20 74 68 65  not exist in the
0e40: 20 6b 65 72 6e 65 6c 0a 2a 2a 20 69 6e 20 52 65   kernel.** in Re
0e50: 64 48 61 74 20 36 2e 30 2c 20 73 6f 20 74 68 65  dHat 6.0, so the
0e60: 20 63 6f 64 65 20 77 6f 6e 27 74 20 77 6f 72 6b   code won't work
0e70: 2e 20 20 48 65 6e 63 65 2c 20 66 6f 72 20 6d 61  .  Hence, for ma
0e80: 78 69 6d 75 6d 20 62 69 6e 61 72 79 0a 2a 2a 20  ximum binary.** 
0e90: 70 6f 72 74 61 62 69 6c 69 74 79 20 79 6f 75 20  portability you 
0ea0: 73 68 6f 75 6c 64 20 6f 6d 69 74 20 4c 46 53 2e  should omit LFS.
0eb0: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 72 65 76 69  .**.** The previ
0ec0: 6f 75 73 20 70 61 72 61 67 72 61 70 68 20 77 61  ous paragraph wa
0ed0: 73 20 77 72 69 74 74 65 6e 20 69 6e 20 32 30 30  s written in 200
0ee0: 35 2e 20 20 28 54 68 69 73 20 70 61 72 61 67 72  5.  (This paragr
0ef0: 61 70 68 20 69 73 20 77 72 69 74 74 65 6e 0a 2a  aph is written.*
0f00: 2a 20 6f 6e 20 32 30 30 38 2d 31 31 2d 32 38 2e  * on 2008-11-28.
0f10: 29 20 54 68 65 73 65 20 64 61 79 73 2c 20 61 6c  ) These days, al
0f20: 6c 20 4c 69 6e 75 78 20 6b 65 72 6e 65 6c 73 20  l Linux kernels 
0f30: 73 75 70 70 6f 72 74 20 6c 61 72 67 65 20 66 69  support large fi
0f40: 6c 65 73 2c 20 73 6f 0a 2a 2a 20 79 6f 75 20 73  les, so.** you s
0f50: 68 6f 75 6c 64 20 70 72 6f 62 61 62 6c 79 20 6c  hould probably l
0f60: 65 61 76 65 20 4c 46 53 20 65 6e 61 62 6c 65 64  eave LFS enabled
0f70: 2e 20 20 42 75 74 20 73 6f 6d 65 20 65 6d 62 65  .  But some embe
0f80: 64 64 65 64 20 70 6c 61 74 66 6f 72 6d 73 20 6d  dded platforms m
0f90: 69 67 68 74 0a 2a 2a 20 6c 61 63 6b 20 4c 46 53  ight.** lack LFS
0fa0: 20 69 6e 20 77 68 69 63 68 20 63 61 73 65 20 74   in which case t
0fb0: 68 65 20 53 51 4c 49 54 45 5f 44 49 53 41 42 4c  he SQLITE_DISABL
0fc0: 45 5f 4c 46 53 20 6d 61 63 72 6f 20 6d 69 67 68  E_LFS macro migh
0fd0: 74 20 73 74 69 6c 6c 20 62 65 20 75 73 65 66 75  t still be usefu
0fe0: 6c 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51  l..*/.#ifndef SQ
0ff0: 4c 49 54 45 5f 44 49 53 41 42 4c 45 5f 4c 46 53  LITE_DISABLE_LFS
1000: 0a 23 20 64 65 66 69 6e 65 20 5f 4c 41 52 47 45  .# define _LARGE
1010: 5f 46 49 4c 45 20 20 20 20 20 20 20 31 0a 23 20  _FILE       1.# 
1020: 69 66 6e 64 65 66 20 5f 46 49 4c 45 5f 4f 46 46  ifndef _FILE_OFF
1030: 53 45 54 5f 42 49 54 53 0a 23 20 20 20 64 65 66  SET_BITS.#   def
1040: 69 6e 65 20 5f 46 49 4c 45 5f 4f 46 46 53 45 54  ine _FILE_OFFSET
1050: 5f 42 49 54 53 20 36 34 0a 23 20 65 6e 64 69 66  _BITS 64.# endif
1060: 0a 23 20 64 65 66 69 6e 65 20 5f 4c 41 52 47 45  .# define _LARGE
1070: 46 49 4c 45 5f 53 4f 55 52 43 45 20 31 0a 23 65  FILE_SOURCE 1.#e
1080: 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 73 74 61 6e  ndif../*.** stan
1090: 64 61 72 64 20 69 6e 63 6c 75 64 65 20 66 69 6c  dard include fil
10a0: 65 73 2e 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65 20  es..*/.#include 
10b0: 3c 73 79 73 2f 74 79 70 65 73 2e 68 3e 0a 23 69  <sys/types.h>.#i
10c0: 6e 63 6c 75 64 65 20 3c 73 79 73 2f 73 74 61 74  nclude <sys/stat
10d0: 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 66 63  .h>.#include <fc
10e0: 6e 74 6c 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20  ntl.h>.#include 
10f0: 3c 75 6e 69 73 74 64 2e 68 3e 0a 23 69 6e 63 6c  <unistd.h>.#incl
1100: 75 64 65 20 3c 74 69 6d 65 2e 68 3e 0a 23 69 6e  ude <time.h>.#in
1110: 63 6c 75 64 65 20 3c 73 79 73 2f 74 69 6d 65 2e  clude <sys/time.
1120: 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 65 72 72  h>.#include <err
1130: 6e 6f 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c  no.h>.#include <
1140: 73 79 73 2f 6d 6d 61 6e 2e 68 3e 0a 0a 23 69 66  sys/mman.h>..#if
1150: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c   SQLITE_ENABLE_L
1160: 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 23 20 69  OCKING_STYLE.# i
1170: 6e 63 6c 75 64 65 20 3c 73 79 73 2f 69 6f 63 74  nclude <sys/ioct
1180: 6c 2e 68 3e 0a 23 20 69 66 20 4f 53 5f 56 58 57  l.h>.# if OS_VXW
1190: 4f 52 4b 53 0a 23 20 20 69 6e 63 6c 75 64 65 20  ORKS.#  include 
11a0: 3c 73 65 6d 61 70 68 6f 72 65 2e 68 3e 0a 23 20  <semaphore.h>.# 
11b0: 20 69 6e 63 6c 75 64 65 20 3c 6c 69 6d 69 74 73   include <limits
11c0: 2e 68 3e 0a 23 20 65 6c 73 65 0a 23 20 20 69 6e  .h>.# else.#  in
11d0: 63 6c 75 64 65 20 3c 73 79 73 2f 66 69 6c 65 2e  clude <sys/file.
11e0: 68 3e 0a 23 20 20 69 6e 63 6c 75 64 65 20 3c 73  h>.#  include <s
11f0: 79 73 2f 70 61 72 61 6d 2e 68 3e 0a 23 20 65 6e  ys/param.h>.# en
1200: 64 69 66 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  dif.#endif /* SQ
1210: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b  LITE_ENABLE_LOCK
1220: 49 4e 47 5f 53 54 59 4c 45 20 2a 2f 0a 0a 23 69  ING_STYLE */..#i
1230: 66 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c  f defined(__APPL
1240: 45 5f 5f 29 20 7c 7c 20 28 53 51 4c 49 54 45 5f  E__) || (SQLITE_
1250: 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53  ENABLE_LOCKING_S
1260: 54 59 4c 45 20 26 26 20 21 4f 53 5f 56 58 57 4f  TYLE && !OS_VXWO
1270: 52 4b 53 29 0a 23 20 69 6e 63 6c 75 64 65 20 3c  RKS).# include <
1280: 73 79 73 2f 6d 6f 75 6e 74 2e 68 3e 0a 23 65 6e  sys/mount.h>.#en
1290: 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 77  dif../*.** Allow
12a0: 65 64 20 76 61 6c 75 65 73 20 6f 66 20 75 6e 69  ed values of uni
12b0: 78 46 69 6c 65 2e 66 73 46 6c 61 67 73 0a 2a 2f  xFile.fsFlags.*/
12c0: 0a 23 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f  .#define SQLITE_
12d0: 46 53 46 4c 41 47 53 5f 49 53 5f 4d 53 44 4f 53  FSFLAGS_IS_MSDOS
12e0: 20 20 20 20 20 30 78 31 0a 0a 2f 2a 0a 2a 2a 20       0x1../*.** 
12f0: 49 66 20 77 65 20 61 72 65 20 74 6f 20 62 65 20  If we are to be 
1300: 74 68 72 65 61 64 2d 73 61 66 65 2c 20 69 6e 63  thread-safe, inc
1310: 6c 75 64 65 20 74 68 65 20 70 74 68 72 65 61 64  lude the pthread
1320: 73 20 68 65 61 64 65 72 20 61 6e 64 20 64 65 66  s header and def
1330: 69 6e 65 0a 2a 2a 20 74 68 65 20 53 51 4c 49 54  ine.** the SQLIT
1340: 45 5f 55 4e 49 58 5f 54 48 52 45 41 44 53 20 6d  E_UNIX_THREADS m
1350: 61 63 72 6f 2e 0a 2a 2f 0a 23 69 66 20 53 51 4c  acro..*/.#if SQL
1360: 49 54 45 5f 54 48 52 45 41 44 53 41 46 45 0a 23  ITE_THREADSAFE.#
1370: 20 69 6e 63 6c 75 64 65 20 3c 70 74 68 72 65 61   include <pthrea
1380: 64 2e 68 3e 0a 23 20 64 65 66 69 6e 65 20 53 51  d.h>.# define SQ
1390: 4c 49 54 45 5f 55 4e 49 58 5f 54 48 52 45 41 44  LITE_UNIX_THREAD
13a0: 53 20 31 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  S 1.#endif../*.*
13b0: 2a 20 44 65 66 61 75 6c 74 20 70 65 72 6d 69 73  * Default permis
13c0: 73 69 6f 6e 73 20 77 68 65 6e 20 63 72 65 61 74  sions when creat
13d0: 69 6e 67 20 61 20 6e 65 77 20 66 69 6c 65 0a 2a  ing a new file.*
13e0: 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
13f0: 5f 44 45 46 41 55 4c 54 5f 46 49 4c 45 5f 50 45  _DEFAULT_FILE_PE
1400: 52 4d 49 53 53 49 4f 4e 53 0a 23 20 64 65 66 69  RMISSIONS.# defi
1410: 6e 65 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c  ne SQLITE_DEFAUL
1420: 54 5f 46 49 4c 45 5f 50 45 52 4d 49 53 53 49 4f  T_FILE_PERMISSIO
1430: 4e 53 20 30 36 34 34 0a 23 65 6e 64 69 66 0a 0a  NS 0644.#endif..
1440: 2f 2a 0a 20 2a 2a 20 44 65 66 61 75 6c 74 20 70  /*. ** Default p
1450: 65 72 6d 69 73 73 69 6f 6e 73 20 77 68 65 6e 20  ermissions when 
1460: 63 72 65 61 74 69 6e 67 20 61 75 74 6f 20 70 72  creating auto pr
1470: 6f 78 79 20 64 69 72 0a 20 2a 2f 0a 23 69 66 6e  oxy dir. */.#ifn
1480: 64 65 66 20 53 51 4c 49 54 45 5f 44 45 46 41 55  def SQLITE_DEFAU
1490: 4c 54 5f 50 52 4f 58 59 44 49 52 5f 50 45 52 4d  LT_PROXYDIR_PERM
14a0: 49 53 53 49 4f 4e 53 0a 23 20 64 65 66 69 6e 65  ISSIONS.# define
14b0: 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f   SQLITE_DEFAULT_
14c0: 50 52 4f 58 59 44 49 52 5f 50 45 52 4d 49 53 53  PROXYDIR_PERMISS
14d0: 49 4f 4e 53 20 30 37 35 35 0a 23 65 6e 64 69 66  IONS 0755.#endif
14e0: 0a 0a 2f 2a 0a 2a 2a 20 4d 61 78 69 6d 75 6d 20  ../*.** Maximum 
14f0: 73 75 70 70 6f 72 74 65 64 20 70 61 74 68 2d 6c  supported path-l
1500: 65 6e 67 74 68 2e 0a 2a 2f 0a 23 64 65 66 69 6e  ength..*/.#defin
1510: 65 20 4d 41 58 5f 50 41 54 48 4e 41 4d 45 20 35  e MAX_PATHNAME 5
1520: 31 32 0a 0a 2f 2a 0a 2a 2a 20 4f 6e 6c 79 20 73  12../*.** Only s
1530: 65 74 20 74 68 65 20 6c 61 73 74 45 72 72 6e 6f  et the lastErrno
1540: 20 69 66 20 74 68 65 20 65 72 72 6f 72 20 63 6f   if the error co
1550: 64 65 20 69 73 20 61 20 72 65 61 6c 20 65 72 72  de is a real err
1560: 6f 72 20 61 6e 64 20 6e 6f 74 20 0a 2a 2a 20 61  or and not .** a
1570: 20 6e 6f 72 6d 61 6c 20 65 78 70 65 63 74 65 64   normal expected
1580: 20 72 65 74 75 72 6e 20 63 6f 64 65 20 6f 66 20   return code of 
1590: 53 51 4c 49 54 45 5f 42 55 53 59 20 6f 72 20 53  SQLITE_BUSY or S
15a0: 51 4c 49 54 45 5f 4f 4b 0a 2a 2f 0a 23 64 65 66  QLITE_OK.*/.#def
15b0: 69 6e 65 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f  ine IS_LOCK_ERRO
15c0: 52 28 78 29 20 20 28 28 78 20 21 3d 20 53 51 4c  R(x)  ((x != SQL
15d0: 49 54 45 5f 4f 4b 29 20 26 26 20 28 78 20 21 3d  ITE_OK) && (x !=
15e0: 20 53 51 4c 49 54 45 5f 42 55 53 59 29 29 0a 0a   SQLITE_BUSY))..
15f0: 2f 2a 20 46 6f 72 77 61 72 64 20 72 65 66 65 72  /* Forward refer
1600: 65 6e 63 65 73 20 2a 2f 0a 74 79 70 65 64 65 66  ences */.typedef
1610: 20 73 74 72 75 63 74 20 75 6e 69 78 53 68 6d 20   struct unixShm 
1620: 75 6e 69 78 53 68 6d 3b 20 20 20 20 20 20 20 20  unixShm;        
1630: 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e 6e 65 63         /* Connec
1640: 74 69 6f 6e 20 73 68 61 72 65 64 20 6d 65 6d 6f  tion shared memo
1650: 72 79 20 2a 2f 0a 74 79 70 65 64 65 66 20 73 74  ry */.typedef st
1660: 72 75 63 74 20 75 6e 69 78 53 68 6d 4e 6f 64 65  ruct unixShmNode
1670: 20 75 6e 69 78 53 68 6d 4e 6f 64 65 3b 20 20 20   unixShmNode;   
1680: 20 20 20 20 2f 2a 20 53 68 61 72 65 64 20 6d 65      /* Shared me
1690: 6d 6f 72 79 20 69 6e 73 74 61 6e 63 65 20 2a 2f  mory instance */
16a0: 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20  .typedef struct 
16b0: 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 75 6e  unixInodeInfo un
16c0: 69 78 49 6e 6f 64 65 49 6e 66 6f 3b 20 20 20 2f  ixInodeInfo;   /
16d0: 2a 20 41 6e 20 69 2d 6e 6f 64 65 20 2a 2f 0a 74  * An i-node */.t
16e0: 79 70 65 64 65 66 20 73 74 72 75 63 74 20 55 6e  ypedef struct Un
16f0: 69 78 55 6e 75 73 65 64 46 64 20 55 6e 69 78 55  ixUnusedFd UnixU
1700: 6e 75 73 65 64 46 64 3b 20 20 20 20 20 2f 2a 20  nusedFd;     /* 
1710: 41 6e 20 75 6e 75 73 65 64 20 66 69 6c 65 20 64  An unused file d
1720: 65 73 63 72 69 70 74 6f 72 20 2a 2f 0a 0a 2f 2a  escriptor */../*
1730: 0a 2a 2a 20 53 6f 6d 65 74 69 6d 65 73 2c 20 61  .** Sometimes, a
1740: 66 74 65 72 20 61 20 66 69 6c 65 20 68 61 6e 64  fter a file hand
1750: 6c 65 20 69 73 20 63 6c 6f 73 65 64 20 62 79 20  le is closed by 
1760: 53 51 4c 69 74 65 2c 20 74 68 65 20 66 69 6c 65  SQLite, the file
1770: 20 64 65 73 63 72 69 70 74 6f 72 0a 2a 2a 20 63   descriptor.** c
1780: 61 6e 6e 6f 74 20 62 65 20 63 6c 6f 73 65 64 20  annot be closed 
1790: 69 6d 6d 65 64 69 61 74 65 6c 79 2e 20 49 6e 20  immediately. In 
17a0: 74 68 65 73 65 20 63 61 73 65 73 2c 20 69 6e 73  these cases, ins
17b0: 74 61 6e 63 65 73 20 6f 66 20 74 68 65 20 66 6f  tances of the fo
17c0: 6c 6c 6f 77 69 6e 67 0a 2a 2a 20 73 74 72 75 63  llowing.** struc
17d0: 74 75 72 65 20 61 72 65 20 75 73 65 64 20 74 6f  ture are used to
17e0: 20 73 74 6f 72 65 20 74 68 65 20 66 69 6c 65 20   store the file 
17f0: 64 65 73 63 72 69 70 74 6f 72 20 77 68 69 6c 65  descriptor while
1800: 20 77 61 69 74 69 6e 67 20 66 6f 72 20 61 6e 0a   waiting for an.
1810: 2a 2a 20 6f 70 70 6f 72 74 75 6e 69 74 79 20 74  ** opportunity t
1820: 6f 20 65 69 74 68 65 72 20 63 6c 6f 73 65 20 6f  o either close o
1830: 72 20 72 65 75 73 65 20 69 74 2e 0a 2a 2f 0a 73  r reuse it..*/.s
1840: 74 72 75 63 74 20 55 6e 69 78 55 6e 75 73 65 64  truct UnixUnused
1850: 46 64 20 7b 0a 20 20 69 6e 74 20 66 64 3b 20 20  Fd {.  int fd;  
1860: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1870: 20 2f 2a 20 46 69 6c 65 20 64 65 73 63 72 69 70   /* File descrip
1880: 74 6f 72 20 74 6f 20 63 6c 6f 73 65 20 2a 2f 0a  tor to close */.
1890: 20 20 69 6e 74 20 66 6c 61 67 73 3b 20 20 20 20    int flags;    
18a0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
18b0: 6c 61 67 73 20 74 68 69 73 20 66 69 6c 65 20 64  lags this file d
18c0: 65 73 63 72 69 70 74 6f 72 20 77 61 73 20 6f 70  escriptor was op
18d0: 65 6e 65 64 20 77 69 74 68 20 2a 2f 0a 20 20 55  ened with */.  U
18e0: 6e 69 78 55 6e 75 73 65 64 46 64 20 2a 70 4e 65  nixUnusedFd *pNe
18f0: 78 74 3b 20 20 20 20 20 20 2f 2a 20 4e 65 78 74  xt;      /* Next
1900: 20 75 6e 75 73 65 64 20 66 69 6c 65 20 64 65 73   unused file des
1910: 63 72 69 70 74 6f 72 20 6f 6e 20 73 61 6d 65 20  criptor on same 
1920: 66 69 6c 65 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a  file */.};../*.*
1930: 2a 20 54 68 65 20 75 6e 69 78 46 69 6c 65 20 73  * The unixFile s
1940: 74 72 75 63 74 75 72 65 20 69 73 20 73 75 62 63  tructure is subc
1950: 6c 61 73 73 20 6f 66 20 73 71 6c 69 74 65 33 5f  lass of sqlite3_
1960: 66 69 6c 65 20 73 70 65 63 69 66 69 63 20 74 6f  file specific to
1970: 20 74 68 65 20 75 6e 69 78 0a 2a 2a 20 56 46 53   the unix.** VFS
1980: 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 73   implementations
1990: 2e 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72  ..*/.typedef str
19a0: 75 63 74 20 75 6e 69 78 46 69 6c 65 20 75 6e 69  uct unixFile uni
19b0: 78 46 69 6c 65 3b 0a 73 74 72 75 63 74 20 75 6e  xFile;.struct un
19c0: 69 78 46 69 6c 65 20 7b 0a 20 20 73 71 6c 69 74  ixFile {.  sqlit
19d0: 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 63 6f  e3_io_methods co
19e0: 6e 73 74 20 2a 70 4d 65 74 68 6f 64 3b 20 20 2f  nst *pMethod;  /
19f0: 2a 20 41 6c 77 61 79 73 20 74 68 65 20 66 69 72  * Always the fir
1a00: 73 74 20 65 6e 74 72 79 20 2a 2f 0a 20 20 75 6e  st entry */.  un
1a10: 69 78 49 6e 6f 64 65 49 6e 66 6f 20 2a 70 49 6e  ixInodeInfo *pIn
1a20: 6f 64 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ode;            
1a30: 20 20 2f 2a 20 49 6e 66 6f 20 61 62 6f 75 74 20    /* Info about 
1a40: 6c 6f 63 6b 73 20 6f 6e 20 74 68 69 73 20 69 6e  locks on this in
1a50: 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 68 3b 20  ode */.  int h; 
1a60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a70: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1a80: 54 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70  The file descrip
1a90: 74 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 64 69 72  tor */.  int dir
1aa0: 66 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  fd;             
1ab0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1ac0: 46 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  File descriptor 
1ad0: 66 6f 72 20 74 68 65 20 64 69 72 65 63 74 6f 72  for the director
1ae0: 79 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20  y */.  unsigned 
1af0: 63 68 61 72 20 65 46 69 6c 65 4c 6f 63 6b 3b 20  char eFileLock; 
1b00: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
1b10: 65 20 74 79 70 65 20 6f 66 20 6c 6f 63 6b 20 68  e type of lock h
1b20: 65 6c 64 20 6f 6e 20 74 68 69 73 20 66 64 20 2a  eld on this fd *
1b30: 2f 0a 20 20 69 6e 74 20 6c 61 73 74 45 72 72 6e  /.  int lastErrn
1b40: 6f 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  o;              
1b50: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 75          /* The u
1b60: 6e 69 78 20 65 72 72 6e 6f 20 66 72 6f 6d 20 6c  nix errno from l
1b70: 61 73 74 20 49 2f 4f 20 65 72 72 6f 72 20 2a 2f  ast I/O error */
1b80: 0a 20 20 76 6f 69 64 20 2a 6c 6f 63 6b 69 6e 67  .  void *locking
1b90: 43 6f 6e 74 65 78 74 3b 20 20 20 20 20 20 20 20  Context;        
1ba0: 20 20 20 20 20 20 20 2f 2a 20 4c 6f 63 6b 69 6e         /* Lockin
1bb0: 67 20 73 74 79 6c 65 20 73 70 65 63 69 66 69 63  g style specific
1bc0: 20 73 74 61 74 65 20 2a 2f 0a 20 20 55 6e 69 78   state */.  Unix
1bd0: 55 6e 75 73 65 64 46 64 20 2a 70 55 6e 75 73 65  UnusedFd *pUnuse
1be0: 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d;              
1bf0: 2f 2a 20 50 72 65 2d 61 6c 6c 6f 63 61 74 65 64  /* Pre-allocated
1c00: 20 55 6e 69 78 55 6e 75 73 65 64 46 64 20 2a 2f   UnixUnusedFd */
1c10: 0a 20 20 69 6e 74 20 66 69 6c 65 46 6c 61 67 73  .  int fileFlags
1c20: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1c30: 20 20 20 20 20 20 20 2f 2a 20 4d 69 73 63 65 6c         /* Miscel
1c40: 6c 61 6e 6f 75 73 20 66 6c 61 67 73 20 2a 2f 0a  lanous flags */.
1c50: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50    const char *zP
1c60: 61 74 68 3b 20 20 20 20 20 20 20 20 20 20 20 20  ath;            
1c70: 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66        /* Name of
1c80: 20 74 68 65 20 66 69 6c 65 20 2a 2f 0a 20 20 75   the file */.  u
1c90: 6e 69 78 53 68 6d 20 2a 70 53 68 6d 3b 20 20 20  nixShm *pShm;   
1ca0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cb0: 20 20 20 2f 2a 20 53 68 61 72 65 64 20 6d 65 6d     /* Shared mem
1cc0: 6f 72 79 20 73 65 67 6d 65 6e 74 20 69 6e 66 6f  ory segment info
1cd0: 72 6d 61 74 69 6f 6e 20 2a 2f 0a 23 69 66 20 53  rmation */.#if S
1ce0: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43  QLITE_ENABLE_LOC
1cf0: 4b 49 4e 47 5f 53 54 59 4c 45 0a 20 20 69 6e 74  KING_STYLE.  int
1d00: 20 6f 70 65 6e 46 6c 61 67 73 3b 20 20 20 20 20   openFlags;     
1d10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d20: 20 2f 2a 20 54 68 65 20 66 6c 61 67 73 20 73 70   /* The flags sp
1d30: 65 63 69 66 69 65 64 20 61 74 20 6f 70 65 6e 28  ecified at open(
1d40: 29 20 2a 2f 0a 23 65 6e 64 69 66 0a 23 69 66 20  ) */.#endif.#if 
1d50: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f  SQLITE_ENABLE_LO
1d60: 43 4b 49 4e 47 5f 53 54 59 4c 45 20 7c 7c 20 64  CKING_STYLE || d
1d70: 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f  efined(__APPLE__
1d80: 29 0a 20 20 75 6e 73 69 67 6e 65 64 20 66 73 46  ).  unsigned fsF
1d90: 6c 61 67 73 3b 20 20 20 20 20 20 20 20 20 20 20  lags;           
1da0: 20 20 20 20 20 20 20 20 2f 2a 20 63 61 63 68 65          /* cache
1db0: 64 20 64 65 74 61 69 6c 73 20 66 72 6f 6d 20 73  d details from s
1dc0: 74 61 74 66 73 28 29 20 2a 2f 0a 23 65 6e 64 69  tatfs() */.#endi
1dd0: 66 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53  f.#if OS_VXWORKS
1de0: 0a 20 20 69 6e 74 20 69 73 44 65 6c 65 74 65 3b  .  int isDelete;
1df0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e00: 20 20 20 20 20 20 20 2f 2a 20 44 65 6c 65 74 65         /* Delete
1e10: 20 6f 6e 20 63 6c 6f 73 65 20 69 66 20 74 72 75   on close if tru
1e20: 65 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 76 78  e */.  struct vx
1e30: 77 6f 72 6b 73 46 69 6c 65 49 64 20 2a 70 49 64  worksFileId *pId
1e40: 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55 6e  ;          /* Un
1e50: 69 71 75 65 20 66 69 6c 65 20 49 44 20 2a 2f 0a  ique file ID */.
1e60: 23 65 6e 64 69 66 0a 23 69 66 6e 64 65 66 20 4e  #endif.#ifndef N
1e70: 44 45 42 55 47 0a 20 20 2f 2a 20 54 68 65 20 6e  DEBUG.  /* The n
1e80: 65 78 74 20 67 72 6f 75 70 20 6f 66 20 76 61 72  ext group of var
1e90: 69 61 62 6c 65 73 20 61 72 65 20 75 73 65 64 20  iables are used 
1ea0: 74 6f 20 74 72 61 63 6b 20 77 68 65 74 68 65 72  to track whether
1eb0: 20 6f 72 20 6e 6f 74 20 74 68 65 0a 20 20 2a 2a   or not the.  **
1ec0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f 75   transaction cou
1ed0: 6e 74 65 72 20 69 6e 20 62 79 74 65 73 20 32 34  nter in bytes 24
1ee0: 2d 32 37 20 6f 66 20 64 61 74 61 62 61 73 65 20  -27 of database 
1ef0: 66 69 6c 65 73 20 61 72 65 20 75 70 64 61 74 65  files are update
1f00: 64 0a 20 20 2a 2a 20 77 68 65 6e 65 76 65 72 20  d.  ** whenever 
1f10: 61 6e 79 20 70 61 72 74 20 6f 66 20 74 68 65 20  any part of the 
1f20: 64 61 74 61 62 61 73 65 20 63 68 61 6e 67 65 73  database changes
1f30: 2e 20 20 41 6e 20 61 73 73 65 72 74 69 6f 6e 20  .  An assertion 
1f40: 66 61 75 6c 74 20 77 69 6c 6c 0a 20 20 2a 2a 20  fault will.  ** 
1f50: 6f 63 63 75 72 20 69 66 20 61 20 66 69 6c 65 20  occur if a file 
1f60: 69 73 20 75 70 64 61 74 65 64 20 77 69 74 68 6f  is updated witho
1f70: 75 74 20 61 6c 73 6f 20 75 70 64 61 74 69 6e 67  ut also updating
1f80: 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
1f90: 0a 20 20 2a 2a 20 63 6f 75 6e 74 65 72 2e 20 20  .  ** counter.  
1fa0: 54 68 69 73 20 74 65 73 74 20 69 73 20 6d 61 64  This test is mad
1fb0: 65 20 74 6f 20 61 76 6f 69 64 20 6e 65 77 20 70  e to avoid new p
1fc0: 72 6f 62 6c 65 6d 73 20 73 69 6d 69 6c 61 72 20  roblems similar 
1fd0: 74 6f 20 74 68 65 0a 20 20 2a 2a 20 6f 6e 65 20  to the.  ** one 
1fe0: 64 65 73 63 72 69 62 65 64 20 62 79 20 74 69 63  described by tic
1ff0: 6b 65 74 20 23 33 35 38 34 2e 20 0a 20 20 2a 2f  ket #3584. .  */
2000: 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
2010: 20 74 72 61 6e 73 43 6e 74 72 43 68 6e 67 3b 20   transCntrChng; 
2020: 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68 65    /* True if the
2030: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f 75   transaction cou
2040: 6e 74 65 72 20 63 68 61 6e 67 65 64 20 2a 2f 0a  nter changed */.
2050: 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
2060: 64 62 55 70 64 61 74 65 3b 20 20 20 20 20 20 20  dbUpdate;       
2070: 20 2f 2a 20 54 72 75 65 20 69 66 20 61 6e 79 20   /* True if any 
2080: 70 61 72 74 20 6f 66 20 64 61 74 61 62 61 73 65  part of database
2090: 20 66 69 6c 65 20 63 68 61 6e 67 65 64 20 2a 2f   file changed */
20a0: 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
20b0: 20 69 6e 4e 6f 72 6d 61 6c 57 72 69 74 65 3b 20   inNormalWrite; 
20c0: 20 20 2f 2a 20 54 72 75 65 20 69 66 20 69 6e 20    /* True if in 
20d0: 61 20 6e 6f 72 6d 61 6c 20 77 72 69 74 65 20 6f  a normal write o
20e0: 70 65 72 61 74 69 6f 6e 20 2a 2f 0a 23 65 6e 64  peration */.#end
20f0: 69 66 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  if.#ifdef SQLITE
2100: 5f 54 45 53 54 0a 20 20 2f 2a 20 49 6e 20 74 65  _TEST.  /* In te
2110: 73 74 20 6d 6f 64 65 2c 20 69 6e 63 72 65 61 73  st mode, increas
2120: 65 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68  e the size of th
2130: 69 73 20 73 74 72 75 63 74 75 72 65 20 61 20 62  is structure a b
2140: 69 74 20 73 6f 20 74 68 61 74 20 0a 20 20 2a 2a  it so that .  **
2150: 20 69 74 20 69 73 20 6c 61 72 67 65 72 20 74 68   it is larger th
2160: 61 6e 20 74 68 65 20 73 74 72 75 63 74 20 43 72  an the struct Cr
2170: 61 73 68 46 69 6c 65 20 64 65 66 69 6e 65 64 20  ashFile defined 
2180: 69 6e 20 74 65 73 74 36 2e 63 2e 0a 20 20 2a 2f  in test6.c..  */
2190: 0a 20 20 63 68 61 72 20 61 50 61 64 64 69 6e 67  .  char aPadding
21a0: 5b 33 32 5d 3b 0a 23 65 6e 64 69 66 0a 7d 3b 0a  [32];.#endif.};.
21b0: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f  ./*.** The follo
21c0: 77 69 6e 67 20 6d 61 63 72 6f 73 20 64 65 66 69  wing macros defi
21d0: 6e 65 20 62 69 74 73 20 69 6e 20 75 6e 69 78 46  ne bits in unixF
21e0: 69 6c 65 2e 66 69 6c 65 46 6c 61 67 73 0a 2a 2f  ile.fileFlags.*/
21f0: 0a 23 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f  .#define SQLITE_
2200: 57 48 4f 4c 45 5f 46 49 4c 45 5f 4c 4f 43 4b 49  WHOLE_FILE_LOCKI
2210: 4e 47 20 20 30 78 30 30 30 31 20 20 20 2f 2a 20  NG  0x0001   /* 
2220: 55 73 65 20 77 68 6f 6c 65 2d 66 69 6c 65 20 6c  Use whole-file l
2230: 6f 63 6b 69 6e 67 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  ocking */../*.**
2240: 20 49 6e 63 6c 75 64 65 20 63 6f 64 65 20 74 68   Include code th
2250: 61 74 20 69 73 20 63 6f 6d 6d 6f 6e 20 74 6f 20  at is common to 
2260: 61 6c 6c 20 6f 73 5f 2a 2e 63 20 66 69 6c 65 73  all os_*.c files
2270: 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 22 6f 73  .*/.#include "os
2280: 5f 63 6f 6d 6d 6f 6e 2e 68 22 0a 0a 2f 2a 0a 2a  _common.h"../*.*
2290: 2a 20 44 65 66 69 6e 65 20 76 61 72 69 6f 75 73  * Define various
22a0: 20 6d 61 63 72 6f 73 20 74 68 61 74 20 61 72 65   macros that are
22b0: 20 6d 69 73 73 69 6e 67 20 66 72 6f 6d 20 73 6f   missing from so
22c0: 6d 65 20 73 79 73 74 65 6d 73 2e 0a 2a 2f 0a 23  me systems..*/.#
22d0: 69 66 6e 64 65 66 20 4f 5f 4c 41 52 47 45 46 49  ifndef O_LARGEFI
22e0: 4c 45 0a 23 20 64 65 66 69 6e 65 20 4f 5f 4c 41  LE.# define O_LA
22f0: 52 47 45 46 49 4c 45 20 30 0a 23 65 6e 64 69 66  RGEFILE 0.#endif
2300: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
2310: 49 53 41 42 4c 45 5f 4c 46 53 0a 23 20 75 6e 64  ISABLE_LFS.# und
2320: 65 66 20 4f 5f 4c 41 52 47 45 46 49 4c 45 0a 23  ef O_LARGEFILE.#
2330: 20 64 65 66 69 6e 65 20 4f 5f 4c 41 52 47 45 46   define O_LARGEF
2340: 49 4c 45 20 30 0a 23 65 6e 64 69 66 0a 23 69 66  ILE 0.#endif.#if
2350: 6e 64 65 66 20 4f 5f 4e 4f 46 4f 4c 4c 4f 57 0a  ndef O_NOFOLLOW.
2360: 23 20 64 65 66 69 6e 65 20 4f 5f 4e 4f 46 4f 4c  # define O_NOFOL
2370: 4c 4f 57 20 30 0a 23 65 6e 64 69 66 0a 23 69 66  LOW 0.#endif.#if
2380: 6e 64 65 66 20 4f 5f 42 49 4e 41 52 59 0a 23 20  ndef O_BINARY.# 
2390: 64 65 66 69 6e 65 20 4f 5f 42 49 4e 41 52 59 20  define O_BINARY 
23a0: 30 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  0.#endif../*.** 
23b0: 54 68 65 20 44 4a 47 50 50 20 63 6f 6d 70 69 6c  The DJGPP compil
23c0: 65 72 20 65 6e 76 69 72 6f 6e 6d 65 6e 74 20 6c  er environment l
23d0: 6f 6f 6b 73 20 6d 6f 73 74 6c 79 20 6c 69 6b 65  ooks mostly like
23e0: 20 55 6e 69 78 2c 20 62 75 74 20 69 74 0a 2a 2a   Unix, but it.**
23f0: 20 6c 61 63 6b 73 20 74 68 65 20 66 63 6e 74 6c   lacks the fcntl
2400: 28 29 20 73 79 73 74 65 6d 20 63 61 6c 6c 2e 20  () system call. 
2410: 20 53 6f 20 72 65 64 65 66 69 6e 65 20 66 63 6e   So redefine fcn
2420: 74 6c 28 29 20 74 6f 20 62 65 20 73 6f 6d 65 74  tl() to be somet
2430: 68 69 6e 67 0a 2a 2a 20 74 68 61 74 20 61 6c 77  hing.** that alw
2440: 61 79 73 20 73 75 63 63 65 65 64 73 2e 20 20 54  ays succeeds.  T
2450: 68 69 73 20 6d 65 61 6e 73 20 74 68 61 74 20 6c  his means that l
2460: 6f 63 6b 69 6e 67 20 64 6f 65 73 20 6e 6f 74 20  ocking does not 
2470: 6f 63 63 75 72 20 75 6e 64 65 72 0a 2a 2a 20 44  occur under.** D
2480: 4a 47 50 50 2e 20 20 42 75 74 20 69 74 20 69 73  JGPP.  But it is
2490: 20 44 4f 53 20 2d 20 77 68 61 74 20 64 69 64 20   DOS - what did 
24a0: 79 6f 75 20 65 78 70 65 63 74 3f 0a 2a 2f 0a 23  you expect?.*/.#
24b0: 69 66 64 65 66 20 5f 5f 44 4a 47 50 50 5f 5f 0a  ifdef __DJGPP__.
24c0: 23 20 64 65 66 69 6e 65 20 66 63 6e 74 6c 28 41  # define fcntl(A
24d0: 2c 42 2c 43 29 20 30 0a 23 65 6e 64 69 66 0a 0a  ,B,C) 0.#endif..
24e0: 2f 2a 0a 2a 2a 20 54 68 65 20 74 68 72 65 61 64  /*.** The thread
24f0: 69 64 20 6d 61 63 72 6f 20 72 65 73 6f 6c 76 65  id macro resolve
2500: 73 20 74 6f 20 74 68 65 20 74 68 72 65 61 64 2d  s to the thread-
2510: 69 64 20 6f 72 20 74 6f 20 30 2e 20 20 55 73 65  id or to 0.  Use
2520: 64 20 66 6f 72 0a 2a 2a 20 74 65 73 74 69 6e 67  d for.** testing
2530: 20 61 6e 64 20 64 65 62 75 67 67 69 6e 67 20 6f   and debugging o
2540: 6e 6c 79 2e 0a 2a 2f 0a 23 69 66 20 53 51 4c 49  nly..*/.#if SQLI
2550: 54 45 5f 54 48 52 45 41 44 53 41 46 45 0a 23 64  TE_THREADSAFE.#d
2560: 65 66 69 6e 65 20 74 68 72 65 61 64 69 64 20 70  efine threadid p
2570: 74 68 72 65 61 64 5f 73 65 6c 66 28 29 0a 23 65  thread_self().#e
2580: 6c 73 65 0a 23 64 65 66 69 6e 65 20 74 68 72 65  lse.#define thre
2590: 61 64 69 64 20 30 0a 23 65 6e 64 69 66 0a 0a 0a  adid 0.#endif...
25a0: 2f 2a 0a 2a 2a 20 48 65 6c 70 65 72 20 66 75 6e  /*.** Helper fun
25b0: 63 74 69 6f 6e 73 20 74 6f 20 6f 62 74 61 69 6e  ctions to obtain
25c0: 20 61 6e 64 20 72 65 6c 69 6e 71 75 69 73 68 20   and relinquish 
25d0: 74 68 65 20 67 6c 6f 62 61 6c 20 6d 75 74 65 78  the global mutex
25e0: 2e 20 54 68 65 0a 2a 2a 20 67 6c 6f 62 61 6c 20  . The.** global 
25f0: 6d 75 74 65 78 20 69 73 20 75 73 65 64 20 74 6f  mutex is used to
2600: 20 70 72 6f 74 65 63 74 20 74 68 65 20 75 6e 69   protect the uni
2610: 78 49 6e 6f 64 65 49 6e 66 6f 20 61 6e 64 0a 2a  xInodeInfo and.*
2620: 2a 20 76 78 77 6f 72 6b 73 46 69 6c 65 49 64 20  * vxworksFileId 
2630: 6f 62 6a 65 63 74 73 20 75 73 65 64 20 62 79 20  objects used by 
2640: 74 68 69 73 20 66 69 6c 65 2c 20 61 6c 6c 20 6f  this file, all o
2650: 66 20 77 68 69 63 68 20 6d 61 79 20 62 65 20 0a  f which may be .
2660: 2a 2a 20 73 68 61 72 65 64 20 62 79 20 6d 75 6c  ** shared by mul
2670: 74 69 70 6c 65 20 74 68 72 65 61 64 73 2e 0a 2a  tiple threads..*
2680: 2a 0a 2a 2a 20 46 75 6e 63 74 69 6f 6e 20 75 6e  *.** Function un
2690: 69 78 4d 75 74 65 78 48 65 6c 64 28 29 20 69 73  ixMutexHeld() is
26a0: 20 75 73 65 64 20 74 6f 20 61 73 73 65 72 74 28   used to assert(
26b0: 29 20 74 68 61 74 20 74 68 65 20 67 6c 6f 62 61  ) that the globa
26c0: 6c 20 6d 75 74 65 78 20 0a 2a 2a 20 69 73 20 68  l mutex .** is h
26d0: 65 6c 64 20 77 68 65 6e 20 72 65 71 75 69 72 65  eld when require
26e0: 64 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  d. This function
26f0: 20 69 73 20 6f 6e 6c 79 20 75 73 65 64 20 61 73   is only used as
2700: 20 70 61 72 74 20 6f 66 20 61 73 73 65 72 74 28   part of assert(
2710: 29 20 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74 73  ) .** statements
2720: 2e 20 65 2e 67 2e 0a 2a 2a 0a 2a 2a 20 20 20 75  . e.g..**.**   u
2730: 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29 0a  nixEnterMutex().
2740: 2a 2a 20 20 20 20 20 61 73 73 65 72 74 28 20 75  **     assert( u
2750: 6e 69 78 4d 75 74 65 78 48 65 6c 64 28 29 20 29  nixMutexHeld() )
2760: 3b 0a 2a 2a 20 20 20 75 6e 69 78 45 6e 74 65 72  ;.**   unixEnter
2770: 4c 65 61 76 65 28 29 0a 2a 2f 0a 73 74 61 74 69  Leave().*/.stati
2780: 63 20 76 6f 69 64 20 75 6e 69 78 45 6e 74 65 72  c void unixEnter
2790: 4d 75 74 65 78 28 76 6f 69 64 29 7b 0a 20 20 73  Mutex(void){.  s
27a0: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74  qlite3_mutex_ent
27b0: 65 72 28 73 71 6c 69 74 65 33 4d 75 74 65 78 41  er(sqlite3MutexA
27c0: 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45  lloc(SQLITE_MUTE
27d0: 58 5f 53 54 41 54 49 43 5f 4d 41 53 54 45 52 29  X_STATIC_MASTER)
27e0: 29 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64  );.}.static void
27f0: 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28   unixLeaveMutex(
2800: 76 6f 69 64 29 7b 0a 20 20 73 71 6c 69 74 65 33  void){.  sqlite3
2810: 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 73 71 6c  _mutex_leave(sql
2820: 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53  ite3MutexAlloc(S
2830: 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54 41 54  QLITE_MUTEX_STAT
2840: 49 43 5f 4d 41 53 54 45 52 29 29 3b 0a 7d 0a 23  IC_MASTER));.}.#
2850: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42  ifdef SQLITE_DEB
2860: 55 47 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e  UG.static int un
2870: 69 78 4d 75 74 65 78 48 65 6c 64 28 76 6f 69 64  ixMutexHeld(void
2880: 29 20 7b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c  ) {.  return sql
2890: 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
28a0: 73 71 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f  sqlite3MutexAllo
28b0: 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53  c(SQLITE_MUTEX_S
28c0: 54 41 54 49 43 5f 4d 41 53 54 45 52 29 29 3b 0a  TATIC_MASTER));.
28d0: 7d 0a 23 65 6e 64 69 66 0a 0a 0a 23 69 66 64 65  }.#endif...#ifde
28e0: 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 2f  f SQLITE_DEBUG./
28f0: 2a 0a 2a 2a 20 48 65 6c 70 65 72 20 66 75 6e 63  *.** Helper func
2900: 74 69 6f 6e 20 66 6f 72 20 70 72 69 6e 74 69 6e  tion for printin
2910: 67 20 6f 75 74 20 74 72 61 63 65 20 69 6e 66 6f  g out trace info
2920: 72 6d 61 74 69 6f 6e 20 66 72 6f 6d 20 64 65 62  rmation from deb
2930: 75 67 67 69 6e 67 0a 2a 2a 20 62 69 6e 61 72 69  ugging.** binari
2940: 65 73 2e 20 54 68 69 73 20 72 65 74 75 72 6e 73  es. This returns
2950: 20 74 68 65 20 73 74 72 69 6e 67 20 72 65 70 72   the string repr
2960: 65 73 65 74 61 74 69 6f 6e 20 6f 66 20 74 68 65  esetation of the
2970: 20 73 75 70 70 6c 69 65 64 0a 2a 2a 20 69 6e 74   supplied.** int
2980: 65 67 65 72 20 6c 6f 63 6b 2d 74 79 70 65 2e 0a  eger lock-type..
2990: 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20  */.static const 
29a0: 63 68 61 72 20 2a 61 7a 46 69 6c 65 4c 6f 63 6b  char *azFileLock
29b0: 28 69 6e 74 20 65 46 69 6c 65 4c 6f 63 6b 29 7b  (int eFileLock){
29c0: 0a 20 20 73 77 69 74 63 68 28 20 65 46 69 6c 65  .  switch( eFile
29d0: 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 63 61 73 65  Lock ){.    case
29e0: 20 4e 4f 5f 4c 4f 43 4b 3a 20 72 65 74 75 72 6e   NO_LOCK: return
29f0: 20 22 4e 4f 4e 45 22 3b 0a 20 20 20 20 63 61 73   "NONE";.    cas
2a00: 65 20 53 48 41 52 45 44 5f 4c 4f 43 4b 3a 20 72  e SHARED_LOCK: r
2a10: 65 74 75 72 6e 20 22 53 48 41 52 45 44 22 3b 0a  eturn "SHARED";.
2a20: 20 20 20 20 63 61 73 65 20 52 45 53 45 52 56 45      case RESERVE
2a30: 44 5f 4c 4f 43 4b 3a 20 72 65 74 75 72 6e 20 22  D_LOCK: return "
2a40: 52 45 53 45 52 56 45 44 22 3b 0a 20 20 20 20 63  RESERVED";.    c
2a50: 61 73 65 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b  ase PENDING_LOCK
2a60: 3a 20 72 65 74 75 72 6e 20 22 50 45 4e 44 49 4e  : return "PENDIN
2a70: 47 22 3b 0a 20 20 20 20 63 61 73 65 20 45 58 43  G";.    case EXC
2a80: 4c 55 53 49 56 45 5f 4c 4f 43 4b 3a 20 72 65 74  LUSIVE_LOCK: ret
2a90: 75 72 6e 20 22 45 58 43 4c 55 53 49 56 45 22 3b  urn "EXCLUSIVE";
2aa0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 22 45  .  }.  return "E
2ab0: 52 52 4f 52 22 3b 0a 7d 0a 23 65 6e 64 69 66 0a  RROR";.}.#endif.
2ac0: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4c  .#ifdef SQLITE_L
2ad0: 4f 43 4b 5f 54 52 41 43 45 0a 2f 2a 0a 2a 2a 20  OCK_TRACE./*.** 
2ae0: 50 72 69 6e 74 20 6f 75 74 20 69 6e 66 6f 72 6d  Print out inform
2af0: 61 74 69 6f 6e 20 61 62 6f 75 74 20 61 6c 6c 20  ation about all 
2b00: 6c 6f 63 6b 69 6e 67 20 6f 70 65 72 61 74 69 6f  locking operatio
2b10: 6e 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  ns..**.** This r
2b20: 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64 20 66  outine is used f
2b30: 6f 72 20 74 72 6f 75 62 6c 65 73 68 6f 6f 74 69  or troubleshooti
2b40: 6e 67 20 6c 6f 63 6b 73 20 6f 6e 20 6d 75 6c 74  ng locks on mult
2b50: 69 74 68 72 65 61 64 65 64 0a 2a 2a 20 70 6c 61  ithreaded.** pla
2b60: 74 66 6f 72 6d 73 2e 20 20 45 6e 61 62 6c 65 20  tforms.  Enable 
2b70: 62 79 20 63 6f 6d 70 69 6c 69 6e 67 20 77 69 74  by compiling wit
2b80: 68 20 74 68 65 20 2d 44 53 51 4c 49 54 45 5f 4c  h the -DSQLITE_L
2b90: 4f 43 4b 5f 54 52 41 43 45 0a 2a 2a 20 63 6f 6d  OCK_TRACE.** com
2ba0: 6d 61 6e 64 2d 6c 69 6e 65 20 6f 70 74 69 6f 6e  mand-line option
2bb0: 20 6f 6e 20 74 68 65 20 63 6f 6d 70 69 6c 65 72   on the compiler
2bc0: 2e 20 20 54 68 69 73 20 63 6f 64 65 20 69 73 20  .  This code is 
2bd0: 6e 6f 72 6d 61 6c 6c 79 0a 2a 2a 20 74 75 72 6e  normally.** turn
2be0: 65 64 20 6f 66 66 2e 0a 2a 2f 0a 73 74 61 74 69  ed off..*/.stati
2bf0: 63 20 69 6e 74 20 6c 6f 63 6b 54 72 61 63 65 28  c int lockTrace(
2c00: 69 6e 74 20 66 64 2c 20 69 6e 74 20 6f 70 2c 20  int fd, int op, 
2c10: 73 74 72 75 63 74 20 66 6c 6f 63 6b 20 2a 70 29  struct flock *p)
2c20: 7b 0a 20 20 63 68 61 72 20 2a 7a 4f 70 4e 61 6d  {.  char *zOpNam
2c30: 65 2c 20 2a 7a 54 79 70 65 3b 0a 20 20 69 6e 74  e, *zType;.  int
2c40: 20 73 3b 0a 20 20 69 6e 74 20 73 61 76 65 64 45   s;.  int savedE
2c50: 72 72 6e 6f 3b 0a 20 20 69 66 28 20 6f 70 3d 3d  rrno;.  if( op==
2c60: 46 5f 47 45 54 4c 4b 20 29 7b 0a 20 20 20 20 7a  F_GETLK ){.    z
2c70: 4f 70 4e 61 6d 65 20 3d 20 22 47 45 54 4c 4b 22  OpName = "GETLK"
2c80: 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 6f 70  ;.  }else if( op
2c90: 3d 3d 46 5f 53 45 54 4c 4b 20 29 7b 0a 20 20 20  ==F_SETLK ){.   
2ca0: 20 7a 4f 70 4e 61 6d 65 20 3d 20 22 53 45 54 4c   zOpName = "SETL
2cb0: 4b 22 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  K";.  }else{.   
2cc0: 20 73 20 3d 20 66 63 6e 74 6c 28 66 64 2c 20 6f   s = fcntl(fd, o
2cd0: 70 2c 20 70 29 3b 0a 20 20 20 20 73 71 6c 69 74  p, p);.    sqlit
2ce0: 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 66  e3DebugPrintf("f
2cf0: 63 6e 74 6c 20 75 6e 6b 6e 6f 77 6e 20 25 64 20  cntl unknown %d 
2d00: 25 64 20 25 64 5c 6e 22 2c 20 66 64 2c 20 6f 70  %d %d\n", fd, op
2d10: 2c 20 73 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  , s);.    return
2d20: 20 73 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d   s;.  }.  if( p-
2d30: 3e 6c 5f 74 79 70 65 3d 3d 46 5f 52 44 4c 43 4b  >l_type==F_RDLCK
2d40: 20 29 7b 0a 20 20 20 20 7a 54 79 70 65 20 3d 20   ){.    zType = 
2d50: 22 52 44 4c 43 4b 22 3b 0a 20 20 7d 65 6c 73 65  "RDLCK";.  }else
2d60: 20 69 66 28 20 70 2d 3e 6c 5f 74 79 70 65 3d 3d   if( p->l_type==
2d70: 46 5f 57 52 4c 43 4b 20 29 7b 0a 20 20 20 20 7a  F_WRLCK ){.    z
2d80: 54 79 70 65 20 3d 20 22 57 52 4c 43 4b 22 3b 0a  Type = "WRLCK";.
2d90: 20 20 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e 6c    }else if( p->l
2da0: 5f 74 79 70 65 3d 3d 46 5f 55 4e 4c 43 4b 20 29  _type==F_UNLCK )
2db0: 7b 0a 20 20 20 20 7a 54 79 70 65 20 3d 20 22 55  {.    zType = "U
2dc0: 4e 4c 43 4b 22 3b 0a 20 20 7d 65 6c 73 65 7b 0a  NLCK";.  }else{.
2dd0: 20 20 20 20 61 73 73 65 72 74 28 20 30 20 29 3b      assert( 0 );
2de0: 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70  .  }.  assert( p
2df0: 2d 3e 6c 5f 77 68 65 6e 63 65 3d 3d 53 45 45 4b  ->l_whence==SEEK
2e00: 5f 53 45 54 20 29 3b 0a 20 20 73 20 3d 20 66 63  _SET );.  s = fc
2e10: 6e 74 6c 28 66 64 2c 20 6f 70 2c 20 70 29 3b 0a  ntl(fd, op, p);.
2e20: 20 20 73 61 76 65 64 45 72 72 6e 6f 20 3d 20 65    savedErrno = e
2e30: 72 72 6e 6f 3b 0a 20 20 73 71 6c 69 74 65 33 44  rrno;.  sqlite3D
2e40: 65 62 75 67 50 72 69 6e 74 66 28 22 66 63 6e 74  ebugPrintf("fcnt
2e50: 6c 20 25 64 20 25 64 20 25 73 20 25 73 20 25 64  l %d %d %s %s %d
2e60: 20 25 64 20 25 64 20 25 64 5c 6e 22 2c 0a 20 20   %d %d %d\n",.  
2e70: 20 20 20 74 68 72 65 61 64 69 64 2c 20 66 64 2c     threadid, fd,
2e80: 20 7a 4f 70 4e 61 6d 65 2c 20 7a 54 79 70 65 2c   zOpName, zType,
2e90: 20 28 69 6e 74 29 70 2d 3e 6c 5f 73 74 61 72 74   (int)p->l_start
2ea0: 2c 20 28 69 6e 74 29 70 2d 3e 6c 5f 6c 65 6e 2c  , (int)p->l_len,
2eb0: 0a 20 20 20 20 20 28 69 6e 74 29 70 2d 3e 6c 5f  .     (int)p->l_
2ec0: 70 69 64 2c 20 73 29 3b 0a 20 20 69 66 28 20 73  pid, s);.  if( s
2ed0: 3d 3d 28 2d 31 29 20 26 26 20 6f 70 3d 3d 46 5f  ==(-1) && op==F_
2ee0: 53 45 54 4c 4b 20 26 26 20 28 70 2d 3e 6c 5f 74  SETLK && (p->l_t
2ef0: 79 70 65 3d 3d 46 5f 52 44 4c 43 4b 20 7c 7c 20  ype==F_RDLCK || 
2f00: 70 2d 3e 6c 5f 74 79 70 65 3d 3d 46 5f 57 52 4c  p->l_type==F_WRL
2f10: 43 4b 29 20 29 7b 0a 20 20 20 20 73 74 72 75 63  CK) ){.    struc
2f20: 74 20 66 6c 6f 63 6b 20 6c 32 3b 0a 20 20 20 20  t flock l2;.    
2f30: 6c 32 20 3d 20 2a 70 3b 0a 20 20 20 20 66 63 6e  l2 = *p;.    fcn
2f40: 74 6c 28 66 64 2c 20 46 5f 47 45 54 4c 4b 2c 20  tl(fd, F_GETLK, 
2f50: 26 6c 32 29 3b 0a 20 20 20 20 69 66 28 20 6c 32  &l2);.    if( l2
2f60: 2e 6c 5f 74 79 70 65 3d 3d 46 5f 52 44 4c 43 4b  .l_type==F_RDLCK
2f70: 20 29 7b 0a 20 20 20 20 20 20 7a 54 79 70 65 20   ){.      zType 
2f80: 3d 20 22 52 44 4c 43 4b 22 3b 0a 20 20 20 20 7d  = "RDLCK";.    }
2f90: 65 6c 73 65 20 69 66 28 20 6c 32 2e 6c 5f 74 79  else if( l2.l_ty
2fa0: 70 65 3d 3d 46 5f 57 52 4c 43 4b 20 29 7b 0a 20  pe==F_WRLCK ){. 
2fb0: 20 20 20 20 20 7a 54 79 70 65 20 3d 20 22 57 52       zType = "WR
2fc0: 4c 43 4b 22 3b 0a 20 20 20 20 7d 65 6c 73 65 20  LCK";.    }else 
2fd0: 69 66 28 20 6c 32 2e 6c 5f 74 79 70 65 3d 3d 46  if( l2.l_type==F
2fe0: 5f 55 4e 4c 43 4b 20 29 7b 0a 20 20 20 20 20 20  _UNLCK ){.      
2ff0: 7a 54 79 70 65 20 3d 20 22 55 4e 4c 43 4b 22 3b  zType = "UNLCK";
3000: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
3010: 20 20 61 73 73 65 72 74 28 20 30 20 29 3b 0a 20    assert( 0 );. 
3020: 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
3030: 44 65 62 75 67 50 72 69 6e 74 66 28 22 66 63 6e  DebugPrintf("fcn
3040: 74 6c 2d 66 61 69 6c 75 72 65 2d 72 65 61 73 6f  tl-failure-reaso
3050: 6e 3a 20 25 73 20 25 64 20 25 64 20 25 64 5c 6e  n: %s %d %d %d\n
3060: 22 2c 0a 20 20 20 20 20 20 20 7a 54 79 70 65 2c  ",.       zType,
3070: 20 28 69 6e 74 29 6c 32 2e 6c 5f 73 74 61 72 74   (int)l2.l_start
3080: 2c 20 28 69 6e 74 29 6c 32 2e 6c 5f 6c 65 6e 2c  , (int)l2.l_len,
3090: 20 28 69 6e 74 29 6c 32 2e 6c 5f 70 69 64 29 3b   (int)l2.l_pid);
30a0: 0a 20 20 7d 0a 20 20 65 72 72 6e 6f 20 3d 20 73  .  }.  errno = s
30b0: 61 76 65 64 45 72 72 6e 6f 3b 0a 20 20 72 65 74  avedErrno;.  ret
30c0: 75 72 6e 20 73 3b 0a 7d 0a 23 64 65 66 69 6e 65  urn s;.}.#define
30d0: 20 66 63 6e 74 6c 20 6c 6f 63 6b 54 72 61 63 65   fcntl lockTrace
30e0: 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
30f0: 45 5f 4c 4f 43 4b 5f 54 52 41 43 45 20 2a 2f 0a  E_LOCK_TRACE */.
3100: 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  .../*.** This ro
3110: 75 74 69 6e 65 20 74 72 61 6e 73 6c 61 74 65 73  utine translates
3120: 20 61 20 73 74 61 6e 64 61 72 64 20 50 4f 53 49   a standard POSI
3130: 58 20 65 72 72 6e 6f 20 63 6f 64 65 20 69 6e 74  X errno code int
3140: 6f 20 73 6f 6d 65 74 68 69 6e 67 0a 2a 2a 20 75  o something.** u
3150: 73 65 66 75 6c 20 74 6f 20 74 68 65 20 63 6c 69  seful to the cli
3160: 65 6e 74 73 20 6f 66 20 74 68 65 20 73 71 6c 69  ents of the sqli
3170: 74 65 33 20 66 75 6e 63 74 69 6f 6e 73 2e 20 20  te3 functions.  
3180: 53 70 65 63 69 66 69 63 61 6c 6c 79 2c 20 69 74  Specifically, it
3190: 20 69 73 0a 2a 2a 20 69 6e 74 65 6e 64 65 64 20   is.** intended 
31a0: 74 6f 20 74 72 61 6e 73 6c 61 74 65 20 61 20 76  to translate a v
31b0: 61 72 69 65 74 79 20 6f 66 20 22 74 72 79 20 61  ariety of "try a
31c0: 67 61 69 6e 22 20 65 72 72 6f 72 73 20 69 6e 74  gain" errors int
31d0: 6f 20 53 51 4c 49 54 45 5f 42 55 53 59 0a 2a 2a  o SQLITE_BUSY.**
31e0: 20 61 6e 64 20 61 20 76 61 72 69 65 74 79 20 6f   and a variety o
31f0: 66 20 22 70 6c 65 61 73 65 20 63 6c 6f 73 65 20  f "please close 
3200: 74 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70  the file descrip
3210: 74 6f 72 20 4e 4f 57 22 20 65 72 72 6f 72 73 20  tor NOW" errors 
3220: 69 6e 74 6f 20 0a 2a 2a 20 53 51 4c 49 54 45 5f  into .** SQLITE_
3230: 49 4f 45 52 52 0a 2a 2a 20 0a 2a 2a 20 45 72 72  IOERR.** .** Err
3240: 6f 72 73 20 64 75 72 69 6e 67 20 69 6e 69 74 69  ors during initi
3250: 61 6c 69 7a 61 74 69 6f 6e 20 6f 66 20 6c 6f 63  alization of loc
3260: 6b 73 2c 20 6f 72 20 66 69 6c 65 20 73 79 73 74  ks, or file syst
3270: 65 6d 20 73 75 70 70 6f 72 74 20 66 6f 72 20 6c  em support for l
3280: 6f 63 6b 73 2c 0a 2a 2a 20 73 68 6f 75 6c 64 20  ocks,.** should 
3290: 68 61 6e 64 6c 65 20 45 4e 4f 4c 43 4b 2c 20 45  handle ENOLCK, E
32a0: 4e 4f 54 53 55 50 2c 20 45 4f 50 4e 4f 54 53 55  NOTSUP, EOPNOTSU
32b0: 50 50 20 73 65 70 61 72 61 74 65 6c 79 2e 0a 2a  PP separately..*
32c0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 71 6c  /.static int sql
32d0: 69 74 65 45 72 72 6f 72 46 72 6f 6d 50 6f 73 69  iteErrorFromPosi
32e0: 78 45 72 72 6f 72 28 69 6e 74 20 70 6f 73 69 78  xError(int posix
32f0: 45 72 72 6f 72 2c 20 69 6e 74 20 73 71 6c 69 74  Error, int sqlit
3300: 65 49 4f 45 72 72 29 20 7b 0a 20 20 73 77 69 74  eIOErr) {.  swit
3310: 63 68 20 28 70 6f 73 69 78 45 72 72 6f 72 29 20  ch (posixError) 
3320: 7b 0a 20 20 63 61 73 65 20 30 3a 20 0a 20 20 20  {.  case 0: .   
3330: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
3340: 4b 3b 0a 20 20 20 20 0a 20 20 63 61 73 65 20 45  K;.    .  case E
3350: 41 47 41 49 4e 3a 0a 20 20 63 61 73 65 20 45 54  AGAIN:.  case ET
3360: 49 4d 45 44 4f 55 54 3a 0a 20 20 63 61 73 65 20  IMEDOUT:.  case 
3370: 45 42 55 53 59 3a 0a 20 20 63 61 73 65 20 45 49  EBUSY:.  case EI
3380: 4e 54 52 3a 0a 20 20 63 61 73 65 20 45 4e 4f 4c  NTR:.  case ENOL
3390: 43 4b 3a 20 20 0a 20 20 20 20 2f 2a 20 72 61 6e  CK:  .    /* ran
33a0: 64 6f 6d 20 4e 46 53 20 72 65 74 72 79 20 65 72  dom NFS retry er
33b0: 72 6f 72 2c 20 75 6e 6c 65 73 73 20 64 75 72 69  ror, unless duri
33c0: 6e 67 20 66 69 6c 65 20 73 79 73 74 65 6d 20 73  ng file system s
33d0: 75 70 70 6f 72 74 20 0a 20 20 20 20 20 2a 20 69  upport .     * i
33e0: 6e 74 72 6f 73 70 65 63 74 69 6f 6e 2c 20 69 6e  ntrospection, in
33f0: 20 77 68 69 63 68 20 69 74 20 61 63 74 75 61 6c   which it actual
3400: 6c 79 20 6d 65 61 6e 73 20 77 68 61 74 20 69 74  ly means what it
3410: 20 73 61 79 73 20 2a 2f 0a 20 20 20 20 72 65 74   says */.    ret
3420: 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 3b  urn SQLITE_BUSY;
3430: 0a 20 20 20 20 0a 20 20 63 61 73 65 20 45 41 43  .    .  case EAC
3440: 43 45 53 3a 20 0a 20 20 20 20 2f 2a 20 45 41 43  CES: .    /* EAC
3450: 43 45 53 20 69 73 20 6c 69 6b 65 20 45 41 47 41  CES is like EAGA
3460: 49 4e 20 64 75 72 69 6e 67 20 6c 6f 63 6b 69 6e  IN during lockin
3470: 67 20 6f 70 65 72 61 74 69 6f 6e 73 2c 20 62 75  g operations, bu
3480: 74 20 6e 6f 74 20 61 6e 79 20 6f 74 68 65 72 20  t not any other 
3490: 74 69 6d 65 2a 2f 0a 20 20 20 20 69 66 28 20 28  time*/.    if( (
34a0: 73 71 6c 69 74 65 49 4f 45 72 72 20 3d 3d 20 53  sqliteIOErr == S
34b0: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b  QLITE_IOERR_LOCK
34c0: 29 20 7c 7c 20 0a 09 28 73 71 6c 69 74 65 49 4f  ) || ..(sqliteIO
34d0: 45 72 72 20 3d 3d 20 53 51 4c 49 54 45 5f 49 4f  Err == SQLITE_IO
34e0: 45 52 52 5f 55 4e 4c 4f 43 4b 29 20 7c 7c 20 0a  ERR_UNLOCK) || .
34f0: 09 28 73 71 6c 69 74 65 49 4f 45 72 72 20 3d 3d  .(sqliteIOErr ==
3500: 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 52 44   SQLITE_IOERR_RD
3510: 4c 4f 43 4b 29 20 7c 7c 0a 09 28 73 71 6c 69 74  LOCK) ||..(sqlit
3520: 65 49 4f 45 72 72 20 3d 3d 20 53 51 4c 49 54 45  eIOErr == SQLITE
3530: 5f 49 4f 45 52 52 5f 43 48 45 43 4b 52 45 53 45  _IOERR_CHECKRESE
3540: 52 56 45 44 4c 4f 43 4b 29 20 29 7b 0a 20 20 20  RVEDLOCK) ){.   
3550: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
3560: 5f 42 55 53 59 3b 0a 20 20 20 20 7d 0a 20 20 20  _BUSY;.    }.   
3570: 20 2f 2a 20 65 6c 73 65 20 66 61 6c 6c 20 74 68   /* else fall th
3580: 72 6f 75 67 68 20 2a 2f 0a 20 20 63 61 73 65 20  rough */.  case 
3590: 45 50 45 52 4d 3a 20 0a 20 20 20 20 72 65 74 75  EPERM: .    retu
35a0: 72 6e 20 53 51 4c 49 54 45 5f 50 45 52 4d 3b 0a  rn SQLITE_PERM;.
35b0: 20 20 20 20 0a 20 20 63 61 73 65 20 45 44 45 41      .  case EDEA
35c0: 44 4c 4b 3a 0a 20 20 20 20 72 65 74 75 72 6e 20  DLK:.    return 
35d0: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 42 4c 4f  SQLITE_IOERR_BLO
35e0: 43 4b 45 44 3b 0a 20 20 20 20 0a 23 69 66 20 45  CKED;.    .#if E
35f0: 4f 50 4e 4f 54 53 55 50 50 21 3d 45 4e 4f 54 53  OPNOTSUPP!=ENOTS
3600: 55 50 0a 20 20 63 61 73 65 20 45 4f 50 4e 4f 54  UP.  case EOPNOT
3610: 53 55 50 50 3a 20 0a 20 20 20 20 2f 2a 20 73 6f  SUPP: .    /* so
3620: 6d 65 74 68 69 6e 67 20 77 65 6e 74 20 74 65 72  mething went ter
3630: 72 69 62 6c 79 20 61 77 72 79 2c 20 75 6e 6c 65  ribly awry, unle
3640: 73 73 20 64 75 72 69 6e 67 20 66 69 6c 65 20 73  ss during file s
3650: 79 73 74 65 6d 20 73 75 70 70 6f 72 74 20 0a 20  ystem support . 
3660: 20 20 20 20 2a 20 69 6e 74 72 6f 73 70 65 63 74      * introspect
3670: 69 6f 6e 2c 20 69 6e 20 77 68 69 63 68 20 69 74  ion, in which it
3680: 20 61 63 74 75 61 6c 6c 79 20 6d 65 61 6e 73 20   actually means 
3690: 77 68 61 74 20 69 74 20 73 61 79 73 20 2a 2f 0a  what it says */.
36a0: 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20 45 4e  #endif.#ifdef EN
36b0: 4f 54 53 55 50 0a 20 20 63 61 73 65 20 45 4e 4f  OTSUP.  case ENO
36c0: 54 53 55 50 3a 20 0a 20 20 20 20 2f 2a 20 69 6e  TSUP: .    /* in
36d0: 76 61 6c 69 64 20 66 64 2c 20 75 6e 6c 65 73 73  valid fd, unless
36e0: 20 64 75 72 69 6e 67 20 66 69 6c 65 20 73 79 73   during file sys
36f0: 74 65 6d 20 73 75 70 70 6f 72 74 20 69 6e 74 72  tem support intr
3700: 6f 73 70 65 63 74 69 6f 6e 2c 20 69 6e 20 77 68  ospection, in wh
3710: 69 63 68 20 0a 20 20 20 20 20 2a 20 69 74 20 61  ich .     * it a
3720: 63 74 75 61 6c 6c 79 20 6d 65 61 6e 73 20 77 68  ctually means wh
3730: 61 74 20 69 74 20 73 61 79 73 20 2a 2f 0a 23 65  at it says */.#e
3740: 6e 64 69 66 0a 20 20 63 61 73 65 20 45 49 4f 3a  ndif.  case EIO:
3750: 0a 20 20 63 61 73 65 20 45 42 41 44 46 3a 0a 20  .  case EBADF:. 
3760: 20 63 61 73 65 20 45 49 4e 56 41 4c 3a 0a 20 20   case EINVAL:.  
3770: 63 61 73 65 20 45 4e 4f 54 43 4f 4e 4e 3a 0a 20  case ENOTCONN:. 
3780: 20 63 61 73 65 20 45 4e 4f 44 45 56 3a 0a 20 20   case ENODEV:.  
3790: 63 61 73 65 20 45 4e 58 49 4f 3a 0a 20 20 63 61  case ENXIO:.  ca
37a0: 73 65 20 45 4e 4f 45 4e 54 3a 0a 20 20 63 61 73  se ENOENT:.  cas
37b0: 65 20 45 53 54 41 4c 45 3a 0a 20 20 63 61 73 65  e ESTALE:.  case
37c0: 20 45 4e 4f 53 59 53 3a 0a 20 20 20 20 2f 2a 20   ENOSYS:.    /* 
37d0: 74 68 65 73 65 20 73 68 6f 75 6c 64 20 66 6f 72  these should for
37e0: 63 65 20 74 68 65 20 63 6c 69 65 6e 74 20 74 6f  ce the client to
37f0: 20 63 6c 6f 73 65 20 74 68 65 20 66 69 6c 65 20   close the file 
3800: 61 6e 64 20 72 65 63 6f 6e 6e 65 63 74 20 2a 2f  and reconnect */
3810: 0a 20 20 20 20 0a 20 20 64 65 66 61 75 6c 74 3a  .    .  default:
3820: 20 0a 20 20 20 20 72 65 74 75 72 6e 20 73 71 6c   .    return sql
3830: 69 74 65 49 4f 45 72 72 3b 0a 20 20 7d 0a 7d 0a  iteIOErr;.  }.}.
3840: 0a 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .../************
3850: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
3860: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
3870: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
3880: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
3890: 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  **.*************
38a0: 2a 2a 2a 2a 2a 20 42 65 67 69 6e 20 55 6e 69 71  ***** Begin Uniq
38b0: 75 65 20 46 69 6c 65 20 49 44 20 55 74 69 6c 69  ue File ID Utili
38c0: 74 79 20 55 73 65 64 20 42 79 20 56 78 57 6f 72  ty Used By VxWor
38d0: 6b 73 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ks *************
38e0: 2a 2a 0a 2a 2a 0a 2a 2a 20 4f 6e 20 6d 6f 73 74  **.**.** On most
38f0: 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 75 6e 69   versions of uni
3900: 78 2c 20 77 65 20 63 61 6e 20 67 65 74 20 61 20  x, we can get a 
3910: 75 6e 69 71 75 65 20 49 44 20 66 6f 72 20 61 20  unique ID for a 
3920: 66 69 6c 65 20 62 79 20 63 6f 6e 63 61 74 65 6e  file by concaten
3930: 61 74 69 6e 67 0a 2a 2a 20 74 68 65 20 64 65 76  ating.** the dev
3940: 69 63 65 20 6e 75 6d 62 65 72 20 61 6e 64 20 74  ice number and t
3950: 68 65 20 69 6e 6f 64 65 20 6e 75 6d 62 65 72 2e  he inode number.
3960: 20 20 42 75 74 20 74 68 69 73 20 64 6f 65 73 20    But this does 
3970: 6e 6f 74 20 77 6f 72 6b 20 6f 6e 20 56 78 57 6f  not work on VxWo
3980: 72 6b 73 2e 0a 2a 2a 20 4f 6e 20 56 78 57 6f 72  rks..** On VxWor
3990: 6b 73 2c 20 61 20 75 6e 69 71 75 65 20 66 69 6c  ks, a unique fil
39a0: 65 20 69 64 20 6d 75 73 74 20 62 65 20 62 61 73  e id must be bas
39b0: 65 64 20 6f 6e 20 74 68 65 20 63 61 6e 6f 6e 69  ed on the canoni
39c0: 63 61 6c 20 66 69 6c 65 6e 61 6d 65 2e 0a 2a 2a  cal filename..**
39d0: 0a 2a 2a 20 41 20 70 6f 69 6e 74 65 72 20 74 6f  .** A pointer to
39e0: 20 61 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20   an instance of 
39f0: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74  the following st
3a00: 72 75 63 74 75 72 65 20 63 61 6e 20 62 65 20 75  ructure can be u
3a10: 73 65 64 20 61 73 20 61 0a 2a 2a 20 75 6e 69 71  sed as a.** uniq
3a20: 75 65 20 66 69 6c 65 20 49 44 20 69 6e 20 56 78  ue file ID in Vx
3a30: 57 6f 72 6b 73 2e 20 20 45 61 63 68 20 69 6e 73  Works.  Each ins
3a40: 74 61 6e 63 65 20 6f 66 20 74 68 69 73 20 73 74  tance of this st
3a50: 72 75 63 74 75 72 65 20 63 6f 6e 74 61 69 6e 73  ructure contains
3a60: 0a 2a 2a 20 61 20 63 6f 70 79 20 6f 66 20 74 68  .** a copy of th
3a70: 65 20 63 61 6e 6f 6e 69 63 61 6c 20 66 69 6c 65  e canonical file
3a80: 6e 61 6d 65 2e 20 20 54 68 65 72 65 20 69 73 20  name.  There is 
3a90: 61 6c 73 6f 20 61 20 72 65 66 65 72 65 6e 63 65  also a reference
3aa0: 20 63 6f 75 6e 74 2e 20 20 0a 2a 2a 20 54 68 65   count.  .** The
3ab0: 20 73 74 72 75 63 74 75 72 65 20 69 73 20 72 65   structure is re
3ac0: 63 6c 61 69 6d 65 64 20 77 68 65 6e 20 74 68 65  claimed when the
3ad0: 20 6e 75 6d 62 65 72 20 6f 66 20 70 6f 69 6e 74   number of point
3ae0: 65 72 73 20 74 6f 20 69 74 20 64 72 6f 70 73 20  ers to it drops 
3af0: 74 6f 0a 2a 2a 20 7a 65 72 6f 2e 0a 2a 2a 0a 2a  to.** zero..**.*
3b00: 2a 20 54 68 65 72 65 20 61 72 65 20 6e 65 76 65  * There are neve
3b10: 72 20 76 65 72 79 20 6d 61 6e 79 20 66 69 6c 65  r very many file
3b20: 73 20 6f 70 65 6e 20 61 74 20 6f 6e 65 20 74 69  s open at one ti
3b30: 6d 65 20 61 6e 64 20 6c 6f 6f 6b 75 70 73 20 61  me and lookups a
3b40: 72 65 20 6e 6f 74 0a 2a 2a 20 61 20 70 65 72 66  re not.** a perf
3b50: 6f 72 6d 61 6e 63 65 2d 63 72 69 74 69 63 61 6c  ormance-critical
3b60: 20 70 61 74 68 2c 20 73 6f 20 69 74 20 69 73 20   path, so it is 
3b70: 73 75 66 66 69 63 69 65 6e 74 20 74 6f 20 70 75  sufficient to pu
3b80: 74 20 74 68 65 73 65 0a 2a 2a 20 73 74 72 75 63  t these.** struc
3b90: 74 75 72 65 73 20 6f 6e 20 61 20 6c 69 6e 6b 65  tures on a linke
3ba0: 64 20 6c 69 73 74 2e 0a 2a 2f 0a 73 74 72 75 63  d list..*/.struc
3bb0: 74 20 76 78 77 6f 72 6b 73 46 69 6c 65 49 64 20  t vxworksFileId 
3bc0: 7b 0a 20 20 73 74 72 75 63 74 20 76 78 77 6f 72  {.  struct vxwor
3bd0: 6b 73 46 69 6c 65 49 64 20 2a 70 4e 65 78 74 3b  ksFileId *pNext;
3be0: 20 20 2f 2a 20 4e 65 78 74 20 69 6e 20 61 20 6c    /* Next in a l
3bf0: 69 73 74 20 6f 66 20 74 68 65 6d 20 61 6c 6c 20  ist of them all 
3c00: 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 66 3b 20 20  */.  int nRef;  
3c10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3c20: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
3c30: 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 74 68  references to th
3c40: 69 73 20 6f 6e 65 20 2a 2f 0a 20 20 69 6e 74 20  is one */.  int 
3c50: 6e 4e 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20  nName;          
3c60: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 65 6e            /* Len
3c70: 67 74 68 20 6f 66 20 74 68 65 20 7a 43 61 6e 6f  gth of the zCano
3c80: 6e 69 63 61 6c 4e 61 6d 65 5b 5d 20 73 74 72 69  nicalName[] stri
3c90: 6e 67 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 43  ng */.  char *zC
3ca0: 61 6e 6f 6e 69 63 61 6c 4e 61 6d 65 3b 20 20 20  anonicalName;   
3cb0: 20 20 20 20 20 20 2f 2a 20 43 61 6e 6f 6e 69 63        /* Canonic
3cc0: 61 6c 20 66 69 6c 65 6e 61 6d 65 20 2a 2f 0a 7d  al filename */.}
3cd0: 3b 0a 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b  ;..#if OS_VXWORK
3ce0: 53 0a 2f 2a 20 0a 2a 2a 20 41 6c 6c 20 75 6e 69  S./* .** All uni
3cf0: 71 75 65 20 66 69 6c 65 6e 61 6d 65 73 20 61 72  que filenames ar
3d00: 65 20 68 65 6c 64 20 6f 6e 20 61 20 6c 69 6e 6b  e held on a link
3d10: 65 64 20 6c 69 73 74 20 68 65 61 64 65 64 20 62  ed list headed b
3d20: 79 20 74 68 69 73 0a 2a 2a 20 76 61 72 69 61 62  y this.** variab
3d30: 6c 65 3a 0a 2a 2f 0a 73 74 61 74 69 63 20 73 74  le:.*/.static st
3d40: 72 75 63 74 20 76 78 77 6f 72 6b 73 46 69 6c 65  ruct vxworksFile
3d50: 49 64 20 2a 76 78 77 6f 72 6b 73 46 69 6c 65 4c  Id *vxworksFileL
3d60: 69 73 74 20 3d 20 30 3b 0a 0a 2f 2a 0a 2a 2a 20  ist = 0;../*.** 
3d70: 53 69 6d 70 6c 69 66 79 20 61 20 66 69 6c 65 6e  Simplify a filen
3d80: 61 6d 65 20 69 6e 74 6f 20 69 74 73 20 63 61 6e  ame into its can
3d90: 6f 6e 69 63 61 6c 20 66 6f 72 6d 0a 2a 2a 20 62  onical form.** b
3da0: 79 20 6d 61 6b 69 6e 67 20 74 68 65 20 66 6f 6c  y making the fol
3db0: 6c 6f 77 69 6e 67 20 63 68 61 6e 67 65 73 3a 0a  lowing changes:.
3dc0: 2a 2a 0a 2a 2a 20 20 2a 20 72 65 6d 6f 76 69 6e  **.**  * removin
3dd0: 67 20 61 6e 79 20 74 72 61 69 6c 69 6e 67 20 61  g any trailing a
3de0: 6e 64 20 64 75 70 6c 69 63 61 74 65 20 2f 0a 2a  nd duplicate /.*
3df0: 2a 20 20 2a 20 63 6f 6e 76 65 72 74 20 2f 2e 2f  *  * convert /./
3e00: 20 69 6e 74 6f 20 6a 75 73 74 20 2f 0a 2a 2a 20   into just /.** 
3e10: 20 2a 20 63 6f 6e 76 65 72 74 20 2f 41 2f 2e 2e   * convert /A/..
3e20: 2f 20 77 68 65 72 65 20 41 20 69 73 20 61 6e 79  / where A is any
3e30: 20 73 69 6d 70 6c 65 20 6e 61 6d 65 20 69 6e 74   simple name int
3e40: 6f 20 6a 75 73 74 20 2f 0a 2a 2a 0a 2a 2a 20 43  o just /.**.** C
3e50: 68 61 6e 67 65 73 20 61 72 65 20 6d 61 64 65 20  hanges are made 
3e60: 69 6e 2d 70 6c 61 63 65 2e 20 20 52 65 74 75 72  in-place.  Retur
3e70: 6e 20 74 68 65 20 6e 65 77 20 6e 61 6d 65 20 6c  n the new name l
3e80: 65 6e 67 74 68 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  ength..**.** The
3e90: 20 6f 72 69 67 69 6e 61 6c 20 66 69 6c 65 6e 61   original filena
3ea0: 6d 65 20 69 73 20 69 6e 20 7a 5b 30 2e 2e 6e 2d  me is in z[0..n-
3eb0: 31 5d 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20  1].  Return the 
3ec0: 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a 20 63 68 61  number of.** cha
3ed0: 72 61 63 74 65 72 73 20 69 6e 20 74 68 65 20 73  racters in the s
3ee0: 69 6d 70 6c 69 66 69 65 64 20 6e 61 6d 65 2e 0a  implified name..
3ef0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 76 78  */.static int vx
3f00: 77 6f 72 6b 73 53 69 6d 70 6c 69 66 79 4e 61 6d  worksSimplifyNam
3f10: 65 28 63 68 61 72 20 2a 7a 2c 20 69 6e 74 20 6e  e(char *z, int n
3f20: 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20  ){.  int i, j;. 
3f30: 20 77 68 69 6c 65 28 20 6e 3e 31 20 26 26 20 7a   while( n>1 && z
3f40: 5b 6e 2d 31 5d 3d 3d 27 2f 27 20 29 7b 20 6e 2d  [n-1]=='/' ){ n-
3f50: 2d 3b 20 7d 0a 20 20 66 6f 72 28 69 3d 6a 3d 30  -; }.  for(i=j=0
3f60: 3b 20 69 3c 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20  ; i<n; i++){.   
3f70: 20 69 66 28 20 7a 5b 69 5d 3d 3d 27 2f 27 20 29   if( z[i]=='/' )
3f80: 7b 0a 20 20 20 20 20 20 69 66 28 20 7a 5b 69 2b  {.      if( z[i+
3f90: 31 5d 3d 3d 27 2f 27 20 29 20 63 6f 6e 74 69 6e  1]=='/' ) contin
3fa0: 75 65 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 5b  ue;.      if( z[
3fb0: 69 2b 31 5d 3d 3d 27 2e 27 20 26 26 20 69 2b 32  i+1]=='.' && i+2
3fc0: 3c 6e 20 26 26 20 7a 5b 69 2b 32 5d 3d 3d 27 2f  <n && z[i+2]=='/
3fd0: 27 20 29 7b 0a 20 20 20 20 20 20 20 20 69 20 2b  ' ){.        i +
3fe0: 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 63 6f 6e  = 1;.        con
3ff0: 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 7d 0a 20  tinue;.      }. 
4000: 20 20 20 20 20 69 66 28 20 7a 5b 69 2b 31 5d 3d       if( z[i+1]=
4010: 3d 27 2e 27 20 26 26 20 69 2b 33 3c 6e 20 26 26  ='.' && i+3<n &&
4020: 20 7a 5b 69 2b 32 5d 3d 3d 27 2e 27 20 26 26 20   z[i+2]=='.' && 
4030: 7a 5b 69 2b 33 5d 3d 3d 27 2f 27 20 29 7b 0a 20  z[i+3]=='/' ){. 
4040: 20 20 20 20 20 20 20 77 68 69 6c 65 28 20 6a 3e         while( j>
4050: 30 20 26 26 20 7a 5b 6a 2d 31 5d 21 3d 27 2f 27  0 && z[j-1]!='/'
4060: 20 29 7b 20 6a 2d 2d 3b 20 7d 0a 20 20 20 20 20   ){ j--; }.     
4070: 20 20 20 69 66 28 20 6a 3e 30 20 29 7b 20 6a 2d     if( j>0 ){ j-
4080: 2d 3b 20 7d 0a 20 20 20 20 20 20 20 20 69 20 2b  -; }.        i +
4090: 3d 20 32 3b 0a 20 20 20 20 20 20 20 20 63 6f 6e  = 2;.        con
40a0: 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 7d 0a 20  tinue;.      }. 
40b0: 20 20 20 7d 0a 20 20 20 20 7a 5b 6a 2b 2b 5d 20     }.    z[j++] 
40c0: 3d 20 7a 5b 69 5d 3b 0a 20 20 7d 0a 20 20 7a 5b  = z[i];.  }.  z[
40d0: 6a 5d 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e  j] = 0;.  return
40e0: 20 6a 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 69 6e   j;.}../*.** Fin
40f0: 64 20 61 20 75 6e 69 71 75 65 20 66 69 6c 65 20  d a unique file 
4100: 49 44 20 66 6f 72 20 74 68 65 20 67 69 76 65 6e  ID for the given
4110: 20 61 62 73 6f 6c 75 74 65 20 70 61 74 68 6e 61   absolute pathna
4120: 6d 65 2e 20 20 52 65 74 75 72 6e 0a 2a 2a 20 61  me.  Return.** a
4130: 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
4140: 76 78 77 6f 72 6b 73 46 69 6c 65 49 64 20 6f 62  vxworksFileId ob
4150: 6a 65 63 74 2e 20 20 54 68 69 73 20 70 6f 69 6e  ject.  This poin
4160: 74 65 72 20 69 73 20 74 68 65 20 75 6e 69 71 75  ter is the uniqu
4170: 65 0a 2a 2a 20 66 69 6c 65 20 49 44 2e 0a 2a 2a  e.** file ID..**
4180: 0a 2a 2a 20 54 68 65 20 6e 52 65 66 20 66 69 65  .** The nRef fie
4190: 6c 64 20 6f 66 20 74 68 65 20 76 78 77 6f 72 6b  ld of the vxwork
41a0: 73 46 69 6c 65 49 64 20 6f 62 6a 65 63 74 20 69  sFileId object i
41b0: 73 20 69 6e 63 72 65 6d 65 6e 74 65 64 20 62 65  s incremented be
41c0: 66 6f 72 65 0a 2a 2a 20 74 68 65 20 6f 62 6a 65  fore.** the obje
41d0: 63 74 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20  ct is returned. 
41e0: 20 41 20 6e 65 77 20 76 78 77 6f 72 6b 73 46 69   A new vxworksFi
41f0: 6c 65 49 64 20 6f 62 6a 65 63 74 20 69 73 20 63  leId object is c
4200: 72 65 61 74 65 64 0a 2a 2a 20 61 6e 64 20 61 64  reated.** and ad
4210: 64 65 64 20 74 6f 20 74 68 65 20 67 6c 6f 62 61  ded to the globa
4220: 6c 20 6c 69 73 74 20 69 66 20 6e 65 63 65 73 73  l list if necess
4230: 61 72 79 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20  ary..**.** If a 
4240: 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f  memory allocatio
4250: 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20  n error occurs, 
4260: 72 65 74 75 72 6e 20 4e 55 4c 4c 2e 0a 2a 2f 0a  return NULL..*/.
4270: 73 74 61 74 69 63 20 73 74 72 75 63 74 20 76 78  static struct vx
4280: 77 6f 72 6b 73 46 69 6c 65 49 64 20 2a 76 78 77  worksFileId *vxw
4290: 6f 72 6b 73 46 69 6e 64 46 69 6c 65 49 64 28 63  orksFindFileId(c
42a0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 41 62 73 6f  onst char *zAbso
42b0: 6c 75 74 65 4e 61 6d 65 29 7b 0a 20 20 73 74 72  luteName){.  str
42c0: 75 63 74 20 76 78 77 6f 72 6b 73 46 69 6c 65 49  uct vxworksFileI
42d0: 64 20 2a 70 4e 65 77 3b 20 20 20 20 20 20 20 20  d *pNew;        
42e0: 20 2f 2a 20 73 65 61 72 63 68 20 6b 65 79 20 61   /* search key a
42f0: 6e 64 20 6e 65 77 20 66 69 6c 65 20 49 44 20 2a  nd new file ID *
4300: 2f 0a 20 20 73 74 72 75 63 74 20 76 78 77 6f 72  /.  struct vxwor
4310: 6b 73 46 69 6c 65 49 64 20 2a 70 43 61 6e 64 69  ksFileId *pCandi
4320: 64 61 74 65 3b 20 20 20 2f 2a 20 46 6f 72 20 6c  date;   /* For l
4330: 6f 6f 70 69 6e 67 20 6f 76 65 72 20 65 78 69 73  ooping over exis
4340: 74 69 6e 67 20 66 69 6c 65 20 49 44 73 20 2a 2f  ting file IDs */
4350: 0a 20 20 69 6e 74 20 6e 3b 20 20 20 20 20 20 20  .  int n;       
4360: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4370: 20 20 20 20 20 20 20 2f 2a 20 4c 65 6e 67 74 68         /* Length
4380: 20 6f 66 20 7a 41 62 73 6f 6c 75 74 65 4e 61 6d   of zAbsoluteNam
4390: 65 20 73 74 72 69 6e 67 20 2a 2f 0a 0a 20 20 61  e string */..  a
43a0: 73 73 65 72 74 28 20 7a 41 62 73 6f 6c 75 74 65  ssert( zAbsolute
43b0: 4e 61 6d 65 5b 30 5d 3d 3d 27 2f 27 20 29 3b 0a  Name[0]=='/' );.
43c0: 20 20 6e 20 3d 20 28 69 6e 74 29 73 74 72 6c 65    n = (int)strle
43d0: 6e 28 7a 41 62 73 6f 6c 75 74 65 4e 61 6d 65 29  n(zAbsoluteName)
43e0: 3b 0a 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74  ;.  pNew = sqlit
43f0: 65 33 5f 6d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f  e3_malloc( sizeo
4400: 66 28 2a 70 4e 65 77 29 20 2b 20 28 6e 2b 31 29  f(*pNew) + (n+1)
4410: 20 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d   );.  if( pNew==
4420: 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
4430: 70 4e 65 77 2d 3e 7a 43 61 6e 6f 6e 69 63 61 6c  pNew->zCanonical
4440: 4e 61 6d 65 20 3d 20 28 63 68 61 72 2a 29 26 70  Name = (char*)&p
4450: 4e 65 77 5b 31 5d 3b 0a 20 20 6d 65 6d 63 70 79  New[1];.  memcpy
4460: 28 70 4e 65 77 2d 3e 7a 43 61 6e 6f 6e 69 63 61  (pNew->zCanonica
4470: 6c 4e 61 6d 65 2c 20 7a 41 62 73 6f 6c 75 74 65  lName, zAbsolute
4480: 4e 61 6d 65 2c 20 6e 2b 31 29 3b 0a 20 20 6e 20  Name, n+1);.  n 
4490: 3d 20 76 78 77 6f 72 6b 73 53 69 6d 70 6c 69 66  = vxworksSimplif
44a0: 79 4e 61 6d 65 28 70 4e 65 77 2d 3e 7a 43 61 6e  yName(pNew->zCan
44b0: 6f 6e 69 63 61 6c 4e 61 6d 65 2c 20 6e 29 3b 0a  onicalName, n);.
44c0: 0a 20 20 2f 2a 20 53 65 61 72 63 68 20 66 6f 72  .  /* Search for
44d0: 20 61 6e 20 65 78 69 73 74 69 6e 67 20 65 6e 74   an existing ent
44e0: 72 79 20 74 68 61 74 20 6d 61 74 63 68 69 6e 67  ry that matching
44f0: 20 74 68 65 20 63 61 6e 6f 6e 69 63 61 6c 20 6e   the canonical n
4500: 61 6d 65 2e 0a 20 20 2a 2a 20 49 66 20 66 6f 75  ame..  ** If fou
4510: 6e 64 2c 20 69 6e 63 72 65 6d 65 6e 74 20 74 68  nd, increment th
4520: 65 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e  e reference coun
4530: 74 20 61 6e 64 20 72 65 74 75 72 6e 20 61 20 70  t and return a p
4540: 6f 69 6e 74 65 72 20 74 6f 0a 20 20 2a 2a 20 74  ointer to.  ** t
4550: 68 65 20 65 78 69 73 74 69 6e 67 20 66 69 6c 65  he existing file
4560: 20 49 44 2e 0a 20 20 2a 2f 0a 20 20 75 6e 69 78   ID..  */.  unix
4570: 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 20 20  EnterMutex();.  
4580: 66 6f 72 28 70 43 61 6e 64 69 64 61 74 65 3d 76  for(pCandidate=v
4590: 78 77 6f 72 6b 73 46 69 6c 65 4c 69 73 74 3b 20  xworksFileList; 
45a0: 70 43 61 6e 64 69 64 61 74 65 3b 20 70 43 61 6e  pCandidate; pCan
45b0: 64 69 64 61 74 65 3d 70 43 61 6e 64 69 64 61 74  didate=pCandidat
45c0: 65 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 69  e->pNext){.    i
45d0: 66 28 20 70 43 61 6e 64 69 64 61 74 65 2d 3e 6e  f( pCandidate->n
45e0: 4e 61 6d 65 3d 3d 6e 20 0a 20 20 20 20 20 26 26  Name==n .     &&
45f0: 20 6d 65 6d 63 6d 70 28 70 43 61 6e 64 69 64 61   memcmp(pCandida
4600: 74 65 2d 3e 7a 43 61 6e 6f 6e 69 63 61 6c 4e 61  te->zCanonicalNa
4610: 6d 65 2c 20 70 4e 65 77 2d 3e 7a 43 61 6e 6f 6e  me, pNew->zCanon
4620: 69 63 61 6c 4e 61 6d 65 2c 20 6e 29 3d 3d 30 0a  icalName, n)==0.
4630: 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 73 71      ){.       sq
4640: 6c 69 74 65 33 5f 66 72 65 65 28 70 4e 65 77 29  lite3_free(pNew)
4650: 3b 0a 20 20 20 20 20 20 20 70 43 61 6e 64 69 64  ;.       pCandid
4660: 61 74 65 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 20  ate->nRef++;.   
4670: 20 20 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74      unixLeaveMut
4680: 65 78 28 29 3b 0a 20 20 20 20 20 20 20 72 65 74  ex();.       ret
4690: 75 72 6e 20 70 43 61 6e 64 69 64 61 74 65 3b 0a  urn pCandidate;.
46a0: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
46b0: 4e 6f 20 6d 61 74 63 68 20 77 61 73 20 66 6f 75  No match was fou
46c0: 6e 64 2e 20 20 57 65 20 77 69 6c 6c 20 6d 61 6b  nd.  We will mak
46d0: 65 20 61 20 6e 65 77 20 66 69 6c 65 20 49 44 20  e a new file ID 
46e0: 2a 2f 0a 20 20 70 4e 65 77 2d 3e 6e 52 65 66 20  */.  pNew->nRef 
46f0: 3d 20 31 3b 0a 20 20 70 4e 65 77 2d 3e 6e 4e 61  = 1;.  pNew->nNa
4700: 6d 65 20 3d 20 6e 3b 0a 20 20 70 4e 65 77 2d 3e  me = n;.  pNew->
4710: 70 4e 65 78 74 20 3d 20 76 78 77 6f 72 6b 73 46  pNext = vxworksF
4720: 69 6c 65 4c 69 73 74 3b 0a 20 20 76 78 77 6f 72  ileList;.  vxwor
4730: 6b 73 46 69 6c 65 4c 69 73 74 20 3d 20 70 4e 65  ksFileList = pNe
4740: 77 3b 0a 20 20 75 6e 69 78 4c 65 61 76 65 4d 75  w;.  unixLeaveMu
4750: 74 65 78 28 29 3b 0a 20 20 72 65 74 75 72 6e 20  tex();.  return 
4760: 70 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44  pNew;.}../*.** D
4770: 65 63 72 65 6d 65 6e 74 20 74 68 65 20 72 65 66  ecrement the ref
4780: 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 6f 6e 20  erence count on 
4790: 61 20 76 78 77 6f 72 6b 73 46 69 6c 65 49 64 20  a vxworksFileId 
47a0: 6f 62 6a 65 63 74 2e 20 20 46 72 65 65 0a 2a 2a  object.  Free.**
47b0: 20 74 68 65 20 6f 62 6a 65 63 74 20 77 68 65 6e   the object when
47c0: 20 74 68 65 20 72 65 66 65 72 65 6e 63 65 20 63   the reference c
47d0: 6f 75 6e 74 20 72 65 61 63 68 65 73 20 7a 65 72  ount reaches zer
47e0: 6f 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  o..*/.static voi
47f0: 64 20 76 78 77 6f 72 6b 73 52 65 6c 65 61 73 65  d vxworksRelease
4800: 46 69 6c 65 49 64 28 73 74 72 75 63 74 20 76 78  FileId(struct vx
4810: 77 6f 72 6b 73 46 69 6c 65 49 64 20 2a 70 49 64  worksFileId *pId
4820: 29 7b 0a 20 20 75 6e 69 78 45 6e 74 65 72 4d 75  ){.  unixEnterMu
4830: 74 65 78 28 29 3b 0a 20 20 61 73 73 65 72 74 28  tex();.  assert(
4840: 20 70 49 64 2d 3e 6e 52 65 66 3e 30 20 29 3b 0a   pId->nRef>0 );.
4850: 20 20 70 49 64 2d 3e 6e 52 65 66 2d 2d 3b 0a 20    pId->nRef--;. 
4860: 20 69 66 28 20 70 49 64 2d 3e 6e 52 65 66 3d 3d   if( pId->nRef==
4870: 30 20 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20  0 ){.    struct 
4880: 76 78 77 6f 72 6b 73 46 69 6c 65 49 64 20 2a 2a  vxworksFileId **
4890: 70 70 3b 0a 20 20 20 20 66 6f 72 28 70 70 3d 26  pp;.    for(pp=&
48a0: 76 78 77 6f 72 6b 73 46 69 6c 65 4c 69 73 74 3b  vxworksFileList;
48b0: 20 2a 70 70 20 26 26 20 2a 70 70 21 3d 70 49 64   *pp && *pp!=pId
48c0: 3b 20 70 70 20 3d 20 26 28 28 2a 70 70 29 2d 3e  ; pp = &((*pp)->
48d0: 70 4e 65 78 74 29 29 7b 7d 0a 20 20 20 20 61 73  pNext)){}.    as
48e0: 73 65 72 74 28 20 2a 70 70 3d 3d 70 49 64 20 29  sert( *pp==pId )
48f0: 3b 0a 20 20 20 20 2a 70 70 20 3d 20 70 49 64 2d  ;.    *pp = pId-
4900: 3e 70 4e 65 78 74 3b 0a 20 20 20 20 73 71 6c 69  >pNext;.    sqli
4910: 74 65 33 5f 66 72 65 65 28 70 49 64 29 3b 0a 20  te3_free(pId);. 
4920: 20 7d 0a 20 20 75 6e 69 78 4c 65 61 76 65 4d 75   }.  unixLeaveMu
4930: 74 65 78 28 29 3b 0a 7d 0a 23 65 6e 64 69 66 20  tex();.}.#endif 
4940: 2f 2a 20 4f 53 5f 56 58 57 4f 52 4b 53 20 2a 2f  /* OS_VXWORKS */
4950: 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ./**************
4960: 2a 20 45 6e 64 20 6f 66 20 55 6e 69 71 75 65 20  * End of Unique 
4970: 46 69 6c 65 20 49 44 20 55 74 69 6c 69 74 79 20  File ID Utility 
4980: 55 73 65 64 20 42 79 20 56 78 57 6f 72 6b 73 20  Used By VxWorks 
4990: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
49a0: 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .***************
49b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
49c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
49d0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
49e0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f  ***************/
49f0: 0a 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .../************
4a00: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4a10: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4a20: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4a30: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4a40: 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  **.*************
4a50: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 50  ************** P
4a60: 6f 73 69 78 20 41 64 76 69 73 6f 72 79 20 4c 6f  osix Advisory Lo
4a70: 63 6b 69 6e 67 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  cking **********
4a80: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4a90: 2a 2a 0a 2a 2a 0a 2a 2a 20 50 4f 53 49 58 20 61  **.**.** POSIX a
4aa0: 64 76 69 73 6f 72 79 20 6c 6f 63 6b 73 20 61 72  dvisory locks ar
4ab0: 65 20 62 72 6f 6b 65 6e 20 62 79 20 64 65 73 69  e broken by desi
4ac0: 67 6e 2e 20 20 41 4e 53 49 20 53 54 44 20 31 30  gn.  ANSI STD 10
4ad0: 30 33 2e 31 20 28 31 39 39 36 29 0a 2a 2a 20 73  03.1 (1996).** s
4ae0: 65 63 74 69 6f 6e 20 36 2e 35 2e 32 2e 32 20 6c  ection 6.5.2.2 l
4af0: 69 6e 65 73 20 34 38 33 20 74 68 72 6f 75 67 68  ines 483 through
4b00: 20 34 39 30 20 73 70 65 63 69 66 79 20 74 68 61   490 specify tha
4b10: 74 20 77 68 65 6e 20 61 20 70 72 6f 63 65 73 73  t when a process
4b20: 0a 2a 2a 20 73 65 74 73 20 6f 72 20 63 6c 65 61  .** sets or clea
4b30: 72 73 20 61 20 6c 6f 63 6b 2c 20 74 68 61 74 20  rs a lock, that 
4b40: 6f 70 65 72 61 74 69 6f 6e 20 6f 76 65 72 72 69  operation overri
4b50: 64 65 73 20 61 6e 79 20 70 72 69 6f 72 20 6c 6f  des any prior lo
4b60: 63 6b 73 20 73 65 74 0a 2a 2a 20 62 79 20 74 68  cks set.** by th
4b70: 65 20 73 61 6d 65 20 70 72 6f 63 65 73 73 2e 20  e same process. 
4b80: 20 49 74 20 64 6f 65 73 20 6e 6f 74 20 65 78 70   It does not exp
4b90: 6c 69 63 69 74 6c 79 20 73 61 79 20 73 6f 2c 20  licitly say so, 
4ba0: 62 75 74 20 74 68 69 73 20 69 6d 70 6c 69 65 73  but this implies
4bb0: 0a 2a 2a 20 74 68 61 74 20 69 74 20 6f 76 65 72  .** that it over
4bc0: 72 69 64 65 73 20 6c 6f 63 6b 73 20 73 65 74 20  rides locks set 
4bd0: 62 79 20 74 68 65 20 73 61 6d 65 20 70 72 6f 63  by the same proc
4be0: 65 73 73 20 75 73 69 6e 67 20 61 20 64 69 66 66  ess using a diff
4bf0: 65 72 65 6e 74 0a 2a 2a 20 66 69 6c 65 20 64 65  erent.** file de
4c00: 73 63 72 69 70 74 6f 72 2e 20 20 43 6f 6e 73 69  scriptor.  Consi
4c10: 64 65 72 20 74 68 69 73 20 74 65 73 74 20 63 61  der this test ca
4c20: 73 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20  se:.**.**       
4c30: 69 6e 74 20 66 64 31 20 3d 20 6f 70 65 6e 28 22  int fd1 = open("
4c40: 2e 2f 66 69 6c 65 31 22 2c 20 4f 5f 52 44 57 52  ./file1", O_RDWR
4c50: 7c 4f 5f 43 52 45 41 54 2c 20 30 36 34 34 29 3b  |O_CREAT, 0644);
4c60: 0a 2a 2a 20 20 20 20 20 20 20 69 6e 74 20 66 64  .**       int fd
4c70: 32 20 3d 20 6f 70 65 6e 28 22 2e 2f 66 69 6c 65  2 = open("./file
4c80: 32 22 2c 20 4f 5f 52 44 57 52 7c 4f 5f 43 52 45  2", O_RDWR|O_CRE
4c90: 41 54 2c 20 30 36 34 34 29 3b 0a 2a 2a 0a 2a 2a  AT, 0644);.**.**
4ca0: 20 53 75 70 70 6f 73 65 20 2e 2f 66 69 6c 65 31   Suppose ./file1
4cb0: 20 61 6e 64 20 2e 2f 66 69 6c 65 32 20 61 72 65   and ./file2 are
4cc0: 20 72 65 61 6c 6c 79 20 74 68 65 20 73 61 6d 65   really the same
4cd0: 20 66 69 6c 65 20 28 62 65 63 61 75 73 65 0a 2a   file (because.*
4ce0: 2a 20 6f 6e 65 20 69 73 20 61 20 68 61 72 64 20  * one is a hard 
4cf0: 6f 72 20 73 79 6d 62 6f 6c 69 63 20 6c 69 6e 6b  or symbolic link
4d00: 20 74 6f 20 74 68 65 20 6f 74 68 65 72 29 20 74   to the other) t
4d10: 68 65 6e 20 69 66 20 79 6f 75 20 73 65 74 0a 2a  hen if you set.*
4d20: 2a 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c  * an exclusive l
4d30: 6f 63 6b 20 6f 6e 20 66 64 31 2c 20 74 68 65 6e  ock on fd1, then
4d40: 20 74 72 79 20 74 6f 20 67 65 74 20 61 6e 20 65   try to get an e
4d50: 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 0a 2a 2a  xclusive lock.**
4d60: 20 6f 6e 20 66 64 32 2c 20 69 74 20 77 6f 72 6b   on fd2, it work
4d70: 73 2e 20 20 49 20 77 6f 75 6c 64 20 68 61 76 65  s.  I would have
4d80: 20 65 78 70 65 63 74 65 64 20 74 68 65 20 73 65   expected the se
4d90: 63 6f 6e 64 20 6c 6f 63 6b 20 74 6f 0a 2a 2a 20  cond lock to.** 
4da0: 66 61 69 6c 20 73 69 6e 63 65 20 74 68 65 72 65  fail since there
4db0: 20 77 61 73 20 61 6c 72 65 61 64 79 20 61 20 6c   was already a l
4dc0: 6f 63 6b 20 6f 6e 20 74 68 65 20 66 69 6c 65 20  ock on the file 
4dd0: 64 75 65 20 74 6f 20 66 64 31 2e 0a 2a 2a 20 42  due to fd1..** B
4de0: 75 74 20 6e 6f 74 20 73 6f 2e 20 20 53 69 6e 63  ut not so.  Sinc
4df0: 65 20 62 6f 74 68 20 6c 6f 63 6b 73 20 63 61 6d  e both locks cam
4e00: 65 20 66 72 6f 6d 20 74 68 65 20 73 61 6d 65 20  e from the same 
4e10: 70 72 6f 63 65 73 73 2c 20 74 68 65 0a 2a 2a 20  process, the.** 
4e20: 73 65 63 6f 6e 64 20 6f 76 65 72 72 69 64 65 73  second overrides
4e30: 20 74 68 65 20 66 69 72 73 74 2c 20 65 76 65 6e   the first, even
4e40: 20 74 68 6f 75 67 68 20 74 68 65 79 20 77 65 72   though they wer
4e50: 65 20 6f 6e 20 64 69 66 66 65 72 65 6e 74 0a 2a  e on different.*
4e60: 2a 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  * file descripto
4e70: 72 73 20 6f 70 65 6e 65 64 20 6f 6e 20 64 69 66  rs opened on dif
4e80: 66 65 72 65 6e 74 20 66 69 6c 65 20 6e 61 6d 65  ferent file name
4e90: 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 6d 65  s..**.** This me
4ea0: 61 6e 73 20 74 68 61 74 20 77 65 20 63 61 6e 6e  ans that we cann
4eb0: 6f 74 20 75 73 65 20 50 4f 53 49 58 20 6c 6f 63  ot use POSIX loc
4ec0: 6b 73 20 74 6f 20 73 79 6e 63 68 72 6f 6e 69 7a  ks to synchroniz
4ed0: 65 20 66 69 6c 65 20 61 63 63 65 73 73 0a 2a 2a  e file access.**
4ee0: 20 61 6d 6f 6e 67 20 63 6f 6d 70 65 74 69 6e 67   among competing
4ef0: 20 74 68 72 65 61 64 73 20 6f 66 20 74 68 65 20   threads of the 
4f00: 73 61 6d 65 20 70 72 6f 63 65 73 73 2e 20 20 50  same process.  P
4f10: 4f 53 49 58 20 6c 6f 63 6b 73 20 77 69 6c 6c 20  OSIX locks will 
4f20: 77 6f 72 6b 20 66 69 6e 65 0a 2a 2a 20 74 6f 20  work fine.** to 
4f30: 73 79 6e 63 68 72 6f 6e 69 7a 65 20 61 63 63 65  synchronize acce
4f40: 73 73 20 66 6f 72 20 74 68 72 65 61 64 73 20 69  ss for threads i
4f50: 6e 20 73 65 70 61 72 61 74 65 20 70 72 6f 63 65  n separate proce
4f60: 73 73 65 73 2c 20 62 75 74 20 6e 6f 74 0a 2a 2a  sses, but not.**
4f70: 20 74 68 72 65 61 64 73 20 77 69 74 68 69 6e 20   threads within 
4f80: 74 68 65 20 73 61 6d 65 20 70 72 6f 63 65 73 73  the same process
4f90: 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20 77 6f 72 6b 20  ..**.** To work 
4fa0: 61 72 6f 75 6e 64 20 74 68 65 20 70 72 6f 62 6c  around the probl
4fb0: 65 6d 2c 20 53 51 4c 69 74 65 20 68 61 73 20 74  em, SQLite has t
4fc0: 6f 20 6d 61 6e 61 67 65 20 66 69 6c 65 20 6c 6f  o manage file lo
4fd0: 63 6b 73 20 69 6e 74 65 72 6e 61 6c 6c 79 0a 2a  cks internally.*
4fe0: 2a 20 6f 6e 20 69 74 73 20 6f 77 6e 2e 20 20 57  * on its own.  W
4ff0: 68 65 6e 65 76 65 72 20 61 20 6e 65 77 20 64 61  henever a new da
5000: 74 61 62 61 73 65 20 69 73 20 6f 70 65 6e 65 64  tabase is opened
5010: 2c 20 77 65 20 68 61 76 65 20 74 6f 20 66 69 6e  , we have to fin
5020: 64 20 74 68 65 0a 2a 2a 20 73 70 65 63 69 66 69  d the.** specifi
5030: 63 20 69 6e 6f 64 65 20 6f 66 20 74 68 65 20 64  c inode of the d
5040: 61 74 61 62 61 73 65 20 66 69 6c 65 20 28 74 68  atabase file (th
5050: 65 20 69 6e 6f 64 65 20 69 73 20 64 65 74 65 72  e inode is deter
5060: 6d 69 6e 65 64 20 62 79 20 74 68 65 0a 2a 2a 20  mined by the.** 
5070: 73 74 5f 64 65 76 20 61 6e 64 20 73 74 5f 69 6e  st_dev and st_in
5080: 6f 20 66 69 65 6c 64 73 20 6f 66 20 74 68 65 20  o fields of the 
5090: 73 74 61 74 20 73 74 72 75 63 74 75 72 65 20 74  stat structure t
50a0: 68 61 74 20 66 73 74 61 74 28 29 20 66 69 6c 6c  hat fstat() fill
50b0: 73 20 69 6e 29 0a 2a 2a 20 61 6e 64 20 63 68 65  s in).** and che
50c0: 63 6b 20 66 6f 72 20 6c 6f 63 6b 73 20 61 6c 72  ck for locks alr
50d0: 65 61 64 79 20 65 78 69 73 74 69 6e 67 20 6f 6e  eady existing on
50e0: 20 74 68 61 74 20 69 6e 6f 64 65 2e 20 20 57 68   that inode.  Wh
50f0: 65 6e 20 6c 6f 63 6b 73 20 61 72 65 0a 2a 2a 20  en locks are.** 
5100: 63 72 65 61 74 65 64 20 6f 72 20 72 65 6d 6f 76  created or remov
5110: 65 64 2c 20 77 65 20 68 61 76 65 20 74 6f 20 6c  ed, we have to l
5120: 6f 6f 6b 20 61 74 20 6f 75 72 20 6f 77 6e 20 69  ook at our own i
5130: 6e 74 65 72 6e 61 6c 20 72 65 63 6f 72 64 20 6f  nternal record o
5140: 66 20 74 68 65 0a 2a 2a 20 6c 6f 63 6b 73 20 74  f the.** locks t
5150: 6f 20 73 65 65 20 69 66 20 61 6e 6f 74 68 65 72  o see if another
5160: 20 74 68 72 65 61 64 20 68 61 73 20 70 72 65 76   thread has prev
5170: 69 6f 75 73 6c 79 20 73 65 74 20 61 20 6c 6f 63  iously set a loc
5180: 6b 20 6f 6e 20 74 68 61 74 20 73 61 6d 65 0a 2a  k on that same.*
5190: 2a 20 69 6e 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 28  * inode..**.** (
51a0: 41 73 69 64 65 3a 20 54 68 65 20 75 73 65 20 6f  Aside: The use o
51b0: 66 20 69 6e 6f 64 65 20 6e 75 6d 62 65 72 73 20  f inode numbers 
51c0: 61 73 20 75 6e 69 71 75 65 20 49 44 73 20 64 6f  as unique IDs do
51d0: 65 73 20 6e 6f 74 20 77 6f 72 6b 20 6f 6e 20 56  es not work on V
51e0: 78 57 6f 72 6b 73 2e 0a 2a 2a 20 46 6f 72 20 56  xWorks..** For V
51f0: 78 57 6f 72 6b 73 2c 20 77 65 20 68 61 76 65 20  xWorks, we have 
5200: 74 6f 20 75 73 65 20 74 68 65 20 61 6c 74 65 72  to use the alter
5210: 6e 61 74 69 76 65 20 75 6e 69 71 75 65 20 49 44  native unique ID
5220: 20 73 79 73 74 65 6d 20 62 61 73 65 64 20 6f 6e   system based on
5230: 0a 2a 2a 20 63 61 6e 6f 6e 69 63 61 6c 20 66 69  .** canonical fi
5240: 6c 65 6e 61 6d 65 20 61 6e 64 20 69 6d 70 6c 65  lename and imple
5250: 6d 65 6e 74 65 64 20 69 6e 20 74 68 65 20 70 72  mented in the pr
5260: 65 76 69 6f 75 73 20 64 69 76 69 73 69 6f 6e 2e  evious division.
5270: 29 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 71 6c 69  ).**.** The sqli
5280: 74 65 33 5f 66 69 6c 65 20 73 74 72 75 63 74 75  te3_file structu
5290: 72 65 20 66 6f 72 20 50 4f 53 49 58 20 69 73 20  re for POSIX is 
52a0: 6e 6f 20 6c 6f 6e 67 65 72 20 6a 75 73 74 20 61  no longer just a
52b0: 6e 20 69 6e 74 65 67 65 72 20 66 69 6c 65 0a 2a  n integer file.*
52c0: 2a 20 64 65 73 63 72 69 70 74 6f 72 2e 20 20 49  * descriptor.  I
52d0: 74 20 69 73 20 6e 6f 77 20 61 20 73 74 72 75 63  t is now a struc
52e0: 74 75 72 65 20 74 68 61 74 20 68 6f 6c 64 73 20  ture that holds 
52f0: 74 68 65 20 69 6e 74 65 67 65 72 20 66 69 6c 65  the integer file
5300: 0a 2a 2a 20 64 65 73 63 72 69 70 74 6f 72 20 61  .** descriptor a
5310: 6e 64 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  nd a pointer to 
5320: 61 20 73 74 72 75 63 74 75 72 65 20 74 68 61 74  a structure that
5330: 20 64 65 73 63 72 69 62 65 73 20 74 68 65 20 69   describes the i
5340: 6e 74 65 72 6e 61 6c 0a 2a 2a 20 6c 6f 63 6b 73  nternal.** locks
5350: 20 6f 6e 20 74 68 65 20 63 6f 72 72 65 73 70 6f   on the correspo
5360: 6e 64 69 6e 67 20 69 6e 6f 64 65 2e 20 20 54 68  nding inode.  Th
5370: 65 72 65 20 69 73 20 6f 6e 65 20 6c 6f 63 6b 69  ere is one locki
5380: 6e 67 20 73 74 72 75 63 74 75 72 65 0a 2a 2a 20  ng structure.** 
5390: 70 65 72 20 69 6e 6f 64 65 2c 20 73 6f 20 69 66  per inode, so if
53a0: 20 74 68 65 20 73 61 6d 65 20 69 6e 6f 64 65 20   the same inode 
53b0: 69 73 20 6f 70 65 6e 65 64 20 74 77 69 63 65 2c  is opened twice,
53c0: 20 62 6f 74 68 20 75 6e 69 78 46 69 6c 65 20 73   both unixFile s
53d0: 74 72 75 63 74 75 72 65 73 0a 2a 2a 20 70 6f 69  tructures.** poi
53e0: 6e 74 20 74 6f 20 74 68 65 20 73 61 6d 65 20 6c  nt to the same l
53f0: 6f 63 6b 69 6e 67 20 73 74 72 75 63 74 75 72 65  ocking structure
5400: 2e 20 20 54 68 65 20 6c 6f 63 6b 69 6e 67 20 73  .  The locking s
5410: 74 72 75 63 74 75 72 65 20 6b 65 65 70 73 0a 2a  tructure keeps.*
5420: 2a 20 61 20 72 65 66 65 72 65 6e 63 65 20 63 6f  * a reference co
5430: 75 6e 74 20 28 73 6f 20 77 65 20 77 69 6c 6c 20  unt (so we will 
5440: 6b 6e 6f 77 20 77 68 65 6e 20 74 6f 20 64 65 6c  know when to del
5450: 65 74 65 20 69 74 29 20 61 6e 64 20 61 20 22 63  ete it) and a "c
5460: 6e 74 22 0a 2a 2a 20 66 69 65 6c 64 20 74 68 61  nt".** field tha
5470: 74 20 74 65 6c 6c 73 20 75 73 20 69 74 73 20 69  t tells us its i
5480: 6e 74 65 72 6e 61 6c 20 6c 6f 63 6b 20 73 74 61  nternal lock sta
5490: 74 75 73 2e 20 20 63 6e 74 3d 3d 30 20 6d 65 61  tus.  cnt==0 mea
54a0: 6e 73 20 74 68 65 0a 2a 2a 20 66 69 6c 65 20 69  ns the.** file i
54b0: 73 20 75 6e 6c 6f 63 6b 65 64 2e 20 20 63 6e 74  s unlocked.  cnt
54c0: 3d 3d 2d 31 20 6d 65 61 6e 73 20 74 68 65 20 66  ==-1 means the f
54d0: 69 6c 65 20 68 61 73 20 61 6e 20 65 78 63 6c 75  ile has an exclu
54e0: 73 69 76 65 20 6c 6f 63 6b 2e 0a 2a 2a 20 63 6e  sive lock..** cn
54f0: 74 3e 30 20 6d 65 61 6e 73 20 74 68 65 72 65 20  t>0 means there 
5500: 61 72 65 20 63 6e 74 20 73 68 61 72 65 64 20 6c  are cnt shared l
5510: 6f 63 6b 73 20 6f 6e 20 74 68 65 20 66 69 6c 65  ocks on the file
5520: 2e 0a 2a 2a 0a 2a 2a 20 41 6e 79 20 61 74 74 65  ..**.** Any atte
5530: 6d 70 74 20 74 6f 20 6c 6f 63 6b 20 6f 72 20 75  mpt to lock or u
5540: 6e 6c 6f 63 6b 20 61 20 66 69 6c 65 20 66 69 72  nlock a file fir
5550: 73 74 20 63 68 65 63 6b 73 20 74 68 65 20 6c 6f  st checks the lo
5560: 63 6b 69 6e 67 0a 2a 2a 20 73 74 72 75 63 74 75  cking.** structu
5570: 72 65 2e 20 20 54 68 65 20 66 63 6e 74 6c 28 29  re.  The fcntl()
5580: 20 73 79 73 74 65 6d 20 63 61 6c 6c 20 69 73 20   system call is 
5590: 6f 6e 6c 79 20 69 6e 76 6f 6b 65 64 20 74 6f 20  only invoked to 
55a0: 73 65 74 20 61 20 0a 2a 2a 20 50 4f 53 49 58 20  set a .** POSIX 
55b0: 6c 6f 63 6b 20 69 66 20 74 68 65 20 69 6e 74 65  lock if the inte
55c0: 72 6e 61 6c 20 6c 6f 63 6b 20 73 74 72 75 63 74  rnal lock struct
55d0: 75 72 65 20 74 72 61 6e 73 69 74 69 6f 6e 73 20  ure transitions 
55e0: 62 65 74 77 65 65 6e 0a 2a 2a 20 61 20 6c 6f 63  between.** a loc
55f0: 6b 65 64 20 61 6e 64 20 61 6e 20 75 6e 6c 6f 63  ked and an unloc
5600: 6b 65 64 20 73 74 61 74 65 2e 0a 2a 2a 0a 2a 2a  ked state..**.**
5610: 20 42 75 74 20 77 61 69 74 3a 20 20 74 68 65 72   But wait:  ther
5620: 65 20 61 72 65 20 79 65 74 20 6d 6f 72 65 20 70  e are yet more p
5630: 72 6f 62 6c 65 6d 73 20 77 69 74 68 20 50 4f 53  roblems with POS
5640: 49 58 20 61 64 76 69 73 6f 72 79 20 6c 6f 63 6b  IX advisory lock
5650: 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 79 6f 75 20  s..**.** If you 
5660: 63 6c 6f 73 65 20 61 20 66 69 6c 65 20 64 65 73  close a file des
5670: 63 72 69 70 74 6f 72 20 74 68 61 74 20 70 6f 69  criptor that poi
5680: 6e 74 73 20 74 6f 20 61 20 66 69 6c 65 20 74 68  nts to a file th
5690: 61 74 20 68 61 73 20 6c 6f 63 6b 73 2c 0a 2a 2a  at has locks,.**
56a0: 20 61 6c 6c 20 6c 6f 63 6b 73 20 6f 6e 20 74 68   all locks on th
56b0: 61 74 20 66 69 6c 65 20 74 68 61 74 20 61 72 65  at file that are
56c0: 20 6f 77 6e 65 64 20 62 79 20 74 68 65 20 63 75   owned by the cu
56d0: 72 72 65 6e 74 20 70 72 6f 63 65 73 73 20 61 72  rrent process ar
56e0: 65 0a 2a 2a 20 72 65 6c 65 61 73 65 64 2e 20 20  e.** released.  
56f0: 54 6f 20 77 6f 72 6b 20 61 72 6f 75 6e 64 20 74  To work around t
5700: 68 69 73 20 70 72 6f 62 6c 65 6d 2c 20 65 61 63  his problem, eac
5710: 68 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20  h unixInodeInfo 
5720: 6f 62 6a 65 63 74 0a 2a 2a 20 6d 61 69 6e 74 61  object.** mainta
5730: 69 6e 73 20 61 20 63 6f 75 6e 74 20 6f 66 20 74  ins a count of t
5740: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 65 6e  he number of pen
5750: 64 69 6e 67 20 6c 6f 63 6b 73 20 6f 6e 20 74 68  ding locks on th
5760: 61 20 69 6e 6f 64 65 2e 0a 2a 2a 20 57 68 65 6e  a inode..** When
5770: 20 61 6e 20 61 74 74 65 6d 70 74 20 69 73 20 6d   an attempt is m
5780: 61 64 65 20 74 6f 20 63 6c 6f 73 65 20 61 6e 20  ade to close an 
5790: 75 6e 69 78 46 69 6c 65 2c 20 69 66 20 74 68 65  unixFile, if the
57a0: 72 65 20 61 72 65 0a 2a 2a 20 6f 74 68 65 72 20  re are.** other 
57b0: 75 6e 69 78 46 69 6c 65 20 6f 70 65 6e 20 6f 6e  unixFile open on
57c0: 20 74 68 65 20 73 61 6d 65 20 69 6e 6f 64 65 20   the same inode 
57d0: 74 68 61 74 20 61 72 65 20 68 6f 6c 64 69 6e 67  that are holding
57e0: 20 6c 6f 63 6b 73 2c 20 74 68 65 20 63 61 6c 6c   locks, the call
57f0: 0a 2a 2a 20 74 6f 20 63 6c 6f 73 65 28 29 20 74  .** to close() t
5800: 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  he file descript
5810: 6f 72 20 69 73 20 64 65 66 65 72 72 65 64 20 75  or is deferred u
5820: 6e 74 69 6c 20 61 6c 6c 20 6f 66 20 74 68 65 20  ntil all of the 
5830: 6c 6f 63 6b 73 20 63 6c 65 61 72 2e 0a 2a 2a 20  locks clear..** 
5840: 54 68 65 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66  The unixInodeInf
5850: 6f 20 73 74 72 75 63 74 75 72 65 20 6b 65 65 70  o structure keep
5860: 73 20 61 20 6c 69 73 74 20 6f 66 20 66 69 6c 65  s a list of file
5870: 20 64 65 73 63 72 69 70 74 6f 72 73 20 74 68 61   descriptors tha
5880: 74 20 6e 65 65 64 20 74 6f 0a 2a 2a 20 62 65 20  t need to.** be 
5890: 63 6c 6f 73 65 64 20 61 6e 64 20 74 68 61 74 20  closed and that 
58a0: 6c 69 73 74 20 69 73 20 77 61 6c 6b 65 64 20 28  list is walked (
58b0: 61 6e 64 20 63 6c 65 61 72 65 64 29 20 77 68 65  and cleared) whe
58c0: 6e 20 74 68 65 20 6c 61 73 74 20 6c 6f 63 6b 0a  n the last lock.
58d0: 2a 2a 20 63 6c 65 61 72 73 2e 0a 2a 2a 0a 2a 2a  ** clears..**.**
58e0: 20 59 65 74 20 61 6e 6f 74 68 65 72 20 70 72 6f   Yet another pro
58f0: 62 6c 65 6d 3a 20 20 4c 69 6e 75 78 54 68 72 65  blem:  LinuxThre
5900: 61 64 73 20 64 6f 20 6e 6f 74 20 70 6c 61 79 20  ads do not play 
5910: 77 65 6c 6c 20 77 69 74 68 20 70 6f 73 69 78 20  well with posix 
5920: 6c 6f 63 6b 73 2e 0a 2a 2a 0a 2a 2a 20 4d 61 6e  locks..**.** Man
5930: 79 20 6f 6c 64 65 72 20 76 65 72 73 69 6f 6e 73  y older versions
5940: 20 6f 66 20 6c 69 6e 75 78 20 75 73 65 20 74 68   of linux use th
5950: 65 20 4c 69 6e 75 78 54 68 72 65 61 64 73 20 6c  e LinuxThreads l
5960: 69 62 72 61 72 79 20 77 68 69 63 68 20 69 73 0a  ibrary which is.
5970: 2a 2a 20 6e 6f 74 20 70 6f 73 69 78 20 63 6f 6d  ** not posix com
5980: 70 6c 69 61 6e 74 2e 20 20 55 6e 64 65 72 20 4c  pliant.  Under L
5990: 69 6e 75 78 54 68 72 65 61 64 73 2c 20 61 20 6c  inuxThreads, a l
59a0: 6f 63 6b 20 63 72 65 61 74 65 64 20 62 79 20 74  ock created by t
59b0: 68 72 65 61 64 0a 2a 2a 20 41 20 63 61 6e 6e 6f  hread.** A canno
59c0: 74 20 62 65 20 6d 6f 64 69 66 69 65 64 20 6f 72  t be modified or
59d0: 20 6f 76 65 72 72 69 64 64 65 6e 20 62 79 20 61   overridden by a
59e0: 20 64 69 66 66 65 72 65 6e 74 20 74 68 72 65 61   different threa
59f0: 64 20 42 2e 0a 2a 2a 20 4f 6e 6c 79 20 74 68 72  d B..** Only thr
5a00: 65 61 64 20 41 20 63 61 6e 20 6d 6f 64 69 66 79  ead A can modify
5a10: 20 74 68 65 20 6c 6f 63 6b 2e 20 20 4c 6f 63 6b   the lock.  Lock
5a20: 69 6e 67 20 62 65 68 61 76 69 6f 72 20 69 73 20  ing behavior is 
5a30: 63 6f 72 72 65 63 74 0a 2a 2a 20 69 66 20 74 68  correct.** if th
5a40: 65 20 61 70 70 6c 69 61 74 69 6f 6e 20 75 73 65  e appliation use
5a50: 73 20 74 68 65 20 6e 65 77 65 72 20 4e 61 74 69  s the newer Nati
5a60: 76 65 20 50 6f 73 69 78 20 54 68 72 65 61 64 20  ve Posix Thread 
5a70: 4c 69 62 72 61 72 79 20 28 4e 50 54 4c 29 0a 2a  Library (NPTL).*
5a80: 2a 20 6f 6e 20 6c 69 6e 75 78 20 2d 20 77 69 74  * on linux - wit
5a90: 68 20 4e 50 54 4c 20 61 20 6c 6f 63 6b 20 63 72  h NPTL a lock cr
5aa0: 65 61 74 65 64 20 62 79 20 74 68 72 65 61 64 20  eated by thread 
5ab0: 41 20 63 61 6e 20 6f 76 65 72 72 69 64 65 20 6c  A can override l
5ac0: 6f 63 6b 73 0a 2a 2a 20 69 6e 20 74 68 72 65 61  ocks.** in threa
5ad0: 64 20 42 2e 20 20 42 75 74 20 74 68 65 72 65 20  d B.  But there 
5ae0: 69 73 20 6e 6f 20 77 61 79 20 74 6f 20 6b 6e 6f  is no way to kno
5af0: 77 20 61 74 20 63 6f 6d 70 69 6c 65 2d 74 69 6d  w at compile-tim
5b00: 65 20 77 68 69 63 68 0a 2a 2a 20 74 68 72 65 61  e which.** threa
5b10: 64 69 6e 67 20 6c 69 62 72 61 72 79 20 69 73 20  ding library is 
5b20: 62 65 69 6e 67 20 75 73 65 64 2e 20 20 53 6f 20  being used.  So 
5b30: 74 68 65 72 65 20 69 73 20 6e 6f 20 77 61 79 20  there is no way 
5b40: 74 6f 20 6b 6e 6f 77 20 61 74 0a 2a 2a 20 63 6f  to know at.** co
5b50: 6d 70 69 6c 65 2d 74 69 6d 65 20 77 68 65 74 68  mpile-time wheth
5b60: 65 72 20 6f 72 20 6e 6f 74 20 74 68 72 65 61 64  er or not thread
5b70: 20 41 20 63 61 6e 20 6f 76 65 72 72 69 64 65 20   A can override 
5b80: 6c 6f 63 6b 73 20 6f 6e 20 74 68 72 65 61 64 20  locks on thread 
5b90: 42 2e 0a 2a 2a 20 4f 6e 65 20 68 61 73 20 74 6f  B..** One has to
5ba0: 20 64 6f 20 61 20 72 75 6e 2d 74 69 6d 65 20 63   do a run-time c
5bb0: 68 65 63 6b 20 74 6f 20 64 69 73 63 6f 76 65 72  heck to discover
5bc0: 20 74 68 65 20 62 65 68 61 76 69 6f 72 20 6f 66   the behavior of
5bd0: 20 74 68 65 0a 2a 2a 20 63 75 72 72 65 6e 74 20   the.** current 
5be0: 70 72 6f 63 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 53  process..**.** S
5bf0: 51 4c 69 74 65 20 75 73 65 64 20 74 6f 20 73 75  QLite used to su
5c00: 70 70 6f 72 74 20 4c 69 6e 75 78 54 68 72 65 61  pport LinuxThrea
5c10: 64 73 2e 20 20 42 75 74 20 73 75 70 70 6f 72 74  ds.  But support
5c20: 20 66 6f 72 20 4c 69 6e 75 78 54 68 72 65 61 64   for LinuxThread
5c30: 73 0a 2a 2a 20 77 61 73 20 64 72 6f 70 70 65 64  s.** was dropped
5c40: 20 62 65 67 69 6e 6e 69 6e 67 20 77 69 74 68 20   beginning with 
5c50: 76 65 72 73 69 6f 6e 20 33 2e 37 2e 30 2e 20 20  version 3.7.0.  
5c60: 53 51 4c 69 74 65 20 77 69 6c 6c 20 73 74 69 6c  SQLite will stil
5c70: 6c 20 77 6f 72 6b 20 77 69 74 68 0a 2a 2a 20 4c  l work with.** L
5c80: 69 6e 75 78 54 68 72 65 61 64 73 20 70 72 6f 76  inuxThreads prov
5c90: 69 64 65 64 20 74 68 61 74 20 28 31 29 20 74 68  ided that (1) th
5ca0: 65 72 65 20 69 73 20 6e 6f 20 6d 6f 72 65 20 74  ere is no more t
5cb0: 68 61 6e 20 6f 6e 65 20 63 6f 6e 6e 65 63 74 69  han one connecti
5cc0: 6f 6e 20 0a 2a 2a 20 70 65 72 20 64 61 74 61 62  on .** per datab
5cd0: 61 73 65 20 66 69 6c 65 20 69 6e 20 74 68 65 20  ase file in the 
5ce0: 73 61 6d 65 20 70 72 6f 63 65 73 73 20 61 6e 64  same process and
5cf0: 20 28 32 29 20 64 61 74 61 62 61 73 65 20 63 6f   (2) database co
5d00: 6e 6e 65 63 74 69 6f 6e 73 0a 2a 2a 20 64 6f 20  nnections.** do 
5d10: 6e 6f 74 20 6d 6f 76 65 20 61 63 72 6f 73 73 20  not move across 
5d20: 74 68 72 65 61 64 73 2e 0a 2a 2f 0a 0a 2f 2a 0a  threads..*/../*.
5d30: 2a 2a 20 41 6e 20 69 6e 73 74 61 6e 63 65 20 6f  ** An instance o
5d40: 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  f the following 
5d50: 73 74 72 75 63 74 75 72 65 20 73 65 72 76 65 73  structure serves
5d60: 20 61 73 20 74 68 65 20 6b 65 79 20 75 73 65 64   as the key used
5d70: 0a 2a 2a 20 74 6f 20 6c 6f 63 61 74 65 20 61 20  .** to locate a 
5d80: 70 61 72 74 69 63 75 6c 61 72 20 75 6e 69 78 49  particular unixI
5d90: 6e 6f 64 65 49 6e 66 6f 20 6f 62 6a 65 63 74 2e  nodeInfo object.
5da0: 0a 2a 2f 0a 73 74 72 75 63 74 20 75 6e 69 78 46  .*/.struct unixF
5db0: 69 6c 65 49 64 20 7b 0a 20 20 64 65 76 5f 74 20  ileId {.  dev_t 
5dc0: 64 65 76 3b 20 20 20 20 20 20 20 20 20 20 20 20  dev;            
5dd0: 20 20 20 20 20 20 2f 2a 20 44 65 76 69 63 65 20        /* Device 
5de0: 6e 75 6d 62 65 72 20 2a 2f 0a 23 69 66 20 4f 53  number */.#if OS
5df0: 5f 56 58 57 4f 52 4b 53 0a 20 20 73 74 72 75 63  _VXWORKS.  struc
5e00: 74 20 76 78 77 6f 72 6b 73 46 69 6c 65 49 64 20  t vxworksFileId 
5e10: 2a 70 49 64 3b 20 20 2f 2a 20 55 6e 69 71 75 65  *pId;  /* Unique
5e20: 20 66 69 6c 65 20 49 44 20 66 6f 72 20 76 78 77   file ID for vxw
5e30: 6f 72 6b 73 2e 20 2a 2f 0a 23 65 6c 73 65 0a 20  orks. */.#else. 
5e40: 20 69 6e 6f 5f 74 20 69 6e 6f 3b 20 20 20 20 20   ino_t ino;     
5e50: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
5e60: 49 6e 6f 64 65 20 6e 75 6d 62 65 72 20 2a 2f 0a  Inode number */.
5e70: 23 65 6e 64 69 66 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a  #endif.};../*.**
5e80: 20 41 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20   An instance of 
5e90: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74  the following st
5ea0: 72 75 63 74 75 72 65 20 69 73 20 61 6c 6c 6f 63  ructure is alloc
5eb0: 61 74 65 64 20 66 6f 72 20 65 61 63 68 20 6f 70  ated for each op
5ec0: 65 6e 0a 2a 2a 20 69 6e 6f 64 65 2e 20 20 4f 72  en.** inode.  Or
5ed0: 2c 20 6f 6e 20 4c 69 6e 75 78 54 68 72 65 61 64  , on LinuxThread
5ee0: 73 2c 20 74 68 65 72 65 20 69 73 20 6f 6e 65 20  s, there is one 
5ef0: 6f 66 20 74 68 65 73 65 20 73 74 72 75 63 74 75  of these structu
5f00: 72 65 73 20 66 6f 72 0a 2a 2a 20 65 61 63 68 20  res for.** each 
5f10: 69 6e 6f 64 65 20 6f 70 65 6e 65 64 20 62 79 20  inode opened by 
5f20: 65 61 63 68 20 74 68 72 65 61 64 2e 0a 2a 2a 0a  each thread..**.
5f30: 2a 2a 20 41 20 73 69 6e 67 6c 65 20 69 6e 6f 64  ** A single inod
5f40: 65 20 63 61 6e 20 68 61 76 65 20 6d 75 6c 74 69  e can have multi
5f50: 70 6c 65 20 66 69 6c 65 20 64 65 73 63 72 69 70  ple file descrip
5f60: 74 6f 72 73 2c 20 73 6f 20 65 61 63 68 20 75 6e  tors, so each un
5f70: 69 78 46 69 6c 65 0a 2a 2a 20 73 74 72 75 63 74  ixFile.** struct
5f80: 75 72 65 20 63 6f 6e 74 61 69 6e 73 20 61 20 70  ure contains a p
5f90: 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20 69 6e 73  ointer to an ins
5fa0: 74 61 6e 63 65 20 6f 66 20 74 68 69 73 20 6f 62  tance of this ob
5fb0: 6a 65 63 74 20 61 6e 64 20 74 68 69 73 0a 2a 2a  ject and this.**
5fc0: 20 6f 62 6a 65 63 74 20 6b 65 65 70 73 20 61 20   object keeps a 
5fd0: 63 6f 75 6e 74 20 6f 66 20 74 68 65 20 6e 75 6d  count of the num
5fe0: 62 65 72 20 6f 66 20 75 6e 69 78 46 69 6c 65 20  ber of unixFile 
5ff0: 70 6f 69 6e 74 69 6e 67 20 74 6f 20 69 74 2e 0a  pointing to it..
6000: 2a 2f 0a 73 74 72 75 63 74 20 75 6e 69 78 49 6e  */.struct unixIn
6010: 6f 64 65 49 6e 66 6f 20 7b 0a 20 20 73 74 72 75  odeInfo {.  stru
6020: 63 74 20 75 6e 69 78 46 69 6c 65 49 64 20 66 69  ct unixFileId fi
6030: 6c 65 49 64 3b 20 20 20 20 20 20 20 2f 2a 20 54  leId;       /* T
6040: 68 65 20 6c 6f 6f 6b 75 70 20 6b 65 79 20 2a 2f  he lookup key */
6050: 0a 20 20 69 6e 74 20 6e 53 68 61 72 65 64 3b 20  .  int nShared; 
6060: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6070: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
6080: 53 48 41 52 45 44 20 6c 6f 63 6b 73 20 68 65 6c  SHARED locks hel
6090: 64 20 2a 2f 0a 20 20 69 6e 74 20 65 46 69 6c 65  d */.  int eFile
60a0: 4c 6f 63 6b 3b 20 20 20 20 20 20 20 20 20 20 20  Lock;           
60b0: 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66         /* One of
60c0: 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2c 20 52 45   SHARED_LOCK, RE
60d0: 53 45 52 56 45 44 5f 4c 4f 43 4b 20 65 74 63 2e  SERVED_LOCK etc.
60e0: 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 66 3b 20   */.  int nRef; 
60f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6100: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
6110: 6f 66 20 70 6f 69 6e 74 65 72 73 20 74 6f 20 74  of pointers to t
6120: 68 69 73 20 73 74 72 75 63 74 75 72 65 20 2a 2f  his structure */
6130: 0a 20 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20 2a  .  unixShmNode *
6140: 70 53 68 6d 4e 6f 64 65 3b 20 20 20 20 20 20 20  pShmNode;       
6150: 20 20 20 2f 2a 20 53 68 61 72 65 64 20 6d 65 6d     /* Shared mem
6160: 6f 72 79 20 61 73 73 6f 63 69 61 74 65 64 20 77  ory associated w
6170: 69 74 68 20 74 68 69 73 20 69 6e 6f 64 65 20 2a  ith this inode *
6180: 2f 0a 20 20 69 6e 74 20 6e 4c 6f 63 6b 3b 20 20  /.  int nLock;  
6190: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
61a0: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
61b0: 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 66 69 6c   outstanding fil
61c0: 65 20 6c 6f 63 6b 73 20 2a 2f 0a 20 20 55 6e 69  e locks */.  Uni
61d0: 78 55 6e 75 73 65 64 46 64 20 2a 70 55 6e 75 73  xUnusedFd *pUnus
61e0: 65 64 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ed;          /* 
61f0: 55 6e 75 73 65 64 20 66 69 6c 65 20 64 65 73 63  Unused file desc
6200: 72 69 70 74 6f 72 73 20 74 6f 20 63 6c 6f 73 65  riptors to close
6210: 20 2a 2f 0a 20 20 75 6e 69 78 49 6e 6f 64 65 49   */.  unixInodeI
6220: 6e 66 6f 20 2a 70 4e 65 78 74 3b 20 20 20 20 20  nfo *pNext;     
6230: 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66        /* List of
6240: 20 61 6c 6c 20 75 6e 69 78 49 6e 6f 64 65 49 6e   all unixInodeIn
6250: 66 6f 20 6f 62 6a 65 63 74 73 20 2a 2f 0a 20 20  fo objects */.  
6260: 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 2a 70  unixInodeInfo *p
6270: 50 72 65 76 3b 20 20 20 20 20 20 20 20 20 20 20  Prev;           
6280: 2f 2a 20 20 20 20 2e 2e 2e 2e 20 64 6f 75 62 6c  /*    .... doubl
6290: 79 20 6c 69 6e 6b 65 64 20 2a 2f 0a 23 69 66 20  y linked */.#if 
62a0: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45  defined(SQLITE_E
62b0: 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54  NABLE_LOCKING_ST
62c0: 59 4c 45 29 0a 20 20 75 6e 73 69 67 6e 65 64 20  YLE).  unsigned 
62d0: 6c 6f 6e 67 20 6c 6f 6e 67 20 73 68 61 72 65 64  long long shared
62e0: 42 79 74 65 3b 20 20 2f 2a 20 66 6f 72 20 41 46  Byte;  /* for AF
62f0: 50 20 73 69 6d 75 6c 61 74 65 64 20 73 68 61 72  P simulated shar
6300: 65 64 20 6c 6f 63 6b 20 2a 2f 0a 23 65 6e 64 69  ed lock */.#endi
6310: 66 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53  f.#if OS_VXWORKS
6320: 0a 20 20 73 65 6d 5f 74 20 2a 70 53 65 6d 3b 20  .  sem_t *pSem; 
6330: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6340: 20 20 20 2f 2a 20 4e 61 6d 65 64 20 50 4f 53 49     /* Named POSI
6350: 58 20 73 65 6d 61 70 68 6f 72 65 20 2a 2f 0a 20  X semaphore */. 
6360: 20 63 68 61 72 20 61 53 65 6d 4e 61 6d 65 5b 4d   char aSemName[M
6370: 41 58 5f 50 41 54 48 4e 41 4d 45 2b 32 5d 3b 20  AX_PATHNAME+2]; 
6380: 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 61 74   /* Name of that
6390: 20 73 65 6d 61 70 68 6f 72 65 20 2a 2f 0a 23 65   semaphore */.#e
63a0: 6e 64 69 66 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41  ndif.};../*.** A
63b0: 20 6c 69 73 74 73 20 6f 66 20 61 6c 6c 20 75 6e   lists of all un
63c0: 69 78 49 6e 6f 64 65 49 6e 66 6f 20 6f 62 6a 65  ixInodeInfo obje
63d0: 63 74 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 75  cts..*/.static u
63e0: 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 2a 69 6e  nixInodeInfo *in
63f0: 6f 64 65 4c 69 73 74 20 3d 20 30 3b 0a 0a 2f 2a  odeList = 0;../*
6400: 0a 2a 2a 20 52 65 6c 65 61 73 65 20 61 20 75 6e  .** Release a un
6410: 69 78 49 6e 6f 64 65 49 6e 66 6f 20 73 74 72 75  ixInodeInfo stru
6420: 63 74 75 72 65 20 70 72 65 76 69 6f 75 73 6c 79  cture previously
6430: 20 61 6c 6c 6f 63 61 74 65 64 20 62 79 20 66 69   allocated by fi
6440: 6e 64 49 6e 6f 64 65 49 6e 66 6f 28 29 2e 0a 2a  ndInodeInfo()..*
6450: 2a 0a 2a 2a 20 54 68 65 20 6d 75 74 65 78 20 65  *.** The mutex e
6460: 6e 74 65 72 65 64 20 75 73 69 6e 67 20 74 68 65  ntered using the
6470: 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28   unixEnterMutex(
6480: 29 20 66 75 6e 63 74 69 6f 6e 20 6d 75 73 74 20  ) function must 
6490: 62 65 20 68 65 6c 64 0a 2a 2a 20 77 68 65 6e 20  be held.** when 
64a0: 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  this function is
64b0: 20 63 61 6c 6c 65 64 2e 0a 2a 2f 0a 73 74 61 74   called..*/.stat
64c0: 69 63 20 76 6f 69 64 20 72 65 6c 65 61 73 65 49  ic void releaseI
64d0: 6e 6f 64 65 49 6e 66 6f 28 75 6e 69 78 49 6e 6f  nodeInfo(unixIno
64e0: 64 65 49 6e 66 6f 20 2a 70 49 6e 6f 64 65 29 7b  deInfo *pInode){
64f0: 0a 20 20 61 73 73 65 72 74 28 20 75 6e 69 78 4d  .  assert( unixM
6500: 75 74 65 78 48 65 6c 64 28 29 20 29 3b 0a 20 20  utexHeld() );.  
6510: 69 66 28 20 70 49 6e 6f 64 65 20 29 7b 0a 20 20  if( pInode ){.  
6520: 20 20 70 49 6e 6f 64 65 2d 3e 6e 52 65 66 2d 2d    pInode->nRef--
6530: 3b 0a 20 20 20 20 69 66 28 20 70 49 6e 6f 64 65  ;.    if( pInode
6540: 2d 3e 6e 52 65 66 3d 3d 30 20 29 7b 0a 20 20 20  ->nRef==0 ){.   
6550: 20 20 20 61 73 73 65 72 74 28 20 70 49 6e 6f 64     assert( pInod
6560: 65 2d 3e 70 53 68 6d 4e 6f 64 65 3d 3d 30 20 29  e->pShmNode==0 )
6570: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 49 6e 6f  ;.      if( pIno
6580: 64 65 2d 3e 70 50 72 65 76 20 29 7b 0a 20 20 20  de->pPrev ){.   
6590: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 49 6e       assert( pIn
65a0: 6f 64 65 2d 3e 70 50 72 65 76 2d 3e 70 4e 65 78  ode->pPrev->pNex
65b0: 74 3d 3d 70 49 6e 6f 64 65 20 29 3b 0a 20 20 20  t==pInode );.   
65c0: 20 20 20 20 20 70 49 6e 6f 64 65 2d 3e 70 50 72       pInode->pPr
65d0: 65 76 2d 3e 70 4e 65 78 74 20 3d 20 70 49 6e 6f  ev->pNext = pIno
65e0: 64 65 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20  de->pNext;.     
65f0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
6600: 61 73 73 65 72 74 28 20 69 6e 6f 64 65 4c 69 73  assert( inodeLis
6610: 74 3d 3d 70 49 6e 6f 64 65 20 29 3b 0a 20 20 20  t==pInode );.   
6620: 20 20 20 20 20 69 6e 6f 64 65 4c 69 73 74 20 3d       inodeList =
6630: 20 70 49 6e 6f 64 65 2d 3e 70 4e 65 78 74 3b 0a   pInode->pNext;.
6640: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
6650: 28 20 70 49 6e 6f 64 65 2d 3e 70 4e 65 78 74 20  ( pInode->pNext 
6660: 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  ){.        asser
6670: 74 28 20 70 49 6e 6f 64 65 2d 3e 70 4e 65 78 74  t( pInode->pNext
6680: 2d 3e 70 50 72 65 76 3d 3d 70 49 6e 6f 64 65 20  ->pPrev==pInode 
6690: 29 3b 0a 20 20 20 20 20 20 20 20 70 49 6e 6f 64  );.        pInod
66a0: 65 2d 3e 70 4e 65 78 74 2d 3e 70 50 72 65 76 20  e->pNext->pPrev 
66b0: 3d 20 70 49 6e 6f 64 65 2d 3e 70 50 72 65 76 3b  = pInode->pPrev;
66c0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73  .      }.      s
66d0: 71 6c 69 74 65 33 5f 66 72 65 65 28 70 49 6e 6f  qlite3_free(pIno
66e0: 64 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d  de);.    }.  }.}
66f0: 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 61 20  ../*.** Given a 
6700: 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 2c  file descriptor,
6710: 20 6c 6f 63 61 74 65 20 74 68 65 20 75 6e 69 78   locate the unix
6720: 49 6e 6f 64 65 49 6e 66 6f 20 6f 62 6a 65 63 74  InodeInfo object
6730: 20 74 68 61 74 0a 2a 2a 20 64 65 73 63 72 69 62   that.** describ
6740: 65 73 20 74 68 61 74 20 66 69 6c 65 20 64 65 73  es that file des
6750: 63 72 69 70 74 6f 72 2e 20 20 43 72 65 61 74 65  criptor.  Create
6760: 20 61 20 6e 65 77 20 6f 6e 65 20 69 66 20 6e 65   a new one if ne
6770: 63 65 73 73 61 72 79 2e 20 20 54 68 65 0a 2a 2a  cessary.  The.**
6780: 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 6d 69   return value mi
6790: 67 68 74 20 62 65 20 75 6e 69 6e 69 74 69 61 6c  ght be uninitial
67a0: 69 7a 65 64 20 69 66 20 61 6e 20 65 72 72 6f 72  ized if an error
67b0: 20 6f 63 63 75 72 73 2e 0a 2a 2a 0a 2a 2a 20 54   occurs..**.** T
67c0: 68 65 20 6d 75 74 65 78 20 65 6e 74 65 72 65 64  he mutex entered
67d0: 20 75 73 69 6e 67 20 74 68 65 20 75 6e 69 78 45   using the unixE
67e0: 6e 74 65 72 4d 75 74 65 78 28 29 20 66 75 6e 63  nterMutex() func
67f0: 74 69 6f 6e 20 6d 75 73 74 20 62 65 20 68 65 6c  tion must be hel
6800: 64 0a 2a 2a 20 77 68 65 6e 20 74 68 69 73 20 66  d.** when this f
6810: 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65  unction is calle
6820: 64 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  d..**.** Return 
6830: 61 6e 20 61 70 70 72 6f 70 72 69 61 74 65 20 65  an appropriate e
6840: 72 72 6f 72 20 63 6f 64 65 2e 0a 2a 2f 0a 73 74  rror code..*/.st
6850: 61 74 69 63 20 69 6e 74 20 66 69 6e 64 49 6e 6f  atic int findIno
6860: 64 65 49 6e 66 6f 28 0a 20 20 75 6e 69 78 46 69  deInfo(.  unixFi
6870: 6c 65 20 2a 70 46 69 6c 65 2c 20 20 20 20 20 20  le *pFile,      
6880: 20 20 20 20 20 20 20 20 20 2f 2a 20 55 6e 69 78           /* Unix
6890: 20 66 69 6c 65 20 77 69 74 68 20 66 69 6c 65 20   file with file 
68a0: 64 65 73 63 20 75 73 65 64 20 69 6e 20 74 68 65  desc used in the
68b0: 20 6b 65 79 20 2a 2f 0a 20 20 75 6e 69 78 49 6e   key */.  unixIn
68c0: 6f 64 65 49 6e 66 6f 20 2a 2a 70 70 49 6e 6f 64  odeInfo **ppInod
68d0: 65 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75  e        /* Retu
68e0: 72 6e 20 74 68 65 20 75 6e 69 78 49 6e 6f 64 65  rn the unixInode
68f0: 49 6e 66 6f 20 6f 62 6a 65 63 74 20 68 65 72 65  Info object here
6900: 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b   */.){.  int rc;
6910: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6920: 20 20 20 20 20 20 20 20 2f 2a 20 53 79 73 74 65          /* Syste
6930: 6d 20 63 61 6c 6c 20 72 65 74 75 72 6e 20 63 6f  m call return co
6940: 64 65 20 2a 2f 0a 20 20 69 6e 74 20 66 64 3b 20  de */.  int fd; 
6950: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6960: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 66 69         /* The fi
6970: 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 66 6f  le descriptor fo
6980: 72 20 70 46 69 6c 65 20 2a 2f 0a 20 20 73 74 72  r pFile */.  str
6990: 75 63 74 20 75 6e 69 78 46 69 6c 65 49 64 20 66  uct unixFileId f
69a0: 69 6c 65 49 64 3b 20 20 20 20 20 20 2f 2a 20 4c  ileId;      /* L
69b0: 6f 6f 6b 75 70 20 6b 65 79 20 66 6f 72 20 74 68  ookup key for th
69c0: 65 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20  e unixInodeInfo 
69d0: 2a 2f 0a 20 20 73 74 72 75 63 74 20 73 74 61 74  */.  struct stat
69e0: 20 73 74 61 74 62 75 66 3b 20 20 20 20 20 20 20   statbuf;       
69f0: 20 20 20 20 2f 2a 20 4c 6f 77 2d 6c 65 76 65 6c      /* Low-level
6a00: 20 66 69 6c 65 20 69 6e 66 6f 72 6d 61 74 69 6f   file informatio
6a10: 6e 20 2a 2f 0a 20 20 75 6e 69 78 49 6e 6f 64 65  n */.  unixInode
6a20: 49 6e 66 6f 20 2a 70 49 6e 6f 64 65 20 3d 20 30  Info *pInode = 0
6a30: 3b 20 20 20 20 20 2f 2a 20 43 61 6e 64 69 64 61  ;     /* Candida
6a40: 74 65 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f  te unixInodeInfo
6a50: 20 6f 62 6a 65 63 74 20 2a 2f 0a 0a 20 20 61 73   object */..  as
6a60: 73 65 72 74 28 20 75 6e 69 78 4d 75 74 65 78 48  sert( unixMutexH
6a70: 65 6c 64 28 29 20 29 3b 0a 0a 20 20 2f 2a 20 47  eld() );..  /* G
6a80: 65 74 20 6c 6f 77 2d 6c 65 76 65 6c 20 69 6e 66  et low-level inf
6a90: 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20 74  ormation about t
6aa0: 68 65 20 66 69 6c 65 20 74 68 61 74 20 77 65 20  he file that we 
6ab0: 63 61 6e 20 75 73 65 64 20 74 6f 0a 20 20 2a 2a  can used to.  **
6ac0: 20 63 72 65 61 74 65 20 61 20 75 6e 69 71 75 65   create a unique
6ad0: 20 6e 61 6d 65 20 66 6f 72 20 74 68 65 20 66 69   name for the fi
6ae0: 6c 65 2e 0a 20 20 2a 2f 0a 20 20 66 64 20 3d 20  le..  */.  fd = 
6af0: 70 46 69 6c 65 2d 3e 68 3b 0a 20 20 72 63 20 3d  pFile->h;.  rc =
6b00: 20 66 73 74 61 74 28 66 64 2c 20 26 73 74 61 74   fstat(fd, &stat
6b10: 62 75 66 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  buf);.  if( rc!=
6b20: 30 20 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e  0 ){.    pFile->
6b30: 6c 61 73 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e  lastErrno = errn
6b40: 6f 3b 0a 23 69 66 64 65 66 20 45 4f 56 45 52 46  o;.#ifdef EOVERF
6b50: 4c 4f 57 0a 20 20 20 20 69 66 28 20 70 46 69 6c  LOW.    if( pFil
6b60: 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 3d 3d 45 4f  e->lastErrno==EO
6b70: 56 45 52 46 4c 4f 57 20 29 20 72 65 74 75 72 6e  VERFLOW ) return
6b80: 20 53 51 4c 49 54 45 5f 4e 4f 4c 46 53 3b 0a 23   SQLITE_NOLFS;.#
6b90: 65 6e 64 69 66 0a 20 20 20 20 72 65 74 75 72 6e  endif.    return
6ba0: 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 3b 0a 20   SQLITE_IOERR;. 
6bb0: 20 7d 0a 0a 23 69 66 64 65 66 20 5f 5f 41 50 50   }..#ifdef __APP
6bc0: 4c 45 5f 5f 0a 20 20 2f 2a 20 4f 6e 20 4f 53 20  LE__.  /* On OS 
6bd0: 58 20 6f 6e 20 61 6e 20 6d 73 64 6f 73 20 66 69  X on an msdos fi
6be0: 6c 65 73 79 73 74 65 6d 2c 20 74 68 65 20 69 6e  lesystem, the in
6bf0: 6f 64 65 20 6e 75 6d 62 65 72 20 69 73 20 72 65  ode number is re
6c00: 70 6f 72 74 65 64 0a 20 20 2a 2a 20 69 6e 63 6f  ported.  ** inco
6c10: 72 72 65 63 74 6c 79 20 66 6f 72 20 7a 65 72 6f  rrectly for zero
6c20: 2d 73 69 7a 65 20 66 69 6c 65 73 2e 20 20 53 65  -size files.  Se
6c30: 65 20 74 69 63 6b 65 74 20 23 33 32 36 30 2e 20  e ticket #3260. 
6c40: 20 54 6f 20 77 6f 72 6b 0a 20 20 2a 2a 20 61 72   To work.  ** ar
6c50: 6f 75 6e 64 20 74 68 69 73 20 70 72 6f 62 6c 65  ound this proble
6c60: 6d 20 28 77 65 20 63 6f 6e 73 69 64 65 72 20 69  m (we consider i
6c70: 74 20 61 20 62 75 67 20 69 6e 20 4f 53 20 58 2c  t a bug in OS X,
6c80: 20 6e 6f 74 20 53 51 4c 69 74 65 29 0a 20 20 2a   not SQLite).  *
6c90: 2a 20 77 65 20 61 6c 77 61 79 73 20 69 6e 63 72  * we always incr
6ca0: 65 61 73 65 20 74 68 65 20 66 69 6c 65 20 73 69  ease the file si
6cb0: 7a 65 20 74 6f 20 31 20 62 79 20 77 72 69 74 69  ze to 1 by writi
6cc0: 6e 67 20 61 20 73 69 6e 67 6c 65 20 62 79 74 65  ng a single byte
6cd0: 0a 20 20 2a 2a 20 70 72 69 6f 72 20 74 6f 20 61  .  ** prior to a
6ce0: 63 63 65 73 73 69 6e 67 20 74 68 65 20 69 6e 6f  ccessing the ino
6cf0: 64 65 20 6e 75 6d 62 65 72 2e 20 20 54 68 65 20  de number.  The 
6d00: 6f 6e 65 20 62 79 74 65 20 77 72 69 74 74 65 6e  one byte written
6d10: 20 69 73 0a 20 20 2a 2a 20 61 6e 20 41 53 43 49   is.  ** an ASCI
6d20: 49 20 27 53 27 20 63 68 61 72 61 63 74 65 72 20  I 'S' character 
6d30: 77 68 69 63 68 20 61 6c 73 6f 20 68 61 70 70 65  which also happe
6d40: 6e 73 20 74 6f 20 62 65 20 74 68 65 20 66 69 72  ns to be the fir
6d50: 73 74 20 62 79 74 65 0a 20 20 2a 2a 20 69 6e 20  st byte.  ** in 
6d60: 74 68 65 20 68 65 61 64 65 72 20 6f 66 20 65 76  the header of ev
6d70: 65 72 79 20 53 51 4c 69 74 65 20 64 61 74 61 62  ery SQLite datab
6d80: 61 73 65 2e 20 20 49 6e 20 74 68 69 73 20 77 61  ase.  In this wa
6d90: 79 2c 20 69 66 20 74 68 65 72 65 0a 20 20 2a 2a  y, if there.  **
6da0: 20 69 73 20 61 20 72 61 63 65 20 63 6f 6e 64 69   is a race condi
6db0: 74 69 6f 6e 20 73 75 63 68 20 74 68 61 74 20 61  tion such that a
6dc0: 6e 6f 74 68 65 72 20 74 68 72 65 61 64 20 68 61  nother thread ha
6dd0: 73 20 61 6c 72 65 61 64 79 20 70 6f 70 75 6c 61  s already popula
6de0: 74 65 64 0a 20 20 2a 2a 20 74 68 65 20 66 69 72  ted.  ** the fir
6df0: 73 74 20 70 61 67 65 20 6f 66 20 74 68 65 20 64  st page of the d
6e00: 61 74 61 62 61 73 65 2c 20 6e 6f 20 64 61 6d 61  atabase, no dama
6e10: 67 65 20 69 73 20 64 6f 6e 65 2e 0a 20 20 2a 2f  ge is done..  */
6e20: 0a 20 20 69 66 28 20 73 74 61 74 62 75 66 2e 73  .  if( statbuf.s
6e30: 74 5f 73 69 7a 65 3d 3d 30 20 26 26 20 28 70 46  t_size==0 && (pF
6e40: 69 6c 65 2d 3e 66 73 46 6c 61 67 73 20 26 20 53  ile->fsFlags & S
6e50: 51 4c 49 54 45 5f 46 53 46 4c 41 47 53 5f 49 53  QLITE_FSFLAGS_IS
6e60: 5f 4d 53 44 4f 53 29 21 3d 30 20 29 7b 0a 20 20  _MSDOS)!=0 ){.  
6e70: 20 20 72 63 20 3d 20 77 72 69 74 65 28 66 64 2c    rc = write(fd,
6e80: 20 22 53 22 2c 20 31 29 3b 0a 20 20 20 20 69 66   "S", 1);.    if
6e90: 28 20 72 63 21 3d 31 20 29 7b 0a 20 20 20 20 20  ( rc!=1 ){.     
6ea0: 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e   pFile->lastErrn
6eb0: 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20  o = errno;.     
6ec0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49   return SQLITE_I
6ed0: 4f 45 52 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20  OERR;.    }.    
6ee0: 72 63 20 3d 20 66 73 74 61 74 28 66 64 2c 20 26  rc = fstat(fd, &
6ef0: 73 74 61 74 62 75 66 29 3b 0a 20 20 20 20 69 66  statbuf);.    if
6f00: 28 20 72 63 21 3d 30 20 29 7b 0a 20 20 20 20 20  ( rc!=0 ){.     
6f10: 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e   pFile->lastErrn
6f20: 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20  o = errno;.     
6f30: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49   return SQLITE_I
6f40: 4f 45 52 52 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  OERR;.    }.  }.
6f50: 23 65 6e 64 69 66 0a 0a 20 20 6d 65 6d 73 65 74  #endif..  memset
6f60: 28 26 66 69 6c 65 49 64 2c 20 30 2c 20 73 69 7a  (&fileId, 0, siz
6f70: 65 6f 66 28 66 69 6c 65 49 64 29 29 3b 0a 20 20  eof(fileId));.  
6f80: 66 69 6c 65 49 64 2e 64 65 76 20 3d 20 73 74 61  fileId.dev = sta
6f90: 74 62 75 66 2e 73 74 5f 64 65 76 3b 0a 23 69 66  tbuf.st_dev;.#if
6fa0: 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20 66 69   OS_VXWORKS.  fi
6fb0: 6c 65 49 64 2e 70 49 64 20 3d 20 70 46 69 6c 65  leId.pId = pFile
6fc0: 2d 3e 70 49 64 3b 0a 23 65 6c 73 65 0a 20 20 66  ->pId;.#else.  f
6fd0: 69 6c 65 49 64 2e 69 6e 6f 20 3d 20 73 74 61 74  ileId.ino = stat
6fe0: 62 75 66 2e 73 74 5f 69 6e 6f 3b 0a 23 65 6e 64  buf.st_ino;.#end
6ff0: 69 66 0a 20 20 70 49 6e 6f 64 65 20 3d 20 69 6e  if.  pInode = in
7000: 6f 64 65 4c 69 73 74 3b 0a 20 20 77 68 69 6c 65  odeList;.  while
7010: 28 20 70 49 6e 6f 64 65 20 26 26 20 6d 65 6d 63  ( pInode && memc
7020: 6d 70 28 26 66 69 6c 65 49 64 2c 20 26 70 49 6e  mp(&fileId, &pIn
7030: 6f 64 65 2d 3e 66 69 6c 65 49 64 2c 20 73 69 7a  ode->fileId, siz
7040: 65 6f 66 28 66 69 6c 65 49 64 29 29 20 29 7b 0a  eof(fileId)) ){.
7050: 20 20 20 20 70 49 6e 6f 64 65 20 3d 20 70 49 6e      pInode = pIn
7060: 6f 64 65 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d 0a  ode->pNext;.  }.
7070: 20 20 69 66 28 20 70 49 6e 6f 64 65 3d 3d 30 20    if( pInode==0 
7080: 29 7b 0a 20 20 20 20 70 49 6e 6f 64 65 20 3d 20  ){.    pInode = 
7090: 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 20  sqlite3_malloc( 
70a0: 73 69 7a 65 6f 66 28 2a 70 49 6e 6f 64 65 29 20  sizeof(*pInode) 
70b0: 29 3b 0a 20 20 20 20 69 66 28 20 70 49 6e 6f 64  );.    if( pInod
70c0: 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 65  e==0 ){.      re
70d0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
70e0: 4d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6d 65 6d  M;.    }.    mem
70f0: 73 65 74 28 70 49 6e 6f 64 65 2c 20 30 2c 20 73  set(pInode, 0, s
7100: 69 7a 65 6f 66 28 2a 70 49 6e 6f 64 65 29 29 3b  izeof(*pInode));
7110: 0a 20 20 20 20 6d 65 6d 63 70 79 28 26 70 49 6e  .    memcpy(&pIn
7120: 6f 64 65 2d 3e 66 69 6c 65 49 64 2c 20 26 66 69  ode->fileId, &fi
7130: 6c 65 49 64 2c 20 73 69 7a 65 6f 66 28 66 69 6c  leId, sizeof(fil
7140: 65 49 64 29 29 3b 0a 20 20 20 20 70 49 6e 6f 64  eId));.    pInod
7150: 65 2d 3e 6e 52 65 66 20 3d 20 31 3b 0a 20 20 20  e->nRef = 1;.   
7160: 20 70 49 6e 6f 64 65 2d 3e 70 4e 65 78 74 20 3d   pInode->pNext =
7170: 20 69 6e 6f 64 65 4c 69 73 74 3b 0a 20 20 20 20   inodeList;.    
7180: 70 49 6e 6f 64 65 2d 3e 70 50 72 65 76 20 3d 20  pInode->pPrev = 
7190: 30 3b 0a 20 20 20 20 69 66 28 20 69 6e 6f 64 65  0;.    if( inode
71a0: 4c 69 73 74 20 29 20 69 6e 6f 64 65 4c 69 73 74  List ) inodeList
71b0: 2d 3e 70 50 72 65 76 20 3d 20 70 49 6e 6f 64 65  ->pPrev = pInode
71c0: 3b 0a 20 20 20 20 69 6e 6f 64 65 4c 69 73 74 20  ;.    inodeList 
71d0: 3d 20 70 49 6e 6f 64 65 3b 0a 20 20 7d 65 6c 73  = pInode;.  }els
71e0: 65 7b 0a 20 20 20 20 70 49 6e 6f 64 65 2d 3e 6e  e{.    pInode->n
71f0: 52 65 66 2b 2b 3b 0a 20 20 7d 0a 20 20 2a 70 70  Ref++;.  }.  *pp
7200: 49 6e 6f 64 65 20 3d 20 70 49 6e 6f 64 65 3b 0a  Inode = pInode;.
7210: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
7220: 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68  OK;.}.../*.** Th
7230: 69 73 20 72 6f 75 74 69 6e 65 20 63 68 65 63 6b  is routine check
7240: 73 20 69 66 20 74 68 65 72 65 20 69 73 20 61 20  s if there is a 
7250: 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 68 65  RESERVED lock he
7260: 6c 64 20 6f 6e 20 74 68 65 20 73 70 65 63 69 66  ld on the specif
7270: 69 65 64 0a 2a 2a 20 66 69 6c 65 20 62 79 20 74  ied.** file by t
7280: 68 69 73 20 6f 72 20 61 6e 79 20 6f 74 68 65 72  his or any other
7290: 20 70 72 6f 63 65 73 73 2e 20 49 66 20 73 75 63   process. If suc
72a0: 68 20 61 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64  h a lock is held
72b0: 2c 20 73 65 74 20 2a 70 52 65 73 4f 75 74 0a 2a  , set *pResOut.*
72c0: 2a 20 74 6f 20 61 20 6e 6f 6e 2d 7a 65 72 6f 20  * to a non-zero 
72d0: 76 61 6c 75 65 20 6f 74 68 65 72 77 69 73 65 20  value otherwise 
72e0: 2a 70 52 65 73 4f 75 74 20 69 73 20 73 65 74 20  *pResOut is set 
72f0: 74 6f 20 7a 65 72 6f 2e 20 20 54 68 65 20 72 65  to zero.  The re
7300: 74 75 72 6e 20 76 61 6c 75 65 0a 2a 2a 20 69 73  turn value.** is
7310: 20 73 65 74 20 74 6f 20 53 51 4c 49 54 45 5f 4f   set to SQLITE_O
7320: 4b 20 75 6e 6c 65 73 73 20 61 6e 20 49 2f 4f 20  K unless an I/O 
7330: 65 72 72 6f 72 20 6f 63 63 75 72 73 20 64 75 72  error occurs dur
7340: 69 6e 67 20 6c 6f 63 6b 20 63 68 65 63 6b 69 6e  ing lock checkin
7350: 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  g..*/.static int
7360: 20 75 6e 69 78 43 68 65 63 6b 52 65 73 65 72 76   unixCheckReserv
7370: 65 64 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66  edLock(sqlite3_f
7380: 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 2a 70 52  ile *id, int *pR
7390: 65 73 4f 75 74 29 7b 0a 20 20 69 6e 74 20 72 63  esOut){.  int rc
73a0: 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
73b0: 69 6e 74 20 72 65 73 65 72 76 65 64 20 3d 20 30  int reserved = 0
73c0: 3b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46  ;.  unixFile *pF
73d0: 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a  ile = (unixFile*
73e0: 29 69 64 3b 0a 0a 20 20 53 69 6d 75 6c 61 74 65  )id;..  Simulate
73f0: 49 4f 45 72 72 6f 72 28 20 72 65 74 75 72 6e 20  IOError( return 
7400: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43 48 45  SQLITE_IOERR_CHE
7410: 43 4b 52 45 53 45 52 56 45 44 4c 4f 43 4b 3b 20  CKRESERVEDLOCK; 
7420: 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 46  );..  assert( pF
7430: 69 6c 65 20 29 3b 0a 20 20 75 6e 69 78 45 6e 74  ile );.  unixEnt
7440: 65 72 4d 75 74 65 78 28 29 3b 20 2f 2a 20 42 65  erMutex(); /* Be
7450: 63 61 75 73 65 20 70 46 69 6c 65 2d 3e 70 49 6e  cause pFile->pIn
7460: 6f 64 65 20 69 73 20 73 68 61 72 65 64 20 61 63  ode is shared ac
7470: 72 6f 73 73 20 74 68 72 65 61 64 73 20 2a 2f 0a  ross threads */.
7480: 0a 20 20 2f 2a 20 43 68 65 63 6b 20 69 66 20 61  .  /* Check if a
7490: 20 74 68 72 65 61 64 20 69 6e 20 74 68 69 73 20   thread in this 
74a0: 70 72 6f 63 65 73 73 20 68 6f 6c 64 73 20 73 75  process holds su
74b0: 63 68 20 61 20 6c 6f 63 6b 20 2a 2f 0a 20 20 69  ch a lock */.  i
74c0: 66 28 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65  f( pFile->pInode
74d0: 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3e 53 48 41 52  ->eFileLock>SHAR
74e0: 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 72  ED_LOCK ){.    r
74f0: 65 73 65 72 76 65 64 20 3d 20 31 3b 0a 20 20 7d  eserved = 1;.  }
7500: 0a 0a 20 20 2f 2a 20 4f 74 68 65 72 77 69 73 65  ..  /* Otherwise
7510: 20 73 65 65 20 69 66 20 73 6f 6d 65 20 6f 74 68   see if some oth
7520: 65 72 20 70 72 6f 63 65 73 73 20 68 6f 6c 64 73  er process holds
7530: 20 69 74 2e 0a 20 20 2a 2f 0a 23 69 66 6e 64 65   it..  */.#ifnde
7540: 66 20 5f 5f 44 4a 47 50 50 5f 5f 0a 20 20 69 66  f __DJGPP__.  if
7550: 28 20 21 72 65 73 65 72 76 65 64 20 29 7b 0a 20  ( !reserved ){. 
7560: 20 20 20 73 74 72 75 63 74 20 66 6c 6f 63 6b 20     struct flock 
7570: 6c 6f 63 6b 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c  lock;.    lock.l
7580: 5f 77 68 65 6e 63 65 20 3d 20 53 45 45 4b 5f 53  _whence = SEEK_S
7590: 45 54 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73  ET;.    lock.l_s
75a0: 74 61 72 74 20 3d 20 52 45 53 45 52 56 45 44 5f  tart = RESERVED_
75b0: 42 59 54 45 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c  BYTE;.    lock.l
75c0: 5f 6c 65 6e 20 3d 20 31 3b 0a 20 20 20 20 6c 6f  _len = 1;.    lo
75d0: 63 6b 2e 6c 5f 74 79 70 65 20 3d 20 46 5f 57 52  ck.l_type = F_WR
75e0: 4c 43 4b 3b 0a 20 20 20 20 69 66 20 28 2d 31 20  LCK;.    if (-1 
75f0: 3d 3d 20 66 63 6e 74 6c 28 70 46 69 6c 65 2d 3e  == fcntl(pFile->
7600: 68 2c 20 46 5f 47 45 54 4c 4b 2c 20 26 6c 6f 63  h, F_GETLK, &loc
7610: 6b 29 29 20 7b 0a 20 20 20 20 20 20 69 6e 74 20  k)) {.      int 
7620: 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a  tErrno = errno;.
7630: 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
7640: 65 45 72 72 6f 72 46 72 6f 6d 50 6f 73 69 78 45  eErrorFromPosixE
7650: 72 72 6f 72 28 74 45 72 72 6e 6f 2c 20 53 51 4c  rror(tErrno, SQL
7660: 49 54 45 5f 49 4f 45 52 52 5f 43 48 45 43 4b 52  ITE_IOERR_CHECKR
7670: 45 53 45 52 56 45 44 4c 4f 43 4b 29 3b 0a 20 20  ESERVEDLOCK);.  
7680: 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45      pFile->lastE
7690: 72 72 6e 6f 20 3d 20 74 45 72 72 6e 6f 3b 0a 20  rrno = tErrno;. 
76a0: 20 20 20 7d 20 65 6c 73 65 20 69 66 28 20 6c 6f     } else if( lo
76b0: 63 6b 2e 6c 5f 74 79 70 65 21 3d 46 5f 55 4e 4c  ck.l_type!=F_UNL
76c0: 43 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 73 65  CK ){.      rese
76d0: 72 76 65 64 20 3d 20 31 3b 0a 20 20 20 20 7d 0a  rved = 1;.    }.
76e0: 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 0a 20 20    }.#endif.  .  
76f0: 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29  unixLeaveMutex()
7700: 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22 54 45  ;.  OSTRACE(("TE
7710: 53 54 20 57 52 2d 4c 4f 43 4b 20 25 64 20 25 64  ST WR-LOCK %d %d
7720: 20 25 64 20 28 75 6e 69 78 29 5c 6e 22 2c 20 70   %d (unix)\n", p
7730: 46 69 6c 65 2d 3e 68 2c 20 72 63 2c 20 72 65 73  File->h, rc, res
7740: 65 72 76 65 64 29 29 3b 0a 0a 20 20 2a 70 52 65  erved));..  *pRe
7750: 73 4f 75 74 20 3d 20 72 65 73 65 72 76 65 64 3b  sOut = reserved;
7760: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
7770: 0a 2f 2a 0a 2a 2a 20 4c 6f 63 6b 20 74 68 65 20  ./*.** Lock the 
7780: 66 69 6c 65 20 77 69 74 68 20 74 68 65 20 6c 6f  file with the lo
7790: 63 6b 20 73 70 65 63 69 66 69 65 64 20 62 79 20  ck specified by 
77a0: 70 61 72 61 6d 65 74 65 72 20 65 46 69 6c 65 4c  parameter eFileL
77b0: 6f 63 6b 20 2d 20 6f 6e 65 0a 2a 2a 20 6f 66 20  ock - one.** of 
77c0: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a  the following:.*
77d0: 2a 0a 2a 2a 20 20 20 20 20 28 31 29 20 53 48 41  *.**     (1) SHA
77e0: 52 45 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20  RED_LOCK.**     
77f0: 28 32 29 20 52 45 53 45 52 56 45 44 5f 4c 4f 43  (2) RESERVED_LOC
7800: 4b 0a 2a 2a 20 20 20 20 20 28 33 29 20 50 45 4e  K.**     (3) PEN
7810: 44 49 4e 47 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20  DING_LOCK.**    
7820: 20 28 34 29 20 45 58 43 4c 55 53 49 56 45 5f 4c   (4) EXCLUSIVE_L
7830: 4f 43 4b 0a 2a 2a 0a 2a 2a 20 53 6f 6d 65 74 69  OCK.**.** Someti
7840: 6d 65 73 20 77 68 65 6e 20 72 65 71 75 65 73 74  mes when request
7850: 69 6e 67 20 6f 6e 65 20 6c 6f 63 6b 20 73 74 61  ing one lock sta
7860: 74 65 2c 20 61 64 64 69 74 69 6f 6e 61 6c 20 6c  te, additional l
7870: 6f 63 6b 20 73 74 61 74 65 73 0a 2a 2a 20 61 72  ock states.** ar
7880: 65 20 69 6e 73 65 72 74 65 64 20 69 6e 20 62 65  e inserted in be
7890: 74 77 65 65 6e 2e 20 20 54 68 65 20 6c 6f 63 6b  tween.  The lock
78a0: 69 6e 67 20 6d 69 67 68 74 20 66 61 69 6c 20 6f  ing might fail o
78b0: 6e 20 6f 6e 65 20 6f 66 20 74 68 65 20 6c 61 74  n one of the lat
78c0: 65 72 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e  er.** transition
78d0: 73 20 6c 65 61 76 69 6e 67 20 74 68 65 20 6c 6f  s leaving the lo
78e0: 63 6b 20 73 74 61 74 65 20 64 69 66 66 65 72 65  ck state differe
78f0: 6e 74 20 66 72 6f 6d 20 77 68 61 74 20 69 74 20  nt from what it 
7900: 73 74 61 72 74 65 64 20 62 75 74 0a 2a 2a 20 73  started but.** s
7910: 74 69 6c 6c 20 73 68 6f 72 74 20 6f 66 20 69 74  till short of it
7920: 73 20 67 6f 61 6c 2e 20 20 54 68 65 20 66 6f 6c  s goal.  The fol
7930: 6c 6f 77 69 6e 67 20 63 68 61 72 74 20 73 68 6f  lowing chart sho
7940: 77 73 20 74 68 65 20 61 6c 6c 6f 77 65 64 0a 2a  ws the allowed.*
7950: 2a 20 74 72 61 6e 73 69 74 69 6f 6e 73 20 61 6e  * transitions an
7960: 64 20 74 68 65 20 69 6e 73 65 72 74 65 64 20 69  d the inserted i
7970: 6e 74 65 72 6d 65 64 69 61 74 65 20 73 74 61 74  ntermediate stat
7980: 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 55 4e 4c  es:.**.**    UNL
7990: 4f 43 4b 45 44 20 2d 3e 20 53 48 41 52 45 44 0a  OCKED -> SHARED.
79a0: 2a 2a 20 20 20 20 53 48 41 52 45 44 20 2d 3e 20  **    SHARED -> 
79b0: 52 45 53 45 52 56 45 44 0a 2a 2a 20 20 20 20 53  RESERVED.**    S
79c0: 48 41 52 45 44 20 2d 3e 20 28 50 45 4e 44 49 4e  HARED -> (PENDIN
79d0: 47 29 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a  G) -> EXCLUSIVE.
79e0: 2a 2a 20 20 20 20 52 45 53 45 52 56 45 44 20 2d  **    RESERVED -
79f0: 3e 20 28 50 45 4e 44 49 4e 47 29 20 2d 3e 20 45  > (PENDING) -> E
7a00: 58 43 4c 55 53 49 56 45 0a 2a 2a 20 20 20 20 50  XCLUSIVE.**    P
7a10: 45 4e 44 49 4e 47 20 2d 3e 20 45 58 43 4c 55 53  ENDING -> EXCLUS
7a20: 49 56 45 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  IVE.**.** This r
7a30: 6f 75 74 69 6e 65 20 77 69 6c 6c 20 6f 6e 6c 79  outine will only
7a40: 20 69 6e 63 72 65 61 73 65 20 61 20 6c 6f 63 6b   increase a lock
7a50: 2e 20 20 55 73 65 20 74 68 65 20 73 71 6c 69 74  .  Use the sqlit
7a60: 65 33 4f 73 55 6e 6c 6f 63 6b 28 29 0a 2a 2a 20  e3OsUnlock().** 
7a70: 72 6f 75 74 69 6e 65 20 74 6f 20 6c 6f 77 65 72  routine to lower
7a80: 20 61 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c   a locking level
7a90: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
7aa0: 75 6e 69 78 4c 6f 63 6b 28 73 71 6c 69 74 65 33  unixLock(sqlite3
7ab0: 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 65  _file *id, int e
7ac0: 46 69 6c 65 4c 6f 63 6b 29 7b 0a 20 20 2f 2a 20  FileLock){.  /* 
7ad0: 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 64 65  The following de
7ae0: 73 63 72 69 62 65 73 20 74 68 65 20 69 6d 70 6c  scribes the impl
7af0: 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68  ementation of th
7b00: 65 20 76 61 72 69 6f 75 73 20 6c 6f 63 6b 73 20  e various locks 
7b10: 61 6e 64 0a 20 20 2a 2a 20 6c 6f 63 6b 20 74 72  and.  ** lock tr
7b20: 61 6e 73 69 74 69 6f 6e 73 20 69 6e 20 74 65 72  ansitions in ter
7b30: 6d 73 20 6f 66 20 74 68 65 20 50 4f 53 49 58 20  ms of the POSIX 
7b40: 61 64 76 69 73 6f 72 79 20 73 68 61 72 65 64 20  advisory shared 
7b50: 61 6e 64 20 65 78 63 6c 75 73 69 76 65 0a 20 20  and exclusive.  
7b60: 2a 2a 20 6c 6f 63 6b 20 70 72 69 6d 69 74 69 76  ** lock primitiv
7b70: 65 73 20 28 63 61 6c 6c 65 64 20 72 65 61 64 2d  es (called read-
7b80: 6c 6f 63 6b 73 20 61 6e 64 20 77 72 69 74 65 2d  locks and write-
7b90: 6c 6f 63 6b 73 20 62 65 6c 6f 77 2c 20 74 6f 20  locks below, to 
7ba0: 61 76 6f 69 64 0a 20 20 2a 2a 20 63 6f 6e 66 75  avoid.  ** confu
7bb0: 73 69 6f 6e 20 77 69 74 68 20 53 51 4c 69 74 65  sion with SQLite
7bc0: 20 6c 6f 63 6b 20 6e 61 6d 65 73 29 2e 20 54 68   lock names). Th
7bd0: 65 20 61 6c 67 6f 72 69 74 68 6d 73 20 61 72 65  e algorithms are
7be0: 20 63 6f 6d 70 6c 69 63 61 74 65 64 0a 20 20 2a   complicated.  *
7bf0: 2a 20 73 6c 69 67 68 74 6c 79 20 69 6e 20 6f 72  * slightly in or
7c00: 64 65 72 20 74 6f 20 62 65 20 63 6f 6d 70 61 74  der to be compat
7c10: 69 62 6c 65 20 77 69 74 68 20 77 69 6e 64 6f 77  ible with window
7c20: 73 20 73 79 73 74 65 6d 73 20 73 69 6d 75 6c 74  s systems simult
7c30: 61 6e 65 6f 75 73 6c 79 0a 20 20 2a 2a 20 61 63  aneously.  ** ac
7c40: 63 65 73 73 69 6e 67 20 74 68 65 20 73 61 6d 65  cessing the same
7c50: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20   database file, 
7c60: 69 6e 20 63 61 73 65 20 74 68 61 74 20 69 73 20  in case that is 
7c70: 65 76 65 72 20 72 65 71 75 69 72 65 64 2e 0a 20  ever required.. 
7c80: 20 2a 2a 0a 20 20 2a 2a 20 53 79 6d 62 6f 6c 73   **.  ** Symbols
7c90: 20 64 65 66 69 6e 65 64 20 69 6e 20 6f 73 2e 68   defined in os.h
7ca0: 20 69 6e 64 65 6e 74 69 66 79 20 74 68 65 20 27   indentify the '
7cb0: 70 65 6e 64 69 6e 67 20 62 79 74 65 27 20 61 6e  pending byte' an
7cc0: 64 20 74 68 65 20 27 72 65 73 65 72 76 65 64 0a  d the 'reserved.
7cd0: 20 20 2a 2a 20 62 79 74 65 27 2c 20 65 61 63 68    ** byte', each
7ce0: 20 73 69 6e 67 6c 65 20 62 79 74 65 73 20 61 74   single bytes at
7cf0: 20 77 65 6c 6c 20 6b 6e 6f 77 6e 20 6f 66 66 73   well known offs
7d00: 65 74 73 2c 20 61 6e 64 20 74 68 65 20 27 73 68  ets, and the 'sh
7d10: 61 72 65 64 20 62 79 74 65 0a 20 20 2a 2a 20 72  ared byte.  ** r
7d20: 61 6e 67 65 27 2c 20 61 20 72 61 6e 67 65 20 6f  ange', a range o
7d30: 66 20 35 31 30 20 62 79 74 65 73 20 61 74 20 61  f 510 bytes at a
7d40: 20 77 65 6c 6c 20 6b 6e 6f 77 6e 20 6f 66 66 73   well known offs
7d50: 65 74 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 6f  et..  **.  ** To
7d60: 20 6f 62 74 61 69 6e 20 61 20 53 48 41 52 45 44   obtain a SHARED
7d70: 20 6c 6f 63 6b 2c 20 61 20 72 65 61 64 2d 6c 6f   lock, a read-lo
7d80: 63 6b 20 69 73 20 6f 62 74 61 69 6e 65 64 20 6f  ck is obtained o
7d90: 6e 20 74 68 65 20 27 70 65 6e 64 69 6e 67 0a 20  n the 'pending. 
7da0: 20 2a 2a 20 62 79 74 65 27 2e 20 20 49 66 20 74   ** byte'.  If t
7db0: 68 69 73 20 69 73 20 73 75 63 63 65 73 73 66 75  his is successfu
7dc0: 6c 2c 20 61 20 72 61 6e 64 6f 6d 20 62 79 74 65  l, a random byte
7dd0: 20 66 72 6f 6d 20 74 68 65 20 27 73 68 61 72 65   from the 'share
7de0: 64 20 62 79 74 65 0a 20 20 2a 2a 20 72 61 6e 67  d byte.  ** rang
7df0: 65 27 20 69 73 20 72 65 61 64 2d 6c 6f 63 6b 65  e' is read-locke
7e00: 64 20 61 6e 64 20 74 68 65 20 6c 6f 63 6b 20 6f  d and the lock o
7e10: 6e 20 74 68 65 20 27 70 65 6e 64 69 6e 67 20 62  n the 'pending b
7e20: 79 74 65 27 20 72 65 6c 65 61 73 65 64 2e 0a 20  yte' released.. 
7e30: 20 2a 2a 0a 20 20 2a 2a 20 41 20 70 72 6f 63 65   **.  ** A proce
7e40: 73 73 20 6d 61 79 20 6f 6e 6c 79 20 6f 62 74 61  ss may only obta
7e50: 69 6e 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f  in a RESERVED lo
7e60: 63 6b 20 61 66 74 65 72 20 69 74 20 68 61 73 20  ck after it has 
7e70: 61 20 53 48 41 52 45 44 20 6c 6f 63 6b 2e 0a 20  a SHARED lock.. 
7e80: 20 2a 2a 20 41 20 52 45 53 45 52 56 45 44 20 6c   ** A RESERVED l
7e90: 6f 63 6b 20 69 73 20 69 6d 70 6c 65 6d 65 6e 74  ock is implement
7ea0: 65 64 20 62 79 20 67 72 61 62 62 69 6e 67 20 61  ed by grabbing a
7eb0: 20 77 72 69 74 65 2d 6c 6f 63 6b 20 6f 6e 20 74   write-lock on t
7ec0: 68 65 0a 20 20 2a 2a 20 27 72 65 73 65 72 76 65  he.  ** 'reserve
7ed0: 64 20 62 79 74 65 27 2e 20 0a 20 20 2a 2a 0a 20  d byte'. .  **. 
7ee0: 20 2a 2a 20 41 20 70 72 6f 63 65 73 73 20 6d 61   ** A process ma
7ef0: 79 20 6f 6e 6c 79 20 6f 62 74 61 69 6e 20 61 20  y only obtain a 
7f00: 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 20 61 66 74  PENDING lock aft
7f10: 65 72 20 69 74 20 68 61 73 20 6f 62 74 61 69 6e  er it has obtain
7f20: 65 64 20 61 0a 20 20 2a 2a 20 53 48 41 52 45 44  ed a.  ** SHARED
7f30: 20 6c 6f 63 6b 2e 20 41 20 50 45 4e 44 49 4e 47   lock. A PENDING
7f40: 20 6c 6f 63 6b 20 69 73 20 69 6d 70 6c 65 6d 65   lock is impleme
7f50: 6e 74 65 64 20 62 79 20 6f 62 74 61 69 6e 69 6e  nted by obtainin
7f60: 67 20 61 20 77 72 69 74 65 2d 6c 6f 63 6b 0a 20  g a write-lock. 
7f70: 20 2a 2a 20 6f 6e 20 74 68 65 20 27 70 65 6e 64   ** on the 'pend
7f80: 69 6e 67 20 62 79 74 65 27 2e 20 54 68 69 73 20  ing byte'. This 
7f90: 65 6e 73 75 72 65 73 20 74 68 61 74 20 6e 6f 20  ensures that no 
7fa0: 6e 65 77 20 53 48 41 52 45 44 20 6c 6f 63 6b 73  new SHARED locks
7fb0: 20 63 61 6e 20 62 65 0a 20 20 2a 2a 20 6f 62 74   can be.  ** obt
7fc0: 61 69 6e 65 64 2c 20 62 75 74 20 65 78 69 73 74  ained, but exist
7fd0: 69 6e 67 20 53 48 41 52 45 44 20 6c 6f 63 6b 73  ing SHARED locks
7fe0: 20 61 72 65 20 61 6c 6c 6f 77 65 64 20 74 6f 20   are allowed to 
7ff0: 70 65 72 73 69 73 74 2e 20 41 20 70 72 6f 63 65  persist. A proce
8000: 73 73 0a 20 20 2a 2a 20 64 6f 65 73 20 6e 6f 74  ss.  ** does not
8010: 20 68 61 76 65 20 74 6f 20 6f 62 74 61 69 6e 20   have to obtain 
8020: 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20  a RESERVED lock 
8030: 6f 6e 20 74 68 65 20 77 61 79 20 74 6f 20 61 20  on the way to a 
8040: 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 2e 0a 20 20  PENDING lock..  
8050: 2a 2a 20 54 68 69 73 20 70 72 6f 70 65 72 74 79  ** This property
8060: 20 69 73 20 75 73 65 64 20 62 79 20 74 68 65 20   is used by the 
8070: 61 6c 67 6f 72 69 74 68 6d 20 66 6f 72 20 72 6f  algorithm for ro
8080: 6c 6c 69 6e 67 20 62 61 63 6b 20 61 20 6a 6f 75  lling back a jou
8090: 72 6e 61 6c 20 66 69 6c 65 0a 20 20 2a 2a 20 61  rnal file.  ** a
80a0: 66 74 65 72 20 61 20 63 72 61 73 68 2e 0a 20 20  fter a crash..  
80b0: 2a 2a 0a 20 20 2a 2a 20 41 6e 20 45 58 43 4c 55  **.  ** An EXCLU
80c0: 53 49 56 45 20 6c 6f 63 6b 2c 20 6f 62 74 61 69  SIVE lock, obtai
80d0: 6e 65 64 20 61 66 74 65 72 20 61 20 50 45 4e 44  ned after a PEND
80e0: 49 4e 47 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64  ING lock is held
80f0: 2c 20 69 73 0a 20 20 2a 2a 20 69 6d 70 6c 65 6d  , is.  ** implem
8100: 65 6e 74 65 64 20 62 79 20 6f 62 74 61 69 6e 69  ented by obtaini
8110: 6e 67 20 61 20 77 72 69 74 65 2d 6c 6f 63 6b 20  ng a write-lock 
8120: 6f 6e 20 74 68 65 20 65 6e 74 69 72 65 20 27 73  on the entire 's
8130: 68 61 72 65 64 20 62 79 74 65 0a 20 20 2a 2a 20  hared byte.  ** 
8140: 72 61 6e 67 65 27 2e 20 53 69 6e 63 65 20 61 6c  range'. Since al
8150: 6c 20 6f 74 68 65 72 20 6c 6f 63 6b 73 20 72 65  l other locks re
8160: 71 75 69 72 65 20 61 20 72 65 61 64 2d 6c 6f 63  quire a read-loc
8170: 6b 20 6f 6e 20 6f 6e 65 20 6f 66 20 74 68 65 20  k on one of the 
8180: 62 79 74 65 73 0a 20 20 2a 2a 20 77 69 74 68 69  bytes.  ** withi
8190: 6e 20 74 68 69 73 20 72 61 6e 67 65 2c 20 74 68  n this range, th
81a0: 69 73 20 65 6e 73 75 72 65 73 20 74 68 61 74 20  is ensures that 
81b0: 6e 6f 20 6f 74 68 65 72 20 6c 6f 63 6b 73 20 61  no other locks a
81c0: 72 65 20 68 65 6c 64 20 6f 6e 20 74 68 65 0a 20  re held on the. 
81d0: 20 2a 2a 20 64 61 74 61 62 61 73 65 2e 20 0a 20   ** database. . 
81e0: 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 72 65 61   **.  ** The rea
81f0: 73 6f 6e 20 61 20 73 69 6e 67 6c 65 20 62 79 74  son a single byt
8200: 65 20 63 61 6e 6e 6f 74 20 62 65 20 75 73 65 64  e cannot be used
8210: 20 69 6e 73 74 65 61 64 20 6f 66 20 74 68 65 20   instead of the 
8220: 27 73 68 61 72 65 64 20 62 79 74 65 0a 20 20 2a  'shared byte.  *
8230: 2a 20 72 61 6e 67 65 27 20 69 73 20 74 68 61 74  * range' is that
8240: 20 73 6f 6d 65 20 76 65 72 73 69 6f 6e 73 20 6f   some versions o
8250: 66 20 77 69 6e 64 6f 77 73 20 64 6f 20 6e 6f 74  f windows do not
8260: 20 73 75 70 70 6f 72 74 20 72 65 61 64 2d 6c 6f   support read-lo
8270: 63 6b 73 2e 20 42 79 0a 20 20 2a 2a 20 6c 6f 63  cks. By.  ** loc
8280: 6b 69 6e 67 20 61 20 72 61 6e 64 6f 6d 20 62 79  king a random by
8290: 74 65 20 66 72 6f 6d 20 61 20 72 61 6e 67 65 2c  te from a range,
82a0: 20 63 6f 6e 63 75 72 72 65 6e 74 20 53 48 41 52   concurrent SHAR
82b0: 45 44 20 6c 6f 63 6b 73 20 6d 61 79 20 65 78 69  ED locks may exi
82c0: 73 74 0a 20 20 2a 2a 20 65 76 65 6e 20 69 66 20  st.  ** even if 
82d0: 74 68 65 20 6c 6f 63 6b 69 6e 67 20 70 72 69 6d  the locking prim
82e0: 69 74 69 76 65 20 75 73 65 64 20 69 73 20 61 6c  itive used is al
82f0: 77 61 79 73 20 61 20 77 72 69 74 65 2d 6c 6f 63  ways a write-loc
8300: 6b 2e 0a 20 20 2a 2f 0a 20 20 69 6e 74 20 72 63  k..  */.  int rc
8310: 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
8320: 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20  unixFile *pFile 
8330: 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b  = (unixFile*)id;
8340: 0a 20 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f  .  unixInodeInfo
8350: 20 2a 70 49 6e 6f 64 65 20 3d 20 70 46 69 6c 65   *pInode = pFile
8360: 2d 3e 70 49 6e 6f 64 65 3b 0a 20 20 73 74 72 75  ->pInode;.  stru
8370: 63 74 20 66 6c 6f 63 6b 20 6c 6f 63 6b 3b 0a 20  ct flock lock;. 
8380: 20 69 6e 74 20 73 20 3d 20 30 3b 0a 20 20 69 6e   int s = 0;.  in
8390: 74 20 74 45 72 72 6e 6f 20 3d 20 30 3b 0a 0a 20  t tErrno = 0;.. 
83a0: 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 20 29   assert( pFile )
83b0: 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22 4c 4f  ;.  OSTRACE(("LO
83c0: 43 4b 20 20 20 20 25 64 20 25 73 20 77 61 73 20  CK    %d %s was 
83d0: 25 73 28 25 73 2c 25 64 29 20 70 69 64 3d 25 64  %s(%s,%d) pid=%d
83e0: 20 28 75 6e 69 78 29 5c 6e 22 2c 20 70 46 69 6c   (unix)\n", pFil
83f0: 65 2d 3e 68 2c 0a 20 20 20 20 20 20 61 7a 46 69  e->h,.      azFi
8400: 6c 65 4c 6f 63 6b 28 65 46 69 6c 65 4c 6f 63 6b  leLock(eFileLock
8410: 29 2c 20 61 7a 46 69 6c 65 4c 6f 63 6b 28 70 46  ), azFileLock(pF
8420: 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 29 2c  ile->eFileLock),
8430: 0a 20 20 20 20 20 20 61 7a 46 69 6c 65 4c 6f 63  .      azFileLoc
8440: 6b 28 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c  k(pInode->eFileL
8450: 6f 63 6b 29 2c 20 70 49 6e 6f 64 65 2d 3e 6e 53  ock), pInode->nS
8460: 68 61 72 65 64 20 2c 20 67 65 74 70 69 64 28 29  hared , getpid()
8470: 29 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65  ));..  /* If the
8480: 72 65 20 69 73 20 61 6c 72 65 61 64 79 20 61 20  re is already a 
8490: 6c 6f 63 6b 20 6f 66 20 74 68 69 73 20 74 79 70  lock of this typ
84a0: 65 20 6f 72 20 6d 6f 72 65 20 72 65 73 74 72 69  e or more restri
84b0: 63 74 69 76 65 20 6f 6e 20 74 68 65 0a 20 20 2a  ctive on the.  *
84c0: 2a 20 75 6e 69 78 46 69 6c 65 2c 20 64 6f 20 6e  * unixFile, do n
84d0: 6f 74 68 69 6e 67 2e 20 44 6f 6e 27 74 20 75 73  othing. Don't us
84e0: 65 20 74 68 65 20 65 6e 64 5f 6c 6f 63 6b 3a 20  e the end_lock: 
84f0: 65 78 69 74 20 70 61 74 68 2c 20 61 73 0a 20 20  exit path, as.  
8500: 2a 2a 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65  ** unixEnterMute
8510: 78 28 29 20 68 61 73 6e 27 74 20 62 65 65 6e 20  x() hasn't been 
8520: 63 61 6c 6c 65 64 20 79 65 74 2e 0a 20 20 2a 2f  called yet..  */
8530: 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 65 46  .  if( pFile->eF
8540: 69 6c 65 4c 6f 63 6b 3e 3d 65 46 69 6c 65 4c 6f  ileLock>=eFileLo
8550: 63 6b 20 29 7b 0a 20 20 20 20 4f 53 54 52 41 43  ck ){.    OSTRAC
8560: 45 28 28 22 4c 4f 43 4b 20 20 20 20 25 64 20 25  E(("LOCK    %d %
8570: 73 20 6f 6b 20 28 61 6c 72 65 61 64 79 20 68 65  s ok (already he
8580: 6c 64 29 20 28 75 6e 69 78 29 5c 6e 22 2c 20 70  ld) (unix)\n", p
8590: 46 69 6c 65 2d 3e 68 2c 0a 20 20 20 20 20 20 20  File->h,.       
85a0: 20 20 20 20 20 61 7a 46 69 6c 65 4c 6f 63 6b 28       azFileLock(
85b0: 65 46 69 6c 65 4c 6f 63 6b 29 29 29 3b 0a 20 20  eFileLock)));.  
85c0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
85d0: 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61  OK;.  }..  /* Ma
85e0: 6b 65 20 73 75 72 65 20 74 68 65 20 6c 6f 63 6b  ke sure the lock
85f0: 69 6e 67 20 73 65 71 75 65 6e 63 65 20 69 73 20  ing sequence is 
8600: 63 6f 72 72 65 63 74 2e 0a 20 20 2a 2a 20 20 28  correct..  **  (
8610: 31 29 20 57 65 20 6e 65 76 65 72 20 6d 6f 76 65  1) We never move
8620: 20 66 72 6f 6d 20 75 6e 6c 6f 63 6b 65 64 20 74   from unlocked t
8630: 6f 20 61 6e 79 74 68 69 6e 67 20 68 69 67 68 65  o anything highe
8640: 72 20 74 68 61 6e 20 73 68 61 72 65 64 20 6c 6f  r than shared lo
8650: 63 6b 2e 0a 20 20 2a 2a 20 20 28 32 29 20 53 51  ck..  **  (2) SQ
8660: 4c 69 74 65 20 6e 65 76 65 72 20 65 78 70 6c 69  Lite never expli
8670: 63 69 74 6c 79 20 72 65 71 75 65 73 74 73 20 61  citly requests a
8680: 20 70 65 6e 64 69 67 20 6c 6f 63 6b 2e 0a 20 20   pendig lock..  
8690: 2a 2a 20 20 28 33 29 20 41 20 73 68 61 72 65 64  **  (3) A shared
86a0: 20 6c 6f 63 6b 20 69 73 20 61 6c 77 61 79 73 20   lock is always 
86b0: 68 65 6c 64 20 77 68 65 6e 20 61 20 72 65 73 65  held when a rese
86c0: 72 76 65 20 6c 6f 63 6b 20 69 73 20 72 65 71 75  rve lock is requ
86d0: 65 73 74 65 64 2e 0a 20 20 2a 2f 0a 20 20 61 73  ested..  */.  as
86e0: 73 65 72 74 28 20 70 46 69 6c 65 2d 3e 65 46 69  sert( pFile->eFi
86f0: 6c 65 4c 6f 63 6b 21 3d 4e 4f 5f 4c 4f 43 4b 20  leLock!=NO_LOCK 
8700: 7c 7c 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48  || eFileLock==SH
8710: 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61  ARED_LOCK );.  a
8720: 73 73 65 72 74 28 20 65 46 69 6c 65 4c 6f 63 6b  ssert( eFileLock
8730: 21 3d 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 20 29  !=PENDING_LOCK )
8740: 3b 0a 20 20 61 73 73 65 72 74 28 20 65 46 69 6c  ;.  assert( eFil
8750: 65 4c 6f 63 6b 21 3d 52 45 53 45 52 56 45 44 5f  eLock!=RESERVED_
8760: 4c 4f 43 4b 20 7c 7c 20 70 46 69 6c 65 2d 3e 65  LOCK || pFile->e
8770: 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44  FileLock==SHARED
8780: 5f 4c 4f 43 4b 20 29 3b 0a 0a 20 20 2f 2a 20 54  _LOCK );..  /* T
8790: 68 69 73 20 6d 75 74 65 78 20 69 73 20 6e 65 65  his mutex is nee
87a0: 64 65 64 20 62 65 63 61 75 73 65 20 70 46 69 6c  ded because pFil
87b0: 65 2d 3e 70 49 6e 6f 64 65 20 69 73 20 73 68 61  e->pInode is sha
87c0: 72 65 64 20 61 63 72 6f 73 73 20 74 68 72 65 61  red across threa
87d0: 64 73 0a 20 20 2a 2f 0a 20 20 75 6e 69 78 45 6e  ds.  */.  unixEn
87e0: 74 65 72 4d 75 74 65 78 28 29 3b 0a 20 20 70 49  terMutex();.  pI
87f0: 6e 6f 64 65 20 3d 20 70 46 69 6c 65 2d 3e 70 49  node = pFile->pI
8800: 6e 6f 64 65 3b 0a 0a 20 20 2f 2a 20 49 66 20 73  node;..  /* If s
8810: 6f 6d 65 20 74 68 72 65 61 64 20 75 73 69 6e 67  ome thread using
8820: 20 74 68 69 73 20 50 49 44 20 68 61 73 20 61 20   this PID has a 
8830: 6c 6f 63 6b 20 76 69 61 20 61 20 64 69 66 66 65  lock via a diffe
8840: 72 65 6e 74 20 75 6e 69 78 46 69 6c 65 2a 0a 20  rent unixFile*. 
8850: 20 2a 2a 20 68 61 6e 64 6c 65 20 74 68 61 74 20   ** handle that 
8860: 70 72 65 63 6c 75 64 65 73 20 74 68 65 20 72 65  precludes the re
8870: 71 75 65 73 74 65 64 20 6c 6f 63 6b 2c 20 72 65  quested lock, re
8880: 74 75 72 6e 20 42 55 53 59 2e 0a 20 20 2a 2f 0a  turn BUSY..  */.
8890: 20 20 69 66 28 20 28 70 46 69 6c 65 2d 3e 65 46    if( (pFile->eF
88a0: 69 6c 65 4c 6f 63 6b 21 3d 70 49 6e 6f 64 65 2d  ileLock!=pInode-
88b0: 3e 65 46 69 6c 65 4c 6f 63 6b 20 26 26 20 0a 20  >eFileLock && . 
88c0: 20 20 20 20 20 20 20 20 20 28 70 49 6e 6f 64 65           (pInode
88d0: 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3e 3d 50 45 4e  ->eFileLock>=PEN
88e0: 44 49 4e 47 5f 4c 4f 43 4b 20 7c 7c 20 65 46 69  DING_LOCK || eFi
88f0: 6c 65 4c 6f 63 6b 3e 53 48 41 52 45 44 5f 4c 4f  leLock>SHARED_LO
8900: 43 4b 29 29 0a 20 20 29 7b 0a 20 20 20 20 72 63  CK)).  ){.    rc
8910: 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a   = SQLITE_BUSY;.
8920: 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 6c 6f 63      goto end_loc
8930: 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20  k;.  }..  /* If 
8940: 61 20 53 48 41 52 45 44 20 6c 6f 63 6b 20 69 73  a SHARED lock is
8950: 20 72 65 71 75 65 73 74 65 64 2c 20 61 6e 64 20   requested, and 
8960: 73 6f 6d 65 20 74 68 72 65 61 64 20 75 73 69 6e  some thread usin
8970: 67 20 74 68 69 73 20 50 49 44 20 61 6c 72 65 61  g this PID alrea
8980: 64 79 0a 20 20 2a 2a 20 68 61 73 20 61 20 53 48  dy.  ** has a SH
8990: 41 52 45 44 20 6f 72 20 52 45 53 45 52 56 45 44  ARED or RESERVED
89a0: 20 6c 6f 63 6b 2c 20 74 68 65 6e 20 69 6e 63 72   lock, then incr
89b0: 65 6d 65 6e 74 20 72 65 66 65 72 65 6e 63 65 20  ement reference 
89c0: 63 6f 75 6e 74 73 20 61 6e 64 0a 20 20 2a 2a 20  counts and.  ** 
89d0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
89e0: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65 46 69  ..  */.  if( eFi
89f0: 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c  leLock==SHARED_L
8a00: 4f 43 4b 20 26 26 20 0a 20 20 20 20 20 20 28 70  OCK && .      (p
8a10: 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  Inode->eFileLock
8a20: 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 7c 7c  ==SHARED_LOCK ||
8a30: 20 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f   pInode->eFileLo
8a40: 63 6b 3d 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43  ck==RESERVED_LOC
8a50: 4b 29 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  K) ){.    assert
8a60: 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41  ( eFileLock==SHA
8a70: 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20  RED_LOCK );.    
8a80: 61 73 73 65 72 74 28 20 70 46 69 6c 65 2d 3e 65  assert( pFile->e
8a90: 46 69 6c 65 4c 6f 63 6b 3d 3d 30 20 29 3b 0a 20  FileLock==0 );. 
8aa0: 20 20 20 61 73 73 65 72 74 28 20 70 49 6e 6f 64     assert( pInod
8ab0: 65 2d 3e 6e 53 68 61 72 65 64 3e 30 20 29 3b 0a  e->nShared>0 );.
8ac0: 20 20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65      pFile->eFile
8ad0: 4c 6f 63 6b 20 3d 20 53 48 41 52 45 44 5f 4c 4f  Lock = SHARED_LO
8ae0: 43 4b 3b 0a 20 20 20 20 70 49 6e 6f 64 65 2d 3e  CK;.    pInode->
8af0: 6e 53 68 61 72 65 64 2b 2b 3b 0a 20 20 20 20 70  nShared++;.    p
8b00: 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 2b 2b 3b 0a  Inode->nLock++;.
8b10: 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 6c 6f 63      goto end_loc
8b20: 6b 3b 0a 20 20 7d 0a 0a 0a 20 20 2f 2a 20 41 20  k;.  }...  /* A 
8b30: 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 20 69 73 20  PENDING lock is 
8b40: 6e 65 65 64 65 64 20 62 65 66 6f 72 65 20 61 63  needed before ac
8b50: 71 75 69 72 69 6e 67 20 61 20 53 48 41 52 45 44  quiring a SHARED
8b60: 20 6c 6f 63 6b 20 61 6e 64 20 62 65 66 6f 72 65   lock and before
8b70: 0a 20 20 2a 2a 20 61 63 71 75 69 72 69 6e 67 20  .  ** acquiring 
8b80: 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63  an EXCLUSIVE loc
8b90: 6b 2e 20 20 46 6f 72 20 74 68 65 20 53 48 41 52  k.  For the SHAR
8ba0: 45 44 20 6c 6f 63 6b 2c 20 74 68 65 20 50 45 4e  ED lock, the PEN
8bb0: 44 49 4e 47 20 77 69 6c 6c 0a 20 20 2a 2a 20 62  DING will.  ** b
8bc0: 65 20 72 65 6c 65 61 73 65 64 2e 0a 20 20 2a 2f  e released..  */
8bd0: 0a 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20  .  lock.l_len = 
8be0: 31 4c 3b 0a 20 20 6c 6f 63 6b 2e 6c 5f 77 68 65  1L;.  lock.l_whe
8bf0: 6e 63 65 20 3d 20 53 45 45 4b 5f 53 45 54 3b 0a  nce = SEEK_SET;.
8c00: 20 20 69 66 28 20 65 46 69 6c 65 4c 6f 63 6b 3d    if( eFileLock=
8c10: 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 0a 20 20  =SHARED_LOCK .  
8c20: 20 20 20 20 7c 7c 20 28 65 46 69 6c 65 4c 6f 63      || (eFileLoc
8c30: 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43  k==EXCLUSIVE_LOC
8c40: 4b 20 26 26 20 70 46 69 6c 65 2d 3e 65 46 69 6c  K && pFile->eFil
8c50: 65 4c 6f 63 6b 3c 50 45 4e 44 49 4e 47 5f 4c 4f  eLock<PENDING_LO
8c60: 43 4b 29 0a 20 20 29 7b 0a 20 20 20 20 6c 6f 63  CK).  ){.    loc
8c70: 6b 2e 6c 5f 74 79 70 65 20 3d 20 28 65 46 69 6c  k.l_type = (eFil
8c80: 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f  eLock==SHARED_LO
8c90: 43 4b 3f 46 5f 52 44 4c 43 4b 3a 46 5f 57 52 4c  CK?F_RDLCK:F_WRL
8ca0: 43 4b 29 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f  CK);.    lock.l_
8cb0: 73 74 61 72 74 20 3d 20 50 45 4e 44 49 4e 47 5f  start = PENDING_
8cc0: 42 59 54 45 3b 0a 20 20 20 20 73 20 3d 20 66 63  BYTE;.    s = fc
8cd0: 6e 74 6c 28 70 46 69 6c 65 2d 3e 68 2c 20 46 5f  ntl(pFile->h, F_
8ce0: 53 45 54 4c 4b 2c 20 26 6c 6f 63 6b 29 3b 0a 20  SETLK, &lock);. 
8cf0: 20 20 20 69 66 28 20 73 3d 3d 28 2d 31 29 20 29     if( s==(-1) )
8d00: 7b 0a 20 20 20 20 20 20 74 45 72 72 6e 6f 20 3d  {.      tErrno =
8d10: 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20 72 63   errno;.      rc
8d20: 20 3d 20 73 71 6c 69 74 65 45 72 72 6f 72 46 72   = sqliteErrorFr
8d30: 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28 74 45 72  omPosixError(tEr
8d40: 72 6e 6f 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52  rno, SQLITE_IOER
8d50: 52 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 69  R_LOCK);.      i
8d60: 66 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52  f( IS_LOCK_ERROR
8d70: 28 72 63 29 20 29 7b 0a 20 20 20 20 20 20 20 20  (rc) ){.        
8d80: 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f  pFile->lastErrno
8d90: 20 3d 20 74 45 72 72 6e 6f 3b 0a 20 20 20 20 20   = tErrno;.     
8da0: 20 7d 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 6e   }.      goto en
8db0: 64 5f 6c 6f 63 6b 3b 0a 20 20 20 20 7d 0a 20 20  d_lock;.    }.  
8dc0: 7d 0a 0a 0a 20 20 2f 2a 20 49 66 20 63 6f 6e 74  }...  /* If cont
8dd0: 72 6f 6c 20 67 65 74 73 20 74 6f 20 74 68 69 73  rol gets to this
8de0: 20 70 6f 69 6e 74 2c 20 74 68 65 6e 20 61 63 74   point, then act
8df0: 75 61 6c 6c 79 20 67 6f 20 61 68 65 61 64 20 61  ually go ahead a
8e00: 6e 64 20 6d 61 6b 65 0a 20 20 2a 2a 20 6f 70 65  nd make.  ** ope
8e10: 72 61 74 69 6e 67 20 73 79 73 74 65 6d 20 63 61  rating system ca
8e20: 6c 6c 73 20 66 6f 72 20 74 68 65 20 73 70 65 63  lls for the spec
8e30: 69 66 69 65 64 20 6c 6f 63 6b 2e 0a 20 20 2a 2f  ified lock..  */
8e40: 0a 20 20 69 66 28 20 65 46 69 6c 65 4c 6f 63 6b  .  if( eFileLock
8e50: 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 7b  ==SHARED_LOCK ){
8e60: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 49 6e  .    assert( pIn
8e70: 6f 64 65 2d 3e 6e 53 68 61 72 65 64 3d 3d 30 20  ode->nShared==0 
8e80: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
8e90: 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  Inode->eFileLock
8ea0: 3d 3d 30 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 4e  ==0 );..    /* N
8eb0: 6f 77 20 67 65 74 20 74 68 65 20 72 65 61 64 2d  ow get the read-
8ec0: 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20 6c 6f 63 6b  lock */.    lock
8ed0: 2e 6c 5f 73 74 61 72 74 20 3d 20 53 48 41 52 45  .l_start = SHARE
8ee0: 44 5f 46 49 52 53 54 3b 0a 20 20 20 20 6c 6f 63  D_FIRST;.    loc
8ef0: 6b 2e 6c 5f 6c 65 6e 20 3d 20 53 48 41 52 45 44  k.l_len = SHARED
8f00: 5f 53 49 5a 45 3b 0a 20 20 20 20 69 66 28 20 28  _SIZE;.    if( (
8f10: 73 20 3d 20 66 63 6e 74 6c 28 70 46 69 6c 65 2d  s = fcntl(pFile-
8f20: 3e 68 2c 20 46 5f 53 45 54 4c 4b 2c 20 26 6c 6f  >h, F_SETLK, &lo
8f30: 63 6b 29 29 3d 3d 28 2d 31 29 20 29 7b 0a 20 20  ck))==(-1) ){.  
8f40: 20 20 20 20 74 45 72 72 6e 6f 20 3d 20 65 72 72      tErrno = err
8f50: 6e 6f 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2f 2a  no;.    }.    /*
8f60: 20 44 72 6f 70 20 74 68 65 20 74 65 6d 70 6f 72   Drop the tempor
8f70: 61 72 79 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b  ary PENDING lock
8f80: 20 2a 2f 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73   */.    lock.l_s
8f90: 74 61 72 74 20 3d 20 50 45 4e 44 49 4e 47 5f 42  tart = PENDING_B
8fa0: 59 54 45 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f  YTE;.    lock.l_
8fb0: 6c 65 6e 20 3d 20 31 4c 3b 0a 20 20 20 20 6c 6f  len = 1L;.    lo
8fc0: 63 6b 2e 6c 5f 74 79 70 65 20 3d 20 46 5f 55 4e  ck.l_type = F_UN
8fd0: 4c 43 4b 3b 0a 20 20 20 20 69 66 28 20 66 63 6e  LCK;.    if( fcn
8fe0: 74 6c 28 70 46 69 6c 65 2d 3e 68 2c 20 46 5f 53  tl(pFile->h, F_S
8ff0: 45 54 4c 4b 2c 20 26 6c 6f 63 6b 29 21 3d 30 20  ETLK, &lock)!=0 
9000: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73 20 21  ){.      if( s !
9010: 3d 20 2d 31 20 29 7b 0a 20 20 20 20 20 20 20 20  = -1 ){.        
9020: 2f 2a 20 54 68 69 73 20 63 6f 75 6c 64 20 68 61  /* This could ha
9030: 70 70 65 6e 20 77 69 74 68 20 61 20 6e 65 74 77  ppen with a netw
9040: 6f 72 6b 20 6d 6f 75 6e 74 20 2a 2f 0a 20 20 20  ork mount */.   
9050: 20 20 20 20 20 74 45 72 72 6e 6f 20 3d 20 65 72       tErrno = er
9060: 72 6e 6f 3b 20 0a 20 20 20 20 20 20 20 20 72 63  rno; .        rc
9070: 20 3d 20 73 71 6c 69 74 65 45 72 72 6f 72 46 72   = sqliteErrorFr
9080: 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28 74 45 72  omPosixError(tEr
9090: 72 6e 6f 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52  rno, SQLITE_IOER
90a0: 52 5f 55 4e 4c 4f 43 4b 29 3b 20 0a 20 20 20 20  R_UNLOCK); .    
90b0: 20 20 20 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f      if( IS_LOCK_
90c0: 45 52 52 4f 52 28 72 63 29 20 29 7b 0a 20 20 20  ERROR(rc) ){.   
90d0: 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61         pFile->la
90e0: 73 74 45 72 72 6e 6f 20 3d 20 74 45 72 72 6e 6f  stErrno = tErrno
90f0: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
9100: 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 6c 6f 63      goto end_loc
9110: 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  k;.      }.    }
9120: 0a 20 20 20 20 69 66 28 20 73 3d 3d 28 2d 31 29  .    if( s==(-1)
9130: 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73   ){.      rc = s
9140: 71 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d 50 6f  qliteErrorFromPo
9150: 73 69 78 45 72 72 6f 72 28 74 45 72 72 6e 6f 2c  sixError(tErrno,
9160: 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4c 4f   SQLITE_IOERR_LO
9170: 43 4b 29 3b 0a 20 20 20 20 20 20 69 66 28 20 49  CK);.      if( I
9180: 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 72 63 29  S_LOCK_ERROR(rc)
9190: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 46 69 6c   ){.        pFil
91a0: 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 74  e->lastErrno = t
91b0: 45 72 72 6e 6f 3b 0a 20 20 20 20 20 20 7d 0a 20  Errno;.      }. 
91c0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
91d0: 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  pFile->eFileLock
91e0: 20 3d 20 53 48 41 52 45 44 5f 4c 4f 43 4b 3b 0a   = SHARED_LOCK;.
91f0: 20 20 20 20 20 20 70 49 6e 6f 64 65 2d 3e 6e 4c        pInode->nL
9200: 6f 63 6b 2b 2b 3b 0a 20 20 20 20 20 20 70 49 6e  ock++;.      pIn
9210: 6f 64 65 2d 3e 6e 53 68 61 72 65 64 20 3d 20 31  ode->nShared = 1
9220: 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20  ;.    }.  }else 
9230: 69 66 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 45  if( eFileLock==E
9240: 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 26 26  XCLUSIVE_LOCK &&
9250: 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64   pInode->nShared
9260: 3e 31 20 29 7b 0a 20 20 20 20 2f 2a 20 57 65 20  >1 ){.    /* We 
9270: 61 72 65 20 74 72 79 69 6e 67 20 66 6f 72 20 61  are trying for a
9280: 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b  n exclusive lock
9290: 20 62 75 74 20 61 6e 6f 74 68 65 72 20 74 68 72   but another thr
92a0: 65 61 64 20 69 6e 20 74 68 69 73 0a 20 20 20 20  ead in this.    
92b0: 2a 2a 20 73 61 6d 65 20 70 72 6f 63 65 73 73 20  ** same process 
92c0: 69 73 20 73 74 69 6c 6c 20 68 6f 6c 64 69 6e 67  is still holding
92d0: 20 61 20 73 68 61 72 65 64 20 6c 6f 63 6b 2e 20   a shared lock. 
92e0: 2a 2f 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  */.    rc = SQLI
92f0: 54 45 5f 42 55 53 59 3b 0a 20 20 7d 65 6c 73 65  TE_BUSY;.  }else
9300: 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 72 65 71  {.    /* The req
9310: 75 65 73 74 20 77 61 73 20 66 6f 72 20 61 20 52  uest was for a R
9320: 45 53 45 52 56 45 44 20 6f 72 20 45 58 43 4c 55  ESERVED or EXCLU
9330: 53 49 56 45 20 6c 6f 63 6b 2e 20 20 49 74 20 69  SIVE lock.  It i
9340: 73 0a 20 20 20 20 2a 2a 20 61 73 73 75 6d 65 64  s.    ** assumed
9350: 20 74 68 61 74 20 74 68 65 72 65 20 69 73 20 61   that there is a
9360: 20 53 48 41 52 45 44 20 6f 72 20 67 72 65 61 74   SHARED or great
9370: 65 72 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 66  er lock on the f
9380: 69 6c 65 0a 20 20 20 20 2a 2a 20 61 6c 72 65 61  ile.    ** alrea
9390: 64 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61  dy..    */.    a
93a0: 73 73 65 72 74 28 20 30 21 3d 70 46 69 6c 65 2d  ssert( 0!=pFile-
93b0: 3e 65 46 69 6c 65 4c 6f 63 6b 20 29 3b 0a 20 20  >eFileLock );.  
93c0: 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d 20    lock.l_type = 
93d0: 46 5f 57 52 4c 43 4b 3b 0a 20 20 20 20 73 77 69  F_WRLCK;.    swi
93e0: 74 63 68 28 20 65 46 69 6c 65 4c 6f 63 6b 20 29  tch( eFileLock )
93f0: 7b 0a 20 20 20 20 20 20 63 61 73 65 20 52 45 53  {.      case RES
9400: 45 52 56 45 44 5f 4c 4f 43 4b 3a 0a 20 20 20 20  ERVED_LOCK:.    
9410: 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74      lock.l_start
9420: 20 3d 20 52 45 53 45 52 56 45 44 5f 42 59 54 45   = RESERVED_BYTE
9430: 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;.        break;
9440: 0a 20 20 20 20 20 20 63 61 73 65 20 45 58 43 4c  .      case EXCL
9450: 55 53 49 56 45 5f 4c 4f 43 4b 3a 0a 20 20 20 20  USIVE_LOCK:.    
9460: 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74      lock.l_start
9470: 20 3d 20 53 48 41 52 45 44 5f 46 49 52 53 54 3b   = SHARED_FIRST;
9480: 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f  .        lock.l_
9490: 6c 65 6e 20 3d 20 53 48 41 52 45 44 5f 53 49 5a  len = SHARED_SIZ
94a0: 45 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  E;.        break
94b0: 3b 0a 20 20 20 20 20 20 64 65 66 61 75 6c 74 3a  ;.      default:
94c0: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
94d0: 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 20  0);.    }.    s 
94e0: 3d 20 66 63 6e 74 6c 28 70 46 69 6c 65 2d 3e 68  = fcntl(pFile->h
94f0: 2c 20 46 5f 53 45 54 4c 4b 2c 20 26 6c 6f 63 6b  , F_SETLK, &lock
9500: 29 3b 0a 20 20 20 20 69 66 28 20 73 3d 3d 28 2d  );.    if( s==(-
9510: 31 29 20 29 7b 0a 20 20 20 20 20 20 74 45 72 72  1) ){.      tErr
9520: 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20  no = errno;.    
9530: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 45 72 72    rc = sqliteErr
9540: 6f 72 46 72 6f 6d 50 6f 73 69 78 45 72 72 6f 72  orFromPosixError
9550: 28 74 45 72 72 6e 6f 2c 20 53 51 4c 49 54 45 5f  (tErrno, SQLITE_
9560: 49 4f 45 52 52 5f 4c 4f 43 4b 29 3b 0a 20 20 20  IOERR_LOCK);.   
9570: 20 20 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45     if( IS_LOCK_E
9580: 52 52 4f 52 28 72 63 29 20 29 7b 0a 20 20 20 20  RROR(rc) ){.    
9590: 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45      pFile->lastE
95a0: 72 72 6e 6f 20 3d 20 74 45 72 72 6e 6f 3b 0a 20  rrno = tErrno;. 
95b0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
95c0: 0a 20 20 0a 0a 23 69 66 6e 64 65 66 20 4e 44 45  .  ..#ifndef NDE
95d0: 42 55 47 0a 20 20 2f 2a 20 53 65 74 20 75 70 20  BUG.  /* Set up 
95e0: 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2d  the transaction-
95f0: 63 6f 75 6e 74 65 72 20 63 68 61 6e 67 65 20 63  counter change c
9600: 68 65 63 6b 69 6e 67 20 66 6c 61 67 73 20 77 68  hecking flags wh
9610: 65 6e 0a 20 20 2a 2a 20 74 72 61 6e 73 69 74 69  en.  ** transiti
9620: 6f 6e 69 6e 67 20 66 72 6f 6d 20 61 20 53 48 41  oning from a SHA
9630: 52 45 44 20 74 6f 20 61 20 52 45 53 45 52 56 45  RED to a RESERVE
9640: 44 20 6c 6f 63 6b 2e 20 20 54 68 65 20 63 68 61  D lock.  The cha
9650: 6e 67 65 0a 20 20 2a 2a 20 66 72 6f 6d 20 53 48  nge.  ** from SH
9660: 41 52 45 44 20 74 6f 20 52 45 53 45 52 56 45 44  ARED to RESERVED
9670: 20 6d 61 72 6b 73 20 74 68 65 20 62 65 67 69 6e   marks the begin
9680: 6e 69 6e 67 20 6f 66 20 61 20 6e 6f 72 6d 61 6c  ning of a normal
9690: 0a 20 20 2a 2a 20 77 72 69 74 65 20 6f 70 65 72  .  ** write oper
96a0: 61 74 69 6f 6e 20 28 6e 6f 74 20 61 20 68 6f 74  ation (not a hot
96b0: 20 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61 63   journal rollbac
96c0: 6b 29 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 72  k)..  */.  if( r
96d0: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 0a 20 20 20  c==SQLITE_OK.   
96e0: 26 26 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c  && pFile->eFileL
96f0: 6f 63 6b 3c 3d 53 48 41 52 45 44 5f 4c 4f 43 4b  ock<=SHARED_LOCK
9700: 0a 20 20 20 26 26 20 65 46 69 6c 65 4c 6f 63 6b  .   && eFileLock
9710: 3d 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 0a  ==RESERVED_LOCK.
9720: 20 20 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e    ){.    pFile->
9730: 74 72 61 6e 73 43 6e 74 72 43 68 6e 67 20 3d 20  transCntrChng = 
9740: 30 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 64 62  0;.    pFile->db
9750: 55 70 64 61 74 65 20 3d 20 30 3b 0a 20 20 20 20  Update = 0;.    
9760: 70 46 69 6c 65 2d 3e 69 6e 4e 6f 72 6d 61 6c 57  pFile->inNormalW
9770: 72 69 74 65 20 3d 20 31 3b 0a 20 20 7d 0a 23 65  rite = 1;.  }.#e
9780: 6e 64 69 66 0a 0a 0a 20 20 69 66 28 20 72 63 3d  ndif...  if( rc=
9790: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
97a0: 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f    pFile->eFileLo
97b0: 63 6b 20 3d 20 65 46 69 6c 65 4c 6f 63 6b 3b 0a  ck = eFileLock;.
97c0: 20 20 20 20 70 49 6e 6f 64 65 2d 3e 65 46 69 6c      pInode->eFil
97d0: 65 4c 6f 63 6b 20 3d 20 65 46 69 6c 65 4c 6f 63  eLock = eFileLoc
97e0: 6b 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 65  k;.  }else if( e
97f0: 46 69 6c 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53  FileLock==EXCLUS
9800: 49 56 45 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20  IVE_LOCK ){.    
9810: 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  pFile->eFileLock
9820: 20 3d 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 3b   = PENDING_LOCK;
9830: 0a 20 20 20 20 70 49 6e 6f 64 65 2d 3e 65 46 69  .    pInode->eFi
9840: 6c 65 4c 6f 63 6b 20 3d 20 50 45 4e 44 49 4e 47  leLock = PENDING
9850: 5f 4c 4f 43 4b 3b 0a 20 20 7d 0a 0a 65 6e 64 5f  _LOCK;.  }..end_
9860: 6c 6f 63 6b 3a 0a 20 20 75 6e 69 78 4c 65 61 76  lock:.  unixLeav
9870: 65 4d 75 74 65 78 28 29 3b 0a 20 20 4f 53 54 52  eMutex();.  OSTR
9880: 41 43 45 28 28 22 4c 4f 43 4b 20 20 20 20 25 64  ACE(("LOCK    %d
9890: 20 25 73 20 25 73 20 28 75 6e 69 78 29 5c 6e 22   %s %s (unix)\n"
98a0: 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 61 7a 46 69  , pFile->h, azFi
98b0: 6c 65 4c 6f 63 6b 28 65 46 69 6c 65 4c 6f 63 6b  leLock(eFileLock
98c0: 29 2c 20 0a 20 20 20 20 20 20 72 63 3d 3d 53 51  ), .      rc==SQ
98d0: 4c 49 54 45 5f 4f 4b 20 3f 20 22 6f 6b 22 20 3a  LITE_OK ? "ok" :
98e0: 20 22 66 61 69 6c 65 64 22 29 29 3b 0a 20 20 72   "failed"));.  r
98f0: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
9900: 2a 2a 20 43 6c 6f 73 65 20 61 6c 6c 20 66 69 6c  ** Close all fil
9910: 65 20 64 65 73 63 72 69 70 74 6f 72 73 20 61 63  e descriptors ac
9920: 63 75 6d 75 61 74 65 64 20 69 6e 20 74 68 65 20  cumuated in the 
9930: 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 2d 3e 70  unixInodeInfo->p
9940: 55 6e 75 73 65 64 20 6c 69 73 74 2e 0a 2a 2a 20  Unused list..** 
9950: 49 66 20 61 6c 6c 20 73 75 63 68 20 66 69 6c 65  If all such file
9960: 20 64 65 73 63 72 69 70 74 6f 72 73 20 61 72 65   descriptors are
9970: 20 63 6c 6f 73 65 64 20 77 69 74 68 6f 75 74 20   closed without 
9980: 65 72 72 6f 72 2c 20 74 68 65 20 6c 69 73 74 20  error, the list 
9990: 69 73 0a 2a 2a 20 63 6c 65 61 72 65 64 20 61 6e  is.** cleared an
99a0: 64 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75  d SQLITE_OK retu
99b0: 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65  rned..**.** Othe
99c0: 72 77 69 73 65 2c 20 69 66 20 61 6e 20 65 72 72  rwise, if an err
99d0: 6f 72 20 6f 63 63 75 72 73 2c 20 74 68 65 6e 20  or occurs, then 
99e0: 73 75 63 63 65 73 73 66 75 6c 6c 79 20 63 6c 6f  successfully clo
99f0: 73 65 64 20 66 69 6c 65 20 64 65 73 63 72 69 70  sed file descrip
9a00: 74 6f 72 0a 2a 2a 20 65 6e 74 72 69 65 73 20 61  tor.** entries a
9a10: 72 65 20 72 65 6d 6f 76 65 64 20 66 72 6f 6d 20  re removed from 
9a20: 74 68 65 20 6c 69 73 74 2c 20 61 6e 64 20 53 51  the list, and SQ
9a30: 4c 49 54 45 5f 49 4f 45 52 52 5f 43 4c 4f 53 45  LITE_IOERR_CLOSE
9a40: 20 72 65 74 75 72 6e 65 64 2e 20 0a 2a 2a 20 6e   returned. .** n
9a50: 6f 74 20 64 65 6c 65 74 65 64 20 61 6e 64 20 53  ot deleted and S
9a60: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43 4c 4f 53  QLITE_IOERR_CLOS
9a70: 45 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 20 0a  E returned..*/ .
9a80: 73 74 61 74 69 63 20 69 6e 74 20 63 6c 6f 73 65  static int close
9a90: 50 65 6e 64 69 6e 67 46 64 73 28 75 6e 69 78 46  PendingFds(unixF
9aa0: 69 6c 65 20 2a 70 46 69 6c 65 29 7b 0a 20 20 69  ile *pFile){.  i
9ab0: 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
9ac0: 4b 3b 0a 20 20 75 6e 69 78 49 6e 6f 64 65 49 6e  K;.  unixInodeIn
9ad0: 66 6f 20 2a 70 49 6e 6f 64 65 20 3d 20 70 46 69  fo *pInode = pFi
9ae0: 6c 65 2d 3e 70 49 6e 6f 64 65 3b 0a 20 20 55 6e  le->pInode;.  Un
9af0: 69 78 55 6e 75 73 65 64 46 64 20 2a 70 45 72 72  ixUnusedFd *pErr
9b00: 6f 72 20 3d 20 30 3b 0a 20 20 55 6e 69 78 55 6e  or = 0;.  UnixUn
9b10: 75 73 65 64 46 64 20 2a 70 3b 0a 20 20 55 6e 69  usedFd *p;.  Uni
9b20: 78 55 6e 75 73 65 64 46 64 20 2a 70 4e 65 78 74  xUnusedFd *pNext
9b30: 3b 0a 20 20 66 6f 72 28 70 3d 70 49 6e 6f 64 65  ;.  for(p=pInode
9b40: 2d 3e 70 55 6e 75 73 65 64 3b 20 70 3b 20 70 3d  ->pUnused; p; p=
9b50: 70 4e 65 78 74 29 7b 0a 20 20 20 20 70 4e 65 78  pNext){.    pNex
9b60: 74 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a 20 20  t = p->pNext;.  
9b70: 20 20 69 66 28 20 63 6c 6f 73 65 28 70 2d 3e 66    if( close(p->f
9b80: 64 29 20 29 7b 0a 20 20 20 20 20 20 70 46 69 6c  d) ){.      pFil
9b90: 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 65  e->lastErrno = e
9ba0: 72 72 6e 6f 3b 0a 20 20 20 20 20 20 72 63 20 3d  rrno;.      rc =
9bb0: 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43 4c   SQLITE_IOERR_CL
9bc0: 4f 53 45 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4e  OSE;.      p->pN
9bd0: 65 78 74 20 3d 20 70 45 72 72 6f 72 3b 0a 20 20  ext = pError;.  
9be0: 20 20 20 20 70 45 72 72 6f 72 20 3d 20 70 3b 0a      pError = p;.
9bf0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
9c00: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 29   sqlite3_free(p)
9c10: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 49  ;.    }.  }.  pI
9c20: 6e 6f 64 65 2d 3e 70 55 6e 75 73 65 64 20 3d 20  node->pUnused = 
9c30: 70 45 72 72 6f 72 3b 0a 20 20 72 65 74 75 72 6e  pError;.  return
9c40: 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64   rc;.}../*.** Ad
9c50: 64 20 74 68 65 20 66 69 6c 65 20 64 65 73 63 72  d the file descr
9c60: 69 70 74 6f 72 20 75 73 65 64 20 62 79 20 66 69  iptor used by fi
9c70: 6c 65 20 68 61 6e 64 6c 65 20 70 46 69 6c 65 20  le handle pFile 
9c80: 74 6f 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e  to the correspon
9c90: 64 69 6e 67 0a 2a 2a 20 70 55 6e 75 73 65 64 20  ding.** pUnused 
9ca0: 6c 69 73 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  list..*/.static 
9cb0: 76 6f 69 64 20 73 65 74 50 65 6e 64 69 6e 67 46  void setPendingF
9cc0: 64 28 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c  d(unixFile *pFil
9cd0: 65 29 7b 0a 20 20 75 6e 69 78 49 6e 6f 64 65 49  e){.  unixInodeI
9ce0: 6e 66 6f 20 2a 70 49 6e 6f 64 65 20 3d 20 70 46  nfo *pInode = pF
9cf0: 69 6c 65 2d 3e 70 49 6e 6f 64 65 3b 0a 20 20 55  ile->pInode;.  U
9d00: 6e 69 78 55 6e 75 73 65 64 46 64 20 2a 70 20 3d  nixUnusedFd *p =
9d10: 20 70 46 69 6c 65 2d 3e 70 55 6e 75 73 65 64 3b   pFile->pUnused;
9d20: 0a 20 20 70 2d 3e 70 4e 65 78 74 20 3d 20 70 49  .  p->pNext = pI
9d30: 6e 6f 64 65 2d 3e 70 55 6e 75 73 65 64 3b 0a 20  node->pUnused;. 
9d40: 20 70 49 6e 6f 64 65 2d 3e 70 55 6e 75 73 65 64   pInode->pUnused
9d50: 20 3d 20 70 3b 0a 20 20 70 46 69 6c 65 2d 3e 68   = p;.  pFile->h
9d60: 20 3d 20 2d 31 3b 0a 20 20 70 46 69 6c 65 2d 3e   = -1;.  pFile->
9d70: 70 55 6e 75 73 65 64 20 3d 20 30 3b 0a 7d 0a 0a  pUnused = 0;.}..
9d80: 2f 2a 0a 2a 2a 20 4c 6f 77 65 72 20 74 68 65 20  /*.** Lower the 
9d90: 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 6e  locking level on
9da0: 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
9db0: 20 70 46 69 6c 65 20 74 6f 20 65 46 69 6c 65 4c   pFile to eFileL
9dc0: 6f 63 6b 2e 20 20 65 46 69 6c 65 4c 6f 63 6b 0a  ock.  eFileLock.
9dd0: 2a 2a 20 6d 75 73 74 20 62 65 20 65 69 74 68 65  ** must be eithe
9de0: 72 20 4e 4f 5f 4c 4f 43 4b 20 6f 72 20 53 48 41  r NO_LOCK or SHA
9df0: 52 45 44 5f 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20  RED_LOCK..**.** 
9e00: 49 66 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c  If the locking l
9e10: 65 76 65 6c 20 6f 66 20 74 68 65 20 66 69 6c 65  evel of the file
9e20: 20 64 65 73 63 72 69 70 74 6f 72 20 69 73 20 61   descriptor is a
9e30: 6c 72 65 61 64 79 20 61 74 20 6f 72 20 62 65 6c  lready at or bel
9e40: 6f 77 0a 2a 2a 20 74 68 65 20 72 65 71 75 65 73  ow.** the reques
9e50: 74 65 64 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65  ted locking leve
9e60: 6c 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  l, this routine 
9e70: 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 20 0a  is a no-op..** .
9e80: 2a 2a 20 49 66 20 68 61 6e 64 6c 65 4e 46 53 55  ** If handleNFSU
9e90: 6e 6c 6f 63 6b 20 69 73 20 74 72 75 65 2c 20 74  nlock is true, t
9ea0: 68 65 6e 20 6f 6e 20 64 6f 77 6e 67 72 61 64 69  hen on downgradi
9eb0: 6e 67 20 61 6e 20 45 58 43 4c 55 53 49 56 45 5f  ng an EXCLUSIVE_
9ec0: 4c 4f 43 4b 20 74 6f 20 53 48 41 52 45 44 0a 2a  LOCK to SHARED.*
9ed0: 2a 20 74 68 65 20 62 79 74 65 20 72 61 6e 67 65  * the byte range
9ee0: 20 69 73 20 64 69 76 69 64 65 64 20 69 6e 74 6f   is divided into
9ef0: 20 32 20 70 61 72 74 73 20 61 6e 64 20 74 68 65   2 parts and the
9f00: 20 66 69 72 73 74 20 70 61 72 74 20 69 73 20 75   first part is u
9f10: 6e 6c 6f 63 6b 65 64 20 74 68 65 6e 0a 2a 2a 20  nlocked then.** 
9f20: 73 65 74 20 74 6f 20 61 20 72 65 61 64 20 6c 6f  set to a read lo
9f30: 63 6b 2c 20 74 68 65 6e 20 74 68 65 20 6f 74 68  ck, then the oth
9f40: 65 72 20 70 61 72 74 20 69 73 20 73 69 6d 70 6c  er part is simpl
9f50: 79 20 75 6e 6c 6f 63 6b 65 64 2e 20 20 54 68 69  y unlocked.  Thi
9f60: 73 20 77 6f 72 6b 73 20 0a 2a 2a 20 61 72 6f 75  s works .** arou
9f70: 6e 64 20 61 20 62 75 67 20 69 6e 20 42 53 44 20  nd a bug in BSD 
9f80: 4e 46 53 20 6c 6f 63 6b 64 20 28 61 6c 73 6f 20  NFS lockd (also 
9f90: 73 65 65 6e 20 6f 6e 20 4d 61 63 4f 53 58 20 31  seen on MacOSX 1
9fa0: 30 2e 33 2b 29 20 74 68 61 74 20 66 61 69 6c 73  0.3+) that fails
9fb0: 20 74 6f 20 0a 2a 2a 20 72 65 6d 6f 76 65 20 74   to .** remove t
9fc0: 68 65 20 77 72 69 74 65 20 6c 6f 63 6b 20 6f 6e  he write lock on
9fd0: 20 61 20 72 65 67 69 6f 6e 20 77 68 65 6e 20 61   a region when a
9fe0: 20 72 65 61 64 20 6c 6f 63 6b 20 69 73 20 73 65   read lock is se
9ff0: 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  t..*/.static int
a000: 20 5f 70 6f 73 69 78 55 6e 6c 6f 63 6b 28 73 71   _posixUnlock(sq
a010: 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20  lite3_file *id, 
a020: 69 6e 74 20 65 46 69 6c 65 4c 6f 63 6b 2c 20 69  int eFileLock, i
a030: 6e 74 20 68 61 6e 64 6c 65 4e 46 53 55 6e 6c 6f  nt handleNFSUnlo
a040: 63 6b 29 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20  ck){.  unixFile 
a050: 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69  *pFile = (unixFi
a060: 6c 65 2a 29 69 64 3b 0a 20 20 75 6e 69 78 49 6e  le*)id;.  unixIn
a070: 6f 64 65 49 6e 66 6f 20 2a 70 49 6e 6f 64 65 3b  odeInfo *pInode;
a080: 0a 20 20 73 74 72 75 63 74 20 66 6c 6f 63 6b 20  .  struct flock 
a090: 6c 6f 63 6b 3b 0a 20 20 69 6e 74 20 72 63 20 3d  lock;.  int rc =
a0a0: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e   SQLITE_OK;.  in
a0b0: 74 20 68 3b 0a 20 20 69 6e 74 20 74 45 72 72 6e  t h;.  int tErrn
a0c0: 6f 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  o;              
a0d0: 20 20 20 20 20 20 20 20 2f 2a 20 45 72 72 6f 72          /* Error
a0e0: 20 63 6f 64 65 20 66 72 6f 6d 20 73 79 73 74 65   code from syste
a0f0: 6d 20 63 61 6c 6c 20 65 72 72 6f 72 73 20 2a 2f  m call errors */
a100: 0a 0a 20 20 61 73 73 65 72 74 28 20 70 46 69 6c  ..  assert( pFil
a110: 65 20 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28  e );.  OSTRACE((
a120: 22 55 4e 4c 4f 43 4b 20 20 25 64 20 25 64 20 77  "UNLOCK  %d %d w
a130: 61 73 20 25 64 28 25 64 2c 25 64 29 20 70 69 64  as %d(%d,%d) pid
a140: 3d 25 64 20 28 75 6e 69 78 29 5c 6e 22 2c 20 70  =%d (unix)\n", p
a150: 46 69 6c 65 2d 3e 68 2c 20 65 46 69 6c 65 4c 6f  File->h, eFileLo
a160: 63 6b 2c 0a 20 20 20 20 20 20 70 46 69 6c 65 2d  ck,.      pFile-
a170: 3e 65 46 69 6c 65 4c 6f 63 6b 2c 20 70 46 69 6c  >eFileLock, pFil
a180: 65 2d 3e 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65  e->pInode->eFile
a190: 4c 6f 63 6b 2c 20 70 46 69 6c 65 2d 3e 70 49 6e  Lock, pFile->pIn
a1a0: 6f 64 65 2d 3e 6e 53 68 61 72 65 64 2c 0a 20 20  ode->nShared,.  
a1b0: 20 20 20 20 67 65 74 70 69 64 28 29 29 29 3b 0a      getpid()));.
a1c0: 0a 20 20 61 73 73 65 72 74 28 20 65 46 69 6c 65  .  assert( eFile
a1d0: 4c 6f 63 6b 3c 3d 53 48 41 52 45 44 5f 4c 4f 43  Lock<=SHARED_LOC
a1e0: 4b 20 29 3b 0a 20 20 69 66 28 20 70 46 69 6c 65  K );.  if( pFile
a1f0: 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3c 3d 65 46 69  ->eFileLock<=eFi
a200: 6c 65 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 72 65  leLock ){.    re
a210: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
a220: 20 20 7d 0a 20 20 75 6e 69 78 45 6e 74 65 72 4d    }.  unixEnterM
a230: 75 74 65 78 28 29 3b 0a 20 20 68 20 3d 20 70 46  utex();.  h = pF
a240: 69 6c 65 2d 3e 68 3b 0a 20 20 70 49 6e 6f 64 65  ile->h;.  pInode
a250: 20 3d 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65   = pFile->pInode
a260: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 49 6e 6f  ;.  assert( pIno
a270: 64 65 2d 3e 6e 53 68 61 72 65 64 21 3d 30 20 29  de->nShared!=0 )
a280: 3b 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 65  ;.  if( pFile->e
a290: 46 69 6c 65 4c 6f 63 6b 3e 53 48 41 52 45 44 5f  FileLock>SHARED_
a2a0: 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 61 73 73 65  LOCK ){.    asse
a2b0: 72 74 28 20 70 49 6e 6f 64 65 2d 3e 65 46 69 6c  rt( pInode->eFil
a2c0: 65 4c 6f 63 6b 3d 3d 70 46 69 6c 65 2d 3e 65 46  eLock==pFile->eF
a2d0: 69 6c 65 4c 6f 63 6b 20 29 3b 0a 20 20 20 20 53  ileLock );.    S
a2e0: 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 42 65  imulateIOErrorBe
a2f0: 6e 69 67 6e 28 31 29 3b 0a 20 20 20 20 53 69 6d  nign(1);.    Sim
a300: 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 68 3d  ulateIOError( h=
a310: 28 2d 31 29 20 29 0a 20 20 20 20 53 69 6d 75 6c  (-1) ).    Simul
a320: 61 74 65 49 4f 45 72 72 6f 72 42 65 6e 69 67 6e  ateIOErrorBenign
a330: 28 30 29 3b 0a 0a 23 69 66 6e 64 65 66 20 4e 44  (0);..#ifndef ND
a340: 45 42 55 47 0a 20 20 20 20 2f 2a 20 57 68 65 6e  EBUG.    /* When
a350: 20 72 65 64 75 63 69 6e 67 20 61 20 6c 6f 63 6b   reducing a lock
a360: 20 73 75 63 68 20 74 68 61 74 20 6f 74 68 65 72   such that other
a370: 20 70 72 6f 63 65 73 73 65 73 20 63 61 6e 20 73   processes can s
a380: 74 61 72 74 0a 20 20 20 20 2a 2a 20 72 65 61 64  tart.    ** read
a390: 69 6e 67 20 74 68 65 20 64 61 74 61 62 61 73 65  ing the database
a3a0: 20 66 69 6c 65 20 61 67 61 69 6e 2c 20 6d 61 6b   file again, mak
a3b0: 65 20 73 75 72 65 20 74 68 61 74 20 74 68 65 0a  e sure that the.
a3c0: 20 20 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69      ** transacti
a3d0: 6f 6e 20 63 6f 75 6e 74 65 72 20 77 61 73 20 75  on counter was u
a3e0: 70 64 61 74 65 64 20 69 66 20 61 6e 79 20 70 61  pdated if any pa
a3f0: 72 74 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  rt of the databa
a400: 73 65 0a 20 20 20 20 2a 2a 20 66 69 6c 65 20 63  se.    ** file c
a410: 68 61 6e 67 65 64 2e 20 20 49 66 20 74 68 65 20  hanged.  If the 
a420: 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f 75 6e  transaction coun
a430: 74 65 72 20 69 73 20 6e 6f 74 20 75 70 64 61 74  ter is not updat
a440: 65 64 2c 0a 20 20 20 20 2a 2a 20 6f 74 68 65 72  ed,.    ** other
a450: 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 74 6f 20   connections to 
a460: 74 68 65 20 73 61 6d 65 20 66 69 6c 65 20 6d 69  the same file mi
a470: 67 68 74 20 6e 6f 74 20 72 65 61 6c 69 7a 65 20  ght not realize 
a480: 74 68 61 74 0a 20 20 20 20 2a 2a 20 74 68 65 20  that.    ** the 
a490: 66 69 6c 65 20 68 61 73 20 63 68 61 6e 67 65 64  file has changed
a4a0: 20 61 6e 64 20 68 65 6e 63 65 20 6d 69 67 68 74   and hence might
a4b0: 20 6e 6f 74 20 6b 6e 6f 77 20 74 6f 20 66 6c 75   not know to flu
a4c0: 73 68 20 74 68 65 69 72 0a 20 20 20 20 2a 2a 20  sh their.    ** 
a4d0: 63 61 63 68 65 2e 20 20 54 68 65 20 75 73 65 20  cache.  The use 
a4e0: 6f 66 20 61 20 73 74 61 6c 65 20 63 61 63 68 65  of a stale cache
a4f0: 20 63 61 6e 20 6c 65 61 64 20 74 6f 20 64 61 74   can lead to dat
a500: 61 62 61 73 65 20 63 6f 72 72 75 70 74 69 6f 6e  abase corruption
a510: 2e 0a 20 20 20 20 2a 2f 0a 23 69 66 20 30 0a 20  ..    */.#if 0. 
a520: 20 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65     assert( pFile
a530: 2d 3e 69 6e 4e 6f 72 6d 61 6c 57 72 69 74 65 3d  ->inNormalWrite=
a540: 3d 30 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 70  =0.         || p
a550: 46 69 6c 65 2d 3e 64 62 55 70 64 61 74 65 3d 3d  File->dbUpdate==
a560: 30 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 70 46  0.         || pF
a570: 69 6c 65 2d 3e 74 72 61 6e 73 43 6e 74 72 43 68  ile->transCntrCh
a580: 6e 67 3d 3d 31 20 29 3b 0a 23 65 6e 64 69 66 0a  ng==1 );.#endif.
a590: 20 20 20 20 70 46 69 6c 65 2d 3e 69 6e 4e 6f 72      pFile->inNor
a5a0: 6d 61 6c 57 72 69 74 65 20 3d 20 30 3b 0a 23 65  malWrite = 0;.#e
a5b0: 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 64 6f 77  ndif..    /* dow
a5c0: 6e 67 72 61 64 69 6e 67 20 74 6f 20 61 20 73 68  ngrading to a sh
a5d0: 61 72 65 64 20 6c 6f 63 6b 20 6f 6e 20 4e 46 53  ared lock on NFS
a5e0: 20 69 6e 76 6f 6c 76 65 73 20 63 6c 65 61 72 69   involves cleari
a5f0: 6e 67 20 74 68 65 20 77 72 69 74 65 20 6c 6f 63  ng the write loc
a600: 6b 0a 20 20 20 20 2a 2a 20 62 65 66 6f 72 65 20  k.    ** before 
a610: 65 73 74 61 62 6c 69 73 68 69 6e 67 20 74 68 65  establishing the
a620: 20 72 65 61 64 6c 6f 63 6b 20 2d 20 74 6f 20 61   readlock - to a
a630: 76 6f 69 64 20 61 20 72 61 63 65 20 63 6f 6e 64  void a race cond
a640: 69 74 69 6f 6e 20 77 65 20 64 6f 77 6e 67 72 61  ition we downgra
a650: 64 65 0a 20 20 20 20 2a 2a 20 74 68 65 20 6c 6f  de.    ** the lo
a660: 63 6b 20 69 6e 20 32 20 62 6c 6f 63 6b 73 2c 20  ck in 2 blocks, 
a670: 73 6f 20 74 68 61 74 20 70 61 72 74 20 6f 66 20  so that part of 
a680: 74 68 65 20 72 61 6e 67 65 20 77 69 6c 6c 20 62  the range will b
a690: 65 20 63 6f 76 65 72 65 64 20 62 79 20 61 20 0a  e covered by a .
a6a0: 20 20 20 20 2a 2a 20 77 72 69 74 65 20 6c 6f 63      ** write loc
a6b0: 6b 20 75 6e 74 69 6c 20 74 68 65 20 72 65 73 74  k until the rest
a6c0: 20 69 73 20 63 6f 76 65 72 65 64 20 62 79 20 61   is covered by a
a6d0: 20 72 65 61 64 20 6c 6f 63 6b 3a 0a 20 20 20 20   read lock:.    
a6e0: 2a 2a 20 20 31 3a 20 20 20 5b 57 57 57 57 57 5d  **  1:   [WWWWW]
a6f0: 0a 20 20 20 20 2a 2a 20 20 32 3a 20 20 20 5b 2e  .    **  2:   [.
a700: 2e 2e 2e 57 5d 0a 20 20 20 20 2a 2a 20 20 33 3a  ...W].    **  3:
a710: 20 20 20 5b 52 52 52 52 57 5d 0a 20 20 20 20 2a     [RRRRW].    *
a720: 2a 20 20 34 3a 20 20 20 5b 52 52 52 52 2e 5d 0a  *  4:   [RRRR.].
a730: 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 65      */.    if( e
a740: 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44  FileLock==SHARED
a750: 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 20 20 69  _LOCK ){.      i
a760: 66 28 20 68 61 6e 64 6c 65 4e 46 53 55 6e 6c 6f  f( handleNFSUnlo
a770: 63 6b 20 29 7b 0a 20 20 20 20 20 20 20 20 6f 66  ck ){.        of
a780: 66 5f 74 20 64 69 76 53 69 7a 65 20 3d 20 53 48  f_t divSize = SH
a790: 41 52 45 44 5f 53 49 5a 45 20 2d 20 31 3b 0a 20  ARED_SIZE - 1;. 
a7a0: 20 20 20 20 20 20 20 0a 20 20 20 20 20 20 20 20         .        
a7b0: 6c 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d 20 46 5f  lock.l_type = F_
a7c0: 55 4e 4c 43 4b 3b 0a 20 20 20 20 20 20 20 20 6c  UNLCK;.        l
a7d0: 6f 63 6b 2e 6c 5f 77 68 65 6e 63 65 20 3d 20 53  ock.l_whence = S
a7e0: 45 45 4b 5f 53 45 54 3b 0a 20 20 20 20 20 20 20  EEK_SET;.       
a7f0: 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20   lock.l_start = 
a800: 53 48 41 52 45 44 5f 46 49 52 53 54 3b 0a 20 20  SHARED_FIRST;.  
a810: 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e        lock.l_len
a820: 20 3d 20 64 69 76 53 69 7a 65 3b 0a 20 20 20 20   = divSize;.    
a830: 20 20 20 20 69 66 28 20 66 63 6e 74 6c 28 68 2c      if( fcntl(h,
a840: 20 46 5f 53 45 54 4c 4b 2c 20 26 6c 6f 63 6b 29   F_SETLK, &lock)
a850: 3d 3d 28 2d 31 29 20 29 7b 0a 20 20 20 20 20 20  ==(-1) ){.      
a860: 20 20 20 20 74 45 72 72 6e 6f 20 3d 20 65 72 72      tErrno = err
a870: 6e 6f 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63  no;.          rc
a880: 20 3d 20 73 71 6c 69 74 65 45 72 72 6f 72 46 72   = sqliteErrorFr
a890: 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28 74 45 72  omPosixError(tEr
a8a0: 72 6e 6f 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52  rno, SQLITE_IOER
a8b0: 52 5f 55 4e 4c 4f 43 4b 29 3b 0a 20 20 20 20 20  R_UNLOCK);.     
a8c0: 20 20 20 20 20 69 66 28 20 49 53 5f 4c 4f 43 4b       if( IS_LOCK
a8d0: 5f 45 52 52 4f 52 28 72 63 29 20 29 7b 0a 20 20  _ERROR(rc) ){.  
a8e0: 20 20 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d            pFile-
a8f0: 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 74 45 72  >lastErrno = tEr
a900: 72 6e 6f 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  rno;.          }
a910: 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20  .          goto 
a920: 65 6e 64 5f 75 6e 6c 6f 63 6b 3b 0a 20 20 20 20  end_unlock;.    
a930: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 6c 6f      }.        lo
a940: 63 6b 2e 6c 5f 74 79 70 65 20 3d 20 46 5f 52 44  ck.l_type = F_RD
a950: 4c 43 4b 3b 0a 20 20 20 20 20 20 20 20 6c 6f 63  LCK;.        loc
a960: 6b 2e 6c 5f 77 68 65 6e 63 65 20 3d 20 53 45 45  k.l_whence = SEE
a970: 4b 5f 53 45 54 3b 0a 20 20 20 20 20 20 20 20 6c  K_SET;.        l
a980: 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 53 48  ock.l_start = SH
a990: 41 52 45 44 5f 46 49 52 53 54 3b 0a 20 20 20 20  ARED_FIRST;.    
a9a0: 20 20 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d      lock.l_len =
a9b0: 20 64 69 76 53 69 7a 65 3b 0a 20 20 20 20 20 20   divSize;.      
a9c0: 20 20 69 66 28 20 66 63 6e 74 6c 28 68 2c 20 46    if( fcntl(h, F
a9d0: 5f 53 45 54 4c 4b 2c 20 26 6c 6f 63 6b 29 3d 3d  _SETLK, &lock)==
a9e0: 28 2d 31 29 20 29 7b 0a 20 20 20 20 20 20 20 20  (-1) ){.        
a9f0: 20 20 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f    tErrno = errno
aa00: 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  ;.          rc =
aa10: 20 73 71 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d   sqliteErrorFrom
aa20: 50 6f 73 69 78 45 72 72 6f 72 28 74 45 72 72 6e  PosixError(tErrn
aa30: 6f 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  o, SQLITE_IOERR_
aa40: 52 44 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 20  RDLOCK);.       
aa50: 20 20 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45     if( IS_LOCK_E
aa60: 52 52 4f 52 28 72 63 29 20 29 7b 0a 20 20 20 20  RROR(rc) ){.    
aa70: 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c          pFile->l
aa80: 61 73 74 45 72 72 6e 6f 20 3d 20 74 45 72 72 6e  astErrno = tErrn
aa90: 6f 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  o;.          }. 
aaa0: 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e           goto en
aab0: 64 5f 75 6e 6c 6f 63 6b 3b 0a 20 20 20 20 20 20  d_unlock;.      
aac0: 20 20 7d 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b    }.        lock
aad0: 2e 6c 5f 74 79 70 65 20 3d 20 46 5f 55 4e 4c 43  .l_type = F_UNLC
aae0: 4b 3b 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e  K;.        lock.
aaf0: 6c 5f 77 68 65 6e 63 65 20 3d 20 53 45 45 4b 5f  l_whence = SEEK_
ab00: 53 45 54 3b 0a 20 20 20 20 20 20 20 20 6c 6f 63  SET;.        loc
ab10: 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 53 48 41 52  k.l_start = SHAR
ab20: 45 44 5f 46 49 52 53 54 2b 64 69 76 53 69 7a 65  ED_FIRST+divSize
ab30: 3b 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e 6c  ;.        lock.l
ab40: 5f 6c 65 6e 20 3d 20 53 48 41 52 45 44 5f 53 49  _len = SHARED_SI
ab50: 5a 45 2d 64 69 76 53 69 7a 65 3b 0a 20 20 20 20  ZE-divSize;.    
ab60: 20 20 20 20 69 66 28 20 66 63 6e 74 6c 28 68 2c      if( fcntl(h,
ab70: 20 46 5f 53 45 54 4c 4b 2c 20 26 6c 6f 63 6b 29   F_SETLK, &lock)
ab80: 3d 3d 28 2d 31 29 20 29 7b 0a 20 20 20 20 20 20  ==(-1) ){.      
ab90: 20 20 20 20 74 45 72 72 6e 6f 20 3d 20 65 72 72      tErrno = err
aba0: 6e 6f 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63  no;.          rc
abb0: 20 3d 20 73 71 6c 69 74 65 45 72 72 6f 72 46 72   = sqliteErrorFr
abc0: 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28 74 45 72  omPosixError(tEr
abd0: 72 6e 6f 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52  rno, SQLITE_IOER
abe0: 52 5f 55 4e 4c 4f 43 4b 29 3b 0a 20 20 20 20 20  R_UNLOCK);.     
abf0: 20 20 20 20 20 69 66 28 20 49 53 5f 4c 4f 43 4b       if( IS_LOCK
ac00: 5f 45 52 52 4f 52 28 72 63 29 20 29 7b 0a 20 20  _ERROR(rc) ){.  
ac10: 20 20 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d            pFile-
ac20: 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 74 45 72  >lastErrno = tEr
ac30: 72 6e 6f 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  rno;.          }
ac40: 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20  .          goto 
ac50: 65 6e 64 5f 75 6e 6c 6f 63 6b 3b 0a 20 20 20 20  end_unlock;.    
ac60: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73      }.      }els
ac70: 65 7b 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e  e{.        lock.
ac80: 6c 5f 74 79 70 65 20 3d 20 46 5f 52 44 4c 43 4b  l_type = F_RDLCK
ac90: 3b 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e 6c  ;.        lock.l
aca0: 5f 77 68 65 6e 63 65 20 3d 20 53 45 45 4b 5f 53  _whence = SEEK_S
acb0: 45 54 3b 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b  ET;.        lock
acc0: 2e 6c 5f 73 74 61 72 74 20 3d 20 53 48 41 52 45  .l_start = SHARE
acd0: 44 5f 46 49 52 53 54 3b 0a 20 20 20 20 20 20 20  D_FIRST;.       
ace0: 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 53 48   lock.l_len = SH
acf0: 41 52 45 44 5f 53 49 5a 45 3b 0a 20 20 20 20 20  ARED_SIZE;.     
ad00: 20 20 20 69 66 28 20 66 63 6e 74 6c 28 68 2c 20     if( fcntl(h, 
ad10: 46 5f 53 45 54 4c 4b 2c 20 26 6c 6f 63 6b 29 3d  F_SETLK, &lock)=
ad20: 3d 28 2d 31 29 20 29 7b 0a 20 20 20 20 20 20 20  =(-1) ){.       
ad30: 20 20 20 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e     tErrno = errn
ad40: 6f 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  o;.          rc 
ad50: 3d 20 73 71 6c 69 74 65 45 72 72 6f 72 46 72 6f  = sqliteErrorFro
ad60: 6d 50 6f 73 69 78 45 72 72 6f 72 28 74 45 72 72  mPosixError(tErr
ad70: 6e 6f 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  no, SQLITE_IOERR
ad80: 5f 52 44 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20  _RDLOCK);.      
ad90: 20 20 20 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f      if( IS_LOCK_
ada0: 45 52 52 4f 52 28 72 63 29 20 29 7b 0a 20 20 20  ERROR(rc) ){.   
adb0: 20 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e           pFile->
adc0: 6c 61 73 74 45 72 72 6e 6f 20 3d 20 74 45 72 72  lastErrno = tErr
add0: 6e 6f 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  no;.          }.
ade0: 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65            goto e
adf0: 6e 64 5f 75 6e 6c 6f 63 6b 3b 0a 20 20 20 20 20  nd_unlock;.     
ae00: 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
ae10: 20 7d 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74 79   }.    lock.l_ty
ae20: 70 65 20 3d 20 46 5f 55 4e 4c 43 4b 3b 0a 20 20  pe = F_UNLCK;.  
ae30: 20 20 6c 6f 63 6b 2e 6c 5f 77 68 65 6e 63 65 20    lock.l_whence 
ae40: 3d 20 53 45 45 4b 5f 53 45 54 3b 0a 20 20 20 20  = SEEK_SET;.    
ae50: 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 50  lock.l_start = P
ae60: 45 4e 44 49 4e 47 5f 42 59 54 45 3b 0a 20 20 20  ENDING_BYTE;.   
ae70: 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 32 4c   lock.l_len = 2L
ae80: 3b 20 20 61 73 73 65 72 74 28 20 50 45 4e 44 49  ;  assert( PENDI
ae90: 4e 47 5f 42 59 54 45 2b 31 3d 3d 52 45 53 45 52  NG_BYTE+1==RESER
aea0: 56 45 44 5f 42 59 54 45 20 29 3b 0a 20 20 20 20  VED_BYTE );.    
aeb0: 69 66 28 20 66 63 6e 74 6c 28 68 2c 20 46 5f 53  if( fcntl(h, F_S
aec0: 45 54 4c 4b 2c 20 26 6c 6f 63 6b 29 21 3d 28 2d  ETLK, &lock)!=(-
aed0: 31 29 20 29 7b 0a 20 20 20 20 20 20 70 49 6e 6f  1) ){.      pIno
aee0: 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20  de->eFileLock = 
aef0: 53 48 41 52 45 44 5f 4c 4f 43 4b 3b 0a 20 20 20  SHARED_LOCK;.   
af00: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 74 45   }else{.      tE
af10: 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20  rrno = errno;.  
af20: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 45      rc = sqliteE
af30: 72 72 6f 72 46 72 6f 6d 50 6f 73 69 78 45 72 72  rrorFromPosixErr
af40: 6f 72 28 74 45 72 72 6e 6f 2c 20 53 51 4c 49 54  or(tErrno, SQLIT
af50: 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 29 3b  E_IOERR_UNLOCK);
af60: 0a 20 20 20 20 20 20 69 66 28 20 49 53 5f 4c 4f  .      if( IS_LO
af70: 43 4b 5f 45 52 52 4f 52 28 72 63 29 20 29 7b 0a  CK_ERROR(rc) ){.
af80: 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c          pFile->l
af90: 61 73 74 45 72 72 6e 6f 20 3d 20 74 45 72 72 6e  astErrno = tErrn
afa0: 6f 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  o;.      }.     
afb0: 20 67 6f 74 6f 20 65 6e 64 5f 75 6e 6c 6f 63 6b   goto end_unlock
afc0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66  ;.    }.  }.  if
afd0: 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 4e 4f 5f  ( eFileLock==NO_
afe0: 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 2f 2a 20 44  LOCK ){.    /* D
aff0: 65 63 72 65 6d 65 6e 74 20 74 68 65 20 73 68 61  ecrement the sha
b000: 72 65 64 20 6c 6f 63 6b 20 63 6f 75 6e 74 65 72  red lock counter
b010: 2e 20 20 52 65 6c 65 61 73 65 20 74 68 65 20 6c  .  Release the l
b020: 6f 63 6b 20 75 73 69 6e 67 20 61 6e 0a 20 20 20  ock using an.   
b030: 20 2a 2a 20 4f 53 20 63 61 6c 6c 20 6f 6e 6c 79   ** OS call only
b040: 20 77 68 65 6e 20 61 6c 6c 20 74 68 72 65 61 64   when all thread
b050: 73 20 69 6e 20 74 68 69 73 20 73 61 6d 65 20 70  s in this same p
b060: 72 6f 63 65 73 73 20 68 61 76 65 20 72 65 6c 65  rocess have rele
b070: 61 73 65 64 0a 20 20 20 20 2a 2a 20 74 68 65 20  ased.    ** the 
b080: 6c 6f 63 6b 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  lock..    */.   
b090: 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64   pInode->nShared
b0a0: 2d 2d 3b 0a 20 20 20 20 69 66 28 20 70 49 6e 6f  --;.    if( pIno
b0b0: 64 65 2d 3e 6e 53 68 61 72 65 64 3d 3d 30 20 29  de->nShared==0 )
b0c0: 7b 0a 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74  {.      lock.l_t
b0d0: 79 70 65 20 3d 20 46 5f 55 4e 4c 43 4b 3b 0a 20  ype = F_UNLCK;. 
b0e0: 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 77 68 65 6e       lock.l_when
b0f0: 63 65 20 3d 20 53 45 45 4b 5f 53 45 54 3b 0a 20  ce = SEEK_SET;. 
b100: 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72       lock.l_star
b110: 74 20 3d 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d  t = lock.l_len =
b120: 20 30 4c 3b 0a 20 20 20 20 20 20 53 69 6d 75 6c   0L;.      Simul
b130: 61 74 65 49 4f 45 72 72 6f 72 42 65 6e 69 67 6e  ateIOErrorBenign
b140: 28 31 29 3b 0a 20 20 20 20 20 20 53 69 6d 75 6c  (1);.      Simul
b150: 61 74 65 49 4f 45 72 72 6f 72 28 20 68 3d 28 2d  ateIOError( h=(-
b160: 31 29 20 29 0a 20 20 20 20 20 20 53 69 6d 75 6c  1) ).      Simul
b170: 61 74 65 49 4f 45 72 72 6f 72 42 65 6e 69 67 6e  ateIOErrorBenign
b180: 28 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 66  (0);.      if( f
b190: 63 6e 74 6c 28 68 2c 20 46 5f 53 45 54 4c 4b 2c  cntl(h, F_SETLK,
b1a0: 20 26 6c 6f 63 6b 29 21 3d 28 2d 31 29 20 29 7b   &lock)!=(-1) ){
b1b0: 0a 20 20 20 20 20 20 20 20 70 49 6e 6f 64 65 2d  .        pInode-
b1c0: 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 4e 4f 5f  >eFileLock = NO_
b1d0: 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 7d 65 6c 73  LOCK;.      }els
b1e0: 65 7b 0a 20 20 20 20 20 20 20 20 74 45 72 72 6e  e{.        tErrn
b1f0: 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20  o = errno;.     
b200: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 45 72     rc = sqliteEr
b210: 72 6f 72 46 72 6f 6d 50 6f 73 69 78 45 72 72 6f  rorFromPosixErro
b220: 72 28 74 45 72 72 6e 6f 2c 20 53 51 4c 49 54 45  r(tErrno, SQLITE
b230: 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 29 3b 0a  _IOERR_UNLOCK);.
b240: 20 20 20 20 20 20 20 20 69 66 28 20 49 53 5f 4c          if( IS_L
b250: 4f 43 4b 5f 45 52 52 4f 52 28 72 63 29 20 29 7b  OCK_ERROR(rc) ){
b260: 0a 20 20 20 20 20 20 20 20 20 20 70 46 69 6c 65  .          pFile
b270: 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 74 45  ->lastErrno = tE
b280: 72 72 6e 6f 3b 0a 20 20 20 20 20 20 20 20 7d 0a  rrno;.        }.
b290: 20 20 20 20 20 20 20 20 70 49 6e 6f 64 65 2d 3e          pInode->
b2a0: 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 4e 4f 5f 4c  eFileLock = NO_L
b2b0: 4f 43 4b 3b 0a 20 20 20 20 20 20 20 20 70 46 69  OCK;.        pFi
b2c0: 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20  le->eFileLock = 
b2d0: 4e 4f 5f 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 7d  NO_LOCK;.      }
b2e0: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 44  .    }..    /* D
b2f0: 65 63 72 65 6d 65 6e 74 20 74 68 65 20 63 6f 75  ecrement the cou
b300: 6e 74 20 6f 66 20 6c 6f 63 6b 73 20 61 67 61 69  nt of locks agai
b310: 6e 73 74 20 74 68 69 73 20 73 61 6d 65 20 66 69  nst this same fi
b320: 6c 65 2e 20 20 57 68 65 6e 20 74 68 65 0a 20 20  le.  When the.  
b330: 20 20 2a 2a 20 63 6f 75 6e 74 20 72 65 61 63 68    ** count reach
b340: 65 73 20 7a 65 72 6f 2c 20 63 6c 6f 73 65 20 61  es zero, close a
b350: 6e 79 20 6f 74 68 65 72 20 66 69 6c 65 20 64 65  ny other file de
b360: 73 63 72 69 70 74 6f 72 73 20 77 68 6f 73 65 20  scriptors whose 
b370: 63 6c 6f 73 65 0a 20 20 20 20 2a 2a 20 77 61 73  close.    ** was
b380: 20 64 65 66 65 72 72 65 64 20 62 65 63 61 75 73   deferred becaus
b390: 65 20 6f 66 20 6f 75 74 73 74 61 6e 64 69 6e 67  e of outstanding
b3a0: 20 6c 6f 63 6b 73 2e 0a 20 20 20 20 2a 2f 0a 20   locks..    */. 
b3b0: 20 20 20 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b     pInode->nLock
b3c0: 2d 2d 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  --;.    assert( 
b3d0: 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 3e 3d 30  pInode->nLock>=0
b3e0: 20 29 3b 0a 20 20 20 20 69 66 28 20 70 49 6e 6f   );.    if( pIno
b3f0: 64 65 2d 3e 6e 4c 6f 63 6b 3d 3d 30 20 29 7b 0a  de->nLock==0 ){.
b400: 20 20 20 20 20 20 69 6e 74 20 72 63 32 20 3d 20        int rc2 = 
b410: 63 6c 6f 73 65 50 65 6e 64 69 6e 67 46 64 73 28  closePendingFds(
b420: 70 46 69 6c 65 29 3b 0a 20 20 20 20 20 20 69 66  pFile);.      if
b430: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
b440: 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
b450: 72 63 32 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  rc2;.      }.   
b460: 20 7d 0a 20 20 7d 0a 09 0a 65 6e 64 5f 75 6e 6c   }.  }...end_unl
b470: 6f 63 6b 3a 0a 20 20 75 6e 69 78 4c 65 61 76 65  ock:.  unixLeave
b480: 4d 75 74 65 78 28 29 3b 0a 20 20 69 66 28 20 72  Mutex();.  if( r
b490: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 70  c==SQLITE_OK ) p
b4a0: 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20  File->eFileLock 
b4b0: 3d 20 65 46 69 6c 65 4c 6f 63 6b 3b 0a 20 20 72  = eFileLock;.  r
b4c0: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
b4d0: 2a 2a 20 4c 6f 77 65 72 20 74 68 65 20 6c 6f 63  ** Lower the loc
b4e0: 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 6e 20 66 69  king level on fi
b4f0: 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 70 46  le descriptor pF
b500: 69 6c 65 20 74 6f 20 65 46 69 6c 65 4c 6f 63 6b  ile to eFileLock
b510: 2e 20 20 65 46 69 6c 65 4c 6f 63 6b 0a 2a 2a 20  .  eFileLock.** 
b520: 6d 75 73 74 20 62 65 20 65 69 74 68 65 72 20 4e  must be either N
b530: 4f 5f 4c 4f 43 4b 20 6f 72 20 53 48 41 52 45 44  O_LOCK or SHARED
b540: 5f 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  _LOCK..**.** If 
b550: 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65  the locking leve
b560: 6c 20 6f 66 20 74 68 65 20 66 69 6c 65 20 64 65  l of the file de
b570: 73 63 72 69 70 74 6f 72 20 69 73 20 61 6c 72 65  scriptor is alre
b580: 61 64 79 20 61 74 20 6f 72 20 62 65 6c 6f 77 0a  ady at or below.
b590: 2a 2a 20 74 68 65 20 72 65 71 75 65 73 74 65 64  ** the requested
b5a0: 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 2c 20   locking level, 
b5b0: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
b5c0: 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74  a no-op..*/.stat
b5d0: 69 63 20 69 6e 74 20 75 6e 69 78 55 6e 6c 6f 63  ic int unixUnloc
b5e0: 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  k(sqlite3_file *
b5f0: 69 64 2c 20 69 6e 74 20 65 46 69 6c 65 4c 6f 63  id, int eFileLoc
b600: 6b 29 7b 0a 20 20 72 65 74 75 72 6e 20 5f 70 6f  k){.  return _po
b610: 73 69 78 55 6e 6c 6f 63 6b 28 69 64 2c 20 65 46  sixUnlock(id, eF
b620: 69 6c 65 4c 6f 63 6b 2c 20 30 29 3b 0a 7d 0a 0a  ileLock, 0);.}..
b630: 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
b640: 69 6f 6e 20 70 65 72 66 6f 72 6d 73 20 74 68 65  ion performs the
b650: 20 70 61 72 74 73 20 6f 66 20 74 68 65 20 22 63   parts of the "c
b660: 6c 6f 73 65 20 66 69 6c 65 22 20 6f 70 65 72 61  lose file" opera
b670: 74 69 6f 6e 20 0a 2a 2a 20 63 6f 6d 6d 6f 6e 20  tion .** common 
b680: 74 6f 20 61 6c 6c 20 6c 6f 63 6b 69 6e 67 20 73  to all locking s
b690: 63 68 65 6d 65 73 2e 20 49 74 20 63 6c 6f 73 65  chemes. It close
b6a0: 73 20 74 68 65 20 64 69 72 65 63 74 6f 72 79 20  s the directory 
b6b0: 61 6e 64 20 66 69 6c 65 0a 2a 2a 20 68 61 6e 64  and file.** hand
b6c0: 6c 65 73 2c 20 69 66 20 74 68 65 79 20 61 72 65  les, if they are
b6d0: 20 76 61 6c 69 64 2c 20 61 6e 64 20 73 65 74 73   valid, and sets
b6e0: 20 61 6c 6c 20 66 69 65 6c 64 73 20 6f 66 20 74   all fields of t
b6f0: 68 65 20 75 6e 69 78 46 69 6c 65 0a 2a 2a 20 73  he unixFile.** s
b700: 74 72 75 63 74 75 72 65 20 74 6f 20 30 2e 0a 2a  tructure to 0..*
b710: 2a 0a 2a 2a 20 49 74 20 69 73 20 2a 6e 6f 74 2a  *.** It is *not*
b720: 20 6e 65 63 65 73 73 61 72 79 20 74 6f 20 68 6f   necessary to ho
b730: 6c 64 20 74 68 65 20 6d 75 74 65 78 20 77 68 65  ld the mutex whe
b740: 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  n this routine i
b750: 73 20 63 61 6c 6c 65 64 2c 0a 2a 2a 20 65 76 65  s called,.** eve
b760: 6e 20 6f 6e 20 56 78 57 6f 72 6b 73 2e 20 20 41  n on VxWorks.  A
b770: 20 6d 75 74 65 78 20 77 69 6c 6c 20 62 65 20 61   mutex will be a
b780: 63 71 75 69 72 65 64 20 6f 6e 20 56 78 57 6f 72  cquired on VxWor
b790: 6b 73 20 62 79 20 74 68 65 0a 2a 2a 20 76 78 77  ks by the.** vxw
b7a0: 6f 72 6b 73 52 65 6c 65 61 73 65 46 69 6c 65 49  orksReleaseFileI
b7b0: 64 28 29 20 72 6f 75 74 69 6e 65 2e 0a 2a 2f 0a  d() routine..*/.
b7c0: 73 74 61 74 69 63 20 69 6e 74 20 63 6c 6f 73 65  static int close
b7d0: 55 6e 69 78 46 69 6c 65 28 73 71 6c 69 74 65 33  UnixFile(sqlite3
b7e0: 5f 66 69 6c 65 20 2a 69 64 29 7b 0a 20 20 75 6e  _file *id){.  un
b7f0: 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20  ixFile *pFile = 
b800: 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20  (unixFile*)id;. 
b810: 20 69 66 28 20 70 46 69 6c 65 20 29 7b 0a 20 20   if( pFile ){.  
b820: 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 64 69 72    if( pFile->dir
b830: 66 64 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 69  fd>=0 ){.      i
b840: 6e 74 20 65 72 72 20 3d 20 63 6c 6f 73 65 28 70  nt err = close(p
b850: 46 69 6c 65 2d 3e 64 69 72 66 64 29 3b 0a 20 20  File->dirfd);.  
b860: 20 20 20 20 69 66 28 20 65 72 72 20 29 7b 0a 20      if( err ){. 
b870: 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61         pFile->la
b880: 73 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b  stErrno = errno;
b890: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
b8a0: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 44 49 52  SQLITE_IOERR_DIR
b8b0: 5f 43 4c 4f 53 45 3b 0a 20 20 20 20 20 20 7d 65  _CLOSE;.      }e
b8c0: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70 46 69  lse{.        pFi
b8d0: 6c 65 2d 3e 64 69 72 66 64 3d 2d 31 3b 0a 20 20  le->dirfd=-1;.  
b8e0: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
b8f0: 69 66 28 20 70 46 69 6c 65 2d 3e 68 3e 3d 30 20  if( pFile->h>=0 
b900: 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 65 72 72  ){.      int err
b910: 20 3d 20 63 6c 6f 73 65 28 70 46 69 6c 65 2d 3e   = close(pFile->
b920: 68 29 3b 0a 20 20 20 20 20 20 69 66 28 20 65 72  h);.      if( er
b930: 72 20 29 7b 0a 20 20 20 20 20 20 20 20 70 46 69  r ){.        pFi
b940: 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20  le->lastErrno = 
b950: 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20 20 20 72  errno;.        r
b960: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45  eturn SQLITE_IOE
b970: 52 52 5f 43 4c 4f 53 45 3b 0a 20 20 20 20 20 20  RR_CLOSE;.      
b980: 7d 0a 20 20 20 20 7d 0a 23 69 66 20 4f 53 5f 56  }.    }.#if OS_V
b990: 58 57 4f 52 4b 53 0a 20 20 20 20 69 66 28 20 70  XWORKS.    if( p
b9a0: 46 69 6c 65 2d 3e 70 49 64 20 29 7b 0a 20 20 20  File->pId ){.   
b9b0: 20 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 69 73     if( pFile->is
b9c0: 44 65 6c 65 74 65 20 29 7b 0a 20 20 20 20 20 20  Delete ){.      
b9d0: 20 20 75 6e 6c 69 6e 6b 28 70 46 69 6c 65 2d 3e    unlink(pFile->
b9e0: 70 49 64 2d 3e 7a 43 61 6e 6f 6e 69 63 61 6c 4e  pId->zCanonicalN
b9f0: 61 6d 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ame);.      }.  
ba00: 20 20 20 20 76 78 77 6f 72 6b 73 52 65 6c 65 61      vxworksRelea
ba10: 73 65 46 69 6c 65 49 64 28 70 46 69 6c 65 2d 3e  seFileId(pFile->
ba20: 70 49 64 29 3b 0a 20 20 20 20 20 20 70 46 69 6c  pId);.      pFil
ba30: 65 2d 3e 70 49 64 20 3d 20 30 3b 0a 20 20 20 20  e->pId = 0;.    
ba40: 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 4f 53 54  }.#endif.    OST
ba50: 52 41 43 45 28 28 22 43 4c 4f 53 45 20 20 20 25  RACE(("CLOSE   %
ba60: 2d 33 64 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68  -3d\n", pFile->h
ba70: 29 29 3b 0a 20 20 20 20 4f 70 65 6e 43 6f 75 6e  ));.    OpenCoun
ba80: 74 65 72 28 2d 31 29 3b 0a 20 20 20 20 73 71 6c  ter(-1);.    sql
ba90: 69 74 65 33 5f 66 72 65 65 28 70 46 69 6c 65 2d  ite3_free(pFile-
baa0: 3e 70 55 6e 75 73 65 64 29 3b 0a 20 20 20 20 6d  >pUnused);.    m
bab0: 65 6d 73 65 74 28 70 46 69 6c 65 2c 20 30 2c 20  emset(pFile, 0, 
bac0: 73 69 7a 65 6f 66 28 75 6e 69 78 46 69 6c 65 29  sizeof(unixFile)
bad0: 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
bae0: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
baf0: 0a 2a 2a 20 43 6c 6f 73 65 20 61 20 66 69 6c 65  .** Close a file
bb00: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
bb10: 75 6e 69 78 43 6c 6f 73 65 28 73 71 6c 69 74 65  unixClose(sqlite
bb20: 33 5f 66 69 6c 65 20 2a 69 64 29 7b 0a 20 20 69  3_file *id){.  i
bb30: 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
bb40: 4b 3b 0a 20 20 69 66 28 20 69 64 20 29 7b 0a 20  K;.  if( id ){. 
bb50: 20 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69     unixFile *pFi
bb60: 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 20 2a  le = (unixFile *
bb70: 29 69 64 3b 0a 20 20 20 20 75 6e 69 78 55 6e 6c  )id;.    unixUnl
bb80: 6f 63 6b 28 69 64 2c 20 4e 4f 5f 4c 4f 43 4b 29  ock(id, NO_LOCK)
bb90: 3b 0a 20 20 20 20 75 6e 69 78 45 6e 74 65 72 4d  ;.    unixEnterM
bba0: 75 74 65 78 28 29 3b 0a 20 20 20 20 69 66 28 20  utex();.    if( 
bbb0: 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 20 26 26  pFile->pInode &&
bbc0: 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e   pFile->pInode->
bbd0: 6e 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 20 20 2f  nLock ){.      /
bbe0: 2a 20 49 66 20 74 68 65 72 65 20 61 72 65 20 6f  * If there are o
bbf0: 75 74 73 74 61 6e 64 69 6e 67 20 6c 6f 63 6b 73  utstanding locks
bc00: 2c 20 64 6f 20 6e 6f 74 20 61 63 74 75 61 6c 6c  , do not actuall
bc10: 79 20 63 6c 6f 73 65 20 74 68 65 20 66 69 6c 65  y close the file
bc20: 20 6a 75 73 74 0a 20 20 20 20 20 20 2a 2a 20 79   just.      ** y
bc30: 65 74 20 62 65 63 61 75 73 65 20 74 68 61 74 20  et because that 
bc40: 77 6f 75 6c 64 20 63 6c 65 61 72 20 74 68 6f 73  would clear thos
bc50: 65 20 6c 6f 63 6b 73 2e 20 20 49 6e 73 74 65 61  e locks.  Instea
bc60: 64 2c 20 61 64 64 20 74 68 65 20 66 69 6c 65 0a  d, add the file.
bc70: 20 20 20 20 20 20 2a 2a 20 64 65 73 63 72 69 70        ** descrip
bc80: 74 6f 72 20 74 6f 20 70 49 6e 6f 64 65 2d 3e 70  tor to pInode->p
bc90: 55 6e 75 73 65 64 20 6c 69 73 74 2e 20 20 49 74  Unused list.  It
bca0: 20 77 69 6c 6c 20 62 65 20 61 75 74 6f 6d 61 74   will be automat
bcb0: 69 63 61 6c 6c 79 20 63 6c 6f 73 65 64 20 0a 20  ically closed . 
bcc0: 20 20 20 20 20 2a 2a 20 77 68 65 6e 20 74 68 65       ** when the
bcd0: 20 6c 61 73 74 20 6c 6f 63 6b 20 69 73 20 63 6c   last lock is cl
bce0: 65 61 72 65 64 2e 0a 20 20 20 20 20 20 2a 2f 0a  eared..      */.
bcf0: 20 20 20 20 20 20 73 65 74 50 65 6e 64 69 6e 67        setPending
bd00: 46 64 28 70 46 69 6c 65 29 3b 0a 20 20 20 20 7d  Fd(pFile);.    }
bd10: 0a 20 20 20 20 72 65 6c 65 61 73 65 49 6e 6f 64  .    releaseInod
bd20: 65 49 6e 66 6f 28 70 46 69 6c 65 2d 3e 70 49 6e  eInfo(pFile->pIn
bd30: 6f 64 65 29 3b 0a 20 20 20 20 72 63 20 3d 20 63  ode);.    rc = c
bd40: 6c 6f 73 65 55 6e 69 78 46 69 6c 65 28 69 64 29  loseUnixFile(id)
bd50: 3b 0a 20 20 20 20 75 6e 69 78 4c 65 61 76 65 4d  ;.    unixLeaveM
bd60: 75 74 65 78 28 29 3b 0a 20 20 7d 0a 20 20 72 65  utex();.  }.  re
bd70: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 2a 2a  turn rc;.}../***
bd80: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64 20  *********** End 
bd90: 6f 66 20 74 68 65 20 70 6f 73 69 78 20 61 64 76  of the posix adv
bda0: 69 73 6f 72 79 20 6c 6f 63 6b 20 69 6d 70 6c 65  isory lock imple
bdb0: 6d 65 6e 74 61 74 69 6f 6e 20 2a 2a 2a 2a 2a 2a  mentation ******
bdc0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a  ***********.****
bdd0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
bde0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
bdf0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
be00: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
be10: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 2a  **********/../**
be20: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
be30: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
be40: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
be50: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
be60: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a  ************.***
be70: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
be80: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 4e 6f 2d 6f  *********** No-o
be90: 70 20 4c 6f 63 6b 69 6e 67 20 2a 2a 2a 2a 2a 2a  p Locking ******
bea0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
beb0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a  ************.**.
bec0: 2a 2a 20 4f 66 20 74 68 65 20 76 61 72 69 6f 75  ** Of the variou
bed0: 73 20 6c 6f 63 6b 69 6e 67 20 69 6d 70 6c 65 6d  s locking implem
bee0: 65 6e 74 61 74 69 6f 6e 73 20 61 76 61 69 6c 61  entations availa
bef0: 62 6c 65 2c 20 74 68 69 73 20 69 73 20 62 79 20  ble, this is by 
bf00: 66 61 72 20 74 68 65 0a 2a 2a 20 73 69 6d 70 6c  far the.** simpl
bf10: 65 73 74 3a 20 20 6c 6f 63 6b 69 6e 67 20 69 73  est:  locking is
bf20: 20 69 67 6e 6f 72 65 64 2e 20 20 4e 6f 20 61 74   ignored.  No at
bf30: 74 65 6d 70 74 20 69 73 20 6d 61 64 65 20 74 6f  tempt is made to
bf40: 20 6c 6f 63 6b 20 74 68 65 20 64 61 74 61 62 61   lock the databa
bf50: 73 65 0a 2a 2a 20 66 69 6c 65 20 66 6f 72 20 72  se.** file for r
bf60: 65 61 64 69 6e 67 20 6f 72 20 77 72 69 74 69 6e  eading or writin
bf70: 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 6c 6f  g..**.** This lo
bf80: 63 6b 69 6e 67 20 6d 6f 64 65 20 69 73 20 61 70  cking mode is ap
bf90: 70 72 6f 70 72 69 61 74 65 20 66 6f 72 20 75 73  propriate for us
bfa0: 65 20 6f 6e 20 72 65 61 64 2d 6f 6e 6c 79 20 64  e on read-only d
bfb0: 61 74 61 62 61 73 65 73 0a 2a 2a 20 28 65 78 3a  atabases.** (ex:
bfc0: 20 64 61 74 61 62 61 73 65 73 20 74 68 61 74 20   databases that 
bfd0: 61 72 65 20 62 75 72 6e 65 64 20 69 6e 74 6f 20  are burned into 
bfe0: 43 44 2d 52 4f 4d 2c 20 66 6f 72 20 65 78 61 6d  CD-ROM, for exam
bff0: 70 6c 65 2e 29 20 20 49 74 20 63 61 6e 0a 2a 2a  ple.)  It can.**
c000: 20 61 6c 73 6f 20 62 65 20 75 73 65 64 20 69 66   also be used if
c010: 20 74 68 65 20 61 70 70 6c 69 63 61 74 69 6f 6e   the application
c020: 20 65 6d 70 6c 6f 79 73 20 73 6f 6d 65 20 65 78   employs some ex
c030: 74 65 72 6e 61 6c 20 6d 65 63 68 61 6e 69 73 6d  ternal mechanism
c040: 20 74 6f 0a 2a 2a 20 70 72 65 76 65 6e 74 20 73   to.** prevent s
c050: 69 6d 75 6c 74 61 6e 65 6f 75 73 20 61 63 63 65  imultaneous acce
c060: 73 73 20 6f 66 20 74 68 65 20 73 61 6d 65 20 64  ss of the same d
c070: 61 74 61 62 61 73 65 20 62 79 20 74 77 6f 20 6f  atabase by two o
c080: 72 20 6d 6f 72 65 0a 2a 2a 20 64 61 74 61 62 61  r more.** databa
c090: 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 2e 20  se connections. 
c0a0: 20 42 75 74 20 74 68 65 72 65 20 69 73 20 61 20   But there is a 
c0b0: 73 65 72 69 6f 75 73 20 72 69 73 6b 20 6f 66 20  serious risk of 
c0c0: 64 61 74 61 62 61 73 65 0a 2a 2a 20 63 6f 72 72  database.** corr
c0d0: 75 70 74 69 6f 6e 20 69 66 20 74 68 69 73 20 6c  uption if this l
c0e0: 6f 63 6b 69 6e 67 20 6d 6f 64 65 20 69 73 20 75  ocking mode is u
c0f0: 73 65 64 20 69 6e 20 73 69 74 75 61 74 69 6f 6e  sed in situation
c100: 73 20 77 68 65 72 65 20 6d 75 6c 74 69 70 6c 65  s where multiple
c110: 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 63 6f 6e  .** database con
c120: 6e 65 63 74 69 6f 6e 73 20 61 72 65 20 61 63 63  nections are acc
c130: 65 73 73 69 6e 67 20 74 68 65 20 73 61 6d 65 20  essing the same 
c140: 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 61 74  database file at
c150: 20 74 68 65 20 73 61 6d 65 0a 2a 2a 20 74 69 6d   the same.** tim
c160: 65 20 61 6e 64 20 6f 6e 65 20 6f 72 20 6d 6f 72  e and one or mor
c170: 65 20 6f 66 20 74 68 6f 73 65 20 63 6f 6e 6e 65  e of those conne
c180: 63 74 69 6f 6e 73 20 61 72 65 20 77 72 69 74 69  ctions are writi
c190: 6e 67 2e 0a 2a 2f 0a 0a 73 74 61 74 69 63 20 69  ng..*/..static i
c1a0: 6e 74 20 6e 6f 6c 6f 63 6b 43 68 65 63 6b 52 65  nt nolockCheckRe
c1b0: 73 65 72 76 65 64 4c 6f 63 6b 28 73 71 6c 69 74  servedLock(sqlit
c1c0: 65 33 5f 66 69 6c 65 20 2a 4e 6f 74 55 73 65 64  e3_file *NotUsed
c1d0: 2c 20 69 6e 74 20 2a 70 52 65 73 4f 75 74 29 7b  , int *pResOut){
c1e0: 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
c1f0: 54 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20  TER(NotUsed);.  
c200: 2a 70 52 65 73 4f 75 74 20 3d 20 30 3b 0a 20 20  *pResOut = 0;.  
c210: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
c220: 3b 0a 7d 0a 73 74 61 74 69 63 20 69 6e 74 20 6e  ;.}.static int n
c230: 6f 6c 6f 63 6b 4c 6f 63 6b 28 73 71 6c 69 74 65  olockLock(sqlite
c240: 33 5f 66 69 6c 65 20 2a 4e 6f 74 55 73 65 64 2c  3_file *NotUsed,
c250: 20 69 6e 74 20 4e 6f 74 55 73 65 64 32 29 7b 0a   int NotUsed2){.
c260: 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
c270: 45 52 32 28 4e 6f 74 55 73 65 64 2c 20 4e 6f 74  ER2(NotUsed, Not
c280: 55 73 65 64 32 29 3b 0a 20 20 72 65 74 75 72 6e  Used2);.  return
c290: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 73 74   SQLITE_OK;.}.st
c2a0: 61 74 69 63 20 69 6e 74 20 6e 6f 6c 6f 63 6b 55  atic int nolockU
c2b0: 6e 6c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69  nlock(sqlite3_fi
c2c0: 6c 65 20 2a 4e 6f 74 55 73 65 64 2c 20 69 6e 74  le *NotUsed, int
c2d0: 20 4e 6f 74 55 73 65 64 32 29 7b 0a 20 20 55 4e   NotUsed2){.  UN
c2e0: 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 32 28  USED_PARAMETER2(
c2f0: 4e 6f 74 55 73 65 64 2c 20 4e 6f 74 55 73 65 64  NotUsed, NotUsed
c300: 32 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  2);.  return SQL
c310: 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
c320: 20 43 6c 6f 73 65 20 74 68 65 20 66 69 6c 65 2e   Close the file.
c330: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6e  .*/.static int n
c340: 6f 6c 6f 63 6b 43 6c 6f 73 65 28 73 71 6c 69 74  olockClose(sqlit
c350: 65 33 5f 66 69 6c 65 20 2a 69 64 29 20 7b 0a 20  e3_file *id) {. 
c360: 20 72 65 74 75 72 6e 20 63 6c 6f 73 65 55 6e 69   return closeUni
c370: 78 46 69 6c 65 28 69 64 29 3b 0a 7d 0a 0a 2f 2a  xFile(id);.}../*
c380: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
c390: 2a 2a 20 45 6e 64 20 6f 66 20 74 68 65 20 6e 6f  ** End of the no
c3a0: 2d 6f 70 20 6c 6f 63 6b 20 69 6d 70 6c 65 6d 65  -op lock impleme
c3b0: 6e 74 61 74 69 6f 6e 20 2a 2a 2a 2a 2a 2a 2a 2a  ntation ********
c3c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a  *************.**
c3d0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
c3e0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
c3f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
c400: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
c410: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f  ************/../
c420: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
c430: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
c440: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
c450: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
c460: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a  **************.*
c470: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
c480: 2a 2a 2a 2a 2a 2a 2a 2a 20 42 65 67 69 6e 20 64  ******** Begin d
c490: 6f 74 2d 66 69 6c 65 20 4c 6f 63 6b 69 6e 67 20  ot-file Locking 
c4a0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
c4b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a  **************.*
c4c0: 2a 0a 2a 2a 20 54 68 65 20 64 6f 74 66 69 6c 65  *.** The dotfile
c4d0: 20 6c 6f 63 6b 69 6e 67 20 69 6d 70 6c 65 6d 65   locking impleme
c4e0: 6e 74 61 74 69 6f 6e 20 75 73 65 73 20 74 68 65  ntation uses the
c4f0: 20 65 78 69 73 74 61 6e 63 65 20 6f 66 20 73 65   existance of se
c500: 70 61 72 61 74 65 20 6c 6f 63 6b 0a 2a 2a 20 66  parate lock.** f
c510: 69 6c 65 73 20 69 6e 20 6f 72 64 65 72 20 74 6f  iles in order to
c520: 20 63 6f 6e 74 72 6f 6c 20 61 63 63 65 73 73 20   control access 
c530: 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  to the database.
c540: 20 20 54 68 69 73 20 77 6f 72 6b 73 20 6f 6e 20    This works on 
c550: 6a 75 73 74 0a 2a 2a 20 61 62 6f 75 74 20 65 76  just.** about ev
c560: 65 72 79 20 66 69 6c 65 73 79 73 74 65 6d 20 69  ery filesystem i
c570: 6d 61 67 69 6e 61 62 6c 65 2e 20 20 42 75 74 20  maginable.  But 
c580: 74 68 65 72 65 20 61 72 65 20 73 65 72 69 6f 75  there are seriou
c590: 73 20 64 6f 77 6e 73 69 64 65 73 3a 0a 2a 2a 0a  s downsides:.**.
c5a0: 2a 2a 20 20 20 20 28 31 29 20 20 54 68 65 72 65  **    (1)  There
c5b0: 20 69 73 20 7a 65 72 6f 20 63 6f 6e 63 75 72 72   is zero concurr
c5c0: 65 6e 63 79 2e 20 20 41 20 73 69 6e 67 6c 65 20  ency.  A single 
c5d0: 72 65 61 64 65 72 20 62 6c 6f 63 6b 73 20 61 6c  reader blocks al
c5e0: 6c 20 6f 74 68 65 72 0a 2a 2a 20 20 20 20 20 20  l other.**      
c5f0: 20 20 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 66     connections f
c600: 72 6f 6d 20 72 65 61 64 69 6e 67 20 6f 72 20 77  rom reading or w
c610: 72 69 74 69 6e 67 20 74 68 65 20 64 61 74 61 62  riting the datab
c620: 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 28 32  ase..**.**    (2
c630: 29 20 20 41 6e 20 61 70 70 6c 69 63 61 74 69 6f  )  An applicatio
c640: 6e 20 63 72 61 73 68 20 6f 72 20 70 6f 77 65 72  n crash or power
c650: 20 6c 6f 73 73 20 63 61 6e 20 6c 65 61 76 65 20   loss can leave 
c660: 73 74 61 6c 65 20 6c 6f 63 6b 20 66 69 6c 65 73  stale lock files
c670: 0a 2a 2a 20 20 20 20 20 20 20 20 20 73 69 74 74  .**         sitt
c680: 69 6e 67 20 61 72 6f 75 6e 64 20 74 68 61 74 20  ing around that 
c690: 6e 65 65 64 20 74 6f 20 62 65 20 63 6c 65 61 72  need to be clear
c6a0: 65 64 20 6d 61 6e 75 61 6c 6c 79 2e 0a 2a 2a 0a  ed manually..**.
c6b0: 2a 2a 20 4e 65 76 65 72 74 68 65 6c 65 73 73 2c  ** Nevertheless,
c6c0: 20 61 20 64 6f 74 6c 6f 63 6b 20 69 73 20 61 6e   a dotlock is an
c6d0: 20 61 70 70 72 6f 70 72 69 61 74 65 20 6c 6f 63   appropriate loc
c6e0: 6b 69 6e 67 20 6d 6f 64 65 20 66 6f 72 20 75 73  king mode for us
c6f0: 65 20 69 66 20 6e 6f 0a 2a 2a 20 6f 74 68 65 72  e if no.** other
c700: 20 6c 6f 63 6b 69 6e 67 20 73 74 72 61 74 65 67   locking strateg
c710: 79 20 69 73 20 61 76 61 69 6c 61 62 6c 65 2e 0a  y is available..
c720: 2a 2a 0a 2a 2a 20 44 6f 74 66 69 6c 65 20 6c 6f  **.** Dotfile lo
c730: 63 6b 69 6e 67 20 77 6f 72 6b 73 20 62 79 20 63  cking works by c
c740: 72 65 61 74 69 6e 67 20 61 20 66 69 6c 65 20 69  reating a file i
c750: 6e 20 74 68 65 20 73 61 6d 65 20 64 69 72 65 63  n the same direc
c760: 74 6f 72 79 20 61 73 20 74 68 65 0a 2a 2a 20 64  tory as the.** d
c770: 61 74 61 62 61 73 65 20 61 6e 64 20 77 69 74 68  atabase and with
c780: 20 74 68 65 20 73 61 6d 65 20 6e 61 6d 65 20 62   the same name b
c790: 75 74 20 77 69 74 68 20 61 20 22 2e 6c 6f 63 6b  ut with a ".lock
c7a0: 22 20 65 78 74 65 6e 73 69 6f 6e 20 61 64 64 65  " extension adde
c7b0: 64 2e 0a 2a 2a 20 54 68 65 20 65 78 69 73 74 61  d..** The exista
c7c0: 6e 63 65 20 6f 66 20 61 20 6c 6f 63 6b 20 66 69  nce of a lock fi
c7d0: 6c 65 20 69 6d 70 6c 69 65 73 20 61 6e 20 45 58  le implies an EX
c7e0: 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 20 20 41  CLUSIVE lock.  A
c7f0: 6c 6c 20 6f 74 68 65 72 20 6c 6f 63 6b 0a 2a 2a  ll other lock.**
c800: 20 74 79 70 65 73 20 28 53 48 41 52 45 44 2c 20   types (SHARED, 
c810: 52 45 53 45 52 56 45 44 2c 20 50 45 4e 44 49 4e  RESERVED, PENDIN
c820: 47 29 20 61 72 65 20 6d 61 70 70 65 64 20 69 6e  G) are mapped in
c830: 74 6f 20 45 58 43 4c 55 53 49 56 45 2e 0a 2a 2f  to EXCLUSIVE..*/
c840: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 69 6c 65  ../*.** The file
c850: 20 73 75 66 66 69 78 20 61 64 64 65 64 20 74 6f   suffix added to
c860: 20 74 68 65 20 64 61 74 61 20 62 61 73 65 20 66   the data base f
c870: 69 6c 65 6e 61 6d 65 20 69 6e 20 6f 72 64 65 72  ilename in order
c880: 20 74 6f 20 63 72 65 61 74 65 20 74 68 65 0a 2a   to create the.*
c890: 2a 20 6c 6f 63 6b 20 66 69 6c 65 2e 0a 2a 2f 0a  * lock file..*/.
c8a0: 23 64 65 66 69 6e 65 20 44 4f 54 4c 4f 43 4b 5f  #define DOTLOCK_
c8b0: 53 55 46 46 49 58 20 22 2e 6c 6f 63 6b 22 0a 0a  SUFFIX ".lock"..
c8c0: 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
c8d0: 6e 65 20 63 68 65 63 6b 73 20 69 66 20 74 68 65  ne checks if the
c8e0: 72 65 20 69 73 20 61 20 52 45 53 45 52 56 45 44  re is a RESERVED
c8f0: 20 6c 6f 63 6b 20 68 65 6c 64 20 6f 6e 20 74 68   lock held on th
c900: 65 20 73 70 65 63 69 66 69 65 64 0a 2a 2a 20 66  e specified.** f
c910: 69 6c 65 20 62 79 20 74 68 69 73 20 6f 72 20 61  ile by this or a
c920: 6e 79 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73  ny other process
c930: 2e 20 49 66 20 73 75 63 68 20 61 20 6c 6f 63 6b  . If such a lock
c940: 20 69 73 20 68 65 6c 64 2c 20 73 65 74 20 2a 70   is held, set *p
c950: 52 65 73 4f 75 74 0a 2a 2a 20 74 6f 20 61 20 6e  ResOut.** to a n
c960: 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75 65 20 6f 74  on-zero value ot
c970: 68 65 72 77 69 73 65 20 2a 70 52 65 73 4f 75 74  herwise *pResOut
c980: 20 69 73 20 73 65 74 20 74 6f 20 7a 65 72 6f 2e   is set to zero.
c990: 20 20 54 68 65 20 72 65 74 75 72 6e 20 76 61 6c    The return val
c9a0: 75 65 0a 2a 2a 20 69 73 20 73 65 74 20 74 6f 20  ue.** is set to 
c9b0: 53 51 4c 49 54 45 5f 4f 4b 20 75 6e 6c 65 73 73  SQLITE_OK unless
c9c0: 20 61 6e 20 49 2f 4f 20 65 72 72 6f 72 20 6f 63   an I/O error oc
c9d0: 63 75 72 73 20 64 75 72 69 6e 67 20 6c 6f 63 6b  curs during lock
c9e0: 20 63 68 65 63 6b 69 6e 67 2e 0a 2a 2a 0a 2a 2a   checking..**.**
c9f0: 20 49 6e 20 64 6f 74 66 69 6c 65 20 6c 6f 63 6b   In dotfile lock
ca00: 69 6e 67 2c 20 65 69 74 68 65 72 20 61 20 6c 6f  ing, either a lo
ca10: 63 6b 20 65 78 69 73 74 73 20 6f 72 20 69 74 20  ck exists or it 
ca20: 64 6f 65 73 20 6e 6f 74 2e 20 20 53 6f 20 69 6e  does not.  So in
ca30: 20 74 68 69 73 0a 2a 2a 20 76 61 72 69 61 74 69   this.** variati
ca40: 6f 6e 20 6f 66 20 43 68 65 63 6b 52 65 73 65 72  on of CheckReser
ca50: 76 65 64 4c 6f 63 6b 28 29 2c 20 2a 70 52 65 73  vedLock(), *pRes
ca60: 4f 75 74 20 69 73 20 73 65 74 20 74 6f 20 74 72  Out is set to tr
ca70: 75 65 20 69 66 20 61 6e 79 20 6c 6f 63 6b 0a 2a  ue if any lock.*
ca80: 2a 20 69 73 20 68 65 6c 64 20 6f 6e 20 74 68 65  * is held on the
ca90: 20 66 69 6c 65 20 61 6e 64 20 66 61 6c 73 65 20   file and false 
caa0: 69 66 20 74 68 65 20 66 69 6c 65 20 69 73 20 75  if the file is u
cab0: 6e 6c 6f 63 6b 65 64 2e 0a 2a 2f 0a 73 74 61 74  nlocked..*/.stat
cac0: 69 63 20 69 6e 74 20 64 6f 74 6c 6f 63 6b 43 68  ic int dotlockCh
cad0: 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 28  eckReservedLock(
cae0: 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64  sqlite3_file *id
caf0: 2c 20 69 6e 74 20 2a 70 52 65 73 4f 75 74 29 20  , int *pResOut) 
cb00: 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
cb10: 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 72 65  ITE_OK;.  int re
cb20: 73 65 72 76 65 64 20 3d 20 30 3b 0a 20 20 75 6e  served = 0;.  un
cb30: 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20  ixFile *pFile = 
cb40: 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 0a  (unixFile*)id;..
cb50: 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f    SimulateIOErro
cb60: 72 28 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  r( return SQLITE
cb70: 5f 49 4f 45 52 52 5f 43 48 45 43 4b 52 45 53 45  _IOERR_CHECKRESE
cb80: 52 56 45 44 4c 4f 43 4b 3b 20 29 3b 0a 20 20 0a  RVEDLOCK; );.  .
cb90: 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 20    assert( pFile 
cba0: 29 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 69  );..  /* Check i
cbb0: 66 20 61 20 74 68 72 65 61 64 20 69 6e 20 74 68  f a thread in th
cbc0: 69 73 20 70 72 6f 63 65 73 73 20 68 6f 6c 64 73  is process holds
cbd0: 20 73 75 63 68 20 61 20 6c 6f 63 6b 20 2a 2f 0a   such a lock */.
cbe0: 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 65 46 69    if( pFile->eFi
cbf0: 6c 65 4c 6f 63 6b 3e 53 48 41 52 45 44 5f 4c 4f  leLock>SHARED_LO
cc00: 43 4b 20 29 7b 0a 20 20 20 20 2f 2a 20 45 69 74  CK ){.    /* Eit
cc10: 68 65 72 20 74 68 69 73 20 63 6f 6e 6e 65 63 74  her this connect
cc20: 69 6f 6e 20 6f 72 20 73 6f 6d 65 20 6f 74 68 65  ion or some othe
cc30: 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 6e 20  r connection in 
cc40: 74 68 65 20 73 61 6d 65 20 70 72 6f 63 65 73 73  the same process
cc50: 0a 20 20 20 20 2a 2a 20 68 6f 6c 64 73 20 61 20  .    ** holds a 
cc60: 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 66 69 6c 65  lock on the file
cc70: 2e 20 20 4e 6f 20 6e 65 65 64 20 74 6f 20 63 68  .  No need to ch
cc80: 65 63 6b 20 66 75 72 74 68 65 72 2e 20 2a 2f 0a  eck further. */.
cc90: 20 20 20 20 72 65 73 65 72 76 65 64 20 3d 20 31      reserved = 1
cca0: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f  ;.  }else{.    /
ccb0: 2a 20 54 68 65 20 6c 6f 63 6b 20 69 73 20 68 65  * The lock is he
ccc0: 6c 64 20 69 66 20 61 6e 64 20 6f 6e 6c 79 20 69  ld if and only i
ccd0: 66 20 74 68 65 20 6c 6f 63 6b 66 69 6c 65 20 65  f the lockfile e
cce0: 78 69 73 74 73 20 2a 2f 0a 20 20 20 20 63 6f 6e  xists */.    con
ccf0: 73 74 20 63 68 61 72 20 2a 7a 4c 6f 63 6b 46 69  st char *zLockFi
cd00: 6c 65 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72  le = (const char
cd10: 2a 29 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67  *)pFile->locking
cd20: 43 6f 6e 74 65 78 74 3b 0a 20 20 20 20 72 65 73  Context;.    res
cd30: 65 72 76 65 64 20 3d 20 61 63 63 65 73 73 28 7a  erved = access(z
cd40: 4c 6f 63 6b 46 69 6c 65 2c 20 30 29 3d 3d 30 3b  LockFile, 0)==0;
cd50: 0a 20 20 7d 0a 20 20 4f 53 54 52 41 43 45 28 28  .  }.  OSTRACE((
cd60: 22 54 45 53 54 20 57 52 2d 4c 4f 43 4b 20 25 64  "TEST WR-LOCK %d
cd70: 20 25 64 20 25 64 20 28 64 6f 74 6c 6f 63 6b 29   %d %d (dotlock)
cd80: 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 72  \n", pFile->h, r
cd90: 63 2c 20 72 65 73 65 72 76 65 64 29 29 3b 0a 20  c, reserved));. 
cda0: 20 2a 70 52 65 73 4f 75 74 20 3d 20 72 65 73 65   *pResOut = rese
cdb0: 72 76 65 64 3b 0a 20 20 72 65 74 75 72 6e 20 72  rved;.  return r
cdc0: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 6b  c;.}../*.** Lock
cdd0: 20 74 68 65 20 66 69 6c 65 20 77 69 74 68 20 74   the file with t
cde0: 68 65 20 6c 6f 63 6b 20 73 70 65 63 69 66 69 65  he lock specifie
cdf0: 64 20 62 79 20 70 61 72 61 6d 65 74 65 72 20 65  d by parameter e
ce00: 46 69 6c 65 4c 6f 63 6b 20 2d 20 6f 6e 65 0a 2a  FileLock - one.*
ce10: 2a 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  * of the followi
ce20: 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28 31  ng:.**.**     (1
ce30: 29 20 53 48 41 52 45 44 5f 4c 4f 43 4b 0a 2a 2a  ) SHARED_LOCK.**
ce40: 20 20 20 20 20 28 32 29 20 52 45 53 45 52 56 45       (2) RESERVE
ce50: 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 33  D_LOCK.**     (3
ce60: 29 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 0a 2a  ) PENDING_LOCK.*
ce70: 2a 20 20 20 20 20 28 34 29 20 45 58 43 4c 55 53  *     (4) EXCLUS
ce80: 49 56 45 5f 4c 4f 43 4b 0a 2a 2a 0a 2a 2a 20 53  IVE_LOCK.**.** S
ce90: 6f 6d 65 74 69 6d 65 73 20 77 68 65 6e 20 72 65  ometimes when re
cea0: 71 75 65 73 74 69 6e 67 20 6f 6e 65 20 6c 6f 63  questing one loc
ceb0: 6b 20 73 74 61 74 65 2c 20 61 64 64 69 74 69 6f  k state, additio
cec0: 6e 61 6c 20 6c 6f 63 6b 20 73 74 61 74 65 73 0a  nal lock states.
ced0: 2a 2a 20 61 72 65 20 69 6e 73 65 72 74 65 64 20  ** are inserted 
cee0: 69 6e 20 62 65 74 77 65 65 6e 2e 20 20 54 68 65  in between.  The
cef0: 20 6c 6f 63 6b 69 6e 67 20 6d 69 67 68 74 20 66   locking might f
cf00: 61 69 6c 20 6f 6e 20 6f 6e 65 20 6f 66 20 74 68  ail on one of th
cf10: 65 20 6c 61 74 65 72 0a 2a 2a 20 74 72 61 6e 73  e later.** trans
cf20: 69 74 69 6f 6e 73 20 6c 65 61 76 69 6e 67 20 74  itions leaving t
cf30: 68 65 20 6c 6f 63 6b 20 73 74 61 74 65 20 64 69  he lock state di
cf40: 66 66 65 72 65 6e 74 20 66 72 6f 6d 20 77 68 61  fferent from wha
cf50: 74 20 69 74 20 73 74 61 72 74 65 64 20 62 75 74  t it started but
cf60: 0a 2a 2a 20 73 74 69 6c 6c 20 73 68 6f 72 74 20  .** still short 
cf70: 6f 66 20 69 74 73 20 67 6f 61 6c 2e 20 20 54 68  of its goal.  Th
cf80: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 68 61 72  e following char
cf90: 74 20 73 68 6f 77 73 20 74 68 65 20 61 6c 6c 6f  t shows the allo
cfa0: 77 65 64 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f  wed.** transitio
cfb0: 6e 73 20 61 6e 64 20 74 68 65 20 69 6e 73 65 72  ns and the inser
cfc0: 74 65 64 20 69 6e 74 65 72 6d 65 64 69 61 74 65  ted intermediate
cfd0: 20 73 74 61 74 65 73 3a 0a 2a 2a 0a 2a 2a 20 20   states:.**.**  
cfe0: 20 20 55 4e 4c 4f 43 4b 45 44 20 2d 3e 20 53 48    UNLOCKED -> SH
cff0: 41 52 45 44 0a 2a 2a 20 20 20 20 53 48 41 52 45  ARED.**    SHARE
d000: 44 20 2d 3e 20 52 45 53 45 52 56 45 44 0a 2a 2a  D -> RESERVED.**
d010: 20 20 20 20 53 48 41 52 45 44 20 2d 3e 20 28 50      SHARED -> (P
d020: 45 4e 44 49 4e 47 29 20 2d 3e 20 45 58 43 4c 55  ENDING) -> EXCLU
d030: 53 49 56 45 0a 2a 2a 20 20 20 20 52 45 53 45 52  SIVE.**    RESER
d040: 56 45 44 20 2d 3e 20 28 50 45 4e 44 49 4e 47 29  VED -> (PENDING)
d050: 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a   -> EXCLUSIVE.**
d060: 20 20 20 20 50 45 4e 44 49 4e 47 20 2d 3e 20 45      PENDING -> E
d070: 58 43 4c 55 53 49 56 45 0a 2a 2a 0a 2a 2a 20 54  XCLUSIVE.**.** T
d080: 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c  his routine will
d090: 20 6f 6e 6c 79 20 69 6e 63 72 65 61 73 65 20 61   only increase a
d0a0: 20 6c 6f 63 6b 2e 20 20 55 73 65 20 74 68 65 20   lock.  Use the 
d0b0: 73 71 6c 69 74 65 33 4f 73 55 6e 6c 6f 63 6b 28  sqlite3OsUnlock(
d0c0: 29 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 74 6f 20  ).** routine to 
d0d0: 6c 6f 77 65 72 20 61 20 6c 6f 63 6b 69 6e 67 20  lower a locking 
d0e0: 6c 65 76 65 6c 2e 0a 2a 2a 0a 2a 2a 20 57 69 74  level..**.** Wit
d0f0: 68 20 64 6f 74 66 69 6c 65 20 6c 6f 63 6b 69 6e  h dotfile lockin
d100: 67 2c 20 77 65 20 72 65 61 6c 6c 79 20 6f 6e 6c  g, we really onl
d110: 79 20 73 75 70 70 6f 72 74 20 73 74 61 74 65 20  y support state 
d120: 28 34 29 3a 20 45 58 43 4c 55 53 49 56 45 2e 0a  (4): EXCLUSIVE..
d130: 2a 2a 20 42 75 74 20 77 65 20 74 72 61 63 6b 20  ** But we track 
d140: 74 68 65 20 6f 74 68 65 72 20 6c 6f 63 6b 69 6e  the other lockin
d150: 67 20 6c 65 76 65 6c 73 20 69 6e 74 65 72 6e 61  g levels interna
d160: 6c 6c 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  lly..*/.static i
d170: 6e 74 20 64 6f 74 6c 6f 63 6b 4c 6f 63 6b 28 73  nt dotlockLock(s
d180: 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c  qlite3_file *id,
d190: 20 69 6e 74 20 65 46 69 6c 65 4c 6f 63 6b 29 20   int eFileLock) 
d1a0: 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46  {.  unixFile *pF
d1b0: 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a  ile = (unixFile*
d1c0: 29 69 64 3b 0a 20 20 69 6e 74 20 66 64 3b 0a 20  )id;.  int fd;. 
d1d0: 20 63 68 61 72 20 2a 7a 4c 6f 63 6b 46 69 6c 65   char *zLockFile
d1e0: 20 3d 20 28 63 68 61 72 20 2a 29 70 46 69 6c 65   = (char *)pFile
d1f0: 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  ->lockingContext
d200: 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  ;.  int rc = SQL
d210: 49 54 45 5f 4f 4b 3b 0a 0a 0a 20 20 2f 2a 20 49  ITE_OK;...  /* I
d220: 66 20 77 65 20 68 61 76 65 20 61 6e 79 20 6c 6f  f we have any lo
d230: 63 6b 2c 20 74 68 65 6e 20 74 68 65 20 6c 6f 63  ck, then the loc
d240: 6b 20 66 69 6c 65 20 61 6c 72 65 61 64 79 20 65  k file already e
d250: 78 69 73 74 73 2e 20 20 41 6c 6c 20 77 65 20 68  xists.  All we h
d260: 61 76 65 0a 20 20 2a 2a 20 74 6f 20 64 6f 20 69  ave.  ** to do i
d270: 73 20 61 64 6a 75 73 74 20 6f 75 72 20 69 6e 74  s adjust our int
d280: 65 72 6e 61 6c 20 72 65 63 6f 72 64 20 6f 66 20  ernal record of 
d290: 74 68 65 20 6c 6f 63 6b 20 6c 65 76 65 6c 2e 0a  the lock level..
d2a0: 20 20 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c 65    */.  if( pFile
d2b0: 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3e 20 4e 4f  ->eFileLock > NO
d2c0: 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 70 46 69  _LOCK ){.    pFi
d2d0: 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20  le->eFileLock = 
d2e0: 65 46 69 6c 65 4c 6f 63 6b 3b 0a 23 69 66 20 21  eFileLock;.#if !
d2f0: 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20 20 20 2f  OS_VXWORKS.    /
d300: 2a 20 41 6c 77 61 79 73 20 75 70 64 61 74 65 20  * Always update 
d310: 74 68 65 20 74 69 6d 65 73 74 61 6d 70 20 6f 6e  the timestamp on
d320: 20 74 68 65 20 6f 6c 64 20 66 69 6c 65 20 2a 2f   the old file */
d330: 0a 20 20 20 20 75 74 69 6d 65 73 28 7a 4c 6f 63  .    utimes(zLoc
d340: 6b 46 69 6c 65 2c 20 4e 55 4c 4c 29 3b 0a 23 65  kFile, NULL);.#e
d350: 6e 64 69 66 0a 20 20 20 20 72 65 74 75 72 6e 20  ndif.    return 
d360: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20  SQLITE_OK;.  }. 
d370: 20 0a 20 20 2f 2a 20 67 72 61 62 20 61 6e 20 65   .  /* grab an e
d380: 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20 2a 2f  xclusive lock */
d390: 0a 20 20 66 64 20 3d 20 6f 70 65 6e 28 7a 4c 6f  .  fd = open(zLo
d3a0: 63 6b 46 69 6c 65 2c 4f 5f 52 44 4f 4e 4c 59 7c  ckFile,O_RDONLY|
d3b0: 4f 5f 43 52 45 41 54 7c 4f 5f 45 58 43 4c 2c 30  O_CREAT|O_EXCL,0
d3c0: 36 30 30 29 3b 0a 20 20 69 66 28 20 66 64 3c 30  600);.  if( fd<0
d3d0: 20 29 7b 0a 20 20 20 20 2f 2a 20 66 61 69 6c 65   ){.    /* faile
d3e0: 64 20 74 6f 20 6f 70 65 6e 2f 63 72 65 61 74 65  d to open/create
d3f0: 20 74 68 65 20 66 69 6c 65 2c 20 73 6f 6d 65 6f   the file, someo
d400: 6e 65 20 65 6c 73 65 20 6d 61 79 20 68 61 76 65  ne else may have
d410: 20 73 74 6f 6c 65 6e 20 74 68 65 20 6c 6f 63 6b   stolen the lock
d420: 20 2a 2f 0a 20 20 20 20 69 6e 74 20 74 45 72 72   */.    int tErr
d430: 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20  no = errno;.    
d440: 69 66 28 20 45 45 58 49 53 54 20 3d 3d 20 74 45  if( EEXIST == tE
d450: 72 72 6e 6f 20 29 7b 0a 20 20 20 20 20 20 72 63  rrno ){.      rc
d460: 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a   = SQLITE_BUSY;.
d470: 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20      } else {.   
d480: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 45 72     rc = sqliteEr
d490: 72 6f 72 46 72 6f 6d 50 6f 73 69 78 45 72 72 6f  rorFromPosixErro
d4a0: 72 28 74 45 72 72 6e 6f 2c 20 53 51 4c 49 54 45  r(tErrno, SQLITE
d4b0: 5f 49 4f 45 52 52 5f 4c 4f 43 4b 29 3b 0a 20 20  _IOERR_LOCK);.  
d4c0: 20 20 20 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f      if( IS_LOCK_
d4d0: 45 52 52 4f 52 28 72 63 29 20 29 7b 0a 20 20 20  ERROR(rc) ){.   
d4e0: 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74       pFile->last
d4f0: 45 72 72 6e 6f 20 3d 20 74 45 72 72 6e 6f 3b 0a  Errno = tErrno;.
d500: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
d510: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d    return rc;.  }
d520: 20 0a 20 20 69 66 28 20 63 6c 6f 73 65 28 66 64   .  if( close(fd
d530: 29 20 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e  ) ){.    pFile->
d540: 6c 61 73 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e  lastErrno = errn
d550: 6f 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  o;.    rc = SQLI
d560: 54 45 5f 49 4f 45 52 52 5f 43 4c 4f 53 45 3b 0a  TE_IOERR_CLOSE;.
d570: 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 67 6f 74 20    }.  .  /* got 
d580: 69 74 2c 20 73 65 74 20 74 68 65 20 74 79 70 65  it, set the type
d590: 20 61 6e 64 20 72 65 74 75 72 6e 20 6f 6b 20 2a   and return ok *
d5a0: 2f 0a 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65  /.  pFile->eFile
d5b0: 4c 6f 63 6b 20 3d 20 65 46 69 6c 65 4c 6f 63 6b  Lock = eFileLock
d5c0: 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
d5d0: 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 77 65 72 20 74 68  ../*.** Lower th
d5e0: 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20  e locking level 
d5f0: 6f 6e 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  on file descript
d600: 6f 72 20 70 46 69 6c 65 20 74 6f 20 65 46 69 6c  or pFile to eFil
d610: 65 4c 6f 63 6b 2e 20 20 65 46 69 6c 65 4c 6f 63  eLock.  eFileLoc
d620: 6b 0a 2a 2a 20 6d 75 73 74 20 62 65 20 65 69 74  k.** must be eit
d630: 68 65 72 20 4e 4f 5f 4c 4f 43 4b 20 6f 72 20 53  her NO_LOCK or S
d640: 48 41 52 45 44 5f 4c 4f 43 4b 2e 0a 2a 2a 0a 2a  HARED_LOCK..**.*
d650: 2a 20 49 66 20 74 68 65 20 6c 6f 63 6b 69 6e 67  * If the locking
d660: 20 6c 65 76 65 6c 20 6f 66 20 74 68 65 20 66 69   level of the fi
d670: 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 69 73  le descriptor is
d680: 20 61 6c 72 65 61 64 79 20 61 74 20 6f 72 20 62   already at or b
d690: 65 6c 6f 77 0a 2a 2a 20 74 68 65 20 72 65 71 75  elow.** the requ
d6a0: 65 73 74 65 64 20 6c 6f 63 6b 69 6e 67 20 6c 65  ested locking le
d6b0: 76 65 6c 2c 20 74 68 69 73 20 72 6f 75 74 69 6e  vel, this routin
d6c0: 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a  e is a no-op..**
d6d0: 0a 2a 2a 20 57 68 65 6e 20 74 68 65 20 6c 6f 63  .** When the loc
d6e0: 6b 69 6e 67 20 6c 65 76 65 6c 20 72 65 61 63 68  king level reach
d6f0: 65 73 20 4e 4f 5f 4c 4f 43 4b 2c 20 64 65 6c 65  es NO_LOCK, dele
d700: 74 65 20 74 68 65 20 6c 6f 63 6b 20 66 69 6c 65  te the lock file
d710: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
d720: 64 6f 74 6c 6f 63 6b 55 6e 6c 6f 63 6b 28 73 71  dotlockUnlock(sq
d730: 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20  lite3_file *id, 
d740: 69 6e 74 20 65 46 69 6c 65 4c 6f 63 6b 29 20 7b  int eFileLock) {
d750: 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69  .  unixFile *pFi
d760: 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29  le = (unixFile*)
d770: 69 64 3b 0a 20 20 63 68 61 72 20 2a 7a 4c 6f 63  id;.  char *zLoc
d780: 6b 46 69 6c 65 20 3d 20 28 63 68 61 72 20 2a 29  kFile = (char *)
d790: 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f  pFile->lockingCo
d7a0: 6e 74 65 78 74 3b 0a 0a 20 20 61 73 73 65 72 74  ntext;..  assert
d7b0: 28 20 70 46 69 6c 65 20 29 3b 0a 20 20 4f 53 54  ( pFile );.  OST
d7c0: 52 41 43 45 28 28 22 55 4e 4c 4f 43 4b 20 20 25  RACE(("UNLOCK  %
d7d0: 64 20 25 64 20 77 61 73 20 25 64 20 70 69 64 3d  d %d was %d pid=
d7e0: 25 64 20 28 64 6f 74 6c 6f 63 6b 29 5c 6e 22 2c  %d (dotlock)\n",
d7f0: 20 70 46 69 6c 65 2d 3e 68 2c 20 65 46 69 6c 65   pFile->h, eFile
d800: 4c 6f 63 6b 2c 0a 09 20 20 20 70 46 69 6c 65 2d  Lock,..   pFile-
d810: 3e 65 46 69 6c 65 4c 6f 63 6b 2c 20 67 65 74 70  >eFileLock, getp
d820: 69 64 28 29 29 29 3b 0a 20 20 61 73 73 65 72 74  id()));.  assert
d830: 28 20 65 46 69 6c 65 4c 6f 63 6b 3c 3d 53 48 41  ( eFileLock<=SHA
d840: 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 0a 20  RED_LOCK );.  . 
d850: 20 2f 2a 20 6e 6f 2d 6f 70 20 69 66 20 70 6f 73   /* no-op if pos
d860: 73 69 62 6c 65 20 2a 2f 0a 20 20 69 66 28 20 70  sible */.  if( p
d870: 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d  File->eFileLock=
d880: 3d 65 46 69 6c 65 4c 6f 63 6b 20 29 7b 0a 20 20  =eFileLock ){.  
d890: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
d8a0: 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 6f  OK;.  }..  /* To
d8b0: 20 64 6f 77 6e 67 72 61 64 65 20 74 6f 20 73 68   downgrade to sh
d8c0: 61 72 65 64 2c 20 73 69 6d 70 6c 79 20 75 70 64  ared, simply upd
d8d0: 61 74 65 20 6f 75 72 20 69 6e 74 65 72 6e 61 6c  ate our internal
d8e0: 20 6e 6f 74 69 6f 6e 20 6f 66 20 74 68 65 0a 20   notion of the. 
d8f0: 20 2a 2a 20 6c 6f 63 6b 20 73 74 61 74 65 2e 20   ** lock state. 
d900: 20 4e 6f 20 6e 65 65 64 20 74 6f 20 6d 65 73 73   No need to mess
d910: 20 77 69 74 68 20 74 68 65 20 66 69 6c 65 20 6f   with the file o
d920: 6e 20 64 69 73 6b 2e 0a 20 20 2a 2f 0a 20 20 69  n disk..  */.  i
d930: 66 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48  f( eFileLock==SH
d940: 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20  ARED_LOCK ){.   
d950: 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63   pFile->eFileLoc
d960: 6b 20 3d 20 53 48 41 52 45 44 5f 4c 4f 43 4b 3b  k = SHARED_LOCK;
d970: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
d980: 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 0a 20 20  TE_OK;.  }.  .  
d990: 2f 2a 20 54 6f 20 66 75 6c 6c 79 20 75 6e 6c 6f  /* To fully unlo
d9a0: 63 6b 20 74 68 65 20 64 61 74 61 62 61 73 65 2c  ck the database,
d9b0: 20 64 65 6c 65 74 65 20 74 68 65 20 6c 6f 63 6b   delete the lock
d9c0: 20 66 69 6c 65 20 2a 2f 0a 20 20 61 73 73 65 72   file */.  asser
d9d0: 74 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 4e 4f  t( eFileLock==NO
d9e0: 5f 4c 4f 43 4b 20 29 3b 0a 20 20 69 66 28 20 75  _LOCK );.  if( u
d9f0: 6e 6c 69 6e 6b 28 7a 4c 6f 63 6b 46 69 6c 65 29  nlink(zLockFile)
da00: 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 63 20 3d   ){.    int rc =
da10: 20 30 3b 0a 20 20 20 20 69 6e 74 20 74 45 72 72   0;.    int tErr
da20: 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20  no = errno;.    
da30: 69 66 28 20 45 4e 4f 45 4e 54 20 21 3d 20 74 45  if( ENOENT != tE
da40: 72 72 6e 6f 20 29 7b 0a 20 20 20 20 20 20 72 63  rrno ){.      rc
da50: 20 3d 20 73 71 6c 69 74 65 45 72 72 6f 72 46 72   = sqliteErrorFr
da60: 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28 74 45 72  omPosixError(tEr
da70: 72 6e 6f 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52  rno, SQLITE_IOER
da80: 52 5f 55 4e 4c 4f 43 4b 29 3b 0a 20 20 20 20 7d  R_UNLOCK);.    }
da90: 0a 20 20 20 20 69 66 28 20 49 53 5f 4c 4f 43 4b  .    if( IS_LOCK
daa0: 5f 45 52 52 4f 52 28 72 63 29 20 29 7b 0a 20 20  _ERROR(rc) ){.  
dab0: 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45      pFile->lastE
dac0: 72 72 6e 6f 20 3d 20 74 45 72 72 6e 6f 3b 0a 20  rrno = tErrno;. 
dad0: 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20     }.    return 
dae0: 72 63 3b 20 0a 20 20 7d 0a 20 20 70 46 69 6c 65  rc; .  }.  pFile
daf0: 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 4e 4f  ->eFileLock = NO
db00: 5f 4c 4f 43 4b 3b 0a 20 20 72 65 74 75 72 6e 20  _LOCK;.  return 
db10: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
db20: 0a 2a 2a 20 43 6c 6f 73 65 20 61 20 66 69 6c 65  .** Close a file
db30: 2e 20 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65  .  Make sure the
db40: 20 6c 6f 63 6b 20 68 61 73 20 62 65 65 6e 20 72   lock has been r
db50: 65 6c 65 61 73 65 64 20 62 65 66 6f 72 65 20 63  eleased before c
db60: 6c 6f 73 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69  losing..*/.stati
db70: 63 20 69 6e 74 20 64 6f 74 6c 6f 63 6b 43 6c 6f  c int dotlockClo
db80: 73 65 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  se(sqlite3_file 
db90: 2a 69 64 29 20 7b 0a 20 20 69 6e 74 20 72 63 3b  *id) {.  int rc;
dba0: 0a 20 20 69 66 28 20 69 64 20 29 7b 0a 20 20 20  .  if( id ){.   
dbb0: 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65   unixFile *pFile
dbc0: 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64   = (unixFile*)id
dbd0: 3b 0a 20 20 20 20 64 6f 74 6c 6f 63 6b 55 6e 6c  ;.    dotlockUnl
dbe0: 6f 63 6b 28 69 64 2c 20 4e 4f 5f 4c 4f 43 4b 29  ock(id, NO_LOCK)
dbf0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  ;.    sqlite3_fr
dc00: 65 65 28 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e  ee(pFile->lockin
dc10: 67 43 6f 6e 74 65 78 74 29 3b 0a 20 20 7d 0a 20  gContext);.  }. 
dc20: 20 72 63 20 3d 20 63 6c 6f 73 65 55 6e 69 78 46   rc = closeUnixF
dc30: 69 6c 65 28 69 64 29 3b 0a 20 20 72 65 74 75 72  ile(id);.  retur
dc40: 6e 20 72 63 3b 0a 7d 0a 2f 2a 2a 2a 2a 2a 2a 2a  n rc;.}./*******
dc50: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64 20  *********** End 
dc60: 6f 66 20 74 68 65 20 64 6f 74 2d 66 69 6c 65 20  of the dot-file 
dc70: 6c 6f 63 6b 20 69 6d 70 6c 65 6d 65 6e 74 61 74  lock implementat
dc80: 69 6f 6e 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ion ************
dc90: 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a  *******.********
dca0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
dcb0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
dcc0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
dcd0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
dce0: 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a  ******/../******
dcf0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
dd00: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
dd10: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
dd20: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
dd30: 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a  ********.*******
dd40: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
dd50: 2a 2a 2a 20 42 65 67 69 6e 20 66 6c 6f 63 6b 20  *** Begin flock 
dd60: 4c 6f 63 6b 69 6e 67 20 2a 2a 2a 2a 2a 2a 2a 2a  Locking ********
dd70: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
dd80: 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 55  ********.**.** U
dd90: 73 65 20 74 68 65 20 66 6c 6f 63 6b 28 29 20 73  se the flock() s
dda0: 79 73 74 65 6d 20 63 61 6c 6c 20 74 6f 20 64 6f  ystem call to do
ddb0: 20 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 2e 0a 2a   file locking..*
ddc0: 2a 0a 2a 2a 20 66 6c 6f 63 6b 28 29 20 6c 6f 63  *.** flock() loc
ddd0: 6b 69 6e 67 20 69 73 20 6c 69 6b 65 20 64 6f 74  king is like dot
dde0: 2d 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 20 69 6e  -file locking in
ddf0: 20 74 68 61 74 20 74 68 65 20 76 61 72 69 6f 75   that the variou
de00: 73 0a 2a 2a 20 66 69 6e 65 2d 67 72 61 69 6e 20  s.** fine-grain 
de10: 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 73 20 73  locking levels s
de20: 75 70 70 6f 72 74 65 64 20 62 79 20 53 51 4c 69  upported by SQLi
de30: 74 65 20 61 72 65 20 63 6f 6c 6c 61 70 73 65 64  te are collapsed
de40: 20 69 6e 74 6f 0a 2a 2a 20 61 20 73 69 6e 67 6c   into.** a singl
de50: 65 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b  e exclusive lock
de60: 2e 20 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64  .  In other word
de70: 73 2c 20 53 48 41 52 45 44 2c 20 52 45 53 45 52  s, SHARED, RESER
de80: 56 45 44 2c 20 61 6e 64 0a 2a 2a 20 50 45 4e 44  VED, and.** PEND
de90: 49 4e 47 20 6c 6f 63 6b 73 20 61 72 65 20 74 68  ING locks are th
dea0: 65 20 73 61 6d 65 20 74 68 69 6e 67 20 61 73 20  e same thing as 
deb0: 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63  an EXCLUSIVE loc
dec0: 6b 2e 20 20 53 51 4c 69 74 65 0a 2a 2a 20 73 74  k.  SQLite.** st
ded0: 69 6c 6c 20 77 6f 72 6b 73 20 77 68 65 6e 20 79  ill works when y
dee0: 6f 75 20 64 6f 20 74 68 69 73 2c 20 62 75 74 20  ou do this, but 
def0: 63 6f 6e 63 75 72 72 65 6e 63 79 20 69 73 20 72  concurrency is r
df00: 65 64 75 63 65 64 20 73 69 6e 63 65 0a 2a 2a 20  educed since.** 
df10: 6f 6e 6c 79 20 61 20 73 69 6e 67 6c 65 20 70 72  only a single pr
df20: 6f 63 65 73 73 20 63 61 6e 20 62 65 20 72 65 61  ocess can be rea
df30: 64 69 6e 67 20 74 68 65 20 64 61 74 61 62 61 73  ding the databas
df40: 65 20 61 74 20 61 20 74 69 6d 65 2e 0a 2a 2a 0a  e at a time..**.
df50: 2a 2a 20 4f 6d 69 74 20 74 68 69 73 20 73 65 63  ** Omit this sec
df60: 74 69 6f 6e 20 69 66 20 53 51 4c 49 54 45 5f 45  tion if SQLITE_E
df70: 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54  NABLE_LOCKING_ST
df80: 59 4c 45 20 69 73 20 74 75 72 6e 65 64 20 6f 66  YLE is turned of
df90: 66 20 6f 72 20 69 66 0a 2a 2a 20 63 6f 6d 70 69  f or if.** compi
dfa0: 6c 69 6e 67 20 66 6f 72 20 56 58 57 4f 52 4b 53  ling for VXWORKS
dfb0: 2e 0a 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f  ..*/.#if SQLITE_
dfc0: 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53  ENABLE_LOCKING_S
dfd0: 54 59 4c 45 20 26 26 20 21 4f 53 5f 56 58 57 4f  TYLE && !OS_VXWO
dfe0: 52 4b 53 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  RKS../*.** This 
dff0: 72 6f 75 74 69 6e 65 20 63 68 65 63 6b 73 20 69  routine checks i
e000: 66 20 74 68 65 72 65 20 69 73 20 61 20 52 45 53  f there is a RES
e010: 45 52 56 45 44 20 6c 6f 63 6b 20 68 65 6c 64 20  ERVED lock held 
e020: 6f 6e 20 74 68 65 20 73 70 65 63 69 66 69 65 64  on the specified
e030: 0a 2a 2a 20 66 69 6c 65 20 62 79 20 74 68 69 73  .** file by this
e040: 20 6f 72 20 61 6e 79 20 6f 74 68 65 72 20 70 72   or any other pr
e050: 6f 63 65 73 73 2e 20 49 66 20 73 75 63 68 20 61  ocess. If such a
e060: 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64 2c 20 73   lock is held, s
e070: 65 74 20 2a 70 52 65 73 4f 75 74 0a 2a 2a 20 74  et *pResOut.** t
e080: 6f 20 61 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c  o a non-zero val
e090: 75 65 20 6f 74 68 65 72 77 69 73 65 20 2a 70 52  ue otherwise *pR
e0a0: 65 73 4f 75 74 20 69 73 20 73 65 74 20 74 6f 20  esOut is set to 
e0b0: 7a 65 72 6f 2e 20 20 54 68 65 20 72 65 74 75 72  zero.  The retur
e0c0: 6e 20 76 61 6c 75 65 0a 2a 2a 20 69 73 20 73 65  n value.** is se
e0d0: 74 20 74 6f 20 53 51 4c 49 54 45 5f 4f 4b 20 75  t to SQLITE_OK u
e0e0: 6e 6c 65 73 73 20 61 6e 20 49 2f 4f 20 65 72 72  nless an I/O err
e0f0: 6f 72 20 6f 63 63 75 72 73 20 64 75 72 69 6e 67  or occurs during
e100: 20 6c 6f 63 6b 20 63 68 65 63 6b 69 6e 67 2e 0a   lock checking..
e110: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 6c  */.static int fl
e120: 6f 63 6b 43 68 65 63 6b 52 65 73 65 72 76 65 64  ockCheckReserved
e130: 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c  Lock(sqlite3_fil
e140: 65 20 2a 69 64 2c 20 69 6e 74 20 2a 70 52 65 73  e *id, int *pRes
e150: 4f 75 74 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  Out){.  int rc =
e160: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e   SQLITE_OK;.  in
e170: 74 20 72 65 73 65 72 76 65 64 20 3d 20 30 3b 0a  t reserved = 0;.
e180: 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c    unixFile *pFil
e190: 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69  e = (unixFile*)i
e1a0: 64 3b 0a 20 20 0a 20 20 53 69 6d 75 6c 61 74 65  d;.  .  Simulate
e1b0: 49 4f 45 72 72 6f 72 28 20 72 65 74 75 72 6e 20  IOError( return 
e1c0: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43 48 45  SQLITE_IOERR_CHE
e1d0: 43 4b 52 45 53 45 52 56 45 44 4c 4f 43 4b 3b 20  CKRESERVEDLOCK; 
e1e0: 29 3b 0a 20 20 0a 20 20 61 73 73 65 72 74 28 20  );.  .  assert( 
e1f0: 70 46 69 6c 65 20 29 3b 0a 20 20 0a 20 20 2f 2a  pFile );.  .  /*
e200: 20 43 68 65 63 6b 20 69 66 20 61 20 74 68 72 65   Check if a thre
e210: 61 64 20 69 6e 20 74 68 69 73 20 70 72 6f 63 65  ad in this proce
e220: 73 73 20 68 6f 6c 64 73 20 73 75 63 68 20 61 20  ss holds such a 
e230: 6c 6f 63 6b 20 2a 2f 0a 20 20 69 66 28 20 70 46  lock */.  if( pF
e240: 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3e 53  ile->eFileLock>S
e250: 48 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20  HARED_LOCK ){.  
e260: 20 20 72 65 73 65 72 76 65 64 20 3d 20 31 3b 0a    reserved = 1;.
e270: 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 4f 74 68 65    }.  .  /* Othe
e280: 72 77 69 73 65 20 73 65 65 20 69 66 20 73 6f 6d  rwise see if som
e290: 65 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20  e other process 
e2a0: 68 6f 6c 64 73 20 69 74 2e 20 2a 2f 0a 20 20 69  holds it. */.  i
e2b0: 66 28 20 21 72 65 73 65 72 76 65 64 20 29 7b 0a  f( !reserved ){.
e2c0: 20 20 20 20 2f 2a 20 61 74 74 65 6d 70 74 20 74      /* attempt t
e2d0: 6f 20 67 65 74 20 74 68 65 20 6c 6f 63 6b 20 2a  o get the lock *
e2e0: 2f 0a 20 20 20 20 69 6e 74 20 6c 72 63 20 3d 20  /.    int lrc = 
e2f0: 66 6c 6f 63 6b 28 70 46 69 6c 65 2d 3e 68 2c 20  flock(pFile->h, 
e300: 4c 4f 43 4b 5f 45 58 20 7c 20 4c 4f 43 4b 5f 4e  LOCK_EX | LOCK_N
e310: 42 29 3b 0a 20 20 20 20 69 66 28 20 21 6c 72 63  B);.    if( !lrc
e320: 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 67 6f 74   ){.      /* got
e330: 20 74 68 65 20 6c 6f 63 6b 2c 20 75 6e 6c 6f 63   the lock, unloc
e340: 6b 20 69 74 20 2a 2f 0a 20 20 20 20 20 20 6c 72  k it */.      lr
e350: 63 20 3d 20 66 6c 6f 63 6b 28 70 46 69 6c 65 2d  c = flock(pFile-
e360: 3e 68 2c 20 4c 4f 43 4b 5f 55 4e 29 3b 0a 20 20  >h, LOCK_UN);.  
e370: 20 20 20 20 69 66 20 28 20 6c 72 63 20 29 20 7b      if ( lrc ) {
e380: 0a 20 20 20 20 20 20 20 20 69 6e 74 20 74 45 72  .        int tEr
e390: 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20  rno = errno;.   
e3a0: 20 20 20 20 20 2f 2a 20 75 6e 6c 6f 63 6b 20 66       /* unlock f
e3b0: 61 69 6c 65 64 20 77 69 74 68 20 61 6e 20 65 72  ailed with an er
e3c0: 72 6f 72 20 2a 2f 0a 20 20 20 20 20 20 20 20 6c  ror */.        l
e3d0: 72 63 20 3d 20 73 71 6c 69 74 65 45 72 72 6f 72  rc = sqliteError
e3e0: 46 72 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28 74  FromPosixError(t
e3f0: 45 72 72 6e 6f 2c 20 53 51 4c 49 54 45 5f 49 4f  Errno, SQLITE_IO
e400: 45 52 52 5f 55 4e 4c 4f 43 4b 29 3b 20 0a 20 20  ERR_UNLOCK); .  
e410: 20 20 20 20 20 20 69 66 28 20 49 53 5f 4c 4f 43        if( IS_LOC
e420: 4b 5f 45 52 52 4f 52 28 6c 72 63 29 20 29 7b 0a  K_ERROR(lrc) ){.
e430: 20 20 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d            pFile-
e440: 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 74 45 72  >lastErrno = tEr
e450: 72 6e 6f 3b 0a 20 20 20 20 20 20 20 20 20 20 72  rno;.          r
e460: 63 20 3d 20 6c 72 63 3b 0a 20 20 20 20 20 20 20  c = lrc;.       
e470: 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
e480: 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 69 6e   else {.      in
e490: 74 20 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f  t tErrno = errno
e4a0: 3b 0a 20 20 20 20 20 20 72 65 73 65 72 76 65 64  ;.      reserved
e4b0: 20 3d 20 31 3b 0a 20 20 20 20 20 20 2f 2a 20 73   = 1;.      /* s
e4c0: 6f 6d 65 6f 6e 65 20 65 6c 73 65 20 6d 69 67 68  omeone else migh
e4d0: 74 20 68 61 76 65 20 69 74 20 72 65 73 65 72 76  t have it reserv
e4e0: 65 64 20 2a 2f 0a 20 20 20 20 20 20 6c 72 63 20  ed */.      lrc 
e4f0: 3d 20 73 71 6c 69 74 65 45 72 72 6f 72 46 72 6f  = sqliteErrorFro
e500: 6d 50 6f 73 69 78 45 72 72 6f 72 28 74 45 72 72  mPosixError(tErr
e510: 6e 6f 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  no, SQLITE_IOERR
e520: 5f 4c 4f 43 4b 29 3b 20 0a 20 20 20 20 20 20 69  _LOCK); .      i
e530: 66 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52  f( IS_LOCK_ERROR
e540: 28 6c 72 63 29 20 29 7b 0a 20 20 20 20 20 20 20  (lrc) ){.       
e550: 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e   pFile->lastErrn
e560: 6f 20 3d 20 74 45 72 72 6e 6f 3b 0a 20 20 20 20  o = tErrno;.    
e570: 20 20 20 20 72 63 20 3d 20 6c 72 63 3b 0a 20 20      rc = lrc;.  
e580: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
e590: 20 20 4f 53 54 52 41 43 45 28 28 22 54 45 53 54    OSTRACE(("TEST
e5a0: 20 57 52 2d 4c 4f 43 4b 20 25 64 20 25 64 20 25   WR-LOCK %d %d %
e5b0: 64 20 28 66 6c 6f 63 6b 29 5c 6e 22 2c 20 70 46  d (flock)\n", pF
e5c0: 69 6c 65 2d 3e 68 2c 20 72 63 2c 20 72 65 73 65  ile->h, rc, rese
e5d0: 72 76 65 64 29 29 3b 0a 0a 23 69 66 64 65 66 20  rved));..#ifdef 
e5e0: 53 51 4c 49 54 45 5f 49 47 4e 4f 52 45 5f 46 4c  SQLITE_IGNORE_FL
e5f0: 4f 43 4b 5f 4c 4f 43 4b 5f 45 52 52 4f 52 53 0a  OCK_LOCK_ERRORS.
e600: 20 20 69 66 28 20 28 72 63 20 26 20 53 51 4c 49    if( (rc & SQLI
e610: 54 45 5f 49 4f 45 52 52 29 20 3d 3d 20 53 51 4c  TE_IOERR) == SQL
e620: 49 54 45 5f 49 4f 45 52 52 20 29 7b 0a 20 20 20  ITE_IOERR ){.   
e630: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
e640: 0a 20 20 20 20 72 65 73 65 72 76 65 64 3d 31 3b  .    reserved=1;
e650: 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53  .  }.#endif /* S
e660: 51 4c 49 54 45 5f 49 47 4e 4f 52 45 5f 46 4c 4f  QLITE_IGNORE_FLO
e670: 43 4b 5f 4c 4f 43 4b 5f 45 52 52 4f 52 53 20 2a  CK_LOCK_ERRORS *
e680: 2f 0a 20 20 2a 70 52 65 73 4f 75 74 20 3d 20 72  /.  *pResOut = r
e690: 65 73 65 72 76 65 64 3b 0a 20 20 72 65 74 75 72  eserved;.  retur
e6a0: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c  n rc;.}../*.** L
e6b0: 6f 63 6b 20 74 68 65 20 66 69 6c 65 20 77 69 74  ock the file wit
e6c0: 68 20 74 68 65 20 6c 6f 63 6b 20 73 70 65 63 69  h the lock speci
e6d0: 66 69 65 64 20 62 79 20 70 61 72 61 6d 65 74 65  fied by paramete
e6e0: 72 20 65 46 69 6c 65 4c 6f 63 6b 20 2d 20 6f 6e  r eFileLock - on
e6f0: 65 0a 2a 2a 20 6f 66 20 74 68 65 20 66 6f 6c 6c  e.** of the foll
e700: 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  owing:.**.**    
e710: 20 28 31 29 20 53 48 41 52 45 44 5f 4c 4f 43 4b   (1) SHARED_LOCK
e720: 0a 2a 2a 20 20 20 20 20 28 32 29 20 52 45 53 45  .**     (2) RESE
e730: 52 56 45 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20  RVED_LOCK.**    
e740: 20 28 33 29 20 50 45 4e 44 49 4e 47 5f 4c 4f 43   (3) PENDING_LOC
e750: 4b 0a 2a 2a 20 20 20 20 20 28 34 29 20 45 58 43  K.**     (4) EXC
e760: 4c 55 53 49 56 45 5f 4c 4f 43 4b 0a 2a 2a 0a 2a  LUSIVE_LOCK.**.*
e770: 2a 20 53 6f 6d 65 74 69 6d 65 73 20 77 68 65 6e  * Sometimes when
e780: 20 72 65 71 75 65 73 74 69 6e 67 20 6f 6e 65 20   requesting one 
e790: 6c 6f 63 6b 20 73 74 61 74 65 2c 20 61 64 64 69  lock state, addi
e7a0: 74 69 6f 6e 61 6c 20 6c 6f 63 6b 20 73 74 61 74  tional lock stat
e7b0: 65 73 0a 2a 2a 20 61 72 65 20 69 6e 73 65 72 74  es.** are insert
e7c0: 65 64 20 69 6e 20 62 65 74 77 65 65 6e 2e 20 20  ed in between.  
e7d0: 54 68 65 20 6c 6f 63 6b 69 6e 67 20 6d 69 67 68  The locking migh
e7e0: 74 20 66 61 69 6c 20 6f 6e 20 6f 6e 65 20 6f 66  t fail on one of
e7f0: 20 74 68 65 20 6c 61 74 65 72 0a 2a 2a 20 74 72   the later.** tr
e800: 61 6e 73 69 74 69 6f 6e 73 20 6c 65 61 76 69 6e  ansitions leavin
e810: 67 20 74 68 65 20 6c 6f 63 6b 20 73 74 61 74 65  g the lock state
e820: 20 64 69 66 66 65 72 65 6e 74 20 66 72 6f 6d 20   different from 
e830: 77 68 61 74 20 69 74 20 73 74 61 72 74 65 64 20  what it started 
e840: 62 75 74 0a 2a 2a 20 73 74 69 6c 6c 20 73 68 6f  but.** still sho
e850: 72 74 20 6f 66 20 69 74 73 20 67 6f 61 6c 2e 20  rt of its goal. 
e860: 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63   The following c
e870: 68 61 72 74 20 73 68 6f 77 73 20 74 68 65 20 61  hart shows the a
e880: 6c 6c 6f 77 65 64 0a 2a 2a 20 74 72 61 6e 73 69  llowed.** transi
e890: 74 69 6f 6e 73 20 61 6e 64 20 74 68 65 20 69 6e  tions and the in
e8a0: 73 65 72 74 65 64 20 69 6e 74 65 72 6d 65 64 69  serted intermedi
e8b0: 61 74 65 20 73 74 61 74 65 73 3a 0a 2a 2a 0a 2a  ate states:.**.*
e8c0: 2a 20 20 20 20 55 4e 4c 4f 43 4b 45 44 20 2d 3e  *    UNLOCKED ->
e8d0: 20 53 48 41 52 45 44 0a 2a 2a 20 20 20 20 53 48   SHARED.**    SH
e8e0: 41 52 45 44 20 2d 3e 20 52 45 53 45 52 56 45 44  ARED -> RESERVED
e8f0: 0a 2a 2a 20 20 20 20 53 48 41 52 45 44 20 2d 3e  .**    SHARED ->
e900: 20 28 50 45 4e 44 49 4e 47 29 20 2d 3e 20 45 58   (PENDING) -> EX
e910: 43 4c 55 53 49 56 45 0a 2a 2a 20 20 20 20 52 45  CLUSIVE.**    RE
e920: 53 45 52 56 45 44 20 2d 3e 20 28 50 45 4e 44 49  SERVED -> (PENDI
e930: 4e 47 29 20 2d 3e 20 45 58 43 4c 55 53 49 56 45  NG) -> EXCLUSIVE
e940: 0a 2a 2a 20 20 20 20 50 45 4e 44 49 4e 47 20 2d  .**    PENDING -
e950: 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 0a 2a  > EXCLUSIVE.**.*
e960: 2a 20 66 6c 6f 63 6b 28 29 20 6f 6e 6c 79 20 72  * flock() only r
e970: 65 61 6c 6c 79 20 73 75 70 70 6f 72 74 20 45 58  eally support EX
e980: 43 4c 55 53 49 56 45 20 6c 6f 63 6b 73 2e 20 20  CLUSIVE locks.  
e990: 57 65 20 74 72 61 63 6b 20 69 6e 74 65 72 6d 65  We track interme
e9a0: 64 69 61 74 65 0a 2a 2a 20 6c 6f 63 6b 20 73 74  diate.** lock st
e9b0: 61 74 65 73 20 69 6e 20 74 68 65 20 73 71 6c 69  ates in the sqli
e9c0: 74 65 33 5f 66 69 6c 65 20 73 74 72 75 63 74 75  te3_file structu
e9d0: 72 65 2c 20 62 75 74 20 61 6c 6c 20 6c 6f 63 6b  re, but all lock
e9e0: 73 20 53 48 41 52 45 44 20 6f 72 0a 2a 2a 20 61  s SHARED or.** a
e9f0: 62 6f 76 65 20 61 72 65 20 72 65 61 6c 6c 79 20  bove are really 
ea00: 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 73 20  EXCLUSIVE locks 
ea10: 61 6e 64 20 65 78 63 6c 75 64 65 20 61 6c 6c 20  and exclude all 
ea20: 6f 74 68 65 72 20 70 72 6f 63 65 73 73 65 73 20  other processes 
ea30: 66 72 6f 6d 0a 2a 2a 20 61 63 63 65 73 73 20 74  from.** access t
ea40: 68 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54  he file..**.** T
ea50: 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c  his routine will
ea60: 20 6f 6e 6c 79 20 69 6e 63 72 65 61 73 65 20 61   only increase a
ea70: 20 6c 6f 63 6b 2e 20 20 55 73 65 20 74 68 65 20   lock.  Use the 
ea80: 73 71 6c 69 74 65 33 4f 73 55 6e 6c 6f 63 6b 28  sqlite3OsUnlock(
ea90: 29 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 74 6f 20  ).** routine to 
eaa0: 6c 6f 77 65 72 20 61 20 6c 6f 63 6b 69 6e 67 20  lower a locking 
eab0: 6c 65 76 65 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63  level..*/.static
eac0: 20 69 6e 74 20 66 6c 6f 63 6b 4c 6f 63 6b 28 73   int flockLock(s
ead0: 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c  qlite3_file *id,
eae0: 20 69 6e 74 20 65 46 69 6c 65 4c 6f 63 6b 29 20   int eFileLock) 
eaf0: 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
eb00: 49 54 45 5f 4f 4b 3b 0a 20 20 75 6e 69 78 46 69  ITE_OK;.  unixFi
eb10: 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69  le *pFile = (uni
eb20: 78 46 69 6c 65 2a 29 69 64 3b 0a 0a 20 20 61 73  xFile*)id;..  as
eb30: 73 65 72 74 28 20 70 46 69 6c 65 20 29 3b 0a 0a  sert( pFile );..
eb40: 20 20 2f 2a 20 69 66 20 77 65 20 61 6c 72 65 61    /* if we alrea
eb50: 64 79 20 68 61 76 65 20 61 20 6c 6f 63 6b 2c 20  dy have a lock, 
eb60: 69 74 20 69 73 20 65 78 63 6c 75 73 69 76 65 2e  it is exclusive.
eb70: 20 20 0a 20 20 2a 2a 20 4a 75 73 74 20 61 64 6a    .  ** Just adj
eb80: 75 73 74 20 6c 65 76 65 6c 20 61 6e 64 20 70 75  ust level and pu
eb90: 6e 74 20 6f 6e 20 6f 75 74 74 61 20 68 65 72 65  nt on outta here
eba0: 2e 20 2a 2f 0a 20 20 69 66 20 28 70 46 69 6c 65  . */.  if (pFile
ebb0: 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3e 20 4e 4f  ->eFileLock > NO
ebc0: 5f 4c 4f 43 4b 29 20 7b 0a 20 20 20 20 70 46 69  _LOCK) {.    pFi
ebd0: 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20  le->eFileLock = 
ebe0: 65 46 69 6c 65 4c 6f 63 6b 3b 0a 20 20 20 20 72  eFileLock;.    r
ebf0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
ec00: 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 67 72 61  .  }.  .  /* gra
ec10: 62 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c  b an exclusive l
ec20: 6f 63 6b 20 2a 2f 0a 20 20 0a 20 20 69 66 20 28  ock */.  .  if (
ec30: 66 6c 6f 63 6b 28 70 46 69 6c 65 2d 3e 68 2c 20  flock(pFile->h, 
ec40: 4c 4f 43 4b 5f 45 58 20 7c 20 4c 4f 43 4b 5f 4e  LOCK_EX | LOCK_N
ec50: 42 29 29 20 7b 0a 20 20 20 20 69 6e 74 20 74 45  B)) {.    int tE
ec60: 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20  rrno = errno;.  
ec70: 20 20 2f 2a 20 64 69 64 6e 27 74 20 67 65 74 2c    /* didn't get,
ec80: 20 6d 75 73 74 20 62 65 20 62 75 73 79 20 2a 2f   must be busy */
ec90: 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
eca0: 45 72 72 6f 72 46 72 6f 6d 50 6f 73 69 78 45 72  ErrorFromPosixEr
ecb0: 72 6f 72 28 74 45 72 72 6e 6f 2c 20 53 51 4c 49  ror(tErrno, SQLI
ecc0: 54 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b 29 3b 0a  TE_IOERR_LOCK);.
ecd0: 20 20 20 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f      if( IS_LOCK_
ece0: 45 52 52 4f 52 28 72 63 29 20 29 7b 0a 20 20 20  ERROR(rc) ){.   
ecf0: 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72     pFile->lastEr
ed00: 72 6e 6f 20 3d 20 74 45 72 72 6e 6f 3b 0a 20 20  rno = tErrno;.  
ed10: 20 20 7d 0a 20 20 7d 20 65 6c 73 65 20 7b 0a 20    }.  } else {. 
ed20: 20 20 20 2f 2a 20 67 6f 74 20 69 74 2c 20 73 65     /* got it, se
ed30: 74 20 74 68 65 20 74 79 70 65 20 61 6e 64 20 72  t the type and r
ed40: 65 74 75 72 6e 20 6f 6b 20 2a 2f 0a 20 20 20 20  eturn ok */.    
ed50: 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  pFile->eFileLock
ed60: 20 3d 20 65 46 69 6c 65 4c 6f 63 6b 3b 0a 20 20   = eFileLock;.  
ed70: 7d 0a 20 20 4f 53 54 52 41 43 45 28 28 22 4c 4f  }.  OSTRACE(("LO
ed80: 43 4b 20 20 20 20 25 64 20 25 73 20 25 73 20 28  CK    %d %s %s (
ed90: 66 6c 6f 63 6b 29 5c 6e 22 2c 20 70 46 69 6c 65  flock)\n", pFile
eda0: 2d 3e 68 2c 20 61 7a 46 69 6c 65 4c 6f 63 6b 28  ->h, azFileLock(
edb0: 65 46 69 6c 65 4c 6f 63 6b 29 2c 20 0a 20 20 20  eFileLock), .   
edc0: 20 20 20 20 20 20 20 20 72 63 3d 3d 53 51 4c 49          rc==SQLI
edd0: 54 45 5f 4f 4b 20 3f 20 22 6f 6b 22 20 3a 20 22  TE_OK ? "ok" : "
ede0: 66 61 69 6c 65 64 22 29 29 3b 0a 23 69 66 64 65  failed"));.#ifde
edf0: 66 20 53 51 4c 49 54 45 5f 49 47 4e 4f 52 45 5f  f SQLITE_IGNORE_
ee00: 46 4c 4f 43 4b 5f 4c 4f 43 4b 5f 45 52 52 4f 52  FLOCK_LOCK_ERROR
ee10: 53 0a 20 20 69 66 28 20 28 72 63 20 26 20 53 51  S.  if( (rc & SQ
ee20: 4c 49 54 45 5f 49 4f 45 52 52 29 20 3d 3d 20 53  LITE_IOERR) == S
ee30: 51 4c 49 54 45 5f 49 4f 45 52 52 20 29 7b 0a 20  QLITE_IOERR ){. 
ee40: 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42     rc = SQLITE_B
ee50: 55 53 59 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 20  USY;.  }.#endif 
ee60: 2f 2a 20 53 51 4c 49 54 45 5f 49 47 4e 4f 52 45  /* SQLITE_IGNORE
ee70: 5f 46 4c 4f 43 4b 5f 4c 4f 43 4b 5f 45 52 52 4f  _FLOCK_LOCK_ERRO
ee80: 52 53 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 72  RS */.  return r
ee90: 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 77  c;.}.../*.** Low
eea0: 65 72 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c  er the locking l
eeb0: 65 76 65 6c 20 6f 6e 20 66 69 6c 65 20 64 65 73  evel on file des
eec0: 63 72 69 70 74 6f 72 20 70 46 69 6c 65 20 74 6f  criptor pFile to
eed0: 20 65 46 69 6c 65 4c 6f 63 6b 2e 20 20 65 46 69   eFileLock.  eFi
eee0: 6c 65 4c 6f 63 6b 0a 2a 2a 20 6d 75 73 74 20 62  leLock.** must b
eef0: 65 20 65 69 74 68 65 72 20 4e 4f 5f 4c 4f 43 4b  e either NO_LOCK
ef00: 20 6f 72 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2e   or SHARED_LOCK.
ef10: 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6c 6f  .**.** If the lo
ef20: 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 66 20 74  cking level of t
ef30: 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  he file descript
ef40: 6f 72 20 69 73 20 61 6c 72 65 61 64 79 20 61 74  or is already at
ef50: 20 6f 72 20 62 65 6c 6f 77 0a 2a 2a 20 74 68 65   or below.** the
ef60: 20 72 65 71 75 65 73 74 65 64 20 6c 6f 63 6b 69   requested locki
ef70: 6e 67 20 6c 65 76 65 6c 2c 20 74 68 69 73 20 72  ng level, this r
ef80: 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f  outine is a no-o
ef90: 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  p..*/.static int
efa0: 20 66 6c 6f 63 6b 55 6e 6c 6f 63 6b 28 73 71 6c   flockUnlock(sql
efb0: 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69  ite3_file *id, i
efc0: 6e 74 20 65 46 69 6c 65 4c 6f 63 6b 29 20 7b 0a  nt eFileLock) {.
efd0: 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c    unixFile *pFil
efe0: 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69  e = (unixFile*)i
eff0: 64 3b 0a 20 20 0a 20 20 61 73 73 65 72 74 28 20  d;.  .  assert( 
f000: 70 46 69 6c 65 20 29 3b 0a 20 20 4f 53 54 52 41  pFile );.  OSTRA
f010: 43 45 28 28 22 55 4e 4c 4f 43 4b 20 20 25 64 20  CE(("UNLOCK  %d 
f020: 25 64 20 77 61 73 20 25 64 20 70 69 64 3d 25 64  %d was %d pid=%d
f030: 20 28 66 6c 6f 63 6b 29 5c 6e 22 2c 20 70 46 69   (flock)\n", pFi
f040: 6c 65 2d 3e 68 2c 20 65 46 69 6c 65 4c 6f 63 6b  le->h, eFileLock
f050: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70 46 69  ,.           pFi
f060: 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 2c 20 67  le->eFileLock, g
f070: 65 74 70 69 64 28 29 29 29 3b 0a 20 20 61 73 73  etpid()));.  ass
f080: 65 72 74 28 20 65 46 69 6c 65 4c 6f 63 6b 3c 3d  ert( eFileLock<=
f090: 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20  SHARED_LOCK );. 
f0a0: 20 0a 20 20 2f 2a 20 6e 6f 2d 6f 70 20 69 66 20   .  /* no-op if 
f0b0: 70 6f 73 73 69 62 6c 65 20 2a 2f 0a 20 20 69 66  possible */.  if
f0c0: 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f  ( pFile->eFileLo
f0d0: 63 6b 3d 3d 65 46 69 6c 65 4c 6f 63 6b 20 29 7b  ck==eFileLock ){
f0e0: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
f0f0: 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 0a 20 20  TE_OK;.  }.  .  
f100: 2f 2a 20 73 68 61 72 65 64 20 63 61 6e 20 6a 75  /* shared can ju
f110: 73 74 20 62 65 20 73 65 74 20 62 65 63 61 75 73  st be set becaus
f120: 65 20 77 65 20 61 6c 77 61 79 73 20 68 61 76 65  e we always have
f130: 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20 2a 2f   an exclusive */
f140: 0a 20 20 69 66 20 28 65 46 69 6c 65 4c 6f 63 6b  .  if (eFileLock
f150: 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 29 20 7b  ==SHARED_LOCK) {
f160: 0a 20 20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c  .    pFile->eFil
f170: 65 4c 6f 63 6b 20 3d 20 65 46 69 6c 65 4c 6f 63  eLock = eFileLoc
f180: 6b 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  k;.    return SQ
f190: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 0a  LITE_OK;.  }.  .
f1a0: 20 20 2f 2a 20 6e 6f 2c 20 72 65 61 6c 6c 79 2c    /* no, really,
f1b0: 20 75 6e 6c 6f 63 6b 2e 20 2a 2f 0a 20 20 69 6e   unlock. */.  in
f1c0: 74 20 72 63 20 3d 20 66 6c 6f 63 6b 28 70 46 69  t rc = flock(pFi
f1d0: 6c 65 2d 3e 68 2c 20 4c 4f 43 4b 5f 55 4e 29 3b  le->h, LOCK_UN);
f1e0: 0a 20 20 69 66 20 28 72 63 29 20 7b 0a 20 20 20  .  if (rc) {.   
f1f0: 20 69 6e 74 20 72 2c 20 74 45 72 72 6e 6f 20 3d   int r, tErrno =
f200: 20 65 72 72 6e 6f 3b 0a 20 20 20 20 72 20 3d 20   errno;.    r = 
f210: 73 71 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d 50  sqliteErrorFromP
f220: 6f 73 69 78 45 72 72 6f 72 28 74 45 72 72 6e 6f  osixError(tErrno
f230: 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55  , SQLITE_IOERR_U
f240: 4e 4c 4f 43 4b 29 3b 0a 20 20 20 20 69 66 28 20  NLOCK);.    if( 
f250: 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 72 29  IS_LOCK_ERROR(r)
f260: 20 29 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d   ){.      pFile-
f270: 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 74 45 72  >lastErrno = tEr
f280: 72 6e 6f 3b 0a 20 20 20 20 7d 0a 23 69 66 64 65  rno;.    }.#ifde
f290: 66 20 53 51 4c 49 54 45 5f 49 47 4e 4f 52 45 5f  f SQLITE_IGNORE_
f2a0: 46 4c 4f 43 4b 5f 4c 4f 43 4b 5f 45 52 52 4f 52  FLOCK_LOCK_ERROR
f2b0: 53 0a 20 20 20 20 69 66 28 20 28 72 20 26 20 53  S.    if( (r & S
f2c0: 51 4c 49 54 45 5f 49 4f 45 52 52 29 20 3d 3d 20  QLITE_IOERR) == 
f2d0: 53 51 4c 49 54 45 5f 49 4f 45 52 52 20 29 7b 0a  SQLITE_IOERR ){.
f2e0: 20 20 20 20 20 20 72 20 3d 20 53 51 4c 49 54 45        r = SQLITE
f2f0: 5f 42 55 53 59 3b 0a 20 20 20 20 7d 0a 23 65 6e  _BUSY;.    }.#en
f300: 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 49 47  dif /* SQLITE_IG
f310: 4e 4f 52 45 5f 46 4c 4f 43 4b 5f 4c 4f 43 4b 5f  NORE_FLOCK_LOCK_
f320: 45 52 52 4f 52 53 20 2a 2f 0a 20 20 20 20 0a 20  ERRORS */.    . 
f330: 20 20 20 72 65 74 75 72 6e 20 72 3b 0a 20 20 7d     return r;.  }
f340: 20 65 6c 73 65 20 7b 0a 20 20 20 20 70 46 69 6c   else {.    pFil
f350: 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 4e  e->eFileLock = N
f360: 4f 5f 4c 4f 43 4b 3b 0a 20 20 20 20 72 65 74 75  O_LOCK;.    retu
f370: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
f380: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65  }.}../*.** Close
f390: 20 61 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74   a file..*/.stat
f3a0: 69 63 20 69 6e 74 20 66 6c 6f 63 6b 43 6c 6f 73  ic int flockClos
f3b0: 65 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  e(sqlite3_file *
f3c0: 69 64 29 20 7b 0a 20 20 69 66 28 20 69 64 20 29  id) {.  if( id )
f3d0: 7b 0a 20 20 20 20 66 6c 6f 63 6b 55 6e 6c 6f 63  {.    flockUnloc
f3e0: 6b 28 69 64 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a  k(id, NO_LOCK);.
f3f0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 63 6c 6f    }.  return clo
f400: 73 65 55 6e 69 78 46 69 6c 65 28 69 64 29 3b 0a  seUnixFile(id);.
f410: 7d 0a 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  }..#endif /* SQL
f420: 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49  ITE_ENABLE_LOCKI
f430: 4e 47 5f 53 54 59 4c 45 20 26 26 20 21 4f 53 5f  NG_STYLE && !OS_
f440: 56 58 57 4f 52 4b 20 2a 2f 0a 0a 2f 2a 2a 2a 2a  VXWORK */../****
f450: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20  *************** 
f460: 45 6e 64 20 6f 66 20 74 68 65 20 66 6c 6f 63 6b  End of the flock
f470: 20 6c 6f 63 6b 20 69 6d 70 6c 65 6d 65 6e 74 61   lock implementa
f480: 74 69 6f 6e 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  tion ***********
f490: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a  **********.*****
f4a0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f4b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f4c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f4d0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f4e0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 2a 2a  *********/../***
f4f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f500: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f510: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f520: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f530: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a  ***********.****
f540: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f550: 2a 2a 2a 2a 20 42 65 67 69 6e 20 4e 61 6d 65 64  **** Begin Named
f560: 20 53 65 6d 61 70 68 6f 72 65 20 4c 6f 63 6b 69   Semaphore Locki
f570: 6e 67 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ng *************
f580: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a  ***********.**.*
f590: 2a 20 4e 61 6d 65 64 20 73 65 6d 61 70 68 6f 72  * Named semaphor
f5a0: 65 20 6c 6f 63 6b 69 6e 67 20 69 73 20 6f 6e 6c  e locking is onl
f5b0: 79 20 73 75 70 70 6f 72 74 65 64 20 6f 6e 20 56  y supported on V
f5c0: 78 57 6f 72 6b 73 2e 0a 2a 2a 0a 2a 2a 20 53 65  xWorks..**.** Se
f5d0: 6d 61 70 68 6f 72 65 20 6c 6f 63 6b 69 6e 67 20  maphore locking 
f5e0: 69 73 20 6c 69 6b 65 20 64 6f 74 2d 6c 6f 63 6b  is like dot-lock
f5f0: 20 61 6e 64 20 66 6c 6f 63 6b 20 69 6e 20 74 68   and flock in th
f600: 61 74 20 69 74 20 72 65 61 6c 6c 79 20 6f 6e 6c  at it really onl
f610: 79 0a 2a 2a 20 73 75 70 70 6f 72 74 73 20 45 58  y.** supports EX
f620: 43 4c 55 53 49 56 45 20 6c 6f 63 6b 69 6e 67 2e  CLUSIVE locking.
f630: 20 20 4f 6e 6c 79 20 61 20 73 69 6e 67 6c 65 20    Only a single 
f640: 70 72 6f 63 65 73 73 20 63 61 6e 20 72 65 61 64  process can read
f650: 20 6f 72 20 77 72 69 74 65 0a 2a 2a 20 74 68 65   or write.** the
f660: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 61   database file a
f670: 74 20 61 20 74 69 6d 65 2e 20 20 54 68 69 73 20  t a time.  This 
f680: 72 65 64 75 63 65 73 20 70 6f 74 65 6e 74 69 61  reduces potentia
f690: 6c 20 63 6f 6e 63 75 72 72 65 6e 63 79 2c 20 62  l concurrency, b
f6a0: 75 74 0a 2a 2a 20 6d 61 6b 65 73 20 74 68 65 20  ut.** makes the 
f6b0: 6c 6f 63 6b 20 69 6d 70 6c 65 6d 65 6e 74 61 74  lock implementat
f6c0: 69 6f 6e 20 6d 75 63 68 20 65 61 73 69 65 72 2e  ion much easier.
f6d0: 0a 2a 2f 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52  .*/.#if OS_VXWOR
f6e0: 4b 53 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  KS../*.** This r
f6f0: 6f 75 74 69 6e 65 20 63 68 65 63 6b 73 20 69 66  outine checks if
f700: 20 74 68 65 72 65 20 69 73 20 61 20 52 45 53 45   there is a RESE
f710: 52 56 45 44 20 6c 6f 63 6b 20 68 65 6c 64 20 6f  RVED lock held o
f720: 6e 20 74 68 65 20 73 70 65 63 69 66 69 65 64 0a  n the specified.
f730: 2a 2a 20 66 69 6c 65 20 62 79 20 74 68 69 73 20  ** file by this 
f740: 6f 72 20 61 6e 79 20 6f 74 68 65 72 20 70 72 6f  or any other pro
f750: 63 65 73 73 2e 20 49 66 20 73 75 63 68 20 61 20  cess. If such a 
f760: 6c 6f 63 6b 20 69 73 20 68 65 6c 64 2c 20 73 65  lock is held, se
f770: 74 20 2a 70 52 65 73 4f 75 74 0a 2a 2a 20 74 6f  t *pResOut.** to
f780: 20 61 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75   a non-zero valu
f790: 65 20 6f 74 68 65 72 77 69 73 65 20 2a 70 52 65  e otherwise *pRe
f7a0: 73 4f 75 74 20 69 73 20 73 65 74 20 74 6f 20 7a  sOut is set to z
f7b0: 65 72 6f 2e 20 20 54 68 65 20 72 65 74 75 72 6e  ero.  The return
f7c0: 20 76 61 6c 75 65 0a 2a 2a 20 69 73 20 73 65 74   value.** is set
f7d0: 20 74 6f 20 53 51 4c 49 54 45 5f 4f 4b 20 75 6e   to SQLITE_OK un
f7e0: 6c 65 73 73 20 61 6e 20 49 2f 4f 20 65 72 72 6f  less an I/O erro
f7f0: 72 20 6f 63 63 75 72 73 20 64 75 72 69 6e 67 20  r occurs during 
f800: 6c 6f 63 6b 20 63 68 65 63 6b 69 6e 67 2e 0a 2a  lock checking..*
f810: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 65 6d  /.static int sem
f820: 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63  CheckReservedLoc
f830: 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  k(sqlite3_file *
f840: 69 64 2c 20 69 6e 74 20 2a 70 52 65 73 4f 75 74  id, int *pResOut
f850: 29 20 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  ) {.  int rc = S
f860: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20  QLITE_OK;.  int 
f870: 72 65 73 65 72 76 65 64 20 3d 20 30 3b 0a 20 20  reserved = 0;.  
f880: 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20  unixFile *pFile 
f890: 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b  = (unixFile*)id;
f8a0: 0a 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72  ..  SimulateIOEr
f8b0: 72 6f 72 28 20 72 65 74 75 72 6e 20 53 51 4c 49  ror( return SQLI
f8c0: 54 45 5f 49 4f 45 52 52 5f 43 48 45 43 4b 52 45  TE_IOERR_CHECKRE
f8d0: 53 45 52 56 45 44 4c 4f 43 4b 3b 20 29 3b 0a 20  SERVEDLOCK; );. 
f8e0: 20 0a 20 20 61 73 73 65 72 74 28 20 70 46 69 6c   .  assert( pFil
f8f0: 65 20 29 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b  e );..  /* Check
f900: 20 69 66 20 61 20 74 68 72 65 61 64 20 69 6e 20   if a thread in 
f910: 74 68 69 73 20 70 72 6f 63 65 73 73 20 68 6f 6c  this process hol
f920: 64 73 20 73 75 63 68 20 61 20 6c 6f 63 6b 20 2a  ds such a lock *
f930: 2f 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 65  /.  if( pFile->e
f940: 46 69 6c 65 4c 6f 63 6b 3e 53 48 41 52 45 44 5f  FileLock>SHARED_
f950: 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 72 65 73 65  LOCK ){.    rese
f960: 72 76 65 64 20 3d 20 31 3b 0a 20 20 7d 0a 20 20  rved = 1;.  }.  
f970: 0a 20 20 2f 2a 20 4f 74 68 65 72 77 69 73 65 20  .  /* Otherwise 
f980: 73 65 65 20 69 66 20 73 6f 6d 65 20 6f 74 68 65  see if some othe
f990: 72 20 70 72 6f 63 65 73 73 20 68 6f 6c 64 73 20  r process holds 
f9a0: 69 74 2e 20 2a 2f 0a 20 20 69 66 28 20 21 72 65  it. */.  if( !re
f9b0: 73 65 72 76 65 64 20 29 7b 0a 20 20 20 20 73 65  served ){.    se
f9c0: 6d 5f 74 20 2a 70 53 65 6d 20 3d 20 70 46 69 6c  m_t *pSem = pFil
f9d0: 65 2d 3e 70 49 6e 6f 64 65 2d 3e 70 53 65 6d 3b  e->pInode->pSem;
f9e0: 0a 20 20 20 20 73 74 72 75 63 74 20 73 74 61 74  .    struct stat
f9f0: 20 73 74 61 74 42 75 66 3b 0a 0a 20 20 20 20 69   statBuf;..    i
fa00: 66 28 20 73 65 6d 5f 74 72 79 77 61 69 74 28 70  f( sem_trywait(p
fa10: 53 65 6d 29 3d 3d 2d 31 20 29 7b 0a 20 20 20 20  Sem)==-1 ){.    
fa20: 20 20 69 6e 74 20 74 45 72 72 6e 6f 20 3d 20 65    int tErrno = e
fa30: 72 72 6e 6f 3b 0a 20 20 20 20 20 20 69 66 28 20  rrno;.      if( 
fa40: 45 41 47 41 49 4e 20 21 3d 20 74 45 72 72 6e 6f  EAGAIN != tErrno
fa50: 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
fa60: 20 73 71 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d   sqliteErrorFrom
fa70: 50 6f 73 69 78 45 72 72 6f 72 28 74 45 72 72 6e  PosixError(tErrn
fa80: 6f 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  o, SQLITE_IOERR_
fa90: 43 48 45 43 4b 52 45 53 45 52 56 45 44 4c 4f 43  CHECKRESERVEDLOC
faa0: 4b 29 3b 0a 20 20 20 20 20 20 20 20 70 46 69 6c  K);.        pFil
fab0: 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 74  e->lastErrno = t
fac0: 45 72 72 6e 6f 3b 0a 20 20 20 20 20 20 7d 20 65  Errno;.      } e
fad0: 6c 73 65 20 7b 0a 20 20 20 20 20 20 20 20 2f 2a  lse {.        /*
fae0: 20 73 6f 6d 65 6f 6e 65 20 65 6c 73 65 20 68 61   someone else ha
faf0: 73 20 74 68 65 20 6c 6f 63 6b 20 77 68 65 6e 20  s the lock when 
fb00: 77 65 20 61 72 65 20 69 6e 20 4e 4f 5f 4c 4f 43  we are in NO_LOC
fb10: 4b 20 2a 2f 0a 20 20 20 20 20 20 20 20 72 65 73  K */.        res
fb20: 65 72 76 65 64 20 3d 20 28 70 46 69 6c 65 2d 3e  erved = (pFile->
fb30: 65 46 69 6c 65 4c 6f 63 6b 20 3c 20 53 48 41 52  eFileLock < SHAR
fb40: 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20  ED_LOCK);.      
fb50: 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  }.    }else{.   
fb60: 20 20 20 2f 2a 20 77 65 20 63 6f 75 6c 64 20 68     /* we could h
fb70: 61 76 65 20 69 74 20 69 66 20 77 65 20 77 61 6e  ave it if we wan
fb80: 74 20 69 74 20 2a 2f 0a 20 20 20 20 20 20 73 65  t it */.      se
fb90: 6d 5f 70 6f 73 74 28 70 53 65 6d 29 3b 0a 20 20  m_post(pSem);.  
fba0: 20 20 7d 0a 20 20 7d 0a 20 20 4f 53 54 52 41 43    }.  }.  OSTRAC
fbb0: 45 28 28 22 54 45 53 54 20 57 52 2d 4c 4f 43 4b  E(("TEST WR-LOCK
fbc0: 20 25 64 20 25 64 20 25 64 20 28 73 65 6d 29 5c   %d %d %d (sem)\
fbd0: 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 72 63  n", pFile->h, rc
fbe0: 2c 20 72 65 73 65 72 76 65 64 29 29 3b 0a 0a 20  , reserved));.. 
fbf0: 20 2a 70 52 65 73 4f 75 74 20 3d 20 72 65 73 65   *pResOut = rese
fc00: 72 76 65 64 3b 0a 20 20 72 65 74 75 72 6e 20 72  rved;.  return r
fc10: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 6b  c;.}../*.** Lock
fc20: 20 74 68 65 20 66 69 6c 65 20 77 69 74 68 20 74   the file with t
fc30: 68 65 20 6c 6f 63 6b 20 73 70 65 63 69 66 69 65  he lock specifie
fc40: 64 20 62 79 20 70 61 72 61 6d 65 74 65 72 20 65  d by parameter e
fc50: 46 69 6c 65 4c 6f 63 6b 20 2d 20 6f 6e 65 0a 2a  FileLock - one.*
fc60: 2a 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  * of the followi
fc70: 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28 31  ng:.**.**     (1
fc80: 29 20 53 48 41 52 45 44 5f 4c 4f 43 4b 0a 2a 2a  ) SHARED_LOCK.**
fc90: 20 20 20 20 20 28 32 29 20 52 45 53 45 52 56 45       (2) RESERVE
fca0: 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 33  D_LOCK.**     (3
fcb0: 29 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 0a 2a  ) PENDING_LOCK.*
fcc0: 2a 20 20 20 20 20 28 34 29 20 45 58 43 4c 55 53  *     (4) EXCLUS
fcd0: 49 56 45 5f 4c 4f 43 4b 0a 2a 2a 0a 2a 2a 20 53  IVE_LOCK.**.** S
fce0: 6f 6d 65 74 69 6d 65 73 20 77 68 65 6e 20 72 65  ometimes when re
fcf0: 71 75 65 73 74 69 6e 67 20 6f 6e 65 20 6c 6f 63  questing one loc
fd00: 6b 20 73 74 61 74 65 2c 20 61 64 64 69 74 69 6f  k state, additio
fd10: 6e 61 6c 20 6c 6f 63 6b 20 73 74 61 74 65 73 0a  nal lock states.
fd20: 2a 2a 20 61 72 65 20 69 6e 73 65 72 74 65 64 20  ** are inserted 
fd30: 69 6e 20 62 65 74 77 65 65 6e 2e 20 20 54 68 65  in between.  The
fd40: 20 6c 6f 63 6b 69 6e 67 20 6d 69 67 68 74 20 66   locking might f
fd50: 61 69 6c 20 6f 6e 20 6f 6e 65 20 6f 66 20 74 68  ail on one of th
fd60: 65 20 6c 61 74 65 72 0a 2a 2a 20 74 72 61 6e 73  e later.** trans
fd70: 69 74 69 6f 6e 73 20 6c 65 61 76 69 6e 67 20 74  itions leaving t
fd80: 68 65 20 6c 6f 63 6b 20 73 74 61 74 65 20 64 69  he lock state di
fd90: 66 66 65 72 65 6e 74 20 66 72 6f 6d 20 77 68 61  fferent from wha
fda0: 74 20 69 74 20 73 74 61 72 74 65 64 20 62 75 74  t it started but
fdb0: 0a 2a 2a 20 73 74 69 6c 6c 20 73 68 6f 72 74 20  .** still short 
fdc0: 6f 66 20 69 74 73 20 67 6f 61 6c 2e 20 20 54 68  of its goal.  Th
fdd0: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 68 61 72  e following char
fde0: 74 20 73 68 6f 77 73 20 74 68 65 20 61 6c 6c 6f  t shows the allo
fdf0: 77 65 64 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f  wed.** transitio
fe00: 6e 73 20 61 6e 64 20 74 68 65 20 69 6e 73 65 72  ns and the inser
fe10: 74 65 64 20 69 6e 74 65 72 6d 65 64 69 61 74 65  ted intermediate
fe20: 20 73 74 61 74 65 73 3a 0a 2a 2a 0a 2a 2a 20 20   states:.**.**  
fe30: 20 20 55 4e 4c 4f 43 4b 45 44 20 2d 3e 20 53 48    UNLOCKED -> SH
fe40: 41 52 45 44 0a 2a 2a 20 20 20 20 53 48 41 52 45  ARED.**    SHARE
fe50: 44 20 2d 3e 20 52 45 53 45 52 56 45 44 0a 2a 2a  D -> RESERVED.**
fe60: 20 20 20 20 53 48 41 52 45 44 20 2d 3e 20 28 50      SHARED -> (P
fe70: 45 4e 44 49 4e 47 29 20 2d 3e 20 45 58 43 4c 55  ENDING) -> EXCLU
fe80: 53 49 56 45 0a 2a 2a 20 20 20 20 52 45 53 45 52  SIVE.**    RESER
fe90: 56 45 44 20 2d 3e 20 28 50 45 4e 44 49 4e 47 29  VED -> (PENDING)
fea0: 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a   -> EXCLUSIVE.**
feb0: 20 20 20 20 50 45 4e 44 49 4e 47 20 2d 3e 20 45      PENDING -> E
fec0: 58 43 4c 55 53 49 56 45 0a 2a 2a 0a 2a 2a 20 53  XCLUSIVE.**.** S
fed0: 65 6d 61 70 68 6f 72 65 20 6c 6f 63 6b 73 20 6f  emaphore locks o
fee0: 6e 6c 79 20 72 65 61 6c 6c 79 20 73 75 70 70 6f  nly really suppo
fef0: 72 74 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63  rt EXCLUSIVE loc
ff00: 6b 73 2e 20 20 57 65 20 74 72 61 63 6b 20 69 6e  ks.  We track in
ff10: 74 65 72 6d 65 64 69 61 74 65 0a 2a 2a 20 6c 6f  termediate.** lo
ff20: 63 6b 20 73 74 61 74 65 73 20 69 6e 20 74 68 65  ck states in the
ff30: 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 73 74   sqlite3_file st
ff40: 72 75 63 74 75 72 65 2c 20 62 75 74 20 61 6c 6c  ructure, but all
ff50: 20 6c 6f 63 6b 73 20 53 48 41 52 45 44 20 6f 72   locks SHARED or
ff60: 0a 2a 2a 20 61 62 6f 76 65 20 61 72 65 20 72 65  .** above are re
ff70: 61 6c 6c 79 20 45 58 43 4c 55 53 49 56 45 20 6c  ally EXCLUSIVE l
ff80: 6f 63 6b 73 20 61 6e 64 20 65 78 63 6c 75 64 65  ocks and exclude
ff90: 20 61 6c 6c 20 6f 74 68 65 72 20 70 72 6f 63 65   all other proce
ffa0: 73 73 65 73 20 66 72 6f 6d 0a 2a 2a 20 61 63 63  sses from.** acc
ffb0: 65 73 73 20 74 68 65 20 66 69 6c 65 2e 0a 2a 2a  ess the file..**
ffc0: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
ffd0: 20 77 69 6c 6c 20 6f 6e 6c 79 20 69 6e 63 72 65   will only incre
ffe0: 61 73 65 20 61 20 6c 6f 63 6b 2e 20 20 55 73 65  ase a lock.  Use
fff0: 20 74 68 65 20 73 71 6c 69 74 65 33 4f 73 55 6e   the sqlite3OsUn
10000 6c 6f 63 6b 28 29 0a 2a 2a 20 72 6f 75 74 69 6e  lock().** routin
10010 65 20 74 6f 20 6c 6f 77 65 72 20 61 20 6c 6f 63  e to lower a loc
10020 6b 69 6e 67 20 6c 65 76 65 6c 2e 0a 2a 2f 0a 73  king level..*/.s
10030 74 61 74 69 63 20 69 6e 74 20 73 65 6d 4c 6f 63  tatic int semLoc
10040 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  k(sqlite3_file *
10050 69 64 2c 20 69 6e 74 20 65 46 69 6c 65 4c 6f 63  id, int eFileLoc
10060 6b 29 20 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20  k) {.  unixFile 
10070 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69  *pFile = (unixFi
10080 6c 65 2a 29 69 64 3b 0a 20 20 69 6e 74 20 66 64  le*)id;.  int fd
10090 3b 0a 20 20 73 65 6d 5f 74 20 2a 70 53 65 6d 20  ;.  sem_t *pSem 
100a0 3d 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d  = pFile->pInode-
100b0 3e 70 53 65 6d 3b 0a 20 20 69 6e 74 20 72 63 20  >pSem;.  int rc 
100c0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20  = SQLITE_OK;..  
100d0 2f 2a 20 69 66 20 77 65 20 61 6c 72 65 61 64 79  /* if we already
100e0 20 68 61 76 65 20 61 20 6c 6f 63 6b 2c 20 69 74   have a lock, it
100f0 20 69 73 20 65 78 63 6c 75 73 69 76 65 2e 20 20   is exclusive.  
10100 0a 20 20 2a 2a 20 4a 75 73 74 20 61 64 6a 75 73  .  ** Just adjus
10110 74 20 6c 65 76 65 6c 20 61 6e 64 20 70 75 6e 74  t level and punt
10120 20 6f 6e 20 6f 75 74 74 61 20 68 65 72 65 2e 20   on outta here. 
10130 2a 2f 0a 20 20 69 66 20 28 70 46 69 6c 65 2d 3e  */.  if (pFile->
10140 65 46 69 6c 65 4c 6f 63 6b 20 3e 20 4e 4f 5f 4c  eFileLock > NO_L
10150 4f 43 4b 29 20 7b 0a 20 20 20 20 70 46 69 6c 65  OCK) {.    pFile
10160 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 65 46  ->eFileLock = eF
10170 69 6c 65 4c 6f 63 6b 3b 0a 20 20 20 20 72 63 20  ileLock;.    rc 
10180 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  = SQLITE_OK;.   
10190 20 67 6f 74 6f 20 73 65 6d 5f 65 6e 64 5f 6c 6f   goto sem_end_lo
101a0 63 6b 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20  ck;.  }.  .  /* 
101b0 6c 6f 63 6b 20 73 65 6d 61 70 68 6f 72 65 20 6e  lock semaphore n
101c0 6f 77 20 62 75 74 20 62 61 69 6c 20 6f 75 74 20  ow but bail out 
101d0 77 68 65 6e 20 61 6c 72 65 61 64 79 20 6c 6f 63  when already loc
101e0 6b 65 64 2e 20 2a 2f 0a 20 20 69 66 28 20 73 65  ked. */.  if( se
101f0 6d 5f 74 72 79 77 61 69 74 28 70 53 65 6d 29 3d  m_trywait(pSem)=
10200 3d 2d 31 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  =-1 ){.    rc = 
10210 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20  SQLITE_BUSY;.   
10220 20 67 6f 74 6f 20 73 65 6d 5f 65 6e 64 5f 6c 6f   goto sem_end_lo
10230 63 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 67 6f  ck;.  }..  /* go
10240 74 20 69 74 2c 20 73 65 74 20 74 68 65 20 74 79  t it, set the ty
10250 70 65 20 61 6e 64 20 72 65 74 75 72 6e 20 6f 6b  pe and return ok
10260 20 2a 2f 0a 20 20 70 46 69 6c 65 2d 3e 65 46 69   */.  pFile->eFi
10270 6c 65 4c 6f 63 6b 20 3d 20 65 46 69 6c 65 4c 6f  leLock = eFileLo
10280 63 6b 3b 0a 0a 20 73 65 6d 5f 65 6e 64 5f 6c 6f  ck;.. sem_end_lo
10290 63 6b 3a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  ck:.  return rc;
102a0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 77 65 72 20  .}../*.** Lower 
102b0 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65  the locking leve
102c0 6c 20 6f 6e 20 66 69 6c 65 20 64 65 73 63 72 69  l on file descri
102d0 70 74 6f 72 20 70 46 69 6c 65 20 74 6f 20 65 46  ptor pFile to eF
102e0 69 6c 65 4c 6f 63 6b 2e 20 20 65 46 69 6c 65 4c  ileLock.  eFileL
102f0 6f 63 6b 0a 2a 2a 20 6d 75 73 74 20 62 65 20 65  ock.** must be e
10300 69 74 68 65 72 20 4e 4f 5f 4c 4f 43 4b 20 6f 72  ither NO_LOCK or
10310 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2e 0a 2a 2a   SHARED_LOCK..**
10320 0a 2a 2a 20 49 66 20 74 68 65 20 6c 6f 63 6b 69  .** If the locki
10330 6e 67 20 6c 65 76 65 6c 20 6f 66 20 74 68 65 20  ng level of the 
10340 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
10350 69 73 20 61 6c 72 65 61 64 79 20 61 74 20 6f 72  is already at or
10360 20 62 65 6c 6f 77 0a 2a 2a 20 74 68 65 20 72 65   below.** the re
10370 71 75 65 73 74 65 64 20 6c 6f 63 6b 69 6e 67 20  quested locking 
10380 6c 65 76 65 6c 2c 20 74 68 69 73 20 72 6f 75 74  level, this rout
10390 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a  ine is a no-op..
103a0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 65  */.static int se
103b0 6d 55 6e 6c 6f 63 6b 28 73 71 6c 69 74 65 33 5f  mUnlock(sqlite3_
103c0 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 65 46  file *id, int eF
103d0 69 6c 65 4c 6f 63 6b 29 20 7b 0a 20 20 75 6e 69  ileLock) {.  uni
103e0 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28  xFile *pFile = (
103f0 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20  unixFile*)id;.  
10400 73 65 6d 5f 74 20 2a 70 53 65 6d 20 3d 20 70 46  sem_t *pSem = pF
10410 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e 70 53 65  ile->pInode->pSe
10420 6d 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 46  m;..  assert( pF
10430 69 6c 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ile );.  assert(
10440 20 70 53 65 6d 20 29 3b 0a 20 20 4f 53 54 52 41   pSem );.  OSTRA
10450 43 45 28 28 22 55 4e 4c 4f 43 4b 20 20 25 64 20  CE(("UNLOCK  %d 
10460 25 64 20 77 61 73 20 25 64 20 70 69 64 3d 25 64  %d was %d pid=%d
10470 20 28 73 65 6d 29 5c 6e 22 2c 20 70 46 69 6c 65   (sem)\n", pFile
10480 2d 3e 68 2c 20 65 46 69 6c 65 4c 6f 63 6b 2c 0a  ->h, eFileLock,.
10490 09 20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65  .   pFile->eFile
104a0 4c 6f 63 6b 2c 20 67 65 74 70 69 64 28 29 29 29  Lock, getpid()))
104b0 3b 0a 20 20 61 73 73 65 72 74 28 20 65 46 69 6c  ;.  assert( eFil
104c0 65 4c 6f 63 6b 3c 3d 53 48 41 52 45 44 5f 4c 4f  eLock<=SHARED_LO
104d0 43 4b 20 29 3b 0a 20 20 0a 20 20 2f 2a 20 6e 6f  CK );.  .  /* no
104e0 2d 6f 70 20 69 66 20 70 6f 73 73 69 62 6c 65 20  -op if possible 
104f0 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e  */.  if( pFile->
10500 65 46 69 6c 65 4c 6f 63 6b 3d 3d 65 46 69 6c 65  eFileLock==eFile
10510 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 72 65 74 75  Lock ){.    retu
10520 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
10530 7d 0a 20 20 0a 20 20 2f 2a 20 73 68 61 72 65 64  }.  .  /* shared
10540 20 63 61 6e 20 6a 75 73 74 20 62 65 20 73 65 74   can just be set
10550 20 62 65 63 61 75 73 65 20 77 65 20 61 6c 77 61   because we alwa
10560 79 73 20 68 61 76 65 20 61 6e 20 65 78 63 6c 75  ys have an exclu
10570 73 69 76 65 20 2a 2f 0a 20 20 69 66 20 28 65 46  sive */.  if (eF
10580 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f  ileLock==SHARED_
10590 4c 4f 43 4b 29 20 7b 0a 20 20 20 20 70 46 69 6c  LOCK) {.    pFil
105a0 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 65  e->eFileLock = e
105b0 46 69 6c 65 4c 6f 63 6b 3b 0a 20 20 20 20 72 65  FileLock;.    re
105c0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
105d0 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 6e 6f 2c 20    }.  .  /* no, 
105e0 72 65 61 6c 6c 79 20 75 6e 6c 6f 63 6b 2e 20 2a  really unlock. *
105f0 2f 0a 20 20 69 66 20 28 20 73 65 6d 5f 70 6f 73  /.  if ( sem_pos
10600 74 28 70 53 65 6d 29 3d 3d 2d 31 20 29 20 7b 0a  t(pSem)==-1 ) {.
10610 20 20 20 20 69 6e 74 20 72 63 2c 20 74 45 72 72      int rc, tErr
10620 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20  no = errno;.    
10630 72 63 20 3d 20 73 71 6c 69 74 65 45 72 72 6f 72  rc = sqliteError
10640 46 72 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28 74  FromPosixError(t
10650 45 72 72 6e 6f 2c 20 53 51 4c 49 54 45 5f 49 4f  Errno, SQLITE_IO
10660 45 52 52 5f 55 4e 4c 4f 43 4b 29 3b 0a 20 20 20  ERR_UNLOCK);.   
10670 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52   if( IS_LOCK_ERR
10680 4f 52 28 72 63 29 20 29 7b 0a 20 20 20 20 20 20  OR(rc) ){.      
10690 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f  pFile->lastErrno
106a0 20 3d 20 74 45 72 72 6e 6f 3b 0a 20 20 20 20 7d   = tErrno;.    }
106b0 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 20  .    return rc; 
106c0 0a 20 20 7d 0a 20 20 70 46 69 6c 65 2d 3e 65 46  .  }.  pFile->eF
106d0 69 6c 65 4c 6f 63 6b 20 3d 20 4e 4f 5f 4c 4f 43  ileLock = NO_LOC
106e0 4b 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  K;.  return SQLI
106f0 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2a  TE_OK;.}../*. **
10700 20 43 6c 6f 73 65 20 61 20 66 69 6c 65 2e 0a 20   Close a file.. 
10710 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 65  */.static int se
10720 6d 43 6c 6f 73 65 28 73 71 6c 69 74 65 33 5f 66  mClose(sqlite3_f
10730 69 6c 65 20 2a 69 64 29 20 7b 0a 20 20 69 66 28  ile *id) {.  if(
10740 20 69 64 20 29 7b 0a 20 20 20 20 75 6e 69 78 46   id ){.    unixF
10750 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e  ile *pFile = (un
10760 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 20 20  ixFile*)id;.    
10770 73 65 6d 55 6e 6c 6f 63 6b 28 69 64 2c 20 4e 4f  semUnlock(id, NO
10780 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 61 73 73 65  _LOCK);.    asse
10790 72 74 28 20 70 46 69 6c 65 20 29 3b 0a 20 20 20  rt( pFile );.   
107a0 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28   unixEnterMutex(
107b0 29 3b 0a 20 20 20 20 72 65 6c 65 61 73 65 4c 6f  );.    releaseLo
107c0 63 6b 49 6e 66 6f 28 70 46 69 6c 65 2d 3e 70 49  ckInfo(pFile->pI
107d0 6e 6f 64 65 29 3b 0a 20 20 20 20 75 6e 69 78 4c  node);.    unixL
107e0 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 20 20 20  eaveMutex();.   
107f0 20 63 6c 6f 73 65 55 6e 69 78 46 69 6c 65 28 69   closeUnixFile(i
10800 64 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  d);.  }.  return
10810 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23   SQLITE_OK;.}..#
10820 65 6e 64 69 66 20 2f 2a 20 4f 53 5f 56 58 57 4f  endif /* OS_VXWO
10830 52 4b 53 20 2a 2f 0a 2f 2a 0a 2a 2a 20 4e 61 6d  RKS */./*.** Nam
10840 65 64 20 73 65 6d 61 70 68 6f 72 65 20 6c 6f 63  ed semaphore loc
10850 6b 69 6e 67 20 69 73 20 6f 6e 6c 79 20 61 76 61  king is only ava
10860 69 6c 61 62 6c 65 20 6f 6e 20 56 78 57 6f 72 6b  ilable on VxWork
10870 73 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  s..**.**********
10880 2a 2a 2a 2a 2a 20 45 6e 64 20 6f 66 20 74 68 65  ***** End of the
10890 20 6e 61 6d 65 64 20 73 65 6d 61 70 68 6f 72 65   named semaphore
108a0 20 6c 6f 63 6b 20 69 6d 70 6c 65 6d 65 6e 74 61   lock implementa
108b0 74 69 6f 6e 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  tion ***********
108c0 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  *****.**********
108d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
108e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
108f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10900 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10910 2a 2a 2a 2a 2f 0a 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a  ****/.../*******
10920 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10930 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10940 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10950 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10960 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a  *******.********
10970 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10980 2a 2a 2a 20 42 65 67 69 6e 20 41 46 50 20 4c 6f  *** Begin AFP Lo
10990 63 6b 69 6e 67 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  cking **********
109a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
109b0 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 41 46  *******.**.** AF
109c0 50 20 69 73 20 74 68 65 20 41 70 70 6c 65 20 46  P is the Apple F
109d0 69 6c 69 6e 67 20 50 72 6f 74 6f 63 6f 6c 2e 20  iling Protocol. 
109e0 20 41 46 50 20 69 73 20 61 20 6e 65 74 77 6f 72   AFP is a networ
109f0 6b 20 66 69 6c 65 73 79 73 74 65 6d 20 66 6f 75  k filesystem fou
10a00 6e 64 0a 2a 2a 20 6f 6e 20 41 70 70 6c 65 20 4d  nd.** on Apple M
10a10 61 63 69 6e 74 6f 73 68 20 63 6f 6d 70 75 74 65  acintosh compute
10a20 72 73 20 2d 20 62 6f 74 68 20 4f 53 39 20 61 6e  rs - both OS9 an
10a30 64 20 4f 53 58 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  d OSX..**.** Thi
10a40 72 64 2d 70 61 72 74 79 20 69 6d 70 6c 65 6d 65  rd-party impleme
10a50 6e 74 61 74 69 6f 6e 73 20 6f 66 20 41 46 50 20  ntations of AFP 
10a60 61 72 65 20 61 76 61 69 6c 61 62 6c 65 2e 20 20  are available.  
10a70 42 75 74 20 74 68 69 73 20 63 6f 64 65 20 68 65  But this code he
10a80 72 65 0a 2a 2a 20 6f 6e 6c 79 20 77 6f 72 6b 73  re.** only works
10a90 20 6f 6e 20 4f 53 58 2e 0a 2a 2f 0a 0a 23 69 66   on OSX..*/..#if
10aa0 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45   defined(__APPLE
10ab0 5f 5f 29 20 26 26 20 53 51 4c 49 54 45 5f 45 4e  __) && SQLITE_EN
10ac0 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59  ABLE_LOCKING_STY
10ad0 4c 45 0a 2f 2a 0a 2a 2a 20 54 68 65 20 61 66 70  LE./*.** The afp
10ae0 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 73  LockingContext s
10af0 74 72 75 63 74 75 72 65 20 63 6f 6e 74 61 69 6e  tructure contain
10b00 73 20 61 6c 6c 20 61 66 70 20 6c 6f 63 6b 20 73  s all afp lock s
10b10 70 65 63 69 66 69 63 20 73 74 61 74 65 0a 2a 2f  pecific state.*/
10b20 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20  .typedef struct 
10b30 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78  afpLockingContex
10b40 74 20 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74  t afpLockingCont
10b50 65 78 74 3b 0a 73 74 72 75 63 74 20 61 66 70 4c  ext;.struct afpL
10b60 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 7b 0a  ockingContext {.
10b70 20 20 69 6e 74 20 72 65 73 65 72 76 65 64 3b 0a    int reserved;.
10b80 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 64 62    const char *db
10b90 50 61 74 68 3b 20 20 20 20 20 20 20 20 20 20 20  Path;           
10ba0 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65    /* Name of the
10bb0 20 6f 70 65 6e 20 66 69 6c 65 20 2a 2f 0a 7d 3b   open file */.};
10bc0 0a 0a 73 74 72 75 63 74 20 42 79 74 65 52 61 6e  ..struct ByteRan
10bd0 67 65 4c 6f 63 6b 50 42 32 0a 7b 0a 20 20 75 6e  geLockPB2.{.  un
10be0 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6c 6f 6e 67  signed long long
10bf0 20 6f 66 66 73 65 74 3b 20 20 20 20 20 20 20 20   offset;        
10c00 2f 2a 20 6f 66 66 73 65 74 20 74 6f 20 66 69 72  /* offset to fir
10c10 73 74 20 62 79 74 65 20 74 6f 20 6c 6f 63 6b 20  st byte to lock 
10c20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 6c 6f  */.  unsigned lo
10c30 6e 67 20 6c 6f 6e 67 20 6c 65 6e 67 74 68 3b 20  ng long length; 
10c40 20 20 20 20 20 20 20 2f 2a 20 6e 62 72 20 6f 66         /* nbr of
10c50 20 62 79 74 65 73 20 74 6f 20 6c 6f 63 6b 20 2a   bytes to lock *
10c60 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  /.  unsigned lon
10c70 67 20 6c 6f 6e 67 20 72 65 74 52 61 6e 67 65 53  g long retRangeS
10c80 74 61 72 74 3b 20 2f 2a 20 6e 62 72 20 6f 66 20  tart; /* nbr of 
10c90 31 73 74 20 62 79 74 65 20 6c 6f 63 6b 65 64 20  1st byte locked 
10ca0 69 66 20 73 75 63 63 65 73 73 66 75 6c 20 2a 2f  if successful */
10cb0 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
10cc0 20 75 6e 4c 6f 63 6b 46 6c 61 67 3b 20 20 20 20   unLockFlag;    
10cd0 20 20 20 20 20 2f 2a 20 31 20 3d 20 75 6e 6c 6f       /* 1 = unlo
10ce0 63 6b 2c 20 30 20 3d 20 6c 6f 63 6b 20 2a 2f 0a  ck, 0 = lock */.
10cf0 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
10d00 73 74 61 72 74 45 6e 64 46 6c 61 67 3b 20 20 20  startEndFlag;   
10d10 20 20 20 20 2f 2a 20 31 3d 72 65 6c 20 74 6f 20      /* 1=rel to 
10d20 65 6e 64 20 6f 66 20 66 6f 72 6b 2c 20 30 3d 72  end of fork, 0=r
10d30 65 6c 20 74 6f 20 73 74 61 72 74 20 2a 2f 0a 20  el to start */. 
10d40 20 69 6e 74 20 66 64 3b 20 20 20 20 20 20 20 20   int fd;        
10d50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10d60 20 20 20 2f 2a 20 66 69 6c 65 20 64 65 73 63 20     /* file desc 
10d70 74 6f 20 61 73 73 6f 63 20 74 68 69 73 20 6c 6f  to assoc this lo
10d80 63 6b 20 77 69 74 68 20 2a 2f 0a 7d 3b 0a 0a 23  ck with */.};..#
10d90 64 65 66 69 6e 65 20 61 66 70 66 73 42 79 74 65  define afpfsByte
10da0 52 61 6e 67 65 4c 6f 63 6b 32 46 53 43 54 4c 20  RangeLock2FSCTL 
10db0 20 20 20 20 20 20 20 5f 49 4f 57 52 28 27 7a 27         _IOWR('z'
10dc0 2c 20 32 33 2c 20 73 74 72 75 63 74 20 42 79 74  , 23, struct Byt
10dd0 65 52 61 6e 67 65 4c 6f 63 6b 50 42 32 29 0a 0a  eRangeLockPB2)..
10de0 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 61 20  /*.** This is a 
10df0 75 74 69 6c 69 74 79 20 66 6f 72 20 73 65 74 74  utility for sett
10e00 69 6e 67 20 6f 72 20 63 6c 65 61 72 69 6e 67 20  ing or clearing 
10e10 61 20 62 69 74 2d 72 61 6e 67 65 20 6c 6f 63 6b  a bit-range lock
10e20 20 6f 6e 20 61 6e 0a 2a 2a 20 41 46 50 20 66 69   on an.** AFP fi
10e30 6c 65 73 79 73 74 65 6d 2e 0a 2a 2a 20 0a 2a 2a  lesystem..** .**
10e40 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   Return SQLITE_O
10e50 4b 20 6f 6e 20 73 75 63 63 65 73 73 2c 20 53 51  K on success, SQ
10e60 4c 49 54 45 5f 42 55 53 59 20 6f 6e 20 66 61 69  LITE_BUSY on fai
10e70 6c 75 72 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  lure..*/.static 
10e80 69 6e 74 20 61 66 70 53 65 74 4c 6f 63 6b 28 0a  int afpSetLock(.
10e90 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 70 61    const char *pa
10ea0 74 68 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  th,             
10eb0 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20   /* Name of the 
10ec0 66 69 6c 65 20 74 6f 20 62 65 20 6c 6f 63 6b 65  file to be locke
10ed0 64 20 6f 72 20 75 6e 6c 6f 63 6b 65 64 20 2a 2f  d or unlocked */
10ee0 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69  .  unixFile *pFi
10ef0 6c 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  le,             
10f00 20 20 2f 2a 20 4f 70 65 6e 20 66 69 6c 65 20 64    /* Open file d
10f10 65 73 63 72 69 70 74 6f 72 20 6f 6e 20 70 61 74  escriptor on pat
10f20 68 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20  h */.  unsigned 
10f30 6c 6f 6e 67 20 6c 6f 6e 67 20 6f 66 66 73 65 74  long long offset
10f40 2c 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 62  ,     /* First b
10f50 79 74 65 20 74 6f 20 62 65 20 6c 6f 63 6b 65 64  yte to be locked
10f60 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 6c   */.  unsigned l
10f70 6f 6e 67 20 6c 6f 6e 67 20 6c 65 6e 67 74 68 2c  ong long length,
10f80 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
10f90 66 20 62 79 74 65 73 20 74 6f 20 6c 6f 63 6b 20  f bytes to lock 
10fa0 2a 2f 0a 20 20 69 6e 74 20 73 65 74 4c 6f 63 6b  */.  int setLock
10fb0 46 6c 61 67 20 20 20 20 20 20 20 20 20 20 20 20  Flag            
10fc0 20 20 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 73      /* True to s
10fd0 65 74 20 6c 6f 63 6b 2e 20 20 46 61 6c 73 65 20  et lock.  False 
10fe0 74 6f 20 63 6c 65 61 72 20 6c 6f 63 6b 20 2a 2f  to clear lock */
10ff0 0a 29 7b 0a 20 20 73 74 72 75 63 74 20 42 79 74  .){.  struct Byt
11000 65 52 61 6e 67 65 4c 6f 63 6b 50 42 32 20 70 62  eRangeLockPB2 pb
11010 3b 0a 20 20 69 6e 74 20 65 72 72 3b 0a 20 20 0a  ;.  int err;.  .
11020 20 20 70 62 2e 75 6e 4c 6f 63 6b 46 6c 61 67 20    pb.unLockFlag 
11030 3d 20 73 65 74 4c 6f 63 6b 46 6c 61 67 20 3f 20  = setLockFlag ? 
11040 30 20 3a 20 31 3b 0a 20 20 70 62 2e 73 74 61 72  0 : 1;.  pb.star
11050 74 45 6e 64 46 6c 61 67 20 3d 20 30 3b 0a 20 20  tEndFlag = 0;.  
11060 70 62 2e 6f 66 66 73 65 74 20 3d 20 6f 66 66 73  pb.offset = offs
11070 65 74 3b 0a 20 20 70 62 2e 6c 65 6e 67 74 68 20  et;.  pb.length 
11080 3d 20 6c 65 6e 67 74 68 3b 20 0a 20 20 70 62 2e  = length; .  pb.
11090 66 64 20 3d 20 70 46 69 6c 65 2d 3e 68 3b 0a 20  fd = pFile->h;. 
110a0 20 0a 20 20 4f 53 54 52 41 43 45 28 28 22 41 46   .  OSTRACE(("AF
110b0 50 53 45 54 4c 4f 43 4b 20 5b 25 73 5d 20 66 6f  PSETLOCK [%s] fo
110c0 72 20 25 64 25 73 20 69 6e 20 72 61 6e 67 65 20  r %d%s in range 
110d0 25 6c 6c 78 3a 25 6c 6c 78 5c 6e 22 2c 20 0a 20  %llx:%llx\n", . 
110e0 20 20 20 28 73 65 74 4c 6f 63 6b 46 6c 61 67 3f     (setLockFlag?
110f0 22 4f 4e 22 3a 22 4f 46 46 22 29 2c 20 70 46 69  "ON":"OFF"), pFi
11100 6c 65 2d 3e 68 2c 20 28 70 62 2e 66 64 3d 3d 2d  le->h, (pb.fd==-
11110 31 3f 22 5b 74 65 73 74 76 61 6c 2d 31 5d 22 3a  1?"[testval-1]":
11120 22 22 29 2c 0a 20 20 20 20 6f 66 66 73 65 74 2c  ""),.    offset,
11130 20 6c 65 6e 67 74 68 29 29 3b 0a 20 20 65 72 72   length));.  err
11140 20 3d 20 66 73 63 74 6c 28 70 61 74 68 2c 20 61   = fsctl(path, a
11150 66 70 66 73 42 79 74 65 52 61 6e 67 65 4c 6f 63  fpfsByteRangeLoc
11160 6b 32 46 53 43 54 4c 2c 20 26 70 62 2c 20 30 29  k2FSCTL, &pb, 0)
11170 3b 0a 20 20 69 66 20 28 20 65 72 72 3d 3d 2d 31  ;.  if ( err==-1
11180 20 29 20 7b 0a 20 20 20 20 69 6e 74 20 72 63 3b   ) {.    int rc;
11190 0a 20 20 20 20 69 6e 74 20 74 45 72 72 6e 6f 20  .    int tErrno 
111a0 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 4f 53 54  = errno;.    OST
111b0 52 41 43 45 28 28 22 41 46 50 53 45 54 4c 4f 43  RACE(("AFPSETLOC
111c0 4b 20 66 61 69 6c 65 64 20 74 6f 20 66 73 63 74  K failed to fsct
111d0 6c 28 29 20 27 25 73 27 20 25 64 20 25 73 5c 6e  l() '%s' %d %s\n
111e0 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
111f0 70 61 74 68 2c 20 74 45 72 72 6e 6f 2c 20 73 74  path, tErrno, st
11200 72 65 72 72 6f 72 28 74 45 72 72 6e 6f 29 29 29  rerror(tErrno)))
11210 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ;.#ifdef SQLITE_
11220 49 47 4e 4f 52 45 5f 41 46 50 5f 4c 4f 43 4b 5f  IGNORE_AFP_LOCK_
11230 45 52 52 4f 52 53 0a 20 20 20 20 72 63 20 3d 20  ERRORS.    rc = 
11240 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 23 65 6c  SQLITE_BUSY;.#el
11250 73 65 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  se.    rc = sqli
11260 74 65 45 72 72 6f 72 46 72 6f 6d 50 6f 73 69 78  teErrorFromPosix
11270 45 72 72 6f 72 28 74 45 72 72 6e 6f 2c 0a 20 20  Error(tErrno,.  
11280 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11290 20 20 73 65 74 4c 6f 63 6b 46 6c 61 67 20 3f 20    setLockFlag ? 
112a0 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4c 4f 43  SQLITE_IOERR_LOC
112b0 4b 20 3a 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  K : SQLITE_IOERR
112c0 5f 55 4e 4c 4f 43 4b 29 3b 0a 23 65 6e 64 69 66  _UNLOCK);.#endif
112d0 20 2f 2a 20 53 51 4c 49 54 45 5f 49 47 4e 4f 52   /* SQLITE_IGNOR
112e0 45 5f 41 46 50 5f 4c 4f 43 4b 5f 45 52 52 4f 52  E_AFP_LOCK_ERROR
112f0 53 20 2a 2f 0a 20 20 20 20 69 66 28 20 49 53 5f  S */.    if( IS_
11300 4c 4f 43 4b 5f 45 52 52 4f 52 28 72 63 29 20 29  LOCK_ERROR(rc) )
11310 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c  {.      pFile->l
11320 61 73 74 45 72 72 6e 6f 20 3d 20 74 45 72 72 6e  astErrno = tErrn
11330 6f 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74  o;.    }.    ret
11340 75 72 6e 20 72 63 3b 0a 20 20 7d 20 65 6c 73 65  urn rc;.  } else
11350 20 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51   {.    return SQ
11360 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 7d 0a 0a  LITE_OK;.  }.}..
11370 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
11380 6e 65 20 63 68 65 63 6b 73 20 69 66 20 74 68 65  ne checks if the
11390 72 65 20 69 73 20 61 20 52 45 53 45 52 56 45 44  re is a RESERVED
113a0 20 6c 6f 63 6b 20 68 65 6c 64 20 6f 6e 20 74 68   lock held on th
113b0 65 20 73 70 65 63 69 66 69 65 64 0a 2a 2a 20 66  e specified.** f
113c0 69 6c 65 20 62 79 20 74 68 69 73 20 6f 72 20 61  ile by this or a
113d0 6e 79 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73  ny other process
113e0 2e 20 49 66 20 73 75 63 68 20 61 20 6c 6f 63 6b  . If such a lock
113f0 20 69 73 20 68 65 6c 64 2c 20 73 65 74 20 2a 70   is held, set *p
11400 52 65 73 4f 75 74 0a 2a 2a 20 74 6f 20 61 20 6e  ResOut.** to a n
11410 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75 65 20 6f 74  on-zero value ot
11420 68 65 72 77 69 73 65 20 2a 70 52 65 73 4f 75 74  herwise *pResOut
11430 20 69 73 20 73 65 74 20 74 6f 20 7a 65 72 6f 2e   is set to zero.
11440 20 20 54 68 65 20 72 65 74 75 72 6e 20 76 61 6c    The return val
11450 75 65 0a 2a 2a 20 69 73 20 73 65 74 20 74 6f 20  ue.** is set to 
11460 53 51 4c 49 54 45 5f 4f 4b 20 75 6e 6c 65 73 73  SQLITE_OK unless
11470 20 61 6e 20 49 2f 4f 20 65 72 72 6f 72 20 6f 63   an I/O error oc
11480 63 75 72 73 20 64 75 72 69 6e 67 20 6c 6f 63 6b  curs during lock
11490 20 63 68 65 63 6b 69 6e 67 2e 0a 2a 2f 0a 73 74   checking..*/.st
114a0 61 74 69 63 20 69 6e 74 20 61 66 70 43 68 65 63  atic int afpChec
114b0 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 28 73 71  kReservedLock(sq
114c0 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20  lite3_file *id, 
114d0 69 6e 74 20 2a 70 52 65 73 4f 75 74 29 7b 0a 20  int *pResOut){. 
114e0 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
114f0 5f 4f 4b 3b 0a 20 20 69 6e 74 20 72 65 73 65 72  _OK;.  int reser
11500 76 65 64 20 3d 20 30 3b 0a 20 20 75 6e 69 78 46  ved = 0;.  unixF
11510 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e  ile *pFile = (un
11520 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 0a 20  ixFile*)id;.  . 
11530 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72   SimulateIOError
11540 28 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ( return SQLITE_
11550 49 4f 45 52 52 5f 43 48 45 43 4b 52 45 53 45 52  IOERR_CHECKRESER
11560 56 45 44 4c 4f 43 4b 3b 20 29 3b 0a 20 20 0a 20  VEDLOCK; );.  . 
11570 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 20 29   assert( pFile )
11580 3b 0a 20 20 61 66 70 4c 6f 63 6b 69 6e 67 43 6f  ;.  afpLockingCo
11590 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 20 3d  ntext *context =
115a0 20 28 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74   (afpLockingCont
115b0 65 78 74 20 2a 29 20 70 46 69 6c 65 2d 3e 6c 6f  ext *) pFile->lo
115c0 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 0a 20 20  ckingContext;.  
115d0 69 66 28 20 63 6f 6e 74 65 78 74 2d 3e 72 65 73  if( context->res
115e0 65 72 76 65 64 20 29 7b 0a 20 20 20 20 2a 70 52  erved ){.    *pR
115f0 65 73 4f 75 74 20 3d 20 31 3b 0a 20 20 20 20 72  esOut = 1;.    r
11600 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
11610 0a 20 20 7d 0a 20 20 75 6e 69 78 45 6e 74 65 72  .  }.  unixEnter
11620 4d 75 74 65 78 28 29 3b 20 2f 2a 20 42 65 63 61  Mutex(); /* Beca
11630 75 73 65 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64  use pFile->pInod
11640 65 20 69 73 20 73 68 61 72 65 64 20 61 63 72 6f  e is shared acro
11650 73 73 20 74 68 72 65 61 64 73 20 2a 2f 0a 20 20  ss threads */.  
11660 0a 20 20 2f 2a 20 43 68 65 63 6b 20 69 66 20 61  .  /* Check if a
11670 20 74 68 72 65 61 64 20 69 6e 20 74 68 69 73 20   thread in this 
11680 70 72 6f 63 65 73 73 20 68 6f 6c 64 73 20 73 75  process holds su
11690 63 68 20 61 20 6c 6f 63 6b 20 2a 2f 0a 20 20 69  ch a lock */.  i
116a0 66 28 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65  f( pFile->pInode
116b0 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3e 53 48 41 52  ->eFileLock>SHAR
116c0 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 72  ED_LOCK ){.    r
116d0 65 73 65 72 76 65 64 20 3d 20 31 3b 0a 20 20 7d  eserved = 1;.  }
116e0 0a 20 20 0a 20 20 2f 2a 20 4f 74 68 65 72 77 69  .  .  /* Otherwi
116f0 73 65 20 73 65 65 20 69 66 20 73 6f 6d 65 20 6f  se see if some o
11700 74 68 65 72 20 70 72 6f 63 65 73 73 20 68 6f 6c  ther process hol
11710 64 73 20 69 74 2e 0a 20 20 20 2a 2f 0a 20 20 69  ds it..   */.  i
11720 66 28 20 21 72 65 73 65 72 76 65 64 20 29 7b 0a  f( !reserved ){.
11730 20 20 20 20 2f 2a 20 6c 6f 63 6b 20 74 68 65 20      /* lock the 
11740 52 45 53 45 52 56 45 44 20 62 79 74 65 20 2a 2f  RESERVED byte */
11750 0a 20 20 20 20 69 6e 74 20 6c 72 63 20 3d 20 61  .    int lrc = a
11760 66 70 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65 78  fpSetLock(contex
11770 74 2d 3e 64 62 50 61 74 68 2c 20 70 46 69 6c 65  t->dbPath, pFile
11780 2c 20 52 45 53 45 52 56 45 44 5f 42 59 54 45 2c  , RESERVED_BYTE,
11790 20 31 2c 31 29 3b 20 20 0a 20 20 20 20 69 66 28   1,1);  .    if(
117a0 20 53 51 4c 49 54 45 5f 4f 4b 3d 3d 6c 72 63 20   SQLITE_OK==lrc 
117b0 29 7b 0a 20 20 20 20 20 20 2f 2a 20 69 66 20 77  ){.      /* if w
117c0 65 20 73 75 63 63 65 65 64 65 64 20 69 6e 20 74  e succeeded in t
117d0 61 6b 69 6e 67 20 74 68 65 20 72 65 73 65 72 76  aking the reserv
117e0 65 64 20 6c 6f 63 6b 2c 20 75 6e 6c 6f 63 6b 20  ed lock, unlock 
117f0 69 74 20 74 6f 20 72 65 73 74 6f 72 65 0a 20 20  it to restore.  
11800 20 20 20 20 2a 2a 20 74 68 65 20 6f 72 69 67 69      ** the origi
11810 6e 61 6c 20 73 74 61 74 65 20 2a 2f 0a 20 20 20  nal state */.   
11820 20 20 20 6c 72 63 20 3d 20 61 66 70 53 65 74 4c     lrc = afpSetL
11830 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 64 62 50  ock(context->dbP
11840 61 74 68 2c 20 70 46 69 6c 65 2c 20 52 45 53 45  ath, pFile, RESE
11850 52 56 45 44 5f 42 59 54 45 2c 20 31 2c 20 30 29  RVED_BYTE, 1, 0)
11860 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20  ;.    } else {. 
11870 20 20 20 20 20 2f 2a 20 69 66 20 77 65 20 66 61       /* if we fa
11880 69 6c 65 64 20 74 6f 20 67 65 74 20 74 68 65 20  iled to get the 
11890 6c 6f 63 6b 20 74 68 65 6e 20 73 6f 6d 65 6f 6e  lock then someon
118a0 65 20 65 6c 73 65 20 6d 75 73 74 20 68 61 76 65  e else must have
118b0 20 69 74 20 2a 2f 0a 20 20 20 20 20 20 72 65 73   it */.      res
118c0 65 72 76 65 64 20 3d 20 31 3b 0a 20 20 20 20 7d  erved = 1;.    }
118d0 0a 20 20 20 20 69 66 28 20 49 53 5f 4c 4f 43 4b  .    if( IS_LOCK
118e0 5f 45 52 52 4f 52 28 6c 72 63 29 20 29 7b 0a 20  _ERROR(lrc) ){. 
118f0 20 20 20 20 20 72 63 3d 6c 72 63 3b 0a 20 20 20       rc=lrc;.   
11900 20 7d 0a 20 20 7d 0a 20 20 0a 20 20 75 6e 69 78   }.  }.  .  unix
11910 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 20 20  LeaveMutex();.  
11920 4f 53 54 52 41 43 45 28 28 22 54 45 53 54 20 57  OSTRACE(("TEST W
11930 52 2d 4c 4f 43 4b 20 25 64 20 25 64 20 25 64 20  R-LOCK %d %d %d 
11940 28 61 66 70 29 5c 6e 22 2c 20 70 46 69 6c 65 2d  (afp)\n", pFile-
11950 3e 68 2c 20 72 63 2c 20 72 65 73 65 72 76 65 64  >h, rc, reserved
11960 29 29 3b 0a 20 20 0a 20 20 2a 70 52 65 73 4f 75  ));.  .  *pResOu
11970 74 20 3d 20 72 65 73 65 72 76 65 64 3b 0a 20 20  t = reserved;.  
11980 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
11990 0a 2a 2a 20 4c 6f 63 6b 20 74 68 65 20 66 69 6c  .** Lock the fil
119a0 65 20 77 69 74 68 20 74 68 65 20 6c 6f 63 6b 20  e with the lock 
119b0 73 70 65 63 69 66 69 65 64 20 62 79 20 70 61 72  specified by par
119c0 61 6d 65 74 65 72 20 65 46 69 6c 65 4c 6f 63 6b  ameter eFileLock
119d0 20 2d 20 6f 6e 65 0a 2a 2a 20 6f 66 20 74 68 65   - one.** of the
119e0 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a   following:.**.*
119f0 2a 20 20 20 20 20 28 31 29 20 53 48 41 52 45 44  *     (1) SHARED
11a00 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 32 29  _LOCK.**     (2)
11a10 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 0a 2a   RESERVED_LOCK.*
11a20 2a 20 20 20 20 20 28 33 29 20 50 45 4e 44 49 4e  *     (3) PENDIN
11a30 47 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 34  G_LOCK.**     (4
11a40 29 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b  ) EXCLUSIVE_LOCK
11a50 0a 2a 2a 0a 2a 2a 20 53 6f 6d 65 74 69 6d 65 73  .**.** Sometimes
11a60 20 77 68 65 6e 20 72 65 71 75 65 73 74 69 6e 67   when requesting
11a70 20 6f 6e 65 20 6c 6f 63 6b 20 73 74 61 74 65 2c   one lock state,
11a80 20 61 64 64 69 74 69 6f 6e 61 6c 20 6c 6f 63 6b   additional lock
11a90 20 73 74 61 74 65 73 0a 2a 2a 20 61 72 65 20 69   states.** are i
11aa0 6e 73 65 72 74 65 64 20 69 6e 20 62 65 74 77 65  nserted in betwe
11ab0 65 6e 2e 20 20 54 68 65 20 6c 6f 63 6b 69 6e 67  en.  The locking
11ac0 20 6d 69 67 68 74 20 66 61 69 6c 20 6f 6e 20 6f   might fail on o
11ad0 6e 65 20 6f 66 20 74 68 65 20 6c 61 74 65 72 0a  ne of the later.
11ae0 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e 73 20 6c  ** transitions l
11af0 65 61 76 69 6e 67 20 74 68 65 20 6c 6f 63 6b 20  eaving the lock 
11b00 73 74 61 74 65 20 64 69 66 66 65 72 65 6e 74 20  state different 
11b10 66 72 6f 6d 20 77 68 61 74 20 69 74 20 73 74 61  from what it sta
11b20 72 74 65 64 20 62 75 74 0a 2a 2a 20 73 74 69 6c  rted but.** stil
11b30 6c 20 73 68 6f 72 74 20 6f 66 20 69 74 73 20 67  l short of its g
11b40 6f 61 6c 2e 20 20 54 68 65 20 66 6f 6c 6c 6f 77  oal.  The follow
11b50 69 6e 67 20 63 68 61 72 74 20 73 68 6f 77 73 20  ing chart shows 
11b60 74 68 65 20 61 6c 6c 6f 77 65 64 0a 2a 2a 20 74  the allowed.** t
11b70 72 61 6e 73 69 74 69 6f 6e 73 20 61 6e 64 20 74  ransitions and t
11b80 68 65 20 69 6e 73 65 72 74 65 64 20 69 6e 74 65  he inserted inte
11b90 72 6d 65 64 69 61 74 65 20 73 74 61 74 65 73 3a  rmediate states:
11ba0 0a 2a 2a 0a 2a 2a 20 20 20 20 55 4e 4c 4f 43 4b  .**.**    UNLOCK
11bb0 45 44 20 2d 3e 20 53 48 41 52 45 44 0a 2a 2a 20  ED -> SHARED.** 
11bc0 20 20 20 53 48 41 52 45 44 20 2d 3e 20 52 45 53     SHARED -> RES
11bd0 45 52 56 45 44 0a 2a 2a 20 20 20 20 53 48 41 52  ERVED.**    SHAR
11be0 45 44 20 2d 3e 20 28 50 45 4e 44 49 4e 47 29 20  ED -> (PENDING) 
11bf0 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20  -> EXCLUSIVE.** 
11c00 20 20 20 52 45 53 45 52 56 45 44 20 2d 3e 20 28     RESERVED -> (
11c10 50 45 4e 44 49 4e 47 29 20 2d 3e 20 45 58 43 4c  PENDING) -> EXCL
11c20 55 53 49 56 45 0a 2a 2a 20 20 20 20 50 45 4e 44  USIVE.**    PEND
11c30 49 4e 47 20 2d 3e 20 45 58 43 4c 55 53 49 56 45  ING -> EXCLUSIVE
11c40 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
11c50 69 6e 65 20 77 69 6c 6c 20 6f 6e 6c 79 20 69 6e  ine will only in
11c60 63 72 65 61 73 65 20 61 20 6c 6f 63 6b 2e 20 20  crease a lock.  
11c70 55 73 65 20 74 68 65 20 73 71 6c 69 74 65 33 4f  Use the sqlite3O
11c80 73 55 6e 6c 6f 63 6b 28 29 0a 2a 2a 20 72 6f 75  sUnlock().** rou
11c90 74 69 6e 65 20 74 6f 20 6c 6f 77 65 72 20 61 20  tine to lower a 
11ca0 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 2e 0a 2a  locking level..*
11cb0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 66 70  /.static int afp
11cc0 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c  Lock(sqlite3_fil
11cd0 65 20 2a 69 64 2c 20 69 6e 74 20 65 46 69 6c 65  e *id, int eFile
11ce0 4c 6f 63 6b 29 7b 0a 20 20 69 6e 74 20 72 63 20  Lock){.  int rc 
11cf0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 75  = SQLITE_OK;.  u
11d00 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d  nixFile *pFile =
11d10 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a   (unixFile*)id;.
11d20 20 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20    unixInodeInfo 
11d30 2a 70 49 6e 6f 64 65 20 3d 20 70 46 69 6c 65 2d  *pInode = pFile-
11d40 3e 70 49 6e 6f 64 65 3b 0a 20 20 61 66 70 4c 6f  >pInode;.  afpLo
11d50 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 63 6f  ckingContext *co
11d60 6e 74 65 78 74 20 3d 20 28 61 66 70 4c 6f 63 6b  ntext = (afpLock
11d70 69 6e 67 43 6f 6e 74 65 78 74 20 2a 29 20 70 46  ingContext *) pF
11d80 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74  ile->lockingCont
11d90 65 78 74 3b 0a 20 20 0a 20 20 61 73 73 65 72 74  ext;.  .  assert
11da0 28 20 70 46 69 6c 65 20 29 3b 0a 20 20 4f 53 54  ( pFile );.  OST
11db0 52 41 43 45 28 28 22 4c 4f 43 4b 20 20 20 20 25  RACE(("LOCK    %
11dc0 64 20 25 73 20 77 61 73 20 25 73 28 25 73 2c 25  d %s was %s(%s,%
11dd0 64 29 20 70 69 64 3d 25 64 20 28 61 66 70 29 5c  d) pid=%d (afp)\
11de0 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 0a 20 20  n", pFile->h,.  
11df0 20 20 20 20 20 20 20 20 20 61 7a 46 69 6c 65 4c           azFileL
11e00 6f 63 6b 28 65 46 69 6c 65 4c 6f 63 6b 29 2c 20  ock(eFileLock), 
11e10 61 7a 46 69 6c 65 4c 6f 63 6b 28 70 46 69 6c 65  azFileLock(pFile
11e20 2d 3e 65 46 69 6c 65 4c 6f 63 6b 29 2c 0a 20 20  ->eFileLock),.  
11e30 20 20 20 20 20 20 20 20 20 61 7a 46 69 6c 65 4c           azFileL
11e40 6f 63 6b 28 70 49 6e 6f 64 65 2d 3e 65 46 69 6c  ock(pInode->eFil
11e50 65 4c 6f 63 6b 29 2c 20 70 49 6e 6f 64 65 2d 3e  eLock), pInode->
11e60 6e 53 68 61 72 65 64 20 2c 20 67 65 74 70 69 64  nShared , getpid
11e70 28 29 29 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74  ()));..  /* If t
11e80 68 65 72 65 20 69 73 20 61 6c 72 65 61 64 79 20  here is already 
11e90 61 20 6c 6f 63 6b 20 6f 66 20 74 68 69 73 20 74  a lock of this t
11ea0 79 70 65 20 6f 72 20 6d 6f 72 65 20 72 65 73 74  ype or more rest
11eb0 72 69 63 74 69 76 65 20 6f 6e 20 74 68 65 0a 20  rictive on the. 
11ec0 20 2a 2a 20 75 6e 69 78 46 69 6c 65 2c 20 64 6f   ** unixFile, do
11ed0 20 6e 6f 74 68 69 6e 67 2e 20 44 6f 6e 27 74 20   nothing. Don't 
11ee0 75 73 65 20 74 68 65 20 61 66 70 5f 65 6e 64 5f  use the afp_end_
11ef0 6c 6f 63 6b 3a 20 65 78 69 74 20 70 61 74 68 2c  lock: exit path,
11f00 20 61 73 0a 20 20 2a 2a 20 75 6e 69 78 45 6e 74   as.  ** unixEnt
11f10 65 72 4d 75 74 65 78 28 29 20 68 61 73 6e 27 74  erMutex() hasn't
11f20 20 62 65 65 6e 20 63 61 6c 6c 65 64 20 79 65 74   been called yet
11f30 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 46 69  ..  */.  if( pFi
11f40 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3e 3d 65  le->eFileLock>=e
11f50 46 69 6c 65 4c 6f 63 6b 20 29 7b 0a 20 20 20 20  FileLock ){.    
11f60 4f 53 54 52 41 43 45 28 28 22 4c 4f 43 4b 20 20  OSTRACE(("LOCK  
11f70 20 20 25 64 20 25 73 20 6f 6b 20 28 61 6c 72 65    %d %s ok (alre
11f80 61 64 79 20 68 65 6c 64 29 20 28 61 66 70 29 5c  ady held) (afp)\
11f90 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 0a 20 20  n", pFile->h,.  
11fa0 20 20 20 20 20 20 20 20 20 61 7a 46 69 6c 65 4c           azFileL
11fb0 6f 63 6b 28 65 46 69 6c 65 4c 6f 63 6b 29 29 29  ock(eFileLock)))
11fc0 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
11fd0 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 2f  ITE_OK;.  }..  /
11fe0 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20  * Make sure the 
11ff0 6c 6f 63 6b 69 6e 67 20 73 65 71 75 65 6e 63 65  locking sequence
12000 20 69 73 20 63 6f 72 72 65 63 74 0a 20 20 2a 2a   is correct.  **
12010 20 20 28 31 29 20 57 65 20 6e 65 76 65 72 20 6d    (1) We never m
12020 6f 76 65 20 66 72 6f 6d 20 75 6e 6c 6f 63 6b 65  ove from unlocke
12030 64 20 74 6f 20 61 6e 79 74 68 69 6e 67 20 68 69  d to anything hi
12040 67 68 65 72 20 74 68 61 6e 20 73 68 61 72 65 64  gher than shared
12050 20 6c 6f 63 6b 2e 0a 20 20 2a 2a 20 20 28 32 29   lock..  **  (2)
12060 20 53 51 4c 69 74 65 20 6e 65 76 65 72 20 65 78   SQLite never ex
12070 70 6c 69 63 69 74 6c 79 20 72 65 71 75 65 73 74  plicitly request
12080 73 20 61 20 70 65 6e 64 69 67 20 6c 6f 63 6b 2e  s a pendig lock.
12090 0a 20 20 2a 2a 20 20 28 33 29 20 41 20 73 68 61  .  **  (3) A sha
120a0 72 65 64 20 6c 6f 63 6b 20 69 73 20 61 6c 77 61  red lock is alwa
120b0 79 73 20 68 65 6c 64 20 77 68 65 6e 20 61 20 72  ys held when a r
120c0 65 73 65 72 76 65 20 6c 6f 63 6b 20 69 73 20 72  eserve lock is r
120d0 65 71 75 65 73 74 65 64 2e 0a 20 20 2a 2f 0a 20  equested..  */. 
120e0 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 2d 3e   assert( pFile->
120f0 65 46 69 6c 65 4c 6f 63 6b 21 3d 4e 4f 5f 4c 4f  eFileLock!=NO_LO
12100 43 4b 20 7c 7c 20 65 46 69 6c 65 4c 6f 63 6b 3d  CK || eFileLock=
12110 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a  =SHARED_LOCK );.
12120 20 20 61 73 73 65 72 74 28 20 65 46 69 6c 65 4c    assert( eFileL
12130 6f 63 6b 21 3d 50 45 4e 44 49 4e 47 5f 4c 4f 43  ock!=PENDING_LOC
12140 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 65  K );.  assert( e
12150 46 69 6c 65 4c 6f 63 6b 21 3d 52 45 53 45 52 56  FileLock!=RESERV
12160 45 44 5f 4c 4f 43 4b 20 7c 7c 20 70 46 69 6c 65  ED_LOCK || pFile
12170 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41  ->eFileLock==SHA
12180 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 0a 20  RED_LOCK );.  . 
12190 20 2f 2a 20 54 68 69 73 20 6d 75 74 65 78 20 69   /* This mutex i
121a0 73 20 6e 65 65 64 65 64 20 62 65 63 61 75 73 65  s needed because
121b0 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 20 69   pFile->pInode i
121c0 73 20 73 68 61 72 65 64 20 61 63 72 6f 73 73 20  s shared across 
121d0 74 68 72 65 61 64 73 0a 20 20 2a 2f 0a 20 20 75  threads.  */.  u
121e0 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29 3b  nixEnterMutex();
121f0 0a 20 20 70 49 6e 6f 64 65 20 3d 20 70 46 69 6c  .  pInode = pFil
12200 65 2d 3e 70 49 6e 6f 64 65 3b 0a 0a 20 20 2f 2a  e->pInode;..  /*
12210 20 49 66 20 73 6f 6d 65 20 74 68 72 65 61 64 20   If some thread 
12220 75 73 69 6e 67 20 74 68 69 73 20 50 49 44 20 68  using this PID h
12230 61 73 20 61 20 6c 6f 63 6b 20 76 69 61 20 61 20  as a lock via a 
12240 64 69 66 66 65 72 65 6e 74 20 75 6e 69 78 46 69  different unixFi
12250 6c 65 2a 0a 20 20 2a 2a 20 68 61 6e 64 6c 65 20  le*.  ** handle 
12260 74 68 61 74 20 70 72 65 63 6c 75 64 65 73 20 74  that precludes t
12270 68 65 20 72 65 71 75 65 73 74 65 64 20 6c 6f 63  he requested loc
12280 6b 2c 20 72 65 74 75 72 6e 20 42 55 53 59 2e 0a  k, return BUSY..
12290 20 20 2a 2f 0a 20 20 69 66 28 20 28 70 46 69 6c    */.  if( (pFil
122a0 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 21 3d 70 49  e->eFileLock!=pI
122b0 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20  node->eFileLock 
122c0 26 26 20 0a 20 20 20 20 20 20 20 28 70 49 6e 6f  && .       (pIno
122d0 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3e 3d 50  de->eFileLock>=P
122e0 45 4e 44 49 4e 47 5f 4c 4f 43 4b 20 7c 7c 20 65  ENDING_LOCK || e
122f0 46 69 6c 65 4c 6f 63 6b 3e 53 48 41 52 45 44 5f  FileLock>SHARED_
12300 4c 4f 43 4b 29 29 0a 20 20 20 20 20 29 7b 0a 20  LOCK)).     ){. 
12310 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42     rc = SQLITE_B
12320 55 53 59 3b 0a 20 20 20 20 67 6f 74 6f 20 61 66  USY;.    goto af
12330 70 5f 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 7d 0a  p_end_lock;.  }.
12340 20 20 0a 20 20 2f 2a 20 49 66 20 61 20 53 48 41    .  /* If a SHA
12350 52 45 44 20 6c 6f 63 6b 20 69 73 20 72 65 71 75  RED lock is requ
12360 65 73 74 65 64 2c 20 61 6e 64 20 73 6f 6d 65 20  ested, and some 
12370 74 68 72 65 61 64 20 75 73 69 6e 67 20 74 68 69  thread using thi
12380 73 20 50 49 44 20 61 6c 72 65 61 64 79 0a 20 20  s PID already.  
12390 2a 2a 20 68 61 73 20 61 20 53 48 41 52 45 44 20  ** has a SHARED 
123a0 6f 72 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b  or RESERVED lock
123b0 2c 20 74 68 65 6e 20 69 6e 63 72 65 6d 65 6e 74  , then increment
123c0 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74   reference count
123d0 73 20 61 6e 64 0a 20 20 2a 2a 20 72 65 74 75 72  s and.  ** retur
123e0 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 20 20 2a  n SQLITE_OK..  *
123f0 2f 0a 20 20 69 66 28 20 65 46 69 6c 65 4c 6f 63  /.  if( eFileLoc
12400 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 26  k==SHARED_LOCK &
12410 26 20 0a 20 20 20 20 20 28 70 49 6e 6f 64 65 2d  & .     (pInode-
12420 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52  >eFileLock==SHAR
12430 45 44 5f 4c 4f 43 4b 20 7c 7c 20 70 49 6e 6f 64  ED_LOCK || pInod
12440 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d 52 45  e->eFileLock==RE
12450 53 45 52 56 45 44 5f 4c 4f 43 4b 29 20 29 7b 0a  SERVED_LOCK) ){.
12460 20 20 20 20 61 73 73 65 72 74 28 20 65 46 69 6c      assert( eFil
12470 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f  eLock==SHARED_LO
12480 43 4b 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  CK );.    assert
12490 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f  ( pFile->eFileLo
124a0 63 6b 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73  ck==0 );.    ass
124b0 65 72 74 28 20 70 49 6e 6f 64 65 2d 3e 6e 53 68  ert( pInode->nSh
124c0 61 72 65 64 3e 30 20 29 3b 0a 20 20 20 20 70 46  ared>0 );.    pF
124d0 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d  ile->eFileLock =
124e0 20 53 48 41 52 45 44 5f 4c 4f 43 4b 3b 0a 20 20   SHARED_LOCK;.  
124f0 20 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65    pInode->nShare
12500 64 2b 2b 3b 0a 20 20 20 20 70 49 6e 6f 64 65 2d  d++;.    pInode-
12510 3e 6e 4c 6f 63 6b 2b 2b 3b 0a 20 20 20 20 67 6f  >nLock++;.    go
12520 74 6f 20 61 66 70 5f 65 6e 64 5f 6c 6f 63 6b 3b  to afp_end_lock;
12530 0a 20 20 7d 0a 20 20 20 20 0a 20 20 2f 2a 20 41  .  }.    .  /* A
12540 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 20 69 73   PENDING lock is
12550 20 6e 65 65 64 65 64 20 62 65 66 6f 72 65 20 61   needed before a
12560 63 71 75 69 72 69 6e 67 20 61 20 53 48 41 52 45  cquiring a SHARE
12570 44 20 6c 6f 63 6b 20 61 6e 64 20 62 65 66 6f 72  D lock and befor
12580 65 0a 20 20 2a 2a 20 61 63 71 75 69 72 69 6e 67  e.  ** acquiring
12590 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f   an EXCLUSIVE lo
125a0 63 6b 2e 20 20 46 6f 72 20 74 68 65 20 53 48 41  ck.  For the SHA
125b0 52 45 44 20 6c 6f 63 6b 2c 20 74 68 65 20 50 45  RED lock, the PE
125c0 4e 44 49 4e 47 20 77 69 6c 6c 0a 20 20 2a 2a 20  NDING will.  ** 
125d0 62 65 20 72 65 6c 65 61 73 65 64 2e 0a 20 20 2a  be released..  *
125e0 2f 0a 20 20 69 66 28 20 65 46 69 6c 65 4c 6f 63  /.  if( eFileLoc
125f0 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 0a  k==SHARED_LOCK .
12600 20 20 20 20 20 20 7c 7c 20 28 65 46 69 6c 65 4c        || (eFileL
12610 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c  ock==EXCLUSIVE_L
12620 4f 43 4b 20 26 26 20 70 46 69 6c 65 2d 3e 65 46  OCK && pFile->eF
12630 69 6c 65 4c 6f 63 6b 3c 50 45 4e 44 49 4e 47 5f  ileLock<PENDING_
12640 4c 4f 43 4b 29 0a 20 20 29 7b 0a 20 20 20 20 69  LOCK).  ){.    i
12650 6e 74 20 66 61 69 6c 65 64 3b 0a 20 20 20 20 66  nt failed;.    f
12660 61 69 6c 65 64 20 3d 20 61 66 70 53 65 74 4c 6f  ailed = afpSetLo
12670 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 64 62 50 61  ck(context->dbPa
12680 74 68 2c 20 70 46 69 6c 65 2c 20 50 45 4e 44 49  th, pFile, PENDI
12690 4e 47 5f 42 59 54 45 2c 20 31 2c 20 31 29 3b 0a  NG_BYTE, 1, 1);.
126a0 20 20 20 20 69 66 20 28 66 61 69 6c 65 64 29 20      if (failed) 
126b0 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 66 61 69  {.      rc = fai
126c0 6c 65 64 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20  led;.      goto 
126d0 61 66 70 5f 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20  afp_end_lock;.  
126e0 20 20 7d 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20    }.  }.  .  /* 
126f0 49 66 20 63 6f 6e 74 72 6f 6c 20 67 65 74 73 20  If control gets 
12700 74 6f 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 74  to this point, t
12710 68 65 6e 20 61 63 74 75 61 6c 6c 79 20 67 6f 20  hen actually go 
12720 61 68 65 61 64 20 61 6e 64 20 6d 61 6b 65 0a 20  ahead and make. 
12730 20 2a 2a 20 6f 70 65 72 61 74 69 6e 67 20 73 79   ** operating sy
12740 73 74 65 6d 20 63 61 6c 6c 73 20 66 6f 72 20 74  stem calls for t
12750 68 65 20 73 70 65 63 69 66 69 65 64 20 6c 6f 63  he specified loc
12760 6b 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65 46  k..  */.  if( eF
12770 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f  ileLock==SHARED_
12780 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 69 6e 74 20  LOCK ){.    int 
12790 6c 72 63 31 2c 20 6c 72 63 32 2c 20 6c 72 63 31  lrc1, lrc2, lrc1
127a0 45 72 72 6e 6f 3b 0a 20 20 20 20 6c 6f 6e 67 20  Errno;.    long 
127b0 6c 6b 2c 20 6d 61 73 6b 3b 0a 20 20 20 20 0a 20  lk, mask;.    . 
127c0 20 20 20 61 73 73 65 72 74 28 20 70 49 6e 6f 64     assert( pInod
127d0 65 2d 3e 6e 53 68 61 72 65 64 3d 3d 30 20 29 3b  e->nShared==0 );
127e0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 49 6e  .    assert( pIn
127f0 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d  ode->eFileLock==
12800 30 20 29 3b 0a 20 20 20 20 20 20 20 20 0a 20 20  0 );.        .  
12810 20 20 6d 61 73 6b 20 3d 20 28 73 69 7a 65 6f 66    mask = (sizeof
12820 28 6c 6f 6e 67 29 3d 3d 38 29 20 3f 20 4c 41 52  (long)==8) ? LAR
12830 47 45 53 54 5f 49 4e 54 36 34 20 3a 20 30 78 37  GEST_INT64 : 0x7
12840 66 66 66 66 66 66 66 3b 0a 20 20 20 20 2f 2a 20  fffffff;.    /* 
12850 4e 6f 77 20 67 65 74 20 74 68 65 20 72 65 61 64  Now get the read
12860 2d 6c 6f 63 6b 20 53 48 41 52 45 44 5f 4c 4f 43  -lock SHARED_LOC
12870 4b 20 2a 2f 0a 20 20 20 20 2f 2a 20 6e 6f 74 65  K */.    /* note
12880 20 74 68 61 74 20 74 68 65 20 71 75 61 6c 69 74   that the qualit
12890 79 20 6f 66 20 74 68 65 20 72 61 6e 64 6f 6d 6e  y of the randomn
128a0 65 73 73 20 64 6f 65 73 6e 27 74 20 6d 61 74 74  ess doesn't matt
128b0 65 72 20 74 68 61 74 20 6d 75 63 68 20 2a 2f 0a  er that much */.
128c0 20 20 20 20 6c 6b 20 3d 20 72 61 6e 64 6f 6d 28      lk = random(
128d0 29 3b 20 0a 20 20 20 20 70 49 6e 6f 64 65 2d 3e  ); .    pInode->
128e0 73 68 61 72 65 64 42 79 74 65 20 3d 20 28 6c 6b  sharedByte = (lk
128f0 20 26 20 6d 61 73 6b 29 25 28 53 48 41 52 45 44   & mask)%(SHARED
12900 5f 53 49 5a 45 20 2d 20 31 29 3b 0a 20 20 20 20  _SIZE - 1);.    
12910 6c 72 63 31 20 3d 20 61 66 70 53 65 74 4c 6f 63  lrc1 = afpSetLoc
12920 6b 28 63 6f 6e 74 65 78 74 2d 3e 64 62 50 61 74  k(context->dbPat
12930 68 2c 20 70 46 69 6c 65 2c 20 0a 20 20 20 20 20  h, pFile, .     
12940 20 20 20 20 20 53 48 41 52 45 44 5f 46 49 52 53       SHARED_FIRS
12950 54 2b 70 49 6e 6f 64 65 2d 3e 73 68 61 72 65 64  T+pInode->shared
12960 42 79 74 65 2c 20 31 2c 20 31 29 3b 0a 20 20 20  Byte, 1, 1);.   
12970 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52   if( IS_LOCK_ERR
12980 4f 52 28 6c 72 63 31 29 20 29 7b 0a 20 20 20 20  OR(lrc1) ){.    
12990 20 20 6c 72 63 31 45 72 72 6e 6f 20 3d 20 70 46    lrc1Errno = pF
129a0 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 3b 0a  ile->lastErrno;.
129b0 20 20 20 20 7d 0a 20 20 20 20 2f 2a 20 44 72 6f      }.    /* Dro
129c0 70 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20  p the temporary 
129d0 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 20 2a 2f 0a  PENDING lock */.
129e0 20 20 20 20 6c 72 63 32 20 3d 20 61 66 70 53 65      lrc2 = afpSe
129f0 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 64  tLock(context->d
12a00 62 50 61 74 68 2c 20 70 46 69 6c 65 2c 20 50 45  bPath, pFile, PE
12a10 4e 44 49 4e 47 5f 42 59 54 45 2c 20 31 2c 20 30  NDING_BYTE, 1, 0
12a20 29 3b 0a 20 20 20 20 0a 20 20 20 20 69 66 28 20  );.    .    if( 
12a30 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 6c 72  IS_LOCK_ERROR(lr
12a40 63 31 29 20 29 20 7b 0a 20 20 20 20 20 20 70 46  c1) ) {.      pF
12a50 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d  ile->lastErrno =
12a60 20 6c 72 63 31 45 72 72 6e 6f 3b 0a 20 20 20 20   lrc1Errno;.    
12a70 20 20 72 63 20 3d 20 6c 72 63 31 3b 0a 20 20 20    rc = lrc1;.   
12a80 20 20 20 67 6f 74 6f 20 61 66 70 5f 65 6e 64 5f     goto afp_end_
12a90 6c 6f 63 6b 3b 0a 20 20 20 20 7d 20 65 6c 73 65  lock;.    } else
12aa0 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52   if( IS_LOCK_ERR
12ab0 4f 52 28 6c 72 63 32 29 20 29 7b 0a 20 20 20 20  OR(lrc2) ){.    
12ac0 20 20 72 63 20 3d 20 6c 72 63 32 3b 0a 20 20 20    rc = lrc2;.   
12ad0 20 20 20 67 6f 74 6f 20 61 66 70 5f 65 6e 64 5f     goto afp_end_
12ae0 6c 6f 63 6b 3b 0a 20 20 20 20 7d 20 65 6c 73 65  lock;.    } else
12af0 20 69 66 28 20 6c 72 63 31 20 21 3d 20 53 51 4c   if( lrc1 != SQL
12b00 49 54 45 5f 4f 4b 20 29 20 7b 0a 20 20 20 20 20  ITE_OK ) {.     
12b10 20 72 63 20 3d 20 6c 72 63 31 3b 0a 20 20 20 20   rc = lrc1;.    
12b20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 70  } else {.      p
12b30 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20  File->eFileLock 
12b40 3d 20 53 48 41 52 45 44 5f 4c 4f 43 4b 3b 0a 20  = SHARED_LOCK;. 
12b50 20 20 20 20 20 70 49 6e 6f 64 65 2d 3e 6e 4c 6f       pInode->nLo
12b60 63 6b 2b 2b 3b 0a 20 20 20 20 20 20 70 49 6e 6f  ck++;.      pIno
12b70 64 65 2d 3e 6e 53 68 61 72 65 64 20 3d 20 31 3b  de->nShared = 1;
12b80 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69  .    }.  }else i
12b90 66 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 45 58  f( eFileLock==EX
12ba0 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 26 26 20  CLUSIVE_LOCK && 
12bb0 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64 3e  pInode->nShared>
12bc0 31 20 29 7b 0a 20 20 20 20 2f 2a 20 57 65 20 61  1 ){.    /* We a
12bd0 72 65 20 74 72 79 69 6e 67 20 66 6f 72 20 61 6e  re trying for an
12be0 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20   exclusive lock 
12bf0 62 75 74 20 61 6e 6f 74 68 65 72 20 74 68 72 65  but another thre
12c00 61 64 20 69 6e 20 74 68 69 73 0a 20 20 20 20 20  ad in this.     
12c10 2a 2a 20 73 61 6d 65 20 70 72 6f 63 65 73 73 20  ** same process 
12c20 69 73 20 73 74 69 6c 6c 20 68 6f 6c 64 69 6e 67  is still holding
12c30 20 61 20 73 68 61 72 65 64 20 6c 6f 63 6b 2e 20   a shared lock. 
12c40 2a 2f 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  */.    rc = SQLI
12c50 54 45 5f 42 55 53 59 3b 0a 20 20 7d 65 6c 73 65  TE_BUSY;.  }else
12c60 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 72 65 71  {.    /* The req
12c70 75 65 73 74 20 77 61 73 20 66 6f 72 20 61 20 52  uest was for a R
12c80 45 53 45 52 56 45 44 20 6f 72 20 45 58 43 4c 55  ESERVED or EXCLU
12c90 53 49 56 45 20 6c 6f 63 6b 2e 20 20 49 74 20 69  SIVE lock.  It i
12ca0 73 0a 20 20 20 20 2a 2a 20 61 73 73 75 6d 65 64  s.    ** assumed
12cb0 20 74 68 61 74 20 74 68 65 72 65 20 69 73 20 61   that there is a
12cc0 20 53 48 41 52 45 44 20 6f 72 20 67 72 65 61 74   SHARED or great
12cd0 65 72 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 66  er lock on the f
12ce0 69 6c 65 0a 20 20 20 20 2a 2a 20 61 6c 72 65 61  ile.    ** alrea
12cf0 64 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  dy..    */.    i
12d00 6e 74 20 66 61 69 6c 65 64 20 3d 20 30 3b 0a 20  nt failed = 0;. 
12d10 20 20 20 61 73 73 65 72 74 28 20 30 21 3d 70 46     assert( 0!=pF
12d20 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 29  ile->eFileLock )
12d30 3b 0a 20 20 20 20 69 66 20 28 65 46 69 6c 65 4c  ;.    if (eFileL
12d40 6f 63 6b 20 3e 3d 20 52 45 53 45 52 56 45 44 5f  ock >= RESERVED_
12d50 4c 4f 43 4b 20 26 26 20 70 46 69 6c 65 2d 3e 65  LOCK && pFile->e
12d60 46 69 6c 65 4c 6f 63 6b 20 3c 20 52 45 53 45 52  FileLock < RESER
12d70 56 45 44 5f 4c 4f 43 4b 29 20 7b 0a 20 20 20 20  VED_LOCK) {.    
12d80 20 20 20 20 2f 2a 20 41 63 71 75 69 72 65 20 61      /* Acquire a
12d90 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 2a   RESERVED lock *
12da0 2f 0a 20 20 20 20 20 20 20 20 66 61 69 6c 65 64  /.        failed
12db0 20 3d 20 61 66 70 53 65 74 4c 6f 63 6b 28 63 6f   = afpSetLock(co
12dc0 6e 74 65 78 74 2d 3e 64 62 50 61 74 68 2c 20 70  ntext->dbPath, p
12dd0 46 69 6c 65 2c 20 52 45 53 45 52 56 45 44 5f 42  File, RESERVED_B
12de0 59 54 45 2c 20 31 2c 31 29 3b 0a 20 20 20 20 20  YTE, 1,1);.     
12df0 20 69 66 28 20 21 66 61 69 6c 65 64 20 29 7b 0a   if( !failed ){.
12e00 20 20 20 20 20 20 20 20 63 6f 6e 74 65 78 74 2d          context-
12e10 3e 72 65 73 65 72 76 65 64 20 3d 20 31 3b 0a 20  >reserved = 1;. 
12e20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
12e30 20 69 66 20 28 21 66 61 69 6c 65 64 20 26 26 20   if (!failed && 
12e40 65 46 69 6c 65 4c 6f 63 6b 20 3d 3d 20 45 58 43  eFileLock == EXC
12e50 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 20 7b 0a 20  LUSIVE_LOCK) {. 
12e60 20 20 20 20 20 2f 2a 20 41 63 71 75 69 72 65 20       /* Acquire 
12e70 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63  an EXCLUSIVE loc
12e80 6b 20 2a 2f 0a 20 20 20 20 20 20 20 20 0a 20 20  k */.        .  
12e90 20 20 20 20 2f 2a 20 52 65 6d 6f 76 65 20 74 68      /* Remove th
12ea0 65 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 62 65  e shared lock be
12eb0 66 6f 72 65 20 74 72 79 69 6e 67 20 74 68 65 20  fore trying the 
12ec0 72 61 6e 67 65 2e 20 20 77 65 27 6c 6c 20 6e 65  range.  we'll ne
12ed0 65 64 20 74 6f 20 0a 20 20 20 20 20 20 2a 2a 20  ed to .      ** 
12ee0 72 65 65 73 74 61 62 6c 69 73 68 20 74 68 65 20  reestablish the 
12ef0 73 68 61 72 65 64 20 6c 6f 63 6b 20 69 66 20 77  shared lock if w
12f00 65 20 63 61 6e 27 74 20 67 65 74 20 74 68 65 20  e can't get the 
12f10 20 61 66 70 55 6e 6c 6f 63 6b 0a 20 20 20 20 20   afpUnlock.     
12f20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 21 28   */.      if( !(
12f30 66 61 69 6c 65 64 20 3d 20 61 66 70 53 65 74 4c  failed = afpSetL
12f40 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 64 62 50  ock(context->dbP
12f50 61 74 68 2c 20 70 46 69 6c 65 2c 20 53 48 41 52  ath, pFile, SHAR
12f60 45 44 5f 46 49 52 53 54 20 2b 0a 20 20 20 20 20  ED_FIRST +.     
12f70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12f80 20 20 20 20 70 49 6e 6f 64 65 2d 3e 73 68 61 72      pInode->shar
12f90 65 64 42 79 74 65 2c 20 31 2c 20 30 29 29 20 29  edByte, 1, 0)) )
12fa0 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 66 61  {.        int fa
12fb0 69 6c 65 64 32 20 3d 20 53 51 4c 49 54 45 5f 4f  iled2 = SQLITE_O
12fc0 4b 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20 6e 6f  K;.        /* no
12fd0 77 20 61 74 74 65 6d 6d 70 74 20 74 6f 20 67 65  w attemmpt to ge
12fe0 74 20 74 68 65 20 65 78 63 6c 75 73 69 76 65 20  t the exclusive 
12ff0 6c 6f 63 6b 20 72 61 6e 67 65 20 2a 2f 0a 20 20  lock range */.  
13000 20 20 20 20 20 20 66 61 69 6c 65 64 20 3d 20 61        failed = a
13010 66 70 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65 78  fpSetLock(contex
13020 74 2d 3e 64 62 50 61 74 68 2c 20 70 46 69 6c 65  t->dbPath, pFile
13030 2c 20 53 48 41 52 45 44 5f 46 49 52 53 54 2c 20  , SHARED_FIRST, 
13040 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
13050 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13060 53 48 41 52 45 44 5f 53 49 5a 45 2c 20 31 29 3b  SHARED_SIZE, 1);
13070 0a 20 20 20 20 20 20 20 20 69 66 28 20 66 61 69  .        if( fai
13080 6c 65 64 20 26 26 20 28 66 61 69 6c 65 64 32 20  led && (failed2 
13090 3d 20 61 66 70 53 65 74 4c 6f 63 6b 28 63 6f 6e  = afpSetLock(con
130a0 74 65 78 74 2d 3e 64 62 50 61 74 68 2c 20 70 46  text->dbPath, pF
130b0 69 6c 65 2c 20 0a 20 20 20 20 20 20 20 20 20 20  ile, .          
130c0 20 20 20 20 20 20 20 20 20 20 20 20 20 53 48 41               SHA
130d0 52 45 44 5f 46 49 52 53 54 20 2b 20 70 49 6e 6f  RED_FIRST + pIno
130e0 64 65 2d 3e 73 68 61 72 65 64 42 79 74 65 2c 20  de->sharedByte, 
130f0 31 2c 20 31 29 29 20 29 7b 0a 20 20 20 20 20 20  1, 1)) ){.      
13100 20 20 20 20 2f 2a 20 43 61 6e 27 74 20 72 65 65      /* Can't ree
13110 73 74 61 62 6c 69 73 68 20 74 68 65 20 73 68 61  stablish the sha
13120 72 65 64 20 6c 6f 63 6b 2e 20 20 53 71 6c 69 74  red lock.  Sqlit
13130 65 20 63 61 6e 27 74 20 64 65 61 6c 2c 20 74 68  e can't deal, th
13140 69 73 20 69 73 0a 20 20 20 20 20 20 20 20 20 20  is is.          
13150 2a 2a 20 61 20 63 72 69 74 69 63 61 6c 20 49 2f  ** a critical I/
13160 4f 20 65 72 72 6f 72 0a 20 20 20 20 20 20 20 20  O error.        
13170 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 72    */.          r
13180 63 20 3d 20 28 28 66 61 69 6c 65 64 20 26 20 53  c = ((failed & S
13190 51 4c 49 54 45 5f 49 4f 45 52 52 29 20 3d 3d 20  QLITE_IOERR) == 
131a0 53 51 4c 49 54 45 5f 49 4f 45 52 52 29 20 3f 20  SQLITE_IOERR) ? 
131b0 66 61 69 6c 65 64 32 20 3a 20 0a 20 20 20 20 20  failed2 : .     
131c0 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45            SQLITE
131d0 5f 49 4f 45 52 52 5f 4c 4f 43 4b 3b 0a 20 20 20  _IOERR_LOCK;.   
131e0 20 20 20 20 20 20 20 67 6f 74 6f 20 61 66 70 5f         goto afp_
131f0 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 20 20 20 20  end_lock;.      
13200 20 20 7d 20 0a 20 20 20 20 20 20 7d 65 6c 73 65    } .      }else
13210 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 66  {.        rc = f
13220 61 69 6c 65 64 3b 20 0a 20 20 20 20 20 20 7d 0a  ailed; .      }.
13230 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 66 61      }.    if( fa
13240 69 6c 65 64 20 29 7b 0a 20 20 20 20 20 20 72 63  iled ){.      rc
13250 20 3d 20 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d   = failed;.    }
13260 0a 20 20 7d 0a 20 20 0a 20 20 69 66 28 20 72 63  .  }.  .  if( rc
13270 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
13280 20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c     pFile->eFileL
13290 6f 63 6b 20 3d 20 65 46 69 6c 65 4c 6f 63 6b 3b  ock = eFileLock;
132a0 0a 20 20 20 20 70 49 6e 6f 64 65 2d 3e 65 46 69  .    pInode->eFi
132b0 6c 65 4c 6f 63 6b 20 3d 20 65 46 69 6c 65 4c 6f  leLock = eFileLo
132c0 63 6b 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  ck;.  }else if( 
132d0 65 46 69 6c 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55  eFileLock==EXCLU
132e0 53 49 56 45 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20  SIVE_LOCK ){.   
132f0 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63   pFile->eFileLoc
13300 6b 20 3d 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b  k = PENDING_LOCK
13310 3b 0a 20 20 20 20 70 49 6e 6f 64 65 2d 3e 65 46  ;.    pInode->eF
13320 69 6c 65 4c 6f 63 6b 20 3d 20 50 45 4e 44 49 4e  ileLock = PENDIN
13330 47 5f 4c 4f 43 4b 3b 0a 20 20 7d 0a 20 20 0a 61  G_LOCK;.  }.  .a
13340 66 70 5f 65 6e 64 5f 6c 6f 63 6b 3a 0a 20 20 75  fp_end_lock:.  u
13350 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b  nixLeaveMutex();
13360 0a 20 20 4f 53 54 52 41 43 45 28 28 22 4c 4f 43  .  OSTRACE(("LOC
13370 4b 20 20 20 20 25 64 20 25 73 20 25 73 20 28 61  K    %d %s %s (a
13380 66 70 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68  fp)\n", pFile->h
13390 2c 20 61 7a 46 69 6c 65 4c 6f 63 6b 28 65 46 69  , azFileLock(eFi
133a0 6c 65 4c 6f 63 6b 29 2c 20 0a 20 20 20 20 20 20  leLock), .      
133b0 20 20 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b     rc==SQLITE_OK
133c0 20 3f 20 22 6f 6b 22 20 3a 20 22 66 61 69 6c 65   ? "ok" : "faile
133d0 64 22 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  d"));.  return r
133e0 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 77 65  c;.}../*.** Lowe
133f0 72 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65  r the locking le
13400 76 65 6c 20 6f 6e 20 66 69 6c 65 20 64 65 73 63  vel on file desc
13410 72 69 70 74 6f 72 20 70 46 69 6c 65 20 74 6f 20  riptor pFile to 
13420 65 46 69 6c 65 4c 6f 63 6b 2e 20 20 65 46 69 6c  eFileLock.  eFil
13430 65 4c 6f 63 6b 0a 2a 2a 20 6d 75 73 74 20 62 65  eLock.** must be
13440 20 65 69 74 68 65 72 20 4e 4f 5f 4c 4f 43 4b 20   either NO_LOCK 
13450 6f 72 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2e 0a  or SHARED_LOCK..
13460 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6c 6f 63  **.** If the loc
13470 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 66 20 74 68  king level of th
13480 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  e file descripto
13490 72 20 69 73 20 61 6c 72 65 61 64 79 20 61 74 20  r is already at 
134a0 6f 72 20 62 65 6c 6f 77 0a 2a 2a 20 74 68 65 20  or below.** the 
134b0 72 65 71 75 65 73 74 65 64 20 6c 6f 63 6b 69 6e  requested lockin
134c0 67 20 6c 65 76 65 6c 2c 20 74 68 69 73 20 72 6f  g level, this ro
134d0 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70  utine is a no-op
134e0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
134f0 61 66 70 55 6e 6c 6f 63 6b 28 73 71 6c 69 74 65  afpUnlock(sqlite
13500 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20  3_file *id, int 
13510 65 46 69 6c 65 4c 6f 63 6b 29 20 7b 0a 20 20 69  eFileLock) {.  i
13520 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
13530 4b 3b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70  K;.  unixFile *p
13540 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65  File = (unixFile
13550 2a 29 69 64 3b 0a 20 20 75 6e 69 78 49 6e 6f 64  *)id;.  unixInod
13560 65 49 6e 66 6f 20 2a 70 49 6e 6f 64 65 3b 0a 20  eInfo *pInode;. 
13570 20 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65   afpLockingConte
13580 78 74 20 2a 63 6f 6e 74 65 78 74 20 3d 20 28 61  xt *context = (a
13590 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  fpLockingContext
135a0 20 2a 29 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69   *) pFile->locki
135b0 6e 67 43 6f 6e 74 65 78 74 3b 0a 20 20 69 6e 74  ngContext;.  int
135c0 20 73 6b 69 70 53 68 61 72 65 64 20 3d 20 30 3b   skipShared = 0;
135d0 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54  .#ifdef SQLITE_T
135e0 45 53 54 0a 20 20 69 6e 74 20 68 20 3d 20 70 46  EST.  int h = pF
135f0 69 6c 65 2d 3e 68 3b 0a 23 65 6e 64 69 66 0a 0a  ile->h;.#endif..
13600 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 20    assert( pFile 
13610 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22 55  );.  OSTRACE(("U
13620 4e 4c 4f 43 4b 20 20 25 64 20 25 64 20 77 61 73  NLOCK  %d %d was
13630 20 25 64 28 25 64 2c 25 64 29 20 70 69 64 3d 25   %d(%d,%d) pid=%
13640 64 20 28 61 66 70 29 5c 6e 22 2c 20 70 46 69 6c  d (afp)\n", pFil
13650 65 2d 3e 68 2c 20 65 46 69 6c 65 4c 6f 63 6b 2c  e->h, eFileLock,
13660 0a 20 20 20 20 20 20 20 20 20 20 20 70 46 69 6c  .           pFil
13670 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 2c 20 70 46  e->eFileLock, pF
13680 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e 65 46 69  ile->pInode->eFi
13690 6c 65 4c 6f 63 6b 2c 20 70 46 69 6c 65 2d 3e 70  leLock, pFile->p
136a0 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64 2c 0a  Inode->nShared,.
136b0 20 20 20 20 20 20 20 20 20 20 20 67 65 74 70 69             getpi
136c0 64 28 29 29 29 3b 0a 0a 20 20 61 73 73 65 72 74  d()));..  assert
136d0 28 20 65 46 69 6c 65 4c 6f 63 6b 3c 3d 53 48 41  ( eFileLock<=SHA
136e0 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 69 66  RED_LOCK );.  if
136f0 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f  ( pFile->eFileLo
13700 63 6b 3c 3d 65 46 69 6c 65 4c 6f 63 6b 20 29 7b  ck<=eFileLock ){
13710 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
13720 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 75 6e 69  TE_OK;.  }.  uni
13730 78 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 20  xEnterMutex();. 
13740 20 70 49 6e 6f 64 65 20 3d 20 70 46 69 6c 65 2d   pInode = pFile-
13750 3e 70 49 6e 6f 64 65 3b 0a 20 20 61 73 73 65 72  >pInode;.  asser
13760 74 28 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72  t( pInode->nShar
13770 65 64 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70  ed!=0 );.  if( p
13780 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3e  File->eFileLock>
13790 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20  SHARED_LOCK ){. 
137a0 20 20 20 61 73 73 65 72 74 28 20 70 49 6e 6f 64     assert( pInod
137b0 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d 70 46  e->eFileLock==pF
137c0 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 29  ile->eFileLock )
137d0 3b 0a 20 20 20 20 53 69 6d 75 6c 61 74 65 49 4f  ;.    SimulateIO
137e0 45 72 72 6f 72 42 65 6e 69 67 6e 28 31 29 3b 0a  ErrorBenign(1);.
137f0 20 20 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72      SimulateIOEr
13800 72 6f 72 28 20 68 3d 28 2d 31 29 20 29 0a 20 20  ror( h=(-1) ).  
13810 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f    SimulateIOErro
13820 72 42 65 6e 69 67 6e 28 30 29 3b 0a 20 20 20 20  rBenign(0);.    
13830 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a  .#ifndef NDEBUG.
13840 20 20 20 20 2f 2a 20 57 68 65 6e 20 72 65 64 75      /* When redu
13850 63 69 6e 67 20 61 20 6c 6f 63 6b 20 73 75 63 68  cing a lock such
13860 20 74 68 61 74 20 6f 74 68 65 72 20 70 72 6f 63   that other proc
13870 65 73 73 65 73 20 63 61 6e 20 73 74 61 72 74 0a  esses can start.
13880 20 20 20 20 2a 2a 20 72 65 61 64 69 6e 67 20 74      ** reading t
13890 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
138a0 20 61 67 61 69 6e 2c 20 6d 61 6b 65 20 73 75 72   again, make sur
138b0 65 20 74 68 61 74 20 74 68 65 0a 20 20 20 20 2a  e that the.    *
138c0 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f  * transaction co
138d0 75 6e 74 65 72 20 77 61 73 20 75 70 64 61 74 65  unter was update
138e0 64 20 69 66 20 61 6e 79 20 70 61 72 74 20 6f 66  d if any part of
138f0 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 20 20   the database.  
13900 20 20 2a 2a 20 66 69 6c 65 20 63 68 61 6e 67 65    ** file change
13910 64 2e 20 20 49 66 20 74 68 65 20 74 72 61 6e 73  d.  If the trans
13920 61 63 74 69 6f 6e 20 63 6f 75 6e 74 65 72 20 69  action counter i
13930 73 20 6e 6f 74 20 75 70 64 61 74 65 64 2c 0a 20  s not updated,. 
13940 20 20 20 2a 2a 20 6f 74 68 65 72 20 63 6f 6e 6e     ** other conn
13950 65 63 74 69 6f 6e 73 20 74 6f 20 74 68 65 20 73  ections to the s
13960 61 6d 65 20 66 69 6c 65 20 6d 69 67 68 74 20 6e  ame file might n
13970 6f 74 20 72 65 61 6c 69 7a 65 20 74 68 61 74 0a  ot realize that.
13980 20 20 20 20 2a 2a 20 74 68 65 20 66 69 6c 65 20      ** the file 
13990 68 61 73 20 63 68 61 6e 67 65 64 20 61 6e 64 20  has changed and 
139a0 68 65 6e 63 65 20 6d 69 67 68 74 20 6e 6f 74 20  hence might not 
139b0 6b 6e 6f 77 20 74 6f 20 66 6c 75 73 68 20 74 68  know to flush th
139c0 65 69 72 0a 20 20 20 20 2a 2a 20 63 61 63 68 65  eir.    ** cache
139d0 2e 20 20 54 68 65 20 75 73 65 20 6f 66 20 61 20  .  The use of a 
139e0 73 74 61 6c 65 20 63 61 63 68 65 20 63 61 6e 20  stale cache can 
139f0 6c 65 61 64 20 74 6f 20 64 61 74 61 62 61 73 65  lead to database
13a00 20 63 6f 72 72 75 70 74 69 6f 6e 2e 0a 20 20 20   corruption..   
13a10 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20   */.    assert( 
13a20 70 46 69 6c 65 2d 3e 69 6e 4e 6f 72 6d 61 6c 57  pFile->inNormalW
13a30 72 69 74 65 3d 3d 30 0a 20 20 20 20 20 20 20 20  rite==0.        
13a40 20 20 20 7c 7c 20 70 46 69 6c 65 2d 3e 64 62 55     || pFile->dbU
13a50 70 64 61 74 65 3d 3d 30 0a 20 20 20 20 20 20 20  pdate==0.       
13a60 20 20 20 20 7c 7c 20 70 46 69 6c 65 2d 3e 74 72      || pFile->tr
13a70 61 6e 73 43 6e 74 72 43 68 6e 67 3d 3d 31 20 29  ansCntrChng==1 )
13a80 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 69 6e 4e  ;.    pFile->inN
13a90 6f 72 6d 61 6c 57 72 69 74 65 20 3d 20 30 3b 0a  ormalWrite = 0;.
13aa0 23 65 6e 64 69 66 0a 20 20 20 20 0a 20 20 20 20  #endif.    .    
13ab0 69 66 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65  if( pFile->eFile
13ac0 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f  Lock==EXCLUSIVE_
13ad0 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 20 20 72 63  LOCK ){.      rc
13ae0 20 3d 20 61 66 70 53 65 74 4c 6f 63 6b 28 63 6f   = afpSetLock(co
13af0 6e 74 65 78 74 2d 3e 64 62 50 61 74 68 2c 20 70  ntext->dbPath, p
13b00 46 69 6c 65 2c 20 53 48 41 52 45 44 5f 46 49 52  File, SHARED_FIR
13b10 53 54 2c 20 53 48 41 52 45 44 5f 53 49 5a 45 2c  ST, SHARED_SIZE,
13b20 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72   0);.      if( r
13b30 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
13b40 28 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52  (eFileLock==SHAR
13b50 45 44 5f 4c 4f 43 4b 20 7c 7c 20 70 49 6e 6f 64  ED_LOCK || pInod
13b60 65 2d 3e 6e 53 68 61 72 65 64 3e 31 29 20 29 7b  e->nShared>1) ){
13b70 0a 20 20 20 20 20 20 20 20 2f 2a 20 6f 6e 6c 79  .        /* only
13b80 20 72 65 2d 65 73 74 61 62 6c 69 73 68 20 74 68   re-establish th
13b90 65 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 69 66  e shared lock if
13ba0 20 6e 65 63 65 73 73 61 72 79 20 2a 2f 0a 20 20   necessary */.  
13bb0 20 20 20 20 20 20 69 6e 74 20 73 68 61 72 65 64        int shared
13bc0 4c 6f 63 6b 42 79 74 65 20 3d 20 53 48 41 52 45  LockByte = SHARE
13bd0 44 5f 46 49 52 53 54 2b 70 49 6e 6f 64 65 2d 3e  D_FIRST+pInode->
13be0 73 68 61 72 65 64 42 79 74 65 3b 0a 20 20 20 20  sharedByte;.    
13bf0 20 20 20 20 72 63 20 3d 20 61 66 70 53 65 74 4c      rc = afpSetL
13c00 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 64 62 50  ock(context->dbP
13c10 61 74 68 2c 20 70 46 69 6c 65 2c 20 73 68 61 72  ath, pFile, shar
13c20 65 64 4c 6f 63 6b 42 79 74 65 2c 20 31 2c 20 31  edLockByte, 1, 1
13c30 29 3b 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 20  );.      } else 
13c40 7b 0a 20 20 20 20 20 20 20 20 73 6b 69 70 53 68  {.        skipSh
13c50 61 72 65 64 20 3d 20 31 3b 0a 20 20 20 20 20 20  ared = 1;.      
13c60 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  }.    }.    if( 
13c70 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
13c80 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63   pFile->eFileLoc
13c90 6b 3e 3d 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 20  k>=PENDING_LOCK 
13ca0 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 61 66  ){.      rc = af
13cb0 70 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74  pSetLock(context
13cc0 2d 3e 64 62 50 61 74 68 2c 20 70 46 69 6c 65 2c  ->dbPath, pFile,
13cd0 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 2c 20 31   PENDING_BYTE, 1
13ce0 2c 20 30 29 3b 0a 20 20 20 20 7d 20 0a 20 20 20  , 0);.    } .   
13cf0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
13d00 4f 4b 20 26 26 20 70 46 69 6c 65 2d 3e 65 46 69  OK && pFile->eFi
13d10 6c 65 4c 6f 63 6b 3e 3d 52 45 53 45 52 56 45 44  leLock>=RESERVED
13d20 5f 4c 4f 43 4b 20 26 26 20 63 6f 6e 74 65 78 74  _LOCK && context
13d30 2d 3e 72 65 73 65 72 76 65 64 20 29 7b 0a 20 20  ->reserved ){.  
13d40 20 20 20 20 72 63 20 3d 20 61 66 70 53 65 74 4c      rc = afpSetL
13d50 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 64 62 50  ock(context->dbP
13d60 61 74 68 2c 20 70 46 69 6c 65 2c 20 52 45 53 45  ath, pFile, RESE
13d70 52 56 45 44 5f 42 59 54 45 2c 20 31 2c 20 30 29  RVED_BYTE, 1, 0)
13d80 3b 0a 20 20 20 20 20 20 69 66 28 20 21 72 63 20  ;.      if( !rc 
13d90 29 7b 20 0a 20 20 20 20 20 20 20 20 63 6f 6e 74  ){ .        cont
13da0 65 78 74 2d 3e 72 65 73 65 72 76 65 64 20 3d 20  ext->reserved = 
13db0 30 3b 20 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  0; .      }.    
13dc0 7d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  }.    if( rc==SQ
13dd0 4c 49 54 45 5f 4f 4b 20 26 26 20 28 65 46 69 6c  LITE_OK && (eFil
13de0 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f  eLock==SHARED_LO
13df0 43 4b 20 7c 7c 20 70 49 6e 6f 64 65 2d 3e 6e 53  CK || pInode->nS
13e00 68 61 72 65 64 3e 31 29 29 7b 0a 20 20 20 20 20  hared>1)){.     
13e10 20 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f   pInode->eFileLo
13e20 63 6b 20 3d 20 53 48 41 52 45 44 5f 4c 4f 43 4b  ck = SHARED_LOCK
13e30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66  ;.    }.  }.  if
13e40 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
13e50 26 26 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 4e 4f  && eFileLock==NO
13e60 5f 4c 4f 43 4b 20 29 7b 0a 0a 20 20 20 20 2f 2a  _LOCK ){..    /*
13e70 20 44 65 63 72 65 6d 65 6e 74 20 74 68 65 20 73   Decrement the s
13e80 68 61 72 65 64 20 6c 6f 63 6b 20 63 6f 75 6e 74  hared lock count
13e90 65 72 2e 20 20 52 65 6c 65 61 73 65 20 74 68 65  er.  Release the
13ea0 20 6c 6f 63 6b 20 75 73 69 6e 67 20 61 6e 0a 20   lock using an. 
13eb0 20 20 20 2a 2a 20 4f 53 20 63 61 6c 6c 20 6f 6e     ** OS call on
13ec0 6c 79 20 77 68 65 6e 20 61 6c 6c 20 74 68 72 65  ly when all thre
13ed0 61 64 73 20 69 6e 20 74 68 69 73 20 73 61 6d 65  ads in this same
13ee0 20 70 72 6f 63 65 73 73 20 68 61 76 65 20 72 65   process have re
13ef0 6c 65 61 73 65 64 0a 20 20 20 20 2a 2a 20 74 68  leased.    ** th
13f00 65 20 6c 6f 63 6b 2e 0a 20 20 20 20 2a 2f 0a 20  e lock..    */. 
13f10 20 20 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67     unsigned long
13f20 20 6c 6f 6e 67 20 73 68 61 72 65 64 4c 6f 63 6b   long sharedLock
13f30 42 79 74 65 20 3d 20 53 48 41 52 45 44 5f 46 49  Byte = SHARED_FI
13f40 52 53 54 2b 70 49 6e 6f 64 65 2d 3e 73 68 61 72  RST+pInode->shar
13f50 65 64 42 79 74 65 3b 0a 20 20 20 20 70 49 6e 6f  edByte;.    pIno
13f60 64 65 2d 3e 6e 53 68 61 72 65 64 2d 2d 3b 0a 20  de->nShared--;. 
13f70 20 20 20 69 66 28 20 70 49 6e 6f 64 65 2d 3e 6e     if( pInode->n
13f80 53 68 61 72 65 64 3d 3d 30 20 29 7b 0a 20 20 20  Shared==0 ){.   
13f90 20 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72     SimulateIOErr
13fa0 6f 72 42 65 6e 69 67 6e 28 31 29 3b 0a 20 20 20  orBenign(1);.   
13fb0 20 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72     SimulateIOErr
13fc0 6f 72 28 20 68 3d 28 2d 31 29 20 29 0a 20 20 20  or( h=(-1) ).   
13fd0 20 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72     SimulateIOErr
13fe0 6f 72 42 65 6e 69 67 6e 28 30 29 3b 0a 20 20 20  orBenign(0);.   
13ff0 20 20 20 69 66 28 20 21 73 6b 69 70 53 68 61 72     if( !skipShar
14000 65 64 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  ed ){.        rc
14010 20 3d 20 61 66 70 53 65 74 4c 6f 63 6b 28 63 6f   = afpSetLock(co
14020 6e 74 65 78 74 2d 3e 64 62 50 61 74 68 2c 20 70  ntext->dbPath, p
14030 46 69 6c 65 2c 20 73 68 61 72 65 64 4c 6f 63 6b  File, sharedLock
14040 42 79 74 65 2c 20 31 2c 20 30 29 3b 0a 20 20 20  Byte, 1, 0);.   
14050 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 21     }.      if( !
14060 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 70 49  rc ){.        pI
14070 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20  node->eFileLock 
14080 3d 20 4e 4f 5f 4c 4f 43 4b 3b 0a 20 20 20 20 20  = NO_LOCK;.     
14090 20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c     pFile->eFileL
140a0 6f 63 6b 20 3d 20 4e 4f 5f 4c 4f 43 4b 3b 0a 20  ock = NO_LOCK;. 
140b0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
140c0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
140d0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 49 6e 6f  OK ){.      pIno
140e0 64 65 2d 3e 6e 4c 6f 63 6b 2d 2d 3b 0a 20 20 20  de->nLock--;.   
140f0 20 20 20 61 73 73 65 72 74 28 20 70 49 6e 6f 64     assert( pInod
14100 65 2d 3e 6e 4c 6f 63 6b 3e 3d 30 20 29 3b 0a 20  e->nLock>=0 );. 
14110 20 20 20 20 20 69 66 28 20 70 49 6e 6f 64 65 2d       if( pInode-
14120 3e 6e 4c 6f 63 6b 3d 3d 30 20 29 7b 0a 20 20 20  >nLock==0 ){.   
14130 20 20 20 20 20 72 63 20 3d 20 63 6c 6f 73 65 50       rc = closeP
14140 65 6e 64 69 6e 67 46 64 73 28 70 46 69 6c 65 29  endingFds(pFile)
14150 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
14160 20 20 7d 0a 20 20 0a 20 20 75 6e 69 78 4c 65 61    }.  .  unixLea
14170 76 65 4d 75 74 65 78 28 29 3b 0a 20 20 69 66 28  veMutex();.  if(
14180 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
14190 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63   pFile->eFileLoc
141a0 6b 20 3d 20 65 46 69 6c 65 4c 6f 63 6b 3b 0a 20  k = eFileLock;. 
141b0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
141c0 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 20 66 69 6c  *.** Close a fil
141d0 65 20 26 20 63 6c 65 61 6e 75 70 20 41 46 50 20  e & cleanup AFP 
141e0 73 70 65 63 69 66 69 63 20 6c 6f 63 6b 69 6e 67  specific locking
141f0 20 63 6f 6e 74 65 78 74 20 0a 2a 2f 0a 73 74 61   context .*/.sta
14200 74 69 63 20 69 6e 74 20 61 66 70 43 6c 6f 73 65  tic int afpClose
14210 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69  (sqlite3_file *i
14220 64 29 20 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  d) {.  int rc = 
14230 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28  SQLITE_OK;.  if(
14240 20 69 64 20 29 7b 0a 20 20 20 20 75 6e 69 78 46   id ){.    unixF
14250 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e  ile *pFile = (un
14260 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 20 20  ixFile*)id;.    
14270 61 66 70 55 6e 6c 6f 63 6b 28 69 64 2c 20 4e 4f  afpUnlock(id, NO
14280 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 75 6e 69 78  _LOCK);.    unix
14290 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 20 20  EnterMutex();.  
142a0 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 70 49 6e    if( pFile->pIn
142b0 6f 64 65 20 26 26 20 70 46 69 6c 65 2d 3e 70 49  ode && pFile->pI
142c0 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 20 29 7b 0a 20  node->nLock ){. 
142d0 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65       /* If there
142e0 20 61 72 65 20 6f 75 74 73 74 61 6e 64 69 6e 67   are outstanding
142f0 20 6c 6f 63 6b 73 2c 20 64 6f 20 6e 6f 74 20 61   locks, do not a
14300 63 74 75 61 6c 6c 79 20 63 6c 6f 73 65 20 74 68  ctually close th
14310 65 20 66 69 6c 65 20 6a 75 73 74 0a 20 20 20 20  e file just.    
14320 20 20 2a 2a 20 79 65 74 20 62 65 63 61 75 73 65    ** yet because
14330 20 74 68 61 74 20 77 6f 75 6c 64 20 63 6c 65 61   that would clea
14340 72 20 74 68 6f 73 65 20 6c 6f 63 6b 73 2e 20 20  r those locks.  
14350 49 6e 73 74 65 61 64 2c 20 61 64 64 20 74 68 65  Instead, add the
14360 20 66 69 6c 65 0a 20 20 20 20 20 20 2a 2a 20 64   file.      ** d
14370 65 73 63 72 69 70 74 6f 72 20 74 6f 20 70 49 6e  escriptor to pIn
14380 6f 64 65 2d 3e 61 50 65 6e 64 69 6e 67 2e 20 20  ode->aPending.  
14390 49 74 20 77 69 6c 6c 20 62 65 20 61 75 74 6f 6d  It will be autom
143a0 61 74 69 63 61 6c 6c 79 20 63 6c 6f 73 65 64 20  atically closed 
143b0 77 68 65 6e 0a 20 20 20 20 20 20 2a 2a 20 74 68  when.      ** th
143c0 65 20 6c 61 73 74 20 6c 6f 63 6b 20 69 73 20 63  e last lock is c
143d0 6c 65 61 72 65 64 2e 0a 20 20 20 20 20 20 2a 2f  leared..      */
143e0 0a 20 20 20 20 20 20 73 65 74 50 65 6e 64 69 6e  .      setPendin
143f0 67 46 64 28 70 46 69 6c 65 29 3b 0a 20 20 20 20  gFd(pFile);.    
14400 7d 0a 20 20 20 20 72 65 6c 65 61 73 65 4c 6f 63  }.    releaseLoc
14410 6b 49 6e 66 6f 28 70 46 69 6c 65 2d 3e 70 49 6e  kInfo(pFile->pIn
14420 6f 64 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ode);.    sqlite
14430 33 5f 66 72 65 65 28 70 46 69 6c 65 2d 3e 6c 6f  3_free(pFile->lo
14440 63 6b 69 6e 67 43 6f 6e 74 65 78 74 29 3b 0a 20  ckingContext);. 
14450 20 20 20 72 63 20 3d 20 63 6c 6f 73 65 55 6e 69     rc = closeUni
14460 78 46 69 6c 65 28 69 64 29 3b 0a 20 20 20 20 75  xFile(id);.    u
14470 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b  nixLeaveMutex();
14480 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
14490 3b 0a 7d 0a 0a 23 65 6e 64 69 66 20 2f 2a 20 64  ;.}..#endif /* d
144a0 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f  efined(__APPLE__
144b0 29 20 26 26 20 53 51 4c 49 54 45 5f 45 4e 41 42  ) && SQLITE_ENAB
144c0 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45  LE_LOCKING_STYLE
144d0 20 2a 2f 0a 2f 2a 0a 2a 2a 20 54 68 65 20 63 6f   */./*.** The co
144e0 64 65 20 61 62 6f 76 65 20 69 73 20 74 68 65 20  de above is the 
144f0 41 46 50 20 6c 6f 63 6b 20 69 6d 70 6c 65 6d 65  AFP lock impleme
14500 6e 74 61 74 69 6f 6e 2e 20 20 54 68 65 20 63 6f  ntation.  The co
14510 64 65 20 69 73 20 73 70 65 63 69 66 69 63 0a 2a  de is specific.*
14520 2a 20 74 6f 20 4d 61 63 4f 53 58 20 61 6e 64 20  * to MacOSX and 
14530 64 6f 65 73 20 6e 6f 74 20 77 6f 72 6b 20 6f 6e  does not work on
14540 20 6f 74 68 65 72 20 75 6e 69 78 20 70 6c 61 74   other unix plat
14550 66 6f 72 6d 73 2e 20 20 4e 6f 20 61 6c 74 65 72  forms.  No alter
14560 6e 61 74 69 76 65 0a 2a 2a 20 69 73 20 61 76 61  native.** is ava
14570 69 6c 61 62 6c 65 2e 20 20 49 66 20 79 6f 75 20  ilable.  If you 
14580 64 6f 6e 27 74 20 63 6f 6d 70 69 6c 65 20 66 6f  don't compile fo
14590 72 20 61 20 6d 61 63 2c 20 74 68 65 6e 20 74 68  r a mac, then th
145a0 65 20 22 75 6e 69 78 2d 61 66 70 22 0a 2a 2a 20  e "unix-afp".** 
145b0 56 46 53 20 69 73 20 6e 6f 74 20 61 76 61 69 6c  VFS is not avail
145c0 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a  able..**.*******
145d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45  ************** E
145e0 6e 64 20 6f 66 20 74 68 65 20 41 46 50 20 6c 6f  nd of the AFP lo
145f0 63 6b 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  ck implementatio
14600 6e 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  n **************
14610 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a  ********.*******
14620 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14630 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14640 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14650 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14660 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 2a 2a 2a 2a  *******/../*****
14670 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14680 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14690 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
146a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
146b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a  *********.******
146c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
146d0 2a 2a 2a 2a 2a 20 42 65 67 69 6e 20 4e 46 53 20  ***** Begin NFS 
146e0 4c 6f 63 6b 69 6e 67 20 2a 2a 2a 2a 2a 2a 2a 2a  Locking ********
146f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14700 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 23 69 66 20 64  ********/..#if d
14710 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f  efined(__APPLE__
14720 29 20 26 26 20 53 51 4c 49 54 45 5f 45 4e 41 42  ) && SQLITE_ENAB
14730 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45  LE_LOCKING_STYLE
14740 0a 2f 2a 0a 20 2a 2a 20 4c 6f 77 65 72 20 74 68  ./*. ** Lower th
14750 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20  e locking level 
14760 6f 6e 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  on file descript
14770 6f 72 20 70 46 69 6c 65 20 74 6f 20 65 46 69 6c  or pFile to eFil
14780 65 4c 6f 63 6b 2e 20 20 65 46 69 6c 65 4c 6f 63  eLock.  eFileLoc
14790 6b 0a 20 2a 2a 20 6d 75 73 74 20 62 65 20 65 69  k. ** must be ei
147a0 74 68 65 72 20 4e 4f 5f 4c 4f 43 4b 20 6f 72 20  ther NO_LOCK or 
147b0 53 48 41 52 45 44 5f 4c 4f 43 4b 2e 0a 20 2a 2a  SHARED_LOCK.. **
147c0 0a 20 2a 2a 20 49 66 20 74 68 65 20 6c 6f 63 6b  . ** If the lock
147d0 69 6e 67 20 6c 65 76 65 6c 20 6f 66 20 74 68 65  ing level of the
147e0 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
147f0 20 69 73 20 61 6c 72 65 61 64 79 20 61 74 20 6f   is already at o
14800 72 20 62 65 6c 6f 77 0a 20 2a 2a 20 74 68 65 20  r below. ** the 
14810 72 65 71 75 65 73 74 65 64 20 6c 6f 63 6b 69 6e  requested lockin
14820 67 20 6c 65 76 65 6c 2c 20 74 68 69 73 20 72 6f  g level, this ro
14830 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70  utine is a no-op
14840 2e 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  .. */.static int
14850 20 6e 66 73 55 6e 6c 6f 63 6b 28 73 71 6c 69 74   nfsUnlock(sqlit
14860 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74  e3_file *id, int
14870 20 65 46 69 6c 65 4c 6f 63 6b 29 7b 0a 20 20 72   eFileLock){.  r
14880 65 74 75 72 6e 20 5f 70 6f 73 69 78 55 6e 6c 6f  eturn _posixUnlo
14890 63 6b 28 69 64 2c 20 65 46 69 6c 65 4c 6f 63 6b  ck(id, eFileLock
148a0 2c 20 31 29 3b 0a 7d 0a 0a 23 65 6e 64 69 66 20  , 1);.}..#endif 
148b0 2f 2a 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50  /* defined(__APP
148c0 4c 45 5f 5f 29 20 26 26 20 53 51 4c 49 54 45 5f  LE__) && SQLITE_
148d0 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53  ENABLE_LOCKING_S
148e0 54 59 4c 45 20 2a 2f 0a 2f 2a 0a 2a 2a 20 54 68  TYLE */./*.** Th
148f0 65 20 63 6f 64 65 20 61 62 6f 76 65 20 69 73 20  e code above is 
14900 74 68 65 20 4e 46 53 20 6c 6f 63 6b 20 69 6d 70  the NFS lock imp
14910 6c 65 6d 65 6e 74 61 74 69 6f 6e 2e 20 20 54 68  lementation.  Th
14920 65 20 63 6f 64 65 20 69 73 20 73 70 65 63 69 66  e code is specif
14930 69 63 0a 2a 2a 20 74 6f 20 4d 61 63 4f 53 58 20  ic.** to MacOSX 
14940 61 6e 64 20 64 6f 65 73 20 6e 6f 74 20 77 6f 72  and does not wor
14950 6b 20 6f 6e 20 6f 74 68 65 72 20 75 6e 69 78 20  k on other unix 
14960 70 6c 61 74 66 6f 72 6d 73 2e 20 20 4e 6f 20 61  platforms.  No a
14970 6c 74 65 72 6e 61 74 69 76 65 0a 2a 2a 20 69 73  lternative.** is
14980 20 61 76 61 69 6c 61 62 6c 65 2e 20 20 0a 2a 2a   available.  .**
14990 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .***************
149a0 2a 2a 2a 2a 2a 2a 20 45 6e 64 20 6f 66 20 74 68  ****** End of th
149b0 65 20 4e 46 53 20 6c 6f 63 6b 20 69 6d 70 6c 65  e NFS lock imple
149c0 6d 65 6e 74 61 74 69 6f 6e 20 2a 2a 2a 2a 2a 2a  mentation ******
149d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
149e0 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .***************
149f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14a00 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14a10 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14a20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f  ***************/
14a30 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ../*************
14a40 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14a50 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14a60 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14a70 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14a80 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  *.**************
14a90 2a 2a 20 4e 6f 6e 2d 6c 6f 63 6b 69 6e 67 20 73  ** Non-locking s
14aa0 71 6c 69 74 65 33 5f 66 69 6c 65 20 6d 65 74 68  qlite3_file meth
14ab0 6f 64 73 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ods ************
14ac0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14ad0 2a 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6e 65 78 74  *.**.** The next
14ae0 20 64 69 76 69 73 69 6f 6e 20 63 6f 6e 74 61 69   division contai
14af0 6e 73 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  ns implementatio
14b00 6e 73 20 66 6f 72 20 61 6c 6c 20 6d 65 74 68 6f  ns for all metho
14b10 64 73 20 6f 66 20 74 68 65 20 0a 2a 2a 20 73 71  ds of the .** sq
14b20 6c 69 74 65 33 5f 66 69 6c 65 20 6f 62 6a 65 63  lite3_file objec
14b30 74 20 6f 74 68 65 72 20 74 68 61 6e 20 74 68 65  t other than the
14b40 20 6c 6f 63 6b 69 6e 67 20 6d 65 74 68 6f 64 73   locking methods
14b50 2e 20 20 54 68 65 20 6c 6f 63 6b 69 6e 67 0a 2a  .  The locking.*
14b60 2a 20 6d 65 74 68 6f 64 73 20 77 65 72 65 20 64  * methods were d
14b70 65 66 69 6e 65 64 20 69 6e 20 64 69 76 69 73 69  efined in divisi
14b80 6f 6e 73 20 61 62 6f 76 65 20 28 6f 6e 65 20 6c  ons above (one l
14b90 6f 63 6b 69 6e 67 20 6d 65 74 68 6f 64 20 70 65  ocking method pe
14ba0 72 0a 2a 2a 20 64 69 76 69 73 69 6f 6e 29 2e 20  r.** division). 
14bb0 20 54 68 6f 73 65 20 6d 65 74 68 6f 64 73 20 74   Those methods t
14bc0 68 61 74 20 61 72 65 20 63 6f 6d 6d 6f 6e 20 74  hat are common t
14bd0 6f 20 61 6c 6c 20 6c 6f 63 6b 69 6e 67 20 6d 6f  o all locking mo
14be0 64 65 73 0a 2a 2a 20 61 72 65 20 67 61 74 68 65  des.** are gathe
14bf0 72 20 74 6f 67 65 74 68 65 72 20 69 6e 74 6f 20  r together into 
14c00 74 68 69 73 20 64 69 76 69 73 69 6f 6e 2e 0a 2a  this division..*
14c10 2f 0a 0a 2f 2a 0a 2a 2a 20 53 65 65 6b 20 74 6f  /../*.** Seek to
14c20 20 74 68 65 20 6f 66 66 73 65 74 20 70 61 73 73   the offset pass
14c30 65 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64  ed as the second
14c40 20 61 72 67 75 6d 65 6e 74 2c 20 74 68 65 6e 20   argument, then 
14c50 72 65 61 64 20 63 6e 74 20 0a 2a 2a 20 62 79 74  read cnt .** byt
14c60 65 73 20 69 6e 74 6f 20 70 42 75 66 2e 20 52 65  es into pBuf. Re
14c70 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20  turn the number 
14c80 6f 66 20 62 79 74 65 73 20 61 63 74 75 61 6c 6c  of bytes actuall
14c90 79 20 72 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 4e 42  y read..**.** NB
14ca0 3a 20 20 49 66 20 79 6f 75 20 64 65 66 69 6e 65  :  If you define
14cb0 20 55 53 45 5f 50 52 45 41 44 20 6f 72 20 55 53   USE_PREAD or US
14cc0 45 5f 50 52 45 41 44 36 34 2c 20 74 68 65 6e 20  E_PREAD64, then 
14cd0 69 74 20 6d 69 67 68 74 20 61 6c 73 6f 0a 2a 2a  it might also.**
14ce0 20 62 65 20 6e 65 63 65 73 73 61 72 79 20 74 6f   be necessary to
14cf0 20 64 65 66 69 6e 65 20 5f 58 4f 50 45 4e 5f 53   define _XOPEN_S
14d00 4f 55 52 43 45 20 74 6f 20 62 65 20 35 30 30 2e  OURCE to be 500.
14d10 20 20 54 68 69 73 20 76 61 72 69 65 73 20 66 72    This varies fr
14d20 6f 6d 0a 2a 2a 20 6f 6e 65 20 73 79 73 74 65 6d  om.** one system
14d30 20 74 6f 20 61 6e 6f 74 68 65 72 2e 20 20 53 69   to another.  Si
14d40 6e 63 65 20 53 51 4c 69 74 65 20 64 6f 65 73 20  nce SQLite does 
14d50 6e 6f 74 20 64 65 66 69 6e 65 20 55 53 45 5f 50  not define USE_P
14d60 52 45 41 44 0a 2a 2a 20 61 6e 79 20 61 6e 79 20  READ.** any any 
14d70 66 6f 72 6d 20 62 79 20 64 65 66 61 75 6c 74 2c  form by default,
14d80 20 77 65 20 77 69 6c 6c 20 6e 6f 74 20 61 74 74   we will not att
14d90 65 6d 70 74 20 74 6f 20 64 65 66 69 6e 65 20 5f  empt to define _
14da0 58 4f 50 45 4e 5f 53 4f 55 52 43 45 2e 0a 2a 2a  XOPEN_SOURCE..**
14db0 20 53 65 65 20 74 69 63 6b 65 74 73 20 23 32 37   See tickets #27
14dc0 34 31 20 61 6e 64 20 23 32 36 38 31 2e 0a 2a 2a  41 and #2681..**
14dd0 0a 2a 2a 20 54 6f 20 61 76 6f 69 64 20 73 74 6f  .** To avoid sto
14de0 6d 70 69 6e 67 20 74 68 65 20 65 72 72 6e 6f 20  mping the errno 
14df0 76 61 6c 75 65 20 6f 6e 20 61 20 66 61 69 6c 65  value on a faile
14e00 64 20 72 65 61 64 20 74 68 65 20 6c 61 73 74 45  d read the lastE
14e10 72 72 6e 6f 20 76 61 6c 75 65 0a 2a 2a 20 69 73  rrno value.** is
14e20 20 73 65 74 20 62 65 66 6f 72 65 20 72 65 74 75   set before retu
14e30 72 6e 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63  rning..*/.static
14e40 20 69 6e 74 20 73 65 65 6b 41 6e 64 52 65 61 64   int seekAndRead
14e50 28 75 6e 69 78 46 69 6c 65 20 2a 69 64 2c 20 73  (unixFile *id, s
14e60 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 6f 66 66  qlite3_int64 off
14e70 73 65 74 2c 20 76 6f 69 64 20 2a 70 42 75 66 2c  set, void *pBuf,
14e80 20 69 6e 74 20 63 6e 74 29 7b 0a 20 20 69 6e 74   int cnt){.  int
14e90 20 67 6f 74 3b 0a 23 69 66 20 28 21 64 65 66 69   got;.#if (!defi
14ea0 6e 65 64 28 55 53 45 5f 50 52 45 41 44 29 20 26  ned(USE_PREAD) &
14eb0 26 20 21 64 65 66 69 6e 65 64 28 55 53 45 5f 50  & !defined(USE_P
14ec0 52 45 41 44 36 34 29 29 0a 20 20 69 36 34 20 6e  READ64)).  i64 n
14ed0 65 77 4f 66 66 73 65 74 3b 0a 23 65 6e 64 69 66  ewOffset;.#endif
14ee0 0a 20 20 54 49 4d 45 52 5f 53 54 41 52 54 3b 0a  .  TIMER_START;.
14ef0 23 69 66 20 64 65 66 69 6e 65 64 28 55 53 45 5f  #if defined(USE_
14f00 50 52 45 41 44 29 0a 20 20 67 6f 74 20 3d 20 70  PREAD).  got = p
14f10 72 65 61 64 28 69 64 2d 3e 68 2c 20 70 42 75 66  read(id->h, pBuf
14f20 2c 20 63 6e 74 2c 20 6f 66 66 73 65 74 29 3b 0a  , cnt, offset);.
14f30 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f    SimulateIOErro
14f40 72 28 20 67 6f 74 20 3d 20 2d 31 20 29 3b 0a 23  r( got = -1 );.#
14f50 65 6c 69 66 20 64 65 66 69 6e 65 64 28 55 53 45  elif defined(USE
14f60 5f 50 52 45 41 44 36 34 29 0a 20 20 67 6f 74 20  _PREAD64).  got 
14f70 3d 20 70 72 65 61 64 36 34 28 69 64 2d 3e 68 2c  = pread64(id->h,
14f80 20 70 42 75 66 2c 20 63 6e 74 2c 20 6f 66 66 73   pBuf, cnt, offs
14f90 65 74 29 3b 0a 20 20 53 69 6d 75 6c 61 74 65 49  et);.  SimulateI
14fa0 4f 45 72 72 6f 72 28 20 67 6f 74 20 3d 20 2d 31  OError( got = -1
14fb0 20 29 3b 0a 23 65 6c 73 65 0a 20 20 6e 65 77 4f   );.#else.  newO
14fc0 66 66 73 65 74 20 3d 20 6c 73 65 65 6b 28 69 64  ffset = lseek(id
14fd0 2d 3e 68 2c 20 6f 66 66 73 65 74 2c 20 53 45 45  ->h, offset, SEE
14fe0 4b 5f 53 45 54 29 3b 0a 20 20 53 69 6d 75 6c 61  K_SET);.  Simula
14ff0 74 65 49 4f 45 72 72 6f 72 28 20 6e 65 77 4f 66  teIOError( newOf
15000 66 73 65 74 2d 2d 20 29 3b 0a 20 20 69 66 28 20  fset-- );.  if( 
15010 6e 65 77 4f 66 66 73 65 74 21 3d 6f 66 66 73 65  newOffset!=offse
15020 74 20 29 7b 0a 20 20 20 20 69 66 28 20 6e 65 77  t ){.    if( new
15030 4f 66 66 73 65 74 20 3d 3d 20 2d 31 20 29 7b 0a  Offset == -1 ){.
15040 20 20 20 20 20 20 28 28 75 6e 69 78 46 69 6c 65        ((unixFile
15050 2a 29 69 64 29 2d 3e 6c 61 73 74 45 72 72 6e 6f  *)id)->lastErrno
15060 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 7d 65   = errno;.    }e
15070 6c 73 65 7b 0a 20 20 20 20 20 20 28 28 75 6e 69  lse{.      ((uni
15080 78 46 69 6c 65 2a 29 69 64 29 2d 3e 6c 61 73 74  xFile*)id)->last
15090 45 72 72 6e 6f 20 3d 20 30 3b 09 09 09 0a 20 20  Errno = 0;....  
150a0 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 2d    }.    return -
150b0 31 3b 0a 20 20 7d 0a 20 20 67 6f 74 20 3d 20 72  1;.  }.  got = r
150c0 65 61 64 28 69 64 2d 3e 68 2c 20 70 42 75 66 2c  ead(id->h, pBuf,
150d0 20 63 6e 74 29 3b 0a 23 65 6e 64 69 66 0a 20 20   cnt);.#endif.  
150e0 54 49 4d 45 52 5f 45 4e 44 3b 0a 20 20 69 66 28  TIMER_END;.  if(
150f0 20 67 6f 74 3c 30 20 29 7b 0a 20 20 20 20 28 28   got<0 ){.    ((
15100 75 6e 69 78 46 69 6c 65 2a 29 69 64 29 2d 3e 6c  unixFile*)id)->l
15110 61 73 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f  astErrno = errno
15120 3b 0a 20 20 7d 0a 20 20 4f 53 54 52 41 43 45 28  ;.  }.  OSTRACE(
15130 28 22 52 45 41 44 20 20 20 20 25 2d 33 64 20 25  ("READ    %-3d %
15140 35 64 20 25 37 6c 6c 64 20 25 6c 6c 75 5c 6e 22  5d %7lld %llu\n"
15150 2c 20 69 64 2d 3e 68 2c 20 67 6f 74 2c 20 6f 66  , id->h, got, of
15160 66 73 65 74 2c 20 54 49 4d 45 52 5f 45 4c 41 50  fset, TIMER_ELAP
15170 53 45 44 29 29 3b 0a 20 20 72 65 74 75 72 6e 20  SED));.  return 
15180 67 6f 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  got;.}../*.** Re
15190 61 64 20 64 61 74 61 20 66 72 6f 6d 20 61 20 66  ad data from a f
151a0 69 6c 65 20 69 6e 74 6f 20 61 20 62 75 66 66 65  ile into a buffe
151b0 72 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54  r.  Return SQLIT
151c0 45 5f 4f 4b 20 69 66 20 61 6c 6c 0a 2a 2a 20 62  E_OK if all.** b
151d0 79 74 65 73 20 77 65 72 65 20 72 65 61 64 20 73  ytes were read s
151e0 75 63 63 65 73 73 66 75 6c 6c 79 20 61 6e 64 20  uccessfully and 
151f0 53 51 4c 49 54 45 5f 49 4f 45 52 52 20 69 66 20  SQLITE_IOERR if 
15200 61 6e 79 74 68 69 6e 67 20 67 6f 65 73 0a 2a 2a  anything goes.**
15210 20 77 72 6f 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69   wrong..*/.stati
15220 63 20 69 6e 74 20 75 6e 69 78 52 65 61 64 28 0a  c int unixRead(.
15230 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a    sqlite3_file *
15240 69 64 2c 20 0a 20 20 76 6f 69 64 20 2a 70 42 75  id, .  void *pBu
15250 66 2c 20 0a 20 20 69 6e 74 20 61 6d 74 2c 0a 20  f, .  int amt,. 
15260 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 6f   sqlite3_int64 o
15270 66 66 73 65 74 0a 29 7b 0a 20 20 75 6e 69 78 46  ffset.){.  unixF
15280 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e  ile *pFile = (un
15290 69 78 46 69 6c 65 20 2a 29 69 64 3b 0a 20 20 69  ixFile *)id;.  i
152a0 6e 74 20 67 6f 74 3b 0a 20 20 61 73 73 65 72 74  nt got;.  assert
152b0 28 20 69 64 20 29 3b 0a 0a 20 20 2f 2a 20 49 66  ( id );..  /* If
152c0 20 74 68 69 73 20 69 73 20 61 20 64 61 74 61 62   this is a datab
152d0 61 73 65 20 66 69 6c 65 20 28 6e 6f 74 20 61 20  ase file (not a 
152e0 6a 6f 75 72 6e 61 6c 2c 20 6d 61 73 74 65 72 2d  journal, master-
152f0 6a 6f 75 72 6e 61 6c 20 6f 72 20 74 65 6d 70 0a  journal or temp.
15300 20 20 2a 2a 20 66 69 6c 65 29 2c 20 74 68 65 20    ** file), the 
15310 62 79 74 65 73 20 69 6e 20 74 68 65 20 6c 6f 63  bytes in the loc
15320 6b 69 6e 67 20 72 61 6e 67 65 20 73 68 6f 75 6c  king range shoul
15330 64 20 6e 65 76 65 72 20 62 65 20 72 65 61 64 20  d never be read 
15340 6f 72 20 77 72 69 74 74 65 6e 2e 20 2a 2f 0a 23  or written. */.#
15350 69 66 20 30 0a 20 20 61 73 73 65 72 74 28 20 70  if 0.  assert( p
15360 46 69 6c 65 2d 3e 70 55 6e 75 73 65 64 3d 3d 30  File->pUnused==0
15370 0a 20 20 20 20 20 20 20 7c 7c 20 6f 66 66 73 65  .       || offse
15380 74 3e 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 2b  t>=PENDING_BYTE+
15390 35 31 32 0a 20 20 20 20 20 20 20 7c 7c 20 6f 66  512.       || of
153a0 66 73 65 74 2b 61 6d 74 3c 3d 50 45 4e 44 49 4e  fset+amt<=PENDIN
153b0 47 5f 42 59 54 45 20 0a 20 20 29 3b 0a 23 65 6e  G_BYTE .  );.#en
153c0 64 69 66 0a 0a 20 20 67 6f 74 20 3d 20 73 65 65  dif..  got = see
153d0 6b 41 6e 64 52 65 61 64 28 70 46 69 6c 65 2c 20  kAndRead(pFile, 
153e0 6f 66 66 73 65 74 2c 20 70 42 75 66 2c 20 61 6d  offset, pBuf, am
153f0 74 29 3b 0a 20 20 69 66 28 20 67 6f 74 3d 3d 61  t);.  if( got==a
15400 6d 74 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  mt ){.    return
15410 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65   SQLITE_OK;.  }e
15420 6c 73 65 20 69 66 28 20 67 6f 74 3c 30 20 29 7b  lse if( got<0 ){
15430 0a 20 20 20 20 2f 2a 20 6c 61 73 74 45 72 72 6e  .    /* lastErrn
15440 6f 20 73 65 74 20 62 79 20 73 65 65 6b 41 6e 64  o set by seekAnd
15450 52 65 61 64 20 2a 2f 0a 20 20 20 20 72 65 74 75  Read */.    retu
15460 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  rn SQLITE_IOERR_
15470 52 45 41 44 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  READ;.  }else{. 
15480 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72     pFile->lastEr
15490 72 6e 6f 20 3d 20 30 3b 20 2f 2a 20 6e 6f 74 20  rno = 0; /* not 
154a0 61 20 73 79 73 74 65 6d 20 65 72 72 6f 72 20 2a  a system error *
154b0 2f 0a 20 20 20 20 2f 2a 20 55 6e 72 65 61 64 20  /.    /* Unread 
154c0 70 61 72 74 73 20 6f 66 20 74 68 65 20 62 75 66  parts of the buf
154d0 66 65 72 20 6d 75 73 74 20 62 65 20 7a 65 72 6f  fer must be zero
154e0 2d 66 69 6c 6c 65 64 20 2a 2f 0a 20 20 20 20 6d  -filled */.    m
154f0 65 6d 73 65 74 28 26 28 28 63 68 61 72 2a 29 70  emset(&((char*)p
15500 42 75 66 29 5b 67 6f 74 5d 2c 20 30 2c 20 61 6d  Buf)[got], 0, am
15510 74 2d 67 6f 74 29 3b 0a 20 20 20 20 72 65 74 75  t-got);.    retu
15520 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  rn SQLITE_IOERR_
15530 53 48 4f 52 54 5f 52 45 41 44 3b 0a 20 20 7d 0a  SHORT_READ;.  }.
15540 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 65 6b 20 74 6f  }../*.** Seek to
15550 20 74 68 65 20 6f 66 66 73 65 74 20 69 6e 20 69   the offset in i
15560 64 2d 3e 6f 66 66 73 65 74 20 74 68 65 6e 20 72  d->offset then r
15570 65 61 64 20 63 6e 74 20 62 79 74 65 73 20 69 6e  ead cnt bytes in
15580 74 6f 20 70 42 75 66 2e 0a 2a 2a 20 52 65 74 75  to pBuf..** Retu
15590 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  rn the number of
155a0 20 62 79 74 65 73 20 61 63 74 75 61 6c 6c 79 20   bytes actually 
155b0 72 65 61 64 2e 20 20 55 70 64 61 74 65 20 74 68  read.  Update th
155c0 65 20 6f 66 66 73 65 74 2e 0a 2a 2a 0a 2a 2a 20  e offset..**.** 
155d0 54 6f 20 61 76 6f 69 64 20 73 74 6f 6d 70 69 6e  To avoid stompin
155e0 67 20 74 68 65 20 65 72 72 6e 6f 20 76 61 6c 75  g the errno valu
155f0 65 20 6f 6e 20 61 20 66 61 69 6c 65 64 20 77 72  e on a failed wr
15600 69 74 65 20 74 68 65 20 6c 61 73 74 45 72 72 6e  ite the lastErrn
15610 6f 20 76 61 6c 75 65 0a 2a 2a 20 69 73 20 73 65  o value.** is se
15620 74 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69  t before returni
15630 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ng..*/.static in
15640 74 20 73 65 65 6b 41 6e 64 57 72 69 74 65 28 75  t seekAndWrite(u
15650 6e 69 78 46 69 6c 65 20 2a 69 64 2c 20 69 36 34  nixFile *id, i64
15660 20 6f 66 66 73 65 74 2c 20 63 6f 6e 73 74 20 76   offset, const v
15670 6f 69 64 20 2a 70 42 75 66 2c 20 69 6e 74 20 63  oid *pBuf, int c
15680 6e 74 29 7b 0a 20 20 69 6e 74 20 67 6f 74 3b 0a  nt){.  int got;.
15690 23 69 66 20 28 21 64 65 66 69 6e 65 64 28 55 53  #if (!defined(US
156a0 45 5f 50 52 45 41 44 29 20 26 26 20 21 64 65 66  E_PREAD) && !def
156b0 69 6e 65 64 28 55 53 45 5f 50 52 45 41 44 36 34  ined(USE_PREAD64
156c0 29 29 0a 20 20 69 36 34 20 6e 65 77 4f 66 66 73  )).  i64 newOffs
156d0 65 74 3b 0a 23 65 6e 64 69 66 0a 20 20 54 49 4d  et;.#endif.  TIM
156e0 45 52 5f 53 54 41 52 54 3b 0a 23 69 66 20 64 65  ER_START;.#if de
156f0 66 69 6e 65 64 28 55 53 45 5f 50 52 45 41 44 29  fined(USE_PREAD)
15700 0a 20 20 67 6f 74 20 3d 20 70 77 72 69 74 65 28  .  got = pwrite(
15710 69 64 2d 3e 68 2c 20 70 42 75 66 2c 20 63 6e 74  id->h, pBuf, cnt
15720 2c 20 6f 66 66 73 65 74 29 3b 0a 23 65 6c 69 66  , offset);.#elif
15730 20 64 65 66 69 6e 65 64 28 55 53 45 5f 50 52 45   defined(USE_PRE
15740 41 44 36 34 29 0a 20 20 67 6f 74 20 3d 20 70 77  AD64).  got = pw
15750 72 69 74 65 36 34 28 69 64 2d 3e 68 2c 20 70 42  rite64(id->h, pB
15760 75 66 2c 20 63 6e 74 2c 20 6f 66 66 73 65 74 29  uf, cnt, offset)
15770 3b 0a 23 65 6c 73 65 0a 20 20 6e 65 77 4f 66 66  ;.#else.  newOff
15780 73 65 74 20 3d 20 6c 73 65 65 6b 28 69 64 2d 3e  set = lseek(id->
15790 68 2c 20 6f 66 66 73 65 74 2c 20 53 45 45 4b 5f  h, offset, SEEK_
157a0 53 45 54 29 3b 0a 20 20 69 66 28 20 6e 65 77 4f  SET);.  if( newO
157b0 66 66 73 65 74 21 3d 6f 66 66 73 65 74 20 29 7b  ffset!=offset ){
157c0 0a 20 20 20 20 69 66 28 20 6e 65 77 4f 66 66 73  .    if( newOffs
157d0 65 74 20 3d 3d 20 2d 31 20 29 7b 0a 20 20 20 20  et == -1 ){.    
157e0 20 20 28 28 75 6e 69 78 46 69 6c 65 2a 29 69 64    ((unixFile*)id
157f0 29 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 65  )->lastErrno = e
15800 72 72 6e 6f 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  rrno;.    }else{
15810 0a 20 20 20 20 20 20 28 28 75 6e 69 78 46 69 6c  .      ((unixFil
15820 65 2a 29 69 64 29 2d 3e 6c 61 73 74 45 72 72 6e  e*)id)->lastErrn
15830 6f 20 3d 20 30 3b 09 09 09 0a 20 20 20 20 7d 0a  o = 0;....    }.
15840 20 20 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20      return -1;. 
15850 20 7d 0a 20 20 67 6f 74 20 3d 20 77 72 69 74 65   }.  got = write
15860 28 69 64 2d 3e 68 2c 20 70 42 75 66 2c 20 63 6e  (id->h, pBuf, cn
15870 74 29 3b 0a 23 65 6e 64 69 66 0a 20 20 54 49 4d  t);.#endif.  TIM
15880 45 52 5f 45 4e 44 3b 0a 20 20 69 66 28 20 67 6f  ER_END;.  if( go
15890 74 3c 30 20 29 7b 0a 20 20 20 20 28 28 75 6e 69  t<0 ){.    ((uni
158a0 78 46 69 6c 65 2a 29 69 64 29 2d 3e 6c 61 73 74  xFile*)id)->last
158b0 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20  Errno = errno;. 
158c0 20 7d 0a 0a 20 20 4f 53 54 52 41 43 45 28 28 22   }..  OSTRACE(("
158d0 57 52 49 54 45 20 20 20 25 2d 33 64 20 25 35 64  WRITE   %-3d %5d
158e0 20 25 37 6c 6c 64 20 25 6c 6c 75 5c 6e 22 2c 20   %7lld %llu\n", 
158f0 69 64 2d 3e 68 2c 20 67 6f 74 2c 20 6f 66 66 73  id->h, got, offs
15900 65 74 2c 20 54 49 4d 45 52 5f 45 4c 41 50 53 45  et, TIMER_ELAPSE
15910 44 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 67 6f  D));.  return go
15920 74 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 57 72 69  t;.}.../*.** Wri
15930 74 65 20 64 61 74 61 20 66 72 6f 6d 20 61 20 62  te data from a b
15940 75 66 66 65 72 20 69 6e 74 6f 20 61 20 66 69 6c  uffer into a fil
15950 65 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54  e.  Return SQLIT
15960 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73 0a  E_OK on success.
15970 2a 2a 20 6f 72 20 73 6f 6d 65 20 6f 74 68 65 72  ** or some other
15980 20 65 72 72 6f 72 20 63 6f 64 65 20 6f 6e 20 66   error code on f
15990 61 69 6c 75 72 65 2e 0a 2a 2f 0a 73 74 61 74 69  ailure..*/.stati
159a0 63 20 69 6e 74 20 75 6e 69 78 57 72 69 74 65 28  c int unixWrite(
159b0 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  .  sqlite3_file 
159c0 2a 69 64 2c 20 0a 20 20 63 6f 6e 73 74 20 76 6f  *id, .  const vo
159d0 69 64 20 2a 70 42 75 66 2c 20 0a 20 20 69 6e 74  id *pBuf, .  int
159e0 20 61 6d 74 2c 0a 20 20 73 71 6c 69 74 65 33 5f   amt,.  sqlite3_
159f0 69 6e 74 36 34 20 6f 66 66 73 65 74 20 0a 29 7b  int64 offset .){
15a00 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69  .  unixFile *pFi
15a10 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29  le = (unixFile*)
15a20 69 64 3b 0a 20 20 69 6e 74 20 77 72 6f 74 65 20  id;.  int wrote 
15a30 3d 20 30 3b 0a 20 20 61 73 73 65 72 74 28 20 69  = 0;.  assert( i
15a40 64 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61  d );.  assert( a
15a50 6d 74 3e 30 20 29 3b 0a 0a 20 20 2f 2a 20 49 66  mt>0 );..  /* If
15a60 20 74 68 69 73 20 69 73 20 61 20 64 61 74 61 62   this is a datab
15a70 61 73 65 20 66 69 6c 65 20 28 6e 6f 74 20 61 20  ase file (not a 
15a80 6a 6f 75 72 6e 61 6c 2c 20 6d 61 73 74 65 72 2d  journal, master-
15a90 6a 6f 75 72 6e 61 6c 20 6f 72 20 74 65 6d 70 0a  journal or temp.
15aa0 20 20 2a 2a 20 66 69 6c 65 29 2c 20 74 68 65 20    ** file), the 
15ab0 62 79 74 65 73 20 69 6e 20 74 68 65 20 6c 6f 63  bytes in the loc
15ac0 6b 69 6e 67 20 72 61 6e 67 65 20 73 68 6f 75 6c  king range shoul
15ad0 64 20 6e 65 76 65 72 20 62 65 20 72 65 61 64 20  d never be read 
15ae0 6f 72 20 77 72 69 74 74 65 6e 2e 20 2a 2f 0a 23  or written. */.#
15af0 69 66 20 30 0a 20 20 61 73 73 65 72 74 28 20 70  if 0.  assert( p
15b00 46 69 6c 65 2d 3e 70 55 6e 75 73 65 64 3d 3d 30  File->pUnused==0
15b10 0a 20 20 20 20 20 20 20 7c 7c 20 6f 66 66 73 65  .       || offse
15b20 74 3e 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 2b  t>=PENDING_BYTE+
15b30 35 31 32 0a 20 20 20 20 20 20 20 7c 7c 20 6f 66  512.       || of
15b40 66 73 65 74 2b 61 6d 74 3c 3d 50 45 4e 44 49 4e  fset+amt<=PENDIN
15b50 47 5f 42 59 54 45 20 0a 20 20 29 3b 0a 23 65 6e  G_BYTE .  );.#en
15b60 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 4e 44 45  dif..#ifndef NDE
15b70 42 55 47 0a 20 20 2f 2a 20 49 66 20 77 65 20 61  BUG.  /* If we a
15b80 72 65 20 64 6f 69 6e 67 20 61 20 6e 6f 72 6d 61  re doing a norma
15b90 6c 20 77 72 69 74 65 20 74 6f 20 61 20 64 61 74  l write to a dat
15ba0 61 62 61 73 65 20 66 69 6c 65 20 28 61 73 20 6f  abase file (as o
15bb0 70 70 6f 73 65 64 20 74 6f 0a 20 20 2a 2a 20 64  pposed to.  ** d
15bc0 6f 69 6e 67 20 61 20 68 6f 74 2d 6a 6f 75 72 6e  oing a hot-journ
15bd0 61 6c 20 72 6f 6c 6c 62 61 63 6b 20 6f 72 20 61  al rollback or a
15be0 20 77 72 69 74 65 20 74 6f 20 73 6f 6d 65 20 66   write to some f
15bf0 69 6c 65 20 6f 74 68 65 72 20 74 68 61 6e 20 61  ile other than a
15c00 0a 20 20 2a 2a 20 6e 6f 72 6d 61 6c 20 64 61 74  .  ** normal dat
15c10 61 62 61 73 65 20 66 69 6c 65 29 20 74 68 65 6e  abase file) then
15c20 20 72 65 63 6f 72 64 20 74 68 65 20 66 61 63 74   record the fact
15c30 20 74 68 61 74 20 74 68 65 20 64 61 74 61 62 61   that the databa
15c40 73 65 0a 20 20 2a 2a 20 68 61 73 20 63 68 61 6e  se.  ** has chan
15c50 67 65 64 2e 20 20 49 66 20 74 68 65 20 74 72 61  ged.  If the tra
15c60 6e 73 61 63 74 69 6f 6e 20 63 6f 75 6e 74 65 72  nsaction counter
15c70 20 69 73 20 6d 6f 64 69 66 69 65 64 2c 20 72 65   is modified, re
15c80 63 6f 72 64 20 74 68 61 74 0a 20 20 2a 2a 20 66  cord that.  ** f
15c90 61 63 74 20 74 6f 6f 2e 0a 20 20 2a 2f 0a 20 20  act too..  */.  
15ca0 69 66 28 20 70 46 69 6c 65 2d 3e 69 6e 4e 6f 72  if( pFile->inNor
15cb0 6d 61 6c 57 72 69 74 65 20 29 7b 0a 20 20 20 20  malWrite ){.    
15cc0 70 46 69 6c 65 2d 3e 64 62 55 70 64 61 74 65 20  pFile->dbUpdate 
15cd0 3d 20 31 3b 20 20 2f 2a 20 54 68 65 20 64 61 74  = 1;  /* The dat
15ce0 61 62 61 73 65 20 68 61 73 20 62 65 65 6e 20 6d  abase has been m
15cf0 6f 64 69 66 69 65 64 20 2a 2f 0a 20 20 20 20 69  odified */.    i
15d00 66 28 20 6f 66 66 73 65 74 3c 3d 32 34 20 26 26  f( offset<=24 &&
15d10 20 6f 66 66 73 65 74 2b 61 6d 74 3e 3d 32 37 20   offset+amt>=27 
15d20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 72 63 3b  ){.      int rc;
15d30 0a 20 20 20 20 20 20 63 68 61 72 20 6f 6c 64 43  .      char oldC
15d40 6e 74 72 5b 34 5d 3b 0a 20 20 20 20 20 20 53 69  ntr[4];.      Si
15d50 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 42 65 6e  mulateIOErrorBen
15d60 69 67 6e 28 31 29 3b 0a 20 20 20 20 20 20 72 63  ign(1);.      rc
15d70 20 3d 20 73 65 65 6b 41 6e 64 52 65 61 64 28 70   = seekAndRead(p
15d80 46 69 6c 65 2c 20 32 34 2c 20 6f 6c 64 43 6e 74  File, 24, oldCnt
15d90 72 2c 20 34 29 3b 0a 20 20 20 20 20 20 53 69 6d  r, 4);.      Sim
15da0 75 6c 61 74 65 49 4f 45 72 72 6f 72 42 65 6e 69  ulateIOErrorBeni
15db0 67 6e 28 30 29 3b 0a 20 20 20 20 20 20 69 66 28  gn(0);.      if(
15dc0 20 72 63 21 3d 34 20 7c 7c 20 6d 65 6d 63 6d 70   rc!=4 || memcmp
15dd0 28 6f 6c 64 43 6e 74 72 2c 20 26 28 28 63 68 61  (oldCntr, &((cha
15de0 72 2a 29 70 42 75 66 29 5b 32 34 2d 6f 66 66 73  r*)pBuf)[24-offs
15df0 65 74 5d 2c 20 34 29 21 3d 30 20 29 7b 0a 20 20  et], 4)!=0 ){.  
15e00 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 74 72 61        pFile->tra
15e10 6e 73 43 6e 74 72 43 68 6e 67 20 3d 20 31 3b 20  nsCntrChng = 1; 
15e20 20 2f 2a 20 54 68 65 20 74 72 61 6e 73 61 63 74   /* The transact
15e30 69 6f 6e 20 63 6f 75 6e 74 65 72 20 68 61 73 20  ion counter has 
15e40 63 68 61 6e 67 65 64 20 2a 2f 0a 20 20 20 20 20  changed */.     
15e50 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e   }.    }.  }.#en
15e60 64 69 66 0a 0a 20 20 77 68 69 6c 65 28 20 61 6d  dif..  while( am
15e70 74 3e 30 20 26 26 20 28 77 72 6f 74 65 20 3d 20  t>0 && (wrote = 
15e80 73 65 65 6b 41 6e 64 57 72 69 74 65 28 70 46 69  seekAndWrite(pFi
15e90 6c 65 2c 20 6f 66 66 73 65 74 2c 20 70 42 75 66  le, offset, pBuf
15ea0 2c 20 61 6d 74 29 29 3e 30 20 29 7b 0a 20 20 20  , amt))>0 ){.   
15eb0 20 61 6d 74 20 2d 3d 20 77 72 6f 74 65 3b 0a 20   amt -= wrote;. 
15ec0 20 20 20 6f 66 66 73 65 74 20 2b 3d 20 77 72 6f     offset += wro
15ed0 74 65 3b 0a 20 20 20 20 70 42 75 66 20 3d 20 26  te;.    pBuf = &
15ee0 28 28 63 68 61 72 2a 29 70 42 75 66 29 5b 77 72  ((char*)pBuf)[wr
15ef0 6f 74 65 5d 3b 0a 20 20 7d 0a 20 20 53 69 6d 75  ote];.  }.  Simu
15f00 6c 61 74 65 49 4f 45 72 72 6f 72 28 28 20 77 72  lateIOError(( wr
15f10 6f 74 65 3d 28 2d 31 29 2c 20 61 6d 74 3d 31 20  ote=(-1), amt=1 
15f20 29 29 3b 0a 20 20 53 69 6d 75 6c 61 74 65 44 69  ));.  SimulateDi
15f30 73 6b 66 75 6c 6c 45 72 72 6f 72 28 28 20 77 72  skfullError(( wr
15f40 6f 74 65 3d 30 2c 20 61 6d 74 3d 31 20 29 29 3b  ote=0, amt=1 ));
15f50 0a 20 20 69 66 28 20 61 6d 74 3e 30 20 29 7b 0a  .  if( amt>0 ){.
15f60 20 20 20 20 69 66 28 20 77 72 6f 74 65 3c 30 20      if( wrote<0 
15f70 29 7b 0a 20 20 20 20 20 20 2f 2a 20 6c 61 73 74  ){.      /* last
15f80 45 72 72 6e 6f 20 73 65 74 20 62 79 20 73 65 65  Errno set by see
15f90 6b 41 6e 64 57 72 69 74 65 20 2a 2f 0a 20 20 20  kAndWrite */.   
15fa0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
15fb0 5f 49 4f 45 52 52 5f 57 52 49 54 45 3b 0a 20 20  _IOERR_WRITE;.  
15fc0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70    }else{.      p
15fd0 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20  File->lastErrno 
15fe0 3d 20 30 3b 20 2f 2a 20 6e 6f 74 20 61 20 73 79  = 0; /* not a sy
15ff0 73 74 65 6d 20 65 72 72 6f 72 20 2a 2f 0a 20 20  stem error */.  
16000 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
16010 45 5f 46 55 4c 4c 3b 0a 20 20 20 20 7d 0a 20 20  E_FULL;.    }.  
16020 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  }.  return SQLIT
16030 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 64 65 66 20  E_OK;.}..#ifdef 
16040 53 51 4c 49 54 45 5f 54 45 53 54 0a 2f 2a 0a 2a  SQLITE_TEST./*.*
16050 2a 20 43 6f 75 6e 74 20 74 68 65 20 6e 75 6d 62  * Count the numb
16060 65 72 20 6f 66 20 66 75 6c 6c 73 79 6e 63 73 20  er of fullsyncs 
16070 61 6e 64 20 6e 6f 72 6d 61 6c 20 73 79 6e 63 73  and normal syncs
16080 2e 20 20 54 68 69 73 20 69 73 20 75 73 65 64 20  .  This is used 
16090 74 6f 20 74 65 73 74 0a 2a 2a 20 74 68 61 74 20  to test.** that 
160a0 73 79 6e 63 73 20 61 6e 64 20 66 75 6c 6c 73 79  syncs and fullsy
160b0 6e 63 73 20 61 72 65 20 6f 63 63 75 72 72 69 6e  ncs are occurrin
160c0 67 20 61 74 20 74 68 65 20 72 69 67 68 74 20 74  g at the right t
160d0 69 6d 65 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  imes..*/.int sql
160e0 69 74 65 33 5f 73 79 6e 63 5f 63 6f 75 6e 74 20  ite3_sync_count 
160f0 3d 20 30 3b 0a 69 6e 74 20 73 71 6c 69 74 65 33  = 0;.int sqlite3
16100 5f 66 75 6c 6c 73 79 6e 63 5f 63 6f 75 6e 74 20  _fullsync_count 
16110 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  = 0;.#endif../*.
16120 2a 2a 20 57 65 20 64 6f 20 6e 6f 74 20 74 72 75  ** We do not tru
16130 73 74 20 73 79 73 74 65 6d 73 20 74 6f 20 70 72  st systems to pr
16140 6f 76 69 64 65 20 61 20 77 6f 72 6b 69 6e 67 20  ovide a working 
16150 66 64 61 74 61 73 79 6e 63 28 29 2e 20 20 53 6f  fdatasync().  So
16160 6d 65 20 64 6f 2e 0a 2a 2a 20 4f 74 68 65 72 73  me do..** Others
16170 20 64 6f 20 6e 6f 2e 20 20 54 6f 20 62 65 20 73   do no.  To be s
16180 61 66 65 2c 20 77 65 20 77 69 6c 6c 20 73 74 69  afe, we will sti
16190 63 6b 20 77 69 74 68 20 74 68 65 20 28 73 6c 6f  ck with the (slo
161a0 77 65 72 29 20 66 73 79 6e 63 28 29 2e 0a 2a 2a  wer) fsync()..**
161b0 20 49 66 20 79 6f 75 20 6b 6e 6f 77 20 74 68 61   If you know tha
161c0 74 20 79 6f 75 72 20 73 79 73 74 65 6d 20 64 6f  t your system do
161d0 65 73 20 73 75 70 70 6f 72 74 20 66 64 61 74 61  es support fdata
161e0 73 79 6e 63 28 29 20 63 6f 72 72 65 63 74 6c 79  sync() correctly
161f0 2c 0a 2a 2a 20 74 68 65 6e 20 73 69 6d 70 6c 79  ,.** then simply
16200 20 63 6f 6d 70 69 6c 65 20 77 69 74 68 20 2d 44   compile with -D
16210 66 64 61 74 61 73 79 6e 63 3d 66 64 61 74 61 73  fdatasync=fdatas
16220 79 6e 63 0a 2a 2f 0a 23 69 66 20 21 64 65 66 69  ync.*/.#if !defi
16230 6e 65 64 28 66 64 61 74 61 73 79 6e 63 29 20 26  ned(fdatasync) &
16240 26 20 21 64 65 66 69 6e 65 64 28 5f 5f 6c 69 6e  & !defined(__lin
16250 75 78 5f 5f 29 0a 23 20 64 65 66 69 6e 65 20 66  ux__).# define f
16260 64 61 74 61 73 79 6e 63 20 66 73 79 6e 63 0a 23  datasync fsync.#
16270 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 44 65 66  endif../*.** Def
16280 69 6e 65 20 48 41 56 45 5f 46 55 4c 4c 46 53 59  ine HAVE_FULLFSY
16290 4e 43 20 74 6f 20 30 20 6f 72 20 31 20 64 65 70  NC to 0 or 1 dep
162a0 65 6e 64 69 6e 67 20 6f 6e 20 77 68 65 74 68 65  ending on whethe
162b0 72 20 6f 72 20 6e 6f 74 0a 2a 2a 20 74 68 65 20  r or not.** the 
162c0 46 5f 46 55 4c 4c 46 53 59 4e 43 20 6d 61 63 72  F_FULLFSYNC macr
162d0 6f 20 69 73 20 64 65 66 69 6e 65 64 2e 20 20 46  o is defined.  F
162e0 5f 46 55 4c 4c 46 53 59 4e 43 20 69 73 20 63 75  _FULLFSYNC is cu
162f0 72 72 65 6e 74 6c 79 0a 2a 2a 20 6f 6e 6c 79 20  rrently.** only 
16300 61 76 61 69 6c 61 62 6c 65 20 6f 6e 20 4d 61 63  available on Mac
16310 20 4f 53 20 58 2e 20 20 42 75 74 20 74 68 61 74   OS X.  But that
16320 20 63 6f 75 6c 64 20 63 68 61 6e 67 65 2e 0a 2a   could change..*
16330 2f 0a 23 69 66 64 65 66 20 46 5f 46 55 4c 4c 46  /.#ifdef F_FULLF
16340 53 59 4e 43 0a 23 20 64 65 66 69 6e 65 20 48 41  SYNC.# define HA
16350 56 45 5f 46 55 4c 4c 46 53 59 4e 43 20 31 0a 23  VE_FULLFSYNC 1.#
16360 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 48 41  else.# define HA
16370 56 45 5f 46 55 4c 4c 46 53 59 4e 43 20 30 0a 23  VE_FULLFSYNC 0.#
16380 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68  endif.../*.** Th
16390 65 20 66 73 79 6e 63 28 29 20 73 79 73 74 65 6d  e fsync() system
163a0 20 63 61 6c 6c 20 64 6f 65 73 20 6e 6f 74 20 77   call does not w
163b0 6f 72 6b 20 61 73 20 61 64 76 65 72 74 69 73 65  ork as advertise
163c0 64 20 6f 6e 20 6d 61 6e 79 0a 2a 2a 20 75 6e 69  d on many.** uni
163d0 78 20 73 79 73 74 65 6d 73 2e 20 20 54 68 65 20  x systems.  The 
163e0 66 6f 6c 6c 6f 77 69 6e 67 20 70 72 6f 63 65 64  following proced
163f0 75 72 65 20 69 73 20 61 6e 20 61 74 74 65 6d 70  ure is an attemp
16400 74 20 74 6f 20 6d 61 6b 65 0a 2a 2a 20 69 74 20  t to make.** it 
16410 77 6f 72 6b 20 62 65 74 74 65 72 2e 0a 2a 2a 0a  work better..**.
16420 2a 2a 20 54 68 65 20 53 51 4c 49 54 45 5f 4e 4f  ** The SQLITE_NO
16430 5f 53 59 4e 43 20 6d 61 63 72 6f 20 64 69 73 61  _SYNC macro disa
16440 62 6c 65 73 20 61 6c 6c 20 66 73 79 6e 63 28 29  bles all fsync()
16450 73 2e 20 20 54 68 69 73 20 69 73 20 75 73 65 66  s.  This is usef
16460 75 6c 0a 2a 2a 20 66 6f 72 20 74 65 73 74 69 6e  ul.** for testin
16470 67 20 77 68 65 6e 20 77 65 20 77 61 6e 74 20 74  g when we want t
16480 6f 20 72 75 6e 20 74 68 72 6f 75 67 68 20 74 68  o run through th
16490 65 20 74 65 73 74 20 73 75 69 74 65 20 71 75 69  e test suite qui
164a0 63 6b 6c 79 2e 0a 2a 2a 20 59 6f 75 20 61 72 65  ckly..** You are
164b0 20 73 74 72 6f 6e 67 6c 79 20 61 64 76 69 73 65   strongly advise
164c0 64 20 2a 6e 6f 74 2a 20 74 6f 20 64 65 70 6c 6f  d *not* to deplo
164d0 79 20 77 69 74 68 20 53 51 4c 49 54 45 5f 4e 4f  y with SQLITE_NO
164e0 5f 53 59 4e 43 0a 2a 2a 20 65 6e 61 62 6c 65 64  _SYNC.** enabled
164f0 2c 20 68 6f 77 65 76 65 72 2c 20 73 69 6e 63 65  , however, since
16500 20 77 69 74 68 20 53 51 4c 49 54 45 5f 4e 4f 5f   with SQLITE_NO_
16510 53 59 4e 43 20 65 6e 61 62 6c 65 64 2c 20 61 6e  SYNC enabled, an
16520 20 4f 53 20 63 72 61 73 68 0a 2a 2a 20 6f 72 20   OS crash.** or 
16530 70 6f 77 65 72 20 66 61 69 6c 75 72 65 20 77 69  power failure wi
16540 6c 6c 20 6c 69 6b 65 6c 79 20 63 6f 72 72 75 70  ll likely corrup
16550 74 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  t the database f
16560 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 69 74  ile..**.** SQLit
16570 65 20 73 65 74 73 20 74 68 65 20 64 61 74 61 4f  e sets the dataO
16580 6e 6c 79 20 66 6c 61 67 20 69 66 20 74 68 65 20  nly flag if the 
16590 73 69 7a 65 20 6f 66 20 74 68 65 20 66 69 6c 65  size of the file
165a0 20 69 73 20 75 6e 63 68 61 6e 67 65 64 2e 0a 2a   is unchanged..*
165b0 2a 20 54 68 65 20 69 64 65 61 20 62 65 68 69 6e  * The idea behin
165c0 64 20 64 61 74 61 4f 6e 6c 79 20 69 73 20 74 68  d dataOnly is th
165d0 61 74 20 69 74 20 73 68 6f 75 6c 64 20 6f 6e 6c  at it should onl
165e0 79 20 77 72 69 74 65 20 74 68 65 20 66 69 6c 65  y write the file
165f0 20 63 6f 6e 74 65 6e 74 0a 2a 2a 20 74 6f 20 64   content.** to d
16600 69 73 6b 2c 20 6e 6f 74 20 74 68 65 20 69 6e 6f  isk, not the ino
16610 64 65 2e 20 20 57 65 20 6f 6e 6c 79 20 73 65 74  de.  We only set
16620 20 64 61 74 61 4f 6e 6c 79 20 69 66 20 74 68 65   dataOnly if the
16630 20 66 69 6c 65 20 73 69 7a 65 20 69 73 20 0a 2a   file size is .*
16640 2a 20 75 6e 63 68 61 6e 67 65 64 20 73 69 6e 63  * unchanged sinc
16650 65 20 74 68 65 20 66 69 6c 65 20 73 69 7a 65 20  e the file size 
16660 69 73 20 70 61 72 74 20 6f 66 20 74 68 65 20 69  is part of the i
16670 6e 6f 64 65 2e 20 20 48 6f 77 65 76 65 72 2c 20  node.  However, 
16680 0a 2a 2a 20 54 65 64 20 54 73 27 6f 20 74 65 6c  .** Ted Ts'o tel
16690 6c 73 20 75 73 20 74 68 61 74 20 66 64 61 74 61  ls us that fdata
166a0 73 79 6e 63 28 29 20 77 69 6c 6c 20 61 6c 73 6f  sync() will also
166b0 20 77 72 69 74 65 20 74 68 65 20 69 6e 6f 64 65   write the inode
166c0 20 69 66 20 74 68 65 0a 2a 2a 20 66 69 6c 65 20   if the.** file 
166d0 73 69 7a 65 20 68 61 73 20 63 68 61 6e 67 65 64  size has changed
166e0 2e 20 20 54 68 65 20 6f 6e 6c 79 20 72 65 61 6c  .  The only real
166f0 20 64 69 66 66 65 72 65 6e 63 65 20 62 65 74 77   difference betw
16700 65 65 6e 20 66 64 61 74 61 73 79 6e 63 28 29 0a  een fdatasync().
16710 2a 2a 20 61 6e 64 20 66 73 79 6e 63 28 29 2c 20  ** and fsync(), 
16720 54 65 64 20 74 65 6c 6c 73 20 75 73 2c 20 69 73  Ted tells us, is
16730 20 74 68 61 74 20 66 64 61 74 61 73 79 6e 63 28   that fdatasync(
16740 29 20 77 69 6c 6c 20 6e 6f 74 20 66 6c 75 73 68  ) will not flush
16750 20 74 68 65 0a 2a 2a 20 69 6e 6f 64 65 20 69 66   the.** inode if
16760 20 74 68 65 20 6d 74 69 6d 65 20 6f 72 20 6f 77   the mtime or ow
16770 6e 65 72 20 6f 72 20 6f 74 68 65 72 20 69 6e 6f  ner or other ino
16780 64 65 20 61 74 74 72 69 62 75 74 65 73 20 68 61  de attributes ha
16790 76 65 20 63 68 61 6e 67 65 64 2e 0a 2a 2a 20 57  ve changed..** W
167a0 65 20 6f 6e 6c 79 20 63 61 72 65 20 61 62 6f 75  e only care abou
167b0 74 20 74 68 65 20 66 69 6c 65 20 73 69 7a 65 2c  t the file size,
167c0 20 6e 6f 74 20 74 68 65 20 6f 74 68 65 72 20 66   not the other f
167d0 69 6c 65 20 61 74 74 72 69 62 75 74 65 73 2c 20  ile attributes, 
167e0 73 6f 0a 2a 2a 20 61 73 20 66 61 72 20 61 73 20  so.** as far as 
167f0 53 51 4c 69 74 65 20 69 73 20 63 6f 6e 63 65 72  SQLite is concer
16800 6e 65 64 2c 20 61 6e 20 66 64 61 74 61 73 79 6e  ned, an fdatasyn
16810 63 28 29 20 69 73 20 61 6c 77 61 79 73 20 61 64  c() is always ad
16820 65 71 75 61 74 65 2e 0a 2a 2a 20 53 6f 2c 20 77  equate..** So, w
16830 65 20 61 6c 77 61 79 73 20 75 73 65 20 66 64 61  e always use fda
16840 74 61 73 79 6e 63 28 29 20 69 66 20 69 74 20 69  tasync() if it i
16850 73 20 61 76 61 69 6c 61 62 6c 65 2c 20 72 65 67  s available, reg
16860 61 72 64 6c 65 73 73 20 6f 66 0a 2a 2a 20 74 68  ardless of.** th
16870 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 64  e value of the d
16880 61 74 61 4f 6e 6c 79 20 66 6c 61 67 2e 0a 2a 2f  ataOnly flag..*/
16890 0a 73 74 61 74 69 63 20 69 6e 74 20 66 75 6c 6c  .static int full
168a0 5f 66 73 79 6e 63 28 69 6e 74 20 66 64 2c 20 69  _fsync(int fd, i
168b0 6e 74 20 66 75 6c 6c 53 79 6e 63 2c 20 69 6e 74  nt fullSync, int
168c0 20 64 61 74 61 4f 6e 6c 79 29 7b 0a 20 20 69 6e   dataOnly){.  in
168d0 74 20 72 63 3b 0a 0a 20 20 2f 2a 20 54 68 65 20  t rc;..  /* The 
168e0 66 6f 6c 6c 6f 77 69 6e 67 20 22 69 66 64 65 66  following "ifdef
168f0 2f 65 6c 69 66 2f 65 6c 73 65 2f 22 20 62 6c 6f  /elif/else/" blo
16900 63 6b 20 68 61 73 20 74 68 65 20 73 61 6d 65 20  ck has the same 
16910 73 74 72 75 63 74 75 72 65 20 61 73 0a 20 20 2a  structure as.  *
16920 2a 20 74 68 65 20 6f 6e 65 20 62 65 6c 6f 77 2e  * the one below.
16930 20 49 74 20 69 73 20 72 65 70 6c 69 63 61 74 65   It is replicate
16940 64 20 68 65 72 65 20 73 6f 6c 65 6c 79 20 74 6f  d here solely to
16950 20 61 76 6f 69 64 20 63 6c 75 74 74 65 72 69 6e   avoid clutterin
16960 67 20 0a 20 20 2a 2a 20 75 70 20 74 68 65 20 72  g .  ** up the r
16970 65 61 6c 20 63 6f 64 65 20 77 69 74 68 20 74 68  eal code with th
16980 65 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54  e UNUSED_PARAMET
16990 45 52 28 29 20 6d 61 63 72 6f 73 2e 0a 20 20 2a  ER() macros..  *
169a0 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /.#ifdef SQLITE_
169b0 4e 4f 5f 53 59 4e 43 0a 20 20 55 4e 55 53 45 44  NO_SYNC.  UNUSED
169c0 5f 50 41 52 41 4d 45 54 45 52 28 66 64 29 3b 0a  _PARAMETER(fd);.
169d0 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
169e0 45 52 28 66 75 6c 6c 53 79 6e 63 29 3b 0a 20 20  ER(fullSync);.  
169f0 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
16a00 28 64 61 74 61 4f 6e 6c 79 29 3b 0a 23 65 6c 69  (dataOnly);.#eli
16a10 66 20 48 41 56 45 5f 46 55 4c 4c 46 53 59 4e 43  f HAVE_FULLFSYNC
16a20 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
16a30 54 45 52 28 64 61 74 61 4f 6e 6c 79 29 3b 0a 23  TER(dataOnly);.#
16a40 65 6c 73 65 0a 20 20 55 4e 55 53 45 44 5f 50 41  else.  UNUSED_PA
16a50 52 41 4d 45 54 45 52 28 66 75 6c 6c 53 79 6e 63  RAMETER(fullSync
16a60 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  );.  UNUSED_PARA
16a70 4d 45 54 45 52 28 64 61 74 61 4f 6e 6c 79 29 3b  METER(dataOnly);
16a80 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 52 65  .#endif..  /* Re
16a90 63 6f 72 64 20 74 68 65 20 6e 75 6d 62 65 72 20  cord the number 
16aa0 6f 66 20 74 69 6d 65 73 20 74 68 61 74 20 77 65  of times that we
16ab0 20 64 6f 20 61 20 6e 6f 72 6d 61 6c 20 66 73 79   do a normal fsy
16ac0 6e 63 28 29 20 61 6e 64 20 0a 20 20 2a 2a 20 46  nc() and .  ** F
16ad0 55 4c 4c 53 59 4e 43 2e 20 20 54 68 69 73 20 69  ULLSYNC.  This i
16ae0 73 20 75 73 65 64 20 64 75 72 69 6e 67 20 74 65  s used during te
16af0 73 74 69 6e 67 20 74 6f 20 76 65 72 69 66 79 20  sting to verify 
16b00 74 68 61 74 20 74 68 69 73 20 70 72 6f 63 65 64  that this proced
16b10 75 72 65 0a 20 20 2a 2a 20 67 65 74 73 20 63 61  ure.  ** gets ca
16b20 6c 6c 65 64 20 77 69 74 68 20 74 68 65 20 63 6f  lled with the co
16b30 72 72 65 63 74 20 61 72 67 75 6d 65 6e 74 73 2e  rrect arguments.
16b40 0a 20 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c  .  */.#ifdef SQL
16b50 49 54 45 5f 54 45 53 54 0a 20 20 69 66 28 20 66  ITE_TEST.  if( f
16b60 75 6c 6c 53 79 6e 63 20 29 20 73 71 6c 69 74 65  ullSync ) sqlite
16b70 33 5f 66 75 6c 6c 73 79 6e 63 5f 63 6f 75 6e 74  3_fullsync_count
16b80 2b 2b 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73 79  ++;.  sqlite3_sy
16b90 6e 63 5f 63 6f 75 6e 74 2b 2b 3b 0a 23 65 6e 64  nc_count++;.#end
16ba0 69 66 0a 0a 20 20 2f 2a 20 49 66 20 77 65 20 63  if..  /* If we c
16bb0 6f 6d 70 69 6c 65 64 20 77 69 74 68 20 74 68 65  ompiled with the
16bc0 20 53 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e 43 20   SQLITE_NO_SYNC 
16bd0 66 6c 61 67 2c 20 74 68 65 6e 20 73 79 6e 63 69  flag, then synci
16be0 6e 67 20 69 73 20 61 0a 20 20 2a 2a 20 6e 6f 2d  ng is a.  ** no-
16bf0 6f 70 0a 20 20 2a 2f 0a 23 69 66 64 65 66 20 53  op.  */.#ifdef S
16c00 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e 43 0a 20 20  QLITE_NO_SYNC.  
16c10 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
16c20 23 65 6c 69 66 20 48 41 56 45 5f 46 55 4c 4c 46  #elif HAVE_FULLF
16c30 53 59 4e 43 0a 20 20 69 66 28 20 66 75 6c 6c 53  SYNC.  if( fullS
16c40 79 6e 63 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  ync ){.    rc = 
16c50 66 63 6e 74 6c 28 66 64 2c 20 46 5f 46 55 4c 4c  fcntl(fd, F_FULL
16c60 46 53 59 4e 43 2c 20 30 29 3b 0a 20 20 7d 65 6c  FSYNC, 0);.  }el
16c70 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 31 3b 0a  se{.    rc = 1;.
16c80 20 20 7d 0a 20 20 2f 2a 20 49 66 20 74 68 65 20    }.  /* If the 
16c90 46 55 4c 4c 46 53 59 4e 43 20 66 61 69 6c 65 64  FULLFSYNC failed
16ca0 2c 20 66 61 6c 6c 20 62 61 63 6b 20 74 6f 20 61  , fall back to a
16cb0 74 74 65 6d 70 74 69 6e 67 20 61 6e 20 66 73 79  ttempting an fsy
16cc0 6e 63 28 29 2e 0a 20 20 2a 2a 20 49 74 20 73 68  nc()..  ** It sh
16cd0 6f 75 6c 64 6e 27 74 20 62 65 20 70 6f 73 73 69  ouldn't be possi
16ce0 62 6c 65 20 66 6f 72 20 66 75 6c 6c 66 73 79 6e  ble for fullfsyn
16cf0 63 20 74 6f 20 66 61 69 6c 20 6f 6e 20 74 68 65  c to fail on the
16d00 20 6c 6f 63 61 6c 20 0a 20 20 2a 2a 20 66 69 6c   local .  ** fil
16d10 65 20 73 79 73 74 65 6d 20 28 6f 6e 20 4f 53 58  e system (on OSX
16d20 29 2c 20 73 6f 20 66 61 69 6c 75 72 65 20 69 6e  ), so failure in
16d30 64 69 63 61 74 65 73 20 74 68 61 74 20 46 55 4c  dicates that FUL
16d40 4c 46 53 59 4e 43 0a 20 20 2a 2a 20 69 73 6e 27  LFSYNC.  ** isn'
16d50 74 20 73 75 70 70 6f 72 74 65 64 20 66 6f 72 20  t supported for 
16d60 74 68 69 73 20 66 69 6c 65 20 73 79 73 74 65 6d  this file system
16d70 2e 20 53 6f 2c 20 61 74 74 65 6d 70 74 20 61 6e  . So, attempt an
16d80 20 66 73 79 6e 63 20 0a 20 20 2a 2a 20 61 6e 64   fsync .  ** and
16d90 20 28 66 6f 72 20 6e 6f 77 29 20 69 67 6e 6f 72   (for now) ignor
16da0 65 20 74 68 65 20 6f 76 65 72 68 65 61 64 20 6f  e the overhead o
16db0 66 20 61 20 73 75 70 65 72 66 6c 75 6f 75 73 20  f a superfluous 
16dc0 66 63 6e 74 6c 20 63 61 6c 6c 2e 20 20 0a 20 20  fcntl call.  .  
16dd0 2a 2a 20 49 74 27 64 20 62 65 20 62 65 74 74 65  ** It'd be bette
16de0 72 20 74 6f 20 64 65 74 65 63 74 20 66 75 6c 6c  r to detect full
16df0 66 73 79 6e 63 20 73 75 70 70 6f 72 74 20 6f 6e  fsync support on
16e00 63 65 20 61 6e 64 20 61 76 6f 69 64 20 0a 20 20  ce and avoid .  
16e10 2a 2a 20 74 68 65 20 66 63 6e 74 6c 20 63 61 6c  ** the fcntl cal
16e20 6c 20 65 76 65 72 79 20 74 69 6d 65 20 73 79 6e  l every time syn
16e30 63 20 69 73 20 63 61 6c 6c 65 64 2e 0a 20 20 2a  c is called..  *
16e40 2f 0a 20 20 69 66 28 20 72 63 20 29 20 72 63 20  /.  if( rc ) rc 
16e50 3d 20 66 73 79 6e 63 28 66 64 29 3b 0a 0a 23 65  = fsync(fd);..#e
16e60 6c 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 41 50  lif defined(__AP
16e70 50 4c 45 5f 5f 29 0a 20 20 2f 2a 20 66 64 61 74  PLE__).  /* fdat
16e80 61 73 79 6e 63 28 29 20 6f 6e 20 48 46 53 2b 20  async() on HFS+ 
16e90 64 6f 65 73 6e 27 74 20 79 65 74 20 66 6c 75 73  doesn't yet flus
16ea0 68 20 74 68 65 20 66 69 6c 65 20 73 69 7a 65 20  h the file size 
16eb0 69 66 20 69 74 20 63 68 61 6e 67 65 64 20 63 6f  if it changed co
16ec0 72 72 65 63 74 6c 79 0a 20 20 2a 2a 20 73 6f 20  rrectly.  ** so 
16ed0 63 75 72 72 65 6e 74 6c 79 20 77 65 20 64 65 66  currently we def
16ee0 61 75 6c 74 20 74 6f 20 74 68 65 20 6d 61 63 72  ault to the macr
16ef0 6f 20 74 68 61 74 20 72 65 64 65 66 69 6e 65 73  o that redefines
16f00 20 66 64 61 74 61 73 79 6e 63 20 74 6f 20 66 73   fdatasync to fs
16f10 79 6e 63 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20  ync.  */.  rc = 
16f20 66 73 79 6e 63 28 66 64 29 3b 0a 23 65 6c 73 65  fsync(fd);.#else
16f30 20 0a 20 20 72 63 20 3d 20 66 64 61 74 61 73 79   .  rc = fdatasy
16f40 6e 63 28 66 64 29 3b 0a 23 69 66 20 4f 53 5f 56  nc(fd);.#if OS_V
16f50 58 57 4f 52 4b 53 0a 20 20 69 66 28 20 72 63 3d  XWORKS.  if( rc=
16f60 3d 2d 31 20 26 26 20 65 72 72 6e 6f 3d 3d 45 4e  =-1 && errno==EN
16f70 4f 54 53 55 50 20 29 7b 0a 20 20 20 20 72 63 20  OTSUP ){.    rc 
16f80 3d 20 66 73 79 6e 63 28 66 64 29 3b 0a 20 20 7d  = fsync(fd);.  }
16f90 0a 23 65 6e 64 69 66 20 2f 2a 20 4f 53 5f 56 58  .#endif /* OS_VX
16fa0 57 4f 52 4b 53 20 2a 2f 0a 23 65 6e 64 69 66 20  WORKS */.#endif 
16fb0 2f 2a 20 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /* ifdef SQLITE_
16fc0 4e 4f 5f 53 59 4e 43 20 65 6c 69 66 20 48 41 56  NO_SYNC elif HAV
16fd0 45 5f 46 55 4c 4c 46 53 59 4e 43 20 2a 2f 0a 0a  E_FULLFSYNC */..
16fe0 20 20 69 66 28 20 4f 53 5f 56 58 57 4f 52 4b 53    if( OS_VXWORKS
16ff0 20 26 26 20 72 63 21 3d 20 2d 31 20 29 7b 0a 20   && rc!= -1 ){. 
17000 20 20 20 72 63 20 3d 20 30 3b 0a 20 20 7d 0a 20     rc = 0;.  }. 
17010 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
17020 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75 72 65 20 61  *.** Make sure a
17030 6c 6c 20 77 72 69 74 65 73 20 74 6f 20 61 20 70  ll writes to a p
17040 61 72 74 69 63 75 6c 61 72 20 66 69 6c 65 20 61  articular file a
17050 72 65 20 63 6f 6d 6d 69 74 74 65 64 20 74 6f 20  re committed to 
17060 64 69 73 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 64  disk..**.** If d
17070 61 74 61 4f 6e 6c 79 3d 3d 30 20 74 68 65 6e 20  ataOnly==0 then 
17080 62 6f 74 68 20 74 68 65 20 66 69 6c 65 20 69 74  both the file it
17090 73 65 6c 66 20 61 6e 64 20 69 74 73 20 6d 65 74  self and its met
170a0 61 64 61 74 61 20 28 66 69 6c 65 0a 2a 2a 20 73  adata (file.** s
170b0 69 7a 65 2c 20 61 63 63 65 73 73 20 74 69 6d 65  ize, access time
170c0 2c 20 65 74 63 29 20 61 72 65 20 73 79 6e 63 65  , etc) are synce
170d0 64 2e 20 20 49 66 20 64 61 74 61 4f 6e 6c 79 21  d.  If dataOnly!
170e0 3d 30 20 74 68 65 6e 20 6f 6e 6c 79 20 74 68 65  =0 then only the
170f0 0a 2a 2a 20 66 69 6c 65 20 64 61 74 61 20 69 73  .** file data is
17100 20 73 79 6e 63 65 64 2e 0a 2a 2a 0a 2a 2a 20 55   synced..**.** U
17110 6e 64 65 72 20 55 6e 69 78 2c 20 61 6c 73 6f 20  nder Unix, also 
17120 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74 20 74  make sure that t
17130 68 65 20 64 69 72 65 63 74 6f 72 79 20 65 6e 74  he directory ent
17140 72 79 20 66 6f 72 20 74 68 65 20 66 69 6c 65 0a  ry for the file.
17150 2a 2a 20 68 61 73 20 62 65 65 6e 20 63 72 65 61  ** has been crea
17160 74 65 64 20 62 79 20 66 73 79 6e 63 2d 69 6e 67  ted by fsync-ing
17170 20 74 68 65 20 64 69 72 65 63 74 6f 72 79 20 74   the directory t
17180 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65  hat contains the
17190 20 66 69 6c 65 2e 0a 2a 2a 20 49 66 20 77 65 20   file..** If we 
171a0 64 6f 20 6e 6f 74 20 64 6f 20 74 68 69 73 20 61  do not do this a
171b0 6e 64 20 77 65 20 65 6e 63 6f 75 6e 74 65 72 20  nd we encounter 
171c0 61 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65 2c  a power failure,
171d0 20 74 68 65 20 64 69 72 65 63 74 6f 72 79 0a 2a   the directory.*
171e0 2a 20 65 6e 74 72 79 20 66 6f 72 20 74 68 65 20  * entry for the 
171f0 6a 6f 75 72 6e 61 6c 20 6d 69 67 68 74 20 6e 6f  journal might no
17200 74 20 65 78 69 73 74 20 61 66 74 65 72 20 77 65  t exist after we
17210 20 72 65 62 6f 6f 74 2e 20 20 54 68 65 20 6e 65   reboot.  The ne
17220 78 74 0a 2a 2a 20 53 51 4c 69 74 65 20 74 6f 20  xt.** SQLite to 
17230 61 63 63 65 73 73 20 74 68 65 20 66 69 6c 65 20  access the file 
17240 77 69 6c 6c 20 6e 6f 74 20 6b 6e 6f 77 20 74 68  will not know th
17250 61 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 65  at the journal e
17260 78 69 73 74 73 20 28 62 65 63 61 75 73 65 0a 2a  xists (because.*
17270 2a 20 74 68 65 20 64 69 72 65 63 74 6f 72 79 20  * the directory 
17280 65 6e 74 72 79 20 66 6f 72 20 74 68 65 20 6a 6f  entry for the jo
17290 75 72 6e 61 6c 20 77 61 73 20 6e 65 76 65 72 20  urnal was never 
172a0 63 72 65 61 74 65 64 29 20 61 6e 64 20 74 68 65  created) and the
172b0 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20   transaction.** 
172c0 77 69 6c 6c 20 6e 6f 74 20 72 6f 6c 6c 20 62 61  will not roll ba
172d0 63 6b 20 2d 20 70 6f 73 73 69 62 6c 79 20 6c 65  ck - possibly le
172e0 61 64 69 6e 67 20 74 6f 20 64 61 74 61 62 61 73  ading to databas
172f0 65 20 63 6f 72 72 75 70 74 69 6f 6e 2e 0a 2a 2f  e corruption..*/
17300 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78  .static int unix
17310 53 79 6e 63 28 73 71 6c 69 74 65 33 5f 66 69 6c  Sync(sqlite3_fil
17320 65 20 2a 69 64 2c 20 69 6e 74 20 66 6c 61 67 73  e *id, int flags
17330 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 75  ){.  int rc;.  u
17340 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d  nixFile *pFile =
17350 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a   (unixFile*)id;.
17360 0a 20 20 69 6e 74 20 69 73 44 61 74 61 4f 6e 6c  .  int isDataOnl
17370 79 20 3d 20 28 66 6c 61 67 73 26 53 51 4c 49 54  y = (flags&SQLIT
17380 45 5f 53 59 4e 43 5f 44 41 54 41 4f 4e 4c 59 29  E_SYNC_DATAONLY)
17390 3b 0a 20 20 69 6e 74 20 69 73 46 75 6c 6c 73 79  ;.  int isFullsy
173a0 6e 63 20 3d 20 28 66 6c 61 67 73 26 30 78 30 46  nc = (flags&0x0F
173b0 29 3d 3d 53 51 4c 49 54 45 5f 53 59 4e 43 5f 46  )==SQLITE_SYNC_F
173c0 55 4c 4c 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b  ULL;..  /* Check
173d0 20 74 68 61 74 20 6f 6e 65 20 6f 66 20 53 51 4c   that one of SQL
173e0 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c 20  ITE_SYNC_NORMAL 
173f0 6f 72 20 46 55 4c 4c 20 77 61 73 20 70 61 73 73  or FULL was pass
17400 65 64 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 28  ed */.  assert((
17410 66 6c 61 67 73 26 30 78 30 46 29 3d 3d 53 51 4c  flags&0x0F)==SQL
17420 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c 0a  ITE_SYNC_NORMAL.
17430 20 20 20 20 20 20 7c 7c 20 28 66 6c 61 67 73 26        || (flags&
17440 30 78 30 46 29 3d 3d 53 51 4c 49 54 45 5f 53 59  0x0F)==SQLITE_SY
17450 4e 43 5f 46 55 4c 4c 0a 20 20 29 3b 0a 0a 20 20  NC_FULL.  );..  
17460 2f 2a 20 55 6e 69 78 20 63 61 6e 6e 6f 74 2c 20  /* Unix cannot, 
17470 62 75 74 20 73 6f 6d 65 20 73 79 73 74 65 6d 73  but some systems
17480 20 6d 61 79 20 72 65 74 75 72 6e 20 53 51 4c 49   may return SQLI
17490 54 45 5f 46 55 4c 4c 20 66 72 6f 6d 20 68 65 72  TE_FULL from her
174a0 65 2e 20 54 68 69 73 0a 20 20 2a 2a 20 6c 69 6e  e. This.  ** lin
174b0 65 20 69 73 20 74 6f 20 74 65 73 74 20 74 68 61  e is to test tha
174c0 74 20 64 6f 69 6e 67 20 73 6f 20 64 6f 65 73 20  t doing so does 
174d0 6e 6f 74 20 63 61 75 73 65 20 61 6e 79 20 70 72  not cause any pr
174e0 6f 62 6c 65 6d 73 2e 0a 20 20 2a 2f 0a 20 20 53  oblems..  */.  S
174f0 69 6d 75 6c 61 74 65 44 69 73 6b 66 75 6c 6c 45  imulateDiskfullE
17500 72 72 6f 72 28 20 72 65 74 75 72 6e 20 53 51 4c  rror( return SQL
17510 49 54 45 5f 46 55 4c 4c 20 29 3b 0a 0a 20 20 61  ITE_FULL );..  a
17520 73 73 65 72 74 28 20 70 46 69 6c 65 20 29 3b 0a  ssert( pFile );.
17530 20 20 4f 53 54 52 41 43 45 28 28 22 53 59 4e 43    OSTRACE(("SYNC
17540 20 20 20 20 25 2d 33 64 5c 6e 22 2c 20 70 46 69      %-3d\n", pFi
17550 6c 65 2d 3e 68 29 29 3b 0a 20 20 72 63 20 3d 20  le->h));.  rc = 
17560 66 75 6c 6c 5f 66 73 79 6e 63 28 70 46 69 6c 65  full_fsync(pFile
17570 2d 3e 68 2c 20 69 73 46 75 6c 6c 73 79 6e 63 2c  ->h, isFullsync,
17580 20 69 73 44 61 74 61 4f 6e 6c 79 29 3b 0a 20 20   isDataOnly);.  
17590 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28  SimulateIOError(
175a0 20 72 63 3d 31 20 29 3b 0a 20 20 69 66 28 20 72   rc=1 );.  if( r
175b0 63 20 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e  c ){.    pFile->
175c0 6c 61 73 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e  lastErrno = errn
175d0 6f 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  o;.    return SQ
175e0 4c 49 54 45 5f 49 4f 45 52 52 5f 46 53 59 4e 43  LITE_IOERR_FSYNC
175f0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 46 69 6c  ;.  }.  if( pFil
17600 65 2d 3e 64 69 72 66 64 3e 3d 30 20 29 7b 0a 20  e->dirfd>=0 ){. 
17610 20 20 20 69 6e 74 20 65 72 72 3b 0a 20 20 20 20     int err;.    
17620 4f 53 54 52 41 43 45 28 28 22 44 49 52 53 59 4e  OSTRACE(("DIRSYN
17630 43 20 25 2d 33 64 20 28 68 61 76 65 5f 66 75 6c  C %-3d (have_ful
17640 6c 66 73 79 6e 63 3d 25 64 20 66 75 6c 6c 73 79  lfsync=%d fullsy
17650 6e 63 3d 25 64 29 5c 6e 22 2c 20 70 46 69 6c 65  nc=%d)\n", pFile
17660 2d 3e 64 69 72 66 64 2c 0a 20 20 20 20 20 20 20  ->dirfd,.       
17670 20 20 20 20 20 48 41 56 45 5f 46 55 4c 4c 46 53       HAVE_FULLFS
17680 59 4e 43 2c 20 69 73 46 75 6c 6c 73 79 6e 63 29  YNC, isFullsync)
17690 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  );.#ifndef SQLIT
176a0 45 5f 44 49 53 41 42 4c 45 5f 44 49 52 53 59 4e  E_DISABLE_DIRSYN
176b0 43 0a 20 20 20 20 2f 2a 20 54 68 65 20 64 69 72  C.    /* The dir
176c0 65 63 74 6f 72 79 20 73 79 6e 63 20 69 73 20 6f  ectory sync is o
176d0 6e 6c 79 20 61 74 74 65 6d 70 74 65 64 20 69 66  nly attempted if
176e0 20 66 75 6c 6c 5f 66 73 79 6e 63 20 69 73 0a 20   full_fsync is. 
176f0 20 20 20 2a 2a 20 74 75 72 6e 65 64 20 6f 66 66     ** turned off
17700 20 6f 72 20 75 6e 61 76 61 69 6c 61 62 6c 65 2e   or unavailable.
17710 20 20 49 66 20 61 20 66 75 6c 6c 5f 66 73 79 6e    If a full_fsyn
17720 63 20 6f 63 63 75 72 72 65 64 20 61 62 6f 76 65  c occurred above
17730 2c 0a 20 20 20 20 2a 2a 20 74 68 65 6e 20 74 68  ,.    ** then th
17740 65 20 64 69 72 65 63 74 6f 72 79 20 73 79 6e 63  e directory sync
17750 20 69 73 20 73 75 70 65 72 66 6c 75 6f 75 73 2e   is superfluous.
17760 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
17770 28 21 48 41 56 45 5f 46 55 4c 4c 46 53 59 4e 43  (!HAVE_FULLFSYNC
17780 20 7c 7c 20 21 69 73 46 75 6c 6c 73 79 6e 63 29   || !isFullsync)
17790 20 26 26 20 66 75 6c 6c 5f 66 73 79 6e 63 28 70   && full_fsync(p
177a0 46 69 6c 65 2d 3e 64 69 72 66 64 2c 30 2c 30 29  File->dirfd,0,0)
177b0 20 29 7b 0a 20 20 20 20 20 20 20 2f 2a 0a 20 20   ){.       /*.  
177c0 20 20 20 20 20 2a 2a 20 57 65 20 68 61 76 65 20       ** We have 
177d0 72 65 63 65 69 76 65 64 20 6d 75 6c 74 69 70 6c  received multipl
177e0 65 20 72 65 70 6f 72 74 73 20 6f 66 20 66 73 79  e reports of fsy
177f0 6e 63 28 29 20 72 65 74 75 72 6e 69 6e 67 0a 20  nc() returning. 
17800 20 20 20 20 20 20 2a 2a 20 65 72 72 6f 72 73 20        ** errors 
17810 77 68 65 6e 20 61 70 70 6c 69 65 64 20 74 6f 20  when applied to 
17820 64 69 72 65 63 74 6f 72 69 65 73 20 6f 6e 20 63  directories on c
17830 65 72 74 61 69 6e 20 66 69 6c 65 20 73 79 73 74  ertain file syst
17840 65 6d 73 2e 0a 20 20 20 20 20 20 20 2a 2a 20 41  ems..       ** A
17850 20 66 61 69 6c 65 64 20 64 69 72 65 63 74 6f 72   failed director
17860 79 20 73 79 6e 63 20 69 73 20 6e 6f 74 20 61 20  y sync is not a 
17870 62 69 67 20 64 65 61 6c 2e 20 20 53 6f 20 69 74  big deal.  So it
17880 20 73 65 65 6d 73 0a 20 20 20 20 20 20 20 2a 2a   seems.       **
17890 20 62 65 74 74 65 72 20 74 6f 20 69 67 6e 6f 72   better to ignor
178a0 65 20 74 68 65 20 65 72 72 6f 72 2e 20 20 54 69  e the error.  Ti
178b0 63 6b 65 74 20 23 31 36 35 37 0a 20 20 20 20 20  cket #1657.     
178c0 20 20 2a 2f 0a 20 20 20 20 20 20 20 2f 2a 20 70    */.       /* p
178d0 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20  File->lastErrno 
178e0 3d 20 65 72 72 6e 6f 3b 20 2a 2f 0a 20 20 20 20  = errno; */.    
178f0 20 20 20 2f 2a 20 72 65 74 75 72 6e 20 53 51 4c     /* return SQL
17900 49 54 45 5f 49 4f 45 52 52 3b 20 2a 2f 0a 20 20  ITE_IOERR; */.  
17910 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 65    }.#endif.    e
17920 72 72 20 3d 20 63 6c 6f 73 65 28 70 46 69 6c 65  rr = close(pFile
17930 2d 3e 64 69 72 66 64 29 3b 20 2f 2a 20 4f 6e 6c  ->dirfd); /* Onl
17940 79 20 6e 65 65 64 20 74 6f 20 73 79 6e 63 20 6f  y need to sync o
17950 6e 63 65 2c 20 73 6f 20 63 6c 6f 73 65 20 74 68  nce, so close th
17960 65 20 2a 2f 0a 20 20 20 20 69 66 28 20 65 72 72  e */.    if( err
17970 3d 3d 30 20 29 7b 20 20 20 20 20 20 20 20 20 20  ==0 ){          
17980 20 20 20 20 2f 2a 20 64 69 72 65 63 74 6f 72 79      /* directory
17990 20 77 68 65 6e 20 77 65 20 61 72 65 20 64 6f 6e   when we are don
179a0 65 20 2a 2f 0a 20 20 20 20 20 20 70 46 69 6c 65  e */.      pFile
179b0 2d 3e 64 69 72 66 64 20 3d 20 2d 31 3b 0a 20 20  ->dirfd = -1;.  
179c0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70    }else{.      p
179d0 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20  File->lastErrno 
179e0 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20 72  = errno;.      r
179f0 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  c = SQLITE_IOERR
17a00 5f 44 49 52 5f 43 4c 4f 53 45 3b 0a 20 20 20 20  _DIR_CLOSE;.    
17a10 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  }.  }.  return r
17a20 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72 75 6e  c;.}../*.** Trun
17a30 63 61 74 65 20 61 6e 20 6f 70 65 6e 20 66 69 6c  cate an open fil
17a40 65 20 74 6f 20 61 20 73 70 65 63 69 66 69 65 64  e to a specified
17a50 20 73 69 7a 65 0a 2a 2f 0a 73 74 61 74 69 63 20   size.*/.static 
17a60 69 6e 74 20 75 6e 69 78 54 72 75 6e 63 61 74 65  int unixTruncate
17a70 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69  (sqlite3_file *i
17a80 64 2c 20 69 36 34 20 6e 42 79 74 65 29 7b 0a 20  d, i64 nByte){. 
17a90 20 69 6e 74 20 72 63 3b 0a 20 20 61 73 73 65 72   int rc;.  asser
17aa0 74 28 20 69 64 20 29 3b 0a 20 20 53 69 6d 75 6c  t( id );.  Simul
17ab0 61 74 65 49 4f 45 72 72 6f 72 28 20 72 65 74 75  ateIOError( retu
17ac0 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  rn SQLITE_IOERR_
17ad0 54 52 55 4e 43 41 54 45 20 29 3b 0a 20 20 72 63  TRUNCATE );.  rc
17ae0 20 3d 20 66 74 72 75 6e 63 61 74 65 28 28 28 75   = ftruncate(((u
17af0 6e 69 78 46 69 6c 65 2a 29 69 64 29 2d 3e 68 2c  nixFile*)id)->h,
17b00 20 28 6f 66 66 5f 74 29 6e 42 79 74 65 29 3b 0a   (off_t)nByte);.
17b10 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
17b20 28 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 29 2d  ((unixFile*)id)-
17b30 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 65 72 72  >lastErrno = err
17b40 6e 6f 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53  no;.    return S
17b50 51 4c 49 54 45 5f 49 4f 45 52 52 5f 54 52 55 4e  QLITE_IOERR_TRUN
17b60 43 41 54 45 3b 0a 20 20 7d 65 6c 73 65 7b 0a 23  CATE;.  }else{.#
17b70 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 20 20  ifndef NDEBUG.  
17b80 20 20 2f 2a 20 49 66 20 77 65 20 61 72 65 20 64    /* If we are d
17b90 6f 69 6e 67 20 61 20 6e 6f 72 6d 61 6c 20 77 72  oing a normal wr
17ba0 69 74 65 20 74 6f 20 61 20 64 61 74 61 62 61 73  ite to a databas
17bb0 65 20 66 69 6c 65 20 28 61 73 20 6f 70 70 6f 73  e file (as oppos
17bc0 65 64 20 74 6f 0a 20 20 20 20 2a 2a 20 64 6f 69  ed to.    ** doi
17bd0 6e 67 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c  ng a hot-journal
17be0 20 72 6f 6c 6c 62 61 63 6b 20 6f 72 20 61 20 77   rollback or a w
17bf0 72 69 74 65 20 74 6f 20 73 6f 6d 65 20 66 69 6c  rite to some fil
17c00 65 20 6f 74 68 65 72 20 74 68 61 6e 20 61 0a 20  e other than a. 
17c10 20 20 20 2a 2a 20 6e 6f 72 6d 61 6c 20 64 61 74     ** normal dat
17c20 61 62 61 73 65 20 66 69 6c 65 29 20 61 6e 64 20  abase file) and 
17c30 77 65 20 74 72 75 6e 63 61 74 65 20 74 68 65 20  we truncate the 
17c40 66 69 6c 65 20 74 6f 20 7a 65 72 6f 20 6c 65 6e  file to zero len
17c50 67 74 68 2c 0a 20 20 20 20 2a 2a 20 74 68 61 74  gth,.    ** that
17c60 20 65 66 66 65 63 74 69 76 65 6c 79 20 75 70 64   effectively upd
17c70 61 74 65 73 20 74 68 65 20 63 68 61 6e 67 65 20  ates the change 
17c80 63 6f 75 6e 74 65 72 2e 20 20 54 68 69 73 20 6d  counter.  This m
17c90 69 67 68 74 20 68 61 70 70 65 6e 0a 20 20 20 20  ight happen.    
17ca0 2a 2a 20 77 68 65 6e 20 72 65 73 74 6f 72 69 6e  ** when restorin
17cb0 67 20 61 20 64 61 74 61 62 61 73 65 20 75 73 69  g a database usi
17cc0 6e 67 20 74 68 65 20 62 61 63 6b 75 70 20 41 50  ng the backup AP
17cd0 49 20 66 72 6f 6d 20 61 20 7a 65 72 6f 2d 6c 65  I from a zero-le
17ce0 6e 67 74 68 0a 20 20 20 20 2a 2a 20 73 6f 75 72  ngth.    ** sour
17cf0 63 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  ce..    */.    i
17d00 66 28 20 28 28 75 6e 69 78 46 69 6c 65 2a 29 69  f( ((unixFile*)i
17d10 64 29 2d 3e 69 6e 4e 6f 72 6d 61 6c 57 72 69 74  d)->inNormalWrit
17d20 65 20 26 26 20 6e 42 79 74 65 3d 3d 30 20 29 7b  e && nByte==0 ){
17d30 0a 20 20 20 20 20 20 28 28 75 6e 69 78 46 69 6c  .      ((unixFil
17d40 65 2a 29 69 64 29 2d 3e 74 72 61 6e 73 43 6e 74  e*)id)->transCnt
17d50 72 43 68 6e 67 20 3d 20 31 3b 0a 20 20 20 20 7d  rChng = 1;.    }
17d60 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 72 65 74  .#endif..    ret
17d70 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
17d80 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 74 65   }.}../*.** Dete
17d90 72 6d 69 6e 65 20 74 68 65 20 63 75 72 72 65 6e  rmine the curren
17da0 74 20 73 69 7a 65 20 6f 66 20 61 20 66 69 6c 65  t size of a file
17db0 20 69 6e 20 62 79 74 65 73 0a 2a 2f 0a 73 74 61   in bytes.*/.sta
17dc0 74 69 63 20 69 6e 74 20 75 6e 69 78 46 69 6c 65  tic int unixFile
17dd0 53 69 7a 65 28 73 71 6c 69 74 65 33 5f 66 69 6c  Size(sqlite3_fil
17de0 65 20 2a 69 64 2c 20 69 36 34 20 2a 70 53 69 7a  e *id, i64 *pSiz
17df0 65 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  e){.  int rc;.  
17e00 73 74 72 75 63 74 20 73 74 61 74 20 62 75 66 3b  struct stat buf;
17e10 0a 20 20 61 73 73 65 72 74 28 20 69 64 20 29 3b  .  assert( id );
17e20 0a 20 20 72 63 20 3d 20 66 73 74 61 74 28 28 28  .  rc = fstat(((
17e30 75 6e 69 78 46 69 6c 65 2a 29 69 64 29 2d 3e 68  unixFile*)id)->h
17e40 2c 20 26 62 75 66 29 3b 0a 20 20 53 69 6d 75 6c  , &buf);.  Simul
17e50 61 74 65 49 4f 45 72 72 6f 72 28 20 72 63 3d 31  ateIOError( rc=1
17e60 20 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 30 20   );.  if( rc!=0 
17e70 29 7b 0a 20 20 20 20 28 28 75 6e 69 78 46 69 6c  ){.    ((unixFil
17e80 65 2a 29 69 64 29 2d 3e 6c 61 73 74 45 72 72 6e  e*)id)->lastErrn
17e90 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 72  o = errno;.    r
17ea0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45  eturn SQLITE_IOE
17eb0 52 52 5f 46 53 54 41 54 3b 0a 20 20 7d 0a 20 20  RR_FSTAT;.  }.  
17ec0 2a 70 53 69 7a 65 20 3d 20 62 75 66 2e 73 74 5f  *pSize = buf.st_
17ed0 73 69 7a 65 3b 0a 0a 20 20 2f 2a 20 57 68 65 6e  size;..  /* When
17ee0 20 6f 70 65 6e 69 6e 67 20 61 20 7a 65 72 6f 2d   opening a zero-
17ef0 73 69 7a 65 20 64 61 74 61 62 61 73 65 2c 20 74  size database, t
17f00 68 65 20 66 69 6e 64 49 6e 6f 64 65 49 6e 66 6f  he findInodeInfo
17f10 28 29 20 70 72 6f 63 65 64 75 72 65 0a 20 20 2a  () procedure.  *
17f20 2a 20 77 72 69 74 65 73 20 61 20 73 69 6e 67 6c  * writes a singl
17f30 65 20 62 79 74 65 20 69 6e 74 6f 20 74 68 61 74  e byte into that
17f40 20 66 69 6c 65 20 69 6e 20 6f 72 64 65 72 20 74   file in order t
17f50 6f 20 77 6f 72 6b 20 61 72 6f 75 6e 64 20 61 20  o work around a 
17f60 62 75 67 0a 20 20 2a 2a 20 69 6e 20 74 68 65 20  bug.  ** in the 
17f70 4f 53 2d 58 20 6d 73 64 6f 73 20 66 69 6c 65 73  OS-X msdos files
17f80 79 73 74 65 6d 2e 20 20 49 6e 20 6f 72 64 65 72  ystem.  In order
17f90 20 74 6f 20 61 76 6f 69 64 20 70 72 6f 62 6c 65   to avoid proble
17fa0 6d 73 20 77 69 74 68 20 75 70 70 65 72 0a 20 20  ms with upper.  
17fb0 2a 2a 20 6c 61 79 65 72 73 2c 20 77 65 20 6e 65  ** layers, we ne
17fc0 65 64 20 74 6f 20 72 65 70 6f 72 74 20 74 68 69  ed to report thi
17fd0 73 20 66 69 6c 65 20 73 69 7a 65 20 61 73 20 7a  s file size as z
17fe0 65 72 6f 20 65 76 65 6e 20 74 68 6f 75 67 68 20  ero even though 
17ff0 69 74 20 69 73 0a 20 20 2a 2a 20 72 65 61 6c 6c  it is.  ** reall
18000 79 20 31 2e 20 20 20 54 69 63 6b 65 74 20 23 33  y 1.   Ticket #3
18010 32 36 30 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  260..  */.  if( 
18020 2a 70 53 69 7a 65 3d 3d 31 20 29 20 2a 70 53 69  *pSize==1 ) *pSi
18030 7a 65 20 3d 20 30 3b 0a 0a 0a 20 20 72 65 74 75  ze = 0;...  retu
18040 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
18050 0a 23 69 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  .#if SQLITE_ENAB
18060 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45  LE_LOCKING_STYLE
18070 20 26 26 20 64 65 66 69 6e 65 64 28 5f 5f 41 50   && defined(__AP
18080 50 4c 45 5f 5f 29 0a 2f 2a 0a 2a 2a 20 48 61 6e  PLE__)./*.** Han
18090 64 6c 65 72 20 66 6f 72 20 70 72 6f 78 79 2d 6c  dler for proxy-l
180a0 6f 63 6b 69 6e 67 20 66 69 6c 65 2d 63 6f 6e 74  ocking file-cont
180b0 72 6f 6c 20 76 65 72 62 73 2e 20 20 44 65 66 69  rol verbs.  Defi
180c0 6e 65 64 20 62 65 6c 6f 77 20 69 6e 20 74 68 65  ned below in the
180d0 0a 2a 2a 20 70 72 6f 78 79 69 6e 67 20 6c 6f 63  .** proxying loc
180e0 6b 69 6e 67 20 64 69 76 69 73 69 6f 6e 2e 0a 2a  king division..*
180f0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72 6f  /.static int pro
18100 78 79 46 69 6c 65 43 6f 6e 74 72 6f 6c 28 73 71  xyFileControl(sq
18110 6c 69 74 65 33 5f 66 69 6c 65 2a 2c 69 6e 74 2c  lite3_file*,int,
18120 76 6f 69 64 2a 29 3b 0a 23 65 6e 64 69 66 0a 0a  void*);.#endif..
18130 0a 2f 2a 0a 2a 2a 20 49 6e 66 6f 72 6d 61 74 69  ./*.** Informati
18140 6f 6e 20 61 6e 64 20 63 6f 6e 74 72 6f 6c 20 6f  on and control o
18150 66 20 61 6e 20 6f 70 65 6e 20 66 69 6c 65 20 68  f an open file h
18160 61 6e 64 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  andle..*/.static
18170 20 69 6e 74 20 75 6e 69 78 46 69 6c 65 43 6f 6e   int unixFileCon
18180 74 72 6f 6c 28 73 71 6c 69 74 65 33 5f 66 69 6c  trol(sqlite3_fil
18190 65 20 2a 69 64 2c 20 69 6e 74 20 6f 70 2c 20 76  e *id, int op, v
181a0 6f 69 64 20 2a 70 41 72 67 29 7b 0a 20 20 73 77  oid *pArg){.  sw
181b0 69 74 63 68 28 20 6f 70 20 29 7b 0a 20 20 20 20  itch( op ){.    
181c0 63 61 73 65 20 53 51 4c 49 54 45 5f 46 43 4e 54  case SQLITE_FCNT
181d0 4c 5f 4c 4f 43 4b 53 54 41 54 45 3a 20 7b 0a 20  L_LOCKSTATE: {. 
181e0 20 20 20 20 20 2a 28 69 6e 74 2a 29 70 41 72 67       *(int*)pArg
181f0 20 3d 20 28 28 75 6e 69 78 46 69 6c 65 2a 29 69   = ((unixFile*)i
18200 64 29 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3b 0a 20  d)->eFileLock;. 
18210 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
18220 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20  TE_OK;.    }.   
18230 20 63 61 73 65 20 53 51 4c 49 54 45 5f 4c 41 53   case SQLITE_LAS
18240 54 5f 45 52 52 4e 4f 3a 20 7b 0a 20 20 20 20 20  T_ERRNO: {.     
18250 20 2a 28 69 6e 74 2a 29 70 41 72 67 20 3d 20 28   *(int*)pArg = (
18260 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 29 2d 3e  (unixFile*)id)->
18270 6c 61 73 74 45 72 72 6e 6f 3b 0a 20 20 20 20 20  lastErrno;.     
18280 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
18290 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  K;.    }.    cas
182a0 65 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 53  e SQLITE_FCNTL_S
182b0 49 5a 45 5f 48 49 4e 54 3a 20 7b 0a 23 69 66 20  IZE_HINT: {.#if 
182c0 30 20 2f 2a 20 4e 6f 20 70 65 72 66 6f 72 6d 61  0 /* No performa
182d0 6e 63 65 20 61 64 76 61 6e 74 61 67 65 20 73 65  nce advantage se
182e0 65 6e 20 6f 6e 20 4c 69 6e 75 78 20 2a 2f 0a 20  en on Linux */. 
182f0 20 20 20 20 20 73 71 6c 69 74 65 33 5f 69 6e 74       sqlite3_int
18300 36 34 20 73 7a 46 69 6c 65 20 3d 20 2a 28 73 71  64 szFile = *(sq
18310 6c 69 74 65 33 5f 69 6e 74 36 34 2a 29 70 41 72  lite3_int64*)pAr
18320 67 3b 0a 20 20 20 20 20 20 75 6e 69 78 46 69 6c  g;.      unixFil
18330 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78  e *pFile = (unix
18340 46 69 6c 65 2a 29 69 64 3b 0a 20 20 20 20 20 20  File*)id;.      
18350 66 74 72 75 6e 63 61 74 65 28 70 46 69 6c 65 2d  ftruncate(pFile-
18360 3e 68 2c 20 73 7a 46 69 6c 65 29 3b 0a 23 65 6e  >h, szFile);.#en
18370 64 69 66 0a 20 20 20 20 20 20 72 65 74 75 72 6e  dif.      return
18380 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
18390 7d 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47  }.#ifndef NDEBUG
183a0 0a 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65  .    /* The page
183b0 72 20 63 61 6c 6c 73 20 74 68 69 73 20 6d 65 74  r calls this met
183c0 68 6f 64 20 74 6f 20 73 69 67 6e 61 6c 20 74 68  hod to signal th
183d0 61 74 20 69 74 20 68 61 73 20 64 6f 6e 65 0a 20  at it has done. 
183e0 20 20 20 2a 2a 20 61 20 72 6f 6c 6c 62 61 63 6b     ** a rollback
183f0 20 61 6e 64 20 74 68 61 74 20 74 68 65 20 64 61   and that the da
18400 74 61 62 61 73 65 20 69 73 20 74 68 65 72 65 66  tabase is theref
18410 6f 72 65 20 75 6e 63 68 61 6e 67 65 64 20 61 6e  ore unchanged an
18420 64 0a 20 20 20 20 2a 2a 20 69 74 20 68 65 6e 63  d.    ** it henc
18430 65 20 69 74 20 69 73 20 4f 4b 20 66 6f 72 20 74  e it is OK for t
18440 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63  he transaction c
18450 68 61 6e 67 65 20 63 6f 75 6e 74 65 72 20 74 6f  hange counter to
18460 20 62 65 0a 20 20 20 20 2a 2a 20 75 6e 63 68 61   be.    ** uncha
18470 6e 67 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  nged..    */.   
18480 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46 43 4e   case SQLITE_FCN
18490 54 4c 5f 44 42 5f 55 4e 43 48 41 4e 47 45 44 3a  TL_DB_UNCHANGED:
184a0 20 7b 0a 20 20 20 20 20 20 28 28 75 6e 69 78 46   {.      ((unixF
184b0 69 6c 65 2a 29 69 64 29 2d 3e 64 62 55 70 64 61  ile*)id)->dbUpda
184c0 74 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 65  te = 0;.      re
184d0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
184e0 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 23 69 66      }.#endif.#if
184f0 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c   SQLITE_ENABLE_L
18500 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 26 26 20  OCKING_STYLE && 
18510 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f  defined(__APPLE_
18520 5f 29 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  _).    case SQLI
18530 54 45 5f 53 45 54 5f 4c 4f 43 4b 50 52 4f 58 59  TE_SET_LOCKPROXY
18540 46 49 4c 45 3a 0a 20 20 20 20 63 61 73 65 20 53  FILE:.    case S
18550 51 4c 49 54 45 5f 47 45 54 5f 4c 4f 43 4b 50 52  QLITE_GET_LOCKPR
18560 4f 58 59 46 49 4c 45 3a 20 7b 0a 20 20 20 20 20  OXYFILE: {.     
18570 20 72 65 74 75 72 6e 20 70 72 6f 78 79 46 69 6c   return proxyFil
18580 65 43 6f 6e 74 72 6f 6c 28 69 64 2c 6f 70 2c 70  eControl(id,op,p
18590 41 72 67 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  Arg);.    }.#end
185a0 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 45 4e 41  if /* SQLITE_ENA
185b0 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c  BLE_LOCKING_STYL
185c0 45 20 26 26 20 64 65 66 69 6e 65 64 28 5f 5f 41  E && defined(__A
185d0 50 50 4c 45 5f 5f 29 20 2a 2f 0a 20 20 7d 0a 20  PPLE__) */.  }. 
185e0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45   return SQLITE_E
185f0 52 52 4f 52 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  RROR;.}../*.** R
18600 65 74 75 72 6e 20 74 68 65 20 73 65 63 74 6f 72  eturn the sector
18610 20 73 69 7a 65 20 69 6e 20 62 79 74 65 73 20 6f   size in bytes o
18620 66 20 74 68 65 20 75 6e 64 65 72 6c 79 69 6e 67  f the underlying
18630 20 62 6c 6f 63 6b 20 64 65 76 69 63 65 20 66 6f   block device fo
18640 72 0a 2a 2a 20 74 68 65 20 73 70 65 63 69 66 69  r.** the specifi
18650 65 64 20 66 69 6c 65 2e 20 54 68 69 73 20 69 73  ed file. This is
18660 20 61 6c 6d 6f 73 74 20 61 6c 77 61 79 73 20 35   almost always 5
18670 31 32 20 62 79 74 65 73 2c 20 62 75 74 20 6d 61  12 bytes, but ma
18680 79 20 62 65 0a 2a 2a 20 6c 61 72 67 65 72 20 66  y be.** larger f
18690 6f 72 20 73 6f 6d 65 20 64 65 76 69 63 65 73 2e  or some devices.
186a0 0a 2a 2a 0a 2a 2a 20 53 51 4c 69 74 65 20 63 6f  .**.** SQLite co
186b0 64 65 20 61 73 73 75 6d 65 73 20 74 68 69 73 20  de assumes this 
186c0 66 75 6e 63 74 69 6f 6e 20 63 61 6e 6e 6f 74 20  function cannot 
186d0 66 61 69 6c 2e 20 49 74 20 61 6c 73 6f 20 61 73  fail. It also as
186e0 73 75 6d 65 73 20 74 68 61 74 0a 2a 2a 20 69 66  sumes that.** if
186f0 20 74 77 6f 20 66 69 6c 65 73 20 61 72 65 20 63   two files are c
18700 72 65 61 74 65 64 20 69 6e 20 74 68 65 20 73 61  reated in the sa
18710 6d 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 64  me file-system d
18720 69 72 65 63 74 6f 72 79 20 28 69 2e 65 2e 0a 2a  irectory (i.e..*
18730 2a 20 61 20 64 61 74 61 62 61 73 65 20 61 6e 64  * a database and
18740 20 69 74 73 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   its journal fil
18750 65 29 20 74 68 61 74 20 74 68 65 20 73 65 63 74  e) that the sect
18760 6f 72 20 73 69 7a 65 20 77 69 6c 6c 20 62 65 20  or size will be 
18770 74 68 65 0a 2a 2a 20 73 61 6d 65 20 66 6f 72 20  the.** same for 
18780 62 6f 74 68 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  both..*/.static 
18790 69 6e 74 20 75 6e 69 78 53 65 63 74 6f 72 53 69  int unixSectorSi
187a0 7a 65 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  ze(sqlite3_file 
187b0 2a 4e 6f 74 55 73 65 64 29 7b 0a 20 20 55 4e 55  *NotUsed){.  UNU
187c0 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f  SED_PARAMETER(No
187d0 74 55 73 65 64 29 3b 0a 20 20 72 65 74 75 72 6e  tUsed);.  return
187e0 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f   SQLITE_DEFAULT_
187f0 53 45 43 54 4f 52 5f 53 49 5a 45 3b 0a 7d 0a 0a  SECTOR_SIZE;.}..
18800 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
18810 20 64 65 76 69 63 65 20 63 68 61 72 61 63 74 65   device characte
18820 72 69 73 74 69 63 73 20 66 6f 72 20 74 68 65 20  ristics for the 
18830 66 69 6c 65 2e 20 54 68 69 73 20 69 73 20 61 6c  file. This is al
18840 77 61 79 73 20 30 20 66 6f 72 20 75 6e 69 78 2e  ways 0 for unix.
18850 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75  .*/.static int u
18860 6e 69 78 44 65 76 69 63 65 43 68 61 72 61 63 74  nixDeviceCharact
18870 65 72 69 73 74 69 63 73 28 73 71 6c 69 74 65 33  eristics(sqlite3
18880 5f 66 69 6c 65 20 2a 4e 6f 74 55 73 65 64 29 7b  _file *NotUsed){
18890 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
188a0 54 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20  TER(NotUsed);.  
188b0 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 23 69 66  return 0;.}..#if
188c0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
188d0 5f 57 41 4c 0a 0a 0a 2f 2a 0a 2a 2a 20 4f 62 6a  _WAL.../*.** Obj
188e0 65 63 74 20 75 73 65 64 20 74 6f 20 72 65 70 72  ect used to repr
188f0 65 73 65 6e 74 20 61 6e 20 73 68 61 72 65 64 20  esent an shared 
18900 6d 65 6d 6f 72 79 20 62 75 66 66 65 72 2e 20 20  memory buffer.  
18910 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 6d 75 6c 74  .**.** When mult
18920 69 70 6c 65 20 74 68 72 65 61 64 73 20 61 6c 6c  iple threads all
18930 20 72 65 66 65 72 65 6e 63 65 20 74 68 65 20 73   reference the s
18940 61 6d 65 20 77 61 6c 2d 69 6e 64 65 78 2c 20 65  ame wal-index, e
18950 61 63 68 20 74 68 72 65 61 64 0a 2a 2a 20 68 61  ach thread.** ha
18960 73 20 69 74 73 20 6f 77 6e 20 75 6e 69 78 53 68  s its own unixSh
18970 6d 20 6f 62 6a 65 63 74 2c 20 62 75 74 20 74 68  m object, but th
18980 65 79 20 61 6c 6c 20 70 6f 69 6e 74 20 74 6f 20  ey all point to 
18990 61 20 73 69 6e 67 6c 65 20 69 6e 73 74 61 6e 63  a single instanc
189a0 65 0a 2a 2a 20 6f 66 20 74 68 69 73 20 75 6e 69  e.** of this uni
189b0 78 53 68 6d 4e 6f 64 65 20 6f 62 6a 65 63 74 2e  xShmNode object.
189c0 20 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73    In other words
189d0 2c 20 65 61 63 68 20 77 61 6c 2d 69 6e 64 65 78  , each wal-index
189e0 20 69 73 20 6f 70 65 6e 65 64 0a 2a 2a 20 6f 6e   is opened.** on
189f0 6c 79 20 6f 6e 63 65 20 70 65 72 20 70 72 6f 63  ly once per proc
18a00 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 45 61 63 68 20  ess..**.** Each 
18a10 75 6e 69 78 53 68 6d 4e 6f 64 65 20 6f 62 6a 65  unixShmNode obje
18a20 63 74 20 69 73 20 63 6f 6e 6e 65 63 74 65 64 20  ct is connected 
18a30 74 6f 20 61 20 73 69 6e 67 6c 65 20 75 6e 69 78  to a single unix
18a40 49 6e 6f 64 65 49 6e 66 6f 20 6f 62 6a 65 63 74  InodeInfo object
18a50 2e 0a 2a 2a 20 57 65 20 63 6f 75 6c 64 20 63 6f  ..** We could co
18a60 61 6c 65 73 63 65 20 74 68 69 73 20 6f 62 6a 65  alesce this obje
18a70 63 74 20 69 6e 74 6f 20 75 6e 69 78 49 6e 6f 64  ct into unixInod
18a80 65 49 6e 66 6f 2c 20 62 75 74 20 74 68 61 74 20  eInfo, but that 
18a90 77 6f 75 6c 64 20 6d 65 61 6e 0a 2a 2a 20 65 76  would mean.** ev
18aa0 65 72 79 20 6f 70 65 6e 20 66 69 6c 65 20 74 68  ery open file th
18ab0 61 74 20 64 6f 65 73 20 6e 6f 74 20 75 73 65 20  at does not use 
18ac0 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 28 69  shared memory (i
18ad0 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 6d  n other words, m
18ae0 6f 73 74 0a 2a 2a 20 6f 70 65 6e 20 66 69 6c 65  ost.** open file
18af0 73 29 20 77 6f 75 6c 64 20 68 61 76 65 20 74 6f  s) would have to
18b00 20 63 61 72 72 79 20 61 72 6f 75 6e 64 20 74 68   carry around th
18b10 69 73 20 65 78 74 72 61 20 69 6e 66 6f 72 6d 61  is extra informa
18b20 74 69 6f 6e 2e 20 20 53 6f 0a 2a 2a 20 74 68 65  tion.  So.** the
18b30 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 6f   unixInodeInfo o
18b40 62 6a 65 63 74 20 63 6f 6e 74 61 69 6e 73 20 61  bject contains a
18b50 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 69 73   pointer to this
18b60 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20 6f 62 6a   unixShmNode obj
18b70 65 63 74 0a 2a 2a 20 61 6e 64 20 74 68 65 20 75  ect.** and the u
18b80 6e 69 78 53 68 6d 4e 6f 64 65 20 6f 62 6a 65 63  nixShmNode objec
18b90 74 20 69 73 20 63 72 65 61 74 65 64 20 6f 6e 6c  t is created onl
18ba0 79 20 77 68 65 6e 20 6e 65 65 64 65 64 2e 0a 2a  y when needed..*
18bb0 2a 0a 2a 2a 20 75 6e 69 78 4d 75 74 65 78 48 65  *.** unixMutexHe
18bc0 6c 64 28 29 20 6d 75 73 74 20 62 65 20 74 72 75  ld() must be tru
18bd0 65 20 77 68 65 6e 20 63 72 65 61 74 69 6e 67 20  e when creating 
18be0 6f 72 20 64 65 73 74 72 6f 79 69 6e 67 0a 2a 2a  or destroying.**
18bf0 20 74 68 69 73 20 6f 62 6a 65 63 74 20 6f 72 20   this object or 
18c00 77 68 69 6c 65 20 72 65 61 64 69 6e 67 20 6f 72  while reading or
18c10 20 77 72 69 74 69 6e 67 20 74 68 65 20 66 6f 6c   writing the fol
18c20 6c 6f 77 69 6e 67 20 66 69 65 6c 64 73 3a 0a 2a  lowing fields:.*
18c30 2a 0a 2a 2a 20 20 20 20 20 20 6e 52 65 66 0a 2a  *.**      nRef.*
18c40 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69  *.** The followi
18c50 6e 67 20 66 69 65 6c 64 73 20 61 72 65 20 72 65  ng fields are re
18c60 61 64 2d 6f 6e 6c 79 20 61 66 74 65 72 20 74 68  ad-only after th
18c70 65 20 6f 62 6a 65 63 74 20 69 73 20 63 72 65 61  e object is crea
18c80 74 65 64 3a 0a 2a 2a 20 0a 2a 2a 20 20 20 20 20  ted:.** .**     
18c90 20 66 69 64 0a 2a 2a 20 20 20 20 20 20 7a 46 69   fid.**      zFi
18ca0 6c 65 6e 61 6d 65 0a 2a 2a 0a 2a 2a 20 45 69 74  lename.**.** Eit
18cb0 68 65 72 20 75 6e 69 78 53 68 6d 4e 6f 64 65 2e  her unixShmNode.
18cc0 6d 75 74 65 78 20 6d 75 73 74 20 62 65 20 68 65  mutex must be he
18cd0 6c 64 20 6f 72 20 75 6e 69 78 53 68 6d 4e 6f 64  ld or unixShmNod
18ce0 65 2e 6e 52 65 66 3d 3d 30 20 61 6e 64 0a 2a 2a  e.nRef==0 and.**
18cf0 20 75 6e 69 78 4d 75 74 65 78 48 65 6c 64 28 29   unixMutexHeld()
18d00 20 69 73 20 74 72 75 65 20 77 68 65 6e 20 72 65   is true when re
18d10 61 64 69 6e 67 20 6f 72 20 77 72 69 74 69 6e 67  ading or writing
18d20 20 61 6e 79 20 6f 74 68 65 72 20 66 69 65 6c 64   any other field
18d30 0a 2a 2a 20 69 6e 20 74 68 69 73 20 73 74 72 75  .** in this stru
18d40 63 74 75 72 65 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20  cture..**.** To 
18d50 61 76 6f 69 64 20 64 65 61 64 6c 6f 63 6b 73 2c  avoid deadlocks,
18d60 20 6d 75 74 65 78 20 61 6e 64 20 6d 75 74 65 78   mutex and mutex
18d70 42 75 66 20 61 72 65 20 61 6c 77 61 79 73 20 72  Buf are always r
18d80 65 6c 65 61 73 65 64 20 69 6e 20 74 68 65 0a 2a  eleased in the.*
18d90 2a 20 72 65 76 65 72 73 65 20 6f 72 64 65 72 20  * reverse order 
18da0 74 68 61 74 20 74 68 65 79 20 61 72 65 20 61 63  that they are ac
18db0 71 75 69 72 65 64 2e 20 20 6d 75 74 65 78 42 75  quired.  mutexBu
18dc0 66 20 69 73 20 61 6c 77 61 79 73 20 61 63 71 75  f is always acqu
18dd0 69 72 65 64 0a 2a 2a 20 66 69 72 73 74 20 61 6e  ired.** first an
18de0 64 20 72 65 6c 65 61 73 65 64 20 6c 61 73 74 2e  d released last.
18df0 20 20 54 68 69 73 20 69 6e 76 61 72 69 61 6e 74    This invariant
18e00 20 69 73 20 63 68 65 63 6b 20 62 79 20 61 73 73   is check by ass
18e10 65 72 74 69 6e 67 0a 2a 2a 20 73 71 6c 69 74 65  erting.** sqlite
18e20 33 5f 6d 75 74 65 78 5f 6e 6f 74 68 65 6c 64 28  3_mutex_notheld(
18e30 29 20 6f 6e 20 6d 75 74 65 78 20 77 68 65 6e 65  ) on mutex whene
18e40 76 65 72 20 6d 75 74 65 78 42 75 66 20 69 73 20  ver mutexBuf is 
18e50 61 63 71 75 69 72 65 64 20 6f 72 0a 2a 2a 20 72  acquired or.** r
18e60 65 6c 65 61 73 65 64 2e 0a 2a 2f 0a 73 74 72 75  eleased..*/.stru
18e70 63 74 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20 7b  ct unixShmNode {
18e80 0a 20 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f  .  unixInodeInfo
18e90 20 2a 70 49 6e 6f 64 65 3b 20 20 20 20 20 2f 2a   *pInode;     /*
18ea0 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 74   unixInodeInfo t
18eb0 68 61 74 20 6f 77 6e 73 20 74 68 69 73 20 53 48  hat owns this SH
18ec0 4d 20 6e 6f 64 65 20 2a 2f 0a 20 20 73 71 6c 69  M node */.  sqli
18ed0 74 65 33 5f 6d 75 74 65 78 20 2a 6d 75 74 65 78  te3_mutex *mutex
18ee0 3b 20 20 20 20 20 20 2f 2a 20 4d 75 74 65 78 20  ;      /* Mutex 
18ef0 74 6f 20 61 63 63 65 73 73 20 74 68 69 73 20 6f  to access this o
18f00 62 6a 65 63 74 20 2a 2f 0a 20 20 73 71 6c 69 74  bject */.  sqlit
18f10 65 33 5f 6d 75 74 65 78 20 2a 6d 75 74 65 78 42  e3_mutex *mutexB
18f20 75 66 3b 20 20 20 2f 2a 20 4d 75 74 65 78 20 74  uf;   /* Mutex t
18f30 6f 20 61 63 63 65 73 73 20 7a 42 75 66 5b 5d 20  o access zBuf[] 
18f40 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 46 69 6c 65  */.  char *zFile
18f50 6e 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20 20  name;           
18f60 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 6d  /* Name of the m
18f70 6d 61 70 70 65 64 20 66 69 6c 65 20 2a 2f 0a 20  mapped file */. 
18f80 20 69 6e 74 20 68 3b 20 20 20 20 20 20 20 20 20   int h;         
18f90 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
18fa0 70 65 6e 20 66 69 6c 65 20 64 65 73 63 72 69 70  pen file descrip
18fb0 74 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 73 7a 4d  tor */.  int szM
18fc0 61 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ap;             
18fd0 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74      /* Size of t
18fe0 68 65 20 6d 61 70 70 69 6e 67 20 69 6e 74 6f 20  he mapping into 
18ff0 6d 65 6d 6f 72 79 20 2a 2f 0a 20 20 63 68 61 72  memory */.  char
19000 20 2a 70 4d 4d 61 70 42 75 66 3b 20 20 20 20 20   *pMMapBuf;     
19010 20 20 20 20 20 20 20 2f 2a 20 57 68 65 72 65 20         /* Where 
19020 63 75 72 72 65 6e 74 6c 79 20 6d 6d 61 70 70 65  currently mmappe
19030 64 28 29 2e 20 20 4e 55 4c 4c 20 69 66 20 75 6e  d().  NULL if un
19040 6d 61 70 70 65 64 20 2a 2f 0a 20 20 69 6e 74 20  mapped */.  int 
19050 6e 52 65 66 3b 20 20 20 20 20 20 20 20 20 20 20  nRef;           
19060 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
19070 20 6f 66 20 75 6e 69 78 53 68 6d 20 6f 62 6a 65   of unixShm obje
19080 63 74 73 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20  cts pointing to 
19090 74 68 69 73 20 2a 2f 0a 20 20 75 6e 69 78 53 68  this */.  unixSh
190a0 6d 20 2a 70 46 69 72 73 74 3b 20 20 20 20 20 20  m *pFirst;      
190b0 20 20 20 20 20 2f 2a 20 41 6c 6c 20 75 6e 69 78       /* All unix
190c0 53 68 6d 20 6f 62 6a 65 63 74 73 20 70 6f 69 6e  Shm objects poin
190d0 74 69 6e 67 20 74 6f 20 74 68 69 73 20 2a 2f 0a  ting to this */.
190e0 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45  #ifdef SQLITE_DE
190f0 42 55 47 0a 20 20 75 38 20 65 78 63 6c 4d 61 73  BUG.  u8 exclMas
19100 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  k;              
19110 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 65 78 63 6c   /* Mask of excl
19120 75 73 69 76 65 20 6c 6f 63 6b 73 20 68 65 6c 64  usive locks held
19130 20 2a 2f 0a 20 20 75 38 20 73 68 61 72 65 64 4d   */.  u8 sharedM
19140 61 73 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20  ask;            
19150 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 73 68 61 72   /* Mask of shar
19160 65 64 20 6c 6f 63 6b 73 20 68 65 6c 64 20 2a 2f  ed locks held */
19170 0a 20 20 75 38 20 6e 65 78 74 53 68 6d 49 64 3b  .  u8 nextShmId;
19180 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
19190 20 4e 65 78 74 20 61 76 61 69 6c 61 62 6c 65 20   Next available 
191a0 75 6e 69 78 53 68 6d 2e 69 64 20 76 61 6c 75 65  unixShm.id value
191b0 20 2a 2f 0a 23 65 6e 64 69 66 0a 7d 3b 0a 0a 2f   */.#endif.};../
191c0 2a 0a 2a 2a 20 53 74 72 75 63 74 75 72 65 20 75  *.** Structure u
191d0 73 65 64 20 69 6e 74 65 72 6e 61 6c 6c 79 20 62  sed internally b
191e0 79 20 74 68 69 73 20 56 46 53 20 74 6f 20 72 65  y this VFS to re
191f0 63 6f 72 64 20 74 68 65 20 73 74 61 74 65 20 6f  cord the state o
19200 66 20 61 6e 0a 2a 2a 20 6f 70 65 6e 20 73 68 61  f an.** open sha
19210 72 65 64 20 6d 65 6d 6f 72 79 20 63 6f 6e 6e 65  red memory conne
19220 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  ction..**.** The
19230 20 66 6f 6c 6c 6f 77 69 6e 67 20 66 69 65 6c 64   following field
19240 73 20 61 72 65 20 69 6e 69 74 69 61 6c 69 7a 65  s are initialize
19250 64 20 77 68 65 6e 20 74 68 69 73 20 6f 62 6a 65  d when this obje
19260 63 74 20 69 73 20 63 72 65 61 74 65 64 20 61 6e  ct is created an
19270 64 0a 2a 2a 20 61 72 65 20 72 65 61 64 2d 6f 6e  d.** are read-on
19280 6c 79 20 74 68 65 72 65 61 66 74 65 72 3a 0a 2a  ly thereafter:.*
19290 2a 0a 2a 2a 20 20 20 20 75 6e 69 78 53 68 6d 2e  *.**    unixShm.
192a0 70 46 69 6c 65 0a 2a 2a 20 20 20 20 75 6e 69 78  pFile.**    unix
192b0 53 68 6d 2e 69 64 0a 2a 2a 0a 2a 2a 20 41 6c 6c  Shm.id.**.** All
192c0 20 6f 74 68 65 72 20 66 69 65 6c 64 73 20 61 72   other fields ar
192d0 65 20 72 65 61 64 2f 77 72 69 74 65 2e 20 20 54  e read/write.  T
192e0 68 65 20 75 6e 69 78 53 68 6d 2e 70 46 69 6c 65  he unixShm.pFile
192f0 2d 3e 6d 75 74 65 78 20 6d 75 73 74 20 62 65 20  ->mutex must be 
19300 68 65 6c 64 0a 2a 2a 20 77 68 69 6c 65 20 61 63  held.** while ac
19310 63 65 73 73 69 6e 67 20 61 6e 79 20 72 65 61 64  cessing any read
19320 2f 77 72 69 74 65 20 66 69 65 6c 64 73 2e 0a 2a  /write fields..*
19330 2f 0a 73 74 72 75 63 74 20 75 6e 69 78 53 68 6d  /.struct unixShm
19340 20 7b 0a 20 20 75 6e 69 78 53 68 6d 4e 6f 64 65   {.  unixShmNode
19350 20 2a 70 53 68 6d 4e 6f 64 65 3b 20 20 20 20 20   *pShmNode;     
19360 2f 2a 20 54 68 65 20 75 6e 64 65 72 6c 79 69 6e  /* The underlyin
19370 67 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20 6f 62  g unixShmNode ob
19380 6a 65 63 74 20 2a 2f 0a 20 20 75 6e 69 78 53 68  ject */.  unixSh
19390 6d 20 2a 70 4e 65 78 74 3b 20 20 20 20 20 20 20  m *pNext;       
193a0 20 20 20 20 20 2f 2a 20 4e 65 78 74 20 75 6e 69       /* Next uni
193b0 78 53 68 6d 20 77 69 74 68 20 74 68 65 20 73 61  xShm with the sa
193c0 6d 65 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20 2a  me unixShmNode *
193d0 2f 0a 20 20 75 38 20 68 61 73 4d 75 74 65 78 3b  /.  u8 hasMutex;
193e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
193f0 2a 20 54 72 75 65 20 69 66 20 68 6f 6c 64 69 6e  * True if holdin
19400 67 20 74 68 65 20 75 6e 69 78 53 68 6d 4e 6f 64  g the unixShmNod
19410 65 20 6d 75 74 65 78 20 2a 2f 0a 20 20 75 38 20  e mutex */.  u8 
19420 68 61 73 4d 75 74 65 78 42 75 66 3b 20 20 20 20  hasMutexBuf;    
19430 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
19440 69 66 20 68 6f 6c 64 69 6e 67 20 70 46 69 6c 65  if holding pFile
19450 2d 3e 6d 75 74 65 78 42 75 66 20 2a 2f 0a 20 20  ->mutexBuf */.  
19460 75 31 36 20 73 68 61 72 65 64 4d 61 73 6b 3b 20  u16 sharedMask; 
19470 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61             /* Ma
19480 73 6b 20 6f 66 20 73 68 61 72 65 64 20 6c 6f 63  sk of shared loc
19490 6b 73 20 68 65 6c 64 20 2a 2f 0a 20 20 75 31 36  ks held */.  u16
194a0 20 65 78 63 6c 4d 61 73 6b 3b 20 20 20 20 20 20   exclMask;      
194b0 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20          /* Mask 
194c0 6f 66 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63  of exclusive loc
194d0 6b 73 20 68 65 6c 64 20 2a 2f 0a 23 69 66 64 65  ks held */.#ifde
194e0 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20  f SQLITE_DEBUG. 
194f0 20 75 38 20 69 64 3b 20 20 20 20 20 20 20 20 20   u8 id;         
19500 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
19510 64 20 6f 66 20 74 68 69 73 20 63 6f 6e 6e 65 63  d of this connec
19520 74 69 6f 6e 20 77 69 74 68 69 6e 20 69 74 73 20  tion within its 
19530 75 6e 69 78 53 68 6d 4e 6f 64 65 20 2a 2f 0a 23  unixShmNode */.#
19540 65 6e 64 69 66 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20  endif.};../*.** 
19550 43 6f 6e 73 74 61 6e 74 73 20 75 73 65 64 20 66  Constants used f
19560 6f 72 20 6c 6f 63 6b 69 6e 67 0a 2a 2f 0a 23 64  or locking.*/.#d
19570 65 66 69 6e 65 20 55 4e 49 58 5f 53 48 4d 5f 42  efine UNIX_SHM_B
19580 41 53 45 20 20 20 28 28 31 38 2b 53 51 4c 49 54  ASE   ((18+SQLIT
19590 45 5f 53 48 4d 5f 4e 4c 4f 43 4b 29 2a 34 29 20  E_SHM_NLOCK)*4) 
195a0 20 20 20 20 20 20 20 20 2f 2a 20 66 69 72 73 74          /* first
195b0 20 6c 6f 63 6b 20 62 79 74 65 20 2a 2f 0a 23 64   lock byte */.#d
195c0 65 66 69 6e 65 20 55 4e 49 58 5f 53 48 4d 5f 44  efine UNIX_SHM_D
195d0 4d 53 20 20 20 20 28 55 4e 49 58 5f 53 48 4d 5f  MS    (UNIX_SHM_
195e0 42 41 53 45 2b 53 51 4c 49 54 45 5f 53 48 4d 5f  BASE+SQLITE_SHM_
195f0 4e 4c 4f 43 4b 29 20 20 2f 2a 20 64 65 61 64 6d  NLOCK)  /* deadm
19600 61 6e 20 73 77 69 74 63 68 20 2a 2f 0a 0a 2f 2a  an switch */../*
19610 0a 2a 2a 20 41 70 70 6c 79 20 70 6f 73 69 78 20  .** Apply posix 
19620 61 64 76 69 73 6f 72 79 20 6c 6f 63 6b 73 20 66  advisory locks f
19630 6f 72 20 61 6c 6c 20 62 79 74 65 73 20 66 72 6f  or all bytes fro
19640 6d 20 6f 66 73 74 20 74 68 72 6f 75 67 68 20 6f  m ofst through o
19650 66 73 74 2b 6e 2d 31 2e 0a 2a 2a 0a 2a 2a 20 4c  fst+n-1..**.** L
19660 6f 63 6b 73 20 62 6c 6f 63 6b 20 69 66 20 74 68  ocks block if th
19670 65 20 6d 61 73 6b 20 69 73 20 65 78 61 63 74 6c  e mask is exactl
19680 79 20 55 4e 49 58 5f 53 48 4d 5f 43 20 61 6e 64  y UNIX_SHM_C and
19690 20 61 72 65 20 6e 6f 6e 2d 62 6c 6f 63 6b 69 6e   are non-blockin
196a0 67 0a 2a 2a 20 6f 74 68 65 72 77 69 73 65 2e 0a  g.** otherwise..
196b0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e  */.static int un
196c0 69 78 53 68 6d 53 79 73 74 65 6d 4c 6f 63 6b 28  ixShmSystemLock(
196d0 0a 20 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20 2a  .  unixShmNode *
196e0 70 53 68 6d 4e 6f 64 65 2c 20 2f 2a 20 41 70 70  pShmNode, /* App
196f0 6c 79 20 6c 6f 63 6b 73 20 74 6f 20 74 68 69 73  ly locks to this
19700 20 6f 70 65 6e 20 73 68 61 72 65 64 2d 6d 65 6d   open shared-mem
19710 6f 72 79 20 73 65 67 6d 65 6e 74 20 2a 2f 0a 20  ory segment */. 
19720 20 69 6e 74 20 6c 6f 63 6b 54 79 70 65 2c 20 20   int lockType,  
19730 20 20 20 20 20 20 20 20 2f 2a 20 46 5f 55 4e 4c          /* F_UNL
19740 43 4b 2c 20 46 5f 52 44 4c 43 4b 2c 20 6f 72 20  CK, F_RDLCK, or 
19750 46 5f 57 52 4c 43 4b 20 2a 2f 0a 20 20 69 6e 74  F_WRLCK */.  int
19760 20 6f 66 73 74 2c 20 20 20 20 20 20 20 20 20 20   ofst,          
19770 20 20 20 20 2f 2a 20 46 69 72 73 74 20 62 79 74      /* First byt
19780 65 20 6f 66 20 74 68 65 20 6c 6f 63 6b 69 6e 67  e of the locking
19790 20 72 61 6e 67 65 20 2a 2f 0a 20 20 69 6e 74 20   range */.  int 
197a0 6e 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  n               
197b0 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
197c0 62 79 74 65 73 20 74 6f 20 6c 6f 63 6b 20 2a 2f  bytes to lock */
197d0 0a 29 7b 0a 20 20 73 74 72 75 63 74 20 66 6c 6f  .){.  struct flo
197e0 63 6b 20 66 3b 20 20 20 20 20 20 20 2f 2a 20 54  ck f;       /* T
197f0 68 65 20 70 6f 73 69 78 20 61 64 76 69 73 6f 72  he posix advisor
19800 79 20 6c 6f 63 6b 69 6e 67 20 73 74 72 75 63 74  y locking struct
19810 75 72 65 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20  ure */.  int rc 
19820 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 2f  = SQLITE_OK;   /
19830 2a 20 52 65 73 75 6c 74 20 63 6f 64 65 20 66 6f  * Result code fo
19840 72 6d 20 66 63 6e 74 6c 28 29 20 2a 2f 0a 0a 20  rm fcntl() */.. 
19850 20 2f 2a 20 41 63 63 65 73 73 20 74 6f 20 74 68   /* Access to th
19860 65 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20 6f 62  e unixShmNode ob
19870 6a 65 63 74 20 69 73 20 73 65 72 69 61 6c 69 7a  ject is serializ
19880 65 64 20 62 79 20 74 68 65 20 63 61 6c 6c 65 72  ed by the caller
19890 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 73 71   */.  assert( sq
198a0 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
198b0 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78  (pShmNode->mutex
198c0 29 20 7c 7c 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e  ) || pShmNode->n
198d0 52 65 66 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20  Ref==0 );..  /* 
198e0 53 68 61 72 65 64 20 6c 6f 63 6b 73 20 6e 65 76  Shared locks nev
198f0 65 72 20 73 70 61 6e 20 6d 6f 72 65 20 74 68 61  er span more tha
19900 6e 20 6f 6e 65 20 62 79 74 65 20 2a 2f 0a 20 20  n one byte */.  
19910 61 73 73 65 72 74 28 20 6e 3d 3d 31 20 7c 7c 20  assert( n==1 || 
19920 6c 6f 63 6b 54 79 70 65 21 3d 46 5f 52 44 4c 43  lockType!=F_RDLC
19930 4b 20 29 3b 0a 0a 20 20 2f 2a 20 4c 6f 63 6b 73  K );..  /* Locks
19940 20 61 72 65 20 77 69 74 68 69 6e 20 72 61 6e 67   are within rang
19950 65 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 6e  e */.  assert( n
19960 3e 3d 31 20 26 26 20 6e 3c 53 51 4c 49 54 45 5f  >=1 && n<SQLITE_
19970 53 48 4d 5f 4e 4c 4f 43 4b 20 29 3b 0a 0a 20 20  SHM_NLOCK );..  
19980 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68  /* Initialize th
19990 65 20 6c 6f 63 6b 69 6e 67 20 70 61 72 61 6d 65  e locking parame
199a0 74 65 72 73 20 2a 2f 0a 20 20 6d 65 6d 73 65 74  ters */.  memset
199b0 28 26 66 2c 20 30 2c 20 73 69 7a 65 6f 66 28 66  (&f, 0, sizeof(f
199c0 29 29 3b 0a 20 20 66 2e 6c 5f 74 79 70 65 20 3d  ));.  f.l_type =
199d0 20 6c 6f 63 6b 54 79 70 65 3b 0a 20 20 66 2e 6c   lockType;.  f.l
199e0 5f 77 68 65 6e 63 65 20 3d 20 53 45 45 4b 5f 53  _whence = SEEK_S
199f0 45 54 3b 0a 20 20 66 2e 6c 5f 73 74 61 72 74 20  ET;.  f.l_start 
19a00 3d 20 6f 66 73 74 3b 0a 20 20 66 2e 6c 5f 6c 65  = ofst;.  f.l_le
19a10 6e 20 3d 20 6e 3b 0a 0a 20 20 72 63 20 3d 20 66  n = n;..  rc = f
19a20 63 6e 74 6c 28 70 53 68 6d 4e 6f 64 65 2d 3e 68  cntl(pShmNode->h
19a30 2c 20 46 5f 53 45 54 4c 4b 2c 20 26 66 29 3b 0a  , F_SETLK, &f);.
19a40 20 20 72 63 20 3d 20 28 72 63 21 3d 28 2d 31 29    rc = (rc!=(-1)
19a50 29 20 3f 20 53 51 4c 49 54 45 5f 4f 4b 20 3a 20  ) ? SQLITE_OK : 
19a60 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 0a 20 20  SQLITE_BUSY;..  
19a70 2f 2a 20 55 70 64 61 74 65 20 74 68 65 20 67 6c  /* Update the gl
19a80 6f 62 61 6c 20 6c 6f 63 6b 20 73 74 61 74 65 20  obal lock state 
19a90 61 6e 64 20 64 6f 20 64 65 62 75 67 20 74 72 61  and do debug tra
19aa0 63 69 6e 67 20 2a 2f 0a 23 69 66 64 65 66 20 53  cing */.#ifdef S
19ab0 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 7b 20  QLITE_DEBUG.  { 
19ac0 75 31 36 20 6d 61 73 6b 3b 0a 20 20 4f 53 54 52  u16 mask;.  OSTR
19ad0 41 43 45 28 28 22 53 48 4d 2d 4c 4f 43 4b 20 22  ACE(("SHM-LOCK "
19ae0 29 29 3b 0a 20 20 6d 61 73 6b 20 3d 20 28 31 3c  ));.  mask = (1<
19af0 3c 28 6f 66 73 74 2b 6e 29 29 20 2d 20 28 31 3c  <(ofst+n)) - (1<
19b00 3c 6f 66 73 74 29 3b 0a 20 20 69 66 28 20 72 63  <ofst);.  if( rc
19b10 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
19b20 20 20 20 69 66 28 20 6c 6f 63 6b 54 79 70 65 3d     if( lockType=
19b30 3d 46 5f 55 4e 4c 43 4b 20 29 7b 0a 20 20 20 20  =F_UNLCK ){.    
19b40 20 20 4f 53 54 52 41 43 45 28 28 22 75 6e 6c 6f    OSTRACE(("unlo
19b50 63 6b 20 25 64 20 6f 6b 22 2c 20 6f 66 73 74 29  ck %d ok", ofst)
19b60 29 3b 0a 20 20 20 20 20 20 70 53 68 6d 4e 6f 64  );.      pShmNod
19b70 65 2d 3e 65 78 63 6c 4d 61 73 6b 20 26 3d 20 7e  e->exclMask &= ~
19b80 6d 61 73 6b 3b 0a 20 20 20 20 20 20 70 53 68 6d  mask;.      pShm
19b90 4e 6f 64 65 2d 3e 73 68 61 72 65 64 4d 61 73 6b  Node->sharedMask
19ba0 20 26 3d 20 7e 6d 61 73 6b 3b 0a 20 20 20 20 7d   &= ~mask;.    }
19bb0 65 6c 73 65 20 69 66 28 20 6c 6f 63 6b 54 79 70  else if( lockTyp
19bc0 65 3d 3d 46 5f 52 44 4c 43 4b 20 29 7b 0a 20 20  e==F_RDLCK ){.  
19bd0 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 72 65      OSTRACE(("re
19be0 61 64 2d 6c 6f 63 6b 20 25 64 20 6f 6b 22 2c 20  ad-lock %d ok", 
19bf0 6f 66 73 74 29 29 3b 0a 20 20 20 20 20 20 70 53  ofst));.      pS
19c00 68 6d 4e 6f 64 65 2d 3e 65 78 63 6c 4d 61 73 6b  hmNode->exclMask
19c10 20 26 3d 20 7e 6d 61 73 6b 3b 0a 20 20 20 20 20   &= ~mask;.     
19c20 20 70 53 68 6d 4e 6f 64 65 2d 3e 73 68 61 72 65   pShmNode->share
19c30 64 4d 61 73 6b 20 7c 3d 20 6d 61 73 6b 3b 0a 20  dMask |= mask;. 
19c40 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
19c50 61 73 73 65 72 74 28 20 6c 6f 63 6b 54 79 70 65  assert( lockType
19c60 3d 3d 46 5f 57 52 4c 43 4b 20 29 3b 0a 20 20 20  ==F_WRLCK );.   
19c70 20 20 20 4f 53 54 52 41 43 45 28 28 22 77 72 69     OSTRACE(("wri
19c80 74 65 2d 6c 6f 63 6b 20 25 64 20 6f 6b 22 2c 20  te-lock %d ok", 
19c90 6f 66 73 74 29 29 3b 0a 20 20 20 20 20 20 70 53  ofst));.      pS
19ca0 68 6d 4e 6f 64 65 2d 3e 65 78 63 6c 4d 61 73 6b  hmNode->exclMask
19cb0 20 7c 3d 20 6d 61 73 6b 3b 0a 20 20 20 20 20 20   |= mask;.      
19cc0 70 53 68 6d 4e 6f 64 65 2d 3e 73 68 61 72 65 64  pShmNode->shared
19cd0 4d 61 73 6b 20 26 3d 20 7e 6d 61 73 6b 3b 0a 20  Mask &= ~mask;. 
19ce0 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20     }.  }else{.  
19cf0 20 20 69 66 28 20 6c 6f 63 6b 54 79 70 65 3d 3d    if( lockType==
19d00 46 5f 55 4e 4c 43 4b 20 29 7b 0a 20 20 20 20 20  F_UNLCK ){.     
19d10 20 4f 53 54 52 41 43 45 28 28 22 75 6e 6c 6f 63   OSTRACE(("unloc
19d20 6b 20 25 64 20 66 61 69 6c 65 64 22 2c 20 6f 66  k %d failed", of
19d30 73 74 29 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20  st));.    }else 
19d40 69 66 28 20 6c 6f 63 6b 54 79 70 65 3d 3d 46 5f  if( lockType==F_
19d50 52 44 4c 43 4b 20 29 7b 0a 20 20 20 20 20 20 4f  RDLCK ){.      O
19d60 53 54 52 41 43 45 28 28 22 72 65 61 64 2d 6c 6f  STRACE(("read-lo
19d70 63 6b 20 66 61 69 6c 65 64 22 29 29 3b 0a 20 20  ck failed"));.  
19d80 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61    }else{.      a
19d90 73 73 65 72 74 28 20 6c 6f 63 6b 54 79 70 65 3d  ssert( lockType=
19da0 3d 46 5f 57 52 4c 43 4b 20 29 3b 0a 20 20 20 20  =F_WRLCK );.    
19db0 20 20 4f 53 54 52 41 43 45 28 28 22 77 72 69 74    OSTRACE(("writ
19dc0 65 2d 6c 6f 63 6b 20 25 64 20 66 61 69 6c 65 64  e-lock %d failed
19dd0 22 2c 20 6f 66 73 74 29 29 3b 0a 20 20 20 20 7d  ", ofst));.    }
19de0 0a 20 20 7d 0a 20 20 4f 53 54 52 41 43 45 28 28  .  }.  OSTRACE((
19df0 22 20 2d 20 61 66 74 65 72 77 61 72 64 73 20 25  " - afterwards %
19e00 30 33 78 2c 25 30 33 78 5c 6e 22 2c 0a 20 20 20  03x,%03x\n",.   
19e10 20 20 20 20 20 20 20 20 70 53 68 6d 4e 6f 64 65          pShmNode
19e20 2d 3e 73 68 61 72 65 64 4d 61 73 6b 2c 20 70 53  ->sharedMask, pS
19e30 68 6d 4e 6f 64 65 2d 3e 65 78 63 6c 4d 61 73 6b  hmNode->exclMask
19e40 29 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  ));.  }.#endif..
19e50 20 20 72 65 74 75 72 6e 20 72 63 3b 20 20 20 20    return rc;    
19e60 20 20 20 20 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 50      .}.../*.** P
19e70 75 72 67 65 20 74 68 65 20 75 6e 69 78 53 68 6d  urge the unixShm
19e80 4e 6f 64 65 4c 69 73 74 20 6c 69 73 74 20 6f 66  NodeList list of
19e90 20 61 6c 6c 20 65 6e 74 72 69 65 73 20 77 69 74   all entries wit
19ea0 68 20 75 6e 69 78 53 68 6d 4e 6f 64 65 2e 6e 52  h unixShmNode.nR
19eb0 65 66 3d 3d 30 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  ef==0..**.** Thi
19ec0 73 20 69 73 20 6e 6f 74 20 61 20 56 46 53 20 73  s is not a VFS s
19ed0 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 6d 65 74  hared-memory met
19ee0 68 6f 64 3b 20 69 74 20 69 73 20 61 20 75 74 69  hod; it is a uti
19ef0 6c 69 74 79 20 66 75 6e 63 74 69 6f 6e 20 63 61  lity function ca
19f00 6c 6c 65 64 0a 2a 2a 20 62 79 20 56 46 53 20 73  lled.** by VFS s
19f10 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 6d 65 74  hared-memory met
19f20 68 6f 64 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  hods..*/.static 
19f30 76 6f 69 64 20 75 6e 69 78 53 68 6d 50 75 72 67  void unixShmPurg
19f40 65 28 75 6e 69 78 46 69 6c 65 20 2a 70 46 64 29  e(unixFile *pFd)
19f50 7b 0a 20 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20  {.  unixShmNode 
19f60 2a 70 20 3d 20 70 46 64 2d 3e 70 49 6e 6f 64 65  *p = pFd->pInode
19f70 2d 3e 70 53 68 6d 4e 6f 64 65 3b 0a 20 20 61 73  ->pShmNode;.  as
19f80 73 65 72 74 28 20 75 6e 69 78 4d 75 74 65 78 48  sert( unixMutexH
19f90 65 6c 64 28 29 20 29 3b 0a 20 20 69 66 28 20 70  eld() );.  if( p
19fa0 20 26 26 20 70 2d 3e 6e 52 65 66 3d 3d 30 20 29   && p->nRef==0 )
19fb0 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d  {.    assert( p-
19fc0 3e 70 49 6e 6f 64 65 3d 3d 70 46 64 2d 3e 70 49  >pInode==pFd->pI
19fd0 6e 6f 64 65 20 29 3b 0a 20 20 20 20 69 66 28 20  node );.    if( 
19fe0 70 2d 3e 6d 75 74 65 78 20 29 20 73 71 6c 69 74  p->mutex ) sqlit
19ff0 65 33 5f 6d 75 74 65 78 5f 66 72 65 65 28 70 2d  e3_mutex_free(p-
1a000 3e 6d 75 74 65 78 29 3b 0a 20 20 20 20 69 66 28  >mutex);.    if(
1a010 20 70 2d 3e 6d 75 74 65 78 42 75 66 20 29 20 73   p->mutexBuf ) s
1a020 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 66 72 65  qlite3_mutex_fre
1a030 65 28 70 2d 3e 6d 75 74 65 78 42 75 66 29 3b 0a  e(p->mutexBuf);.
1a040 20 20 20 20 69 66 28 20 70 2d 3e 68 3e 3d 30 20      if( p->h>=0 
1a050 29 20 63 6c 6f 73 65 28 70 2d 3e 68 29 3b 0a 20  ) close(p->h);. 
1a060 20 20 20 70 2d 3e 70 49 6e 6f 64 65 2d 3e 70 53     p->pInode->pS
1a070 68 6d 4e 6f 64 65 20 3d 20 30 3b 0a 20 20 20 20  hmNode = 0;.    
1a080 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 29 3b  sqlite3_free(p);
1a090 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70  .  }.}../*.** Op
1a0a0 65 6e 20 61 20 73 68 61 72 65 64 2d 6d 65 6d 6f  en a shared-memo
1a0b0 72 79 20 61 72 65 61 2e 20 20 54 68 69 73 20 70  ry area.  This p
1a0c0 61 72 74 69 63 75 6c 61 72 20 69 6d 70 6c 65 6d  articular implem
1a0d0 65 6e 74 61 74 69 6f 6e 20 75 73 65 73 0a 2a 2a  entation uses.**
1a0e0 20 6d 6d 61 70 70 65 64 20 66 69 6c 65 73 2e 0a   mmapped files..
1a0f0 2a 2a 0a 2a 2a 20 7a 4e 61 6d 65 20 69 73 20 61  **.** zName is a
1a100 20 66 69 6c 65 6e 61 6d 65 20 75 73 65 64 20 74   filename used t
1a110 6f 20 69 64 65 6e 74 69 66 79 20 74 68 65 20 73  o identify the s
1a120 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 61 72 65  hared-memory are
1a130 61 2e 20 20 54 68 65 0a 2a 2a 20 69 6d 70 6c 65  a.  The.** imple
1a140 6d 65 6e 74 61 74 69 6f 6e 20 64 6f 65 73 20 6e  mentation does n
1a150 6f 74 20 28 61 6e 64 20 70 65 72 68 61 70 73 20  ot (and perhaps 
1a160 73 68 6f 75 6c 64 20 6e 6f 74 29 20 75 73 65 20  should not) use 
1a170 74 68 69 73 20 6e 61 6d 65 0a 2a 2a 20 64 69 72  this name.** dir
1a180 65 63 74 6c 79 2c 20 62 75 74 20 72 61 74 68 65  ectly, but rathe
1a190 72 20 75 73 65 20 69 74 20 61 73 20 61 20 74 65  r use it as a te
1a1a0 6d 70 6c 61 74 65 20 66 6f 72 20 66 69 6e 64 69  mplate for findi
1a1b0 6e 67 20 61 6e 20 61 70 70 72 6f 70 72 69 61 74  ng an appropriat
1a1c0 65 0a 2a 2a 20 6e 61 6d 65 20 66 6f 72 20 74 68  e.** name for th
1a1d0 65 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20  e shared-memory 
1a1e0 73 74 6f 72 61 67 65 2e 20 20 49 6e 20 74 68 69  storage.  In thi
1a1f0 73 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  s implementation
1a200 2c 20 74 68 65 0a 2a 2a 20 73 74 72 69 6e 67 20  , the.** string 
1a210 22 2d 69 6e 64 65 78 22 20 69 73 20 61 70 70 65  "-index" is appe
1a220 6e 64 65 64 20 74 6f 20 7a 4e 61 6d 65 20 61 6e  nded to zName an
1a230 64 20 75 73 65 64 20 61 73 20 74 68 65 20 6e 61  d used as the na
1a240 6d 65 20 6f 66 20 74 68 65 0a 2a 2a 20 6d 6d 61  me of the.** mma
1a250 70 70 65 64 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a  pped file..**.**
1a260 20 57 68 65 6e 20 6f 70 65 6e 69 6e 67 20 61 20   When opening a 
1a270 6e 65 77 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72  new shared-memor
1a280 79 20 66 69 6c 65 2c 20 69 66 20 6e 6f 20 6f 74  y file, if no ot
1a290 68 65 72 20 69 6e 73 74 61 6e 63 65 73 20 6f 66  her instances of
1a2a0 20 74 68 61 74 0a 2a 2a 20 66 69 6c 65 20 61 72   that.** file ar
1a2b0 65 20 63 75 72 72 65 6e 74 6c 79 20 6f 70 65 6e  e currently open
1a2c0 2c 20 69 6e 20 74 68 69 73 20 70 72 6f 63 65 73  , in this proces
1a2d0 73 20 6f 72 20 69 6e 20 6f 74 68 65 72 20 70 72  s or in other pr
1a2e0 6f 63 65 73 73 65 73 2c 20 74 68 65 6e 0a 2a 2a  ocesses, then.**
1a2f0 20 74 68 65 20 66 69 6c 65 20 6d 75 73 74 20 62   the file must b
1a300 65 20 74 72 75 6e 63 61 74 65 64 20 74 6f 20 7a  e truncated to z
1a310 65 72 6f 20 6c 65 6e 67 74 68 20 6f 72 20 68 61  ero length or ha
1a320 76 65 20 69 74 73 20 68 65 61 64 65 72 20 63 6c  ve its header cl
1a330 65 61 72 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  eared..*/.static
1a340 20 69 6e 74 20 75 6e 69 78 53 68 6d 4f 70 65 6e   int unixShmOpen
1a350 28 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65  (.  sqlite3_file
1a360 20 2a 66 64 20 20 20 20 20 20 2f 2a 20 54 68 65   *fd      /* The
1a370 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
1a380 20 6f 66 20 74 68 65 20 61 73 73 6f 63 69 61 74   of the associat
1a390 65 64 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 29  ed database */.)
1a3a0 7b 0a 20 20 73 74 72 75 63 74 20 75 6e 69 78 53  {.  struct unixS
1a3b0 68 6d 20 2a 70 20 3d 20 30 3b 20 20 20 20 20 20  hm *p = 0;      
1a3c0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 6f         /* The co
1a3d0 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 62 65 20 6f  nnection to be o
1a3e0 70 65 6e 65 64 20 2a 2f 0a 20 20 73 74 72 75 63  pened */.  struc
1a3f0 74 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20 2a 70  t unixShmNode *p
1a400 53 68 6d 4e 6f 64 65 20 3d 20 30 3b 20 20 2f 2a  ShmNode = 0;  /*
1a410 20 54 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20   The underlying 
1a420 6d 6d 61 70 70 65 64 20 66 69 6c 65 20 2a 2f 0a  mmapped file */.
1a430 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20    int rc;       
1a440 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a450 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 20 63       /* Result c
1a460 6f 64 65 20 2a 2f 0a 20 20 73 74 72 75 63 74 20  ode */.  struct 
1a470 75 6e 69 78 46 69 6c 65 20 2a 70 44 62 46 64 3b  unixFile *pDbFd;
1a480 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55              /* U
1a490 6e 64 65 72 6c 79 69 6e 67 20 64 61 74 61 62 61  nderlying databa
1a4a0 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74  se file */.  int
1a4b0 20 6e 50 61 74 68 3b 20 20 20 20 20 20 20 20 20   nPath;         
1a4c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a4d0 2f 2a 20 53 69 7a 65 20 6f 66 20 70 44 62 46 64  /* Size of pDbFd
1a4e0 2d 3e 7a 50 61 74 68 20 69 6e 20 62 79 74 65 73  ->zPath in bytes
1a4f0 20 2a 2f 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61   */..  /* Alloca
1a500 74 65 20 73 70 61 63 65 20 66 6f 72 20 74 68 65  te space for the
1a510 20 6e 65 77 20 73 71 6c 69 74 65 33 5f 73 68 6d   new sqlite3_shm
1a520 20 6f 62 6a 65 63 74 2e 0a 20 20 2a 2f 0a 20 20   object..  */.  
1a530 70 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c  p = sqlite3_mall
1a540 6f 63 28 20 73 69 7a 65 6f 66 28 2a 70 29 20 29  oc( sizeof(*p) )
1a550 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72  ;.  if( p==0 ) r
1a560 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
1a570 45 4d 3b 0a 20 20 6d 65 6d 73 65 74 28 70 2c 20  EM;.  memset(p, 
1a580 30 2c 20 73 69 7a 65 6f 66 28 2a 70 29 29 3b 0a  0, sizeof(*p));.
1a590 20 20 70 44 62 46 64 20 3d 20 28 73 74 72 75 63    pDbFd = (struc
1a5a0 74 20 75 6e 69 78 46 69 6c 65 2a 29 66 64 3b 0a  t unixFile*)fd;.
1a5b0 20 20 61 73 73 65 72 74 28 20 70 44 62 46 64 2d    assert( pDbFd-
1a5c0 3e 70 53 68 6d 3d 3d 30 20 29 3b 0a 0a 20 20 2f  >pShm==0 );..  /
1a5d0 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69  * Check to see i
1a5e0 66 20 61 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20  f a unixShmNode 
1a5f0 6f 62 6a 65 63 74 20 61 6c 72 65 61 64 79 20 65  object already e
1a600 78 69 73 74 73 2e 20 20 52 65 75 73 65 20 61 6e  xists.  Reuse an
1a610 20 65 78 69 73 74 69 6e 67 0a 20 20 2a 2a 20 6f   existing.  ** o
1a620 6e 65 20 69 66 20 70 72 65 73 65 6e 74 2e 20 20  ne if present.  
1a630 43 72 65 61 74 65 20 61 20 6e 65 77 20 6f 6e 65  Create a new one
1a640 20 69 66 20 6e 65 63 65 73 73 61 72 79 2e 0a 20   if necessary.. 
1a650 20 2a 2f 0a 20 20 75 6e 69 78 45 6e 74 65 72 4d   */.  unixEnterM
1a660 75 74 65 78 28 29 3b 0a 20 20 70 53 68 6d 4e 6f  utex();.  pShmNo
1a670 64 65 20 3d 20 70 44 62 46 64 2d 3e 70 49 6e 6f  de = pDbFd->pIno
1a680 64 65 2d 3e 70 53 68 6d 4e 6f 64 65 3b 0a 20 20  de->pShmNode;.  
1a690 69 66 28 20 70 53 68 6d 4e 6f 64 65 3d 3d 30 20  if( pShmNode==0 
1a6a0 29 7b 0a 20 20 20 20 6e 50 61 74 68 20 3d 20 73  ){.    nPath = s
1a6b0 74 72 6c 65 6e 28 70 44 62 46 64 2d 3e 7a 50 61  trlen(pDbFd->zPa
1a6c0 74 68 29 3b 0a 20 20 20 20 70 53 68 6d 4e 6f 64  th);.    pShmNod
1a6d0 65 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c  e = sqlite3_mall
1a6e0 6f 63 28 20 73 69 7a 65 6f 66 28 2a 70 53 68 6d  oc( sizeof(*pShm
1a6f0 4e 6f 64 65 29 20 2b 20 6e 50 61 74 68 20 2b 20  Node) + nPath + 
1a700 31 35 20 29 3b 0a 20 20 20 20 69 66 28 20 70 53  15 );.    if( pS
1a710 68 6d 4e 6f 64 65 3d 3d 30 20 29 7b 0a 20 20 20  hmNode==0 ){.   
1a720 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e     rc = SQLITE_N
1a730 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 67 6f 74 6f  OMEM;.      goto
1a740 20 73 68 6d 5f 6f 70 65 6e 5f 65 72 72 3b 0a 20   shm_open_err;. 
1a750 20 20 20 7d 0a 20 20 20 20 6d 65 6d 73 65 74 28     }.    memset(
1a760 70 53 68 6d 4e 6f 64 65 2c 20 30 2c 20 73 69 7a  pShmNode, 0, siz
1a770 65 6f 66 28 2a 70 53 68 6d 4e 6f 64 65 29 29 3b  eof(*pShmNode));
1a780 0a 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 7a  .    pShmNode->z
1a790 46 69 6c 65 6e 61 6d 65 20 3d 20 28 63 68 61 72  Filename = (char
1a7a0 2a 29 26 70 53 68 6d 4e 6f 64 65 5b 31 5d 3b 0a  *)&pShmNode[1];.
1a7b0 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
1a7c0 69 6e 74 66 28 6e 50 61 74 68 2b 31 35 2c 20 70  intf(nPath+15, p
1a7d0 53 68 6d 4e 6f 64 65 2d 3e 7a 46 69 6c 65 6e 61  ShmNode->zFilena
1a7e0 6d 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  me,.            
1a7f0 20 20 20 20 20 20 20 20 20 22 25 73 2d 77 61 6c           "%s-wal
1a800 2d 69 6e 64 65 78 22 2c 20 70 44 62 46 64 2d 3e  -index", pDbFd->
1a810 7a 50 61 74 68 29 3b 0a 20 20 20 20 70 53 68 6d  zPath);.    pShm
1a820 4e 6f 64 65 2d 3e 68 20 3d 20 2d 31 3b 0a 20 20  Node->h = -1;.  
1a830 20 20 70 44 62 46 64 2d 3e 70 49 6e 6f 64 65 2d    pDbFd->pInode-
1a840 3e 70 53 68 6d 4e 6f 64 65 20 3d 20 70 53 68 6d  >pShmNode = pShm
1a850 4e 6f 64 65 3b 0a 20 20 20 20 70 53 68 6d 4e 6f  Node;.    pShmNo
1a860 64 65 2d 3e 70 49 6e 6f 64 65 20 3d 20 70 44 62  de->pInode = pDb
1a870 46 64 2d 3e 70 49 6e 6f 64 65 3b 0a 20 20 20 20  Fd->pInode;.    
1a880 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 20  pShmNode->mutex 
1a890 3d 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  = sqlite3_mutex_
1a8a0 61 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54  alloc(SQLITE_MUT
1a8b0 45 58 5f 46 41 53 54 29 3b 0a 20 20 20 20 69 66  EX_FAST);.    if
1a8c0 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65  ( pShmNode->mute
1a8d0 78 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 63  x==0 ){.      rc
1a8e0 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b   = SQLITE_NOMEM;
1a8f0 0a 20 20 20 20 20 20 67 6f 74 6f 20 73 68 6d 5f  .      goto shm_
1a900 6f 70 65 6e 5f 65 72 72 3b 0a 20 20 20 20 7d 0a  open_err;.    }.
1a910 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75      pShmNode->mu
1a920 74 65 78 42 75 66 20 3d 20 73 71 6c 69 74 65 33  texBuf = sqlite3
1a930 5f 6d 75 74 65 78 5f 61 6c 6c 6f 63 28 53 51 4c  _mutex_alloc(SQL
1a940 49 54 45 5f 4d 55 54 45 58 5f 46 41 53 54 29 3b  ITE_MUTEX_FAST);
1a950 0a 20 20 20 20 69 66 28 20 70 53 68 6d 4e 6f 64  .    if( pShmNod
1a960 65 2d 3e 6d 75 74 65 78 42 75 66 3d 3d 30 20 29  e->mutexBuf==0 )
1a970 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  {.      rc = SQL
1a980 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20  ITE_NOMEM;.     
1a990 20 67 6f 74 6f 20 73 68 6d 5f 6f 70 65 6e 5f 65   goto shm_open_e
1a9a0 72 72 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70  rr;.    }..    p
1a9b0 53 68 6d 4e 6f 64 65 2d 3e 68 20 3d 20 6f 70 65  ShmNode->h = ope
1a9c0 6e 28 70 53 68 6d 4e 6f 64 65 2d 3e 7a 46 69 6c  n(pShmNode->zFil
1a9d0 65 6e 61 6d 65 2c 20 4f 5f 52 44 57 52 7c 4f 5f  ename, O_RDWR|O_
1a9e0 43 52 45 41 54 2c 20 30 36 36 34 29 3b 0a 20 20  CREAT, 0664);.  
1a9f0 20 20 69 66 28 20 70 53 68 6d 4e 6f 64 65 2d 3e    if( pShmNode->
1aa00 68 3c 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20  h<0 ){.      rc 
1aa10 3d 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45  = SQLITE_CANTOPE
1aa20 4e 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 67 6f  N_BKPT;.      go
1aa30 74 6f 20 73 68 6d 5f 6f 70 65 6e 5f 65 72 72 3b  to shm_open_err;
1aa40 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43  .    }..    /* C
1aa50 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 61  heck to see if a
1aa60 6e 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20 69  nother process i
1aa70 73 20 68 6f 6c 64 69 6e 67 20 74 68 65 20 64 65  s holding the de
1aa80 61 64 2d 6d 61 6e 20 73 77 69 74 63 68 2e 0a 20  ad-man switch.. 
1aa90 20 20 20 2a 2a 20 49 66 20 6e 6f 74 2c 20 74 72     ** If not, tr
1aaa0 75 6e 63 61 74 65 20 74 68 65 20 66 69 6c 65 20  uncate the file 
1aab0 74 6f 20 7a 65 72 6f 20 6c 65 6e 67 74 68 2e 20  to zero length. 
1aac0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d  .    */.    rc =
1aad0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
1aae0 69 66 28 20 75 6e 69 78 53 68 6d 53 79 73 74 65  if( unixShmSyste
1aaf0 6d 4c 6f 63 6b 28 70 53 68 6d 4e 6f 64 65 2c 20  mLock(pShmNode, 
1ab00 46 5f 57 52 4c 43 4b 2c 20 55 4e 49 58 5f 53 48  F_WRLCK, UNIX_SH
1ab10 4d 5f 44 4d 53 2c 20 31 29 3d 3d 53 51 4c 49 54  M_DMS, 1)==SQLIT
1ab20 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 69 66  E_OK ){.      if
1ab30 28 20 66 74 72 75 6e 63 61 74 65 28 70 53 68 6d  ( ftruncate(pShm
1ab40 4e 6f 64 65 2d 3e 68 2c 20 30 29 20 29 7b 0a 20  Node->h, 0) ){. 
1ab50 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
1ab60 54 45 5f 49 4f 45 52 52 3b 0a 20 20 20 20 20 20  TE_IOERR;.      
1ab70 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  }.    }.    if( 
1ab80 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
1ab90 0a 20 20 20 20 20 20 72 63 20 3d 20 75 6e 69 78  .      rc = unix
1aba0 53 68 6d 53 79 73 74 65 6d 4c 6f 63 6b 28 70 53  ShmSystemLock(pS
1abb0 68 6d 4e 6f 64 65 2c 20 46 5f 52 44 4c 43 4b 2c  hmNode, F_RDLCK,
1abc0 20 55 4e 49 58 5f 53 48 4d 5f 44 4d 53 2c 20 31   UNIX_SHM_DMS, 1
1abd0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
1abe0 20 72 63 20 29 20 67 6f 74 6f 20 73 68 6d 5f 6f   rc ) goto shm_o
1abf0 70 65 6e 5f 65 72 72 3b 0a 20 20 7d 0a 0a 20 20  pen_err;.  }..  
1ac00 2f 2a 20 4d 61 6b 65 20 74 68 65 20 6e 65 77 20  /* Make the new 
1ac10 63 6f 6e 6e 65 63 74 69 6f 6e 20 61 20 63 68 69  connection a chi
1ac20 6c 64 20 6f 66 20 74 68 65 20 75 6e 69 78 53 68  ld of the unixSh
1ac30 6d 4e 6f 64 65 20 2a 2f 0a 20 20 70 2d 3e 70 53  mNode */.  p->pS
1ac40 68 6d 4e 6f 64 65 20 3d 20 70 53 68 6d 4e 6f 64  hmNode = pShmNod
1ac50 65 3b 0a 20 20 70 2d 3e 70 4e 65 78 74 20 3d 20  e;.  p->pNext = 
1ac60 70 53 68 6d 4e 6f 64 65 2d 3e 70 46 69 72 73 74  pShmNode->pFirst
1ac70 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ;.#ifdef SQLITE_
1ac80 44 45 42 55 47 0a 20 20 70 2d 3e 69 64 20 3d 20  DEBUG.  p->id = 
1ac90 70 53 68 6d 4e 6f 64 65 2d 3e 6e 65 78 74 53 68  pShmNode->nextSh
1aca0 6d 49 64 2b 2b 3b 0a 23 65 6e 64 69 66 0a 20 20  mId++;.#endif.  
1acb0 70 53 68 6d 4e 6f 64 65 2d 3e 70 46 69 72 73 74  pShmNode->pFirst
1acc0 20 3d 20 70 3b 0a 20 20 70 53 68 6d 4e 6f 64 65   = p;.  pShmNode
1acd0 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 70 44 62 46  ->nRef++;.  pDbF
1ace0 64 2d 3e 70 53 68 6d 20 3d 20 70 3b 0a 20 20 75  d->pShm = p;.  u
1acf0 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b  nixLeaveMutex();
1ad00 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
1ad10 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20  _OK;..  /* Jump 
1ad20 68 65 72 65 20 6f 6e 20 61 6e 79 20 65 72 72 6f  here on any erro
1ad30 72 20 2a 2f 0a 73 68 6d 5f 6f 70 65 6e 5f 65 72  r */.shm_open_er
1ad40 72 3a 0a 20 20 75 6e 69 78 53 68 6d 50 75 72 67  r:.  unixShmPurg
1ad50 65 28 70 44 62 46 64 29 3b 20 20 20 20 20 20 20  e(pDbFd);       
1ad60 2f 2a 20 54 68 69 73 20 63 61 6c 6c 20 66 72 65  /* This call fre
1ad70 65 73 20 70 53 68 6d 4e 6f 64 65 20 69 66 20 72  es pShmNode if r
1ad80 65 71 75 69 72 65 64 20 2a 2f 0a 20 20 73 71 6c  equired */.  sql
1ad90 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 20 20  ite3_free(p);.  
1ada0 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29  unixLeaveMutex()
1adb0 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
1adc0 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 20  ../*.** Close a 
1add0 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 73 68  connection to sh
1ade0 61 72 65 64 2d 6d 65 6d 6f 72 79 2e 20 20 44 65  ared-memory.  De
1adf0 6c 65 74 65 20 74 68 65 20 75 6e 64 65 72 6c 79  lete the underly
1ae00 69 6e 67 20 0a 2a 2a 20 73 74 6f 72 61 67 65 20  ing .** storage 
1ae10 69 66 20 64 65 6c 65 74 65 46 6c 61 67 20 69 73  if deleteFlag is
1ae20 20 74 72 75 65 2e 0a 2a 2f 0a 73 74 61 74 69 63   true..*/.static
1ae30 20 69 6e 74 20 75 6e 69 78 53 68 6d 43 6c 6f 73   int unixShmClos
1ae40 65 28 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c  e(.  sqlite3_fil
1ae50 65 20 2a 66 64 2c 20 20 20 20 20 20 20 20 20 20  e *fd,          
1ae60 2f 2a 20 54 68 65 20 75 6e 64 65 72 6c 79 69 6e  /* The underlyin
1ae70 67 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  g database file 
1ae80 2a 2f 0a 20 20 69 6e 74 20 64 65 6c 65 74 65 46  */.  int deleteF
1ae90 6c 61 67 20 20 20 20 20 20 20 20 20 20 20 20 20  lag             
1aea0 2f 2a 20 44 65 6c 65 74 65 20 73 68 61 72 65 64  /* Delete shared
1aeb0 2d 6d 65 6d 6f 72 79 20 69 66 20 74 72 75 65 20  -memory if true 
1aec0 2a 2f 0a 29 7b 0a 20 20 75 6e 69 78 53 68 6d 20  */.){.  unixShm 
1aed0 2a 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  *p;            /
1aee0 2a 20 54 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  * The connection
1aef0 20 74 6f 20 62 65 20 63 6c 6f 73 65 64 20 2a 2f   to be closed */
1af00 0a 20 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20 2a  .  unixShmNode *
1af10 70 53 68 6d 4e 6f 64 65 3b 20 2f 2a 20 54 68 65  pShmNode; /* The
1af20 20 75 6e 64 65 72 6c 79 69 6e 67 20 73 68 61 72   underlying shar
1af30 65 64 2d 6d 65 6d 6f 72 79 20 66 69 6c 65 20 2a  ed-memory file *
1af40 2f 0a 20 20 75 6e 69 78 53 68 6d 20 2a 2a 70 70  /.  unixShm **pp
1af50 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6f  ;          /* Fo
1af60 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72 20 73  r looping over s
1af70 69 62 6c 69 6e 67 20 63 6f 6e 6e 65 63 74 69 6f  ibling connectio
1af80 6e 73 20 2a 2f 0a 20 20 75 6e 69 78 46 69 6c 65  ns */.  unixFile
1af90 20 2a 70 44 62 46 64 3b 20 20 20 20 20 20 20 2f   *pDbFd;       /
1afa0 2a 20 54 68 65 20 75 6e 64 65 72 6c 79 69 6e 67  * The underlying
1afb0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a   database file *
1afc0 2f 0a 0a 20 20 70 44 62 46 64 20 3d 20 28 75 6e  /..  pDbFd = (un
1afd0 69 78 46 69 6c 65 2a 29 66 64 3b 0a 20 20 70 20  ixFile*)fd;.  p 
1afe0 3d 20 70 44 62 46 64 2d 3e 70 53 68 6d 3b 0a 20  = pDbFd->pShm;. 
1aff0 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75   if( p==0 ) retu
1b000 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
1b010 70 53 68 6d 4e 6f 64 65 20 3d 20 70 2d 3e 70 53  pShmNode = p->pS
1b020 68 6d 4e 6f 64 65 3b 0a 0a 20 20 61 73 73 65 72  hmNode;..  asser
1b030 74 28 20 70 53 68 6d 4e 6f 64 65 3d 3d 70 44 62  t( pShmNode==pDb
1b040 46 64 2d 3e 70 49 6e 6f 64 65 2d 3e 70 53 68 6d  Fd->pInode->pShm
1b050 4e 6f 64 65 20 29 3b 0a 20 20 61 73 73 65 72 74  Node );.  assert
1b060 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 70 49 6e 6f  ( pShmNode->pIno
1b070 64 65 3d 3d 70 44 62 46 64 2d 3e 70 49 6e 6f 64  de==pDbFd->pInod
1b080 65 20 29 3b 0a 0a 20 20 2f 2a 20 56 65 72 69 66  e );..  /* Verif
1b090 79 20 74 68 61 74 20 74 68 65 20 63 6f 6e 6e 65  y that the conne
1b0a0 63 74 69 6f 6e 20 62 65 69 6e 67 20 63 6c 6f 73  ction being clos
1b0b0 65 64 20 68 6f 6c 64 73 20 6e 6f 20 6c 6f 63 6b  ed holds no lock
1b0c0 73 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70  s */.  assert( p
1b0d0 2d 3e 65 78 63 6c 4d 61 73 6b 3d 3d 30 20 29 3b  ->exclMask==0 );
1b0e0 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 73 68  .  assert( p->sh
1b0f0 61 72 65 64 4d 61 73 6b 3d 3d 30 20 29 3b 0a 0a  aredMask==0 );..
1b100 20 20 2f 2a 20 52 65 6d 6f 76 65 20 63 6f 6e 6e    /* Remove conn
1b110 65 63 74 69 6f 6e 20 70 20 66 72 6f 6d 20 74 68  ection p from th
1b120 65 20 73 65 74 20 6f 66 20 63 6f 6e 6e 65 63 74  e set of connect
1b130 69 6f 6e 73 20 61 73 73 6f 63 69 61 74 65 64 0a  ions associated.
1b140 20 20 2a 2a 20 77 69 74 68 20 70 53 68 6d 4e 6f    ** with pShmNo
1b150 64 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  de */.  sqlite3_
1b160 6d 75 74 65 78 5f 65 6e 74 65 72 28 70 53 68 6d  mutex_enter(pShm
1b170 4e 6f 64 65 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  Node->mutex);.  
1b180 66 6f 72 28 70 70 3d 26 70 53 68 6d 4e 6f 64 65  for(pp=&pShmNode
1b190 2d 3e 70 46 69 72 73 74 3b 20 28 2a 70 70 29 21  ->pFirst; (*pp)!
1b1a0 3d 70 3b 20 70 70 20 3d 20 26 28 2a 70 70 29 2d  =p; pp = &(*pp)-
1b1b0 3e 70 4e 65 78 74 29 7b 7d 0a 20 20 2a 70 70 20  >pNext){}.  *pp 
1b1c0 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a 0a 20 20 2f  = p->pNext;..  /
1b1d0 2a 20 46 72 65 65 20 74 68 65 20 63 6f 6e 6e 65  * Free the conne
1b1e0 63 74 69 6f 6e 20 70 20 2a 2f 0a 20 20 73 71 6c  ction p */.  sql
1b1f0 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 20 20  ite3_free(p);.  
1b200 70 44 62 46 64 2d 3e 70 53 68 6d 20 3d 20 30 3b  pDbFd->pShm = 0;
1b210 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
1b220 5f 6c 65 61 76 65 28 70 53 68 6d 4e 6f 64 65 2d  _leave(pShmNode-
1b230 3e 6d 75 74 65 78 29 3b 0a 0a 20 20 2f 2a 20 49  >mutex);..  /* I
1b240 66 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 66  f pShmNode->nRef
1b250 20 68 61 73 20 72 65 61 63 68 65 64 20 30 2c 20   has reached 0, 
1b260 74 68 65 6e 20 63 6c 6f 73 65 20 74 68 65 20 75  then close the u
1b270 6e 64 65 72 6c 79 69 6e 67 0a 20 20 2a 2a 20 73  nderlying.  ** s
1b280 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 66 69 6c  hared-memory fil
1b290 65 2c 20 74 6f 6f 20 2a 2f 0a 20 20 75 6e 69 78  e, too */.  unix
1b2a0 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 20 20  EnterMutex();.  
1b2b0 61 73 73 65 72 74 28 20 70 53 68 6d 4e 6f 64 65  assert( pShmNode
1b2c0 2d 3e 6e 52 65 66 3e 30 20 29 3b 0a 20 20 70 53  ->nRef>0 );.  pS
1b2d0 68 6d 4e 6f 64 65 2d 3e 6e 52 65 66 2d 2d 3b 0a  hmNode->nRef--;.
1b2e0 20 20 69 66 28 20 70 53 68 6d 4e 6f 64 65 2d 3e    if( pShmNode->
1b2f0 6e 52 65 66 3d 3d 30 20 29 7b 0a 20 20 20 20 69  nRef==0 ){.    i
1b300 66 28 20 64 65 6c 65 74 65 46 6c 61 67 20 29 20  f( deleteFlag ) 
1b310 75 6e 6c 69 6e 6b 28 70 53 68 6d 4e 6f 64 65 2d  unlink(pShmNode-
1b320 3e 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20  >zFilename);.   
1b330 20 75 6e 69 78 53 68 6d 50 75 72 67 65 28 70 44   unixShmPurge(pD
1b340 62 46 64 29 3b 0a 20 20 7d 0a 20 20 75 6e 69 78  bFd);.  }.  unix
1b350 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 0a 20  LeaveMutex();.. 
1b360 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
1b370 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e  K;.}../*.** Chan
1b380 67 65 73 20 74 68 65 20 73 69 7a 65 20 6f 66 20  ges the size of 
1b390 74 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 73  the underlying s
1b3a0 74 6f 72 61 67 65 20 66 6f 72 20 20 61 20 73 68  torage for  a sh
1b3b0 61 72 65 64 2d 6d 65 6d 6f 72 79 20 73 65 67 6d  ared-memory segm
1b3c0 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72  ent..**.** The r
1b3d0 65 71 53 69 7a 65 20 70 61 72 61 6d 65 74 65 72  eqSize parameter
1b3e0 20 69 73 20 74 68 65 20 6e 65 77 20 72 65 71 75   is the new requ
1b3f0 65 73 74 65 64 20 73 69 7a 65 20 6f 66 20 74 68  ested size of th
1b400 65 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 2e  e shared memory.
1b410 0a 2a 2a 20 54 68 69 73 20 69 6d 70 6c 65 6d 65  .** This impleme
1b420 6e 74 61 74 69 6f 6e 20 69 73 20 66 72 65 65 20  ntation is free 
1b430 74 6f 20 69 6e 63 72 65 61 73 65 20 74 68 65 20  to increase the 
1b440 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 73 69  shared memory si
1b450 7a 65 20 74 6f 0a 2a 2a 20 61 6e 79 20 61 6d 6f  ze to.** any amo
1b460 75 6e 74 20 67 72 65 61 74 65 72 20 74 68 61 6e  unt greater than
1b470 20 6f 72 20 65 71 75 61 6c 20 74 6f 20 72 65 71   or equal to req
1b480 53 69 7a 65 2e 20 20 49 66 20 74 68 65 20 73 68  Size.  If the sh
1b490 61 72 65 64 20 6d 65 6d 6f 72 79 20 69 73 0a 2a  ared memory is.*
1b4a0 2a 20 61 6c 72 65 61 64 79 20 61 73 20 62 69 67  * already as big
1b4b0 20 6f 72 20 62 69 67 67 65 72 20 61 73 20 72 65   or bigger as re
1b4c0 71 53 69 7a 65 2c 20 74 68 69 73 20 72 6f 75 74  qSize, this rout
1b4d0 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a  ine is a no-op..
1b4e0 2a 2a 0a 2a 2a 20 54 68 65 20 72 65 71 53 69 7a  **.** The reqSiz
1b4f0 65 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 74  e parameter is t
1b500 68 65 20 6d 69 6e 69 6d 75 6d 20 73 69 7a 65 20  he minimum size 
1b510 72 65 71 75 65 73 74 65 64 2e 20 20 54 68 65 20  requested.  The 
1b520 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 0a 2a  implementation.*
1b530 2a 20 69 73 20 66 72 65 65 20 74 6f 20 65 78 70  * is free to exp
1b540 61 6e 64 20 74 68 65 20 73 74 6f 72 61 67 65 20  and the storage 
1b550 74 6f 20 73 6f 6d 65 20 6c 61 72 67 65 72 20 61  to some larger a
1b560 6d 6f 75 6e 74 20 69 66 20 69 74 20 63 68 6f 6f  mount if it choo
1b570 73 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ses..*/.static i
1b580 6e 74 20 75 6e 69 78 53 68 6d 53 69 7a 65 28 0a  nt unixShmSize(.
1b590 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a    sqlite3_file *
1b5a0 66 64 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 54  fd,         /* T
1b5b0 68 65 20 6f 70 65 6e 20 64 61 74 61 62 61 73 65  he open database
1b5c0 20 66 69 6c 65 20 68 6f 6c 64 69 6e 67 20 53 48   file holding SH
1b5d0 4d 20 2a 2f 0a 20 20 69 6e 74 20 72 65 71 53 69  M */.  int reqSi
1b5e0 7a 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ze,             
1b5f0 20 2f 2a 20 52 65 71 75 65 73 74 65 64 20 73 69   /* Requested si
1b600 7a 65 2e 20 20 2d 31 20 66 6f 72 20 71 75 65 72  ze.  -1 for quer
1b610 79 20 6f 6e 6c 79 20 2a 2f 0a 20 20 69 6e 74 20  y only */.  int 
1b620 2a 70 4e 65 77 53 69 7a 65 20 20 20 20 20 20 20  *pNewSize       
1b630 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 6e        /* Write n
1b640 65 77 20 73 69 7a 65 20 68 65 72 65 20 2a 2f 0a  ew size here */.
1b650 29 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70  ){.  unixFile *p
1b660 44 62 46 64 20 3d 20 28 75 6e 69 78 46 69 6c 65  DbFd = (unixFile
1b670 2a 29 66 64 3b 0a 20 20 75 6e 69 78 53 68 6d 20  *)fd;.  unixShm 
1b680 2a 70 20 3d 20 70 44 62 46 64 2d 3e 70 53 68 6d  *p = pDbFd->pShm
1b690 3b 0a 20 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20  ;.  unixShmNode 
1b6a0 2a 70 53 68 6d 4e 6f 64 65 20 3d 20 70 2d 3e 70  *pShmNode = p->p
1b6b0 53 68 6d 4e 6f 64 65 3b 0a 20 20 69 6e 74 20 72  ShmNode;.  int r
1b6c0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
1b6d0 20 73 74 72 75 63 74 20 73 74 61 74 20 73 53 74   struct stat sSt
1b6e0 61 74 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70  at;..  assert( p
1b6f0 53 68 6d 4e 6f 64 65 3d 3d 70 44 62 46 64 2d 3e  ShmNode==pDbFd->
1b700 70 49 6e 6f 64 65 2d 3e 70 53 68 6d 4e 6f 64 65  pInode->pShmNode
1b710 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53   );.  assert( pS
1b720 68 6d 4e 6f 64 65 2d 3e 70 49 6e 6f 64 65 3d 3d  hmNode->pInode==
1b730 70 44 62 46 64 2d 3e 70 49 6e 6f 64 65 20 29 3b  pDbFd->pInode );
1b740 0a 0a 20 20 77 68 69 6c 65 28 20 31 20 29 7b 0a  ..  while( 1 ){.
1b750 20 20 20 20 69 66 28 20 66 73 74 61 74 28 70 53      if( fstat(pS
1b760 68 6d 4e 6f 64 65 2d 3e 68 2c 20 26 73 53 74 61  hmNode->h, &sSta
1b770 74 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 2a  t)==0 ){.      *
1b780 70 4e 65 77 53 69 7a 65 20 3d 20 28 69 6e 74 29  pNewSize = (int)
1b790 73 53 74 61 74 2e 73 74 5f 73 69 7a 65 3b 0a 20  sStat.st_size;. 
1b7a0 20 20 20 20 20 69 66 28 20 72 65 71 53 69 7a 65       if( reqSize
1b7b0 3c 3d 28 69 6e 74 29 73 53 74 61 74 2e 73 74 5f  <=(int)sStat.st_
1b7c0 73 69 7a 65 20 29 20 62 72 65 61 6b 3b 0a 20 20  size ) break;.  
1b7d0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2a    }else{.      *
1b7e0 70 4e 65 77 53 69 7a 65 20 3d 20 30 3b 0a 20 20  pNewSize = 0;.  
1b7f0 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
1b800 49 4f 45 52 52 3b 0a 20 20 20 20 20 20 62 72 65  IOERR;.      bre
1b810 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63  ak;.    }.    rc
1b820 20 3d 20 66 74 72 75 6e 63 61 74 65 28 70 53 68   = ftruncate(pSh
1b830 6d 4e 6f 64 65 2d 3e 68 2c 20 72 65 71 53 69 7a  mNode->h, reqSiz
1b840 65 29 3b 0a 20 20 20 20 72 65 71 53 69 7a 65 20  e);.    reqSize 
1b850 3d 20 2d 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75  = -1;.  }.  retu
1b860 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  rn rc;.}.../*.**
1b870 20 4d 61 70 20 74 68 65 20 73 68 61 72 65 64 20   Map the shared 
1b880 73 74 6f 72 61 67 65 20 69 6e 74 6f 20 6d 65 6d  storage into mem
1b890 6f 72 79 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 72  ory. .**.** If r
1b8a0 65 71 4d 61 70 53 69 7a 65 20 69 73 20 70 6f 73  eqMapSize is pos
1b8b0 69 74 69 76 65 2c 20 74 68 65 6e 20 61 6e 20 61  itive, then an a
1b8c0 74 74 65 6d 70 74 20 69 73 20 6d 61 64 65 20 74  ttempt is made t
1b8d0 6f 20 6d 61 6b 65 20 74 68 65 0a 2a 2a 20 6d 61  o make the.** ma
1b8e0 70 70 69 6e 67 20 61 74 20 6c 65 61 73 74 20 72  pping at least r
1b8f0 65 71 4d 61 70 53 69 7a 65 20 62 79 74 65 73 20  eqMapSize bytes 
1b900 69 6e 20 73 69 7a 65 2e 20 20 48 6f 77 65 76 65  in size.  Howeve
1b910 72 2c 20 74 68 65 20 6d 61 70 70 69 6e 67 0a 2a  r, the mapping.*
1b920 2a 20 77 69 6c 6c 20 6e 65 76 65 72 20 62 65 20  * will never be 
1b930 6c 61 72 67 65 72 20 74 68 61 6e 20 74 68 65 20  larger than the 
1b940 73 69 7a 65 20 6f 66 20 74 68 65 20 75 6e 64 65  size of the unde
1b950 72 6c 79 69 6e 67 20 73 68 61 72 65 64 20 6d 65  rlying shared me
1b960 6d 6f 72 79 0a 2a 2a 20 61 73 20 73 65 74 20 62  mory.** as set b
1b970 79 20 70 72 69 6f 72 20 63 61 6c 6c 73 20 74 6f  y prior calls to
1b980 20 78 53 68 6d 53 69 7a 65 28 29 2e 20 20 0a 2a   xShmSize().  .*
1b990 2a 0a 2a 2a 20 2a 70 70 42 75 66 20 69 73 20 6d  *.** *ppBuf is m
1b9a0 61 64 65 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20  ade to point to 
1b9b0 74 68 65 20 6d 65 6d 6f 72 79 20 77 68 69 63 68  the memory which
1b9c0 20 69 73 20 61 20 6d 61 70 70 69 6e 67 20 6f 66   is a mapping of
1b9d0 20 74 68 65 0a 2a 2a 20 75 6e 64 65 72 6c 79 69   the.** underlyi
1b9e0 6e 67 20 73 74 6f 72 61 67 65 2e 20 20 41 20 6d  ng storage.  A m
1b9f0 75 74 65 78 20 69 73 20 61 63 71 75 69 72 65 64  utex is acquired
1ba00 20 74 6f 20 70 72 65 76 65 6e 74 20 6f 74 68 65   to prevent othe
1ba10 72 20 74 68 72 65 61 64 73 0a 2a 2a 20 66 72 6f  r threads.** fro
1ba20 6d 20 72 75 6e 6e 69 6e 67 20 77 68 69 6c 65 20  m running while 
1ba30 2a 70 70 42 75 66 20 69 73 20 69 6e 20 75 73 65  *ppBuf is in use
1ba40 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 70 72 65   in order to pre
1ba50 76 65 6e 74 20 6f 74 68 65 72 20 74 68 72 65 61  vent other threa
1ba60 64 73 0a 2a 2a 20 72 65 6d 61 70 70 69 6e 67 20  ds.** remapping 
1ba70 2a 70 70 42 75 66 20 6f 75 74 20 66 72 6f 6d 20  *ppBuf out from 
1ba80 75 6e 64 65 72 20 74 68 69 73 20 74 68 72 65 61  under this threa
1ba90 64 2e 20 20 54 68 65 20 75 6e 69 78 53 68 6d 52  d.  The unixShmR
1baa0 65 6c 65 61 73 65 28 29 0a 2a 2a 20 63 61 6c 6c  elease().** call
1bab0 20 77 69 6c 6c 20 72 65 6c 65 61 73 65 20 74 68   will release th
1bac0 65 20 6d 75 74 65 78 2e 20 20 48 6f 77 65 76 65  e mutex.  Howeve
1bad0 72 2c 20 69 66 20 74 68 65 20 6c 6f 63 6b 20 73  r, if the lock s
1bae0 74 61 74 65 20 69 73 20 43 48 45 43 4b 50 4f 49  tate is CHECKPOI
1baf0 4e 54 2c 0a 2a 2a 20 74 68 65 20 6d 75 74 65 78  NT,.** the mutex
1bb00 20 69 73 20 6e 6f 74 20 61 63 71 75 69 72 65 64   is not acquired
1bb10 20 62 65 63 61 75 73 65 20 43 48 45 43 4b 50 4f   because CHECKPO
1bb20 49 4e 54 20 77 69 6c 6c 20 6e 65 76 65 72 20 72  INT will never r
1bb30 65 6d 61 70 20 74 68 65 0a 2a 2a 20 62 75 66 66  emap the.** buff
1bb40 65 72 2e 20 20 52 45 43 4f 56 45 52 20 6d 69 67  er.  RECOVER mig
1bb50 68 74 20 72 65 6d 61 70 2c 20 74 68 6f 75 67 68  ht remap, though
1bb60 2c 20 73 6f 20 43 48 45 43 4b 50 4f 49 4e 54 20  , so CHECKPOINT 
1bb70 77 69 6c 6c 20 61 63 71 75 69 72 65 0a 2a 2a 20  will acquire.** 
1bb80 74 68 65 20 6d 75 74 65 78 20 69 66 20 61 6e 64  the mutex if and
1bb90 20 77 68 65 6e 20 69 74 20 70 72 6f 6d 6f 74 65   when it promote
1bba0 73 20 74 6f 20 52 45 43 4f 56 45 52 2e 0a 2a 2a  s to RECOVER..**
1bbb0 0a 2a 2a 20 52 45 43 4f 56 45 52 20 6e 65 65 64  .** RECOVER need
1bbc0 73 20 74 6f 20 62 65 20 61 74 6f 6d 69 63 2e 20  s to be atomic. 
1bbd0 20 54 68 65 20 73 61 6d 65 20 6d 75 74 65 78 20   The same mutex 
1bbe0 74 68 61 74 20 70 72 65 76 65 6e 74 73 20 2a 70  that prevents *p
1bbf0 70 42 75 66 20 66 72 6f 6d 0a 2a 2a 20 62 65 69  pBuf from.** bei
1bc00 6e 67 20 72 65 6d 61 70 70 65 64 20 61 6c 73 6f  ng remapped also
1bc10 20 70 72 65 76 65 6e 74 73 20 6d 6f 72 65 20 74   prevents more t
1bc20 68 61 6e 20 6f 6e 65 20 74 68 72 65 61 64 20 66  han one thread f
1bc30 72 6f 6d 20 62 65 69 6e 67 20 69 6e 0a 2a 2a 20  rom being in.** 
1bc40 52 45 43 4f 56 45 52 20 61 74 20 61 20 74 69 6d  RECOVER at a tim
1bc50 65 2e 20 20 42 75 74 2c 20 52 45 43 4f 56 45 52  e.  But, RECOVER
1bc60 20 73 6f 6d 65 74 69 6d 65 73 20 77 61 6e 74 73   sometimes wants
1bc70 20 74 6f 20 72 65 6d 61 70 20 69 74 73 65 6c 66   to remap itself
1bc80 2e 0a 2a 2a 20 54 6f 20 70 72 65 76 65 6e 74 20  ..** To prevent 
1bc90 52 45 43 4f 56 45 52 20 66 72 6f 6d 20 6c 6f 73  RECOVER from los
1bca0 69 6e 67 20 69 74 73 20 6c 6f 63 6b 20 77 68 69  ing its lock whi
1bcb0 6c 65 20 72 65 6d 61 70 70 69 6e 67 2c 20 74 68  le remapping, th
1bcc0 65 0a 2a 2a 20 6d 75 74 65 78 20 69 73 20 6e 6f  e.** mutex is no
1bcd0 74 20 72 65 6c 65 61 73 65 64 20 62 79 20 75 6e  t released by un
1bce0 69 78 53 68 6d 52 65 6c 65 61 73 65 28 29 20 77  ixShmRelease() w
1bcf0 68 65 6e 20 69 6e 20 52 45 43 4f 56 45 52 2e 0a  hen in RECOVER..
1bd00 2a 2a 0a 2a 2a 20 2a 70 4e 65 77 4d 61 70 53 69  **.** *pNewMapSi
1bd10 7a 65 20 69 73 20 73 65 74 20 74 6f 20 74 68 65  ze is set to the
1bd20 20 73 69 7a 65 20 6f 66 20 74 68 65 20 6d 61 70   size of the map
1bd30 70 69 6e 67 2e 20 20 55 73 75 61 6c 6c 79 20 2a  ping.  Usually *
1bd40 70 4e 65 77 4d 61 70 53 69 7a 65 0a 2a 2a 20 77  pNewMapSize.** w
1bd50 69 6c 6c 20 62 65 20 72 65 71 4d 61 70 53 69 7a  ill be reqMapSiz
1bd60 65 20 6f 72 20 6c 61 72 67 65 72 2c 20 74 68 6f  e or larger, tho
1bd70 75 67 68 20 69 74 20 63 6f 75 6c 64 20 62 65 20  ugh it could be 
1bd80 73 6d 61 6c 6c 65 72 20 69 66 20 74 68 65 0a 2a  smaller if the.*
1bd90 2a 20 75 6e 64 65 72 6c 79 69 6e 67 20 73 68 61  * underlying sha
1bda0 72 65 64 20 6d 65 6d 6f 72 79 20 68 61 73 20 6e  red memory has n
1bdb0 65 76 65 72 20 62 65 65 6e 20 65 6e 6c 61 72 67  ever been enlarg
1bdc0 65 64 20 74 6f 20 72 65 71 4d 61 70 53 69 7a 65  ed to reqMapSize
1bdd0 20 62 79 74 65 73 0a 2a 2a 20 62 79 20 70 72 69   bytes.** by pri
1bde0 6f 72 20 63 61 6c 6c 73 20 74 6f 20 78 53 68 6d  or calls to xShm
1bdf0 53 69 7a 65 28 29 2e 0a 2a 2a 0a 2a 2a 20 2a 70  Size()..**.** *p
1be00 70 42 75 66 20 6d 69 67 68 74 20 62 65 20 4e 55  pBuf might be NU
1be10 4c 4c 20 61 6e 64 20 7a 65 72 6f 20 69 66 20 6e  LL and zero if n
1be20 6f 20 73 70 61 63 65 20 68 61 73 0a 2a 2a 20 79  o space has.** y
1be30 65 74 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65  et been allocate
1be40 64 20 74 6f 20 74 68 65 20 75 6e 64 65 72 6c 79  d to the underly
1be50 69 6e 67 20 73 74 6f 72 61 67 65 2e 0a 2a 2f 0a  ing storage..*/.
1be60 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 53  static int unixS
1be70 68 6d 47 65 74 28 0a 20 20 73 71 6c 69 74 65 33  hmGet(.  sqlite3
1be80 5f 66 69 6c 65 20 2a 66 64 2c 20 20 20 20 20 20  _file *fd,      
1be90 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 66 69    /* Database fi
1bea0 6c 65 20 68 6f 6c 64 69 6e 67 20 73 68 61 72 65  le holding share
1beb0 64 20 6d 65 6d 6f 72 79 20 2a 2f 0a 20 20 69 6e  d memory */.  in
1bec0 74 20 72 65 71 4d 61 70 53 69 7a 65 2c 20 20 20  t reqMapSize,   
1bed0 20 20 20 20 20 20 20 2f 2a 20 52 65 71 75 65 73         /* Reques
1bee0 74 65 64 20 73 69 7a 65 20 6f 66 20 6d 61 70 70  ted size of mapp
1bef0 69 6e 67 2e 20 2d 31 20 6d 65 61 6e 73 20 64 6f  ing. -1 means do
1bf00 6e 27 74 20 63 61 72 65 20 2a 2f 0a 20 20 69 6e  n't care */.  in
1bf10 74 20 2a 70 4e 65 77 4d 61 70 53 69 7a 65 2c 20  t *pNewMapSize, 
1bf20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20         /* Write 
1bf30 6e 65 77 20 73 69 7a 65 20 6f 66 20 6d 61 70 70  new size of mapp
1bf40 69 6e 67 20 68 65 72 65 20 2a 2f 0a 20 20 76 6f  ing here */.  vo
1bf50 69 64 20 76 6f 6c 61 74 69 6c 65 20 2a 2a 70 70  id volatile **pp
1bf60 42 75 66 20 20 20 20 2f 2a 20 57 72 69 74 65 20  Buf    /* Write 
1bf70 6d 61 70 70 69 6e 67 20 62 75 66 66 65 72 20 6f  mapping buffer o
1bf80 72 69 67 69 6e 20 68 65 72 65 20 2a 2f 0a 29 7b  rigin here */.){
1bf90 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 44 62  .  unixFile *pDb
1bfa0 46 64 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29  Fd = (unixFile*)
1bfb0 66 64 3b 0a 20 20 75 6e 69 78 53 68 6d 20 2a 70  fd;.  unixShm *p
1bfc0 20 3d 20 70 44 62 46 64 2d 3e 70 53 68 6d 3b 0a   = pDbFd->pShm;.
1bfd0 20 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20 2a 70    unixShmNode *p
1bfe0 53 68 6d 4e 6f 64 65 20 3d 20 70 2d 3e 70 53 68  ShmNode = p->pSh
1bff0 6d 4e 6f 64 65 3b 0a 20 20 69 6e 74 20 72 63 20  mNode;.  int rc 
1c000 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20  = SQLITE_OK;..  
1c010 61 73 73 65 72 74 28 20 70 53 68 6d 4e 6f 64 65  assert( pShmNode
1c020 3d 3d 70 44 62 46 64 2d 3e 70 49 6e 6f 64 65 2d  ==pDbFd->pInode-
1c030 3e 70 53 68 6d 4e 6f 64 65 20 29 3b 0a 20 20 61  >pShmNode );.  a
1c040 73 73 65 72 74 28 20 70 53 68 6d 4e 6f 64 65 2d  ssert( pShmNode-
1c050 3e 70 49 6e 6f 64 65 3d 3d 70 44 62 46 64 2d 3e  >pInode==pDbFd->
1c060 70 49 6e 6f 64 65 20 29 3b 0a 0a 20 20 69 66 28  pInode );..  if(
1c070 20 70 2d 3e 68 61 73 4d 75 74 65 78 42 75 66 3d   p->hasMutexBuf=
1c080 3d 30 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  =0 ){.    assert
1c090 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
1c0a0 6e 6f 74 68 65 6c 64 28 70 53 68 6d 4e 6f 64 65  notheld(pShmNode
1c0b0 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 20 20  ->mutex) );.    
1c0c0 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e  sqlite3_mutex_en
1c0d0 74 65 72 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75  ter(pShmNode->mu
1c0e0 74 65 78 42 75 66 29 3b 0a 20 20 20 20 70 2d 3e  texBuf);.    p->
1c0f0 68 61 73 4d 75 74 65 78 42 75 66 20 3d 20 31 3b  hasMutexBuf = 1;
1c100 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 6d  .  }.  sqlite3_m
1c110 75 74 65 78 5f 65 6e 74 65 72 28 70 53 68 6d 4e  utex_enter(pShmN
1c120 6f 64 65 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 69  ode->mutex);.  i
1c130 66 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 73 7a 4d  f( pShmNode->szM
1c140 61 70 3d 3d 30 20 7c 7c 20 72 65 71 4d 61 70 53  ap==0 || reqMapS
1c150 69 7a 65 3e 70 53 68 6d 4e 6f 64 65 2d 3e 73 7a  ize>pShmNode->sz
1c160 4d 61 70 20 29 7b 0a 20 20 20 20 69 6e 74 20 61  Map ){.    int a
1c170 63 74 75 61 6c 53 69 7a 65 3b 0a 20 20 20 20 69  ctualSize;.    i
1c180 66 28 20 75 6e 69 78 53 68 6d 53 69 7a 65 28 66  f( unixShmSize(f
1c190 64 2c 20 2d 31 2c 20 26 61 63 74 75 61 6c 53 69  d, -1, &actualSi
1c1a0 7a 65 29 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  ze)!=SQLITE_OK )
1c1b0 7b 0a 20 20 20 20 20 20 61 63 74 75 61 6c 53 69  {.      actualSi
1c1c0 7a 65 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20  ze = 0;.    }.  
1c1d0 20 20 72 65 71 4d 61 70 53 69 7a 65 20 3d 20 61    reqMapSize = a
1c1e0 63 74 75 61 6c 53 69 7a 65 3b 0a 20 20 20 20 69  ctualSize;.    i
1c1f0 66 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 70 4d 4d  f( pShmNode->pMM
1c200 61 70 42 75 66 20 7c 7c 20 72 65 71 4d 61 70 53  apBuf || reqMapS
1c210 69 7a 65 3c 3d 30 20 29 7b 0a 20 20 20 20 20 20  ize<=0 ){.      
1c220 6d 75 6e 6d 61 70 28 70 53 68 6d 4e 6f 64 65 2d  munmap(pShmNode-
1c230 3e 70 4d 4d 61 70 42 75 66 2c 20 70 53 68 6d 4e  >pMMapBuf, pShmN
1c240 6f 64 65 2d 3e 73 7a 4d 61 70 29 3b 0a 20 20 20  ode->szMap);.   
1c250 20 7d 0a 20 20 20 20 69 66 28 20 72 65 71 4d 61   }.    if( reqMa
1c260 70 53 69 7a 65 3e 30 20 29 7b 0a 20 20 20 20 20  pSize>0 ){.     
1c270 20 70 53 68 6d 4e 6f 64 65 2d 3e 70 4d 4d 61 70   pShmNode->pMMap
1c280 42 75 66 20 3d 20 6d 6d 61 70 28 30 2c 20 72 65  Buf = mmap(0, re
1c290 71 4d 61 70 53 69 7a 65 2c 20 50 52 4f 54 5f 52  qMapSize, PROT_R
1c2a0 45 41 44 7c 50 52 4f 54 5f 57 52 49 54 45 2c 20  EAD|PROT_WRITE, 
1c2b0 4d 41 50 5f 53 48 41 52 45 44 2c 0a 20 20 20 20  MAP_SHARED,.    
1c2c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c2d0 20 20 20 20 20 20 20 20 20 70 53 68 6d 4e 6f 64           pShmNod
1c2e0 65 2d 3e 68 2c 20 30 29 3b 0a 20 20 20 20 20 20  e->h, 0);.      
1c2f0 70 53 68 6d 4e 6f 64 65 2d 3e 73 7a 4d 61 70 20  pShmNode->szMap 
1c300 3d 20 70 53 68 6d 4e 6f 64 65 2d 3e 70 4d 4d 61  = pShmNode->pMMa
1c310 70 42 75 66 20 3f 20 72 65 71 4d 61 70 53 69 7a  pBuf ? reqMapSiz
1c320 65 20 3a 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65  e : 0;.    }else
1c330 7b 0a 20 20 20 20 20 20 70 53 68 6d 4e 6f 64 65  {.      pShmNode
1c340 2d 3e 70 4d 4d 61 70 42 75 66 20 3d 20 30 3b 0a  ->pMMapBuf = 0;.
1c350 20 20 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e        pShmNode->
1c360 73 7a 4d 61 70 20 3d 20 30 3b 0a 20 20 20 20 7d  szMap = 0;.    }
1c370 0a 20 20 7d 0a 20 20 2a 70 4e 65 77 4d 61 70 53  .  }.  *pNewMapS
1c380 69 7a 65 20 3d 20 70 53 68 6d 4e 6f 64 65 2d 3e  ize = pShmNode->
1c390 73 7a 4d 61 70 3b 0a 20 20 2a 70 70 42 75 66 20  szMap;.  *ppBuf 
1c3a0 3d 20 70 53 68 6d 4e 6f 64 65 2d 3e 70 4d 4d 61  = pShmNode->pMMa
1c3b0 70 42 75 66 3b 0a 20 20 73 71 6c 69 74 65 33 5f  pBuf;.  sqlite3_
1c3c0 6d 75 74 65 78 5f 6c 65 61 76 65 28 70 53 68 6d  mutex_leave(pShm
1c3d0 4e 6f 64 65 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  Node->mutex);.  
1c3e0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
1c3f0 0a 2a 2a 20 52 65 6c 65 61 73 65 20 74 68 65 20  .** Release the 
1c400 6c 6f 63 6b 20 68 65 6c 64 20 6f 6e 20 74 68 65  lock held on the
1c410 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 73   shared memory s
1c420 65 67 6d 65 6e 74 20 74 6f 20 74 68 61 74 20 6f  egment to that o
1c430 74 68 65 72 0a 2a 2a 20 74 68 72 65 61 64 73 20  ther.** threads 
1c440 61 72 65 20 66 72 65 65 20 74 6f 20 72 65 73 69  are free to resi
1c450 7a 65 20 69 74 20 69 66 20 6e 65 63 65 73 73 61  ze it if necessa
1c460 72 79 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ry..**.** If the
1c470 20 6c 6f 63 6b 20 69 73 20 6e 6f 74 20 63 75 72   lock is not cur
1c480 72 65 6e 74 6c 79 20 68 65 6c 64 2c 20 74 68 69  rently held, thi
1c490 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 68  s routine is a h
1c4a0 61 72 6d 6c 65 73 73 20 6e 6f 2d 6f 70 2e 0a 2a  armless no-op..*
1c4b0 2a 0a 2a 2a 20 49 66 20 74 68 65 20 73 68 61 72  *.** If the shar
1c4c0 65 64 2d 6d 65 6d 6f 72 79 20 6f 62 6a 65 63 74  ed-memory object
1c4d0 20 69 73 20 69 6e 20 6c 6f 63 6b 20 73 74 61 74   is in lock stat
1c4e0 65 20 52 45 43 4f 56 45 52 2c 20 74 68 65 6e 20  e RECOVER, then 
1c4f0 77 65 20 64 6f 20 6e 6f 74 0a 2a 2a 20 72 65 61  we do not.** rea
1c500 6c 6c 79 20 77 61 6e 74 20 74 6f 20 72 65 6c 65  lly want to rele
1c510 61 73 65 20 74 68 65 20 6c 6f 63 6b 2c 20 73 6f  ase the lock, so
1c520 20 69 6e 20 74 68 61 74 20 63 61 73 65 20 74 6f   in that case to
1c530 6f 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a  o, this routine.
1c540 2a 2a 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a  ** is a no-op..*
1c550 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69  /.static int uni
1c560 78 53 68 6d 52 65 6c 65 61 73 65 28 73 71 6c 69  xShmRelease(sqli
1c570 74 65 33 5f 66 69 6c 65 20 2a 66 64 29 7b 0a 20  te3_file *fd){. 
1c580 20 75 6e 69 78 46 69 6c 65 20 2a 70 44 62 46 64   unixFile *pDbFd
1c590 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 66 64   = (unixFile*)fd
1c5a0 3b 0a 20 20 75 6e 69 78 53 68 6d 20 2a 70 20 3d  ;.  unixShm *p =
1c5b0 20 70 44 62 46 64 2d 3e 70 53 68 6d 3b 0a 0a 20   pDbFd->pShm;.. 
1c5c0 20 69 66 28 20 70 2d 3e 68 61 73 4d 75 74 65 78   if( p->hasMutex
1c5d0 42 75 66 20 29 7b 0a 20 20 20 20 61 73 73 65 72  Buf ){.    asser
1c5e0 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
1c5f0 5f 6e 6f 74 68 65 6c 64 28 70 2d 3e 70 53 68 6d  _notheld(p->pShm
1c600 4e 6f 64 65 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  Node->mutex) );.
1c610 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65      sqlite3_mute
1c620 78 5f 6c 65 61 76 65 28 70 2d 3e 70 53 68 6d 4e  x_leave(p->pShmN
1c630 6f 64 65 2d 3e 6d 75 74 65 78 42 75 66 29 3b 0a  ode->mutexBuf);.
1c640 20 20 20 20 70 2d 3e 68 61 73 4d 75 74 65 78 42      p->hasMutexB
1c650 75 66 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65  uf = 0;.  }.  re
1c660 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
1c670 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65  }.../*.** Change
1c680 20 74 68 65 20 6c 6f 63 6b 20 73 74 61 74 65 20   the lock state 
1c690 66 6f 72 20 61 20 73 68 61 72 65 64 2d 6d 65 6d  for a shared-mem
1c6a0 6f 72 79 20 73 65 67 6d 65 6e 74 2e 0a 2a 2a 0a  ory segment..**.
1c6b0 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 74 68 65  ** Note that the
1c6c0 20 72 65 6c 61 74 69 6f 6e 73 68 69 70 20 62 65   relationship be
1c6d0 74 77 65 65 6e 20 53 48 41 52 45 64 20 61 6e 64  tween SHAREd and
1c6e0 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 73   EXCLUSIVE locks
1c6f0 20 69 73 20 61 20 6c 69 74 74 6c 65 0a 2a 2a 20   is a little.** 
1c700 64 69 66 66 65 72 65 6e 74 20 68 65 72 65 20 74  different here t
1c710 68 61 6e 20 69 6e 20 70 6f 73 69 78 2e 20 20 49  han in posix.  I
1c720 6e 20 78 53 68 6d 4c 6f 63 6b 28 29 2c 20 6f 6e  n xShmLock(), on
1c730 65 20 63 61 6e 20 67 6f 20 66 72 6f 6d 20 75 6e  e can go from un
1c740 6c 6f 63 6b 65 64 0a 2a 2a 20 74 6f 20 73 68 61  locked.** to sha
1c750 72 65 64 20 61 6e 64 20 62 61 63 6b 20 6f 72 20  red and back or 
1c760 66 72 6f 6d 20 75 6e 6c 6f 63 6b 65 64 20 74 6f  from unlocked to
1c770 20 65 78 63 6c 75 73 69 76 65 20 61 6e 64 20 62   exclusive and b
1c780 61 63 6b 2e 20 20 42 75 74 20 6f 6e 65 20 6d 61  ack.  But one ma
1c790 79 0a 2a 2a 20 6e 6f 74 20 67 6f 20 66 72 6f 6d  y.** not go from
1c7a0 20 73 68 61 72 65 64 20 74 6f 20 65 78 63 6c 75   shared to exclu
1c7b0 73 69 76 65 20 6f 72 20 66 72 6f 6d 20 65 78 63  sive or from exc
1c7c0 6c 75 73 69 76 65 20 74 6f 20 73 68 61 72 65 64  lusive to shared
1c7d0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1c7e0 75 6e 69 78 53 68 6d 4c 6f 63 6b 28 0a 20 20 73  unixShmLock(.  s
1c7f0 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66 64 2c  qlite3_file *fd,
1c800 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74            /* Dat
1c810 61 62 61 73 65 20 66 69 6c 65 20 68 6f 6c 64 69  abase file holdi
1c820 6e 67 20 74 68 65 20 73 68 61 72 65 64 20 6d 65  ng the shared me
1c830 6d 6f 72 79 20 2a 2f 0a 20 20 69 6e 74 20 6f 66  mory */.  int of
1c840 73 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  st,             
1c850 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 6c 6f       /* First lo
1c860 63 6b 20 74 6f 20 61 63 71 75 69 72 65 20 6f 72  ck to acquire or
1c870 20 72 65 6c 65 61 73 65 20 2a 2f 0a 20 20 69 6e   release */.  in
1c880 74 20 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20  t n,            
1c890 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
1c8a0 65 72 20 6f 66 20 6c 6f 63 6b 73 20 74 6f 20 61  er of locks to a
1c8b0 63 71 75 69 72 65 20 6f 72 20 72 65 6c 65 61 73  cquire or releas
1c8c0 65 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73  e */.  int flags
1c8d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c8e0 20 20 2f 2a 20 57 68 61 74 20 74 6f 20 64 6f 20    /* What to do 
1c8f0 77 69 74 68 20 74 68 65 20 6c 6f 63 6b 20 2a 2f  with the lock */
1c900 0a 29 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a  .){.  unixFile *
1c910 70 44 62 46 64 20 3d 20 28 75 6e 69 78 46 69 6c  pDbFd = (unixFil
1c920 65 2a 29 66 64 3b 20 20 20 20 20 20 2f 2a 20 43  e*)fd;      /* C
1c930 6f 6e 6e 65 63 74 69 6f 6e 20 68 6f 6c 64 69 6e  onnection holdin
1c940 67 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20  g shared memory 
1c950 2a 2f 0a 20 20 75 6e 69 78 53 68 6d 20 2a 70 20  */.  unixShm *p 
1c960 3d 20 70 44 62 46 64 2d 3e 70 53 68 6d 3b 20 20  = pDbFd->pShm;  
1c970 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
1c980 65 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20  e shared memory 
1c990 62 65 69 6e 67 20 6c 6f 63 6b 65 64 20 2a 2f 0a  being locked */.
1c9a0 20 20 75 6e 69 78 53 68 6d 20 2a 70 58 3b 20 20    unixShm *pX;  
1c9b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c9c0 20 20 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 6c          /* For l
1c9d0 6f 6f 70 69 6e 67 20 6f 76 65 72 20 61 6c 6c 20  ooping over all 
1c9e0 73 69 62 6c 69 6e 67 73 20 2a 2f 0a 20 20 75 6e  siblings */.  un
1c9f0 69 78 53 68 6d 4e 6f 64 65 20 2a 70 53 68 6d 4e  ixShmNode *pShmN
1ca00 6f 64 65 20 3d 20 70 2d 3e 70 53 68 6d 4e 6f 64  ode = p->pShmNod
1ca10 65 3b 20 20 2f 2a 20 54 68 65 20 75 6e 64 65 72  e;  /* The under
1ca20 6c 79 69 6e 67 20 66 69 6c 65 20 69 4e 6f 64 65  lying file iNode
1ca30 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53   */.  int rc = S
1ca40 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20  QLITE_OK;       
1ca50 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
1ca60 65 73 75 6c 74 20 63 6f 64 65 20 2a 2f 0a 20 20  esult code */.  
1ca70 75 31 36 20 6d 61 73 6b 3b 20 20 20 20 20 20 20  u16 mask;       
1ca80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ca90 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66        /* Mask of
1caa0 20 6c 6f 63 6b 73 20 74 6f 20 74 61 6b 65 20 6f   locks to take o
1cab0 72 20 72 65 6c 65 61 73 65 20 2a 2f 0a 0a 20 20  r release */..  
1cac0 61 73 73 65 72 74 28 20 70 53 68 6d 4e 6f 64 65  assert( pShmNode
1cad0 3d 3d 70 44 62 46 64 2d 3e 70 49 6e 6f 64 65 2d  ==pDbFd->pInode-
1cae0 3e 70 53 68 6d 4e 6f 64 65 20 29 3b 0a 20 20 61  >pShmNode );.  a
1caf0 73 73 65 72 74 28 20 70 53 68 6d 4e 6f 64 65 2d  ssert( pShmNode-
1cb00 3e 70 49 6e 6f 64 65 3d 3d 70 44 62 46 64 2d 3e  >pInode==pDbFd->
1cb10 70 49 6e 6f 64 65 20 29 3b 0a 20 20 61 73 73 65  pInode );.  asse
1cb20 72 74 28 20 6f 66 73 74 3e 3d 30 20 26 26 20 6f  rt( ofst>=0 && o
1cb30 66 73 74 2b 6e 3c 3d 53 51 4c 49 54 45 5f 53 48  fst+n<=SQLITE_SH
1cb40 4d 5f 4e 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73  M_NLOCK );.  ass
1cb50 65 72 74 28 20 6e 3e 3d 31 20 29 3b 0a 20 20 61  ert( n>=1 );.  a
1cb60 73 73 65 72 74 28 20 66 6c 61 67 73 3d 3d 28 53  ssert( flags==(S
1cb70 51 4c 49 54 45 5f 53 48 4d 5f 4c 4f 43 4b 20 7c  QLITE_SHM_LOCK |
1cb80 20 53 51 4c 49 54 45 5f 53 48 4d 5f 53 48 41 52   SQLITE_SHM_SHAR
1cb90 45 44 29 0a 20 20 20 20 20 20 20 7c 7c 20 66 6c  ED).       || fl
1cba0 61 67 73 3d 3d 28 53 51 4c 49 54 45 5f 53 48 4d  ags==(SQLITE_SHM
1cbb0 5f 4c 4f 43 4b 20 7c 20 53 51 4c 49 54 45 5f 53  _LOCK | SQLITE_S
1cbc0 48 4d 5f 45 58 43 4c 55 53 49 56 45 29 0a 20 20  HM_EXCLUSIVE).  
1cbd0 20 20 20 20 20 7c 7c 20 66 6c 61 67 73 3d 3d 28       || flags==(
1cbe0 53 51 4c 49 54 45 5f 53 48 4d 5f 55 4e 4c 4f 43  SQLITE_SHM_UNLOC
1cbf0 4b 20 7c 20 53 51 4c 49 54 45 5f 53 48 4d 5f 53  K | SQLITE_SHM_S
1cc00 48 41 52 45 44 29 0a 20 20 20 20 20 20 20 7c 7c  HARED).       ||
1cc10 20 66 6c 61 67 73 3d 3d 28 53 51 4c 49 54 45 5f   flags==(SQLITE_
1cc20 53 48 4d 5f 55 4e 4c 4f 43 4b 20 7c 20 53 51 4c  SHM_UNLOCK | SQL
1cc30 49 54 45 5f 53 48 4d 5f 45 58 43 4c 55 53 49 56  ITE_SHM_EXCLUSIV
1cc40 45 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  E) );.  assert( 
1cc50 6e 3d 3d 31 20 7c 7c 20 28 66 6c 61 67 73 20 26  n==1 || (flags &
1cc60 20 53 51 4c 49 54 45 5f 53 48 4d 5f 45 58 43 4c   SQLITE_SHM_EXCL
1cc70 55 53 49 56 45 29 21 3d 30 20 29 3b 0a 0a 20 20  USIVE)!=0 );..  
1cc80 6d 61 73 6b 20 3d 20 28 31 3c 3c 28 6f 66 73 74  mask = (1<<(ofst
1cc90 2b 6e 29 29 20 2d 20 28 31 3c 3c 6f 66 73 74 29  +n)) - (1<<ofst)
1cca0 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 3e 31 20  ;.  assert( n>1 
1ccb0 7c 7c 20 6d 61 73 6b 3d 3d 28 31 3c 3c 6f 66 73  || mask==(1<<ofs
1ccc0 74 29 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f  t) );.  sqlite3_
1ccd0 6d 75 74 65 78 5f 65 6e 74 65 72 28 70 53 68 6d  mutex_enter(pShm
1cce0 4e 6f 64 65 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  Node->mutex);.  
1ccf0 69 66 28 20 66 6c 61 67 73 20 26 20 53 51 4c 49  if( flags & SQLI
1cd00 54 45 5f 53 48 4d 5f 55 4e 4c 4f 43 4b 20 29 7b  TE_SHM_UNLOCK ){
1cd10 0a 20 20 20 20 75 31 36 20 61 6c 6c 4d 61 73 6b  .    u16 allMask
1cd20 20 3d 20 30 3b 20 2f 2a 20 4d 61 73 6b 20 6f 66   = 0; /* Mask of
1cd30 20 6c 6f 63 6b 73 20 68 65 6c 64 20 62 79 20 73   locks held by s
1cd40 69 62 6c 69 6e 67 73 20 2a 2f 0a 0a 20 20 20 20  iblings */..    
1cd50 2f 2a 20 53 65 65 20 69 66 20 61 6e 79 20 73 69  /* See if any si
1cd60 62 6c 69 6e 67 73 20 68 6f 6c 64 20 74 68 69 73  blings hold this
1cd70 20 73 61 6d 65 20 6c 6f 63 6b 20 2a 2f 0a 20 20   same lock */.  
1cd80 20 20 66 6f 72 28 70 58 3d 70 53 68 6d 4e 6f 64    for(pX=pShmNod
1cd90 65 2d 3e 70 46 69 72 73 74 3b 20 70 58 3b 20 70  e->pFirst; pX; p
1cda0 58 3d 70 58 2d 3e 70 4e 65 78 74 29 7b 0a 20 20  X=pX->pNext){.  
1cdb0 20 20 20 20 69 66 28 20 70 58 3d 3d 70 20 29 20      if( pX==p ) 
1cdc0 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
1cdd0 61 73 73 65 72 74 28 20 28 70 58 2d 3e 65 78 63  assert( (pX->exc
1cde0 6c 4d 61 73 6b 20 26 20 28 70 2d 3e 65 78 63 6c  lMask & (p->excl
1cdf0 4d 61 73 6b 7c 70 2d 3e 73 68 61 72 65 64 4d 61  Mask|p->sharedMa
1ce00 73 6b 29 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20  sk))==0 );.     
1ce10 20 61 6c 6c 4d 61 73 6b 20 7c 3d 20 70 58 2d 3e   allMask |= pX->
1ce20 73 68 61 72 65 64 4d 61 73 6b 3b 0a 20 20 20 20  sharedMask;.    
1ce30 7d 0a 0a 20 20 20 20 2f 2a 20 55 6e 6c 6f 63 6b  }..    /* Unlock
1ce40 20 74 68 65 20 73 79 73 74 65 6d 2d 6c 65 76 65   the system-leve
1ce50 6c 20 6c 6f 63 6b 73 20 2a 2f 0a 20 20 20 20 69  l locks */.    i
1ce60 66 28 20 28 6d 61 73 6b 20 26 20 61 6c 6c 4d 61  f( (mask & allMa
1ce70 73 6b 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  sk)==0 ){.      
1ce80 72 63 20 3d 20 75 6e 69 78 53 68 6d 53 79 73 74  rc = unixShmSyst
1ce90 65 6d 4c 6f 63 6b 28 70 53 68 6d 4e 6f 64 65 2c  emLock(pShmNode,
1cea0 20 46 5f 55 4e 4c 43 4b 2c 20 6f 66 73 74 2b 55   F_UNLCK, ofst+U
1ceb0 4e 49 58 5f 53 48 4d 5f 42 41 53 45 2c 20 6e 29  NIX_SHM_BASE, n)
1cec0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
1ced0 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f     rc = SQLITE_O
1cee0 4b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  K;.    }..    /*
1cef0 20 55 6e 64 6f 20 74 68 65 20 6c 6f 63 61 6c 20   Undo the local 
1cf00 6c 6f 63 6b 73 20 2a 2f 0a 20 20 20 20 69 66 28  locks */.    if(
1cf10 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
1cf20 7b 0a 20 20 20 20 20 20 70 2d 3e 65 78 63 6c 4d  {.      p->exclM
1cf30 61 73 6b 20 26 3d 20 7e 6d 61 73 6b 3b 0a 20 20  ask &= ~mask;.  
1cf40 20 20 20 20 70 2d 3e 73 68 61 72 65 64 4d 61 73      p->sharedMas
1cf50 6b 20 26 3d 20 7e 6d 61 73 6b 3b 0a 20 20 20 20  k &= ~mask;.    
1cf60 7d 20 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 66  } .  }else if( f
1cf70 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 53 48  lags & SQLITE_SH
1cf80 4d 5f 53 48 41 52 45 44 20 29 7b 0a 20 20 20 20  M_SHARED ){.    
1cf90 75 31 36 20 61 6c 6c 53 68 61 72 65 64 20 3d 20  u16 allShared = 
1cfa0 30 3b 20 20 2f 2a 20 55 6e 69 6f 6e 20 6f 66 20  0;  /* Union of 
1cfb0 6c 6f 63 6b 73 20 68 65 6c 64 20 62 79 20 63 6f  locks held by co
1cfc0 6e 6e 65 63 74 69 6f 6e 73 20 6f 74 68 65 72 20  nnections other 
1cfd0 74 68 61 6e 20 22 70 22 20 2a 2f 0a 0a 20 20 20  than "p" */..   
1cfe0 20 2f 2a 20 46 69 6e 64 20 6f 75 74 20 77 68 69   /* Find out whi
1cff0 63 68 20 73 68 61 72 65 64 20 6c 6f 63 6b 73 20  ch shared locks 
1d000 61 72 65 20 61 6c 72 65 61 64 79 20 68 65 6c 64  are already held
1d010 20 62 79 20 73 69 62 6c 69 6e 67 20 63 6f 6e 6e   by sibling conn
1d020 65 63 74 69 6f 6e 73 2e 0a 20 20 20 20 2a 2a 20  ections..    ** 
1d030 49 66 20 61 6e 79 20 73 69 62 6c 69 6e 67 20 61  If any sibling a
1d040 6c 72 65 61 64 79 20 68 6f 6c 64 73 20 61 6e 20  lready holds an 
1d050 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 2c 20  exclusive lock, 
1d060 67 6f 20 61 68 65 61 64 20 61 6e 64 20 72 65 74  go ahead and ret
1d070 75 72 6e 0a 20 20 20 20 2a 2a 20 53 51 4c 49 54  urn.    ** SQLIT
1d080 45 5f 42 55 53 59 2e 0a 20 20 20 20 2a 2f 0a 20  E_BUSY..    */. 
1d090 20 20 20 66 6f 72 28 70 58 3d 70 53 68 6d 4e 6f     for(pX=pShmNo
1d0a0 64 65 2d 3e 70 46 69 72 73 74 3b 20 70 58 3b 20  de->pFirst; pX; 
1d0b0 70 58 3d 70 58 2d 3e 70 4e 65 78 74 29 7b 0a 20  pX=pX->pNext){. 
1d0c0 20 20 20 20 20 69 66 28 20 28 70 58 2d 3e 65 78       if( (pX->ex
1d0d0 63 6c 4d 61 73 6b 20 26 20 6d 61 73 6b 29 21 3d  clMask & mask)!=
1d0e0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  0 ){.        rc 
1d0f0 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20  = SQLITE_BUSY;. 
1d100 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
1d110 20 20 20 20 7d 0a 20 20 20 20 20 20 61 6c 6c 53      }.      allS
1d120 68 61 72 65 64 20 7c 3d 20 70 58 2d 3e 73 68 61  hared |= pX->sha
1d130 72 65 64 4d 61 73 6b 3b 0a 20 20 20 20 7d 0a 0a  redMask;.    }..
1d140 20 20 20 20 2f 2a 20 47 65 74 20 73 68 61 72 65      /* Get share
1d150 64 20 6c 6f 63 6b 73 20 61 74 20 74 68 65 20 73  d locks at the s
1d160 79 73 74 65 6d 20 6c 65 76 65 6c 2c 20 69 66 20  ystem level, if 
1d170 6e 65 63 65 73 73 61 72 79 20 2a 2f 0a 20 20 20  necessary */.   
1d180 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
1d190 4f 4b 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  OK ){.      if( 
1d1a0 28 61 6c 6c 53 68 61 72 65 64 20 26 20 6d 61 73  (allShared & mas
1d1b0 6b 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  k)==0 ){.       
1d1c0 20 72 63 20 3d 20 75 6e 69 78 53 68 6d 53 79 73   rc = unixShmSys
1d1d0 74 65 6d 4c 6f 63 6b 28 70 53 68 6d 4e 6f 64 65  temLock(pShmNode
1d1e0 2c 20 46 5f 52 44 4c 43 4b 2c 20 6f 66 73 74 2b  , F_RDLCK, ofst+
1d1f0 55 4e 49 58 5f 53 48 4d 5f 42 41 53 45 2c 20 6e  UNIX_SHM_BASE, n
1d200 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
1d210 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
1d220 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a  ITE_OK;.      }.
1d230 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 47 65      }..    /* Ge
1d240 74 20 74 68 65 20 6c 6f 63 61 6c 20 73 68 61 72  t the local shar
1d250 65 64 20 6c 6f 63 6b 73 20 2a 2f 0a 20 20 20 20  ed locks */.    
1d260 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
1d270 4b 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 73 68  K ){.      p->sh
1d280 61 72 65 64 4d 61 73 6b 20 7c 3d 20 6d 61 73 6b  aredMask |= mask
1d290 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b  ;.    }.  }else{
1d2a0 0a 20 20 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72  .    /* Make sur
1d2b0 65 20 6e 6f 20 73 69 62 6c 69 6e 67 20 63 6f 6e  e no sibling con
1d2c0 6e 65 63 74 69 6f 6e 73 20 68 6f 6c 64 20 6c 6f  nections hold lo
1d2d0 63 6b 73 20 74 68 61 74 20 77 69 6c 6c 20 62 6c  cks that will bl
1d2e0 6f 63 6b 20 74 68 69 73 0a 20 20 20 20 2a 2a 20  ock this.    ** 
1d2f0 6c 6f 63 6b 2e 20 20 49 66 20 61 6e 79 20 64 6f  lock.  If any do
1d300 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  , return SQLITE_
1d310 42 55 53 59 20 72 69 67 68 74 20 61 77 61 79 2e  BUSY right away.
1d320 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28  .    */.    for(
1d330 70 58 3d 70 53 68 6d 4e 6f 64 65 2d 3e 70 46 69  pX=pShmNode->pFi
1d340 72 73 74 3b 20 70 58 3b 20 70 58 3d 70 58 2d 3e  rst; pX; pX=pX->
1d350 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 69 66  pNext){.      if
1d360 28 20 28 70 58 2d 3e 65 78 63 6c 4d 61 73 6b 20  ( (pX->exclMask 
1d370 26 20 6d 61 73 6b 29 21 3d 30 20 7c 7c 20 28 70  & mask)!=0 || (p
1d380 58 2d 3e 73 68 61 72 65 64 4d 61 73 6b 20 26 20  X->sharedMask & 
1d390 6d 61 73 6b 29 21 3d 30 20 29 7b 0a 20 20 20 20  mask)!=0 ){.    
1d3a0 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
1d3b0 42 55 53 59 3b 0a 20 20 20 20 20 20 20 20 62 72  BUSY;.        br
1d3c0 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
1d3d0 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 47 65 74   }.  .    /* Get
1d3e0 20 74 68 65 20 65 78 63 6c 75 73 69 76 65 20 6c   the exclusive l
1d3f0 6f 63 6b 73 20 61 74 20 74 68 65 20 73 79 73 74  ocks at the syst
1d400 65 6d 20 6c 65 76 65 6c 2e 20 20 54 68 65 6e 20  em level.  Then 
1d410 69 66 20 73 75 63 63 65 73 73 66 75 6c 0a 20 20  if successful.  
1d420 20 20 2a 2a 20 61 6c 73 6f 20 6d 61 72 6b 20 74    ** also mark t
1d430 68 65 20 6c 6f 63 61 6c 20 63 6f 6e 6e 65 63 74  he local connect
1d440 69 6f 6e 20 61 73 20 62 65 69 6e 67 20 6c 6f 63  ion as being loc
1d450 6b 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ked..    */.    
1d460 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
1d470 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  K ){.      rc = 
1d480 75 6e 69 78 53 68 6d 53 79 73 74 65 6d 4c 6f 63  unixShmSystemLoc
1d490 6b 28 70 53 68 6d 4e 6f 64 65 2c 20 46 5f 57 52  k(pShmNode, F_WR
1d4a0 4c 43 4b 2c 20 6f 66 73 74 2b 55 4e 49 58 5f 53  LCK, ofst+UNIX_S
1d4b0 48 4d 5f 42 41 53 45 2c 20 6e 29 3b 0a 20 20 20  HM_BASE, n);.   
1d4c0 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
1d4d0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
1d4e0 61 73 73 65 72 74 28 20 28 70 2d 3e 73 68 61 72  assert( (p->shar
1d4f0 65 64 4d 61 73 6b 20 26 20 6d 61 73 6b 29 3d 3d  edMask & mask)==
1d500 30 20 29 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e  0 );.        p->
1d510 65 78 63 6c 4d 61 73 6b 20 7c 3d 20 6d 61 73 6b  exclMask |= mask
1d520 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
1d530 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75    }.  sqlite3_mu
1d540 74 65 78 5f 6c 65 61 76 65 28 70 53 68 6d 4e 6f  tex_leave(pShmNo
1d550 64 65 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 4f 53  de->mutex);.  OS
1d560 54 52 41 43 45 28 28 22 53 48 4d 2d 4c 4f 43 4b  TRACE(("SHM-LOCK
1d570 20 73 68 6d 69 64 2d 25 64 2c 20 70 69 64 2d 25   shmid-%d, pid-%
1d580 64 20 67 6f 74 20 25 30 33 78 2c 25 30 33 78 5c  d got %03x,%03x\
1d590 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70  n",.           p
1d5a0 2d 3e 69 64 2c 20 67 65 74 70 69 64 28 29 2c 20  ->id, getpid(), 
1d5b0 70 2d 3e 73 68 61 72 65 64 4d 61 73 6b 2c 20 70  p->sharedMask, p
1d5c0 2d 3e 65 78 63 6c 4d 61 73 6b 29 29 3b 0a 20 20  ->exclMask));.  
1d5d0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
1d5e0 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 20 61 20  .** Implement a 
1d5f0 6d 65 6d 6f 72 79 20 62 61 72 72 69 65 72 20 6f  memory barrier o
1d600 72 20 6d 65 6d 6f 72 79 20 66 65 6e 63 65 20 6f  r memory fence o
1d610 6e 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 2e  n shared memory.
1d620 20 20 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 6c 6f 61    .**.** All loa
1d630 64 73 20 61 6e 64 20 73 74 6f 72 65 73 20 62 65  ds and stores be
1d640 67 75 6e 20 62 65 66 6f 72 65 20 74 68 65 20 62  gun before the b
1d650 61 72 72 69 65 72 20 6d 75 73 74 20 63 6f 6d 70  arrier must comp
1d660 6c 65 74 65 20 62 65 66 6f 72 65 0a 2a 2a 20 61  lete before.** a
1d670 6e 79 20 6c 6f 61 64 20 6f 72 20 73 74 6f 72 65  ny load or store
1d680 20 62 65 67 75 6e 20 61 66 74 65 72 20 74 68 65   begun after the
1d690 20 62 61 72 72 69 65 72 2e 0a 2a 2f 0a 73 74 61   barrier..*/.sta
1d6a0 74 69 63 20 76 6f 69 64 20 75 6e 69 78 53 68 6d  tic void unixShm
1d6b0 42 61 72 72 69 65 72 28 0a 20 20 73 71 6c 69 74  Barrier(.  sqlit
1d6c0 65 33 5f 66 69 6c 65 20 2a 66 64 20 20 20 20 20  e3_file *fd     
1d6d0 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73        /* Databas
1d6e0 65 20 66 69 6c 65 20 68 6f 6c 64 69 6e 67 20 74  e file holding t
1d6f0 68 65 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79  he shared memory
1d700 20 2a 2f 0a 29 7b 0a 23 69 66 64 65 66 20 5f 5f   */.){.#ifdef __
1d710 47 4e 55 43 5f 5f 0a 20 20 5f 5f 73 79 6e 63 5f  GNUC__.  __sync_
1d720 73 79 6e 63 68 72 6f 6e 69 7a 65 28 29 3b 0a 23  synchronize();.#
1d730 65 6c 73 65 0a 20 20 75 6e 69 78 4d 75 74 65 78  else.  unixMutex
1d740 45 6e 74 65 72 28 29 3b 0a 20 20 75 6e 69 78 4d  Enter();.  unixM
1d750 75 74 65 78 4c 65 61 76 65 28 29 3b 0a 23 65 6e  utexLeave();.#en
1d760 64 69 66 0a 7d 0a 0a 0a 23 65 6c 73 65 0a 23 20  dif.}...#else.# 
1d770 64 65 66 69 6e 65 20 75 6e 69 78 53 68 6d 4f 70  define unixShmOp
1d780 65 6e 20 20 20 20 30 0a 23 20 64 65 66 69 6e 65  en    0.# define
1d790 20 75 6e 69 78 53 68 6d 53 69 7a 65 20 20 20 20   unixShmSize    
1d7a0 30 0a 23 20 64 65 66 69 6e 65 20 75 6e 69 78 53  0.# define unixS
1d7b0 68 6d 47 65 74 20 20 20 20 20 30 0a 23 20 64 65  hmGet     0.# de
1d7c0 66 69 6e 65 20 75 6e 69 78 53 68 6d 52 65 6c 65  fine unixShmRele
1d7d0 61 73 65 20 30 0a 23 20 64 65 66 69 6e 65 20 75  ase 0.# define u
1d7e0 6e 69 78 53 68 6d 4c 6f 63 6b 20 20 20 20 30 0a  nixShmLock    0.
1d7f0 23 20 64 65 66 69 6e 65 20 75 6e 69 78 53 68 6d  # define unixShm
1d800 42 61 72 72 69 65 72 20 30 0a 23 20 64 65 66 69  Barrier 0.# defi
1d810 6e 65 20 75 6e 69 78 53 68 6d 43 6c 6f 73 65 20  ne unixShmClose 
1d820 20 20 30 0a 23 65 6e 64 69 66 20 2f 2a 20 23 69    0.#endif /* #i
1d830 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
1d840 54 5f 57 41 4c 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  T_WAL */../*.** 
1d850 48 65 72 65 20 65 6e 64 73 20 74 68 65 20 69 6d  Here ends the im
1d860 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20  plementation of 
1d870 61 6c 6c 20 73 71 6c 69 74 65 33 5f 66 69 6c 65  all sqlite3_file
1d880 20 6d 65 74 68 6f 64 73 2e 0a 2a 2a 0a 2a 2a 2a   methods..**.***
1d890 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1d8a0 2a 2a 2a 20 45 6e 64 20 73 71 6c 69 74 65 33 5f  *** End sqlite3_
1d8b0 66 69 6c 65 20 4d 65 74 68 6f 64 73 20 2a 2a 2a  file Methods ***
1d8c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1d8d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 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 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1d920 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a  ***********/../*
1d930 0a 2a 2a 20 54 68 69 73 20 64 69 76 69 73 69 6f  .** This divisio
1d940 6e 20 63 6f 6e 74 61 69 6e 73 20 64 65 66 69 6e  n contains defin
1d950 69 74 69 6f 6e 73 20 6f 66 20 73 71 6c 69 74 65  itions of sqlite
1d960 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 6f 62 6a  3_io_methods obj
1d970 65 63 74 73 20 74 68 61 74 0a 2a 2a 20 69 6d 70  ects that.** imp
1d980 6c 65 6d 65 6e 74 20 76 61 72 69 6f 75 73 20 66  lement various f
1d990 69 6c 65 20 6c 6f 63 6b 69 6e 67 20 73 74 72 61  ile locking stra
1d9a0 74 65 67 69 65 73 2e 20 20 49 74 20 61 6c 73 6f  tegies.  It also
1d9b0 20 63 6f 6e 74 61 69 6e 73 20 64 65 66 69 6e 69   contains defini
1d9c0 74 69 6f 6e 73 0a 2a 2a 20 6f 66 20 22 66 69 6e  tions.** of "fin
1d9d0 64 65 72 22 20 66 75 6e 63 74 69 6f 6e 73 2e 20  der" functions. 
1d9e0 20 41 20 66 69 6e 64 65 72 2d 66 75 6e 63 74 69   A finder-functi
1d9f0 6f 6e 20 69 73 20 75 73 65 64 20 74 6f 20 6c 6f  on is used to lo
1da00 63 61 74 65 20 74 68 65 20 61 70 70 72 6f 70 72  cate the appropr
1da10 69 61 74 65 0a 2a 2a 20 73 71 6c 69 74 65 33 5f  iate.** sqlite3_
1da20 69 6f 5f 6d 65 74 68 6f 64 73 20 6f 62 6a 65 63  io_methods objec
1da30 74 20 66 6f 72 20 61 20 70 61 72 74 69 63 75 6c  t for a particul
1da40 61 72 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  ar database file
1da50 2e 20 20 54 68 65 20 70 41 70 70 44 61 74 61 0a  .  The pAppData.
1da60 2a 2a 20 66 69 65 6c 64 20 6f 66 20 74 68 65 20  ** field of the 
1da70 73 71 6c 69 74 65 33 5f 76 66 73 20 56 46 53 20  sqlite3_vfs VFS 
1da80 6f 62 6a 65 63 74 73 20 61 72 65 20 69 6e 69 74  objects are init
1da90 69 61 6c 69 7a 65 64 20 74 6f 20 62 65 20 70 6f  ialized to be po
1daa0 69 6e 74 65 72 73 20 74 6f 0a 2a 2a 20 74 68 65  inters to.** the
1dab0 20 63 6f 72 72 65 63 74 20 66 69 6e 64 65 72 2d   correct finder-
1dac0 66 75 6e 63 74 69 6f 6e 20 66 6f 72 20 74 68 61  function for tha
1dad0 74 20 56 46 53 2e 0a 2a 2a 0a 2a 2a 20 4d 6f 73  t VFS..**.** Mos
1dae0 74 20 66 69 6e 64 65 72 20 66 75 6e 63 74 69 6f  t finder functio
1daf0 6e 73 20 72 65 74 75 72 6e 20 61 20 70 6f 69 6e  ns return a poin
1db00 74 65 72 20 74 6f 20 61 20 66 69 78 65 64 20 73  ter to a fixed s
1db10 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64  qlite3_io_method
1db20 73 0a 2a 2a 20 6f 62 6a 65 63 74 2e 20 20 54 68  s.** object.  Th
1db30 65 20 6f 6e 6c 79 20 69 6e 74 65 72 65 73 74 69  e only interesti
1db40 6e 67 20 66 69 6e 64 65 72 2d 66 75 6e 63 74 69  ng finder-functi
1db50 6f 6e 20 69 73 20 61 75 74 6f 6c 6f 63 6b 49 6f  on is autolockIo
1db60 46 69 6e 64 65 72 2c 20 77 68 69 63 68 0a 2a 2a  Finder, which.**
1db70 20 6c 6f 6f 6b 73 20 61 74 20 74 68 65 20 66 69   looks at the fi
1db80 6c 65 73 79 73 74 65 6d 20 74 79 70 65 20 61 6e  lesystem type an
1db90 64 20 74 72 69 65 73 20 74 6f 20 67 75 65 73 73  d tries to guess
1dba0 20 74 68 65 20 62 65 73 74 20 6c 6f 63 6b 69 6e   the best lockin
1dbb0 67 0a 2a 2a 20 73 74 72 61 74 65 67 79 20 66 72  g.** strategy fr
1dbc0 6f 6d 20 74 68 61 74 2e 0a 2a 2a 0a 2a 2a 20 46  om that..**.** F
1dbd0 6f 72 20 66 69 6e 64 65 72 2d 66 75 6e 74 69 6f  or finder-funtio
1dbe0 6e 20 46 2c 20 74 77 6f 20 6f 62 6a 65 63 74 73  n F, two objects
1dbf0 20 61 72 65 20 63 72 65 61 74 65 64 3a 0a 2a 2a   are created:.**
1dc00 0a 2a 2a 20 20 20 20 28 31 29 20 54 68 65 20 72  .**    (1) The r
1dc10 65 61 6c 20 66 69 6e 64 65 72 2d 66 75 6e 63 74  eal finder-funct
1dc20 69 6f 6e 20 6e 61 6d 65 64 20 22 46 49 6d 70 74  ion named "FImpt
1dc30 28 29 22 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 28 32  ()"..**.**    (2
1dc40 29 20 41 20 63 6f 6e 73 74 61 6e 74 20 70 6f 69  ) A constant poi
1dc50 6e 74 65 72 20 74 6f 20 74 68 69 73 20 66 75 6e  nter to this fun
1dc60 63 74 69 6f 6e 20 6e 61 6d 65 64 20 6a 75 73 74  ction named just
1dc70 20 22 46 22 2e 0a 2a 2a 0a 2a 2a 0a 2a 2a 20 41   "F"..**.**.** A
1dc80 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
1dc90 46 20 70 6f 69 6e 74 65 72 20 69 73 20 75 73 65  F pointer is use
1dca0 64 20 61 73 20 74 68 65 20 70 41 70 70 44 61 74  d as the pAppDat
1dcb0 61 20 76 61 6c 75 65 20 66 6f 72 20 56 46 53 0a  a value for VFS.
1dcc0 2a 2a 20 6f 62 6a 65 63 74 73 2e 20 20 57 65 20  ** objects.  We 
1dcd0 68 61 76 65 20 74 6f 20 64 6f 20 74 68 69 73 20  have to do this 
1dce0 69 6e 73 74 65 61 64 20 6f 66 20 6c 65 74 74 69  instead of letti
1dcf0 6e 67 20 70 41 70 70 44 61 74 61 20 70 6f 69 6e  ng pAppData poin
1dd00 74 0a 2a 2a 20 64 69 72 65 63 74 6c 79 20 61 74  t.** directly at
1dd10 20 74 68 65 20 66 69 6e 64 65 72 2d 66 75 6e 63   the finder-func
1dd20 74 69 6f 6e 20 73 69 6e 63 65 20 43 39 30 20 72  tion since C90 r
1dd30 75 6c 65 73 20 70 72 65 76 65 6e 74 20 61 20 76  ules prevent a v
1dd40 6f 69 64 2a 0a 2a 2a 20 66 72 6f 6d 20 62 65 20  oid*.** from be 
1dd50 63 61 73 74 20 69 6e 74 6f 20 61 20 66 75 6e 63  cast into a func
1dd60 74 69 6f 6e 20 70 6f 69 6e 74 65 72 2e 0a 2a 2a  tion pointer..**
1dd70 0a 2a 2a 0a 2a 2a 20 45 61 63 68 20 69 6e 73 74  .**.** Each inst
1dd80 61 6e 63 65 20 6f 66 20 74 68 69 73 20 6d 61 63  ance of this mac
1dd90 72 6f 20 67 65 6e 65 72 61 74 65 73 20 74 77 6f  ro generates two
1dda0 20 6f 62 6a 65 63 74 73 3a 0a 2a 2a 0a 2a 2a 20   objects:.**.** 
1ddb0 20 20 2a 20 20 41 20 63 6f 6e 73 74 61 6e 74 20    *  A constant 
1ddc0 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f  sqlite3_io_metho
1ddd0 64 73 20 6f 62 6a 65 63 74 20 63 61 6c 6c 20 4d  ds object call M
1dde0 45 54 48 4f 44 20 74 68 61 74 20 68 61 73 20 6c  ETHOD that has l
1ddf0 6f 63 6b 69 6e 67 0a 2a 2a 20 20 20 20 20 20 6d  ocking.**      m
1de00 65 74 68 6f 64 73 20 43 4c 4f 53 45 2c 20 4c 4f  ethods CLOSE, LO
1de10 43 4b 2c 20 55 4e 4c 4f 43 4b 2c 20 43 4b 52 45  CK, UNLOCK, CKRE
1de20 53 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a  SLOCK..**.**   *
1de30 20 20 41 6e 20 49 2f 4f 20 6d 65 74 68 6f 64 20    An I/O method 
1de40 66 69 6e 64 65 72 20 66 75 6e 63 74 69 6f 6e 20  finder function 
1de50 63 61 6c 6c 65 64 20 46 49 4e 44 45 52 20 74 68  called FINDER th
1de60 61 74 20 72 65 74 75 72 6e 73 20 61 20 70 6f 69  at returns a poi
1de70 6e 74 65 72 0a 2a 2a 20 20 20 20 20 20 74 6f 20  nter.**      to 
1de80 74 68 65 20 4d 45 54 48 4f 44 20 6f 62 6a 65 63  the METHOD objec
1de90 74 20 69 6e 20 74 68 65 20 70 72 65 76 69 6f 75  t in the previou
1dea0 73 20 62 75 6c 6c 65 74 2e 0a 2a 2f 0a 23 64 65  s bullet..*/.#de
1deb0 66 69 6e 65 20 49 4f 4d 45 54 48 4f 44 53 28 46  fine IOMETHODS(F
1dec0 49 4e 44 45 52 2c 20 4d 45 54 48 4f 44 2c 20 56  INDER, METHOD, V
1ded0 45 52 53 49 4f 4e 2c 20 43 4c 4f 53 45 2c 20 4c  ERSION, CLOSE, L
1dee0 4f 43 4b 2c 20 55 4e 4c 4f 43 4b 2c 20 43 4b 4c  OCK, UNLOCK, CKL
1def0 4f 43 4b 29 20 20 20 20 20 20 5c 0a 73 74 61 74  OCK)      \.stat
1df00 69 63 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33  ic const sqlite3
1df10 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 4d 45 54 48  _io_methods METH
1df20 4f 44 20 3d 20 7b 20 20 20 20 20 20 20 20 20 20  OD = {          
1df30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1df40 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 56 45           \.   VE
1df50 52 53 49 4f 4e 2c 20 20 20 20 20 20 20 20 20 20  RSION,          
1df60 20 20 20 20 20 20 20 20 20 20 2f 2a 20 69 56 65            /* iVe
1df70 72 73 69 6f 6e 20 2a 2f 20 20 20 20 20 20 20 20  rsion */        
1df80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1df90 20 20 20 20 20 20 20 20 5c 0a 20 20 20 43 4c 4f          \.   CLO
1dfa0 53 45 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  SE,             
1dfb0 20 20 20 20 20 20 20 20 20 2f 2a 20 78 43 6c 6f           /* xClo
1dfc0 73 65 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20  se */           
1dfd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dfe0 20 20 20 20 20 20 20 5c 0a 20 20 20 75 6e 69 78         \.   unix
1dff0 52 65 61 64 2c 20 20 20 20 20 20 20 20 20 20 20  Read,           
1e000 20 20 20 20 20 20 20 20 2f 2a 20 78 52 65 61 64          /* xRead
1e010 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20 20   */             
1e020 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e030 20 20 20 20 20 20 5c 0a 20 20 20 75 6e 69 78 57        \.   unixW
1e040 72 69 74 65 2c 20 20 20 20 20 20 20 20 20 20 20  rite,           
1e050 20 20 20 20 20 20 20 2f 2a 20 78 57 72 69 74 65         /* xWrite
1e060 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20 20   */             
1e070 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e080 20 20 20 20 20 5c 0a 20 20 20 75 6e 69 78 54 72       \.   unixTr
1e090 75 6e 63 61 74 65 2c 20 20 20 20 20 20 20 20 20  uncate,         
1e0a0 20 20 20 20 20 20 2f 2a 20 78 54 72 75 6e 63 61        /* xTrunca
1e0b0 74 65 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20  te */           
1e0c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e0d0 20 20 20 20 5c 0a 20 20 20 75 6e 69 78 53 79 6e      \.   unixSyn
1e0e0 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c,              
1e0f0 20 20 20 20 20 2f 2a 20 78 53 79 6e 63 20 2a 2f       /* xSync */
1e100 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e110 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e120 20 20 20 5c 0a 20 20 20 75 6e 69 78 46 69 6c 65     \.   unixFile
1e130 53 69 7a 65 2c 20 20 20 20 20 20 20 20 20 20 20  Size,           
1e140 20 20 20 20 2f 2a 20 78 46 69 6c 65 53 69 7a 65      /* xFileSize
1e150 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20 20   */             
1e160 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e170 20 20 5c 0a 20 20 20 4c 4f 43 4b 2c 20 20 20 20    \.   LOCK,    
1e180 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e190 20 20 20 2f 2a 20 78 4c 6f 63 6b 20 2a 2f 20 20     /* xLock */  
1e1a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e1b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e1c0 20 5c 0a 20 20 20 55 4e 4c 4f 43 4b 2c 20 20 20   \.   UNLOCK,   
1e1d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e1e0 20 20 2f 2a 20 78 55 6e 6c 6f 63 6b 20 2a 2f 20    /* xUnlock */ 
1e1f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e200 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e210 5c 0a 20 20 20 43 4b 4c 4f 43 4b 2c 20 20 20 20  \.   CKLOCK,    
1e220 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e230 20 2f 2a 20 78 43 68 65 63 6b 52 65 73 65 72 76   /* xCheckReserv
1e240 65 64 4c 6f 63 6b 20 2a 2f 20 20 20 20 20 20 20  edLock */       
1e250 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c                 \
1e260 0a 20 20 20 75 6e 69 78 46 69 6c 65 43 6f 6e 74  .   unixFileCont
1e270 72 6f 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20  rol,            
1e280 2f 2a 20 78 46 69 6c 65 43 6f 6e 74 72 6f 6c 20  /* xFileControl 
1e290 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20 20 20  */              
1e2a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a                \.
1e2b0 20 20 20 75 6e 69 78 53 65 63 74 6f 72 53 69 7a     unixSectorSiz
1e2c0 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  e,             /
1e2d0 2a 20 78 53 65 63 74 6f 72 53 69 7a 65 20 2a 2f  * xSectorSize */
1e2e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e2f0 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20               \. 
1e300 20 20 75 6e 69 78 44 65 76 69 63 65 43 68 61 72    unixDeviceChar
1e310 61 63 74 65 72 69 73 74 69 63 73 2c 20 20 2f 2a  acteristics,  /*
1e320 20 78 44 65 76 69 63 65 43 61 70 61 62 69 6c 69   xDeviceCapabili
1e330 74 69 65 73 20 2a 2f 20 20 20 20 20 20 20 20 20  ties */         
1e340 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20              \.  
1e350 20 75 6e 69 78 53 68 6d 4f 70 65 6e 2c 20 20 20   unixShmOpen,   
1e360 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1e370 78 53 68 6d 4f 70 65 6e 20 2a 2f 20 20 20 20 20  xShmOpen */     
1e380 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e390 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20             \.   
1e3a0 75 6e 69 78 53 68 6d 53 69 7a 65 2c 20 20 20 20  unixShmSize,    
1e3b0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
1e3c0 53 68 6d 53 69 7a 65 20 2a 2f 20 20 20 20 20 20  ShmSize */      
1e3d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e3e0 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 75            \.   u
1e3f0 6e 69 78 53 68 6d 47 65 74 2c 20 20 20 20 20 20  nixShmGet,      
1e400 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53             /* xS
1e410 68 6d 47 65 74 20 2a 2f 20 20 20 20 20 20 20 20  hmGet */        
1e420 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e430 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 75 6e           \.   un
1e440 69 78 53 68 6d 52 65 6c 65 61 73 65 2c 20 20 20  ixShmRelease,   
1e450 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53 68            /* xSh
1e460 6d 52 65 6c 65 61 73 65 20 2a 2f 20 20 20 20 20  mRelease */     
1e470 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e480 20 20 20 20 20 20 20 20 5c 0a 20 20 20 75 6e 69          \.   uni
1e490 78 53 68 6d 4c 6f 63 6b 2c 20 20 20 20 20 20 20  xShmLock,       
1e4a0 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53 68 6d           /* xShm
1e4b0 4c 6f 63 6b 20 2a 2f 20 20 20 20 20 20 20 20 20  Lock */         
1e4c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e4d0 20 20 20 20 20 20 20 5c 0a 20 20 20 75 6e 69 78         \.   unix
1e4e0 53 68 6d 42 61 72 72 69 65 72 2c 20 20 20 20 20  ShmBarrier,     
1e4f0 20 20 20 20 20 20 20 20 2f 2a 20 78 53 68 6d 42          /* xShmB
1e500 61 72 72 69 65 72 20 2a 2f 20 20 20 20 20 20 20  arrier */       
1e510 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e520 20 20 20 20 20 20 5c 0a 20 20 20 75 6e 69 78 53        \.   unixS
1e530 68 6d 43 6c 6f 73 65 20 20 20 20 20 20 20 20 20  hmClose         
1e540 20 20 20 20 20 20 20 2f 2a 20 78 53 68 6d 43 6c         /* xShmCl
1e550 6f 73 65 20 2a 2f 20 20 20 20 20 20 20 20 20 20  ose */          
1e560 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e570 20 20 20 20 20 5c 0a 7d 3b 20 20 20 20 20 20 20       \.};       
1e580 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e590 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e5a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e5b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e5c0 20 20 20 20 5c 0a 73 74 61 74 69 63 20 63 6f 6e      \.static con
1e5d0 73 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65  st sqlite3_io_me
1e5e0 74 68 6f 64 73 20 2a 46 49 4e 44 45 52 23 23 49  thods *FINDER##I
1e5f0 6d 70 6c 28 63 6f 6e 73 74 20 63 68 61 72 20 2a  mpl(const char *
1e600 7a 2c 20 75 6e 69 78 46 69 6c 65 20 2a 70 29 7b  z, unixFile *p){
1e610 20 20 20 5c 0a 20 20 55 4e 55 53 45 44 5f 50 41     \.  UNUSED_PA
1e620 52 41 4d 45 54 45 52 28 7a 29 3b 20 55 4e 55 53  RAMETER(z); UNUS
1e630 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70 29 3b  ED_PARAMETER(p);
1e640 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e650 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e660 20 20 5c 0a 20 20 72 65 74 75 72 6e 20 26 4d 45    \.  return &ME
1e670 54 48 4f 44 3b 20 20 20 20 20 20 20 20 20 20 20  THOD;           
1e680 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e690 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e6a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e6b0 20 5c 0a 7d 20 20 20 20 20 20 20 20 20 20 20 20   \.}            
1e6c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e6d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e6e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e6f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e700 5c 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73  \.static const s
1e710 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64  qlite3_io_method
1e720 73 20 2a 28 2a 63 6f 6e 73 74 20 46 49 4e 44 45  s *(*const FINDE
1e730 52 29 28 63 6f 6e 73 74 20 63 68 61 72 2a 2c 75  R)(const char*,u
1e740 6e 69 78 46 69 6c 65 20 2a 70 29 20 20 20 20 5c  nixFile *p)    \
1e750 0a 20 20 20 20 3d 20 46 49 4e 44 45 52 23 23 49  .    = FINDER##I
1e760 6d 70 6c 3b 0a 0a 2f 2a 0a 2a 2a 20 48 65 72 65  mpl;../*.** Here
1e770 20 61 72 65 20 61 6c 6c 20 6f 66 20 74 68 65 20   are all of the 
1e780 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f  sqlite3_io_metho
1e790 64 73 20 6f 62 6a 65 63 74 73 20 66 6f 72 20 65  ds objects for e
1e7a0 61 63 68 20 6f 66 20 74 68 65 0a 2a 2a 20 6c 6f  ach of the.** lo
1e7b0 63 6b 69 6e 67 20 73 74 72 61 74 65 67 69 65 73  cking strategies
1e7c0 2e 20 20 46 75 6e 63 74 69 6f 6e 73 20 74 68 61  .  Functions tha
1e7d0 74 20 72 65 74 75 72 6e 20 70 6f 69 6e 74 65 72  t return pointer
1e7e0 73 20 74 6f 20 74 68 65 73 65 20 6d 65 74 68 6f  s to these metho
1e7f0 64 73 0a 2a 2a 20 61 72 65 20 61 6c 73 6f 20 63  ds.** are also c
1e800 72 65 61 74 65 64 2e 0a 2a 2f 0a 49 4f 4d 45 54  reated..*/.IOMET
1e810 48 4f 44 53 28 0a 20 20 70 6f 73 69 78 49 6f 46  HODS(.  posixIoF
1e820 69 6e 64 65 72 2c 20 20 20 20 20 20 20 20 20 20  inder,          
1e830 20 20 2f 2a 20 46 69 6e 64 65 72 20 66 75 6e 63    /* Finder func
1e840 74 69 6f 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20 70  tion name */.  p
1e850 6f 73 69 78 49 6f 4d 65 74 68 6f 64 73 2c 20 20  osixIoMethods,  
1e860 20 20 20 20 20 20 20 20 20 2f 2a 20 73 71 6c 69           /* sqli
1e870 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 6f  te3_io_methods o
1e880 62 6a 65 63 74 20 6e 61 6d 65 20 2a 2f 0a 20 20  bject name */.  
1e890 32 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  2,              
1e8a0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 68 6d            /* Shm
1e8b0 4f 70 65 6e 20 69 73 20 65 6e 61 62 6c 65 64 20  Open is enabled 
1e8c0 2a 2f 0a 20 20 75 6e 69 78 43 6c 6f 73 65 2c 20  */.  unixClose, 
1e8d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1e8e0 2a 20 78 43 6c 6f 73 65 20 6d 65 74 68 6f 64 20  * xClose method 
1e8f0 2a 2f 0a 20 20 75 6e 69 78 4c 6f 63 6b 2c 20 20  */.  unixLock,  
1e900 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1e910 2a 20 78 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a  * xLock method *
1e920 2f 0a 20 20 75 6e 69 78 55 6e 6c 6f 63 6b 2c 20  /.  unixUnlock, 
1e930 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1e940 20 78 55 6e 6c 6f 63 6b 20 6d 65 74 68 6f 64 20   xUnlock method 
1e950 2a 2f 0a 20 20 75 6e 69 78 43 68 65 63 6b 52 65  */.  unixCheckRe
1e960 73 65 72 76 65 64 4c 6f 63 6b 20 20 20 20 20 2f  servedLock     /
1e970 2a 20 78 43 68 65 63 6b 52 65 73 65 72 76 65 64  * xCheckReserved
1e980 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 29  Lock method */.)
1e990 0a 49 4f 4d 45 54 48 4f 44 53 28 0a 20 20 6e 6f  .IOMETHODS(.  no
1e9a0 6c 6f 63 6b 49 6f 46 69 6e 64 65 72 2c 20 20 20  lockIoFinder,   
1e9b0 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6e 64 65          /* Finde
1e9c0 72 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 20  r function name 
1e9d0 2a 2f 0a 20 20 6e 6f 6c 6f 63 6b 49 6f 4d 65 74  */.  nolockIoMet
1e9e0 68 6f 64 73 2c 20 20 20 20 20 20 20 20 20 20 2f  hods,          /
1e9f0 2a 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74  * sqlite3_io_met
1ea00 68 6f 64 73 20 6f 62 6a 65 63 74 20 6e 61 6d 65  hods object name
1ea10 20 2a 2f 0a 20 20 31 2c 20 20 20 20 20 20 20 20   */.  1,        
1ea20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ea30 2f 2a 20 53 68 6d 4f 70 65 6e 20 69 73 20 64 69  /* ShmOpen is di
1ea40 73 61 62 6c 65 64 20 2a 2f 0a 20 20 6e 6f 6c 6f  sabled */.  nolo
1ea50 63 6b 43 6c 6f 73 65 2c 20 20 20 20 20 20 20 20  ckClose,        
1ea60 20 20 20 20 20 20 2f 2a 20 78 43 6c 6f 73 65 20        /* xClose 
1ea70 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 6e 6f 6c 6f  method */.  nolo
1ea80 63 6b 4c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20  ckLock,         
1ea90 20 20 20 20 20 20 2f 2a 20 78 4c 6f 63 6b 20 6d        /* xLock m
1eaa0 65 74 68 6f 64 20 2a 2f 0a 20 20 6e 6f 6c 6f 63  ethod */.  noloc
1eab0 6b 55 6e 6c 6f 63 6b 2c 20 20 20 20 20 20 20 20  kUnlock,        
1eac0 20 20 20 20 20 2f 2a 20 78 55 6e 6c 6f 63 6b 20       /* xUnlock 
1ead0 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 6e 6f 6c 6f  method */.  nolo
1eae0 63 6b 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c  ckCheckReservedL
1eaf0 6f 63 6b 20 20 20 2f 2a 20 78 43 68 65 63 6b 52  ock   /* xCheckR
1eb00 65 73 65 72 76 65 64 4c 6f 63 6b 20 6d 65 74 68  eservedLock meth
1eb10 6f 64 20 2a 2f 0a 29 0a 49 4f 4d 45 54 48 4f 44  od */.).IOMETHOD
1eb20 53 28 0a 20 20 64 6f 74 6c 6f 63 6b 49 6f 46 69  S(.  dotlockIoFi
1eb30 6e 64 65 72 2c 20 20 20 20 20 20 20 20 20 20 2f  nder,          /
1eb40 2a 20 46 69 6e 64 65 72 20 66 75 6e 63 74 69 6f  * Finder functio
1eb50 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20 64 6f 74 6c  n name */.  dotl
1eb60 6f 63 6b 49 6f 4d 65 74 68 6f 64 73 2c 20 20 20  ockIoMethods,   
1eb70 20 20 20 20 20 20 2f 2a 20 73 71 6c 69 74 65 33        /* sqlite3
1eb80 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 6f 62 6a 65  _io_methods obje
1eb90 63 74 20 6e 61 6d 65 20 2a 2f 0a 20 20 31 2c 20  ct name */.  1, 
1eba0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ebb0 20 20 20 20 20 20 20 2f 2a 20 53 68 6d 4f 70 65         /* ShmOpe
1ebc0 6e 20 69 73 20 64 69 73 61 62 6c 65 64 20 2a 2f  n is disabled */
1ebd0 0a 20 20 64 6f 74 6c 6f 63 6b 43 6c 6f 73 65 2c  .  dotlockClose,
1ebe0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1ebf0 78 43 6c 6f 73 65 20 6d 65 74 68 6f 64 20 2a 2f  xClose method */
1ec00 0a 20 20 64 6f 74 6c 6f 63 6b 4c 6f 63 6b 2c 20  .  dotlockLock, 
1ec10 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1ec20 78 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a  xLock method */.
1ec30 20 20 64 6f 74 6c 6f 63 6b 55 6e 6c 6f 63 6b 2c    dotlockUnlock,
1ec40 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
1ec50 55 6e 6c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f  Unlock method */
1ec60 0a 20 20 64 6f 74 6c 6f 63 6b 43 68 65 63 6b 52  .  dotlockCheckR
1ec70 65 73 65 72 76 65 64 4c 6f 63 6b 20 20 2f 2a 20  eservedLock  /* 
1ec80 78 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f  xCheckReservedLo
1ec90 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 29 0a 0a  ck method */.)..
1eca0 23 69 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  #if SQLITE_ENABL
1ecb0 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20  E_LOCKING_STYLE 
1ecc0 26 26 20 21 4f 53 5f 56 58 57 4f 52 4b 53 0a 49  && !OS_VXWORKS.I
1ecd0 4f 4d 45 54 48 4f 44 53 28 0a 20 20 66 6c 6f 63  OMETHODS(.  floc
1ece0 6b 49 6f 46 69 6e 64 65 72 2c 20 20 20 20 20 20  kIoFinder,      
1ecf0 20 20 20 20 20 20 2f 2a 20 46 69 6e 64 65 72 20        /* Finder 
1ed00 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 20 2a 2f  function name */
1ed10 0a 20 20 66 6c 6f 63 6b 49 6f 4d 65 74 68 6f 64  .  flockIoMethod
1ed20 73 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  s,           /* 
1ed30 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f  sqlite3_io_metho
1ed40 64 73 20 6f 62 6a 65 63 74 20 6e 61 6d 65 20 2a  ds object name *
1ed50 2f 0a 20 20 31 2c 20 20 20 20 20 20 20 20 20 20  /.  1,          
1ed60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1ed70 20 53 68 6d 4f 70 65 6e 20 69 73 20 64 69 73 61   ShmOpen is disa
1ed80 62 6c 65 64 20 2a 2f 0a 20 20 66 6c 6f 63 6b 43  bled */.  flockC
1ed90 6c 6f 73 65 2c 20 20 20 20 20 20 20 20 20 20 20  lose,           
1eda0 20 20 20 20 2f 2a 20 78 43 6c 6f 73 65 20 6d 65      /* xClose me
1edb0 74 68 6f 64 20 2a 2f 0a 20 20 66 6c 6f 63 6b 4c  thod */.  flockL
1edc0 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20  ock,            
1edd0 20 20 20 20 2f 2a 20 78 4c 6f 63 6b 20 6d 65 74      /* xLock met
1ede0 68 6f 64 20 2a 2f 0a 20 20 66 6c 6f 63 6b 55 6e  hod */.  flockUn
1edf0 6c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20  lock,           
1ee00 20 20 20 2f 2a 20 78 55 6e 6c 6f 63 6b 20 6d 65     /* xUnlock me
1ee10 74 68 6f 64 20 2a 2f 0a 20 20 66 6c 6f 63 6b 43  thod */.  flockC
1ee20 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b  heckReservedLock
1ee30 20 20 20 20 2f 2a 20 78 43 68 65 63 6b 52 65 73      /* xCheckRes
1ee40 65 72 76 65 64 4c 6f 63 6b 20 6d 65 74 68 6f 64  ervedLock method
1ee50 20 2a 2f 0a 29 0a 23 65 6e 64 69 66 0a 0a 23 69   */.).#endif..#i
1ee60 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 49 4f 4d  f OS_VXWORKS.IOM
1ee70 45 54 48 4f 44 53 28 0a 20 20 73 65 6d 49 6f 46  ETHODS(.  semIoF
1ee80 69 6e 64 65 72 2c 20 20 20 20 20 20 20 20 20 20  inder,          
1ee90 20 20 20 20 2f 2a 20 46 69 6e 64 65 72 20 66 75      /* Finder fu
1eea0 6e 63 74 69 6f 6e 20 6e 61 6d 65 20 2a 2f 0a 20  nction name */. 
1eeb0 20 73 65 6d 49 6f 4d 65 74 68 6f 64 73 2c 20 20   semIoMethods,  
1eec0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73 71             /* sq
1eed0 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73  lite3_io_methods
1eee0 20 6f 62 6a 65 63 74 20 6e 61 6d 65 20 2a 2f 0a   object name */.
1eef0 20 20 31 2c 20 20 20 20 20 20 20 20 20 20 20 20    1,            
1ef00 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
1ef10 68 6d 4f 70 65 6e 20 69 73 20 64 69 73 61 62 6c  hmOpen is disabl
1ef20 65 64 20 2a 2f 0a 20 20 73 65 6d 43 6c 6f 73 65  ed */.  semClose
1ef30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
1ef40 20 20 2f 2a 20 78 43 6c 6f 73 65 20 6d 65 74 68    /* xClose meth
1ef50 6f 64 20 2a 2f 0a 20 20 73 65 6d 4c 6f 63 6b 2c  od */.  semLock,
1ef60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ef70 20 20 2f 2a 20 78 4c 6f 63 6b 20 6d 65 74 68 6f    /* xLock metho
1ef80 64 20 2a 2f 0a 20 20 73 65 6d 55 6e 6c 6f 63 6b  d */.  semUnlock
1ef90 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
1efa0 20 2f 2a 20 78 55 6e 6c 6f 63 6b 20 6d 65 74 68   /* xUnlock meth
1efb0 6f 64 20 2a 2f 0a 20 20 73 65 6d 43 68 65 63 6b  od */.  semCheck
1efc0 52 65 73 65 72 76 65 64 4c 6f 63 6b 20 20 20 20  ReservedLock    
1efd0 20 20 2f 2a 20 78 43 68 65 63 6b 52 65 73 65 72    /* xCheckReser
1efe0 76 65 64 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a  vedLock method *
1eff0 2f 0a 29 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20  /.).#endif..#if 
1f000 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f  defined(__APPLE_
1f010 5f 29 20 26 26 20 53 51 4c 49 54 45 5f 45 4e 41  _) && SQLITE_ENA
1f020 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c  BLE_LOCKING_STYL
1f030 45 0a 49 4f 4d 45 54 48 4f 44 53 28 0a 20 20 61  E.IOMETHODS(.  a
1f040 66 70 49 6f 46 69 6e 64 65 72 2c 20 20 20 20 20  fpIoFinder,     
1f050 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6e 64           /* Find
1f060 65 72 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65  er function name
1f070 20 2a 2f 0a 20 20 61 66 70 49 6f 4d 65 74 68 6f   */.  afpIoMetho
1f080 64 73 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ds,             
1f090 2f 2a 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65  /* sqlite3_io_me
1f0a0 74 68 6f 64 73 20 6f 62 6a 65 63 74 20 6e 61 6d  thods object nam
1f0b0 65 20 2a 2f 0a 20 20 31 2c 20 20 20 20 20 20 20  e */.  1,       
1f0c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f0d0 20 2f 2a 20 53 68 6d 4f 70 65 6e 20 69 73 20 64   /* ShmOpen is d
1f0e0 69 73 61 62 6c 65 64 20 2a 2f 0a 20 20 61 66 70  isabled */.  afp
1f0f0 43 6c 6f 73 65 2c 20 20 20 20 20 20 20 20 20 20  Close,          
1f100 20 20 20 20 20 20 20 2f 2a 20 78 43 6c 6f 73 65         /* xClose
1f110 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 61 66 70   method */.  afp
1f120 4c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20  Lock,           
1f130 20 20 20 20 20 20 20 2f 2a 20 78 4c 6f 63 6b 20         /* xLock 
1f140 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 61 66 70 55  method */.  afpU
1f150 6e 6c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20  nlock,          
1f160 20 20 20 20 20 20 2f 2a 20 78 55 6e 6c 6f 63 6b        /* xUnlock
1f170 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 61 66 70   method */.  afp
1f180 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63  CheckReservedLoc
1f190 6b 20 20 20 20 20 20 2f 2a 20 78 43 68 65 63 6b  k      /* xCheck
1f1a0 52 65 73 65 72 76 65 64 4c 6f 63 6b 20 6d 65 74  ReservedLock met
1f1b0 68 6f 64 20 2a 2f 0a 29 0a 23 65 6e 64 69 66 0a  hod */.).#endif.
1f1c0 0a 2f 2a 0a 2a 2a 20 54 68 65 20 70 72 6f 78 79  ./*.** The proxy
1f1d0 20 6c 6f 63 6b 69 6e 67 20 6d 65 74 68 6f 64 20   locking method 
1f1e0 69 73 20 61 20 22 73 75 70 65 72 2d 6d 65 74 68  is a "super-meth
1f1f0 6f 64 22 20 69 6e 20 74 68 65 20 73 65 6e 73 65  od" in the sense
1f200 20 74 68 61 74 20 69 74 0a 2a 2a 20 6f 70 65 6e   that it.** open
1f210 73 20 73 65 63 6f 6e 64 61 72 79 20 66 69 6c 65  s secondary file
1f220 20 64 65 73 63 72 69 70 74 6f 72 73 20 66 6f 72   descriptors for
1f230 20 74 68 65 20 63 6f 6e 63 68 20 61 6e 64 20 6c   the conch and l
1f240 6f 63 6b 20 66 69 6c 65 73 20 61 6e 64 0a 2a 2a  ock files and.**
1f250 20 69 74 20 75 73 65 73 20 70 72 6f 78 79 2c 20   it uses proxy, 
1f260 64 6f 74 2d 66 69 6c 65 2c 20 41 46 50 2c 20 61  dot-file, AFP, a
1f270 6e 64 20 66 6c 6f 63 6b 28 29 20 6c 6f 63 6b 69  nd flock() locki
1f280 6e 67 20 6d 65 74 68 6f 64 73 20 6f 6e 20 74 68  ng methods on th
1f290 6f 73 65 0a 2a 2a 20 73 65 63 6f 6e 64 61 72 79  ose.** secondary
1f2a0 20 66 69 6c 65 73 2e 20 20 46 6f 72 20 74 68 69   files.  For thi
1f2b0 73 20 72 65 61 73 6f 6e 2c 20 74 68 65 20 64 69  s reason, the di
1f2c0 76 69 73 69 6f 6e 20 74 68 61 74 20 69 6d 70 6c  vision that impl
1f2d0 65 6d 65 6e 74 73 0a 2a 2a 20 70 72 6f 78 79 20  ements.** proxy 
1f2e0 6c 6f 63 6b 69 6e 67 20 69 73 20 6c 6f 63 61 74  locking is locat
1f2f0 65 64 20 6d 75 63 68 20 66 75 72 74 68 65 72 20  ed much further 
1f300 64 6f 77 6e 20 69 6e 20 74 68 65 20 66 69 6c 65  down in the file
1f310 2e 20 20 42 75 74 20 77 65 20 6e 65 65 64 0a 2a  .  But we need.*
1f320 2a 20 74 6f 20 67 6f 20 61 68 65 61 64 20 61 6e  * to go ahead an
1f330 64 20 64 65 66 69 6e 65 20 74 68 65 20 73 71 6c  d define the sql
1f340 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20  ite3_io_methods 
1f350 61 6e 64 20 66 69 6e 64 65 72 20 66 75 6e 63 74  and finder funct
1f360 69 6f 6e 0a 2a 2a 20 66 6f 72 20 70 72 6f 78 79  ion.** for proxy
1f370 20 6c 6f 63 6b 69 6e 67 20 68 65 72 65 2e 20 20   locking here.  
1f380 53 6f 20 77 65 20 66 6f 72 77 61 72 64 20 64 65  So we forward de
1f390 63 6c 61 72 65 20 74 68 65 20 49 2f 4f 20 6d 65  clare the I/O me
1f3a0 74 68 6f 64 73 2e 0a 2a 2f 0a 23 69 66 20 64 65  thods..*/.#if de
1f3b0 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29  fined(__APPLE__)
1f3c0 20 26 26 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c   && SQLITE_ENABL
1f3d0 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a  E_LOCKING_STYLE.
1f3e0 73 74 61 74 69 63 20 69 6e 74 20 70 72 6f 78 79  static int proxy
1f3f0 43 6c 6f 73 65 28 73 71 6c 69 74 65 33 5f 66 69  Close(sqlite3_fi
1f400 6c 65 2a 29 3b 0a 73 74 61 74 69 63 20 69 6e 74  le*);.static int
1f410 20 70 72 6f 78 79 4c 6f 63 6b 28 73 71 6c 69 74   proxyLock(sqlit
1f420 65 33 5f 66 69 6c 65 2a 2c 20 69 6e 74 29 3b 0a  e3_file*, int);.
1f430 73 74 61 74 69 63 20 69 6e 74 20 70 72 6f 78 79  static int proxy
1f440 55 6e 6c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66  Unlock(sqlite3_f
1f450 69 6c 65 2a 2c 20 69 6e 74 29 3b 0a 73 74 61 74  ile*, int);.stat
1f460 69 63 20 69 6e 74 20 70 72 6f 78 79 43 68 65 63  ic int proxyChec
1f470 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 28 73 71  kReservedLock(sq
1f480 6c 69 74 65 33 5f 66 69 6c 65 2a 2c 20 69 6e 74  lite3_file*, int
1f490 2a 29 3b 0a 49 4f 4d 45 54 48 4f 44 53 28 0a 20  *);.IOMETHODS(. 
1f4a0 20 70 72 6f 78 79 49 6f 46 69 6e 64 65 72 2c 20   proxyIoFinder, 
1f4b0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69             /* Fi
1f4c0 6e 64 65 72 20 66 75 6e 63 74 69 6f 6e 20 6e 61  nder function na
1f4d0 6d 65 20 2a 2f 0a 20 20 70 72 6f 78 79 49 6f 4d  me */.  proxyIoM
1f4e0 65 74 68 6f 64 73 2c 20 20 20 20 20 20 20 20 20  ethods,         
1f4f0 20 20 2f 2a 20 73 71 6c 69 74 65 33 5f 69 6f 5f    /* sqlite3_io_
1f500 6d 65 74 68 6f 64 73 20 6f 62 6a 65 63 74 20 6e  methods object n
1f510 61 6d 65 20 2a 2f 0a 20 20 31 2c 20 20 20 20 20  ame */.  1,     
1f520 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f530 20 20 20 2f 2a 20 53 68 6d 4f 70 65 6e 20 69 73     /* ShmOpen is
1f540 20 64 69 73 61 62 6c 65 64 20 2a 2f 0a 20 20 70   disabled */.  p
1f550 72 6f 78 79 43 6c 6f 73 65 2c 20 20 20 20 20 20  roxyClose,      
1f560 20 20 20 20 20 20 20 20 20 2f 2a 20 78 43 6c 6f           /* xClo
1f570 73 65 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 70  se method */.  p
1f580 72 6f 78 79 4c 6f 63 6b 2c 20 20 20 20 20 20 20  roxyLock,       
1f590 20 20 20 20 20 20 20 20 20 2f 2a 20 78 4c 6f 63           /* xLoc
1f5a0 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 70 72  k method */.  pr
1f5b0 6f 78 79 55 6e 6c 6f 63 6b 2c 20 20 20 20 20 20  oxyUnlock,      
1f5c0 20 20 20 20 20 20 20 20 2f 2a 20 78 55 6e 6c 6f          /* xUnlo
1f5d0 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 70  ck method */.  p
1f5e0 72 6f 78 79 43 68 65 63 6b 52 65 73 65 72 76 65  roxyCheckReserve
1f5f0 64 4c 6f 63 6b 20 20 20 20 2f 2a 20 78 43 68 65  dLock    /* xChe
1f600 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 20 6d  ckReservedLock m
1f610 65 74 68 6f 64 20 2a 2f 0a 29 0a 23 65 6e 64 69  ethod */.).#endi
1f620 66 0a 0a 2f 2a 20 6e 66 73 20 6c 6f 63 6b 64 20  f../* nfs lockd 
1f630 6f 6e 20 4f 53 58 20 31 30 2e 33 2b 20 64 6f 65  on OSX 10.3+ doe
1f640 73 6e 27 74 20 63 6c 65 61 72 20 77 72 69 74 65  sn't clear write
1f650 20 6c 6f 63 6b 73 20 77 68 65 6e 20 61 20 72 65   locks when a re
1f660 61 64 20 6c 6f 63 6b 20 69 73 20 73 65 74 20 2a  ad lock is set *
1f670 2f 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f 5f  /.#if defined(__
1f680 41 50 50 4c 45 5f 5f 29 20 26 26 20 53 51 4c 49  APPLE__) && SQLI
1f690 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e  TE_ENABLE_LOCKIN
1f6a0 47 5f 53 54 59 4c 45 0a 49 4f 4d 45 54 48 4f 44  G_STYLE.IOMETHOD
1f6b0 53 28 0a 20 20 6e 66 73 49 6f 46 69 6e 64 65 72  S(.  nfsIoFinder
1f6c0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
1f6d0 2f 2a 20 46 69 6e 64 65 72 20 66 75 6e 63 74 69  /* Finder functi
1f6e0 6f 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20 6e 66 73  on name */.  nfs
1f6f0 49 6f 4d 65 74 68 6f 64 73 2c 20 20 20 20 20 20  IoMethods,      
1f700 20 20 20 20 20 20 20 20 2f 2a 20 73 71 6c 69 74          /* sqlit
1f710 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 6f 62  e3_io_methods ob
1f720 6a 65 63 74 20 6e 61 6d 65 20 2a 2f 0a 20 20 31  ject name */.  1
1f730 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
1f740 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 68 6d            /* Shm
1f750 4f 70 65 6e 20 69 73 20 64 69 73 61 62 6c 65 64  Open is disabled
1f760 20 2a 2f 0a 20 20 75 6e 69 78 43 6c 6f 73 65 2c   */.  unixClose,
1f770 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f780 20 2f 2a 20 78 43 6c 6f 73 65 20 6d 65 74 68 6f   /* xClose metho
1f790 64 20 2a 2f 0a 20 20 75 6e 69 78 4c 6f 63 6b 2c  d */.  unixLock,
1f7a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f7b0 20 20 2f 2a 20 78 4c 6f 63 6b 20 6d 65 74 68 6f    /* xLock metho
1f7c0 64 20 2a 2f 0a 20 20 6e 66 73 55 6e 6c 6f 63 6b  d */.  nfsUnlock
1f7d0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
1f7e0 20 20 2f 2a 20 78 55 6e 6c 6f 63 6b 20 6d 65 74    /* xUnlock met
1f7f0 68 6f 64 20 2a 2f 0a 20 20 75 6e 69 78 43 68 65  hod */.  unixChe
1f800 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 20 20  ckReservedLock  
1f810 20 20 20 20 2f 2a 20 78 43 68 65 63 6b 52 65 73      /* xCheckRes
1f820 65 72 76 65 64 4c 6f 63 6b 20 6d 65 74 68 6f 64  ervedLock method
1f830 20 2a 2f 0a 29 0a 23 65 6e 64 69 66 0a 0a 23 69   */.).#endif..#i
1f840 66 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c  f defined(__APPL
1f850 45 5f 5f 29 20 26 26 20 53 51 4c 49 54 45 5f 45  E__) && SQLITE_E
1f860 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54  NABLE_LOCKING_ST
1f870 59 4c 45 0a 2f 2a 20 0a 2a 2a 20 54 68 69 73 20  YLE./* .** This 
1f880 22 66 69 6e 64 65 72 22 20 66 75 6e 63 74 69 6f  "finder" functio
1f890 6e 20 61 74 74 65 6d 70 74 73 20 74 6f 20 64 65  n attempts to de
1f8a0 74 65 72 6d 69 6e 65 20 74 68 65 20 62 65 73 74  termine the best
1f8b0 20 6c 6f 63 6b 69 6e 67 20 73 74 72 61 74 65 67   locking strateg
1f8c0 79 20 0a 2a 2a 20 66 6f 72 20 74 68 65 20 64 61  y .** for the da
1f8d0 74 61 62 61 73 65 20 66 69 6c 65 20 22 66 69 6c  tabase file "fil
1f8e0 65 50 61 74 68 22 2e 20 20 49 74 20 74 68 65 6e  ePath".  It then
1f8f0 20 72 65 74 75 72 6e 73 20 74 68 65 20 73 71 6c   returns the sql
1f900 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 0a  ite3_io_methods.
1f910 2a 2a 20 6f 62 6a 65 63 74 20 74 68 61 74 20 69  ** object that i
1f920 6d 70 6c 65 6d 65 6e 74 73 20 74 68 61 74 20 73  mplements that s
1f930 74 72 61 74 65 67 79 2e 0a 2a 2a 0a 2a 2a 20 54  trategy..**.** T
1f940 68 69 73 20 69 73 20 66 6f 72 20 4d 61 63 4f 53  his is for MacOS
1f950 58 20 6f 6e 6c 79 2e 0a 2a 2f 0a 73 74 61 74 69  X only..*/.stati
1f960 63 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f  c const sqlite3_
1f970 69 6f 5f 6d 65 74 68 6f 64 73 20 2a 61 75 74 6f  io_methods *auto
1f980 6c 6f 63 6b 49 6f 46 69 6e 64 65 72 49 6d 70 6c  lockIoFinderImpl
1f990 28 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  (.  const char *
1f9a0 66 69 6c 65 50 61 74 68 2c 20 20 20 20 2f 2a 20  filePath,    /* 
1f9b0 6e 61 6d 65 20 6f 66 20 74 68 65 20 64 61 74 61  name of the data
1f9c0 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 75  base file */.  u
1f9d0 6e 69 78 46 69 6c 65 20 2a 70 4e 65 77 20 20 20  nixFile *pNew   
1f9e0 20 20 20 20 20 20 20 20 2f 2a 20 6f 70 65 6e 20          /* open 
1f9f0 66 69 6c 65 20 6f 62 6a 65 63 74 20 66 6f 72 20  file object for 
1fa00 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
1fa10 65 20 2a 2f 0a 29 7b 0a 20 20 73 74 61 74 69 63  e */.){.  static
1fa20 20 63 6f 6e 73 74 20 73 74 72 75 63 74 20 4d 61   const struct Ma
1fa30 70 70 69 6e 67 20 7b 0a 20 20 20 20 63 6f 6e 73  pping {.    cons
1fa40 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 73 79 73  t char *zFilesys
1fa50 74 65 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20  tem;            
1fa60 20 20 2f 2a 20 46 69 6c 65 73 79 73 74 65 6d 20    /* Filesystem 
1fa70 74 79 70 65 20 6e 61 6d 65 20 2a 2f 0a 20 20 20  type name */.   
1fa80 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 69   const sqlite3_i
1fa90 6f 5f 6d 65 74 68 6f 64 73 20 2a 70 4d 65 74 68  o_methods *pMeth
1faa0 6f 64 73 3b 20 20 20 2f 2a 20 41 70 70 72 6f 70  ods;   /* Approp
1fab0 72 69 61 74 65 20 6c 6f 63 6b 69 6e 67 20 6d 65  riate locking me
1fac0 74 68 6f 64 20 2a 2f 0a 20 20 7d 20 61 4d 61 70  thod */.  } aMap
1fad0 5b 5d 20 3d 20 7b 0a 20 20 20 20 7b 20 22 68 66  [] = {.    { "hf
1fae0 73 22 2c 20 20 20 20 26 70 6f 73 69 78 49 6f 4d  s",    &posixIoM
1faf0 65 74 68 6f 64 73 20 7d 2c 0a 20 20 20 20 7b 20  ethods },.    { 
1fb00 22 75 66 73 22 2c 20 20 20 20 26 70 6f 73 69 78  "ufs",    &posix
1fb10 49 6f 4d 65 74 68 6f 64 73 20 7d 2c 0a 20 20 20  IoMethods },.   
1fb20 20 7b 20 22 61 66 70 66 73 22 2c 20 20 26 61 66   { "afpfs",  &af
1fb30 70 49 6f 4d 65 74 68 6f 64 73 20 7d 2c 0a 20 20  pIoMethods },.  
1fb40 20 20 7b 20 22 73 6d 62 66 73 22 2c 20 20 26 61    { "smbfs",  &a
1fb50 66 70 49 6f 4d 65 74 68 6f 64 73 20 7d 2c 0a 20  fpIoMethods },. 
1fb60 20 20 20 7b 20 22 77 65 62 64 61 76 22 2c 20 26     { "webdav", &
1fb70 6e 6f 6c 6f 63 6b 49 6f 4d 65 74 68 6f 64 73 20  nolockIoMethods 
1fb80 7d 2c 0a 20 20 20 20 7b 20 30 2c 20 30 20 7d 0a  },.    { 0, 0 }.
1fb90 20 20 7d 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20    };.  int i;.  
1fba0 73 74 72 75 63 74 20 73 74 61 74 66 73 20 66 73  struct statfs fs
1fbb0 49 6e 66 6f 3b 0a 20 20 73 74 72 75 63 74 20 66  Info;.  struct f
1fbc0 6c 6f 63 6b 20 6c 6f 63 6b 49 6e 66 6f 3b 0a 0a  lock lockInfo;..
1fbd0 20 20 69 66 28 20 21 66 69 6c 65 50 61 74 68 20    if( !filePath 
1fbe0 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 66 69 6c  ){.    /* If fil
1fbf0 65 50 61 74 68 3d 3d 4e 55 4c 4c 20 74 68 61 74  ePath==NULL that
1fc00 20 6d 65 61 6e 73 20 77 65 20 61 72 65 20 64 65   means we are de
1fc10 61 6c 69 6e 67 20 77 69 74 68 20 61 20 74 72 61  aling with a tra
1fc20 6e 73 69 65 6e 74 20 66 69 6c 65 0a 20 20 20 20  nsient file.    
1fc30 2a 2a 20 74 68 61 74 20 64 6f 65 73 20 6e 6f 74  ** that does not
1fc40 20 6e 65 65 64 20 74 6f 20 62 65 20 6c 6f 63 6b   need to be lock
1fc50 65 64 2e 20 2a 2f 0a 20 20 20 20 72 65 74 75 72  ed. */.    retur
1fc60 6e 20 26 6e 6f 6c 6f 63 6b 49 6f 4d 65 74 68 6f  n &nolockIoMetho
1fc70 64 73 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73 74  ds;.  }.  if( st
1fc80 61 74 66 73 28 66 69 6c 65 50 61 74 68 2c 20 26  atfs(filePath, &
1fc90 66 73 49 6e 66 6f 29 20 21 3d 20 2d 31 20 29 7b  fsInfo) != -1 ){
1fca0 0a 20 20 20 20 69 66 28 20 66 73 49 6e 66 6f 2e  .    if( fsInfo.
1fcb0 66 5f 66 6c 61 67 73 20 26 20 4d 4e 54 5f 52 44  f_flags & MNT_RD
1fcc0 4f 4e 4c 59 20 29 7b 0a 20 20 20 20 20 20 72 65  ONLY ){.      re
1fcd0 74 75 72 6e 20 26 6e 6f 6c 6f 63 6b 49 6f 4d 65  turn &nolockIoMe
1fce0 74 68 6f 64 73 3b 0a 20 20 20 20 7d 0a 20 20 20  thods;.    }.   
1fcf0 20 66 6f 72 28 69 3d 30 3b 20 61 4d 61 70 5b 69   for(i=0; aMap[i
1fd00 5d 2e 7a 46 69 6c 65 73 79 73 74 65 6d 3b 20 69  ].zFilesystem; i
1fd10 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73  ++){.      if( s
1fd20 74 72 63 6d 70 28 66 73 49 6e 66 6f 2e 66 5f 66  trcmp(fsInfo.f_f
1fd30 73 74 79 70 65 6e 61 6d 65 2c 20 61 4d 61 70 5b  stypename, aMap[
1fd40 69 5d 2e 7a 46 69 6c 65 73 79 73 74 65 6d 29 3d  i].zFilesystem)=
1fd50 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65  =0 ){.        re
1fd60 74 75 72 6e 20 61 4d 61 70 5b 69 5d 2e 70 4d 65  turn aMap[i].pMe
1fd70 74 68 6f 64 73 3b 0a 20 20 20 20 20 20 7d 0a 20  thods;.      }. 
1fd80 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 44     }.  }..  /* D
1fd90 65 66 61 75 6c 74 20 63 61 73 65 2e 20 48 61 6e  efault case. Han
1fda0 64 6c 65 73 2c 20 61 6d 6f 6e 67 73 74 20 6f 74  dles, amongst ot
1fdb0 68 65 72 73 2c 20 22 6e 66 73 22 2e 0a 20 20 2a  hers, "nfs"..  *
1fdc0 2a 20 54 65 73 74 20 62 79 74 65 2d 72 61 6e 67  * Test byte-rang
1fdd0 65 20 6c 6f 63 6b 20 75 73 69 6e 67 20 66 63 6e  e lock using fcn
1fde0 74 6c 28 29 2e 20 49 66 20 74 68 65 20 63 61 6c  tl(). If the cal
1fdf0 6c 20 73 75 63 63 65 65 64 73 2c 20 0a 20 20 2a  l succeeds, .  *
1fe00 2a 20 61 73 73 75 6d 65 20 74 68 61 74 20 74 68  * assume that th
1fe10 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 73 75  e file-system su
1fe20 70 70 6f 72 74 73 20 50 4f 53 49 58 20 73 74 79  pports POSIX sty
1fe30 6c 65 20 6c 6f 63 6b 73 2e 20 0a 20 20 2a 2f 0a  le locks. .  */.
1fe40 20 20 6c 6f 63 6b 49 6e 66 6f 2e 6c 5f 6c 65 6e    lockInfo.l_len
1fe50 20 3d 20 31 3b 0a 20 20 6c 6f 63 6b 49 6e 66 6f   = 1;.  lockInfo
1fe60 2e 6c 5f 73 74 61 72 74 20 3d 20 30 3b 0a 20 20  .l_start = 0;.  
1fe70 6c 6f 63 6b 49 6e 66 6f 2e 6c 5f 77 68 65 6e 63  lockInfo.l_whenc
1fe80 65 20 3d 20 53 45 45 4b 5f 53 45 54 3b 0a 20 20  e = SEEK_SET;.  
1fe90 6c 6f 63 6b 49 6e 66 6f 2e 6c 5f 74 79 70 65 20  lockInfo.l_type 
1fea0 3d 20 46 5f 52 44 4c 43 4b 3b 0a 20 20 69 66 28  = F_RDLCK;.  if(
1feb0 20 66 63 6e 74 6c 28 70 4e 65 77 2d 3e 68 2c 20   fcntl(pNew->h, 
1fec0 46 5f 47 45 54 4c 4b 2c 20 26 6c 6f 63 6b 49 6e  F_GETLK, &lockIn
1fed0 66 6f 29 21 3d 2d 31 20 29 20 7b 0a 20 20 20 20  fo)!=-1 ) {.    
1fee0 69 66 28 20 73 74 72 63 6d 70 28 66 73 49 6e 66  if( strcmp(fsInf
1fef0 6f 2e 66 5f 66 73 74 79 70 65 6e 61 6d 65 2c 20  o.f_fstypename, 
1ff00 22 6e 66 73 22 29 3d 3d 30 20 29 7b 0a 20 20 20  "nfs")==0 ){.   
1ff10 20 20 20 72 65 74 75 72 6e 20 26 6e 66 73 49 6f     return &nfsIo
1ff20 4d 65 74 68 6f 64 73 3b 0a 20 20 20 20 7d 20 65  Methods;.    } e
1ff30 6c 73 65 20 7b 0a 20 20 20 20 20 20 72 65 74 75  lse {.      retu
1ff40 72 6e 20 26 70 6f 73 69 78 49 6f 4d 65 74 68 6f  rn &posixIoMetho
1ff50 64 73 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73  ds;.    }.  }els
1ff60 65 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 26 64  e{.    return &d
1ff70 6f 74 6c 6f 63 6b 49 6f 4d 65 74 68 6f 64 73 3b  otlockIoMethods;
1ff80 0a 20 20 7d 0a 7d 0a 73 74 61 74 69 63 20 63 6f  .  }.}.static co
1ff90 6e 73 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d  nst sqlite3_io_m
1ffa0 65 74 68 6f 64 73 20 0a 20 20 2a 28 2a 63 6f 6e  ethods .  *(*con
1ffb0 73 74 20 61 75 74 6f 6c 6f 63 6b 49 6f 46 69 6e  st autolockIoFin
1ffc0 64 65 72 29 28 63 6f 6e 73 74 20 63 68 61 72 2a  der)(const char*
1ffd0 2c 75 6e 69 78 46 69 6c 65 2a 29 20 3d 20 61 75  ,unixFile*) = au
1ffe0 74 6f 6c 6f 63 6b 49 6f 46 69 6e 64 65 72 49 6d  tolockIoFinderIm
1fff0 70 6c 3b 0a 0a 23 65 6e 64 69 66 20 2f 2a 20 64  pl;..#endif /* d
20000 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f  efined(__APPLE__
20010 29 20 26 26 20 53 51 4c 49 54 45 5f 45 4e 41 42  ) && SQLITE_ENAB
20020 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45  LE_LOCKING_STYLE
20030 20 2a 2f 0a 0a 23 69 66 20 4f 53 5f 56 58 57 4f   */..#if OS_VXWO
20040 52 4b 53 20 26 26 20 53 51 4c 49 54 45 5f 45 4e  RKS && SQLITE_EN
20050 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59  ABLE_LOCKING_STY
20060 4c 45 0a 2f 2a 20 0a 2a 2a 20 54 68 69 73 20 22  LE./* .** This "
20070 66 69 6e 64 65 72 22 20 66 75 6e 63 74 69 6f 6e  finder" function
20080 20 61 74 74 65 6d 70 74 73 20 74 6f 20 64 65 74   attempts to det
20090 65 72 6d 69 6e 65 20 74 68 65 20 62 65 73 74 20  ermine the best 
200a0 6c 6f 63 6b 69 6e 67 20 73 74 72 61 74 65 67 79  locking strategy
200b0 20 0a 2a 2a 20 66 6f 72 20 74 68 65 20 64 61 74   .** for the dat
200c0 61 62 61 73 65 20 66 69 6c 65 20 22 66 69 6c 65  abase file "file
200d0 50 61 74 68 22 2e 20 20 49 74 20 74 68 65 6e 20  Path".  It then 
200e0 72 65 74 75 72 6e 73 20 74 68 65 20 73 71 6c 69  returns the sqli
200f0 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 0a 2a  te3_io_methods.*
20100 2a 20 6f 62 6a 65 63 74 20 74 68 61 74 20 69 6d  * object that im
20110 70 6c 65 6d 65 6e 74 73 20 74 68 61 74 20 73 74  plements that st
20120 72 61 74 65 67 79 2e 0a 2a 2a 0a 2a 2a 20 54 68  rategy..**.** Th
20130 69 73 20 69 73 20 66 6f 72 20 56 58 57 6f 72 6b  is is for VXWork
20140 73 20 6f 6e 6c 79 2e 0a 2a 2f 0a 73 74 61 74 69  s only..*/.stati
20150 63 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f  c const sqlite3_
20160 69 6f 5f 6d 65 74 68 6f 64 73 20 2a 61 75 74 6f  io_methods *auto
20170 6c 6f 63 6b 49 6f 46 69 6e 64 65 72 49 6d 70 6c  lockIoFinderImpl
20180 28 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  (.  const char *
20190 66 69 6c 65 50 61 74 68 2c 20 20 20 20 2f 2a 20  filePath,    /* 
201a0 6e 61 6d 65 20 6f 66 20 74 68 65 20 64 61 74 61  name of the data
201b0 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 75  base file */.  u
201c0 6e 69 78 46 69 6c 65 20 2a 70 4e 65 77 20 20 20  nixFile *pNew   
201d0 20 20 20 20 20 20 20 20 2f 2a 20 74 68 65 20 6f          /* the o
201e0 70 65 6e 20 66 69 6c 65 20 6f 62 6a 65 63 74 20  pen file object 
201f0 2a 2f 0a 29 7b 0a 20 20 73 74 72 75 63 74 20 66  */.){.  struct f
20200 6c 6f 63 6b 20 6c 6f 63 6b 49 6e 66 6f 3b 0a 0a  lock lockInfo;..
20210 20 20 69 66 28 20 21 66 69 6c 65 50 61 74 68 20    if( !filePath 
20220 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 66 69 6c  ){.    /* If fil
20230 65 50 61 74 68 3d 3d 4e 55 4c 4c 20 74 68 61 74  ePath==NULL that
20240 20 6d 65 61 6e 73 20 77 65 20 61 72 65 20 64 65   means we are de
20250 61 6c 69 6e 67 20 77 69 74 68 20 61 20 74 72 61  aling with a tra
20260 6e 73 69 65 6e 74 20 66 69 6c 65 0a 20 20 20 20  nsient file.    
20270 2a 2a 20 74 68 61 74 20 64 6f 65 73 20 6e 6f 74  ** that does not
20280 20 6e 65 65 64 20 74 6f 20 62 65 20 6c 6f 63 6b   need to be lock
20290 65 64 2e 20 2a 2f 0a 20 20 20 20 72 65 74 75 72  ed. */.    retur
202a0 6e 20 26 6e 6f 6c 6f 63 6b 49 6f 4d 65 74 68 6f  n &nolockIoMetho
202b0 64 73 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 65  ds;.  }..  /* Te
202c0 73 74 20 69 66 20 66 63 6e 74 6c 28 29 20 69 73  st if fcntl() is
202d0 20 73 75 70 70 6f 72 74 65 64 20 61 6e 64 20 75   supported and u
202e0 73 65 20 50 4f 53 49 58 20 73 74 79 6c 65 20 6c  se POSIX style l
202f0 6f 63 6b 73 2e 0a 20 20 2a 2a 20 4f 74 68 65 72  ocks..  ** Other
20300 77 69 73 65 20 66 61 6c 6c 20 62 61 63 6b 20 74  wise fall back t
20310 6f 20 74 68 65 20 6e 61 6d 65 64 20 73 65 6d 61  o the named sema
20320 70 68 6f 72 65 20 6d 65 74 68 6f 64 2e 0a 20 20  phore method..  
20330 2a 2f 0a 20 20 6c 6f 63 6b 49 6e 66 6f 2e 6c 5f  */.  lockInfo.l_
20340 6c 65 6e 20 3d 20 31 3b 0a 20 20 6c 6f 63 6b 49  len = 1;.  lockI
20350 6e 66 6f 2e 6c 5f 73 74 61 72 74 20 3d 20 30 3b  nfo.l_start = 0;
20360 0a 20 20 6c 6f 63 6b 49 6e 66 6f 2e 6c 5f 77 68  .  lockInfo.l_wh
20370 65 6e 63 65 20 3d 20 53 45 45 4b 5f 53 45 54 3b  ence = SEEK_SET;
20380 0a 20 20 6c 6f 63 6b 49 6e 66 6f 2e 6c 5f 74 79  .  lockInfo.l_ty
20390 70 65 20 3d 20 46 5f 52 44 4c 43 4b 3b 0a 20 20  pe = F_RDLCK;.  
203a0 69 66 28 20 66 63 6e 74 6c 28 70 4e 65 77 2d 3e  if( fcntl(pNew->
203b0 68 2c 20 46 5f 47 45 54 4c 4b 2c 20 26 6c 6f 63  h, F_GETLK, &loc
203c0 6b 49 6e 66 6f 29 21 3d 2d 31 20 29 20 7b 0a 20  kInfo)!=-1 ) {. 
203d0 20 20 20 72 65 74 75 72 6e 20 26 70 6f 73 69 78     return &posix
203e0 49 6f 4d 65 74 68 6f 64 73 3b 0a 20 20 7d 65 6c  IoMethods;.  }el
203f0 73 65 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 26  se{.    return &
20400 73 65 6d 49 6f 4d 65 74 68 6f 64 73 3b 0a 20 20  semIoMethods;.  
20410 7d 0a 7d 0a 73 74 61 74 69 63 20 63 6f 6e 73 74  }.}.static const
20420 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68   sqlite3_io_meth
20430 6f 64 73 20 0a 20 20 2a 28 2a 63 6f 6e 73 74 20  ods .  *(*const 
20440 61 75 74 6f 6c 6f 63 6b 49 6f 46 69 6e 64 65 72  autolockIoFinder
20450 29 28 63 6f 6e 73 74 20 63 68 61 72 2a 2c 75 6e  )(const char*,un
20460 69 78 46 69 6c 65 2a 29 20 3d 20 61 75 74 6f 6c  ixFile*) = autol
20470 6f 63 6b 49 6f 46 69 6e 64 65 72 49 6d 70 6c 3b  ockIoFinderImpl;
20480 0a 0a 23 65 6e 64 69 66 20 2f 2a 20 4f 53 5f 56  ..#endif /* OS_V
20490 58 57 4f 52 4b 53 20 26 26 20 53 51 4c 49 54 45  XWORKS && SQLITE
204a0 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f  _ENABLE_LOCKING_
204b0 53 54 59 4c 45 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  STYLE */../*.** 
204c0 41 6e 20 61 62 73 74 72 61 63 74 20 74 79 70 65  An abstract type
204d0 20 66 6f 72 20 61 20 70 6f 69 6e 74 65 72 20 74   for a pointer t
204e0 6f 20 61 20 49 4f 20 6d 65 74 68 6f 64 20 66 69  o a IO method fi
204f0 6e 64 65 72 20 66 75 6e 63 74 69 6f 6e 3a 0a 2a  nder function:.*
20500 2f 0a 74 79 70 65 64 65 66 20 63 6f 6e 73 74 20  /.typedef const 
20510 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f  sqlite3_io_metho
20520 64 73 20 2a 28 2a 66 69 6e 64 65 72 5f 74 79 70  ds *(*finder_typ
20530 65 29 28 63 6f 6e 73 74 20 63 68 61 72 2a 2c 75  e)(const char*,u
20540 6e 69 78 46 69 6c 65 2a 29 3b 0a 0a 0a 2f 2a 2a  nixFile*);.../**
20550 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
20560 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
20570 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
20580 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
20590 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a  **********.*****
205a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
205b0 2a 2a 2a 2a 2a 2a 2a 20 73 71 6c 69 74 65 33 5f  ******* sqlite3_
205c0 76 66 73 20 6d 65 74 68 6f 64 73 20 2a 2a 2a 2a  vfs methods ****
205d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
205e0 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 54  ********.**.** T
205f0 68 69 73 20 64 69 76 69 73 69 6f 6e 20 63 6f 6e  his division con
20600 74 61 69 6e 73 20 74 68 65 20 69 6d 70 6c 65 6d  tains the implem
20610 65 6e 74 61 74 69 6f 6e 20 6f 66 20 6d 65 74 68  entation of meth
20620 6f 64 73 20 6f 6e 20 74 68 65 0a 2a 2a 20 73 71  ods on the.** sq
20630 6c 69 74 65 33 5f 76 66 73 20 6f 62 6a 65 63 74  lite3_vfs object
20640 2e 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74  ..*/../*.** Init
20650 69 61 6c 69 7a 65 20 74 68 65 20 63 6f 6e 74 65  ialize the conte
20660 6e 74 73 20 6f 66 20 74 68 65 20 75 6e 69 78 46  nts of the unixF
20670 69 6c 65 20 73 74 72 75 63 74 75 72 65 20 70 6f  ile structure po
20680 69 6e 74 65 64 20 74 6f 20 62 79 20 70 49 64 2e  inted to by pId.
20690 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66  .*/.static int f
206a0 69 6c 6c 49 6e 55 6e 69 78 46 69 6c 65 28 0a 20  illInUnixFile(. 
206b0 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56   sqlite3_vfs *pV
206c0 66 73 2c 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e  fs,      /* Poin
206d0 74 65 72 20 74 6f 20 76 66 73 20 6f 62 6a 65 63  ter to vfs objec
206e0 74 20 2a 2f 0a 20 20 69 6e 74 20 68 2c 20 20 20  t */.  int h,   
206f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
20700 2a 20 4f 70 65 6e 20 66 69 6c 65 20 64 65 73 63  * Open file desc
20710 72 69 70 74 6f 72 20 6f 66 20 66 69 6c 65 20 62  riptor of file b
20720 65 69 6e 67 20 6f 70 65 6e 65 64 20 2a 2f 0a 20  eing opened */. 
20730 20 69 6e 74 20 64 69 72 66 64 2c 20 20 20 20 20   int dirfd,     
20740 20 20 20 20 20 20 20 20 20 2f 2a 20 44 69 72 65           /* Dire
20750 63 74 6f 72 79 20 66 69 6c 65 20 64 65 73 63 72  ctory file descr
20760 69 70 74 6f 72 20 2a 2f 0a 20 20 73 71 6c 69 74  iptor */.  sqlit
20770 65 33 5f 66 69 6c 65 20 2a 70 49 64 2c 20 20 20  e3_file *pId,   
20780 20 20 20 2f 2a 20 57 72 69 74 65 20 74 6f 20 74     /* Write to t
20790 68 65 20 75 6e 69 78 46 69 6c 65 20 73 74 72 75  he unixFile stru
207a0 63 74 75 72 65 20 68 65 72 65 20 2a 2f 0a 20 20  cture here */.  
207b0 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c  const char *zFil
207c0 65 6e 61 6d 65 2c 20 20 2f 2a 20 4e 61 6d 65 20  ename,  /* Name 
207d0 6f 66 20 74 68 65 20 66 69 6c 65 20 62 65 69 6e  of the file bein
207e0 67 20 6f 70 65 6e 65 64 20 2a 2f 0a 20 20 69 6e  g opened */.  in
207f0 74 20 6e 6f 4c 6f 63 6b 2c 20 20 20 20 20 20 20  t noLock,       
20800 20 20 20 20 20 20 2f 2a 20 4f 6d 69 74 20 6c 6f        /* Omit lo
20810 63 6b 69 6e 67 20 69 66 20 74 72 75 65 20 2a 2f  cking if true */
20820 0a 20 20 69 6e 74 20 69 73 44 65 6c 65 74 65 20  .  int isDelete 
20830 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 65             /* De
20840 6c 65 74 65 20 6f 6e 20 63 6c 6f 73 65 20 69 66  lete on close if
20850 20 74 72 75 65 20 2a 2f 0a 29 7b 0a 20 20 63 6f   true */.){.  co
20860 6e 73 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d  nst sqlite3_io_m
20870 65 74 68 6f 64 73 20 2a 70 4c 6f 63 6b 69 6e 67  ethods *pLocking
20880 53 74 79 6c 65 3b 0a 20 20 75 6e 69 78 46 69 6c  Style;.  unixFil
20890 65 20 2a 70 4e 65 77 20 3d 20 28 75 6e 69 78 46  e *pNew = (unixF
208a0 69 6c 65 20 2a 29 70 49 64 3b 0a 20 20 69 6e 74  ile *)pId;.  int
208b0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
208c0 0a 0a 20 20 61 73 73 65 72 74 28 20 70 4e 65 77  ..  assert( pNew
208d0 2d 3e 70 49 6e 6f 64 65 3d 3d 4e 55 4c 4c 20 29  ->pInode==NULL )
208e0 3b 0a 0a 20 20 2f 2a 20 50 61 72 61 6d 65 74 65  ;..  /* Paramete
208f0 72 20 69 73 44 65 6c 65 74 65 20 69 73 20 6f 6e  r isDelete is on
20900 6c 79 20 75 73 65 64 20 6f 6e 20 76 78 77 6f 72  ly used on vxwor
20910 6b 73 2e 20 45 78 70 72 65 73 73 20 74 68 69 73  ks. Express this
20920 20 65 78 70 6c 69 63 69 74 6c 79 20 0a 20 20 2a   explicitly .  *
20930 2a 20 68 65 72 65 20 74 6f 20 70 72 65 76 65 6e  * here to preven
20940 74 20 63 6f 6d 70 69 6c 65 72 20 77 61 72 6e 69  t compiler warni
20950 6e 67 73 20 61 62 6f 75 74 20 75 6e 75 73 65 64  ngs about unused
20960 20 70 61 72 61 6d 65 74 65 72 73 2e 0a 20 20 2a   parameters..  *
20970 2f 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  /.  UNUSED_PARAM
20980 45 54 45 52 28 69 73 44 65 6c 65 74 65 29 3b 0a  ETER(isDelete);.
20990 0a 20 20 4f 53 54 52 41 43 45 28 28 22 4f 50 45  .  OSTRACE(("OPE
209a0 4e 20 20 20 20 25 2d 33 64 20 25 73 5c 6e 22 2c  N    %-3d %s\n",
209b0 20 68 2c 20 7a 46 69 6c 65 6e 61 6d 65 29 29 3b   h, zFilename));
209c0 0a 20 20 70 4e 65 77 2d 3e 68 20 3d 20 68 3b 0a  .  pNew->h = h;.
209d0 20 20 70 4e 65 77 2d 3e 64 69 72 66 64 20 3d 20    pNew->dirfd = 
209e0 64 69 72 66 64 3b 0a 20 20 70 4e 65 77 2d 3e 66  dirfd;.  pNew->f
209f0 69 6c 65 46 6c 61 67 73 20 3d 20 30 3b 0a 20 20  ileFlags = 0;.  
20a00 61 73 73 65 72 74 28 20 7a 46 69 6c 65 6e 61 6d  assert( zFilenam
20a10 65 3d 3d 30 20 7c 7c 20 7a 46 69 6c 65 6e 61 6d  e==0 || zFilenam
20a20 65 5b 30 5d 3d 3d 27 2f 27 20 29 3b 20 20 2f 2a  e[0]=='/' );  /*
20a30 20 4e 65 76 65 72 20 61 20 72 65 6c 61 74 69 76   Never a relativ
20a40 65 20 70 61 74 68 6e 61 6d 65 20 2a 2f 0a 20 20  e pathname */.  
20a50 70 4e 65 77 2d 3e 7a 50 61 74 68 20 3d 20 7a 46  pNew->zPath = zF
20a60 69 6c 65 6e 61 6d 65 3b 0a 0a 23 69 66 20 4f 53  ilename;..#if OS
20a70 5f 56 58 57 4f 52 4b 53 0a 20 20 70 4e 65 77 2d  _VXWORKS.  pNew-
20a80 3e 70 49 64 20 3d 20 76 78 77 6f 72 6b 73 46 69  >pId = vxworksFi
20a90 6e 64 46 69 6c 65 49 64 28 7a 46 69 6c 65 6e 61  ndFileId(zFilena
20aa0 6d 65 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 2d  me);.  if( pNew-
20ab0 3e 70 49 64 3d 3d 30 20 29 7b 0a 20 20 20 20 6e  >pId==0 ){.    n
20ac0 6f 4c 6f 63 6b 20 3d 20 31 3b 0a 20 20 20 20 72  oLock = 1;.    r
20ad0 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  c = SQLITE_NOMEM
20ae0 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20  ;.  }.#endif..  
20af0 69 66 28 20 6e 6f 4c 6f 63 6b 20 29 7b 0a 20 20  if( noLock ){.  
20b00 20 20 70 4c 6f 63 6b 69 6e 67 53 74 79 6c 65 20    pLockingStyle 
20b10 3d 20 26 6e 6f 6c 6f 63 6b 49 6f 4d 65 74 68 6f  = &nolockIoMetho
20b20 64 73 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ds;.  }else{.   
20b30 20 70 4c 6f 63 6b 69 6e 67 53 74 79 6c 65 20 3d   pLockingStyle =
20b40 20 28 2a 2a 28 66 69 6e 64 65 72 5f 74 79 70 65   (**(finder_type
20b50 2a 29 70 56 66 73 2d 3e 70 41 70 70 44 61 74 61  *)pVfs->pAppData
20b60 29 28 7a 46 69 6c 65 6e 61 6d 65 2c 20 70 4e 65  )(zFilename, pNe
20b70 77 29 3b 0a 23 69 66 20 53 51 4c 49 54 45 5f 45  w);.#if SQLITE_E
20b80 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54  NABLE_LOCKING_ST
20b90 59 4c 45 0a 20 20 20 20 2f 2a 20 43 61 63 68 65  YLE.    /* Cache
20ba0 20 7a 46 69 6c 65 6e 61 6d 65 20 69 6e 20 74 68   zFilename in th
20bb0 65 20 6c 6f 63 6b 69 6e 67 20 63 6f 6e 74 65 78  e locking contex
20bc0 74 20 28 41 46 50 20 61 6e 64 20 64 6f 74 6c 6f  t (AFP and dotlo
20bd0 63 6b 20 6f 76 65 72 72 69 64 65 29 20 66 6f 72  ck override) for
20be0 0a 20 20 20 20 2a 2a 20 70 72 6f 78 79 4c 6f 63  .    ** proxyLoc
20bf0 6b 20 61 63 74 69 76 61 74 69 6f 6e 20 69 73 20  k activation is 
20c00 70 6f 73 73 69 62 6c 65 20 28 72 65 6d 6f 74 65  possible (remote
20c10 20 70 72 6f 78 79 20 69 73 20 62 61 73 65 64 20   proxy is based 
20c20 6f 6e 20 64 62 20 6e 61 6d 65 29 0a 20 20 20 20  on db name).    
20c30 2a 2a 20 7a 46 69 6c 65 6e 61 6d 65 20 72 65 6d  ** zFilename rem
20c40 61 69 6e 73 20 76 61 6c 69 64 20 75 6e 74 69 6c  ains valid until
20c50 20 66 69 6c 65 20 69 73 20 63 6c 6f 73 65 64 2c   file is closed,
20c60 20 74 6f 20 73 75 70 70 6f 72 74 20 2a 2f 0a 20   to support */. 
20c70 20 20 20 70 4e 65 77 2d 3e 6c 6f 63 6b 69 6e 67     pNew->locking
20c80 43 6f 6e 74 65 78 74 20 3d 20 28 76 6f 69 64 2a  Context = (void*
20c90 29 7a 46 69 6c 65 6e 61 6d 65 3b 0a 23 65 6e 64  )zFilename;.#end
20ca0 69 66 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 4c  if.  }..  if( pL
20cb0 6f 63 6b 69 6e 67 53 74 79 6c 65 20 3d 3d 20 26  ockingStyle == &
20cc0 70 6f 73 69 78 49 6f 4d 65 74 68 6f 64 73 0a 23  posixIoMethods.#
20cd0 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50  if defined(__APP
20ce0 4c 45 5f 5f 29 20 26 26 20 53 51 4c 49 54 45 5f  LE__) && SQLITE_
20cf0 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53  ENABLE_LOCKING_S
20d00 54 59 4c 45 0a 20 20 20 20 7c 7c 20 70 4c 6f 63  TYLE.    || pLoc
20d10 6b 69 6e 67 53 74 79 6c 65 20 3d 3d 20 26 6e 66  kingStyle == &nf
20d20 73 49 6f 4d 65 74 68 6f 64 73 0a 23 65 6e 64 69  sIoMethods.#endi
20d30 66 0a 20 20 29 7b 0a 20 20 20 20 75 6e 69 78 45  f.  ){.    unixE
20d40 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 20 20 20  nterMutex();.   
20d50 20 72 63 20 3d 20 66 69 6e 64 49 6e 6f 64 65 49   rc = findInodeI
20d60 6e 66 6f 28 70 4e 65 77 2c 20 26 70 4e 65 77 2d  nfo(pNew, &pNew-
20d70 3e 70 49 6e 6f 64 65 29 3b 0a 20 20 20 20 69 66  >pInode);.    if
20d80 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
20d90 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 61  ){.      /* If a
20da0 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 65 64 20  n error occured 
20db0 69 6e 20 66 69 6e 64 49 6e 6f 64 65 49 6e 66 6f  in findInodeInfo
20dc0 28 29 2c 20 63 6c 6f 73 65 20 74 68 65 20 66 69  (), close the fi
20dd0 6c 65 20 64 65 73 63 72 69 70 74 6f 72 0a 20 20  le descriptor.  
20de0 20 20 20 20 2a 2a 20 69 6d 6d 65 64 69 61 74 65      ** immediate
20df0 6c 79 2c 20 62 65 66 6f 72 65 20 72 65 6c 65 61  ly, before relea
20e00 73 69 6e 67 20 74 68 65 20 6d 75 74 65 78 2e 20  sing the mutex. 
20e10 66 69 6e 64 49 6e 6f 64 65 49 6e 66 6f 28 29 20  findInodeInfo() 
20e20 6d 61 79 20 66 61 69 6c 0a 20 20 20 20 20 20 2a  may fail.      *
20e30 2a 20 69 6e 20 74 77 6f 20 73 63 65 6e 61 72 69  * in two scenari
20e40 6f 73 3a 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20  os:.      **.   
20e50 20 20 20 2a 2a 20 20 20 28 61 29 20 41 20 63 61     **   (a) A ca
20e60 6c 6c 20 74 6f 20 66 73 74 61 74 28 29 20 66 61  ll to fstat() fa
20e70 69 6c 65 64 2e 0a 20 20 20 20 20 20 2a 2a 20 20  iled..      **  
20e80 20 28 62 29 20 41 20 6d 61 6c 6c 6f 63 20 66 61   (b) A malloc fa
20e90 69 6c 65 64 2e 0a 20 20 20 20 20 20 2a 2a 0a 20  iled..      **. 
20ea0 20 20 20 20 20 2a 2a 20 53 63 65 6e 61 72 69 6f       ** Scenario
20eb0 20 28 62 29 20 6d 61 79 20 6f 6e 6c 79 20 6f 63   (b) may only oc
20ec0 63 75 72 20 69 66 20 74 68 65 20 70 72 6f 63 65  cur if the proce
20ed0 73 73 20 69 73 20 68 6f 6c 64 69 6e 67 20 6e 6f  ss is holding no
20ee0 20 6f 74 68 65 72 0a 20 20 20 20 20 20 2a 2a 20   other.      ** 
20ef0 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 73  file descriptors
20f00 20 6f 70 65 6e 20 6f 6e 20 74 68 65 20 73 61 6d   open on the sam
20f10 65 20 66 69 6c 65 2e 20 49 66 20 74 68 65 72 65  e file. If there
20f20 20 77 65 72 65 20 6f 74 68 65 72 20 66 69 6c 65   were other file
20f30 0a 20 20 20 20 20 20 2a 2a 20 64 65 73 63 72 69  .      ** descri
20f40 70 74 6f 72 73 20 6f 6e 20 74 68 69 73 20 66 69  ptors on this fi
20f50 6c 65 2c 20 74 68 65 6e 20 6e 6f 20 6d 61 6c 6c  le, then no mall
20f60 6f 63 20 77 6f 75 6c 64 20 62 65 20 72 65 71 75  oc would be requ
20f70 69 72 65 64 20 62 79 0a 20 20 20 20 20 20 2a 2a  ired by.      **
20f80 20 66 69 6e 64 49 6e 6f 64 65 49 6e 66 6f 28 29   findInodeInfo()
20f90 2e 20 49 66 20 74 68 69 73 20 69 73 20 74 68 65  . If this is the
20fa0 20 63 61 73 65 2c 20 69 74 20 69 73 20 71 75 69   case, it is qui
20fb0 74 65 20 73 61 66 65 20 74 6f 20 63 6c 6f 73 65  te safe to close
20fc0 0a 20 20 20 20 20 20 2a 2a 20 68 61 6e 64 6c 65  .      ** handle
20fd0 20 68 20 2d 20 61 73 20 69 74 20 69 73 20 67 75   h - as it is gu
20fe0 61 72 61 6e 74 65 65 64 20 74 68 61 74 20 6e 6f  aranteed that no
20ff0 20 70 6f 73 69 78 20 6c 6f 63 6b 73 20 77 69 6c   posix locks wil
21000 6c 20 62 65 20 72 65 6c 65 61 73 65 64 0a 20 20  l be released.  
21010 20 20 20 20 2a 2a 20 62 79 20 64 6f 69 6e 67 20      ** by doing 
21020 73 6f 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20  so..      **.   
21030 20 20 20 2a 2a 20 49 66 20 73 63 65 6e 61 72 69     ** If scenari
21040 6f 20 28 61 29 20 63 61 75 73 65 64 20 74 68 65  o (a) caused the
21050 20 65 72 72 6f 72 20 74 68 65 6e 20 74 68 69 6e   error then thin
21060 67 73 20 61 72 65 20 6e 6f 74 20 73 6f 20 73 61  gs are not so sa
21070 66 65 2e 20 54 68 65 0a 20 20 20 20 20 20 2a 2a  fe. The.      **
21080 20 69 6d 70 6c 69 63 69 74 20 61 73 73 75 6d 70   implicit assump
21090 74 69 6f 6e 20 68 65 72 65 20 69 73 20 74 68 61  tion here is tha
210a0 74 20 69 66 20 66 73 74 61 74 28 29 20 66 61 69  t if fstat() fai
210b0 6c 73 2c 20 74 68 69 6e 67 73 20 61 72 65 20 69  ls, things are i
210c0 6e 0a 20 20 20 20 20 20 2a 2a 20 73 75 63 68 20  n.      ** such 
210d0 62 61 64 20 73 68 61 70 65 20 74 68 61 74 20 64  bad shape that d
210e0 72 6f 70 70 69 6e 67 20 61 20 6c 6f 63 6b 20 6f  ropping a lock o
210f0 72 20 74 77 6f 20 64 6f 65 73 6e 27 74 20 6d 61  r two doesn't ma
21100 74 74 65 72 20 6d 75 63 68 2e 0a 20 20 20 20 20  tter much..     
21110 20 2a 2f 0a 20 20 20 20 20 20 63 6c 6f 73 65 28   */.      close(
21120 68 29 3b 0a 20 20 20 20 20 20 68 20 3d 20 2d 31  h);.      h = -1
21130 3b 0a 20 20 20 20 7d 0a 20 20 20 20 75 6e 69 78  ;.    }.    unix
21140 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 20 20  LeaveMutex();.  
21150 7d 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 45 4e  }..#if SQLITE_EN
21160 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59  ABLE_LOCKING_STY
21170 4c 45 20 26 26 20 64 65 66 69 6e 65 64 28 5f 5f  LE && defined(__
21180 41 50 50 4c 45 5f 5f 29 0a 20 20 65 6c 73 65 20  APPLE__).  else 
21190 69 66 28 20 70 4c 6f 63 6b 69 6e 67 53 74 79 6c  if( pLockingStyl
211a0 65 20 3d 3d 20 26 61 66 70 49 6f 4d 65 74 68 6f  e == &afpIoMetho
211b0 64 73 20 29 7b 0a 20 20 20 20 2f 2a 20 41 46 50  ds ){.    /* AFP
211c0 20 6c 6f 63 6b 69 6e 67 20 75 73 65 73 20 74 68   locking uses th
211d0 65 20 66 69 6c 65 20 70 61 74 68 20 73 6f 20 69  e file path so i
211e0 74 20 6e 65 65 64 73 20 74 6f 20 62 65 20 69 6e  t needs to be in
211f0 63 6c 75 64 65 64 20 69 6e 0a 20 20 20 20 2a 2a  cluded in.    **
21200 20 74 68 65 20 61 66 70 4c 6f 63 6b 69 6e 67 43   the afpLockingC
21210 6f 6e 74 65 78 74 2e 0a 20 20 20 20 2a 2f 0a 20  ontext..    */. 
21220 20 20 20 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e     afpLockingCon
21230 74 65 78 74 20 2a 70 43 74 78 3b 0a 20 20 20 20  text *pCtx;.    
21240 70 4e 65 77 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e  pNew->lockingCon
21250 74 65 78 74 20 3d 20 70 43 74 78 20 3d 20 73 71  text = pCtx = sq
21260 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 20 73 69  lite3_malloc( si
21270 7a 65 6f 66 28 2a 70 43 74 78 29 20 29 3b 0a 20  zeof(*pCtx) );. 
21280 20 20 20 69 66 28 20 70 43 74 78 3d 3d 30 20 29     if( pCtx==0 )
21290 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  {.      rc = SQL
212a0 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d  ITE_NOMEM;.    }
212b0 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 4e  else{.      /* N
212c0 42 3a 20 7a 46 69 6c 65 6e 61 6d 65 20 65 78 69  B: zFilename exi
212d0 73 74 73 20 61 6e 64 20 72 65 6d 61 69 6e 73 20  sts and remains 
212e0 76 61 6c 69 64 20 75 6e 74 69 6c 20 74 68 65 20  valid until the 
212f0 66 69 6c 65 20 69 73 20 63 6c 6f 73 65 64 0a 20  file is closed. 
21300 20 20 20 20 20 2a 2a 20 61 63 63 6f 72 64 69 6e       ** accordin
21310 67 20 74 6f 20 72 65 71 75 69 72 65 6d 65 6e 74  g to requirement
21320 20 46 31 31 31 34 31 2e 20 20 53 6f 20 77 65 20   F11141.  So we 
21330 64 6f 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20 6d  do not need to m
21340 61 6b 65 20 61 0a 20 20 20 20 20 20 2a 2a 20 63  ake a.      ** c
21350 6f 70 79 20 6f 66 20 74 68 65 20 66 69 6c 65 6e  opy of the filen
21360 61 6d 65 2e 20 2a 2f 0a 20 20 20 20 20 20 70 43  ame. */.      pC
21370 74 78 2d 3e 64 62 50 61 74 68 20 3d 20 7a 46 69  tx->dbPath = zFi
21380 6c 65 6e 61 6d 65 3b 0a 20 20 20 20 20 20 70 43  lename;.      pC
21390 74 78 2d 3e 72 65 73 65 72 76 65 64 20 3d 20 30  tx->reserved = 0
213a0 3b 0a 20 20 20 20 20 20 73 72 61 6e 64 6f 6d 64  ;.      srandomd
213b0 65 76 28 29 3b 0a 20 20 20 20 20 20 75 6e 69 78  ev();.      unix
213c0 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 20 20  EnterMutex();.  
213d0 20 20 20 20 72 63 20 3d 20 66 69 6e 64 49 6e 6f      rc = findIno
213e0 64 65 49 6e 66 6f 28 70 4e 65 77 2c 20 26 70 4e  deInfo(pNew, &pN
213f0 65 77 2d 3e 70 49 6e 6f 64 65 29 3b 0a 20 20 20  ew->pInode);.   
21400 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
21410 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
21420 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 4e 65  sqlite3_free(pNe
21430 77 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78  w->lockingContex
21440 74 29 3b 0a 20 20 20 20 20 20 20 20 63 6c 6f 73  t);.        clos
21450 65 28 68 29 3b 0a 20 20 20 20 20 20 20 20 68 20  e(h);.        h 
21460 3d 20 2d 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20  = -1;.      }.  
21470 20 20 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74      unixLeaveMut
21480 65 78 28 29 3b 20 20 20 20 20 20 20 20 0a 20 20  ex();        .  
21490 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a    }.  }.#endif..
214a0 20 20 65 6c 73 65 20 69 66 28 20 70 4c 6f 63 6b    else if( pLock
214b0 69 6e 67 53 74 79 6c 65 20 3d 3d 20 26 64 6f 74  ingStyle == &dot
214c0 6c 6f 63 6b 49 6f 4d 65 74 68 6f 64 73 20 29 7b  lockIoMethods ){
214d0 0a 20 20 20 20 2f 2a 20 44 6f 74 66 69 6c 65 20  .    /* Dotfile 
214e0 6c 6f 63 6b 69 6e 67 20 75 73 65 73 20 74 68 65  locking uses the
214f0 20 66 69 6c 65 20 70 61 74 68 20 73 6f 20 69 74   file path so it
21500 20 6e 65 65 64 73 20 74 6f 20 62 65 20 69 6e 63   needs to be inc
21510 6c 75 64 65 64 20 69 6e 0a 20 20 20 20 2a 2a 20  luded in.    ** 
21520 74 68 65 20 64 6f 74 6c 6f 63 6b 4c 6f 63 6b 69  the dotlockLocki
21530 6e 67 43 6f 6e 74 65 78 74 20 0a 20 20 20 20 2a  ngContext .    *
21540 2f 0a 20 20 20 20 63 68 61 72 20 2a 7a 4c 6f 63  /.    char *zLoc
21550 6b 46 69 6c 65 3b 0a 20 20 20 20 69 6e 74 20 6e  kFile;.    int n
21560 46 69 6c 65 6e 61 6d 65 3b 0a 20 20 20 20 6e 46  Filename;.    nF
21570 69 6c 65 6e 61 6d 65 20 3d 20 28 69 6e 74 29 73  ilename = (int)s
21580 74 72 6c 65 6e 28 7a 46 69 6c 65 6e 61 6d 65 29  trlen(zFilename)
21590 20 2b 20 36 3b 0a 20 20 20 20 7a 4c 6f 63 6b 46   + 6;.    zLockF
215a0 69 6c 65 20 3d 20 28 63 68 61 72 20 2a 29 73 71  ile = (char *)sq
215b0 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 6e 46 69  lite3_malloc(nFi
215c0 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20 69 66 28  lename);.    if(
215d0 20 7a 4c 6f 63 6b 46 69 6c 65 3d 3d 30 20 29 7b   zLockFile==0 ){
215e0 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
215f0 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 65  TE_NOMEM;.    }e
21600 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  lse{.      sqlit
21610 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 46 69 6c  e3_snprintf(nFil
21620 65 6e 61 6d 65 2c 20 7a 4c 6f 63 6b 46 69 6c 65  ename, zLockFile
21630 2c 20 22 25 73 22 20 44 4f 54 4c 4f 43 4b 5f 53  , "%s" DOTLOCK_S
21640 55 46 46 49 58 2c 20 7a 46 69 6c 65 6e 61 6d 65  UFFIX, zFilename
21650 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4e 65  );.    }.    pNe
21660 77 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78  w->lockingContex
21670 74 20 3d 20 7a 4c 6f 63 6b 46 69 6c 65 3b 0a 20  t = zLockFile;. 
21680 20 7d 0a 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52   }..#if OS_VXWOR
21690 4b 53 0a 20 20 65 6c 73 65 20 69 66 28 20 70 4c  KS.  else if( pL
216a0 6f 63 6b 69 6e 67 53 74 79 6c 65 20 3d 3d 20 26  ockingStyle == &
216b0 73 65 6d 49 6f 4d 65 74 68 6f 64 73 20 29 7b 0a  semIoMethods ){.
216c0 20 20 20 20 2f 2a 20 4e 61 6d 65 64 20 73 65 6d      /* Named sem
216d0 61 70 68 6f 72 65 20 6c 6f 63 6b 69 6e 67 20 75  aphore locking u
216e0 73 65 73 20 74 68 65 20 66 69 6c 65 20 70 61 74  ses the file pat
216f0 68 20 73 6f 20 69 74 20 6e 65 65 64 73 20 74 6f  h so it needs to
21700 20 62 65 0a 20 20 20 20 2a 2a 20 69 6e 63 6c 75   be.    ** inclu
21710 64 65 64 20 69 6e 20 74 68 65 20 73 65 6d 4c 6f  ded in the semLo
21720 63 6b 69 6e 67 43 6f 6e 74 65 78 74 0a 20 20 20  ckingContext.   
21730 20 2a 2f 0a 20 20 20 20 75 6e 69 78 45 6e 74 65   */.    unixEnte
21740 72 4d 75 74 65 78 28 29 3b 0a 20 20 20 20 72 63  rMutex();.    rc
21750 20 3d 20 66 69 6e 64 49 6e 6f 64 65 49 6e 66 6f   = findInodeInfo
21760 28 70 4e 65 77 2c 20 26 70 4e 65 77 2d 3e 70 49  (pNew, &pNew->pI
21770 6e 6f 64 65 29 3b 0a 20 20 20 20 69 66 28 20 28  node);.    if( (
21780 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 29 20 26  rc==SQLITE_OK) &
21790 26 20 28 70 4e 65 77 2d 3e 70 49 6e 6f 64 65 2d  & (pNew->pInode-
217a0 3e 70 53 65 6d 3d 3d 4e 55 4c 4c 29 20 29 7b 0a  >pSem==NULL) ){.
217b0 20 20 20 20 20 20 63 68 61 72 20 2a 7a 53 65 6d        char *zSem
217c0 4e 61 6d 65 20 3d 20 70 4e 65 77 2d 3e 70 49 6e  Name = pNew->pIn
217d0 6f 64 65 2d 3e 61 53 65 6d 4e 61 6d 65 3b 0a 20  ode->aSemName;. 
217e0 20 20 20 20 20 69 6e 74 20 6e 3b 0a 20 20 20 20       int n;.    
217f0 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
21800 74 66 28 4d 41 58 5f 50 41 54 48 4e 41 4d 45 2c  tf(MAX_PATHNAME,
21810 20 7a 53 65 6d 4e 61 6d 65 2c 20 22 2f 25 73 2e   zSemName, "/%s.
21820 73 65 6d 22 2c 0a 20 20 20 20 20 20 20 20 20 20  sem",.          
21830 20 20 20 20 20 20 20 20 20 20 20 20 20 70 4e 65               pNe
21840 77 2d 3e 70 49 64 2d 3e 7a 43 61 6e 6f 6e 69 63  w->pId->zCanonic
21850 61 6c 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 66  alName);.      f
21860 6f 72 28 20 6e 3d 31 3b 20 7a 53 65 6d 4e 61 6d  or( n=1; zSemNam
21870 65 5b 6e 5d 3b 20 6e 2b 2b 20 29 0a 20 20 20 20  e[n]; n++ ).    
21880 20 20 20 20 69 66 28 20 7a 53 65 6d 4e 61 6d 65      if( zSemName
21890 5b 6e 5d 3d 3d 27 2f 27 20 29 20 7a 53 65 6d 4e  [n]=='/' ) zSemN
218a0 61 6d 65 5b 6e 5d 20 3d 20 27 5f 27 3b 0a 20 20  ame[n] = '_';.  
218b0 20 20 20 20 70 4e 65 77 2d 3e 70 49 6e 6f 64 65      pNew->pInode
218c0 2d 3e 70 53 65 6d 20 3d 20 73 65 6d 5f 6f 70 65  ->pSem = sem_ope
218d0 6e 28 7a 53 65 6d 4e 61 6d 65 2c 20 4f 5f 43 52  n(zSemName, O_CR
218e0 45 41 54 2c 20 30 36 36 36 2c 20 31 29 3b 0a 20  EAT, 0666, 1);. 
218f0 20 20 20 20 20 69 66 28 20 70 4e 65 77 2d 3e 70       if( pNew->p
21900 49 6e 6f 64 65 2d 3e 70 53 65 6d 20 3d 3d 20 53  Inode->pSem == S
21910 45 4d 5f 46 41 49 4c 45 44 20 29 7b 0a 20 20 20  EM_FAILED ){.   
21920 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
21930 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 20 20  _NOMEM;.        
21940 70 4e 65 77 2d 3e 70 49 6e 6f 64 65 2d 3e 61 53  pNew->pInode->aS
21950 65 6d 4e 61 6d 65 5b 30 5d 20 3d 20 27 5c 30 27  emName[0] = '\0'
21960 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
21970 20 20 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74      unixLeaveMut
21980 65 78 28 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  ex();.  }.#endif
21990 0a 20 20 0a 20 20 70 4e 65 77 2d 3e 6c 61 73 74  .  .  pNew->last
219a0 45 72 72 6e 6f 20 3d 20 30 3b 0a 23 69 66 20 4f  Errno = 0;.#if O
219b0 53 5f 56 58 57 4f 52 4b 53 0a 20 20 69 66 28 20  S_VXWORKS.  if( 
219c0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
219d0 0a 20 20 20 20 69 66 28 20 68 3e 3d 30 20 29 20  .    if( h>=0 ) 
219e0 63 6c 6f 73 65 28 68 29 3b 0a 20 20 20 20 68 20  close(h);.    h 
219f0 3d 20 2d 31 3b 0a 20 20 20 20 75 6e 6c 69 6e 6b  = -1;.    unlink
21a00 28 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20  (zFilename);.   
21a10 20 69 73 44 65 6c 65 74 65 20 3d 20 30 3b 0a 20   isDelete = 0;. 
21a20 20 7d 0a 20 20 70 4e 65 77 2d 3e 69 73 44 65 6c   }.  pNew->isDel
21a30 65 74 65 20 3d 20 69 73 44 65 6c 65 74 65 3b 0a  ete = isDelete;.
21a40 23 65 6e 64 69 66 0a 20 20 69 66 28 20 72 63 21  #endif.  if( rc!
21a50 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
21a60 20 20 69 66 28 20 64 69 72 66 64 3e 3d 30 20 29    if( dirfd>=0 )
21a70 20 63 6c 6f 73 65 28 64 69 72 66 64 29 3b 20 2f   close(dirfd); /
21a80 2a 20 73 69 6c 65 6e 74 20 6c 65 61 6b 20 69 66  * silent leak if
21a90 20 66 61 69 6c 2c 20 61 6c 72 65 61 64 79 20 69   fail, already i
21aa0 6e 20 65 72 72 6f 72 20 2a 2f 0a 20 20 20 20 69  n error */.    i
21ab0 66 28 20 68 3e 3d 30 20 29 20 63 6c 6f 73 65 28  f( h>=0 ) close(
21ac0 68 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  h);.  }else{.   
21ad0 20 70 4e 65 77 2d 3e 70 4d 65 74 68 6f 64 20 3d   pNew->pMethod =
21ae0 20 70 4c 6f 63 6b 69 6e 67 53 74 79 6c 65 3b 0a   pLockingStyle;.
21af0 20 20 20 20 4f 70 65 6e 43 6f 75 6e 74 65 72 28      OpenCounter(
21b00 2b 31 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  +1);.  }.  retur
21b10 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f  n rc;.}../*.** O
21b20 70 65 6e 20 61 20 66 69 6c 65 20 64 65 73 63 72  pen a file descr
21b30 69 70 74 6f 72 20 74 6f 20 74 68 65 20 64 69 72  iptor to the dir
21b40 65 63 74 6f 72 79 20 63 6f 6e 74 61 69 6e 69 6e  ectory containin
21b50 67 20 66 69 6c 65 20 7a 46 69 6c 65 6e 61 6d 65  g file zFilename
21b60 2e 0a 2a 2a 20 49 66 20 73 75 63 63 65 73 73 66  ..** If successf
21b70 75 6c 2c 20 2a 70 46 64 20 69 73 20 73 65 74 20  ul, *pFd is set 
21b80 74 6f 20 74 68 65 20 6f 70 65 6e 65 64 20 66 69  to the opened fi
21b90 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 61 6e  le descriptor an
21ba0 64 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69  d.** SQLITE_OK i
21bb0 73 20 72 65 74 75 72 6e 65 64 2e 20 49 66 20 61  s returned. If a
21bc0 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20  n error occurs, 
21bd0 65 69 74 68 65 72 20 53 51 4c 49 54 45 5f 4e 4f  either SQLITE_NO
21be0 4d 45 4d 0a 2a 2a 20 6f 72 20 53 51 4c 49 54 45  MEM.** or SQLITE
21bf0 5f 43 41 4e 54 4f 50 45 4e 20 69 73 20 72 65 74  _CANTOPEN is ret
21c00 75 72 6e 65 64 20 61 6e 64 20 2a 70 46 64 20 69  urned and *pFd i
21c10 73 20 73 65 74 20 74 6f 20 61 6e 20 75 6e 64 65  s set to an unde
21c20 66 69 6e 65 64 0a 2a 2a 20 76 61 6c 75 65 2e 0a  fined.** value..
21c30 2a 2a 0a 2a 2a 20 49 66 20 53 51 4c 49 54 45 5f  **.** If SQLITE_
21c40 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2c 20  OK is returned, 
21c50 74 68 65 20 63 61 6c 6c 65 72 20 69 73 20 72 65  the caller is re
21c60 73 70 6f 6e 73 69 62 6c 65 20 66 6f 72 20 63 6c  sponsible for cl
21c70 6f 73 69 6e 67 0a 2a 2a 20 74 68 65 20 66 69 6c  osing.** the fil
21c80 65 20 64 65 73 63 72 69 70 74 6f 72 20 2a 70 46  e descriptor *pF
21c90 64 20 75 73 69 6e 67 20 63 6c 6f 73 65 28 29 2e  d using close().
21ca0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6f  .*/.static int o
21cb0 70 65 6e 44 69 72 65 63 74 6f 72 79 28 63 6f 6e  penDirectory(con
21cc0 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61  st char *zFilena
21cd0 6d 65 2c 20 69 6e 74 20 2a 70 46 64 29 7b 0a 20  me, int *pFd){. 
21ce0 20 69 6e 74 20 69 69 3b 0a 20 20 69 6e 74 20 66   int ii;.  int f
21cf0 64 20 3d 20 2d 31 3b 0a 20 20 63 68 61 72 20 7a  d = -1;.  char z
21d00 44 69 72 6e 61 6d 65 5b 4d 41 58 5f 50 41 54 48  Dirname[MAX_PATH
21d10 4e 41 4d 45 2b 31 5d 3b 0a 0a 20 20 73 71 6c 69  NAME+1];..  sqli
21d20 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 4d 41 58  te3_snprintf(MAX
21d30 5f 50 41 54 48 4e 41 4d 45 2c 20 7a 44 69 72 6e  _PATHNAME, zDirn
21d40 61 6d 65 2c 20 22 25 73 22 2c 20 7a 46 69 6c 65  ame, "%s", zFile
21d50 6e 61 6d 65 29 3b 0a 20 20 66 6f 72 28 69 69 3d  name);.  for(ii=
21d60 28 69 6e 74 29 73 74 72 6c 65 6e 28 7a 44 69 72  (int)strlen(zDir
21d70 6e 61 6d 65 29 3b 20 69 69 3e 31 20 26 26 20 7a  name); ii>1 && z
21d80 44 69 72 6e 61 6d 65 5b 69 69 5d 21 3d 27 2f 27  Dirname[ii]!='/'
21d90 3b 20 69 69 2d 2d 29 3b 0a 20 20 69 66 28 20 69  ; ii--);.  if( i
21da0 69 3e 30 20 29 7b 0a 20 20 20 20 7a 44 69 72 6e  i>0 ){.    zDirn
21db0 61 6d 65 5b 69 69 5d 20 3d 20 27 5c 30 27 3b 0a  ame[ii] = '\0';.
21dc0 20 20 20 20 66 64 20 3d 20 6f 70 65 6e 28 7a 44      fd = open(zD
21dd0 69 72 6e 61 6d 65 2c 20 4f 5f 52 44 4f 4e 4c 59  irname, O_RDONLY
21de0 7c 4f 5f 42 49 4e 41 52 59 2c 20 30 29 3b 0a 20  |O_BINARY, 0);. 
21df0 20 20 20 69 66 28 20 66 64 3e 3d 30 20 29 7b 0a     if( fd>=0 ){.
21e00 23 69 66 64 65 66 20 46 44 5f 43 4c 4f 45 58 45  #ifdef FD_CLOEXE
21e10 43 0a 20 20 20 20 20 20 66 63 6e 74 6c 28 66 64  C.      fcntl(fd
21e20 2c 20 46 5f 53 45 54 46 44 2c 20 66 63 6e 74 6c  , F_SETFD, fcntl
21e30 28 66 64 2c 20 46 5f 47 45 54 46 44 2c 20 30 29  (fd, F_GETFD, 0)
21e40 20 7c 20 46 44 5f 43 4c 4f 45 58 45 43 29 3b 0a   | FD_CLOEXEC);.
21e50 23 65 6e 64 69 66 0a 20 20 20 20 20 20 4f 53 54  #endif.      OST
21e60 52 41 43 45 28 28 22 4f 50 45 4e 44 49 52 20 25  RACE(("OPENDIR %
21e70 2d 33 64 20 25 73 5c 6e 22 2c 20 66 64 2c 20 7a  -3d %s\n", fd, z
21e80 44 69 72 6e 61 6d 65 29 29 3b 0a 20 20 20 20 7d  Dirname));.    }
21e90 0a 20 20 7d 0a 20 20 2a 70 46 64 20 3d 20 66 64  .  }.  *pFd = fd
21ea0 3b 0a 20 20 72 65 74 75 72 6e 20 28 66 64 3e 3d  ;.  return (fd>=
21eb0 30 3f 53 51 4c 49 54 45 5f 4f 4b 3a 53 51 4c 49  0?SQLITE_OK:SQLI
21ec0 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 42 4b 50 54  TE_CANTOPEN_BKPT
21ed0 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61  );.}../*.** Crea
21ee0 74 65 20 61 20 74 65 6d 70 6f 72 61 72 79 20 66  te a temporary f
21ef0 69 6c 65 20 6e 61 6d 65 20 69 6e 20 7a 42 75 66  ile name in zBuf
21f00 2e 20 20 7a 42 75 66 20 6d 75 73 74 20 62 65 20  .  zBuf must be 
21f10 61 6c 6c 6f 63 61 74 65 64 0a 2a 2a 20 62 79 20  allocated.** by 
21f20 74 68 65 20 63 61 6c 6c 69 6e 67 20 70 72 6f 63  the calling proc
21f30 65 73 73 20 61 6e 64 20 6d 75 73 74 20 62 65 20  ess and must be 
21f40 62 69 67 20 65 6e 6f 75 67 68 20 74 6f 20 68 6f  big enough to ho
21f50 6c 64 20 61 74 20 6c 65 61 73 74 0a 2a 2a 20 70  ld at least.** p
21f60 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 20  Vfs->mxPathname 
21f70 62 79 74 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  bytes..*/.static
21f80 20 69 6e 74 20 67 65 74 54 65 6d 70 6e 61 6d 65   int getTempname
21f90 28 69 6e 74 20 6e 42 75 66 2c 20 63 68 61 72 20  (int nBuf, char 
21fa0 2a 7a 42 75 66 29 7b 0a 20 20 73 74 61 74 69 63  *zBuf){.  static
21fb0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 61 7a 44   const char *azD
21fc0 69 72 73 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 30  irs[] = {.     0
21fd0 2c 0a 20 20 20 20 20 30 2c 0a 20 20 20 20 20 22  ,.     0,.     "
21fe0 2f 76 61 72 2f 74 6d 70 22 2c 0a 20 20 20 20 20  /var/tmp",.     
21ff0 22 2f 75 73 72 2f 74 6d 70 22 2c 0a 20 20 20 20  "/usr/tmp",.    
22000 20 22 2f 74 6d 70 22 2c 0a 20 20 20 20 20 22 2e   "/tmp",.     ".
22010 22 2c 0a 20 20 7d 3b 0a 20 20 73 74 61 74 69 63  ",.  };.  static
22020 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20   const unsigned 
22030 63 68 61 72 20 7a 43 68 61 72 73 5b 5d 20 3d 0a  char zChars[] =.
22040 20 20 20 20 22 61 62 63 64 65 66 67 68 69 6a 6b      "abcdefghijk
22050 6c 6d 6e 6f 70 71 72 73 74 75 76 77 78 79 7a 22  lmnopqrstuvwxyz"
22060 0a 20 20 20 20 22 41 42 43 44 45 46 47 48 49 4a  .    "ABCDEFGHIJ
22070 4b 4c 4d 4e 4f 50 51 52 53 54 55 56 57 58 59 5a  KLMNOPQRSTUVWXYZ
22080 22 0a 20 20 20 20 22 30 31 32 33 34 35 36 37 38  ".    "012345678
22090 39 22 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 69  9";.  unsigned i
220a0 6e 74 20 69 2c 20 6a 3b 0a 20 20 73 74 72 75 63  nt i, j;.  struc
220b0 74 20 73 74 61 74 20 62 75 66 3b 0a 20 20 63 6f  t stat buf;.  co
220c0 6e 73 74 20 63 68 61 72 20 2a 7a 44 69 72 20 3d  nst char *zDir =
220d0 20 22 2e 22 3b 0a 0a 20 20 2f 2a 20 49 74 27 73   ".";..  /* It's
220e0 20 6f 64 64 20 74 6f 20 73 69 6d 75 6c 61 74 65   odd to simulate
220f0 20 61 6e 20 69 6f 2d 65 72 72 6f 72 20 68 65 72   an io-error her
22100 65 2c 20 62 75 74 20 72 65 61 6c 6c 79 20 74 68  e, but really th
22110 69 73 20 69 73 20 6a 75 73 74 0a 20 20 2a 2a 20  is is just.  ** 
22120 75 73 69 6e 67 20 74 68 65 20 69 6f 2d 65 72 72  using the io-err
22130 6f 72 20 69 6e 66 72 61 73 74 72 75 63 74 75 72  or infrastructur
22140 65 20 74 6f 20 74 65 73 74 20 74 68 61 74 20 53  e to test that S
22150 51 4c 69 74 65 20 68 61 6e 64 6c 65 73 20 74 68  QLite handles th
22160 69 73 0a 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e  is.  ** function
22170 20 66 61 69 6c 69 6e 67 2e 20 0a 20 20 2a 2f 0a   failing. .  */.
22180 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f    SimulateIOErro
22190 72 28 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  r( return SQLITE
221a0 5f 49 4f 45 52 52 20 29 3b 0a 0a 20 20 61 7a 44  _IOERR );..  azD
221b0 69 72 73 5b 30 5d 20 3d 20 73 71 6c 69 74 65 33  irs[0] = sqlite3
221c0 5f 74 65 6d 70 5f 64 69 72 65 63 74 6f 72 79 3b  _temp_directory;
221d0 0a 20 20 69 66 20 28 4e 55 4c 4c 20 3d 3d 20 61  .  if (NULL == a
221e0 7a 44 69 72 73 5b 31 5d 29 20 7b 0a 20 20 20 20  zDirs[1]) {.    
221f0 61 7a 44 69 72 73 5b 31 5d 20 3d 20 67 65 74 65  azDirs[1] = gete
22200 6e 76 28 22 54 4d 50 44 49 52 22 29 3b 0a 20 20  nv("TMPDIR");.  
22210 7d 0a 20 20 0a 20 20 66 6f 72 28 69 3d 30 3b 20  }.  .  for(i=0; 
22220 69 3c 73 69 7a 65 6f 66 28 61 7a 44 69 72 73 29  i<sizeof(azDirs)
22230 2f 73 69 7a 65 6f 66 28 61 7a 44 69 72 73 5b 30  /sizeof(azDirs[0
22240 5d 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66  ]); i++){.    if
22250 28 20 61 7a 44 69 72 73 5b 69 5d 3d 3d 30 20 29  ( azDirs[i]==0 )
22260 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69   continue;.    i
22270 66 28 20 73 74 61 74 28 61 7a 44 69 72 73 5b 69  f( stat(azDirs[i
22280 5d 2c 20 26 62 75 66 29 20 29 20 63 6f 6e 74 69  ], &buf) ) conti
22290 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 21 53 5f  nue;.    if( !S_
222a0 49 53 44 49 52 28 62 75 66 2e 73 74 5f 6d 6f 64  ISDIR(buf.st_mod
222b0 65 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  e) ) continue;. 
222c0 20 20 20 69 66 28 20 61 63 63 65 73 73 28 61 7a     if( access(az
222d0 44 69 72 73 5b 69 5d 2c 20 30 37 29 20 29 20 63  Dirs[i], 07) ) c
222e0 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7a 44 69  ontinue;.    zDi
222f0 72 20 3d 20 61 7a 44 69 72 73 5b 69 5d 3b 0a 20  r = azDirs[i];. 
22300 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20     break;.  }.. 
22310 20 2f 2a 20 43 68 65 63 6b 20 74 68 61 74 20 74   /* Check that t
22320 68 65 20 6f 75 74 70 75 74 20 62 75 66 66 65 72  he output buffer
22330 20 69 73 20 6c 61 72 67 65 20 65 6e 6f 75 67 68   is large enough
22340 20 66 6f 72 20 74 68 65 20 74 65 6d 70 6f 72 61   for the tempora
22350 72 79 20 66 69 6c 65 20 0a 20 20 2a 2a 20 6e 61  ry file .  ** na
22360 6d 65 2e 20 49 66 20 69 74 20 69 73 20 6e 6f 74  me. If it is not
22370 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  , return SQLITE_
22380 45 52 52 4f 52 2e 0a 20 20 2a 2f 0a 20 20 69 66  ERROR..  */.  if
22390 28 20 28 73 74 72 6c 65 6e 28 7a 44 69 72 29 20  ( (strlen(zDir) 
223a0 2b 20 73 74 72 6c 65 6e 28 53 51 4c 49 54 45 5f  + strlen(SQLITE_
223b0 54 45 4d 50 5f 46 49 4c 45 5f 50 52 45 46 49 58  TEMP_FILE_PREFIX
223c0 29 20 2b 20 31 37 29 20 3e 3d 20 28 73 69 7a 65  ) + 17) >= (size
223d0 5f 74 29 6e 42 75 66 20 29 7b 0a 20 20 20 20 72  _t)nBuf ){.    r
223e0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52  eturn SQLITE_ERR
223f0 4f 52 3b 0a 20 20 7d 0a 0a 20 20 64 6f 7b 0a 20  OR;.  }..  do{. 
22400 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
22410 6e 74 66 28 6e 42 75 66 2d 31 37 2c 20 7a 42 75  ntf(nBuf-17, zBu
22420 66 2c 20 22 25 73 2f 22 53 51 4c 49 54 45 5f 54  f, "%s/"SQLITE_T
22430 45 4d 50 5f 46 49 4c 45 5f 50 52 45 46 49 58 2c  EMP_FILE_PREFIX,
22440 20 7a 44 69 72 29 3b 0a 20 20 20 20 6a 20 3d 20   zDir);.    j = 
22450 28 69 6e 74 29 73 74 72 6c 65 6e 28 7a 42 75 66  (int)strlen(zBuf
22460 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72  );.    sqlite3_r
22470 61 6e 64 6f 6d 6e 65 73 73 28 31 35 2c 20 26 7a  andomness(15, &z
22480 42 75 66 5b 6a 5d 29 3b 0a 20 20 20 20 66 6f 72  Buf[j]);.    for
22490 28 69 3d 30 3b 20 69 3c 31 35 3b 20 69 2b 2b 2c  (i=0; i<15; i++,
224a0 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 7a 42 75   j++){.      zBu
224b0 66 5b 6a 5d 20 3d 20 28 63 68 61 72 29 7a 43 68  f[j] = (char)zCh
224c0 61 72 73 5b 20 28 28 75 6e 73 69 67 6e 65 64 20  ars[ ((unsigned 
224d0 63 68 61 72 29 7a 42 75 66 5b 6a 5d 29 25 28 73  char)zBuf[j])%(s
224e0 69 7a 65 6f 66 28 7a 43 68 61 72 73 29 2d 31 29  izeof(zChars)-1)
224f0 20 5d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a 42   ];.    }.    zB
22500 75 66 5b 6a 5d 20 3d 20 30 3b 0a 20 20 7d 77 68  uf[j] = 0;.  }wh
22510 69 6c 65 28 20 61 63 63 65 73 73 28 7a 42 75 66  ile( access(zBuf
22520 2c 30 29 3d 3d 30 20 29 3b 0a 20 20 72 65 74 75  ,0)==0 );.  retu
22530 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
22540 0a 23 69 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  .#if SQLITE_ENAB
22550 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45  LE_LOCKING_STYLE
22560 20 26 26 20 64 65 66 69 6e 65 64 28 5f 5f 41 50   && defined(__AP
22570 50 4c 45 5f 5f 29 0a 2f 2a 0a 2a 2a 20 52 6f 75  PLE__)./*.** Rou
22580 74 69 6e 65 20 74 6f 20 74 72 61 6e 73 66 6f 72  tine to transfor
22590 6d 20 61 20 75 6e 69 78 46 69 6c 65 20 69 6e 74  m a unixFile int
225a0 6f 20 61 20 70 72 6f 78 79 2d 6c 6f 63 6b 69 6e  o a proxy-lockin
225b0 67 20 75 6e 69 78 46 69 6c 65 2e 0a 2a 2a 20 49  g unixFile..** I
225c0 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 69 6e  mplementation in
225d0 20 74 68 65 20 70 72 6f 78 79 2d 6c 6f 63 6b 20   the proxy-lock 
225e0 64 69 76 69 73 69 6f 6e 2c 20 62 75 74 20 75 73  division, but us
225f0 65 64 20 62 79 20 75 6e 69 78 4f 70 65 6e 28 29  ed by unixOpen()
22600 0a 2a 2a 20 69 66 20 53 51 4c 49 54 45 5f 50 52  .** if SQLITE_PR
22610 45 46 45 52 5f 50 52 4f 58 59 5f 4c 4f 43 4b 49  EFER_PROXY_LOCKI
22620 4e 47 20 69 73 20 64 65 66 69 6e 65 64 2e 0a 2a  NG is defined..*
22630 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72 6f  /.static int pro
22640 78 79 54 72 61 6e 73 66 6f 72 6d 55 6e 69 78 46  xyTransformUnixF
22650 69 6c 65 28 75 6e 69 78 46 69 6c 65 2a 2c 20 63  ile(unixFile*, c
22660 6f 6e 73 74 20 63 68 61 72 2a 29 3b 0a 23 65 6e  onst char*);.#en
22670 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 53 65 61 72 63  dif../*.** Searc
22680 68 20 66 6f 72 20 61 6e 20 75 6e 75 73 65 64 20  h for an unused 
22690 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
226a0 74 68 61 74 20 77 61 73 20 6f 70 65 6e 65 64 20  that was opened 
226b0 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  on the database 
226c0 0a 2a 2a 20 66 69 6c 65 20 28 6e 6f 74 20 61 20  .** file (not a 
226d0 6a 6f 75 72 6e 61 6c 20 6f 72 20 6d 61 73 74 65  journal or maste
226e0 72 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 29 20  r-journal file) 
226f0 69 64 65 6e 74 69 66 69 65 64 20 62 79 20 70 61  identified by pa
22700 74 68 6e 61 6d 65 0a 2a 2a 20 7a 50 61 74 68 20  thname.** zPath 
22710 77 69 74 68 20 53 51 4c 49 54 45 5f 4f 50 45 4e  with SQLITE_OPEN
22720 5f 58 58 58 20 66 6c 61 67 73 20 6d 61 74 63 68  _XXX flags match
22730 69 6e 67 20 74 68 6f 73 65 20 70 61 73 73 65 64  ing those passed
22740 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64 0a 2a   as the second.*
22750 2a 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 74 68  * argument to th
22760 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a  is function..**.
22770 2a 2a 20 53 75 63 68 20 61 20 66 69 6c 65 20 64  ** Such a file d
22780 65 73 63 72 69 70 74 6f 72 20 6d 61 79 20 65 78  escriptor may ex
22790 69 73 74 20 69 66 20 61 20 64 61 74 61 62 61 73  ist if a databas
227a0 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77 61 73  e connection was
227b0 20 63 6c 6f 73 65 64 0a 2a 2a 20 62 75 74 20 74   closed.** but t
227c0 68 65 20 61 73 73 6f 63 69 61 74 65 64 20 66 69  he associated fi
227d0 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 63 6f  le descriptor co
227e0 75 6c 64 20 6e 6f 74 20 62 65 20 63 6c 6f 73 65  uld not be close
227f0 64 20 62 65 63 61 75 73 65 20 73 6f 6d 65 0a 2a  d because some.*
22800 2a 20 6f 74 68 65 72 20 66 69 6c 65 20 64 65 73  * other file des
22810 63 72 69 70 74 6f 72 20 6f 70 65 6e 20 6f 6e 20  criptor open on 
22820 74 68 65 20 73 61 6d 65 20 66 69 6c 65 20 69 73  the same file is
22830 20 68 6f 6c 64 69 6e 67 20 61 20 66 69 6c 65 2d   holding a file-
22840 6c 6f 63 6b 2e 0a 2a 2a 20 52 65 66 65 72 20 74  lock..** Refer t
22850 6f 20 63 6f 6d 6d 65 6e 74 73 20 69 6e 20 74 68  o comments in th
22860 65 20 75 6e 69 78 43 6c 6f 73 65 28 29 20 66 75  e unixClose() fu
22870 6e 63 74 69 6f 6e 20 61 6e 64 20 74 68 65 20 6c  nction and the l
22880 65 6e 67 74 68 79 20 63 6f 6d 6d 65 6e 74 0a 2a  engthy comment.*
22890 2a 20 64 65 73 63 72 69 62 69 6e 67 20 22 50 6f  * describing "Po
228a0 73 69 78 20 41 64 76 69 73 6f 72 79 20 4c 6f 63  six Advisory Loc
228b0 6b 69 6e 67 22 20 61 74 20 74 68 65 20 73 74 61  king" at the sta
228c0 72 74 20 6f 66 20 74 68 69 73 20 66 69 6c 65 20  rt of this file 
228d0 66 6f 72 20 0a 2a 2a 20 66 75 72 74 68 65 72 20  for .** further 
228e0 64 65 74 61 69 6c 73 2e 20 41 6c 73 6f 2c 20 74  details. Also, t
228f0 69 63 6b 65 74 20 23 34 30 31 38 2e 0a 2a 2a 0a  icket #4018..**.
22900 2a 2a 20 49 66 20 61 20 73 75 69 74 61 62 6c 65  ** If a suitable
22910 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
22920 20 69 73 20 66 6f 75 6e 64 2c 20 74 68 65 6e 20   is found, then 
22930 69 74 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20  it is returned. 
22940 49 66 20 6e 6f 0a 2a 2a 20 73 75 63 68 20 66 69  If no.** such fi
22950 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 69 73  le descriptor is
22960 20 6c 6f 63 61 74 65 64 2c 20 2d 31 20 69 73 20   located, -1 is 
22970 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61  returned..*/.sta
22980 74 69 63 20 55 6e 69 78 55 6e 75 73 65 64 46 64  tic UnixUnusedFd
22990 20 2a 66 69 6e 64 52 65 75 73 61 62 6c 65 46 64   *findReusableFd
229a0 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 61  (const char *zPa
229b0 74 68 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a  th, int flags){.
229c0 20 20 55 6e 69 78 55 6e 75 73 65 64 46 64 20 2a    UnixUnusedFd *
229d0 70 55 6e 75 73 65 64 20 3d 20 30 3b 0a 0a 20 20  pUnused = 0;..  
229e0 2f 2a 20 44 6f 20 6e 6f 74 20 73 65 61 72 63 68  /* Do not search
229f0 20 66 6f 72 20 61 6e 20 75 6e 75 73 65 64 20 66   for an unused f
22a00 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 6f  ile descriptor o
22a10 6e 20 76 78 77 6f 72 6b 73 2e 20 4e 6f 74 20 62  n vxworks. Not b
22a20 65 63 61 75 73 65 0a 20 20 2a 2a 20 76 78 77 6f  ecause.  ** vxwo
22a30 72 6b 73 20 77 6f 75 6c 64 20 6e 6f 74 20 62 65  rks would not be
22a40 6e 65 66 69 74 20 66 72 6f 6d 20 74 68 65 20 63  nefit from the c
22a50 68 61 6e 67 65 20 28 69 74 20 6d 69 67 68 74 2c  hange (it might,
22a60 20 77 65 27 72 65 20 6e 6f 74 20 73 75 72 65 29   we're not sure)
22a70 2c 0a 20 20 2a 2a 20 62 75 74 20 62 65 63 61 75  ,.  ** but becau
22a80 73 65 20 6e 6f 20 77 61 79 20 74 6f 20 74 65 73  se no way to tes
22a90 74 20 69 74 20 69 73 20 63 75 72 72 65 6e 74 6c  t it is currentl
22aa0 79 20 61 76 61 69 6c 61 62 6c 65 2e 20 49 74 20  y available. It 
22ab0 69 73 20 62 65 74 74 65 72 20 0a 20 20 2a 2a 20  is better .  ** 
22ac0 6e 6f 74 20 74 6f 20 72 69 73 6b 20 62 72 65 61  not to risk brea
22ad0 6b 69 6e 67 20 76 78 77 6f 72 6b 73 20 73 75 70  king vxworks sup
22ae0 70 6f 72 74 20 66 6f 72 20 74 68 65 20 73 61 6b  port for the sak
22af0 65 20 6f 66 20 73 75 63 68 20 61 6e 20 6f 62 73  e of such an obs
22b00 63 75 72 65 20 0a 20 20 2a 2a 20 66 65 61 74 75  cure .  ** featu
22b10 72 65 2e 20 20 2a 2f 0a 23 69 66 20 21 4f 53 5f  re.  */.#if !OS_
22b20 56 58 57 4f 52 4b 53 0a 20 20 73 74 72 75 63 74  VXWORKS.  struct
22b30 20 73 74 61 74 20 73 53 74 61 74 3b 20 20 20 20   stat sStat;    
22b40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
22b50 2a 20 52 65 73 75 6c 74 73 20 6f 66 20 73 74 61  * Results of sta
22b60 74 28 29 20 63 61 6c 6c 20 2a 2f 0a 0a 20 20 2f  t() call */..  /
22b70 2a 20 41 20 73 74 61 74 28 29 20 63 61 6c 6c 20  * A stat() call 
22b80 6d 61 79 20 66 61 69 6c 20 66 6f 72 20 76 61 72  may fail for var
22b90 69 6f 75 73 20 72 65 61 73 6f 6e 73 2e 20 49 66  ious reasons. If
22ba0 20 74 68 69 73 20 68 61 70 70 65 6e 73 2c 20 69   this happens, i
22bb0 74 20 69 73 0a 20 20 2a 2a 20 61 6c 6d 6f 73 74  t is.  ** almost
22bc0 20 63 65 72 74 61 69 6e 20 74 68 61 74 20 61 6e   certain that an
22bd0 20 6f 70 65 6e 28 29 20 63 61 6c 6c 20 6f 6e 20   open() call on 
22be0 74 68 65 20 73 61 6d 65 20 70 61 74 68 20 77 69  the same path wi
22bf0 6c 6c 20 61 6c 73 6f 20 66 61 69 6c 2e 0a 20 20  ll also fail..  
22c00 2a 2a 20 46 6f 72 20 74 68 69 73 20 72 65 61 73  ** For this reas
22c10 6f 6e 2c 20 69 66 20 61 6e 20 65 72 72 6f 72 20  on, if an error 
22c20 6f 63 63 75 72 73 20 69 6e 20 74 68 65 20 73 74  occurs in the st
22c30 61 74 28 29 20 63 61 6c 6c 20 68 65 72 65 2c 20  at() call here, 
22c40 69 74 20 69 73 0a 20 20 2a 2a 20 69 67 6e 6f 72  it is.  ** ignor
22c50 65 64 20 61 6e 64 20 2d 31 20 69 73 20 72 65 74  ed and -1 is ret
22c60 75 72 6e 65 64 2e 20 54 68 65 20 63 61 6c 6c 65  urned. The calle
22c70 72 20 77 69 6c 6c 20 74 72 79 20 74 6f 20 6f 70  r will try to op
22c80 65 6e 20 61 20 6e 65 77 20 66 69 6c 65 0a 20 20  en a new file.  
22c90 2a 2a 20 64 65 73 63 72 69 70 74 6f 72 20 6f 6e  ** descriptor on
22ca0 20 74 68 65 20 73 61 6d 65 20 70 61 74 68 2c 20   the same path, 
22cb0 66 61 69 6c 2c 20 61 6e 64 20 72 65 74 75 72 6e  fail, and return
22cc0 20 61 6e 20 65 72 72 6f 72 20 74 6f 20 53 51 4c   an error to SQL
22cd0 69 74 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 45  ite..  **.  ** E
22ce0 76 65 6e 20 69 66 20 61 20 73 75 62 73 65 71 75  ven if a subsequ
22cf0 65 6e 74 20 6f 70 65 6e 28 29 20 63 61 6c 6c 20  ent open() call 
22d00 64 6f 65 73 20 73 75 63 63 65 65 64 2c 20 74 68  does succeed, th
22d10 65 20 63 6f 6e 73 65 71 75 65 6e 63 65 73 20 6f  e consequences o
22d20 66 0a 20 20 2a 2a 20 6e 6f 74 20 73 65 61 72 63  f.  ** not searc
22d30 68 69 6e 67 20 66 6f 72 20 61 20 72 65 73 75 73  hing for a resus
22d40 61 62 6c 65 20 66 69 6c 65 20 64 65 73 63 72 69  able file descri
22d50 70 74 6f 72 20 61 72 65 20 6e 6f 74 20 64 69 72  ptor are not dir
22d60 65 2e 20 20 2a 2f 0a 20 20 69 66 28 20 30 3d 3d  e.  */.  if( 0==
22d70 73 74 61 74 28 7a 50 61 74 68 2c 20 26 73 53 74  stat(zPath, &sSt
22d80 61 74 29 20 29 7b 0a 20 20 20 20 75 6e 69 78 49  at) ){.    unixI
22d90 6e 6f 64 65 49 6e 66 6f 20 2a 70 49 6e 6f 64 65  nodeInfo *pInode
22da0 3b 0a 0a 20 20 20 20 75 6e 69 78 45 6e 74 65 72  ;..    unixEnter
22db0 4d 75 74 65 78 28 29 3b 0a 20 20 20 20 70 49 6e  Mutex();.    pIn
22dc0 6f 64 65 20 3d 20 69 6e 6f 64 65 4c 69 73 74 3b  ode = inodeList;
22dd0 0a 20 20 20 20 77 68 69 6c 65 28 20 70 49 6e 6f  .    while( pIno
22de0 64 65 20 26 26 20 28 70 49 6e 6f 64 65 2d 3e 66  de && (pInode->f
22df0 69 6c 65 49 64 2e 64 65 76 21 3d 73 53 74 61 74  ileId.dev!=sStat
22e00 2e 73 74 5f 64 65 76 0a 20 20 20 20 20 20 20 20  .st_dev.        
22e10 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20               || 
22e20 70 49 6e 6f 64 65 2d 3e 66 69 6c 65 49 64 2e 69  pInode->fileId.i
22e30 6e 6f 21 3d 73 53 74 61 74 2e 73 74 5f 69 6e 6f  no!=sStat.st_ino
22e40 29 20 29 7b 0a 20 20 20 20 20 20 20 70 49 6e 6f  ) ){.       pIno
22e50 64 65 20 3d 20 70 49 6e 6f 64 65 2d 3e 70 4e 65  de = pInode->pNe
22e60 78 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  xt;.    }.    if
22e70 28 20 70 49 6e 6f 64 65 20 29 7b 0a 20 20 20 20  ( pInode ){.    
22e80 20 20 55 6e 69 78 55 6e 75 73 65 64 46 64 20 2a    UnixUnusedFd *
22e90 2a 70 70 3b 0a 20 20 20 20 20 20 66 6f 72 28 70  *pp;.      for(p
22ea0 70 3d 26 70 49 6e 6f 64 65 2d 3e 70 55 6e 75 73  p=&pInode->pUnus
22eb0 65 64 3b 20 2a 70 70 20 26 26 20 28 2a 70 70 29  ed; *pp && (*pp)
22ec0 2d 3e 66 6c 61 67 73 21 3d 66 6c 61 67 73 3b 20  ->flags!=flags; 
22ed0 70 70 3d 26 28 28 2a 70 70 29 2d 3e 70 4e 65 78  pp=&((*pp)->pNex
22ee0 74 29 29 3b 0a 20 20 20 20 20 20 70 55 6e 75 73  t));.      pUnus
22ef0 65 64 20 3d 20 2a 70 70 3b 0a 20 20 20 20 20 20  ed = *pp;.      
22f00 69 66 28 20 70 55 6e 75 73 65 64 20 29 7b 0a 20  if( pUnused ){. 
22f10 20 20 20 20 20 20 20 2a 70 70 20 3d 20 70 55 6e         *pp = pUn
22f20 75 73 65 64 2d 3e 70 4e 65 78 74 3b 0a 20 20 20  used->pNext;.   
22f30 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 75     }.    }.    u
22f40 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b  nixLeaveMutex();
22f50 0a 20 20 7d 0a 23 65 6e 64 69 66 20 20 20 20 2f  .  }.#endif    /
22f60 2a 20 69 66 20 21 4f 53 5f 56 58 57 4f 52 4b 53  * if !OS_VXWORKS
22f70 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 70 55 6e   */.  return pUn
22f80 75 73 65 64 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f  used;.}../*.** O
22f90 70 65 6e 20 74 68 65 20 66 69 6c 65 20 7a 50 61  pen the file zPa
22fa0 74 68 2e 0a 2a 2a 20 0a 2a 2a 20 50 72 65 76 69  th..** .** Previ
22fb0 6f 75 73 6c 79 2c 20 74 68 65 20 53 51 4c 69 74  ously, the SQLit
22fc0 65 20 4f 53 20 6c 61 79 65 72 20 75 73 65 64 20  e OS layer used 
22fd0 74 68 72 65 65 20 66 75 6e 63 74 69 6f 6e 73 20  three functions 
22fe0 69 6e 20 70 6c 61 63 65 20 6f 66 20 74 68 69 73  in place of this
22ff0 0a 2a 2a 20 6f 6e 65 3a 0a 2a 2a 0a 2a 2a 20 20  .** one:.**.**  
23000 20 20 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e     sqlite3OsOpen
23010 52 65 61 64 57 72 69 74 65 28 29 3b 0a 2a 2a 20  ReadWrite();.** 
23020 20 20 20 20 73 71 6c 69 74 65 33 4f 73 4f 70 65      sqlite3OsOpe
23030 6e 52 65 61 64 4f 6e 6c 79 28 29 3b 0a 2a 2a 20  nReadOnly();.** 
23040 20 20 20 20 73 71 6c 69 74 65 33 4f 73 4f 70 65      sqlite3OsOpe
23050 6e 45 78 63 6c 75 73 69 76 65 28 29 3b 0a 2a 2a  nExclusive();.**
23060 0a 2a 2a 20 54 68 65 73 65 20 63 61 6c 6c 73 20  .** These calls 
23070 63 6f 72 72 65 73 70 6f 6e 64 20 74 6f 20 74 68  correspond to th
23080 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 6f 6d 62  e following comb
23090 69 6e 61 74 69 6f 6e 73 20 6f 66 20 66 6c 61 67  inations of flag
230a0 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 52 65 61  s:.**.**     Rea
230b0 64 57 72 69 74 65 28 29 20 2d 3e 20 20 20 20 20  dWrite() ->     
230c0 28 52 45 41 44 57 52 49 54 45 20 7c 20 43 52 45  (READWRITE | CRE
230d0 41 54 45 29 0a 2a 2a 20 20 20 20 20 52 65 61 64  ATE).**     Read
230e0 4f 6e 6c 79 28 29 20 20 2d 3e 20 20 20 20 20 28  Only()  ->     (
230f0 52 45 41 44 4f 4e 4c 59 29 20 0a 2a 2a 20 20 20  READONLY) .**   
23100 20 20 4f 70 65 6e 45 78 63 6c 75 73 69 76 65 28    OpenExclusive(
23110 29 20 2d 3e 20 28 52 45 41 44 57 52 49 54 45 20  ) -> (READWRITE 
23120 7c 20 43 52 45 41 54 45 20 7c 20 45 58 43 4c 55  | CREATE | EXCLU
23130 53 49 56 45 29 0a 2a 2a 0a 2a 2a 20 54 68 65 20  SIVE).**.** The 
23140 6f 6c 64 20 4f 70 65 6e 45 78 63 6c 75 73 69 76  old OpenExclusiv
23150 65 28 29 20 61 63 63 65 70 74 65 64 20 61 20 62  e() accepted a b
23160 6f 6f 6c 65 61 6e 20 61 72 67 75 6d 65 6e 74 20  oolean argument 
23170 2d 20 22 64 65 6c 46 6c 61 67 22 2e 20 49 66 0a  - "delFlag". If.
23180 2a 2a 20 74 72 75 65 2c 20 74 68 65 20 66 69 6c  ** true, the fil
23190 65 20 77 61 73 20 63 6f 6e 66 69 67 75 72 65 64  e was configured
231a0 20 74 6f 20 62 65 20 61 75 74 6f 6d 61 74 69 63   to be automatic
231b0 61 6c 6c 79 20 64 65 6c 65 74 65 64 20 77 68 65  ally deleted whe
231c0 6e 20 74 68 65 0a 2a 2a 20 66 69 6c 65 20 68 61  n the.** file ha
231d0 6e 64 6c 65 20 63 6c 6f 73 65 64 2e 20 54 6f 20  ndle closed. To 
231e0 61 63 68 69 65 76 65 20 74 68 65 20 73 61 6d 65  achieve the same
231f0 20 65 66 66 65 63 74 20 75 73 69 6e 67 20 74 68   effect using th
23200 69 73 20 6e 65 77 20 0a 2a 2a 20 69 6e 74 65 72  is new .** inter
23210 66 61 63 65 2c 20 61 64 64 20 74 68 65 20 44 45  face, add the DE
23220 4c 45 54 45 4f 4e 43 4c 4f 53 45 20 66 6c 61 67  LETEONCLOSE flag
23230 20 74 6f 20 74 68 6f 73 65 20 73 70 65 63 69 66   to those specif
23240 69 65 64 20 61 62 6f 76 65 20 66 6f 72 20 0a 2a  ied above for .*
23250 2a 20 4f 70 65 6e 45 78 63 6c 75 73 69 76 65 28  * OpenExclusive(
23260 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  )..*/.static int
23270 20 75 6e 69 78 4f 70 65 6e 28 0a 20 20 73 71 6c   unixOpen(.  sql
23280 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20  ite3_vfs *pVfs, 
23290 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
232a0 20 56 46 53 20 66 6f 72 20 77 68 69 63 68 20 74   VFS for which t
232b0 68 69 73 20 69 73 20 74 68 65 20 78 4f 70 65 6e  his is the xOpen
232c0 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 63 6f 6e   method */.  con
232d0 73 74 20 63 68 61 72 20 2a 7a 50 61 74 68 2c 20  st char *zPath, 
232e0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 74            /* Pat
232f0 68 6e 61 6d 65 20 6f 66 20 66 69 6c 65 20 74 6f  hname of file to
23300 20 62 65 20 6f 70 65 6e 65 64 20 2a 2f 0a 20 20   be opened */.  
23310 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 46  sqlite3_file *pF
23320 69 6c 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20  ile,         /* 
23330 54 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70  The file descrip
23340 74 6f 72 20 74 6f 20 62 65 20 66 69 6c 6c 65 64  tor to be filled
23350 20 69 6e 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61   in */.  int fla
23360 67 73 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  gs,             
23370 20 20 20 20 20 20 2f 2a 20 49 6e 70 75 74 20 66        /* Input f
23380 6c 61 67 73 20 74 6f 20 63 6f 6e 74 72 6f 6c 20  lags to control 
23390 74 68 65 20 6f 70 65 6e 69 6e 67 20 2a 2f 0a 20  the opening */. 
233a0 20 69 6e 74 20 2a 70 4f 75 74 46 6c 61 67 73 20   int *pOutFlags 
233b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
233c0 20 4f 75 74 70 75 74 20 66 6c 61 67 73 20 72 65   Output flags re
233d0 74 75 72 6e 65 64 20 74 6f 20 53 51 4c 69 74 65  turned to SQLite
233e0 20 63 6f 72 65 20 2a 2f 0a 29 7b 0a 20 20 75 6e   core */.){.  un
233f0 69 78 46 69 6c 65 20 2a 70 20 3d 20 28 75 6e 69  ixFile *p = (uni
23400 78 46 69 6c 65 20 2a 29 70 46 69 6c 65 3b 0a 20  xFile *)pFile;. 
23410 20 69 6e 74 20 66 64 20 3d 20 2d 31 3b 20 20 20   int fd = -1;   
23420 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23430 2f 2a 20 46 69 6c 65 20 64 65 73 63 72 69 70 74  /* File descript
23440 6f 72 20 72 65 74 75 72 6e 65 64 20 62 79 20 6f  or returned by o
23450 70 65 6e 28 29 20 2a 2f 0a 20 20 69 6e 74 20 64  pen() */.  int d
23460 69 72 66 64 20 3d 20 2d 31 3b 20 20 20 20 20 20  irfd = -1;      
23470 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 69 72            /* Dir
23480 65 63 74 6f 72 79 20 66 69 6c 65 20 64 65 73 63  ectory file desc
23490 72 69 70 74 6f 72 20 2a 2f 0a 20 20 69 6e 74 20  riptor */.  int 
234a0 6f 70 65 6e 46 6c 61 67 73 20 3d 20 30 3b 20 20  openFlags = 0;  
234b0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6c             /* Fl
234c0 61 67 73 20 74 6f 20 70 61 73 73 20 74 6f 20 6f  ags to pass to o
234d0 70 65 6e 28 29 20 2a 2f 0a 20 20 69 6e 74 20 65  pen() */.  int e
234e0 54 79 70 65 20 3d 20 66 6c 61 67 73 26 30 78 46  Type = flags&0xF
234f0 46 46 46 46 46 30 30 3b 20 20 2f 2a 20 54 79 70  FFFFF00;  /* Typ
23500 65 20 6f 66 20 66 69 6c 65 20 74 6f 20 6f 70 65  e of file to ope
23510 6e 20 2a 2f 0a 20 20 69 6e 74 20 6e 6f 4c 6f 63  n */.  int noLoc
23520 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  k;              
23530 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 74 6f        /* True to
23540 20 6f 6d 69 74 20 6c 6f 63 6b 69 6e 67 20 70 72   omit locking pr
23550 69 6d 69 74 69 76 65 73 20 2a 2f 0a 20 20 69 6e  imitives */.  in
23560 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
23570 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
23580 46 75 6e 63 74 69 6f 6e 20 52 65 74 75 72 6e 20  Function Return 
23590 43 6f 64 65 20 2a 2f 0a 0a 20 20 69 6e 74 20 69  Code */..  int i
235a0 73 45 78 63 6c 75 73 69 76 65 20 20 3d 20 28 66  sExclusive  = (f
235b0 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50  lags & SQLITE_OP
235c0 45 4e 5f 45 58 43 4c 55 53 49 56 45 29 3b 0a 20  EN_EXCLUSIVE);. 
235d0 20 69 6e 74 20 69 73 44 65 6c 65 74 65 20 20 20   int isDelete   
235e0 20 20 3d 20 28 66 6c 61 67 73 20 26 20 53 51 4c    = (flags & SQL
235f0 49 54 45 5f 4f 50 45 4e 5f 44 45 4c 45 54 45 4f  ITE_OPEN_DELETEO
23600 4e 43 4c 4f 53 45 29 3b 0a 20 20 69 6e 74 20 69  NCLOSE);.  int i
23610 73 43 72 65 61 74 65 20 20 20 20 20 3d 20 28 66  sCreate     = (f
23620 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50  lags & SQLITE_OP
23630 45 4e 5f 43 52 45 41 54 45 29 3b 0a 20 20 69 6e  EN_CREATE);.  in
23640 74 20 69 73 52 65 61 64 6f 6e 6c 79 20 20 20 3d  t isReadonly   =
23650 20 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45   (flags & SQLITE
23660 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 29 3b  _OPEN_READONLY);
23670 0a 20 20 69 6e 74 20 69 73 52 65 61 64 57 72 69  .  int isReadWri
23680 74 65 20 20 3d 20 28 66 6c 61 67 73 20 26 20 53  te  = (flags & S
23690 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57  QLITE_OPEN_READW
236a0 52 49 54 45 29 3b 0a 23 69 66 20 53 51 4c 49 54  RITE);.#if SQLIT
236b0 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47  E_ENABLE_LOCKING
236c0 5f 53 54 59 4c 45 0a 20 20 69 6e 74 20 69 73 41  _STYLE.  int isA
236d0 75 74 6f 50 72 6f 78 79 20 20 3d 20 28 66 6c 61  utoProxy  = (fla
236e0 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e  gs & SQLITE_OPEN
236f0 5f 41 55 54 4f 50 52 4f 58 59 29 3b 0a 23 65 6e  _AUTOPROXY);.#en
23700 64 69 66 0a 0a 20 20 2f 2a 20 49 66 20 63 72 65  dif..  /* If cre
23710 61 74 69 6e 67 20 61 20 6d 61 73 74 65 72 20 6f  ating a master o
23720 72 20 6d 61 69 6e 2d 66 69 6c 65 20 6a 6f 75 72  r main-file jour
23730 6e 61 6c 2c 20 74 68 69 73 20 66 75 6e 63 74 69  nal, this functi
23740 6f 6e 20 77 69 6c 6c 20 6f 70 65 6e 0a 20 20 2a  on will open.  *
23750 2a 20 61 20 66 69 6c 65 2d 64 65 73 63 72 69 70  * a file-descrip
23760 74 6f 72 20 6f 6e 20 74 68 65 20 64 69 72 65 63  tor on the direc
23770 74 6f 72 79 20 74 6f 6f 2e 20 54 68 65 20 66 69  tory too. The fi
23780 72 73 74 20 74 69 6d 65 20 75 6e 69 78 53 79 6e  rst time unixSyn
23790 63 28 29 0a 20 20 2a 2a 20 69 73 20 63 61 6c 6c  c().  ** is call
237a0 65 64 20 74 68 65 20 64 69 72 65 63 74 6f 72 79  ed the directory
237b0 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
237c0 20 77 69 6c 6c 20 62 65 20 66 73 79 6e 63 28 29   will be fsync()
237d0 65 64 20 61 6e 64 20 63 6c 6f 73 65 28 29 64 2e  ed and close()d.
237e0 0a 20 20 2a 2f 0a 20 20 69 6e 74 20 69 73 4f 70  .  */.  int isOp
237f0 65 6e 44 69 72 65 63 74 6f 72 79 20 3d 20 28 69  enDirectory = (i
23800 73 43 72 65 61 74 65 20 26 26 20 0a 20 20 20 20  sCreate && .    
23810 20 20 28 65 54 79 70 65 3d 3d 53 51 4c 49 54 45    (eType==SQLITE
23820 5f 4f 50 45 4e 5f 4d 41 53 54 45 52 5f 4a 4f 55  _OPEN_MASTER_JOU
23830 52 4e 41 4c 20 7c 7c 20 65 54 79 70 65 3d 3d 53  RNAL || eType==S
23840 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f  QLITE_OPEN_MAIN_
23850 4a 4f 55 52 4e 41 4c 29 0a 20 20 29 3b 0a 0a 20  JOURNAL).  );.. 
23860 20 2f 2a 20 49 66 20 61 72 67 75 6d 65 6e 74 20   /* If argument 
23870 7a 50 61 74 68 20 69 73 20 61 20 4e 55 4c 4c 20  zPath is a NULL 
23880 70 6f 69 6e 74 65 72 2c 20 74 68 69 73 20 66 75  pointer, this fu
23890 6e 63 74 69 6f 6e 20 69 73 20 72 65 71 75 69 72  nction is requir
238a0 65 64 20 74 6f 20 6f 70 65 6e 0a 20 20 2a 2a 20  ed to open.  ** 
238b0 61 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65  a temporary file
238c0 2e 20 55 73 65 20 74 68 69 73 20 62 75 66 66 65  . Use this buffe
238d0 72 20 74 6f 20 73 74 6f 72 65 20 74 68 65 20 66  r to store the f
238e0 69 6c 65 20 6e 61 6d 65 20 69 6e 2e 0a 20 20 2a  ile name in..  *
238f0 2f 0a 20 20 63 68 61 72 20 7a 54 6d 70 6e 61 6d  /.  char zTmpnam
23900 65 5b 4d 41 58 5f 50 41 54 48 4e 41 4d 45 2b 31  e[MAX_PATHNAME+1
23910 5d 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  ];.  const char 
23920 2a 7a 4e 61 6d 65 20 3d 20 7a 50 61 74 68 3b 0a  *zName = zPath;.
23930 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74 68 65 20  .  /* Check the 
23940 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 61 74 65 6d  following statem
23950 65 6e 74 73 20 61 72 65 20 74 72 75 65 3a 20 0a  ents are true: .
23960 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 28 61 29 20    **.  **   (a) 
23970 45 78 61 63 74 6c 79 20 6f 6e 65 20 6f 66 20 74  Exactly one of t
23980 68 65 20 52 45 41 44 57 52 49 54 45 20 61 6e 64  he READWRITE and
23990 20 52 45 41 44 4f 4e 4c 59 20 66 6c 61 67 73 20   READONLY flags 
239a0 6d 75 73 74 20 62 65 20 73 65 74 2c 20 61 6e 64  must be set, and
239b0 20 0a 20 20 2a 2a 20 20 20 28 62 29 20 69 66 20   .  **   (b) if 
239c0 43 52 45 41 54 45 20 69 73 20 73 65 74 2c 20 74  CREATE is set, t
239d0 68 65 6e 20 52 45 41 44 57 52 49 54 45 20 6d 75  hen READWRITE mu
239e0 73 74 20 61 6c 73 6f 20 62 65 20 73 65 74 2c 20  st also be set, 
239f0 61 6e 64 0a 20 20 2a 2a 20 20 20 28 63 29 20 69  and.  **   (c) i
23a00 66 20 45 58 43 4c 55 53 49 56 45 20 69 73 20 73  f EXCLUSIVE is s
23a10 65 74 2c 20 74 68 65 6e 20 43 52 45 41 54 45 20  et, then CREATE 
23a20 6d 75 73 74 20 61 6c 73 6f 20 62 65 20 73 65 74  must also be set
23a30 2e 0a 20 20 2a 2a 20 20 20 28 64 29 20 69 66 20  ..  **   (d) if 
23a40 44 45 4c 45 54 45 4f 4e 43 4c 4f 53 45 20 69 73  DELETEONCLOSE is
23a50 20 73 65 74 2c 20 74 68 65 6e 20 43 52 45 41 54   set, then CREAT
23a60 45 20 6d 75 73 74 20 61 6c 73 6f 20 62 65 20 73  E must also be s
23a70 65 74 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72  et..  */.  asser
23a80 74 28 28 69 73 52 65 61 64 6f 6e 6c 79 3d 3d 30  t((isReadonly==0
23a90 20 7c 7c 20 69 73 52 65 61 64 57 72 69 74 65 3d   || isReadWrite=
23aa0 3d 30 29 20 26 26 20 28 69 73 52 65 61 64 57 72  =0) && (isReadWr
23ab0 69 74 65 20 7c 7c 20 69 73 52 65 61 64 6f 6e 6c  ite || isReadonl
23ac0 79 29 29 3b 0a 20 20 61 73 73 65 72 74 28 69 73  y));.  assert(is
23ad0 43 72 65 61 74 65 3d 3d 30 20 7c 7c 20 69 73 52  Create==0 || isR
23ae0 65 61 64 57 72 69 74 65 29 3b 0a 20 20 61 73 73  eadWrite);.  ass
23af0 65 72 74 28 69 73 45 78 63 6c 75 73 69 76 65 3d  ert(isExclusive=
23b00 3d 30 20 7c 7c 20 69 73 43 72 65 61 74 65 29 3b  =0 || isCreate);
23b10 0a 20 20 61 73 73 65 72 74 28 69 73 44 65 6c 65  .  assert(isDele
23b20 74 65 3d 3d 30 20 7c 7c 20 69 73 43 72 65 61 74  te==0 || isCreat
23b30 65 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 6d 61  e);..  /* The ma
23b40 69 6e 20 44 42 2c 20 6d 61 69 6e 20 6a 6f 75 72  in DB, main jour
23b50 6e 61 6c 2c 20 61 6e 64 20 6d 61 73 74 65 72 20  nal, and master 
23b60 6a 6f 75 72 6e 61 6c 20 61 72 65 20 6e 65 76 65  journal are neve
23b70 72 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 0a  r automatically.
23b80 20 20 2a 2a 20 64 65 6c 65 74 65 64 2e 20 4e 6f    ** deleted. No
23b90 72 20 61 72 65 20 74 68 65 79 20 65 76 65 72 20  r are they ever 
23ba0 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 73 2e  temporary files.
23bb0 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 28    */.  assert( (
23bc0 21 69 73 44 65 6c 65 74 65 20 26 26 20 7a 4e 61  !isDelete && zNa
23bd0 6d 65 29 20 7c 7c 20 65 54 79 70 65 21 3d 53 51  me) || eType!=SQ
23be0 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44  LITE_OPEN_MAIN_D
23bf0 42 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28  B );.  assert( (
23c00 21 69 73 44 65 6c 65 74 65 20 26 26 20 7a 4e 61  !isDelete && zNa
23c10 6d 65 29 20 7c 7c 20 65 54 79 70 65 21 3d 53 51  me) || eType!=SQ
23c20 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a  LITE_OPEN_MAIN_J
23c30 4f 55 52 4e 41 4c 20 29 3b 0a 20 20 61 73 73 65  OURNAL );.  asse
23c40 72 74 28 20 28 21 69 73 44 65 6c 65 74 65 20 26  rt( (!isDelete &
23c50 26 20 7a 4e 61 6d 65 29 20 7c 7c 20 65 54 79 70  & zName) || eTyp
23c60 65 21 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d  e!=SQLITE_OPEN_M
23c70 41 53 54 45 52 5f 4a 4f 55 52 4e 41 4c 20 29 3b  ASTER_JOURNAL );
23c80 0a 0a 20 20 2f 2a 20 41 73 73 65 72 74 20 74 68  ..  /* Assert th
23c90 61 74 20 74 68 65 20 75 70 70 65 72 20 6c 61 79  at the upper lay
23ca0 65 72 20 68 61 73 20 73 65 74 20 6f 6e 65 20 6f  er has set one o
23cb0 66 20 74 68 65 20 22 66 69 6c 65 2d 74 79 70 65  f the "file-type
23cc0 22 20 66 6c 61 67 73 2e 20 2a 2f 0a 20 20 61 73  " flags. */.  as
23cd0 73 65 72 74 28 20 65 54 79 70 65 3d 3d 53 51 4c  sert( eType==SQL
23ce0 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42  ITE_OPEN_MAIN_DB
23cf0 20 20 20 20 20 20 7c 7c 20 65 54 79 70 65 3d 3d        || eType==
23d00 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 45 4d 50  SQLITE_OPEN_TEMP
23d10 5f 44 42 20 0a 20 20 20 20 20 20 20 7c 7c 20 65  _DB .       || e
23d20 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45  Type==SQLITE_OPE
23d30 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 20 7c  N_MAIN_JOURNAL |
23d40 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f  | eType==SQLITE_
23d50 4f 50 45 4e 5f 54 45 4d 50 5f 4a 4f 55 52 4e 41  OPEN_TEMP_JOURNA
23d60 4c 20 0a 20 20 20 20 20 20 20 7c 7c 20 65 54 79  L .       || eTy
23d70 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  pe==SQLITE_OPEN_
23d80 53 55 42 4a 4f 55 52 4e 41 4c 20 20 20 7c 7c 20  SUBJOURNAL   || 
23d90 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50  eType==SQLITE_OP
23da0 45 4e 5f 4d 41 53 54 45 52 5f 4a 4f 55 52 4e 41  EN_MASTER_JOURNA
23db0 4c 20 0a 20 20 20 20 20 20 20 7c 7c 20 65 54 79  L .       || eTy
23dc0 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  pe==SQLITE_OPEN_
23dd0 54 52 41 4e 53 49 45 4e 54 5f 44 42 0a 20 20 29  TRANSIENT_DB.  )
23de0 3b 0a 0a 20 20 6d 65 6d 73 65 74 28 70 2c 20 30  ;..  memset(p, 0
23df0 2c 20 73 69 7a 65 6f 66 28 75 6e 69 78 46 69 6c  , sizeof(unixFil
23e00 65 29 29 3b 0a 0a 20 20 69 66 28 20 65 54 79 70  e));..  if( eTyp
23e10 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d  e==SQLITE_OPEN_M
23e20 41 49 4e 5f 44 42 20 29 7b 0a 20 20 20 20 55 6e  AIN_DB ){.    Un
23e30 69 78 55 6e 75 73 65 64 46 64 20 2a 70 55 6e 75  ixUnusedFd *pUnu
23e40 73 65 64 3b 0a 20 20 20 20 70 55 6e 75 73 65 64  sed;.    pUnused
23e50 20 3d 20 66 69 6e 64 52 65 75 73 61 62 6c 65 46   = findReusableF
23e60 64 28 7a 4e 61 6d 65 2c 20 66 6c 61 67 73 29 3b  d(zName, flags);
23e70 0a 20 20 20 20 69 66 28 20 70 55 6e 75 73 65 64  .    if( pUnused
23e80 20 29 7b 0a 20 20 20 20 20 20 66 64 20 3d 20 70   ){.      fd = p
23e90 55 6e 75 73 65 64 2d 3e 66 64 3b 0a 20 20 20 20  Unused->fd;.    
23ea0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 55 6e  }else{.      pUn
23eb0 75 73 65 64 20 3d 20 73 71 6c 69 74 65 33 5f 6d  used = sqlite3_m
23ec0 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 2a 70 55  alloc(sizeof(*pU
23ed0 6e 75 73 65 64 29 29 3b 0a 20 20 20 20 20 20 69  nused));.      i
23ee0 66 28 20 21 70 55 6e 75 73 65 64 20 29 7b 0a 20  f( !pUnused ){. 
23ef0 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51         return SQ
23f00 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
23f10 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 70 2d    }.    }.    p-
23f20 3e 70 55 6e 75 73 65 64 20 3d 20 70 55 6e 75 73  >pUnused = pUnus
23f30 65 64 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  ed;.  }else if( 
23f40 21 7a 4e 61 6d 65 20 29 7b 0a 20 20 20 20 2f 2a  !zName ){.    /*
23f50 20 49 66 20 7a 4e 61 6d 65 20 69 73 20 4e 55 4c   If zName is NUL
23f60 4c 2c 20 74 68 65 20 75 70 70 65 72 20 6c 61 79  L, the upper lay
23f70 65 72 20 69 73 20 72 65 71 75 65 73 74 69 6e 67  er is requesting
23f80 20 61 20 74 65 6d 70 20 66 69 6c 65 2e 20 2a 2f   a temp file. */
23f90 0a 20 20 20 20 61 73 73 65 72 74 28 69 73 44 65  .    assert(isDe
23fa0 6c 65 74 65 20 26 26 20 21 69 73 4f 70 65 6e 44  lete && !isOpenD
23fb0 69 72 65 63 74 6f 72 79 29 3b 0a 20 20 20 20 72  irectory);.    r
23fc0 63 20 3d 20 67 65 74 54 65 6d 70 6e 61 6d 65 28  c = getTempname(
23fd0 4d 41 58 5f 50 41 54 48 4e 41 4d 45 2b 31 2c 20  MAX_PATHNAME+1, 
23fe0 7a 54 6d 70 6e 61 6d 65 29 3b 0a 20 20 20 20 69  zTmpname);.    i
23ff0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
24000 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
24010 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a   rc;.    }.    z
24020 4e 61 6d 65 20 3d 20 7a 54 6d 70 6e 61 6d 65 3b  Name = zTmpname;
24030 0a 20 20 7d 0a 0a 20 20 2f 2a 20 44 65 74 65 72  .  }..  /* Deter
24040 6d 69 6e 65 20 74 68 65 20 76 61 6c 75 65 20 6f  mine the value o
24050 66 20 74 68 65 20 66 6c 61 67 73 20 70 61 72 61  f the flags para
24060 6d 65 74 65 72 20 70 61 73 73 65 64 20 74 6f 20  meter passed to 
24070 50 4f 53 49 58 20 66 75 6e 63 74 69 6f 6e 0a 20  POSIX function. 
24080 20 2a 2a 20 6f 70 65 6e 28 29 2e 20 54 68 65 73   ** open(). Thes
24090 65 20 6d 75 73 74 20 62 65 20 63 61 6c 63 75 6c  e must be calcul
240a0 61 74 65 64 20 65 76 65 6e 20 69 66 20 6f 70 65  ated even if ope
240b0 6e 28 29 20 69 73 20 6e 6f 74 20 63 61 6c 6c 65  n() is not calle
240c0 64 2c 20 61 73 0a 20 20 2a 2a 20 74 68 65 79 20  d, as.  ** they 
240d0 6d 61 79 20 62 65 20 73 74 6f 72 65 64 20 61 73  may be stored as
240e0 20 70 61 72 74 20 6f 66 20 74 68 65 20 66 69 6c   part of the fil
240f0 65 20 68 61 6e 64 6c 65 20 61 6e 64 20 75 73 65  e handle and use
24100 64 20 62 79 20 74 68 65 20 0a 20 20 2a 2a 20 27  d by the .  ** '
24110 63 6f 6e 63 68 20 66 69 6c 65 27 20 6c 6f 63 6b  conch file' lock
24120 69 6e 67 20 66 75 6e 63 74 69 6f 6e 73 20 6c 61  ing functions la
24130 74 65 72 20 6f 6e 2e 20 20 2a 2f 0a 20 20 69 66  ter on.  */.  if
24140 28 20 69 73 52 65 61 64 6f 6e 6c 79 20 29 20 20  ( isReadonly )  
24150 6f 70 65 6e 46 6c 61 67 73 20 7c 3d 20 4f 5f 52  openFlags |= O_R
24160 44 4f 4e 4c 59 3b 0a 20 20 69 66 28 20 69 73 52  DONLY;.  if( isR
24170 65 61 64 57 72 69 74 65 20 29 20 6f 70 65 6e 46  eadWrite ) openF
24180 6c 61 67 73 20 7c 3d 20 4f 5f 52 44 57 52 3b 0a  lags |= O_RDWR;.
24190 20 20 69 66 28 20 69 73 43 72 65 61 74 65 20 29    if( isCreate )
241a0 20 20 20 20 6f 70 65 6e 46 6c 61 67 73 20 7c 3d      openFlags |=
241b0 20 4f 5f 43 52 45 41 54 3b 0a 20 20 69 66 28 20   O_CREAT;.  if( 
241c0 69 73 45 78 63 6c 75 73 69 76 65 20 29 20 6f 70  isExclusive ) op
241d0 65 6e 46 6c 61 67 73 20 7c 3d 20 28 4f 5f 45 58  enFlags |= (O_EX
241e0 43 4c 7c 4f 5f 4e 4f 46 4f 4c 4c 4f 57 29 3b 0a  CL|O_NOFOLLOW);.
241f0 20 20 6f 70 65 6e 46 6c 61 67 73 20 7c 3d 20 28    openFlags |= (
24200 4f 5f 4c 41 52 47 45 46 49 4c 45 7c 4f 5f 42 49  O_LARGEFILE|O_BI
24210 4e 41 52 59 29 3b 0a 0a 20 20 69 66 28 20 66 64  NARY);..  if( fd
24220 3c 30 20 29 7b 0a 20 20 20 20 6d 6f 64 65 5f 74  <0 ){.    mode_t
24230 20 6f 70 65 6e 4d 6f 64 65 20 3d 20 28 69 73 44   openMode = (isD
24240 65 6c 65 74 65 3f 30 36 30 30 3a 53 51 4c 49 54  elete?0600:SQLIT
24250 45 5f 44 45 46 41 55 4c 54 5f 46 49 4c 45 5f 50  E_DEFAULT_FILE_P
24260 45 52 4d 49 53 53 49 4f 4e 53 29 3b 0a 20 20 20  ERMISSIONS);.   
24270 20 66 64 20 3d 20 6f 70 65 6e 28 7a 4e 61 6d 65   fd = open(zName
24280 2c 20 6f 70 65 6e 46 6c 61 67 73 2c 20 6f 70 65  , openFlags, ope
24290 6e 4d 6f 64 65 29 3b 0a 20 20 20 20 4f 53 54 52  nMode);.    OSTR
242a0 41 43 45 28 28 22 4f 50 45 4e 58 20 20 20 25 2d  ACE(("OPENX   %-
242b0 33 64 20 25 73 20 30 25 6f 5c 6e 22 2c 20 66 64  3d %s 0%o\n", fd
242c0 2c 20 7a 4e 61 6d 65 2c 20 6f 70 65 6e 46 6c 61  , zName, openFla
242d0 67 73 29 29 3b 0a 20 20 20 20 69 66 28 20 66 64  gs));.    if( fd
242e0 3c 30 20 26 26 20 65 72 72 6e 6f 21 3d 45 49 53  <0 && errno!=EIS
242f0 44 49 52 20 26 26 20 69 73 52 65 61 64 57 72 69  DIR && isReadWri
24300 74 65 20 26 26 20 21 69 73 45 78 63 6c 75 73 69  te && !isExclusi
24310 76 65 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 46  ve ){.      /* F
24320 61 69 6c 65 64 20 74 6f 20 6f 70 65 6e 20 74 68  ailed to open th
24330 65 20 66 69 6c 65 20 66 6f 72 20 72 65 61 64 2f  e file for read/
24340 77 72 69 74 65 20 61 63 63 65 73 73 2e 20 54 72  write access. Tr
24350 79 20 72 65 61 64 2d 6f 6e 6c 79 2e 20 2a 2f 0a  y read-only. */.
24360 20 20 20 20 20 20 66 6c 61 67 73 20 26 3d 20 7e        flags &= ~
24370 28 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41  (SQLITE_OPEN_REA
24380 44 57 52 49 54 45 7c 53 51 4c 49 54 45 5f 4f 50  DWRITE|SQLITE_OP
24390 45 4e 5f 43 52 45 41 54 45 29 3b 0a 20 20 20 20  EN_CREATE);.    
243a0 20 20 6f 70 65 6e 46 6c 61 67 73 20 26 3d 20 7e    openFlags &= ~
243b0 28 4f 5f 52 44 57 52 7c 4f 5f 43 52 45 41 54 29  (O_RDWR|O_CREAT)
243c0 3b 0a 20 20 20 20 20 20 66 6c 61 67 73 20 7c 3d  ;.      flags |=
243d0 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41   SQLITE_OPEN_REA
243e0 44 4f 4e 4c 59 3b 0a 20 20 20 20 20 20 6f 70 65  DONLY;.      ope
243f0 6e 46 6c 61 67 73 20 7c 3d 20 4f 5f 52 44 4f 4e  nFlags |= O_RDON
24400 4c 59 3b 0a 20 20 20 20 20 20 66 64 20 3d 20 6f  LY;.      fd = o
24410 70 65 6e 28 7a 4e 61 6d 65 2c 20 6f 70 65 6e 46  pen(zName, openF
24420 6c 61 67 73 2c 20 6f 70 65 6e 4d 6f 64 65 29 3b  lags, openMode);
24430 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 66  .    }.    if( f
24440 64 3c 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20  d<0 ){.      rc 
24450 3d 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45  = SQLITE_CANTOPE
24460 4e 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 67 6f  N_BKPT;.      go
24470 74 6f 20 6f 70 65 6e 5f 66 69 6e 69 73 68 65 64  to open_finished
24480 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 61 73  ;.    }.  }.  as
24490 73 65 72 74 28 20 66 64 3e 3d 30 20 29 3b 0a 20  sert( fd>=0 );. 
244a0 20 69 66 28 20 70 4f 75 74 46 6c 61 67 73 20 29   if( pOutFlags )
244b0 7b 0a 20 20 20 20 2a 70 4f 75 74 46 6c 61 67 73  {.    *pOutFlags
244c0 20 3d 20 66 6c 61 67 73 3b 0a 20 20 7d 0a 0a 20   = flags;.  }.. 
244d0 20 69 66 28 20 70 2d 3e 70 55 6e 75 73 65 64 20   if( p->pUnused 
244e0 29 7b 0a 20 20 20 20 70 2d 3e 70 55 6e 75 73 65  ){.    p->pUnuse
244f0 64 2d 3e 66 64 20 3d 20 66 64 3b 0a 20 20 20 20  d->fd = fd;.    
24500 70 2d 3e 70 55 6e 75 73 65 64 2d 3e 66 6c 61 67  p->pUnused->flag
24510 73 20 3d 20 66 6c 61 67 73 3b 0a 20 20 7d 0a 0a  s = flags;.  }..
24520 20 20 69 66 28 20 69 73 44 65 6c 65 74 65 20 29    if( isDelete )
24530 7b 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53  {.#if OS_VXWORKS
24540 0a 20 20 20 20 7a 50 61 74 68 20 3d 20 7a 4e 61  .    zPath = zNa
24550 6d 65 3b 0a 23 65 6c 73 65 0a 20 20 20 20 75 6e  me;.#else.    un
24560 6c 69 6e 6b 28 7a 4e 61 6d 65 29 3b 0a 23 65 6e  link(zName);.#en
24570 64 69 66 0a 20 20 7d 0a 23 69 66 20 53 51 4c 49  dif.  }.#if SQLI
24580 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e  TE_ENABLE_LOCKIN
24590 47 5f 53 54 59 4c 45 0a 20 20 65 6c 73 65 7b 0a  G_STYLE.  else{.
245a0 20 20 20 20 70 2d 3e 6f 70 65 6e 46 6c 61 67 73      p->openFlags
245b0 20 3d 20 6f 70 65 6e 46 6c 61 67 73 3b 0a 20 20   = openFlags;.  
245c0 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 69 66 28 20  }.#endif..  if( 
245d0 69 73 4f 70 65 6e 44 69 72 65 63 74 6f 72 79 20  isOpenDirectory 
245e0 29 7b 0a 20 20 20 20 72 63 20 3d 20 6f 70 65 6e  ){.    rc = open
245f0 44 69 72 65 63 74 6f 72 79 28 7a 50 61 74 68 2c  Directory(zPath,
24600 20 26 64 69 72 66 64 29 3b 0a 20 20 20 20 69 66   &dirfd);.    if
24610 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
24620 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 74 20 69  ){.      /* It i
24630 73 20 73 61 66 65 20 74 6f 20 63 6c 6f 73 65 20  s safe to close 
24640 66 64 20 61 74 20 74 68 69 73 20 70 6f 69 6e 74  fd at this point
24650 2c 20 62 65 63 61 75 73 65 20 69 74 20 69 73 20  , because it is 
24660 67 75 61 72 61 6e 74 65 65 64 20 6e 6f 74 0a 20  guaranteed not. 
24670 20 20 20 20 20 2a 2a 20 74 6f 20 62 65 20 6f 70       ** to be op
24680 65 6e 20 6f 6e 20 61 20 64 61 74 61 62 61 73 65  en on a database
24690 20 66 69 6c 65 2e 20 49 66 20 69 74 20 77 65 72   file. If it wer
246a0 65 20 6f 70 65 6e 20 6f 6e 20 61 20 64 61 74 61  e open on a data
246b0 62 61 73 65 20 66 69 6c 65 2c 0a 20 20 20 20 20  base file,.     
246c0 20 2a 2a 20 69 74 20 77 6f 75 6c 64 20 6e 6f 74   ** it would not
246d0 20 62 65 20 73 61 66 65 20 74 6f 20 63 6c 6f 73   be safe to clos
246e0 65 20 61 73 20 74 68 69 73 20 77 6f 75 6c 64 20  e as this would 
246f0 72 65 6c 65 61 73 65 20 61 6e 79 20 6c 6f 63 6b  release any lock
24700 73 20 68 65 6c 64 0a 20 20 20 20 20 20 2a 2a 20  s held.      ** 
24710 6f 6e 20 74 68 65 20 66 69 6c 65 20 62 79 20 74  on the file by t
24720 68 69 73 20 70 72 6f 63 65 73 73 2e 20 20 2a 2f  his process.  */
24730 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 65  .      assert( e
24740 54 79 70 65 21 3d 53 51 4c 49 54 45 5f 4f 50 45  Type!=SQLITE_OPE
24750 4e 5f 4d 41 49 4e 5f 44 42 20 29 3b 0a 20 20 20  N_MAIN_DB );.   
24760 20 20 20 63 6c 6f 73 65 28 66 64 29 3b 20 20 20     close(fd);   
24770 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73 69 6c            /* sil
24780 65 6e 74 6c 79 20 6c 65 61 6b 20 69 66 20 66 61  ently leak if fa
24790 69 6c 2c 20 61 6c 72 65 61 64 79 20 69 6e 20 65  il, already in e
247a0 72 72 6f 72 20 2a 2f 0a 20 20 20 20 20 20 67 6f  rror */.      go
247b0 74 6f 20 6f 70 65 6e 5f 66 69 6e 69 73 68 65 64  to open_finished
247c0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 23 69 66  ;.    }.  }..#if
247d0 64 65 66 20 46 44 5f 43 4c 4f 45 58 45 43 0a 20  def FD_CLOEXEC. 
247e0 20 66 63 6e 74 6c 28 66 64 2c 20 46 5f 53 45 54   fcntl(fd, F_SET
247f0 46 44 2c 20 66 63 6e 74 6c 28 66 64 2c 20 46 5f  FD, fcntl(fd, F_
24800 47 45 54 46 44 2c 20 30 29 20 7c 20 46 44 5f 43  GETFD, 0) | FD_C
24810 4c 4f 45 58 45 43 29 3b 0a 23 65 6e 64 69 66 0a  LOEXEC);.#endif.
24820 0a 20 20 6e 6f 4c 6f 63 6b 20 3d 20 65 54 79 70  .  noLock = eTyp
24830 65 21 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d  e!=SQLITE_OPEN_M
24840 41 49 4e 5f 44 42 3b 0a 0a 20 20 0a 23 69 66 20  AIN_DB;..  .#if 
24850 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f  defined(__APPLE_
24860 5f 29 20 7c 7c 20 53 51 4c 49 54 45 5f 45 4e 41  _) || SQLITE_ENA
24870 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c  BLE_LOCKING_STYL
24880 45 0a 20 20 73 74 72 75 63 74 20 73 74 61 74 66  E.  struct statf
24890 73 20 66 73 49 6e 66 6f 3b 0a 20 20 69 66 28 20  s fsInfo;.  if( 
248a0 66 73 74 61 74 66 73 28 66 64 2c 20 26 66 73 49  fstatfs(fd, &fsI
248b0 6e 66 6f 29 20 3d 3d 20 2d 31 20 29 7b 0a 20 20  nfo) == -1 ){.  
248c0 20 20 28 28 75 6e 69 78 46 69 6c 65 2a 29 70 46    ((unixFile*)pF
248d0 69 6c 65 29 2d 3e 6c 61 73 74 45 72 72 6e 6f 20  ile)->lastErrno 
248e0 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 69 66 28  = errno;.    if(
248f0 20 64 69 72 66 64 3e 3d 30 20 29 20 63 6c 6f 73   dirfd>=0 ) clos
24900 65 28 64 69 72 66 64 29 3b 20 2f 2a 20 73 69 6c  e(dirfd); /* sil
24910 65 6e 74 6c 79 20 6c 65 61 6b 20 69 66 20 66 61  ently leak if fa
24920 69 6c 2c 20 69 6e 20 65 72 72 6f 72 20 2a 2f 0a  il, in error */.
24930 20 20 20 20 63 6c 6f 73 65 28 66 64 29 3b 20 2f      close(fd); /
24940 2a 20 73 69 6c 65 6e 74 6c 79 20 6c 65 61 6b 20  * silently leak 
24950 69 66 20 66 61 69 6c 2c 20 69 6e 20 65 72 72 6f  if fail, in erro
24960 72 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20  r */.    return 
24970 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 41 43 43  SQLITE_IOERR_ACC
24980 45 53 53 3b 0a 20 20 7d 0a 20 20 69 66 20 28 30  ESS;.  }.  if (0
24990 20 3d 3d 20 73 74 72 6e 63 6d 70 28 22 6d 73 64   == strncmp("msd
249a0 6f 73 22 2c 20 66 73 49 6e 66 6f 2e 66 5f 66 73  os", fsInfo.f_fs
249b0 74 79 70 65 6e 61 6d 65 2c 20 35 29 29 20 7b 0a  typename, 5)) {.
249c0 20 20 20 20 28 28 75 6e 69 78 46 69 6c 65 2a 29      ((unixFile*)
249d0 70 46 69 6c 65 29 2d 3e 66 73 46 6c 61 67 73 20  pFile)->fsFlags 
249e0 7c 3d 20 53 51 4c 49 54 45 5f 46 53 46 4c 41 47  |= SQLITE_FSFLAG
249f0 53 5f 49 53 5f 4d 53 44 4f 53 3b 0a 20 20 7d 0a  S_IS_MSDOS;.  }.
24a00 23 65 6e 64 69 66 0a 20 20 0a 23 69 66 20 53 51  #endif.  .#if SQ
24a10 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b  LITE_ENABLE_LOCK
24a20 49 4e 47 5f 53 54 59 4c 45 0a 23 69 66 20 53 51  ING_STYLE.#if SQ
24a30 4c 49 54 45 5f 50 52 45 46 45 52 5f 50 52 4f 58  LITE_PREFER_PROX
24a40 59 5f 4c 4f 43 4b 49 4e 47 0a 20 20 69 73 41 75  Y_LOCKING.  isAu
24a50 74 6f 50 72 6f 78 79 20 3d 20 31 3b 0a 23 65 6e  toProxy = 1;.#en
24a60 64 69 66 0a 20 20 69 66 28 20 69 73 41 75 74 6f  dif.  if( isAuto
24a70 50 72 6f 78 79 20 26 26 20 28 7a 50 61 74 68 21  Proxy && (zPath!
24a80 3d 4e 55 4c 4c 29 20 26 26 20 28 21 6e 6f 4c 6f  =NULL) && (!noLo
24a90 63 6b 29 20 26 26 20 70 56 66 73 2d 3e 78 4f 70  ck) && pVfs->xOp
24aa0 65 6e 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a  en ){.    char *
24ab0 65 6e 76 66 6f 72 63 65 20 3d 20 67 65 74 65 6e  envforce = geten
24ac0 76 28 22 53 51 4c 49 54 45 5f 46 4f 52 43 45 5f  v("SQLITE_FORCE_
24ad0 50 52 4f 58 59 5f 4c 4f 43 4b 49 4e 47 22 29 3b  PROXY_LOCKING");
24ae0 0a 20 20 20 20 69 6e 74 20 75 73 65 50 72 6f 78  .    int useProx
24af0 79 20 3d 20 30 3b 0a 0a 20 20 20 20 2f 2a 20 53  y = 0;..    /* S
24b00 51 4c 49 54 45 5f 46 4f 52 43 45 5f 50 52 4f 58  QLITE_FORCE_PROX
24b10 59 5f 4c 4f 43 4b 49 4e 47 3d 3d 31 20 6d 65 61  Y_LOCKING==1 mea
24b20 6e 73 20 66 6f 72 63 65 20 61 6c 77 61 79 73 20  ns force always 
24b30 75 73 65 20 70 72 6f 78 79 2c 20 30 20 6d 65 61  use proxy, 0 mea
24b40 6e 73 20 0a 20 20 20 20 2a 2a 20 6e 65 76 65 72  ns .    ** never
24b50 20 75 73 65 20 70 72 6f 78 79 2c 20 4e 55 4c 4c   use proxy, NULL
24b60 20 6d 65 61 6e 73 20 75 73 65 20 70 72 6f 78 79   means use proxy
24b70 20 66 6f 72 20 6e 6f 6e 2d 6c 6f 63 61 6c 20 66   for non-local f
24b80 69 6c 65 73 20 6f 6e 6c 79 2e 20 20 2a 2f 0a 20  iles only.  */. 
24b90 20 20 20 69 66 28 20 65 6e 76 66 6f 72 63 65 21     if( envforce!
24ba0 3d 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 20 20 75  =NULL ){.      u
24bb0 73 65 50 72 6f 78 79 20 3d 20 61 74 6f 69 28 65  seProxy = atoi(e
24bc0 6e 76 66 6f 72 63 65 29 3e 30 3b 0a 20 20 20 20  nvforce)>0;.    
24bd0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 74 72  }else{.      str
24be0 75 63 74 20 73 74 61 74 66 73 20 66 73 49 6e 66  uct statfs fsInf
24bf0 6f 3b 0a 20 20 20 20 20 20 69 66 28 20 73 74 61  o;.      if( sta
24c00 74 66 73 28 7a 50 61 74 68 2c 20 26 66 73 49 6e  tfs(zPath, &fsIn
24c10 66 6f 29 20 3d 3d 20 2d 31 20 29 7b 0a 20 20 20  fo) == -1 ){.   
24c20 20 20 20 20 20 2f 2a 20 49 6e 20 74 68 65 6f 72       /* In theor
24c30 79 2c 20 74 68 65 20 63 6c 6f 73 65 28 66 64 29  y, the close(fd)
24c40 20 63 61 6c 6c 20 69 73 20 73 75 62 2d 6f 70 74   call is sub-opt
24c50 69 6d 61 6c 2e 20 49 66 20 74 68 65 20 66 69 6c  imal. If the fil
24c60 65 20 6f 70 65 6e 65 64 0a 20 20 20 20 20 20 20  e opened.       
24c70 20 2a 2a 20 77 69 74 68 20 66 64 20 69 73 20 61   ** with fd is a
24c80 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20   database file, 
24c90 61 6e 64 20 74 68 65 72 65 20 61 72 65 20 6f 74  and there are ot
24ca0 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20  her connections 
24cb0 6f 70 65 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20  open.        ** 
24cc0 6f 6e 20 74 68 61 74 20 66 69 6c 65 20 74 68 61  on that file tha
24cd0 74 20 61 72 65 20 63 75 72 72 65 6e 74 6c 79 20  t are currently 
24ce0 68 6f 6c 64 69 6e 67 20 61 64 76 69 73 6f 72 79  holding advisory
24cf0 20 6c 6f 63 6b 73 20 6f 6e 20 69 74 2c 0a 20 20   locks on it,.  
24d00 20 20 20 20 20 20 2a 2a 20 74 68 65 6e 20 74 68        ** then th
24d10 65 20 63 61 6c 6c 20 74 6f 20 63 6c 6f 73 65 28  e call to close(
24d20 29 20 77 69 6c 6c 20 63 61 6e 63 65 6c 20 74 68  ) will cancel th
24d30 6f 73 65 20 6c 6f 63 6b 73 2e 20 49 6e 20 70 72  ose locks. In pr
24d40 61 63 74 69 63 65 2c 0a 20 20 20 20 20 20 20 20  actice,.        
24d50 2a 2a 20 77 65 27 72 65 20 61 73 73 75 6d 69 6e  ** we're assumin
24d60 67 20 74 68 61 74 20 73 74 61 74 66 73 28 29 20  g that statfs() 
24d70 64 6f 65 73 6e 27 74 20 66 61 69 6c 20 76 65 72  doesn't fail ver
24d80 79 20 6f 66 74 65 6e 2e 20 41 74 20 6c 65 61 73  y often. At leas
24d90 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 6e 6f 74  t.        ** not
24da0 20 77 68 69 6c 65 20 6f 74 68 65 72 20 66 69 6c   while other fil
24db0 65 20 64 65 73 63 72 69 70 74 6f 72 73 20 6f 70  e descriptors op
24dc0 65 6e 65 64 20 62 79 20 74 68 65 20 73 61 6d 65  ened by the same
24dd0 20 70 72 6f 63 65 73 73 20 6f 6e 0a 20 20 20 20   process on.    
24de0 20 20 20 20 2a 2a 20 74 68 65 20 73 61 6d 65 20      ** the same 
24df0 66 69 6c 65 20 61 72 65 20 77 6f 72 6b 69 6e 67  file are working
24e00 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 2d  .  */.        p-
24e10 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 65 72 72  >lastErrno = err
24e20 6e 6f 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  no;.        if( 
24e30 64 69 72 66 64 3e 3d 30 20 29 7b 0a 20 20 20 20  dirfd>=0 ){.    
24e40 20 20 20 20 20 20 63 6c 6f 73 65 28 64 69 72 66        close(dirf
24e50 64 29 3b 20 2f 2a 20 73 69 6c 65 6e 74 6c 79 20  d); /* silently 
24e60 6c 65 61 6b 20 69 66 20 66 61 69 6c 2c 20 69 6e  leak if fail, in
24e70 20 65 72 72 6f 72 20 2a 2f 0a 20 20 20 20 20 20   error */.      
24e80 20 20 7d 0a 20 20 20 20 20 20 20 20 63 6c 6f 73    }.        clos
24e90 65 28 66 64 29 3b 20 2f 2a 20 73 69 6c 65 6e 74  e(fd); /* silent
24ea0 6c 79 20 6c 65 61 6b 20 69 66 20 66 61 69 6c 2c  ly leak if fail,
24eb0 20 69 6e 20 65 72 72 6f 72 20 2a 2f 0a 20 20 20   in error */.   
24ec0 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
24ed0 5f 49 4f 45 52 52 5f 41 43 43 45 53 53 3b 0a 20  _IOERR_ACCESS;. 
24ee0 20 20 20 20 20 20 20 67 6f 74 6f 20 6f 70 65 6e         goto open
24ef0 5f 66 69 6e 69 73 68 65 64 3b 0a 20 20 20 20 20  _finished;.     
24f00 20 7d 0a 20 20 20 20 20 20 75 73 65 50 72 6f 78   }.      useProx
24f10 79 20 3d 20 21 28 66 73 49 6e 66 6f 2e 66 5f 66  y = !(fsInfo.f_f
24f20 6c 61 67 73 26 4d 4e 54 5f 4c 4f 43 41 4c 29 3b  lags&MNT_LOCAL);
24f30 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 75  .    }.    if( u
24f40 73 65 50 72 6f 78 79 20 29 7b 0a 20 20 20 20 20  seProxy ){.     
24f50 20 72 63 20 3d 20 66 69 6c 6c 49 6e 55 6e 69 78   rc = fillInUnix
24f60 46 69 6c 65 28 70 56 66 73 2c 20 66 64 2c 20 64  File(pVfs, fd, d
24f70 69 72 66 64 2c 20 70 46 69 6c 65 2c 20 7a 50 61  irfd, pFile, zPa
24f80 74 68 2c 20 6e 6f 4c 6f 63 6b 2c 20 69 73 44 65  th, noLock, isDe
24f90 6c 65 74 65 29 3b 0a 20 20 20 20 20 20 69 66 28  lete);.      if(
24fa0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
24fb0 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 70  {.        rc = p
24fc0 72 6f 78 79 54 72 61 6e 73 66 6f 72 6d 55 6e 69  roxyTransformUni
24fd0 78 46 69 6c 65 28 28 75 6e 69 78 46 69 6c 65 2a  xFile((unixFile*
24fe0 29 70 46 69 6c 65 2c 20 22 3a 61 75 74 6f 3a 22  )pFile, ":auto:"
24ff0 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
25000 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
25010 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65            /* Use
25020 20 75 6e 69 78 43 6c 6f 73 65 20 74 6f 20 63 6c   unixClose to cl
25030 65 61 6e 20 75 70 20 74 68 65 20 72 65 73 6f 75  ean up the resou
25040 72 63 65 73 20 61 64 64 65 64 20 69 6e 20 66 69  rces added in fi
25050 6c 6c 49 6e 55 6e 69 78 46 69 6c 65 20 0a 20 20  llInUnixFile .  
25060 20 20 20 20 20 20 20 20 2a 2a 20 61 6e 64 20 63          ** and c
25070 6c 65 61 72 20 61 6c 6c 20 74 68 65 20 73 74 72  lear all the str
25080 75 63 74 75 72 65 27 73 20 72 65 66 65 72 65 6e  ucture's referen
25090 63 65 73 2e 20 20 53 70 65 63 69 66 69 63 61 6c  ces.  Specifical
250a0 6c 79 2c 20 0a 20 20 20 20 20 20 20 20 20 20 2a  ly, .          *
250b0 2a 20 70 46 69 6c 65 2d 3e 70 4d 65 74 68 6f 64  * pFile->pMethod
250c0 73 20 77 69 6c 6c 20 62 65 20 4e 55 4c 4c 20 73  s will be NULL s
250d0 6f 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65  o sqlite3OsClose
250e0 20 77 69 6c 6c 20 62 65 20 61 20 6e 6f 2d 6f 70   will be a no-op
250f0 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20   .          */. 
25100 20 20 20 20 20 20 20 20 20 75 6e 69 78 43 6c 6f           unixClo
25110 73 65 28 70 46 69 6c 65 29 3b 0a 20 20 20 20 20  se(pFile);.     
25120 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
25130 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
25140 7d 0a 20 20 20 20 20 20 67 6f 74 6f 20 6f 70 65  }.      goto ope
25150 6e 5f 66 69 6e 69 73 68 65 64 3b 0a 20 20 20 20  n_finished;.    
25160 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 0a  }.  }.#endif.  .
25170 20 20 72 63 20 3d 20 66 69 6c 6c 49 6e 55 6e 69    rc = fillInUni
25180 78 46 69 6c 65 28 70 56 66 73 2c 20 66 64 2c 20  xFile(pVfs, fd, 
25190 64 69 72 66 64 2c 20 70 46 69 6c 65 2c 20 7a 50  dirfd, pFile, zP
251a0 61 74 68 2c 20 6e 6f 4c 6f 63 6b 2c 20 69 73 44  ath, noLock, isD
251b0 65 6c 65 74 65 29 3b 0a 6f 70 65 6e 5f 66 69 6e  elete);.open_fin
251c0 69 73 68 65 64 3a 0a 20 20 69 66 28 20 72 63 21  ished:.  if( rc!
251d0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
251e0 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
251f0 2d 3e 70 55 6e 75 73 65 64 29 3b 0a 20 20 7d 0a  ->pUnused);.  }.
25200 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
25210 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 74 68  ./*.** Delete th
25220 65 20 66 69 6c 65 20 61 74 20 7a 50 61 74 68 2e  e file at zPath.
25230 20 49 66 20 74 68 65 20 64 69 72 53 79 6e 63 20   If the dirSync 
25240 61 72 67 75 6d 65 6e 74 20 69 73 20 74 72 75 65  argument is true
25250 2c 20 66 73 79 6e 63 28 29 0a 2a 2a 20 74 68 65  , fsync().** the
25260 20 64 69 72 65 63 74 6f 72 79 20 61 66 74 65 72   directory after
25270 20 64 65 6c 65 74 69 6e 67 20 74 68 65 20 66 69   deleting the fi
25280 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  le..*/.static in
25290 74 20 75 6e 69 78 44 65 6c 65 74 65 28 0a 20 20  t unixDelete(.  
252a0 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 4e 6f 74  sqlite3_vfs *Not
252b0 55 73 65 64 2c 20 20 20 20 20 2f 2a 20 56 46 53  Used,     /* VFS
252c0 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 69 73   containing this
252d0 20 61 73 20 74 68 65 20 78 44 65 6c 65 74 65 20   as the xDelete 
252e0 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 63 6f 6e 73  method */.  cons
252f0 74 20 63 68 61 72 20 2a 7a 50 61 74 68 2c 20 20  t char *zPath,  
25300 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66        /* Name of
25310 20 66 69 6c 65 20 74 6f 20 62 65 20 64 65 6c 65   file to be dele
25320 74 65 64 20 2a 2f 0a 20 20 69 6e 74 20 64 69 72  ted */.  int dir
25330 53 79 6e 63 20 20 20 20 20 20 20 20 20 20 20 20  Sync            
25340 20 20 20 2f 2a 20 49 66 20 74 72 75 65 2c 20 66     /* If true, f
25350 73 79 6e 63 28 29 20 64 69 72 65 63 74 6f 72 79  sync() directory
25360 20 61 66 74 65 72 20 64 65 6c 65 74 69 6e 67 20   after deleting 
25370 66 69 6c 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  file */.){.  int
25380 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
25390 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
253a0 54 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20  TER(NotUsed);.  
253b0 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28  SimulateIOError(
253c0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f  return SQLITE_IO
253d0 45 52 52 5f 44 45 4c 45 54 45 29 3b 0a 20 20 75  ERR_DELETE);.  u
253e0 6e 6c 69 6e 6b 28 7a 50 61 74 68 29 3b 0a 23 69  nlink(zPath);.#i
253f0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 44 49 53  fndef SQLITE_DIS
25400 41 42 4c 45 5f 44 49 52 53 59 4e 43 0a 20 20 69  ABLE_DIRSYNC.  i
25410 66 28 20 64 69 72 53 79 6e 63 20 29 7b 0a 20 20  f( dirSync ){.  
25420 20 20 69 6e 74 20 66 64 3b 0a 20 20 20 20 72 63    int fd;.    rc
25430 20 3d 20 6f 70 65 6e 44 69 72 65 63 74 6f 72 79   = openDirectory
25440 28 7a 50 61 74 68 2c 20 26 66 64 29 3b 0a 20 20  (zPath, &fd);.  
25450 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
25460 5f 4f 4b 20 29 7b 0a 23 69 66 20 4f 53 5f 56 58  _OK ){.#if OS_VX
25470 57 4f 52 4b 53 0a 20 20 20 20 20 20 69 66 28 20  WORKS.      if( 
25480 66 73 79 6e 63 28 66 64 29 3d 3d 2d 31 20 29 0a  fsync(fd)==-1 ).
25490 23 65 6c 73 65 0a 20 20 20 20 20 20 69 66 28 20  #else.      if( 
254a0 66 73 79 6e 63 28 66 64 29 20 29 0a 23 65 6e 64  fsync(fd) ).#end
254b0 69 66 0a 20 20 20 20 20 20 7b 0a 20 20 20 20 20  if.      {.     
254c0 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49     rc = SQLITE_I
254d0 4f 45 52 52 5f 44 49 52 5f 46 53 59 4e 43 3b 0a  OERR_DIR_FSYNC;.
254e0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
254f0 28 20 63 6c 6f 73 65 28 66 64 29 26 26 21 72 63  ( close(fd)&&!rc
25500 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
25510 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 44 49   SQLITE_IOERR_DI
25520 52 5f 43 4c 4f 53 45 3b 0a 20 20 20 20 20 20 7d  R_CLOSE;.      }
25530 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69  .    }.  }.#endi
25540 66 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  f.  return rc;.}
25550 0a 0a 2f 2a 0a 2a 2a 20 54 65 73 74 20 74 68 65  ../*.** Test the
25560 20 65 78 69 73 74 61 6e 63 65 20 6f 66 20 6f 72   existance of or
25570 20 61 63 63 65 73 73 20 70 65 72 6d 69 73 73 69   access permissi
25580 6f 6e 73 20 6f 66 20 66 69 6c 65 20 7a 50 61 74  ons of file zPat
25590 68 2e 20 54 68 65 0a 2a 2a 20 74 65 73 74 20 70  h. The.** test p
255a0 65 72 66 6f 72 6d 65 64 20 64 65 70 65 6e 64 73  erformed depends
255b0 20 6f 6e 20 74 68 65 20 76 61 6c 75 65 20 6f 66   on the value of
255c0 20 66 6c 61 67 73 3a 0a 2a 2a 0a 2a 2a 20 20 20   flags:.**.**   
255d0 20 20 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f    SQLITE_ACCESS_
255e0 45 58 49 53 54 53 3a 20 52 65 74 75 72 6e 20 31  EXISTS: Return 1
255f0 20 69 66 20 74 68 65 20 66 69 6c 65 20 65 78 69   if the file exi
25600 73 74 73 0a 2a 2a 20 20 20 20 20 53 51 4c 49 54  sts.**     SQLIT
25610 45 5f 41 43 43 45 53 53 5f 52 45 41 44 57 52 49  E_ACCESS_READWRI
25620 54 45 3a 20 52 65 74 75 72 6e 20 31 20 69 66 20  TE: Return 1 if 
25630 74 68 65 20 66 69 6c 65 20 69 73 20 72 65 61 64  the file is read
25640 20 61 6e 64 20 77 72 69 74 61 62 6c 65 2e 0a 2a   and writable..*
25650 2a 20 20 20 20 20 53 51 4c 49 54 45 5f 41 43 43  *     SQLITE_ACC
25660 45 53 53 5f 52 45 41 44 4f 4e 4c 59 3a 20 52 65  ESS_READONLY: Re
25670 74 75 72 6e 20 31 20 69 66 20 74 68 65 20 66 69  turn 1 if the fi
25680 6c 65 20 69 73 20 72 65 61 64 61 62 6c 65 2e 0a  le is readable..
25690 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 20  **.** Otherwise 
256a0 72 65 74 75 72 6e 20 30 2e 0a 2a 2f 0a 73 74 61  return 0..*/.sta
256b0 74 69 63 20 69 6e 74 20 75 6e 69 78 41 63 63 65  tic int unixAcce
256c0 73 73 28 0a 20 20 73 71 6c 69 74 65 33 5f 76 66  ss(.  sqlite3_vf
256d0 73 20 2a 4e 6f 74 55 73 65 64 2c 20 20 20 2f 2a  s *NotUsed,   /*
256e0 20 54 68 65 20 56 46 53 20 63 6f 6e 74 61 69 6e   The VFS contain
256f0 69 6e 67 20 74 68 69 73 20 78 41 63 63 65 73 73  ing this xAccess
25700 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 63 6f 6e   method */.  con
25710 73 74 20 63 68 61 72 20 2a 7a 50 61 74 68 2c 20  st char *zPath, 
25720 20 20 20 20 20 2f 2a 20 50 61 74 68 20 6f 66 20       /* Path of 
25730 74 68 65 20 66 69 6c 65 20 74 6f 20 65 78 61 6d  the file to exam
25740 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61  ine */.  int fla
25750 67 73 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  gs,             
25760 20 2f 2a 20 57 68 61 74 20 64 6f 20 77 65 20 77   /* What do we w
25770 61 6e 74 20 74 6f 20 6c 65 61 72 6e 20 61 62 6f  ant to learn abo
25780 75 74 20 74 68 65 20 7a 50 61 74 68 20 66 69 6c  ut the zPath fil
25790 65 3f 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 52 65  e? */.  int *pRe
257a0 73 4f 75 74 20 20 20 20 20 20 20 20 20 20 20 20  sOut            
257b0 2f 2a 20 57 72 69 74 65 20 72 65 73 75 6c 74 20  /* Write result 
257c0 62 6f 6f 6c 65 61 6e 20 68 65 72 65 20 2a 2f 0a  boolean here */.
257d0 29 7b 0a 20 20 69 6e 74 20 61 6d 6f 64 65 20 3d  ){.  int amode =
257e0 20 30 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52   0;.  UNUSED_PAR
257f0 41 4d 45 54 45 52 28 4e 6f 74 55 73 65 64 29 3b  AMETER(NotUsed);
25800 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72  .  SimulateIOErr
25810 6f 72 28 20 72 65 74 75 72 6e 20 53 51 4c 49 54  or( return SQLIT
25820 45 5f 49 4f 45 52 52 5f 41 43 43 45 53 53 3b 20  E_IOERR_ACCESS; 
25830 29 3b 0a 20 20 73 77 69 74 63 68 28 20 66 6c 61  );.  switch( fla
25840 67 73 20 29 7b 0a 20 20 20 20 63 61 73 65 20 53  gs ){.    case S
25850 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 45 58 49  QLITE_ACCESS_EXI
25860 53 54 53 3a 0a 20 20 20 20 20 20 61 6d 6f 64 65  STS:.      amode
25870 20 3d 20 46 5f 4f 4b 3b 0a 20 20 20 20 20 20 62   = F_OK;.      b
25880 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53  reak;.    case S
25890 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 52 45 41  QLITE_ACCESS_REA
258a0 44 57 52 49 54 45 3a 0a 20 20 20 20 20 20 61 6d  DWRITE:.      am
258b0 6f 64 65 20 3d 20 57 5f 4f 4b 7c 52 5f 4f 4b 3b  ode = W_OK|R_OK;
258c0 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
258d0 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 41 43    case SQLITE_AC
258e0 43 45 53 53 5f 52 45 41 44 3a 0a 20 20 20 20 20  CESS_READ:.     
258f0 20 61 6d 6f 64 65 20 3d 20 52 5f 4f 4b 3b 0a 20   amode = R_OK;. 
25900 20 20 20 20 20 62 72 65 61 6b 3b 0a 0a 20 20 20       break;..   
25910 20 64 65 66 61 75 6c 74 3a 0a 20 20 20 20 20 20   default:.      
25920 61 73 73 65 72 74 28 21 22 49 6e 76 61 6c 69 64  assert(!"Invalid
25930 20 66 6c 61 67 73 20 61 72 67 75 6d 65 6e 74 22   flags argument"
25940 29 3b 0a 20 20 7d 0a 20 20 2a 70 52 65 73 4f 75  );.  }.  *pResOu
25950 74 20 3d 20 28 61 63 63 65 73 73 28 7a 50 61 74  t = (access(zPat
25960 68 2c 20 61 6d 6f 64 65 29 3d 3d 30 29 3b 0a 20  h, amode)==0);. 
25970 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
25980 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 75 72  K;.}.../*.** Tur
25990 6e 20 61 20 72 65 6c 61 74 69 76 65 20 70 61 74  n a relative pat
259a0 68 6e 61 6d 65 20 69 6e 74 6f 20 61 20 66 75 6c  hname into a ful
259b0 6c 20 70 61 74 68 6e 61 6d 65 2e 20 54 68 65 20  l pathname. The 
259c0 72 65 6c 61 74 69 76 65 20 70 61 74 68 0a 2a 2a  relative path.**
259d0 20 69 73 20 73 74 6f 72 65 64 20 61 73 20 61 20   is stored as a 
259e0 6e 75 6c 2d 74 65 72 6d 69 6e 61 74 65 64 20 73  nul-terminated s
259f0 74 72 69 6e 67 20 69 6e 20 74 68 65 20 62 75 66  tring in the buf
25a00 66 65 72 20 70 6f 69 6e 74 65 64 20 74 6f 20 62  fer pointed to b
25a10 79 0a 2a 2a 20 7a 50 61 74 68 2e 20 0a 2a 2a 0a  y.** zPath. .**.
25a20 2a 2a 20 7a 4f 75 74 20 70 6f 69 6e 74 73 20 74  ** zOut points t
25a30 6f 20 61 20 62 75 66 66 65 72 20 6f 66 20 61 74  o a buffer of at
25a40 20 6c 65 61 73 74 20 73 71 6c 69 74 65 33 5f 76   least sqlite3_v
25a50 66 73 2e 6d 78 50 61 74 68 6e 61 6d 65 20 62 79  fs.mxPathname by
25a60 74 65 73 20 0a 2a 2a 20 28 69 6e 20 74 68 69 73  tes .** (in this
25a70 20 63 61 73 65 2c 20 4d 41 58 5f 50 41 54 48 4e   case, MAX_PATHN
25a80 41 4d 45 20 62 79 74 65 73 29 2e 20 54 68 65 20  AME bytes). The 
25a90 66 75 6c 6c 2d 70 61 74 68 20 69 73 20 77 72 69  full-path is wri
25aa0 74 74 65 6e 20 74 6f 0a 2a 2a 20 74 68 69 73 20  tten to.** this 
25ab0 62 75 66 66 65 72 20 62 65 66 6f 72 65 20 72 65  buffer before re
25ac0 74 75 72 6e 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74  turning..*/.stat
25ad0 69 63 20 69 6e 74 20 75 6e 69 78 46 75 6c 6c 50  ic int unixFullP
25ae0 61 74 68 6e 61 6d 65 28 0a 20 20 73 71 6c 69 74  athname(.  sqlit
25af0 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 20 20  e3_vfs *pVfs,   
25b00 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e           /* Poin
25b10 74 65 72 20 74 6f 20 76 66 73 20 6f 62 6a 65 63  ter to vfs objec
25b20 74 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  t */.  const cha
25b30 72 20 2a 7a 50 61 74 68 2c 20 20 20 20 20 20 20  r *zPath,       
25b40 20 20 20 20 20 2f 2a 20 50 6f 73 73 69 62 6c 79       /* Possibly
25b50 20 72 65 6c 61 74 69 76 65 20 69 6e 70 75 74 20   relative input 
25b60 70 61 74 68 20 2a 2f 0a 20 20 69 6e 74 20 6e 4f  path */.  int nO
25b70 75 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ut,             
25b80 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20          /* Size 
25b90 6f 66 20 6f 75 74 70 75 74 20 62 75 66 66 65 72  of output buffer
25ba0 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20 63   in bytes */.  c
25bb0 68 61 72 20 2a 7a 4f 75 74 20 20 20 20 20 20 20  har *zOut       
25bc0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
25bd0 4f 75 74 70 75 74 20 62 75 66 66 65 72 20 2a 2f  Output buffer */
25be0 0a 29 7b 0a 0a 20 20 2f 2a 20 49 74 27 73 20 6f  .){..  /* It's o
25bf0 64 64 20 74 6f 20 73 69 6d 75 6c 61 74 65 20 61  dd to simulate a
25c00 6e 20 69 6f 2d 65 72 72 6f 72 20 68 65 72 65 2c  n io-error here,
25c10 20 62 75 74 20 72 65 61 6c 6c 79 20 74 68 69 73   but really this
25c20 20 69 73 20 6a 75 73 74 0a 20 20 2a 2a 20 75 73   is just.  ** us
25c30 69 6e 67 20 74 68 65 20 69 6f 2d 65 72 72 6f 72  ing the io-error
25c40 20 69 6e 66 72 61 73 74 72 75 63 74 75 72 65 20   infrastructure 
25c50 74 6f 20 74 65 73 74 20 74 68 61 74 20 53 51 4c  to test that SQL
25c60 69 74 65 20 68 61 6e 64 6c 65 73 20 74 68 69 73  ite handles this
25c70 0a 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 66  .  ** function f
25c80 61 69 6c 69 6e 67 2e 20 54 68 69 73 20 66 75 6e  ailing. This fun
25c90 63 74 69 6f 6e 20 63 6f 75 6c 64 20 66 61 69 6c  ction could fail
25ca0 20 69 66 2c 20 66 6f 72 20 65 78 61 6d 70 6c 65   if, for example
25cb0 2c 20 74 68 65 0a 20 20 2a 2a 20 63 75 72 72 65  , the.  ** curre
25cc0 6e 74 20 77 6f 72 6b 69 6e 67 20 64 69 72 65 63  nt working direc
25cd0 74 6f 72 79 20 68 61 73 20 62 65 65 6e 20 75 6e  tory has been un
25ce0 6c 69 6e 6b 65 64 2e 0a 20 20 2a 2f 0a 20 20 53  linked..  */.  S
25cf0 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20  imulateIOError( 
25d00 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52  return SQLITE_ER
25d10 52 4f 52 20 29 3b 0a 0a 20 20 61 73 73 65 72 74  ROR );..  assert
25d20 28 20 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61  ( pVfs->mxPathna
25d30 6d 65 3d 3d 4d 41 58 5f 50 41 54 48 4e 41 4d 45  me==MAX_PATHNAME
25d40 20 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52   );.  UNUSED_PAR
25d50 41 4d 45 54 45 52 28 70 56 66 73 29 3b 0a 0a 20  AMETER(pVfs);.. 
25d60 20 7a 4f 75 74 5b 6e 4f 75 74 2d 31 5d 20 3d 20   zOut[nOut-1] = 
25d70 27 5c 30 27 3b 0a 20 20 69 66 28 20 7a 50 61 74  '\0';.  if( zPat
25d80 68 5b 30 5d 3d 3d 27 2f 27 20 29 7b 0a 20 20 20  h[0]=='/' ){.   
25d90 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
25da0 66 28 6e 4f 75 74 2c 20 7a 4f 75 74 2c 20 22 25  f(nOut, zOut, "%
25db0 73 22 2c 20 7a 50 61 74 68 29 3b 0a 20 20 7d 65  s", zPath);.  }e
25dc0 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 6e 43 77  lse{.    int nCw
25dd0 64 3b 0a 20 20 20 20 69 66 28 20 67 65 74 63 77  d;.    if( getcw
25de0 64 28 7a 4f 75 74 2c 20 6e 4f 75 74 2d 31 29 3d  d(zOut, nOut-1)=
25df0 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  =0 ){.      retu
25e00 72 6e 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50  rn SQLITE_CANTOP
25e10 45 4e 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20  EN_BKPT;.    }. 
25e20 20 20 20 6e 43 77 64 20 3d 20 28 69 6e 74 29 73     nCwd = (int)s
25e30 74 72 6c 65 6e 28 7a 4f 75 74 29 3b 0a 20 20 20  trlen(zOut);.   
25e40 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
25e50 66 28 6e 4f 75 74 2d 6e 43 77 64 2c 20 26 7a 4f  f(nOut-nCwd, &zO
25e60 75 74 5b 6e 43 77 64 5d 2c 20 22 2f 25 73 22 2c  ut[nCwd], "/%s",
25e70 20 7a 50 61 74 68 29 3b 0a 20 20 7d 0a 20 20 72   zPath);.  }.  r
25e80 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
25e90 0a 7d 0a 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  .}...#ifndef SQL
25ea0 49 54 45 5f 4f 4d 49 54 5f 4c 4f 41 44 5f 45 58  ITE_OMIT_LOAD_EX
25eb0 54 45 4e 53 49 4f 4e 0a 2f 2a 0a 2a 2a 20 49 6e  TENSION./*.** In
25ec0 74 65 72 66 61 63 65 73 20 66 6f 72 20 6f 70 65  terfaces for ope
25ed0 6e 69 6e 67 20 61 20 73 68 61 72 65 64 20 6c 69  ning a shared li
25ee0 62 72 61 72 79 2c 20 66 69 6e 64 69 6e 67 20 65  brary, finding e
25ef0 6e 74 72 79 20 70 6f 69 6e 74 73 0a 2a 2a 20 77  ntry points.** w
25f00 69 74 68 69 6e 20 74 68 65 20 73 68 61 72 65 64  ithin the shared
25f10 20 6c 69 62 72 61 72 79 2c 20 61 6e 64 20 63 6c   library, and cl
25f20 6f 73 69 6e 67 20 74 68 65 20 73 68 61 72 65 64  osing the shared
25f30 20 6c 69 62 72 61 72 79 2e 0a 2a 2f 0a 23 69 6e   library..*/.#in
25f40 63 6c 75 64 65 20 3c 64 6c 66 63 6e 2e 68 3e 0a  clude <dlfcn.h>.
25f50 73 74 61 74 69 63 20 76 6f 69 64 20 2a 75 6e 69  static void *uni
25f60 78 44 6c 4f 70 65 6e 28 73 71 6c 69 74 65 33 5f  xDlOpen(sqlite3_
25f70 76 66 73 20 2a 4e 6f 74 55 73 65 64 2c 20 63 6f  vfs *NotUsed, co
25f80 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e  nst char *zFilen
25f90 61 6d 65 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50  ame){.  UNUSED_P
25fa0 41 52 41 4d 45 54 45 52 28 4e 6f 74 55 73 65 64  ARAMETER(NotUsed
25fb0 29 3b 0a 20 20 72 65 74 75 72 6e 20 64 6c 6f 70  );.  return dlop
25fc0 65 6e 28 7a 46 69 6c 65 6e 61 6d 65 2c 20 52 54  en(zFilename, RT
25fd0 4c 44 5f 4e 4f 57 20 7c 20 52 54 4c 44 5f 47 4c  LD_NOW | RTLD_GL
25fe0 4f 42 41 4c 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  OBAL);.}../*.** 
25ff0 53 51 4c 69 74 65 20 63 61 6c 6c 73 20 74 68 69  SQLite calls thi
26000 73 20 66 75 6e 63 74 69 6f 6e 20 69 6d 6d 65 64  s function immed
26010 69 61 74 65 6c 79 20 61 66 74 65 72 20 61 20 63  iately after a c
26020 61 6c 6c 20 74 6f 20 75 6e 69 78 44 6c 53 79 6d  all to unixDlSym
26030 28 29 20 6f 72 0a 2a 2a 20 75 6e 69 78 44 6c 4f  () or.** unixDlO
26040 70 65 6e 28 29 20 66 61 69 6c 73 20 28 72 65 74  pen() fails (ret
26050 75 72 6e 73 20 61 20 6e 75 6c 6c 20 70 6f 69 6e  urns a null poin
26060 74 65 72 29 2e 20 49 66 20 61 20 6d 6f 72 65 20  ter). If a more 
26070 64 65 74 61 69 6c 65 64 20 65 72 72 6f 72 0a 2a  detailed error.*
26080 2a 20 6d 65 73 73 61 67 65 20 69 73 20 61 76 61  * message is ava
26090 69 6c 61 62 6c 65 2c 20 69 74 20 69 73 20 77 72  ilable, it is wr
260a0 69 74 74 65 6e 20 74 6f 20 7a 42 75 66 4f 75 74  itten to zBufOut
260b0 2e 20 49 66 20 6e 6f 20 65 72 72 6f 72 20 6d 65  . If no error me
260c0 73 73 61 67 65 0a 2a 2a 20 69 73 20 61 76 61 69  ssage.** is avai
260d0 6c 61 62 6c 65 2c 20 7a 42 75 66 4f 75 74 20 69  lable, zBufOut i
260e0 73 20 6c 65 66 74 20 75 6e 6d 6f 64 69 66 69 65  s left unmodifie
260f0 64 20 61 6e 64 20 53 51 4c 69 74 65 20 75 73 65  d and SQLite use
26100 73 20 61 20 64 65 66 61 75 6c 74 0a 2a 2a 20 65  s a default.** e
26110 72 72 6f 72 20 6d 65 73 73 61 67 65 2e 0a 2a 2f  rror message..*/
26120 0a 73 74 61 74 69 63 20 76 6f 69 64 20 75 6e 69  .static void uni
26130 78 44 6c 45 72 72 6f 72 28 73 71 6c 69 74 65 33  xDlError(sqlite3
26140 5f 76 66 73 20 2a 4e 6f 74 55 73 65 64 2c 20 69  _vfs *NotUsed, i
26150 6e 74 20 6e 42 75 66 2c 20 63 68 61 72 20 2a 7a  nt nBuf, char *z
26160 42 75 66 4f 75 74 29 7b 0a 20 20 63 68 61 72 20  BufOut){.  char 
26170 2a 7a 45 72 72 3b 0a 20 20 55 4e 55 53 45 44 5f  *zErr;.  UNUSED_
26180 50 41 52 41 4d 45 54 45 52 28 4e 6f 74 55 73 65  PARAMETER(NotUse
26190 64 29 3b 0a 20 20 75 6e 69 78 45 6e 74 65 72 4d  d);.  unixEnterM
261a0 75 74 65 78 28 29 3b 0a 20 20 7a 45 72 72 20 3d  utex();.  zErr =
261b0 20 64 6c 65 72 72 6f 72 28 29 3b 0a 20 20 69 66   dlerror();.  if
261c0 28 20 7a 45 72 72 20 29 7b 0a 20 20 20 20 73 71  ( zErr ){.    sq
261d0 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e  lite3_snprintf(n
261e0 42 75 66 2c 20 7a 42 75 66 4f 75 74 2c 20 22 25  Buf, zBufOut, "%
261f0 73 22 2c 20 7a 45 72 72 29 3b 0a 20 20 7d 0a 20  s", zErr);.  }. 
26200 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28   unixLeaveMutex(
26210 29 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64  );.}.static void
26220 20 28 2a 75 6e 69 78 44 6c 53 79 6d 28 73 71 6c   (*unixDlSym(sql
26230 69 74 65 33 5f 76 66 73 20 2a 4e 6f 74 55 73 65  ite3_vfs *NotUse
26240 64 2c 20 76 6f 69 64 20 2a 70 2c 20 63 6f 6e 73  d, void *p, cons
26250 74 20 63 68 61 72 2a 7a 53 79 6d 29 29 28 76 6f  t char*zSym))(vo
26260 69 64 29 7b 0a 20 20 2f 2a 20 0a 20 20 2a 2a 20  id){.  /* .  ** 
26270 47 43 43 20 77 69 74 68 20 2d 70 65 64 61 6e 74  GCC with -pedant
26280 69 63 2d 65 72 72 6f 72 73 20 73 61 79 73 20 74  ic-errors says t
26290 68 61 74 20 43 39 30 20 64 6f 65 73 20 6e 6f 74  hat C90 does not
262a0 20 61 6c 6c 6f 77 20 61 20 76 6f 69 64 2a 20 74   allow a void* t
262b0 6f 20 62 65 0a 20 20 2a 2a 20 63 61 73 74 20 69  o be.  ** cast i
262c0 6e 74 6f 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  nto a pointer to
262d0 20 61 20 66 75 6e 63 74 69 6f 6e 2e 20 20 41 6e   a function.  An
262e0 64 20 79 65 74 20 74 68 65 20 6c 69 62 72 61 72  d yet the librar
262f0 79 20 64 6c 73 79 6d 28 29 20 72 6f 75 74 69 6e  y dlsym() routin
26300 65 0a 20 20 2a 2a 20 72 65 74 75 72 6e 73 20 61  e.  ** returns a
26310 20 76 6f 69 64 2a 20 77 68 69 63 68 20 69 73 20   void* which is 
26320 72 65 61 6c 6c 79 20 61 20 70 6f 69 6e 74 65 72  really a pointer
26330 20 74 6f 20 61 20 66 75 6e 63 74 69 6f 6e 2e 20   to a function. 
26340 20 53 6f 20 68 6f 77 20 64 6f 20 77 65 0a 20 20   So how do we.  
26350 2a 2a 20 75 73 65 20 64 6c 73 79 6d 28 29 20 77  ** use dlsym() w
26360 69 74 68 20 2d 70 65 64 61 6e 74 69 63 2d 65 72  ith -pedantic-er
26370 72 6f 72 73 3f 0a 20 20 2a 2a 0a 20 20 2a 2a 20  rors?.  **.  ** 
26380 56 61 72 69 61 62 6c 65 20 78 20 62 65 6c 6f 77  Variable x below
26390 20 69 73 20 64 65 66 69 6e 65 64 20 74 6f 20 62   is defined to b
263a0 65 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61  e a pointer to a
263b0 20 66 75 6e 63 74 69 6f 6e 20 74 61 6b 69 6e 67   function taking
263c0 0a 20 20 2a 2a 20 70 61 72 61 6d 65 74 65 72 73  .  ** parameters
263d0 20 76 6f 69 64 2a 20 61 6e 64 20 63 6f 6e 73 74   void* and const
263e0 20 63 68 61 72 2a 20 61 6e 64 20 72 65 74 75 72   char* and retur
263f0 6e 69 6e 67 20 61 20 70 6f 69 6e 74 65 72 20 74  ning a pointer t
26400 6f 20 61 20 66 75 6e 63 74 69 6f 6e 2e 0a 20 20  o a function..  
26410 2a 2a 20 57 65 20 69 6e 69 74 69 61 6c 69 7a 65  ** We initialize
26420 20 78 20 62 79 20 61 73 73 69 67 6e 69 6e 67 20   x by assigning 
26430 69 74 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  it a pointer to 
26440 74 68 65 20 64 6c 73 79 6d 28 29 20 66 75 6e 63  the dlsym() func
26450 74 69 6f 6e 2e 0a 20 20 2a 2a 20 28 54 68 61 74  tion..  ** (That
26460 20 61 73 73 69 67 6e 6d 65 6e 74 20 72 65 71 75   assignment requ
26470 69 72 65 73 20 61 20 63 61 73 74 2e 29 20 20 54  ires a cast.)  T
26480 68 65 6e 20 77 65 20 63 61 6c 6c 20 74 68 65 20  hen we call the 
26490 66 75 6e 63 74 69 6f 6e 20 74 68 61 74 0a 20 20  function that.  
264a0 2a 2a 20 78 20 70 6f 69 6e 74 73 20 74 6f 2e 20  ** x points to. 
264b0 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 69 73   .  **.  ** This
264c0 20 77 6f 72 6b 2d 61 72 6f 75 6e 64 20 69 73 20   work-around is 
264d0 75 6e 6c 69 6b 65 6c 79 20 74 6f 20 77 6f 72 6b  unlikely to work
264e0 20 63 6f 72 72 65 63 74 6c 79 20 6f 6e 20 61 6e   correctly on an
264f0 79 20 73 79 73 74 65 6d 20 77 68 65 72 65 0a 20  y system where. 
26500 20 2a 2a 20 79 6f 75 20 72 65 61 6c 6c 79 20 63   ** you really c
26510 61 6e 6e 6f 74 20 63 61 73 74 20 61 20 66 75 6e  annot cast a fun
26520 63 74 69 6f 6e 20 70 6f 69 6e 74 65 72 20 69 6e  ction pointer in
26530 74 6f 20 76 6f 69 64 2a 2e 20 20 42 75 74 20 74  to void*.  But t
26540 68 65 6e 2c 20 6f 6e 20 74 68 65 0a 20 20 2a 2a  hen, on the.  **
26550 20 6f 74 68 65 72 20 68 61 6e 64 2c 20 64 6c 73   other hand, dls
26560 79 6d 28 29 20 77 69 6c 6c 20 6e 6f 74 20 77 6f  ym() will not wo
26570 72 6b 20 6f 6e 20 73 75 63 68 20 61 20 73 79 73  rk on such a sys
26580 74 65 6d 20 65 69 74 68 65 72 2c 20 73 6f 20 77  tem either, so w
26590 65 20 68 61 76 65 0a 20 20 2a 2a 20 6e 6f 74 20  e have.  ** not 
265a0 72 65 61 6c 6c 79 20 6c 6f 73 74 20 61 6e 79 74  really lost anyt
265b0 68 69 6e 67 2e 0a 20 20 2a 2f 0a 20 20 76 6f 69  hing..  */.  voi
265c0 64 20 28 2a 28 2a 78 29 28 76 6f 69 64 2a 2c 63  d (*(*x)(void*,c
265d0 6f 6e 73 74 20 63 68 61 72 2a 29 29 28 76 6f 69  onst char*))(voi
265e0 64 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  d);.  UNUSED_PAR
265f0 41 4d 45 54 45 52 28 4e 6f 74 55 73 65 64 29 3b  AMETER(NotUsed);
26600 0a 20 20 78 20 3d 20 28 76 6f 69 64 28 2a 28 2a  .  x = (void(*(*
26610 29 28 76 6f 69 64 2a 2c 63 6f 6e 73 74 20 63 68  )(void*,const ch
26620 61 72 2a 29 29 28 76 6f 69 64 29 29 64 6c 73 79  ar*))(void))dlsy
26630 6d 3b 0a 20 20 72 65 74 75 72 6e 20 28 2a 78 29  m;.  return (*x)
26640 28 70 2c 20 7a 53 79 6d 29 3b 0a 7d 0a 73 74 61  (p, zSym);.}.sta
26650 74 69 63 20 76 6f 69 64 20 75 6e 69 78 44 6c 43  tic void unixDlC
26660 6c 6f 73 65 28 73 71 6c 69 74 65 33 5f 76 66 73  lose(sqlite3_vfs
26670 20 2a 4e 6f 74 55 73 65 64 2c 20 76 6f 69 64 20   *NotUsed, void 
26680 2a 70 48 61 6e 64 6c 65 29 7b 0a 20 20 55 4e 55  *pHandle){.  UNU
26690 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f  SED_PARAMETER(No
266a0 74 55 73 65 64 29 3b 0a 20 20 64 6c 63 6c 6f 73  tUsed);.  dlclos
266b0 65 28 70 48 61 6e 64 6c 65 29 3b 0a 7d 0a 23 65  e(pHandle);.}.#e
266c0 6c 73 65 20 2f 2a 20 69 66 20 53 51 4c 49 54 45  lse /* if SQLITE
266d0 5f 4f 4d 49 54 5f 4c 4f 41 44 5f 45 58 54 45 4e  _OMIT_LOAD_EXTEN
266e0 53 49 4f 4e 20 69 73 20 64 65 66 69 6e 65 64 3a  SION is defined:
266f0 20 2a 2f 0a 20 20 23 64 65 66 69 6e 65 20 75 6e   */.  #define un
26700 69 78 44 6c 4f 70 65 6e 20 20 30 0a 20 20 23 64  ixDlOpen  0.  #d
26710 65 66 69 6e 65 20 75 6e 69 78 44 6c 45 72 72 6f  efine unixDlErro
26720 72 20 30 0a 20 20 23 64 65 66 69 6e 65 20 75 6e  r 0.  #define un
26730 69 78 44 6c 53 79 6d 20 20 20 30 0a 20 20 23 64  ixDlSym   0.  #d
26740 65 66 69 6e 65 20 75 6e 69 78 44 6c 43 6c 6f 73  efine unixDlClos
26750 65 20 30 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  e 0.#endif../*.*
26760 2a 20 57 72 69 74 65 20 6e 42 75 66 20 62 79 74  * Write nBuf byt
26770 65 73 20 6f 66 20 72 61 6e 64 6f 6d 20 64 61 74  es of random dat
26780 61 20 74 6f 20 74 68 65 20 73 75 70 70 6c 69 65  a to the supplie
26790 64 20 62 75 66 66 65 72 20 7a 42 75 66 2e 0a 2a  d buffer zBuf..*
267a0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69  /.static int uni
267b0 78 52 61 6e 64 6f 6d 6e 65 73 73 28 73 71 6c 69  xRandomness(sqli
267c0 74 65 33 5f 76 66 73 20 2a 4e 6f 74 55 73 65 64  te3_vfs *NotUsed
267d0 2c 20 69 6e 74 20 6e 42 75 66 2c 20 63 68 61 72  , int nBuf, char
267e0 20 2a 7a 42 75 66 29 7b 0a 20 20 55 4e 55 53 45   *zBuf){.  UNUSE
267f0 44 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f 74 55  D_PARAMETER(NotU
26800 73 65 64 29 3b 0a 20 20 61 73 73 65 72 74 28 28  sed);.  assert((
26810 73 69 7a 65 5f 74 29 6e 42 75 66 3e 3d 28 73 69  size_t)nBuf>=(si
26820 7a 65 6f 66 28 74 69 6d 65 5f 74 29 2b 73 69 7a  zeof(time_t)+siz
26830 65 6f 66 28 69 6e 74 29 29 29 3b 0a 0a 20 20 2f  eof(int)));..  /
26840 2a 20 57 65 20 68 61 76 65 20 74 6f 20 69 6e 69  * We have to ini
26850 74 69 61 6c 69 7a 65 20 7a 42 75 66 20 74 6f 20  tialize zBuf to 
26860 70 72 65 76 65 6e 74 20 76 61 6c 67 72 69 6e 64  prevent valgrind
26870 20 66 72 6f 6d 20 72 65 70 6f 72 74 69 6e 67 0a   from reporting.
26880 20 20 2a 2a 20 65 72 72 6f 72 73 2e 20 20 54 68    ** errors.  Th
26890 65 20 72 65 70 6f 72 74 73 20 69 73 73 75 65 64  e reports issued
268a0 20 62 79 20 76 61 6c 67 72 69 6e 64 20 61 72 65   by valgrind are
268b0 20 69 6e 63 6f 72 72 65 63 74 20 2d 20 77 65 20   incorrect - we 
268c0 77 6f 75 6c 64 0a 20 20 2a 2a 20 70 72 65 66 65  would.  ** prefe
268d0 72 20 74 68 61 74 20 74 68 65 20 72 61 6e 64 6f  r that the rando
268e0 6d 6e 65 73 73 20 62 65 20 69 6e 63 72 65 61 73  mness be increas
268f0 65 64 20 62 79 20 6d 61 6b 69 6e 67 20 75 73 65  ed by making use
26900 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20 75 6e 69   of the.  ** uni
26910 6e 69 74 69 61 6c 69 7a 65 64 20 73 70 61 63 65  nitialized space
26920 20 69 6e 20 7a 42 75 66 20 2d 20 62 75 74 20 76   in zBuf - but v
26930 61 6c 67 72 69 6e 64 20 65 72 72 6f 72 73 20 74  algrind errors t
26940 65 6e 64 20 74 6f 20 77 6f 72 72 79 0a 20 20 2a  end to worry.  *
26950 2a 20 73 6f 6d 65 20 75 73 65 72 73 2e 20 20 52  * some users.  R
26960 61 74 68 65 72 20 74 68 61 6e 20 61 72 67 75 65  ather than argue
26970 2c 20 69 74 20 73 65 65 6d 73 20 65 61 73 69 65  , it seems easie
26980 72 20 6a 75 73 74 20 74 6f 20 69 6e 69 74 69 61  r just to initia
26990 6c 69 7a 65 0a 20 20 2a 2a 20 74 68 65 20 77 68  lize.  ** the wh
269a0 6f 6c 65 20 61 72 72 61 79 20 61 6e 64 20 73 69  ole array and si
269b0 6c 65 6e 63 65 20 76 61 6c 67 72 69 6e 64 2c 20  lence valgrind, 
269c0 65 76 65 6e 20 69 66 20 74 68 61 74 20 6d 65 61  even if that mea
269d0 6e 73 20 6c 65 73 73 20 72 61 6e 64 6f 6d 6e 65  ns less randomne
269e0 73 73 0a 20 20 2a 2a 20 69 6e 20 74 68 65 20 72  ss.  ** in the r
269f0 61 6e 64 6f 6d 20 73 65 65 64 2e 0a 20 20 2a 2a  andom seed..  **
26a00 0a 20 20 2a 2a 20 57 68 65 6e 20 74 65 73 74 69  .  ** When testi
26a10 6e 67 2c 20 69 6e 69 74 69 61 6c 69 7a 69 6e 67  ng, initializing
26a20 20 7a 42 75 66 5b 5d 20 74 6f 20 7a 65 72 6f 20   zBuf[] to zero 
26a30 69 73 20 61 6c 6c 20 77 65 20 64 6f 2e 20 20 54  is all we do.  T
26a40 68 61 74 20 6d 65 61 6e 73 0a 20 20 2a 2a 20 74  hat means.  ** t
26a50 68 61 74 20 77 65 20 61 6c 77 61 79 73 20 75 73  hat we always us
26a60 65 20 74 68 65 20 73 61 6d 65 20 72 61 6e 64 6f  e the same rando
26a70 6d 20 6e 75 6d 62 65 72 20 73 65 71 75 65 6e 63  m number sequenc
26a80 65 2e 20 20 54 68 69 73 20 6d 61 6b 65 73 20 74  e.  This makes t
26a90 68 65 0a 20 20 2a 2a 20 74 65 73 74 73 20 72 65  he.  ** tests re
26aa0 70 65 61 74 61 62 6c 65 2e 0a 20 20 2a 2f 0a 20  peatable..  */. 
26ab0 20 6d 65 6d 73 65 74 28 7a 42 75 66 2c 20 30 2c   memset(zBuf, 0,
26ac0 20 6e 42 75 66 29 3b 0a 23 69 66 20 21 64 65 66   nBuf);.#if !def
26ad0 69 6e 65 64 28 53 51 4c 49 54 45 5f 54 45 53 54  ined(SQLITE_TEST
26ae0 29 0a 20 20 7b 0a 20 20 20 20 69 6e 74 20 70 69  ).  {.    int pi
26af0 64 2c 20 66 64 3b 0a 20 20 20 20 66 64 20 3d 20  d, fd;.    fd = 
26b00 6f 70 65 6e 28 22 2f 64 65 76 2f 75 72 61 6e 64  open("/dev/urand
26b10 6f 6d 22 2c 20 4f 5f 52 44 4f 4e 4c 59 29 3b 0a  om", O_RDONLY);.
26b20 20 20 20 20 69 66 28 20 66 64 3c 30 20 29 7b 0a      if( fd<0 ){.
26b30 20 20 20 20 20 20 74 69 6d 65 5f 74 20 74 3b 0a        time_t t;.
26b40 20 20 20 20 20 20 74 69 6d 65 28 26 74 29 3b 0a        time(&t);.
26b50 20 20 20 20 20 20 6d 65 6d 63 70 79 28 7a 42 75        memcpy(zBu
26b60 66 2c 20 26 74 2c 20 73 69 7a 65 6f 66 28 74 29  f, &t, sizeof(t)
26b70 29 3b 0a 20 20 20 20 20 20 70 69 64 20 3d 20 67  );.      pid = g
26b80 65 74 70 69 64 28 29 3b 0a 20 20 20 20 20 20 6d  etpid();.      m
26b90 65 6d 63 70 79 28 26 7a 42 75 66 5b 73 69 7a 65  emcpy(&zBuf[size
26ba0 6f 66 28 74 29 5d 2c 20 26 70 69 64 2c 20 73 69  of(t)], &pid, si
26bb0 7a 65 6f 66 28 70 69 64 29 29 3b 0a 20 20 20 20  zeof(pid));.    
26bc0 20 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66    assert( sizeof
26bd0 28 74 29 2b 73 69 7a 65 6f 66 28 70 69 64 29 3c  (t)+sizeof(pid)<
26be0 3d 28 73 69 7a 65 5f 74 29 6e 42 75 66 20 29 3b  =(size_t)nBuf );
26bf0 0a 20 20 20 20 20 20 6e 42 75 66 20 3d 20 73 69  .      nBuf = si
26c00 7a 65 6f 66 28 74 29 20 2b 20 73 69 7a 65 6f 66  zeof(t) + sizeof
26c10 28 70 69 64 29 3b 0a 20 20 20 20 7d 65 6c 73 65  (pid);.    }else
26c20 7b 0a 20 20 20 20 20 20 6e 42 75 66 20 3d 20 72  {.      nBuf = r
26c30 65 61 64 28 66 64 2c 20 7a 42 75 66 2c 20 6e 42  ead(fd, zBuf, nB
26c40 75 66 29 3b 0a 20 20 20 20 20 20 63 6c 6f 73 65  uf);.      close
26c50 28 66 64 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  (fd);.    }.  }.
26c60 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20  #endif.  return 
26c70 6e 42 75 66 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  nBuf;.}.../*.** 
26c80 53 6c 65 65 70 20 66 6f 72 20 61 20 6c 69 74 74  Sleep for a litt
26c90 6c 65 20 77 68 69 6c 65 2e 20 20 52 65 74 75 72  le while.  Retur
26ca0 6e 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66 20  n the amount of 
26cb0 74 69 6d 65 20 73 6c 65 70 74 2e 0a 2a 2a 20 54  time slept..** T
26cc0 68 65 20 61 72 67 75 6d 65 6e 74 20 69 73 20 74  he argument is t
26cd0 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 6d 69 63  he number of mic
26ce0 72 6f 73 65 63 6f 6e 64 73 20 77 65 20 77 61 6e  roseconds we wan
26cf0 74 20 74 6f 20 73 6c 65 65 70 2e 0a 2a 2a 20 54  t to sleep..** T
26d00 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20  he return value 
26d10 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  is the number of
26d20 20 6d 69 63 72 6f 73 65 63 6f 6e 64 73 20 6f 66   microseconds of
26d30 20 73 6c 65 65 70 20 61 63 74 75 61 6c 6c 79 0a   sleep actually.
26d40 2a 2a 20 72 65 71 75 65 73 74 65 64 20 66 72 6f  ** requested fro
26d50 6d 20 74 68 65 20 75 6e 64 65 72 6c 79 69 6e 67  m the underlying
26d60 20 6f 70 65 72 61 74 69 6e 67 20 73 79 73 74 65   operating syste
26d70 6d 2c 20 61 20 6e 75 6d 62 65 72 20 77 68 69 63  m, a number whic
26d80 68 0a 2a 2a 20 6d 69 67 68 74 20 62 65 20 67 72  h.** might be gr
26d90 65 61 74 65 72 20 74 68 61 6e 20 6f 72 20 65 71  eater than or eq
26da0 75 61 6c 20 74 6f 20 74 68 65 20 61 72 67 75 6d  ual to the argum
26db0 65 6e 74 2c 20 62 75 74 20 6e 6f 74 20 6c 65 73  ent, but not les
26dc0 73 0a 2a 2a 20 74 68 61 6e 20 74 68 65 20 61 72  s.** than the ar
26dd0 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69  gument..*/.stati
26de0 63 20 69 6e 74 20 75 6e 69 78 53 6c 65 65 70 28  c int unixSleep(
26df0 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 4e 6f 74  sqlite3_vfs *Not
26e00 55 73 65 64 2c 20 69 6e 74 20 6d 69 63 72 6f 73  Used, int micros
26e10 65 63 6f 6e 64 73 29 7b 0a 23 69 66 20 4f 53 5f  econds){.#if OS_
26e20 56 58 57 4f 52 4b 53 0a 20 20 73 74 72 75 63 74  VXWORKS.  struct
26e30 20 74 69 6d 65 73 70 65 63 20 73 70 3b 0a 0a 20   timespec sp;.. 
26e40 20 73 70 2e 74 76 5f 73 65 63 20 3d 20 6d 69 63   sp.tv_sec = mic
26e50 72 6f 73 65 63 6f 6e 64 73 20 2f 20 31 30 30 30  roseconds / 1000
26e60 30 30 30 3b 0a 20 20 73 70 2e 74 76 5f 6e 73 65  000;.  sp.tv_nse
26e70 63 20 3d 20 28 6d 69 63 72 6f 73 65 63 6f 6e 64  c = (microsecond
26e80 73 20 25 20 31 30 30 30 30 30 30 29 20 2a 20 31  s % 1000000) * 1
26e90 30 30 30 3b 0a 20 20 6e 61 6e 6f 73 6c 65 65 70  000;.  nanosleep
26ea0 28 26 73 70 2c 20 4e 55 4c 4c 29 3b 0a 20 20 55  (&sp, NULL);.  U
26eb0 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
26ec0 4e 6f 74 55 73 65 64 29 3b 0a 20 20 72 65 74 75  NotUsed);.  retu
26ed0 72 6e 20 6d 69 63 72 6f 73 65 63 6f 6e 64 73 3b  rn microseconds;
26ee0 0a 23 65 6c 69 66 20 64 65 66 69 6e 65 64 28 48  .#elif defined(H
26ef0 41 56 45 5f 55 53 4c 45 45 50 29 20 26 26 20 48  AVE_USLEEP) && H
26f00 41 56 45 5f 55 53 4c 45 45 50 0a 20 20 75 73 6c  AVE_USLEEP.  usl
26f10 65 65 70 28 6d 69 63 72 6f 73 65 63 6f 6e 64 73  eep(microseconds
26f20 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  );.  UNUSED_PARA
26f30 4d 45 54 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a  METER(NotUsed);.
26f40 20 20 72 65 74 75 72 6e 20 6d 69 63 72 6f 73 65    return microse
26f50 63 6f 6e 64 73 3b 0a 23 65 6c 73 65 0a 20 20 69  conds;.#else.  i
26f60 6e 74 20 73 65 63 6f 6e 64 73 20 3d 20 28 6d 69  nt seconds = (mi
26f70 63 72 6f 73 65 63 6f 6e 64 73 2b 39 39 39 39 39  croseconds+99999
26f80 39 29 2f 31 30 30 30 30 30 30 3b 0a 20 20 73 6c  9)/1000000;.  sl
26f90 65 65 70 28 73 65 63 6f 6e 64 73 29 3b 0a 20 20  eep(seconds);.  
26fa0 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
26fb0 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20 72 65 74  (NotUsed);.  ret
26fc0 75 72 6e 20 73 65 63 6f 6e 64 73 2a 31 30 30 30  urn seconds*1000
26fd0 30 30 30 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f  000;.#endif.}../
26fe0 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69  *.** The followi
26ff0 6e 67 20 76 61 72 69 61 62 6c 65 2c 20 69 66 20  ng variable, if 
27000 73 65 74 20 74 6f 20 61 20 6e 6f 6e 2d 7a 65 72  set to a non-zer
27010 6f 20 76 61 6c 75 65 2c 20 69 73 20 69 6e 74 65  o value, is inte
27020 72 70 72 65 74 65 64 20 61 73 0a 2a 2a 20 74 68  rpreted as.** th
27030 65 20 6e 75 6d 62 65 72 20 6f 66 20 73 65 63 6f  e number of seco
27040 6e 64 73 20 73 69 6e 63 65 20 31 39 37 30 20 61  nds since 1970 a
27050 6e 64 20 69 73 20 75 73 65 64 20 74 6f 20 73 65  nd is used to se
27060 74 20 74 68 65 20 72 65 73 75 6c 74 20 6f 66 0a  t the result of.
27070 2a 2a 20 73 71 6c 69 74 65 33 4f 73 43 75 72 72  ** sqlite3OsCurr
27080 65 6e 74 54 69 6d 65 28 29 20 64 75 72 69 6e 67  entTime() during
27090 20 74 65 73 74 69 6e 67 2e 0a 2a 2f 0a 23 69 66   testing..*/.#if
270a0 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a  def SQLITE_TEST.
270b0 69 6e 74 20 73 71 6c 69 74 65 33 5f 63 75 72 72  int sqlite3_curr
270c0 65 6e 74 5f 74 69 6d 65 20 3d 20 30 3b 20 20 2f  ent_time = 0;  /
270d0 2a 20 46 61 6b 65 20 73 79 73 74 65 6d 20 74 69  * Fake system ti
270e0 6d 65 20 69 6e 20 73 65 63 6f 6e 64 73 20 73 69  me in seconds si
270f0 6e 63 65 20 31 39 37 30 2e 20 2a 2f 0a 23 65 6e  nce 1970. */.#en
27100 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 46 69 6e 64 20  dif../*.** Find 
27110 74 68 65 20 63 75 72 72 65 6e 74 20 74 69 6d 65  the current time
27120 20 28 69 6e 20 55 6e 69 76 65 72 73 61 6c 20 43   (in Universal C
27130 6f 6f 72 64 69 6e 61 74 65 64 20 54 69 6d 65 29  oordinated Time)
27140 2e 20 20 57 72 69 74 65 20 69 6e 74 6f 20 2a 70  .  Write into *p
27150 69 4e 6f 77 0a 2a 2a 20 74 68 65 20 63 75 72 72  iNow.** the curr
27160 65 6e 74 20 74 69 6d 65 20 61 6e 64 20 64 61 74  ent time and dat
27170 65 20 61 73 20 61 20 4a 75 6c 69 61 6e 20 44 61  e as a Julian Da
27180 79 20 6e 75 6d 62 65 72 20 74 69 6d 65 73 20 38  y number times 8
27190 36 5f 34 30 30 5f 30 30 30 2e 20 20 49 6e 0a 2a  6_400_000.  In.*
271a0 2a 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 77  * other words, w
271b0 72 69 74 65 20 69 6e 74 6f 20 2a 70 69 4e 6f 77  rite into *piNow
271c0 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 6d   the number of m
271d0 69 6c 6c 69 73 65 63 6f 6e 64 73 20 73 69 6e 63  illiseconds sinc
271e0 65 20 74 68 65 20 4a 75 6c 69 61 6e 0a 2a 2a 20  e the Julian.** 
271f0 65 70 6f 63 68 20 6f 66 20 6e 6f 6f 6e 20 69 6e  epoch of noon in
27200 20 47 72 65 65 6e 77 69 63 68 20 6f 6e 20 4e 6f   Greenwich on No
27210 76 65 6d 62 65 72 20 32 34 2c 20 34 37 31 34 20  vember 24, 4714 
27220 42 2e 43 20 61 63 63 6f 72 64 69 6e 67 20 74 6f  B.C according to
27230 20 74 68 65 0a 2a 2a 20 70 72 6f 6c 65 70 74 69   the.** prolepti
27240 63 20 47 72 65 67 6f 72 69 61 6e 20 63 61 6c 65  c Gregorian cale
27250 6e 64 61 72 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 20 73  ndar..**.** On s
27260 75 63 63 65 73 73 2c 20 72 65 74 75 72 6e 20 30  uccess, return 0
27270 2e 20 20 52 65 74 75 72 6e 20 31 20 69 66 20 74  .  Return 1 if t
27280 68 65 20 74 69 6d 65 20 61 6e 64 20 64 61 74 65  he time and date
27290 20 63 61 6e 6e 6f 74 20 62 65 20 66 6f 75 6e 64   cannot be found
272a0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
272b0 75 6e 69 78 43 75 72 72 65 6e 74 54 69 6d 65 49  unixCurrentTimeI
272c0 6e 74 36 34 28 73 71 6c 69 74 65 33 5f 76 66 73  nt64(sqlite3_vfs
272d0 20 2a 4e 6f 74 55 73 65 64 2c 20 73 71 6c 69 74   *NotUsed, sqlit
272e0 65 33 5f 69 6e 74 36 34 20 2a 70 69 4e 6f 77 29  e3_int64 *piNow)
272f0 7b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74  {.  static const
27300 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 75   sqlite3_int64 u
27310 6e 69 78 45 70 6f 63 68 20 3d 20 32 34 34 30 35  nixEpoch = 24405
27320 38 37 35 2a 28 73 71 6c 69 74 65 33 5f 69 6e 74  875*(sqlite3_int
27330 36 34 29 38 36 34 30 30 30 30 3b 0a 23 69 66 20  64)8640000;.#if 
27340 64 65 66 69 6e 65 64 28 4e 4f 5f 47 45 54 54 4f  defined(NO_GETTO
27350 44 29 0a 20 20 74 69 6d 65 5f 74 20 74 3b 0a 20  D).  time_t t;. 
27360 20 74 69 6d 65 28 26 74 29 3b 0a 20 20 2a 70 69   time(&t);.  *pi
27370 4e 6f 77 20 3d 20 28 28 73 71 6c 69 74 65 33 5f  Now = ((sqlite3_
27380 69 6e 74 36 34 29 69 29 2a 31 30 30 30 20 2b 20  int64)i)*1000 + 
27390 75 6e 69 78 45 70 6f 63 68 3b 0a 23 65 6c 69 66  unixEpoch;.#elif
273a0 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20 73 74   OS_VXWORKS.  st
273b0 72 75 63 74 20 74 69 6d 65 73 70 65 63 20 73 4e  ruct timespec sN
273c0 6f 77 3b 0a 20 20 63 6c 6f 63 6b 5f 67 65 74 74  ow;.  clock_gett
273d0 69 6d 65 28 43 4c 4f 43 4b 5f 52 45 41 4c 54 49  ime(CLOCK_REALTI
273e0 4d 45 2c 20 26 73 4e 6f 77 29 3b 0a 20 20 2a 70  ME, &sNow);.  *p
273f0 69 4e 6f 77 20 3d 20 75 6e 69 78 45 70 6f 63 68  iNow = unixEpoch
27400 20 2b 20 31 30 30 30 2a 28 73 71 6c 69 74 65 33   + 1000*(sqlite3
27410 5f 69 6e 74 36 34 29 73 4e 6f 77 2e 74 76 5f 73  _int64)sNow.tv_s
27420 65 63 20 2b 20 73 4e 6f 77 2e 74 76 5f 6e 73 65  ec + sNow.tv_nse
27430 63 2f 31 30 30 30 30 30 30 3b 0a 23 65 6c 73 65  c/1000000;.#else
27440 0a 20 20 73 74 72 75 63 74 20 74 69 6d 65 76 61  .  struct timeva
27450 6c 20 73 4e 6f 77 3b 0a 20 20 67 65 74 74 69 6d  l sNow;.  gettim
27460 65 6f 66 64 61 79 28 26 73 4e 6f 77 2c 20 30 29  eofday(&sNow, 0)
27470 3b 0a 20 20 2a 70 69 4e 6f 77 20 3d 20 75 6e 69  ;.  *piNow = uni
27480 78 45 70 6f 63 68 20 2b 20 31 30 30 30 2a 28 73  xEpoch + 1000*(s
27490 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 73 4e 6f  qlite3_int64)sNo
274a0 77 2e 74 76 5f 73 65 63 20 2b 20 73 4e 6f 77 2e  w.tv_sec + sNow.
274b0 74 76 5f 75 73 65 63 2f 31 30 30 30 3b 0a 23 65  tv_usec/1000;.#e
274c0 6e 64 69 66 0a 0a 23 69 66 64 65 66 20 53 51 4c  ndif..#ifdef SQL
274d0 49 54 45 5f 54 45 53 54 0a 20 20 69 66 28 20 73  ITE_TEST.  if( s
274e0 71 6c 69 74 65 33 5f 63 75 72 72 65 6e 74 5f 74  qlite3_current_t
274f0 69 6d 65 20 29 7b 0a 20 20 20 20 2a 70 69 4e 6f  ime ){.    *piNo
27500 77 20 3d 20 31 30 30 30 2a 28 73 71 6c 69 74 65  w = 1000*(sqlite
27510 33 5f 69 6e 74 36 34 29 73 71 6c 69 74 65 33 5f  3_int64)sqlite3_
27520 63 75 72 72 65 6e 74 5f 74 69 6d 65 20 2b 20 75  current_time + u
27530 6e 69 78 45 70 6f 63 68 3b 0a 20 20 7d 0a 23 65  nixEpoch;.  }.#e
27540 6e 64 69 66 0a 20 20 55 4e 55 53 45 44 5f 50 41  ndif.  UNUSED_PA
27550 52 41 4d 45 54 45 52 28 4e 6f 74 55 73 65 64 29  RAMETER(NotUsed)
27560 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  ;.  return 0;.}.
27570 0a 2f 2a 0a 2a 2a 20 46 69 6e 64 20 74 68 65 20  ./*.** Find the 
27580 63 75 72 72 65 6e 74 20 74 69 6d 65 20 28 69 6e  current time (in
27590 20 55 6e 69 76 65 72 73 61 6c 20 43 6f 6f 72 64   Universal Coord
275a0 69 6e 61 74 65 64 20 54 69 6d 65 29 2e 20 20 57  inated Time).  W
275b0 72 69 74 65 20 74 68 65 0a 2a 2a 20 63 75 72 72  rite the.** curr
275c0 65 6e 74 20 74 69 6d 65 20 61 6e 64 20 64 61 74  ent time and dat
275d0 65 20 61 73 20 61 20 4a 75 6c 69 61 6e 20 44 61  e as a Julian Da
275e0 79 20 6e 75 6d 62 65 72 20 69 6e 74 6f 20 2a 70  y number into *p
275f0 72 4e 6f 77 20 61 6e 64 0a 2a 2a 20 72 65 74 75  rNow and.** retu
27600 72 6e 20 30 2e 20 20 52 65 74 75 72 6e 20 31 20  rn 0.  Return 1 
27610 69 66 20 74 68 65 20 74 69 6d 65 20 61 6e 64 20  if the time and 
27620 64 61 74 65 20 63 61 6e 6e 6f 74 20 62 65 20 66  date cannot be f
27630 6f 75 6e 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ound..*/.static 
27640 69 6e 74 20 75 6e 69 78 43 75 72 72 65 6e 74 54  int unixCurrentT
27650 69 6d 65 28 73 71 6c 69 74 65 33 5f 76 66 73 20  ime(sqlite3_vfs 
27660 2a 4e 6f 74 55 73 65 64 2c 20 64 6f 75 62 6c 65  *NotUsed, double
27670 20 2a 70 72 4e 6f 77 29 7b 0a 20 20 73 71 6c 69   *prNow){.  sqli
27680 74 65 33 5f 69 6e 74 36 34 20 69 3b 0a 20 20 75  te3_int64 i;.  u
27690 6e 69 78 43 75 72 72 65 6e 74 54 69 6d 65 49 6e  nixCurrentTimeIn
276a0 74 36 34 28 30 2c 20 26 69 29 3b 0a 20 20 2a 70  t64(0, &i);.  *p
276b0 72 4e 6f 77 20 3d 20 69 2f 38 36 34 30 30 30 30  rNow = i/8640000
276c0 30 2e 30 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b  0.0;.  return 0;
276d0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 65 20 61 64 64  .}../*.** We add
276e0 65 64 20 74 68 65 20 78 47 65 74 4c 61 73 74 45  ed the xGetLastE
276f0 72 72 6f 72 28 29 20 6d 65 74 68 6f 64 20 77 69  rror() method wi
27700 74 68 20 74 68 65 20 69 6e 74 65 6e 74 69 6f 6e  th the intention
27710 20 6f 66 20 70 72 6f 76 69 64 69 6e 67 0a 2a 2a   of providing.**
27720 20 62 65 74 74 65 72 20 6c 6f 77 2d 6c 65 76 65   better low-leve
27730 6c 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 73  l error messages
27740 20 77 68 65 6e 20 6f 70 65 72 61 74 69 6e 67 2d   when operating-
27750 73 79 73 74 65 6d 20 70 72 6f 62 6c 65 6d 73 20  system problems 
27760 63 6f 6d 65 20 75 70 0a 2a 2a 20 64 75 72 69 6e  come up.** durin
27770 67 20 53 51 4c 69 74 65 20 6f 70 65 72 61 74 69  g SQLite operati
27780 6f 6e 2e 20 20 42 75 74 20 73 6f 20 66 61 72 2c  on.  But so far,
27790 20 6e 6f 6e 65 20 6f 66 20 74 68 61 74 20 68 61   none of that ha
277a0 73 20 62 65 65 6e 20 69 6d 70 6c 65 6d 65 6e 74  s been implement
277b0 65 64 0a 2a 2a 20 69 6e 20 74 68 65 20 63 6f 72  ed.** in the cor
277c0 65 2e 20 20 53 6f 20 74 68 69 73 20 72 6f 75 74  e.  So this rout
277d0 69 6e 65 20 69 73 20 6e 65 76 65 72 20 63 61 6c  ine is never cal
277e0 6c 65 64 2e 20 20 46 6f 72 20 6e 6f 77 2c 20 69  led.  For now, i
277f0 74 20 69 73 20 6d 65 72 65 6c 79 0a 2a 2a 20 61  t is merely.** a
27800 20 70 6c 61 63 65 2d 68 6f 6c 64 65 72 2e 0a 2a   place-holder..*
27810 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69  /.static int uni
27820 78 47 65 74 4c 61 73 74 45 72 72 6f 72 28 73 71  xGetLastError(sq
27830 6c 69 74 65 33 5f 76 66 73 20 2a 4e 6f 74 55 73  lite3_vfs *NotUs
27840 65 64 2c 20 69 6e 74 20 4e 6f 74 55 73 65 64 32  ed, int NotUsed2
27850 2c 20 63 68 61 72 20 2a 4e 6f 74 55 73 65 64 33  , char *NotUsed3
27860 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  ){.  UNUSED_PARA
27870 4d 45 54 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a  METER(NotUsed);.
27880 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
27890 45 52 28 4e 6f 74 55 73 65 64 32 29 3b 0a 20 20  ER(NotUsed2);.  
278a0 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
278b0 28 4e 6f 74 55 73 65 64 33 29 3b 0a 20 20 72 65  (NotUsed3);.  re
278c0 74 75 72 6e 20 30 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  turn 0;.}.../*.*
278d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
278e0 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64 20 6f 66 20 73  ******* End of s
278f0 71 6c 69 74 65 33 5f 76 66 73 20 6d 65 74 68 6f  qlite3_vfs metho
27900 64 73 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ds *************
27910 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a  **************.*
27920 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
27930 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
27940 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
27950 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
27960 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a  *************/..
27970 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  /***************
27980 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
27990 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
279a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
279b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a  ***************.
279c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
279d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 42 65 67 69 6e  ********** Begin
279e0 20 50 72 6f 78 79 20 4c 6f 63 6b 69 6e 67 20 2a   Proxy Locking *
279f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
27a00 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a  ***************.
27a10 2a 2a 0a 2a 2a 20 50 72 6f 78 79 20 6c 6f 63 6b  **.** Proxy lock
27a20 69 6e 67 20 69 73 20 61 20 22 75 62 65 72 2d 6c  ing is a "uber-l
27a30 6f 63 6b 69 6e 67 2d 6d 65 74 68 6f 64 22 20 69  ocking-method" i
27a40 6e 20 74 68 69 73 20 73 65 6e 73 65 3a 20 20 49  n this sense:  I
27a50 74 20 75 73 65 73 20 74 68 65 0a 2a 2a 20 6f 74  t uses the.** ot
27a60 68 65 72 20 6c 6f 63 6b 69 6e 67 20 6d 65 74 68  her locking meth
27a70 6f 64 73 20 6f 6e 20 73 65 63 6f 6e 64 61 72 79  ods on secondary
27a80 20 6c 6f 63 6b 20 66 69 6c 65 73 2e 20 20 50 72   lock files.  Pr
27a90 6f 78 79 20 6c 6f 63 6b 69 6e 67 20 69 73 20 61  oxy locking is a
27aa0 0a 2a 2a 20 6d 65 74 61 2d 6c 61 79 65 72 20 6f  .** meta-layer o
27ab0 76 65 72 20 74 6f 70 20 6f 66 20 74 68 65 20 70  ver top of the p
27ac0 72 69 6d 69 74 69 76 65 20 6c 6f 63 6b 69 6e 67  rimitive locking
27ad0 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 61 62 6f   implemented abo
27ae0 76 65 2e 20 20 46 6f 72 0a 2a 2a 20 74 68 69 73  ve.  For.** this
27af0 20 72 65 61 73 6f 6e 2c 20 74 68 65 20 64 69 76   reason, the div
27b00 69 73 69 6f 6e 20 74 68 61 74 20 69 6d 70 6c 65  ision that imple
27b10 6d 65 6e 74 73 20 6f 66 20 70 72 6f 78 79 20 6c  ments of proxy l
27b20 6f 63 6b 69 6e 67 20 69 73 20 64 65 66 65 72 72  ocking is deferr
27b30 65 64 0a 2a 2a 20 75 6e 74 69 6c 20 6c 61 74 65  ed.** until late
27b40 20 69 6e 20 74 68 65 20 66 69 6c 65 20 28 68 65   in the file (he
27b50 72 65 29 20 61 66 74 65 72 20 61 6c 6c 20 6f 66  re) after all of
27b60 20 74 68 65 20 6f 74 68 65 72 20 49 2f 4f 20 6d   the other I/O m
27b70 65 74 68 6f 64 73 20 68 61 76 65 0a 2a 2a 20 62  ethods have.** b
27b80 65 65 6e 20 64 65 66 69 6e 65 64 20 2d 20 73 6f  een defined - so
27b90 20 74 68 61 74 20 74 68 65 20 70 72 69 6d 69 74   that the primit
27ba0 69 76 65 20 6c 6f 63 6b 69 6e 67 20 6d 65 74 68  ive locking meth
27bb0 6f 64 73 20 61 72 65 20 61 76 61 69 6c 61 62 6c  ods are availabl
27bc0 65 0a 2a 2a 20 61 73 20 73 65 72 76 69 63 65 73  e.** as services
27bd0 20 74 6f 20 68 65 6c 70 20 77 69 74 68 20 74 68   to help with th
27be0 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  e implementation
27bf0 20 6f 66 20 70 72 6f 78 79 20 6c 6f 63 6b 69 6e   of proxy lockin
27c00 67 2e 0a 2a 2a 0a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a  g..**.****.**.**
27c10 20 54 68 65 20 64 65 66 61 75 6c 74 20 6c 6f 63   The default loc
27c20 6b 69 6e 67 20 73 63 68 65 6d 65 73 20 69 6e 20  king schemes in 
27c30 53 51 4c 69 74 65 20 75 73 65 20 62 79 74 65 2d  SQLite use byte-
27c40 72 61 6e 67 65 20 6c 6f 63 6b 73 20 6f 6e 20 74  range locks on t
27c50 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 66  he.** database f
27c60 69 6c 65 20 74 6f 20 63 6f 6f 72 64 69 6e 61 74  ile to coordinat
27c70 65 20 73 61 66 65 2c 20 63 6f 6e 63 75 72 72 65  e safe, concurre
27c80 6e 74 20 61 63 63 65 73 73 20 62 79 20 6d 75 6c  nt access by mul
27c90 74 69 70 6c 65 20 72 65 61 64 65 72 73 0a 2a 2a  tiple readers.**
27ca0 20 61 6e 64 20 77 72 69 74 65 72 73 20 5b 68 74   and writers [ht
27cb0 74 70 3a 2f 2f 73 71 6c 69 74 65 2e 6f 72 67 2f  tp://sqlite.org/
27cc0 6c 6f 63 6b 69 6e 67 76 33 2e 68 74 6d 6c 5d 2e  lockingv3.html].
27cd0 20 20 54 68 65 20 66 69 76 65 20 66 69 6c 65 20    The five file 
27ce0 6c 6f 63 6b 69 6e 67 0a 2a 2a 20 73 74 61 74 65  locking.** state
27cf0 73 20 28 55 4e 4c 4f 43 4b 45 44 2c 20 50 45 4e  s (UNLOCKED, PEN
27d00 44 49 4e 47 2c 20 53 48 41 52 45 44 2c 20 52 45  DING, SHARED, RE
27d10 53 45 52 56 45 44 2c 20 45 58 43 4c 55 53 49 56  SERVED, EXCLUSIV
27d20 45 29 20 61 72 65 20 69 6d 70 6c 65 6d 65 6e 74  E) are implement
27d30 65 64 0a 2a 2a 20 61 73 20 50 4f 53 49 58 20 72  ed.** as POSIX r
27d40 65 61 64 20 26 20 77 72 69 74 65 20 6c 6f 63 6b  ead & write lock
27d50 73 20 6f 76 65 72 20 66 69 78 65 64 20 73 65 74  s over fixed set
27d60 20 6f 66 20 6c 6f 63 61 74 69 6f 6e 73 20 28 76   of locations (v
27d70 69 61 20 66 73 63 74 6c 29 2c 0a 2a 2a 20 6f 6e  ia fsctl),.** on
27d80 20 41 46 50 20 61 6e 64 20 53 4d 42 20 6f 6e 6c   AFP and SMB onl
27d90 79 20 65 78 63 6c 75 73 69 76 65 20 62 79 74 65  y exclusive byte
27da0 2d 72 61 6e 67 65 20 6c 6f 63 6b 73 20 61 72 65  -range locks are
27db0 20 61 76 61 69 6c 61 62 6c 65 20 76 69 61 20 66   available via f
27dc0 73 63 74 6c 0a 2a 2a 20 77 69 74 68 20 5f 49 4f  sctl.** with _IO
27dd0 57 52 28 27 7a 27 2c 20 32 33 2c 20 73 74 72 75  WR('z', 23, stru
27de0 63 74 20 42 79 74 65 52 61 6e 67 65 4c 6f 63 6b  ct ByteRangeLock
27df0 50 42 32 29 20 74 6f 20 74 72 61 63 6b 20 74 68  PB2) to track th
27e00 65 20 73 61 6d 65 20 35 20 73 74 61 74 65 73 2e  e same 5 states.
27e10 0a 2a 2a 20 54 6f 20 73 69 6d 75 6c 61 74 65 20  .** To simulate 
27e20 61 20 46 5f 52 44 4c 43 4b 20 6f 6e 20 74 68 65  a F_RDLCK on the
27e30 20 73 68 61 72 65 64 20 72 61 6e 67 65 2c 20 6f   shared range, o
27e40 6e 20 41 46 50 20 61 20 72 61 6e 64 6f 6d 6c 79  n AFP a randomly
27e50 20 73 65 6c 65 63 74 65 64 0a 2a 2a 20 61 64 64   selected.** add
27e60 72 65 73 73 20 69 6e 20 74 68 65 20 73 68 61 72  ress in the shar
27e70 65 64 20 72 61 6e 67 65 20 69 73 20 74 61 6b 65  ed range is take
27e80 6e 20 66 6f 72 20 61 20 53 48 41 52 45 44 20 6c  n for a SHARED l
27e90 6f 63 6b 2c 20 74 68 65 20 65 6e 74 69 72 65 0a  ock, the entire.
27ea0 2a 2a 20 73 68 61 72 65 64 20 72 61 6e 67 65 20  ** shared range 
27eb0 69 73 20 74 61 6b 65 6e 20 66 6f 72 20 61 6e 20  is taken for an 
27ec0 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 29 3a  EXCLUSIVE lock):
27ed0 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 50 45 4e 44  .**.**      PEND
27ee0 49 4e 47 5f 42 59 54 45 20 20 20 20 20 20 20 20  ING_BYTE        
27ef0 30 78 34 30 30 30 30 30 30 30 09 09 20 20 20 09  0x40000000..   .
27f00 0a 2a 2a 20 20 20 20 20 20 52 45 53 45 52 56 45  .**      RESERVE
27f10 44 5f 42 59 54 45 20 20 20 20 20 20 20 30 78 34  D_BYTE       0x4
27f20 30 30 30 30 30 30 31 0a 2a 2a 20 20 20 20 20 20  0000001.**      
27f30 53 48 41 52 45 44 5f 52 41 4e 47 45 20 20 20 20  SHARED_RANGE    
27f40 20 20 20 20 30 78 34 30 30 30 30 30 30 32 20 2d      0x40000002 -
27f50 3e 20 30 78 34 30 30 30 30 32 30 30 0a 2a 2a 0a  > 0x40000200.**.
27f60 2a 2a 20 54 68 69 73 20 77 6f 72 6b 73 20 77 65  ** This works we
27f70 6c 6c 20 6f 6e 20 74 68 65 20 6c 6f 63 61 6c 20  ll on the local 
27f80 66 69 6c 65 20 73 79 73 74 65 6d 2c 20 62 75 74  file system, but
27f90 20 73 68 6f 77 73 20 61 20 6e 65 61 72 6c 79 20   shows a nearly 
27fa0 31 30 30 78 0a 2a 2a 20 73 6c 6f 77 64 6f 77 6e  100x.** slowdown
27fb0 20 69 6e 20 72 65 61 64 20 70 65 72 66 6f 72 6d   in read perform
27fc0 61 6e 63 65 20 6f 6e 20 41 46 50 20 62 65 63 61  ance on AFP beca
27fd0 75 73 65 20 74 68 65 20 41 46 50 20 63 6c 69 65  use the AFP clie
27fe0 6e 74 20 64 69 73 61 62 6c 65 73 0a 2a 2a 20 74  nt disables.** t
27ff0 68 65 20 72 65 61 64 20 63 61 63 68 65 20 77 68  he read cache wh
28000 65 6e 20 62 79 74 65 2d 72 61 6e 67 65 20 6c 6f  en byte-range lo
28010 63 6b 73 20 61 72 65 20 70 72 65 73 65 6e 74 2e  cks are present.
28020 20 20 45 6e 61 62 6c 69 6e 67 20 74 68 65 20 72    Enabling the r
28030 65 61 64 0a 2a 2a 20 63 61 63 68 65 20 65 78 70  ead.** cache exp
28040 6f 73 65 73 20 61 20 63 61 63 68 65 20 63 6f 68  oses a cache coh
28050 65 72 65 6e 63 79 20 70 72 6f 62 6c 65 6d 20 74  erency problem t
28060 68 61 74 20 69 73 20 70 72 65 73 65 6e 74 20 6f  hat is present o
28070 6e 20 61 6c 6c 20 4f 53 20 58 0a 2a 2a 20 73 75  n all OS X.** su
28080 70 70 6f 72 74 65 64 20 6e 65 74 77 6f 72 6b 20  pported network 
28090 66 69 6c 65 20 73 79 73 74 65 6d 73 2e 20 20 4e  file systems.  N
280a0 46 53 20 61 6e 64 20 41 46 50 20 62 6f 74 68 20  FS and AFP both 
280b0 6f 62 73 65 72 76 65 20 74 68 65 0a 2a 2a 20 63  observe the.** c
280c0 6c 6f 73 65 2d 74 6f 2d 6f 70 65 6e 20 73 65 6d  lose-to-open sem
280d0 61 6e 74 69 63 73 20 66 6f 72 20 65 6e 73 75 72  antics for ensur
280e0 69 6e 67 20 63 61 63 68 65 20 63 6f 68 65 72 65  ing cache cohere
280f0 6e 63 79 0a 2a 2a 20 5b 68 74 74 70 3a 2f 2f 6e  ncy.** [http://n
28100 66 73 2e 73 6f 75 72 63 65 66 6f 72 67 65 2e 6e  fs.sourceforge.n
28110 65 74 2f 23 66 61 71 5f 61 38 5d 2c 20 77 68 69  et/#faq_a8], whi
28120 63 68 20 64 6f 65 73 20 6e 6f 74 20 65 66 66 65  ch does not effe
28130 63 74 69 76 65 6c 79 0a 2a 2a 20 61 64 64 72 65  ctively.** addre
28140 73 73 20 74 68 65 20 72 65 71 75 69 72 65 6d 65  ss the requireme
28150 6e 74 73 20 66 6f 72 20 63 6f 6e 63 75 72 72 65  nts for concurre
28160 6e 74 20 64 61 74 61 62 61 73 65 20 61 63 63 65  nt database acce
28170 73 73 20 62 79 20 6d 75 6c 74 69 70 6c 65 0a 2a  ss by multiple.*
28180 2a 20 72 65 61 64 65 72 73 20 61 6e 64 20 77 72  * readers and wr
28190 69 74 65 72 73 0a 2a 2a 20 5b 68 74 74 70 3a 2f  iters.** [http:/
281a0 2f 77 77 77 2e 6e 61 62 62 6c 65 2e 63 6f 6d 2f  /www.nabble.com/
281b0 53 51 4c 69 74 65 2d 6f 6e 2d 4e 46 53 2d 63 61  SQLite-on-NFS-ca
281c0 63 68 65 2d 63 6f 68 65 72 65 6e 63 79 2d 74 64  che-coherency-td
281d0 31 35 36 35 35 37 30 31 2e 68 74 6d 6c 5d 2e 0a  15655701.html]..
281e0 2a 2a 0a 2a 2a 20 54 6f 20 61 64 64 72 65 73 73  **.** To address
281f0 20 74 68 65 20 70 65 72 66 6f 72 6d 61 6e 63 65   the performance
28200 20 61 6e 64 20 63 61 63 68 65 20 63 6f 68 65 72   and cache coher
28210 65 6e 63 79 20 69 73 73 75 65 73 2c 20 70 72 6f  ency issues, pro
28220 78 79 20 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 0a  xy file locking.
28230 2a 2a 20 63 68 61 6e 67 65 73 20 74 68 65 20 77  ** changes the w
28240 61 79 20 64 61 74 61 62 61 73 65 20 61 63 63 65  ay database acce
28250 73 73 20 69 73 20 63 6f 6e 74 72 6f 6c 6c 65 64  ss is controlled
28260 20 62 79 20 6c 69 6d 69 74 69 6e 67 20 61 63 63   by limiting acc
28270 65 73 73 20 74 6f 20 61 0a 2a 2a 20 73 69 6e 67  ess to a.** sing
28280 6c 65 20 68 6f 73 74 20 61 74 20 61 20 74 69 6d  le host at a tim
28290 65 20 61 6e 64 20 6d 6f 76 69 6e 67 20 66 69 6c  e and moving fil
282a0 65 20 6c 6f 63 6b 73 20 6f 66 66 20 6f 66 20 74  e locks off of t
282b0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
282c0 0a 2a 2a 20 61 6e 64 20 6f 6e 74 6f 20 61 20 70  .** and onto a p
282d0 72 6f 78 79 20 66 69 6c 65 20 6f 6e 20 74 68 65  roxy file on the
282e0 20 6c 6f 63 61 6c 20 66 69 6c 65 20 73 79 73 74   local file syst
282f0 65 6d 2e 20 20 0a 2a 2a 0a 2a 2a 0a 2a 2a 20 55  em.  .**.**.** U
28300 73 69 6e 67 20 70 72 6f 78 79 20 6c 6f 63 6b 73  sing proxy locks
28310 0a 2a 2a 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  .** ------------
28320 2d 2d 2d 2d 2d 0a 2a 2a 0a 2a 2a 20 43 20 41 50  -----.**.** C AP
28330 49 73 0a 2a 2a 0a 2a 2a 20 20 73 71 6c 69 74 65  Is.**.**  sqlite
28340 33 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 28 64  3_file_control(d
28350 62 2c 20 64 62 6e 61 6d 65 2c 20 53 51 4c 49 54  b, dbname, SQLIT
28360 45 5f 53 45 54 5f 4c 4f 43 4b 50 52 4f 58 59 46  E_SET_LOCKPROXYF
28370 49 4c 45 2c 0a 2a 2a 20 20 20 20 20 20 20 20 20  ILE,.**         
28380 20 20 20 20 20 20 20 20 20 20 20 20 20 20 3c 70                <p
28390 72 6f 78 79 5f 70 61 74 68 3e 20 7c 20 22 3a 61  roxy_path> | ":a
283a0 75 74 6f 3a 22 29 3b 0a 2a 2a 20 20 73 71 6c 69  uto:");.**  sqli
283b0 74 65 33 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c  te3_file_control
283c0 28 64 62 2c 20 64 62 6e 61 6d 65 2c 20 53 51 4c  (db, dbname, SQL
283d0 49 54 45 5f 47 45 54 5f 4c 4f 43 4b 50 52 4f 58  ITE_GET_LOCKPROX
283e0 59 46 49 4c 45 2c 20 26 3c 70 72 6f 78 79 5f 70  YFILE, &<proxy_p
283f0 61 74 68 3e 29 3b 0a 2a 2a 0a 2a 2a 0a 2a 2a 20  ath>);.**.**.** 
28400 53 51 4c 20 70 72 61 67 6d 61 73 0a 2a 2a 0a 2a  SQL pragmas.**.*
28410 2a 20 20 50 52 41 47 4d 41 20 5b 64 61 74 61 62  *  PRAGMA [datab
28420 61 73 65 2e 5d 6c 6f 63 6b 5f 70 72 6f 78 79 5f  ase.]lock_proxy_
28430 66 69 6c 65 3d 3c 70 72 6f 78 79 5f 70 61 74 68  file=<proxy_path
28440 3e 20 7c 20 3a 61 75 74 6f 3a 0a 2a 2a 20 20 50  > | :auto:.**  P
28450 52 41 47 4d 41 20 5b 64 61 74 61 62 61 73 65 2e  RAGMA [database.
28460 5d 6c 6f 63 6b 5f 70 72 6f 78 79 5f 66 69 6c 65  ]lock_proxy_file
28470 0a 2a 2a 0a 2a 2a 20 53 70 65 63 69 66 79 69 6e  .**.** Specifyin
28480 67 20 22 3a 61 75 74 6f 3a 22 20 6d 65 61 6e 73  g ":auto:" means
28490 20 74 68 61 74 20 69 66 20 74 68 65 72 65 20 69   that if there i
284a0 73 20 61 20 63 6f 6e 63 68 20 66 69 6c 65 20 77  s a conch file w
284b0 69 74 68 20 61 20 6d 61 74 63 68 69 6e 67 0a 2a  ith a matching.*
284c0 2a 20 68 6f 73 74 20 49 44 20 69 6e 20 69 74 2c  * host ID in it,
284d0 20 74 68 65 20 70 72 6f 78 79 20 70 61 74 68 20   the proxy path 
284e0 69 6e 20 74 68 65 20 63 6f 6e 63 68 20 66 69 6c  in the conch fil
284f0 65 20 77 69 6c 6c 20 62 65 20 75 73 65 64 2c 20  e will be used, 
28500 6f 74 68 65 72 77 69 73 65 0a 2a 2a 20 61 20 70  otherwise.** a p
28510 72 6f 78 79 20 70 61 74 68 20 62 61 73 65 64 20  roxy path based 
28520 6f 6e 20 74 68 65 20 75 73 65 72 27 73 20 74 65  on the user's te
28530 6d 70 20 64 69 72 0a 2a 2a 20 28 76 69 61 20 63  mp dir.** (via c
28540 6f 6e 66 73 74 72 28 5f 43 53 5f 44 41 52 57 49  onfstr(_CS_DARWI
28550 4e 5f 55 53 45 52 5f 54 45 4d 50 5f 44 49 52 2c  N_USER_TEMP_DIR,
28560 2e 2e 2e 29 29 20 77 69 6c 6c 20 62 65 20 75 73  ...)) will be us
28570 65 64 20 61 6e 64 20 74 68 65 0a 2a 2a 20 61 63  ed and the.** ac
28580 74 75 61 6c 20 70 72 6f 78 79 20 66 69 6c 65 20  tual proxy file 
28590 6e 61 6d 65 20 69 73 20 67 65 6e 65 72 61 74 65  name is generate
285a0 64 20 66 72 6f 6d 20 74 68 65 20 6e 61 6d 65 20  d from the name 
285b0 61 6e 64 20 70 61 74 68 20 6f 66 20 74 68 65 0a  and path of the.
285c0 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  ** database file
285d0 2e 20 20 46 6f 72 20 65 78 61 6d 70 6c 65 3a 0a  .  For example:.
285e0 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 46 6f 72 20  **.**       For 
285f0 64 61 74 61 62 61 73 65 20 70 61 74 68 20 22 2f  database path "/
28600 55 73 65 72 73 2f 6d 65 2f 66 6f 6f 2e 64 62 22  Users/me/foo.db"
28610 20 0a 2a 2a 20 20 20 20 20 20 20 54 68 65 20 6c   .**       The l
28620 6f 63 6b 20 70 61 74 68 20 77 69 6c 6c 20 62 65  ock path will be
28630 20 22 3c 74 6d 70 64 69 72 3e 2f 73 71 6c 69 74   "<tmpdir>/sqlit
28640 65 70 6c 6f 63 6b 73 2f 5f 55 73 65 72 73 5f 6d  eplocks/_Users_m
28650 65 5f 66 6f 6f 2e 64 62 3a 61 75 74 6f 3a 22 29  e_foo.db:auto:")
28660 0a 2a 2a 0a 2a 2a 20 4f 6e 63 65 20 61 20 6c 6f  .**.** Once a lo
28670 63 6b 20 70 72 6f 78 79 20 69 73 20 63 6f 6e 66  ck proxy is conf
28680 69 67 75 72 65 64 20 66 6f 72 20 61 20 64 61 74  igured for a dat
28690 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
286a0 2c 20 69 74 20 63 61 6e 20 6e 6f 74 0a 2a 2a 20  , it can not.** 
286b0 62 65 20 72 65 6d 6f 76 65 64 2c 20 68 6f 77 65  be removed, howe
286c0 76 65 72 20 69 74 20 6d 61 79 20 62 65 20 73 77  ver it may be sw
286d0 69 74 63 68 65 64 20 74 6f 20 61 20 64 69 66 66  itched to a diff
286e0 65 72 65 6e 74 20 70 72 6f 78 79 20 70 61 74 68  erent proxy path
286f0 20 76 69 61 0a 2a 2a 20 74 68 65 20 61 62 6f 76   via.** the abov
28700 65 20 41 50 49 73 20 28 61 73 73 75 6d 69 6e 67  e APIs (assuming
28710 20 74 68 65 20 63 6f 6e 63 68 20 66 69 6c 65 20   the conch file 
28720 69 73 20 6e 6f 74 20 62 65 69 6e 67 20 68 65 6c  is not being hel
28730 64 20 62 79 20 61 6e 6f 74 68 65 72 0a 2a 2a 20  d by another.** 
28740 63 6f 6e 6e 65 63 74 69 6f 6e 20 6f 72 20 70 72  connection or pr
28750 6f 63 65 73 73 29 2e 20 0a 2a 2a 0a 2a 2a 0a 2a  ocess). .**.**.*
28760 2a 20 48 6f 77 20 70 72 6f 78 79 20 6c 6f 63 6b  * How proxy lock
28770 69 6e 67 20 77 6f 72 6b 73 0a 2a 2a 20 2d 2d 2d  ing works.** ---
28780 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
28790 2d 2d 2d 2d 0a 2a 2a 0a 2a 2a 20 50 72 6f 78 79  ----.**.** Proxy
287a0 20 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 20 72 65   file locking re
287b0 6c 69 65 73 20 70 72 69 6d 61 72 69 6c 79 20 6f  lies primarily o
287c0 6e 20 74 77 6f 20 6e 65 77 20 73 75 70 70 6f 72  n two new suppor
287d0 74 69 6e 67 20 66 69 6c 65 73 3a 20 0a 2a 2a 0a  ting files: .**.
287e0 2a 2a 20 20 20 2a 20 20 63 6f 6e 63 68 20 66 69  **   *  conch fi
287f0 6c 65 20 74 6f 20 6c 69 6d 69 74 20 61 63 63 65  le to limit acce
28800 73 73 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  ss to the databa
28810 73 65 20 66 69 6c 65 20 74 6f 20 61 20 73 69 6e  se file to a sin
28820 67 6c 65 20 68 6f 73 74 0a 2a 2a 20 20 20 20 20  gle host.**     
28830 20 61 74 20 61 20 74 69 6d 65 0a 2a 2a 0a 2a 2a   at a time.**.**
28840 20 20 20 2a 20 20 70 72 6f 78 79 20 66 69 6c 65     *  proxy file
28850 20 74 6f 20 61 63 74 20 61 73 20 61 20 70 72 6f   to act as a pro
28860 78 79 20 66 6f 72 20 74 68 65 20 61 64 76 69 73  xy for the advis
28870 6f 72 79 20 6c 6f 63 6b 73 20 6e 6f 72 6d 61 6c  ory locks normal
28880 6c 79 0a 2a 2a 20 20 20 20 20 20 74 61 6b 65 6e  ly.**      taken
28890 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
288a0 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f 6e 63 68  .**.** The conch
288b0 20 66 69 6c 65 20 2d 20 74 6f 20 75 73 65 20 61   file - to use a
288c0 20 70 72 6f 78 79 20 66 69 6c 65 2c 20 73 71 6c   proxy file, sql
288d0 69 74 65 20 6d 75 73 74 20 66 69 72 73 74 20 22  ite must first "
288e0 68 6f 6c 64 20 74 68 65 20 63 6f 6e 63 68 22 0a  hold the conch".
288f0 2a 2a 20 62 79 20 74 61 6b 69 6e 67 20 61 6e 20  ** by taking an 
28900 73 71 6c 69 74 65 2d 73 74 79 6c 65 20 73 68 61  sqlite-style sha
28910 72 65 64 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  red lock on the 
28920 63 6f 6e 63 68 20 66 69 6c 65 2c 20 72 65 61 64  conch file, read
28930 69 6e 67 20 74 68 65 0a 2a 2a 20 63 6f 6e 74 65  ing the.** conte
28940 6e 74 73 20 61 6e 64 20 63 6f 6d 70 61 72 69 6e  nts and comparin
28950 67 20 74 68 65 20 68 6f 73 74 27 73 20 75 6e 69  g the host's uni
28960 71 75 65 20 68 6f 73 74 20 49 44 20 28 73 65 65  que host ID (see
28970 20 62 65 6c 6f 77 29 20 61 6e 64 20 6c 6f 63 6b   below) and lock
28980 0a 2a 2a 20 70 72 6f 78 79 20 70 61 74 68 20 61  .** proxy path a
28990 67 61 69 6e 73 74 20 74 68 65 20 76 61 6c 75 65  gainst the value
289a0 73 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20  s stored in the 
289b0 63 6f 6e 63 68 2e 20 20 54 68 65 20 63 6f 6e 63  conch.  The conc
289c0 68 20 66 69 6c 65 20 69 73 0a 2a 2a 20 73 74 6f  h file is.** sto
289d0 72 65 64 20 69 6e 20 74 68 65 20 73 61 6d 65 20  red in the same 
289e0 64 69 72 65 63 74 6f 72 79 20 61 73 20 74 68 65  directory as the
289f0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 61   database file a
28a00 6e 64 20 74 68 65 20 66 69 6c 65 20 6e 61 6d 65  nd the file name
28a10 0a 2a 2a 20 69 73 20 70 61 74 74 65 72 6e 65 64  .** is patterned
28a20 20 61 66 74 65 72 20 74 68 65 20 64 61 74 61 62   after the datab
28a30 61 73 65 20 66 69 6c 65 20 6e 61 6d 65 20 61 73  ase file name as
28a40 20 22 2e 3c 64 61 74 61 62 61 73 65 6e 61 6d 65   ".<databasename
28a50 3e 2d 63 6f 6e 63 68 22 2e 0a 2a 2a 20 49 66 20  >-conch"..** If 
28a60 74 68 65 20 63 6f 6e 63 68 20 66 69 6c 65 20 64  the conch file d
28a70 6f 65 73 20 6e 6f 74 20 65 78 69 73 74 2c 20 6f  oes not exist, o
28a80 72 20 69 74 27 73 20 63 6f 6e 74 65 6e 74 73 20  r it's contents 
28a90 64 6f 20 6e 6f 74 20 6d 61 74 63 68 20 74 68 65  do not match the
28aa0 0a 2a 2a 20 68 6f 73 74 20 49 44 20 61 6e 64 2f  .** host ID and/
28ab0 6f 72 20 70 72 6f 78 79 20 70 61 74 68 2c 20 74  or proxy path, t
28ac0 68 65 6e 20 74 68 65 20 6c 6f 63 6b 20 69 73 20  hen the lock is 
28ad0 65 73 63 61 6c 61 74 65 64 20 74 6f 20 61 6e 20  escalated to an 
28ae0 65 78 63 6c 75 73 69 76 65 0a 2a 2a 20 6c 6f 63  exclusive.** loc
28af0 6b 20 61 6e 64 20 74 68 65 20 63 6f 6e 63 68 20  k and the conch 
28b00 66 69 6c 65 20 63 6f 6e 74 65 6e 74 73 20 69 73  file contents is
28b10 20 75 70 64 61 74 65 64 20 77 69 74 68 20 74 68   updated with th
28b20 65 20 68 6f 73 74 20 49 44 20 61 6e 64 20 70 72  e host ID and pr
28b30 6f 78 79 0a 2a 2a 20 70 61 74 68 20 61 6e 64 20  oxy.** path and 
28b40 74 68 65 20 6c 6f 63 6b 20 69 73 20 64 6f 77 6e  the lock is down
28b50 67 72 61 64 65 64 20 74 6f 20 61 20 73 68 61 72  graded to a shar
28b60 65 64 20 6c 6f 63 6b 20 61 67 61 69 6e 2e 20 20  ed lock again.  
28b70 49 66 20 74 68 65 20 63 6f 6e 63 68 0a 2a 2a 20  If the conch.** 
28b80 69 73 20 68 65 6c 64 20 62 79 20 61 6e 6f 74 68  is held by anoth
28b90 65 72 20 70 72 6f 63 65 73 73 20 28 77 69 74 68  er process (with
28ba0 20 61 20 73 68 61 72 65 64 20 6c 6f 63 6b 29 2c   a shared lock),
28bb0 20 74 68 65 20 65 78 63 6c 75 73 69 76 65 20 6c   the exclusive l
28bc0 6f 63 6b 0a 2a 2a 20 77 69 6c 6c 20 66 61 69 6c  ock.** will fail
28bd0 20 61 6e 64 20 53 51 4c 49 54 45 5f 42 55 53 59   and SQLITE_BUSY
28be0 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a   is returned..**
28bf0 0a 2a 2a 20 54 68 65 20 70 72 6f 78 79 20 66 69  .** The proxy fi
28c00 6c 65 20 2d 20 61 20 73 69 6e 67 6c 65 2d 62 79  le - a single-by
28c10 74 65 20 66 69 6c 65 20 75 73 65 64 20 66 6f 72  te file used for
28c20 20 61 6c 6c 20 61 64 76 69 73 6f 72 79 20 66 69   all advisory fi
28c30 6c 65 20 6c 6f 63 6b 73 0a 2a 2a 20 6e 6f 72 6d  le locks.** norm
28c40 61 6c 6c 79 20 74 61 6b 65 6e 20 6f 6e 20 74 68  ally taken on th
28c50 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
28c60 20 20 20 54 68 69 73 20 61 6c 6c 6f 77 73 20 66     This allows f
28c70 6f 72 20 73 61 66 65 20 73 68 61 72 69 6e 67 0a  or safe sharing.
28c80 2a 2a 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  ** of the databa
28c90 73 65 20 66 69 6c 65 20 66 6f 72 20 6d 75 6c 74  se file for mult
28ca0 69 70 6c 65 20 72 65 61 64 65 72 73 20 61 6e 64  iple readers and
28cb0 20 77 72 69 74 65 72 73 20 6f 6e 20 74 68 65 20   writers on the 
28cc0 73 61 6d 65 0a 2a 2a 20 68 6f 73 74 20 28 74 68  same.** host (th
28cd0 65 20 63 6f 6e 63 68 20 65 6e 73 75 72 65 73 20  e conch ensures 
28ce0 74 68 61 74 20 74 68 65 79 20 61 6c 6c 20 75 73  that they all us
28cf0 65 20 74 68 65 20 73 61 6d 65 20 6c 6f 63 61 6c  e the same local
28d00 20 6c 6f 63 6b 20 66 69 6c 65 29 2e 0a 2a 2a 0a   lock file)..**.
28d10 2a 2a 20 52 65 71 75 65 73 74 69 6e 67 20 74 68  ** Requesting th
28d20 65 20 6c 6f 63 6b 20 70 72 6f 78 79 20 64 6f 65  e lock proxy doe
28d30 73 20 6e 6f 74 20 69 6d 6d 65 64 69 61 74 65 6c  s not immediatel
28d40 79 20 74 61 6b 65 20 74 68 65 20 63 6f 6e 63 68  y take the conch
28d50 2c 20 69 74 20 69 73 0a 2a 2a 20 6f 6e 6c 79 20  , it is.** only 
28d60 74 61 6b 65 6e 20 77 68 65 6e 20 74 68 65 20 66  taken when the f
28d70 69 72 73 74 20 72 65 71 75 65 73 74 20 74 6f 20  irst request to 
28d80 6c 6f 63 6b 20 64 61 74 61 62 61 73 65 20 66 69  lock database fi
28d90 6c 65 20 69 73 20 6d 61 64 65 2e 20 20 0a 2a 2a  le is made.  .**
28da0 20 54 68 69 73 20 6d 61 74 63 68 65 73 20 74 68   This matches th
28db0 65 20 73 65 6d 61 6e 74 69 63 73 20 6f 66 20 74  e semantics of t
28dc0 68 65 20 74 72 61 64 69 74 69 6f 6e 61 6c 20 6c  he traditional l
28dd0 6f 63 6b 69 6e 67 20 62 65 68 61 76 69 6f 72 2c  ocking behavior,
28de0 20 77 68 65 72 65 0a 2a 2a 20 6f 70 65 6e 69 6e   where.** openin
28df0 67 20 61 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74  g a connection t
28e00 6f 20 61 20 64 61 74 61 62 61 73 65 20 66 69 6c  o a database fil
28e10 65 20 64 6f 65 73 20 6e 6f 74 20 74 61 6b 65 20  e does not take 
28e20 61 20 6c 6f 63 6b 20 6f 6e 20 69 74 2e 0a 2a 2a  a lock on it..**
28e30 20 54 68 65 20 73 68 61 72 65 64 20 6c 6f 63 6b   The shared lock
28e40 20 61 6e 64 20 61 6e 20 6f 70 65 6e 20 66 69 6c   and an open fil
28e50 65 20 64 65 73 63 72 69 70 74 6f 72 20 61 72 65  e descriptor are
28e60 20 6d 61 69 6e 74 61 69 6e 65 64 20 75 6e 74 69   maintained unti
28e70 6c 20 0a 2a 2a 20 74 68 65 20 63 6f 6e 6e 65 63  l .** the connec
28e80 74 69 6f 6e 20 74 6f 20 74 68 65 20 64 61 74 61  tion to the data
28e90 62 61 73 65 20 69 73 20 63 6c 6f 73 65 64 2e 20  base is closed. 
28ea0 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 72 6f 78 79  .**.** The proxy
28eb0 20 66 69 6c 65 20 61 6e 64 20 74 68 65 20 6c 6f   file and the lo
28ec0 63 6b 20 66 69 6c 65 20 61 72 65 20 6e 65 76 65  ck file are neve
28ed0 72 20 64 65 6c 65 74 65 64 20 73 6f 20 74 68 65  r deleted so the
28ee0 79 20 6f 6e 6c 79 20 6e 65 65 64 0a 2a 2a 20 74  y only need.** t
28ef0 6f 20 62 65 20 63 72 65 61 74 65 64 20 74 68 65  o be created the
28f00 20 66 69 72 73 74 20 74 69 6d 65 20 74 68 65 79   first time they
28f10 20 61 72 65 20 75 73 65 64 2e 0a 2a 2a 0a 2a 2a   are used..**.**
28f20 20 43 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 6f   Configuration o
28f30 70 74 69 6f 6e 73 0a 2a 2a 20 2d 2d 2d 2d 2d 2d  ptions.** ------
28f40 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
28f50 2a 2a 0a 2a 2a 20 20 53 51 4c 49 54 45 5f 50 52  **.**  SQLITE_PR
28f60 45 46 45 52 5f 50 52 4f 58 59 5f 4c 4f 43 4b 49  EFER_PROXY_LOCKI
28f70 4e 47 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 44  NG.**.**       D
28f80 61 74 61 62 61 73 65 20 66 69 6c 65 73 20 61 63  atabase files ac
28f90 63 65 73 73 65 64 20 6f 6e 20 6e 6f 6e 2d 6c 6f  cessed on non-lo
28fa0 63 61 6c 20 66 69 6c 65 20 73 79 73 74 65 6d 73  cal file systems
28fb0 20 61 72 65 0a 2a 2a 20 20 20 20 20 20 20 61 75   are.**       au
28fc0 74 6f 6d 61 74 69 63 61 6c 6c 79 20 63 6f 6e 66  tomatically conf
28fd0 69 67 75 72 65 64 20 66 6f 72 20 70 72 6f 78 79  igured for proxy
28fe0 20 6c 6f 63 6b 69 6e 67 2c 20 6c 6f 63 6b 20 66   locking, lock f
28ff0 69 6c 65 73 20 61 72 65 0a 2a 2a 20 20 20 20 20  iles are.**     
29000 20 20 6e 61 6d 65 64 20 61 75 74 6f 6d 61 74 69    named automati
29010 63 61 6c 6c 79 20 75 73 69 6e 67 20 74 68 65 20  cally using the 
29020 73 61 6d 65 20 6c 6f 67 69 63 20 61 73 0a 2a 2a  same logic as.**
29030 20 20 20 20 20 20 20 50 52 41 47 4d 41 20 6c 6f         PRAGMA lo
29040 63 6b 5f 70 72 6f 78 79 5f 66 69 6c 65 3d 22 3a  ck_proxy_file=":
29050 61 75 74 6f 3a 22 0a 2a 2a 20 20 20 20 0a 2a 2a  auto:".**    .**
29060 20 20 53 51 4c 49 54 45 5f 50 52 4f 58 59 5f 44    SQLITE_PROXY_D
29070 45 42 55 47 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20  EBUG.**.**      
29080 20 45 6e 61 62 6c 65 73 20 74 68 65 20 6c 6f 67   Enables the log
29090 67 69 6e 67 20 6f 66 20 65 72 72 6f 72 20 6d 65  ging of error me
290a0 73 73 61 67 65 73 20 64 75 72 69 6e 67 20 68 6f  ssages during ho
290b0 73 74 20 69 64 20 66 69 6c 65 0a 2a 2a 20 20 20  st id file.**   
290c0 20 20 20 20 72 65 74 72 69 65 76 61 6c 20 61 6e      retrieval an
290d0 64 20 63 72 65 61 74 69 6f 6e 0a 2a 2a 0a 2a 2a  d creation.**.**
290e0 20 20 4c 4f 43 4b 50 52 4f 58 59 44 49 52 0a 2a    LOCKPROXYDIR.*
290f0 2a 0a 2a 2a 20 20 20 20 20 20 20 4f 76 65 72 72  *.**       Overr
29100 69 64 65 73 20 74 68 65 20 64 65 66 61 75 6c 74  ides the default
29110 20 64 69 72 65 63 74 6f 72 79 20 75 73 65 64 20   directory used 
29120 66 6f 72 20 6c 6f 63 6b 20 70 72 6f 78 79 20 66  for lock proxy f
29130 69 6c 65 73 20 74 68 61 74 0a 2a 2a 20 20 20 20  iles that.**    
29140 20 20 20 61 72 65 20 6e 61 6d 65 64 20 61 75 74     are named aut
29150 6f 6d 61 74 69 63 61 6c 6c 79 20 76 69 61 20 74  omatically via t
29160 68 65 20 22 3a 61 75 74 6f 3a 22 20 73 65 74 74  he ":auto:" sett
29170 69 6e 67 0a 2a 2a 0a 2a 2a 20 20 53 51 4c 49 54  ing.**.**  SQLIT
29180 45 5f 44 45 46 41 55 4c 54 5f 50 52 4f 58 59 44  E_DEFAULT_PROXYD
29190 49 52 5f 50 45 52 4d 49 53 53 49 4f 4e 53 0a 2a  IR_PERMISSIONS.*
291a0 2a 0a 2a 2a 20 20 20 20 20 20 20 50 65 72 6d 69  *.**       Permi
291b0 73 73 69 6f 6e 73 20 74 6f 20 75 73 65 20 77 68  ssions to use wh
291c0 65 6e 20 63 72 65 61 74 69 6e 67 20 61 20 64 69  en creating a di
291d0 72 65 63 74 6f 72 79 20 66 6f 72 20 73 74 6f 72  rectory for stor
291e0 69 6e 67 20 74 68 65 0a 2a 2a 20 20 20 20 20 20  ing the.**      
291f0 20 6c 6f 63 6b 20 70 72 6f 78 79 20 66 69 6c 65   lock proxy file
29200 73 2c 20 6f 6e 6c 79 20 75 73 65 64 20 77 68 65  s, only used whe
29210 6e 20 4c 4f 43 4b 50 52 4f 58 59 44 49 52 20 69  n LOCKPROXYDIR i
29220 73 20 6e 6f 74 20 73 65 74 2e 0a 2a 2a 20 20 20  s not set..**   
29230 20 0a 2a 2a 20 20 20 20 0a 2a 2a 20 41 73 20 6d   .**    .** As m
29240 65 6e 74 69 6f 6e 65 64 20 61 62 6f 76 65 2c 20  entioned above, 
29250 77 68 65 6e 20 63 6f 6d 70 69 6c 65 64 20 77 69  when compiled wi
29260 74 68 20 53 51 4c 49 54 45 5f 50 52 45 46 45 52  th SQLITE_PREFER
29270 5f 50 52 4f 58 59 5f 4c 4f 43 4b 49 4e 47 2c 0a  _PROXY_LOCKING,.
29280 2a 2a 20 73 65 74 74 69 6e 67 20 74 68 65 20 65  ** setting the e
29290 6e 76 69 72 6f 6e 6d 65 6e 74 20 76 61 72 69 61  nvironment varia
292a0 62 6c 65 20 53 51 4c 49 54 45 5f 46 4f 52 43 45  ble SQLITE_FORCE
292b0 5f 50 52 4f 58 59 5f 4c 4f 43 4b 49 4e 47 20 74  _PROXY_LOCKING t
292c0 6f 20 31 20 77 69 6c 6c 0a 2a 2a 20 66 6f 72 63  o 1 will.** forc
292d0 65 20 70 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 20  e proxy locking 
292e0 74 6f 20 62 65 20 75 73 65 64 20 66 6f 72 20 65  to be used for e
292f0 76 65 72 79 20 64 61 74 61 62 61 73 65 20 66 69  very database fi
29300 6c 65 20 6f 70 65 6e 65 64 2c 20 61 6e 64 20 30  le opened, and 0
29310 0a 2a 2a 20 77 69 6c 6c 20 66 6f 72 63 65 20 61  .** will force a
29320 75 74 6f 6d 61 74 69 63 20 70 72 6f 78 79 20 6c  utomatic proxy l
29330 6f 63 6b 69 6e 67 20 74 6f 20 62 65 20 64 69 73  ocking to be dis
29340 61 62 6c 65 64 20 66 6f 72 20 61 6c 6c 20 64 61  abled for all da
29350 74 61 62 61 73 65 0a 2a 2a 20 66 69 6c 65 73 20  tabase.** files 
29360 28 65 78 70 6c 69 63 69 74 79 20 63 61 6c 6c 69  (explicity calli
29370 6e 67 20 74 68 65 20 53 51 4c 49 54 45 5f 53 45  ng the SQLITE_SE
29380 54 5f 4c 4f 43 4b 50 52 4f 58 59 46 49 4c 45 20  T_LOCKPROXYFILE 
29390 70 72 61 67 6d 61 20 6f 72 0a 2a 2a 20 73 71 6c  pragma or.** sql
293a0 69 74 65 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c  ite_file_control
293b0 20 41 50 49 20 69 73 20 6e 6f 74 20 61 66 66 65   API is not affe
293c0 63 74 65 64 20 62 79 20 53 51 4c 49 54 45 5f 46  cted by SQLITE_F
293d0 4f 52 43 45 5f 50 52 4f 58 59 5f 4c 4f 43 4b 49  ORCE_PROXY_LOCKI
293e0 4e 47 29 2e 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 50  NG)..*/../*.** P
293f0 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 20 69 73 20  roxy locking is 
29400 6f 6e 6c 79 20 61 76 61 69 6c 61 62 6c 65 20 6f  only available o
29410 6e 20 4d 61 63 4f 53 58 20 0a 2a 2f 0a 23 69 66  n MacOSX .*/.#if
29420 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45   defined(__APPLE
29430 5f 5f 29 20 26 26 20 53 51 4c 49 54 45 5f 45 4e  __) && SQLITE_EN
29440 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59  ABLE_LOCKING_STY
29450 4c 45 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 70 72  LE../*.** The pr
29460 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78  oxyLockingContex
29470 74 20 68 61 73 20 74 68 65 20 70 61 74 68 20 61  t has the path a
29480 6e 64 20 66 69 6c 65 20 73 74 72 75 63 74 75 72  nd file structur
29490 65 73 20 66 6f 72 20 74 68 65 20 72 65 6d 6f 74  es for the remot
294a0 65 20 0a 2a 2a 20 61 6e 64 20 6c 6f 63 61 6c 20  e .** and local 
294b0 70 72 6f 78 79 20 66 69 6c 65 73 20 69 6e 20 69  proxy files in i
294c0 74 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72  t.*/.typedef str
294d0 75 63 74 20 70 72 6f 78 79 4c 6f 63 6b 69 6e 67  uct proxyLocking
294e0 43 6f 6e 74 65 78 74 20 70 72 6f 78 79 4c 6f 63  Context proxyLoc
294f0 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 0a 73 74 72  kingContext;.str
29500 75 63 74 20 70 72 6f 78 79 4c 6f 63 6b 69 6e 67  uct proxyLocking
29510 43 6f 6e 74 65 78 74 20 7b 0a 20 20 75 6e 69 78  Context {.  unix
29520 46 69 6c 65 20 2a 63 6f 6e 63 68 46 69 6c 65 3b  File *conchFile;
29530 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 70 65 6e           /* Open
29540 20 63 6f 6e 63 68 20 66 69 6c 65 20 2a 2f 0a 20   conch file */. 
29550 20 63 68 61 72 20 2a 63 6f 6e 63 68 46 69 6c 65   char *conchFile
29560 50 61 74 68 3b 20 20 20 20 20 20 20 20 20 2f 2a  Path;         /*
29570 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 63 6f 6e   Name of the con
29580 63 68 20 66 69 6c 65 20 2a 2f 0a 20 20 75 6e 69  ch file */.  uni
29590 78 46 69 6c 65 20 2a 6c 6f 63 6b 50 72 6f 78 79  xFile *lockProxy
295a0 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 70 65  ;         /* Ope
295b0 6e 20 70 72 6f 78 79 20 6c 6f 63 6b 20 66 69 6c  n proxy lock fil
295c0 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 6c 6f 63  e */.  char *loc
295d0 6b 50 72 6f 78 79 50 61 74 68 3b 20 20 20 20 20  kProxyPath;     
295e0 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74      /* Name of t
295f0 68 65 20 70 72 6f 78 79 20 6c 6f 63 6b 20 66 69  he proxy lock fi
29600 6c 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 64 62  le */.  char *db
29610 50 61 74 68 3b 20 20 20 20 20 20 20 20 20 20 20  Path;           
29620 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20       /* Name of 
29630 74 68 65 20 6f 70 65 6e 20 66 69 6c 65 20 2a 2f  the open file */
29640 0a 20 20 69 6e 74 20 63 6f 6e 63 68 48 65 6c 64  .  int conchHeld
29650 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
29660 2f 2a 20 31 20 69 66 20 74 68 65 20 63 6f 6e 63  /* 1 if the conc
29670 68 20 69 73 20 68 65 6c 64 2c 20 2d 31 20 69 66  h is held, -1 if
29680 20 6c 6f 63 6b 6c 65 73 73 20 2a 2f 0a 20 20 76   lockless */.  v
29690 6f 69 64 20 2a 6f 6c 64 4c 6f 63 6b 69 6e 67 43  oid *oldLockingC
296a0 6f 6e 74 65 78 74 3b 20 20 20 20 20 2f 2a 20 4f  ontext;     /* O
296b0 72 69 67 69 6e 61 6c 20 6c 6f 63 6b 69 6e 67 63  riginal lockingc
296c0 6f 6e 74 65 78 74 20 74 6f 20 72 65 73 74 6f 72  ontext to restor
296d0 65 20 6f 6e 20 63 6c 6f 73 65 20 2a 2f 0a 20 20  e on close */.  
296e0 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f  sqlite3_io_metho
296f0 64 73 20 63 6f 6e 73 74 20 2a 70 4f 6c 64 4d 65  ds const *pOldMe
29700 74 68 6f 64 3b 20 20 20 20 20 2f 2a 20 4f 72 69  thod;     /* Ori
29710 67 69 6e 61 6c 20 49 2f 4f 20 6d 65 74 68 6f 64  ginal I/O method
29720 73 20 66 6f 72 20 63 6c 6f 73 65 20 2a 2f 0a 7d  s for close */.}
29730 3b 0a 0a 2f 2a 20 0a 2a 2a 20 54 68 65 20 70 72  ;../* .** The pr
29740 6f 78 79 20 6c 6f 63 6b 20 66 69 6c 65 20 70 61  oxy lock file pa
29750 74 68 20 66 6f 72 20 74 68 65 20 64 61 74 61 62  th for the datab
29760 61 73 65 20 61 74 20 64 62 50 61 74 68 20 69 73  ase at dbPath is
29770 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 6c 50   written into lP
29780 61 74 68 2c 20 0a 2a 2a 20 77 68 69 63 68 20 6d  ath, .** which m
29790 75 73 74 20 70 6f 69 6e 74 20 74 6f 20 76 61 6c  ust point to val
297a0 69 64 2c 20 77 72 69 74 61 62 6c 65 20 6d 65 6d  id, writable mem
297b0 6f 72 79 20 6c 61 72 67 65 20 65 6e 6f 75 67 68  ory large enough
297c0 20 66 6f 72 20 61 20 6d 61 78 4c 65 6e 20 6c 65   for a maxLen le
297d0 6e 67 74 68 0a 2a 2a 20 66 69 6c 65 20 70 61 74  ngth.** file pat
297e0 68 2e 20 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  h. .*/.static in
297f0 74 20 70 72 6f 78 79 47 65 74 4c 6f 63 6b 50 61  t proxyGetLockPa
29800 74 68 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 64  th(const char *d
29810 62 50 61 74 68 2c 20 63 68 61 72 20 2a 6c 50 61  bPath, char *lPa
29820 74 68 2c 20 73 69 7a 65 5f 74 20 6d 61 78 4c 65  th, size_t maxLe
29830 6e 29 7b 0a 20 20 69 6e 74 20 6c 65 6e 3b 0a 20  n){.  int len;. 
29840 20 69 6e 74 20 64 62 4c 65 6e 3b 0a 20 20 69 6e   int dbLen;.  in
29850 74 20 69 3b 0a 0a 23 69 66 64 65 66 20 4c 4f 43  t i;..#ifdef LOC
29860 4b 50 52 4f 58 59 44 49 52 0a 20 20 6c 65 6e 20  KPROXYDIR.  len 
29870 3d 20 73 74 72 6c 63 70 79 28 6c 50 61 74 68 2c  = strlcpy(lPath,
29880 20 4c 4f 43 4b 50 52 4f 58 59 44 49 52 2c 20 6d   LOCKPROXYDIR, m
29890 61 78 4c 65 6e 29 3b 0a 23 65 6c 73 65 0a 23 20  axLen);.#else.# 
298a0 69 66 64 65 66 20 5f 43 53 5f 44 41 52 57 49 4e  ifdef _CS_DARWIN
298b0 5f 55 53 45 52 5f 54 45 4d 50 5f 44 49 52 0a 20  _USER_TEMP_DIR. 
298c0 20 7b 0a 20 20 20 20 69 66 28 20 21 63 6f 6e 66   {.    if( !conf
298d0 73 74 72 28 5f 43 53 5f 44 41 52 57 49 4e 5f 55  str(_CS_DARWIN_U
298e0 53 45 52 5f 54 45 4d 50 5f 44 49 52 2c 20 6c 50  SER_TEMP_DIR, lP
298f0 61 74 68 2c 20 6d 61 78 4c 65 6e 29 20 29 7b 0a  ath, maxLen) ){.
29900 20 20 20 20 20 20 4f 53 54 52 41 43 45 28 28 22        OSTRACE(("
29910 47 45 54 4c 4f 43 4b 50 41 54 48 20 20 66 61 69  GETLOCKPATH  fai
29920 6c 65 64 20 25 73 20 65 72 72 6e 6f 3d 25 64 20  led %s errno=%d 
29930 70 69 64 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20  pid=%d\n",.     
29940 20 20 20 20 20 20 20 20 20 20 6c 50 61 74 68 2c            lPath,
29950 20 65 72 72 6e 6f 2c 20 67 65 74 70 69 64 28 29   errno, getpid()
29960 29 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  ));.      return
29970 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4c 4f   SQLITE_IOERR_LO
29980 43 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6c 65  CK;.    }.    le
29990 6e 20 3d 20 73 74 72 6c 63 61 74 28 6c 50 61 74  n = strlcat(lPat
299a0 68 2c 20 22 73 71 6c 69 74 65 70 6c 6f 63 6b 73  h, "sqliteplocks
299b0 22 2c 20 6d 61 78 4c 65 6e 29 3b 20 20 20 20 0a  ", maxLen);    .
299c0 20 20 7d 0a 23 20 65 6c 73 65 0a 20 20 6c 65 6e    }.# else.  len
299d0 20 3d 20 73 74 72 6c 63 70 79 28 6c 50 61 74 68   = strlcpy(lPath
299e0 2c 20 22 2f 74 6d 70 2f 22 2c 20 6d 61 78 4c 65  , "/tmp/", maxLe
299f0 6e 29 3b 0a 23 20 65 6e 64 69 66 0a 23 65 6e 64  n);.# endif.#end
29a00 69 66 0a 0a 20 20 69 66 28 20 6c 50 61 74 68 5b  if..  if( lPath[
29a10 6c 65 6e 2d 31 5d 21 3d 27 2f 27 20 29 7b 0a 20  len-1]!='/' ){. 
29a20 20 20 20 6c 65 6e 20 3d 20 73 74 72 6c 63 61 74     len = strlcat
29a30 28 6c 50 61 74 68 2c 20 22 2f 22 2c 20 6d 61 78  (lPath, "/", max
29a40 4c 65 6e 29 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f  Len);.  }.  .  /
29a50 2a 20 74 72 61 6e 73 66 6f 72 6d 20 74 68 65 20  * transform the 
29a60 64 62 20 70 61 74 68 20 74 6f 20 61 20 75 6e 69  db path to a uni
29a70 71 75 65 20 63 61 63 68 65 20 6e 61 6d 65 20 2a  que cache name *
29a80 2f 0a 20 20 64 62 4c 65 6e 20 3d 20 28 69 6e 74  /.  dbLen = (int
29a90 29 73 74 72 6c 65 6e 28 64 62 50 61 74 68 29 3b  )strlen(dbPath);
29aa0 0a 20 20 66 6f 72 28 20 69 3d 30 3b 20 69 3c 64  .  for( i=0; i<d
29ab0 62 4c 65 6e 20 26 26 20 28 69 2b 6c 65 6e 2b 37  bLen && (i+len+7
29ac0 29 3c 6d 61 78 4c 65 6e 3b 20 69 2b 2b 29 7b 0a  )<maxLen; i++){.
29ad0 20 20 20 20 63 68 61 72 20 63 20 3d 20 64 62 50      char c = dbP
29ae0 61 74 68 5b 69 5d 3b 0a 20 20 20 20 6c 50 61 74  ath[i];.    lPat
29af0 68 5b 69 2b 6c 65 6e 5d 20 3d 20 28 63 3d 3d 27  h[i+len] = (c=='
29b00 2f 27 29 3f 27 5f 27 3a 63 3b 0a 20 20 7d 0a 20  /')?'_':c;.  }. 
29b10 20 6c 50 61 74 68 5b 69 2b 6c 65 6e 5d 3d 27 5c   lPath[i+len]='\
29b20 30 27 3b 0a 20 20 73 74 72 6c 63 61 74 28 6c 50  0';.  strlcat(lP
29b30 61 74 68 2c 20 22 3a 61 75 74 6f 3a 22 2c 20 6d  ath, ":auto:", m
29b40 61 78 4c 65 6e 29 3b 0a 20 20 4f 53 54 52 41 43  axLen);.  OSTRAC
29b50 45 28 28 22 47 45 54 4c 4f 43 4b 50 41 54 48 20  E(("GETLOCKPATH 
29b60 20 70 72 6f 78 79 20 6c 6f 63 6b 20 70 61 74 68   proxy lock path
29b70 3d 25 73 20 70 69 64 3d 25 64 5c 6e 22 2c 20 6c  =%s pid=%d\n", l
29b80 50 61 74 68 2c 20 67 65 74 70 69 64 28 29 29 29  Path, getpid()))
29b90 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
29ba0 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 20 0a 20 2a 2a  E_OK;.}../* . **
29bb0 20 43 72 65 61 74 65 73 20 74 68 65 20 6c 6f 63   Creates the loc
29bc0 6b 20 66 69 6c 65 20 61 6e 64 20 61 6e 79 20 6d  k file and any m
29bd0 69 73 73 69 6e 67 20 64 69 72 65 63 74 6f 72 69  issing directori
29be0 65 73 20 69 6e 20 6c 6f 63 6b 50 61 74 68 0a 20  es in lockPath. 
29bf0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72  */.static int pr
29c00 6f 78 79 43 72 65 61 74 65 4c 6f 63 6b 50 61 74  oxyCreateLockPat
29c10 68 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 6c 6f  h(const char *lo
29c20 63 6b 50 61 74 68 29 7b 0a 20 20 69 6e 74 20 69  ckPath){.  int i
29c30 2c 20 6c 65 6e 3b 0a 20 20 63 68 61 72 20 62 75  , len;.  char bu
29c40 66 5b 4d 41 58 50 41 54 48 4c 45 4e 5d 3b 0a 20  f[MAXPATHLEN];. 
29c50 20 69 6e 74 20 73 74 61 72 74 20 3d 20 30 3b 0a   int start = 0;.
29c60 20 20 0a 20 20 61 73 73 65 72 74 28 6c 6f 63 6b    .  assert(lock
29c70 50 61 74 68 21 3d 4e 55 4c 4c 29 3b 0a 20 20 2f  Path!=NULL);.  /
29c80 2a 20 74 72 79 20 74 6f 20 63 72 65 61 74 65 20  * try to create 
29c90 61 6c 6c 20 74 68 65 20 69 6e 74 65 72 6d 65 64  all the intermed
29ca0 69 61 74 65 20 64 69 72 65 63 74 6f 72 69 65 73  iate directories
29cb0 20 2a 2f 0a 20 20 6c 65 6e 20 3d 20 28 69 6e 74   */.  len = (int
29cc0 29 73 74 72 6c 65 6e 28 6c 6f 63 6b 50 61 74 68  )strlen(lockPath
29cd0 29 3b 0a 20 20 62 75 66 5b 30 5d 20 3d 20 6c 6f  );.  buf[0] = lo
29ce0 63 6b 50 61 74 68 5b 30 5d 3b 0a 20 20 66 6f 72  ckPath[0];.  for
29cf0 28 20 69 3d 31 3b 20 69 3c 6c 65 6e 3b 20 69 2b  ( i=1; i<len; i+
29d00 2b 20 29 7b 0a 20 20 20 20 69 66 28 20 6c 6f 63  + ){.    if( loc
29d10 6b 50 61 74 68 5b 69 5d 20 3d 3d 20 27 2f 27 20  kPath[i] == '/' 
29d20 26 26 20 28 69 20 2d 20 73 74 61 72 74 20 3e 20  && (i - start > 
29d30 30 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 6f  0) ){.      /* o
29d40 6e 6c 79 20 6d 6b 64 69 72 20 69 66 20 6c 65 61  nly mkdir if lea
29d50 66 20 64 69 72 20 21 3d 20 22 2e 22 20 6f 72 20  f dir != "." or 
29d60 22 2f 22 20 6f 72 20 22 2e 2e 22 20 2a 2f 0a 20  "/" or ".." */. 
29d70 20 20 20 20 20 69 66 28 20 69 2d 73 74 61 72 74       if( i-start
29d80 3e 32 20 7c 7c 20 28 69 2d 73 74 61 72 74 3d 3d  >2 || (i-start==
29d90 31 20 26 26 20 62 75 66 5b 73 74 61 72 74 5d 20  1 && buf[start] 
29da0 21 3d 20 27 2e 27 20 26 26 20 62 75 66 5b 73 74  != '.' && buf[st
29db0 61 72 74 5d 20 21 3d 20 27 2f 27 29 20 0a 20 20  art] != '/') .  
29dc0 20 20 20 20 20 20 20 7c 7c 20 28 69 2d 73 74 61         || (i-sta
29dd0 72 74 3d 3d 32 20 26 26 20 62 75 66 5b 73 74 61  rt==2 && buf[sta
29de0 72 74 5d 20 21 3d 20 27 2e 27 20 26 26 20 62 75  rt] != '.' && bu
29df0 66 5b 73 74 61 72 74 2b 31 5d 20 21 3d 20 27 2e  f[start+1] != '.
29e00 27 29 20 29 7b 0a 20 20 20 20 20 20 20 20 62 75  ') ){.        bu
29e10 66 5b 69 5d 3d 27 5c 30 27 3b 0a 20 20 20 20 20  f[i]='\0';.     
29e20 20 20 20 69 66 28 20 6d 6b 64 69 72 28 62 75 66     if( mkdir(buf
29e30 2c 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54  , SQLITE_DEFAULT
29e40 5f 50 52 4f 58 59 44 49 52 5f 50 45 52 4d 49 53  _PROXYDIR_PERMIS
29e50 53 49 4f 4e 53 29 20 29 7b 0a 20 20 20 20 20 20  SIONS) ){.      
29e60 20 20 20 20 69 6e 74 20 65 72 72 3d 65 72 72 6e      int err=errn
29e70 6f 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  o;.          if(
29e80 20 65 72 72 21 3d 45 45 58 49 53 54 20 29 20 7b   err!=EEXIST ) {
29e90 0a 20 20 20 20 20 20 20 20 20 20 20 20 4f 53 54  .            OST
29ea0 52 41 43 45 28 28 22 43 52 45 41 54 45 4c 4f 43  RACE(("CREATELOC
29eb0 4b 50 41 54 48 20 20 46 41 49 4c 45 44 20 63 72  KPATH  FAILED cr
29ec0 65 61 74 69 6e 67 20 25 73 2c 20 22 0a 20 20 20  eating %s, ".   
29ed0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29ee0 20 20 22 27 25 73 27 20 70 72 6f 78 79 20 6c 6f    "'%s' proxy lo
29ef0 63 6b 20 70 61 74 68 3d 25 73 20 70 69 64 3d 25  ck path=%s pid=%
29f00 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  d\n",.          
29f10 20 20 20 20 20 20 20 20 20 20 20 62 75 66 2c 20             buf, 
29f20 73 74 72 65 72 72 6f 72 28 65 72 72 29 2c 20 6c  strerror(err), l
29f30 6f 63 6b 50 61 74 68 2c 20 67 65 74 70 69 64 28  ockPath, getpid(
29f40 29 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  )));.           
29f50 20 72 65 74 75 72 6e 20 65 72 72 3b 0a 20 20 20   return err;.   
29f60 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
29f70 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
29f80 20 73 74 61 72 74 3d 69 2b 31 3b 0a 20 20 20 20   start=i+1;.    
29f90 7d 0a 20 20 20 20 62 75 66 5b 69 5d 20 3d 20 6c  }.    buf[i] = l
29fa0 6f 63 6b 50 61 74 68 5b 69 5d 3b 0a 20 20 7d 0a  ockPath[i];.  }.
29fb0 20 20 4f 53 54 52 41 43 45 28 28 22 43 52 45 41    OSTRACE(("CREA
29fc0 54 45 4c 4f 43 4b 50 41 54 48 20 20 70 72 6f 78  TELOCKPATH  prox
29fd0 79 20 6c 6f 63 6b 20 70 61 74 68 3d 25 73 20 70  y lock path=%s p
29fe0 69 64 3d 25 64 5c 6e 22 2c 20 6c 6f 63 6b 50 61  id=%d\n", lockPa
29ff0 74 68 2c 20 67 65 74 70 69 64 28 29 29 29 3b 0a  th, getpid()));.
2a000 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f    return 0;.}../
2a010 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61 20 6e 65  *.** Create a ne
2a020 77 20 56 46 53 20 66 69 6c 65 20 64 65 73 63 72  w VFS file descr
2a030 69 70 74 6f 72 20 28 73 74 6f 72 65 64 20 69 6e  iptor (stored in
2a040 20 6d 65 6d 6f 72 79 20 6f 62 74 61 69 6e 65 64   memory obtained
2a050 20 66 72 6f 6d 0a 2a 2a 20 73 71 6c 69 74 65 33   from.** sqlite3
2a060 5f 6d 61 6c 6c 6f 63 29 20 61 6e 64 20 6f 70 65  _malloc) and ope
2a070 6e 20 74 68 65 20 66 69 6c 65 20 6e 61 6d 65 64  n the file named
2a080 20 22 70 61 74 68 22 20 69 6e 20 74 68 65 20 66   "path" in the f
2a090 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 2e 0a  ile descriptor..
2a0a0 2a 2a 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 65 72  **.** The caller
2a0b0 20 69 73 20 72 65 73 70 6f 6e 73 69 62 6c 65 20   is responsible 
2a0c0 6e 6f 74 20 6f 6e 6c 79 20 66 6f 72 20 63 6c 6f  not only for clo
2a0d0 73 69 6e 67 20 74 68 65 20 66 69 6c 65 20 64 65  sing the file de
2a0e0 73 63 72 69 70 74 6f 72 0a 2a 2a 20 62 75 74 20  scriptor.** but 
2a0f0 61 6c 73 6f 20 66 6f 72 20 66 72 65 65 69 6e 67  also for freeing
2a100 20 74 68 65 20 6d 65 6d 6f 72 79 20 61 73 73 6f   the memory asso
2a110 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65 20  ciated with the 
2a120 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 2e  file descriptor.
2a130 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
2a140 72 6f 78 79 43 72 65 61 74 65 55 6e 69 78 46 69  roxyCreateUnixFi
2a150 6c 65 28 0a 20 20 20 20 63 6f 6e 73 74 20 63 68  le(.    const ch
2a160 61 72 20 2a 70 61 74 68 2c 20 20 20 20 20 20 20  ar *path,       
2a170 20 2f 2a 20 70 61 74 68 20 66 6f 72 20 74 68 65   /* path for the
2a180 20 6e 65 77 20 75 6e 69 78 46 69 6c 65 20 2a 2f   new unixFile */
2a190 0a 20 20 20 20 75 6e 69 78 46 69 6c 65 20 2a 2a  .    unixFile **
2a1a0 70 70 46 69 6c 65 2c 20 20 20 20 20 20 20 2f 2a  ppFile,       /*
2a1b0 20 75 6e 69 78 46 69 6c 65 20 63 72 65 61 74 65   unixFile create
2a1c0 64 20 61 6e 64 20 72 65 74 75 72 6e 65 64 20 62  d and returned b
2a1d0 79 20 72 65 66 20 2a 2f 0a 20 20 20 20 69 6e 74  y ref */.    int
2a1e0 20 69 73 6c 6f 63 6b 66 69 6c 65 20 20 20 20 20   islockfile     
2a1f0 20 20 20 20 20 20 2f 2a 20 69 66 20 6e 6f 6e 20        /* if non 
2a200 7a 65 72 6f 20 6d 69 73 73 69 6e 67 20 64 69 72  zero missing dir
2a210 73 20 77 69 6c 6c 20 62 65 20 63 72 65 61 74 65  s will be create
2a220 64 20 2a 2f 0a 29 20 7b 0a 20 20 69 6e 74 20 66  d */.) {.  int f
2a230 64 20 3d 20 2d 31 3b 0a 20 20 69 6e 74 20 64 69  d = -1;.  int di
2a240 72 66 64 20 3d 20 2d 31 3b 0a 20 20 75 6e 69 78  rfd = -1;.  unix
2a250 46 69 6c 65 20 2a 70 4e 65 77 3b 0a 20 20 69 6e  File *pNew;.  in
2a260 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
2a270 3b 0a 20 20 69 6e 74 20 6f 70 65 6e 46 6c 61 67  ;.  int openFlag
2a280 73 20 3d 20 4f 5f 52 44 57 52 20 7c 20 4f 5f 43  s = O_RDWR | O_C
2a290 52 45 41 54 3b 0a 20 20 73 71 6c 69 74 65 33 5f  REAT;.  sqlite3_
2a2a0 76 66 73 20 64 75 6d 6d 79 56 66 73 3b 0a 20 20  vfs dummyVfs;.  
2a2b0 69 6e 74 20 74 65 72 72 6e 6f 20 3d 20 30 3b 0a  int terrno = 0;.
2a2c0 20 20 55 6e 69 78 55 6e 75 73 65 64 46 64 20 2a    UnixUnusedFd *
2a2d0 70 55 6e 75 73 65 64 20 3d 20 4e 55 4c 4c 3b 0a  pUnused = NULL;.
2a2e0 0a 20 20 2f 2a 20 31 2e 20 66 69 72 73 74 20 74  .  /* 1. first t
2a2f0 72 79 20 74 6f 20 6f 70 65 6e 2f 63 72 65 61 74  ry to open/creat
2a300 65 20 74 68 65 20 66 69 6c 65 0a 20 20 2a 2a 20  e the file.  ** 
2a310 32 2e 20 69 66 20 74 68 61 74 20 66 61 69 6c 73  2. if that fails
2a320 2c 20 61 6e 64 20 74 68 69 73 20 69 73 20 61 20  , and this is a 
2a330 6c 6f 63 6b 20 66 69 6c 65 20 28 6e 6f 74 2d 63  lock file (not-c
2a340 6f 6e 63 68 29 2c 20 74 72 79 20 63 72 65 61 74  onch), try creat
2a350 69 6e 67 0a 20 20 2a 2a 20 74 68 65 20 70 61 72  ing.  ** the par
2a360 65 6e 74 20 64 69 72 65 63 74 6f 72 69 65 73 20  ent directories 
2a370 61 6e 64 20 74 68 65 6e 20 74 72 79 20 61 67 61  and then try aga
2a380 69 6e 2e 0a 20 20 2a 2a 20 33 2e 20 69 66 20 74  in..  ** 3. if t
2a390 68 61 74 20 66 61 69 6c 73 2c 20 74 72 79 20 74  hat fails, try t
2a3a0 6f 20 6f 70 65 6e 20 74 68 65 20 66 69 6c 65 20  o open the file 
2a3b0 72 65 61 64 2d 6f 6e 6c 79 0a 20 20 2a 2a 20 6f  read-only.  ** o
2a3c0 74 68 65 72 77 69 73 65 20 72 65 74 75 72 6e 20  therwise return 
2a3d0 42 55 53 59 20 28 69 66 20 6c 6f 63 6b 20 66 69  BUSY (if lock fi
2a3e0 6c 65 29 20 6f 72 20 43 41 4e 54 4f 50 45 4e 20  le) or CANTOPEN 
2a3f0 66 6f 72 20 74 68 65 20 63 6f 6e 63 68 20 66 69  for the conch fi
2a400 6c 65 0a 20 20 2a 2f 0a 20 20 70 55 6e 75 73 65  le.  */.  pUnuse
2a410 64 20 3d 20 66 69 6e 64 52 65 75 73 61 62 6c 65  d = findReusable
2a420 46 64 28 70 61 74 68 2c 20 6f 70 65 6e 46 6c 61  Fd(path, openFla
2a430 67 73 29 3b 0a 20 20 69 66 28 20 70 55 6e 75 73  gs);.  if( pUnus
2a440 65 64 20 29 7b 0a 20 20 20 20 66 64 20 3d 20 70  ed ){.    fd = p
2a450 55 6e 75 73 65 64 2d 3e 66 64 3b 0a 20 20 7d 65  Unused->fd;.  }e
2a460 6c 73 65 7b 0a 20 20 20 20 70 55 6e 75 73 65 64  lse{.    pUnused
2a470 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f   = sqlite3_mallo
2a480 63 28 73 69 7a 65 6f 66 28 2a 70 55 6e 75 73 65  c(sizeof(*pUnuse
2a490 64 29 29 3b 0a 20 20 20 20 69 66 28 20 21 70 55  d));.    if( !pU
2a4a0 6e 75 73 65 64 20 29 7b 0a 20 20 20 20 20 20 72  nused ){.      r
2a4b0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
2a4c0 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  EM;.    }.  }.  
2a4d0 69 66 28 20 66 64 3c 30 20 29 7b 0a 20 20 20 20  if( fd<0 ){.    
2a4e0 66 64 20 3d 20 6f 70 65 6e 28 70 61 74 68 2c 20  fd = open(path, 
2a4f0 6f 70 65 6e 46 6c 61 67 73 2c 20 53 51 4c 49 54  openFlags, SQLIT
2a500 45 5f 44 45 46 41 55 4c 54 5f 46 49 4c 45 5f 50  E_DEFAULT_FILE_P
2a510 45 52 4d 49 53 53 49 4f 4e 53 29 3b 0a 20 20 20  ERMISSIONS);.   
2a520 20 74 65 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b   terrno = errno;
2a530 0a 20 20 20 20 69 66 28 20 66 64 3c 30 20 26 26  .    if( fd<0 &&
2a540 20 65 72 72 6e 6f 3d 3d 45 4e 4f 45 4e 54 20 26   errno==ENOENT &
2a550 26 20 69 73 6c 6f 63 6b 66 69 6c 65 20 29 7b 0a  & islockfile ){.
2a560 20 20 20 20 20 20 69 66 28 20 70 72 6f 78 79 43        if( proxyC
2a570 72 65 61 74 65 4c 6f 63 6b 50 61 74 68 28 70 61  reateLockPath(pa
2a580 74 68 29 20 3d 3d 20 53 51 4c 49 54 45 5f 4f 4b  th) == SQLITE_OK
2a590 20 29 7b 0a 20 20 20 20 20 20 20 20 66 64 20 3d   ){.        fd =
2a5a0 20 6f 70 65 6e 28 70 61 74 68 2c 20 6f 70 65 6e   open(path, open
2a5b0 46 6c 61 67 73 2c 20 53 51 4c 49 54 45 5f 44 45  Flags, SQLITE_DE
2a5c0 46 41 55 4c 54 5f 46 49 4c 45 5f 50 45 52 4d 49  FAULT_FILE_PERMI
2a5d0 53 53 49 4f 4e 53 29 3b 0a 20 20 20 20 20 20 7d  SSIONS);.      }
2a5e0 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
2a5f0 20 66 64 3c 30 20 29 7b 0a 20 20 20 20 6f 70 65   fd<0 ){.    ope
2a600 6e 46 6c 61 67 73 20 3d 20 4f 5f 52 44 4f 4e 4c  nFlags = O_RDONL
2a610 59 3b 0a 20 20 20 20 66 64 20 3d 20 6f 70 65 6e  Y;.    fd = open
2a620 28 70 61 74 68 2c 20 6f 70 65 6e 46 6c 61 67 73  (path, openFlags
2a630 2c 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54  , SQLITE_DEFAULT
2a640 5f 46 49 4c 45 5f 50 45 52 4d 49 53 53 49 4f 4e  _FILE_PERMISSION
2a650 53 29 3b 0a 20 20 20 20 74 65 72 72 6e 6f 20 3d  S);.    terrno =
2a660 20 65 72 72 6e 6f 3b 0a 20 20 7d 0a 20 20 69 66   errno;.  }.  if
2a670 28 20 66 64 3c 30 20 29 7b 0a 20 20 20 20 69 66  ( fd<0 ){.    if
2a680 28 20 69 73 6c 6f 63 6b 66 69 6c 65 20 29 7b 0a  ( islockfile ){.
2a690 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
2a6a0 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 7d 0a  ITE_BUSY;.    }.
2a6b0 20 20 20 20 73 77 69 74 63 68 20 28 74 65 72 72      switch (terr
2a6c0 6e 6f 29 20 7b 0a 20 20 20 20 20 20 63 61 73 65  no) {.      case
2a6d0 20 45 41 43 43 45 53 3a 0a 20 20 20 20 20 20 20   EACCES:.       
2a6e0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 50   return SQLITE_P
2a6f0 45 52 4d 3b 0a 20 20 20 20 20 20 63 61 73 65 20  ERM;.      case 
2a700 45 49 4f 3a 20 0a 20 20 20 20 20 20 20 20 72 65  EIO: .        re
2a710 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52  turn SQLITE_IOER
2a720 52 5f 4c 4f 43 4b 3b 20 2f 2a 20 65 76 65 6e 20  R_LOCK; /* even 
2a730 74 68 6f 75 67 68 20 69 74 20 69 73 20 74 68 65  though it is the
2a740 20 63 6f 6e 63 68 20 2a 2f 0a 20 20 20 20 20 20   conch */.      
2a750 64 65 66 61 75 6c 74 3a 0a 20 20 20 20 20 20 20  default:.       
2a760 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
2a770 41 4e 54 4f 50 45 4e 5f 42 4b 50 54 3b 0a 20 20  ANTOPEN_BKPT;.  
2a780 20 20 7d 0a 20 20 7d 0a 20 20 0a 20 20 70 4e 65    }.  }.  .  pNe
2a790 77 20 3d 20 28 75 6e 69 78 46 69 6c 65 20 2a 29  w = (unixFile *)
2a7a0 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 73  sqlite3_malloc(s
2a7b0 69 7a 65 6f 66 28 2a 70 4e 65 77 29 29 3b 0a 20  izeof(*pNew));. 
2a7c0 20 69 66 28 20 70 4e 65 77 3d 3d 4e 55 4c 4c 20   if( pNew==NULL 
2a7d0 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  ){.    rc = SQLI
2a7e0 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 67 6f  TE_NOMEM;.    go
2a7f0 74 6f 20 65 6e 64 5f 63 72 65 61 74 65 5f 70 72  to end_create_pr
2a800 6f 78 79 3b 0a 20 20 7d 0a 20 20 6d 65 6d 73 65  oxy;.  }.  memse
2a810 74 28 70 4e 65 77 2c 20 30 2c 20 73 69 7a 65 6f  t(pNew, 0, sizeo
2a820 66 28 75 6e 69 78 46 69 6c 65 29 29 3b 0a 20 20  f(unixFile));.  
2a830 70 4e 65 77 2d 3e 6f 70 65 6e 46 6c 61 67 73 20  pNew->openFlags 
2a840 3d 20 6f 70 65 6e 46 6c 61 67 73 3b 0a 20 20 64  = openFlags;.  d
2a850 75 6d 6d 79 56 66 73 2e 70 41 70 70 44 61 74 61  ummyVfs.pAppData
2a860 20 3d 20 28 76 6f 69 64 2a 29 26 61 75 74 6f 6c   = (void*)&autol
2a870 6f 63 6b 49 6f 46 69 6e 64 65 72 3b 0a 20 20 70  ockIoFinder;.  p
2a880 55 6e 75 73 65 64 2d 3e 66 64 20 3d 20 66 64 3b  Unused->fd = fd;
2a890 0a 20 20 70 55 6e 75 73 65 64 2d 3e 66 6c 61 67  .  pUnused->flag
2a8a0 73 20 3d 20 6f 70 65 6e 46 6c 61 67 73 3b 0a 20  s = openFlags;. 
2a8b0 20 70 4e 65 77 2d 3e 70 55 6e 75 73 65 64 20 3d   pNew->pUnused =
2a8c0 20 70 55 6e 75 73 65 64 3b 0a 20 20 0a 20 20 72   pUnused;.  .  r
2a8d0 63 20 3d 20 66 69 6c 6c 49 6e 55 6e 69 78 46 69  c = fillInUnixFi
2a8e0 6c 65 28 26 64 75 6d 6d 79 56 66 73 2c 20 66 64  le(&dummyVfs, fd
2a8f0 2c 20 64 69 72 66 64 2c 20 28 73 71 6c 69 74 65  , dirfd, (sqlite
2a900 33 5f 66 69 6c 65 2a 29 70 4e 65 77 2c 20 70 61  3_file*)pNew, pa
2a910 74 68 2c 20 30 2c 20 30 29 3b 0a 20 20 69 66 28  th, 0, 0);.  if(
2a920 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
2a930 7b 0a 20 20 20 20 2a 70 70 46 69 6c 65 20 3d 20  {.    *ppFile = 
2a940 70 4e 65 77 3b 0a 20 20 20 20 72 65 74 75 72 6e  pNew;.    return
2a950 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
2a960 65 6e 64 5f 63 72 65 61 74 65 5f 70 72 6f 78 79  end_create_proxy
2a970 3a 20 20 20 20 0a 20 20 63 6c 6f 73 65 28 66 64  :    .  close(fd
2a980 29 3b 20 2f 2a 20 73 69 6c 65 6e 74 6c 79 20 6c  ); /* silently l
2a990 65 61 6b 20 66 64 20 69 66 20 65 72 72 6f 72 2c  eak fd if error,
2a9a0 20 77 65 27 72 65 20 61 6c 72 65 61 64 79 20 69   we're already i
2a9b0 6e 20 65 72 72 6f 72 20 2a 2f 0a 20 20 73 71 6c  n error */.  sql
2a9c0 69 74 65 33 5f 66 72 65 65 28 70 4e 65 77 29 3b  ite3_free(pNew);
2a9d0 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  .  sqlite3_free(
2a9e0 70 55 6e 75 73 65 64 29 3b 0a 20 20 72 65 74 75  pUnused);.  retu
2a9f0 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 64 65 66  rn rc;.}..#ifdef
2aa00 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 2f 2a 20   SQLITE_TEST./* 
2aa10 73 69 6d 75 6c 61 74 65 20 6d 75 6c 74 69 70 6c  simulate multipl
2aa20 65 20 68 6f 73 74 73 20 62 79 20 63 72 65 61 74  e hosts by creat
2aa30 69 6e 67 20 75 6e 69 71 75 65 20 68 6f 73 74 69  ing unique hosti
2aa40 64 20 66 69 6c 65 20 70 61 74 68 73 20 2a 2f 0a  d file paths */.
2aa50 69 6e 74 20 73 71 6c 69 74 65 33 5f 68 6f 73 74  int sqlite3_host
2aa60 69 64 5f 6e 75 6d 20 3d 20 30 3b 0a 23 65 6e 64  id_num = 0;.#end
2aa70 69 66 0a 0a 23 64 65 66 69 6e 65 20 50 52 4f 58  if..#define PROX
2aa80 59 5f 48 4f 53 54 49 44 4c 45 4e 20 20 20 20 31  Y_HOSTIDLEN    1
2aa90 36 20 20 2f 2a 20 63 6f 6e 63 68 20 66 69 6c 65  6  /* conch file
2aaa0 20 68 6f 73 74 20 69 64 20 6c 65 6e 67 74 68 20   host id length 
2aab0 2a 2f 0a 0a 2f 2a 20 67 65 74 20 74 68 65 20 68  */../* get the h
2aac0 6f 73 74 20 49 44 20 76 69 61 20 67 65 74 68 6f  ost ID via getho
2aad0 73 74 75 75 69 64 28 29 2c 20 70 48 6f 73 74 49  stuuid(), pHostI
2aae0 44 20 6d 75 73 74 20 70 6f 69 6e 74 20 74 6f 20  D must point to 
2aaf0 50 52 4f 58 59 5f 48 4f 53 54 49 44 4c 45 4e 20  PROXY_HOSTIDLEN 
2ab00 0a 2a 2a 20 62 79 74 65 73 20 6f 66 20 77 72 69  .** bytes of wri
2ab10 74 61 62 6c 65 20 6d 65 6d 6f 72 79 2e 0a 2a 2f  table memory..*/
2ab20 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72 6f 78  .static int prox
2ab30 79 47 65 74 48 6f 73 74 49 44 28 75 6e 73 69 67  yGetHostID(unsig
2ab40 6e 65 64 20 63 68 61 72 20 2a 70 48 6f 73 74 49  ned char *pHostI
2ab50 44 2c 20 69 6e 74 20 2a 70 45 72 72 6f 72 29 7b  D, int *pError){
2ab60 0a 20 20 73 74 72 75 63 74 20 74 69 6d 65 73 70  .  struct timesp
2ab70 65 63 20 74 69 6d 65 6f 75 74 20 3d 20 7b 31 2c  ec timeout = {1,
2ab80 20 30 7d 3b 20 2f 2a 20 31 20 73 65 63 20 74 69   0}; /* 1 sec ti
2ab90 6d 65 6f 75 74 20 2a 2f 0a 20 20 0a 20 20 61 73  meout */.  .  as
2aba0 73 65 72 74 28 50 52 4f 58 59 5f 48 4f 53 54 49  sert(PROXY_HOSTI
2abb0 44 4c 45 4e 20 3d 3d 20 73 69 7a 65 6f 66 28 75  DLEN == sizeof(u
2abc0 75 69 64 5f 74 29 29 3b 0a 20 20 6d 65 6d 73 65  uid_t));.  memse
2abd0 74 28 70 48 6f 73 74 49 44 2c 20 30 2c 20 50 52  t(pHostID, 0, PR
2abe0 4f 58 59 5f 48 4f 53 54 49 44 4c 45 4e 29 3b 0a  OXY_HOSTIDLEN);.
2abf0 20 20 69 66 28 20 67 65 74 68 6f 73 74 75 75 69    if( gethostuui
2ac00 64 28 70 48 6f 73 74 49 44 2c 20 26 74 69 6d 65  d(pHostID, &time
2ac10 6f 75 74 29 20 29 7b 0a 20 20 20 20 69 6e 74 20  out) ){.    int 
2ac20 65 72 72 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20  err = errno;.   
2ac30 20 69 66 28 20 70 45 72 72 6f 72 20 29 7b 0a 20   if( pError ){. 
2ac40 20 20 20 20 20 2a 70 45 72 72 6f 72 20 3d 20 65       *pError = e
2ac50 72 72 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65  rr;.    }.    re
2ac60 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52  turn SQLITE_IOER
2ac70 52 3b 0a 20 20 7d 0a 23 69 66 64 65 66 20 53 51  R;.  }.#ifdef SQ
2ac80 4c 49 54 45 5f 54 45 53 54 0a 20 20 2f 2a 20 73  LITE_TEST.  /* s
2ac90 69 6d 75 6c 61 74 65 20 6d 75 6c 74 69 70 6c 65  imulate multiple
2aca0 20 68 6f 73 74 73 20 62 79 20 63 72 65 61 74 69   hosts by creati
2acb0 6e 67 20 75 6e 69 71 75 65 20 68 6f 73 74 69 64  ng unique hostid
2acc0 20 66 69 6c 65 20 70 61 74 68 73 20 2a 2f 0a 20   file paths */. 
2acd0 20 69 66 28 20 73 71 6c 69 74 65 33 5f 68 6f 73   if( sqlite3_hos
2ace0 74 69 64 5f 6e 75 6d 20 21 3d 20 30 29 7b 0a 20  tid_num != 0){. 
2acf0 20 20 20 70 48 6f 73 74 49 44 5b 30 5d 20 3d 20     pHostID[0] = 
2ad00 28 63 68 61 72 29 28 70 48 6f 73 74 49 44 5b 30  (char)(pHostID[0
2ad10 5d 20 2b 20 28 63 68 61 72 29 28 73 71 6c 69 74  ] + (char)(sqlit
2ad20 65 33 5f 68 6f 73 74 69 64 5f 6e 75 6d 20 26 20  e3_hostid_num & 
2ad30 30 78 46 46 29 29 3b 0a 20 20 7d 0a 23 65 6e 64  0xFF));.  }.#end
2ad40 69 66 0a 20 20 0a 20 20 72 65 74 75 72 6e 20 53  if.  .  return S
2ad50 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 20  QLITE_OK;.}../* 
2ad60 54 68 65 20 63 6f 6e 63 68 20 66 69 6c 65 20 63  The conch file c
2ad70 6f 6e 74 61 69 6e 73 20 74 68 65 20 68 65 61 64  ontains the head
2ad80 65 72 2c 20 68 6f 73 74 20 69 64 20 61 6e 64 20  er, host id and 
2ad90 6c 6f 63 6b 20 66 69 6c 65 20 70 61 74 68 0a 20  lock file path. 
2ada0 2a 2f 0a 23 64 65 66 69 6e 65 20 50 52 4f 58 59  */.#define PROXY
2adb0 5f 43 4f 4e 43 48 56 45 52 53 49 4f 4e 20 32 20  _CONCHVERSION 2 
2adc0 20 20 2f 2a 20 31 2d 62 79 74 65 20 68 65 61 64    /* 1-byte head
2add0 65 72 2c 20 31 36 2d 62 79 74 65 20 68 6f 73 74  er, 16-byte host
2ade0 20 69 64 2c 20 70 61 74 68 20 2a 2f 0a 23 64 65   id, path */.#de
2adf0 66 69 6e 65 20 50 52 4f 58 59 5f 48 45 41 44 45  fine PROXY_HEADE
2ae00 52 4c 45 4e 20 20 20 20 31 20 20 20 2f 2a 20 63  RLEN    1   /* c
2ae10 6f 6e 63 68 20 66 69 6c 65 20 68 65 61 64 65 72  onch file header
2ae20 20 6c 65 6e 67 74 68 20 2a 2f 0a 23 64 65 66 69   length */.#defi
2ae30 6e 65 20 50 52 4f 58 59 5f 50 41 54 48 49 4e 44  ne PROXY_PATHIND
2ae40 45 58 20 20 20 20 28 50 52 4f 58 59 5f 48 45 41  EX    (PROXY_HEA
2ae50 44 45 52 4c 45 4e 2b 50 52 4f 58 59 5f 48 4f 53  DERLEN+PROXY_HOS
2ae60 54 49 44 4c 45 4e 29 0a 23 64 65 66 69 6e 65 20  TIDLEN).#define 
2ae70 50 52 4f 58 59 5f 4d 41 58 43 4f 4e 43 48 4c 45  PROXY_MAXCONCHLE
2ae80 4e 20 20 28 50 52 4f 58 59 5f 48 45 41 44 45 52  N  (PROXY_HEADER
2ae90 4c 45 4e 2b 50 52 4f 58 59 5f 48 4f 53 54 49 44  LEN+PROXY_HOSTID
2aea0 4c 45 4e 2b 4d 41 58 50 41 54 48 4c 45 4e 29 0a  LEN+MAXPATHLEN).
2aeb0 0a 2f 2a 20 0a 2a 2a 20 54 61 6b 65 73 20 61 6e  ./* .** Takes an
2aec0 20 6f 70 65 6e 20 63 6f 6e 63 68 20 66 69 6c 65   open conch file
2aed0 2c 20 63 6f 70 69 65 73 20 74 68 65 20 63 6f 6e  , copies the con
2aee0 74 65 6e 74 73 20 74 6f 20 61 20 6e 65 77 20 70  tents to a new p
2aef0 61 74 68 20 61 6e 64 20 74 68 65 6e 20 6d 6f 76  ath and then mov
2af00 65 73 20 0a 2a 2a 20 69 74 20 62 61 63 6b 2e 20  es .** it back. 
2af10 20 54 68 65 20 6e 65 77 6c 79 20 63 72 65 61 74   The newly creat
2af20 65 64 20 66 69 6c 65 27 73 20 66 69 6c 65 20 64  ed file's file d
2af30 65 73 63 72 69 70 74 6f 72 20 69 73 20 61 73 73  escriptor is ass
2af40 69 67 6e 65 64 20 74 6f 20 74 68 65 0a 2a 2a 20  igned to the.** 
2af50 63 6f 6e 63 68 20 66 69 6c 65 20 73 74 72 75 63  conch file struc
2af60 74 75 72 65 20 61 6e 64 20 66 69 6e 61 6c 6c 79  ture and finally
2af70 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 63 6f   the original co
2af80 6e 63 68 20 66 69 6c 65 20 64 65 73 63 72 69 70  nch file descrip
2af90 74 6f 72 20 69 73 20 0a 2a 2a 20 63 6c 6f 73 65  tor is .** close
2afa0 64 2e 20 20 52 65 74 75 72 6e 73 20 7a 65 72 6f  d.  Returns zero
2afb0 20 69 66 20 73 75 63 63 65 73 73 66 75 6c 2e 0a   if successful..
2afc0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72  */.static int pr
2afd0 6f 78 79 42 72 65 61 6b 43 6f 6e 63 68 4c 6f 63  oxyBreakConchLoc
2afe0 6b 28 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c  k(unixFile *pFil
2aff0 65 2c 20 75 75 69 64 5f 74 20 6d 79 48 6f 73 74  e, uuid_t myHost
2b000 49 44 29 7b 0a 20 20 70 72 6f 78 79 4c 6f 63 6b  ID){.  proxyLock
2b010 69 6e 67 43 6f 6e 74 65 78 74 20 2a 70 43 74 78  ingContext *pCtx
2b020 20 3d 20 28 70 72 6f 78 79 4c 6f 63 6b 69 6e 67   = (proxyLocking
2b030 43 6f 6e 74 65 78 74 20 2a 29 70 46 69 6c 65 2d  Context *)pFile-
2b040 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b  >lockingContext;
2b050 20 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 63 6f   .  unixFile *co
2b060 6e 63 68 46 69 6c 65 20 3d 20 70 43 74 78 2d 3e  nchFile = pCtx->
2b070 63 6f 6e 63 68 46 69 6c 65 3b 0a 20 20 63 68 61  conchFile;.  cha
2b080 72 20 74 50 61 74 68 5b 4d 41 58 50 41 54 48 4c  r tPath[MAXPATHL
2b090 45 4e 5d 3b 0a 20 20 63 68 61 72 20 62 75 66 5b  EN];.  char buf[
2b0a0 50 52 4f 58 59 5f 4d 41 58 43 4f 4e 43 48 4c 45  PROXY_MAXCONCHLE
2b0b0 4e 5d 3b 0a 20 20 63 68 61 72 20 2a 63 50 61 74  N];.  char *cPat
2b0c0 68 20 3d 20 70 43 74 78 2d 3e 63 6f 6e 63 68 46  h = pCtx->conchF
2b0d0 69 6c 65 50 61 74 68 3b 0a 20 20 73 69 7a 65 5f  ilePath;.  size_
2b0e0 74 20 72 65 61 64 4c 65 6e 20 3d 20 30 3b 0a 20  t readLen = 0;. 
2b0f0 20 73 69 7a 65 5f 74 20 70 61 74 68 4c 65 6e 20   size_t pathLen 
2b100 3d 20 30 3b 0a 20 20 63 68 61 72 20 65 72 72 6d  = 0;.  char errm
2b110 73 67 5b 36 34 5d 20 3d 20 22 22 3b 0a 20 20 69  sg[64] = "";.  i
2b120 6e 74 20 66 64 20 3d 20 2d 31 3b 0a 20 20 69 6e  nt fd = -1;.  in
2b130 74 20 72 63 20 3d 20 2d 31 3b 0a 0a 20 20 2f 2a  t rc = -1;..  /*
2b140 20 63 72 65 61 74 65 20 61 20 6e 65 77 20 70 61   create a new pa
2b150 74 68 20 62 79 20 72 65 70 6c 61 63 65 20 74 68  th by replace th
2b160 65 20 74 72 61 69 6c 69 6e 67 20 27 2d 63 6f 6e  e trailing '-con
2b170 63 68 27 20 77 69 74 68 20 27 2d 62 72 65 61 6b  ch' with '-break
2b180 27 20 2a 2f 0a 20 20 70 61 74 68 4c 65 6e 20 3d  ' */.  pathLen =
2b190 20 73 74 72 6c 63 70 79 28 74 50 61 74 68 2c 20   strlcpy(tPath, 
2b1a0 63 50 61 74 68 2c 20 4d 41 58 50 41 54 48 4c 45  cPath, MAXPATHLE
2b1b0 4e 29 3b 0a 20 20 69 66 28 20 70 61 74 68 4c 65  N);.  if( pathLe
2b1c0 6e 3e 4d 41 58 50 41 54 48 4c 45 4e 20 7c 7c 20  n>MAXPATHLEN || 
2b1d0 70 61 74 68 4c 65 6e 3c 36 20 7c 7c 20 0a 20 20  pathLen<6 || .  
2b1e0 20 20 20 28 73 74 72 6c 63 70 79 28 26 74 50 61     (strlcpy(&tPa
2b1f0 74 68 5b 70 61 74 68 4c 65 6e 2d 35 5d 2c 20 22  th[pathLen-5], "
2b200 62 72 65 61 6b 22 2c 20 36 29 20 21 3d 20 35 29  break", 6) != 5)
2b210 20 29 7b 0a 20 20 20 20 73 70 72 69 6e 74 66 28   ){.    sprintf(
2b220 65 72 72 6d 73 67 2c 20 22 70 61 74 68 20 65 72  errmsg, "path er
2b230 72 6f 72 20 28 6c 65 6e 20 25 64 29 22 2c 20 28  ror (len %d)", (
2b240 69 6e 74 29 70 61 74 68 4c 65 6e 29 3b 0a 20 20  int)pathLen);.  
2b250 20 20 67 6f 74 6f 20 65 6e 64 5f 62 72 65 61 6b    goto end_break
2b260 6c 6f 63 6b 3b 0a 20 20 7d 0a 20 20 2f 2a 20 72  lock;.  }.  /* r
2b270 65 61 64 20 74 68 65 20 63 6f 6e 63 68 20 63 6f  ead the conch co
2b280 6e 74 65 6e 74 20 2a 2f 0a 20 20 72 65 61 64 4c  ntent */.  readL
2b290 65 6e 20 3d 20 70 72 65 61 64 28 63 6f 6e 63 68  en = pread(conch
2b2a0 46 69 6c 65 2d 3e 68 2c 20 62 75 66 2c 20 50 52  File->h, buf, PR
2b2b0 4f 58 59 5f 4d 41 58 43 4f 4e 43 48 4c 45 4e 2c  OXY_MAXCONCHLEN,
2b2c0 20 30 29 3b 0a 20 20 69 66 28 20 72 65 61 64 4c   0);.  if( readL
2b2d0 65 6e 3c 50 52 4f 58 59 5f 50 41 54 48 49 4e 44  en<PROXY_PATHIND
2b2e0 45 58 20 29 7b 0a 20 20 20 20 73 70 72 69 6e 74  EX ){.    sprint
2b2f0 66 28 65 72 72 6d 73 67 2c 20 22 72 65 61 64 20  f(errmsg, "read 
2b300 65 72 72 6f 72 20 28 6c 65 6e 20 25 64 29 22 2c  error (len %d)",
2b310 20 28 69 6e 74 29 72 65 61 64 4c 65 6e 29 3b 0a   (int)readLen);.
2b320 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 62 72 65      goto end_bre
2b330 61 6b 6c 6f 63 6b 3b 0a 20 20 7d 0a 20 20 2f 2a  aklock;.  }.  /*
2b340 20 77 72 69 74 65 20 69 74 20 6f 75 74 20 74 6f   write it out to
2b350 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20 62   the temporary b
2b360 72 65 61 6b 20 66 69 6c 65 20 2a 2f 0a 20 20 66  reak file */.  f
2b370 64 20 3d 20 6f 70 65 6e 28 74 50 61 74 68 2c 20  d = open(tPath, 
2b380 28 4f 5f 52 44 57 52 7c 4f 5f 43 52 45 41 54 7c  (O_RDWR|O_CREAT|
2b390 4f 5f 45 58 43 4c 29 2c 20 53 51 4c 49 54 45 5f  O_EXCL), SQLITE_
2b3a0 44 45 46 41 55 4c 54 5f 46 49 4c 45 5f 50 45 52  DEFAULT_FILE_PER
2b3b0 4d 49 53 53 49 4f 4e 53 29 3b 0a 20 20 69 66 28  MISSIONS);.  if(
2b3c0 20 66 64 3c 30 20 29 7b 0a 20 20 20 20 73 70 72   fd<0 ){.    spr
2b3d0 69 6e 74 66 28 65 72 72 6d 73 67 2c 20 22 63 72  intf(errmsg, "cr
2b3e0 65 61 74 65 20 66 61 69 6c 65 64 20 28 25 64 29  eate failed (%d)
2b3f0 22 2c 20 65 72 72 6e 6f 29 3b 0a 20 20 20 20 67  ", errno);.    g
2b400 6f 74 6f 20 65 6e 64 5f 62 72 65 61 6b 6c 6f 63  oto end_breakloc
2b410 6b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 77 72  k;.  }.  if( pwr
2b420 69 74 65 28 66 64 2c 20 62 75 66 2c 20 72 65 61  ite(fd, buf, rea
2b430 64 4c 65 6e 2c 20 30 29 20 21 3d 20 72 65 61 64  dLen, 0) != read
2b440 4c 65 6e 20 29 7b 0a 20 20 20 20 73 70 72 69 6e  Len ){.    sprin
2b450 74 66 28 65 72 72 6d 73 67 2c 20 22 77 72 69 74  tf(errmsg, "writ
2b460 65 20 66 61 69 6c 65 64 20 28 25 64 29 22 2c 20  e failed (%d)", 
2b470 65 72 72 6e 6f 29 3b 0a 20 20 20 20 67 6f 74 6f  errno);.    goto
2b480 20 65 6e 64 5f 62 72 65 61 6b 6c 6f 63 6b 3b 0a   end_breaklock;.
2b490 20 20 7d 0a 20 20 69 66 28 20 72 65 6e 61 6d 65    }.  if( rename
2b4a0 28 74 50 61 74 68 2c 20 63 50 61 74 68 29 20 29  (tPath, cPath) )
2b4b0 7b 0a 20 20 20 20 73 70 72 69 6e 74 66 28 65 72  {.    sprintf(er
2b4c0 72 6d 73 67 2c 20 22 72 65 6e 61 6d 65 20 66 61  rmsg, "rename fa
2b4d0 69 6c 65 64 20 28 25 64 29 22 2c 20 65 72 72 6e  iled (%d)", errn
2b4e0 6f 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64  o);.    goto end
2b4f0 5f 62 72 65 61 6b 6c 6f 63 6b 3b 0a 20 20 7d 0a  _breaklock;.  }.
2b500 20 20 72 63 20 3d 20 30 3b 0a 20 20 66 70 72 69    rc = 0;.  fpri
2b510 6e 74 66 28 73 74 64 65 72 72 2c 20 22 62 72 6f  ntf(stderr, "bro
2b520 6b 65 20 73 74 61 6c 65 20 6c 6f 63 6b 20 6f 6e  ke stale lock on
2b530 20 25 73 5c 6e 22 2c 20 63 50 61 74 68 29 3b 0a   %s\n", cPath);.
2b540 20 20 63 6c 6f 73 65 28 63 6f 6e 63 68 46 69 6c    close(conchFil
2b550 65 2d 3e 68 29 3b 0a 20 20 63 6f 6e 63 68 46 69  e->h);.  conchFi
2b560 6c 65 2d 3e 68 20 3d 20 66 64 3b 0a 20 20 63 6f  le->h = fd;.  co
2b570 6e 63 68 46 69 6c 65 2d 3e 6f 70 65 6e 46 6c 61  nchFile->openFla
2b580 67 73 20 3d 20 4f 5f 52 44 57 52 20 7c 20 4f 5f  gs = O_RDWR | O_
2b590 43 52 45 41 54 3b 0a 0a 65 6e 64 5f 62 72 65 61  CREAT;..end_brea
2b5a0 6b 6c 6f 63 6b 3a 0a 20 20 69 66 28 20 72 63 20  klock:.  if( rc 
2b5b0 29 7b 0a 20 20 20 20 69 66 28 20 66 64 3e 3d 30  ){.    if( fd>=0
2b5c0 20 29 7b 0a 20 20 20 20 20 20 75 6e 6c 69 6e 6b   ){.      unlink
2b5d0 28 74 50 61 74 68 29 3b 0a 20 20 20 20 20 20 63  (tPath);.      c
2b5e0 6c 6f 73 65 28 66 64 29 3b 0a 20 20 20 20 7d 0a  lose(fd);.    }.
2b5f0 20 20 20 20 66 70 72 69 6e 74 66 28 73 74 64 65      fprintf(stde
2b600 72 72 2c 20 22 66 61 69 6c 65 64 20 74 6f 20 62  rr, "failed to b
2b610 72 65 61 6b 20 73 74 61 6c 65 20 6c 6f 63 6b 20  reak stale lock 
2b620 6f 6e 20 25 73 2c 20 25 73 5c 6e 22 2c 20 63 50  on %s, %s\n", cP
2b630 61 74 68 2c 20 65 72 72 6d 73 67 29 3b 0a 20 20  ath, errmsg);.  
2b640 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
2b650 0a 0a 2f 2a 20 54 61 6b 65 20 74 68 65 20 72 65  ../* Take the re
2b660 71 75 65 73 74 65 64 20 6c 6f 63 6b 20 6f 6e 20  quested lock on 
2b670 74 68 65 20 63 6f 6e 63 68 20 66 69 6c 65 20 61  the conch file a
2b680 6e 64 20 62 72 65 61 6b 20 61 20 73 74 61 6c 65  nd break a stale
2b690 20 6c 6f 63 6b 20 69 66 20 74 68 65 20 0a 2a 2a   lock if the .**
2b6a0 20 68 6f 73 74 20 69 64 20 6d 61 74 63 68 65 73   host id matches
2b6b0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
2b6c0 70 72 6f 78 79 43 6f 6e 63 68 4c 6f 63 6b 28 75  proxyConchLock(u
2b6d0 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 2c 20  nixFile *pFile, 
2b6e0 75 75 69 64 5f 74 20 6d 79 48 6f 73 74 49 44 2c  uuid_t myHostID,
2b6f0 20 69 6e 74 20 6c 6f 63 6b 54 79 70 65 29 7b 0a   int lockType){.
2b700 20 20 70 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f    proxyLockingCo
2b710 6e 74 65 78 74 20 2a 70 43 74 78 20 3d 20 28 70  ntext *pCtx = (p
2b720 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65  roxyLockingConte
2b730 78 74 20 2a 29 70 46 69 6c 65 2d 3e 6c 6f 63 6b  xt *)pFile->lock
2b740 69 6e 67 43 6f 6e 74 65 78 74 3b 20 0a 20 20 75  ingContext; .  u
2b750 6e 69 78 46 69 6c 65 20 2a 63 6f 6e 63 68 46 69  nixFile *conchFi
2b760 6c 65 20 3d 20 70 43 74 78 2d 3e 63 6f 6e 63 68  le = pCtx->conch
2b770 46 69 6c 65 3b 0a 20 20 69 6e 74 20 72 63 20 3d  File;.  int rc =
2b780 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e   SQLITE_OK;.  in
2b790 74 20 6e 54 72 69 65 73 20 3d 20 30 3b 0a 20 20  t nTries = 0;.  
2b7a0 73 74 72 75 63 74 20 74 69 6d 65 73 70 65 63 20  struct timespec 
2b7b0 63 6f 6e 63 68 4d 6f 64 54 69 6d 65 3b 0a 20 20  conchModTime;.  
2b7c0 0a 20 20 64 6f 20 7b 0a 20 20 20 20 72 63 20 3d  .  do {.    rc =
2b7d0 20 63 6f 6e 63 68 46 69 6c 65 2d 3e 70 4d 65 74   conchFile->pMet
2b7e0 68 6f 64 2d 3e 78 4c 6f 63 6b 28 28 73 71 6c 69  hod->xLock((sqli
2b7f0 74 65 33 5f 66 69 6c 65 2a 29 63 6f 6e 63 68 46  te3_file*)conchF
2b800 69 6c 65 2c 20 6c 6f 63 6b 54 79 70 65 29 3b 0a  ile, lockType);.
2b810 20 20 20 20 6e 54 72 69 65 73 20 2b 2b 3b 0a 20      nTries ++;. 
2b820 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
2b830 45 5f 42 55 53 59 20 29 7b 0a 20 20 20 20 20 20  E_BUSY ){.      
2b840 2f 2a 20 49 66 20 74 68 65 20 6c 6f 63 6b 20 66  /* If the lock f
2b850 61 69 6c 65 64 20 28 62 75 73 79 29 3a 0a 20 20  ailed (busy):.  
2b860 20 20 20 20 20 2a 20 31 73 74 20 74 72 79 3a 20       * 1st try: 
2b870 67 65 74 20 74 68 65 20 6d 6f 64 20 74 69 6d 65  get the mod time
2b880 20 6f 66 20 74 68 65 20 63 6f 6e 63 68 2c 20 77   of the conch, w
2b890 61 69 74 20 30 2e 35 73 20 61 6e 64 20 74 72 79  ait 0.5s and try
2b8a0 20 61 67 61 69 6e 2e 20 0a 20 20 20 20 20 20 20   again. .       
2b8b0 2a 20 32 6e 64 20 74 72 79 3a 20 66 61 69 6c 20  * 2nd try: fail 
2b8c0 69 66 20 74 68 65 20 6d 6f 64 20 74 69 6d 65 20  if the mod time 
2b8d0 63 68 61 6e 67 65 64 20 6f 72 20 68 6f 73 74 20  changed or host 
2b8e0 69 64 20 69 73 20 64 69 66 66 65 72 65 6e 74 2c  id is different,
2b8f0 20 77 61 69 74 20 0a 20 20 20 20 20 20 20 2a 20   wait .       * 
2b900 20 20 20 20 20 20 20 20 20 20 31 30 20 73 65 63            10 sec
2b910 20 61 6e 64 20 74 72 79 20 61 67 61 69 6e 0a 20   and try again. 
2b920 20 20 20 20 20 20 2a 20 33 72 64 20 74 72 79 3a        * 3rd try:
2b930 20 62 72 65 61 6b 20 74 68 65 20 6c 6f 63 6b 20   break the lock 
2b940 75 6e 6c 65 73 73 20 74 68 65 20 6d 6f 64 20 74  unless the mod t
2b950 69 6d 65 20 68 61 73 20 63 68 61 6e 67 65 64 2e  ime has changed.
2b960 0a 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  .       */.     
2b970 20 73 74 72 75 63 74 20 73 74 61 74 20 62 75 66   struct stat buf
2b980 3b 0a 20 20 20 20 20 20 69 66 28 20 66 73 74 61  ;.      if( fsta
2b990 74 28 63 6f 6e 63 68 46 69 6c 65 2d 3e 68 2c 20  t(conchFile->h, 
2b9a0 26 62 75 66 29 20 29 7b 0a 20 20 20 20 20 20 20  &buf) ){.       
2b9b0 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e   pFile->lastErrn
2b9c0 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20  o = errno;.     
2b9d0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
2b9e0 5f 49 4f 45 52 52 5f 4c 4f 43 4b 3b 0a 20 20 20  _IOERR_LOCK;.   
2b9f0 20 20 20 7d 0a 20 20 20 20 20 20 0a 20 20 20 20     }.      .    
2ba00 20 20 69 66 28 20 6e 54 72 69 65 73 3d 3d 31 20    if( nTries==1 
2ba10 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 6e 63 68  ){.        conch
2ba20 4d 6f 64 54 69 6d 65 20 3d 20 62 75 66 2e 73 74  ModTime = buf.st
2ba30 5f 6d 74 69 6d 65 73 70 65 63 3b 0a 20 20 20 20  _mtimespec;.    
2ba40 20 20 20 20 75 73 6c 65 65 70 28 35 30 30 30 30      usleep(50000
2ba50 30 29 3b 20 2f 2a 20 77 61 69 74 20 30 2e 35 20  0); /* wait 0.5 
2ba60 73 65 63 20 61 6e 64 20 74 72 79 20 74 68 65 20  sec and try the 
2ba70 6c 6f 63 6b 20 61 67 61 69 6e 2a 2f 0a 20 20 20  lock again*/.   
2ba80 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 20 20       continue;  
2ba90 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
2baa0 61 73 73 65 72 74 28 20 6e 54 72 69 65 73 3e 31  assert( nTries>1
2bab0 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 63 6f   );.      if( co
2bac0 6e 63 68 4d 6f 64 54 69 6d 65 2e 74 76 5f 73 65  nchModTime.tv_se
2bad0 63 20 21 3d 20 62 75 66 2e 73 74 5f 6d 74 69 6d  c != buf.st_mtim
2bae0 65 73 70 65 63 2e 74 76 5f 73 65 63 20 7c 7c 20  espec.tv_sec || 
2baf0 0a 20 20 20 20 20 20 20 20 20 63 6f 6e 63 68 4d  .         conchM
2bb00 6f 64 54 69 6d 65 2e 74 76 5f 6e 73 65 63 20 21  odTime.tv_nsec !
2bb10 3d 20 62 75 66 2e 73 74 5f 6d 74 69 6d 65 73 70  = buf.st_mtimesp
2bb20 65 63 2e 74 76 5f 6e 73 65 63 20 29 7b 0a 20 20  ec.tv_nsec ){.  
2bb30 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
2bb40 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 20 20  ITE_BUSY;.      
2bb50 7d 0a 20 20 20 20 20 20 0a 20 20 20 20 20 20 69  }.      .      i
2bb60 66 28 20 6e 54 72 69 65 73 3d 3d 32 20 29 7b 20  f( nTries==2 ){ 
2bb70 20 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 74   .        char t
2bb80 42 75 66 5b 50 52 4f 58 59 5f 4d 41 58 43 4f 4e  Buf[PROXY_MAXCON
2bb90 43 48 4c 45 4e 5d 3b 0a 20 20 20 20 20 20 20 20  CHLEN];.        
2bba0 69 6e 74 20 6c 65 6e 20 3d 20 70 72 65 61 64 28  int len = pread(
2bbb0 63 6f 6e 63 68 46 69 6c 65 2d 3e 68 2c 20 74 42  conchFile->h, tB
2bbc0 75 66 2c 20 50 52 4f 58 59 5f 4d 41 58 43 4f 4e  uf, PROXY_MAXCON
2bbd0 43 48 4c 45 4e 2c 20 30 29 3b 0a 20 20 20 20 20  CHLEN, 0);.     
2bbe0 20 20 20 69 66 28 20 6c 65 6e 3c 30 20 29 7b 0a     if( len<0 ){.
2bbf0 20 20 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d            pFile-
2bc00 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 65 72 72  >lastErrno = err
2bc10 6e 6f 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65  no;.          re
2bc20 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52  turn SQLITE_IOER
2bc30 52 5f 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 20 20  R_LOCK;.        
2bc40 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 6c 65  }.        if( le
2bc50 6e 3e 50 52 4f 58 59 5f 50 41 54 48 49 4e 44 45  n>PROXY_PATHINDE
2bc60 58 20 26 26 20 74 42 75 66 5b 30 5d 3d 3d 28 63  X && tBuf[0]==(c
2bc70 68 61 72 29 50 52 4f 58 59 5f 43 4f 4e 43 48 56  har)PROXY_CONCHV
2bc80 45 52 53 49 4f 4e 29 7b 0a 20 20 20 20 20 20 20  ERSION){.       
2bc90 20 20 20 2f 2a 20 64 6f 6e 27 74 20 62 72 65 61     /* don't brea
2bca0 6b 20 74 68 65 20 6c 6f 63 6b 20 69 66 20 74 68  k the lock if th
2bcb0 65 20 68 6f 73 74 20 69 64 20 64 6f 65 73 6e 27  e host id doesn'
2bcc0 74 20 6d 61 74 63 68 20 2a 2f 0a 20 20 20 20 20  t match */.     
2bcd0 20 20 20 20 20 69 66 28 20 30 21 3d 6d 65 6d 63       if( 0!=memc
2bce0 6d 70 28 26 74 42 75 66 5b 50 52 4f 58 59 5f 48  mp(&tBuf[PROXY_H
2bcf0 45 41 44 45 52 4c 45 4e 5d 2c 20 6d 79 48 6f 73  EADERLEN], myHos
2bd00 74 49 44 2c 20 50 52 4f 58 59 5f 48 4f 53 54 49  tID, PROXY_HOSTI
2bd10 44 4c 45 4e 29 20 29 7b 0a 20 20 20 20 20 20 20  DLEN) ){.       
2bd20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
2bd30 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 20 20 20  TE_BUSY;.       
2bd40 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 65 6c     }.        }el
2bd50 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a  se{.          /*
2bd60 20 64 6f 6e 27 74 20 62 72 65 61 6b 20 74 68 65   don't break the
2bd70 20 6c 6f 63 6b 20 6f 6e 20 73 68 6f 72 74 20 72   lock on short r
2bd80 65 61 64 20 6f 72 20 61 20 76 65 72 73 69 6f 6e  ead or a version
2bd90 20 6d 69 73 6d 61 74 63 68 20 2a 2f 0a 20 20 20   mismatch */.   
2bda0 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51         return SQ
2bdb0 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 20  LITE_BUSY;.     
2bdc0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 75 73 6c     }.        usl
2bdd0 65 65 70 28 31 30 30 30 30 30 30 30 29 3b 20 2f  eep(10000000); /
2bde0 2a 20 77 61 69 74 20 31 30 20 73 65 63 20 61 6e  * wait 10 sec an
2bdf0 64 20 74 72 79 20 74 68 65 20 6c 6f 63 6b 20 61  d try the lock a
2be00 67 61 69 6e 20 2a 2f 0a 20 20 20 20 20 20 20 20  gain */.        
2be10 63 6f 6e 74 69 6e 75 65 3b 20 0a 20 20 20 20 20  continue; .     
2be20 20 7d 0a 20 20 20 20 20 20 0a 20 20 20 20 20 20   }.      .      
2be30 61 73 73 65 72 74 28 20 6e 54 72 69 65 73 3d 3d  assert( nTries==
2be40 33 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 30  3 );.      if( 0
2be50 3d 3d 70 72 6f 78 79 42 72 65 61 6b 43 6f 6e 63  ==proxyBreakConc
2be60 68 4c 6f 63 6b 28 70 46 69 6c 65 2c 20 6d 79 48  hLock(pFile, myH
2be70 6f 73 74 49 44 29 20 29 7b 0a 20 20 20 20 20 20  ostID) ){.      
2be80 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b    rc = SQLITE_OK
2be90 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 6c 6f  ;.        if( lo
2bea0 63 6b 54 79 70 65 3d 3d 45 58 43 4c 55 53 49 56  ckType==EXCLUSIV
2beb0 45 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 20 20  E_LOCK ){.      
2bec0 20 20 20 20 72 63 20 3d 20 63 6f 6e 63 68 46 69      rc = conchFi
2bed0 6c 65 2d 3e 70 4d 65 74 68 6f 64 2d 3e 78 4c 6f  le->pMethod->xLo
2bee0 63 6b 28 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  ck((sqlite3_file
2bef0 2a 29 63 6f 6e 63 68 46 69 6c 65 2c 20 53 48 41  *)conchFile, SHA
2bf00 52 45 44 5f 4c 4f 43 4b 29 3b 20 20 20 20 20 20  RED_LOCK);      
2bf10 20 20 20 20 0a 20 20 20 20 20 20 20 20 7d 0a 20      .        }. 
2bf20 20 20 20 20 20 20 20 69 66 28 20 21 72 63 20 29         if( !rc )
2bf30 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  {.          rc =
2bf40 20 63 6f 6e 63 68 46 69 6c 65 2d 3e 70 4d 65 74   conchFile->pMet
2bf50 68 6f 64 2d 3e 78 4c 6f 63 6b 28 28 73 71 6c 69  hod->xLock((sqli
2bf60 74 65 33 5f 66 69 6c 65 2a 29 63 6f 6e 63 68 46  te3_file*)conchF
2bf70 69 6c 65 2c 20 6c 6f 63 6b 54 79 70 65 29 3b 0a  ile, lockType);.
2bf80 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2bf90 7d 0a 20 20 20 20 7d 0a 20 20 7d 20 77 68 69 6c  }.    }.  } whil
2bfa0 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 42 55  e( rc==SQLITE_BU
2bfb0 53 59 20 26 26 20 6e 54 72 69 65 73 3c 33 20 29  SY && nTries<3 )
2bfc0 3b 0a 20 20 0a 20 20 72 65 74 75 72 6e 20 72 63  ;.  .  return rc
2bfd0 3b 0a 7d 0a 0a 2f 2a 20 54 61 6b 65 73 20 74 68  ;.}../* Takes th
2bfe0 65 20 63 6f 6e 63 68 20 62 79 20 74 61 6b 69 6e  e conch by takin
2bff0 67 20 61 20 73 68 61 72 65 64 20 6c 6f 63 6b 20  g a shared lock 
2c000 61 6e 64 20 72 65 61 64 20 74 68 65 20 63 6f 6e  and read the con
2c010 74 65 6e 74 73 20 63 6f 6e 63 68 2c 20 69 66 20  tents conch, if 
2c020 0a 2a 2a 20 6c 6f 63 6b 50 61 74 68 20 69 73 20  .** lockPath is 
2c030 6e 6f 6e 2d 4e 55 4c 4c 2c 20 74 68 65 20 68 6f  non-NULL, the ho
2c040 73 74 20 49 44 20 61 6e 64 20 6c 6f 63 6b 20 66  st ID and lock f
2c050 69 6c 65 20 70 61 74 68 20 6d 75 73 74 20 6d 61  ile path must ma
2c060 74 63 68 2e 20 20 41 20 4e 55 4c 4c 20 0a 2a 2a  tch.  A NULL .**
2c070 20 6c 6f 63 6b 50 61 74 68 20 6d 65 61 6e 73 20   lockPath means 
2c080 74 68 61 74 20 74 68 65 20 6c 6f 63 6b 50 61 74  that the lockPat
2c090 68 20 69 6e 20 74 68 65 20 63 6f 6e 63 68 20 66  h in the conch f
2c0a0 69 6c 65 20 77 69 6c 6c 20 62 65 20 75 73 65 64  ile will be used
2c0b0 20 69 66 20 74 68 65 20 0a 2a 2a 20 68 6f 73 74   if the .** host
2c0c0 20 49 44 73 20 6d 61 74 63 68 2c 20 6f 72 20 61   IDs match, or a
2c0d0 20 6e 65 77 20 6c 6f 63 6b 20 70 61 74 68 20 77   new lock path w
2c0e0 69 6c 6c 20 62 65 20 67 65 6e 65 72 61 74 65 64  ill be generated
2c0f0 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 0a   automatically .
2c100 2a 2a 20 61 6e 64 20 77 72 69 74 74 65 6e 20 74  ** and written t
2c110 6f 20 74 68 65 20 63 6f 6e 63 68 20 66 69 6c 65  o the conch file
2c120 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
2c130 70 72 6f 78 79 54 61 6b 65 43 6f 6e 63 68 28 75  proxyTakeConch(u
2c140 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 29 7b  nixFile *pFile){
2c150 0a 20 20 70 72 6f 78 79 4c 6f 63 6b 69 6e 67 43  .  proxyLockingC
2c160 6f 6e 74 65 78 74 20 2a 70 43 74 78 20 3d 20 28  ontext *pCtx = (
2c170 70 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74  proxyLockingCont
2c180 65 78 74 20 2a 29 70 46 69 6c 65 2d 3e 6c 6f 63  ext *)pFile->loc
2c190 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 20 0a 20 20  kingContext; .  
2c1a0 0a 20 20 69 66 28 20 70 43 74 78 2d 3e 63 6f 6e  .  if( pCtx->con
2c1b0 63 68 48 65 6c 64 21 3d 30 20 29 7b 0a 20 20 20  chHeld!=0 ){.   
2c1c0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
2c1d0 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  K;.  }else{.    
2c1e0 75 6e 69 78 46 69 6c 65 20 2a 63 6f 6e 63 68 46  unixFile *conchF
2c1f0 69 6c 65 20 3d 20 70 43 74 78 2d 3e 63 6f 6e 63  ile = pCtx->conc
2c200 68 46 69 6c 65 3b 0a 20 20 20 20 75 75 69 64 5f  hFile;.    uuid_
2c210 74 20 6d 79 48 6f 73 74 49 44 3b 0a 20 20 20 20  t myHostID;.    
2c220 69 6e 74 20 70 45 72 72 6f 72 20 3d 20 30 3b 0a  int pError = 0;.
2c230 20 20 20 20 63 68 61 72 20 72 65 61 64 42 75 66      char readBuf
2c240 5b 50 52 4f 58 59 5f 4d 41 58 43 4f 4e 43 48 4c  [PROXY_MAXCONCHL
2c250 45 4e 5d 3b 0a 20 20 20 20 63 68 61 72 20 6c 6f  EN];.    char lo
2c260 63 6b 50 61 74 68 5b 4d 41 58 50 41 54 48 4c 45  ckPath[MAXPATHLE
2c270 4e 5d 3b 0a 20 20 20 20 63 68 61 72 20 2a 74 65  N];.    char *te
2c280 6d 70 4c 6f 63 6b 50 61 74 68 20 3d 20 4e 55 4c  mpLockPath = NUL
2c290 4c 3b 0a 20 20 20 20 69 6e 74 20 72 63 20 3d 20  L;.    int rc = 
2c2a0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 69  SQLITE_OK;.    i
2c2b0 6e 74 20 63 72 65 61 74 65 43 6f 6e 63 68 20 3d  nt createConch =
2c2c0 20 30 3b 0a 20 20 20 20 69 6e 74 20 68 6f 73 74   0;.    int host
2c2d0 49 64 4d 61 74 63 68 20 3d 20 30 3b 0a 20 20 20  IdMatch = 0;.   
2c2e0 20 69 6e 74 20 72 65 61 64 4c 65 6e 20 3d 20 30   int readLen = 0
2c2f0 3b 0a 20 20 20 20 69 6e 74 20 74 72 79 4f 6c 64  ;.    int tryOld
2c300 4c 6f 63 6b 50 61 74 68 20 3d 20 30 3b 0a 20 20  LockPath = 0;.  
2c310 20 20 69 6e 74 20 66 6f 72 63 65 4e 65 77 4c 6f    int forceNewLo
2c320 63 6b 50 61 74 68 20 3d 20 30 3b 0a 20 20 20 20  ckPath = 0;.    
2c330 0a 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 54  .    OSTRACE(("T
2c340 41 4b 45 43 4f 4e 43 48 20 20 25 64 20 66 6f 72  AKECONCH  %d for
2c350 20 25 73 20 70 69 64 3d 25 64 5c 6e 22 2c 20 63   %s pid=%d\n", c
2c360 6f 6e 63 68 46 69 6c 65 2d 3e 68 2c 0a 20 20 20  onchFile->h,.   
2c370 20 20 20 20 20 20 20 20 20 20 28 70 43 74 78 2d            (pCtx-
2c380 3e 6c 6f 63 6b 50 72 6f 78 79 50 61 74 68 20 3f  >lockProxyPath ?
2c390 20 70 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79   pCtx->lockProxy
2c3a0 50 61 74 68 20 3a 20 22 3a 61 75 74 6f 3a 22 29  Path : ":auto:")
2c3b0 2c 20 67 65 74 70 69 64 28 29 29 29 3b 0a 0a 20  , getpid()));.. 
2c3c0 20 20 20 72 63 20 3d 20 70 72 6f 78 79 47 65 74     rc = proxyGet
2c3d0 48 6f 73 74 49 44 28 6d 79 48 6f 73 74 49 44 2c  HostID(myHostID,
2c3e0 20 26 70 45 72 72 6f 72 29 3b 0a 20 20 20 20 69   &pError);.    i
2c3f0 66 28 20 28 72 63 26 30 78 66 66 29 3d 3d 53 51  f( (rc&0xff)==SQ
2c400 4c 49 54 45 5f 49 4f 45 52 52 20 29 7b 0a 20 20  LITE_IOERR ){.  
2c410 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45      pFile->lastE
2c420 72 72 6e 6f 20 3d 20 70 45 72 72 6f 72 3b 0a 20  rrno = pError;. 
2c430 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 74 61       goto end_ta
2c440 6b 65 63 6f 6e 63 68 3b 0a 20 20 20 20 7d 0a 20  keconch;.    }. 
2c450 20 20 20 72 63 20 3d 20 70 72 6f 78 79 43 6f 6e     rc = proxyCon
2c460 63 68 4c 6f 63 6b 28 70 46 69 6c 65 2c 20 6d 79  chLock(pFile, my
2c470 48 6f 73 74 49 44 2c 20 53 48 41 52 45 44 5f 4c  HostID, SHARED_L
2c480 4f 43 4b 29 3b 0a 20 20 20 20 69 66 28 20 72 63  OCK);.    if( rc
2c490 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
2c4a0 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 74 61       goto end_ta
2c4b0 6b 65 63 6f 6e 63 68 3b 0a 20 20 20 20 7d 0a 20  keconch;.    }. 
2c4c0 20 20 20 2f 2a 20 72 65 61 64 20 74 68 65 20 65     /* read the e
2c4d0 78 69 73 74 69 6e 67 20 63 6f 6e 63 68 20 66 69  xisting conch fi
2c4e0 6c 65 20 2a 2f 0a 20 20 20 20 72 65 61 64 4c 65  le */.    readLe
2c4f0 6e 20 3d 20 73 65 65 6b 41 6e 64 52 65 61 64 28  n = seekAndRead(
2c500 28 75 6e 69 78 46 69 6c 65 2a 29 63 6f 6e 63 68  (unixFile*)conch
2c510 46 69 6c 65 2c 20 30 2c 20 72 65 61 64 42 75 66  File, 0, readBuf
2c520 2c 20 50 52 4f 58 59 5f 4d 41 58 43 4f 4e 43 48  , PROXY_MAXCONCH
2c530 4c 45 4e 29 3b 0a 20 20 20 20 69 66 28 20 72 65  LEN);.    if( re
2c540 61 64 4c 65 6e 3c 30 20 29 7b 0a 20 20 20 20 20  adLen<0 ){.     
2c550 20 2f 2a 20 49 2f 4f 20 65 72 72 6f 72 3a 20 6c   /* I/O error: l
2c560 61 73 74 45 72 72 6e 6f 20 73 65 74 20 62 79 20  astErrno set by 
2c570 73 65 65 6b 41 6e 64 52 65 61 64 20 2a 2f 0a 20  seekAndRead */. 
2c580 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74       pFile->last
2c590 45 72 72 6e 6f 20 3d 20 63 6f 6e 63 68 46 69 6c  Errno = conchFil
2c5a0 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 3b 0a 20 20  e->lastErrno;.  
2c5b0 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
2c5c0 49 4f 45 52 52 5f 52 45 41 44 3b 0a 20 20 20 20  IOERR_READ;.    
2c5d0 20 20 67 6f 74 6f 20 65 6e 64 5f 74 61 6b 65 63    goto end_takec
2c5e0 6f 6e 63 68 3b 0a 20 20 20 20 7d 65 6c 73 65 20  onch;.    }else 
2c5f0 69 66 28 20 72 65 61 64 4c 65 6e 3c 3d 28 50 52  if( readLen<=(PR
2c600 4f 58 59 5f 48 45 41 44 45 52 4c 45 4e 2b 50 52  OXY_HEADERLEN+PR
2c610 4f 58 59 5f 48 4f 53 54 49 44 4c 45 4e 29 20 7c  OXY_HOSTIDLEN) |
2c620 7c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  | .             
2c630 72 65 61 64 42 75 66 5b 30 5d 21 3d 28 63 68 61  readBuf[0]!=(cha
2c640 72 29 50 52 4f 58 59 5f 43 4f 4e 43 48 56 45 52  r)PROXY_CONCHVER
2c650 53 49 4f 4e 20 29 7b 0a 20 20 20 20 20 20 2f 2a  SION ){.      /*
2c660 20 61 20 73 68 6f 72 74 20 72 65 61 64 20 6f 72   a short read or
2c670 20 76 65 72 73 69 6f 6e 20 66 6f 72 6d 61 74 20   version format 
2c680 6d 69 73 6d 61 74 63 68 20 6d 65 61 6e 73 20 77  mismatch means w
2c690 65 20 6e 65 65 64 20 74 6f 20 63 72 65 61 74 65  e need to create
2c6a0 20 61 20 6e 65 77 20 0a 20 20 20 20 20 20 2a 2a   a new .      **
2c6b0 20 63 6f 6e 63 68 20 66 69 6c 65 2e 20 0a 20 20   conch file. .  
2c6c0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 63 72 65      */.      cre
2c6d0 61 74 65 43 6f 6e 63 68 20 3d 20 31 3b 0a 20 20  ateConch = 1;.  
2c6e0 20 20 7d 0a 20 20 20 20 2f 2a 20 69 66 20 74 68    }.    /* if th
2c6f0 65 20 68 6f 73 74 20 69 64 20 6d 61 74 63 68 65  e host id matche
2c700 73 20 61 6e 64 20 74 68 65 20 6c 6f 63 6b 20 70  s and the lock p
2c710 61 74 68 20 61 6c 72 65 61 64 79 20 65 78 69 73  ath already exis
2c720 74 73 20 69 6e 20 74 68 65 20 63 6f 6e 63 68 0a  ts in the conch.
2c730 20 20 20 20 2a 2a 20 77 65 27 6c 6c 20 74 72 79      ** we'll try
2c740 20 74 6f 20 75 73 65 20 74 68 65 20 70 61 74 68   to use the path
2c750 20 74 68 65 72 65 2c 20 69 66 20 77 65 20 63 61   there, if we ca
2c760 6e 27 74 20 6f 70 65 6e 20 74 68 61 74 20 70 61  n't open that pa
2c770 74 68 2c 20 77 65 27 6c 6c 20 0a 20 20 20 20 2a  th, we'll .    *
2c780 2a 20 72 65 74 72 79 20 77 69 74 68 20 61 20 6e  * retry with a n
2c790 65 77 20 61 75 74 6f 2d 67 65 6e 65 72 61 74 65  ew auto-generate
2c7a0 64 20 70 61 74 68 20 0a 20 20 20 20 2a 2f 0a 20  d path .    */. 
2c7b0 20 20 20 64 6f 20 7b 20 2f 2a 20 69 6e 20 63 61     do { /* in ca
2c7c0 73 65 20 77 65 20 6e 65 65 64 20 74 6f 20 74 72  se we need to tr
2c7d0 79 20 61 67 61 69 6e 20 66 6f 72 20 61 6e 20 3a  y again for an :
2c7e0 61 75 74 6f 3a 20 6e 61 6d 65 64 20 6c 6f 63 6b  auto: named lock
2c7f0 20 66 69 6c 65 20 2a 2f 0a 0a 20 20 20 20 20 20   file */..      
2c800 69 66 28 20 21 63 72 65 61 74 65 43 6f 6e 63 68  if( !createConch
2c810 20 26 26 20 21 66 6f 72 63 65 4e 65 77 4c 6f 63   && !forceNewLoc
2c820 6b 50 61 74 68 20 29 7b 0a 20 20 20 20 20 20 20  kPath ){.       
2c830 20 68 6f 73 74 49 64 4d 61 74 63 68 20 3d 20 21   hostIdMatch = !
2c840 6d 65 6d 63 6d 70 28 26 72 65 61 64 42 75 66 5b  memcmp(&readBuf[
2c850 50 52 4f 58 59 5f 48 45 41 44 45 52 4c 45 4e 5d  PROXY_HEADERLEN]
2c860 2c 20 6d 79 48 6f 73 74 49 44 2c 20 0a 20 20 20  , myHostID, .   
2c870 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c880 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 50                 P
2c890 52 4f 58 59 5f 48 4f 53 54 49 44 4c 45 4e 29 3b  ROXY_HOSTIDLEN);
2c8a0 0a 20 20 20 20 20 20 20 20 2f 2a 20 69 66 20 74  .        /* if t
2c8b0 68 65 20 63 6f 6e 63 68 20 68 61 73 20 64 61 74  he conch has dat
2c8c0 61 20 63 6f 6d 70 61 72 65 20 74 68 65 20 63 6f  a compare the co
2c8d0 6e 74 65 6e 74 73 20 2a 2f 0a 20 20 20 20 20 20  ntents */.      
2c8e0 20 20 69 66 28 20 21 70 43 74 78 2d 3e 6c 6f 63    if( !pCtx->loc
2c8f0 6b 50 72 6f 78 79 50 61 74 68 20 29 7b 0a 20 20  kProxyPath ){.  
2c900 20 20 20 20 20 20 20 20 2f 2a 20 66 6f 72 20 61          /* for a
2c910 75 74 6f 2d 6e 61 6d 65 64 20 6c 6f 63 61 6c 20  uto-named local 
2c920 6c 6f 63 6b 20 66 69 6c 65 2c 20 6a 75 73 74 20  lock file, just 
2c930 63 68 65 63 6b 20 74 68 65 20 68 6f 73 74 20 49  check the host I
2c940 44 20 61 6e 64 20 77 65 27 6c 6c 0a 20 20 20 20  D and we'll.    
2c950 20 20 20 20 20 20 20 2a 2a 20 75 73 65 20 74 68         ** use th
2c960 65 20 6c 6f 63 61 6c 20 6c 6f 63 6b 20 66 69 6c  e local lock fil
2c970 65 20 70 61 74 68 20 74 68 61 74 27 73 20 61 6c  e path that's al
2c980 72 65 61 64 79 20 69 6e 20 74 68 65 72 65 0a 20  ready in there. 
2c990 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20            */.   
2c9a0 20 20 20 20 20 20 20 69 66 28 20 68 6f 73 74 49         if( hostI
2c9b0 64 4d 61 74 63 68 20 29 7b 0a 20 20 20 20 20 20  dMatch ){.      
2c9c0 20 20 20 20 20 20 73 69 7a 65 5f 74 20 70 61 74        size_t pat
2c9d0 68 4c 65 6e 20 3d 20 28 72 65 61 64 4c 65 6e 20  hLen = (readLen 
2c9e0 2d 20 50 52 4f 58 59 5f 50 41 54 48 49 4e 44 45  - PROXY_PATHINDE
2c9f0 58 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  X);.            
2ca00 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
2ca10 20 70 61 74 68 4c 65 6e 3e 3d 4d 41 58 50 41 54   pathLen>=MAXPAT
2ca20 48 4c 45 4e 20 29 7b 0a 20 20 20 20 20 20 20 20  HLEN ){.        
2ca30 20 20 20 20 20 20 70 61 74 68 4c 65 6e 3d 4d 41        pathLen=MA
2ca40 58 50 41 54 48 4c 45 4e 2d 31 3b 0a 20 20 20 20  XPATHLEN-1;.    
2ca50 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2ca60 20 20 20 20 20 20 6d 65 6d 63 70 79 28 6c 6f 63        memcpy(loc
2ca70 6b 50 61 74 68 2c 20 26 72 65 61 64 42 75 66 5b  kPath, &readBuf[
2ca80 50 52 4f 58 59 5f 50 41 54 48 49 4e 44 45 58 5d  PROXY_PATHINDEX]
2ca90 2c 20 70 61 74 68 4c 65 6e 29 3b 0a 20 20 20 20  , pathLen);.    
2caa0 20 20 20 20 20 20 20 20 6c 6f 63 6b 50 61 74 68          lockPath
2cab0 5b 70 61 74 68 4c 65 6e 5d 20 3d 20 30 3b 0a 20  [pathLen] = 0;. 
2cac0 20 20 20 20 20 20 20 20 20 20 20 74 65 6d 70 4c             tempL
2cad0 6f 63 6b 50 61 74 68 20 3d 20 6c 6f 63 6b 50 61  ockPath = lockPa
2cae0 74 68 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  th;.            
2caf0 74 72 79 4f 6c 64 4c 6f 63 6b 50 61 74 68 20 3d  tryOldLockPath =
2cb00 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   1;.            
2cb10 2f 2a 20 63 72 65 61 74 65 20 61 20 63 6f 70 79  /* create a copy
2cb20 20 6f 66 20 74 68 65 20 6c 6f 63 6b 20 70 61 74   of the lock pat
2cb30 68 20 69 66 20 74 68 65 20 63 6f 6e 63 68 20 69  h if the conch i
2cb40 73 20 74 61 6b 65 6e 20 2a 2f 0a 20 20 20 20 20  s taken */.     
2cb50 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f         goto end_
2cb60 74 61 6b 65 63 6f 6e 63 68 3b 0a 20 20 20 20 20  takeconch;.     
2cb70 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
2cb80 65 6c 73 65 20 69 66 28 20 68 6f 73 74 49 64 4d  else if( hostIdM
2cb90 61 74 63 68 0a 20 20 20 20 20 20 20 20 20 20 20  atch.           
2cba0 20 20 20 20 26 26 20 21 73 74 72 6e 63 6d 70 28      && !strncmp(
2cbb0 70 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 50  pCtx->lockProxyP
2cbc0 61 74 68 2c 20 26 72 65 61 64 42 75 66 5b 50 52  ath, &readBuf[PR
2cbd0 4f 58 59 5f 50 41 54 48 49 4e 44 45 58 5d 2c 0a  OXY_PATHINDEX],.
2cbe0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2cbf0 20 20 20 20 20 20 20 20 20 20 20 72 65 61 64 4c             readL
2cc00 65 6e 2d 50 52 4f 58 59 5f 50 41 54 48 49 4e 44  en-PROXY_PATHIND
2cc10 45 58 29 0a 20 20 20 20 20 20 20 20 29 7b 0a 20  EX).        ){. 
2cc20 20 20 20 20 20 20 20 20 20 2f 2a 20 63 6f 6e 63           /* conc
2cc30 68 20 68 6f 73 74 20 61 6e 64 20 6c 6f 63 6b 20  h host and lock 
2cc40 70 61 74 68 20 6d 61 74 63 68 20 2a 2f 0a 20 20  path match */.  
2cc50 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64          goto end
2cc60 5f 74 61 6b 65 63 6f 6e 63 68 3b 20 0a 20 20 20  _takeconch; .   
2cc70 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
2cc80 20 20 20 20 20 0a 20 20 20 20 20 20 2f 2a 20 69       .      /* i
2cc90 66 20 74 68 65 20 63 6f 6e 63 68 20 69 73 6e 27  f the conch isn'
2cca0 74 20 77 72 69 74 61 62 6c 65 20 61 6e 64 20 64  t writable and d
2ccb0 6f 65 73 6e 27 74 20 6d 61 74 63 68 2c 20 77 65  oesn't match, we
2ccc0 20 63 61 6e 27 74 20 74 61 6b 65 20 69 74 20 2a   can't take it *
2ccd0 2f 0a 20 20 20 20 20 20 69 66 28 20 28 63 6f 6e  /.      if( (con
2cce0 63 68 46 69 6c 65 2d 3e 6f 70 65 6e 46 6c 61 67  chFile->openFlag
2ccf0 73 26 4f 5f 52 44 57 52 29 20 3d 3d 20 30 20 29  s&O_RDWR) == 0 )
2cd00 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53  {.        rc = S
2cd10 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20  QLITE_BUSY;.    
2cd20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 74 61 6b      goto end_tak
2cd30 65 63 6f 6e 63 68 3b 0a 20 20 20 20 20 20 7d 0a  econch;.      }.
2cd40 20 20 20 20 20 20 0a 20 20 20 20 20 20 2f 2a 20        .      /* 
2cd50 65 69 74 68 65 72 20 74 68 65 20 63 6f 6e 63 68  either the conch
2cd60 20 64 69 64 6e 27 74 20 6d 61 74 63 68 20 6f 72   didn't match or
2cd70 20 77 65 20 6e 65 65 64 20 74 6f 20 63 72 65 61   we need to crea
2cd80 74 65 20 61 20 6e 65 77 20 6f 6e 65 20 2a 2f 0a  te a new one */.
2cd90 20 20 20 20 20 20 69 66 28 20 21 70 43 74 78 2d        if( !pCtx-
2cda0 3e 6c 6f 63 6b 50 72 6f 78 79 50 61 74 68 20 29  >lockProxyPath )
2cdb0 7b 0a 20 20 20 20 20 20 20 20 70 72 6f 78 79 47  {.        proxyG
2cdc0 65 74 4c 6f 63 6b 50 61 74 68 28 70 43 74 78 2d  etLockPath(pCtx-
2cdd0 3e 64 62 50 61 74 68 2c 20 6c 6f 63 6b 50 61 74  >dbPath, lockPat
2cde0 68 2c 20 4d 41 58 50 41 54 48 4c 45 4e 29 3b 0a  h, MAXPATHLEN);.
2cdf0 20 20 20 20 20 20 20 20 74 65 6d 70 4c 6f 63 6b          tempLock
2ce00 50 61 74 68 20 3d 20 6c 6f 63 6b 50 61 74 68 3b  Path = lockPath;
2ce10 0a 20 20 20 20 20 20 20 20 2f 2a 20 63 72 65 61  .        /* crea
2ce20 74 65 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65  te a copy of the
2ce30 20 6c 6f 63 6b 20 70 61 74 68 20 5f 6f 6e 6c 79   lock path _only
2ce40 5f 20 69 66 20 74 68 65 20 63 6f 6e 63 68 20 69  _ if the conch i
2ce50 73 20 74 61 6b 65 6e 20 2a 2f 0a 20 20 20 20 20  s taken */.     
2ce60 20 7d 0a 20 20 20 20 20 20 0a 20 20 20 20 20 20   }.      .      
2ce70 2f 2a 20 75 70 64 61 74 65 20 63 6f 6e 63 68 20  /* update conch 
2ce80 77 69 74 68 20 68 6f 73 74 20 61 6e 64 20 70 61  with host and pa
2ce90 74 68 20 28 74 68 69 73 20 77 69 6c 6c 20 66 61  th (this will fa
2cea0 69 6c 20 69 66 20 6f 74 68 65 72 20 70 72 6f 63  il if other proc
2ceb0 65 73 73 0a 20 20 20 20 20 20 2a 2a 20 68 61 73  ess.      ** has
2cec0 20 61 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 61   a shared lock a
2ced0 6c 72 65 61 64 79 29 2c 20 69 66 20 74 68 65 20  lready), if the 
2cee0 68 6f 73 74 20 69 64 20 6d 61 74 63 68 65 73 2c  host id matches,
2cef0 20 75 73 65 20 74 68 65 20 62 69 67 0a 20 20 20   use the big.   
2cf00 20 20 20 2a 2a 20 73 74 69 63 6b 2e 0a 20 20 20     ** stick..   
2cf10 20 20 20 2a 2f 0a 20 20 20 20 20 20 66 75 74 69     */.      futi
2cf20 6d 65 73 28 63 6f 6e 63 68 46 69 6c 65 2d 3e 68  mes(conchFile->h
2cf30 2c 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20 69  , NULL);.      i
2cf40 66 28 20 68 6f 73 74 49 64 4d 61 74 63 68 20 26  f( hostIdMatch &
2cf50 26 20 21 63 72 65 61 74 65 43 6f 6e 63 68 20 29  & !createConch )
2cf60 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 63 6f  {.        if( co
2cf70 6e 63 68 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 20  nchFile->pInode 
2cf80 26 26 20 63 6f 6e 63 68 46 69 6c 65 2d 3e 70 49  && conchFile->pI
2cf90 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64 3e 31 20  node->nShared>1 
2cfa0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ){.          /* 
2cfb0 57 65 20 61 72 65 20 74 72 79 69 6e 67 20 66 6f  We are trying fo
2cfc0 72 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c  r an exclusive l
2cfd0 6f 63 6b 20 62 75 74 20 61 6e 6f 74 68 65 72 20  ock but another 
2cfe0 74 68 72 65 61 64 20 69 6e 20 74 68 69 73 0a 20  thread in this. 
2cff0 20 20 20 20 20 20 20 20 20 20 2a 2a 20 73 61 6d            ** sam
2d000 65 20 70 72 6f 63 65 73 73 20 69 73 20 73 74 69  e process is sti
2d010 6c 6c 20 68 6f 6c 64 69 6e 67 20 61 20 73 68 61  ll holding a sha
2d020 72 65 64 20 6c 6f 63 6b 2e 20 2a 2f 0a 20 20 20  red lock. */.   
2d030 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
2d040 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 20 20 20  TE_BUSY;.       
2d050 20 7d 20 65 6c 73 65 20 7b 20 20 20 20 20 20 20   } else {       
2d060 20 20 20 0a 20 20 20 20 20 20 20 20 20 20 72 63     .          rc
2d070 20 3d 20 70 72 6f 78 79 43 6f 6e 63 68 4c 6f 63   = proxyConchLoc
2d080 6b 28 70 46 69 6c 65 2c 20 6d 79 48 6f 73 74 49  k(pFile, myHostI
2d090 44 2c 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43  D, EXCLUSIVE_LOC
2d0a0 4b 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  K);.        }.  
2d0b0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
2d0c0 20 20 20 72 63 20 3d 20 63 6f 6e 63 68 46 69 6c     rc = conchFil
2d0d0 65 2d 3e 70 4d 65 74 68 6f 64 2d 3e 78 4c 6f 63  e->pMethod->xLoc
2d0e0 6b 28 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a  k((sqlite3_file*
2d0f0 29 63 6f 6e 63 68 46 69 6c 65 2c 20 45 58 43 4c  )conchFile, EXCL
2d100 55 53 49 56 45 5f 4c 4f 43 4b 29 3b 0a 20 20 20  USIVE_LOCK);.   
2d110 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72     }.      if( r
2d120 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
2d130 20 20 20 20 20 20 20 20 63 68 61 72 20 77 72 69          char wri
2d140 74 65 42 75 66 66 65 72 5b 50 52 4f 58 59 5f 4d  teBuffer[PROXY_M
2d150 41 58 43 4f 4e 43 48 4c 45 4e 5d 3b 0a 20 20 20  AXCONCHLEN];.   
2d160 20 20 20 20 20 69 6e 74 20 77 72 69 74 65 53 69       int writeSi
2d170 7a 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  ze = 0;.        
2d180 0a 20 20 20 20 20 20 20 20 77 72 69 74 65 42 75  .        writeBu
2d190 66 66 65 72 5b 30 5d 20 3d 20 28 63 68 61 72 29  ffer[0] = (char)
2d1a0 50 52 4f 58 59 5f 43 4f 4e 43 48 56 45 52 53 49  PROXY_CONCHVERSI
2d1b0 4f 4e 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63  ON;.        memc
2d1c0 70 79 28 26 77 72 69 74 65 42 75 66 66 65 72 5b  py(&writeBuffer[
2d1d0 50 52 4f 58 59 5f 48 45 41 44 45 52 4c 45 4e 5d  PROXY_HEADERLEN]
2d1e0 2c 20 6d 79 48 6f 73 74 49 44 2c 20 50 52 4f 58  , myHostID, PROX
2d1f0 59 5f 48 4f 53 54 49 44 4c 45 4e 29 3b 0a 20 20  Y_HOSTIDLEN);.  
2d200 20 20 20 20 20 20 69 66 28 20 70 43 74 78 2d 3e        if( pCtx->
2d210 6c 6f 63 6b 50 72 6f 78 79 50 61 74 68 21 3d 4e  lockProxyPath!=N
2d220 55 4c 4c 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ULL ){.         
2d230 20 73 74 72 6c 63 70 79 28 26 77 72 69 74 65 42   strlcpy(&writeB
2d240 75 66 66 65 72 5b 50 52 4f 58 59 5f 50 41 54 48  uffer[PROXY_PATH
2d250 49 4e 44 45 58 5d 2c 20 70 43 74 78 2d 3e 6c 6f  INDEX], pCtx->lo
2d260 63 6b 50 72 6f 78 79 50 61 74 68 2c 20 4d 41 58  ckProxyPath, MAX
2d270 50 41 54 48 4c 45 4e 29 3b 0a 20 20 20 20 20 20  PATHLEN);.      
2d280 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
2d290 20 20 20 73 74 72 6c 63 70 79 28 26 77 72 69 74     strlcpy(&writ
2d2a0 65 42 75 66 66 65 72 5b 50 52 4f 58 59 5f 50 41  eBuffer[PROXY_PA
2d2b0 54 48 49 4e 44 45 58 5d 2c 20 74 65 6d 70 4c 6f  THINDEX], tempLo
2d2c0 63 6b 50 61 74 68 2c 20 4d 41 58 50 41 54 48 4c  ckPath, MAXPATHL
2d2d0 45 4e 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  EN);.        }. 
2d2e0 20 20 20 20 20 20 20 77 72 69 74 65 53 69 7a 65         writeSize
2d2f0 20 3d 20 50 52 4f 58 59 5f 50 41 54 48 49 4e 44   = PROXY_PATHIND
2d300 45 58 20 2b 20 73 74 72 6c 65 6e 28 26 77 72 69  EX + strlen(&wri
2d310 74 65 42 75 66 66 65 72 5b 50 52 4f 58 59 5f 50  teBuffer[PROXY_P
2d320 41 54 48 49 4e 44 45 58 5d 29 3b 0a 20 20 20 20  ATHINDEX]);.    
2d330 20 20 20 20 66 74 72 75 6e 63 61 74 65 28 63 6f      ftruncate(co
2d340 6e 63 68 46 69 6c 65 2d 3e 68 2c 20 77 72 69 74  nchFile->h, writ
2d350 65 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 20 20  eSize);.        
2d360 72 63 20 3d 20 75 6e 69 78 57 72 69 74 65 28 28  rc = unixWrite((
2d370 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 29 63  sqlite3_file *)c
2d380 6f 6e 63 68 46 69 6c 65 2c 20 77 72 69 74 65 42  onchFile, writeB
2d390 75 66 66 65 72 2c 20 77 72 69 74 65 53 69 7a 65  uffer, writeSize
2d3a0 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 66 73  , 0);.        fs
2d3b0 79 6e 63 28 63 6f 6e 63 68 46 69 6c 65 2d 3e 68  ync(conchFile->h
2d3c0 29 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 66  );.        /* If
2d3d0 20 77 65 20 63 72 65 61 74 65 64 20 61 20 6e 65   we created a ne
2d3e0 77 20 63 6f 6e 63 68 20 66 69 6c 65 20 28 6e 6f  w conch file (no
2d3f0 74 20 6a 75 73 74 20 75 70 64 61 74 65 64 20 74  t just updated t
2d400 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 61  he contents of a
2d410 20 0a 20 20 20 20 20 20 20 20 20 2a 2a 20 76 61   .         ** va
2d420 6c 69 64 20 63 6f 6e 63 68 20 66 69 6c 65 29 2c  lid conch file),
2d430 20 74 72 79 20 74 6f 20 6d 61 74 63 68 20 74 68   try to match th
2d440 65 20 70 65 72 6d 69 73 73 69 6f 6e 73 20 6f 66  e permissions of
2d450 20 74 68 65 20 64 61 74 61 62 61 73 65 20 0a 20   the database . 
2d460 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
2d470 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
2d480 45 5f 4f 4b 20 26 26 20 63 72 65 61 74 65 43 6f  E_OK && createCo
2d490 6e 63 68 20 29 7b 0a 20 20 20 20 20 20 20 20 20  nch ){.         
2d4a0 20 73 74 72 75 63 74 20 73 74 61 74 20 62 75 66   struct stat buf
2d4b0 3b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20  ;.          int 
2d4c0 65 72 72 20 3d 20 66 73 74 61 74 28 70 46 69 6c  err = fstat(pFil
2d4d0 65 2d 3e 68 2c 20 26 62 75 66 29 3b 0a 20 20 20  e->h, &buf);.   
2d4e0 20 20 20 20 20 20 20 69 66 28 20 65 72 72 3d 3d         if( err==
2d4f0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  0 ){.           
2d500 20 6d 6f 64 65 5f 74 20 63 6d 6f 64 65 20 3d 20   mode_t cmode = 
2d510 62 75 66 2e 73 74 5f 6d 6f 64 65 26 28 53 5f 49  buf.st_mode&(S_I
2d520 52 55 53 52 7c 53 5f 49 57 55 53 52 20 7c 20 53  RUSR|S_IWUSR | S
2d530 5f 49 52 47 52 50 7c 53 5f 49 57 47 52 50 20 7c  _IRGRP|S_IWGRP |
2d540 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2d550 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d560 20 20 20 20 20 20 20 20 20 53 5f 49 52 4f 54 48           S_IROTH
2d570 7c 53 5f 49 57 4f 54 48 29 3b 0a 20 20 20 20 20  |S_IWOTH);.     
2d580 20 20 20 20 20 20 20 2f 2a 20 74 72 79 20 74 6f         /* try to
2d590 20 6d 61 74 63 68 20 74 68 65 20 64 61 74 61 62   match the datab
2d5a0 61 73 65 20 66 69 6c 65 20 52 2f 57 20 70 65 72  ase file R/W per
2d5b0 6d 69 73 73 69 6f 6e 73 2c 20 69 67 6e 6f 72 65  missions, ignore
2d5c0 20 66 61 69 6c 75 72 65 20 2a 2f 0a 23 69 66 6e   failure */.#ifn
2d5d0 64 65 66 20 53 51 4c 49 54 45 5f 50 52 4f 58 59  def SQLITE_PROXY
2d5e0 5f 44 45 42 55 47 0a 20 20 20 20 20 20 20 20 20  _DEBUG.         
2d5f0 20 20 20 66 63 68 6d 6f 64 28 63 6f 6e 63 68 46     fchmod(conchF
2d600 69 6c 65 2d 3e 68 2c 20 63 6d 6f 64 65 29 3b 0a  ile->h, cmode);.
2d610 23 65 6c 73 65 0a 20 20 20 20 20 20 20 20 20 20  #else.          
2d620 20 20 69 66 28 20 66 63 68 6d 6f 64 28 63 6f 6e    if( fchmod(con
2d630 63 68 46 69 6c 65 2d 3e 68 2c 20 63 6d 6f 64 65  chFile->h, cmode
2d640 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )!=0 ){.        
2d650 20 20 20 20 20 20 69 6e 74 20 63 6f 64 65 20 3d        int code =
2d660 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20 20 20   errno;.        
2d670 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 73 74        fprintf(st
2d680 64 65 72 72 2c 20 22 66 63 68 6d 6f 64 20 25 6f  derr, "fchmod %o
2d690 20 46 41 49 4c 45 44 20 77 69 74 68 20 25 64 20   FAILED with %d 
2d6a0 25 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  %s\n",.         
2d6b0 20 20 20 20 20 20 20 20 20 20 20 20 20 63 6d 6f               cmo
2d6c0 64 65 2c 20 63 6f 64 65 2c 20 73 74 72 65 72 72  de, code, strerr
2d6d0 6f 72 28 63 6f 64 65 29 29 3b 0a 20 20 20 20 20  or(code));.     
2d6e0 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a         } else {.
2d6f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 66 70                fp
2d700 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 66  rintf(stderr, "f
2d710 63 68 6d 6f 64 20 25 6f 20 53 55 43 43 45 44 45  chmod %o SUCCEDE
2d720 44 5c 6e 22 2c 63 6d 6f 64 65 29 3b 0a 20 20 20  D\n",cmode);.   
2d730 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
2d740 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
2d750 20 20 20 20 20 20 20 20 69 6e 74 20 63 6f 64 65          int code
2d760 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20   = errno;.      
2d770 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 73 74        fprintf(st
2d780 64 65 72 72 2c 20 22 53 54 41 54 20 46 41 49 4c  derr, "STAT FAIL
2d790 45 44 5b 25 64 5d 20 77 69 74 68 20 25 64 20 25  ED[%d] with %d %
2d7a0 73 5c 6e 22 2c 20 0a 20 20 20 20 20 20 20 20 20  s\n", .         
2d7b0 20 20 20 20 20 20 20 20 20 20 20 65 72 72 2c 20             err, 
2d7c0 63 6f 64 65 2c 20 73 74 72 65 72 72 6f 72 28 63  code, strerror(c
2d7d0 6f 64 65 29 29 3b 0a 23 65 6e 64 69 66 0a 20 20  ode));.#endif.  
2d7e0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2d7f0 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
2d800 20 20 63 6f 6e 63 68 46 69 6c 65 2d 3e 70 4d 65    conchFile->pMe
2d810 74 68 6f 64 2d 3e 78 55 6e 6c 6f 63 6b 28 28 73  thod->xUnlock((s
2d820 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29 63 6f 6e  qlite3_file*)con
2d830 63 68 46 69 6c 65 2c 20 53 48 41 52 45 44 5f 4c  chFile, SHARED_L
2d840 4f 43 4b 29 3b 0a 20 20 20 20 20 20 0a 20 20 20  OCK);.      .   
2d850 20 65 6e 64 5f 74 61 6b 65 63 6f 6e 63 68 3a 0a   end_takeconch:.
2d860 20 20 20 20 20 20 4f 53 54 52 41 43 45 28 28 22        OSTRACE(("
2d870 54 52 41 4e 53 50 52 4f 58 59 3a 20 43 4c 4f 53  TRANSPROXY: CLOS
2d880 45 20 20 25 64 5c 6e 22 2c 20 70 46 69 6c 65 2d  E  %d\n", pFile-
2d890 3e 68 29 29 3b 0a 20 20 20 20 20 20 69 66 28 20  >h));.      if( 
2d8a0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
2d8b0 20 70 46 69 6c 65 2d 3e 6f 70 65 6e 46 6c 61 67   pFile->openFlag
2d8c0 73 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  s ){.        if(
2d8d0 20 70 46 69 6c 65 2d 3e 68 3e 3d 30 20 29 7b 0a   pFile->h>=0 ){.
2d8e0 23 69 66 64 65 66 20 53 54 52 49 43 54 5f 43 4c  #ifdef STRICT_CL
2d8f0 4f 53 45 5f 45 52 52 4f 52 0a 20 20 20 20 20 20  OSE_ERROR.      
2d900 20 20 20 20 69 66 28 20 63 6c 6f 73 65 28 70 46      if( close(pF
2d910 69 6c 65 2d 3e 68 29 20 29 7b 0a 20 20 20 20 20  ile->h) ){.     
2d920 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61         pFile->la
2d930 73 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b  stErrno = errno;
2d940 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74  .            ret
2d950 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  urn SQLITE_IOERR
2d960 5f 43 4c 4f 53 45 3b 0a 20 20 20 20 20 20 20 20  _CLOSE;.        
2d970 20 20 7d 0a 23 65 6c 73 65 0a 20 20 20 20 20 20    }.#else.      
2d980 20 20 20 20 63 6c 6f 73 65 28 70 46 69 6c 65 2d      close(pFile-
2d990 3e 68 29 3b 20 2f 2a 20 73 69 6c 65 6e 74 6c 79  >h); /* silently
2d9a0 20 6c 65 61 6b 20 66 64 20 69 66 20 66 61 69 6c   leak fd if fail
2d9b0 20 2a 2f 0a 23 65 6e 64 69 66 0a 20 20 20 20 20   */.#endif.     
2d9c0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70 46 69     }.        pFi
2d9d0 6c 65 2d 3e 68 20 3d 20 2d 31 3b 0a 20 20 20 20  le->h = -1;.    
2d9e0 20 20 20 20 69 6e 74 20 66 64 20 3d 20 6f 70 65      int fd = ope
2d9f0 6e 28 70 43 74 78 2d 3e 64 62 50 61 74 68 2c 20  n(pCtx->dbPath, 
2da00 70 46 69 6c 65 2d 3e 6f 70 65 6e 46 6c 61 67 73  pFile->openFlags
2da10 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
2da20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 44          SQLITE_D
2da30 45 46 41 55 4c 54 5f 46 49 4c 45 5f 50 45 52 4d  EFAULT_FILE_PERM
2da40 49 53 53 49 4f 4e 53 29 3b 0a 20 20 20 20 20 20  ISSIONS);.      
2da50 20 20 4f 53 54 52 41 43 45 28 28 22 54 52 41 4e    OSTRACE(("TRAN
2da60 53 50 52 4f 58 59 3a 20 4f 50 45 4e 20 20 25 64  SPROXY: OPEN  %d
2da70 5c 6e 22 2c 20 66 64 29 29 3b 0a 20 20 20 20 20  \n", fd));.     
2da80 20 20 20 69 66 28 20 66 64 3e 3d 30 20 29 7b 0a     if( fd>=0 ){.
2da90 20 20 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d            pFile-
2daa0 3e 68 20 3d 20 66 64 3b 0a 20 20 20 20 20 20 20  >h = fd;.       
2dab0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
2dac0 20 20 72 63 3d 53 51 4c 49 54 45 5f 43 41 4e 54    rc=SQLITE_CANT
2dad0 4f 50 45 4e 5f 42 4b 50 54 3b 20 2f 2a 20 53 51  OPEN_BKPT; /* SQ
2dae0 4c 49 54 45 5f 42 55 53 59 3f 20 70 72 6f 78 79  LITE_BUSY? proxy
2daf0 54 61 6b 65 43 6f 6e 63 68 20 63 61 6c 6c 65 64  TakeConch called
2db00 0a 20 20 20 20 20 20 20 20 20 20 20 64 75 72 69  .           duri
2db10 6e 67 20 6c 6f 63 6b 69 6e 67 20 2a 2f 0a 20 20  ng locking */.  
2db20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
2db30 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
2db40 4c 49 54 45 5f 4f 4b 20 26 26 20 21 70 43 74 78  LITE_OK && !pCtx
2db50 2d 3e 6c 6f 63 6b 50 72 6f 78 79 20 29 7b 0a 20  ->lockProxy ){. 
2db60 20 20 20 20 20 20 20 63 68 61 72 20 2a 70 61 74         char *pat
2db70 68 20 3d 20 74 65 6d 70 4c 6f 63 6b 50 61 74 68  h = tempLockPath
2db80 20 3f 20 74 65 6d 70 4c 6f 63 6b 50 61 74 68 20   ? tempLockPath 
2db90 3a 20 70 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78  : pCtx->lockProx
2dba0 79 50 61 74 68 3b 0a 20 20 20 20 20 20 20 20 72  yPath;.        r
2dbb0 63 20 3d 20 70 72 6f 78 79 43 72 65 61 74 65 55  c = proxyCreateU
2dbc0 6e 69 78 46 69 6c 65 28 70 61 74 68 2c 20 26 70  nixFile(path, &p
2dbd0 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 2c 20  Ctx->lockProxy, 
2dbe0 31 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  1);.        if( 
2dbf0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc!=SQLITE_OK &&
2dc00 20 72 63 21 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45   rc!=SQLITE_NOME
2dc10 4d 20 26 26 20 74 72 79 4f 6c 64 4c 6f 63 6b 50  M && tryOldLockP
2dc20 61 74 68 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ath ){.         
2dc30 20 2f 2a 20 77 65 20 63 6f 75 6c 64 6e 27 74 20   /* we couldn't 
2dc40 63 72 65 61 74 65 20 74 68 65 20 70 72 6f 78 79  create the proxy
2dc50 20 6c 6f 63 6b 20 66 69 6c 65 20 77 69 74 68 20   lock file with 
2dc60 74 68 65 20 6f 6c 64 20 6c 6f 63 6b 20 66 69 6c  the old lock fil
2dc70 65 20 70 61 74 68 0a 20 20 20 20 20 20 20 20 20  e path.         
2dc80 20 20 2a 2a 20 73 6f 20 74 72 79 20 61 67 61 69    ** so try agai
2dc90 6e 20 76 69 61 20 61 75 74 6f 2d 6e 61 6d 69 6e  n via auto-namin
2dca0 67 20 0a 20 20 20 20 20 20 20 20 20 20 20 2a 2f  g .           */
2dcb0 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72 63 65  .          force
2dcc0 4e 65 77 4c 6f 63 6b 50 61 74 68 20 3d 20 31 3b  NewLockPath = 1;
2dcd0 0a 20 20 20 20 20 20 20 20 20 20 74 72 79 4f 6c  .          tryOl
2dce0 64 4c 6f 63 6b 50 61 74 68 20 3d 20 30 3b 0a 20  dLockPath = 0;. 
2dcf0 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75           continu
2dd00 65 3b 20 2f 2a 20 67 6f 20 62 61 63 6b 20 74 6f  e; /* go back to
2dd10 20 74 68 65 20 64 6f 20 7b 7d 20 77 68 69 6c 65   the do {} while
2dd20 20 73 74 61 72 74 20 70 6f 69 6e 74 2c 20 74 72   start point, tr
2dd30 79 20 61 67 61 69 6e 20 2a 2f 0a 20 20 20 20 20  y again */.     
2dd40 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
2dd50 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
2dd60 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
2dd70 2f 2a 20 4e 65 65 64 20 74 6f 20 6d 61 6b 65 20  /* Need to make 
2dd80 61 20 63 6f 70 79 20 6f 66 20 70 61 74 68 20 69  a copy of path i
2dd90 66 20 77 65 20 65 78 74 72 61 63 74 65 64 20 74  f we extracted t
2dda0 68 65 20 76 61 6c 75 65 0a 20 20 20 20 20 20 20  he value.       
2ddb0 20 20 2a 2a 20 66 72 6f 6d 20 74 68 65 20 63 6f    ** from the co
2ddc0 6e 63 68 20 66 69 6c 65 20 6f 72 20 74 68 65 20  nch file or the 
2ddd0 70 61 74 68 20 77 61 73 20 61 6c 6c 6f 63 61 74  path was allocat
2dde0 65 64 20 6f 6e 20 74 68 65 20 73 74 61 63 6b 0a  ed on the stack.
2ddf0 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20           */.    
2de00 20 20 20 20 69 66 28 20 74 65 6d 70 4c 6f 63 6b      if( tempLock
2de10 50 61 74 68 20 29 7b 0a 20 20 20 20 20 20 20 20  Path ){.        
2de20 20 20 70 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78    pCtx->lockProx
2de30 79 50 61 74 68 20 3d 20 73 71 6c 69 74 65 33 44  yPath = sqlite3D
2de40 62 53 74 72 44 75 70 28 30 2c 20 74 65 6d 70 4c  bStrDup(0, tempL
2de50 6f 63 6b 50 61 74 68 29 3b 0a 20 20 20 20 20 20  ockPath);.      
2de60 20 20 20 20 69 66 28 20 21 70 43 74 78 2d 3e 6c      if( !pCtx->l
2de70 6f 63 6b 50 72 6f 78 79 50 61 74 68 20 29 7b 0a  ockProxyPath ){.
2de80 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d              rc =
2de90 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
2dea0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
2deb0 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
2dec0 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
2ded0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
2dee0 70 43 74 78 2d 3e 63 6f 6e 63 68 48 65 6c 64 20  pCtx->conchHeld 
2def0 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 0a 20 20  = 1;.        .  
2df00 20 20 20 20 20 20 69 66 28 20 70 43 74 78 2d 3e        if( pCtx->
2df10 6c 6f 63 6b 50 72 6f 78 79 2d 3e 70 4d 65 74 68  lockProxy->pMeth
2df20 6f 64 20 3d 3d 20 26 61 66 70 49 6f 4d 65 74 68  od == &afpIoMeth
2df30 6f 64 73 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ods ){.         
2df40 20 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65   afpLockingConte
2df50 78 74 20 2a 61 66 70 43 74 78 3b 0a 20 20 20 20  xt *afpCtx;.    
2df60 20 20 20 20 20 20 61 66 70 43 74 78 20 3d 20 28        afpCtx = (
2df70 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78  afpLockingContex
2df80 74 20 2a 29 70 43 74 78 2d 3e 6c 6f 63 6b 50 72  t *)pCtx->lockPr
2df90 6f 78 79 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74  oxy->lockingCont
2dfa0 65 78 74 3b 0a 20 20 20 20 20 20 20 20 20 20 61  ext;.          a
2dfb0 66 70 43 74 78 2d 3e 64 62 50 61 74 68 20 3d 20  fpCtx->dbPath = 
2dfc0 70 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 50  pCtx->lockProxyP
2dfd0 61 74 68 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  ath;.        }. 
2dfe0 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20       } else {.  
2dff0 20 20 20 20 20 20 63 6f 6e 63 68 46 69 6c 65 2d        conchFile-
2e000 3e 70 4d 65 74 68 6f 64 2d 3e 78 55 6e 6c 6f 63  >pMethod->xUnloc
2e010 6b 28 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a  k((sqlite3_file*
2e020 29 63 6f 6e 63 68 46 69 6c 65 2c 20 4e 4f 5f 4c  )conchFile, NO_L
2e030 4f 43 4b 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  OCK);.      }.  
2e040 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 54 41      OSTRACE(("TA
2e050 4b 45 43 4f 4e 43 48 20 20 25 64 20 25 73 5c 6e  KECONCH  %d %s\n
2e060 22 2c 20 63 6f 6e 63 68 46 69 6c 65 2d 3e 68 2c  ", conchFile->h,
2e070 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2e080 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 3f 22 6f  rc==SQLITE_OK?"o
2e090 6b 22 3a 22 66 61 69 6c 65 64 22 29 29 3b 0a 20  k":"failed"));. 
2e0a0 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
2e0b0 20 20 20 20 7d 20 77 68 69 6c 65 20 28 31 29 3b      } while (1);
2e0c0 20 2f 2a 20 69 6e 20 63 61 73 65 20 77 65 20 6e   /* in case we n
2e0d0 65 65 64 20 74 6f 20 72 65 74 72 79 20 74 68 65  eed to retry the
2e0e0 20 3a 61 75 74 6f 3a 20 6c 6f 63 6b 20 66 69 6c   :auto: lock fil
2e0f0 65 20 2d 20 0a 20 20 20 20 20 20 20 20 20 20 20  e - .           
2e100 20 20 20 20 20 20 2a 2a 20 77 65 20 73 68 6f 75        ** we shou
2e110 6c 64 20 6e 65 76 65 72 20 67 65 74 20 68 65 72  ld never get her
2e120 65 20 65 78 63 65 70 74 20 76 69 61 20 74 68 65  e except via the
2e130 20 27 63 6f 6e 74 69 6e 75 65 27 20 63 61 6c 6c   'continue' call
2e140 2e 20 2a 2f 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  . */.  }.}../*.*
2e150 2a 20 49 66 20 70 46 69 6c 65 20 68 6f 6c 64 73  * If pFile holds
2e160 20 61 20 6c 6f 63 6b 20 6f 6e 20 61 20 63 6f 6e   a lock on a con
2e170 63 68 20 66 69 6c 65 2c 20 74 68 65 6e 20 72 65  ch file, then re
2e180 6c 65 61 73 65 20 74 68 61 74 20 6c 6f 63 6b 2e  lease that lock.
2e190 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
2e1a0 72 6f 78 79 52 65 6c 65 61 73 65 43 6f 6e 63 68  roxyReleaseConch
2e1b0 28 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65  (unixFile *pFile
2e1c0 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
2e1d0 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20  LITE_OK;        
2e1e0 20 2f 2a 20 53 75 62 72 6f 75 74 69 6e 65 20 72   /* Subroutine r
2e1f0 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20  eturn code */.  
2e200 70 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74  proxyLockingCont
2e210 65 78 74 20 2a 70 43 74 78 3b 20 20 2f 2a 20 54  ext *pCtx;  /* T
2e220 68 65 20 6c 6f 63 6b 69 6e 67 20 63 6f 6e 74 65  he locking conte
2e230 78 74 20 66 6f 72 20 74 68 65 20 70 72 6f 78 79  xt for the proxy
2e240 20 6c 6f 63 6b 20 2a 2f 0a 20 20 75 6e 69 78 46   lock */.  unixF
2e250 69 6c 65 20 2a 63 6f 6e 63 68 46 69 6c 65 3b 20  ile *conchFile; 
2e260 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f         /* Name o
2e270 66 20 74 68 65 20 63 6f 6e 63 68 20 66 69 6c 65  f the conch file
2e280 20 2a 2f 0a 0a 20 20 70 43 74 78 20 3d 20 28 70   */..  pCtx = (p
2e290 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65  roxyLockingConte
2e2a0 78 74 20 2a 29 70 46 69 6c 65 2d 3e 6c 6f 63 6b  xt *)pFile->lock
2e2b0 69 6e 67 43 6f 6e 74 65 78 74 3b 0a 20 20 63 6f  ingContext;.  co
2e2c0 6e 63 68 46 69 6c 65 20 3d 20 70 43 74 78 2d 3e  nchFile = pCtx->
2e2d0 63 6f 6e 63 68 46 69 6c 65 3b 0a 20 20 4f 53 54  conchFile;.  OST
2e2e0 52 41 43 45 28 28 22 52 45 4c 45 41 53 45 43 4f  RACE(("RELEASECO
2e2f0 4e 43 48 20 20 25 64 20 66 6f 72 20 25 73 20 70  NCH  %d for %s p
2e300 69 64 3d 25 64 5c 6e 22 2c 20 63 6f 6e 63 68 46  id=%d\n", conchF
2e310 69 6c 65 2d 3e 68 2c 0a 20 20 20 20 20 20 20 20  ile->h,.        
2e320 20 20 20 28 70 43 74 78 2d 3e 6c 6f 63 6b 50 72     (pCtx->lockPr
2e330 6f 78 79 50 61 74 68 20 3f 20 70 43 74 78 2d 3e  oxyPath ? pCtx->
2e340 6c 6f 63 6b 50 72 6f 78 79 50 61 74 68 20 3a 20  lockProxyPath : 
2e350 22 3a 61 75 74 6f 3a 22 29 2c 20 0a 20 20 20 20  ":auto:"), .    
2e360 20 20 20 20 20 20 20 67 65 74 70 69 64 28 29 29         getpid())
2e370 29 3b 0a 20 20 69 66 28 20 70 43 74 78 2d 3e 63  );.  if( pCtx->c
2e380 6f 6e 63 68 48 65 6c 64 3e 30 20 29 7b 0a 20 20  onchHeld>0 ){.  
2e390 20 20 72 63 20 3d 20 63 6f 6e 63 68 46 69 6c 65    rc = conchFile
2e3a0 2d 3e 70 4d 65 74 68 6f 64 2d 3e 78 55 6e 6c 6f  ->pMethod->xUnlo
2e3b0 63 6b 28 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  ck((sqlite3_file
2e3c0 2a 29 63 6f 6e 63 68 46 69 6c 65 2c 20 4e 4f 5f  *)conchFile, NO_
2e3d0 4c 4f 43 4b 29 3b 0a 20 20 7d 0a 20 20 70 43 74  LOCK);.  }.  pCt
2e3e0 78 2d 3e 63 6f 6e 63 68 48 65 6c 64 20 3d 20 30  x->conchHeld = 0
2e3f0 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22 52 45  ;.  OSTRACE(("RE
2e400 4c 45 41 53 45 43 4f 4e 43 48 20 20 25 64 20 25  LEASECONCH  %d %
2e410 73 5c 6e 22 2c 20 63 6f 6e 63 68 46 69 6c 65 2d  s\n", conchFile-
2e420 3e 68 2c 0a 20 20 20 20 20 20 20 20 20 20 20 28  >h,.           (
2e430 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 3f 20  rc==SQLITE_OK ? 
2e440 22 6f 6b 22 20 3a 20 22 66 61 69 6c 65 64 22 29  "ok" : "failed")
2e450 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  ));.  return rc;
2e460 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20  .}../*.** Given 
2e470 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 20 64 61  the name of a da
2e480 74 61 62 61 73 65 20 66 69 6c 65 2c 20 63 6f 6d  tabase file, com
2e490 70 75 74 65 20 74 68 65 20 6e 61 6d 65 20 6f 66  pute the name of
2e4a0 20 69 74 73 20 63 6f 6e 63 68 20 66 69 6c 65 2e   its conch file.
2e4b0 0a 2a 2a 20 53 74 6f 72 65 20 74 68 65 20 63 6f  .** Store the co
2e4c0 6e 63 68 20 66 69 6c 65 6e 61 6d 65 20 69 6e 20  nch filename in 
2e4d0 6d 65 6d 6f 72 79 20 6f 62 74 61 69 6e 65 64 20  memory obtained 
2e4e0 66 72 6f 6d 20 73 71 6c 69 74 65 33 5f 6d 61 6c  from sqlite3_mal
2e4f0 6c 6f 63 28 29 2e 0a 2a 2a 20 4d 61 6b 65 20 2a  loc()..** Make *
2e500 70 43 6f 6e 63 68 50 61 74 68 20 70 6f 69 6e 74  pConchPath point
2e510 20 74 6f 20 74 68 65 20 6e 65 77 20 6e 61 6d 65   to the new name
2e520 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45  .  Return SQLITE
2e530 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73 0a 2a  _OK on success.*
2e540 2a 20 6f 72 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  * or SQLITE_NOME
2e550 4d 20 69 66 20 75 6e 61 62 6c 65 20 74 6f 20 6f  M if unable to o
2e560 62 74 61 69 6e 20 6d 65 6d 6f 72 79 2e 0a 2a 2a  btain memory..**
2e570 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 65 72 20 69  .** The caller i
2e580 73 20 72 65 73 70 6f 6e 73 69 62 6c 65 20 66 6f  s responsible fo
2e590 72 20 65 6e 73 75 72 69 6e 67 20 74 68 61 74 20  r ensuring that 
2e5a0 74 68 65 20 61 6c 6c 6f 63 61 74 65 64 20 6d 65  the allocated me
2e5b0 6d 6f 72 79 0a 2a 2a 20 73 70 61 63 65 20 69 73  mory.** space is
2e5c0 20 65 76 65 6e 74 75 61 6c 6c 79 20 66 72 65 65   eventually free
2e5d0 64 2e 0a 2a 2a 0a 2a 2a 20 2a 70 43 6f 6e 63 68  d..**.** *pConch
2e5e0 50 61 74 68 20 69 73 20 73 65 74 20 74 6f 20 4e  Path is set to N
2e5f0 55 4c 4c 20 69 66 20 61 20 6d 65 6d 6f 72 79 20  ULL if a memory 
2e600 61 6c 6c 6f 63 61 74 69 6f 6e 20 65 72 72 6f 72  allocation error
2e610 20 6f 63 63 75 72 73 2e 0a 2a 2f 0a 73 74 61 74   occurs..*/.stat
2e620 69 63 20 69 6e 74 20 70 72 6f 78 79 43 72 65 61  ic int proxyCrea
2e630 74 65 43 6f 6e 63 68 50 61 74 68 6e 61 6d 65 28  teConchPathname(
2e640 63 68 61 72 20 2a 64 62 50 61 74 68 2c 20 63 68  char *dbPath, ch
2e650 61 72 20 2a 2a 70 43 6f 6e 63 68 50 61 74 68 29  ar **pConchPath)
2e660 7b 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20  {.  int i;      
2e670 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e680 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65    /* Loop counte
2e690 72 20 2a 2f 0a 20 20 69 6e 74 20 6c 65 6e 20 3d  r */.  int len =
2e6a0 20 28 69 6e 74 29 73 74 72 6c 65 6e 28 64 62 50   (int)strlen(dbP
2e6b0 61 74 68 29 3b 20 2f 2a 20 4c 65 6e 67 74 68 20  ath); /* Length 
2e6c0 6f 66 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  of database file
2e6d0 6e 61 6d 65 20 2d 20 64 62 50 61 74 68 20 2a 2f  name - dbPath */
2e6e0 0a 20 20 63 68 61 72 20 2a 63 6f 6e 63 68 50 61  .  char *conchPa
2e6f0 74 68 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  th;             
2e700 20 2f 2a 20 62 75 66 66 65 72 20 69 6e 20 77 68   /* buffer in wh
2e710 69 63 68 20 74 6f 20 63 6f 6e 73 74 72 75 63 74  ich to construct
2e720 20 63 6f 6e 63 68 20 6e 61 6d 65 20 2a 2f 0a 0a   conch name */..
2e730 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 73 70    /* Allocate sp
2e740 61 63 65 20 66 6f 72 20 74 68 65 20 63 6f 6e 63  ace for the conc
2e750 68 20 66 69 6c 65 6e 61 6d 65 20 61 6e 64 20 69  h filename and i
2e760 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 6e 61  nitialize the na
2e770 6d 65 20 74 6f 0a 20 20 2a 2a 20 74 68 65 20 6e  me to.  ** the n
2e780 61 6d 65 20 6f 66 20 74 68 65 20 6f 72 69 67 69  ame of the origi
2e790 6e 61 6c 20 64 61 74 61 62 61 73 65 20 66 69 6c  nal database fil
2e7a0 65 2e 20 2a 2f 20 20 0a 20 20 2a 70 43 6f 6e 63  e. */  .  *pConc
2e7b0 68 50 61 74 68 20 3d 20 63 6f 6e 63 68 50 61 74  hPath = conchPat
2e7c0 68 20 3d 20 28 63 68 61 72 20 2a 29 73 71 6c 69  h = (char *)sqli
2e7d0 74 65 33 5f 6d 61 6c 6c 6f 63 28 6c 65 6e 20 2b  te3_malloc(len +
2e7e0 20 38 29 3b 0a 20 20 69 66 28 20 63 6f 6e 63 68   8);.  if( conch
2e7f0 50 61 74 68 3d 3d 30 20 29 7b 0a 20 20 20 20 72  Path==0 ){.    r
2e800 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
2e810 45 4d 3b 0a 20 20 7d 0a 20 20 6d 65 6d 63 70 79  EM;.  }.  memcpy
2e820 28 63 6f 6e 63 68 50 61 74 68 2c 20 64 62 50 61  (conchPath, dbPa
2e830 74 68 2c 20 6c 65 6e 2b 31 29 3b 0a 20 20 0a 20  th, len+1);.  . 
2e840 20 2f 2a 20 6e 6f 77 20 69 6e 73 65 72 74 20 61   /* now insert a
2e850 20 22 2e 22 20 62 65 66 6f 72 65 20 74 68 65 20   "." before the 
2e860 6c 61 73 74 20 2f 20 63 68 61 72 61 63 74 65 72  last / character
2e870 20 2a 2f 0a 20 20 66 6f 72 28 20 69 3d 28 6c 65   */.  for( i=(le
2e880 6e 2d 31 29 3b 20 69 3e 3d 30 3b 20 69 2d 2d 20  n-1); i>=0; i-- 
2e890 29 7b 0a 20 20 20 20 69 66 28 20 63 6f 6e 63 68  ){.    if( conch
2e8a0 50 61 74 68 5b 69 5d 3d 3d 27 2f 27 20 29 7b 0a  Path[i]=='/' ){.
2e8b0 20 20 20 20 20 20 69 2b 2b 3b 0a 20 20 20 20 20        i++;.     
2e8c0 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
2e8d0 7d 0a 20 20 63 6f 6e 63 68 50 61 74 68 5b 69 5d  }.  conchPath[i]
2e8e0 3d 27 2e 27 3b 0a 20 20 77 68 69 6c 65 20 28 20  ='.';.  while ( 
2e8f0 69 3c 6c 65 6e 20 29 7b 0a 20 20 20 20 63 6f 6e  i<len ){.    con
2e900 63 68 50 61 74 68 5b 69 2b 31 5d 3d 64 62 50 61  chPath[i+1]=dbPa
2e910 74 68 5b 69 5d 3b 0a 20 20 20 20 69 2b 2b 3b 0a  th[i];.    i++;.
2e920 20 20 7d 0a 0a 20 20 2f 2a 20 61 70 70 65 6e 64    }..  /* append
2e930 20 74 68 65 20 22 2d 63 6f 6e 63 68 22 20 73 75   the "-conch" su
2e940 66 66 69 78 20 74 6f 20 74 68 65 20 66 69 6c 65  ffix to the file
2e950 20 2a 2f 0a 20 20 6d 65 6d 63 70 79 28 26 63 6f   */.  memcpy(&co
2e960 6e 63 68 50 61 74 68 5b 69 2b 31 5d 2c 20 22 2d  nchPath[i+1], "-
2e970 63 6f 6e 63 68 22 2c 20 37 29 3b 0a 20 20 61 73  conch", 7);.  as
2e980 73 65 72 74 28 20 28 69 6e 74 29 73 74 72 6c 65  sert( (int)strle
2e990 6e 28 63 6f 6e 63 68 50 61 74 68 29 20 3d 3d 20  n(conchPath) == 
2e9a0 6c 65 6e 2b 37 20 29 3b 0a 0a 20 20 72 65 74 75  len+7 );..  retu
2e9b0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
2e9c0 0a 0a 2f 2a 20 54 61 6b 65 73 20 61 20 66 75 6c  ../* Takes a ful
2e9d0 6c 79 20 63 6f 6e 66 69 67 75 72 65 64 20 70 72  ly configured pr
2e9e0 6f 78 79 20 6c 6f 63 6b 69 6e 67 2d 73 74 79 6c  oxy locking-styl
2e9f0 65 20 75 6e 69 78 20 66 69 6c 65 20 61 6e 64 20  e unix file and 
2ea00 73 77 69 74 63 68 65 73 0a 2a 2a 20 74 68 65 20  switches.** the 
2ea10 6c 6f 63 61 6c 20 6c 6f 63 6b 20 66 69 6c 65 20  local lock file 
2ea20 70 61 74 68 20 0a 2a 2f 0a 73 74 61 74 69 63 20  path .*/.static 
2ea30 69 6e 74 20 73 77 69 74 63 68 4c 6f 63 6b 50 72  int switchLockPr
2ea40 6f 78 79 50 61 74 68 28 75 6e 69 78 46 69 6c 65  oxyPath(unixFile
2ea50 20 2a 70 46 69 6c 65 2c 20 63 6f 6e 73 74 20 63   *pFile, const c
2ea60 68 61 72 20 2a 70 61 74 68 29 20 7b 0a 20 20 70  har *path) {.  p
2ea70 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65  roxyLockingConte
2ea80 78 74 20 2a 70 43 74 78 20 3d 20 28 70 72 6f 78  xt *pCtx = (prox
2ea90 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 2a  yLockingContext*
2eaa0 29 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43  )pFile->lockingC
2eab0 6f 6e 74 65 78 74 3b 0a 20 20 63 68 61 72 20 2a  ontext;.  char *
2eac0 6f 6c 64 50 61 74 68 20 3d 20 70 43 74 78 2d 3e  oldPath = pCtx->
2ead0 6c 6f 63 6b 50 72 6f 78 79 50 61 74 68 3b 0a 20  lockProxyPath;. 
2eae0 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
2eaf0 5f 4f 4b 3b 0a 0a 20 20 69 66 28 20 70 46 69 6c  _OK;..  if( pFil
2eb00 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 21 3d 4e 4f  e->eFileLock!=NO
2eb10 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 72 65 74  _LOCK ){.    ret
2eb20 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 3b  urn SQLITE_BUSY;
2eb30 0a 20 20 7d 20 20 0a 0a 20 20 2f 2a 20 6e 6f 74  .  }  ..  /* not
2eb40 68 69 6e 67 20 74 6f 20 64 6f 20 69 66 20 74 68  hing to do if th
2eb50 65 20 70 61 74 68 20 69 73 20 4e 55 4c 4c 2c 20  e path is NULL, 
2eb60 3a 61 75 74 6f 3a 20 6f 72 20 6d 61 74 63 68 65  :auto: or matche
2eb70 73 20 74 68 65 20 65 78 69 73 74 69 6e 67 20 70  s the existing p
2eb80 61 74 68 20 2a 2f 0a 20 20 69 66 28 20 21 70 61  ath */.  if( !pa
2eb90 74 68 20 7c 7c 20 70 61 74 68 5b 30 5d 3d 3d 27  th || path[0]=='
2eba0 5c 30 27 20 7c 7c 20 21 73 74 72 63 6d 70 28 70  \0' || !strcmp(p
2ebb0 61 74 68 2c 20 22 3a 61 75 74 6f 3a 22 29 20 7c  ath, ":auto:") |
2ebc0 7c 0a 20 20 20 20 28 6f 6c 64 50 61 74 68 20 26  |.    (oldPath &
2ebd0 26 20 21 73 74 72 6e 63 6d 70 28 6f 6c 64 50 61  & !strncmp(oldPa
2ebe0 74 68 2c 20 70 61 74 68 2c 20 4d 41 58 50 41 54  th, path, MAXPAT
2ebf0 48 4c 45 4e 29 29 20 29 7b 0a 20 20 20 20 72 65  HLEN)) ){.    re
2ec00 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
2ec10 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 75 6e 69    }else{.    uni
2ec20 78 46 69 6c 65 20 2a 6c 6f 63 6b 50 72 6f 78 79  xFile *lockProxy
2ec30 20 3d 20 70 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f   = pCtx->lockPro
2ec40 78 79 3b 0a 20 20 20 20 70 43 74 78 2d 3e 6c 6f  xy;.    pCtx->lo
2ec50 63 6b 50 72 6f 78 79 3d 4e 55 4c 4c 3b 0a 20 20  ckProxy=NULL;.  
2ec60 20 20 70 43 74 78 2d 3e 63 6f 6e 63 68 48 65 6c    pCtx->conchHel
2ec70 64 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 6c  d = 0;.    if( l
2ec80 6f 63 6b 50 72 6f 78 79 21 3d 4e 55 4c 4c 20 29  ockProxy!=NULL )
2ec90 7b 0a 20 20 20 20 20 20 72 63 3d 6c 6f 63 6b 50  {.      rc=lockP
2eca0 72 6f 78 79 2d 3e 70 4d 65 74 68 6f 64 2d 3e 78  roxy->pMethod->x
2ecb0 43 6c 6f 73 65 28 28 73 71 6c 69 74 65 33 5f 66  Close((sqlite3_f
2ecc0 69 6c 65 20 2a 29 6c 6f 63 6b 50 72 6f 78 79 29  ile *)lockProxy)
2ecd0 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29  ;.      if( rc )
2ece0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
2ecf0 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 6c    sqlite3_free(l
2ed00 6f 63 6b 50 72 6f 78 79 29 3b 0a 20 20 20 20 7d  ockProxy);.    }
2ed10 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
2ed20 65 28 6f 6c 64 50 61 74 68 29 3b 0a 20 20 20 20  e(oldPath);.    
2ed30 70 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 50  pCtx->lockProxyP
2ed40 61 74 68 20 3d 20 73 71 6c 69 74 65 33 44 62 53  ath = sqlite3DbS
2ed50 74 72 44 75 70 28 30 2c 20 70 61 74 68 29 3b 0a  trDup(0, path);.
2ed60 20 20 7d 0a 20 20 0a 20 20 72 65 74 75 72 6e 20    }.  .  return 
2ed70 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 70 46 69  rc;.}../*.** pFi
2ed80 6c 65 20 69 73 20 61 20 66 69 6c 65 20 74 68 61  le is a file tha
2ed90 74 20 68 61 73 20 62 65 65 6e 20 6f 70 65 6e 65  t has been opene
2eda0 64 20 62 79 20 61 20 70 72 69 6f 72 20 78 4f 70  d by a prior xOp
2edb0 65 6e 20 63 61 6c 6c 2e 20 20 64 62 50 61 74 68  en call.  dbPath
2edc0 0a 2a 2a 20 69 73 20 61 20 73 74 72 69 6e 67 20  .** is a string 
2edd0 62 75 66 66 65 72 20 61 74 20 6c 65 61 73 74 20  buffer at least 
2ede0 4d 41 58 50 41 54 48 4c 45 4e 2b 31 20 63 68 61  MAXPATHLEN+1 cha
2edf0 72 61 63 74 65 72 73 20 69 6e 20 73 69 7a 65 2e  racters in size.
2ee00 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
2ee10 69 6e 65 20 66 69 6e 64 20 74 68 65 20 66 69 6c  ine find the fil
2ee20 65 6e 61 6d 65 20 61 73 73 6f 63 69 61 74 65 64  ename associated
2ee30 20 77 69 74 68 20 70 46 69 6c 65 20 61 6e 64 20   with pFile and 
2ee40 77 72 69 74 65 73 20 69 74 0a 2a 2a 20 69 6e 74  writes it.** int
2ee50 20 64 62 50 61 74 68 2e 0a 2a 2f 0a 73 74 61 74   dbPath..*/.stat
2ee60 69 63 20 69 6e 74 20 70 72 6f 78 79 47 65 74 44  ic int proxyGetD
2ee70 62 50 61 74 68 46 6f 72 55 6e 69 78 46 69 6c 65  bPathForUnixFile
2ee80 28 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65  (unixFile *pFile
2ee90 2c 20 63 68 61 72 20 2a 64 62 50 61 74 68 29 7b  , char *dbPath){
2eea0 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 41  .#if defined(__A
2eeb0 50 50 4c 45 5f 5f 29 0a 20 20 69 66 28 20 70 46  PPLE__).  if( pF
2eec0 69 6c 65 2d 3e 70 4d 65 74 68 6f 64 20 3d 3d 20  ile->pMethod == 
2eed0 26 61 66 70 49 6f 4d 65 74 68 6f 64 73 20 29 7b  &afpIoMethods ){
2eee0 0a 20 20 20 20 2f 2a 20 61 66 70 20 73 74 79 6c  .    /* afp styl
2eef0 65 20 6b 65 65 70 73 20 61 20 72 65 66 65 72 65  e keeps a refere
2ef00 6e 63 65 20 74 6f 20 74 68 65 20 64 62 20 70 61  nce to the db pa
2ef10 74 68 20 69 6e 20 74 68 65 20 66 69 6c 65 50 61  th in the filePa
2ef20 74 68 20 66 69 65 6c 64 20 0a 20 20 20 20 2a 2a  th field .    **
2ef30 20 6f 66 20 74 68 65 20 73 74 72 75 63 74 20 2a   of the struct *
2ef40 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 69  /.    assert( (i
2ef50 6e 74 29 73 74 72 6c 65 6e 28 28 63 68 61 72 2a  nt)strlen((char*
2ef60 29 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43  )pFile->lockingC
2ef70 6f 6e 74 65 78 74 29 3c 3d 4d 41 58 50 41 54 48  ontext)<=MAXPATH
2ef80 4c 45 4e 20 29 3b 0a 20 20 20 20 73 74 72 6c 63  LEN );.    strlc
2ef90 70 79 28 64 62 50 61 74 68 2c 20 28 28 61 66 70  py(dbPath, ((afp
2efa0 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a  LockingContext *
2efb0 29 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43  )pFile->lockingC
2efc0 6f 6e 74 65 78 74 29 2d 3e 64 62 50 61 74 68 2c  ontext)->dbPath,
2efd0 20 4d 41 58 50 41 54 48 4c 45 4e 29 3b 0a 20 20   MAXPATHLEN);.  
2efe0 7d 20 65 6c 73 65 0a 23 65 6e 64 69 66 0a 20 20  } else.#endif.  
2eff0 69 66 28 20 70 46 69 6c 65 2d 3e 70 4d 65 74 68  if( pFile->pMeth
2f000 6f 64 20 3d 3d 20 26 64 6f 74 6c 6f 63 6b 49 6f  od == &dotlockIo
2f010 4d 65 74 68 6f 64 73 20 29 7b 0a 20 20 20 20 2f  Methods ){.    /
2f020 2a 20 64 6f 74 20 6c 6f 63 6b 20 73 74 79 6c 65  * dot lock style
2f030 20 75 73 65 73 20 74 68 65 20 6c 6f 63 6b 69 6e   uses the lockin
2f040 67 20 63 6f 6e 74 65 78 74 20 74 6f 20 73 74 6f  g context to sto
2f050 72 65 20 74 68 65 20 64 6f 74 20 6c 6f 63 6b 0a  re the dot lock.
2f060 20 20 20 20 2a 2a 20 66 69 6c 65 20 70 61 74 68      ** file path
2f070 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6c 65 6e 20   */.    int len 
2f080 3d 20 73 74 72 6c 65 6e 28 28 63 68 61 72 20 2a  = strlen((char *
2f090 29 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43  )pFile->lockingC
2f0a0 6f 6e 74 65 78 74 29 20 2d 20 73 74 72 6c 65 6e  ontext) - strlen
2f0b0 28 44 4f 54 4c 4f 43 4b 5f 53 55 46 46 49 58 29  (DOTLOCK_SUFFIX)
2f0c0 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 64 62 50  ;.    memcpy(dbP
2f0d0 61 74 68 2c 20 28 63 68 61 72 20 2a 29 70 46 69  ath, (char *)pFi
2f0e0 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65  le->lockingConte
2f0f0 78 74 2c 20 6c 65 6e 20 2b 20 31 29 3b 0a 20 20  xt, len + 1);.  
2f100 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 61 6c  }else{.    /* al
2f110 6c 20 6f 74 68 65 72 20 73 74 79 6c 65 73 20 75  l other styles u
2f120 73 65 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 63  se the locking c
2f130 6f 6e 74 65 78 74 20 74 6f 20 73 74 6f 72 65 20  ontext to store 
2f140 74 68 65 20 64 62 20 66 69 6c 65 20 70 61 74 68  the db file path
2f150 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20   */.    assert( 
2f160 73 74 72 6c 65 6e 28 28 63 68 61 72 2a 29 70 46  strlen((char*)pF
2f170 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74  ile->lockingCont
2f180 65 78 74 29 3c 3d 4d 41 58 50 41 54 48 4c 45 4e  ext)<=MAXPATHLEN
2f190 20 29 3b 0a 20 20 20 20 73 74 72 6c 63 70 79 28   );.    strlcpy(
2f1a0 64 62 50 61 74 68 2c 20 28 63 68 61 72 20 2a 29  dbPath, (char *)
2f1b0 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f  pFile->lockingCo
2f1c0 6e 74 65 78 74 2c 20 4d 41 58 50 41 54 48 4c 45  ntext, MAXPATHLE
2f1d0 4e 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  N);.  }.  return
2f1e0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
2f1f0 2a 0a 2a 2a 20 54 61 6b 65 73 20 61 6e 20 61 6c  *.** Takes an al
2f200 72 65 61 64 79 20 66 69 6c 6c 65 64 20 69 6e 20  ready filled in 
2f210 75 6e 69 78 20 66 69 6c 65 20 61 6e 64 20 61 6c  unix file and al
2f220 74 65 72 73 20 69 74 20 73 6f 20 61 6c 6c 20 66  ters it so all f
2f230 69 6c 65 20 6c 6f 63 6b 69 6e 67 20 0a 2a 2a 20  ile locking .** 
2f240 77 69 6c 6c 20 62 65 20 70 65 72 66 6f 72 6d 65  will be performe
2f250 64 20 6f 6e 20 74 68 65 20 6c 6f 63 61 6c 20 70  d on the local p
2f260 72 6f 78 79 20 6c 6f 63 6b 20 66 69 6c 65 2e 20  roxy lock file. 
2f270 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 66   The following f
2f280 69 65 6c 64 73 0a 2a 2a 20 61 72 65 20 70 72 65  ields.** are pre
2f290 73 65 72 76 65 64 20 69 6e 20 74 68 65 20 6c 6f  served in the lo
2f2a0 63 6b 69 6e 67 20 63 6f 6e 74 65 78 74 20 73 6f  cking context so
2f2b0 20 74 68 61 74 20 74 68 65 79 20 63 61 6e 20 62   that they can b
2f2c0 65 20 72 65 73 74 6f 72 65 64 20 61 6e 64 20 0a  e restored and .
2f2d0 2a 2a 20 74 68 65 20 75 6e 69 78 20 73 74 72 75  ** the unix stru
2f2e0 63 74 75 72 65 20 70 72 6f 70 65 72 6c 79 20 63  cture properly c
2f2f0 6c 65 61 6e 65 64 20 75 70 20 61 74 20 63 6c 6f  leaned up at clo
2f300 73 65 20 74 69 6d 65 3a 0a 2a 2a 20 20 2d 3e 6c  se time:.**  ->l
2f310 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 0a 2a 2a  ockingContext.**
2f320 20 20 2d 3e 70 4d 65 74 68 6f 64 0a 2a 2f 0a 73    ->pMethod.*/.s
2f330 74 61 74 69 63 20 69 6e 74 20 70 72 6f 78 79 54  tatic int proxyT
2f340 72 61 6e 73 66 6f 72 6d 55 6e 69 78 46 69 6c 65  ransformUnixFile
2f350 28 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65  (unixFile *pFile
2f360 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 70 61  , const char *pa
2f370 74 68 29 20 7b 0a 20 20 70 72 6f 78 79 4c 6f 63  th) {.  proxyLoc
2f380 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 70 43 74  kingContext *pCt
2f390 78 3b 0a 20 20 63 68 61 72 20 64 62 50 61 74 68  x;.  char dbPath
2f3a0 5b 4d 41 58 50 41 54 48 4c 45 4e 2b 31 5d 3b 20  [MAXPATHLEN+1]; 
2f3b0 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66        /* Name of
2f3c0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
2f3d0 6c 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 6c 6f  le */.  char *lo
2f3e0 63 6b 50 61 74 68 3d 4e 55 4c 4c 3b 0a 20 20 69  ckPath=NULL;.  i
2f3f0 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
2f400 4b 3b 0a 20 20 0a 20 20 69 66 28 20 70 46 69 6c  K;.  .  if( pFil
2f410 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 21 3d 4e 4f  e->eFileLock!=NO
2f420 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 72 65 74  _LOCK ){.    ret
2f430 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 3b  urn SQLITE_BUSY;
2f440 0a 20 20 7d 0a 20 20 70 72 6f 78 79 47 65 74 44  .  }.  proxyGetD
2f450 62 50 61 74 68 46 6f 72 55 6e 69 78 46 69 6c 65  bPathForUnixFile
2f460 28 70 46 69 6c 65 2c 20 64 62 50 61 74 68 29 3b  (pFile, dbPath);
2f470 0a 20 20 69 66 28 20 21 70 61 74 68 20 7c 7c 20  .  if( !path || 
2f480 70 61 74 68 5b 30 5d 3d 3d 27 5c 30 27 20 7c 7c  path[0]=='\0' ||
2f490 20 21 73 74 72 63 6d 70 28 70 61 74 68 2c 20 22   !strcmp(path, "
2f4a0 3a 61 75 74 6f 3a 22 29 20 29 7b 0a 20 20 20 20  :auto:") ){.    
2f4b0 6c 6f 63 6b 50 61 74 68 3d 4e 55 4c 4c 3b 0a 20  lockPath=NULL;. 
2f4c0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6c 6f 63 6b   }else{.    lock
2f4d0 50 61 74 68 3d 28 63 68 61 72 20 2a 29 70 61 74  Path=(char *)pat
2f4e0 68 3b 0a 20 20 7d 0a 20 20 0a 20 20 4f 53 54 52  h;.  }.  .  OSTR
2f4f0 41 43 45 28 28 22 54 52 41 4e 53 50 52 4f 58 59  ACE(("TRANSPROXY
2f500 20 20 25 64 20 66 6f 72 20 25 73 20 70 69 64 3d    %d for %s pid=
2f510 25 64 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c  %d\n", pFile->h,
2f520 0a 20 20 20 20 20 20 20 20 20 20 20 28 6c 6f 63  .           (loc
2f530 6b 50 61 74 68 20 3f 20 6c 6f 63 6b 50 61 74 68  kPath ? lockPath
2f540 20 3a 20 22 3a 61 75 74 6f 3a 22 29 2c 20 67 65   : ":auto:"), ge
2f550 74 70 69 64 28 29 29 29 3b 0a 0a 20 20 70 43 74  tpid()));..  pCt
2f560 78 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c  x = sqlite3_mall
2f570 6f 63 28 20 73 69 7a 65 6f 66 28 2a 70 43 74 78  oc( sizeof(*pCtx
2f580 29 20 29 3b 0a 20 20 69 66 28 20 70 43 74 78 3d  ) );.  if( pCtx=
2f590 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  =0 ){.    return
2f5a0 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
2f5b0 20 7d 0a 20 20 6d 65 6d 73 65 74 28 70 43 74 78   }.  memset(pCtx
2f5c0 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a 70 43 74  , 0, sizeof(*pCt
2f5d0 78 29 29 3b 0a 0a 20 20 72 63 20 3d 20 70 72 6f  x));..  rc = pro
2f5e0 78 79 43 72 65 61 74 65 43 6f 6e 63 68 50 61 74  xyCreateConchPat
2f5f0 68 6e 61 6d 65 28 64 62 50 61 74 68 2c 20 26 70  hname(dbPath, &p
2f600 43 74 78 2d 3e 63 6f 6e 63 68 46 69 6c 65 50 61  Ctx->conchFilePa
2f610 74 68 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53  th);.  if( rc==S
2f620 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
2f630 72 63 20 3d 20 70 72 6f 78 79 43 72 65 61 74 65  rc = proxyCreate
2f640 55 6e 69 78 46 69 6c 65 28 70 43 74 78 2d 3e 63  UnixFile(pCtx->c
2f650 6f 6e 63 68 46 69 6c 65 50 61 74 68 2c 20 26 70  onchFilePath, &p
2f660 43 74 78 2d 3e 63 6f 6e 63 68 46 69 6c 65 2c 20  Ctx->conchFile, 
2f670 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d  0);.    if( rc==
2f680 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 20  SQLITE_CANTOPEN 
2f690 26 26 20 28 28 70 46 69 6c 65 2d 3e 6f 70 65 6e  && ((pFile->open
2f6a0 46 6c 61 67 73 26 4f 5f 52 44 57 52 29 20 3d 3d  Flags&O_RDWR) ==
2f6b0 20 30 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20   0) ){.      /* 
2f6c0 69 66 20 28 61 29 20 74 68 65 20 6f 70 65 6e 20  if (a) the open 
2f6d0 66 6c 61 67 73 20 61 72 65 20 6e 6f 74 20 4f 5f  flags are not O_
2f6e0 52 44 57 52 2c 20 28 62 29 20 74 68 65 20 63 6f  RDWR, (b) the co
2f6f0 6e 63 68 20 69 73 6e 27 74 20 74 68 65 72 65 2c  nch isn't there,
2f700 20 61 6e 64 0a 20 20 20 20 20 20 2a 2a 20 28 63   and.      ** (c
2f710 29 20 74 68 65 20 66 69 6c 65 20 73 79 73 74 65  ) the file syste
2f720 6d 20 69 73 20 72 65 61 64 2d 6f 6e 6c 79 2c 20  m is read-only, 
2f730 74 68 65 6e 20 65 6e 61 62 6c 65 20 6e 6f 2d 6c  then enable no-l
2f740 6f 63 6b 69 6e 67 20 61 63 63 65 73 73 2e 0a 20  ocking access.. 
2f750 20 20 20 20 20 2a 2a 20 55 67 68 2c 20 73 69 6e       ** Ugh, sin
2f760 63 65 20 4f 5f 52 44 4f 4e 4c 59 3d 3d 30 78 30  ce O_RDONLY==0x0
2f770 30 30 30 20 77 65 20 74 65 73 74 20 66 6f 72 20  000 we test for 
2f780 21 4f 5f 52 44 57 52 20 73 69 6e 63 65 20 75 6e  !O_RDWR since un
2f790 69 78 4f 70 65 6e 20 61 73 73 65 72 74 73 0a 20  ixOpen asserts. 
2f7a0 20 20 20 20 20 2a 2a 20 74 68 61 74 20 6f 70 65       ** that ope
2f7b0 6e 46 6c 61 67 73 20 77 69 6c 6c 20 68 61 76 65  nFlags will have
2f7c0 20 6f 6e 6c 79 20 6f 6e 65 20 6f 66 20 4f 5f 52   only one of O_R
2f7d0 44 4f 4e 4c 59 20 6f 72 20 4f 5f 52 44 57 52 2e  DONLY or O_RDWR.
2f7e0 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
2f7f0 73 74 72 75 63 74 20 73 74 61 74 66 73 20 66 73  struct statfs fs
2f800 49 6e 66 6f 3b 0a 20 20 20 20 20 20 73 74 72 75  Info;.      stru
2f810 63 74 20 73 74 61 74 20 63 6f 6e 63 68 49 6e 66  ct stat conchInf
2f820 6f 3b 0a 20 20 20 20 20 20 69 6e 74 20 67 6f 4c  o;.      int goL
2f830 6f 63 6b 6c 65 73 73 20 3d 20 30 3b 0a 0a 20 20  ockless = 0;..  
2f840 20 20 20 20 69 66 28 20 73 74 61 74 28 70 43 74      if( stat(pCt
2f850 78 2d 3e 63 6f 6e 63 68 46 69 6c 65 50 61 74 68  x->conchFilePath
2f860 2c 20 26 63 6f 6e 63 68 49 6e 66 6f 29 20 3d 3d  , &conchInfo) ==
2f870 20 2d 31 20 29 20 7b 0a 20 20 20 20 20 20 20 20   -1 ) {.        
2f880 69 6e 74 20 65 72 72 20 3d 20 65 72 72 6e 6f 3b  int err = errno;
2f890 0a 20 20 20 20 20 20 20 20 69 66 28 20 28 65 72  .        if( (er
2f8a0 72 3d 3d 45 4e 4f 45 4e 54 29 20 26 26 20 28 73  r==ENOENT) && (s
2f8b0 74 61 74 66 73 28 64 62 50 61 74 68 2c 20 26 66  tatfs(dbPath, &f
2f8c0 73 49 6e 66 6f 29 20 21 3d 20 2d 31 29 20 29 7b  sInfo) != -1) ){
2f8d0 0a 20 20 20 20 20 20 20 20 20 20 67 6f 4c 6f 63  .          goLoc
2f8e0 6b 6c 65 73 73 20 3d 20 28 66 73 49 6e 66 6f 2e  kless = (fsInfo.
2f8f0 66 5f 66 6c 61 67 73 26 4d 4e 54 5f 52 44 4f 4e  f_flags&MNT_RDON
2f900 4c 59 29 20 3d 3d 20 4d 4e 54 5f 52 44 4f 4e 4c  LY) == MNT_RDONL
2f910 59 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  Y;.        }.   
2f920 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 67     }.      if( g
2f930 6f 4c 6f 63 6b 6c 65 73 73 20 29 7b 0a 20 20 20  oLockless ){.   
2f940 20 20 20 20 20 70 43 74 78 2d 3e 63 6f 6e 63 68       pCtx->conch
2f950 48 65 6c 64 20 3d 20 2d 31 3b 20 2f 2a 20 72 65  Held = -1; /* re
2f960 61 64 20 6f 6e 6c 79 20 46 53 2f 20 6c 6f 63 6b  ad only FS/ lock
2f970 6c 65 73 73 20 2a 2f 0a 20 20 20 20 20 20 20 20  less */.        
2f980 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
2f990 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
2f9a0 7d 20 20 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  }  .  if( rc==SQ
2f9b0 4c 49 54 45 5f 4f 4b 20 26 26 20 6c 6f 63 6b 50  LITE_OK && lockP
2f9c0 61 74 68 20 29 7b 0a 20 20 20 20 70 43 74 78 2d  ath ){.    pCtx-
2f9d0 3e 6c 6f 63 6b 50 72 6f 78 79 50 61 74 68 20 3d  >lockProxyPath =
2f9e0 20 73 71 6c 69 74 65 33 44 62 53 74 72 44 75 70   sqlite3DbStrDup
2f9f0 28 30 2c 20 6c 6f 63 6b 50 61 74 68 29 3b 0a 20  (0, lockPath);. 
2fa00 20 7d 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51   }..  if( rc==SQ
2fa10 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70  LITE_OK ){.    p
2fa20 43 74 78 2d 3e 64 62 50 61 74 68 20 3d 20 73 71  Ctx->dbPath = sq
2fa30 6c 69 74 65 33 44 62 53 74 72 44 75 70 28 30 2c  lite3DbStrDup(0,
2fa40 20 64 62 50 61 74 68 29 3b 0a 20 20 20 20 69 66   dbPath);.    if
2fa50 28 20 70 43 74 78 2d 3e 64 62 50 61 74 68 3d 3d  ( pCtx->dbPath==
2fa60 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 20 20 72 63  NULL ){.      rc
2fa70 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b   = SQLITE_NOMEM;
2fa80 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
2fa90 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
2faa0 7b 0a 20 20 20 20 2f 2a 20 61 6c 6c 20 6d 65 6d  {.    /* all mem
2fab0 6f 72 79 20 69 73 20 61 6c 6c 6f 63 61 74 65 64  ory is allocated
2fac0 2c 20 70 72 6f 78 79 73 20 61 72 65 20 63 72 65  , proxys are cre
2fad0 61 74 65 64 20 61 6e 64 20 61 73 73 69 67 6e 65  ated and assigne
2fae0 64 2c 20 0a 20 20 20 20 2a 2a 20 73 77 69 74 63  d, .    ** switc
2faf0 68 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 63 6f  h the locking co
2fb00 6e 74 65 78 74 20 61 6e 64 20 70 4d 65 74 68 6f  ntext and pMetho
2fb10 64 20 74 68 65 6e 20 72 65 74 75 72 6e 2e 0a 20  d then return.. 
2fb20 20 20 20 2a 2f 0a 20 20 20 20 70 43 74 78 2d 3e     */.    pCtx->
2fb30 6f 6c 64 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78  oldLockingContex
2fb40 74 20 3d 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69  t = pFile->locki
2fb50 6e 67 43 6f 6e 74 65 78 74 3b 0a 20 20 20 20 70  ngContext;.    p
2fb60 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e  File->lockingCon
2fb70 74 65 78 74 20 3d 20 70 43 74 78 3b 0a 20 20 20  text = pCtx;.   
2fb80 20 70 43 74 78 2d 3e 70 4f 6c 64 4d 65 74 68 6f   pCtx->pOldMetho
2fb90 64 20 3d 20 70 46 69 6c 65 2d 3e 70 4d 65 74 68  d = pFile->pMeth
2fba0 6f 64 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 70  od;.    pFile->p
2fbb0 4d 65 74 68 6f 64 20 3d 20 26 70 72 6f 78 79 49  Method = &proxyI
2fbc0 6f 4d 65 74 68 6f 64 73 3b 0a 20 20 7d 65 6c 73  oMethods;.  }els
2fbd0 65 7b 0a 20 20 20 20 69 66 28 20 70 43 74 78 2d  e{.    if( pCtx-
2fbe0 3e 63 6f 6e 63 68 46 69 6c 65 20 29 7b 20 0a 20  >conchFile ){ . 
2fbf0 20 20 20 20 20 70 43 74 78 2d 3e 63 6f 6e 63 68       pCtx->conch
2fc00 46 69 6c 65 2d 3e 70 4d 65 74 68 6f 64 2d 3e 78  File->pMethod->x
2fc10 43 6c 6f 73 65 28 28 73 71 6c 69 74 65 33 5f 66  Close((sqlite3_f
2fc20 69 6c 65 20 2a 29 70 43 74 78 2d 3e 63 6f 6e 63  ile *)pCtx->conc
2fc30 68 46 69 6c 65 29 3b 0a 20 20 20 20 20 20 73 71  hFile);.      sq
2fc40 6c 69 74 65 33 5f 66 72 65 65 28 70 43 74 78 2d  lite3_free(pCtx-
2fc50 3e 63 6f 6e 63 68 46 69 6c 65 29 3b 0a 20 20 20  >conchFile);.   
2fc60 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66   }.    sqlite3_f
2fc70 72 65 65 28 70 43 74 78 2d 3e 6c 6f 63 6b 50 72  ree(pCtx->lockPr
2fc80 6f 78 79 50 61 74 68 29 3b 0a 20 20 20 20 73 71  oxyPath);.    sq
2fc90 6c 69 74 65 33 5f 66 72 65 65 28 70 43 74 78 2d  lite3_free(pCtx-
2fca0 3e 63 6f 6e 63 68 46 69 6c 65 50 61 74 68 29 3b  >conchFilePath);
2fcb0 20 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72   .    sqlite3_fr
2fcc0 65 65 28 70 43 74 78 29 3b 0a 20 20 7d 0a 20 20  ee(pCtx);.  }.  
2fcd0 4f 53 54 52 41 43 45 28 28 22 54 52 41 4e 53 50  OSTRACE(("TRANSP
2fce0 52 4f 58 59 20 20 25 64 20 25 73 5c 6e 22 2c 20  ROXY  %d %s\n", 
2fcf0 70 46 69 6c 65 2d 3e 68 2c 0a 20 20 20 20 20 20  pFile->h,.      
2fd00 20 20 20 20 20 28 72 63 3d 3d 53 51 4c 49 54 45       (rc==SQLITE
2fd10 5f 4f 4b 20 3f 20 22 6f 6b 22 20 3a 20 22 66 61  _OK ? "ok" : "fa
2fd20 69 6c 65 64 22 29 29 29 3b 0a 20 20 72 65 74 75  iled")));.  retu
2fd30 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  rn rc;.}.../*.**
2fd40 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 68 61   This routine ha
2fd50 6e 64 6c 65 73 20 73 71 6c 69 74 65 33 5f 66 69  ndles sqlite3_fi
2fd60 6c 65 5f 63 6f 6e 74 72 6f 6c 28 29 20 63 61 6c  le_control() cal
2fd70 6c 73 20 74 68 61 74 20 61 72 65 20 73 70 65 63  ls that are spec
2fd80 69 66 69 63 0a 2a 2a 20 74 6f 20 70 72 6f 78 79  ific.** to proxy
2fd90 20 6c 6f 63 6b 69 6e 67 2e 0a 2a 2f 0a 73 74 61   locking..*/.sta
2fda0 74 69 63 20 69 6e 74 20 70 72 6f 78 79 46 69 6c  tic int proxyFil
2fdb0 65 43 6f 6e 74 72 6f 6c 28 73 71 6c 69 74 65 33  eControl(sqlite3
2fdc0 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 6f  _file *id, int o
2fdd0 70 2c 20 76 6f 69 64 20 2a 70 41 72 67 29 7b 0a  p, void *pArg){.
2fde0 20 20 73 77 69 74 63 68 28 20 6f 70 20 29 7b 0a    switch( op ){.
2fdf0 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
2fe00 47 45 54 5f 4c 4f 43 4b 50 52 4f 58 59 46 49 4c  GET_LOCKPROXYFIL
2fe10 45 3a 20 7b 0a 20 20 20 20 20 20 75 6e 69 78 46  E: {.      unixF
2fe20 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e  ile *pFile = (un
2fe30 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 20 20  ixFile*)id;.    
2fe40 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 70 4d 65    if( pFile->pMe
2fe50 74 68 6f 64 20 3d 3d 20 26 70 72 6f 78 79 49 6f  thod == &proxyIo
2fe60 4d 65 74 68 6f 64 73 20 29 7b 0a 20 20 20 20 20  Methods ){.     
2fe70 20 20 20 70 72 6f 78 79 4c 6f 63 6b 69 6e 67 43     proxyLockingC
2fe80 6f 6e 74 65 78 74 20 2a 70 43 74 78 20 3d 20 28  ontext *pCtx = (
2fe90 70 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74  proxyLockingCont
2fea0 65 78 74 2a 29 70 46 69 6c 65 2d 3e 6c 6f 63 6b  ext*)pFile->lock
2feb0 69 6e 67 43 6f 6e 74 65 78 74 3b 0a 20 20 20 20  ingContext;.    
2fec0 20 20 20 20 70 72 6f 78 79 54 61 6b 65 43 6f 6e      proxyTakeCon
2fed0 63 68 28 70 46 69 6c 65 29 3b 0a 20 20 20 20 20  ch(pFile);.     
2fee0 20 20 20 69 66 28 20 70 43 74 78 2d 3e 6c 6f 63     if( pCtx->loc
2fef0 6b 50 72 6f 78 79 50 61 74 68 20 29 7b 0a 20 20  kProxyPath ){.  
2ff00 20 20 20 20 20 20 20 20 2a 28 63 6f 6e 73 74 20          *(const 
2ff10 63 68 61 72 20 2a 2a 29 70 41 72 67 20 3d 20 70  char **)pArg = p
2ff20 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 50 61  Ctx->lockProxyPa
2ff30 74 68 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  th;.        }els
2ff40 65 7b 0a 20 20 20 20 20 20 20 20 20 20 2a 28 63  e{.          *(c
2ff50 6f 6e 73 74 20 63 68 61 72 20 2a 2a 29 70 41 72  onst char **)pAr
2ff60 67 20 3d 20 22 3a 61 75 74 6f 3a 20 28 6e 6f 74  g = ":auto: (not
2ff70 20 68 65 6c 64 29 22 3b 0a 20 20 20 20 20 20 20   held)";.       
2ff80 20 7d 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 20   }.      } else 
2ff90 7b 0a 20 20 20 20 20 20 20 20 2a 28 63 6f 6e 73  {.        *(cons
2ffa0 74 20 63 68 61 72 20 2a 2a 29 70 41 72 67 20 3d  t char **)pArg =
2ffb0 20 4e 55 4c 4c 3b 0a 20 20 20 20 20 20 7d 0a 20   NULL;.      }. 
2ffc0 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
2ffd0 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20  TE_OK;.    }.   
2ffe0 20 63 61 73 65 20 53 51 4c 49 54 45 5f 53 45 54   case SQLITE_SET
2fff0 5f 4c 4f 43 4b 50 52 4f 58 59 46 49 4c 45 3a 20  _LOCKPROXYFILE: 
30000 7b 0a 20 20 20 20 20 20 75 6e 69 78 46 69 6c 65  {.      unixFile
30010 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46   *pFile = (unixF
30020 69 6c 65 2a 29 69 64 3b 0a 20 20 20 20 20 20 69  ile*)id;.      i
30030 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
30040 4b 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 73 50  K;.      int isP
30050 72 6f 78 79 53 74 79 6c 65 20 3d 20 28 70 46 69  roxyStyle = (pFi
30060 6c 65 2d 3e 70 4d 65 74 68 6f 64 20 3d 3d 20 26  le->pMethod == &
30070 70 72 6f 78 79 49 6f 4d 65 74 68 6f 64 73 29 3b  proxyIoMethods);
30080 0a 20 20 20 20 20 20 69 66 28 20 70 41 72 67 3d  .      if( pArg=
30090 3d 4e 55 4c 4c 20 7c 7c 20 28 63 6f 6e 73 74 20  =NULL || (const 
300a0 63 68 61 72 20 2a 29 70 41 72 67 3d 3d 30 20 29  char *)pArg==0 )
300b0 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 73  {.        if( is
300c0 50 72 6f 78 79 53 74 79 6c 65 20 29 7b 0a 20 20  ProxyStyle ){.  
300d0 20 20 20 20 20 20 20 20 2f 2a 20 74 75 72 6e 20          /* turn 
300e0 6f 66 66 20 70 72 6f 78 79 20 6c 6f 63 6b 69 6e  off proxy lockin
300f0 67 20 2d 20 6e 6f 74 20 73 75 70 70 6f 72 74 65  g - not supporte
30100 64 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 72  d */.          r
30110 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  c = SQLITE_ERROR
30120 20 2f 2a 53 51 4c 49 54 45 5f 50 52 4f 54 4f 43   /*SQLITE_PROTOC
30130 4f 4c 3f 20 53 51 4c 49 54 45 5f 4d 49 53 55 53  OL? SQLITE_MISUS
30140 45 3f 2a 2f 3b 0a 20 20 20 20 20 20 20 20 7d 65  E?*/;.        }e
30150 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 2f  lse{.          /
30160 2a 20 74 75 72 6e 20 6f 66 66 20 70 72 6f 78 79  * turn off proxy
30170 20 6c 6f 63 6b 69 6e 67 20 2d 20 61 6c 72 65 61   locking - alrea
30180 64 79 20 6f 66 66 20 2d 20 4e 4f 4f 50 20 2a 2f  dy off - NOOP */
30190 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
301a0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20  SQLITE_OK;.     
301b0 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65     }.      }else
301c0 7b 0a 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20  {.        const 
301d0 63 68 61 72 20 2a 70 72 6f 78 79 50 61 74 68 20  char *proxyPath 
301e0 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 29  = (const char *)
301f0 70 41 72 67 3b 0a 20 20 20 20 20 20 20 20 69 66  pArg;.        if
30200 28 20 69 73 50 72 6f 78 79 53 74 79 6c 65 20 29  ( isProxyStyle )
30210 7b 0a 20 20 20 20 20 20 20 20 20 20 70 72 6f 78  {.          prox
30220 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20  yLockingContext 
30230 2a 70 43 74 78 20 3d 20 0a 20 20 20 20 20 20 20  *pCtx = .       
30240 20 20 20 20 20 28 70 72 6f 78 79 4c 6f 63 6b 69       (proxyLocki
30250 6e 67 43 6f 6e 74 65 78 74 2a 29 70 46 69 6c 65  ngContext*)pFile
30260 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  ->lockingContext
30270 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
30280 21 73 74 72 63 6d 70 28 70 41 72 67 2c 20 22 3a  !strcmp(pArg, ":
30290 61 75 74 6f 3a 22 29 20 0a 20 20 20 20 20 20 20  auto:") .       
302a0 20 20 20 20 7c 7c 20 28 70 43 74 78 2d 3e 6c 6f      || (pCtx->lo
302b0 63 6b 50 72 6f 78 79 50 61 74 68 20 26 26 0a 20  ckProxyPath &&. 
302c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 21 73                !s
302d0 74 72 6e 63 6d 70 28 70 43 74 78 2d 3e 6c 6f 63  trncmp(pCtx->loc
302e0 6b 50 72 6f 78 79 50 61 74 68 2c 20 70 72 6f 78  kProxyPath, prox
302f0 79 50 61 74 68 2c 20 4d 41 58 50 41 54 48 4c 45  yPath, MAXPATHLE
30300 4e 29 29 0a 20 20 20 20 20 20 20 20 20 20 29 7b  N)).          ){
30310 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20  .            rc 
30320 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  = SQLITE_OK;.   
30330 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
30340 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73            rc = s
30350 77 69 74 63 68 4c 6f 63 6b 50 72 6f 78 79 50 61  witchLockProxyPa
30360 74 68 28 70 46 69 6c 65 2c 20 70 72 6f 78 79 50  th(pFile, proxyP
30370 61 74 68 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ath);.          
30380 7d 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  }.        }else{
30390 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 74 75  .          /* tu
303a0 72 6e 20 6f 6e 20 70 72 6f 78 79 20 66 69 6c 65  rn on proxy file
303b0 20 6c 6f 63 6b 69 6e 67 20 2a 2f 0a 20 20 20 20   locking */.    
303c0 20 20 20 20 20 20 72 63 20 3d 20 70 72 6f 78 79        rc = proxy
303d0 54 72 61 6e 73 66 6f 72 6d 55 6e 69 78 46 69 6c  TransformUnixFil
303e0 65 28 70 46 69 6c 65 2c 20 70 72 6f 78 79 50 61  e(pFile, proxyPa
303f0 74 68 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  th);.        }. 
30400 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65 74       }.      ret
30410 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20  urn rc;.    }.  
30420 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20    default: {.   
30430 20 20 20 61 73 73 65 72 74 28 20 30 20 29 3b 20     assert( 0 ); 
30440 20 2f 2a 20 54 68 65 20 63 61 6c 6c 20 61 73 73   /* The call ass
30450 75 72 65 73 20 74 68 61 74 20 6f 6e 6c 79 20 76  ures that only v
30460 61 6c 69 64 20 6f 70 63 6f 64 65 73 20 61 72 65  alid opcodes are
30470 20 73 65 6e 74 20 2a 2f 0a 20 20 20 20 7d 0a 20   sent */.    }. 
30480 20 7d 0a 20 20 2f 2a 4e 4f 54 52 45 41 43 48 45   }.  /*NOTREACHE
30490 44 2a 2f 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  D*/.  return SQL
304a0 49 54 45 5f 45 52 52 4f 52 3b 0a 7d 0a 0a 2f 2a  ITE_ERROR;.}../*
304b0 0a 2a 2a 20 57 69 74 68 69 6e 20 74 68 69 73 20  .** Within this 
304c0 64 69 76 69 73 69 6f 6e 20 28 74 68 65 20 70 72  division (the pr
304d0 6f 78 79 69 6e 67 20 6c 6f 63 6b 69 6e 67 20 69  oxying locking i
304e0 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 29 20 74  mplementation) t
304f0 68 65 20 70 72 6f 63 65 64 75 72 65 73 0a 2a 2a  he procedures.**
30500 20 61 62 6f 76 65 20 74 68 69 73 20 70 6f 69 6e   above this poin
30510 74 20 61 72 65 20 61 6c 6c 20 75 74 69 6c 69 74  t are all utilit
30520 69 65 73 2e 20 20 54 68 65 20 6c 6f 63 6b 2d 72  ies.  The lock-r
30530 65 6c 61 74 65 64 20 6d 65 74 68 6f 64 73 20 6f  elated methods o
30540 66 20 74 68 65 0a 2a 2a 20 70 72 6f 78 79 2d 6c  f the.** proxy-l
30550 6f 63 6b 69 6e 67 20 73 71 6c 69 74 65 33 5f 69  ocking sqlite3_i
30560 6f 5f 6d 65 74 68 6f 64 20 6f 62 6a 65 63 74 20  o_method object 
30570 66 6f 6c 6c 6f 77 2e 0a 2a 2f 0a 0a 0a 2f 2a 0a  follow..*/.../*.
30580 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
30590 63 68 65 63 6b 73 20 69 66 20 74 68 65 72 65 20  checks if there 
305a0 69 73 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f  is a RESERVED lo
305b0 63 6b 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 73  ck held on the s
305c0 70 65 63 69 66 69 65 64 0a 2a 2a 20 66 69 6c 65  pecified.** file
305d0 20 62 79 20 74 68 69 73 20 6f 72 20 61 6e 79 20   by this or any 
305e0 6f 74 68 65 72 20 70 72 6f 63 65 73 73 2e 20 49  other process. I
305f0 66 20 73 75 63 68 20 61 20 6c 6f 63 6b 20 69 73  f such a lock is
30600 20 68 65 6c 64 2c 20 73 65 74 20 2a 70 52 65 73   held, set *pRes
30610 4f 75 74 0a 2a 2a 20 74 6f 20 61 20 6e 6f 6e 2d  Out.** to a non-
30620 7a 65 72 6f 20 76 61 6c 75 65 20 6f 74 68 65 72  zero value other
30630 77 69 73 65 20 2a 70 52 65 73 4f 75 74 20 69 73  wise *pResOut is
30640 20 73 65 74 20 74 6f 20 7a 65 72 6f 2e 20 20 54   set to zero.  T
30650 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 0a  he return value.
30660 2a 2a 20 69 73 20 73 65 74 20 74 6f 20 53 51 4c  ** is set to SQL
30670 49 54 45 5f 4f 4b 20 75 6e 6c 65 73 73 20 61 6e  ITE_OK unless an
30680 20 49 2f 4f 20 65 72 72 6f 72 20 6f 63 63 75 72   I/O error occur
30690 73 20 64 75 72 69 6e 67 20 6c 6f 63 6b 20 63 68  s during lock ch
306a0 65 63 6b 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69  ecking..*/.stati
306b0 63 20 69 6e 74 20 70 72 6f 78 79 43 68 65 63 6b  c int proxyCheck
306c0 52 65 73 65 72 76 65 64 4c 6f 63 6b 28 73 71 6c  ReservedLock(sql
306d0 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69  ite3_file *id, i
306e0 6e 74 20 2a 70 52 65 73 4f 75 74 29 20 7b 0a 20  nt *pResOut) {. 
306f0 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65   unixFile *pFile
30700 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64   = (unixFile*)id
30710 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 70 72 6f  ;.  int rc = pro
30720 78 79 54 61 6b 65 43 6f 6e 63 68 28 70 46 69 6c  xyTakeConch(pFil
30730 65 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  e);.  if( rc==SQ
30740 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70  LITE_OK ){.    p
30750 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65  roxyLockingConte
30760 78 74 20 2a 70 43 74 78 20 3d 20 28 70 72 6f 78  xt *pCtx = (prox
30770 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20  yLockingContext 
30780 2a 29 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67  *)pFile->locking
30790 43 6f 6e 74 65 78 74 3b 0a 20 20 20 20 69 66 28  Context;.    if(
307a0 20 70 43 74 78 2d 3e 63 6f 6e 63 68 48 65 6c 64   pCtx->conchHeld
307b0 3e 30 20 29 7b 0a 20 20 20 20 20 20 75 6e 69 78  >0 ){.      unix
307c0 46 69 6c 65 20 2a 70 72 6f 78 79 20 3d 20 70 43  File *proxy = pC
307d0 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 3b 0a 20  tx->lockProxy;. 
307e0 20 20 20 20 20 72 65 74 75 72 6e 20 70 72 6f 78       return prox
307f0 79 2d 3e 70 4d 65 74 68 6f 64 2d 3e 78 43 68 65  y->pMethod->xChe
30800 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 28 28  ckReservedLock((
30810 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29 70 72  sqlite3_file*)pr
30820 6f 78 79 2c 20 70 52 65 73 4f 75 74 29 3b 0a 20  oxy, pResOut);. 
30830 20 20 20 7d 65 6c 73 65 7b 20 2f 2a 20 63 6f 6e     }else{ /* con
30840 63 68 48 65 6c 64 20 3c 20 30 20 69 73 20 6c 6f  chHeld < 0 is lo
30850 63 6b 6c 65 73 73 20 2a 2f 0a 20 20 20 20 20 20  ckless */.      
30860 70 52 65 73 4f 75 74 3d 30 3b 0a 20 20 20 20 7d  pResOut=0;.    }
30870 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
30880 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 6b 20  ;.}../*.** Lock 
30890 74 68 65 20 66 69 6c 65 20 77 69 74 68 20 74 68  the file with th
308a0 65 20 6c 6f 63 6b 20 73 70 65 63 69 66 69 65 64  e lock specified
308b0 20 62 79 20 70 61 72 61 6d 65 74 65 72 20 65 46   by parameter eF
308c0 69 6c 65 4c 6f 63 6b 20 2d 20 6f 6e 65 0a 2a 2a  ileLock - one.**
308d0 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   of the followin
308e0 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28 31 29  g:.**.**     (1)
308f0 20 53 48 41 52 45 44 5f 4c 4f 43 4b 0a 2a 2a 20   SHARED_LOCK.** 
30900 20 20 20 20 28 32 29 20 52 45 53 45 52 56 45 44      (2) RESERVED
30910 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 33 29  _LOCK.**     (3)
30920 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 0a 2a 2a   PENDING_LOCK.**
30930 20 20 20 20 20 28 34 29 20 45 58 43 4c 55 53 49       (4) EXCLUSI
30940 56 45 5f 4c 4f 43 4b 0a 2a 2a 0a 2a 2a 20 53 6f  VE_LOCK.**.** So
30950 6d 65 74 69 6d 65 73 20 77 68 65 6e 20 72 65 71  metimes when req
30960 75 65 73 74 69 6e 67 20 6f 6e 65 20 6c 6f 63 6b  uesting one lock
30970 20 73 74 61 74 65 2c 20 61 64 64 69 74 69 6f 6e   state, addition
30980 61 6c 20 6c 6f 63 6b 20 73 74 61 74 65 73 0a 2a  al lock states.*
30990 2a 20 61 72 65 20 69 6e 73 65 72 74 65 64 20 69  * are inserted i
309a0 6e 20 62 65 74 77 65 65 6e 2e 20 20 54 68 65 20  n between.  The 
309b0 6c 6f 63 6b 69 6e 67 20 6d 69 67 68 74 20 66 61  locking might fa
309c0 69 6c 20 6f 6e 20 6f 6e 65 20 6f 66 20 74 68 65  il on one of the
309d0 20 6c 61 74 65 72 0a 2a 2a 20 74 72 61 6e 73 69   later.** transi
309e0 74 69 6f 6e 73 20 6c 65 61 76 69 6e 67 20 74 68  tions leaving th
309f0 65 20 6c 6f 63 6b 20 73 74 61 74 65 20 64 69 66  e lock state dif
30a00 66 65 72 65 6e 74 20 66 72 6f 6d 20 77 68 61 74  ferent from what
30a10 20 69 74 20 73 74 61 72 74 65 64 20 62 75 74 0a   it started but.
30a20 2a 2a 20 73 74 69 6c 6c 20 73 68 6f 72 74 20 6f  ** still short o
30a30 66 20 69 74 73 20 67 6f 61 6c 2e 20 20 54 68 65  f its goal.  The
30a40 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 68 61 72 74   following chart
30a50 20 73 68 6f 77 73 20 74 68 65 20 61 6c 6c 6f 77   shows the allow
30a60 65 64 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e  ed.** transition
30a70 73 20 61 6e 64 20 74 68 65 20 69 6e 73 65 72 74  s and the insert
30a80 65 64 20 69 6e 74 65 72 6d 65 64 69 61 74 65 20  ed intermediate 
30a90 73 74 61 74 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  states:.**.**   
30aa0 20 55 4e 4c 4f 43 4b 45 44 20 2d 3e 20 53 48 41   UNLOCKED -> SHA
30ab0 52 45 44 0a 2a 2a 20 20 20 20 53 48 41 52 45 44  RED.**    SHARED
30ac0 20 2d 3e 20 52 45 53 45 52 56 45 44 0a 2a 2a 20   -> RESERVED.** 
30ad0 20 20 20 53 48 41 52 45 44 20 2d 3e 20 28 50 45     SHARED -> (PE
30ae0 4e 44 49 4e 47 29 20 2d 3e 20 45 58 43 4c 55 53  NDING) -> EXCLUS
30af0 49 56 45 0a 2a 2a 20 20 20 20 52 45 53 45 52 56  IVE.**    RESERV
30b00 45 44 20 2d 3e 20 28 50 45 4e 44 49 4e 47 29 20  ED -> (PENDING) 
30b10 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20  -> EXCLUSIVE.** 
30b20 20 20 20 50 45 4e 44 49 4e 47 20 2d 3e 20 45 58     PENDING -> EX
30b30 43 4c 55 53 49 56 45 0a 2a 2a 0a 2a 2a 20 54 68  CLUSIVE.**.** Th
30b40 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20  is routine will 
30b50 6f 6e 6c 79 20 69 6e 63 72 65 61 73 65 20 61 20  only increase a 
30b60 6c 6f 63 6b 2e 20 20 55 73 65 20 74 68 65 20 73  lock.  Use the s
30b70 71 6c 69 74 65 33 4f 73 55 6e 6c 6f 63 6b 28 29  qlite3OsUnlock()
30b80 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 74 6f 20 6c  .** routine to l
30b90 6f 77 65 72 20 61 20 6c 6f 63 6b 69 6e 67 20 6c  ower a locking l
30ba0 65 76 65 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  evel..*/.static 
30bb0 69 6e 74 20 70 72 6f 78 79 4c 6f 63 6b 28 73 71  int proxyLock(sq
30bc0 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20  lite3_file *id, 
30bd0 69 6e 74 20 65 46 69 6c 65 4c 6f 63 6b 29 20 7b  int eFileLock) {
30be0 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69  .  unixFile *pFi
30bf0 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29  le = (unixFile*)
30c00 69 64 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 70  id;.  int rc = p
30c10 72 6f 78 79 54 61 6b 65 43 6f 6e 63 68 28 70 46  roxyTakeConch(pF
30c20 69 6c 65 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d  ile);.  if( rc==
30c30 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
30c40 20 70 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e   proxyLockingCon
30c50 74 65 78 74 20 2a 70 43 74 78 20 3d 20 28 70 72  text *pCtx = (pr
30c60 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78  oxyLockingContex
30c70 74 20 2a 29 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69  t *)pFile->locki
30c80 6e 67 43 6f 6e 74 65 78 74 3b 0a 20 20 20 20 69  ngContext;.    i
30c90 66 28 20 70 43 74 78 2d 3e 63 6f 6e 63 68 48 65  f( pCtx->conchHe
30ca0 6c 64 3e 30 20 29 7b 0a 20 20 20 20 20 20 75 6e  ld>0 ){.      un
30cb0 69 78 46 69 6c 65 20 2a 70 72 6f 78 79 20 3d 20  ixFile *proxy = 
30cc0 70 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 3b  pCtx->lockProxy;
30cd0 0a 20 20 20 20 20 20 72 63 20 3d 20 70 72 6f 78  .      rc = prox
30ce0 79 2d 3e 70 4d 65 74 68 6f 64 2d 3e 78 4c 6f 63  y->pMethod->xLoc
30cf0 6b 28 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a  k((sqlite3_file*
30d00 29 70 72 6f 78 79 2c 20 65 46 69 6c 65 4c 6f 63  )proxy, eFileLoc
30d10 6b 29 3b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d  k);.      pFile-
30d20 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 70 72 6f  >eFileLock = pro
30d30 78 79 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3b 0a 20  xy->eFileLock;. 
30d40 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
30d50 2f 2a 20 63 6f 6e 63 68 48 65 6c 64 20 3c 20 30  /* conchHeld < 0
30d60 20 69 73 20 6c 6f 63 6b 6c 65 73 73 20 2a 2f 0a   is lockless */.
30d70 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
30d80 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  rn rc;.}.../*.**
30d90 20 4c 6f 77 65 72 20 74 68 65 20 6c 6f 63 6b 69   Lower the locki
30da0 6e 67 20 6c 65 76 65 6c 20 6f 6e 20 66 69 6c 65  ng level on file
30db0 20 64 65 73 63 72 69 70 74 6f 72 20 70 46 69 6c   descriptor pFil
30dc0 65 20 74 6f 20 65 46 69 6c 65 4c 6f 63 6b 2e 20  e to eFileLock. 
30dd0 20 65 46 69 6c 65 4c 6f 63 6b 0a 2a 2a 20 6d 75   eFileLock.** mu
30de0 73 74 20 62 65 20 65 69 74 68 65 72 20 4e 4f 5f  st be either NO_
30df0 4c 4f 43 4b 20 6f 72 20 53 48 41 52 45 44 5f 4c  LOCK or SHARED_L
30e00 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  OCK..**.** If th
30e10 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20  e locking level 
30e20 6f 66 20 74 68 65 20 66 69 6c 65 20 64 65 73 63  of the file desc
30e30 72 69 70 74 6f 72 20 69 73 20 61 6c 72 65 61 64  riptor is alread
30e40 79 20 61 74 20 6f 72 20 62 65 6c 6f 77 0a 2a 2a  y at or below.**
30e50 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20 6c   the requested l
30e60 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 2c 20 74 68  ocking level, th
30e70 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20  is routine is a 
30e80 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63  no-op..*/.static
30e90 20 69 6e 74 20 70 72 6f 78 79 55 6e 6c 6f 63 6b   int proxyUnlock
30ea0 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69  (sqlite3_file *i
30eb0 64 2c 20 69 6e 74 20 65 46 69 6c 65 4c 6f 63 6b  d, int eFileLock
30ec0 29 20 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a  ) {.  unixFile *
30ed0 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c  pFile = (unixFil
30ee0 65 2a 29 69 64 3b 0a 20 20 69 6e 74 20 72 63 20  e*)id;.  int rc 
30ef0 3d 20 70 72 6f 78 79 54 61 6b 65 43 6f 6e 63 68  = proxyTakeConch
30f00 28 70 46 69 6c 65 29 3b 0a 20 20 69 66 28 20 72  (pFile);.  if( r
30f10 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
30f20 20 20 20 20 70 72 6f 78 79 4c 6f 63 6b 69 6e 67      proxyLocking
30f30 43 6f 6e 74 65 78 74 20 2a 70 43 74 78 20 3d 20  Context *pCtx = 
30f40 28 70 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e  (proxyLockingCon
30f50 74 65 78 74 20 2a 29 70 46 69 6c 65 2d 3e 6c 6f  text *)pFile->lo
30f60 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 0a 20 20  ckingContext;.  
30f70 20 20 69 66 28 20 70 43 74 78 2d 3e 63 6f 6e 63    if( pCtx->conc
30f80 68 48 65 6c 64 3e 30 20 29 7b 0a 20 20 20 20 20  hHeld>0 ){.     
30f90 20 75 6e 69 78 46 69 6c 65 20 2a 70 72 6f 78 79   unixFile *proxy
30fa0 20 3d 20 70 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f   = pCtx->lockPro
30fb0 78 79 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 70  xy;.      rc = p
30fc0 72 6f 78 79 2d 3e 70 4d 65 74 68 6f 64 2d 3e 78  roxy->pMethod->x
30fd0 55 6e 6c 6f 63 6b 28 28 73 71 6c 69 74 65 33 5f  Unlock((sqlite3_
30fe0 66 69 6c 65 2a 29 70 72 6f 78 79 2c 20 65 46 69  file*)proxy, eFi
30ff0 6c 65 4c 6f 63 6b 29 3b 0a 20 20 20 20 20 20 70  leLock);.      p
31000 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20  File->eFileLock 
31010 3d 20 70 72 6f 78 79 2d 3e 65 46 69 6c 65 4c 6f  = proxy->eFileLo
31020 63 6b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ck;.    }else{. 
31030 20 20 20 20 20 2f 2a 20 63 6f 6e 63 68 48 65 6c       /* conchHel
31040 64 20 3c 20 30 20 69 73 20 6c 6f 63 6b 6c 65 73  d < 0 is lockles
31050 73 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  s */.    }.  }. 
31060 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
31070 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 20 66 69 6c  *.** Close a fil
31080 65 20 74 68 61 74 20 75 73 65 73 20 70 72 6f 78  e that uses prox
31090 79 20 6c 6f 63 6b 73 2e 0a 2a 2f 0a 73 74 61 74  y locks..*/.stat
310a0 69 63 20 69 6e 74 20 70 72 6f 78 79 43 6c 6f 73  ic int proxyClos
310b0 65 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  e(sqlite3_file *
310c0 69 64 29 20 7b 0a 20 20 69 66 28 20 69 64 20 29  id) {.  if( id )
310d0 7b 0a 20 20 20 20 75 6e 69 78 46 69 6c 65 20 2a  {.    unixFile *
310e0 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c  pFile = (unixFil
310f0 65 2a 29 69 64 3b 0a 20 20 20 20 70 72 6f 78 79  e*)id;.    proxy
31100 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a  LockingContext *
31110 70 43 74 78 20 3d 20 28 70 72 6f 78 79 4c 6f 63  pCtx = (proxyLoc
31120 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 29 70 46  kingContext *)pF
31130 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74  ile->lockingCont
31140 65 78 74 3b 0a 20 20 20 20 75 6e 69 78 46 69 6c  ext;.    unixFil
31150 65 20 2a 6c 6f 63 6b 50 72 6f 78 79 20 3d 20 70  e *lockProxy = p
31160 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 3b 0a  Ctx->lockProxy;.
31170 20 20 20 20 75 6e 69 78 46 69 6c 65 20 2a 63 6f      unixFile *co
31180 6e 63 68 46 69 6c 65 20 3d 20 70 43 74 78 2d 3e  nchFile = pCtx->
31190 63 6f 6e 63 68 46 69 6c 65 3b 0a 20 20 20 20 69  conchFile;.    i
311a0 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
311b0 4b 3b 0a 20 20 20 20 0a 20 20 20 20 69 66 28 20  K;.    .    if( 
311c0 6c 6f 63 6b 50 72 6f 78 79 20 29 7b 0a 20 20 20  lockProxy ){.   
311d0 20 20 20 72 63 20 3d 20 6c 6f 63 6b 50 72 6f 78     rc = lockProx
311e0 79 2d 3e 70 4d 65 74 68 6f 64 2d 3e 78 55 6e 6c  y->pMethod->xUnl
311f0 6f 63 6b 28 28 73 71 6c 69 74 65 33 5f 66 69 6c  ock((sqlite3_fil
31200 65 2a 29 6c 6f 63 6b 50 72 6f 78 79 2c 20 4e 4f  e*)lockProxy, NO
31210 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 69 66  _LOCK);.      if
31220 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
31230 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 6c 6f 63  ;.      rc = loc
31240 6b 50 72 6f 78 79 2d 3e 70 4d 65 74 68 6f 64 2d  kProxy->pMethod-
31250 3e 78 43 6c 6f 73 65 28 28 73 71 6c 69 74 65 33  >xClose((sqlite3
31260 5f 66 69 6c 65 2a 29 6c 6f 63 6b 50 72 6f 78 79  _file*)lockProxy
31270 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 20  );.      if( rc 
31280 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20  ) return rc;.   
31290 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
312a0 6c 6f 63 6b 50 72 6f 78 79 29 3b 0a 20 20 20 20  lockProxy);.    
312b0 20 20 70 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78    pCtx->lockProx
312c0 79 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20  y = 0;.    }.   
312d0 20 69 66 28 20 63 6f 6e 63 68 46 69 6c 65 20 29   if( conchFile )
312e0 7b 0a 20 20 20 20 20 20 69 66 28 20 70 43 74 78  {.      if( pCtx
312f0 2d 3e 63 6f 6e 63 68 48 65 6c 64 20 29 7b 0a 20  ->conchHeld ){. 
31300 20 20 20 20 20 20 20 72 63 20 3d 20 70 72 6f 78         rc = prox
31310 79 52 65 6c 65 61 73 65 43 6f 6e 63 68 28 70 46  yReleaseConch(pF
31320 69 6c 65 29 3b 0a 20 20 20 20 20 20 20 20 69 66  ile);.        if
31330 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
31340 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
31350 72 63 20 3d 20 63 6f 6e 63 68 46 69 6c 65 2d 3e  rc = conchFile->
31360 70 4d 65 74 68 6f 64 2d 3e 78 43 6c 6f 73 65 28  pMethod->xClose(
31370 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29 63  (sqlite3_file*)c
31380 6f 6e 63 68 46 69 6c 65 29 3b 0a 20 20 20 20 20  onchFile);.     
31390 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
313a0 20 72 63 3b 0a 20 20 20 20 20 20 73 71 6c 69 74   rc;.      sqlit
313b0 65 33 5f 66 72 65 65 28 63 6f 6e 63 68 46 69 6c  e3_free(conchFil
313c0 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  e);.    }.    sq
313d0 6c 69 74 65 33 5f 66 72 65 65 28 70 43 74 78 2d  lite3_free(pCtx-
313e0 3e 6c 6f 63 6b 50 72 6f 78 79 50 61 74 68 29 3b  >lockProxyPath);
313f0 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
31400 65 28 70 43 74 78 2d 3e 63 6f 6e 63 68 46 69 6c  e(pCtx->conchFil
31410 65 50 61 74 68 29 3b 0a 20 20 20 20 73 71 6c 69  ePath);.    sqli
31420 74 65 33 5f 66 72 65 65 28 70 43 74 78 2d 3e 64  te3_free(pCtx->d
31430 62 50 61 74 68 29 3b 0a 20 20 20 20 2f 2a 20 72  bPath);.    /* r
31440 65 73 74 6f 72 65 20 74 68 65 20 6f 72 69 67 69  estore the origi
31450 6e 61 6c 20 6c 6f 63 6b 69 6e 67 20 63 6f 6e 74  nal locking cont
31460 65 78 74 20 61 6e 64 20 70 4d 65 74 68 6f 64 20  ext and pMethod 
31470 74 68 65 6e 20 63 6c 6f 73 65 20 69 74 20 2a 2f  then close it */
31480 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b  .    pFile->lock
31490 69 6e 67 43 6f 6e 74 65 78 74 20 3d 20 70 43 74  ingContext = pCt
314a0 78 2d 3e 6f 6c 64 4c 6f 63 6b 69 6e 67 43 6f 6e  x->oldLockingCon
314b0 74 65 78 74 3b 0a 20 20 20 20 70 46 69 6c 65 2d  text;.    pFile-
314c0 3e 70 4d 65 74 68 6f 64 20 3d 20 70 43 74 78 2d  >pMethod = pCtx-
314d0 3e 70 4f 6c 64 4d 65 74 68 6f 64 3b 0a 20 20 20  >pOldMethod;.   
314e0 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 43   sqlite3_free(pC
314f0 74 78 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  tx);.    return 
31500 70 46 69 6c 65 2d 3e 70 4d 65 74 68 6f 64 2d 3e  pFile->pMethod->
31510 78 43 6c 6f 73 65 28 69 64 29 3b 0a 20 20 7d 0a  xClose(id);.  }.
31520 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
31530 4f 4b 3b 0a 7d 0a 0a 0a 0a 23 65 6e 64 69 66 20  OK;.}....#endif 
31540 2f 2a 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50  /* defined(__APP
31550 4c 45 5f 5f 29 20 26 26 20 53 51 4c 49 54 45 5f  LE__) && SQLITE_
31560 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53  ENABLE_LOCKING_S
31570 54 59 4c 45 20 2a 2f 0a 2f 2a 0a 2a 2a 20 54 68  TYLE */./*.** Th
31580 65 20 70 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 20  e proxy locking 
31590 73 74 79 6c 65 20 69 73 20 69 6e 74 65 6e 64 65  style is intende
315a0 64 20 66 6f 72 20 75 73 65 20 77 69 74 68 20 41  d for use with A
315b0 46 50 20 66 69 6c 65 73 79 73 74 65 6d 73 2e 0a  FP filesystems..
315c0 2a 2a 20 41 6e 64 20 73 69 6e 63 65 20 41 46 50  ** And since AFP
315d0 20 69 73 20 6f 6e 6c 79 20 73 75 70 70 6f 72 74   is only support
315e0 65 64 20 6f 6e 20 4d 61 63 4f 53 58 2c 20 74 68  ed on MacOSX, th
315f0 65 20 70 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 20  e proxy locking 
31600 69 73 20 61 6c 73 6f 0a 2a 2a 20 72 65 73 74 72  is also.** restr
31610 69 63 74 65 64 20 74 6f 20 4d 61 63 4f 53 58 2e  icted to MacOSX.
31620 0a 2a 2a 20 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a  .** .**.********
31630 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64 20  *********** End 
31640 6f 66 20 74 68 65 20 70 72 6f 78 79 20 6c 6f 63  of the proxy loc
31650 6b 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  k implementation
31660 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a   ***************
31670 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a  *******.********
31680 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
31690 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
316a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
316b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
316c0 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 49  ******/../*.** I
316d0 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 6f 70  nitialize the op
316e0 65 72 61 74 69 6e 67 20 73 79 73 74 65 6d 20 69  erating system i
316f0 6e 74 65 72 66 61 63 65 2e 0a 2a 2a 0a 2a 2a 20  nterface..**.** 
31700 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 67  This routine reg
31710 69 73 74 65 72 73 20 61 6c 6c 20 56 46 53 20 69  isters all VFS i
31720 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 73 20 66  mplementations f
31730 6f 72 20 75 6e 69 78 2d 6c 69 6b 65 20 6f 70 65  or unix-like ope
31740 72 61 74 69 6e 67 0a 2a 2a 20 73 79 73 74 65 6d  rating.** system
31750 73 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65  s.  This routine
31760 2c 20 61 6e 64 20 74 68 65 20 73 71 6c 69 74 65  , and the sqlite
31770 33 5f 6f 73 5f 65 6e 64 28 29 20 72 6f 75 74 69  3_os_end() routi
31780 6e 65 20 74 68 61 74 20 66 6f 6c 6c 6f 77 73 2c  ne that follows,
31790 0a 2a 2a 20 73 68 6f 75 6c 64 20 62 65 20 74 68  .** should be th
317a0 65 20 6f 6e 6c 79 20 72 6f 75 74 69 6e 65 73 20  e only routines 
317b0 69 6e 20 74 68 69 73 20 66 69 6c 65 20 74 68 61  in this file tha
317c0 74 20 61 72 65 20 76 69 73 69 62 6c 65 20 66 72  t are visible fr
317d0 6f 6d 20 6f 74 68 65 72 0a 2a 2a 20 66 69 6c 65  om other.** file
317e0 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  s..**.** This ro
317f0 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20  utine is called 
31800 6f 6e 63 65 20 64 75 72 69 6e 67 20 53 51 4c 69  once during SQLi
31810 74 65 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f  te initializatio
31820 6e 20 61 6e 64 20 62 79 20 61 0a 2a 2a 20 73 69  n and by a.** si
31830 6e 67 6c 65 20 74 68 72 65 61 64 2e 20 20 54 68  ngle thread.  Th
31840 65 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74  e memory allocat
31850 69 6f 6e 20 61 6e 64 20 6d 75 74 65 78 20 73 75  ion and mutex su
31860 62 73 79 73 74 65 6d 73 20 68 61 76 65 20 6e 6f  bsystems have no
31870 74 0a 2a 2a 20 6e 65 63 65 73 73 61 72 69 6c 79  t.** necessarily
31880 20 62 65 65 6e 20 69 6e 69 74 69 61 6c 69 7a 65   been initialize
31890 64 20 77 68 65 6e 20 74 68 69 73 20 72 6f 75 74  d when this rout
318a0 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2c 20 61  ine is called, a
318b0 6e 64 20 73 6f 20 74 68 65 79 0a 2a 2a 20 73 68  nd so they.** sh
318c0 6f 75 6c 64 20 6e 6f 74 20 62 65 20 75 73 65 64  ould not be used
318d0 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
318e0 5f 6f 73 5f 69 6e 69 74 28 76 6f 69 64 29 7b 20  _os_init(void){ 
318f0 0a 20 20 2f 2a 20 0a 20 20 2a 2a 20 54 68 65 20  .  /* .  ** The 
31900 66 6f 6c 6c 6f 77 69 6e 67 20 6d 61 63 72 6f 20  following macro 
31910 64 65 66 69 6e 65 73 20 61 6e 20 69 6e 69 74 69  defines an initi
31920 61 6c 69 7a 65 72 20 66 6f 72 20 61 6e 20 73 71  alizer for an sq
31930 6c 69 74 65 33 5f 76 66 73 20 6f 62 6a 65 63 74  lite3_vfs object
31940 2e 0a 20 20 2a 2a 20 54 68 65 20 6e 61 6d 65 20  ..  ** The name 
31950 6f 66 20 74 68 65 20 56 46 53 20 69 73 20 4e 41  of the VFS is NA
31960 4d 45 2e 20 20 54 68 65 20 70 41 70 70 44 61 74  ME.  The pAppDat
31970 61 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74  a is a pointer t
31980 6f 20 61 20 70 6f 69 6e 74 65 72 0a 20 20 2a 2a  o a pointer.  **
31990 20 74 6f 20 74 68 65 20 22 66 69 6e 64 65 72 22   to the "finder"
319a0 20 66 75 6e 63 74 69 6f 6e 2e 20 20 28 70 41 70   function.  (pAp
319b0 70 44 61 74 61 20 69 73 20 61 20 70 6f 69 6e 74  pData is a point
319c0 65 72 20 74 6f 20 61 20 70 6f 69 6e 74 65 72 20  er to a pointer 
319d0 62 65 63 61 75 73 65 0a 20 20 2a 2a 20 73 69 6c  because.  ** sil
319e0 6c 79 20 43 39 30 20 72 75 6c 65 73 20 70 72 6f  ly C90 rules pro
319f0 68 69 62 69 74 20 61 20 76 6f 69 64 2a 20 66 72  hibit a void* fr
31a00 6f 6d 20 62 65 69 6e 67 20 63 61 73 74 20 74 6f  om being cast to
31a10 20 61 20 66 75 6e 63 74 69 6f 6e 20 70 6f 69 6e   a function poin
31a20 74 65 72 0a 20 20 2a 2a 20 61 6e 64 20 73 6f 20  ter.  ** and so 
31a30 77 65 20 68 61 76 65 20 74 6f 20 67 6f 20 74 68  we have to go th
31a40 72 6f 75 67 68 20 74 68 65 20 69 6e 74 65 72 6d  rough the interm
31a50 65 64 69 61 74 65 20 70 6f 69 6e 74 65 72 20 74  ediate pointer t
31a60 6f 20 61 76 6f 69 64 20 70 72 6f 62 6c 65 6d 73  o avoid problems
31a70 0a 20 20 2a 2a 20 77 68 65 6e 20 63 6f 6d 70 69  .  ** when compi
31a80 6c 69 6e 67 20 77 69 74 68 20 2d 70 65 64 61 6e  ling with -pedan
31a90 74 69 63 2d 65 72 72 6f 72 73 20 6f 6e 20 47 43  tic-errors on GC
31aa0 43 2e 29 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68  C.).  **.  ** Th
31ab0 65 20 46 49 4e 44 45 52 20 70 61 72 61 6d 65 74  e FINDER paramet
31ac0 65 72 20 74 6f 20 74 68 69 73 20 6d 61 63 72 6f  er to this macro
31ad0 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20   is the name of 
31ae0 74 68 65 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  the pointer to t
31af0 68 65 0a 20 20 2a 2a 20 66 69 6e 64 65 72 2d 66  he.  ** finder-f
31b00 75 6e 63 74 69 6f 6e 2e 20 20 54 68 65 20 66 69  unction.  The fi
31b10 6e 64 65 72 2d 66 75 6e 63 74 69 6f 6e 20 72 65  nder-function re
31b20 74 75 72 6e 73 20 61 20 70 6f 69 6e 74 65 72 20  turns a pointer 
31b30 74 6f 20 74 68 65 0a 20 20 2a 2a 20 73 71 6c 69  to the.  ** sqli
31b40 74 65 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 6f 62  te_io_methods ob
31b50 6a 65 63 74 20 74 68 61 74 20 69 6d 70 6c 65 6d  ject that implem
31b60 65 6e 74 73 20 74 68 65 20 64 65 73 69 72 65 64  ents the desired
31b70 20 6c 6f 63 6b 69 6e 67 0a 20 20 2a 2a 20 62 65   locking.  ** be
31b80 68 61 76 69 6f 72 73 2e 20 20 53 65 65 20 74 68  haviors.  See th
31b90 65 20 64 69 76 69 73 69 6f 6e 20 61 62 6f 76 65  e division above
31ba0 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 74   that contains t
31bb0 68 65 20 49 4f 4d 45 54 48 4f 44 53 0a 20 20 2a  he IOMETHODS.  *
31bc0 2a 20 6d 61 63 72 6f 20 66 6f 72 20 61 64 64 69  * macro for addi
31bd0 74 69 6f 6e 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  tion information
31be0 20 6f 6e 20 66 69 6e 64 65 72 2d 66 75 6e 63 74   on finder-funct
31bf0 69 6f 6e 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  ions..  **.  ** 
31c00 4d 6f 73 74 20 66 69 6e 64 65 72 73 20 73 69 6d  Most finders sim
31c10 70 6c 79 20 72 65 74 75 72 6e 20 61 20 70 6f 69  ply return a poi
31c20 6e 74 65 72 20 74 6f 20 61 20 66 69 78 65 64 20  nter to a fixed 
31c30 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f  sqlite3_io_metho
31c40 64 73 0a 20 20 2a 2a 20 6f 62 6a 65 63 74 2e 20  ds.  ** object. 
31c50 20 42 75 74 20 74 68 65 20 22 61 75 74 6f 6c 6f   But the "autolo
31c60 63 6b 49 6f 46 69 6e 64 65 72 22 20 61 76 61 69  ckIoFinder" avai
31c70 6c 61 62 6c 65 20 6f 6e 20 4d 61 63 4f 53 58 20  lable on MacOSX 
31c80 64 6f 65 73 20 61 20 6c 69 74 74 6c 65 0a 20 20  does a little.  
31c90 2a 2a 20 6d 6f 72 65 20 74 68 61 6e 20 74 68 61  ** more than tha
31ca0 74 3b 20 69 74 20 6c 6f 6f 6b 73 20 61 74 20 74  t; it looks at t
31cb0 68 65 20 66 69 6c 65 73 79 73 74 65 6d 20 74 79  he filesystem ty
31cc0 70 65 20 74 68 61 74 20 68 6f 73 74 73 20 74 68  pe that hosts th
31cd0 65 20 0a 20 20 2a 2a 20 64 61 74 61 62 61 73 65  e .  ** database
31ce0 20 66 69 6c 65 20 61 6e 64 20 74 72 69 65 73 20   file and tries 
31cf0 74 6f 20 63 68 6f 6f 73 65 20 61 6e 20 6c 6f 63  to choose an loc
31d00 6b 69 6e 67 20 6d 65 74 68 6f 64 20 61 70 70 72  king method appr
31d10 6f 70 72 69 61 74 65 20 66 6f 72 0a 20 20 2a 2a  opriate for.  **
31d20 20 74 68 61 74 20 66 69 6c 65 73 79 73 74 65 6d   that filesystem
31d30 20 74 69 6d 65 2e 0a 20 20 2a 2f 0a 20 20 23 64   time..  */.  #d
31d40 65 66 69 6e 65 20 55 4e 49 58 56 46 53 28 56 46  efine UNIXVFS(VF
31d50 53 4e 41 4d 45 2c 20 46 49 4e 44 45 52 29 20 7b  SNAME, FINDER) {
31d60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31d70 20 20 20 20 20 20 20 20 5c 0a 20 20 20 20 32 2c          \.    2,
31d80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31d90 20 20 20 20 2f 2a 20 69 56 65 72 73 69 6f 6e 20      /* iVersion 
31da0 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20 20 20  */              
31db0 20 20 20 20 20 20 5c 0a 20 20 20 20 73 69 7a 65        \.    size
31dc0 6f 66 28 75 6e 69 78 46 69 6c 65 29 2c 20 20 20  of(unixFile),   
31dd0 20 20 2f 2a 20 73 7a 4f 73 46 69 6c 65 20 2a 2f    /* szOsFile */
31de0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31df0 20 20 20 20 5c 0a 20 20 20 20 4d 41 58 5f 50 41      \.    MAX_PA
31e00 54 48 4e 41 4d 45 2c 20 20 20 20 20 20 20 20 20  THNAME,         
31e10 2f 2a 20 6d 78 50 61 74 68 6e 61 6d 65 20 2a 2f  /* mxPathname */
31e20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31e30 20 20 5c 0a 20 20 20 20 30 2c 20 20 20 20 20 20    \.    0,      
31e40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
31e50 20 70 4e 65 78 74 20 2a 2f 20 20 20 20 20 20 20   pNext */       
31e60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31e70 5c 0a 20 20 20 20 56 46 53 4e 41 4d 45 2c 20 20  \.    VFSNAME,  
31e80 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 7a              /* z
31e90 4e 61 6d 65 20 2a 2f 20 20 20 20 20 20 20 20 20  Name */         
31ea0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a                \.
31eb0 20 20 20 20 28 76 6f 69 64 2a 29 26 46 49 4e 44      (void*)&FIND
31ec0 45 52 2c 20 20 20 20 20 20 20 2f 2a 20 70 41 70  ER,       /* pAp
31ed0 70 44 61 74 61 20 2a 2f 20 20 20 20 20 20 20 20  pData */        
31ee0 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20              \.  
31ef0 20 20 75 6e 69 78 4f 70 65 6e 2c 20 20 20 20 20    unixOpen,     
31f00 20 20 20 20 20 20 20 20 2f 2a 20 78 4f 70 65 6e          /* xOpen
31f10 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20 20   */             
31f20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 20            \.    
31f30 75 6e 69 78 44 65 6c 65 74 65 2c 20 20 20 20 20  unixDelete,     
31f40 20 20 20 20 20 20 2f 2a 20 78 44 65 6c 65 74 65        /* xDelete
31f50 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20 20   */             
31f60 20 20 20 20 20 20 20 20 5c 0a 20 20 20 20 75 6e          \.    un
31f70 69 78 41 63 63 65 73 73 2c 20 20 20 20 20 20 20  ixAccess,       
31f80 20 20 20 20 2f 2a 20 78 41 63 63 65 73 73 20 2a      /* xAccess *
31f90 2f 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  /               
31fa0 20 20 20 20 20 20 5c 0a 20 20 20 20 75 6e 69 78        \.    unix
31fb0 46 75 6c 6c 50 61 74 68 6e 61 6d 65 2c 20 20 20  FullPathname,   
31fc0 20 20 2f 2a 20 78 46 75 6c 6c 50 61 74 68 6e 61    /* xFullPathna
31fd0 6d 65 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20  me */           
31fe0 20 20 20 20 5c 0a 20 20 20 20 75 6e 69 78 44 6c      \.    unixDl
31ff0 4f 70 65 6e 2c 20 20 20 20 20 20 20 20 20 20 20  Open,           
32000 2f 2a 20 78 44 6c 4f 70 65 6e 20 2a 2f 20 20 20  /* xDlOpen */   
32010 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32020 20 20 5c 0a 20 20 20 20 75 6e 69 78 44 6c 45 72    \.    unixDlEr
32030 72 6f 72 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  ror,          /*
32040 20 78 44 6c 45 72 72 6f 72 20 2a 2f 20 20 20 20   xDlError */    
32050 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32060 5c 0a 20 20 20 20 75 6e 69 78 44 6c 53 79 6d 2c  \.    unixDlSym,
32070 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
32080 44 6c 53 79 6d 20 2a 2f 20 20 20 20 20 20 20 20  DlSym */        
32090 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a                \.
320a0 20 20 20 20 75 6e 69 78 44 6c 43 6c 6f 73 65 2c      unixDlClose,
320b0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 44 6c            /* xDl
320c0 43 6c 6f 73 65 20 2a 2f 20 20 20 20 20 20 20 20  Close */        
320d0 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20              \.  
320e0 20 20 75 6e 69 78 52 61 6e 64 6f 6d 6e 65 73 73    unixRandomness
320f0 2c 20 20 20 20 20 20 20 2f 2a 20 78 52 61 6e 64  ,       /* xRand
32100 6f 6d 6e 65 73 73 20 2a 2f 20 20 20 20 20 20 20  omness */       
32110 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 20            \.    
32120 75 6e 69 78 53 6c 65 65 70 2c 20 20 20 20 20 20  unixSleep,      
32130 20 20 20 20 20 20 2f 2a 20 78 53 6c 65 65 70 20        /* xSleep 
32140 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20 20 20  */              
32150 20 20 20 20 20 20 20 20 5c 0a 20 20 20 20 75 6e          \.    un
32160 69 78 43 75 72 72 65 6e 74 54 69 6d 65 2c 20 20  ixCurrentTime,  
32170 20 20 20 20 2f 2a 20 78 43 75 72 72 65 6e 74 54      /* xCurrentT
32180 69 6d 65 20 2a 2f 20 20 20 20 20 20 20 20 20 20  ime */          
32190 20 20 20 20 20 20 5c 0a 20 20 20 20 75 6e 69 78        \.    unix
321a0 47 65 74 4c 61 73 74 45 72 72 6f 72 2c 20 20 20  GetLastError,   
321b0 20 20 2f 2a 20 78 47 65 74 4c 61 73 74 45 72 72    /* xGetLastErr
321c0 6f 72 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20  or */           
321d0 20 20 20 20 5c 0a 20 20 20 20 30 2c 20 20 20 20      \.    0,    
321e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
321f0 2f 2a 20 78 52 65 6e 61 6d 65 20 2a 2f 20 20 20  /* xRename */   
32200 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32210 20 20 5c 0a 20 20 20 20 75 6e 69 78 43 75 72 72    \.    unixCurr
32220 65 6e 74 54 69 6d 65 49 6e 74 36 34 2c 20 2f 2a  entTimeInt64, /*
32230 20 78 43 75 72 72 65 6e 74 54 69 6d 65 49 6e 74   xCurrentTimeInt
32240 36 34 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20  64 */           
32250 5c 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a  \.  }..  /*.  **
32260 20 41 6c 6c 20 64 65 66 61 75 6c 74 20 56 46 53   All default VFS
32270 65 73 20 66 6f 72 20 75 6e 69 78 20 61 72 65 20  es for unix are 
32280 63 6f 6e 74 61 69 6e 65 64 20 69 6e 20 74 68 65  contained in the
32290 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 72 72 61 79   following array
322a0 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4e 6f 74 65  ..  **.  ** Note
322b0 20 74 68 61 74 20 74 68 65 20 73 71 6c 69 74 65   that the sqlite
322c0 33 5f 76 66 73 2e 70 4e 65 78 74 20 66 69 65 6c  3_vfs.pNext fiel
322d0 64 20 6f 66 20 74 68 65 20 56 46 53 20 6f 62 6a  d of the VFS obj
322e0 65 63 74 20 69 73 20 6d 6f 64 69 66 69 65 64 0a  ect is modified.
322f0 20 20 2a 2a 20 62 79 20 74 68 65 20 53 51 4c 69    ** by the SQLi
32300 74 65 20 63 6f 72 65 20 77 68 65 6e 20 74 68 65  te core when the
32310 20 56 46 53 20 69 73 20 72 65 67 69 73 74 65 72   VFS is register
32320 65 64 2e 20 20 53 6f 20 74 68 65 20 66 6f 6c 6c  ed.  So the foll
32330 6f 77 69 6e 67 0a 20 20 2a 2a 20 61 72 72 61 79  owing.  ** array
32340 20 63 61 6e 6e 6f 74 20 62 65 20 63 6f 6e 73 74   cannot be const
32350 2e 0a 20 20 2a 2f 0a 20 20 73 74 61 74 69 63 20  ..  */.  static 
32360 73 71 6c 69 74 65 33 5f 76 66 73 20 61 56 66 73  sqlite3_vfs aVfs
32370 5b 5d 20 3d 20 7b 0a 23 69 66 20 53 51 4c 49 54  [] = {.#if SQLIT
32380 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47  E_ENABLE_LOCKING
32390 5f 53 54 59 4c 45 20 26 26 20 28 4f 53 5f 56 58  _STYLE && (OS_VX
323a0 57 4f 52 4b 53 20 7c 7c 20 64 65 66 69 6e 65 64  WORKS || defined
323b0 28 5f 5f 41 50 50 4c 45 5f 5f 29 29 0a 20 20 20  (__APPLE__)).   
323c0 20 55 4e 49 58 56 46 53 28 22 75 6e 69 78 22 2c   UNIXVFS("unix",
323d0 20 20 20 20 20 20 20 20 20 20 61 75 74 6f 6c 6f            autolo
323e0 63 6b 49 6f 46 69 6e 64 65 72 20 29 2c 0a 23 65  ckIoFinder ),.#e
323f0 6c 73 65 0a 20 20 20 20 55 4e 49 58 56 46 53 28  lse.    UNIXVFS(
32400 22 75 6e 69 78 22 2c 20 20 20 20 20 20 20 20 20  "unix",         
32410 20 70 6f 73 69 78 49 6f 46 69 6e 64 65 72 20 29   posixIoFinder )
32420 2c 0a 23 65 6e 64 69 66 0a 20 20 20 20 55 4e 49  ,.#endif.    UNI
32430 58 56 46 53 28 22 75 6e 69 78 2d 6e 6f 6e 65 22  XVFS("unix-none"
32440 2c 20 20 20 20 20 6e 6f 6c 6f 63 6b 49 6f 46 69  ,     nolockIoFi
32450 6e 64 65 72 20 29 2c 0a 20 20 20 20 55 4e 49 58  nder ),.    UNIX
32460 56 46 53 28 22 75 6e 69 78 2d 64 6f 74 66 69 6c  VFS("unix-dotfil
32470 65 22 2c 20 20 64 6f 74 6c 6f 63 6b 49 6f 46 69  e",  dotlockIoFi
32480 6e 64 65 72 20 29 2c 0a 23 69 66 20 4f 53 5f 56  nder ),.#if OS_V
32490 58 57 4f 52 4b 53 0a 20 20 20 20 55 4e 49 58 56  XWORKS.    UNIXV
324a0 46 53 28 22 75 6e 69 78 2d 6e 61 6d 65 64 73 65  FS("unix-namedse
324b0 6d 22 2c 20 73 65 6d 49 6f 46 69 6e 64 65 72 20  m", semIoFinder 
324c0 29 2c 0a 23 65 6e 64 69 66 0a 23 69 66 20 53 51  ),.#endif.#if SQ
324d0 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b  LITE_ENABLE_LOCK
324e0 49 4e 47 5f 53 54 59 4c 45 0a 20 20 20 20 55 4e  ING_STYLE.    UN
324f0 49 58 56 46 53 28 22 75 6e 69 78 2d 70 6f 73 69  IXVFS("unix-posi
32500 78 22 2c 20 20 20 20 70 6f 73 69 78 49 6f 46 69  x",    posixIoFi
32510 6e 64 65 72 20 29 2c 0a 23 69 66 20 21 4f 53 5f  nder ),.#if !OS_
32520 56 58 57 4f 52 4b 53 0a 20 20 20 20 55 4e 49 58  VXWORKS.    UNIX
32530 56 46 53 28 22 75 6e 69 78 2d 66 6c 6f 63 6b 22  VFS("unix-flock"
32540 2c 20 20 20 20 66 6c 6f 63 6b 49 6f 46 69 6e 64  ,    flockIoFind
32550 65 72 20 29 2c 0a 23 65 6e 64 69 66 0a 23 65 6e  er ),.#endif.#en
32560 64 69 66 0a 23 69 66 20 53 51 4c 49 54 45 5f 45  dif.#if SQLITE_E
32570 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54  NABLE_LOCKING_ST
32580 59 4c 45 20 26 26 20 64 65 66 69 6e 65 64 28 5f  YLE && defined(_
32590 5f 41 50 50 4c 45 5f 5f 29 0a 20 20 20 20 55 4e  _APPLE__).    UN
325a0 49 58 56 46 53 28 22 75 6e 69 78 2d 61 66 70 22  IXVFS("unix-afp"
325b0 2c 20 20 20 20 20 20 61 66 70 49 6f 46 69 6e 64  ,      afpIoFind
325c0 65 72 20 29 2c 0a 20 20 20 20 55 4e 49 58 56 46  er ),.    UNIXVF
325d0 53 28 22 75 6e 69 78 2d 6e 66 73 22 2c 20 20 20  S("unix-nfs",   
325e0 20 20 20 6e 66 73 49 6f 46 69 6e 64 65 72 20 29     nfsIoFinder )
325f0 2c 0a 20 20 20 20 55 4e 49 58 56 46 53 28 22 75  ,.    UNIXVFS("u
32600 6e 69 78 2d 70 72 6f 78 79 22 2c 20 20 20 20 70  nix-proxy",    p
32610 72 6f 78 79 49 6f 46 69 6e 64 65 72 20 29 2c 0a  roxyIoFinder ),.
32620 23 65 6e 64 69 66 0a 20 20 7d 3b 0a 20 20 75 6e  #endif.  };.  un
32630 73 69 67 6e 65 64 20 69 6e 74 20 69 3b 20 20 20  signed int i;   
32640 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63         /* Loop c
32650 6f 75 6e 74 65 72 20 2a 2f 0a 0a 20 20 2f 2a 20  ounter */..  /* 
32660 52 65 67 69 73 74 65 72 20 61 6c 6c 20 56 46 53  Register all VFS
32670 65 73 20 64 65 66 69 6e 65 64 20 69 6e 20 74 68  es defined in th
32680 65 20 61 56 66 73 5b 5d 20 61 72 72 61 79 20 2a  e aVfs[] array *
32690 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 28  /.  for(i=0; i<(
326a0 73 69 7a 65 6f 66 28 61 56 66 73 29 2f 73 69 7a  sizeof(aVfs)/siz
326b0 65 6f 66 28 73 71 6c 69 74 65 33 5f 76 66 73 29  eof(sqlite3_vfs)
326c0 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c  ); i++){.    sql
326d0 69 74 65 33 5f 76 66 73 5f 72 65 67 69 73 74 65  ite3_vfs_registe
326e0 72 28 26 61 56 66 73 5b 69 5d 2c 20 69 3d 3d 30  r(&aVfs[i], i==0
326f0 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
32700 53 51 4c 49 54 45 5f 4f 4b 3b 20 0a 7d 0a 0a 2f  SQLITE_OK; .}../
32710 2a 0a 2a 2a 20 53 68 75 74 64 6f 77 6e 20 74 68  *.** Shutdown th
32720 65 20 6f 70 65 72 61 74 69 6e 67 20 73 79 73 74  e operating syst
32730 65 6d 20 69 6e 74 65 72 66 61 63 65 2e 0a 2a 2a  em interface..**
32740 0a 2a 2a 20 53 6f 6d 65 20 6f 70 65 72 61 74 69  .** Some operati
32750 6e 67 20 73 79 73 74 65 6d 73 20 6d 69 67 68 74  ng systems might
32760 20 6e 65 65 64 20 74 6f 20 64 6f 20 73 6f 6d 65   need to do some
32770 20 63 6c 65 61 6e 75 70 20 69 6e 20 74 68 69 73   cleanup in this
32780 20 72 6f 75 74 69 6e 65 2c 0a 2a 2a 20 74 6f 20   routine,.** to 
32790 72 65 6c 65 61 73 65 20 64 79 6e 61 6d 69 63 61  release dynamica
327a0 6c 6c 79 20 61 6c 6c 6f 63 61 74 65 64 20 6f 62  lly allocated ob
327b0 6a 65 63 74 73 2e 20 20 42 75 74 20 6e 6f 74 20  jects.  But not 
327c0 6f 6e 20 75 6e 69 78 2e 0a 2a 2a 20 54 68 69 73  on unix..** This
327d0 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f   routine is a no
327e0 2d 6f 70 20 66 6f 72 20 75 6e 69 78 2e 0a 2a 2f  -op for unix..*/
327f0 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 6f 73 5f  .int sqlite3_os_
32800 65 6e 64 28 76 6f 69 64 29 7b 20 0a 20 20 72 65  end(void){ .  re
32810 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 20  turn SQLITE_OK; 
32820 0a 7d 0a 20 0a 23 65 6e 64 69 66 20 2f 2a 20 53  .}. .#endif /* S
32830 51 4c 49 54 45 5f 4f 53 5f 55 4e 49 58 20 2a 2f  QLITE_OS_UNIX */
32840 0a                                               .